on master help sign in
README.md+7−1
since splitsnapshots
unifiedsplit
@@ -42,7 +42,13 @@ tools/hoon '(golden /a/b/jibb (crip "++ main view"))'
42tools/hoon --raw --cord src=tests/golden/foo/source.jibb 'tree:(golden /a/b/jibb src)'
42tools/hoon --raw --cord src=tests/golden/foo/source.jibb 'tree:(golden /a/b/jibb src)'
43```
43```
44
44
45−`tools/testdata/selftest` tests both tools against a stub library, and `tools/doc-blocks` against Markdown it writes. `tools/importer-test` compares the partial Hoon importer's fixture projections against their golden file. `tools/type-import-test`, `tools/type-tlon-test`, `tools/type-mark-test`, `tools/type-poke-test` and `tools/type-api-paths-test` check importer/checker, prelude and partial API path analysis boundaries under eval; the ship suite runs the same fixtures.
45+`tools/testdata/selftest` tests both tools against a stub library, and `tools/doc-blocks` against Markdown it writes. `tools/importer-test` compares the partial Hoon importer's fixture projections against their golden file. `tools/type-import-test`, `tools/type-import-overlap-test`, `tools/type-import-structural-test`, `tools/type-union-source-test`, `tools/type-union-alias-overlap-test`, `tools/type-full-overlap-test`, `tools/type-generic-recursion-test`, `tools/type-generic-construction-test`, `tools/type-generic-pattern-test`, `tools/type-deferred-test`, `tools/type-deferred-prepared-test`, `tools/type-deferred-resolver-test`, `tools/type-deferred-context-test`, `tools/type-empty-test`, `tools/type-cell-branch-test`, `tools/type-tlon-test`, `tools/type-mark-test`, `tools/type-poke-test` and `tools/type-api-paths-test` check importer/checker, prelude and partial API path analysis boundaries under eval; the ship suite runs the same fixtures.
46+
47+The focused `tools/type-page-main-test` fully checks the byte-identical static about page and direct blog/todo data pages through the real readers, with exact main types, downstream imports and fail-closed syntax/evidence controls; the same fixture runs on the fake ship. It does not render pages or execute requests.
48+
49+The focused `tools/type-theme-test` fully checks the byte-identical real theme against the exact prelude mold, including its exported type, structural downstream import, dark absent/present forms and malformed-field negatives under eval with a shared fake-ship arm. It does not check contrast, render themes or route fonts.
50+
51+The focused `tools/type-program-main-test` checks the narrow closed, subscription-free `main` slice and its shared fake-ship fixture. `tools/type-program-init-test` checks transactional initializer recovery for a synthetic direct program, including exact exported and imported types and rejection boundaries. `tools/type-program-update-test` checks derived result context for an unannotated two-slot update, including a union/boolean branch, downstream types and fail-closed controls under eval with a shared fake-ship arm. `tools/type-program-watch-test` uses the real todo readers with synthetic program components to check one direct request value against merged API-source evidence and reject hand-built, indirect, parameterized, diff and ambiguous subscriptions. These are static checks only: they do not run an island or establish runtime watching. `tools/type-todo-full-test` additionally checks the byte-identical todo island through both full-module APIs, verifies its exact closed `main` type and structural downstream import, and runs rejection controls.
46
52
47### The doc's examples
53### The doc's examples
48
54
docs/README.md+2
@@ -2,6 +2,8 @@
2
2
3Jibb's spec is a design doc by @iko, [Jibb — an Elm-architecture UI language for Urbit](https://claude.ai/artifact/DMBr48qzi5z8hcwn2ccPBv), and its repository copy in `spec/`. The repository copy records decisions made on 2026-10-30, including dropping `$?`, adding `%$` as a term literal and pattern, making `@` an unrestricted atom, treating `?` as two atoms for union disjointness, and the milestone 2 type and prelude decisions; the Claude document still needs to be synchronized. This folder also holds where the build stands, what is still open, and how to work on the code.
3Jibb's spec is a design doc by @iko, [Jibb — an Elm-architecture UI language for Urbit](https://claude.ai/artifact/DMBr48qzi5z8hcwn2ccPBv), and its repository copy in `spec/`. The repository copy records decisions made on 2026-10-30, including dropping `$?`, adding `%$` as a term literal and pattern, making `@` an unrestricted atom, treating `?` as two atoms for union disjointness, and the milestone 2 type and prelude decisions; the Claude document still needs to be synchronized. This folder also holds where the build stands, what is still open, and how to work on the code.
4
4
5+The current full-module checker also has a narrow static/data-page slice, documented in [compiler.md](compiler.md) and [status.md](status.md). Its shared eval/ship fixture checks the real about, blog index and todo index sources without claiming rendering or request execution. The shared theme fixture likewise full-checks the byte-identical real theme and its exact type without implementing theme behavior.
6+
5| File | What it holds |
7| File | What it holds |
6| --- | --- |
8| --- | --- |
7| [spec/](spec/) | The doc's tabs, as Markdown |
9| [spec/](spec/) | The doc's tabs, as Markdown |
docs/compiler.md+51−3
@@ -56,7 +56,17 @@ The core is split into chapters, `+| %name`, in this order:
56| `%span-check` | `+check-spans`, which `+golden` runs on every tree, and `+check-spans-test` |
56| `%span-check` | `+check-spans`, which `+golden` runs on every tree, and `+check-spans-test` |
57| `%type-inference` | The initial inference fragment and its unification helpers; not yet a module type checker |
57| `%type-inference` | The initial inference fragment and its unification helpers; not yet a module type checker |
58
58
59−The inference fragment supports fixed auras, unrestricted `@`, one-way widening into it and toward aura-family ancestors, generic variables and gates, faced and unfaced cells, cell sample binders, known record field reads, a cell pattern of two or more binders, a complete two-arm loobean branch, a complete two-arm unit-shaped branch, closed local mold aliases and acyclic forward value references. For a supported single syntactic top-level recursive gate, the checker infers the sample first and uses that exact sample, including its field faces, in a monomorphic self placeholder. The completed body must unify with the placeholder before the gate is generalized; incompatible recursive arguments can report the call and argument sites. Uses of generalized top-level definitions instantiate their schemes independently. For a complete loobean branch with one direct self-call arm, the checker can infer the other arm independently and use its closed, fully resolved type to seed the recursive result; it then checks the whole body. Open or pending base types do not seed the result, and other branch shapes still depend on the existing partial inference. A supported single local recursive gate also uses a monomorphic self reference while its body is checked, then generalizes variables free of its enclosing environment; captured variables remain shared. Acyclic local value definitions can refer forward. The checker collects written capitals per `++` before inference, excluding nested definitions: a capital used in an enclosing definition is shared with its locals, even when written later, while a capital introduced only in a local definition is generalized there. Sibling locals can introduce independent capitals with the same spelling; generic mold parameters keep their own scope. Top-level groups of syntactic gates are inferred together with monomorphic placeholders and shared substitutions, then generalized only after the whole group checks; downstream uses and library interfaces instantiate those schemes independently. A dependency graph identifies groups with two iterative depth-first passes; its conservative local-reference edges can reject otherwise valid programs. Supported local mutually recursive gate groups also use shared monomorphic placeholders and generalize only after the group checks, preserving captured outer variables. Some proven non-gate value cycles are diagnosed; other mixed gate/value cycles, polymorphic recursion, unresolved literal constraints and unresolved branch joins remain unsupported. Acyclic simple local mold aliases can also refer forward, and are scoped to the body, not its gate's sample. Nonrecursive generic aliases of supported molds can be applied at exact arity, including locally and through library interfaces; their parameters are lexical. Closed, provably disjoint nonrecursive unions and tagged single-case molds support contextual term values, `~` and `|=%tag` constructors. Literal heads compare by their runtime noun, so `|=%$` can construct an explicit null-, loobean-zero- or term-zero-headed case. Equal heads with distinct payloads can be selected when exactly one payload fit is proven; unknown or ambiguous alternatives remain unsupported. Unresolved tags and nulls remain pending, with distinct partial-inference diagnostics. Nonrecursive top-level generic union molds with provably disjoint cases also support contextual tags and constructors at exact arity; their arguments are retained through generalization and supported library interfaces. Nonrecursive generic aliases can reorder, repeat or omit parameters while preserving a supported union’s origin, including through local scopes and library interfaces. A generic union declared directly inside a body and recursive molds remain unsupported. A directly known named union can instantiate an unconstrained generic gate sample while retaining its origin, generic arguments and faces. Unnamed, pending-tag, recursive, unknown-atom and variable-bound union origins 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. A differing-variable face constraint remains unsupported. When inference forces two distinct explicitly written capitals equal, it reports both source sites; forcing a capital to a concrete type remains unsupported in this fragment. It can infer and generalize atom constraints arising from explicit capitals or bare sample binders, preserve those constraints through aliases, instantiate them independently, and print multiple constraints. Unresolved decimal variables default to `@ud` for inferred types without gates; defaulting inside gate types and other constraint cases remain incomplete. It does not yet check a module, complete imports, general patterns, general deferred constraints, recursive molds, dependency cycles or most errors with both conflicting excerpts. Definite cast and call mismatches, incompatible branches and overlapping union cases report both sites and excerpts. Concrete branch results can join at an explicitly present parent aura or `@`. Some known tuple and record positions acquire matching faces; other variable-dependent face merges, general branch tag context and ambiguous call-result propagation remain unsupported; function compatibility involving nested `@` and variable-dependent joins remain unsupported except for equal types. For a single recursive gate outside a group, the reporting path repeats inference rather than instantiating its generalized interface inside its own body; a group report uses its stored schemes. This adds work, and the current dependency pass can take quadratic time on long forward chains; the milestone's speed target remains unverified. A separate conservative pass reports unions whose cases are provably disjoint or overlapping and leaves other cases unresolved; it does not claim the mold is checked. Unsupported forms are reported as such, and the partial output says the module has not been checked.
59+The inference fragment supports fixed auras, unrestricted `@`, one-way widening into it and toward aura-family ancestors, generic variables and gates, faced and unfaced cells, cell sample binders, known record field reads, a cell pattern of two or more binders, a complete two-arm loobean branch, a complete two-arm unit-shaped branch, closed local mold aliases and acyclic forward value references. For a supported single syntactic top-level recursive gate, the checker infers the sample first and uses that exact sample, including its field faces, in a monomorphic self placeholder. The completed body must unify with the placeholder before the gate is generalized; incompatible recursive arguments can report the call and argument sites. Uses of generalized top-level definitions instantiate their schemes independently. For a complete loobean branch with one direct self-call arm, the checker can infer the other arm independently and use its closed, fully resolved type to seed the recursive result; it then checks the whole body. Open or pending base types do not seed the result, and other branch shapes still depend on the existing partial inference. A supported single local recursive gate also uses a monomorphic self reference while its body is checked, then generalizes variables free of its enclosing environment; captured variables remain shared. Acyclic local value definitions can refer forward. The checker collects written capitals per `++` before inference, excluding nested definitions: a capital used in an enclosing definition is shared with its locals, even when written later, while a capital introduced only in a local definition is generalized there. Sibling locals can introduce independent capitals with the same spelling; generic mold parameters keep their own scope. Top-level groups of syntactic gates are inferred together with monomorphic placeholders and shared substitutions, then generalized only after the whole group checks; downstream uses and library interfaces instantiate those schemes independently. A dependency graph identifies groups with two iterative depth-first passes; its conservative local-reference edges can reject otherwise valid programs. Supported local mutually recursive gate groups also use shared monomorphic placeholders and generalize only after the group checks, preserving captured outer variables. Some proven non-gate value cycles are diagnosed; other mixed gate/value cycles, polymorphic recursion, unresolved literal constraints and unresolved branch joins remain unsupported. Acyclic simple local mold aliases can also refer forward, and are scoped to the body, not its gate's sample. Nonrecursive generic aliases of supported molds can be applied at exact arity, including locally and through library interfaces; their parameters are lexical. Closed, provably disjoint nonrecursive unions and tagged single-case molds support contextual term values, `~` and `|=%tag` constructors. Literal heads compare by their runtime noun, so `|=%$` can construct an explicit null-, loobean-zero- or term-zero-headed case. Equal heads with distinct payloads can be selected when exactly one payload fit is proven; unknown or ambiguous alternatives remain unsupported. Unresolved tags and nulls remain pending, with distinct partial-inference diagnostics. Nonrecursive top-level generic union molds with provably disjoint cases also support contextual tags and constructors at exact arity; their arguments are retained through generalization and supported library interfaces. Nonrecursive generic aliases can reorder, repeat or omit parameters while preserving a supported union’s origin, including through local scopes and library interfaces. Generic unions declared directly inside a body and recursive molds outside the source-proven slices described below remain unsupported. A directly known named union can instantiate an unconstrained generic gate sample while retaining its origin, generic arguments and faces. Unnamed, pending-tag, recursive, unknown-atom and variable-bound union origins 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. A differing-variable face constraint remains unsupported. When inference forces two distinct explicitly written capitals equal, it reports both source sites; forcing a capital to a concrete type remains unsupported in this fragment. It can infer and generalize atom constraints arising from explicit capitals or bare sample binders, preserve those constraints through aliases, instantiate them independently, and print multiple constraints. Unresolved decimal variables default to `@ud` for inferred types without gates; defaulting inside gate types and other constraint cases remain incomplete. It does not yet check a module, complete imports, general patterns, general deferred constraints, recursive molds, dependency cycles or most errors with both conflicting excerpts. Definite cast and call mismatches, incompatible branches and overlapping union cases report both sites and excerpts. Concrete branch results can join at an explicitly present parent aura or `@`. Some known tuple and record positions acquire matching faces; other variable-dependent face merges, general branch tag context and ambiguous call-result propagation remain unsupported; function compatibility involving nested `@` and variable-dependent joins remain unsupported except for equal types and the source-bound gate-sample proof below. For a single recursive gate outside a group, the reporting path repeats inference rather than instantiating its generalized interface inside its own body; a group report uses its stored schemes. This adds work, and the current dependency pass can take quadratic time on long forward chains; the milestone's speed target remains unverified. A separate conservative pass reports unions whose cases are provably disjoint or overlapping and leaves other cases unresolved; it does not claim the mold is checked. Unsupported forms are reported as such, and the partial output says the module has not been checked.
60+
61+A direct unshadowed prelude call can use checked source layouts when a positional argument is a directly named, already inferred root gate. For two-slot function samples, the checker can match a named update against an unnamed generic gate sample without confusing a binder face with a nested record face. Both explicitly named slots must agree; source boundaries are evidence for this fit, not a call-arity rule. The source gate and prelude annotation must be available from their checked bindings. Local or dynamic gates, aliases without direct evidence, recursive or SCC placeholder bodies, other sample shapes and unresolved call-sample variables remain unsupported by this proof. Ordinary inference remains the fallback.
62+
63+The checker retains a per-analysis index of finalized root gates and a prelude source table bound to the entire trusted prepared interface. A dependency screen avoids building the table when the root cannot use it; changing the interface invalidates it. The host remains responsible for supplying a prepared interface paired with its source. The matcher checks each slot and product in both directions with a shared substitution. Before returning its tentative proof it requires both complete call samples to normalize to closed, tag-free types, then repeats every slot check and requires the substitution and fresh-ID counter to remain unchanged. This keeps later argument or enclosing constraints from invalidating an earlier face check, and preserves pending constraints, capital checks and projection evidence. These scans and the bounded second proof add work; they do not establish a global linear-time bound.
64+
65+Before the empty-capital optimization below, single sequential eval runs including startup showed that 2,000 ordinary gates used 70.20 seconds of user CPU at baseline and 70.64 seconds with the cached source table. Fifty unsupported eligible scalar-slot calls used 24.75 and 25.71 seconds, while fifty function-slot failures used 24.15 and 25.36 seconds. Fifty successful calls took 26.56 seconds before the final stability replay and 26.99 seconds with it. These are synthetic measurements, not production performance limits.
66+
67+Restricted-number promotion only applies to written capital variables. If none are present, it returns immediately instead of traversing the environment. In one startup-inclusive pair of runs on 2,000 independent gates, output was byte-identical and user CPU fell from 71.67 to 38.26 seconds; wall time was 72.80 versus 51.66 seconds while other checks were running. This does not establish a bound for dependent modules or a complete-checker benchmark.
68+
69+A bounded source proof can also establish distinct literal heads when a union case is a one-hop application of a uniquely resolved local generic mold. It compares literal runtime nouns and checks the original mold normally before publishing an interface. The same source proof improves the partial report, which still says the mold is not checked. The new proof declines nested or qualified applications, opaque references, recursive-index states, holes and deferred obligations; other valid unions can remain unsupported. A 256-node source budget and a separate 256-entry inherited-state budget apply per attempt. They do not bound the existing pairwise union pass, parsing, atom or name sizes, or downstream checking. Prepared interfaces and inference state remain trusted inputs. `tools/type-union-source-test` and the shared ship guard exercise source resolution, reporting, rollback and these bounds. A separate positive witness can identify overlap in two-field, literal-headed cases when a unique one-hop local, one-parameter generic alias is applied to a concrete primitive payload. It compares the literal noun values and proves the payloads have a shared noun, so an empty or unknown payload is not a witness. The partial report identifies both original case sites. `infer-jibb-file-detailed` returns structured overlap evidence for the first failed mold, including the originating path, exact source, mold name and both case spans. Ordinary Jibb imports preserve a child’s evidence through source and cache checks; the legacy `infer-jibb-file` API remains a text-result adapter and renders both excerpts. Specialized API and prepared-prelude paths retain their existing generic or text-only error boundaries. This witness uses a shared 256-node source/pair budget per attempt; generic-wrapper parameter validation has a separate 256-entry cap. An unsupported earlier case may hide a later overlap. Existing pairwise union analysis, parsing, atom and name sizes, source-excerpt rendering, and downstream checking remain outside these budgets. `tools/type-union-alias-overlap-test` checks the source proof and partial report; `tools/type-full-overlap-test` checks the detailed and legacy full-module paths, source attribution and cache behavior.
60
70
61A single-arm cell pattern can bind two or more positions, with its last binder capturing the remaining tail. Duplicate and shadowed names are rejected. A definite non-cell spine fails; an intermediate union or collection that might contain a cell remains unsupported. For a known non-union cell, a separate one-arm rule also accepts structured patterns, including nested literal and wildcard positions, when the existing coverage proof establishes the whole pattern. It binds payloads with their original types and checks result context; unknown, partially covered, union or recursive spines stay unsupported.
71A single-arm cell pattern can bind two or more positions, with its last binder capturing the remaining tail. Duplicate and shadowed names are rejected. A definite non-cell spine fails; an intermediate union or collection that might contain a cell remains unsupported. For a known non-union cell, a separate one-arm rule also accepts structured patterns, including nested literal and wildcard positions, when the existing coverage proof establishes the whole pattern. It binds payloads with their original types and checks result context; unknown, partially covered, union or recursive spines stay unsupported.
62
72
@@ -80,17 +90,25 @@ A backtick constructs a unit when the supplied prelude has the validated standar
80
90
81A 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.
91A 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.
82
92
93+The checked inference fragment represents the empty mold `!!` explicitly. A cell with a proven-empty field is empty, while a gate returning `!!` and the empty values of `(list !!)` and `(unit !!)` remain inhabited. Supported union matches discard proven-empty cases, reject unreachable list or unit payload arms, and require a proof of reachability for fixed opaque cases. A written capital may have an inhabited instance; the existing definition-boundary checks still reject forcing it to a concrete empty type. A directly known standard `(list !!)` permits a single null arm, including in a result context. Unknown and opaque types, other one-arm list subjects, and proofs exceeding their budgets fail closed. Emptiness checks use up to 256 type-node visits per fit or list/unit reachability proof and 4,096 visits when filtering union cases. These bounds do not cover substitution walking, parsing, normalization, source lookup or repeated attempts. This is a supported checking slice, not a proof of arbitrary recursive molds or runtime execution.
94+
83A known closed union with two or more arms can be matched when each arm provably covers or excludes each remaining case. The checker first tries whole cases; when a pattern splits a case, it can expand known `?` positions into their two noun values, up to 64 alternatives across the union. Binders retain the original case type, and one arm may bind several refinements of that case. It reports missing alternatives and arms already covered, checks tags by noun value, and supports imported and generic union cases. Other partial patterns, expansions above the limit, binders spanning distinct cases, differing arm result types and some complex two-arm subjects remain unsupported. When a cast or known call sample supplies a result type, a known union subject accessed by a wing, a grouped wing or a supported shallow call can propagate that context through whole-case arms and supported finite loobean refinements, including nested cell and list positions. Other partial-pattern contexts and subject forms remain unsupported. The Grammar’s `step` block infers in this fragment, but its module is not yet checked.
95A known closed union with two or more arms can be matched when each arm provably covers or excludes each remaining case. The checker first tries whole cases; when a pattern splits a case, it can expand known `?` positions into their two noun values, up to 64 alternatives across the union. Binders retain the original case type, and one arm may bind several refinements of that case. It reports missing alternatives and arms already covered, checks tags by noun value, and supports imported and generic union cases. Other partial patterns, expansions above the limit, binders spanning distinct cases, differing arm result types and some complex two-arm subjects remain unsupported. When a cast or known call sample supplies a result type, a known union subject accessed by a wing, a grouped wing or a supported shallow call can propagate that context through whole-case arms and supported finite loobean refinements, including nested cell and list positions. Other partial-pattern contexts and subject forms remain unsupported. The Grammar’s `step` block infers in this fragment, but its module is not yet checked.
84
96
85A known closed union can also provide context to each arm of a complete loobean or unit-shaped branch in a cast or a call with a known union sample. Nested branches and transparent groups work; a mismatch reports the expected union and the offending arm. General patterns and context through bodies with local definitions remain unsupported, and unrelated unresolved tags stay pending.
97A known closed union can also provide context to each arm of a complete loobean or unit-shaped branch in a cast or a call with a known union sample. Nested branches and transparent groups work; a mismatch reports the expected union and the offending arm. General patterns and context through bodies with local definitions remain unsupported, and unrelated unresolved tags stay pending.
86
98
87The separate `jibb-dev/lib/jibb-import.hoon` is an unfinished reader for selected Hoon type graphs. It handles named recursion, nested map, set, queue, list, unit, jar and jug arguments, direct ordered maps, and direct `$^` unions whose source branches can be proved disjoint. It also recognizes a direct ordered-map call with two simple named mold operands, as in Tlon `notes.log`, after validating provenance and operand source; revisiting the same map hold fails closed. It also reads ordered map fields in records when the map arguments are syntactically fixed atom molds and other fields are fixed atom molds or standard collections of static atom molds. Collection names must not be shadowed. The reader can also import a mark door sample, removing its outer sample face and validating its build subject. For a mark whose sample is exactly a named arm of its single Ford-imported `/sur` core, it can recover a source-proved nonrecursive union, including source-location wrappers around fields; recursive or unverified fallback results remain unsupported. The reader checks explicit Hoon `$%`, `$?` and `$^` unions against the Grammar’s disjointness rule, as @iko confirmed on 2026-10-30. For an explicit `$%` with distinct literal head tags, it can also prove restricted local named payload dependencies, including bare `~` fields, re-evaluate and validate each source branch, and recover the union before Hoon collapses it. The real Tlon `notes.u-note` exercises its `[%deleted ~]` case. A bounded fallback also recovers one level of local named tagged unions inside such a union, including Tlon `notes.u-notebook` and `notes.u-notes`. Source-proved tagged unions can also be wrapped in Hoon `$~` defaults, including a downstream union using Tlon `epic.saga`; the selected source and projected branches still undergo the same provenance and disjointness checks. The tagged-source helper peels up to four consecutive default wrappers, while default wrappers encountered inside dependency proofs consume the existing semantic-node budget. A source-proved nested self-recursive union retains its named owner, including Tlon `notes.import-node`; deeper, mutually recursive or unproven cases stay unsupported. The nested source proof has a 256-visit semantic-node budget, and source-location wrapper peeling is limited to four per node; Hoon evaluation and source scans are not metered. It rejects recursive or computed dependencies, inherited same-name collisions, unsupported nested unions and proofs exceeding a shared 4,096-node budget. It re-evaluates statically recognizable source branches before Hoon can collapse them, checks materialized fork cases, and rejects shapes it cannot prove disjoint. Static records may also have verified standard-collection and `path` siblings. One direct explicit union argument in a standard list, set, map or unit is accepted when its call wrapper and collection provenance are verified and its static cases are pairwise disjoint. A synthetic regression checks that forged wrapper subjects, samples and tails are rejected. Other collection-union forms, nested ordered maps, general source-level disjointness and complete integration with the checker remain unfinished. `+golden-types-imports` can consume fixed-aura atoms, valid term singletons, Hoon's `%n` zero singleton as Jibb `~`, nested faced or unfaced cells, unions of supported, pairwise-disjoint cases, and opaque standard collections with supported arguments from caller-supplied reader results for declared `/-` imports; `+golden-types-with-marks` accepts the same shapes for declared marks. The caller must pass unchanged results from the source-aware reader: the bridge validates the supplied graph but cannot detect source cases Hoon collapsed before that graph was built. The opaque collection types retain their names and arguments for identity, unification and printing. The validated standard prelude `list` mold shares the imported list representation; other Jibb-written collection molds and most prelude collection operations remain unsupported. Other forms remain unsupported. Its disjointness proof is conservative and can reject a valid union it cannot prove disjoint. Collection recognition requires the originating `/sur` core. The reader validates direct zuse subjects and Ford subjects consisting of faced imported cores and a validated tail, checking imported cores transitively; it rejects shadowed names, inconsistent core subjects and other subject shapes. For a recursive reference, the reader matches the exact Hoon hold against named arms in validated cores, including transitive Ford imports; it rejects missing, unlabelled or ambiguous origins. Its fixtures include three real Tlon files; `tools/importer-test` compares the internal projection under eval, and the ship test compares the same golden output. `tools/type-import-test` and `tools/type-mark-test` compare bridge reports under eval and on the ship. `tools/type-tlon-test` and its ship counterpart exercise four real Tlon presence unions and a field read through the source-aware reader and partial checker. `tools/clay-fixtures` also passes Clay-built `/sur` molds and mark samples through the Clay-built importer and partial checker.
99The separate `jibb-dev/lib/jibb-import.hoon` is an unfinished reader for selected Hoon type graphs. It handles named recursion, nested map, set, queue, list, unit, jar and jug arguments, direct ordered maps, and direct `$^` unions whose source branches can be proved disjoint. It also recognizes a direct ordered-map call with two simple named mold operands, as in Tlon `notes.log`, after validating provenance and operand source; revisiting the same map hold fails closed. It also reads ordered map fields in records when the map arguments are syntactically fixed atom molds and other fields are fixed atom molds or standard collections of static atom molds. Collection names must not be shadowed. The reader can also import a mark door sample, removing its outer sample face and validating its build subject. For a mark whose sample is exactly a named arm of its single Ford-imported `/sur` core, it can recover a source-proved nonrecursive union, including source-location wrappers around fields; recursive or unverified fallback results remain unsupported. The reader checks explicit Hoon `$%`, `$?` and `$^` unions against the Grammar’s disjointness rule, as @iko confirmed on 2026-10-30. For an explicit `$%` with distinct literal head tags, it can also prove restricted local named payload dependencies, including bare `~` fields, re-evaluate and validate each source branch, and recover the union before Hoon collapses it. The real Tlon `notes.u-note` exercises its `[%deleted ~]` case. A bounded fallback also recovers one level of local named tagged unions inside such a union, including Tlon `notes.u-notebook` and `notes.u-notes`. Source-proved tagged unions can also be wrapped in Hoon `$~` defaults, including a downstream union using Tlon `epic.saga`; the selected source and projected branches still undergo the same provenance and disjointness checks. The tagged-source helper peels up to four consecutive default wrappers, while default wrappers encountered inside dependency proofs consume the existing semantic-node budget. A source-proved nested self-recursive union retains its named owner, including Tlon `notes.import-node`; deeper, mutually recursive or unproven cases stay unsupported. The nested source proof has a 256-visit semantic-node budget, and source-location wrapper peeling is limited to four per node; Hoon evaluation and source scans are not metered. It rejects recursive or computed dependencies, inherited same-name collisions, unsupported nested unions and proofs exceeding a shared 4,096-node budget. It re-evaluates statically recognizable source branches before Hoon can collapse them, checks materialized fork cases, and rejects shapes it cannot prove disjoint. Static records may also have verified standard-collection and `path` siblings. One direct explicit union argument in a standard list, set, map or unit is accepted when its call wrapper and collection provenance are verified and its static cases are pairwise disjoint. A synthetic regression checks that forged wrapper subjects, samples and tails are rejected. Other collection-union forms, nested ordered maps, general source-level disjointness and complete integration with the checker remain unfinished. `+golden-types-imports` can consume fixed-aura atoms, valid term singletons, Hoon's `%n` zero singleton as Jibb `~`, nested faced or unfaced cells, unions of supported, pairwise-disjoint cases, and opaque standard collections with supported arguments from caller-supplied reader results for declared `/-` imports; `+golden-types-with-marks` accepts the same shapes for declared marks. The caller must pass unchanged results from the source-aware reader: the bridge validates the supplied graph but cannot detect source cases Hoon collapsed before that graph was built. The opaque collection types retain their names and arguments for identity, unification and printing. The validated standard prelude `list` mold shares the imported list representation; other Jibb-written collection molds and most prelude collection operations remain unsupported. Other forms remain unsupported. Its disjointness proof is conservative and can reject a valid union it cannot prove disjoint. Collection recognition requires the originating `/sur` core. The reader validates direct zuse subjects and Ford subjects consisting of faced imported cores and a validated tail, checking imported cores transitively; it rejects shadowed names, inconsistent core subjects and other subject shapes. For a recursive reference, the reader matches the exact Hoon hold against named arms in validated cores, including transitive Ford imports; it rejects missing, unlabelled or ambiguous origins. Its fixtures include three real Tlon files; `tools/importer-test` compares the internal projection under eval, and the ship test compares the same golden output. `tools/type-import-test` and `tools/type-mark-test` compare bridge reports under eval and on the ship. `tools/type-tlon-test` and its ship counterpart exercise four real Tlon presence unions and a field read through the source-aware reader and partial checker. `tools/clay-fixtures` also passes Clay-built `/sur` molds and mark samples through the Clay-built importer and partial checker.
88
100
101+An import-free Jibb library can export an opaque single-parameter recursive identity when its source has exactly two distinct term-tagged cases: a text leaf and a node containing `(list (name M))`, optionally with one `$-(@t M)` event field. A module-local index records the exact parsed source, defining path and prepared prelude interface; it is shared across that module's inference passes, and its canonical `list` must be source-backed. The normal resolver publishes an interface only after all ordinary mold and value checks succeed. Same-origin aliases retain the defining identity and independently instantiate type arguments; distinct origins remain unsupported. The opaque identity is conservatively treated as gate-bearing for numeric defaulting, and gate-freedom remains unknown. Explicit literal-headed construction uses a source-proven one-layer view: the event result receives the existing type argument and recursive children keep the defining identity. It consumes the existing shared 256-step recursive inference budget, and a per-view 4,096-visit guard bounds the new face and substitution scan; longer scans decline. These bounds do not cover parsing, existing inference, atom sizes or repeated attempts. One startup-inclusive, shared-load comparison of 100 valid and 100 invalid source definitions took 29.67 s wall / 25.14 s user CPU before this slice and 33.47 s / 26.99 s with it; the former declined all 200 while the latter inferred the valid definitions. These single runs are not a production benchmark. Matches over explicit source tags, flat binder or wildcard fields, and nonbinding catch-alls use that same one-layer view and existing binder, coverage and branch checks. Up to 128 arms are screened per attempt; longer matches decline. A single-arm match on a direct in-scope wing can report its missing case, and a contextual one-arm call subject can use a nonbinding catch-all. Recursive children retain their nominal type and arguments. Subject recognition and view validation can each scan substitutions, and the scan cap applies separately to each attempt. In one separate startup-inclusive comparison of 100 valid and 100 invalid source matches, the construction-only checker took 30.18 s wall / 29.31 s user CPU and declined all 200, while the pattern slice took 28.28 s / 27.69 s and inferred or diagnosed them. These single shared-load figures are not production benchmarks. General structural fits, whole-case binders, nested recursive patterns, uncontextualized single-arm call subjects, recursive source with imports and local recursive molds remain unsupported; the test tree does not prescribe the eventual `element` representation. Caller-supplied detached interfaces and caches retain the existing trusted-input contract.
102+
89Self-recursive `/sur` molds can cross the bridge as opaque module-and-name identities when their supported source-aware graph passes validation, including one-argument lists containing same-origin recursive references. The real Tlon `notes.import-node` reaches this bridge; it does not unfold or construct the recursive type. Aliases, foreign references, recursive marks, unfolding, construction and field access remain unsupported; the partial printer declines recursive names that are not in scope.
103Self-recursive `/sur` molds can cross the bridge as opaque module-and-name identities when their supported source-aware graph passes validation, including one-argument lists containing same-origin recursive references. The real Tlon `notes.import-node` reaches this bridge; it does not unfold or construct the recursive type. Aliases, foreign references, recursive marks, unfolding, construction and field access remain unsupported; the partial printer declines recursive names that are not in scope.
90
104
91The partial checker also recognizes a source-proven Jibb recursive mold consisting of `~` and one faced cell with a fixed-aura head and direct self tail. Its identity includes the defining path and name. It unfolds this shape for supported null and cell construction and for a two-arm null/cell match; static application-path literals use the verified public `qath` alias. The internal prelude defines `qath` as a transparent knot sequence and the public prelude re-exports it. Each inference attempt has 256 unfolding and static-segment steps; parsing and separate retries are not bounded by that limit. Dynamic application-path segments, broader patterns and other recursive shapes remain unsupported. Route and static-file existence checks remain milestone 4.
105The partial checker also recognizes a source-proven Jibb recursive mold consisting of `~` and one faced cell with a fixed-aura head and direct self tail. Its identity includes the defining path and name. It unfolds this shape for supported null and cell construction and for a two-arm null/cell match; static application-path literals use the verified public `qath` alias. The internal prelude defines `qath` as a transparent knot sequence and the public prelude re-exports it. Each inference attempt has 256 unfolding and static-segment steps; parsing and separate retries are not bounded by that limit. Dynamic application-path segments, broader patterns and other recursive shapes remain unsupported. Route and static-file existence checks remain milestone 4.
92
106
93−Callers that have a `/sur` core and a name can use `+read-named`: it checks for a locally declared arm before asking Hoon to evaluate the mold, and reports evaluation failures with the final Hoon trace line. `+read-mold-in` remains available when the caller already has the selected type. The opt-in `+read-named-diagnostic` and `+read-mark-diagnostic` preserve successful graphs and distinguish definite `%invalid` aura and core evidence emitted directly by the reader from `%unsupported` failures. Other failures, including unverified union disjointness and vase recognition based only on a name, remain unsupported. These entry points revalidate and re-walk failed types; the opt-in `+golden-types-with-reader-diagnostics` accepts unchanged structured reader results and reports definite aura or core errors at their imported mold use sites, when the import and supplied input are unique. Ordered replay covers direct and nested cell samples, record and function casts, and non-generic same-module aliases; it stops at an unsupported prefix, cycle or shadowing failure. Union molds, generic applications, transitive modules and unsupported reader outcomes still report generic limitations. Replay repeats inference and may add work; this entry point remains partial. Existing checker entry points continue treating failed imports as unsupported. It also fails closed on repeated field faces along an imported record spine, including recursive roots; the diagnostic remains generic. Hoon type graphs can erase unfaced nested-cell boundaries, so the check may conservatively reject a valid source with equal names in distinct erased scopes. Faced nested records and union alternatives keep separate scopes.
107+Callers that have a `/sur` core and a name can use `+read-named`: it checks for a locally declared arm before asking Hoon to evaluate the mold, and reports evaluation failures with the final Hoon trace line. `+read-mold-in` remains available when the caller already has the selected type. The opt-in `+read-named-diagnostic` and `+read-mark-diagnostic` preserve successful graphs and distinguish definite `%invalid` evidence emitted directly by the reader from `%unsupported` failures. Other failures, including unverified union disjointness and vase recognition based only on a name, remain unsupported. These entry points revalidate and re-walk failed types; the opt-in `+golden-types-with-reader-diagnostics` accepts unchanged structured reader results and reports definite aura, core or proven union-overlap errors at their imported mold use sites, when the import and supplied input are unique. Ordered replay covers direct and nested cell samples, record and function casts, and non-generic same-module aliases; it stops at an unsupported prefix, cycle or shadowing failure. Union molds, generic applications, transitive modules and unsupported reader outcomes still report generic limitations. Replay repeats inference and may add work; this entry point remains partial. Existing checker entry points continue treating failed imports as unsupported. It also fails closed on repeated field faces along an imported record spine, including recursive roots; the diagnostic remains generic. Hoon type graphs can erase unfaced nested-cell boundaries, so the check may conservatively reject a valid source with equal names in distinct erased scopes. Faced nested records and union alternatives keep separate scopes.
108+
109+For supported source-aware Hoon `$?` unions, the reader can prove a definite overlap by independently evaluating and projecting the original cases, verifying each projected head against its source tag, and finding a shared runtime noun in a pair. Its positive witness traverses faces, named nodes, forks, cells, supported atom forms and `*`; `!!`, opaque references, applications and unproved aura intersections cannot themselves establish a witness. It compares singleton noun values independently of aura, and requires inhabited positions throughout a cell. Unknown or exhausted proof remains unsupported, while existing disjoint-source recovery still handles proven distinct cases. The source screen admits at most 128 cases and 4,096 raw noun nodes; dependency checking and the pair/type witness each have their own 4,096-node budget. Hoon evaluation, projected-graph validation, chapter lookup, atom byte sizes and other type-graph walks remain outside those budgets. The error points at the Jibb use; source case locations are unavailable. This is a partial named-reader analysis, not general imported-union checking or a mark-reader overlap diagnostic.
110+
111+In single startup-inclusive runs of eight Hoon reads, a benign three-case union used 37.78 seconds of user CPU with the earlier narrow witness and 39.99 seconds with the structural witness; a repeated-head union used 39.84 and 40.97 seconds. Other checks ran concurrently, so these measurements do not establish a production bound.
94
112
95The partial report can diagnose certain non-gate value dependency cycles, including cycles through gates. It requires an explicit atom or loobean result cast and a syntactically proven dependency group with unshadowed simple samples; it identifies the value and a dependency site. Untyped results, branches, nested definitions, qualified wings and complex samples remain unsupported. The proof constructs an additional dependency graph. One 24-case recursive/generic eval run took 19.7 s with it and 18.6 s before it, including startup; these single runs do not isolate the graph cost.
113The partial report can diagnose certain non-gate value dependency cycles, including cycles through gates. It requires an explicit atom or loobean result cast and a syntactically proven dependency group with unshadowed simple samples; it identifies the value and a dependency site. Untyped results, branches, nested definitions, qualified wings and complex samples remain unsupported. The proof constructs an additional dependency graph. One 24-case recursive/generic eval run took 19.7 s with it and 18.6 s before it, including startup; these single runs do not isolate the graph cost.
96
114
@@ -108,14 +126,30 @@ A call whose direct result is a known named generic union can receive a matching
108
126
109A two-item tuple with an explicit term, null or loobean head can receive payload context from a known union when every alternative is a literal-headed cell and its head noun is unique. The payload must be a direct wing-headed call, optionally grouped, with literal, wing or constructor arguments. The checker first retains the original inference if it already fits; otherwise it tries the contextual path once and fits the selected case and enclosing union. It declines this path if any substitution has a structural root, because a caller may have walked away variable provenance. Duplicate heads, opaque competitors and other shapes also stay conservative. The guard scans the substitution for each eligible tuple and may perform one extra shallow inference; it does not guarantee globally linear work. This lets an explicitly typed todo subscription body infer; it does not check an island or prove request watchability.
127A two-item tuple with an explicit term, null or loobean head can receive payload context from a known union when every alternative is a literal-headed cell and its head noun is unique. The payload must be a direct wing-headed call, optionally grouped, with literal, wing or constructor arguments. The checker first retains the original inference if it already fits; otherwise it tries the contextual path once and fits the selected case and enclosing union. It declines this path if any substitution has a structural root, because a caller may have walked away variable provenance. Duplicate heads, opaque competitors and other shapes also stay conservative. The guard scans the substitution for each eligible tuple and may perform one extra shallow inference; it does not guarantee globally linear work. This lets an explicitly typed todo subscription body infer; it does not check an island or prove request watchability.
110
128
129+`+gate-free-type` is a separate three-way proof over normalized checker types: it reports a gate-free result, a gate-bearing witness with its field path, or unknown. It tracks conservative inhabitance before reporting a gate in a cell, spends one shared node budget, and treats opaque recursion, open variables, unknown collection forms and `*` conservatively. Source-proven `qath` and the recognized list/unit representations have dedicated proofs. `+gate-free-mold-source` parses and resolves one named mold with a fresh active-root graph, retaining the complete prepared prelude, source bundle, trusted reader inputs, dependency cache and inferred mold. It caps classification at 256 nodes; parsing, import resolution and type inference are not covered by that cap. The host must canonicalize paths and bind trusted sources and reader results to their versions. API, store and private roots decline; other definitions and unused imported Hoon bindings are not fully checked. This is mold analysis, not a module, kind, island, watchability or runtime check, and it does not infer general gate-free constraints.
130+
131+A full ordinary module may export a narrow checked program `main` only as a direct, unqualified `(program init update view subs)` call with four simple wing arguments, modulo transparent grouping. The canonical prepared prelude must supply both the `program` value and mold. The ordinary source-backed program fit and all normal mold, value and request-graph checks complete first. The inferred `main` must be closed and invariantly match an instantiated `program` mold from that prelude. The initializer must have a closed gate scheme; its data and model contain no open variables and share the existing 256-node gate-free budget, with `%yes` required for both. The named subscription gate may syntactically return null through transparent casts, groups and definition-free bodies. Alternatively, after a successful request-graph merge, it may return one singleton list containing an unfaced `[%watch request]` pair whose request is a direct `case.face` call with one direct constructor callback. The face must resolve to an imported interface whose member has the exact plain derived-request scheme. Exactly one merged request evidence must match its API path and case, agree with the declaration's inner name, and appear in that interface's own graph; the interface source must equal the evidence's API source. The declaration must have no scry, diffs or path parameters. Pure or hand-built requests, helpers, aliases, re-exports, typed paths, folds, multiple subscriptions and missing or ambiguous evidence fail closed. Arbitrary or aliased mains, API/store kinds, and gates or unknowns in data/model also fail closed. This retains source and graph evidence and permits ordinary downstream imports; it neither executes the program nor implements runtime watching.
132+
133+The same post-inference, post-request-graph kind boundary accepts a static `main` by instantiating its ordinary scheme, fitting it to canonical `(element !!)`, requiring the specialized result closed, and publishing that closed canonical scheme. Thus `main view` works when `view` is generic only in its element message. A data page must instead be a direct `(page load view)` call with simple wing arguments and a closed main type invariant against the instantiated canonical `page` mold. Its named load must be a direct gate whose transparent body is exactly `case.face reply`, with a simple wing or direct constructor reply. Page loads and direct program watches share the exact plain derived-member/request-evidence check: unique evidence in the selected interface's own graph, matching API source and inner case name, no typed path segments, diffs or scry. Page aliases, indirect or hand-built/pure/unknown requests, other main types and store paths fail closed. These are interface checks only, not rendering or runtime request claims.
134+
135+When only that program's initializer and `main` are unresolved, a bounded transactional retry can derive the initializer's expected gate from the resolved update, view and subscription components. It instantiates all schemes above the greatest variable ID in the module and prelude, reuses the source-backed positional fit and stable replay, and leaves only the initializer's data variable open. The named initializer must be a direct gate whose transparent body is a tuple ending in null. Its own sample fixes data; ordinary inference, product and whole-gate fits, pending-tag and finalization checks, and a fresh ordinary `main` inference must all succeed before the ordinary kind and graph checks publish anything. Aliases, non-main libraries, simultaneous unresolved subscriptions, nonempty subscriptions and unrelated pending tags decline.
136+
137+A component-local recovery sequence handles a recognized direct program whose context-dependent definitions cannot resolve ordinarily. Update first derives its result from its inferred two-slot sample and canonical `cmd`/`list` templates. Subscription recovery then checks the same message/model relation and the canonical fourth slot. A narrow keyed-view proof finds exactly one direct `each (turn xs mapper)` site, derives the mapper from the actual `each` and `turn` schemes, and recovers the view before the existing initializer and ordinary `main` retries. Every recovered scheme must be closed and freshly allocated above the current environment and prelude IDs. A source screen skips doomed ordinary attempts only for this keyed shape and never skips final `main` inference; non-gate views and aliases decline without crashing. Final publication still requires all module definitions, the program-mold and gate-free checks, and request-value watchability.
138+
139+Canonical `element` composition has two tightly scoped accommodations. Recursive result context is allowed only when every recursive side has the prepared prelude's `element` origin. When ordinary list-item fitting fails, an `element` target may instead prove its message argument invariantly or select one exact literal case with a full payload fit; a successful ordinary fit always takes precedence. This covers the unchanged todo's union controls and raw constructors without opening those paths to other unions. `tools/type-todo-full-test` checks the byte-identical island through both full APIs, the exact closed `main` type, structural downstream import, and model/message/mapper/watch rejection controls. It does not execute Jibb or implement runtime watching.
140+
111Each case's canonical API identity and source-derived schema travel across imports in a nonrecursive graph certificate containing the exact source bundle, prelude, reserved scope and trusted reader results. Cached interfaces must match those inputs and cannot hide an active ancestor; unknown legacy entries are rebuilt from their unique supplied source. Request-bearing closures are limited to 256 paths and requests. Closed gate samples can also fit when an unnamed input slot corresponds to a named one, provided products are identical and nested value faces and ambiguous cell tails remain intact. This is type inference only: request lowering, runtime schema validation and value watchability proofs are not implemented.
141Each case's canonical API identity and source-derived schema travel across imports in a nonrecursive graph certificate containing the exact source bundle, prelude, reserved scope and trusted reader results. Cached interfaces must match those inputs and cannot hide an active ancestor; unknown legacy entries are rebuilt from their unique supplied source. Request-bearing closures are limited to 256 paths and requests. Closed gate samples can also fit when an unnamed input slot corresponds to a named one, provided products are identical and nested value faces and ambiguous cell tails remain intact. This is type inference only: request lowering, runtime schema validation and value watchability proofs are not implemented.
112
142
113`+golden-types-with-prelude` accepts case-local Jibb module sources alongside `/sur` and mark results and the vendored prelude source. It resolves reachable ordinary library modules in dependency order, caching completed interfaces per invocation and exporting supported closed value schemes, direct generic unions, and simple or nonrecursive generic mold aliases whose bodies the fragment supports. It detects missing sources and cycles and rejects a dependency if its interface cannot be inferred by the fragment. Qualified wings can also read nested fields of an imported value, instantiating that value’s scheme independently at each use; missing, ambiguous and non-record fields remain unsupported.
143`+golden-types-with-prelude` accepts case-local Jibb module sources alongside `/sur` and mark results and the vendored prelude source. It resolves reachable ordinary library modules in dependency order, caching completed interfaces per invocation and exporting supported closed value schemes, direct generic unions, and simple or nonrecursive generic mold aliases whose bodies the fragment supports. It detects missing sources and cycles and rejects a dependency if its interface cannot be inferred by the fragment. Qualified wings can also read nested fields of an imported value, instantiating that value’s scheme independently at each use; missing, ambiguous and non-record fields remain unsupported.
114
144
115−The supplied prelude is parsed into a **partial interface**: all names actually declared in the source are reserved, while only the molds and values this fragment can infer are available. These include the validated standard `list` mold, `unit`, the doc-exact generic `cmd` union, `same`, `fall`, `need`, `bond`, `lure`, `weld`, `snoc`, `turn`, `flop`, `rear`, `drop`, `skim`, `skip`, `murn`, `join`, `snip`, `levy`, `lien`, `cork`, `corl`, `cury` and `curr`; unsupported entries remain unavailable. The validated `list` is injected while the prelude’s gates are inferred; `weld` and `turn` use ordinary explicit result casts. An absent or altered `list` is not injected, and an altered declaration cannot leak through a direct or transitive mold alias. The same validated template is available when prelude mold aliases are prepared, so supported direct and transitive aliases can use it. A named prelude union keeps the fixed `/lib/jibb/prelude/jibb` origin in every module, and its name remains unqualified when a library exports a type containing it. The prelude inventory is incomplete, so reserving the names in this source does not establish complete shadowing coverage. The source-backed internal prelude defines `poke`, which the public prelude re-exports as an ordinary transparent type. A dedicated trusted internal-prelude preparation path also supplies private comparison and arithmetic schemes for the Jibb-written `gth`, `add` and `dec` wrappers. Ordinary module resolution rejects that primitive path even if a caller supplies a spoofed root or bundle. The low-level prepared interface is still trusted host input; the host must select the vendored sources and canonicalize paths. Primitive execution and shape-based jet recognition are not implemented. The source-backed `add` and `dec` wrappers use private arithmetic interfaces whose shared atom variable excludes loobeans; the partial checker preserves that constraint through supported inference and prints `where A is an atom other than ?`. Length and primitive execution remain unavailable. The partial checker resolves its supported source shape, preserves its public name, and rejects ordinary imports of the private internal path. An imported API with one mark and a matching direct `+$ poke` declaration can export a derived constructor and retain agent/mark metadata when the source representation has the supported agent case. Other API shapes, complete private module checking, root API and kind checking, stores, complete `ask` and `pure` checking, lowering and runtime effects remain unfinished. A possible store or root API declaring `+$ poke` reports that kind or scope needs unsupported inference; definite duplicate declarations and unrelated shadowing still report conflicts. Prepared interfaces and caches are trusted caller inputs; the future host and linker must ensure the private source validated during preparation is the same version used to lower derived constructors. A `*` payload may contain gates, so the fragment treats it conservatively; full gate-free checks are unfinished. The shared 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.
145+The supplied prelude is parsed into a **partial interface**: all names actually declared in the source are reserved, while only the molds and values this fragment can infer are available. These include the validated standard `list` mold, `unit`, the doc-exact generic `cmd` union, `same`, `fall`, `need`, `bond`, `lure`, `weld`, `snoc`, `turn`, `lent`, `zing`, `flop`, `rear`, `drop`, `skim`, `skip`, `murn`, `join`, `snip`, `levy`, `lien`, `cork`, `corl`, `cury`, `curr`, `lead`, `late`, `trip` and `tuba`; unsupported entries remain unavailable. The validated `list` is injected while the prelude’s gates are inferred; `weld` and `turn` use ordinary explicit result casts. An absent or altered `list` is not injected, and an altered declaration cannot leak through a direct or transitive mold alias. The same validated template is available when prelude mold aliases are prepared, so supported direct and transitive aliases can use it. A named prelude union keeps the fixed `/lib/jibb/prelude/jibb` origin in every module, and its name remains unqualified when a library exports a type containing it. The prelude inventory is incomplete, so reserving the names in this source does not establish complete shadowing coverage. The source-backed internal prelude defines `poke`, which the public prelude re-exports as an ordinary transparent type. A dedicated trusted internal-prelude preparation path also supplies private comparison, arithmetic and text-conversion schemes for the Jibb-written `gth`, `add`, `dec`, `trip` and `tuba` wrappers. Ordinary module resolution rejects that primitive path even if a caller supplies a spoofed root or bundle. The low-level prepared interface is still trusted host input; the host must select the vendored sources and canonicalize paths. Primitive execution and shape-based jet recognition are not implemented. The Jibb-written `lth`, `gte` and `lte` gates compose the source-backed `gth` and `not` gates; supported calls infer a shared atom constraint and return `?`. Their execution and jet recognition await the backend. The source-backed `add` and `dec` wrappers use private arithmetic interfaces whose shared atom variable excludes loobeans; the partial checker preserves that constraint through supported inference and prints `where A is an atom other than ?`. The partial checker resolves the supported `poke` source shape, preserves its public name, and rejects ordinary imports of the private internal path. The Jibb-written `lent` recursively counts a list using `add`; the partial checker infers its generic list argument and `@ud` result. Its execution and jet recognition remain unverified until the backend exists. The Jibb-written `zing` concatenates homogeneous lists in order using `weld`; the checker infers `(list (list A))` to `(list A)`, including for gate elements. Hoon `zing` also accepts heterogeneous noun lists, which this type does not express. `tools/hoon --raw -f tools/testdata/zing-hoon-reference.hoon` compares an equivalent Hoon recursion with Hoon `zing` on selected finite inputs; it does not execute Jibb or verify lowering or jet recognition. The Jibb-written `lead` and `late` are curried pair constructors: `((lead a) b)` returns `[a b]`, while `((late a) b)` returns `[b a]`. The checker infers independent argument types and accepts gates as ordinary values; neither helper invokes an input gate. A Hoon translation is compared with Hoon’s helpers by `tools/hoon --raw -f tools/testdata/lead-late-hoon-reference.hoon`. This does not execute Jibb or verify lowering or jet recognition. An imported API with one mark and a matching direct `+$ poke` declaration can export a derived constructor and retain agent/mark metadata when the source representation has the supported agent case. Other API shapes, complete private module checking, root API and kind checking, stores, complete `ask` and `pure` checking, lowering and runtime effects remain unfinished. A possible store or root API declaring `+$ poke` reports that kind or scope needs unsupported inference; definite duplicate declarations and unrelated shadowing still report conflicts. Prepared interfaces and caches are trusted caller inputs; the future host and linker must ensure the private source validated during preparation is the same version used to lower derived constructors. A `*` payload may contain gates, so the fragment treats it conservatively; full gate-free checks are unfinished. The shared 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.
116
146
117`+prepare-prelude` derives the interface and declared-name inventory from the trusted vendored source. Hosts can reuse its result with `+golden-types-with-prepared-prelude`; they must pass the unchanged result of preparation, not an independently constructed value. Empty, malformed and duplicate-name prelude sources fail closed. The source-taking `+prepare-prelude` and `+golden-types-with-prelude` do not supply the internal module; their `-and-internal` or `-with-internal` variants accept its source for the supported private import. API files, modules with `main`, unsupported definitions and many other features remain outside this subset. The older `+golden-types-with-modules` entry point fails closed for imports because it has no prelude scope. None of these partial reports claims the module has been checked.
147`+prepare-prelude` derives the interface and declared-name inventory from the trusted vendored source. Hosts can reuse its result with `+golden-types-with-prepared-prelude`; they must pass the unchanged result of preparation, not an independently constructed value. Empty, malformed and duplicate-name prelude sources fail closed. The source-taking `+prepare-prelude` and `+golden-types-with-prelude` do not supply the internal module; their `-and-internal` or `-with-internal` variants accept its source for the supported private import. API files, modules with `main`, unsupported definitions and many other features remain outside this subset. The older `+golden-types-with-modules` entry point fails closed for imports because it has no prelude scope. None of these partial reports claims the module has been checked.
118
148
149+The prepared interface includes the source-backed UI molds and constructors, the full nonrecursive `element` union, and the exact `program` and `page` records and builders. Its element union erases nested child, keyed-item and table payloads to `*`, while public constructor schemes retain typed composition and independent key parameters. `types-prelude-ui` checks those schemes and selected valid and invalid compositions. A child-message mismatch currently fails closed as an unsupported list-item constraint rather than a definite mismatch diagnostic. Raw-constructor encapsulation, duplicate-attribute checks, rendering, navigation, storage and execution remain outside this slice.
150+
151+The prepared interface also includes the exact documented `theme` mold. Full checking covers the unchanged real `/ui/theme.jibb`, its exact exported record and a structural downstream import, with dark absent/present and field/type rejection controls. The documented present dark record uses explicit backtick unit syntax, as the Decisions tab records; there is no theme-specific inference exception. This is type checking only: contrast validation, theme rendering and routing remain unimplemented.
152+
119And the design notes:
153And the design notes:
120
154
121| Note | Says |
155| Note | Says |
@@ -169,3 +203,17 @@ Note 4 has examples of each.
169## Speed
203## Speed
170
204
171Starting `urbit eval` and building the library takes about 8 s. A 2,000-line module of 400 definitions then parses in about a second. Loops over definitions, arms, lines and items are tail calls, so a long module grows no stack; nesting costs a few stack frames a level, and 100,000 nested brackets still parse (note 3).
205Starting `urbit eval` and building the library takes about 8 s. A 2,000-line module of 400 definitions then parses in about a second. Loops over definitions, arms, lines and items are tail calls, so a long module grows no stack; nesting costs a few stack frames a level, and 100,000 nested brackets still parse (note 3).
206+
207+The experimental deferred constructor path can close a small import-free library transaction when ordinary resolution stalls. It retries definitions whose earlier attempts failed from their original states, retaining only successful attempts. A transaction with at most 64 definitions makes at most 4,096 attempts; it stops after a pass with no progress. This bounds the new attempt count, not each attempt's parsing, type walks or ordinary inference. Deferred definitions are restricted to simple one-component wings, literals, static strings, gates, transparent groups and empty bodies, calls, casts and a restricted boolean branch. Each successful call or cast fit must have exactly equal normalized operands so later substitutions cannot invalidate a face check. A multi-argument call also needs closed argument, sample and product types because positional face checks depend on slot boundaries and whether the result can be a cell. Other fits fail closed. A 512-node screen bounds visited expression nodes and a separate 512-node scan bounds each stability check; neither bounds mold shapes, string-piece checks, parsing, normalization, lookup, or total repeated inference. It accepts only a direct constructor callback with a closed input, records its pending fit under the source-owned inference state, and generalizes each definition against the live environment and pending constraints. Before publication it discharges and replays every edge, rejects unresolved tags or changed replay state, and checks that all molds and values are complete. The reporter reads the committed schemes for definitions added by the transaction. API and store paths, `main`, prepared-prelude recovery, imports, recursive groups, unresolved holes or written capitals, and new projection actions remain outside this full-module path. `%grec` in the constraint or freshness scan is conservatively unsupported. This is not an island-kind, runtime, or watchability check.
208+
209+An expected cell type can supply context to both arms of a loobean branch. This slice first retains any ordinary inference that already fits. Otherwise it retries from the original state only when a syntax screen excludes nested branches, casts, gates and local bodies, and a substitution screen excludes structural bindings. Both arms must fit, their normalized results and the expected type must be closed, their result types must match, and both fits must replay without changing the final substitution or fresh-ID counter. A successful retry retains the original arm type and its written faces; a failed retry returns the original inference result. The source and substitution screens each visit at most 512 entries. This permits at most one extra attempt for an eligible branch; the screens do not bound preexisting inference, type walks, list construction, or work across separate analyses.
210+
211+In an isolated diagnostic with the real todo API and reader inputs, this cell context allowed the original update body to infer when its result type was written explicitly and experimental source-defined text helpers were supplied. The unchanged island still needs those text helpers, an actual source-backed `program` and UI interface, context propagation across definitions, island-kind checking and watchability proof. This branch change itself provides no runtime implementation or watchability evidence.
212+
213+A deferred boolean branch must use both distinct literal loobean patterns. Its subject is unified with `?`; the arms are inferred in source order without contextual retry. Equal normalized arm types are retained directly. When both written arms are direct literals that each created their own unbound pending tag, the checker can instead retain two source-owned fit obligations to a shared, monomorphic result variable. A later definition may close that variable; replay uses the ordinary literal fit, requires a closed atomic target or a union of direct constant/cell cases, and rejects faced targets and faced union cases. It replays all edges under the final substitution without adding bindings or fresh IDs. This does not support deferred list literals, union-pattern reachability, arbitrary branch expressions or prepared-prelude/imported modules. It does not establish request watchability.
214+
215+With the caller's unchanged prepared prelude, the partial report can also recover a narrow import-free, non-main ordinary library initializer. A direct tuple literal may retain one source-owned fit obligation for each newly created pending literal until a later exact result cast closes them. A separate bounded candidate screen admits a direct tuple even without a constructor call. The prepared transaction requires exact agreement among the supplied interface, value inventory and reserved molds, and retains the API, store, import and `main` exclusions. It only adds recovered entries to the partial report: the ordinary full-module resolver does not publish them. Wrong unit or draft fields, unrelated pending tags and mold-name collisions fail closed; without the later final cast, the initializer remains not checked. This does not add list-literal deferral or import-aware recovery.
216+
217+Before the no-prepared-prelude fallback, the checker screens the already parsed source for a direct single-constructor call beneath groups, gates, casts or bodies without local definitions. The screen visits at most 64 AST nodes per definition and rejects sources with more than 64 definitions or 65,536 bytes. A transaction is attempted at most once per resolver or report invocation and holds at most 64 pending edges. These limits do not bound the initial parsing, ordinary resolution, normalization, or total work across separate analyses. On the pre-recursive-index snapshot, startup-inclusive synthetic 1,000-gate comparisons had baseline/candidate user times of 25.97/29.30 seconds and 26.30/27.46 seconds in reverse order. These are limited shared-load measurements, not production benchmarks. The trimmed source-backed and direct-guard fixture passed in 28.13 seconds wall and 27.53 seconds user on one run after screening; its cases include parse-success checks in the same transaction source pass. The outer resolver and reporter each parse independently, and a fallback currently parses the source again.
218+
219+A single sequential, startup-inclusive comparison against checkpoint `c96597d` measured user CPU for an unrelated stalled library at 25.04 seconds baseline and 26.32 seconds with the screened fallback; an incompatible constructor took 25.72 and 27.16 seconds; a direct constructor that the baseline declined and the candidate resolved took 24.46 and 26.79 seconds. These are small shared-load measurements, not a production benchmark. The screen was separately checked with a trapping fallback: the unrelated source skipped it, while the eligible conflicting source reached it.
docs/development.md+58
@@ -14,6 +14,8 @@ From the plan's Setup and ground rules, and from @iko:
14- **Push straight to `master`.** @iko reviews work in the project's chat, not in pull requests, so there are none. Run the checks below first.
14- **Push straight to `master`.** @iko reviews work in the project's chat, not in pull requests, so there are none. Run the checks below first.
15- **Keep docs/ current**: [status.md](status.md) when a milestone moves, [open-questions.md](open-questions.md) when a question is settled or found.
15- **Keep docs/ current**: [status.md](status.md) when a milestone moves, [open-questions.md](open-questions.md) when a question is settled or found.
16
16
17+The source-backed generic-union guard can be run under eval with `tools/type-union-source-test`; its `test-union-source` arm is also assembled for the fake ship. It checks a bounded partial inference slice, not general union completeness. `tools/type-union-alias-overlap-test` exercises the separate positive overlap witness and its shared ship test arm. `tools/type-full-overlap-test` checks structured full-module overlap evidence and the legacy error text under eval; both of its test arms are assembled for the fake ship.
18+
17## Setting up a machine
19## Setting up a machine
18
20
19The tools need Python 3 and `urbit` (vere) on `PATH`; the ship tools also need a fake `~zod` and click. Everything so far ran with vere 4.6 on Linux.
21The tools need Python 3 and `urbit` (vere) on `PATH`; the ship tools also need a fake `~zod` and click. Everything so far ran with vere 4.6 on Linux.
@@ -62,6 +64,11 @@ git clone https://github.com/urbit/tools /root/src/tools
62| `tools/importer-test` | Compares the partial Hoon importer's diagnostic trees and errors with `tests/importer/tree.txt` under `urbit eval` |
64| `tools/importer-test` | Compares the partial Hoon importer's diagnostic trees and errors with `tests/importer/tree.txt` under `urbit eval` |
63| `tools/type-import-default-test` | Compares default-wrapped union source proofs and adversarial cases under eval; the same golden runs on the ship |
65| `tools/type-import-default-test` | Compares default-wrapped union source proofs and adversarial cases under eval; the same golden runs on the ship |
64| `tools/type-import-test` | Composes the Hoon importer with the partial checker and compares `tests/type-import/expected.txt` under eval |
66| `tools/type-import-test` | Composes the Hoon importer with the partial checker and compares `tests/type-import/expected.txt` under eval |
67+| `tools/type-import-overlap-test` | Checks source-aware Hoon union overlap, provenance and proof-budget controls under eval; the same fixture runs on the ship |
68+| `tools/type-import-structural-test` | Checks multi-case and nested Hoon union overlap witnesses under eval and on the ship |
69+| `tools/type-union-source-test` | Checks bounded local generic-alias disjointness and state guards under eval and on the ship |
70+| `tools/type-union-alias-overlap-test` | Checks source-backed generic-alias overlap witnesses under eval and on the ship |
71+| `tools/type-full-overlap-test` | Checks structured full-module overlap evidence and imported-source attribution |
65| `tools/type-tlon-test` | Runs the real Tlon presence source through the importer and partial checker, comparing `tests/type-tlon/expected.txt` under eval |
72| `tools/type-tlon-test` | Runs the real Tlon presence source through the importer and partial checker, comparing `tests/type-tlon/expected.txt` under eval |
66| `tools/type-import-diagnostic-test` | Compares the structured reader diagnostic bridge report under eval |
73| `tools/type-import-diagnostic-test` | Compares the structured reader diagnostic bridge report under eval |
67| `tools/type-mark-test` | Checks the partial checker’s mark import boundary against `tests/type-mark/expected.txt` under eval |
74| `tools/type-mark-test` | Checks the partial checker’s mark import boundary against `tests/type-mark/expected.txt` under eval |
@@ -70,13 +77,33 @@ git clone https://github.com/urbit/tools /root/src/tools
70| `tools/type-api-evidence-test` | Runs source, scope, reader-result and declaration-watchability evidence guards under eval and on the ship |
77| `tools/type-api-evidence-test` | Runs source, scope, reader-result and declaration-watchability evidence guards under eval and on the ship |
71| `tools/type-hole-guards-test` | Runs the shared hole-defaulting and API interface guards under eval; the same checks run on the ship |
78| `tools/type-hole-guards-test` | Runs the shared hole-defaulting and API interface guards under eval; the same checks run on the ship |
72| `tools/type-list-alias-test` | Runs the shared prelude list-alias and provenance guards under eval and on the ship |
79| `tools/type-list-alias-test` | Runs the shared prelude list-alias and provenance guards under eval and on the ship |
80+| `tools/type-generic-recursion-test` | Checks source-backed generic recursive identity and provenance under eval and on the ship |
81+| `tools/type-generic-construction-test` | Checks source-backed one-layer recursive construction, provenance and fuel under eval and on the ship |
82+| `tools/type-generic-pattern-test` | Checks source-backed recursive patterns, catch-all coverage, state and per-attempt fuel/arm limits under eval and on the ship |
83+| `tools/type-deferred-test` | Checks the bounded source-owned deferred inference transaction under eval and on the ship |
84+| `tools/type-deferred-resolver-test` | Checks deferred resolution, report consistency and atomic failure under eval and on the ship |
85+| `tools/type-deferred-context-test` | Checks deferred source order and literal branch contexts under eval and on the ship |
86+| `tools/type-deferred-prepared-test` | Checks prepared-prelude tuple initializer recovery, exact partial reports and fail-closed guards under eval and on the ship |
87+| `tools/type-cell-branch-test` | Checks closed-cell branch context, rollback and bounded retry screens under eval and on the ship |
73| `tools/type-generic-alias-test` | Runs public/private generic union alias and provenance guards under eval and on the ship |
88| `tools/type-generic-alias-test` | Runs public/private generic union alias and provenance guards under eval and on the ship |
74| `tools/type-positional-face-guards-test` | Runs positional-call and nested-face guards under eval and on the ship |
89| `tools/type-positional-face-guards-test` | Runs positional-call and nested-face guards under eval and on the ship |
75| `tools/type-qath-guards-test` | Runs source-provenance, recursive unfolding and face guards under eval and on the ship |
90| `tools/type-qath-guards-test` | Runs source-provenance, recursive unfolding and face guards under eval and on the ship |
91+| `tools/type-todo-partial-test` | Reports partial inference of the unchanged todo island through the real API and readers under eval and on the ship |
76| `tools/type-todo-api-test` | Exercises the actual todo API through the real Hoon readers and partial checker |
92| `tools/type-todo-api-test` | Exercises the actual todo API through the real Hoon readers and partial checker |
93+| `tools/type-direct-gate-test` | Checks a synthetic source-backed program report and direct gate provenance under eval and on the ship |
94+| `tools/type-page-main-test` | Fully checks byte-identical static and direct data pages through real readers, exact main types, downstream imports and rejection guards under eval and on the ship |
95+| `tools/type-theme-test` | Fully checks the byte-identical real theme, its exact exported type, structural downstream import, dark absent/present forms and rejection guards under eval and on the ship |
96+| `tools/type-program-main-test` | Checks the narrow closed subscription-free program-main interface, downstream import and rejection guards under eval and on the ship |
97+| `tools/type-program-init-test` | Checks transactional direct-program initializer recovery, exact exported/imported types and fail-closed boundaries under eval and on the ship |
98+| `tools/type-program-update-test` | Checks transactional direct-program update result recovery, union/boolean context, exact exported/imported types and fail-closed boundaries under eval and on the ship |
99+| `tools/type-program-watch-test` | Checks direct singleton request-value watchability against merged real-todo evidence, exact types/imports and rejection boundaries under eval and on the ship |
100+| `tools/type-todo-full-test` | Fully checks the byte-identical todo island through real readers, exact main type, structural downstream import and rejection controls under eval and on the ship |
77| `tools/type-closed-gate-guards-test` | Checks closed gate sample labels and face uncertainty under eval and on the ship |
101| `tools/type-closed-gate-guards-test` | Checks closed gate sample labels and face uncertainty under eval and on the ship |
78| `tools/type-constructor-fit-guards-test` | Checks constructor-case uncertainty and known mismatches under eval and on the ship |
102| `tools/type-constructor-fit-guards-test` | Checks constructor-case uncertainty and known mismatches under eval and on the ship |
79| `tools/type-nested-union-guards-test` | Checks nested tagged-union case selection and uncertainty under eval and on the ship |
103| `tools/type-nested-union-guards-test` | Checks nested tagged-union case selection and uncertainty under eval and on the ship |
104+| `tools/type-empty-test` | Checks source-backed empty molds, inhabitedness, coverage and proof budgets under eval and on the ship |
105+| `tools/type-gate-free-guards-test` | Checks bounded gate-free verdicts, inhabitation and witness paths under eval and on the ship |
106+| `tools/type-gate-free-source-test` | Checks source-backed todo mold analysis through the real readers under eval and on the ship |
80| `tools/type-sub-guards-test` | Checks source-backed subscription mold dependencies under eval and on the ship |
107| `tools/type-sub-guards-test` | Checks source-backed subscription mold dependencies under eval and on the ship |
81| `tools/type-ask-guards-test` | Runs ask origin and canonical list/unit bootstrap guards under eval and on the ship |
108| `tools/type-ask-guards-test` | Runs ask origin and canonical list/unit bootstrap guards under eval and on the ship |
82| `tools/type-request-guards-test` | Runs request evidence, source consistency and cache provenance guards under eval and on the ship |
109| `tools/type-request-guards-test` | Runs request evidence, source consistency and cache provenance guards under eval and on the ship |
@@ -97,9 +124,15 @@ git clone https://github.com/urbit/tools /root/src/tools
97
124
98```
125```
99tools/golden # all cases pass
126tools/golden # all cases pass
127+tools/golden --case types-prelude-ui # exact UI/program/page schemes and composition
100tools/importer-test # Hoon importer fixture projections match
128tools/importer-test # Hoon importer fixture projections match
101tools/type-import-default-test # default-wrapped source proofs match
129tools/type-import-default-test # default-wrapped source proofs match
102tools/type-import-test # importer/checker bridge golden report matches
130tools/type-import-test # importer/checker bridge golden report matches
131+tools/type-import-overlap-test # source-aware Hoon overlap and provenance controls
132+tools/type-import-structural-test # nested and multi-case Hoon overlap controls
133+tools/type-union-source-test # local generic-alias union guards
134+tools/type-union-alias-overlap-test # local generic-alias overlap diagnostics
135+tools/type-full-overlap-test # full-module overlap evidence
103tools/type-tlon-test # real Tlon importer/checker report matches
136tools/type-tlon-test # real Tlon importer/checker report matches
104tools/type-import-diagnostic-test # direct structured reader diagnostics match
137tools/type-import-diagnostic-test # direct structured reader diagnostics match
105tools/type-mark-test # mark/checker bridge golden report matches
138tools/type-mark-test # mark/checker bridge golden report matches
@@ -111,10 +144,30 @@ tools/type-list-alias-test # prelude list-alias guards pass
111tools/type-generic-alias-test # generic union alias guards pass
144tools/type-generic-alias-test # generic union alias guards pass
112tools/type-positional-face-guards-test # positional sample face guards pass
145tools/type-positional-face-guards-test # positional sample face guards pass
113tools/type-qath-guards-test # qath source and unfolding guards pass
146tools/type-qath-guards-test # qath source and unfolding guards pass
147+tools/type-todo-partial-test # unchanged todo partial report and reader failure controls
114tools/type-todo-api-test # real todo API partial inference and reader guards pass
148tools/type-todo-api-test # real todo API partial inference and reader guards pass
149+tools/type-direct-gate-test # direct gate source and provenance guards pass
150+tools/type-page-main-test # static/data pages, exact types, imports and rejection guards pass
151+tools/type-theme-test # real theme, exact type, structural import and rejection guards pass
152+tools/type-program-main-test # closed program-main interface and rejection guards pass
153+tools/type-program-init-test # transactional direct-program initializer context guards pass
154+tools/type-program-update-test # transactional direct-program update context guards pass
155+tools/type-program-watch-test # direct request-value watchability guards pass
156+tools/type-todo-full-test # byte-identical full todo, downstream import and rejection guards pass
157+tools/type-generic-recursion-test # source-backed recursive identities and provenance
158+tools/type-generic-construction-test # source-backed recursive construction and bounds
159+tools/type-generic-pattern-test # source-backed recursive patterns and bounds
160+tools/type-deferred-test # source-owned deferred inference guards
161+tools/type-deferred-resolver-test # resolver consistency and failure guards
162+tools/type-deferred-context-test # deferred source-order and branch guards
163+tools/type-deferred-prepared-test # prepared initializer reports and failure guards
164+tools/type-cell-branch-test # contextual branch rollback and bounds
115tools/type-closed-gate-guards-test # closed gate fit guards pass
165tools/type-closed-gate-guards-test # closed gate fit guards pass
116tools/type-constructor-fit-guards-test # constructor fit guards pass
166tools/type-constructor-fit-guards-test # constructor fit guards pass
117tools/type-nested-union-guards-test # nested union selector guards pass
167tools/type-nested-union-guards-test # nested union selector guards pass
168+tools/type-empty-test # empty mold and uninhabited-case guards pass
169+tools/type-gate-free-guards-test # bounded gate-free classifier guards pass
170+tools/type-gate-free-source-test # real todo mold analysis and source guards pass
118tools/type-sub-guards-test # subscription source guards pass
171tools/type-sub-guards-test # subscription source guards pass
119tools/type-ask-guards-test # ask source and bootstrap guards pass
172tools/type-ask-guards-test # ask source and bootstrap guards pass
120tools/type-request-guards-test # request evidence and cache guards pass
173tools/type-request-guards-test # request evidence and cache guards pass
@@ -123,6 +176,9 @@ tools/type-arithmetic-guards-test # arithmetic constraint guards pass
123tools/type-module-scope-test # module/prelude scope golden report matches
176tools/type-module-scope-test # module/prelude scope golden report matches
124tools/hoon check-spans-test # prints <<>>
177tools/hoon check-spans-test # prints <<>>
125tools/hoon itype-unify-test # type-unification controls pass
178tools/hoon itype-unify-test # type-unification controls pass
179+tools/hoon -f tools/testdata/zing-hoon-reference.hoon # Hoon translation agrees on four inputs
180+tools/hoon -f tools/testdata/lead-late-hoon-reference.hoon # Hoon translation agrees on selected inputs
181+tools/hoon -f tools/testdata/succ-hoon-reference.hoon # Hoon translation agrees on selected inputs
126tools/testdata/selftest # 22 checks, 0 failed
182tools/testdata/selftest # 22 checks, 0 failed
127tools/doc-blocks docs/spec # every jibb block has its case
183tools/doc-blocks docs/spec # every jibb block has its case
128tools/ship gen-tests --check # tests/lib/jibb.hoon is up to date
184tools/ship gen-tests --check # tests/lib/jibb.hoon is up to date
@@ -174,3 +230,5 @@ Write `source.jibb` and `about.txt` by hand, run `tools/golden --update --case <
174## Commits
230## Commits
175
231
176A short subject in the imperative, then a body that says what changed and why, wrapped at 72 columns, as in `git log`. Each commit leaves every check passing.
232A short subject in the imperative, then a body that says what changed and why, wrapped at 72 columns, as in `git log`. Each commit leaves every check passing.
233+
234+`tools/type-deferred-test` exercises the bounded, source-owned constructor transaction and low-level freshness/replay guards. `tools/type-deferred-resolver-test` checks the experimental import-free library resolver, report consistency, atomic failure, and that both source orders of a late face constraint decline. `tools/type-deferred-prepared-test` checks the separate partial-report-only prepared-prelude route, direct tuple-literal obligations, exact report types and its wrong-field, unrelated-tag, mold-collision and no-final-cast controls. These checks do not establish island-kind or watchability support.
docs/prelude-inventory.md+11−5
@@ -6,7 +6,11 @@ The source is the fake ship's `%base` `/sys/hoon.hoon` (Hoon version 135), read
6
6
7The vendored prelude defines `poke` in its private internal module and re-exports it as a transparent type. The partial checker resolves its supported source shape and a narrow imported API constructor; complete checking of the private body, other API shapes, effect lowering and runtime execution remain unfinished. `qath` is defined there as a transparent recursive knot sequence and re-exported by the public prelude; the partial checker supports its named identity, selected construction and matching, and static application-path literals. The internal prelude also defines a transparent generic `ask` with pure, agent and store cases; the public prelude re-exports it and defines `pure`. Supported source construction and matching infer, while derived requests, source-schema validation and execution remain unfinished.
7The vendored prelude defines `poke` in its private internal module and re-exports it as a transparent type. The partial checker resolves its supported source shape and a narrow imported API constructor; complete checking of the private body, other API shapes, effect lowering and runtime execution remain unfinished. `qath` is defined there as a transparent recursive knot sequence and re-exported by the public prelude; the partial checker supports its named identity, selected construction and matching, and static application-path literals. The internal prelude also defines a transparent generic `ask` with pure, agent and store cases; the public prelude re-exports it and defines `pure`. Supported source construction and matching infer, while derived requests, source-schema validation and execution remain unfinished.
8
8
9−The prelude also declares the generic `cmd` mold exactly as in Overview, Effects. The partial checker infers its five cases and independent message types in the supported examples; complete module checking and backend validation remain outstanding. The related `sub` declaration awaits checking and the remaining request support.
9+The prelude also declares the generic `cmd` mold exactly as in Overview, Effects. The partial checker infers its five cases and independent message types in the supported examples; complete module checking and backend validation remain outstanding. The public prelude also declares `sub`; the partial checker infers supported constructions, while request watchability and execution remain outstanding.
10+
11+The public prelude now defines the UI `length`, `align`, `role`, `tone` and `attr` molds, a nonrecursive generic `element` union with one case per UI node, and the exact `program` and `page` records with their builders. Nested child, keyed-item and table payloads in the runtime union are erased to `*`; the public constructors retain typed children and independent key types, and `island` stores `[program data]` in its erased payload. The focused `types-prelude-ui` golden infers the complete union and constructor schemes, including static and message-bearing composition. Raw-constructor encapsulation, duplicate-attribute rejection, rendering, storage, navigation and execution are not established by this slice.
12+
13+The public prelude also defines the exact `theme` mold: three space cords, five normal tone cords, `wide`, `lang` and `zone` cords, `(unit qath)` for `font`, and a unit containing the same five dark tone cords. The shared `type-theme` fixture fully checks the byte-identical real theme and its structural downstream import, including dark absent/present and malformed-field negatives. It does not implement contrast checking, rendering, routing or any other theme behavior.
10
14
11Hoon `+$` arms are marked **mold** below; `++` arms can be gates, doors or mold generators, and need individual inspection. Jibb's loobean `not` and Hoon's bitwise `not.bit` are distinct. Parser helpers outside 3g are excluded from the intended prelude except the specifically listed `slav` and `slaw`; the raw candidates below still need to be classified.
15Hoon `+$` arms are marked **mold** below; `++` arms can be gates, doors or mold generators, and need individual inspection. Jibb's loobean `not` and Hoon's bitwise `not.bit` are distinct. Parser helpers outside 3g are excluded from the intended prelude except the specifically listed `slav` and `slaw`; the raw candidates below still need to be classified.
12
16
@@ -14,7 +18,7 @@ Hoon `+$` arms are marked **mold** below; `++` arms can be gates, doors or mold
14
18
15`add`, `dec`, `div`, `dvr`, `gte`, `gth`, `lte`, `lth`, `max`, `min`, `mod`, `mul`, `sub`.
19`add`, `dec`, `div`, `dvr`, `gte`, `gth`, `lte`, `lth`, `max`, `min`, `mod`, `mul`, `sub`.
16
20
17−The source-backed `gth` gate calls a compiler-supplied private comparison interface. The partial checker accepts supported equal-aura atom arguments, including loobeans, and returns `?`; lowering, jet recognition and execution remain unfinished. The public `add` and `dec` gates are written in Jibb over private primitive interfaces. The partial checker infers a shared atom type that excludes loobeans, including through supported generic calls. Primitive execution and jet recognition remain unfinished.
21+The source-backed `gth` gate calls a compiler-supplied private comparison interface. The partial checker accepts supported equal-aura atom arguments, including loobeans, and returns `?`; lowering, jet recognition and execution remain unfinished. The public `add` and `dec` gates are written in Jibb over private primitive interfaces. The partial checker infers a shared atom type that excludes loobeans, including through supported generic calls. The Jibb-written `lth`, `gte` and `lte` gates compose `gth` and `not`; supported calls infer a shared atom constraint and return `?`. Primitive execution and jet recognition remain unfinished.
18
22
19## 1c
23## 1c
20
24
@@ -26,7 +30,7 @@ The source-backed `gth` gate calls a compiler-supplied private comparison interf
26
30
27`biff`, `bind`, `bond`, `both`, `clap`, `clef`, `drop`, `fall`, `flit`, `hunt`, `lift`, `mate`, `need`, `some`.
31`biff`, `bind`, `bond`, `both`, `clap`, `clef`, `drop`, `fall`, `flit`, `hunt`, `lift`, `mate`, `need`, `some`.
28
32
29−The following is an audit of the Hoon 135 bodies, not a completed Jibb interface. The partial checker infers `fall`, `need`, `some`, `bind`, `biff`, `bond`, `both`, `clap`, `clef`, `drop` and `flit`; the remaining written implementations have been parsed, but complete checker validation remains outstanding. Backend validation remains outstanding for all of them.
33+The following is an audit of the Hoon 135 bodies, not a completed Jibb interface. The partial checker infers `fall`, `need`, `some`, `bind`, `biff`, `bond`, `both`, `clap`, `clef`, `drop` and `flit`; the remaining written implementations have been parsed, but complete checker validation remains outstanding. Backend validation and jet recognition remain outstanding for all of them.
30
34
31| Name | Hoon behavior | Jibb status |
35| Name | Hoon behavior | Jibb status |
32| --- | --- | --- |
36| --- | --- | --- |
@@ -49,7 +53,7 @@ The following is an audit of the Hoon 135 bodies, not a completed Jibb interface
49
53
50`snoc`, `lure`, `fand`, `find`, `flop`, `gulf`, `homo`, `join`, `bake`, `lent`, `levy`, `lien`, `limo`, `murn`, `oust`, `reap`, `rear`, `reel`, `roll`, `scag`, `skid`, `skim`, `skip`, `slag`, `snag`, `snip`, `sort`, `spin`, `spun`, `swag`, `turn`, `weld`, `snap`, `into`, `welp`, `zing`.
54`snoc`, `lure`, `fand`, `find`, `flop`, `gulf`, `homo`, `join`, `bake`, `lent`, `levy`, `lien`, `limo`, `murn`, `oust`, `reap`, `rear`, `reel`, `roll`, `scag`, `skid`, `skim`, `skip`, `slag`, `snag`, `snip`, `sort`, `spin`, `spun`, `swag`, `turn`, `weld`, `snap`, `into`, `welp`, `zing`.
51
55
52−The current prelude writes `snoc`, `lure`, `flop`, `join`, `levy`, `lien`, `murn`, `rear`, `reel`, `roll`, `skim`, `skip`, `snip`, `turn` and `weld`. `murn` keeps the present products of its gate in order; `join` inserts a separator between items; `snip` drops the last item, and `rear` returns it or crashes on an empty list. The folds take an explicit initial value as the Prelude table specifies. The partial checker infers `snoc`, `lure`, `weld`, `turn`, `flop`, `rear`, `skim`, `skip`, `murn`, `join`, `snip`, `levy` and `lien` using the validated prelude `list` mold; other list helpers remain limited by that fragment. The result casts on `drop`, `skim`, `skip`, `murn`, `join`, `snip`, `levy` and `lien` state their existing result types without changing their bodies. Backend validation remains outstanding for all of them.
56+The current prelude writes `snoc`, `lure`, `flop`, `join`, `lent`, `zing`, `levy`, `lien`, `murn`, `rear`, `reel`, `roll`, `skim`, `skip`, `snip`, `turn` and `weld`. `lent` counts items by recursion and `add`; `murn` keeps the present products of its gate in order; `join` inserts a separator between items; `snip` drops the last item, and `rear` returns it or crashes on an empty list. The folds take an explicit initial value as the Prelude table specifies. The partial checker infers `snoc`, `lure`, `weld`, `turn`, `flop`, `rear`, `skim`, `skip`, `murn`, `join`, `snip`, `lent`, `zing`, `levy` and `lien` using the validated prelude `list` mold; other list helpers remain limited by that fragment. The result casts on `drop`, `skim`, `skip`, `murn`, `join`, `snip`, `levy` and `lien` state their existing result types without changing their bodies. `zing` concatenates homogeneous lists in order; Hoon’s raw `zing` can also flatten heterogeneous noun lists, which this Jibb type does not express. A Hoon translation agrees with Hoon `zing` on selected finite inputs; this is not Jibb execution. Backend validation and jet recognition remain outstanding for all of them.
53
57
54## 2c
58## 2c
55
59
@@ -99,7 +103,7 @@ The current prelude writes `snoc`, `lure`, `flop`, `join`, `levy`, `lien`, `murn
99
103
100`aftr`, `cork`, `corl`, `cury`, `curr`, `fore`, `head`, `same`, `succ`, `tail`, `test`, `lead`, `late`.
104`aftr`, `cork`, `corl`, `cury`, `curr`, `fore`, `head`, `same`, `succ`, `tail`, `test`, `lead`, `late`.
101
105
102−The source-backed `cork` and `corl` compose gates forward and backward, respectively; `cury` and `curr` bind the first and second item of an unfaced pair. The partial checker infers their polymorphic types. Their runtime implementations remain to be validated by a backend.
106+The source-backed `cork` and `corl` compose gates forward and backward, respectively; `cury` and `curr` bind the first and second item of an unfaced pair. `succ` increments an atom through `add`; the partial checker infers a shared atom type excluding loobeans. A Hoon translation agrees with Hoon on ten selected inputs; Jibb execution and jet recognition remain unverified. `lead` and `late` are curried pair constructors: `((lead a) b)` returns `[a b]`, and `((late a) b)` returns `[b a]`. Their arguments may have independent types, including gate values, and neither constructor invokes a gate. The partial checker infers their polymorphic types. A Hoon translation agrees with Hoon’s helpers on selected inputs, but this is not Jibb execution; lowering and jet recognition remain to be validated by a backend.
103
107
104## 2o
108## 2o
105
109
@@ -162,6 +166,8 @@ The compiler-result `tone.hoon` has the three cases listed above; the qualified
162
166
163`at`, `cass`, `cuss`, `crip`, `mesc`, `runt`, `sand`, `sane`, `ruth`, `trim`, `trip`, `teff`, `taft`, `tuba`, `tufa`, `tuft`, `wack`, `wick`, `woad`, `wood`.
167`at`, `cass`, `cuss`, `crip`, `mesc`, `runt`, `sand`, `sane`, `ruth`, `trim`, `trip`, `teff`, `taft`, `tuba`, `tufa`, `tuft`, `wack`, `wick`, `woad`, `wood`.
164
168
169+The prelude writes `trip` and `tuba` over private primitives. Their inferred types are `$-(@t (list @tD))` and `$-((list @tD) (list @c))`, matching the target ship's Hoon 135 definitions. Composition with `lent` and invalid argument controls pass in the partial checker; primitive lowering, execution and jet recognition remain unfinished.
170+
165## 4k
171## 4k
166
172
167`co`.
173`co`.
docs/spec/decisions.md+1−1
@@ -77,7 +77,7 @@ The choices behind the Language tab, made on 2026-10-23; a later date marks a re
77| Apps | One island under a catch-all route, given the path by `pure`; `%url` delivers the path on every change; in-section links act as `go`; focus moves to the first heading | Decided 2026-10-29 |
77| Apps | One island under a catch-all route, given the path by `pure`; `%url` delivers the path on every change; in-section links act as `go`; focus moves to the first heading | Decided 2026-10-29 |
78| Layout vocabulary | Jibb's elements and theme tokens; the stylesheet comes from the theme alone; chars and fill are inline; `[%fill n]` below 1 counts as 1 | Decided 2026-10-29 |
78| Layout vocabulary | Jibb's elements and theme tokens; the stylesheet comes from the theme alone; chars and fill are inline; `[%fill n]` below 1 counts as 1 | Decided 2026-10-29 |
79| Responsive layout | `stack` switches at the theme's `wide` | Decided 2026-10-29 |
79| Responsive layout | `stack` switches at the theme's `wide` | Decided 2026-10-29 |
80−| Theme | A prelude mold with every token required: spaces, five tones with `normal` and `background`, language, zone, `wide`, and an optional static font; 4.5:1 contrast enforced | Decided 2026-10-29 |
80+| Theme | A prelude mold with every token required: spaces, five tones with `normal` and `background`, language, zone, `wide`, and an optional static font; optional values such as dark tones use explicit backtick unit syntax; 4.5:1 contrast enforced | Decided 2026-11-01 |
81| Dark mode | Hand-written dark tones under `dark`, used when the reader prefers dark | Decided 2026-10-27 |
81| Dark mode | Hand-written dark tones under `dark`, used when the reader prefers dark | Decided 2026-10-27 |
82| Links | All text escaped; in-app links are application paths, as `%/blog/(slug)`, with no query or fragment, checked at compile time against routes and static files; paths and unchecked `https`, `mailto` and `tel` URLs and root-relative cords such as `"/apps/groups"` have separate declarations; `link-unsafe`, `image-unsafe` and `go-unsafe` are the unchecked forms; both navigation declarations produce `[%go url=@t]`, with `go` converting the path to a cord including the app's base path; other cords render as text; a CSP on every page | Decided 2026-10-30 |
82| Links | All text escaped; in-app links are application paths, as `%/blog/(slug)`, with no query or fragment, checked at compile time against routes and static files; paths and unchecked `https`, `mailto` and `tel` URLs and root-relative cords such as `"/apps/groups"` have separate declarations; `link-unsafe`, `image-unsafe` and `go-unsafe` are the unchecked forms; both navigation declarations produce `[%go url=@t]`, with `go` converting the path to a cord including the app's base path; other cords render as text; a CSP on every page | Decided 2026-10-30 |
83| Data layer | Hoon's nouns: units, treaps, loobeans | Decided |
83| Data layer | Hoon's nouns: units, treaps, loobeans | Decided |
docs/spec/overview.md+1−1
@@ -216,7 +216,7 @@ The theme, `++ theme` in `/ui/theme.jibb`, uses the prelude's `theme` mold, with
216 lang="en"
216 lang="en"
217 zone="UTC"
217 zone="UTC"
218 font=`%/static/fonts/inter.woff2
218 font=`%/static/fonts/inter.woff2
219− dark=[tones=[normal="#eee" background="#111" accent="#4c9" danger="#f28b82" muted="#aaa"]]
219+ dark=`[tones=[normal="#eee" background="#111" accent="#4c9" danger="#f28b82" muted="#aaa"]]
220```
220```
221
221
222Style attributes compile to atomic classes in one stylesheet built from the theme, so islands can't compute a missing class. `[%chars n]` and `[%fill n]` become inline styles.
222Style attributes compile to atomic classes in one stylesheet built from the theme, so islands can't compute a missing class. `[%chars n]` and `[%fill n]` become inline styles.
docs/status.md+101−10
@@ -1,6 +1,6 @@
1# Status
1# Status
2
2
3−As of 2026-10-31. The plan is [spec/implementation-plan.md](spec/implementation-plan.md); each milestone ends with its checks passing on a fake ship.
3+As of 2026-11-01. The plan is [spec/implementation-plan.md](spec/implementation-plan.md); each milestone ends with its checks passing on a fake ship.
4
4
5| # | Milestone | Status |
5| # | Milestone | Status |
6| --- | --- | --- |
6| --- | --- | --- |
@@ -23,13 +23,37 @@ The parser accepts `_` in mold positions and typed path segments, retaining each
23
23
24On 2026-10-31, @iko chose explicit, result-directed `(proj record)` to construct a record with exactly the expected fields, and reserved `proj` against definitions and imports. The partial checker handles selected explicit calls with known, closed record types, records field-selection evidence for later lowering, and reserves the name across source bindings. Reordered fields, some nested contexts and several open or recursive cases remain unsupported; lowering and execution are not implemented yet. The field-order question remains open.
24On 2026-10-31, @iko chose explicit, result-directed `(proj record)` to construct a record with exactly the expected fields, and reserved `proj` against definitions and imports. The partial checker handles selected explicit calls with known, closed record types, records field-selection evidence for later lowering, and reserves the name across source bindings. Reordered fields, some nested contexts and several open or recursive cases remain unsupported; lowering and execution are not implemented yet. The field-order question remains open.
25
25
26−The internal prelude also defines `qath` as a transparent recursive knot sequence, re-exported by the public prelude. The partial checker recognizes its source identity, supports selected null/cell construction and matching, and types static application-path literals. Other recursive shapes, broader patterns and dynamic application-path segments remain unsupported. A 256-step limit applies per inference attempt, not to parsing or retries; checking routes and static files remains milestone 4.
26+The internal prelude also defines `qath` as a transparent recursive knot sequence, re-exported by the public prelude. The partial checker recognizes its source identity, supports selected null/cell construction and matching, and types static application-path literals. Construction and matching for other recursive shapes, broader patterns and dynamic application-path segments remain unsupported. A 256-step limit applies per inference attempt, not to parsing or retries; checking routes and static files remains milestone 4.
27
27
28+The checker also recognizes a limited source-proven generic recursive tree in an import-free defining module. Its nominal identity retains the defining path, mold name and type arguments, including across supported imports and aliases. With a known expected type it can construct supported tagged cases by checking one source-proven layer at a time. Flat matches with explicit tags or nonbinding catch-alls also work for these source-proven trees, as does a missing-case diagnostic for a supported single-arm match. At most 128 arms are screened per attempt; whole-case binders and nested patterns remain unsupported. Broader pattern matching, general structural fits and gate-free proof remain unsupported; this is not yet the prelude's `element` implementation or island checking. The source index uses fixed-shape checks during mold collection. Each construction or supported pattern attempt has 256 unfolding steps and at most 4,096 face and substitution visits per scan; pattern subject recognition and view validation can each scan separately. Parsing, other inference and retries remain outside those limits. A single startup-inclusive comparison of 1,000 ordinary gates produced identical reports and used 29.12 seconds of user CPU before the shared-resolver refactor and 28.55 seconds after it, with other work running; it is not a general performance bound.
29+
30+A bounded local source proof recognizes a narrow class of generic-alias union cases with different literal heads, then applies the ordinary mold checks. Nested or qualified aliases and several open states remain unsupported, including a valid alias used during the deferred transaction; the partial report states that the mold itself has not been checked. `tools/type-union-source-test` exercises the source and state bounds and failure paths under eval and on the ship. A separate bounded witness now reports proven collisions between supported literal-headed aliases, with both original case sites; unknown payload intersections still decline. The detailed full-module result now carries the first failed mold’s source-bound overlap evidence, including through ordinary Jibb imports; the legacy text result renders both case excerpts. Specialized API and prelude paths remain limited. The shared guards pass under eval and on the ship.
31+
32+The checker can experimentally discharge a narrowly scoped direct-constructor constraint while resolving an import-free library without a prepared prelude. It preserves independent generalized schemes and publishes only after all source molds, values, and recorded constraints close. API/store paths, `main`, imports, prepared preludes, recursive groups, open constraints, projection actions, and `%grec` in the constraint graph remain unsupported by this route. The fallback also declines source shapes outside its bounded direct-call screen. It does not yet typecheck the unchanged todo island or establish watchability.
33+
34+A prepared-prelude partial report can recover a narrow import-free, non-main ordinary library initializer by deferring source-owned literals in a direct tuple until a later exact result cast. The prepared interface and declared-name inventories must agree exactly. API/store paths, `main` and imports remain excluded, and the ordinary full-module resolver does not publish the recovered interface. Wrong field types, unrelated tags and mold collisions fail closed; a no-final-cast control remains unchecked. `tools/type-deferred-prepared-test` checks the exact recovered types and unchanged `partial inference; module not checked` disclaimer under eval and on the ship. List-literal deferral and import-aware recovery remain unsupported.
35+
36+Closed cell context can now flow through a bounded loobean branch while preserving the inferred value faces and original failed-inference behavior. Open or structurally uncertain substitutions and nested retry shapes remain unsupported. This does not by itself provide the remaining cross-definition context or complete island-kind and watchability checks needed by the unchanged todo island.
37+
28−The internal prelude defines a transparent generic `ask` with pure, agent and store cases, re-exported alongside the Jibb-written `pure` gate. The partial checker infers supported constructors and exhaustive matches. Agent and store receivers operate on raw nouns; their fields do not prove schema validity or watchability. The public prelude now defines the documented source-backed `sub` union; supported `%watch` payloads retain the public `(ask M)` type. Constructing a `sub` does not prove that its request is watchable. Request lowering, checked decoding, runtime validation and island watch checking remain unimplemented.
38+The internal prelude defines a transparent generic `ask` with pure, agent and store cases, re-exported alongside the Jibb-written `pure` gate. The partial checker infers supported constructors and exhaustive matches. Agent and store receivers operate on raw nouns; their fields do not prove schema validity or watchability. The public prelude now defines the documented source-backed `sub` union; supported `%watch` payloads retain the public `(ask M)` type. Constructing a `sub` does not prove that its request is watchable. Request lowering, checked decoding, runtime validation and general island watch checking remain unimplemented; the separate direct-program proof below covers only one narrow static value shape.
39+
40+The public prelude now contains the source-backed UI length/attribute molds, all element constructors, and exact program/page records and builders. The full 19-case generic `element` union is nonrecursive: nested child, keyed-item and table payloads are `*`, while public constructor schemes preserve typed composition and independent key types. `island` returns `(element !!)` with `[program data]` as its erased payload. The focused UI golden checks exact schemes, static and message-bearing composition, concrete programs/pages/islands, malformed inputs and selected mismatches. A child-message mismatch fails closed as an unsupported constraint. Raw-constructor encapsulation, duplicate-attribute checks, rendering, storage, navigation and execution are not claimed.
41+
42+The public prelude now defines the exact documented `theme` record, including required text tokens, an optional `qath` font and optional dark tones. A shared eval/ship fixture fully checks the byte-identical `my-app/ui/theme.jibb`, checks its exact exported type and structural downstream import, and covers absent dark tones plus wrong nested auras, missing fields and wrong font/dark types. On 2026-11-01, @iko chose explicit backtick syntax for present units, and the documented dark record now uses it. No contrast check, rendering, routing or other theme behavior is implemented.
29
43
30Known same-origin generic-union result context can now constrain a call before its arguments are inferred. An unresolved or opaque constructor target stays unsupported rather than producing a definite mismatch; proven missing tags still report errors. A todo request with explicit `(ask msg)` context can infer `|=%got`; its uncontextualized form remains unsupported. A two-item literal-headed tuple can receive payload context from a known union of uniquely headed literal cells when its payload is a shallow wing-headed call with literal, wing or constructor arguments. Existing inference takes precedence when it fits; otherwise the checker tries the contextual path once. It conservatively declines that path when any substitution has a structural root, as well as for duplicate or opaque competitors. The guard scans substitutions per eligible tuple and may add one shallow inference; no global linear-time bound is claimed. This allows an explicitly typed todo subscription body to infer, but does not check the island or prove request watchability.
44Known same-origin generic-union result context can now constrain a call before its arguments are inferred. An unresolved or opaque constructor target stays unsupported rather than producing a definite mismatch; proven missing tags still report errors. A todo request with explicit `(ask msg)` context can infer `|=%got`; its uncontextualized form remains unsupported. A two-item literal-headed tuple can receive payload context from a known union of uniquely headed literal cells when its payload is a shallow wing-headed call with literal, wing or constructor arguments. Existing inference takes precedence when it fits; otherwise the checker tries the contextual path once. It conservatively declines that path when any substitution has a structural root, as well as for duplicate or opaque competitors. The guard scans substitutions per eligible tuple and may add one shallow inference; no global linear-time bound is claimed. This allows an explicitly typed todo subscription body to infer, but does not check the island or prove request watchability.
31
45
46+A separate source-backed analysis can prove one named mold gate-free, report a definite gate with a field path, or return unknown. It retains the prepared prelude, source bundle, reader results and resolved imports; the actual todo model proves gate-free, while a callback field reports its path and `*` remains unknown. Its classifier is capped at 256 nodes, not the surrounding parse and import work. API, store and private roots are unsupported, and the artifact does not check a module or island, infer generalized constraints, or prove watchability.
47+
48+The partial checker can also match a directly named, checked root gate against a generic gate sample in a direct, unshadowed source-backed prelude call. It uses the written two-slot sample layouts to preserve nested record faces, then requires the complete call samples to be closed and tag-free and repeats the fit under the final substitution. The proof falls back to existing inference for unavailable or ambiguous source layouts, local or dynamic gates, aliases, recursive placeholders and open generic caller types. It preserves written-capital checks and projection evidence; it does not add `program`, check islands or prove request watchability. Prepared prelude source and interface remain a trusted pair.
49+
50+A narrow full-module path now checks direct four-wing `(program init update view subs)` definitions named `main`. It requires the canonical prepared `program` value and mold, reuses ordinary source-backed program fitting, and publishes only after all ordinary module and request-graph checks. The inferred `main` must be closed and invariantly match the instantiated `program` mold. Initializer data and model must be closed and gate-free with `%yes` verdicts inside a shared 256-node budget. `subs` may syntactically return null through transparent forms, or one direct imported request watch after the request graph merges. The latter is only an unfaced two-item `[%watch (case.face |=%callback)]` singleton: the imported member must have the exact plain derived-request scheme, a unique merged request must match the API path and both case names and occur in the interface's own graph, the API source must be identical, and scry, diffs and parameters must be absent. Pure or hand-built values, helpers, aliases, re-exports, typed paths, folds, multiple watches and unknown or ambiguous evidence remain rejected. Checked interfaces retain source evidence and support ordinary downstream imports; no program execution or runtime watching is claimed. A transactional extension can recover a direct initializer whose transparent tuple body ends in null when update, view and subs are already resolved. It derives the expected gate through the ordinary positional program fit with fresh IDs and stable replay, then re-infers the actual initializer and `main` under all ordinary finalization and kind checks. Non-main libraries, aliases, nonempty or simultaneously unresolved subscriptions, and unrelated pending tags remain rejected.
51+
52+Static and direct data-page `main` checking now completes the unchanged about page, blog index and todo index through the real Hoon readers. Static generic element mains specialize to closed canonical `(element !!)`; direct pages require a closed invariant `page` type and a direct plain derived-request load. Page loads reuse the strict source/member/evidence identity checks used by program watches, rejecting aliases, indirect/hand-built/pure/unknown requests, typed paths, diffs and store paths. The shared eval and ship fixture asserts exact main types and structural downstream imports. Rendering, runtime loading and request execution remain unimplemented.
53+
54+The component-local program recovery now covers update, subscriptions, one direct keyed `each`/`turn` mapper and its view, then the existing initializer and ordinary `main` path. Each recovered scheme is closed and freshly allocated; a keyed source screen avoids repeated doomed ordinary attempts without skipping final `main`, and non-gate views decline safely. Canonical `element` recursion and exact singleton-case list fits are narrowly guarded, with successful ordinary fits taking precedence. The byte-identical unchanged todo now passes both detailed and legacy full-module checks with an exact closed `main` type and structural downstream import. Wrong models, messages, results, mappers, keys, aliases, non-gate views and watches fail closed. This is static checking only: no Jibb execution or runtime watching is claimed.
55+
32−The API path analyzer can retain its source, complete prepared prelude, reader results and resolved dependencies as evidence, and classify a unique declaration as watchable, not watchable or unknown. It does not yet prove the provenance of request values or check island subscriptions. Prepared artifacts and reader results remain trusted host inputs.
56+The API path analyzer can retain its source, complete prepared prelude, reader results and resolved dependencies as evidence, and classify a unique declaration as watchable, not watchable or unknown. This remains declaration evidence rather than proof about an arbitrary request value. The narrow direct-program check above composes it with final value syntax, resolved imports and merged evidence for one plain request. Prepared artifacts and reader results remain trusted host inputs.
33
57
34For a unique supported path declaration, the request-parts analysis derives ordered typed path parameters, a full-state reply sample and a fold type for one diff mark. Multiple diffs and unsupported or ambiguous evidence fail closed. By itself it does not create request gates or establish watchability of values.
58For a unique supported path declaration, the request-parts analysis derives ordered typed path parameters, a full-state reply sample and a fold type for one diff mark. Multiple diffs and unsupported or ambiguous evidence fail closed. By itself it does not create request gates or establish watchability of values.
35
59
@@ -41,7 +65,27 @@ The Hoon reader's tagged-union source proof also handles `$~` default wrappers.
41
65
42The repository spec records the subsequent type-system and prelude decisions, including the chosen `like` result-mapping gate; those changes also need synchronization to the Claude document. An initial inference fragment and a standalone Hoon type reader are being tested. The fragment explicitly reports that it does not check a module; partial bridges pass Hoon `*` in supported nonrecursive molds, selected Hoon atoms, term singletons, the null singleton, the two loobean singletons and their exact fork, nested faced or unfaced cells, supported disjoint unions and opaque standard collections from `/sur` molds and marks into inference. Collections retain their names and supported arguments for printing and unification; nested supported union arguments are retained too. The bridge trusts unchanged results from the source-aware reader; a materialized type graph alone cannot reveal cases Hoon already collapsed. The source-validated standard prelude `list` mold shares this representation with imported lists; other Jibb-written collection molds and most prelude collection operations remain unsupported; malformed names and arities fail closed. Selected self-recursive `/sur` molds, including Tlon `notes.import-node` with list-wrapped self references, cross as opaque module-and-name identities; aliases, foreign references, recursive marks, unfolding and construction remain unsupported. The reader handles mark samples, including a source-proved nonrecursive union from a single Ford-imported `/sur` core, recursive molds whose origins can be verified through Ford imports, nested collections, direct ordered maps, including source-validated named operands such as Tlon `notes.log`, certain ordered-map fields, direct `$^` unions whose cases can be proved disjoint, and one verified explicit union argument in a list, set, map or unit. Tagged `$%` cases can additionally use restricted local named payload molds, bare `~` fields and one level of local named tagged unions, as in real Tlon `notes`, with bounded source proof; unsupported or ambiguous dependencies fail closed. Ambiguous recursive origins fail closed; recognizable explicit unions are checked from source before Hoon can collapse their cases, as @iko confirmed for imported `$%`, `$?` and `$^`, while other nested unions, nested ordered maps, general union disjointness and complete import integration remain unfinished. Opt-in structured reader APIs preserve successful graphs and distinguish definite unsupported-aura and core evidence from failures the reader cannot prove; unverified union disjointness and name-only vase recognition remain unsupported. They revalidate and re-walk failed types. An opt-in partial checker entry point consumes unchanged reader results and reports definite aura or core errors at imported mold use sites when their inputs are unique. Ordered replay covers nested cell samples, record and function casts, and non-generic same-module aliases; unsupported prefixes, cycles and shadowing stop it. Union molds, generic applications, transitive modules and unsupported reader outcomes remain generic. Replay repeats inference and may add work. The partial checker resolves a subset of ordinary library imports in dependency order using supplied Jibb sources and a source-derived partial prelude interface, caches completed interfaces per run, detects missing sources and cycles, and resolves nested fields of imported values with independent scheme instantiation. The source-backed internal prelude defines `poke` and the public prelude re-exports it as a transparent type. A dedicated trusted preparation path supplies private comparison and arithmetic schemes to the Jibb-written `gth`, `add` and `dec` wrappers; ordinary imports cannot access them. The public `add` and `dec` wrappers use private arithmetic interfaces; supported inference preserves the shared atom constraint that excludes loobeans. Primitive execution, jet recognition and length remain unfinished. The partial checker resolves its supported source shape and rejects ordinary imports of the private path. An imported API with one mark and a matching direct `+$ poke` declaration can export a constructor and retain agent/mark metadata when the representation has the supported agent case. A separate partial analysis resolves supported API path declarations and their full and diff mark types, including the todo paths; it does not by itself create requests or check an API module. Ordinary imports additionally infer the supported multi-path request-gate types described above. Complete private module checking, other API shapes, request lowering, root API and kind checking, stores, complete `ask` and `pure` checking and runtime effects remain unfinished. A possible store or root API with `+$ poke` reports unsupported kind or scope, while definite duplicates and unrelated shadowing still report conflicts. The prelude includes the doc-exact generic `cmd` union; the prelude inventory is incomplete. The inference fragment supports unrestricted `@`, selected one-way widenings including aura-family ancestors, generalized atom constraints arising from explicit capitals or bare sample binders, acyclic local value definitions with captures, selected single self-recursive top-level and local gates, simple and nonrecursive generic mold aliases, selected faced record casts and field reads, and contextual tags, `~` and constructors for closed disjoint unions, including direct nonrecursive generic unions and propagation through complete loobean and unit-shaped branches in casts and known union-sample calls, including nested branches. Known loobean result context also propagates through supported complete branches and binder-only cell arms; binder-only arms over union subjects remain unsupported. A directly known named union can instantiate an unconstrained generic gate sample with its origin, generic arguments and faces preserved; unnamed, pending, recursive and variable-bound cases remain unsupported. A known gate with an unresolved result variable can receive a known enclosing result type before its arguments are inferred; unknown calls and unresolved targets remain conservative. Multi-argument calls form a right-nested sample, retain known faces and shared type variables, and can use known sample positions to contextualize list and union arguments. A definite mismatch points to the failing argument when the fragment can establish it, otherwise to the combined sample; unsupported contextual forms still fail closed. For a supported recursive gate, the checker infers the sample first and uses its exact type, including field faces, for one monomorphic self reference. It generalizes after the body is checked; subsequent uses instantiate it independently. Incompatible recursive arguments can report the gate and argument sites. For a complete loobean branch with one direct self-call arm, a separately inferred closed base type can seed the recursive result before the whole body is checked. Open or pending base types do not seed it; other branch shapes remain subject to the fragment’s existing limits. A supported single local recursive gate also uses a monomorphic self reference and generalizes variables free of the enclosing environment after checking its body; captured variables remain shared. The checker collects written capitals per `++` before inference, excluding nested definitions: a capital used in an enclosing definition is shared with its locals even when written later, while a capital introduced only in a local definition is generalized there. Sibling locals can introduce independent capitals with the same spelling; generic mold parameters keep their own scope. Top-level groups of syntactic gates are inferred together with monomorphic placeholders and shared substitutions, then generalized only after the whole group checks; downstream uses and library interfaces instantiate those schemes independently. A dependency graph identifies groups with two iterative depth-first passes; its conservative local-reference edges can reject otherwise valid programs. Supported local mutually recursive gate groups also use shared monomorphic placeholders and generalize only after the group checks, preserving captured outer variables. A bounded dependency proof reports certain non-gate cycles through values and gates when an explicit atom or loobean result cast and simple unshadowed expressions establish the cycle. Other mixed gate/value cycles, polymorphic recursion, unresolved literal constraints and unresolved branch joins remain unsupported. Reporting repeats inference for a single recursive gate outside a group; grouped reports use the stored schemes. Its performance cost remains unmeasured. A single-arm cell pattern accepts two or more binders, the last capturing the remaining tail; duplicate and shadowed binders are rejected. A structured single-arm pattern also works for a known non-union cell when coverage is proven, including nested literal and wildcard positions. Intermediate union or collection tails, nested patterns, wildcards and faced records remain unsupported. String interpolation accepts known atom auras, unrestricted `@`, tapes and isolated decimal literals; a known cell asks for a printer, and an explicitly generic atom asks for an aura. Loobeans, term singletons, non-tape collections, open types and a type fixed only later remain unsupported. A known closed union with two or more arms supports patterns that provably cover or exclude each remaining case, including payload binders, imported and generic cases, and binder-free catch-alls. Partial boolean patterns can split known `?` positions into their two noun values, up to 64 alternatives across the union; binders retain their original case type. Missing alternatives and covered arms are reported. Other partial patterns, expansions above the limit, binders spanning distinct cases, differing arm result types and some complex two-arm subjects remain unsupported. A cast or known call sample can supply result context through whole-case arms and supported finite loobean refinements for a known union accessed by a wing, a grouped wing or a supported shallow call, including nested cell and list positions; other partial-pattern contexts and subject forms remain unsupported. The Grammar’s `step` block infers in this fragment, but its module is not yet checked. A bare tag proved absent from a known union reports the union and tag sites in casts, single-argument calls, unit payloads, list items and supported branch arms; imported unnamed unions print their cases. Ordered fit replay can identify a missing tag nested in a syntactic tuple, stopping at an earlier mismatch or uncertainty. Known faced records support uniquely named field changes, including nested wings, with field context passed to replacements and the original record type retained. Missing fields, empty changes and definite mismatches report sites; the expected-type site is the edit because the original field declaration location is not retained. Unknown or partly unfaced spines, ambiguous fields and repeated edits remain unsupported. A known record cast supplies field context to its tuple or record initializer, including nested list and union fields; mismatch diagnostics use the cast mold because the original field declaration location is not retained. Isolated cart-style `init` and `update` expressions infer, while the complete cart-store fails closed because its kind and declaration scope remain unchecked. Uncontextualized list literals infer a fresh element type, including empty and nested lists, with independently generalized uses. Unresolved item tags and uncertain widening remain unsupported. Backtick unit construction uses the validated standard prelude unit template, infers its payload without losing pending constraints, and makes the prelude’s `some` available. Ordinary result annotations also let its `bind`, `biff`, `both`, `clap`, `clef` and `flit` infer. A known unit in a cast, call, list item or record field supplies context to its payload, including nested units and lists; mismatches identify the payload and context. Unrelated union identities, some variable-dependent fits, and missing or altered prelude unit templates remain unsupported. Literal singleton heads compare by runtime noun, so `|=%$` also matches explicit null- and loobean-zero-headed cases. When equal heads have disjoint payloads, the constructor selects a uniquely proven compatible payload; unknown and ambiguous candidates remain unsupported. Unresolved nulls remain pending and are reported separately from tags. A known union of `~` and a null-headed cell supports a complete `~` / `[~ value]` branch in either order, including shadow checks; unknown subjects, missing or duplicate arms, and unresolved branch results remain unsupported. This fragment infers the prelude’s `fall` and `need` signatures. With the validated prelude list and a known cast or gate sample, empty, nonempty and nested list literals infer their element types, including contextual union tags; a mismatched element names both sites. In that context `~` and zero-valued terms fit an empty list, and two-item unfaced cells form cons lists, including nested cons and imported-list contexts; invalid heads or tails name both sites. A known gate sample also supplies context to matching positions in a single tuple or record argument, including nested cells; zero literals can fit list positions. A bound zero constant remains unsupported rather than a definite mismatch, and an unknown callee does not supply context. Faced or longer cells and a missing or altered prelude list fail closed. A known list result also supplies context through complete loobean, unit-shaped and list-shaped branches, including recursive and nested branches. For a known standard list with a supported element type, a complete `~` / `[item rest]` branch infers the element and tail types in either arm order and checks binders for shadowing. Unknown subjects, unsupported element types and other or incomplete list patterns remain unsupported. A value with type variable `A` can fit a field whose type is that same `A`, including in generic union payloads and nested or repeated record fields. Other variable-dependent face merges remain unsupported. Forced equality of distinct written capitals now reports both source sites, following @iko’s decision; forcing one to a concrete type remains unsupported. Imported record spines with repeated faces fail closed where used, but only with a generic unsupported diagnostic. Hoon may erase unfaced nested-cell boundaries, so the check can conservatively reject valid names in distinct erased scopes. Supported closed unions print using an in-scope name or imported alias; an unnamed nongeneric union prints its cases, parenthesized when nested. The latter is print-only. Generic union types retain all arguments in their printed name; if that name is unavailable, the partial printer reports the limitation. Different import faces for the same origin remain compatible; compatibility across distinct union origins and some generic-argument comparisons remain unsupported. Nonrecursive generic aliases can reorder, repeat or omit parameters while retaining a union’s origin, including through local scopes and library interfaces. A generic union declared directly inside a body remains unsupported, as do differing-variable face constraints in a union payload. A transitive generic union whose name is unavailable is reported as unsupported instead of hiding its arguments. Unfixed decimal literals default to `@ud` in gate-free inferred types; recursive molds, general branch tag context, other constraint cases and defaulting inside gate types still need work. Collection recognition checks the originating core and fails closed on shadows or unsupported Ford subject shapes; a wrapper regression also rejects forged subjects, samples and tails. Its golden fixtures include three real Tlon files. A Clay test passes a Ford-built nested union through the reader into partial inference. The partial prelude includes `murn`, `join`, `snip`, `rear` and the agreed shared-type `clap`; supported calls infer, while backend validation remains outstanding, and [prelude-inventory.md](prelude-inventory.md) is a source audit, not the complete inventory or signatures. The milestone remains unfinished.
66The repository spec records the subsequent type-system and prelude decisions, including the chosen `like` result-mapping gate; those changes also need synchronization to the Claude document. An initial inference fragment and a standalone Hoon type reader are being tested. The fragment explicitly reports that it does not check a module; partial bridges pass Hoon `*` in supported nonrecursive molds, selected Hoon atoms, term singletons, the null singleton, the two loobean singletons and their exact fork, nested faced or unfaced cells, supported disjoint unions and opaque standard collections from `/sur` molds and marks into inference. Collections retain their names and supported arguments for printing and unification; nested supported union arguments are retained too. The bridge trusts unchanged results from the source-aware reader; a materialized type graph alone cannot reveal cases Hoon already collapsed. The source-validated standard prelude `list` mold shares this representation with imported lists; other Jibb-written collection molds and most prelude collection operations remain unsupported; malformed names and arities fail closed. Selected self-recursive `/sur` molds, including Tlon `notes.import-node` with list-wrapped self references, cross as opaque module-and-name identities; aliases, foreign references, recursive marks, unfolding and construction remain unsupported. The reader handles mark samples, including a source-proved nonrecursive union from a single Ford-imported `/sur` core, recursive molds whose origins can be verified through Ford imports, nested collections, direct ordered maps, including source-validated named operands such as Tlon `notes.log`, certain ordered-map fields, direct `$^` unions whose cases can be proved disjoint, and one verified explicit union argument in a list, set, map or unit. Tagged `$%` cases can additionally use restricted local named payload molds, bare `~` fields and one level of local named tagged unions, as in real Tlon `notes`, with bounded source proof; unsupported or ambiguous dependencies fail closed. Ambiguous recursive origins fail closed; recognizable explicit unions are checked from source before Hoon can collapse their cases, as @iko confirmed for imported `$%`, `$?` and `$^`, while other nested unions, nested ordered maps, general union disjointness and complete import integration remain unfinished. Opt-in structured reader APIs preserve successful graphs and distinguish definite unsupported-aura and core evidence from failures the reader cannot prove; unverified union disjointness and name-only vase recognition remain unsupported. They revalidate and re-walk failed types. An opt-in partial checker entry point consumes unchanged reader results and reports definite aura or core errors at imported mold use sites when their inputs are unique. Ordered replay covers nested cell samples, record and function casts, and non-generic same-module aliases; unsupported prefixes, cycles and shadowing stop it. Union molds, generic applications, transitive modules and unsupported reader outcomes remain generic. Replay repeats inference and may add work. The partial checker resolves a subset of ordinary library imports in dependency order using supplied Jibb sources and a source-derived partial prelude interface, caches completed interfaces per run, detects missing sources and cycles, and resolves nested fields of imported values with independent scheme instantiation. The source-backed internal prelude defines `poke` and the public prelude re-exports it as a transparent type. A dedicated trusted preparation path supplies private comparison and arithmetic schemes to the Jibb-written `gth`, `add` and `dec` wrappers; ordinary imports cannot access them. The public `add` and `dec` wrappers use private arithmetic interfaces; supported inference preserves the shared atom constraint that excludes loobeans. Primitive execution, jet recognition and length remain unfinished. The partial checker resolves its supported source shape and rejects ordinary imports of the private path. An imported API with one mark and a matching direct `+$ poke` declaration can export a constructor and retain agent/mark metadata when the representation has the supported agent case. A separate partial analysis resolves supported API path declarations and their full and diff mark types, including the todo paths; it does not by itself create requests or check an API module. Ordinary imports additionally infer the supported multi-path request-gate types described above. Complete private module checking, other API shapes, request lowering, root API and kind checking, stores, complete `ask` and `pure` checking and runtime effects remain unfinished. A possible store or root API with `+$ poke` reports unsupported kind or scope, while definite duplicates and unrelated shadowing still report conflicts. The prelude includes the doc-exact generic `cmd` union; the prelude inventory is incomplete. The inference fragment supports unrestricted `@`, selected one-way widenings including aura-family ancestors, generalized atom constraints arising from explicit capitals or bare sample binders, acyclic local value definitions with captures, selected single self-recursive top-level and local gates, simple and nonrecursive generic mold aliases, selected faced record casts and field reads, and contextual tags, `~` and constructors for closed disjoint unions, including direct nonrecursive generic unions and propagation through complete loobean and unit-shaped branches in casts and known union-sample calls, including nested branches. Known loobean result context also propagates through supported complete branches and binder-only cell arms; binder-only arms over union subjects remain unsupported. A directly known named union can instantiate an unconstrained generic gate sample with its origin, generic arguments and faces preserved; unnamed, pending, recursive and variable-bound cases remain unsupported. A known gate with an unresolved result variable can receive a known enclosing result type before its arguments are inferred; unknown calls and unresolved targets remain conservative. Multi-argument calls form a right-nested sample, retain known faces and shared type variables, and can use known sample positions to contextualize list and union arguments. A definite mismatch points to the failing argument when the fragment can establish it, otherwise to the combined sample; unsupported contextual forms still fail closed. For a supported recursive gate, the checker infers the sample first and uses its exact type, including field faces, for one monomorphic self reference. It generalizes after the body is checked; subsequent uses instantiate it independently. Incompatible recursive arguments can report the gate and argument sites. For a complete loobean branch with one direct self-call arm, a separately inferred closed base type can seed the recursive result before the whole body is checked. Open or pending base types do not seed it; other branch shapes remain subject to the fragment’s existing limits. A supported single local recursive gate also uses a monomorphic self reference and generalizes variables free of the enclosing environment after checking its body; captured variables remain shared. The checker collects written capitals per `++` before inference, excluding nested definitions: a capital used in an enclosing definition is shared with its locals even when written later, while a capital introduced only in a local definition is generalized there. Sibling locals can introduce independent capitals with the same spelling; generic mold parameters keep their own scope. Top-level groups of syntactic gates are inferred together with monomorphic placeholders and shared substitutions, then generalized only after the whole group checks; downstream uses and library interfaces instantiate those schemes independently. A dependency graph identifies groups with two iterative depth-first passes; its conservative local-reference edges can reject otherwise valid programs. Supported local mutually recursive gate groups also use shared monomorphic placeholders and generalize only after the group checks, preserving captured outer variables. A bounded dependency proof reports certain non-gate cycles through values and gates when an explicit atom or loobean result cast and simple unshadowed expressions establish the cycle. Other mixed gate/value cycles, polymorphic recursion, unresolved literal constraints and unresolved branch joins remain unsupported. Reporting repeats inference for a single recursive gate outside a group; grouped reports use the stored schemes. Its performance cost remains unmeasured. A single-arm cell pattern accepts two or more binders, the last capturing the remaining tail; duplicate and shadowed binders are rejected. A structured single-arm pattern also works for a known non-union cell when coverage is proven, including nested literal and wildcard positions. Intermediate union or collection tails, nested patterns, wildcards and faced records remain unsupported. String interpolation accepts known atom auras, unrestricted `@`, tapes and isolated decimal literals; a known cell asks for a printer, and an explicitly generic atom asks for an aura. Loobeans, term singletons, non-tape collections, open types and a type fixed only later remain unsupported. A known closed union with two or more arms supports patterns that provably cover or exclude each remaining case, including payload binders, imported and generic cases, and binder-free catch-alls. Partial boolean patterns can split known `?` positions into their two noun values, up to 64 alternatives across the union; binders retain their original case type. Missing alternatives and covered arms are reported. Other partial patterns, expansions above the limit, binders spanning distinct cases, differing arm result types and some complex two-arm subjects remain unsupported. A cast or known call sample can supply result context through whole-case arms and supported finite loobean refinements for a known union accessed by a wing, a grouped wing or a supported shallow call, including nested cell and list positions; other partial-pattern contexts and subject forms remain unsupported. The Grammar’s `step` block infers in this fragment, but its module is not yet checked. A bare tag proved absent from a known union reports the union and tag sites in casts, single-argument calls, unit payloads, list items and supported branch arms; imported unnamed unions print their cases. Ordered fit replay can identify a missing tag nested in a syntactic tuple, stopping at an earlier mismatch or uncertainty. Known faced records support uniquely named field changes, including nested wings, with field context passed to replacements and the original record type retained. Missing fields, empty changes and definite mismatches report sites; the expected-type site is the edit because the original field declaration location is not retained. Unknown or partly unfaced spines, ambiguous fields and repeated edits remain unsupported. A known record cast supplies field context to its tuple or record initializer, including nested list and union fields; mismatch diagnostics use the cast mold because the original field declaration location is not retained. Isolated cart-style `init` and `update` expressions infer, while the complete cart-store fails closed because its kind and declaration scope remain unchecked. Uncontextualized list literals infer a fresh element type, including empty and nested lists, with independently generalized uses. Unresolved item tags and uncertain widening remain unsupported. Backtick unit construction uses the validated standard prelude unit template, infers its payload without losing pending constraints, and makes the prelude’s `some` available. Ordinary result annotations also let its `bind`, `biff`, `both`, `clap`, `clef` and `flit` infer. A known unit in a cast, call, list item or record field supplies context to its payload, including nested units and lists; mismatches identify the payload and context. Unrelated union identities, some variable-dependent fits, and missing or altered prelude unit templates remain unsupported. Literal singleton heads compare by runtime noun, so `|=%$` also matches explicit null- and loobean-zero-headed cases. When equal heads have disjoint payloads, the constructor selects a uniquely proven compatible payload; unknown and ambiguous candidates remain unsupported. Unresolved nulls remain pending and are reported separately from tags. A known union of `~` and a null-headed cell supports a complete `~` / `[~ value]` branch in either order, including shadow checks; unknown subjects, missing or duplicate arms, and unresolved branch results remain unsupported. This fragment infers the prelude’s `fall` and `need` signatures. With the validated prelude list and a known cast or gate sample, empty, nonempty and nested list literals infer their element types, including contextual union tags; a mismatched element names both sites. In that context `~` and zero-valued terms fit an empty list, and two-item unfaced cells form cons lists, including nested cons and imported-list contexts; invalid heads or tails name both sites. A known gate sample also supplies context to matching positions in a single tuple or record argument, including nested cells; zero literals can fit list positions. A bound zero constant remains unsupported rather than a definite mismatch, and an unknown callee does not supply context. Faced or longer cells and a missing or altered prelude list fail closed. A known list result also supplies context through complete loobean, unit-shaped and list-shaped branches, including recursive and nested branches. For a known standard list with a supported element type, a complete `~` / `[item rest]` branch infers the element and tail types in either arm order and checks binders for shadowing. Unknown subjects, unsupported element types and other or incomplete list patterns remain unsupported. A value with type variable `A` can fit a field whose type is that same `A`, including in generic union payloads and nested or repeated record fields. Other variable-dependent face merges remain unsupported. Forced equality of distinct written capitals now reports both source sites, following @iko’s decision; forcing one to a concrete type remains unsupported. Imported record spines with repeated faces fail closed where used, but only with a generic unsupported diagnostic. Hoon may erase unfaced nested-cell boundaries, so the check can conservatively reject valid names in distinct erased scopes. Supported closed unions print using an in-scope name or imported alias; an unnamed nongeneric union prints its cases, parenthesized when nested. The latter is print-only. Generic union types retain all arguments in their printed name; if that name is unavailable, the partial printer reports the limitation. Different import faces for the same origin remain compatible; compatibility across distinct union origins and some generic-argument comparisons remain unsupported. Nonrecursive generic aliases can reorder, repeat or omit parameters while retaining a union’s origin, including through local scopes and library interfaces. A generic union declared directly inside a body remains unsupported, as do differing-variable face constraints in a union payload. A transitive generic union whose name is unavailable is reported as unsupported instead of hiding its arguments. Unfixed decimal literals default to `@ud` in gate-free inferred types; recursive molds, general branch tag context, other constraint cases and defaulting inside gate types still need work. Collection recognition checks the originating core and fails closed on shadows or unsupported Ford subject shapes; a wrapper regression also rejects forged subjects, samples and tails. Its golden fixtures include three real Tlon files. A Clay test passes a Ford-built nested union through the reader into partial inference. The partial prelude includes `murn`, `join`, `snip`, `rear` and the agreed shared-type `clap`; supported calls infer, while backend validation remains outstanding, and [prelude-inventory.md](prelude-inventory.md) is a source audit, not the complete inventory or signatures. The milestone remains unfinished.
43
67
44−The 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`, `bond`, `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. The same validated template is available when prelude mold aliases are prepared, so supported direct and transitive aliases can use it. 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. The source-only `+prepare-prelude` rejects empty, malformed, conflicting or import-bearing source; `+prepare-prelude-with-internal` also accepts the supported private internal import. Prepared values are trusted and must come unchanged from the matching preparation arm. When canonical public list or unit templates are missing or altered, independently inferred private molds remain available, while molds that depend on those templates do not. 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.
68+The 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`, `bond`, `lure`, `weld`, `snoc`, `turn` and `lent`. 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. The same validated template is available when prelude mold aliases are prepared, so supported direct and transitive aliases can use it. 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. The source-only `+prepare-prelude` rejects empty, malformed, conflicting or import-bearing source; `+prepare-prelude-with-internal` also accepts the supported private internal import. Prepared values are trusted and must come unchanged from the matching preparation arm. When canonical public list or unit templates are missing or altered, independently inferred private molds remain available, while molds that depend on those templates do not. 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.
69+
70+The prelude has a Jibb-written `succ` gate that increments through `add`; partial inference retains its arithmetic atom constraint. A Hoon translation agrees with Hoon on ten selected inputs. Jibb execution and jet recognition remain unverified.
71+
72+The prelude has Jibb-written curried `lead` and `late` pair constructors, inferred with independent argument types including gate values. Their focused golden passes under eval and on the ship, and a Hoon-reference comparison covers operand order. Jibb backend execution remains unverified.
73+
74+The prelude also has a Jibb-written `zing` that concatenates homogeneous lists via `weld`. Its focused golden infers empty, nested text, ship, generic and gate-element lists and reports a non-list error; the same golden passes on the ship. A Hoon translation agrees with Hoon `zing` on selected finite inputs, not on Jibb execution. Hoon’s raw helper additionally accepts heterogeneous noun lists, which the Jibb signature does not express. Backend lowering and jet recognition remain unverified.
75+
76+The experimental deferred constructor transaction conservatively declines general structural tuple fits, most branches, field reads, nonidentical successful call/cast fits, and multi-argument calls with open argument, sample or result types. This prevents a later substitution from invalidating an earlier face-propagation check; cases requiring deferred structural fits remain unsupported. It can retry source definitions after later dependencies become available, and a two-arm boolean branch can retain separately owned literal-result obligations until a later closed context resolves them. Faced targets or union cases, list literals and general union-pattern branches remain unsupported.
77+
78+The checked inference slice now represents `!!`, proves empty cell positions and filters proven-empty union cases. List and unit payload arms whose elements are empty are rejected as unreachable; fixed opaque cases fail closed when reachability is unknown. The new shared guard covers checked interfaces, partial diagnostics and proof budgets. Its shared guard runs under eval and on the ship.
79+
80+An eval and ship fixture now reports partial inference for the unchanged todo island with its real API and Hoon readers. It verifies that the source fixtures match `my-app` and exercises missing or duplicate imports; the report does not claim the module or island has been checked. The prelude also has a Jibb-written recursive `lent` whose supported generic calls infer `@ud`. Execution and shape-based jet recognition remain future backend work. Nested union tests check equal runtime nouns, different nested tags, empty fields and unknown inhabitation.
81+
82+The prelude now writes `lth`, `gte` and `lte` in Jibb using `gth` and `not`. Supported generic and concrete calls infer, including loobeans; mismatched explicit auras fail. Execution, jet recognition and complete import checking remain unfinished.
83+
84+The prelude also writes `trip` and `tuba` over private primitives, with inferred cord, tape and UTF-32 list types matching the target ship's Hoon 135 definitions. Their composition with `lent` and invalid argument controls pass under eval and on the ship; primitive lowering, execution and jet recognition remain unfinished. In the unchanged todo report, `update` now reaches its remaining branch-context limitation instead of failing on missing text names.
85+
86+The Hoon reader can prove overlaps among supported original `$?` source cases, including nested cells and unions with more than two cases, and report them at a Jibb use site. It evaluates each case independently and compares runtime noun values. Other overlaps, Hoon case locations and mark-reader overlap diagnostics remain unfinished. The source screen allows at most 128 cases and 4,096 source noun nodes; dependency checking and pairwise witness analysis each have a separate 4,096-node budget. These budgets do not bound chapter lookup, Hoon evaluation or graph walks.
87+
88+Restricted-number promotion now skips an environment scan when a definition has no written capitals. In a single startup-inclusive pair on 2,000 independent gates, output was identical and user CPU fell from 71.67 to 38.26 seconds; wall time was 72.80 versus 51.66 seconds with other checks running. This is a partial-inference measurement, not a complete checker or a bound on dependent modules.
45
89
46## Milestone 1: parser and mark
90## Milestone 1: parser and mark
47
91
@@ -59,8 +103,8 @@ What the plan asks for, and where it is:
59
103
60Besides the plan's list:
104Besides the plan's list:
61
105
62−- 649 golden cases: 429 that parse and 220 that fail, each failure at a stated line and column. One failing case has an unclear expectation (corpus question 3). The newer type-output cases exercise only the partial inference fragment. Each case's `about.txt` quotes the doc's words it tests.
106+- 660 golden cases: 440 that parse and 220 that fail, each failure at a stated line and column. One failing case has an unclear expectation (corpus question 3). The newer type-output cases exercise only the partial inference fragment. Each case's `about.txt` quotes the doc's words it tests.
63−- The 649-case corpus passed under `urbit eval` in 96.0 s while other checks were running. The fake ship passed all 676 tests, including the importer, importer/checker and mark/checker bridges, module scope, unification, hole, qath, ask, default-wrapper importer, projection, arithmetic, generic-alias, positional-face, API-evidence, request, closed-gate, todo API, constructor, sub and nested-union guards, with 71.8 s for sync and 85.7 s for tests. The importer golden compares 221 projections; `tools/clay-fixtures` builds the example Hoon fixtures through Clay, checks a recursive Ford import's origin, and passes Clay-built types through the Clay-built importer and partial checker.
107+- The 660-case corpus passed under `urbit eval` in 96.8 s while other checks were running. The fake ship passed all 714 tests, including the source-overlap, structural-overlap, generic-union source and alias-overlap, full-module overlap, deferred-context, generic-recursion, generic-construction, generic-pattern, deferred-inference, empty-mold and cell-branch fixtures, importer, importer/checker and mark/checker bridges, module scope, unification, hole, qath, ask, default-wrapper importer, projection, arithmetic, generic-alias, positional-face, API-evidence, request, closed-gate, todo API, constructor, sub, nested-union, gate-free and direct-gate guards and the unchanged todo report. Desk sync took 105.5 s while other checks were running. The importer golden compares 221 projections; `tools/clay-fixtures` builds the example Hoon fixtures through Clay, checks a recursive Ford import's origin, and passes Clay-built types through the Clay-built importer and partial checker.
64- `tools/testdata/selftest` (22 checks), `tools/testdata/ship-selftest` and `tools/testdata/clay-fixtures-selftest` test the tools themselves; the last checks temporary Clay fixture cleanup and signal handling without a ship.
108- `tools/testdata/selftest` (22 checks), `tools/testdata/ship-selftest` and `tools/testdata/clay-fixtures-selftest` test the tools themselves; the last checks temporary Clay fixture cleanup and signal handling without a ship.
65- 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.
109- 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.
66- 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).
110- 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).
@@ -155,17 +199,49 @@ Besides the plan's list:
155| dde791c | 2026-10-31 | Infer a source-backed request-gate type through ordinary imports |
199| dde791c | 2026-10-31 | Infer a source-backed request-gate type through ordinary imports |
156| a1c5f35 | 2026-10-31 | Infer supported multi-path requests and named closed folds |
200| a1c5f35 | 2026-10-31 | Infer supported multi-path requests and named closed folds |
157| 911ca0c | 2026-10-31 | Propagate union context, define subscriptions and match literal nouns |
201| 911ca0c | 2026-10-31 | Propagate union context, define subscriptions and match literal nouns |
158−| This change | 2026-10-31 | Infer selected nested union payloads from context |
202+| 72acdb3 | 2026-10-31 | Infer selected nested union payloads from context |
203+| 706035c | 2026-10-31 | Analyze gate-free source molds with field witnesses |
204+| 651b8ec | 2026-10-31 | Match source-proven gate samples in direct calls |
205+| cc8e389 | 2026-10-31 | Add source-backed list length and real todo regression |
206+| 4da6891 | 2026-10-31 | Add source-backed comparisons and nested Hoon union controls |
207+| 09db390 | 2026-10-31 | Skip unnecessary inference environment scans |
208+| 179d717 | 2026-10-31 | Diagnose source-proven Hoon union overlaps |
209+| 142f2e2 | 2026-10-31 | Prove structural overlaps across Hoon union cases |
210+| c96597d | 2026-10-31 | Track source-proven generic recursive identities |
211+| 190a9d5 | 2026-10-31 | Add source-backed list flattening |
212+| d9d51e6 | 2026-10-31 | Check source-proven recursive tree construction |
213+| 30b0a9e | 2026-10-31 | Match source-proven recursive tree cases |
214+| 72d85ab | 2026-10-31 | Add bounded deferred inference and expand runtime equality coverage |
215+| 22f3788 | 2026-10-31 | Check empty molds and propagate closed cell context into branches |
216+| 341bcb4 | 2026-10-31 | Keep deferred fits stable under later substitutions |
217+| b93a94b | 2026-10-31 | Prove local generic-alias union tags and add successor |
218+| 2826c93 | 2026-10-31 | Report generic-alias overlaps and retain deferred branch contexts |
219+| b5cdc80 | 2026-10-31 | Preserve full-module overlap source evidence |
220+| ab6fdc1 | 2026-10-31 | Add source-backed text conversion wrappers |
221+| aa277c9 | 2026-10-31 | Recover prepared tuple initializers in partial reports |
222+| b4703e7 | 2026-11-01 | Check narrow closed subscription-free program mains |
223+| 26bf7a7 | 2026-11-01 | Recover narrow direct-program initializer contexts |
224+| 642d2c0 | 2026-11-01 | Prove direct request-value watchability for program subscriptions |
225+| 2e4d582 | 2026-11-01 | Add the source-backed UI, program and page prelude slice |
226+| a163965 | 2026-11-01 | Recover direct-program update result contexts |
227+| 46748b0 | 2026-11-01 | Check the unchanged todo island through component recovery |
228+| 1e17d5f | 2026-11-01 | Check static and direct data-page mains |
229+| This change | 2026-11-01 | Add the theme mold and require explicit unit syntax |
159
230
160## Checking it
231## Checking it
161
232
162On a machine set up as [development.md](development.md) says:
233On a machine set up as [development.md](development.md) says:
163
234
164```
235```
165−tools/golden # 649 cases under urbit eval
236+tools/golden # 660 cases under urbit eval
166tools/importer-test # the Hoon importer fixture projection
237tools/importer-test # the Hoon importer fixture projection
167tools/type-import-default-test # default-wrapped source proof golden
238tools/type-import-default-test # default-wrapped source proof golden
168tools/type-import-test # the importer/checker bridge fixture
239tools/type-import-test # the importer/checker bridge fixture
240+tools/type-import-overlap-test # source-aware Hoon overlap and provenance fixture
241+tools/type-import-structural-test # structural overlap and multi-case source fixture
242+tools/type-union-source-test # local generic-alias union guards
243+tools/type-union-alias-overlap-test # local generic-alias overlap diagnostics
244+tools/type-full-overlap-test # full-module overlap evidence
169tools/type-tlon-test # the real Tlon reader/checker fixture
245tools/type-tlon-test # the real Tlon reader/checker fixture
170tools/type-mark-test # the mark/checker bridge fixture
246tools/type-mark-test # the mark/checker bridge fixture
171tools/type-poke-test # the source-backed poke/API fixture
247tools/type-poke-test # the source-backed poke/API fixture
@@ -174,17 +250,32 @@ tools/type-api-paths-test # partial API path metadata fixture
174tools/type-hole-guards-test # hole defaulting and API interface guards
250tools/type-hole-guards-test # hole defaulting and API interface guards
175tools/type-list-alias-test # prelude list-alias guards
251tools/type-list-alias-test # prelude list-alias guards
176tools/type-generic-alias-test # generic union alias guards
252tools/type-generic-alias-test # generic union alias guards
253+tools/type-generic-recursion-test # source-proven generic recursion guards
254+tools/type-generic-construction-test # source-proven recursive construction guards
255+tools/type-generic-pattern-test # source-proven recursive pattern guards
256+tools/type-deferred-test # source-owned deferred inference guards
257+tools/type-deferred-resolver-test # resolver consistency and failure guards
258+tools/type-deferred-context-test # deferred source-order and branch guards
259+tools/type-deferred-prepared-test # prepared initializer reports and failure guards
260+tools/type-empty-test # empty molds and coverage guards
261+tools/type-cell-branch-test # branch context and rollback guards
177tools/type-positional-face-guards-test # positional sample face guards
262tools/type-positional-face-guards-test # positional sample face guards
178tools/type-qath-guards-test # qath source and unfolding guards
263tools/type-qath-guards-test # qath source and unfolding guards
179tools/type-ask-guards-test # ask source and bootstrap guards
264tools/type-ask-guards-test # ask source and bootstrap guards
180tools/type-proj-guards-test # projection evidence and scope guards
265tools/type-proj-guards-test # projection evidence and scope guards
266+tools/type-theme-test # byte-identical real theme, exact type and rejection guards
181tools/type-module-scope-test # module and prelude scope fixture
267tools/type-module-scope-test # module and prelude scope fixture
268+tools/type-program-main-test # closed program-main interface and rejection guards
269+tools/type-program-init-test # transactional direct-program initializer context guards
270+tools/type-program-update-test # transactional direct-program update context guards
271+tools/type-program-watch-test # direct request-value watchability guards
272+tools/type-todo-full-test # byte-identical full todo and rejection guards
182tools/hoon check-spans-test # prints <<>> when the span checker works
273tools/hoon check-spans-test # prints <<>> when the span checker works
183tools/testdata/selftest # the tools themselves
274tools/testdata/selftest # the tools themselves
184tools/doc-blocks docs/spec # the doc's examples are golden cases
275tools/doc-blocks docs/spec # the doc's examples are golden cases
185tools/ship start
276tools/ship start
186tools/ship gen-tests --check # tests/lib/jibb.hoon is up to date
277tools/ship gen-tests --check # tests/lib/jibb.hoon is up to date
187−tools/ship test # the same 649 cases as -test arms on the ship
278+tools/ship test # the same 660 cases as -test arms on the ship
188tools/testdata/ship-selftest
279tools/testdata/ship-selftest
189tools/testdata/clay-fixtures-selftest # scratch fixture cleanup without a ship
280tools/testdata/clay-fixtures-selftest # scratch fixture cleanup without a ship
190tools/ship check-commit # |commit stores .jibb files
281tools/ship check-commit # |commit stores .jibb files
jibb-dev/lib/jibb-import.hoon+181−6
@@ -47,7 +47,7 @@
47 ==
47 ==
48+$ import-diagnostic
48+$ import-diagnostic
49 $% [%ok value=imported]
49 $% [%ok value=imported]
50− [%invalid code=?(%aura %core) message=@t]
50+ [%invalid code=?(%aura %core %overlap) message=@t]
51 [%unsupported message=@t]
51 [%unsupported message=@t]
52 ==
52 ==
53+$ signatures (list [name=term code=hoon])
53+$ signatures (list [name=term code=hoon])
@@ -132,6 +132,35 @@
132 =/ rest $(cases t.cases, tags [u.tag tags])
132 =/ rest $(cases t.cases, tags [u.tag tags])
133 ?~ rest ~
133 ?~ rest ~
134 `[[u.tag i.cases] u.rest]
134 `[[u.tag i.cases] u.rest]
135+
136+::
137+:: Bound the new $? branch screen independently of the existing $% path.
138+:: Count raw noun nodes across all cases, and cap pairwise tag comparisons.
139+++ bounded-no-spec-unions
140+ |= [h=* fuel=@ud]
141+ ^- (unit @ud)
142+ ?: =(fuel 0) ~
143+ =. fuel (dec fuel)
144+ ?@ h `fuel
145+ ?: ?=([%bckt ^ ^] h) ~
146+ ?: ?=([%bcwt [^ [^ *]]] h) ~
147+ ?: ?=([%bccn [^ [^ *]]] h) ~
148+ =/ left=(unit @ud) $(h -.h)
149+ ?~ left ~
150+ $(h +.h, fuel u.left)
151+++ tagged-bounded-cases
152+ |= [cases=(list spec) tags=(list @) fuel=@ud left=@ud]
153+ ^- (unit (list tagged-case))
154+ ?~ cases `~
155+ ?: =(left 0) ~
156+ =/ remaining=(unit @ud) (bounded-no-spec-unions i.cases fuel)
157+ ?~ remaining ~
158+ =/ tag=(unit @) (tagged-head i.cases)
159+ ?~ tag ~
160+ ?: (lien tags |=(x=@ =(x u.tag))) ~
161+ =/ rest $(cases t.cases, tags [u.tag tags], fuel u.remaining, left (dec left))
162+ ?~ rest ~
163+ `[[u.tag i.cases] u.rest]
135::
164::
136:: Benign source annotations have different typed representations on
165:: Benign source annotations have different typed representations on
137:: Clay and under eval. Inspect the wrapper as a noun, and validate the
166:: Clay and under eval. Inspect the wrapper as a noun, and validate the
@@ -170,11 +199,19 @@
170 ?~ found ~
199 ?~ found ~
171 =/ body=(unit spec) (tagged-default-union u.found 4)
200 =/ body=(unit spec) (tagged-default-union u.found 4)
172 ?~ body ~
201 ?~ body ~
202+ ?- u.body
173− ?. ?=([%bccn *] u.body) ~
203+ [%bccn *]
204+ =/ cases=(list spec) p.u.body
205+ ?~ cases ~
206+ ?~ t.cases ~
207+ (tagged-cases cases ~)
208+ [%bcwt *]
174− =/ cases=(list spec) p.u.body
209+ =/ cases=(list spec) p.u.body
175− ?~ cases ~
210+ ?~ cases ~
176− ?~ t.cases ~
211+ ?~ t.cases ~
177− (tagged-cases cases ~)
212+ (tagged-bounded-cases cases ~ 4.096 128)
213+ * ~
214+ ==
178::
215::
179:: Source proof for dependencies of an explicitly tagged union. Only
216:: Source proof for dependencies of an explicitly tagged union. Only
180:: simple local molds, standard collections and distinct term enums are
217:: simple local molds, standard collections and distinct term enums are
@@ -346,6 +383,140 @@
346 ?. ?=([%cell [%atom %tas [~ @]] *] i.ys) ~
383 ?. ?=([%cell [%atom %tas [~ @]] *] i.ys) ~
347 ?. =(tag.i.xs u.value.head.i.ys) ~
384 ?. =(tag.i.xs u.value.head.i.ys) ~
348 $(xs t.xs, ys t.ys)
385 $(xs t.xs, ys t.ys)
386+
387+::
388+:: Unlike the disjoint-reader fallback, source overlap may have repeated
389+:: tags. Bound both raw case traversal and the number of pair attempts.
390+++ overlap-source-cases
391+ |= [cases=(list spec) fuel=@ud left=@ud]
392+ ^- (unit (list tagged-case))
393+ ?~ cases `~
394+ ?: =(left 0) ~
395+ =/ remaining=(unit @ud) (bounded-no-spec-unions i.cases fuel)
396+ ?~ remaining ~
397+ =/ tag=(unit @) (tagged-head i.cases)
398+ ?~ tag ~
399+ =/ rest $(cases t.cases, fuel u.remaining, left (dec left))
400+ ?~ rest ~
401+ `[[u.tag i.cases] u.rest]
402+++ overlap-repeated-tag
403+ |= cases=(list tagged-case)
404+ ^- ?
405+ ?~ cases |
406+ ?: (lien t.cases |=(c=tagged-case =(tag.c tag.i.cases))) &
407+ $(cases t.cases)
408+++ overlap-projections-match
409+ |= [xs=(list tagged-case) ys=(list imported)]
410+ ^- ?
411+ ?~ xs ?=(~ ys)
412+ ?~ ys |
413+ ?. ?=([%cell [%atom %tas [~ @]] *] i.ys) |
414+ ?. =(tag.i.xs u.value.head.i.ys) |
415+ $(xs t.xs, ys t.ys)
416+++ overlap-source-witness
417+ |= [module=term name=term cor=type]
418+ ^- ?
419+ ?. ?=([%core *] cor) |
420+ =/ selected=(unit hoon) (local-arm-source cor name)
421+ ?~ selected |
422+ =/ shape=(unit spec) (local-mold-spec u.selected name)
423+ ?~ shape |
424+ =/ body=(unit spec) (tagged-default-union u.shape 4)
425+ ?~ body |
426+ ?. ?=([%bcwt *] u.body) |
427+ =/ cases=(unit (list tagged-case)) (overlap-source-cases p.u.body 4.096 128)
428+ ?~ cases |
429+ ?. (overlap-repeated-tag u.cases) |
430+ ?. ?=(^ (safe-source-tagged-fuel-mode u.cases cor ~[name] 4.096 |)) |
431+ =/ tried=(each (list type) tang)
432+ (mule |.((turn u.cases |=(c=tagged-case (~(play ut cor) [%kttr branch.c])))))
433+ ?. ?=([%& *] tried) |
434+ =/ projected=(each (list imported) tang)
435+ (mule |.((turn p.tried |=(t=type (walk module t catalog ~ `cor)))))
436+ ?. ?=([%& *] projected) |
437+ ?^ (first-bads p.projected) |
438+ ?. (overlap-projections-match u.cases p.projected) |
439+ =/ witness=(unit overlap-proof-result) (overlap-case-pairs p.projected 4.096)
440+ ?~ witness |
441+ found.u.witness
442+::
443+:: Positive overlap evidence only: false means no proof, not disjointness.
444+:: Fuel is shared across all examined nodes and sibling alternatives.
445++$ overlap-proof-result [found=? left=@ud]
446+++ overlap-known-atom
447+ |= aura=term
448+ ^- ?
449+ (lien `(list term)`~[%t %tas %ud %f] |=(n=term =(n aura)))
450+++ overlap-inhabited-list
451+ |= [xs=(list imported) fuel=@ud]
452+ ^- (unit overlap-proof-result)
453+ ?~ xs `[| fuel]
454+ ?: =(0 fuel) ~
455+ =/ one=(unit overlap-proof-result) (overlap-inhabited i.xs (dec fuel))
456+ ?~ one ~
457+ ?: found.u.one one
458+ $(xs t.xs, fuel left.u.one)
459+++ overlap-inhabited
460+ |= [x=imported fuel=@ud]
461+ ^- (unit overlap-proof-result)
462+ ?: =(0 fuel) ~
463+ =. fuel (dec fuel)
464+ ?- x
465+ [%noun *] `[& fuel]
466+ [%void *] `[| fuel]
467+ [%atom *] `[|(?=(^ value.x) (overlap-known-atom aura.x)) fuel]
468+ [%face *] $(x body.x)
469+ [%named *] $(x body.x)
470+ [%fork *] (overlap-inhabited-list cases.x fuel)
471+ [%cell *]
472+ =/ a=(unit overlap-proof-result) $(x head.x)
473+ ?~ a ~
474+ ?. found.u.a a
475+ $(x tail.x, fuel left.u.a)
476+ * `[| fuel]
477+ ==
478+++ overlap-pair-list
479+ |= [xs=(list imported) y=imported fuel=@ud]
480+ ^- (unit overlap-proof-result)
481+ ?~ xs `[| fuel]
482+ ?: =(0 fuel) ~
483+ =/ p=(unit overlap-proof-result) (overlap-pair i.xs y (dec fuel))
484+ ?~ p ~
485+ ?: found.u.p p
486+ $(xs t.xs, fuel left.u.p)
487+++ overlap-pair
488+ |= [a=imported b=imported fuel=@ud]
489+ ^- (unit overlap-proof-result)
490+ ?: =(0 fuel) ~
491+ =. fuel (dec fuel)
492+ ?: ?=([%face *] a) $(a body.a)
493+ ?: ?=([%face *] b) $(b body.b)
494+ ?: ?=([%named *] a) $(a body.a)
495+ ?: ?=([%named *] b) $(b body.b)
496+ ?: ?=([%fork *] a) (overlap-pair-list cases.a b fuel)
497+ ?: ?=([%fork *] b) (overlap-pair-list cases.b a fuel)
498+ ?: ?=([%noun *] a) (overlap-inhabited b fuel)
499+ ?: ?=([%noun *] b) (overlap-inhabited a fuel)
500+ ?: &(?=([%cell *] a) ?=([%cell *] b))
501+ =/ p=(unit overlap-proof-result) $(a head.a, b head.b)
502+ ?~ p ~
503+ ?. found.u.p p
504+ $(a tail.a, b tail.b, fuel left.u.p)
505+ ?. &(?=([%atom *] a) ?=([%atom *] b)) `[| fuel]
506+ ?^ value.a
507+ ?^ value.b `[=(u.value.a u.value.b) fuel]
508+ `[&(=(u.value.a 0) (overlap-known-atom aura.b)) fuel]
509+ ?^ value.b `[&(=(u.value.b 0) (overlap-known-atom aura.a)) fuel]
510+ `[&((overlap-known-atom aura.a) (overlap-known-atom aura.b)) fuel]
511+++ overlap-case-pairs
512+ |= [xs=(list imported) fuel=@ud]
513+ ^- (unit overlap-proof-result)
514+ ?~ xs `[| fuel]
515+ ?: =(0 fuel) ~
516+ =/ p=(unit overlap-proof-result) (overlap-pair-list t.xs i.xs (dec fuel))
517+ ?~ p ~
518+ ?: found.u.p p
519+ $(xs t.xs, fuel left.u.p)
349::
520::
350:: +read-mold-in: accept the /sur core as provenance. The core must be
521:: +read-mold-in: accept the /sur core as provenance. The core must be
351:: built against zuse or validated Ford imports, and its selected arm
522:: built against zuse or validated Ford imports, and its selected arm
@@ -361,6 +532,8 @@
361 [%| (crip "Hoon mold `{(trip name)}` is not declared")]
532 [%| (crip "Hoon mold `{(trip name)}` is not declared")]
362 ?. =(typ (~(play ut cor) (ream (cat 3 '*' name))))
533 ?. =(typ (~(play ut cor) (ream (cat 3 '*' name))))
363 [%| 'Hoon module provenance does not match the selected mold']
534 [%| 'Hoon module provenance does not match the selected mold']
535+ =/ overlap=(each ? tang) (mule |.((overlap-source-witness module name cor)))
536+ ?: &(?=(%& -.overlap) p.overlap) [%| 'Hoon union cases overlap']
364 =/ result (read-with module name typ [~ cor])
537 =/ result (read-with module name typ [~ cor])
365 ?: ?=([%& *] result) result
538 ?: ?=([%& *] result) result
366 =/ fallback=(each (unit (each imported @t)) tang)
539 =/ fallback=(each (unit (each imported @t)) tang)
@@ -461,6 +634,8 @@
461 [%unsupported p.result]
634 [%unsupported p.result]
462 =/ selected=(each type tang) (mule |.((~(play ut cor) (ream (cat 3 '*' name)))))
635 =/ selected=(each type tang) (mule |.((~(play ut cor) (ream (cat 3 '*' name)))))
463 ?. ?=(%& -.selected) [%unsupported p.result]
636 ?. ?=(%& -.selected) [%unsupported p.result]
637+ =/ overlap=(each ? tang) (mule |.((overlap-source-witness module name cor)))
638+ ?: &(?=(%& -.overlap) p.overlap) [%invalid %overlap 'Hoon union cases overlap']
464 =/ again=(each imported tang) (mule |.((walk module p.selected catalog ~ [~ cor])))
639 =/ again=(each imported tang) (mule |.((walk module p.selected catalog ~ [~ cor])))
465 ?. ?=(%& -.again) [%unsupported p.result]
640 ?. ?=(%& -.again) [%unsupported p.result]
466 =/ evidence=(unit import-diagnostic) (first-invalid p.again)
641 =/ evidence=(unit import-diagnostic) (first-invalid p.again)
jibb-dev/lib/jibb.hoon+3284−88
@@ -4607,6 +4607,8 @@
4607:: Atom constraints tied to an explicit capital or an inferred sample
4607:: Atom constraints tied to an explicit capital or an inferred sample
4608:: are generalized and printed. Other aura variables remain unsupported until
4608:: are generalized and printed. Other aura variables remain unsupported until
4609:: their defaulting and inferred generalization are implemented.
4609:: their defaulting and inferred generalization are implemented.
4610+:: Restricted-number promotion considers written capitals only; if there
4611+:: are none, it skips the otherwise unnecessary environment traversal.
4610:: Bare @ is a separate unrestricted atom type. A directional fit check
4612:: Bare @ is a separate unrestricted atom type. A directional fit check
4611:: permits concrete atoms to widen to it, never the reverse. A fit that
4613:: permits concrete atoms to widen to it, never the reverse. A fit that
4612:: needs a not-yet-implemented constraint remains unsupported. Named unions
4614:: needs a not-yet-implemented constraint remains unsupported. Named unions
@@ -4665,11 +4667,13 @@
4665 [%any-atom ~]
4667 [%any-atom ~]
4666 [%flag ~]
4668 [%flag ~]
4667 [%noun ~]
4669 [%noun ~]
4670+ [%empty ~]
4668 [%tag id=@ud literal=lit constructor=?]
4671 [%tag id=@ud literal=lit constructor=?]
4669 [%const literal=lit]
4672 [%const literal=lit]
4670 [%collection name=term args=(list itype)]
4673 [%collection name=term args=(list itype)]
4671 [%recursive module=term name=term label=(unit @t)]
4674 [%recursive module=term name=term label=(unit @t)]
4672 [%jrec at=path name=term label=(unit @t) head=term aura=@ta tail=term]
4675 [%jrec at=path name=term label=(unit @t) head=term aura=@ta tail=term]
4676+ [%grec at=path name=term label=(unit @t) proof=shape args=(list itype)]
4673 [%union cases=(list itype) origin=(unit [at=path name=term]) label=(unit @t) args=(list itype)]
4677 [%union cases=(list itype) origin=(unit [at=path name=term]) label=(unit @t) args=(list itype)]
4674 [%face name=term body=itype]
4678 [%face name=term body=itype]
4675 [%fn sample=itype product=itype]
4679 [%fn sample=itype product=itype]
@@ -4722,6 +4726,88 @@
4722 $(t u.found)
4726 $(t u.found)
4723 ==
4727 ==
4724::
4728::
4729+:: Prove only emptiness; unknown types are never treated as empty.
4730+:: A shared node budget bounds each proof attempt.
4731+++ itype-empty-cases
4732+ |= [xs=(list itype) sub=isub fuel=@ud]
4733+ ^- (unit [empty=? left=@ud])
4734+ ?~ xs `[& fuel]
4735+ =/ first=(unit [empty=? left=@ud]) (itype-empty-proof i.xs sub fuel)
4736+ ?~ first ~
4737+ ?. empty.u.first `[| left.u.first]
4738+ $(xs t.xs, fuel left.u.first)
4739+++ itype-empty-proof
4740+ |= [typ=itype sub=isub fuel=@ud]
4741+ ^- (unit [empty=? left=@ud])
4742+ ?: =(0 fuel) ~
4743+ =. fuel (dec fuel)
4744+ =. typ (itype-walk typ sub)
4745+ ?- -.typ
4746+ %empty `[& fuel]
4747+ %face $(typ body.typ)
4748+ %cell
4749+ =/ left=(unit [empty=? left=@ud]) $(typ hed.typ)
4750+ ?~ left ~
4751+ ?: empty.u.left `[& left.u.left]
4752+ $(typ tal.typ, fuel left.u.left)
4753+ %union (itype-empty-cases cases.typ sub fuel)
4754+ * `[| fuel]
4755+ ==
4756+:: Prove reachability separately from emptiness. An unresolved fixed
4757+:: recursive type is not presumed inhabited. A written, still-unconstrained
4758+:: capital is existentially inhabited for pattern reachability; the normal
4759+:: definition-boundary checks reject subsequently constrained capitals.
4760+++ itype-inhabited-cases
4761+ |= [xs=(list itype) sub=isub caps=icaps fuel=@ud pending=?]
4762+ ^- (unit [result=?(%yes %no %unknown) left=@ud])
4763+ ?~ xs `[?:(pending %unknown %no) fuel]
4764+ =/ first=(unit [result=?(%yes %no %unknown) left=@ud])
4765+ (itype-inhabited-proof i.xs sub caps fuel)
4766+ ?~ first ~
4767+ ?: =(%yes result.u.first) first
4768+ $(xs t.xs, fuel left.u.first, pending |(pending =(%unknown result.u.first)))
4769+++ itype-inhabited-proof
4770+ |= [typ=itype sub=isub caps=icaps fuel=@ud]
4771+ ^- (unit [result=?(%yes %no %unknown) left=@ud])
4772+ ?: =(0 fuel) ~
4773+ =. fuel (dec fuel)
4774+ =. typ (itype-walk typ sub)
4775+ ?- -.typ
4776+ %empty `[%no fuel]
4777+ ?(%atom %any-atom %flag %const %noun %avar %rvar %nvar %rnvar %fn %jrec) `[%yes fuel]
4778+ %var
4779+ ?: (lien caps |=(c=icap (hole-same-variable typ (itype-walk [%var id.c] sub)))) `[%yes fuel]
4780+ `[%unknown fuel]
4781+ %face $(typ body.typ)
4782+ %cell
4783+ =/ head=(unit [result=?(%yes %no %unknown) left=@ud]) $(typ hed.typ)
4784+ ?~ head ~
4785+ ?: =(%no result.u.head) head
4786+ =/ tail=(unit [result=?(%yes %no %unknown) left=@ud]) $(typ tal.typ, fuel left.u.head)
4787+ ?~ tail ~
4788+ ?: =(%no result.u.tail) tail
4789+ ?: |(=(%unknown result.u.head) =(%unknown result.u.tail)) `[%unknown left.u.tail]
4790+ `[%yes left.u.tail]
4791+ %union (itype-inhabited-cases cases.typ sub caps fuel |)
4792+ %collection
4793+ ?. &(|(=(%list name.typ) =(%unit name.typ)) ?=([* ~] args.typ)) `[%unknown fuel]
4794+ `[%yes fuel]
4795+ %grec ?:((grec-tree-proof name.typ proof.typ) `[%yes fuel] `[%unknown fuel])
4796+ * `[%unknown fuel]
4797+ ==
4798+++ itype-live-cases
4799+ |= [xs=(list itype) sub=isub caps=icaps fuel=@ud]
4800+ ^- (unit (list itype))
4801+ ?~ xs `~
4802+ =/ first=(unit [result=?(%yes %no %unknown) left=@ud])
4803+ (itype-inhabited-proof i.xs sub caps fuel)
4804+ ?~ first ~
4805+ ?: =(%unknown result.u.first) ~
4806+ =/ rest=(unit (list itype)) $(xs t.xs, fuel left.u.first)
4807+ ?~ rest ~
4808+ ?: =(%no result.u.first) rest
4809+ `[i.xs u.rest]
4810+::
4725++ itype-occurs
4811++ itype-occurs
4726 |= [n=@ud t=itype sub=isub]
4812 |= [n=@ud t=itype sub=isub]
4727 ^- ?
4813 ^- ?
@@ -4736,11 +4822,13 @@
4736 %any-atom |
4822 %any-atom |
4737 %flag |
4823 %flag |
4738 %noun |
4824 %noun |
4825+ %empty |
4739 %tag =(n id.t)
4826 %tag =(n id.t)
4740 %const |
4827 %const |
4741 %union |((lien cases.t |=(c=itype (itype-occurs n c sub))) (lien args.t |=(c=itype (itype-occurs n c sub))))
4828 %union |((lien cases.t |=(c=itype (itype-occurs n c sub))) (lien args.t |=(c=itype (itype-occurs n c sub))))
4742 %recursive |
4829 %recursive |
4743 %jrec |
4830 %jrec |
4831+ %grec (lien args.t |=(c=itype (itype-occurs n c sub)))
4744 %collection (lien args.t |=(c=itype (itype-occurs n c sub)))
4832 %collection (lien args.t |=(c=itype (itype-occurs n c sub)))
4745 %face $(t body.t)
4833 %face $(t body.t)
4746 %fn |($(t sample.t) $(t product.t))
4834 %fn |($(t sample.t) $(t product.t))
@@ -4759,6 +4847,9 @@
4759 =. a (itype-walk a sub)
4847 =. a (itype-walk a sub)
4760 =. b (itype-walk b sub)
4848 =. b (itype-walk b sub)
4761 ?: =(a b) `sub
4849 ?: =(a b) `sub
4850+ ?: &(?=(%grec -.a) ?=(%grec -.b))
4851+ ?. &(=(at.a at.b) =(name.a name.b)) ~
4852+ (itype-unify-args args.a args.b sub)
4762 ?: &(?=(%jrec -.a) ?=(%jrec -.b))
4853 ?: &(?=(%jrec -.a) ?=(%jrec -.b))
4763 ?:(&(=(at.a at.b) =(name.a name.b) =(head.a head.b) =(aura.a aura.b) =(tail.a tail.b)) `sub ~)
4854 ?:(&(=(at.a at.b) =(name.a name.b) =(head.a head.b) =(aura.a aura.b) =(tail.a tail.b)) `sub ~)
4764 ?: &(?=(%recursive -.a) ?=(%recursive -.b))
4855 ?: &(?=(%recursive -.a) ?=(%recursive -.b))
@@ -4864,11 +4955,13 @@
4864 %any-atom &
4955 %any-atom &
4865 %flag |
4956 %flag |
4866 %noun |
4957 %noun |
4958+ %empty |
4867 %tag |
4959 %tag |
4868 %const |
4960 %const |
4869 %union |((lien cases.t |=(c=itype (itype-has-any-atom c sub))) (lien args.t |=(c=itype (itype-has-any-atom c sub))))
4961 %union |((lien cases.t |=(c=itype (itype-has-any-atom c sub))) (lien args.t |=(c=itype (itype-has-any-atom c sub))))
4870 %recursive |
4962 %recursive |
4871 %jrec |
4963 %jrec |
4964+ %grec (lien args.t |=(c=itype (itype-has-any-atom c sub)))
4872 %collection (lien args.t |=(c=itype (itype-has-any-atom c sub)))
4965 %collection (lien args.t |=(c=itype (itype-has-any-atom c sub)))
4873 %face $(t body.t)
4966 %face $(t body.t)
4874 %fn |($(t sample.t) $(t product.t))
4967 %fn |($(t sample.t) $(t product.t))
@@ -4938,11 +5031,13 @@
4938 %any-atom &
5031 %any-atom &
4939 %flag &
5032 %flag &
4940 %noun |
5033 %noun |
5034+ %empty |
4941 %tag &
5035 %tag &
4942 %const &
5036 %const &
4943 %union |((lien cases.typ |=(c=itype (itype-has-fixed-atom c))) (lien args.typ |=(c=itype (itype-has-fixed-atom c))))
5037 %union |((lien cases.typ |=(c=itype (itype-has-fixed-atom c))) (lien args.typ |=(c=itype (itype-has-fixed-atom c))))
4944 %recursive |
5038 %recursive |
4945 %jrec |
5039 %jrec |
5040+ %grec (lien args.typ |=(c=itype (itype-has-fixed-atom c)))
4946 %collection (lien args.typ |=(c=itype (itype-has-fixed-atom c)))
5041 %collection (lien args.typ |=(c=itype (itype-has-fixed-atom c)))
4947 %face $(typ body.typ)
5042 %face $(typ body.typ)
4948 %fn |($(typ sample.typ) $(typ product.typ))
5043 %fn |($(typ sample.typ) $(typ product.typ))
@@ -4971,6 +5066,7 @@
4971 ^- ?
5066 ^- ?
4972 =. t (itype-walk t sub)
5067 =. t (itype-walk t sub)
4973 ?- -.t
5068 ?- -.t
5069+ %grec (lien args.t |=(c=itype (itype-has-face c sub)))
4974 %collection (lien args.t |=(c=itype (itype-has-face c sub)))
5070 %collection (lien args.t |=(c=itype (itype-has-face c sub)))
4975 %face &
5071 %face &
4976 %cell |($(t hed.t) $(t tal.t))
5072 %cell |($(t hed.t) $(t tal.t))
@@ -5027,6 +5123,9 @@
5027 ^- ?
5123 ^- ?
5028 =. a (itype-walk a sub)
5124 =. a (itype-walk a sub)
5029 =. b (itype-walk b sub)
5125 =. b (itype-walk b sub)
5126+ ?: &(?=(%grec -.a) ?=(%grec -.b))
5127+ ?. &(=(at.a at.b) =(name.a name.b)) |
5128+ (itype-face-asym-collection-args args.a args.b sub)
5030 ?: &(?=(%collection -.a) ?=(%collection -.b))
5129 ?: &(?=(%collection -.a) ?=(%collection -.b))
5031 ?. =(name.a name.b) |
5130 ?. =(name.a name.b) |
5032 (itype-face-asym-collection-args args.a args.b sub)
5131 (itype-face-asym-collection-args args.a args.b sub)
@@ -5089,6 +5188,7 @@
5089 %union &
5188 %union &
5090 %recursive &
5189 %recursive &
5091 %jrec &
5190 %jrec &
5191+ %grec &
5092 %noun &
5192 %noun &
5093 %collection &
5193 %collection &
5094 %face $(t body.t)
5194 %face $(t body.t)
@@ -5118,6 +5218,7 @@
5118 ^- ?
5218 ^- ?
5119 ?- -.t
5219 ?- -.t
5120 %tag &
5220 %tag &
5221+ %grec (lien args.t |=(c=itype (itype-has-tag c)))
5121 %collection (lien args.t |=(c=itype (itype-has-tag c)))
5222 %collection (lien args.t |=(c=itype (itype-has-tag c)))
5122 %face $(t body.t)
5223 %face $(t body.t)
5123 %fn |($(t sample.t) $(t product.t))
5224 %fn |($(t sample.t) $(t product.t))
@@ -5131,6 +5232,7 @@
5131 ^- ?
5232 ^- ?
5132 ?- -.t
5233 ?- -.t
5133 %union &
5234 %union &
5235+ %grec (lien args.t |=(c=itype (itype-has-union c)))
5134 %collection (lien args.t |=(c=itype (itype-has-union c)))
5236 %collection (lien args.t |=(c=itype (itype-has-union c)))
5135 %face $(t body.t)
5237 %face $(t body.t)
5136 %fn |($(t sample.t) $(t product.t))
5238 %fn |($(t sample.t) $(t product.t))
@@ -5149,6 +5251,7 @@
5149 %union
5251 %union
5150 ?: &(?=(~ label.t) ?=(^ args.t)) &
5252 ?: &(?=(~ label.t) ?=(^ args.t)) &
5151 (lien (weld args.t cases.t) |=(c=itype (itype-has-hidden-generic c)))
5253 (lien (weld args.t cases.t) |=(c=itype (itype-has-hidden-generic c)))
5254+ %grec |(?=(~ label.t) (lien args.t |=(c=itype (itype-has-hidden-generic c))))
5152 %collection (lien args.t |=(c=itype (itype-has-hidden-generic c)))
5255 %collection (lien args.t |=(c=itype (itype-has-hidden-generic c)))
5153 %face $(t body.t)
5256 %face $(t body.t)
5154 %fn |($(t sample.t) $(t product.t))
5257 %fn |($(t sample.t) $(t product.t))
@@ -5162,6 +5265,7 @@
5162 ?- -.t
5265 ?- -.t
5163 %recursive &
5266 %recursive &
5164 %jrec &
5267 %jrec &
5268+ %grec &
5165 %collection (lien args.t |=(c=itype (itype-has-recursive c)))
5269 %collection (lien args.t |=(c=itype (itype-has-recursive c)))
5166 %union (lien (weld args.t cases.t) |=(c=itype (itype-has-recursive c)))
5270 %union (lien (weld args.t cases.t) |=(c=itype (itype-has-recursive c)))
5167 %face $(t body.t)
5271 %face $(t body.t)
@@ -5176,6 +5280,7 @@
5176 ?- -.t
5280 ?- -.t
5177 %recursive ?=(~ label.t)
5281 %recursive ?=(~ label.t)
5178 %jrec ?=(~ label.t)
5282 %jrec ?=(~ label.t)
5283+ %grec |(?=(~ label.t) (lien args.t |=(c=itype (itype-has-hidden-recursive c))))
5179 %collection (lien args.t |=(c=itype (itype-has-hidden-recursive c)))
5284 %collection (lien args.t |=(c=itype (itype-has-hidden-recursive c)))
5180 %union (lien (weld args.t cases.t) |=(c=itype (itype-has-hidden-recursive c)))
5285 %union (lien (weld args.t cases.t) |=(c=itype (itype-has-hidden-recursive c)))
5181 %face $(t body.t)
5286 %face $(t body.t)
@@ -5221,7 +5326,7 @@
5221 ?: ?=(%var -.raw)
5326 ?: ?=(%var -.raw)
5222 $(cases t.cases, pending &)
5327 $(cases t.cases, pending &)
5223 =/ c=itype (itype-walk raw sub)
5328 =/ c=itype (itype-walk raw sub)
5224− ?: ?=(?(%var %tag %recursive %jrec %union %face) -.c)
5329+ ?: ?=(?(%var %tag %recursive %jrec %grec %union %face) -.c)
5225 $(cases t.cases, pending &)
5330 $(cases t.cases, pending &)
5226 ?. ?=(%cell -.c) $(cases t.cases)
5331 ?. ?=(%cell -.c) $(cases t.cases)
5227 =/ raw-head=itype hed.c
5332 =/ raw-head=itype hed.c
@@ -5234,7 +5339,7 @@
5234 ?: ?=(?(%atom %any-atom %flag %avar %rvar %nvar %rnvar) -.body.head)
5339 ?: ?=(?(%atom %any-atom %flag %avar %rvar %nvar %rnvar) -.body.head)
5235 $(cases t.cases)
5340 $(cases t.cases)
5236 $(cases t.cases, pending &)
5341 $(cases t.cases, pending &)
5237− ?: ?=(?(%var %tag %recursive %jrec %union) -.head)
5342+ ?: ?=(?(%var %tag %recursive %jrec %grec %union) -.head)
5238 $(cases t.cases, pending &)
5343 $(cases t.cases, pending &)
5239 ?. ?=(%const -.head) $(cases t.cases)
5344 ?. ?=(%const -.head) $(cases t.cases)
5240 ?. =(val.literal.head val.tag) $(cases t.cases)
5345 ?. =(val.literal.head val.tag) $(cases t.cases)
@@ -5252,7 +5357,14 @@
5252++ itype-fit
5357++ itype-fit
5253 |= [actual=itype expected=itype sub=isub next=@ud]
5358 |= [actual=itype expected=itype sub=isub next=@ud]
5254 ^- ifit
5359 ^- ifit
5255− (itype-fit-inner actual expected sub next | |)
5360+ =/ result=ifit (itype-fit-inner actual expected sub next | |)
5361+ ?: ?=(%ok -.result) result
5362+ =/ source=itype (itype-walk actual sub)
5363+ ?. ?=(?(%empty %face %cell %union) -.source) result
5364+ =/ empty=(unit [empty=? left=@ud]) (itype-empty-proof actual sub 256)
5365+ ?~ empty [%unknown ~]
5366+ ?: empty.u.empty [%ok sub next]
5367+ result
5256++ itype-fit-inner
5368++ itype-fit-inner
5257 |= [actual=itype expected=itype sub=isub next=@ud skip-width=? spine-proof=?]
5369 |= [actual=itype expected=itype sub=isub next=@ud skip-width=? spine-proof=?]
5258 ^- ifit
5370 ^- ifit
@@ -5271,6 +5383,7 @@
5271 =. actual (itype-walk actual sub)
5383 =. actual (itype-walk actual sub)
5272 =. expected (itype-walk expected sub)
5384 =. expected (itype-walk expected sub)
5273 ?: =(actual expected) [%ok sub next]
5385 ?: =(actual expected) [%ok sub next]
5386+ ?: &(?=(%empty -.expected) |(?=(%cell -.actual) ?=(%face -.actual) ?=(%union -.actual) ?=(%grec -.actual) ?=(%recursive -.actual))) [%unknown ~]
5274 :: The relation of the source loobean mold to explicit @f is not yet
5387 :: The relation of the source loobean mold to explicit @f is not yet
5275 :: established. Keep it unsupported rather than asserting a mismatch.
5388 :: established. Keep it unsupported rather than asserting a mismatch.
5276 ?: &(?=(%flag -.actual) ?=(%atom -.expected) =(%f aura.expected)) [%unknown ~]
5389 ?: &(?=(%flag -.actual) ?=(%atom -.expected) =(%f aura.expected)) [%unknown ~]
@@ -5283,6 +5396,14 @@
5283 [%ok sub next]
5396 [%ok sub next]
5284 :: An arbitrary noun is not known to fit a narrower type.
5397 :: An arbitrary noun is not known to fit a narrower type.
5285 ?: &(?=(%noun -.actual) !?=(%var -.expected)) [%unknown ~]
5398 ?: &(?=(%noun -.actual) !?=(%var -.expected)) [%unknown ~]
5399+ ?: &(!uncertain ?=(%grec -.actual) ?=(%face -.expected)) $(expected body.expected)
5400+ ?: &(!uncertain ?=(%face -.actual) ?=(%grec -.expected)) $(actual body.actual)
5401+ ?: &(?=(%grec -.actual) ?=(%grec -.expected))
5402+ ?. &(=(at.actual at.expected) =(name.actual name.expected)) [%unknown ~]
5403+ =/ matched=(unit isub) (itype-unify-args args.actual args.expected sub)
5404+ ?~ matched [%unknown ~]
5405+ [%ok u.matched next]
5406+ ?: &(|(?=(%grec -.actual) ?=(%grec -.expected)) !|(?=(%var -.actual) ?=(%var -.expected))) [%unknown ~]
5286 ?: &(!uncertain ?=(%jrec -.actual) ?=(%face -.expected)) $(expected body.expected)
5407 ?: &(!uncertain ?=(%jrec -.actual) ?=(%face -.expected)) $(expected body.expected)
5287 ?: &(!uncertain ?=(%face -.actual) ?=(%jrec -.expected)) $(actual body.actual)
5408 ?: &(!uncertain ?=(%face -.actual) ?=(%jrec -.expected)) $(actual body.actual)
5288 ?: &(?=(%jrec -.actual) ?=(%jrec -.expected))
5409 ?: &(?=(%jrec -.actual) ?=(%jrec -.expected))
@@ -5609,7 +5730,77 @@
5609 ?. (width-in-order order.source.shape order.target.shape) ~
5730 ?. (width-in-order order.source.shape order.target.shape) ~
5610 (width-fit-fields index.source.shape order.target.shape sub next)
5731 (width-fit-fields index.source.shape order.target.shape sub next)
5611::
5732::
5733+:: Provisional, globally budgeted gate-free proof. %no includes a
5734+:: gate-bearing witness; an uninhabited sibling could invalidate it.
5735+:: Input types must be resolved and normalized under valid substitutions,
5736+:: from trusted source-backed interfaces and reader results. Collection
5737+:: list/unit names rely on their existing identity invariant; this arm
5738+:: does not validate fabricated internal types.
5739++$ igf-segment
5740+ $% [%field name=term]
5741+ [%head ~]
5742+ [%tail ~]
5743+ [%item ~]
5744+ [%case index=@ud]
5745+ ==
5746++$ igate-free [verdict=?(%yes %no %unknown) inhabited=? left=@ud path=(unit (list igf-segment))]
5747+++ gate-free-types
5748+ |= [types=(list itype) fuel=@ud path=(list igf-segment) index=@ud]
5749+ ^- igate-free
5750+ ?~ types [%yes | fuel ~]
5751+ ?: =(0 fuel) [%unknown | 0 ~]
5752+ =/ first=igate-free (gate-free-type i.types fuel [[%case index] path])
5753+ ?: =(%no verdict.first) first
5754+ =/ rest=igate-free $(types t.types, fuel left.first, index +(index))
5755+ ?: =(%no verdict.rest) rest
5756+ =/ inhabited=? |(inhabited.first inhabited.rest)
5757+ ?: |(=(%unknown verdict.first) =(%unknown verdict.rest)) [%unknown inhabited left.rest ~]
5758+ [%yes inhabited left.rest ~]
5759+++ gate-free-type
5760+ |= [typ=itype fuel=@ud path=(list igf-segment)]
5761+ ^- igate-free
5762+ ?: =(0 fuel) [%unknown | 0 ~]
5763+ =. fuel (dec fuel)
5764+ ?- -.typ
5765+ %fn [%no & fuel `(flop path)]
5766+ %atom [%yes & fuel ~]
5767+ %any-atom [%yes & fuel ~]
5768+ %flag [%yes & fuel ~]
5769+ %const [%yes & fuel ~]
5770+ %face $(typ body.typ, path [[%field name.typ] path])
5771+ %cell
5772+ =/ head=igate-free $(typ hed.typ, path [[%head ~] path])
5773+ =/ tail=igate-free $(typ tal.typ, fuel left.head, path [[%tail ~] path])
5774+ =/ inhabited=? &(inhabited.head inhabited.tail)
5775+ ?: |(&(=(%yes verdict.head) !inhabited.head) &(=(%yes verdict.tail) !inhabited.tail)) [%yes | left.tail ~]
5776+ ?: &(=(%no verdict.head) inhabited.tail) head(left left.tail)
5777+ ?: &(=(%no verdict.tail) inhabited.head) tail
5778+ ?: |(!=(%yes verdict.head) !=(%yes verdict.tail)) [%unknown inhabited left.tail ~]
5779+ [%yes inhabited left.tail ~]
5780+ %collection
5781+ ?. |(=(%list name.typ) =(%unit name.typ)) [%unknown | fuel ~]
5782+ ?. ?=([* ~] args.typ) [%unknown | fuel ~]
5783+ =/ item=igate-free $(typ i.args.typ, path [[%item ~] path])
5784+ item(inhabited &)
5785+ %union
5786+ ?~ cases.typ [%unknown | fuel ~]
5787+ (gate-free-types cases.typ fuel path 0)
5788+ %noun [%unknown & fuel ~]
5789+ %empty [%yes | fuel ~]
5790+ %var [%unknown | fuel ~]
5791+ %avar [%yes & fuel ~]
5792+ %rvar [%yes & fuel ~]
5793+ %nvar [%yes & fuel ~]
5794+ %rnvar [%yes & fuel ~]
5795+ %tag [%unknown | fuel ~]
5796+ %recursive [%unknown | fuel ~]
5797+ %jrec [%yes & fuel ~]
5798+ %grec [%unknown | fuel ~]
5799+ ==
5800+::
5801++$ igate-prelude-evidence [iface=ifile gates=(map term def)]
5802++$ dgo [left=itype right=itype at=span context=span]
5612−+$ istate [next=@ud sub=isub caps=icaps binders=(list @ud) molds=imolds globals=(list term) externals=iexternals surs=(list term) mark-externals=imark-externals marks=(list term) jimports=ijimports reserved-molds=(list term) params=iparams active=(list term) tags=(list ipending) in-mold=? at=path top-molds=(list term) prelude=(unit ifile) holes=(list ihole) jrec-fuel=@ud projections=(list iwprojection)]
5803++$ istate [next=@ud sub=isub caps=icaps binders=(list @ud) molds=imolds globals=(list term) externals=iexternals surs=(list term) mark-externals=imark-externals marks=(list term) jimports=ijimports reserved-molds=(list term) params=iparams active=(list term) tags=(list ipending) in-mold=? at=path top-molds=(list term) prelude=(unit ifile) holes=(list ihole) jrec-fuel=@ud projections=(list iwprojection) gate-defs=(map term def) head-evidence=(unit igate-prelude-evidence) grec-index=(unit [at=path source=@t prelude=ifile shapes=(map term shape)]) defer=(unit ~) obligations=(list dgo)]
5613+$ idiag [msg=tape sites=(list [at=span note=tape])]
5804+$ idiag [msg=tape sites=(list [at=span note=tape])]
5614+$ iresult (each [typ=itype state=istate] idiag)
5805+$ iresult (each [typ=itype state=istate] idiag)
5615+$ isample-result (each [typ=itype env=ienv state=istate] tape)
5806+$ isample-result (each [typ=itype env=ienv state=istate] tape)
@@ -5629,6 +5820,7 @@
5629 |= [t=itype sub=isub]
5820 |= [t=itype sub=isub]
5630 ^- itype
5821 ^- itype
5631 =. t (itype-walk t sub)
5822 =. t (itype-walk t sub)
5823+ ?: ?=(%grec -.t) t(args (turn args.t |=(c=itype (itype-normalize c sub))))
5632 ?: ?=(%collection -.t) [%collection name.t (turn args.t |=(c=itype (itype-normalize c sub)))]
5824 ?: ?=(%collection -.t) [%collection name.t (turn args.t |=(c=itype (itype-normalize c sub)))]
5633 ?: ?=(%union -.t)
5825 ?: ?=(%union -.t)
5634 [%union (turn cases.t |=(c=itype (itype-normalize c sub))) origin.t label.t (turn args.t |=(c=itype (itype-normalize c sub)))]
5826 [%union (turn cases.t |=(c=itype (itype-normalize c sub))) origin.t label.t (turn args.t |=(c=itype (itype-normalize c sub)))]
@@ -5655,6 +5847,7 @@
5655 %cell |($(t hed.t) $(t tal.t))
5847 %cell |($(t hed.t) $(t tal.t))
5656 %recursive |
5848 %recursive |
5657 %jrec |
5849 %jrec |
5850+ %grec &
5658 %collection (lien args.t |=(c=itype (itype-has-gate c)))
5851 %collection (lien args.t |=(c=itype (itype-has-gate c)))
5659 %face $(t body.t)
5852 %face $(t body.t)
5660 %union (lien cases.t |=(c=itype (itype-has-gate c)))
5853 %union (lien cases.t |=(c=itype (itype-has-gate c)))
@@ -5669,6 +5862,7 @@
5669 %any-atom |
5862 %any-atom |
5670 %flag |
5863 %flag |
5671 %noun |
5864 %noun |
5865+ %empty |
5672 ==
5866 ==
5673::
5867::
5674++ default-decimals
5868++ default-decimals
@@ -5678,6 +5872,7 @@
5678 ?- -.t
5872 ?- -.t
5679 %nvar [%atom %ud]
5873 %nvar [%atom %ud]
5680 %rnvar [%atom %ud]
5874 %rnvar [%atom %ud]
5875+ %grec t(args (turn args.t |=(c=itype (default-decimals c))))
5681 %collection [%collection name.t (turn args.t |=(c=itype (default-decimals c)))]
5876 %collection [%collection name.t (turn args.t |=(c=itype (default-decimals c)))]
5682 %face [%face name.t $(t body.t)]
5877 %face [%face name.t $(t body.t)]
5683 %cell [%cell $(t hed.t) $(t tal.t)]
5878 %cell [%cell $(t hed.t) $(t tal.t)]
@@ -5719,6 +5914,7 @@
5719 %tag |
5914 %tag |
5720 %any-atom &
5915 %any-atom &
5721 %union &((levy cases.t |=(c=itype (hole-known c state))) (levy args.t |=(c=itype (hole-known c state))))
5916 %union &((levy cases.t |=(c=itype (hole-known c state))) (levy args.t |=(c=itype (hole-known c state))))
5917+ %grec (levy args.t |=(c=itype (hole-known c state)))
5722 %collection (levy args.t |=(c=itype (hole-known c state)))
5918 %collection (levy args.t |=(c=itype (hole-known c state)))
5723 %face $(t body.t)
5919 %face $(t body.t)
5724 %fn &($(t sample.t) $(t product.t))
5920 %fn &($(t sample.t) $(t product.t))
@@ -5728,6 +5924,8 @@
5728++ promote-restricted-numbers
5924++ promote-restricted-numbers
5729 |= [state=istate env=ienv]
5925 |= [state=istate env=ienv]
5730 ^- istate
5926 ^- istate
5927+ :: With no written capitals, there is nothing to promote.
5928+ ?~ caps.state state
5731 =/ ids=(list @ud) (turn caps.state |=(c=icap id.c))
5929 =/ ids=(list @ud) (turn caps.state |=(c=icap id.c))
5732 =/ free=(list @ud) (free-env-vars env sub.state)
5930 =/ free=(list @ud) (free-env-vars env sub.state)
5733 |-
5931 |-
@@ -5764,6 +5962,7 @@
5764 ?- -.t
5962 ?- -.t
5765 ?(%tag %nvar %rnvar %avar %rvar) !(hole-known t state)
5963 ?(%tag %nvar %rnvar %avar %rvar) !(hole-known t state)
5766 %union |((lien cases.t |=(c=itype (hole-uncertain c state))) (lien args.t |=(c=itype (hole-uncertain c state))))
5964 %union |((lien cases.t |=(c=itype (hole-uncertain c state))) (lien args.t |=(c=itype (hole-uncertain c state))))
5965+ %grec (lien args.t |=(c=itype (hole-uncertain c state)))
5767 %collection (lien args.t |=(c=itype (hole-uncertain c state)))
5966 %collection (lien args.t |=(c=itype (hole-uncertain c state)))
5768 %face $(t body.t)
5967 %face $(t body.t)
5769 %fn |($(t sample.t) $(t product.t))
5968 %fn |($(t sample.t) $(t product.t))
@@ -5795,11 +5994,13 @@
5795 %any-atom ~
5994 %any-atom ~
5796 %flag ~
5995 %flag ~
5797 %noun ~
5996 %noun ~
5997+ %empty ~
5798 %tag ~
5998 %tag ~
5799 %const ~
5999 %const ~
5800 %union (zing (turn (weld args.t cases.t) |=(c=itype (itype-vars c))))
6000 %union (zing (turn (weld args.t cases.t) |=(c=itype (itype-vars c))))
5801 %recursive ~
6001 %recursive ~
5802 %jrec ~
6002 %jrec ~
6003+ %grec (zing (turn args.t |=(c=itype (itype-vars c))))
5803 %collection (zing (turn args.t |=(c=itype (itype-vars c))))
6004 %collection (zing (turn args.t |=(c=itype (itype-vars c))))
5804 %face $(t body.t)
6005 %face $(t body.t)
5805 %fn (weld $(t sample.t) $(t product.t))
6006 %fn (weld $(t sample.t) $(t product.t))
@@ -5843,11 +6044,13 @@
5843 %any-atom t
6044 %any-atom t
5844 %flag t
6045 %flag t
5845 %noun t
6046 %noun t
6047+ %empty t
5846 %tag t
6048 %tag t
5847 %const t
6049 %const t
5848 %union [%union (turn cases.t |=(c=itype (itype-rename c ren))) origin.t label.t (turn args.t |=(c=itype (itype-rename c ren)))]
6050 %union [%union (turn cases.t |=(c=itype (itype-rename c ren))) origin.t label.t (turn args.t |=(c=itype (itype-rename c ren)))]
5849 %recursive t
6051 %recursive t
5850 %jrec t
6052 %jrec t
6053+ %grec t(args (turn args.t |=(c=itype (itype-rename c ren))))
5851 %collection [%collection name.t (turn args.t |=(c=itype (itype-rename c ren)))]
6054 %collection [%collection name.t (turn args.t |=(c=itype (itype-rename c ren)))]
5852 %face [%face name.t $(t body.t)]
6055 %face [%face name.t $(t body.t)]
5853 %fn [%fn $(t sample.t) $(t product.t)]
6056 %fn [%fn $(t sample.t) $(t product.t)]
@@ -5870,11 +6073,13 @@
5870 %any-atom |
6073 %any-atom |
5871 %flag |
6074 %flag |
5872 %noun |
6075 %noun |
6076+ %empty |
5873 %tag |
6077 %tag |
5874 %const |
6078 %const |
5875 %union |((lien cases.t |=(c=itype (itype-var-is-atom n c))) (lien args.t |=(c=itype (itype-var-is-atom n c))))
6079 %union |((lien cases.t |=(c=itype (itype-var-is-atom n c))) (lien args.t |=(c=itype (itype-var-is-atom n c))))
5876 %recursive |
6080 %recursive |
5877 %jrec |
6081 %jrec |
6082+ %grec (lien args.t |=(c=itype (itype-var-is-atom n c)))
5878 %collection (lien args.t |=(c=itype (itype-var-is-atom n c)))
6083 %collection (lien args.t |=(c=itype (itype-var-is-atom n c)))
5879 %face $(t body.t)
6084 %face $(t body.t)
5880 %fn |($(t sample.t) $(t product.t))
6085 %fn |($(t sample.t) $(t product.t))
@@ -5893,11 +6098,13 @@
5893 %any-atom |
6098 %any-atom |
5894 %flag |
6099 %flag |
5895 %noun |
6100 %noun |
6101+ %empty |
5896 %tag |
6102 %tag |
5897 %const |
6103 %const |
5898 %union |((lien cases.t |=(c=itype (itype-var-is-restricted n c))) (lien args.t |=(c=itype (itype-var-is-restricted n c))))
6104 %union |((lien cases.t |=(c=itype (itype-var-is-restricted n c))) (lien args.t |=(c=itype (itype-var-is-restricted n c))))
5899 %recursive |
6105 %recursive |
5900 %jrec |
6106 %jrec |
6107+ %grec (lien args.t |=(c=itype (itype-var-is-restricted n c)))
5901 %collection (lien args.t |=(c=itype (itype-var-is-restricted n c)))
6108 %collection (lien args.t |=(c=itype (itype-var-is-restricted n c)))
5902 %face $(t body.t)
6109 %face $(t body.t)
5903 %fn |($(t sample.t) $(t product.t))
6110 %fn |($(t sample.t) $(t product.t))
@@ -6194,6 +6401,7 @@
6194 ^- upat
6401 ^- upat
6195 ?- -.typ
6402 ?- -.typ
6196 %noun [%all ~]
6403 %noun [%all ~]
6404+ %empty [%empty ~]
6197 %atom [%atom ~]
6405 %atom [%atom ~]
6198 %flag [%or ~[[%atom `0] [%atom `1]]]
6406 %flag [%or ~[[%atom `0] [%atom `1]]]
6199 %const [%atom `val.literal.typ]
6407 %const [%atom `val.literal.typ]
@@ -6328,6 +6536,16 @@
6328 ?: &(?=(~ vars.template) ?=(%jrec -.typ.template) =(at.typ.template origin) =(name.typ.template name)) `name.i.molds
6536 ?: &(?=(~ vars.template) ?=(%jrec -.typ.template) =(at.typ.template origin) =(name.typ.template name)) `name.i.molds
6329 $(molds t.molds)
6537 $(molds t.molds)
6330::
6538::
6539+++ grec-visible-alias
6540+ |= [origin=path name=term proof=shape args=(list itype) molds=imold-types]
6541+ ^- (unit term)
6542+ ?~ molds ~
6543+ =/ template=ischeme template.i.molds
6544+ ?. ?=(%grec -.typ.template) $(molds t.molds)
6545+ ?. &(=(at.typ.template origin) =(name.typ.template name) =(proof.typ.template proof)) $(molds t.molds)
6546+ ?. &((identity-union-parameters vars.template args.typ.template) =((lent vars.template) (lent args))) $(molds t.molds)
6547+ `name.i.molds
6548+::
6331++ itype-in-import
6549++ itype-in-import
6332 |= [t=itype iface=ifile face=term prelude=(unit ifile)]
6550 |= [t=itype iface=ifile face=term prelude=(unit ifile)]
6333 ^- itype
6551 ^- itype
@@ -6347,6 +6565,11 @@
6347 `(crip "{(trip u.alias)}.{(trip face)}")
6565 `(crip "{(trip u.alias)}.{(trip face)}")
6348 [%union (turn cases.t |=(c=itype (itype-in-import c iface face prelude))) origin.t label (turn args.t |=(c=itype (itype-in-import c iface face prelude)))]
6566 [%union (turn cases.t |=(c=itype (itype-in-import c iface face prelude))) origin.t label (turn args.t |=(c=itype (itype-in-import c iface face prelude)))]
6349 %recursive [%recursive module.t name.t ~]
6567 %recursive [%recursive module.t name.t ~]
6568+ %grec
6569+ =/ public=(unit term) ?~(prelude ~ (grec-visible-alias at.t name.t proof.t args.t molds.u.prelude))
6570+ =/ alias=(unit term) ?~(public (grec-visible-alias at.t name.t proof.t args.t molds.iface) public)
6571+ =/ label=(unit @t) ?~(alias ~ ?~(public `(crip "{(trip u.alias)}.{(trip face)}") `u.alias))
6572+ t(label label, args (turn args.t |=(c=itype (itype-in-import c iface face prelude))))
6350 %jrec
6573 %jrec
6351 =/ public=(unit term) ?~(prelude ~ (jrec-alias at.t name.t molds.u.prelude))
6574 =/ public=(unit term) ?~(prelude ~ (jrec-alias at.t name.t molds.u.prelude))
6352 ?^ public t(label `u.public)
6575 ?^ public t(label `u.public)
@@ -6459,9 +6682,29 @@
6459 ?. =(names.tail ~[name]) ~
6682 ?. =(names.tail ~[name]) ~
6460 `[%jrec at.state name `name name.i.fs aura.shape.i.fs name.i.t.fs]
6683 `[%jrec at.state name `name name.i.fs aura.shape.i.fs name.i.t.fs]
6461::
6684::
6685+++ simple-source-generic-recursive
6686+ |= [name=term sh=shape args=(list itype) state=istate]
6687+ ^- (unit itype)
6688+ ?. ?=(%generic -.sh) ~
6689+ ?. ?=([@ ~] vars.sh) ~
6690+ ?. ?=([* ~] args) ~
6691+ ?~ grec-index.state ~
6692+ ?. =(at.u.grec-index.state at.state) ~
6693+ ?~ prelude.state ~
6694+ ?. =(prelude.u.grec-index.state u.prelude.state) ~
6695+ =/ proof=(unit shape) (~(get by shapes.u.grec-index.state) name)
6696+ ?~ proof ~
6697+ ?. =(u.proof sh) ~
6698+ `[%grec at.state name `name sh args]
6699+::
6700+
6462++ infer-mold-template
6701++ infer-mold-template
6463 |= [sh=shape state=istate]
6702 |= [sh=shape state=istate]
6464 ^- (unit [template=ischeme state=istate])
6703 ^- (unit [template=ischeme state=istate])
6704+ =/ generic=(unit itype)
6705+ ?. ?=([@ ~] active.state) ~
6706+ (simple-source-generic-recursive i.active.state sh ~[[%var next.state]] state)
6707+ ?^ generic `[[u.generic ~[next.state]] state(next +(next.state))]
6465 =/ direct=(unit itype)
6708 =/ direct=(unit itype)
6466 ?. ?=([@ ~] active.state) ~
6709 ?. ?=([@ ~] active.state) ~
6467 (simple-source-recursive i.active.state sh state)
6710 (simple-source-recursive i.active.state sh state)
@@ -6519,7 +6762,7 @@
6519 ?~ found ~
6762 ?~ found ~
6520 ?^ t.found ~
6763 ?^ t.found ~
6521 result.i.found
6764 result.i.found
6522− ?. ?=([%invalid ?(%aura %core) @] raw) ~
6765+ ?. ?=([%invalid ?(%aura %core %overlap) @] raw) ~
6523 `["{(trip +>.raw)}" ~[[at.sh "invalid imported mold"]]]
6766 `["{(trip +>.raw)}" ~[[at.sh "invalid imported mold"]]]
6524::
6767::
6525:: Replay only the shape branches whose evaluation order we can prove.
6768:: Replay only the shape branches whose evaluation order we can prove.
@@ -6594,13 +6837,18 @@
6594 `[[%atom aura.sh] state]
6837 `[[%atom aura.sh] state]
6595 %flag `[[%flag ~] state]
6838 %flag `[[%flag ~] state]
6596 %noun `[[%noun ~] state]
6839 %noun `[[%noun ~] state]
6840+ %void `[[%empty ~] state]
6597 %const
6841 %const
6598 ?. |(=(%term form.lit.sh) =(%null form.lit.sh) =(%loobean form.lit.sh)) ~
6842 ?. |(=(%term form.lit.sh) =(%null form.lit.sh) =(%loobean form.lit.sh)) ~
6599 ?: &(=(%loobean form.lit.sh) !|(=(0 val.lit.sh) =(1 val.lit.sh))) ~
6843 ?: &(=(%loobean form.lit.sh) !|(=(0 val.lit.sh) =(1 val.lit.sh))) ~
6600 `[[%const lit.sh] state]
6844 `[[%const lit.sh] state]
6601 %union
6845 %union
6602 =/ pairs=(list upair) (union-pairs cases.sh molds.state)
6846 =/ pairs=(list upair) (union-pairs cases.sh molds.state)
6847+ ?: (lien pairs |=(p=upair =(%overlap relation.p))) ~
6848+ =/ source-proof=?
6603− ?. (levy pairs |=(p=upair =(%disjoint relation.p))) ~
6849+ ?: (levy pairs |=(p=upair =(%disjoint relation.p))) &
6850+ &((union-source-state-safe state 256) (union-source-distinct-tags cases.sh molds.state 256))
6851+ ?. source-proof ~
6604 =/ cs=(unit [types=(list itype) state=istate]) (infer-shape-args cases.sh state)
6852 =/ cs=(unit [types=(list itype) state=istate]) (infer-shape-args cases.sh state)
6605 ?~ cs ~
6853 ?~ cs ~
6606 `[[%union types.u.cs ~ ~ ~] state.u.cs]
6854 `[[%union types.u.cs ~ ~ ~] state.u.cs]
@@ -6674,6 +6922,8 @@
6674 ?~ applied ~
6922 ?~ applied ~
6675 `[u.applied state.u.args]
6923 `[u.applied state.u.args]
6676 ?. ?=(%generic -.u.found) ~
6924 ?. ?=(%generic -.u.found) ~
6925+ =/ grec=(unit itype) (simple-source-generic-recursive n u.found types.u.args state.u.args)
6926+ ?^ grec `[u.grec state.u.args]
6677 ?. (distinct-params vars.u.found) ~
6927 ?. (distinct-params vars.u.found) ~
6678 =/ params=(unit iparams) (bind-params vars.u.found types.u.args)
6928 =/ params=(unit iparams) (bind-params vars.u.found types.u.args)
6679 ?~ params ~
6929 ?~ params ~
@@ -7002,6 +7252,7 @@
7002 =/ retried=? ?=(%| -.inferred)
7252 =/ retried=? ?=(%| -.inferred)
7003 =? inferred retried (infer-recursive-gate d env local-state)
7253 =? inferred retried (infer-recursive-gate d env local-state)
7004 ?: ?=(%| -.inferred) $(ds t.ds, remaining [d remaining])
7254 ?: ?=(%| -.inferred) $(ds t.ds, remaining [d remaining])
7255+ ?: !=(obligations.state.p.inferred obligations.state) [%| ["deferred local definition needs unsupported inference" ~]]
7005 =. state.p.inferred (promote-restricted-numbers state.p.inferred env)
7256 =. state.p.inferred (promote-restricted-numbers state.p.inferred env)
7006 =. state.p.inferred (default-hole-numbers holes.state.p.inferred holes.state state.p.inferred env !(itype-has-gate (itype-normalize typ.p.inferred sub.state.p.inferred)))
7257 =. state.p.inferred (default-hole-numbers holes.state.p.inferred holes.state state.p.inferred env !(itype-has-gate (itype-normalize typ.p.inferred sub.state.p.inferred)))
7007 =/ hole=(unit idiag) (unresolved-hole holes.state.p.inferred holes.state state.p.inferred)
7258 =/ hole=(unit idiag) (unresolved-hole holes.state.p.inferred holes.state state.p.inferred)
@@ -7111,6 +7362,8 @@
7111 ?: &(?=(%collection -.expected) =(%list name.expected) (context-list-expression e))
7362 ?: &(?=(%collection -.expected) =(%list name.expected) (context-list-expression e))
7112 (infer-list-context e expected env state context)
7363 (infer-list-context e expected env state context)
7113 ?: ?=(%branch -.e)
7364 ?: ?=(%branch -.e)
7365+ =/ empty-list=(unit iresult) (empty-list-null-branch e env state `[expected context])
7366+ ?^ empty-list u.empty-list
7114 ?~ arms.e [%| ["branch is not supported by partial inference" ~]]
7367 ?~ arms.e [%| ["branch is not supported by partial inference" ~]]
7115 ?~ t.arms.e [%| ["branch pattern is not supported by partial inference" ~]]
7368 ?~ t.arms.e [%| ["branch pattern is not supported by partial inference" ~]]
7116 ?^ t.t.arms.e [%| ["branch is not supported by partial inference" ~]]
7369 ?^ t.t.arms.e [%| ["branch is not supported by partial inference" ~]]
@@ -7224,7 +7477,12 @@
7224 =/ target=itype (itype-walk expected sub.state)
7477 =/ target=itype (itype-walk expected sub.state)
7225 =/ value=iresult (infer-call-context-arg i.items target env state context)
7478 =/ value=iresult (infer-call-context-arg i.items target env state context)
7226 ?: ?=(%| -.value) value
7479 ?: ?=(%| -.value) value
7227− =/ fit=ifit (itype-fit typ.p.value target sub.state.p.value next.state.p.value)
7480+ =/ ordinary-fit=ifit (itype-fit typ.p.value target sub.state.p.value next.state.p.value)
7481+ =/ fit=ifit
7482+ ?: ?=(%ok -.ordinary-fit) ordinary-fit
7483+ ?: ?&(?=(%union -.target) ?=(^ prelude.state) =(origin.target `[at.u.prelude.state %element]))
7484+ (program-single-generic-fit typ.p.value target sub.state.p.value next.state.p.value)
7485+ ordinary-fit
7228 ?: ?=(%unknown -.fit) [%| ["list item constraint is not supported by partial inference" ~]]
7486 ?: ?=(%unknown -.fit) [%| ["list item constraint is not supported by partial inference" ~]]
7229 ?: ?=(%bad -.fit)
7487 ?: ?=(%bad -.fit)
7230 ?: |((itype-family-related typ.p.value target sub.state.p.value) (itype-has-any-atom typ.p.value sub.state.p.value) (itype-has-any-atom target sub.state.p.value))
7488 ?: |((itype-family-related typ.p.value target sub.state.p.value) (itype-has-any-atom typ.p.value sub.state.p.value) (itype-has-any-atom target sub.state.p.value))
@@ -7241,7 +7499,12 @@
7241 =/ target=itype (itype-walk expected sub.state)
7499 =/ target=itype (itype-walk expected sub.state)
7242 =/ value=iresult (infer-call-context-arg i.items target env state context)
7500 =/ value=iresult (infer-call-context-arg i.items target env state context)
7243 ?: ?=(%| -.value) value
7501 ?: ?=(%| -.value) value
7244− =/ fit=ifit (itype-fit typ.p.value target sub.state.p.value next.state.p.value)
7502+ =/ ordinary-fit=ifit (itype-fit typ.p.value target sub.state.p.value next.state.p.value)
7503+ =/ fit=ifit
7504+ ?: ?=(%ok -.ordinary-fit) ordinary-fit
7505+ ?: ?&(?=(%union -.target) ?=(^ prelude.state) =(origin.target `[at.u.prelude.state %element]))
7506+ (program-single-generic-fit typ.p.value target sub.state.p.value next.state.p.value)
7507+ ordinary-fit
7245 ?: ?=(%unknown -.fit) [%| ["list item constraint is not supported by partial inference" ~]]
7508 ?: ?=(%unknown -.fit) [%| ["list item constraint is not supported by partial inference" ~]]
7246 ?: ?=(%bad -.fit)
7509 ?: ?=(%bad -.fit)
7247 =/ missing=(unit idiag) (missing-union-tag i.items target sub.state.p.value context)
7510 =/ missing=(unit idiag) (missing-union-tag i.items target sub.state.p.value context)
@@ -7328,6 +7591,11 @@
7328 [%| ["list pattern needs the standard prelude in partial inference" ~]]
7591 [%| ["list pattern needs the standard prelude in partial inference" ~]]
7329 ?~ args.typ [%| ["list pattern is not supported by partial inference" ~]]
7592 ?~ args.typ [%| ["list pattern is not supported by partial inference" ~]]
7330 ?^ t.args.typ [%| ["list pattern is not supported by partial inference" ~]]
7593 ?^ t.args.typ [%| ["list pattern is not supported by partial inference" ~]]
7594+ =/ item-live=(unit [result=?(%yes %no %unknown) left=@ud])
7595+ (itype-inhabited-proof i.args.typ sub.state caps.state 256)
7596+ ?~ item-live [%| ["list element reachability needs unsupported inference" ~]]
7597+ ?: =(%unknown result.u.item-live) [%| ["list element reachability needs unsupported inference" ~]]
7598+ ?: =(%no result.u.item-live) [%| ["list nonempty pattern is unreachable" ~]]
7331 ?~ arms.e [%| ["list branch is not supported by partial inference" ~]]
7599 ?~ arms.e [%| ["list branch is not supported by partial inference" ~]]
7332 ?~ t.arms.e [%| ["list branch is not supported by partial inference" ~]]
7600 ?~ t.arms.e [%| ["list branch is not supported by partial inference" ~]]
7333 ?^ t.t.arms.e [%| ["list branch is not supported by partial inference" ~]]
7601 ?^ t.t.arms.e [%| ["list branch is not supported by partial inference" ~]]
@@ -7381,6 +7649,11 @@
7381 [%| ["pattern binder shadows a name" ~]]
7649 [%| ["pattern binder shadows a name" ~]]
7382 =/ payload=(unit itype) (unit-union-payload typ)
7650 =/ payload=(unit itype) (unit-union-payload typ)
7383 ?~ payload [%| ["unit branch subject is not supported by partial inference" ~]]
7651 ?~ payload [%| ["unit branch subject is not supported by partial inference" ~]]
7652+ =/ payload-live=(unit [result=?(%yes %no %unknown) left=@ud])
7653+ (itype-inhabited-proof u.payload sub.state.p.subject caps.state.p.subject 256)
7654+ ?~ payload-live [%| ["unit payload reachability needs unsupported inference" ~]]
7655+ ?: =(%unknown result.u.payload-live) [%| ["unit payload reachability needs unsupported inference" ~]]
7656+ ?: =(%no result.u.payload-live) [%| ["unit present pattern is unreachable" ~]]
7384 =/ extended=ienv [[u.binder [u.payload ~]] env]
7657 =/ extended=ienv [[u.binder [u.payload ~]] env]
7385 =/ left=iresult
7658 =/ left=iresult
7386 ?~ expected (infer-fragment val.x ?:(first-empty env extended) state.p.subject)
7659 ?~ expected (infer-fragment val.x ?:(first-empty env extended) state.p.subject)
@@ -7533,7 +7806,9 @@
7533 ?: ?=(%| -.subject) `subject
7806 ?: ?=(%| -.subject) `subject
7534 =/ typ=itype (itype-normalize typ.p.subject sub.state.p.subject)
7807 =/ typ=itype (itype-normalize typ.p.subject sub.state.p.subject)
7535 ?. ?=(%union -.typ) `[%| ["branch is not supported by partial inference" ~]]
7808 ?. ?=(%union -.typ) `[%| ["branch is not supported by partial inference" ~]]
7536− =/ cases=(list itype) cases.typ
7809+ =/ live=(unit (list itype)) (itype-live-cases cases.typ sub.state.p.subject caps.state.p.subject 4.096)
7810+ ?~ live ~
7811+ =/ cases=(list itype) u.live
7537 =/ remaining=(list itype) cases
7812 =/ remaining=(list itype) cases
7538 =/ arms=(list arm) arms.e
7813 =/ arms=(list arm) arms.e
7539 =/ st=istate state.p.subject
7814 =/ st=istate state.p.subject
@@ -7570,7 +7845,9 @@
7570 ?: ?=(%| -.subject) `subject
7845 ?: ?=(%| -.subject) `subject
7571 =/ typ=itype (itype-normalize typ.p.subject sub.state.p.subject)
7846 =/ typ=itype (itype-normalize typ.p.subject sub.state.p.subject)
7572 ?. ?=(%union -.typ) `[%| ["branch is not supported by partial inference" ~]]
7847 ?. ?=(%union -.typ) `[%| ["branch is not supported by partial inference" ~]]
7573− =/ cases=(list itype) cases.typ
7848+ =/ live=(unit (list itype)) (itype-live-cases cases.typ sub.state.p.subject caps.state.p.subject 4.096)
7849+ ?~ live ~
7850+ =/ cases=(list itype) u.live
7574 =/ remaining=(list itype) cases
7851 =/ remaining=(list itype) cases
7575 =/ arms=(list arm) arms.e
7852 =/ arms=(list arm) arms.e
7576 =/ st=istate state.p.subject
7853 =/ st=istate state.p.subject
@@ -7614,7 +7891,9 @@
7614 ?: ?=(%| -.subject) subject
7891 ?: ?=(%| -.subject) subject
7615 =/ typ=itype (itype-normalize typ.p.subject sub.state.p.subject)
7892 =/ typ=itype (itype-normalize typ.p.subject sub.state.p.subject)
7616 ?. ?=(%union -.typ) [%| ["branch is not supported by partial inference" ~]]
7893 ?. ?=(%union -.typ) [%| ["branch is not supported by partial inference" ~]]
7894+ =/ live=(unit (list itype)) (itype-live-cases cases.typ sub.state.p.subject caps.state.p.subject 4.096)
7895+ ?~ live [%| ["union emptiness needs unsupported inference" ~]]
7617− =/ expanded=(unit (list ifinite)) (finite-cases cases.typ ~ 0)
7896+ =/ expanded=(unit (list ifinite)) (finite-cases u.live ~ 0)
7618 ?~ expanded [%| ["union pattern expansion needs unsupported inference" ~]]
7897 ?~ expanded [%| ["union pattern expansion needs unsupported inference" ~]]
7619 =/ cases=(list ifinite) u.expanded
7898 =/ cases=(list ifinite) u.expanded
7620 =/ remaining=(list ifinite) cases
7899 =/ remaining=(list ifinite) cases
@@ -7735,9 +8014,65 @@
7735 =/ cell=itype [%cell [%face head.typ [%atom aura.typ]] [%face tail.typ typ]]
8014 =/ cell=itype [%cell [%face head.typ [%atom aura.typ]] [%face tail.typ typ]]
7736 [%& [%union ~[nil cell] ~ ~ ~] state.p.subject(jrec-fuel (dec jrec-fuel.state.p.subject))]
8015 [%& [%union ~[nil cell] ~ ~ ~] state.p.subject(jrec-fuel (dec jrec-fuel.state.p.subject))]
7737::
8016::
8017+:: A bounded source-proven tree match permits flat tag patterns and
8018+:: nonbinding catch-alls. Whole-case binders cannot consume the temporary
8019+:: structural view. Pattern count and field arity are checked first.
8020+++ grec-simple-pattern
8021+ |= [pat=pattern view=itype]
8022+ ^- ?
8023+ ?. ?=(%cell -.pat) |
8024+ ?~ items.pat |
8025+ =/ first=pattern i.items.pat
8026+ ?. ?=(%lit -.first) |
8027+ ?. =(%term form.lit.first) |
8028+ =/ chosen=(unit itype) (contextual-tagged-case view val.lit.first ~)
8029+ ?~ chosen |
8030+ ?> ?=(%cell -.u.chosen)
8031+ =/ rest=(list pattern) t.items.pat
8032+ =/ arity=? ?:(?=(%cell -.tal.u.chosen) ?=([* [* ~]] rest) ?=([* ~] rest))
8033+ ?. arity |
8034+ (levy rest |=(p=pattern |(?=(%bind -.p) ?=(%any -.p))))
8035+::
8036+:: A catch-all with no binder is safe even when it covers both cases.
8037+:: A bound whole case still declines to avoid exporting the analysis view.
8038+++ grec-patterns-eligible
8039+ |= [arms=(list arm) view=itype left=@ud]
8040+ ^- ?
8041+ ?~ arms &
8042+ ?: =(0 left) |
8043+ =/ pat=pattern pat.i.arms
8044+ ?. |(?=(%any -.pat) (grec-simple-pattern pat view)) |
8045+ $(arms t.arms, left (dec left))
8046+++ grec-match-view
8047+ |= [e=expr subject=iresult]
8048+ ^- iresult
8049+ ?: ?=(%| -.subject) subject
8050+ ?. ?=(%branch -.e) subject
8051+ ?. (grec-direct-context typ.p.subject sub.state.p.subject) subject
8052+ =/ typ=itype (itype-normalize typ.p.subject sub.state.p.subject)
8053+ ?. ?=(%grec -.typ) subject
8054+ ?~ arms.e subject
8055+ =/ view=(unit [view=itype left=@ud]) (grec-unfold-view typ jrec-fuel.state.p.subject)
8056+ ?~ view [%| ["recursive mold unfolding needs unsupported inference" ~]]
8057+ ?. (grec-patterns-eligible arms.e view.u.view 128) subject
8058+ [%& view.u.view state.p.subject(jrec-fuel left.u.view)]
8059+::
8060+:: A single-arm diagnostic only probes a direct, source-typed in-scope wing;
8061+:: other subjects retain the prior single-pattern inference path.
8062+++ grec-single-wing-subject
8063+ |= [e=expr env=ienv state=istate]
8064+ ^- (unit iresult)
8065+ ?. ?=(%wing -.e) ~
8066+ ?. ?=([@ ~] names.e) ~
8067+ =/ scheme=(unit ischeme) (ienv-lookup i.names.e env)
8068+ ?~ scheme ~
8069+ ?. (grec-direct-context typ.u.scheme sub.state) ~
8070+ `(infer-fragment e env state)
8071+::
7738++ infer-known-union-branch-subject
8072++ infer-known-union-branch-subject
7739 |= [e=expr env=ienv subject=iresult]
8073 |= [e=expr env=ienv subject=iresult]
7740 ^- iresult
8074 ^- iresult
8075+ =. subject (grec-match-view e subject)
7741 =. subject (jrec-match-view e subject)
8076 =. subject (jrec-match-view e subject)
7742 =/ whole=(unit iresult) (infer-known-union-whole e env subject)
8077 =/ whole=(unit iresult) (infer-known-union-whole e env subject)
7743 ?~ whole (infer-known-union-finite e env subject ~)
8078 ?~ whole (infer-known-union-finite e env subject ~)
@@ -7752,6 +8087,7 @@
7752++ infer-known-union-context-subject
8087++ infer-known-union-context-subject
7753 |= [e=expr expected=itype env=ienv subject=iresult context=span]
8088 |= [e=expr expected=itype env=ienv subject=iresult context=span]
7754 ^- iresult
8089 ^- iresult
8090+ =. subject (grec-match-view e subject)
7755 =. subject (jrec-match-view e subject)
8091 =. subject (jrec-match-view e subject)
7756 =/ whole=(unit iresult) (infer-known-union-context-whole e expected env subject context)
8092 =/ whole=(unit iresult) (infer-known-union-context-whole e expected env subject context)
7757 ?~ whole (infer-known-union-finite e env subject `[expected context])
8093 ?~ whole (infer-known-union-finite e env subject `[expected context])
@@ -7804,9 +8140,67 @@
7804 =/ subject=iresult (infer-fragment e env state)
8140 =/ subject=iresult (infer-fragment e env state)
7805 ?: ?=(%| -.subject) ?:((union-subject-call e) `subject ~)
8141 ?: ?=(%| -.subject) ?:((union-subject-call e) `subject ~)
7806 =/ typ=itype (itype-normalize typ.p.subject sub.state.p.subject)
8142 =/ typ=itype (itype-normalize typ.p.subject sub.state.p.subject)
7807− ?. |(?=(%union -.typ) ?=(%jrec -.typ)) ~
8143+ ?. |(?=(%union -.typ) ?=(%jrec -.typ) &(?=(%grec -.typ) (grec-direct-context typ.p.subject sub.state.p.subject))) ~
7808 `subject
8144 `subject
7809::
8145::
8146+:: A direct wing with an already-known union may skip genuinely empty cases
8147+:: when checking a one-arm match. Other subjects keep their existing path.
8148+:: A directly known canonical list of an empty element contains only null.
8149+:: This helper never refines an opaque or variable-bound subject.
8150+++ empty-list-null-branch
8151+ |= [e=expr env=ienv state=istate expected=(unit [typ=itype context=span])]
8152+ ^- (unit iresult)
8153+ ?. ?=(%branch -.e) ~
8154+ ?~ arms.e ~
8155+ ?^ t.arms.e ~
8156+ ?. (unit-empty-pattern pat.i.arms.e) ~
8157+ ?. ?=(%wing -.subject.e) ~
8158+ ?. ?=([@ ~] names.subject.e) ~
8159+ =/ scheme=(unit ischeme) (ienv-lookup i.names.subject.e env)
8160+ ?~ scheme ~
8161+ ?. ?=(%collection -.typ.u.scheme) ~
8162+ ?. =(%list name.typ.u.scheme) ~
8163+ ?~ prelude.state ~
8164+ ?. =(at.u.prelude.state /lib/jibb/prelude/jibb) ~
8165+ =/ standard=(unit ischeme) (find-jibb-mold %list u.prelude.state)
8166+ ?~ standard ~
8167+ ?. =(u.standard [[%collection %list ~[[%var 0]]] ~[0]]) ~
8168+ =/ subject=iresult (infer-fragment subject.e env state)
8169+ ?: ?=(%| -.subject) ~
8170+ =/ typ=itype (itype-normalize typ.p.subject sub.state.p.subject)
8171+ ?. ?=(%collection -.typ) ~
8172+ ?. =(%list name.typ) ~
8173+ ?~ args.typ ~
8174+ ?^ t.args.typ ~
8175+ =/ proof=(unit [empty=? left=@ud]) (itype-empty-proof i.args.typ sub.state.p.subject 256)
8176+ ?~ proof ~
8177+ ?. empty.u.proof ~
8178+ ?~ expected `(infer-fragment val.i.arms.e env state.p.subject)
8179+ =/ body=iresult (infer-call-context-arg val.i.arms.e typ.u.expected env state.p.subject context.u.expected)
8180+ ?: ?=(%| -.body) `body
8181+ =/ fit=ifit (itype-fit typ.p.body typ.u.expected sub.state.p.body next.state.p.body)
8182+ ?: ?=(%unknown -.fit) `[%| ["single-case branch result constraint is not supported by partial inference" ~]]
8183+ ?: ?=(%bad -.fit) `[%| ["single-case branch arm does not fit its expected type" ~[[context.u.expected "expected type"] [(span-of val.i.arms.e) "branch arm"]]]]
8184+ ?: (itype-has-tag (itype-normalize typ.u.expected sub.fit))
8185+ `[%| ["single-case branch result needs context in partial inference" ~]]
8186+ `[%& typ.p.body state.p.body(sub sub.fit, next next.fit)]
8187+::
8188+++ known-empty-union-wing
8189+ |= [e=expr env=ienv state=istate]
8190+ ^- (unit iresult)
8191+ ?. ?=(%wing -.e) ~
8192+ ?. ?=([@ ~] names.e) ~
8193+ =/ scheme=(unit ischeme) (ienv-lookup i.names.e env)
8194+ ?~ scheme ~
8195+ ?. (contextual-direct-union typ.u.scheme) ~
8196+ =/ subject=iresult (infer-fragment e env state)
8197+ ?: ?=(%| -.subject) ~
8198+ =/ typ=itype (itype-normalize typ.p.subject sub.state.p.subject)
8199+ ?. ?=(%union -.typ) ~
8200+ =/ live=(unit (list itype)) (itype-live-cases cases.typ sub.state.p.subject caps.state.p.subject 4.096)
8201+ ?~ live ~
8202+ ?: =(u.live cases.typ) ~
8203+ `subject
7810::
8204::
7811:: Infer changes only against a fully known record spine. Retain the
8205:: Infer changes only against a fully known record spine. Retain the
7812:: target type; unknown spines and repeated edits remain unsupported.
8206:: target type; unknown spines and repeated edits remain unsupported.
@@ -8051,7 +8445,10 @@
8051 =/ traced=iresult $(e val.e)
8445 =/ traced=iresult $(e val.e)
8052 ?: ?=(%| -.traced) traced
8446 ?: ?=(%| -.traced) traced
8053 $(e then.e, state state.p.traced)
8447 $(e then.e, state state.p.traced)
8448+ %tuple
8449+ ?: &(?=(^ defer.state) ?=(^ prelude.state))
8450+ (dg-infer-tuple-items items.e env state)
8054− %tuple (infer-simple-items items.e env state)
8451+ (infer-simple-items items.e env state)
8055 %body
8452 %body
8056 ?~ defs.e $(e final.e)
8453 ?~ defs.e $(e final.e)
8057 =/ local-names=(list term) (global-value-names defs.e)
8454 =/ local-names=(list term) (global-value-names defs.e)
@@ -8074,8 +8471,15 @@
8074 ?: ?=(%| -.result) result
8471 ?: ?=(%| -.result) result
8075 [%& typ.p.result state.p.result(globals globals.state, molds molds.state)]
8472 [%& typ.p.result state.p.result(globals globals.state, molds molds.state)]
8076 %branch
8473 %branch
8474+ ?^ defer.state (dg-boolean-branch e env state)
8077 ?~ arms.e [%| ["branch is not supported by partial inference" ~]]
8475 ?~ arms.e [%| ["branch is not supported by partial inference" ~]]
8078 ?~ t.arms.e
8476 ?~ t.arms.e
8477+ =/ empty-list=(unit iresult) (empty-list-null-branch e env state ~)
8478+ ?^ empty-list u.empty-list
8479+ =/ empty-union=(unit iresult) (known-empty-union-wing subject.e env state)
8480+ ?^ empty-union (infer-known-union-branch-subject e env u.empty-union)
8481+ =/ single=(unit iresult) (grec-single-wing-subject subject.e env state)
8482+ ?^ single (infer-known-union-branch-subject e env u.single)
8079 ?: (single-structured-pattern e) (infer-single-case-branch e env state ~)
8483 ?: (single-structured-pattern e) (infer-single-case-branch e env state ~)
8080 (infer-cell-branch e env state ~)
8484 (infer-cell-branch e env state ~)
8081 ?^ t.t.arms.e (infer-known-union-branch e env state)
8485 ?^ t.t.arms.e (infer-known-union-branch e env state)
@@ -8143,6 +8547,8 @@
8143 =/ nested=(unit idiag) (nested-missing-tag val.e typ.p.value typ.u.target sub.state.p.value next.state.p.value at.shape.e)
8547 =/ nested=(unit idiag) (nested-missing-tag val.e typ.p.value typ.u.target sub.state.p.value next.state.p.value at.shape.e)
8144 ?^ nested [%| u.nested]
8548 ?^ nested [%| u.nested]
8145 [%| ["cast mold and expression type do not unify" ~[[at.shape.e (site-type-note "cast mold" typ.u.target sub.state.p.value)] [(span-of val.e) (site-type-note "expression" typ.p.value sub.state.p.value)]]]]
8549 [%| ["cast mold and expression type do not unify" ~[[at.shape.e (site-type-note "cast mold" typ.u.target sub.state.p.value)] [(span-of val.e) (site-type-note "expression" typ.p.value sub.state.p.value)]]]]
8550+ ?: &(?=(^ defer.state.p.value) !(dg-stable-fit typ.p.value typ.u.target sub.fit))
8551+ [%| ["deferred cast fit needs stable inference" ~]]
8146 =/ merged=itype (itype-merge-faces typ.p.value typ.u.target sub.fit)
8552 =/ merged=itype (itype-merge-faces typ.p.value typ.u.target sub.fit)
8147 [%& merged state.p.value(sub sub.fit, next next.fit)]
8553 [%& merged state.p.value(sub sub.fit, next next.fit)]
8148 %crash [%& [%var next.state] state(next +(next.state))]
8554 %crash [%& [%var next.state] state(next +(next.state))]
@@ -8192,6 +8598,234 @@
8192 ?: ?=(%| -.out) [%| p.out]
8598 ?: ?=(%| -.out) [%| p.out]
8193 [%& [e typ.p.out sub.state.p.out (flop projections.state.p.out)]]
8599 [%& [e typ.p.out sub.state.p.out (flop projections.state.p.out)]]
8194::
8600::
8601+:: Source-bound gate-layout evidence, confined to checked root gate
8602+:: definitions and direct unshadowed prelude calls. The prepared prelude
8603+:: interface and its retained source are trusted as a matching artifact.
8604+:: Layouts identify sample binder faces; they do not change call arity or
8605+:: authorize stripping nested value faces. Unknown origins use ordinary fit.
8606+++ direct-written-gates
8607+ |= [ds=(list def) out=ivisited]
8608+ ^- ivisited
8609+ ?~ ds out
8610+ ?: ?=(%mold -.i.ds) $(ds t.ds)
8611+ ?. |(?=(%gate -.val.i.ds) ?=(%gate-wide -.val.i.ds)) $(ds t.ds)
8612+ $(ds t.ds, out (~(put by out) name.i.ds &))
8613+++ direct-may-use-prelude
8614+ |= [ds=(list def) root=ivisited heads=ivisited]
8615+ ^- ?
8616+ ?~ ds |
8617+ ?: ?=(%mold -.i.ds) $(ds t.ds)
8618+ =/ refs=(list term) (dependency-expr val.i.ds)
8619+ =/ has-root=? (lien refs |=(n=term ?=(^ (~(get by root) n))))
8620+ =/ has-head=? (lien refs |=(n=term ?=(^ (~(get by heads) n))))
8621+ ?: &(has-root has-head) &
8622+ $(ds t.ds)
8623+++ direct-unique-names
8624+ |= [names=(list term) seen=ivisited]
8625+ ^- ?
8626+ ?~ names &
8627+ ?: ?=(^ (~(get by seen) i.names)) |
8628+ $(names t.names, seen (~(put by seen) i.names &))
8629+++ direct-prelude-evidence
8630+ |= [ds=(list def) prelude=(unit ifile)]
8631+ ^- (unit igate-prelude-evidence)
8632+ ?~ prelude ~
8633+ ?~ source.u.prelude ~
8634+ =/ root=ivisited (direct-written-gates ds ~)
8635+ =/ names=(list term) (turn values.u.prelude |=(e=[name=term scheme=ischeme] name.e))
8636+ =/ heads=ivisited (graph-nameset names ~)
8637+ ?. (direct-may-use-prelude ds root heads) ~
8638+ =/ parsed (parse at.u.prelude u.source.u.prelude)
8639+ ?: ?=(%| -.parsed) ~
8640+ ?^ (duplicate-defs defs.p.parsed) ~
8641+ ?. (direct-unique-names (global-value-names defs.p.parsed) ~) ~
8642+ =/ gates=(map term def) (direct-checked-gates defs.p.parsed values.u.prelude)
8643+ `[u.prelude gates]
8644+++ direct-checked-gates
8645+ |= [ds=(list def) env=ienv]
8646+ ^- (map term def)
8647+ =/ names=(list term) (turn env |=(e=[name=term scheme=ischeme] name.e))
8648+ =/ known=ivisited (graph-nameset names ~)
8649+ =/ out=(map term def) ~
8650+ |-
8651+ ?~ ds out
8652+ =/ d=def i.ds
8653+ ?: ?=(%mold -.d) $(ds t.ds)
8654+ ?. ?=(^ (~(get by known) name.d)) $(ds t.ds)
8655+ ?. |(?=(%gate -.val.d) ?=(%gate-wide -.val.d)) $(ds t.ds)
8656+ $(ds t.ds, out (~(put by out) name.d d))
8657+++ direct-find-gate
8658+ |= [n=term ds=(list def)]
8659+ ^- (unit def)
8660+ ?~ ds ~
8661+ ?: &(?=(%value -.i.ds) =(n name.i.ds)) `i.ds
8662+ $(ds t.ds)
8663+++ direct-gate-sample
8664+ |= d=def
8665+ ^- (unit sample)
8666+ ?. ?=(%value -.d) ~
8667+ ?- -.val.d
8668+ %gate `sample.val.d
8669+ %gate-wide `sample.val.d
8670+ * ~
8671+ ==
8672+++ direct-sample-name
8673+ |= sam=sample
8674+ ^- (unit term)
8675+ ?- -.sam
8676+ %bind `name.sam
8677+ %face `name.sam
8678+ %pun `name.sam
8679+ * ~
8680+ ==
8681+++ direct-field-name
8682+ |= f=field
8683+ ^- (unit term)
8684+ ?- -.f
8685+ %face `name.f
8686+ %pun `name.f
8687+ * ~
8688+ ==
8689+++ direct-slot-body
8690+ |= [typ=itype name=(unit term)]
8691+ ^- (unit itype)
8692+ ?~ name `typ
8693+ ?. ?=(%face -.typ) ~
8694+ ?. =(name.typ u.name) ~
8695+ `body.typ
8696+++ direct-invariant
8697+ |= [a=itype b=itype sub=isub next=@ud]
8698+ ^- ifit
8699+ ?: (itype-face-asym a b sub) [%unknown ~]
8700+ =/ forward=ifit (itype-fit a b sub next)
8701+ ?. ?=(%ok -.forward) [%unknown ~]
8702+ ?: (itype-face-asym a b sub.forward) [%unknown ~]
8703+ =/ reverse=ifit (itype-fit b a sub.forward next.forward)
8704+ ?. ?=(%ok -.reverse) [%unknown ~]
8705+ reverse
8706+++ direct-function-fit
8707+ |= [a=itype b=itype sam=sample sh=shape sub=isub next=@ud]
8708+ ^- ifit
8709+ ?. &(?=(%fn -.a) ?=(%fn -.b) ?=(%cell -.sam) ?=(%fn -.sh)) [%unknown ~]
8710+ ?. ?=(%cell -.sample.sh) [%unknown ~]
8711+ =/ as=(list sample) items.sam
8712+ =/ bs=(list field) fields.sample.sh
8713+ ?~ as [%unknown ~]
8714+ ?~ t.as [%unknown ~]
8715+ ?^ t.t.as [%unknown ~]
8716+ ?~ bs [%unknown ~]
8717+ ?~ t.bs [%unknown ~]
8718+ ?^ t.t.bs [%unknown ~]
8719+ ?. &(?=(%cell -.sample.a) ?=(%cell -.sample.b)) [%unknown ~]
8720+ =/ an=(unit term) (direct-sample-name i.as)
8721+ =/ bn=(unit term) (direct-field-name i.bs)
8722+ ?: &(?=(^ an) ?=(^ bn) !=(u.an u.bn)) [%unknown ~]
8723+ =/ x=(unit itype) (direct-slot-body hed.sample.a an)
8724+ =/ y=(unit itype) (direct-slot-body hed.sample.b bn)
8725+ ?~ x [%unknown ~]
8726+ ?~ y [%unknown ~]
8727+ =/ first=ifit (direct-invariant u.x u.y sub next)
8728+ ?. ?=(%ok -.first) [%unknown ~]
8729+ =. an (direct-sample-name i.t.as)
8730+ =. bn (direct-field-name i.t.bs)
8731+ ?: &(?=(^ an) ?=(^ bn) !=(u.an u.bn)) [%unknown ~]
8732+ =/ x2=(unit itype) (direct-slot-body tal.sample.a an)
8733+ =/ y2=(unit itype) (direct-slot-body tal.sample.b bn)
8734+ ?~ x2 [%unknown ~]
8735+ ?~ y2 [%unknown ~]
8736+ =/ second=ifit (direct-invariant u.x2 u.y2 sub.first next.first)
8737+ ?. ?=(%ok -.second) [%unknown ~]
8738+ (direct-invariant product.a product.b sub.second next.second)
8739+:: This is a tentative proof: its caller must require closed call samples
8740+:: and repeat every positional check under the stable final substitution.
8741+++ direct-positional-fit
8742+ |= [args=(list expr) slots=(list sample) actual=itype expected=itype env=ienv state=istate sub=isub next=@ud]
8743+ ^- ifit
8744+ ?~ args [%unknown ~]
8745+ ?~ slots [%unknown ~]
8746+ =/ last=? ?=(~ t.args)
8747+ ?: !=(last ?=(~ t.slots)) [%unknown ~]
8748+ =/ split=(unit [left=itype right=itype])
8749+ ?: last `[actual expected]
8750+ ?. &(?=(%cell -.actual) ?=(%cell -.expected)) ~
8751+ `[hed.actual hed.expected]
8752+ ?~ split [%unknown ~]
8753+ =/ x=itype left.u.split
8754+ =/ y=itype right.u.split
8755+ =/ expected-name=(unit term) (direct-sample-name i.slots)
8756+ =/ expected-body=(unit itype) (direct-slot-body y expected-name)
8757+ ?~ expected-body [%unknown ~]
8758+ =. y u.expected-body
8759+ =/ fit=ifit (itype-fit x y sub next)
8760+ =/ accepted=? &(?=(%ok -.fit) !(itype-positional-slot-face-asym x y sub.fit))
8761+ =/ result=(unit ifit)
8762+ ?: accepted `fit
8763+ ?. &(?=(%face -.i.slots) ?=(%fn -.shape.i.slots)) ~
8764+ ?. ?=(%wing -.i.args) ~
8765+ ?. ?=([@ ~] names.i.args) ~
8766+ ?. (unique-value-name i.names.i.args globals.state) ~
8767+ =/ source=(unit def) (~(get by gate-defs.state) i.names.i.args)
8768+ ?~ source ~
8769+ =/ sample=(unit sample) (direct-gate-sample u.source)
8770+ ?~ sample ~
8771+ =/ trial=ifit (direct-function-fit x y u.sample shape.i.slots sub next)
8772+ ?. ?=(%ok -.trial) ~
8773+ `trial
8774+ ?~ result [%unknown ~]
8775+ =. fit u.result
8776+ ?: last fit
8777+ ?. &(?=(%cell -.actual) ?=(%cell -.expected)) [%unknown ~]
8778+ ?. ?=(%ok -.fit) [%unknown ~]
8779+ $(args t.args, slots t.slots, actual tal.actual, expected tal.expected, sub sub.fit, next next.fit)
8780+++ direct-any-gate-arg
8781+ |= [args=(list expr) defs=(map term def)]
8782+ ^- ?
8783+ ?~ args |
8784+ =/ found=?
8785+ ?. ?=(%wing -.i.args) |
8786+ ?. ?=([@ ~] names.i.args) |
8787+ ?=(^ (~(get by defs) i.names.i.args))
8788+ ?: found &
8789+ $(args t.args)
8790+++ direct-gate-call-fit
8791+ |= [e=expr actual=itype expected=itype env=ienv state=istate]
8792+ ^- (unit ifit)
8793+ ?. ?=(%call -.e) ~
8794+ ?~ args.e ~
8795+ ?~ t.args.e ~
8796+ ?. &(?=(%cell -.actual) ?=(%cell -.expected)) ~
8797+ ?. ?=(%wing -.head.e) ~
8798+ ?. ?=([@ ~] names.head.e) ~
8799+ ?. ?=(~ (ienv-lookup i.names.head.e env)) ~
8800+ ?. (unique-value-name i.names.head.e globals.state) ~
8801+ ?. (direct-any-gate-arg args.e gate-defs.state) ~
8802+ ?~ prelude.state ~
8803+ ?~ source.u.prelude.state ~
8804+ ?~ head-evidence.state ~
8805+ ?. =(u.prelude.state iface.u.head-evidence.state) ~
8806+ ?. ?=(^ (ienv-lookup i.names.head.e values.u.prelude.state)) ~
8807+ =/ head=(unit def) (~(get by gates.u.head-evidence.state) i.names.head.e)
8808+ ?~ head ~
8809+ =/ sam=(unit sample) (direct-gate-sample u.head)
8810+ ?~ sam ~
8811+ ?. ?=(%cell -.u.sam) ~
8812+ =/ fit=ifit (direct-positional-fit args.e items.u.sam actual expected env state sub.state next.state)
8813+ ?. ?=(%ok -.fit) ~
8814+ :: Enclosing inference may add constraints after this call. Only a
8815+ :: closed call-sample proof can remain stable under those later bindings.
8816+ =/ actual-final=itype (itype-normalize actual sub.fit)
8817+ =/ expected-final=itype (itype-normalize expected sub.fit)
8818+ ?^ (itype-vars actual-final) ~
8819+ ?^ (itype-vars expected-final) ~
8820+ ?: |((itype-has-tag actual-final) (itype-has-tag expected-final)) ~
8821+ :: A later argument may resolve a variable used by an earlier slot.
8822+ :: Recheck every fit and face against the completed substitution; no
8823+ :: additional binding or fresh variable is permitted in the second pass.
8824+ =/ verified=ifit (direct-positional-fit args.e items.u.sam actual expected env state sub.fit next.fit)
8825+ ?. ?=(%ok -.verified) ~
8826+ ?. &(=(sub.fit sub.verified) =(next.fit next.verified)) ~
8827+ `fit
8828+::
8195++ infer-call-with-head
8829++ infer-call-with-head
8196 |= [e=expr env=ienv state=istate head=iresult]
8830 |= [e=expr env=ienv state=istate head=iresult]
8197 ^- iresult
8831 ^- iresult
@@ -8218,7 +8852,17 @@
8218 =/ fit=ifit
8852 =/ fit=ifit
8219 ?^ t.args.e (itype-fit-inner typ.p.arg sample.ht sub.st next.st & |)
8853 ?^ t.args.e (itype-fit-inner typ.p.arg sample.ht sub.st next.st & |)
8220 (itype-fit typ.p.arg sample.ht sub.st next.st)
8854 (itype-fit typ.p.arg sample.ht sub.st next.st)
8855+ =/ direct=(unit ifit)
8856+ ?: ?=(%ok -.fit) ~
8857+ (direct-gate-call-fit e typ.p.arg sample.ht env st)
8858+ =. fit ?~(direct fit u.direct)
8859+ ?: ?=(%unknown -.fit)
8221− ?: ?=(%unknown -.fit) [%| ["call constraint is not supported by partial inference" ~]]
8860+ ?~ defer.st [%| ["call constraint is not supported by partial inference" ~]]
8861+ =/ edge=(unit dgo) (dg-eligible-ctor e typ.p.head typ.p.arg sample.ht st)
8862+ ?~ edge [%| ["call constraint is not supported by partial inference" ~]]
8863+ ?: (gth (lent obligations.st) 63) [%| ["call constraint is not supported by partial inference" ~]]
8864+ [%& product.ht st(obligations [u.edge obligations.st])]
8865+
8222 ?: ?=(%bad -.fit)
8866 ?: ?=(%bad -.fit)
8223 ?~ t.args.e
8867 ?~ t.args.e
8224 =/ missing=(unit idiag) (missing-union-tag i.args.e sample.ht sub.st (span-of head.e))
8868 =/ missing=(unit idiag) (missing-union-tag i.args.e sample.ht sub.st (span-of head.e))
@@ -8233,7 +8877,10 @@
8233 =/ arg-at=span ?~(bad whole-args at.u.bad)
8877 =/ arg-at=span ?~(bad whole-args at.u.bad)
8234 =/ arg-type=itype ?~(bad typ.p.arg typ.u.bad)
8878 =/ arg-type=itype ?~(bad typ.p.arg typ.u.bad)
8235 [%| ["call's sample and argument types do not unify" ~[[(span-of head.e) (site-type-note "called gate" ht sub.st)] [arg-at (site-type-note "argument" arg-type sub.st)]]]]
8879 [%| ["call's sample and argument types do not unify" ~[[(span-of head.e) (site-type-note "called gate" ht sub.st)] [arg-at (site-type-note "argument" arg-type sub.st)]]]]
8880+ ?: &(?=(^ defer.st) !(dg-stable-call-fit typ.p.arg sample.ht product.ht sub.fit ?=(^ t.args.e)))
8881+ [%| ["deferred call fit needs stable inference" ~]]
8236 =/ face-asym=?
8882 =/ face-asym=?
8883+ ?^ direct |
8237 ?^ t.args.e (itype-positional-face-asym args.e typ.p.arg sample.ht sub.fit)
8884 ?^ t.args.e (itype-positional-face-asym args.e typ.p.arg sample.ht sub.fit)
8238 (itype-face-asym typ.p.arg sample.ht sub.fit)
8885 (itype-face-asym typ.p.arg sample.ht sub.fit)
8239 ?: &((itype-has-face typ.p.arg sub.fit) face-asym (itype-output-may-be-cell product.ht sub.fit))
8886 ?: &((itype-has-face typ.p.arg sub.fit) face-asym (itype-output-may-be-cell product.ht sub.fit))
@@ -8325,7 +8972,17 @@
8325 ?~ args.result |
8972 ?~ args.result |
8326 ?. =((lent args.result) (lent args.expected)) |
8973 ?. =((lent args.result) (lent args.expected)) |
8327 ?: |((itype-has-tag (itype-normalize result sub.state.p.head)) (itype-has-tag (itype-normalize expected sub.state.p.head))) |
8974 ?: |((itype-has-tag (itype-normalize result sub.state.p.head)) (itype-has-tag (itype-normalize expected sub.state.p.head))) |
8975+ =/ result-recursive=? (itype-has-recursive (itype-normalize result sub.state.p.head))
8328− ?: |((itype-has-recursive (itype-normalize result sub.state.p.head)) (itype-has-recursive (itype-normalize expected sub.state.p.head))) |
8976+ =/ expected-recursive=? (itype-has-recursive (itype-normalize expected sub.state.p.head))
8977+ =/ result-ok=?
8978+ ?. result-recursive &
8979+ ?~ prelude.state |
8980+ &(=(at.u.prelude.state /lib/jibb/prelude/jibb) =(origin.result `[at.u.prelude.state %element]))
8981+ =/ expected-ok=?
8982+ ?. expected-recursive &
8983+ ?~ prelude.state |
8984+ &(=(at.u.prelude.state /lib/jibb/prelude/jibb) =(origin.expected `[at.u.prelude.state %element]))
8985+ ?. &(result-ok expected-ok) |
8329 ?: |((itype-has-any-atom result sub.state.p.head) (itype-has-any-atom expected sub.state.p.head)) |
8986 ?: |((itype-has-any-atom result sub.state.p.head) (itype-has-any-atom expected sub.state.p.head)) |
8330 &
8987 &
8331 ?. eligible (infer-call-with-head e env state head)
8988 ?. eligible (infer-call-with-head e env state head)
@@ -8465,6 +9122,20 @@
8465 ?: ?=(?(%cell %face %fn %union %collection) -.val.i.sub) |
9122 ?: ?=(?(%cell %face %fn %union %collection) -.val.i.sub) |
8466 $(sub t.sub)
9123 $(sub t.sub)
8467::
9124::
9125+:: Check the syntactic root before scanning; scan substitutions once.
9126+++ grec-direct-context
9127+ |= [expected=itype sub=isub]
9128+ ^- ?
9129+ =/ left=@ud 4.096
9130+ |-
9131+ ?: ?=(%face -.expected)
9132+ ?: =(0 left) |
9133+ $(expected body.expected, left (dec left))
9134+ ?. ?=(%grec -.expected) |
9135+ ?~ sub &
9136+ ?: =(0 left) |
9137+ ?: ?=(?(%cell %face %fn %union %collection %grec) -.val.i.sub) |
9138+ $(sub t.sub, left (dec left))
8468++ contextual-direct-union
9139++ contextual-direct-union
8469 |= target=itype
9140 |= target=itype
8470 ^- ?
9141 ^- ?
@@ -8489,9 +9160,112 @@
8489 $(remaining t.remaining, found `c)
9160 $(remaining t.remaining, found `c)
8490 $(remaining t.remaining)
9161 $(remaining t.remaining)
8491::
9162::
9163+:: A bounded syntactic screen: no nested branch, cast, gate or local body
9164+:: can re-enter cell-branch retry during either inference attempt.
9165+++ closed-cell-retry-safe
9166+ |= [todo=(list expr) fuel=@ud]
9167+ ^- ?
9168+ ?~ todo &
9169+ ?: =(0 fuel) |
9170+ =/ e=expr i.todo
9171+ =. fuel (dec fuel)
9172+ ?+ -.e |
9173+ %lit $(todo t.todo)
9174+ %wing $(todo t.todo)
9175+ %ctor $(todo t.todo)
9176+ %path $(todo t.todo)
9177+ %crash $(todo t.todo)
9178+ %str
9179+ ?. (levy pieces.e |=(p=piece ?=(%text -.p))) |
9180+ $(todo t.todo)
9181+ %group $(todo [inner.e t.todo])
9182+ %pair $(todo [val.e t.todo])
9183+ %unit $(todo [val.e t.todo])
9184+ %list $(todo (weld items.e t.todo))
9185+ %tuple $(todo (weld (turn items.e |=(i=item val.i)) t.todo))
9186+ %change $(todo (weld (turn edits.e |=(ed=edit val.ed)) t.todo))
9187+ %call $(todo [head.e (weld args.e t.todo)])
9188+ %trace $(todo [val.e then.e t.todo])
9189+ ==
9190+::
9191+++ closed-cell-sub-safe
9192+ |= [sub=isub fuel=@ud]
9193+ ^- ?
9194+ ?~ sub &
9195+ ?: =(0 fuel) |
9196+ ?: ?=(?(%cell %face %fn %union %collection %grec %jrec %recursive) -.val.i.sub) |
9197+ $(sub t.sub, fuel (dec fuel))
9198+::
9199+++ closed-cell-branch-eligible
9200+ |= [e=expr expected=itype sub=isub]
9201+ ^- ?
9202+ ?. &(?=(%branch -.e) ?=(%cell -.expected) (closed-cell-sub-safe sub 512)) |
9203+ ?~ arms.e |
9204+ ?~ t.arms.e |
9205+ ?^ t.t.arms.e |
9206+ =/ x=arm i.arms.e
9207+ =/ y=arm i.t.arms.e
9208+ ?. &(?=(%lit -.pat.x) ?=(%lit -.pat.y)) |
9209+ ?. &(=(%loobean form.lit.pat.x) =(%loobean form.lit.pat.y)) |
9210+ ?: =(val.lit.pat.x val.lit.pat.y) |
9211+ (closed-cell-retry-safe ~[subject.e val.x val.y] 512)
9212+::
9213+:: Attempt ordinary inference first; retry from the same state only for
9214+:: the bounded non-reentrant syntax above. Preserve original value faces.
9215+++ infer-closed-cell-branch
9216+ |= [e=expr expected=itype env=ienv state=istate context=span]
9217+ ^- iresult
9218+ ?> (closed-cell-branch-eligible e expected sub.state)
9219+ ?> ?=(%branch -.e)
9220+ ?> ?=(^ arms.e)
9221+ ?> ?=(^ t.arms.e)
9222+ =/ ordinary=iresult (infer-fragment e env state)
9223+ =/ ordinary-good=?
9224+ ?: ?=(%| -.ordinary) |
9225+ =/ fit=ifit (itype-fit typ.p.ordinary expected sub.state.p.ordinary next.state.p.ordinary)
9226+ ?=(%ok -.fit)
9227+ ?: ordinary-good ordinary
9228+ =/ attempt=(unit iresult)
9229+ =/ x=arm i.arms.e
9230+ =/ y=arm i.t.arms.e
9231+ =/ subject=iresult (infer-fragment subject.e env state)
9232+ ?: ?=(%| -.subject) ~
9233+ =/ subject-type=itype (itype-normalize typ.p.subject sub.state.p.subject)
9234+ ?: ?=(%union -.subject-type) ~
9235+ =/ su=(unit isub) (itype-unify typ.p.subject [%flag ~] sub.state.p.subject)
9236+ ?~ su ~
9237+ =/ left=iresult (infer-call-context-arg val.x expected env state.p.subject(sub u.su) context)
9238+ ?: ?=(%| -.left) ~
9239+ =/ lf=ifit (itype-fit typ.p.left expected sub.state.p.left next.state.p.left)
9240+ ?. ?=(%ok -.lf) ~
9241+ =/ right=iresult (infer-call-context-arg val.y expected env state.p.left(sub sub.lf, next next.lf) context)
9242+ ?: ?=(%| -.right) ~
9243+ =/ rf=ifit (itype-fit typ.p.right expected sub.state.p.right next.state.p.right)
9244+ ?. ?=(%ok -.rf) ~
9245+ =/ sub=isub sub.rf
9246+ =/ next=@ud next.rf
9247+ =/ lt=itype (itype-normalize typ.p.left sub)
9248+ =/ rt=itype (itype-normalize typ.p.right sub)
9249+ =/ et=itype (itype-normalize expected sub)
9250+ ?. =(lt rt) ~
9251+ ?: |(?=(^ (itype-vars lt)) ?=(^ (itype-vars rt)) ?=(^ (itype-vars et))) ~
9252+ ?: |((itype-has-tag lt) (itype-has-tag rt) (itype-has-tag et)) ~
9253+ =/ lcheck=ifit (itype-fit typ.p.left expected sub next)
9254+ ?. ?=(%ok -.lcheck) ~
9255+ ?. &(=(sub.lcheck sub) =(next.lcheck next)) ~
9256+ =/ rcheck=ifit (itype-fit typ.p.right expected sub next)
9257+ ?. ?=(%ok -.rcheck) ~
9258+ ?. &(=(sub.rcheck sub) =(next.rcheck next)) ~
9259+ `[%& typ.p.left state.p.right(sub sub, next next)]
9260+ ?~ attempt ordinary
9261+ u.attempt
9262+::
8492++ infer-call-context-arg
9263++ infer-call-context-arg
8493 |= [e=expr expected=itype env=ienv state=istate context=span]
9264 |= [e=expr expected=itype env=ienv state=istate context=span]
8494 ^- iresult
9265 ^- iresult
9266+ ?: &(?=(^ defer.state) ?=(%branch -.e)) (infer-fragment e env state)
9267+ ?: &(?=(^ defer.state) ?=(^ prelude.state) ?=(%tuple -.e))
9268+ (infer-fragment e env state)
8495 ?: ?=(%pair -.e) $(e (pair-as-cell e))
9269 ?: ?=(%pair -.e) $(e (pair-as-cell e))
8496 ?: ?=(%group -.e) $(e inner.e)
9270 ?: ?=(%group -.e) $(e inner.e)
8497 ?: &(?=(%body -.e) ?=(~ defs.e)) $(e final.e)
9271 ?: &(?=(%body -.e) ?=(~ defs.e)) $(e final.e)
@@ -8504,6 +9278,23 @@
8504 ?: ?=(%face -.target) $(target (itype-walk body.target sub.state))
9278 ?: ?=(%face -.target) $(target (itype-walk body.target sub.state))
8505 ?: (explicit-proj-call e env state)
9279 ?: (explicit-proj-call e env state)
8506 (infer-proj-context e expected env state context)
9280 (infer-proj-context e expected env state context)
9281+ :: Experimental construction only for a source-proven direct target.
9282+ :: Decline any walked structural binding to retain raw-variable provenance.
9283+ ?: &(?=(%grec -.target) ?=(%tuple -.e) (grec-direct-context expected sub.state))
9284+ =/ unfolded=(unit [view=itype left=@ud]) (grec-unfold-view target jrec-fuel.state)
9285+ ?~ unfolded [%| ["recursive mold unfolding needs unsupported inference" ~]]
9286+ ?~ items.e [%| ["recursive mold constructor needs unsupported inference" ~]]
9287+ =/ first=item i.items.e
9288+ ?. &(?=(~ face.first) ?=(%lit -.val.first) =(%term form.lit.val.first))
9289+ [%| ["recursive mold constructor needs unsupported inference" ~]]
9290+ =/ chosen=(unit itype) (contextual-tagged-case view.u.unfolded val.lit.val.first sub.state)
9291+ ?~ chosen [%| ["recursive mold constructor has no matching case" ~]]
9292+ =/ value=iresult (infer-call-context-items items.e u.chosen env state(jrec-fuel left.u.unfolded) context)
9293+ ?: ?=(%| -.value) value
9294+ =/ fit=ifit (itype-fit typ.p.value u.chosen sub.state.p.value next.state.p.value)
9295+ ?: ?=(%unknown -.fit) [%| ["recursive mold case needs unsupported inference" ~]]
9296+ ?: ?=(%bad -.fit) [%| ["recursive mold case does not fit its source shape" ~]]
9297+ [%& target state.p.value(sub sub.fit, next next.fit)]
8507 :: Only the source-proven one-layer cell is exposed. Each recursive
9298 :: Only the source-proven one-layer cell is exposed. Each recursive
8508 :: descent consumes one written tuple; named values use ordinary fit.
9299 :: descent consumes one written tuple; named values use ordinary fit.
8509 ?: &(?=(%jrec -.target) ?=(%lit -.e) =(%null form.lit.e))
9300 ?: &(?=(%jrec -.target) ?=(%lit -.e) =(%null form.lit.e))
@@ -8521,7 +9312,14 @@
8521 ?: ?=(%bad -.fit) [%| ["recursive mold cell does not fit its source shape" ~]]
9312 ?: ?=(%bad -.fit) [%| ["recursive mold cell does not fit its source shape" ~]]
8522 [%& target state.p.value(sub sub.fit, next next.fit)]
9313 [%& target state.p.value(sub sub.fit, next next.fit)]
8523 ?: ?=(%call -.e) (infer-contextual-call e target env state)
9314 ?: ?=(%call -.e) (infer-contextual-call e target env state)
9315+ =/ empty-list=(unit iresult) (empty-list-null-branch e env state `[target context])
9316+ ?^ empty-list u.empty-list
8524 ?: (single-structured-pattern e)
9317 ?: (single-structured-pattern e)
9318+ ?> ?=(%branch -.e)
9319+ =/ empty-union=(unit iresult) (known-empty-union-wing subject.e env state)
9320+ ?^ empty-union (infer-known-union-context-subject e target env u.empty-union context)
9321+ =/ single=(unit iresult) (grec-single-wing-subject subject.e env state)
9322+ ?^ single (infer-known-union-context-subject e target env u.single context)
8525 (infer-single-case-branch e env state `[target context])
9323 (infer-single-case-branch e env state `[target context])
8526 ?: (cell-binder-pattern e)
9324 ?: (cell-binder-pattern e)
8527 (infer-cell-branch e env state `[target context])
9325 (infer-cell-branch e env state `[target context])
@@ -8541,6 +9339,8 @@
8541 (infer-known-union-context-subject e target env u.known context)
9339 (infer-known-union-context-subject e target env u.known context)
8542 ?: &(?=(%union -.target) ?=(%unit -.e))
9340 ?: &(?=(%union -.target) ?=(%unit -.e))
8543 (infer-unit-context e target env state context)
9341 (infer-unit-context e target env state context)
9342+ ?: (closed-cell-branch-eligible e expected sub.state)
9343+ (infer-closed-cell-branch e expected env state context)
8544 ?: &(?=(%flag -.target) (context-union-branch e))
9344 ?: &(?=(%flag -.target) (context-union-branch e))
8545 (infer-union-context e target env state context)
9345 (infer-union-context e target env state context)
8546 ?: &(?=(%union -.target) (context-union-branch e))
9346 ?: &(?=(%union -.target) (context-union-branch e))
@@ -8679,7 +9479,7 @@
8679 ?~ t.names |
9479 ?~ t.names |
8680 =. typ (itype-walk typ sub)
9480 =. typ (itype-walk typ sub)
8681 ?: ?=(%cell -.typ) $(typ tal.typ, names t.names)
9481 ?: ?=(%cell -.typ) $(typ tal.typ, names t.names)
8682− |(?=(%union -.typ) ?=(%collection -.typ) ?=(%recursive -.typ) ?=(%jrec -.typ) ?=(%noun -.typ) ?=(%fn -.typ) ?=(%tag -.typ))
9482+ |(?=(%union -.typ) ?=(%collection -.typ) ?=(%recursive -.typ) ?=(%jrec -.typ) ?=(%grec -.typ) ?=(%noun -.typ) ?=(%fn -.typ) ?=(%tag -.typ))
8683::
9483::
8684++ cell-binder-pattern
9484++ cell-binder-pattern
8685 |= e=expr
9485 |= e=expr
@@ -8750,6 +9550,7 @@
8750 %any-atom "@"
9550 %any-atom "@"
8751 %flag "?"
9551 %flag "?"
8752 %noun "*"
9552 %noun "*"
9553+ %empty "!!"
8753 %tag (trip txt.literal.t)
9554 %tag (trip txt.literal.t)
8754 %const (trip txt.literal.t)
9555 %const (trip txt.literal.t)
8755 %union
9556 %union
@@ -8758,6 +9559,7 @@
8758 "({(trip u.label.t)} {(show-itype-cases args.t sub)})"
9559 "({(trip u.label.t)} {(show-itype-cases args.t sub)})"
8759 %recursive ?~(label.t "recursive mold" (trip u.label.t))
9560 %recursive ?~(label.t "recursive mold" (trip u.label.t))
8760 %jrec ?~(label.t "recursive mold" (trip u.label.t))
9561 %jrec ?~(label.t "recursive mold" (trip u.label.t))
9562+ %grec ?~(label.t "recursive mold" "({(trip u.label.t)} {(show-itype-cases args.t sub)})")
8761 %collection "({(trip name.t)} {(show-itype-cases args.t sub)})"
9563 %collection "({(trip name.t)} {(show-itype-cases args.t sub)})"
8762 %face "[{(trip name.t)}={(show-itype-context body.t sub)}]"
9564 %face "[{(trip name.t)}={(show-itype-context body.t sub)}]"
8763 %fn "$-({(show-itype-context sample.t sub)} {(show-itype-context product.t sub)})"
9565 %fn "$-({(show-itype-context sample.t sub)} {(show-itype-context product.t sub)})"
@@ -8801,11 +9603,13 @@
8801 %any-atom |
9603 %any-atom |
8802 %flag |
9604 %flag |
8803 %noun |
9605 %noun |
9606+ %empty |
8804 %tag |
9607 %tag |
8805 %const |
9608 %const |
8806 %union |((lien cases.typ |=(c=itype (itype-has-nvar c))) (lien args.typ |=(c=itype (itype-has-nvar c))))
9609 %union |((lien cases.typ |=(c=itype (itype-has-nvar c))) (lien args.typ |=(c=itype (itype-has-nvar c))))
8807 %recursive |
9610 %recursive |
8808 %jrec |
9611 %jrec |
9612+ %grec (lien args.typ |=(c=itype (itype-has-nvar c)))
8809 %collection (lien args.typ |=(c=itype (itype-has-nvar c)))
9613 %collection (lien args.typ |=(c=itype (itype-has-nvar c)))
8810 %face $(typ body.typ)
9614 %face $(typ body.typ)
8811 %fn |($(typ sample.typ) $(typ product.typ))
9615 %fn |($(typ sample.typ) $(typ product.typ))
@@ -8917,11 +9721,13 @@
8917 %any-atom |
9721 %any-atom |
8918 %flag |
9722 %flag |
8919 %noun |
9723 %noun |
9724+ %empty |
8920 %tag |
9725 %tag |
8921 %const |
9726 %const |
8922 %union |((lien cases.t |=(c=itype (has-atom-var n c))) (lien args.t |=(c=itype (has-atom-var n c))))
9727 %union |((lien cases.t |=(c=itype (has-atom-var n c))) (lien args.t |=(c=itype (has-atom-var n c))))
8923 %recursive |
9728 %recursive |
8924 %jrec |
9729 %jrec |
9730+ %grec (lien args.t |=(c=itype (has-atom-var n c)))
8925 %collection (lien args.t |=(c=itype (has-atom-var n c)))
9731 %collection (lien args.t |=(c=itype (has-atom-var n c)))
8926 %face $(t body.t)
9732 %face $(t body.t)
8927 %fn |($(t sample.t) $(t product.t))
9733 %fn |($(t sample.t) $(t product.t))
@@ -9065,6 +9871,8 @@
9065++ infer-recursive-gate
9871++ infer-recursive-gate
9066 |= [d=def env=ienv state=istate]
9872 |= [d=def env=ienv state=istate]
9067 ^- iresult
9873 ^- iresult
9874+ ?^ defer.state [%| ["deferred recursive inference is unsupported" ~]]
9875+ =. gate-defs.state ~
9068 ?. ?=(%value -.d) [%| ["recursive definition is not a gate" ~]]
9876 ?. ?=(%value -.d) [%| ["recursive definition is not a gate" ~]]
9069 ?. |(?=(%gate -.val.d) ?=(%gate-wide -.val.d))
9877 ?. |(?=(%gate -.val.d) ?=(%gate-wide -.val.d))
9070 [%| ["recursive definition is not a gate" ~]]
9878 [%| ["recursive definition is not a gate" ~]]
@@ -9288,12 +10096,13 @@
9288++ infer-gate-group
10096++ infer-gate-group
9289 |= [ds=(list def) env=ienv state=istate]
10097 |= [ds=(list def) env=ienv state=istate]
9290 ^- ilocal-result
10098 ^- ilocal-result
10099+ ?^ defer.state [%| ["deferred recursive inference is unsupported" ~]]
9291 =/ names=(list term) (global-value-names ds)
10100 =/ names=(list term) (global-value-names ds)
9292 ?. (levy names |=(n=term (unique-value-name n names)))
10101 ?. (levy names |=(n=term (unique-value-name n names)))
9293 [%| ["recursive group contains duplicate names" ~]]
10102 [%| ["recursive group contains duplicate names" ~]]
9294 ?: (lien names |=(n=term ?=(^ (ienv-lookup n env))))
10103 ?: (lien names |=(n=term ?=(^ (ienv-lookup n env))))
9295 [%| ["recursive group shadows a name" ~]]
10104 [%| ["recursive group shadows a name" ~]]
9296− =/ scoped=istate state(globals (weld names globals.state))
10105+ =/ scoped=istate state(globals (weld names globals.state), gate-defs ~)
9297 =/ seeded=igate-seeds (seed-gate-group ds env scoped)
10106 =/ seeded=igate-seeds (seed-gate-group ds env scoped)
9298 ?: ?=(%| -.seeded) seeded
10107 ?: ?=(%| -.seeded) seeded
9299 =/ seeds=ienv (group-seed-env entries.p.seeded ~)
10108 =/ seeds=ienv (group-seed-env entries.p.seeded ~)
@@ -9327,35 +10136,11 @@
9327 `[entry u.rest]
10136 `[entry u.rest]
9328::
10137::
9329++ add-supported-defs
10138++ add-supported-defs
9330− |= [ds=(list def) env=ienv molds=imolds globals=(list term) externals=iexternals surs=(list term) mark-externals=imark-externals marks=(list term) jimports=ijimports reserved-molds=(list term) at=path prelude=(unit ifile) artifacts=(list iwidth-definition)]
10139+ |= [ds=(list def) all-defs=(list def) checked=(map term def) heads=(unit igate-prelude-evidence) env=ienv molds=imolds globals=(list term) externals=iexternals surs=(list term) mark-externals=imark-externals marks=(list term) jimports=ijimports reserved-molds=(list term) at=path prelude=(unit ifile) artifacts=(list iwidth-definition)]
9331 ^- [env=ienv artifacts=(list iwidth-definition)]
10140 ^- [env=ienv artifacts=(list iwidth-definition)]
9332− ?~ ds [env artifacts]
9333− =/ d=def i.ds
9334− ?: ?=(%mold -.d) $(ds t.ds)
9335− ?. (unique-value-name name.d globals) $(ds t.ds)
9336− ?^ (ienv-lookup name.d env) $(ds t.ds)
9337− =/ top=(list term) (turn molds |=(m=[name=term body=shape] name.m))
9338− =/ initial=istate [0 ~ ~ ~ molds globals externals surs mark-externals marks jimports reserved-molds ~ ~ ~ | at top prelude ~ 256 ~]
10141+ (add-supported-defs-core ds all-defs checked heads env molds globals externals surs mark-externals marks jimports reserved-molds at prelude artifacts ~)
9339− =. initial (reserve-def-caps val.d initial)
9340− =/ result=iresult (infer-fragment val.d env initial)
9341− =? result ?=(%| -.result) (infer-recursive-gate d env initial)
9342− ?: ?=(%| -.result) $(ds t.ds)
9343− =. state.p.result (promote-restricted-numbers state.p.result env)
9344− =. state.p.result (default-hole-numbers holes.state.p.result holes.initial state.p.result env !(itype-has-gate (itype-normalize typ.p.result sub.state.p.result)))
9345− ?^ (unresolved-hole holes.state.p.result holes.initial state.p.result) $(ds t.ds)
9346− ?: (constrained-capitals caps.state.p.result sub.state.p.result) $(ds t.ds)
9347− =/ typ=itype (default-decimals (itype-normalize typ.p.result sub.state.p.result))
9348− ?: |((pending-tags tags.state.p.result sub.state.p.result) (itype-has-tag typ)) $(ds t.ds)
9349− ?: (unsupported-atom-vars typ caps.state.p.result binders.state.p.result sub.state.p.result) $(ds t.ds)
9350− =/ vars=(list @ud) (unique-type-vars (itype-vars typ))
9351− ?: (gth (lent vars) 26) $(ds t.ds)
9352− =/ finalized=(unit (list iwprojection))
9353− (width-finalize projections.state.p.result sub.state.p.result vars)
9354− ?~ finalized $(ds t.ds)
9355− =? artifacts ?=(^ u.finalized)
9356− [[name.d val.d typ sub.state.p.result (flop u.finalized)] artifacts]
9357− $(ds t.ds, env [[name.d [typ vars]] env])
9358::
10142::
10143+
9359+$ iresolved [env=ienv grouped=(list term) artifacts=(list iwidth-definition)]
10144+$ iresolved [env=ienv grouped=(list term) artifacts=(list iwidth-definition)]
9360+$ iadj (map term (list term))
10145+$ iadj (map term (list term))
9361+$ ivisited (map term ?)
10146+$ ivisited (map term ?)
@@ -9469,6 +10254,57 @@
9469++ resolve-groups
10254++ resolve-groups
9470 |= [ds=(list def) molds=imolds globals=(list term) externals=iexternals surs=(list term) mark-externals=imark-externals marks=(list term) jimports=ijimports reserved-molds=(list term) at=path prelude=(unit ifile)]
10255 |= [ds=(list def) molds=imolds globals=(list term) externals=iexternals surs=(list term) mark-externals=imark-externals marks=(list term) jimports=ijimports reserved-molds=(list term) at=path prelude=(unit ifile)]
9471 ^- iresolved
10256 ^- iresolved
10257+ (resolve-groups-core ds molds globals externals surs mark-externals marks jimports reserved-molds at prelude ~)
10258+::
10259+
10260++$ iadded-definition
10261+ [env=ienv checked=(map term def) artifacts=(list iwidth-definition)]
10262+++ add-supported-result
10263+ |= [d=def result=iresult initial=istate env=ienv checked=(map term def) artifacts=(list iwidth-definition)]
10264+ ^- (unit iadded-definition)
10265+ ?> ?=(%value -.d)
10266+ ?: ?=(%| -.result) ~
10267+ =. state.p.result (promote-restricted-numbers state.p.result env)
10268+ =. state.p.result (default-hole-numbers holes.state.p.result holes.initial state.p.result env !(itype-has-gate (itype-normalize typ.p.result sub.state.p.result)))
10269+ ?^ (unresolved-hole holes.state.p.result holes.initial state.p.result) ~
10270+ ?: (constrained-capitals caps.state.p.result sub.state.p.result) ~
10271+ =/ typ=itype (default-decimals (itype-normalize typ.p.result sub.state.p.result))
10272+ ?: |((pending-tags tags.state.p.result sub.state.p.result) (itype-has-tag typ)) ~
10273+ ?: (unsupported-atom-vars typ caps.state.p.result binders.state.p.result sub.state.p.result) ~
10274+ =/ vars=(list @ud) (unique-type-vars (itype-vars typ))
10275+ ?: (gth (lent vars) 26) ~
10276+ =/ finalized=(unit (list iwprojection))
10277+ (width-finalize projections.state.p.result sub.state.p.result vars)
10278+ ?~ finalized ~
10279+ =? artifacts ?=(^ u.finalized)
10280+ [[name.d val.d typ sub.state.p.result (flop u.finalized)] artifacts]
10281+ =? checked |(?=(%gate -.val.d) ?=(%gate-wide -.val.d)) (~(put by checked) name.d d)
10282+ `[[[name.d [typ vars]] env] checked artifacts]
10283+++ add-supported-defs-core
10284+ |= [ds=(list def) all-defs=(list def) checked=(map term def) heads=(unit igate-prelude-evidence) env=ienv molds=imolds globals=(list term) externals=iexternals surs=(list term) mark-externals=imark-externals marks=(list term) jimports=ijimports reserved-molds=(list term) at=path prelude=(unit ifile) artifacts=(list iwidth-definition) index=(unit [at=path source=@t prelude=ifile shapes=(map term shape)])]
10285+ ^- [env=ienv artifacts=(list iwidth-definition)]
10286+ ?~ ds [env artifacts]
10287+ =/ d=def i.ds
10288+ ?: ?=(%mold -.d) $(ds t.ds)
10289+ ?: (lien (program-recovery-names all-defs) |=(n=term =(n name.d))) $(ds t.ds)
10290+ ?. (unique-value-name name.d globals) $(ds t.ds)
10291+ ?^ (ienv-lookup name.d env) $(ds t.ds)
10292+ =/ top=(list term) (turn molds |=(m=[name=term body=shape] name.m))
10293+ =/ initial=istate [0 ~ ~ ~ molds globals externals surs mark-externals marks jimports reserved-molds ~ ~ ~ | at top prelude ~ 256 ~ ~ ~ ~ ~ ~]
10294+ =. grec-index.initial index
10295+ =. gate-defs.initial checked
10296+ =. head-evidence.initial heads
10297+ =. initial (reserve-def-caps val.d initial)
10298+ =/ result=iresult (infer-fragment val.d env initial)
10299+ =? result ?=(%| -.result) (infer-recursive-gate d env initial)
10300+ =/ added=(unit iadded-definition)
10301+ (add-supported-result d result initial env checked artifacts)
10302+ ?~ added $(ds t.ds)
10303+ $(ds t.ds, env env.u.added, checked checked.u.added, artifacts artifacts.u.added)
10304+::
10305+++ resolve-groups-core
10306+ |= [ds=(list def) molds=imolds globals=(list term) externals=iexternals surs=(list term) mark-externals=imark-externals marks=(list term) jimports=ijimports reserved-molds=(list term) at=path prelude=(unit ifile) index=(unit [at=path source=@t prelude=ifile shapes=(map term shape)])]
10307+ ^- iresolved
9472 =/ env=ienv ~
10308 =/ env=ienv ~
9473 =/ grouped=(list term) ~
10309 =/ grouped=(list term) ~
9474 =/ artifacts=(list iwidth-definition) ~
10310 =/ artifacts=(list iwidth-definition) ~
@@ -9477,10 +10313,12 @@
9477 =/ graph=iadj (graph-make-forward ds nameset ~)
10313 =/ graph=iadj (graph-make-forward ds nameset ~)
9478 =/ components=icomponents (graph-components ds names)
10314 =/ components=icomponents (graph-components ds names)
9479 =/ top=(list term) (turn molds |=(m=[name=term body=shape] name.m))
10315 =/ top=(list term) (turn molds |=(m=[name=term body=shape] name.m))
10316+ =/ heads=(unit igate-prelude-evidence) (direct-prelude-evidence ds prelude)
9480 |-
10317 |-
9481 =/ next=[env=ienv artifacts=(list iwidth-definition)]
10318 =/ next=[env=ienv artifacts=(list iwidth-definition)]
9482− (add-supported-defs ds env molds globals externals surs mark-externals marks jimports reserved-molds at prelude artifacts)
10319+ (add-supported-defs-core ds ds (direct-checked-gates ds env) heads env molds globals externals surs mark-externals marks jimports reserved-molds at prelude artifacts index)
9483− =/ initial=istate [0 ~ ~ ~ molds globals externals surs mark-externals marks jimports reserved-molds ~ ~ ~ | at top prelude ~ 256 ~]
10320+ =/ initial=istate [0 ~ ~ ~ molds globals externals surs mark-externals marks jimports reserved-molds ~ ~ ~ | at top prelude ~ 256 ~ ~ ~ ~ ~ ~]
10321+ =. grec-index.initial index
9484 =/ out=iresolved (add-groups ds components graph env.next grouped artifacts.next initial)
10322 =/ out=iresolved (add-groups ds components graph env.next grouped artifacts.next initial)
9485 ?: =(env env.out) out
10323 ?: =(env env.out) out
9486 $(env env.out, grouped grouped.out, artifacts artifacts.out)
10324 $(env env.out, grouped grouped.out, artifacts artifacts.out)
@@ -9729,6 +10567,257 @@
9729 %overlap
10567 %overlap
9730 %unknown
10568 %unknown
9731::
10569::
10570+:: A source-only fallback for literal-tagged cells and one-hop local
10571+:: generic applications. It screens all work before ordinary inference.
10572+++ union-simple-shape-budget
10573+ |= [s=shape fuel=@ud vars=(unit (list @t))]
10574+ ^- (unit @ud)
10575+ ?: =(0 fuel) ~
10576+ =. fuel (dec fuel)
10577+ ?- -.s
10578+ ?(%aura %noun %void %flag) `fuel
10579+ %tvar
10580+ ?~ vars `fuel
10581+ ?:((lien u.vars |=(n=@t =(n name.s))) `fuel ~)
10582+ %const
10583+ ?. |(=(%term form.lit.s) =(%null form.lit.s) =(%loobean form.lit.s)) ~
10584+ ?: &(=(%loobean form.lit.s) !|(=(0 val.lit.s) =(1 val.lit.s))) ~
10585+ `fuel
10586+ %cell (union-simple-fields-budget fields.s fuel vars)
10587+ %fn
10588+ =/ left=(unit @ud) $(s sample.s, fuel fuel)
10589+ ?~ left ~
10590+ $(s product.s, fuel u.left)
10591+ * ~
10592+ ==
10593+++ union-simple-fields-budget
10594+ |= [fields=(list field) fuel=@ud vars=(unit (list @t))]
10595+ ^- (unit @ud)
10596+ ?~ fields `fuel
10597+ ?: =(0 fuel) ~
10598+ =/ field-shape=shape
10599+ ?- -.i.fields
10600+ %bare shape.i.fields
10601+ %face shape.i.fields
10602+ %pun [%ref at.i.fields ~[name.i.fields]]
10603+ ==
10604+ =/ head=(unit @ud) (union-simple-shape-budget field-shape (dec fuel) vars)
10605+ ?~ head ~
10606+ $(fields t.fields, fuel u.head)
10607+++ union-source-find
10608+ |= [n=term molds=imolds fuel=@ud]
10609+ ^- (unit [body=shape left=@ud])
10610+ =/ found=(unit shape) ~
10611+ |-
10612+ ?~ molds
10613+ ?~ found ~
10614+ `[u.found fuel]
10615+ ?: =(0 fuel) ~
10616+ ?: =(n name.i.molds)
10617+ ?^ found ~
10618+ $(molds t.molds, fuel (dec fuel), found `body.i.molds)
10619+ $(molds t.molds, fuel (dec fuel))
10620+++ union-source-args-budget
10621+ |= [vars=(list @t) args=(list shape) fuel=@ud]
10622+ ^- (unit @ud)
10623+ =/ seen=(set @t) *(set @t)
10624+ |-
10625+ ?~ vars ?~(args `fuel ~)
10626+ ?~ args ~
10627+ ?: =(0 fuel) ~
10628+ ?: (~(has in:..zuse seen) i.vars) ~
10629+ =/ arg=(unit @ud) (union-simple-shape-budget i.args (dec fuel) ~)
10630+ ?~ arg ~
10631+ $(vars t.vars, args t.args, fuel u.arg, seen (~(put in:..zuse seen) i.vars))
10632+++ union-source-cell-tag
10633+ |= s=shape
10634+ ^- (unit @)
10635+ ?. ?=(%cell -.s) ~
10636+ ?~ fields.s ~
10637+ ?~ t.fields.s ~
10638+ ?. ?=(%bare -.i.fields.s) ~
10639+ =/ head=shape shape.i.fields.s
10640+ ?. ?=(%const -.head) ~
10641+ ?. |(=(%term form.lit.head) =(%null form.lit.head) =(%loobean form.lit.head)) ~
10642+ ?: &(=(%loobean form.lit.head) !|(=(0 val.lit.head) =(1 val.lit.head))) ~
10643+ `val.lit.head
10644+++ union-source-case-tag
10645+ |= [s=shape molds=imolds fuel=@ud]
10646+ ^- (unit [tag=@ left=@ud])
10647+ ?: ?=(%cell -.s)
10648+ =/ tag=(unit @) (union-source-cell-tag s)
10649+ ?~ tag ~
10650+ =/ left=(unit @ud) (union-simple-shape-budget s fuel ~)
10651+ ?~ left ~
10652+ `[u.tag u.left]
10653+ ?. ?=(%apply -.s) ~
10654+ ?. ?=([@ ~] ref.s) ~
10655+ ?: =(0 fuel) ~
10656+ =/ found=(unit [body=shape left=@ud]) (union-source-find i.ref.s molds (dec fuel))
10657+ ?~ found ~
10658+ ?. ?=(%generic -.body.u.found) ~
10659+ ?~ vars.body.u.found ~
10660+ =/ tag=(unit @) (union-source-cell-tag body.body.u.found)
10661+ ?~ tag ~
10662+ =/ args=(unit @ud) (union-source-args-budget vars.body.u.found args.s left.u.found)
10663+ ?~ args ~
10664+ =/ left=(unit @ud) (union-simple-shape-budget body.body.u.found u.args `vars.body.u.found)
10665+ ?~ left ~
10666+ `[u.tag u.left]
10667+++ union-source-distinct-tags
10668+ |= [cases=(list shape) molds=imolds fuel=@ud]
10669+ ^- ?
10670+ =/ seen=(set @) *(set @)
10671+ =/ has-application=? |
10672+ |-
10673+ ?~ cases has-application
10674+ ?: =(0 fuel) |
10675+ =/ item=(unit [tag=@ left=@ud]) (union-source-case-tag i.cases molds (dec fuel))
10676+ ?~ item |
10677+ ?: (~(has in:..zuse seen) tag.u.item) |
10678+ $(cases t.cases, fuel left.u.item, seen (~(put in:..zuse seen) tag.u.item), has-application |(has-application ?=(%apply -.i.cases)))
10679+::
10680+:: This inference-only screen bounds inherited work that the small source
10681+:: slice may consult. It does not authenticate a caller-created state.
10682+++ union-state-leaf
10683+ |= t=itype
10684+ ^- ?
10685+ ?=(?(%var %avar %rvar %nvar %rnvar %atom %any-atom %flag %noun %empty %const) -.t)
10686+++ union-state-params-budget
10687+ |= [params=iparams fuel=@ud]
10688+ ^- (unit @ud)
10689+ ?~ params `fuel
10690+ ?: =(0 fuel) ~
10691+ ?. (union-state-leaf typ.i.params) ~
10692+ $(params t.params, fuel (dec fuel))
10693+++ union-state-sub-budget
10694+ |= [sub=isub fuel=@ud]
10695+ ^- (unit @ud)
10696+ ?~ sub `fuel
10697+ ?: =(0 fuel) ~
10698+ ?. (union-state-leaf val.i.sub) ~
10699+ $(sub t.sub, fuel (dec fuel))
10700+++ union-state-caps-budget
10701+ |= [caps=icaps fuel=@ud]
10702+ ^- (unit @ud)
10703+ ?~ caps `fuel
10704+ ?: =(0 fuel) ~
10705+ $(caps t.caps, fuel (dec fuel))
10706+++ union-state-active-budget
10707+ |= [active=(list term) fuel=@ud]
10708+ ^- (unit @ud)
10709+ ?~ active `fuel
10710+ ?: =(0 fuel) ~
10711+ $(active t.active, fuel (dec fuel))
10712+++ union-state-tags-budget
10713+ |= [tags=(list ipending) fuel=@ud]
10714+ ^- (unit @ud)
10715+ ?~ tags `fuel
10716+ ?: =(0 fuel) ~
10717+ $(tags t.tags, fuel (dec fuel))
10718+++ union-source-state-safe
10719+ |= [state=istate fuel=@ud]
10720+ ^- ?
10721+ ?^ grec-index.state |
10722+ ?^ holes.state |
10723+ ?^ defer.state |
10724+ ?^ obligations.state |
10725+ =/ params=(unit @ud) (union-state-params-budget params.state fuel)
10726+ ?~ params |
10727+ =/ sub=(unit @ud) (union-state-sub-budget sub.state u.params)
10728+ ?~ sub |
10729+ =/ caps=(unit @ud) (union-state-caps-budget caps.state u.sub)
10730+ ?~ caps |
10731+ =/ active=(unit @ud) (union-state-active-budget active.state u.caps)
10732+ ?~ active |
10733+ ?=(^ (union-state-tags-budget tags.state u.active))
10734+::
10735+:: Positive overlap witnesses from parsed, one-hop local source only.
10736+:: Unknown or exhausted work returns no witness, never disjointness.
10737++$ uow-case [at=span head=@ payload=upat]
10738+++ union-overlap-primitive
10739+ |= s=shape
10740+ ^- (unit upat)
10741+ ?- -.s
10742+ %aura `[%atom ~]
10743+ %noun `[%all ~]
10744+ %void `[%empty ~]
10745+ %flag `[%flag ~]
10746+ %const
10747+ ?. |(=(%term form.lit.s) =(%null form.lit.s) =(%loobean form.lit.s)) ~
10748+ ?: &(=(%loobean form.lit.s) !|(=(0 val.lit.s) =(1 val.lit.s))) ~
10749+ `[%atom `val.lit.s]
10750+ * ~
10751+ ==
10752+++ union-overlap-case
10753+ |= [s=shape molds=imolds fuel=@ud]
10754+ ^- (unit [item=uow-case left=@ud])
10755+ ?: =(0 fuel) ~
10756+ =. fuel (dec fuel)
10757+ :: Each body has exactly two fields; an application has exactly one
10758+ :: parameter and one concrete primitive argument. The full mold table
10759+ :: is scanned to establish unique ownership.
10760+ =/ expanded=(unit [body=shape param=(unit [name=@t pat=upat]) left=@ud])
10761+ ?: ?=(%cell -.s) `[s ~ fuel]
10762+ ?. ?=(%apply -.s) ~
10763+ ?. ?=([@ ~] ref.s) ~
10764+ ?. ?=([* ~] args.s) ~
10765+ ?: =(0 fuel) ~
10766+ =/ found=(unit [body=shape left=@ud]) (union-source-find i.ref.s molds (dec fuel))
10767+ ?~ found ~
10768+ ?. ?=(%generic -.body.u.found) ~
10769+ ?. ?=([@ ~] vars.body.u.found) ~
10770+ ?: =(0 left.u.found) ~
10771+ =/ argument=(unit upat) (union-overlap-primitive i.args.s)
10772+ ?~ argument ~
10773+ `[body.body.u.found `[i.vars.body.u.found u.argument] (dec left.u.found)]
10774+ ?~ expanded ~
10775+ =/ body=shape body.u.expanded
10776+ ?. ?=(%cell -.body) ~
10777+ ?. ?=([* * ~] fields.body) ~
10778+ :: Charge the cell, two fields, and the head and payload nodes.
10779+ ?: (lth left.u.expanded 5) ~
10780+ =/ head=(unit @) (union-source-cell-tag body)
10781+ ?~ head ~
10782+ =/ field=field i.t.fields.body
10783+ =/ payload=shape
10784+ ?- -.field
10785+ %bare shape.field
10786+ %face shape.field
10787+ %pun [%ref at.field ~[name.field]]
10788+ ==
10789+ =/ pattern=(unit upat)
10790+ ?: ?=(%tvar -.payload)
10791+ ?~ param.u.expanded ~
10792+ ?. =(name.payload name.u.param.u.expanded) ~
10793+ `pat.u.param.u.expanded
10794+ (union-overlap-primitive payload)
10795+ ?~ pattern ~
10796+ `[[at.s u.head u.pattern] (sub left.u.expanded 5)]
10797+++ union-overlap-against
10798+ |= [first=uow-case rest=(list shape) molds=imolds fuel=@ud]
10799+ ^- (unit [witness=(unit upair) left=@ud])
10800+ ?~ rest `[~ fuel]
10801+ ?: =(0 fuel) ~
10802+ =/ other=(unit [item=uow-case left=@ud]) (union-overlap-case i.rest molds (dec fuel))
10803+ ?~ other ~
10804+ ?: &(=(head.first head.item.u.other) =(%overlap (union-relate payload.first payload.item.u.other)))
10805+ `[`[at.first at.item.u.other %overlap] left.u.other]
10806+ $(rest t.rest, fuel left.u.other)
10807+++ union-source-overlap
10808+ |= [cases=(list shape) molds=imolds fuel=@ud]
10809+ ^- (unit upair)
10810+ ?~ cases ~
10811+ ?~ t.cases ~
10812+ ?: =(0 fuel) ~
10813+ =/ first=(unit [item=uow-case left=@ud]) (union-overlap-case i.cases molds (dec fuel))
10814+ ?~ first ~
10815+ =/ found=(unit [witness=(unit upair) left=@ud])
10816+ (union-overlap-against item.u.first t.cases molds left.u.first)
10817+ ?~ found ~
10818+ ?^ witness.u.found witness.u.found
10819+ $(cases t.cases, fuel left.u.found)
10820+::
9732++ union-pairs
10821++ union-pairs
9733 |= [cases=(list shape) molds=imolds]
10822 |= [cases=(list shape) molds=imolds]
9734 ^- (list upair)
10823 ^- (list upair)
@@ -9882,6 +10971,11 @@
9882 ?. ?=(%union -.sh) (crip "+$ {(trip name.d)}: not checked")
10971 ?. ?=(%union -.sh) (crip "+$ {(trip name.d)}: not checked")
9883 =/ pairs=(list upair) (union-pairs cases.sh molds)
10972 =/ pairs=(list upair) (union-pairs cases.sh molds)
9884 =/ overlapping=(list upair) (skim pairs |=(p=upair =(%overlap relation.p)))
10973 =/ overlapping=(list upair) (skim pairs |=(p=upair =(%overlap relation.p)))
10974+ =. overlapping
10975+ ?^ overlapping overlapping
10976+ ?. (lien pairs |=(p=upair =(%unknown relation.p))) ~
10977+ =/ witness=(unit upair) (union-source-overlap cases.sh molds 256)
10978+ ?~(witness ~ ~[u.witness])
9885 ?^ overlapping
10979 ?^ overlapping
9886 =/ p=upair i.overlapping
10980 =/ p=upair i.overlapping
9887 =/ summary=@t (crip "+$ {(trip name.d)}: overlapping cases; mold not checked")
10981 =/ summary=@t (crip "+$ {(trip name.d)}: overlapping cases; mold not checked")
@@ -9889,7 +10983,9 @@
9889 =/ second=@t (show-error src [file line.beg.second.p col.beg.second.p "overlapping case"])
10983 =/ second=@t (show-error src [file line.beg.second.p col.beg.second.p "overlapping case"])
9890 (of-wain:format ~[summary first second])
10984 (of-wain:format ~[summary first second])
9891 ?: (lien pairs |=(p=upair =(%unknown relation.p)))
10985 ?: (lien pairs |=(p=upair =(%unknown relation.p)))
10986+ ?. (union-source-distinct-tags cases.sh molds 256)
9892− (crip "+$ {(trip name.d)}: case disjointness unresolved; mold not checked")
10987+ (crip "+$ {(trip name.d)}: case disjointness unresolved; mold not checked")
10988+ (crip "+$ {(trip name.d)}: cases proven disjoint; mold not checked")
9893 (crip "+$ {(trip name.d)}: cases proven disjoint; mold not checked")
10989 (crip "+$ {(trip name.d)}: cases proven disjoint; mold not checked")
9894::
10990::
9895:: +show-inference-diagnostic: a partial report with both source sites
10991:: +show-inference-diagnostic: a partial report with both source sites
@@ -9946,7 +11042,14 @@
9946+$ jbundle (list jsource)
11042+$ jbundle (list jsource)
9947+$ jcache (list [at=path iface=ifile])
11043+$ jcache (list [at=path iface=ifile])
9948+$ jfile-result (each [iface=ifile cache=jcache] @t)
11044+$ jfile-result (each [iface=ifile cache=jcache] @t)
11045+:: Overlap evidence retains the exact source that supplied its spans.
11046+:: Ordinary Jibb imports preserve this evidence through the resolver.
11047++$ jfile-overlap [file=path source=@t name=term cases=upair]
11048++$ jfile-failure [message=@t overlap=(unit jfile-overlap)]
11049++$ jfile-detailed-result (each [iface=ifile cache=jcache] jfile-failure)
9949+$ jimports-result (each [resolved=ijimports cache=jcache] @t)
11050+$ jimports-result (each [resolved=ijimports cache=jcache] @t)
11051+:: Preserve an imported overlap's original file and source across the graph.
11052++$ jimports-detailed-result (each [resolved=ijimports cache=jcache] jfile-failure)
9950::
11053::
9951:: Written record fields each have their own lexical record scope.
11054:: Written record fields each have their own lexical record scope.
9952+$ written-fields (map term span)
11055+$ written-fields (map term span)
@@ -10219,19 +11322,56 @@
10219 (skim defs.mod |=(d=def !&(?=(%mold -.d) =(%poke name.d))))
11322 (skim defs.mod |=(d=def !&(?=(%mold -.d) =(%poke name.d))))
10220 (module-scope-valid mod(defs remaining) prelude-values prelude-molds)
11323 (module-scope-valid mod(defs remaining) prelude-values prelude-molds)
10221::
11324::
11325+:: A detailed failure is attached only to the first mold that actually
11326+:: failed in this check, using that module's checked source mold table.
11327++$ imold-failure [message=@t overlap=(unit [name=term cases=upair])]
11328+:: Validate a generic wrapper without an unbounded duplicate-name pass.
11329+++ module-mold-params-valid
11330+ |= [vars=(list @t) seen=(set @t) fuel=@ud]
11331+ ^- ?
11332+ ?~ vars &
11333+ ?: =(0 fuel) |
11334+ ?: (~(has in:..zuse seen) i.vars) |
11335+ $(vars t.vars, seen (~(put in:..zuse seen) i.vars), fuel (dec fuel))
11336+++ module-mold-overlap
11337+ |= [m=[name=term body=shape] molds=imolds]
11338+ ^- (unit upair)
11339+ =/ sh=shape body.m
11340+ =/ valid=?
11341+ ?. ?=(%generic -.sh) &
11342+ ?~ vars.sh |
11343+ (module-mold-params-valid vars.sh *(set @t) 256)
11344+ ?. valid ~
11345+ =? sh ?=(%generic -.sh) body.sh
11346+ ?. ?=(%union -.sh) ~
11347+ (union-source-overlap cases.sh molds 256)
10222−++ module-mold-types
11348+++ module-mold-types-detail
10223 |= [molds=imolds state=istate]
11349 |= [molds=imolds state=istate]
10224− ^- (each imold-types @t)
11350+ ^- (each imold-types imold-failure)
10225 ?~ molds [%& ~]
11351 ?~ molds [%& ~]
10226 =/ m=[name=term body=shape] i.molds
11352 =/ m=[name=term body=shape] i.molds
10227 =/ t=(unit [template=ischeme state=istate])
11353 =/ t=(unit [template=ischeme state=istate])
10228 (infer-mold-template body.m state(active [name.m active.state], in-mold &))
11354 (infer-mold-template body.m state(active [name.m active.state], in-mold &))
11355+ ?~ t
11356+ =/ overlap=(unit upair) (module-mold-overlap m molds.state)
10229− ?~ t [%| 'module mold needs unsupported inference']
11357+ [%| ['module mold needs unsupported inference' ?~(overlap ~ `[name.m u.overlap])]]
10230 =. typ.template.u.t (label-direct-union typ.template.u.t body.m name.m state)
11358 =. typ.template.u.t (label-direct-union typ.template.u.t body.m name.m state)
10231− =/ rest=(each imold-types @t) $(molds t.molds)
11359+ =/ rest=(each imold-types imold-failure) $(molds t.molds)
10232 ?: ?=(%| -.rest) rest
11360 ?: ?=(%| -.rest) rest
10233 [%& [[name.m template.u.t] p.rest]]
11361 [%& [[name.m template.u.t] p.rest]]
11362+++ module-mold-types
11363+ |= [molds=imolds state=istate]
11364+ ^- (each imold-types @t)
11365+ ?~ molds [%& ~]
11366+ =/ m=[name=term body=shape] i.molds
11367+ =/ t=(unit [template=ischeme state=istate])
11368+ (infer-mold-template body.m state(active [name.m active.state], in-mold &))
11369+ ?~ t [%| 'module mold needs unsupported inference']
11370+ =. typ.template.u.t (label-direct-union typ.template.u.t body.m name.m state)
11371+ =/ rest=(each imold-types @t) $(molds t.molds)
11372+ ?: ?=(%| -.rest) rest
11373+ [%& [[name.m template.u.t] p.rest]]
10234−::
11374+::
10235:: Prepare a provisional interface from the trusted vendored source.
11375:: Prepare a provisional interface from the trusted vendored source.
10236:: Every declared name remains reserved, but only molds and values this
11376:: Every declared name remains reserved, but only molds and values this
10237:: fragment can infer are usable. Unsupported bodies are not validated.
11377:: fragment can infer are usable. Unsupported bodies are not validated.
@@ -10280,6 +11420,9 @@
10280 |= [typ=itype name=term vars=(list @ud)]
11420 |= [typ=itype name=term vars=(list @ud)]
10281 ^- itype
11421 ^- itype
10282 ?: ?=(%jrec -.typ) typ(label `name)
11422 ?: ?=(%jrec -.typ) typ(label `name)
11423+ ?: ?=(%grec -.typ)
11424+ ?. (identity-union-parameters vars args.typ) typ(label ~)
11425+ typ(label `name)
10283 ?. ?=(%union -.typ) typ
11426 ?. ?=(%union -.typ) typ
10284 ?. (identity-union-parameters vars args.typ)
11427 ?. (identity-union-parameters vars args.typ)
10285 ?~ origin.typ typ
11428 ?~ origin.typ typ
@@ -10312,7 +11455,12 @@
10312 =/ plus=ischeme [[%fn [%cell b b] b] ~[0]]
11455 =/ plus=ischeme [[%fn [%cell b b] b] ~[0]]
10313 =/ minus=ischeme [[%fn b b] ~[0]]
11456 =/ minus=ischeme [[%fn b b] ~[0]]
10314 =/ greater=ischeme [[%fn pair [%flag ~]] ~[0]]
11457 =/ greater=ischeme [[%fn pair [%flag ~]] ~[0]]
11458+ =/ utf8=itype [%atom 'tD']
11459+ =/ tape=itype [%collection %list ~[utf8]]
11460+ =/ codepoints=itype [%collection %list ~[[%atom %c]]]
11461+ =/ text-trip=ischeme [[%fn [%atom %t] tape] ~]
11462+ =/ text-tuba=ischeme [[%fn tape codepoints] ~]
10315− [~[[%raw-add plus] [%raw-dec minus] [%raw-gth greater]] ~ /lib/jibb/primitives/jibb ~ ~ ~ ~ ~]
11463+ [~[[%raw-add plus] [%raw-dec minus] [%raw-gth greater] [%raw-trip text-trip] [%raw-tuba text-tuba]] ~ /lib/jibb/primitives/jibb ~ ~ ~ ~ ~]
10316::
11464::
10317++ infer-private-internal
11465++ infer-private-internal
10318 |= [src=@t public-source=@t]
11466 |= [src=@t public-source=@t]
@@ -10353,7 +11501,7 @@
10353 =/ source-unit=(unit ischeme)
11501 =/ source-unit=(unit ischeme)
10354 ?~ unit-decl ~
11502 ?~ unit-decl ~
10355 =/ unit-molds=imolds ~[[%unit u.unit-decl]]
11503 =/ unit-molds=imolds ~[[%unit u.unit-decl]]
10356− =/ unit-state=istate [0 ~ ~ ~ unit-molds ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ | /lib/jibb/prelude/jibb ~[%unit] ~ ~ 256 ~]
11504+ =/ unit-state=istate [0 ~ ~ ~ unit-molds ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ | /lib/jibb/prelude/jibb ~[%unit] ~ ~ 256 ~ ~ ~ ~ ~ ~]
10357 =/ unit-types=imold-types (partial-prelude-molds unit-molds unit-state)
11505 =/ unit-types=imold-types (partial-prelude-molds unit-molds unit-state)
10358 =/ unit-iface=ifile [~ unit-types /lib/jibb/prelude/jibb ~ ~ ~ ~ ~]
11506 =/ unit-iface=ifile [~ unit-types /lib/jibb/prelude/jibb ~ ~ ~ ~ ~]
10359 =/ found=(unit ischeme) (find-jibb-mold %unit unit-iface)
11507 =/ found=(unit ischeme) (find-jibb-mold %unit unit-iface)
@@ -10368,7 +11516,7 @@
10368 =/ js=ijimports ~[[face.i.imports.mod primitive]]
11516 =/ js=ijimports ~[[face.i.imports.mod primitive]]
10369 =/ reserved=(list term) ~[face.i.imports.mod]
11517 =/ reserved=(list term) ~[face.i.imports.mod]
10370 =/ top=(list term) (turn molds |=(m=[name=term body=shape] name.m))
11518 =/ top=(list term) (turn molds |=(m=[name=term body=shape] name.m))
10371− =/ state=istate [0 ~ ~ ~ molds globals ~ ~ ~ ~ js reserved ~ ~ ~ | at top ~ ~ 256 ~]
11519+ =/ state=istate [0 ~ ~ ~ molds globals ~ ~ ~ ~ js reserved ~ ~ ~ | at top ~ ~ 256 ~ ~ ~ ~ ~ ~]
10372 =/ mts=(each imold-types @t) (module-mold-types molds state)
11520 =/ mts=(each imold-types @t) (module-mold-types molds state)
10373 =/ usable=(unit imold-types)
11521 =/ usable=(unit imold-types)
10374 ?: ?=(%& -.mts) `p.mts
11522 ?: ?=(%& -.mts) `p.mts
@@ -10424,7 +11572,7 @@
10424 =? env-molds declared
11572 =? env-molds declared
10425 (skim molds |=(m=[name=term body=shape] !=(%list name.m)))
11573 (skim molds |=(m=[name=term body=shape] !=(%list name.m)))
10426 =/ reserved=(list term) ?:(declared ~[%list] ~)
11574 =/ reserved=(list term) ?:(declared ~[%list] ~)
10427− =/ state=istate [0 ~ ~ ~ env-molds globals ~ ~ ~ ~ u.private reserved ~ ~ ~ | at names ~ ~ 256 ~]
11575+ =/ state=istate [0 ~ ~ ~ env-molds globals ~ ~ ~ ~ u.private reserved ~ ~ ~ | at names ~ ~ 256 ~ ~ ~ ~ ~ ~]
10428 :: Other prelude molds may use list only after its source has passed
11576 :: Other prelude molds may use list only after its source has passed
10429 :: the standard-list check. The raw declaration remains removed.
11577 :: the standard-list check. The raw declaration remains removed.
10430 =/ declared-list=(unit shape) (find-simple-mold %list molds)
11578 =/ declared-list=(unit shape) (find-simple-mold %list molds)
@@ -10564,33 +11712,40 @@
10564++ resolve-jibb-imports
11712++ resolve-jibb-imports
10565 |= [imports=(list import) externals=iexternals mark-externals=imark-externals modules=jbundle active=(list path) prelude-values=(list term) prelude-molds=(list term) cache=jcache prelude=(unit ifile)]
11713 |= [imports=(list import) externals=iexternals mark-externals=imark-externals modules=jbundle active=(list path) prelude-values=(list term) prelude-molds=(list term) cache=jcache prelude=(unit ifile)]
10566 ^- jimports-result
11714 ^- jimports-result
11715+ =/ result=jimports-detailed-result
11716+ (resolve-jibb-imports-detailed imports externals mark-externals modules active prelude-values prelude-molds cache prelude)
11717+ ?: ?=(%| -.result) [%| message.p.result]
11718+ [%& p.result]
11719+++ resolve-jibb-imports-detailed
11720+ |= [imports=(list import) externals=iexternals mark-externals=imark-externals modules=jbundle active=(list path) prelude-values=(list term) prelude-molds=(list term) cache=jcache prelude=(unit ifile)]
11721+ ^- jimports-detailed-result
10567 ?~ imports [%& [~ cache]]
11722 ?~ imports [%& [~ cache]]
10568 ?. ?=(%jibb -.i.imports) $(imports t.imports)
11723 ?. ?=(%jibb -.i.imports) $(imports t.imports)
10569 =/ at=path (weld path.i.imports `path`~[%jibb])
11724 =/ at=path (weld path.i.imports `path`~[%jibb])
10570 ?: =(at /lib/jibb/internal/jibb)
11725 ?: =(at /lib/jibb/internal/jibb)
10571− [%| 'the prelude internal module is private']
11726+ [%| ['the prelude internal module is private' ~]]
10572 ?: =(at /lib/jibb/primitives/jibb)
11727 ?: =(at /lib/jibb/primitives/jibb)
10573− [%| 'the prelude primitive interface is private']
11728+ [%| ['the prelude primitive interface is private' ~]]
10574 ?: (lien active |=(p=path =(p at)))
11729 ?: (lien active |=(p=path =(p at)))
10575− [%| (crip "import cycle at {(spud at)}")]
11730+ [%| [(crip "import cycle at {(spud at)}") ~]]
10576 =/ found=jbundle (skim modules |=(m=jsource =(at at.m)))
11731 =/ found=jbundle (skim modules |=(m=jsource =(at at.m)))
10577− ?~ found [%| (crip "module source missing: {(spud at)}")]
11732+ ?~ found [%| [(crip "module source missing: {(spud at)}") ~]]
10578− ?^ t.found [%| (crip "duplicate module sources: {(spud at)}")]
11733+ ?^ t.found [%| [(crip "duplicate module sources: {(spud at)}") ~]]
10579 =/ cached=(unit ifile) (find-jibb-cache at cache)
11734 =/ cached=(unit ifile) (find-jibb-cache at cache)
10580− =/ iface=jfile-result
11735+ =/ iface=jfile-detailed-result
10581 ?^ cached
11736 ?^ cached
10582− ?. =(at.u.cached at) [%| 'cached module identity needs unsupported inference']
11737+ ?. =(at.u.cached at) [%| ['cached module identity needs unsupported inference' ~]]
10583 ?~ graph.u.cached
11738 ?~ graph.u.cached
10584 :: A detached legacy interface has unknown evidence. Rebuild it
11739 :: A detached legacy interface has unknown evidence. Rebuild it
10585 :: against the current graph, without retaining any stale entry.
11740 :: against the current graph, without retaining any stale entry.
10586 =/ clean=jcache (skim cache |=(x=[at=path iface=ifile] !=(at.x at)))
11741 =/ clean=jcache (skim cache |=(x=[at=path iface=ifile] !=(at.x at)))
10587− (infer-jibb-file at source.i.found externals mark-externals modules [at active] prelude-values prelude-molds clean prelude)
11742+ (infer-jibb-file-detailed at source.i.found externals mark-externals modules [at active] prelude-values prelude-molds clean prelude)
10588 ?. (request-graph-reusable u.cached source.i.found externals mark-externals modules active prelude-values prelude-molds prelude)
11743 ?. (request-graph-reusable u.cached source.i.found externals mark-externals modules active prelude-values prelude-molds prelude)
10589− [%| 'cached module evidence needs unsupported inference']
11744+ [%| ['cached module evidence needs unsupported inference' ~]]
10590 [%& [u.cached cache]]
11745 [%& [u.cached cache]]
10591− (infer-jibb-file at source.i.found externals mark-externals modules [at active] prelude-values prelude-molds cache prelude)
11746+ (infer-jibb-file-detailed at source.i.found externals mark-externals modules [at active] prelude-values prelude-molds cache prelude)
10592 ?: ?=(%| -.iface) [%| p.iface]
11747 ?: ?=(%| -.iface) [%| p.iface]
10593− =/ rest=jimports-result $(imports t.imports, cache cache.p.iface)
11748+ =/ rest=jimports-detailed-result $(imports t.imports, cache cache.p.iface)
10594 ?: ?=(%| -.rest) rest
11749 ?: ?=(%| -.rest) rest
10595 [%& [[[face.i.imports iface.p.iface] resolved.p.rest] cache.p.rest]]
11750 [%& [[[face.i.imports iface.p.iface] resolved.p.rest] cache.p.rest]]
10596::
11751::
@@ -10953,7 +12108,7 @@
10953 =/ surs=(list term) (collect-sur-imports imports.mod)
12108 =/ surs=(list term) (collect-sur-imports imports.mod)
10954 =/ reserved=(list term) (weld molds.prep (turn resolved.p.deps |=(j=[face=term interface=ifile] face.j)))
12109 =/ reserved=(list term) (weld molds.prep (turn resolved.p.deps |=(j=[face=term interface=ifile] face.j)))
10955 =/ top=(list term) (turn molds |=(m=[name=term body=shape] name.m))
12110 =/ top=(list term) (turn molds |=(m=[name=term body=shape] name.m))
10956− =/ state=istate [0 ~ ~ ~ molds globals externals surs marks declared resolved.p.deps reserved ~ ~ ~ | file top prelude ~ 256 ~]
12111+ =/ state=istate [0 ~ ~ ~ molds globals externals surs marks declared resolved.p.deps reserved ~ ~ ~ | file top prelude ~ 256 ~ ~ ~ ~ ~ ~]
10957 =/ mts=(each imold-types @t) (module-mold-types molds state)
12112 =/ mts=(each imold-types @t) (module-mold-types molds state)
10958 ?: ?=(%| -.mts) [%| p.mts]
12113 ?: ?=(%| -.mts) [%| p.mts]
10959 =/ resolution=iresolved (resolve-groups ordinary molds globals externals surs marks declared resolved.p.deps reserved file prelude)
12114 =/ resolution=iresolved (resolve-groups ordinary molds globals externals surs marks declared resolved.p.deps reserved file prelude)
@@ -10987,7 +12142,7 @@
10987 =/ surs=(list term) (collect-sur-imports imports.mod)
12142 =/ surs=(list term) (collect-sur-imports imports.mod)
10988 =/ reserved=(list term) (weld molds.prep (turn resolved.p.deps |=(j=[face=term interface=ifile] face.j)))
12143 =/ reserved=(list term) (weld molds.prep (turn resolved.p.deps |=(j=[face=term interface=ifile] face.j)))
10989 =/ top=(list term) (turn molds |=(m=[name=term body=shape] name.m))
12144 =/ top=(list term) (turn molds |=(m=[name=term body=shape] name.m))
10990− =/ state=istate [0 ~ ~ ~ molds globals externals surs marks declared resolved.p.deps reserved ~ ~ ~ | file top prelude ~ 256 ~]
12145+ =/ state=istate [0 ~ ~ ~ molds globals externals surs marks declared resolved.p.deps reserved ~ ~ ~ | file top prelude ~ 256 ~ ~ ~ ~ ~ ~]
10991 =/ mts=(each imold-types @t) (module-mold-types molds state)
12146 =/ mts=(each imold-types @t) (module-mold-types molds state)
10992 ?: ?=(%| -.mts) [%| p.mts]
12147 ?: ?=(%| -.mts) [%| p.mts]
10993 =/ resolution=iresolved (resolve-groups ordinary molds globals externals surs marks declared resolved.p.deps reserved file prelude)
12148 =/ resolution=iresolved (resolve-groups ordinary molds globals externals surs marks declared resolved.p.deps reserved file prelude)
@@ -11324,20 +12479,1221 @@
11324 [env exports file derived.u.poke elaborations.support ~ `src `graph]
12479 [env exports file derived.u.poke elaborations.support ~ `src `graph]
11325 [%& [iface dependencies.ev]]
12480 [%& [iface dependencies.ev]]
11326::
12481::
12482+:: A checked program main is only the direct four-component source call.
12483+:: Grouping is transparent, but aliases, qualified wings and other module
12484+:: kinds remain outside this slice.
12485+++ program-main-def
12486+ |= ds=(list def)
12487+ ^- (unit def)
12488+ ?~ ds ~
12489+ ?: &(?=(%value -.i.ds) =(%main name.i.ds)) `i.ds
12490+ $(ds t.ds)
12491+::
12492+++ program-main-wing
12493+ |= e=expr
12494+ ^- (unit term)
12495+ ?: ?=(%group -.e) $(e inner.e)
12496+ ?. ?=(%wing -.e) ~
12497+ ?. ?=([@ ~] names.e) ~
12498+ `i.names.e
12499+::
12500+++ program-main-args
12501+ |= d=def
12502+ ^- (unit (list expr))
12503+ ?. ?=(%value -.d) ~
12504+ |-
12505+ ?: ?=(%group -.val.d) $(val.d inner.val.d)
12506+ ?. ?=(%call -.val.d) ~
12507+ =/ head=(unit term) (program-main-wing head.val.d)
12508+ ?~ head ~
12509+ ?. =(%program u.head) ~
12510+ ?. ?=([* * * * ~] args.val.d) ~
12511+ `args.val.d
12512+::
12513+++ program-main-parts
12514+ |= d=def
12515+ ^- (unit [init=term update=term view=term subs=term])
12516+ ?. ?=(%value -.d) ~
12517+ |-
12518+ ?: ?=(%group -.val.d) $(val.d inner.val.d)
12519+ ?. ?=(%call -.val.d) ~
12520+ =/ head=(unit term) (program-main-wing head.val.d)
12521+ ?~ head ~
12522+ ?. =(%program u.head) ~
12523+ ?. ?=([* * * * ~] args.val.d) ~
12524+ =/ args=(list expr) args.val.d
12525+ ?> ?=([* * * * ~] args)
12526+ =/ init=(unit term) (program-main-wing i.args)
12527+ =/ update=(unit term) (program-main-wing i.t.args)
12528+ =/ view=(unit term) (program-main-wing i.t.t.args)
12529+ =/ subs=(unit term) (program-main-wing i.t.t.t.args)
12530+ ?~ init ~
12531+ ?~ update ~
12532+ ?~ view ~
12533+ ?~ subs ~
12534+ `[u.init u.update u.view u.subs]
12535+::
12536+:: A data page is only the direct two-component source call. Grouping is
12537+:: transparent, but page aliases, qualified wings and other kinds are not.
12538+++ page-main-parts
12539+ |= d=def
12540+ ^- (unit [load=term view=term])
12541+ ?. ?=(%value -.d) ~
12542+ |-
12543+ ?: ?=(%group -.val.d) $(val.d inner.val.d)
12544+ ?. ?=(%call -.val.d) ~
12545+ =/ head=(unit term) (program-main-wing head.val.d)
12546+ ?~ head ~
12547+ ?. =(%page u.head) ~
12548+ ?. ?=([* * ~] args.val.d) ~
12549+ =/ args=(list expr) args.val.d
12550+ ?> ?=([* * ~] args)
12551+ =/ load=(unit term) (program-main-wing i.args)
12552+ =/ view=(unit term) (program-main-wing i.t.args)
12553+ ?~ load ~
12554+ ?~ view ~
12555+ `[u.load u.view]
12556+::
12557+++ program-empty-null
12558+ |= e=expr
12559+ ^- ?
12560+ ?- -.e
12561+ %lit =(%null form.lit.e)
12562+ %cast $(e val.e)
12563+ %group $(e inner.e)
12564+ %body ?~(defs.e $(e final.e) |)
12565+ * |
12566+ ==
12567+::
12568+++ program-subs-empty
12569+ |= d=def
12570+ ^- ?
12571+ ?. ?=(%value -.d) |
12572+ ?- -.val.d
12573+ %gate (program-empty-null body.val.d)
12574+ %gate-wide (program-empty-null body.val.d)
12575+ * |
12576+ ==
12577+::
12578+++ program-transparent
12579+ |= e=expr
12580+ ^- expr
12581+ ?- -.e
12582+ %group $(e inner.e)
12583+ %cast $(e val.e)
12584+ %body ?~(defs.e $(e final.e) e)
12585+ * e
12586+ ==
12587+++ program-init-tuple-null
12588+ |= d=def
12589+ ^- ?
12590+ ?. ?=(%value -.d) |
12591+ ?. |(?=(%gate -.val.d) ?=(%gate-wide -.val.d)) |
12592+ =/ body=expr
12593+ ?- -.val.d
12594+ %gate body.val.d
12595+ %gate-wide body.val.d
12596+ * !!
12597+ ==
12598+ =. body (program-transparent body)
12599+ ?. ?=(%tuple -.body) |
12600+ ?~ items.body |
12601+ (program-empty-null val:(rear items.body))
12602+::
12603+:: Recover only the update of an already recognized direct program main.
12604+:: Its written sample determines the message/model relationship; the canonical
12605+:: cmd, unit and update slot determine the result context. Publication is
12606+:: component-local so later subscription/view/initializer retries can accumulate.
12607+++ program-update-context
12608+ |= [main=def parts=[init=term update=term view=term subs=term] ds=(list def) resolution=iresolved initial=istate]
12609+ ^- (unit iresolved)
12610+ =/ env=ienv env.resolution
12611+ ?^ (ienv-lookup %main env) ~
12612+ ?^ (ienv-lookup update.parts env) ~
12613+ =/ updates=(list def)
12614+ (skim ds |=(d=def &(?=(%value -.d) =(update.parts name.d))))
12615+ ?. ?=([* ~] updates) ~
12616+ =/ update-def=def i.updates
12617+ ?> ?=(%value -.update-def)
12618+ =/ written-update=(unit sample) (direct-gate-sample update-def)
12619+ ?~ written-update ~
12620+ ?. ?=(%cell -.u.written-update) ~
12621+ ?. ?=([* * ~] items.u.written-update) ~
12622+ ?~ prelude.initial ~
12623+ =/ program=(unit ischeme) (ienv-lookup %program values.u.prelude.initial)
12624+ ?~ program ~
12625+ =/ command=(unit ischeme) (find-jibb-mold %cmd u.prelude.initial)
12626+ =/ list-template=(unit ischeme) (find-jibb-mold %list u.prelude.initial)
12627+ ?~ command ~
12628+ ?~ list-template ~
12629+ =/ heads=(unit igate-prelude-evidence) (direct-prelude-evidence ds prelude.initial)
12630+ ?~ heads ~
12631+ =/ written=(unit def) (~(get by gates.u.heads) %program)
12632+ ?~ written ~
12633+ =/ written-sample=(unit sample) (direct-gate-sample u.written)
12634+ ?~ written-sample ~
12635+ ?. ?=(%cell -.u.written-sample) ~
12636+ ?. ?=([* * * * ~] items.u.written-sample) ~
12637+ =/ checked=(map term def)
12638+ (~(put by (direct-checked-gates ds env)) update.parts update-def)
12639+ =/ templates=ienv
12640+ (turn molds.u.prelude.initial |=(x=[name=term template=ischeme] [name.x template.x]))
12641+ =/ scanned=(unit dgscan)
12642+ (dg-all-env-ids (weld env (weld values.u.prelude.initial templates)) 32.768 ~)
12643+ ?~ scanned ~
12644+ =. next.initial (dg-next-id ids.u.scanned 0)
12645+ =/ update-state=istate (reserve-def-caps val.update-def initial)
12646+ =/ sam=isample-result (infer-sample u.written-update env update-state)
12647+ ?: ?=(%| -.sam) ~
12648+ =/ actual-sample=itype (itype-normalize typ.p.sam sub.state.p.sam)
12649+ ?. ?=(%cell -.actual-sample) ~
12650+ =/ message=(unit itype)
12651+ (direct-slot-body hed.actual-sample (direct-sample-name i.items.u.written-update))
12652+ =/ model=(unit itype)
12653+ (direct-slot-body tal.actual-sample (direct-sample-name i.t.items.u.written-update))
12654+ ?~ message ~
12655+ ?~ model ~
12656+ =/ cmd=(unit itype) (template-apply u.command ~[u.message])
12657+ ?~ cmd ~
12658+ =/ command-result=(unit itype) (template-apply u.list-template ~[u.cmd])
12659+ ?~ command-result ~
12660+ =/ product=itype [%cell u.model u.command-result]
12661+ =/ instance=[typ=itype state=istate] (instantiate-scheme u.program state.p.sam)
12662+ ?. ?=(%fn -.typ.instance) ~
12663+ ?. ?=(%cell -.sample.typ.instance) ~
12664+ ?. ?=(%cell -.tal.sample.typ.instance) ~
12665+ =/ expected-update=(unit itype)
12666+ (direct-slot-body hed.tal.sample.typ.instance (direct-sample-name i.t.items.u.written-sample))
12667+ ?~ expected-update ~
12668+ ?. ?=(%fn -.u.expected-update) ~
12669+ :: Sample binders are not value faces. Strip only those two slot faces
12670+ :: for the invariant canonical-gate proof; the source-faced gate is still
12671+ :: used by the complete positional call and final ordinary result cast.
12672+ =/ canonical-candidate=itype [%fn [%cell u.message u.model] product]
12673+ =/ gate-fit=ifit
12674+ (direct-invariant canonical-candidate u.expected-update sub.state.instance next.state.instance)
12675+ ?. ?=(%ok -.gate-fit) ~
12676+ =/ closed=itype
12677+ (itype-normalize [%fn typ.p.sam product] sub.gate-fit)
12678+ ?. ?=(%fn -.closed) ~
12679+ :: The closed product no longer needs the canonical slot substitutions.
12680+ :: Start the body at its ordinary sample state so existing branch retries
12681+ :: keep their substitution guards, but retain the shared fresh-ID high water.
12682+ =/ st=istate state.p.sam(next next.gate-fit, gate-defs checked, head-evidence heads)
12683+ =/ body=expr
12684+ ?- -.val.update-def
12685+ %gate body.val.update-def
12686+ %gate-wide body.val.update-def
12687+ * !!
12688+ ==
12689+ =/ inferred=iresult
12690+ (infer-call-context-arg body product.closed env.p.sam st (span-of body))
12691+ ?: ?=(%| -.inferred) ~
12692+ =/ product-fit=ifit
12693+ (itype-fit typ.p.inferred product.closed sub.state.p.inferred next.state.p.inferred)
12694+ ?. ?=(%ok -.product-fit) ~
12695+ =/ merged-product=itype
12696+ (itype-merge-faces typ.p.inferred product.closed sub.product-fit)
12697+ =/ actual-cast=itype [%fn typ.p.sam merged-product]
12698+ =/ cast=ifit
12699+ (itype-fit actual-cast closed sub.product-fit next.product-fit)
12700+ ?. ?=(%ok -.cast) ~
12701+ =/ merged=itype (itype-merge-faces actual-cast closed sub.cast)
12702+ =/ adjusted=iresult
12703+ [%& merged state.p.inferred(sub sub.cast, next next.cast)]
12704+ =/ added=(unit iadded-definition)
12705+ (add-supported-result update-def adjusted update-state env checked artifacts.resolution)
12706+ ?~ added ~
12707+ =/ recovered=(unit ischeme) (ienv-lookup update.parts env.u.added)
12708+ ?~ recovered ~
12709+ ?. ?=(~ vars.u.recovered) ~
12710+ ?. ?=(~ (itype-vars typ.u.recovered)) ~
12711+ `[env.u.added grouped.resolution artifacts.u.added]
12712+::
12713+++ program-inferred-slot
12714+ |= [typ=itype name=(unit term)]
12715+ ^- itype
12716+ ?~ name typ
12717+ ?: &(?=(%face -.typ) =(name.typ u.name)) body.typ
12718+ typ
12719+::
12720+++ program-inferred-sample
12721+ |= [typ=itype sam=sample]
12722+ ^- itype
12723+ (program-inferred-slot typ (direct-sample-name sam))
12724+::
12725+++ program-two-slot-names
12726+ |= sam=sample
12727+ ^- (unit [first=(unit term) second=(unit term)])
12728+ ?- -.sam
12729+ %cell
12730+ ?. ?=([* * ~] items.sam) ~
12731+ `[(direct-sample-name i.items.sam) (direct-sample-name i.t.items.sam)]
12732+ %face
12733+ ?. ?=(%cell -.shape.sam) ~
12734+ ?. ?=([* * ~] fields.shape.sam) ~
12735+ `[(direct-field-name i.fields.shape.sam) (direct-field-name i.t.fields.shape.sam)]
12736+ * ~
12737+ ==
12738+::
12739+:: Read message/model from the checked update and its written source layout.
12740+:: The source names strip only top-level sample binder faces; nested value
12741+:: faces remain part of the canonical message and model.
12742+++ program-update-relation
12743+ |= [name=term ds=(list def) env=ienv]
12744+ ^- (unit [message=itype model=itype])
12745+ =/ update=(unit ischeme) (ienv-lookup name env)
12746+ ?~ update ~
12747+ ?. ?=(~ vars.u.update) ~
12748+ ?. ?=(~ (itype-vars typ.u.update)) ~
12749+ ?. ?=(%fn -.typ.u.update) ~
12750+ ?. ?=(%cell -.sample.typ.u.update) ~
12751+ =/ defs=(list def)
12752+ (skim ds |=(d=def &(?=(%value -.d) =(name name.d))))
12753+ ?. ?=([* ~] defs) ~
12754+ =/ written=(unit sample) (direct-gate-sample i.defs)
12755+ ?~ written ~
12756+ ?. ?=(%cell -.u.written) ~
12757+ ?. ?=([* * ~] items.u.written) ~
12758+ =/ message=(unit itype)
12759+ (direct-slot-body hed.sample.typ.u.update (direct-sample-name i.items.u.written))
12760+ =/ model=(unit itype)
12761+ (direct-slot-body tal.sample.typ.u.update (direct-sample-name i.t.items.u.written))
12762+ ?~ message ~
12763+ ?~ model ~
12764+ `[u.message u.model]
12765+::
12766+:: Recover an unannotated direct subscription component from the checked
12767+:: update relation and canonical fourth program slot. This establishes only
12768+:: the value type; the final program watch proof remains separate.
12769+++ program-subs-context
12770+ |= [parts=[init=term update=term view=term subs=term] ds=(list def) resolution=iresolved initial=istate]
12771+ ^- (unit iresolved)
12772+ =/ env=ienv env.resolution
12773+ ?^ (ienv-lookup %main env) ~
12774+ ?^ (ienv-lookup subs.parts env) ~
12775+ =/ relation=(unit [message=itype model=itype])
12776+ (program-update-relation update.parts ds env)
12777+ ?~ relation ~
12778+ =/ subs=(list def)
12779+ (skim ds |=(d=def &(?=(%value -.d) =(subs.parts name.d))))
12780+ ?. ?=([* ~] subs) ~
12781+ =/ subs-def=def i.subs
12782+ ?> ?=(%value -.subs-def)
12783+ =/ written-subs=(unit sample) (direct-gate-sample subs-def)
12784+ ?~ written-subs ~
12785+ ?~ prelude.initial ~
12786+ =/ program=(unit ischeme) (ienv-lookup %program values.u.prelude.initial)
12787+ =/ sub=(unit ischeme) (find-jibb-mold %sub u.prelude.initial)
12788+ =/ list-template=(unit ischeme) (find-jibb-mold %list u.prelude.initial)
12789+ ?~ program ~
12790+ ?~ sub ~
12791+ ?~ list-template ~
12792+ =/ heads=(unit igate-prelude-evidence) (direct-prelude-evidence ds prelude.initial)
12793+ ?~ heads ~
12794+ =/ written=(unit def) (~(get by gates.u.heads) %program)
12795+ ?~ written ~
12796+ =/ written-sample=(unit sample) (direct-gate-sample u.written)
12797+ ?~ written-sample ~
12798+ ?. ?=(%cell -.u.written-sample) ~
12799+ ?. ?=([* * * * ~] items.u.written-sample) ~
12800+ =/ checked=(map term def) (direct-checked-gates ds env)
12801+ =/ templates=ienv
12802+ (turn molds.u.prelude.initial |=(x=[name=term template=ischeme] [name.x template.x]))
12803+ =/ scanned=(unit dgscan)
12804+ (dg-all-env-ids (weld env (weld values.u.prelude.initial templates)) 32.768 ~)
12805+ ?~ scanned ~
12806+ =. next.initial (dg-next-id ids.u.scanned 0)
12807+ =/ subs-state=istate (reserve-def-caps val.subs-def initial)
12808+ =/ sam=isample-result (infer-sample u.written-subs env subs-state)
12809+ ?: ?=(%| -.sam) ~
12810+ =/ actual-model=itype (program-inferred-sample typ.p.sam u.written-subs)
12811+ ?. ?=(~ (itype-vars actual-model)) ~
12812+ ?: (itype-has-tag actual-model) ~
12813+ =/ model-fit=ifit
12814+ (direct-invariant actual-model model.u.relation sub.state.p.sam next.state.p.sam)
12815+ ?. ?=(%ok -.model-fit) ~
12816+ =/ message-sub=(unit itype) (template-apply u.sub ~[message.u.relation])
12817+ ?~ message-sub ~
12818+ =/ product=(unit itype) (template-apply u.list-template ~[u.message-sub])
12819+ ?~ product ~
12820+ =/ instance=[typ=itype state=istate]
12821+ (instantiate-scheme u.program state.p.sam(sub sub.model-fit, next next.model-fit))
12822+ ?. ?=(%fn -.typ.instance) ~
12823+ ?. ?=(%cell -.sample.typ.instance) ~
12824+ ?. ?=(%cell -.tal.sample.typ.instance) ~
12825+ ?. ?=(%cell -.tal.tal.sample.typ.instance) ~
12826+ =/ expected-subs=(unit itype)
12827+ (direct-slot-body tal.tal.tal.sample.typ.instance (direct-sample-name i.t.t.t.items.u.written-sample))
12828+ ?~ expected-subs ~
12829+ ?. ?=(%fn -.u.expected-subs) ~
12830+ =/ canonical=itype [%fn model.u.relation u.product]
12831+ =/ gate-fit=ifit
12832+ (direct-invariant canonical u.expected-subs sub.state.instance next.state.instance)
12833+ ?. ?=(%ok -.gate-fit) ~
12834+ =/ closed=itype
12835+ (itype-normalize [%fn typ.p.sam u.product] sub.gate-fit)
12836+ ?. ?=(%fn -.closed) ~
12837+ =/ body=expr
12838+ ?- -.val.subs-def
12839+ %gate body.val.subs-def
12840+ %gate-wide body.val.subs-def
12841+ * !!
12842+ ==
12843+ =/ st=istate
12844+ state.p.sam(next next.gate-fit, gate-defs checked, head-evidence heads)
12845+ =/ inferred=iresult
12846+ (infer-call-context-arg body product.closed env.p.sam st (span-of body))
12847+ ?: ?=(%| -.inferred) ~
12848+ =/ product-fit=ifit
12849+ (itype-fit typ.p.inferred product.closed sub.state.p.inferred next.state.p.inferred)
12850+ ?. ?=(%ok -.product-fit) ~
12851+ =/ merged-product=itype
12852+ (itype-merge-faces typ.p.inferred product.closed sub.product-fit)
12853+ =/ actual-cast=itype [%fn typ.p.sam merged-product]
12854+ =/ cast=ifit
12855+ (itype-fit actual-cast closed sub.product-fit next.product-fit)
12856+ ?. ?=(%ok -.cast) ~
12857+ =/ merged=itype (itype-merge-faces actual-cast closed sub.cast)
12858+ =/ adjusted=iresult
12859+ [%& merged state.p.inferred(sub sub.cast, next next.cast)]
12860+ =/ added=(unit iadded-definition)
12861+ (add-supported-result subs-def adjusted subs-state env checked artifacts.resolution)
12862+ ?~ added ~
12863+ =/ recovered=(unit ischeme) (ienv-lookup subs.parts env.u.added)
12864+ ?~ recovered ~
12865+ ?. ?=(~ vars.u.recovered) ~
12866+ ?. ?=(~ (itype-vars typ.u.recovered)) ~
12867+ `[env.u.added grouped.resolution artifacts.u.added]
12868+::
12869++$ iview-site [xs=expr mapper=term]
12870+++ program-view-site
12871+ |= e=expr
12872+ ^- (unit iview-site)
12873+ =. e (program-transparent e)
12874+ ?. ?=(%call -.e) ~
12875+ ?. ?=([* ~] args.e) ~
12876+ =/ each=expr (program-transparent head.e)
12877+ ?. ?=(%wing -.each) ~
12878+ ?. ?=([%each ~] names.each) ~
12879+ =/ turned=expr (program-transparent i.args.e)
12880+ ?. ?=(%call -.turned) ~
12881+ ?. ?=([* * ~] args.turned) ~
12882+ =/ turn=expr (program-transparent head.turned)
12883+ ?. ?=(%wing -.turn) ~
12884+ ?. ?=([%turn ~] names.turn) ~
12885+ =/ xs=expr (program-transparent i.args.turned)
12886+ ?. ?=(%wing -.xs) ~
12887+ ?~ names.xs ~
12888+ =/ mapper=(unit term) (program-main-wing i.t.args.turned)
12889+ ?~ mapper ~
12890+ `[xs u.mapper]
12891+::
12892+++ program-recovery-names
12893+ |= ds=(list def)
12894+ ^- (list term)
12895+ =/ main=(unit def) (program-main-def ds)
12896+ ?~ main ~
12897+ =/ parts=(unit [init=term update=term view=term subs=term])
12898+ (program-main-parts u.main)
12899+ ?~ parts ~
12900+ =/ views=(list def)
12901+ (skim ds |=(d=def &(?=(%value -.d) =(view.u.parts name.d))))
12902+ ?. ?=([* ~] views) ~
12903+ =/ view-def=def i.views
12904+ ?> ?=(%value -.view-def)
12905+ =/ written=(unit sample) (direct-gate-sample view-def)
12906+ ?~ written ~
12907+ =/ body=expr
12908+ ?- -.val.view-def
12909+ %gate body.val.view-def
12910+ %gate-wide body.val.view-def
12911+ * !!
12912+ ==
12913+ =/ sites=(unit (list iview-site)) (program-view-sites body ~)
12914+ ?~ sites ~
12915+ ?. ?=([* ~] u.sites) ~
12916+ =/ mapper=term mapper.i.u.sites
12917+ =/ components=(list term)
12918+ :~ init.u.parts
12919+ update.u.parts
12920+ view.u.parts
12921+ subs.u.parts
12922+ ==
12923+ ?: (lien components |=(n=term =(n mapper))) ~
12924+ =/ mappers=(list def)
12925+ (skim ds |=(d=def &(?=(%value -.d) =(mapper name.d))))
12926+ ?. ?=([* ~] mappers) ~
12927+ :~ init.u.parts
12928+ update.u.parts
12929+ view.u.parts
12930+ subs.u.parts
12931+ mapper
12932+ ==
12933+::
12934+++ program-sample-binders
12935+ |= sam=sample
12936+ ^- (list term)
12937+ ?- -.sam
12938+ %bind ~[name.sam]
12939+ %face ~[name.sam]
12940+ %pun ~[name.sam]
12941+ %cell (zing (turn items.sam |=(s=sample (program-sample-binders s))))
12942+ * ~
12943+ ==
12944+::
12945+++ program-pattern-binders
12946+ |= pat=pattern
12947+ ^- (list term)
12948+ ?- -.pat
12949+ %bind ~[name.pat]
12950+ %cell (zing (turn items.pat |=(p=pattern (program-pattern-binders p))))
12951+ * ~
12952+ ==
12953+::
12954+++ program-view-sites-merge
12955+ |= [a=(unit (list iview-site)) b=(unit (list iview-site))]
12956+ ^- (unit (list iview-site))
12957+ ?~ a ~
12958+ ?~ b ~
12959+ `(weld u.a u.b)
12960+::
12961+++ program-view-sites-exprs
12962+ |= [xs=(list expr) locals=(list term)]
12963+ ^- (unit (list iview-site))
12964+ ?~ xs `~
12965+ (program-view-sites-merge (program-view-sites i.xs locals) $(xs t.xs))
12966+::
12967+++ program-view-sites-items
12968+ |= [xs=(list item) locals=(list term)]
12969+ ^- (unit (list iview-site))
12970+ ?~ xs `~
12971+ (program-view-sites-merge (program-view-sites val.i.xs locals) $(xs t.xs))
12972+::
12973+++ program-view-sites-pieces
12974+ |= [xs=(list piece) locals=(list term)]
12975+ ^- (unit (list iview-site))
12976+ ?~ xs `~
12977+ =/ here=(unit (list iview-site))
12978+ ?- -.i.xs
12979+ %expr (program-view-sites p.i.xs locals)
12980+ %text `~
12981+ ==
12982+ (program-view-sites-merge here $(xs t.xs))
12983+::
12984+++ program-view-sites-qsegs
12985+ |= [xs=(list qseg) locals=(list term)]
12986+ ^- (unit (list iview-site))
12987+ ?~ xs `~
12988+ =/ here=(unit (list iview-site))
12989+ ?- -.i.xs
12990+ %expr (program-view-sites p.i.xs locals)
12991+ %knot `~
12992+ ==
12993+ (program-view-sites-merge here $(xs t.xs))
12994+::
12995+++ program-view-sites-edits
12996+ |= [xs=(list edit) locals=(list term)]
12997+ ^- (unit (list iview-site))
12998+ ?~ xs `~
12999+ (program-view-sites-merge (program-view-sites val.i.xs locals) $(xs t.xs))
13000+::
13001+++ program-view-sites-defs
13002+ |= [xs=(list def) locals=(list term)]
13003+ ^- (unit (list iview-site))
13004+ ?~ xs `~
13005+ =/ here=(unit (list iview-site))
13006+ ?: ?=(%mold -.i.xs) `~
13007+ (program-view-sites val.i.xs locals)
13008+ (program-view-sites-merge here $(xs t.xs))
13009+::
13010+++ program-view-sites-arms
13011+ |= [xs=(list arm) locals=(list term)]
13012+ ^- (unit (list iview-site))
13013+ ?~ xs `~
13014+ =/ nested=(list term) (weld (program-pattern-binders pat.i.xs) locals)
13015+ (program-view-sites-merge (program-view-sites val.i.xs nested) $(xs t.xs))
13016+::
13017+++ program-view-sites
13018+ |= [e=expr locals=(list term)]
13019+ ^- (unit (list iview-site))
13020+ =/ site=(unit iview-site) (program-view-site e)
13021+ ?^ site
13022+ =/ names=(list term) ~[%each %turn mapper.u.site]
13023+ ?> ?=(%wing -.xs.u.site)
13024+ =/ root=term (rear names.xs.u.site)
13025+ ?: |((lien names |=(n=term (lien locals |=(x=term =(n x))))) (lien locals |=(x=term =(root x))))
13026+ ~
13027+ `~[u.site]
13028+ ?- -.e
13029+ %str (program-view-sites-pieces pieces.e locals)
13030+ %qath (program-view-sites-qsegs segs.e locals)
13031+ %change (program-view-sites-edits edits.e locals)
13032+ %pair (program-view-sites val.e locals)
13033+ %unit (program-view-sites val.e locals)
13034+ %group (program-view-sites inner.e locals)
13035+ %list (program-view-sites-exprs items.e locals)
13036+ %tuple (program-view-sites-items items.e locals)
13037+ %gate
13038+ (program-view-sites body.e (weld (program-sample-binders sample.e) locals))
13039+ %gate-wide
13040+ (program-view-sites body.e (weld (program-sample-binders sample.e) locals))
13041+ %call
13042+ (program-view-sites-merge (program-view-sites head.e locals) (program-view-sites-exprs args.e locals))
13043+ %cast (program-view-sites val.e locals)
13044+ %trace
13045+ (program-view-sites-merge (program-view-sites val.e locals) (program-view-sites then.e locals))
13046+ %branch
13047+ (program-view-sites-merge (program-view-sites subject.e locals) (program-view-sites-arms arms.e locals))
13048+ %body
13049+ =/ nested=(list term) (weld (global-value-names defs.e) locals)
13050+ (program-view-sites-merge (program-view-sites-defs defs.e nested) (program-view-sites final.e nested))
13051+ * `~
13052+ ==
13053+::
13054+++ program-union-tag-case
13055+ |= [expected=itype tag=@]
13056+ ^- (unit itype)
13057+ ?. ?=(%union -.expected) ~
13058+ =/ remaining=(list itype) cases.expected
13059+ =/ found=(unit itype) ~
13060+ =/ seen=(set @) *(set @)
13061+ |-
13062+ ?~ remaining found
13063+ =/ case=itype i.remaining
13064+ =/ head=(unit @)
13065+ ?: ?=(%const -.case) `val.literal.case
13066+ ?. ?=(%cell -.case) ~
13067+ ?. ?=(%const -.hed.case) ~
13068+ `val.literal.hed.case
13069+ ?~ head ~
13070+ ?: (~(has in:..zuse seen) u.head) ~
13071+ =. seen (~(put in:..zuse seen) u.head)
13072+ =? found =(tag u.head)
13073+ ?^(found ~ `case)
13074+ $(remaining t.remaining)
13075+::
13076+++ program-single-case-fit
13077+ |= [actual=itype expected=itype sub=isub next=@ud]
13078+ ^- ifit
13079+ =. actual (itype-normalize actual sub)
13080+ =. expected (itype-normalize expected sub)
13081+ ?. ?=(%union -.expected) [%unknown ~]
13082+ =/ found=(unit itype)
13083+ ?: ?=(%const -.actual) `actual
13084+ ?: ?=(%tag -.actual) `actual
13085+ ?: ?=(%cell -.actual) `actual
13086+ ?. ?=(%union -.actual) ~
13087+ ?. ?=([* ~] cases.actual) ~
13088+ `i.cases.actual
13089+ ?~ found [%unknown ~]
13090+ =/ case=itype u.found
13091+ =/ tag=(unit lit)
13092+ ?: ?=(%const -.case) `literal.case
13093+ ?: ?=(%tag -.case) `literal.case
13094+ ?. ?=(%cell -.case) ~
13095+ =/ head=itype (projection-field-target hed.case)
13096+ ?: ?=(%const -.head) `literal.head
13097+ ?: ?=(%tag -.head) `literal.head
13098+ ~
13099+ ?~ tag [%unknown ~]
13100+ =/ chosen=(unit itype) (program-union-tag-case expected val.u.tag)
13101+ ?~ chosen [%unknown ~]
13102+ ?: |(?=(%const -.case) ?=(%tag -.case))
13103+ ?. ?=(%const -.u.chosen) [%unknown ~]
13104+ (itype-fit case u.chosen sub next)
13105+ ?. ?=(%cell -.case) [%unknown ~]
13106+ ?. ?=(%cell -.u.chosen) [%unknown ~]
13107+ =/ head-fit=ifit (itype-fit hed.case hed.u.chosen sub next)
13108+ ?. ?=(%ok -.head-fit) head-fit
13109+ (itype-fit tal.case tal.u.chosen sub.head-fit next.head-fit)
13110+::
13111+++ program-single-generic-fit
13112+ |= [actual=itype expected=itype sub=isub next=@ud]
13113+ ^- ifit
13114+ =. actual (itype-normalize actual sub)
13115+ =. expected (itype-normalize expected sub)
13116+ ?. &(?=(%union -.actual) ?=(%union -.expected)) [%unknown ~]
13117+ ?~ origin.actual [%unknown ~]
13118+ ?. =(origin.actual origin.expected) [%unknown ~]
13119+ ?. ?=([* ~] args.actual) [%unknown ~]
13120+ ?. ?=([* ~] args.expected) [%unknown ~]
13121+ =/ argument-fit=ifit (direct-invariant i.args.actual i.args.expected sub next)
13122+ ?: ?=(%ok -.argument-fit) argument-fit
13123+ (program-single-case-fit i.args.actual i.args.expected sub next)
13124+::
13125+++ program-keyed-product-fit
13126+ |= [actual=itype expected=itype element=ischeme sub=isub next=@ud]
13127+ ^- ifit
13128+ =. actual (itype-normalize actual sub)
13129+ =. expected (itype-normalize expected sub)
13130+ ?. &(?=(%cell -.actual) ?=(%cell -.expected)) [%unknown ~]
13131+ =/ key-fit=ifit
13132+ (itype-fit (projection-field-target hed.actual) (projection-field-target hed.expected) sub next)
13133+ ?. ?=(%ok -.key-fit) key-fit
13134+ =/ actual-el=itype
13135+ (itype-normalize (projection-field-target tal.actual) sub.key-fit)
13136+ =/ expected-el=itype
13137+ (itype-normalize (projection-field-target tal.expected) sub.key-fit)
13138+ ?. &(?=(%union -.actual-el) ?=(%union -.expected-el)) [%unknown ~]
13139+ ?. =(origin.actual-el origin.expected-el) [%unknown ~]
13140+ ?. ?=([* ~] args.actual-el) [%unknown ~]
13141+ ?. ?=([* ~] args.expected-el) [%unknown ~]
13142+ =/ canonical-actual=(unit itype)
13143+ (template-apply element ~[i.args.actual-el])
13144+ =/ canonical-expected=(unit itype)
13145+ (template-apply element ~[i.args.expected-el])
13146+ ?~ canonical-actual [%unknown ~]
13147+ ?~ canonical-expected [%unknown ~]
13148+ =/ actual-check=ifit
13149+ (direct-invariant actual-el u.canonical-actual sub.key-fit next.key-fit)
13150+ ?. ?=(%ok -.actual-check) actual-check
13151+ =/ expected-check=ifit
13152+ (direct-invariant expected-el u.canonical-expected sub.actual-check next.actual-check)
13153+ ?. ?=(%ok -.expected-check) expected-check
13154+ =/ case-fit=ifit
13155+ (program-single-case-fit i.args.actual-el i.args.expected-el sub.expected-check next.expected-check)
13156+ case-fit
13157+::
13158+:: Recover exactly one direct keyed each/turn row mapper, then its view.
13159+:: The prelude's own each and turn schemes determine the mapper gate: the
13160+:: key is inferred from the mapper body, never selected by this recovery.
13161+++ program-view-context
13162+ |= [parts=[init=term update=term view=term subs=term] ds=(list def) resolution=iresolved initial=istate]
13163+ ^- (unit iresolved)
13164+ =/ env=ienv env.resolution
13165+ ?^ (ienv-lookup %main env) ~
13166+ ?^ (ienv-lookup view.parts env) ~
13167+ =/ relation=(unit [message=itype model=itype])
13168+ (program-update-relation update.parts ds env)
13169+ ?~ relation ~
13170+ =/ views=(list def)
13171+ (skim ds |=(d=def &(?=(%value -.d) =(view.parts name.d))))
13172+ ?. ?=([* ~] views) ~
13173+ =/ view-def=def i.views
13174+ ?> ?=(%value -.view-def)
13175+ =/ written-view=(unit sample) (direct-gate-sample view-def)
13176+ ?~ written-view ~
13177+ =/ view-body=expr
13178+ ?- -.val.view-def
13179+ %gate body.val.view-def
13180+ %gate-wide body.val.view-def
13181+ * !!
13182+ ==
13183+ =/ sites=(unit (list iview-site)) (program-view-sites view-body ~)
13184+ ?~ sites ~
13185+ ?. ?=([* ~] u.sites) ~
13186+ =/ site=iview-site i.u.sites
13187+ =/ component-names=(list term) ~[init.parts update.parts view.parts subs.parts]
13188+ ?: (lien component-names |=(n=term =(n mapper.site))) ~
13189+ ?^ (ienv-lookup mapper.site env) ~
13190+ =/ mappers=(list def)
13191+ (skim ds |=(d=def &(?=(%value -.d) =(mapper.site name.d))))
13192+ ?. ?=([* ~] mappers) ~
13193+ =/ mapper-def=def i.mappers
13194+ ?> ?=(%value -.mapper-def)
13195+ =/ written-mapper=(unit sample) (direct-gate-sample mapper-def)
13196+ ?~ written-mapper ~
13197+ ?~ prelude.initial ~
13198+ =/ program=(unit ischeme) (ienv-lookup %program values.u.prelude.initial)
13199+ =/ each-scheme=(unit ischeme) (ienv-lookup %each values.u.prelude.initial)
13200+ =/ turn-scheme=(unit ischeme) (ienv-lookup %turn values.u.prelude.initial)
13201+ =/ element=(unit ischeme) (find-jibb-mold %element u.prelude.initial)
13202+ =/ list-template=(unit ischeme) (find-jibb-mold %list u.prelude.initial)
13203+ ?~ program ~
13204+ ?~ each-scheme ~
13205+ ?~ turn-scheme ~
13206+ ?~ element ~
13207+ ?~ list-template ~
13208+ =/ heads=(unit igate-prelude-evidence) (direct-prelude-evidence ds prelude.initial)
13209+ ?~ heads ~
13210+ =/ written-program=(unit def) (~(get by gates.u.heads) %program)
13211+ =/ written-each=(unit def) (~(get by gates.u.heads) %each)
13212+ =/ written-turn=(unit def) (~(get by gates.u.heads) %turn)
13213+ ?~ written-program ~
13214+ ?~ written-each ~
13215+ ?~ written-turn ~
13216+ =/ program-sample=(unit sample) (direct-gate-sample u.written-program)
13217+ =/ each-sample=(unit sample) (direct-gate-sample u.written-each)
13218+ =/ turn-sample=(unit sample) (direct-gate-sample u.written-turn)
13219+ ?~ program-sample ~
13220+ ?~ each-sample ~
13221+ ?~ turn-sample ~
13222+ ?. ?=(%cell -.u.program-sample) ~
13223+ ?. ?=([* * * * ~] items.u.program-sample) ~
13224+ =/ turn-names=(unit [first=(unit term) second=(unit term)])
13225+ (program-two-slot-names u.turn-sample)
13226+ ?~ turn-names ~
13227+ =/ checked=(map term def) (direct-checked-gates ds env)
13228+ =/ templates=ienv
13229+ (turn molds.u.prelude.initial |=(x=[name=term template=ischeme] [name.x template.x]))
13230+ =/ scanned=(unit dgscan)
13231+ (dg-all-env-ids (weld env (weld values.u.prelude.initial templates)) 32.768 ~)
13232+ ?~ scanned ~
13233+ =. next.initial (dg-next-id ids.u.scanned 0)
13234+ =/ view-state=istate (reserve-def-caps val.view-def initial)
13235+ =/ sam=isample-result (infer-sample u.written-view env view-state)
13236+ ?: ?=(%| -.sam) ~
13237+ =/ actual-model=itype (program-inferred-sample typ.p.sam u.written-view)
13238+ =/ model-fit=ifit
13239+ (direct-invariant actual-model model.u.relation sub.state.p.sam next.state.p.sam)
13240+ ?. ?=(%ok -.model-fit) ~
13241+ =/ xs-result=iresult
13242+ (infer-fragment xs.site env.p.sam state.p.sam(sub sub.model-fit, next next.model-fit))
13243+ ?: ?=(%| -.xs-result) ~
13244+ =/ element-var=itype [%var next.state.p.xs-result]
13245+ =/ list-a=(unit itype) (template-apply u.list-template ~[element-var])
13246+ ?~ list-a ~
13247+ =/ xs-fit=ifit
13248+ (itype-fit typ.p.xs-result u.list-a sub.state.p.xs-result +(next.state.p.xs-result))
13249+ ?. ?=(%ok -.xs-fit) ~
13250+ =/ closed-xs=itype (itype-normalize u.list-a sub.xs-fit)
13251+ ?^ (itype-vars closed-xs) ~
13252+ ?: (itype-has-tag closed-xs) ~
13253+ =/ each-instance=[typ=itype state=istate]
13254+ (instantiate-scheme u.each-scheme state.p.xs-result(sub sub.xs-fit, next next.xs-fit))
13255+ ?. ?=(%fn -.typ.each-instance) ~
13256+ =/ turn-instance=[typ=itype state=istate]
13257+ (instantiate-scheme u.turn-scheme state.each-instance)
13258+ ?. ?=(%fn -.typ.turn-instance) ~
13259+ ?. ?=(%cell -.sample.typ.turn-instance) ~
13260+ =/ element-message=(unit itype)
13261+ (template-apply u.element ~[message.u.relation])
13262+ ?~ element-message ~
13263+ =/ each-fit=ifit
13264+ (itype-fit product.typ.each-instance u.element-message sub.state.turn-instance next.state.turn-instance)
13265+ ?. ?=(%ok -.each-fit) ~
13266+ =/ each-input=itype
13267+ (program-inferred-sample sample.typ.each-instance u.each-sample)
13268+ =/ turn-fit=ifit
13269+ (itype-fit product.typ.turn-instance each-input sub.each-fit next.each-fit)
13270+ ?. ?=(%ok -.turn-fit) ~
13271+ =/ turn-list=itype
13272+ (program-inferred-slot hed.sample.typ.turn-instance first.u.turn-names)
13273+ =/ list-fit=ifit
13274+ (itype-fit closed-xs turn-list sub.turn-fit next.turn-fit)
13275+ ?. ?=(%ok -.list-fit) ~
13276+ =/ mapper-type=itype
13277+ (program-inferred-slot tal.sample.typ.turn-instance second.u.turn-names)
13278+ =/ expected-mapper=itype (itype-normalize mapper-type sub.list-fit)
13279+ ?. ?=(%fn -.expected-mapper) ~
13280+ ?^ (itype-vars sample.expected-mapper) ~
13281+ ?: (itype-has-tag sample.expected-mapper) ~
13282+ :: These faces come from the source-backed each sample. Keeping them in
13283+ :: the expected mapper product lets ordinary tuple inference supply key/el.
13284+ ?. ?=(%cell -.product.expected-mapper) ~
13285+ ?. ?=(%face -.hed.product.expected-mapper) ~
13286+ ?. =(%key name.hed.product.expected-mapper) ~
13287+ ?. ?=(%face -.tal.product.expected-mapper) ~
13288+ ?. =(%el name.tal.product.expected-mapper) ~
13289+ =/ mapper-state=istate
13290+ (reserve-def-caps val.mapper-def initial(next next.list-fit))
13291+ =/ mapper-sam=isample-result (infer-sample u.written-mapper env mapper-state)
13292+ ?: ?=(%| -.mapper-sam) ~
13293+ =/ mapper-input=itype (program-inferred-sample typ.p.mapper-sam u.written-mapper)
13294+ =/ mapper-sample-fit=ifit
13295+ (direct-invariant mapper-input sample.expected-mapper sub.state.p.mapper-sam next.state.p.mapper-sam)
13296+ ?. ?=(%ok -.mapper-sample-fit) ~
13297+ =/ mapper-product=itype
13298+ (itype-normalize product.expected-mapper sub.mapper-sample-fit)
13299+ =/ mapper-body=expr
13300+ ?- -.val.mapper-def
13301+ %gate body.val.mapper-def
13302+ %gate-wide body.val.mapper-def
13303+ * !!
13304+ ==
13305+ =/ mapper-inferred=iresult
13306+ (infer-call-context-arg mapper-body mapper-product env.p.mapper-sam state.p.mapper-sam(sub sub.mapper-sample-fit, next next.mapper-sample-fit) (span-of mapper-body))
13307+ ?: ?=(%| -.mapper-inferred) ~
13308+ =/ ordinary-product-fit=ifit
13309+ (itype-fit typ.p.mapper-inferred mapper-product sub.state.p.mapper-inferred next.state.p.mapper-inferred)
13310+ =/ mapper-product-fit=ifit
13311+ ?: ?=(%ok -.ordinary-product-fit) ordinary-product-fit
13312+ (program-keyed-product-fit typ.p.mapper-inferred mapper-product u.element sub.state.p.mapper-inferred next.state.p.mapper-inferred)
13313+ ?. ?=(%ok -.mapper-product-fit) ~
13314+ =/ closed-mapper-product=itype
13315+ (itype-normalize mapper-product sub.mapper-product-fit)
13316+ ?^ (itype-vars closed-mapper-product) ~
13317+ ?: (itype-has-tag closed-mapper-product) ~
13318+ =/ merged-mapper-product=itype
13319+ (itype-merge-faces typ.p.mapper-inferred closed-mapper-product sub.mapper-product-fit)
13320+ =/ mapper-cast=itype [%fn typ.p.mapper-sam merged-mapper-product]
13321+ =/ closed-mapper=itype [%fn typ.p.mapper-sam closed-mapper-product]
13322+ =/ mapper-cast-fit=ifit
13323+ (itype-fit mapper-cast closed-mapper sub.mapper-product-fit next.mapper-product-fit)
13324+ ?. ?=(%ok -.mapper-cast-fit) ~
13325+ =/ merged-mapper=itype
13326+ (itype-merge-faces mapper-cast closed-mapper sub.mapper-cast-fit)
13327+ =/ mapper-adjusted=iresult
13328+ [%& merged-mapper state.p.mapper-inferred(sub sub.mapper-cast-fit, next next.mapper-cast-fit)]
13329+ =/ mapper-added=(unit iadded-definition)
13330+ (add-supported-result mapper-def mapper-adjusted mapper-state env checked artifacts.resolution)
13331+ ?~ mapper-added ~
13332+ =/ mapper-scheme=(unit ischeme) (ienv-lookup mapper.site env.u.mapper-added)
13333+ ?~ mapper-scheme ~
13334+ ?. ?=(~ vars.u.mapper-scheme) ~
13335+ ?. ?=(~ (itype-vars typ.u.mapper-scheme)) ~
13336+ =/ program-instance=[typ=itype state=istate]
13337+ (instantiate-scheme u.program state.p.sam(next next.mapper-cast-fit))
13338+ ?. ?=(%fn -.typ.program-instance) ~
13339+ ?. ?=(%cell -.sample.typ.program-instance) ~
13340+ ?. ?=(%cell -.tal.sample.typ.program-instance) ~
13341+ ?. ?=(%cell -.tal.tal.sample.typ.program-instance) ~
13342+ =/ expected-view=(unit itype)
13343+ (direct-slot-body hed.tal.tal.sample.typ.program-instance (direct-sample-name i.t.t.items.u.program-sample))
13344+ ?~ expected-view ~
13345+ ?. ?=(%fn -.u.expected-view) ~
13346+ =/ canonical-view=itype [%fn model.u.relation u.element-message]
13347+ =/ view-fit=ifit
13348+ (direct-invariant canonical-view u.expected-view sub.state.program-instance next.state.program-instance)
13349+ ?. ?=(%ok -.view-fit) ~
13350+ =/ closed-view=itype
13351+ (itype-normalize [%fn typ.p.sam u.element-message] sub.view-fit)
13352+ ?. ?=(%fn -.closed-view) ~
13353+ =/ view-env=ienv [[mapper.site u.mapper-scheme] env.p.sam]
13354+ =/ final-view-state=istate
13355+ (reserve-def-caps val.view-def state.p.sam(next next.view-fit, gate-defs checked.u.mapper-added, head-evidence heads))
13356+ =/ inferred=iresult
13357+ (infer-call-context-arg view-body product.closed-view view-env final-view-state (span-of view-body))
13358+ ?: ?=(%| -.inferred) ~
13359+ =/ product-fit=ifit
13360+ (itype-fit typ.p.inferred product.closed-view sub.state.p.inferred next.state.p.inferred)
13361+ ?. ?=(%ok -.product-fit) ~
13362+ =/ merged-product=itype
13363+ (itype-merge-faces typ.p.inferred product.closed-view sub.product-fit)
13364+ =/ actual-cast=itype [%fn typ.p.sam merged-product]
13365+ =/ cast=ifit
13366+ (itype-fit actual-cast closed-view sub.product-fit next.product-fit)
13367+ ?. ?=(%ok -.cast) ~
13368+ =/ merged=itype (itype-merge-faces actual-cast closed-view sub.cast)
13369+ =/ adjusted=iresult
13370+ [%& merged state.p.inferred(sub sub.cast, next next.cast)]
13371+ =/ added=(unit iadded-definition)
13372+ (add-supported-result view-def adjusted final-view-state env.u.mapper-added checked.u.mapper-added artifacts.u.mapper-added)
13373+ ?~ added ~
13374+ =/ recovered=(unit ischeme) (ienv-lookup view.parts env.u.added)
13375+ ?~ recovered ~
13376+ ?. ?=(~ vars.u.recovered) ~
13377+ ?. ?=(~ (itype-vars typ.u.recovered)) ~
13378+ `[env.u.added grouped.resolution artifacts.u.added]
13379+::
13380+:: Recover only the initializer of an already recognized direct program main.
13381+:: The derived call is evidence for an ordinary init/main retry, never an
13382+:: interface to publish on its own. Any failure returns the original resolution.
13383+++ program-init-context
13384+ |= [main=def parts=[init=term update=term view=term subs=term] ds=(list def) resolution=iresolved initial=istate]
13385+ ^- (unit iresolved)
13386+ =/ env=ienv env.resolution
13387+ ?^ (ienv-lookup %main env) ~
13388+ ?^ (ienv-lookup init.parts env) ~
13389+ =/ update=(unit ischeme) (ienv-lookup update.parts env)
13390+ =/ view=(unit ischeme) (ienv-lookup view.parts env)
13391+ =/ subs=(unit ischeme) (ienv-lookup subs.parts env)
13392+ ?~ update ~
13393+ ?~ view ~
13394+ ?~ subs ~
13395+ =/ inits=(list def)
13396+ (skim ds |=(d=def &(?=(%value -.d) =(init.parts name.d))))
13397+ ?. ?=([* ~] inits) ~
13398+ =/ init-def=def i.inits
13399+ ?> ?=(%value -.init-def)
13400+ ?. (program-init-tuple-null init-def) ~
13401+ =/ args=(unit (list expr)) (program-main-args main)
13402+ ?~ args ~
13403+ ?~ prelude.initial ~
13404+ =/ program=(unit ischeme) (ienv-lookup %program values.u.prelude.initial)
13405+ ?~ program ~
13406+ =/ heads=(unit igate-prelude-evidence) (direct-prelude-evidence ds prelude.initial)
13407+ ?~ heads ~
13408+ =/ written=(unit def) (~(get by gates.u.heads) %program)
13409+ ?~ written ~
13410+ =/ written-sample=(unit sample) (direct-gate-sample u.written)
13411+ ?~ written-sample ~
13412+ ?. ?=(%cell -.u.written-sample) ~
13413+ ?~ items.u.written-sample ~
13414+ =/ checked=(map term def) (direct-checked-gates ds env)
13415+ =/ templates=ienv
13416+ (turn molds.u.prelude.initial |=(x=[name=term template=ischeme] [name.x template.x]))
13417+ =/ scanned=(unit dgscan)
13418+ (dg-all-env-ids (weld env (weld values.u.prelude.initial templates)) 32.768 ~)
13419+ ?~ scanned ~
13420+ =. next.initial (dg-next-id ids.u.scanned 0)
13421+ =/ instance=[typ=itype state=istate] (instantiate-scheme u.program initial)
13422+ ?. ?=(%fn -.typ.instance) ~
13423+ ?. ?=(%cell -.sample.typ.instance) ~
13424+ =/ expected-init=(unit itype)
13425+ (direct-slot-body hed.sample.typ.instance (direct-sample-name i.items.u.written-sample))
13426+ ?~ expected-init ~
13427+ ?. ?=(%fn -.u.expected-init) ~
13428+ ?. ?=(%var -.sample.u.expected-init) ~
13429+ =/ data=@ud id.sample.u.expected-init
13430+ =/ init-var=itype [%var next.state.instance]
13431+ =/ st=istate state.instance(next +(next.state.instance))
13432+ =/ up=[typ=itype state=istate] (instantiate-scheme u.update st)
13433+ =/ vw=[typ=itype state=istate] (instantiate-scheme u.view state.up)
13434+ =/ sb=[typ=itype state=istate] (instantiate-scheme u.subs state.vw)
13435+ =. st state.sb(gate-defs checked, head-evidence heads)
13436+ =/ actual=itype [%cell init-var [%cell typ.up [%cell typ.vw typ.sb]]]
13437+ =/ fit=ifit
13438+ (direct-positional-fit u.args items.u.written-sample actual sample.typ.instance env st sub.st next.st)
13439+ ?. ?=(%ok -.fit) ~
13440+ =/ actual-final=itype (itype-normalize actual sub.fit)
13441+ =/ expected-final=itype (itype-normalize sample.typ.instance sub.fit)
13442+ =/ open=(list @ud)
13443+ (unique-type-vars (weld (itype-vars actual-final) (itype-vars expected-final)))
13444+ ?. (levy open |=(n=@ud =(data n))) ~
13445+ ?: |((itype-has-tag actual-final) (itype-has-tag expected-final)) ~
13446+ =/ replay=ifit
13447+ (direct-positional-fit u.args items.u.written-sample actual sample.typ.instance env st sub.fit next.fit)
13448+ ?. ?=(%ok -.replay) ~
13449+ ?. &(=(sub.fit sub.replay) =(next.fit next.replay)) ~
13450+ =/ expected=itype (itype-normalize u.expected-init sub.fit)
13451+ ?. ?=(%fn -.expected) ~
13452+ =. st st(sub sub.fit, next next.fit)
13453+ =/ init-state=istate (reserve-def-caps val.init-def st)
13454+ =/ inferred=iresult (infer-fragment val.init-def env init-state)
13455+ =? inferred ?=(%| -.inferred) (infer-recursive-gate init-def env init-state)
13456+ ?: ?=(%| -.inferred) ~
13457+ ?. ?=(%fn -.typ.p.inferred) ~
13458+ =/ data-fit=ifit
13459+ (itype-fit sample.typ.p.inferred sample.expected sub.state.p.inferred next.state.p.inferred)
13460+ ?. ?=(%ok -.data-fit) ~
13461+ =/ closed=itype (itype-normalize expected sub.data-fit)
13462+ ?. ?=(%fn -.closed) ~
13463+ :: Resolve the ordinary tuple cast first, then check the complete gate.
13464+ :: General function fit remains unchanged; only this recovered candidate
13465+ :: receives the derived result context before its whole-type cast fit.
13466+ =/ product-fit=ifit
13467+ (itype-fit product.typ.p.inferred product.closed sub.data-fit next.data-fit)
13468+ ?. ?=(%ok -.product-fit) ~
13469+ =/ product=itype
13470+ (itype-merge-faces product.typ.p.inferred product.closed sub.product-fit)
13471+ =/ actual-cast=itype [%fn sample.typ.p.inferred product]
13472+ =/ cast=ifit
13473+ (itype-fit actual-cast closed sub.product-fit next.product-fit)
13474+ ?. ?=(%ok -.cast) ~
13475+ =/ merged=itype (itype-merge-faces actual-cast closed sub.cast)
13476+ =/ adjusted=iresult
13477+ [%& merged state.p.inferred(sub sub.cast, next next.cast)]
13478+ =/ added=(unit iadded-definition)
13479+ (add-supported-result init-def adjusted init-state env checked artifacts.resolution)
13480+ ?~ added ~
13481+ =/ recovered=(unit ischeme) (ienv-lookup init.parts env.u.added)
13482+ ?~ recovered ~
13483+ ?. ?=(~ vars.u.recovered) ~
13484+ ?. ?=(~ (itype-vars typ.u.recovered)) ~
13485+ `[env.u.added grouped.resolution artifacts.u.added]
13486+::
13487+++ program-subs-watch
13488+ |= [d=def imports=ijimports graph=irequest-graph prelude=ifile]
13489+ ^- ?
13490+ ?. ?=(%value -.d) |
13491+ ?. |(?=(%gate -.val.d) ?=(%gate-wide -.val.d)) |
13492+ =/ body=expr
13493+ ?- -.val.d
13494+ %gate body.val.d
13495+ %gate-wide body.val.d
13496+ * val.d
13497+ ==
13498+ =. body (program-transparent body)
13499+ ?. ?=(%list -.body) |
13500+ ?. ?=([* ~] items.body) |
13501+ =/ watch=expr (program-transparent i.items.body)
13502+ ?. ?=(%tuple -.watch) |
13503+ ?. ?=([* * ~] items.watch) |
13504+ =/ tag=item i.items.watch
13505+ =/ payload=item i.t.items.watch
13506+ ?. &(?=(~ face.tag) ?=(~ face.payload)) |
13507+ =/ tag-expr=expr (program-transparent val.tag)
13508+ ?. ?=(%lit -.tag-expr) |
13509+ ?. &(?=(%term form.lit.tag-expr) =(%watch val.lit.tag-expr)) |
13510+ =/ request=expr (program-transparent val.payload)
13511+ ?. ?=(%call -.request) |
13512+ ?. ?=([* ~] args.request) |
13513+ =/ head=expr (program-transparent head.request)
13514+ ?. ?=(%wing -.head) |
13515+ ?. ?=([@ @ ~] names.head) |
13516+ =/ case=term i.names.head
13517+ =/ face=term i.t.names.head
13518+ =/ callback=expr (program-transparent i.args.request)
13519+ ?. ?=(%ctor -.callback) |
13520+ ?. ?=(%term form.tag.callback) |
13521+ ?=(^ (derived-request-member case face imports graph prelude))
13522+::
13523+:: Exact derived-member and request-evidence identity, shared by direct
13524+:: program watches and direct data-page loads. Only a plain request in the
13525+:: selected interface's own source-backed graph can establish this shape.
13526+++ derived-request-member
13527+ |= [case=term face=term imports=ijimports graph=irequest-graph prelude=ifile]
13528+ ^- (unit ischeme)
13529+ =/ selected=(list [face=term interface=ifile])
13530+ (skim imports |=(j=[face=term interface=ifile] =(face face.j)))
13531+ ?. ?=([* ~] selected) ~
13532+ =/ iface=ifile interface.i.selected
13533+ =/ member=(unit ischeme) (ienv-lookup case values.iface)
13534+ ?~ member ~
13535+ ?~ source.iface ~
13536+ =/ evidence=(list irequest-evidence)
13537+ (skim requests.graph |=(r=irequest-evidence &(=(api-at.r at.iface) =(name.r case))))
13538+ ?. ?=([* ~] evidence) ~
13539+ =/ request-evidence=irequest-evidence i.evidence
13540+ ?. =(u.source.iface api-source.request-evidence) ~
13541+ ?. =(name.path.path.request-evidence case) ~
13542+ ?~ graph.iface ~
13543+ ?. (lien requests.u.graph.iface |=(r=irequest-evidence =(r request-evidence))) ~
13544+ ?. ?=(~ scry.path.path.request-evidence) ~
13545+ ?. &(?=(~ diffs.path.request-evidence) ?=(~ diffs.path.path.request-evidence)) ~
13546+ ?: (lien segments.path.path.request-evidence |=(p=pseg !?=(%knot -.p))) ~
13547+ ?. ?=([@ ~] vars.u.member) ~
13548+ =/ message=@ud i.vars.u.member
13549+ ?. ?=(%fn -.typ.u.member) ~
13550+ ?. ?=(%fn -.sample.typ.u.member) ~
13551+ ?. =(sample.sample.typ.u.member full.path.request-evidence) ~
13552+ ?. =(product.sample.typ.u.member [%var message]) ~
13553+ =/ prep=iprelude [prelude prelude-values.graph prelude-molds.graph]
13554+ =/ ask=(unit ischeme) (request-compatible-ask prep)
13555+ ?~ ask ~
13556+ =/ result=(unit itype) (template-apply u.ask ~[[%var message]])
13557+ ?~ result ~
13558+ ?. =(product.typ.u.member u.result) ~
13559+ member
13560+::
13561+++ program-main-context
13562+ |= [main=def ds=(list def) resolution=iresolved initial=istate]
13563+ ^- iresolved
13564+ ?^ (ienv-lookup %main env.resolution) resolution
13565+ =/ heads=(unit igate-prelude-evidence)
13566+ (direct-prelude-evidence ds prelude.initial)
13567+ ?~ heads resolution
13568+ =/ checked=(map term def) (direct-checked-gates ds env.resolution)
13569+ =/ completed=[env=ienv artifacts=(list iwidth-definition)]
13570+ (add-supported-defs-core ~[main] ds checked heads env.resolution molds.initial globals.initial externals.initial surs.initial mark-externals.initial marks.initial jimports.initial reserved-molds.initial at.initial prelude.initial artifacts.resolution grec-index.initial)
13571+ [env.completed grouped.resolution artifacts.completed]
13572+::
13573+:: A static main may retain a generic element message in its ordinary
13574+:: scheme. Instantiate that scheme, specialize it to canonical element !!,
13575+:: and publish only the resulting closed scheme.
13576+++ static-main-specialized
13577+ |= [env=ienv prelude=(unit ifile)]
13578+ ^- (unit ischeme)
13579+ ?~ prelude ~
13580+ =/ element=(unit ischeme) (find-jibb-mold %element u.prelude)
13581+ ?~ element ~
13582+ =/ main=(unit ischeme) (ienv-lookup %main env)
13583+ ?~ main ~
13584+ =/ canonical=(unit itype) (template-apply u.element ~[[%empty ~]])
13585+ ?~ canonical ~
13586+ =/ instance=[typ=itype state=istate] (instantiate-scheme u.main *istate)
13587+ =/ fit=ifit (itype-fit typ.instance u.canonical ~ next.state.instance)
13588+ ?. ?=(%ok -.fit) ~
13589+ =/ closed=itype (itype-normalize typ.instance sub.fit)
13590+ ?^ (itype-vars closed) ~
13591+ ?: (itype-has-tag closed) ~
13592+ ?. ?=(%union -.closed) ~
13593+ ?. ?=(%union -.u.canonical) ~
13594+ ?. &(=(origin.closed origin.u.canonical) =(args.closed args.u.canonical)) ~
13595+ =/ exact=ifit (direct-invariant closed u.canonical ~ next.fit)
13596+ ?. ?=(%ok -.exact) ~
13597+ `[u.canonical ~]
13598+::
13599+:: The load of a direct data page must itself be a direct gate whose
13600+:: transparent body is one plain derived request with a wing or ctor reply.
13601+++ page-load-derived
13602+ |= [name=term ds=(list def) imports=ijimports graph=irequest-graph prelude=ifile]
13603+ ^- ?
13604+ =/ loads=(list def)
13605+ (skim ds |=(d=def &(?=(%value -.d) =(name name.d))))
13606+ ?. ?=([* ~] loads) |
13607+ =/ load=def i.loads
13608+ ?> ?=(%value -.load)
13609+ ?. |(?=(%gate -.val.load) ?=(%gate-wide -.val.load)) |
13610+ =/ body=expr
13611+ ?- -.val.load
13612+ %gate body.val.load
13613+ %gate-wide body.val.load
13614+ * !!
13615+ ==
13616+ =. body (program-transparent body)
13617+ ?. ?=(%call -.body) |
13618+ ?. ?=([* ~] args.body) |
13619+ =/ head=expr (program-transparent head.body)
13620+ ?. ?=(%wing -.head) |
13621+ ?. ?=([@ @ ~] names.head) |
13622+ =/ reply=expr (program-transparent i.args.body)
13623+ ?. ?| &(?=(%wing -.reply) ?=([@ ~] names.reply))
13624+ &(?=(%ctor -.reply) ?=(%term form.tag.reply))
13625+ ==
13626+ |
13627+ ?=(^ (derived-request-member i.names.head i.t.names.head imports graph prelude))
13628+::
13629+++ page-main-closed
13630+ |= [parts=[load=term view=term] ds=(list def) env=ienv prelude=(unit ifile) imports=ijimports graph=irequest-graph]
13631+ ^- ?
13632+ ?~ prelude |
13633+ =/ page=(unit ischeme) (find-jibb-mold %page u.prelude)
13634+ ?~ page |
13635+ =/ main=(unit ischeme) (ienv-lookup %main env)
13636+ ?~ main |
13637+ ?. ?=(~ vars.u.main) |
13638+ ?. ?=(~ (itype-vars typ.u.main)) |
13639+ =/ instance=[typ=itype state=istate] (instantiate-scheme u.page *istate)
13640+ =/ main-fit=ifit (direct-invariant typ.u.main typ.instance ~ next.state.instance)
13641+ ?. ?=(%ok -.main-fit) |
13642+ (page-load-derived load.parts ds imports graph u.prelude)
13643+::
13644+++ program-main-closed
13645+ |= [parts=[init=term update=term view=term subs=term] ds=(list def) env=ienv prelude=(unit ifile) imports=ijimports graph=irequest-graph]
13646+ ^- ?
13647+ ?~ prelude |
13648+ ?~ (ienv-lookup %program values.u.prelude) |
13649+ =/ program=(unit ischeme) (find-jibb-mold %program u.prelude)
13650+ ?~ program |
13651+ =/ main=(unit ischeme) (ienv-lookup %main env)
13652+ ?~ main |
13653+ ?. ?=(~ vars.u.main) |
13654+ ?. ?=(~ (itype-vars typ.u.main)) |
13655+ =/ instance=[typ=itype state=istate] (instantiate-scheme u.program *istate)
13656+ =/ main-fit=ifit (direct-invariant typ.u.main typ.instance ~ next.state.instance)
13657+ ?. ?=(%ok -.main-fit) |
13658+ =/ init=(unit ischeme) (ienv-lookup init.parts env)
13659+ ?~ init |
13660+ ?. ?=(~ vars.u.init) |
13661+ ?. ?=(%fn -.typ.u.init) |
13662+ ?. ?=(~ (itype-vars sample.typ.u.init)) |
13663+ ?. ?=(~ (itype-vars product.typ.u.init)) |
13664+ =/ data=igate-free (gate-free-type sample.typ.u.init 256 ~)
13665+ ?. =(%yes verdict.data) |
13666+ =/ model=igate-free (gate-free-type product.typ.u.init left.data ~)
13667+ ?. =(%yes verdict.model) |
13668+ =/ subs=(list def)
13669+ (skim ds |=(d=def &(?=(%value -.d) =(subs.parts name.d))))
13670+ ?. ?=([* ~] subs) |
13671+ |((program-subs-empty i.subs) (program-subs-watch i.subs imports graph u.prelude))
13672+::
11327++ infer-jibb-file
13673++ infer-jibb-file
11328 |= [at=path src=@t externals=iexternals mark-externals=imark-externals modules=jbundle active=(list path) prelude-values=(list term) prelude-molds=(list term) cache=jcache prelude=(unit ifile)]
13674 |= [at=path src=@t externals=iexternals mark-externals=imark-externals modules=jbundle active=(list path) prelude-values=(list term) prelude-molds=(list term) cache=jcache prelude=(unit ifile)]
11329 ^- jfile-result
13675 ^- jfile-result
13676+ =/ out=jfile-detailed-result
13677+ (infer-jibb-file-detailed at src externals mark-externals modules active prelude-values prelude-molds cache prelude)
13678+ ?: ?=(%| -.out) [%| message.p.out]
13679+ [%& p.out]
13680+:: Returns structured root-source overlap evidence after the same full check.
13681+++ infer-jibb-file-detailed
13682+ |= [at=path src=@t externals=iexternals mark-externals=imark-externals modules=jbundle active=(list path) prelude-values=(list term) prelude-molds=(list term) cache=jcache prelude=(unit ifile)]
13683+ ^- jfile-detailed-result
11330 =/ parsed (parse at src)
13684 =/ parsed (parse at src)
11331− ?: ?=(%| -.parsed) [%| (crip "module source does not parse: {(spud at)}")]
13685+ ?: ?=(%| -.parsed) [%| [(crip "module source does not parse: {(spud at)}") ~]]
11332 =/ mod=module p.parsed
13686 =/ mod=module p.parsed
11333 =/ duplicate=(unit idiag) (duplicate-defs defs.mod)
13687 =/ duplicate=(unit idiag) (duplicate-defs defs.mod)
11334− ?^ duplicate [%| (show-duplicate-fields at src u.duplicate)]
13688+ ?^ duplicate [%| [(show-duplicate-fields at src u.duplicate) ~]]
13689+ ?: &(?=([%ui %api *] at) ?=(^ (program-main-def defs.mod)))
13690+ [%| [(crip "module kind needs unsupported inference: {(spud at)}") ~]]
11335 ?: ?=([%ui %api *] at)
13691 ?: ?=([%ui %api *] at)
11336 =/ iface=(unit ifile) (api-poke-interface at mod mark-externals prelude-values prelude-molds prelude)
13692 =/ iface=(unit ifile) (api-poke-interface at mod mark-externals prelude-values prelude-molds prelude)
11337 ?^ iface
13693 ?^ iface
11338 =/ checked=ifile u.iface(source `src, graph `[(silt `(list path)`~[at]) ~ modules prelude prelude-values prelude-molds externals mark-externals])
13694 =/ checked=ifile u.iface(source `src, graph `[(silt `(list path)`~[at]) ~ modules prelude prelude-values prelude-molds externals mark-externals])
11339 [%& [checked [[at checked] cache]]]
13695 [%& [checked [[at checked] cache]]]
11340− ?~ prelude [%| (crip "API module needs unsupported inference: {(spud at)}")]
13696+ ?~ prelude [%| [(crip "API module needs unsupported inference: {(spud at)}") ~]]
11341 =/ prepared=iprelude [u.prelude prelude-values prelude-molds]
13697 =/ prepared=iprelude [u.prelude prelude-values prelude-molds]
11342 =/ narrow=?
13698 =/ narrow=?
11343 ?. ?=([[%mark *] ~] imports.mod) |
13699 ?. ?=([[%mark *] ~] imports.mod) |
@@ -11347,41 +13703,167 @@
11347 ?: narrow
13703 ?: narrow
11348 =/ request=(each ione-request-interface @t)
13704 =/ request=(each ione-request-interface @t)
11349 (one-request-interface-graph at src externals mark-externals modules active cache `prepared)
13705 (one-request-interface-graph at src externals mark-externals modules active cache `prepared)
11350− ?: ?=(%| -.request) [%| (crip "API module needs unsupported inference: {(spud at)}")]
13706+ ?: ?=(%| -.request) [%| [(crip "API module needs unsupported inference: {(spud at)}") ~]]
11351 =/ checked=ifile iface.p.request
13707 =/ checked=ifile iface.p.request
11352 [%& [checked [[at checked] dependencies.paths.support.p.request]]]
13708 [%& [checked [[at checked] dependencies.paths.support.p.request]]]
11353 =/ multi=(each [iface=ifile cache=jcache] @t)
13709 =/ multi=(each [iface=ifile cache=jcache] @t)
11354 (multi-request-interface-graph at src externals mark-externals modules active cache `prepared)
13710 (multi-request-interface-graph at src externals mark-externals modules active cache `prepared)
11355− ?: ?=(%| -.multi) [%| (crip "API module needs unsupported inference: {(spud at)}")]
13711+ ?: ?=(%| -.multi) [%| [(crip "API module needs unsupported inference: {(spud at)}") ~]]
11356 [%& [iface.p.multi [[at iface.p.multi] cache.p.multi]]]
13712 [%& [iface.p.multi [[at iface.p.multi] cache.p.multi]]]
11357 ?. (module-scope-valid mod prelude-values prelude-molds)
13713 ?. (module-scope-valid mod prelude-values prelude-molds)
11358 ?: (pending-declared-poke at mod prelude-values prelude-molds)
13714 ?: (pending-declared-poke at mod prelude-values prelude-molds)
11359− [%| (crip "module kind or scope needs unsupported inference: {(spud at)}")]
13715+ [%| [(crip "module kind or scope needs unsupported inference: {(spud at)}") ~]]
11360− [%| (crip "module has conflicting names: {(spud at)}")]
13716+ [%| [(crip "module has conflicting names: {(spud at)}") ~]]
11361 =/ vals=(list term) (global-value-names defs.mod)
13717 =/ vals=(list term) (global-value-names defs.mod)
11362− ?: (lien vals |=(n=term =(n %main)))
13718+ =/ main=(unit def) (program-main-def defs.mod)
13719+ =/ main-parts=(unit [init=term update=term view=term subs=term])
13720+ ?~(main ~ (program-main-parts u.main))
13721+ =/ page-parts=(unit [load=term view=term])
13722+ ?~(main ~ (page-main-parts u.main))
13723+ ?: &(?=([%ui %stores *] at) ?=(^ main))
11363− [%| (crip "module kind needs unsupported inference: {(spud at)}")]
13724+ [%| [(crip "module kind needs unsupported inference: {(spud at)}") ~]]
11364− =/ js=jimports-result (resolve-jibb-imports imports.mod externals mark-externals modules active prelude-values prelude-molds cache prelude)
13725+ =/ js=jimports-detailed-result (resolve-jibb-imports-detailed imports.mod externals mark-externals modules active prelude-values prelude-molds cache prelude)
11365 ?: ?=(%| -.js) [%| p.js]
13726 ?: ?=(%| -.js) [%| p.js]
13727+ =/ collected=grec-collected
11366− =/ molds=imolds (collect-simple-molds defs.mod)
13728+ ?^ imports.mod [(collect-simple-molds defs.mod) *(map term shape)]
13729+ (grec-collect-molds defs.mod)
13730+ =/ molds=imolds molds.collected
11367 =/ globals=(list term) (weld prelude-values (weld (import-binding-names imports.mod) vals))
13731 =/ globals=(list term) (weld prelude-values (weld (import-binding-names imports.mod) vals))
11368 =/ surs=(list term) (collect-sur-imports imports.mod)
13732 =/ surs=(list term) (collect-sur-imports imports.mod)
11369 =/ marks=(list term) (collect-mark-imports imports.mod)
13733 =/ marks=(list term) (collect-mark-imports imports.mod)
11370 =/ reserved=(list term) (weld prelude-molds (turn resolved.p.js |=(j=[face=term interface=ifile] face.j)))
13734 =/ reserved=(list term) (weld prelude-molds (turn resolved.p.js |=(j=[face=term interface=ifile] face.j)))
11371 =/ top=(list term) (turn molds |=(m=[name=term body=shape] name.m))
13735 =/ top=(list term) (turn molds |=(m=[name=term body=shape] name.m))
11372− =/ state=istate [0 ~ ~ ~ molds globals externals surs mark-externals marks resolved.p.js reserved ~ ~ ~ | at top prelude ~ 256 ~]
13736+ =/ state=istate [0 ~ ~ ~ molds globals externals surs mark-externals marks resolved.p.js reserved ~ ~ ~ | at top prelude ~ 256 ~ ~ ~ ~ ~ ~]
13737+ :: Source and scope were checked above; preserve that exact root and prelude.
13738+ :: This first integration only indexes import-free library sources.
13739+ =/ index=(unit [at=path source=@t prelude=ifile shapes=(map term shape)])
13740+ ?^ imports.mod ~
13741+ ?~ prelude ~
13742+ =/ standard=(unit ischeme) (find-jibb-mold %list u.prelude)
13743+ ?~ standard ~
13744+ ?. =(u.standard [[%collection %list ~[[%var 0]]] ~[0]]) ~
13745+ =/ index=(map term shape) proofs.collected
13746+ ?. !=(index *(map term shape)) ~
13747+ ?: (lien molds |=(m=[name=term body=shape] =(%list name.m))) ~
13748+ `[at src u.prelude index]
13749+ =. grec-index.state index
11373− =/ mts=(each imold-types @t) (module-mold-types molds state)
13750+ =/ mts=(each imold-types imold-failure) (module-mold-types-detail molds state)
13751+ ?: ?=(%| -.mts)
11374− ?: ?=(%| -.mts) [%| (crip "{(trip p.mts)}: {(spud at)}")]
13752+ ?~ overlap.p.mts [%| [(crip "{(trip message.p.mts)}: {(spud at)}") ~]]
13753+ =/ witness=[name=term cases=upair] u.overlap.p.mts
13754+ =/ first=@t (show-error src [at line.beg.first.cases.witness col.beg.first.cases.witness "first union case"])
13755+ =/ second=@t (show-error src [at line.beg.second.cases.witness col.beg.second.cases.witness "overlapping case"])
13756+ =/ msg=@t (of-wain:format ~[(crip "module mold {(trip name.witness)} has overlapping cases") first second])
13757+ [%| [msg `[at src name.witness cases.witness]]]
13758+ =/ resolution=iresolved
13759+ ?~ index
11375− =/ resolution=iresolved (resolve-groups defs.mod molds globals externals surs mark-externals marks resolved.p.js reserved at prelude)
13760+ (resolve-groups defs.mod molds globals externals surs mark-externals marks resolved.p.js reserved at prelude)
13761+ (resolve-groups-core defs.mod molds globals externals surs mark-externals marks resolved.p.js reserved at prelude index)
11376 =/ env=ienv env.resolution
13762 =/ env=ienv env.resolution
13763+ =/ recovered=iresolved
13764+ ?~ main resolution
13765+ ?~ main-parts resolution
13766+ =/ updated=(unit iresolved)
13767+ (program-update-context u.main u.main-parts defs.mod resolution state)
13768+ =/ with-update=iresolved ?~(updated resolution u.updated)
13769+ =/ subscribed=(unit iresolved)
13770+ (program-subs-context u.main-parts defs.mod with-update state)
13771+ =/ with-subs=iresolved ?~(subscribed with-update u.subscribed)
13772+ =/ viewed=(unit iresolved)
13773+ (program-view-context u.main-parts defs.mod with-subs state)
13774+ =/ with-view=iresolved ?~(viewed with-subs u.viewed)
13775+ =/ initialized=(unit iresolved)
13776+ (program-init-context u.main u.main-parts defs.mod with-view state)
13777+ =/ components=iresolved ?~(initialized with-view u.initialized)
13778+ (program-main-context u.main defs.mod components state)
13779+ =. env env.recovered
13780+ =. artifacts.resolution artifacts.recovered
13781+ =. env
13782+ ?: (module-values-complete defs.mod env) env
13783+ ?: |(?=([%ui %stores *] at) ?=(^ imports.mod) ?=(^ prelude) ?=(^ prelude-values) ?=(^ prelude-molds)) env
13784+ ?: (gth (met 3 src) 65.536) env
13785+ ?: (gth (lent defs.mod) 64) env
13786+ ?. (dg-source-candidate defs.mod 64) env
13787+ =/ transaction=(unit dgcommit) (dg-root-source at src)
13788+ ?~ transaction env
13789+ ?: (dg-interface-safe env.u.transaction) env.u.transaction
13790+ env
11377 ?. (module-values-complete defs.mod env)
13791 ?. (module-values-complete defs.mod env)
11378− [%| (crip "module definitions need unsupported inference: {(spud at)}")]
13792+ [%| [(crip "module definitions need unsupported inference: {(spud at)}") ~]]
11379 =/ initial=irequest-graph [(silt `(list path)`~[at]) ~ modules prelude prelude-values prelude-molds externals mark-externals]
13793 =/ initial=irequest-graph [(silt `(list path)`~[at]) ~ modules prelude prelude-values prelude-molds externals mark-externals]
11380 =/ graph=(unit irequest-graph) (request-graph-merge resolved.p.js initial (add 1 (lent resolved.p.js)))
13794 =/ graph=(unit irequest-graph) (request-graph-merge resolved.p.js initial (add 1 (lent resolved.p.js)))
11381− ?~ graph [%| 'module request evidence needs unsupported inference']
13795+ ?~ graph [%| ['module request evidence needs unsupported inference' ~]]
13796+ =/ static-main=(unit ischeme)
13797+ ?~ main ~
13798+ ?^ main-parts ~
13799+ ?^ page-parts ~
13800+ (static-main-specialized env prelude)
13801+ =? env ?=(^ static-main)
13802+ [[%main u.static-main] (skim env |=(entry=[name=term scheme=ischeme] !=(%main name.entry)))]
13803+ =/ kind-ok=?
13804+ ?~ main &
13805+ ?^ main-parts (program-main-closed u.main-parts defs.mod env prelude resolved.p.js u.graph)
13806+ ?^ page-parts (page-main-closed u.page-parts defs.mod env prelude resolved.p.js u.graph)
13807+ ?=(^ static-main)
13808+ ?. kind-ok
13809+ [%| [(crip "module kind needs unsupported inference: {(spud at)}") ~]]
11382 =/ iface=ifile [env p.mts at ~ artifacts.resolution ~ `src graph]
13810 =/ iface=ifile [env p.mts at ~ artifacts.resolution ~ `src graph]
11383 [%& [iface [[at iface] cache.p.js]]]
13811 [%& [iface [[at iface] cache.p.js]]]
11384::
13812::
13813+:: A source-bound analysis of one named mold, not a module, island,
13814+:: request, watchability or runtime check. The host owns the trusted
13815+:: prepared prelude, canonical paths and reader/source version identities.
13816+:: The 256-node cap covers only classification, not source/graph work.
13817++$ igate-free-mold
13818+ [at=path source=@t name=term prepared=iprelude externals=iexternals marks=imark-externals modules=jbundle dependencies=jcache mold=ischeme requested=@ud budget=@ud result=igate-free]
13819+++ gate-free-mold-source
13820+ |= [file=path src=@t name=term externals=iexternals marks=imark-externals modules=jbundle prepared=(unit iprelude) fuel=@ud]
13821+ ^- (each igate-free-mold @t)
13822+ ?~ file [%| 'mold analysis needs a path ending in jibb']
13823+ ?. =(%jibb (rear file)) [%| 'mold analysis needs a path ending in jibb']
13824+ ?: |(=(file /lib/jibb/internal/jibb) =(file /lib/jibb/primitives/jibb))
13825+ [%| 'the prelude internal modules are private']
13826+ ?: ?=([%ui %api *] file) [%| 'API declarations need unsupported mold analysis']
13827+ ?: ?=([%ui %stores *] file) [%| 'store declarations need unsupported mold analysis']
13828+ =/ entries=jbundle (skim modules |=(m=jsource =(file at.m)))
13829+ ?: (gth (lent entries) 1) [%| 'duplicate root module sources']
13830+ =/ wrong-root=? ?~(entries | !=(source.i.entries src))
13831+ ?: wrong-root [%| 'root module source does not match bundle']
13832+ =/ parsed (parse file src)
13833+ ?: ?=(%| -.parsed) [%| 'mold source does not parse']
13834+ =/ mod=module p.parsed
13835+ =/ duplicate=(unit idiag) (duplicate-defs defs.mod)
13836+ ?^ duplicate [%| (show-duplicate-fields file src u.duplicate)]
13837+ ?~ prepared [%| 'mold analysis needs the prepared prelude']
13838+ ?. (module-scope-valid mod values.u.prepared molds.u.prepared)
13839+ [%| 'mold source has conflicting or unsupported scope']
13840+ =/ selected=(list def)
13841+ (skim defs.mod |=(d=def &(?=(%mold -.d) =(name.d name))))
13842+ ?~ selected [%| 'selected mold is not declared']
13843+ ?^ t.selected [%| 'selected mold is not unique']
13844+ ?> ?=(%mold -.i.selected)
13845+ =/ public=ifile iface.u.prepared
13846+ =/ js=jimports-result
13847+ (resolve-jibb-imports imports.mod externals marks modules ~[file] values.u.prepared molds.u.prepared ~ `public)
13848+ ?: ?=(%| -.js) [%| p.js]
13849+ =/ ms=imolds (collect-simple-molds defs.mod)
13850+ =/ vals=(list term) (global-value-names defs.mod)
13851+ =/ globals=(list term) (weld values.u.prepared (weld (import-binding-names imports.mod) vals))
13852+ =/ surs=(list term) (collect-sur-imports imports.mod)
13853+ =/ declared=(list term) (collect-mark-imports imports.mod)
13854+ =/ reserved=(list term) (weld molds.u.prepared (turn resolved.p.js |=(j=[face=term interface=ifile] face.j)))
13855+ =/ top=(list term) (turn ms |=(m=[name=term body=shape] name.m))
13856+ =/ state=istate [0 ~ ~ ~ ms globals externals surs marks declared resolved.p.js reserved ~ ~ ~ | file top `public ~ 256 ~ ~ ~ ~ ~ ~]
13857+ =/ inferred=(unit [template=ischeme state=istate])
13858+ (infer-mold-template shape.i.selected state(active ~[name], in-mold &))
13859+ ?~ inferred [%| 'selected mold needs unsupported inference']
13860+ =/ template=ischeme template.u.inferred
13861+ =. typ.template (label-direct-union typ.template shape.i.selected name state)
13862+ =. typ.template (itype-normalize typ.template sub.state.u.inferred)
13863+ =/ cap=@ud (min fuel 256)
13864+ =/ analysis=igate-free (gate-free-type typ.template cap ~)
13865+ [%& [file src name u.prepared externals marks modules cache.p.js template fuel cap analysis]]
13866+::
11385:: +golden-types-with-modules fails closed for imports without prelude
13867:: +golden-types-with-modules fails closed for imports without prelude
11386:: scope. +golden-types-with-prelude resolves supported library graphs;
13868:: scope. +golden-types-with-prelude resolves supported library graphs;
11387:: its report remains partial and unreachable sources are not examined.
13869:: its report remains partial and unreachable sources are not examined.
@@ -11442,7 +13924,7 @@
11442 ?: ?=(%| -.js) (of-wain:format ~['partial inference; module not checked' p.js])
13924 ?: ?=(%| -.js) (of-wain:format ~['partial inference; module not checked' p.js])
11443 =/ scope-values=(list term)
13925 =/ scope-values=(list term)
11444 (weld prelude-values (weld (collect-sur-imports imports.p.parsed) (collect-mark-imports imports.p.parsed)))
13926 (weld prelude-values (weld (collect-sur-imports imports.p.parsed) (collect-mark-imports imports.p.parsed)))
11445− (golden-types-in-context file src externals mark-externals resolved.p.js scope-values prelude-molds iface)
13927+ (golden-types-in-context-core file src externals mark-externals resolved.p.js scope-values prelude-molds iface prepared)
11446::
13928::
11447:: +golden-types-with-marks: supply declared mark types separately from /sur
13929:: +golden-types-with-marks: supply declared mark types separately from /sur
11448:: entries, as [mark result] with the result from +read-mark:jibb-import.
13930:: entries, as [mark result] with the result from +read-mark:jibb-import.
@@ -11473,6 +13955,10 @@
11473++ golden-types-in-context
13955++ golden-types-in-context
11474 |= [file=path src=@t externals=iexternals mark-externals=imark-externals jimports=ijimports prelude-values=(list term) reserved-molds=(list term) prelude=(unit ifile)]
13956 |= [file=path src=@t externals=iexternals mark-externals=imark-externals jimports=ijimports prelude-values=(list term) reserved-molds=(list term) prelude=(unit ifile)]
11475 ^- @t
13957 ^- @t
13958+ (golden-types-in-context-core file src externals mark-externals jimports prelude-values reserved-molds prelude ~)
13959+++ golden-types-in-context-core
13960+ |= [file=path src=@t externals=iexternals mark-externals=imark-externals jimports=ijimports prelude-values=(list term) reserved-molds=(list term) prelude=(unit ifile) prepared=(unit iprelude)]
13961+ ^- @t
11476 =. reserved-molds (weld reserved-molds (turn jimports |=(j=[face=term interface=ifile] face.j)))
13962 =. reserved-molds (weld reserved-molds (turn jimports |=(j=[face=term interface=ifile] face.j)))
11477 =/ parsed (parse file src)
13963 =/ parsed (parse file src)
11478 ?: ?=(%| -.parsed) (show-error src p.parsed)
13964 ?: ?=(%| -.parsed) (show-error src p.parsed)
@@ -11488,6 +13974,41 @@
11488 =/ resolution=iresolved (resolve-groups ds molds globals externals surs mark-externals marks jimports reserved-molds file prelude)
13974 =/ resolution=iresolved (resolve-groups ds molds globals externals surs mark-externals marks jimports reserved-molds file prelude)
11489 =/ cycles=(list icycle) (definite-value-cycles ds globals)
13975 =/ cycles=(list icycle) (definite-value-cycles ds globals)
11490 =/ env=ienv env.resolution
13976 =/ env=ienv env.resolution
13977+ =/ recovered=(list term) ~
13978+ =/ eligible=?
13979+ ?& ?=(~ imports.p.parsed)
13980+ ?=(~ jimports)
13981+ !?=([%ui %api *] file)
13982+ !?=([%ui %stores *] file)
13983+ !(lien (global-value-names ds) |=(n=term =(n %main)))
13984+ !(module-values-complete ds env)
13985+ (lte (met 3 src) 65.536)
13986+ (lte (lent ds) 64)
13987+ ?| &(?=(~ prepared) ?=(~ prelude) ?=(~ prelude-values) ?=(~ reserved-molds) (module-scope-valid p.parsed ~ ~) (dg-source-candidate ds 64))
13988+ ?& ?=(^ prepared)
13989+ ?=(^ prelude)
13990+ =(u.prelude iface.u.prepared)
13991+ =(prelude-values values.u.prepared)
13992+ =(reserved-molds molds.u.prepared)
13993+ (module-scope-valid p.parsed values.u.prepared molds.u.prepared)
13994+ (dg-prepared-candidate ds 64)
13995+ ==
13996+ ==
13997+ ==
13998+ =/ transaction=(unit dgcommit)
13999+ ?. eligible ~
14000+ ?~ prepared (dg-root-source file src)
14001+ (dg-root-prepared file src u.prepared)
14002+ =. recovered
14003+ ?~ transaction ~
14004+ ?. &((module-values-complete ds env.u.transaction) (dg-interface-safe env.u.transaction)) ~
14005+ (turn (skim env.u.transaction |=(entry=[name=term scheme=ischeme] ?=(~ (ienv-lookup name.entry env)))) |=(entry=[name=term scheme=ischeme] name.entry))
14006+ =. env
14007+ ?~ transaction env
14008+ ?: &((module-values-complete ds env.u.transaction) (dg-interface-safe env.u.transaction)) env.u.transaction
14009+ env
14010+ =/ source-defs=(map term def) (direct-checked-gates ds env)
14011+ =/ heads=(unit igate-prelude-evidence) (direct-prelude-evidence ds prelude)
11491 =/ lines=(list @t) ~
14012 =/ lines=(list @t) ~
11492 |-
14013 |-
11493 ?~ ds (of-wain:format ['partial inference; module not checked' (flop lines)])
14014 ?~ ds (of-wain:format ['partial inference; module not checked' (flop lines)])
@@ -11500,6 +14021,16 @@
11500 ?^ cycle
14021 ?^ cycle
11501 =/ diag=idiag ["non-gate value depends on itself through a cycle" ~[[first.i.cycle "value in cycle"] [next.i.cycle "dependency in cycle"]]]
14022 =/ diag=idiag ["non-gate value depends on itself through a cycle" ~[[first.i.cycle "value in cycle"] [next.i.cycle "dependency in cycle"]]]
11502 $(ds t.ds, lines [(show-inference-diagnostic file src name.d diag) lines])
14023 $(ds t.ds, lines [(show-inference-diagnostic file src name.d diag) lines])
14024+ ?: (lien recovered |=(n=term =(n name.d)))
14025+ =/ found=(unit ischeme) (ienv-lookup name.d env)
14026+ ?~ found $(ds t.ds, lines [(crip "++ {(trip name.d)}: committed definition unavailable") lines])
14027+ ?: (itype-has-hidden-recursive typ.u.found)
14028+ $(ds t.ds, lines [(crip "++ {(trip name.d)}: recursive mold name is not available in this scope") lines])
14029+ ?: (itype-has-hidden-generic typ.u.found)
14030+ $(ds t.ds, lines [(crip "++ {(trip name.d)}: generic union name is not available in this scope") lines])
14031+ =/ typ=itype (canonical-itype typ.u.found vars.u.found)
14032+ =/ line=@t (crip "++ {(trip name.d)}: {(show-itype typ ~)}{(show-atom-constraint typ)}")
14033+ $(ds t.ds, lines [line lines])
11503 ?: (lien grouped.resolution |=(n=term =(n name.d)))
14034 ?: (lien grouped.resolution |=(n=term =(n name.d)))
11504 =/ found=(unit ischeme) (ienv-lookup name.d env)
14035 =/ found=(unit ischeme) (ienv-lookup name.d env)
11505 ?~ found $(ds t.ds, lines [(crip "++ {(trip name.d)}: recursive group unavailable") lines])
14036 ?~ found $(ds t.ds, lines [(crip "++ {(trip name.d)}: recursive group unavailable") lines])
@@ -11507,7 +14038,9 @@
11507 =/ line=@t (crip "++ {(trip name.d)}: {(show-itype typ ~)}{(show-atom-constraint typ)}")
14038 =/ line=@t (crip "++ {(trip name.d)}: {(show-itype typ ~)}{(show-atom-constraint typ)}")
11508 $(ds t.ds, lines [line lines])
14039 $(ds t.ds, lines [line lines])
11509 =/ top=(list term) (turn molds |=(m=[name=term body=shape] name.m))
14040 =/ top=(list term) (turn molds |=(m=[name=term body=shape] name.m))
11510− =/ initial=istate [0 ~ ~ ~ molds globals externals surs mark-externals marks jimports reserved-molds ~ ~ ~ | file top prelude ~ 256 ~]
14041+ =/ initial=istate [0 ~ ~ ~ molds globals externals surs mark-externals marks jimports reserved-molds ~ ~ ~ | file top prelude ~ 256 ~ ~ ~ ~ ~ ~]
14042+ =. gate-defs.initial source-defs
14043+ =. head-evidence.initial heads
11511 =. initial (reserve-def-caps val.d initial)
14044 =. initial (reserve-def-caps val.d initial)
11512 =/ result=iresult
14045 =/ result=iresult
11513 ?: |(?=(%gate -.val.d) ?=(%gate-wide -.val.d))
14046 ?: |(?=(%gate -.val.d) ?=(%gate-wide -.val.d))
@@ -11547,4 +14080,667 @@
11547 =/ printable=itype (canonical-itype typ vars)
14080 =/ printable=itype (canonical-itype typ vars)
11548 =/ line=@t (crip "++ {(trip name.d)}: {(show-itype printable ~)}{(show-atom-constraint printable)}")
14081 =/ line=@t (crip "++ {(trip name.d)}: {(show-itype printable ~)}{(show-atom-constraint printable)}")
11549 $(ds t.ds, lines [line lines])
14082 $(ds t.ds, lines [line lines])
14083+:: Experimental module-owned pending-constraint generalization only.
14084+:: Inputs, IDs and substitution come from one checker-owned transaction.
14085++$ dgscan [ids=(list @ud) fuel=@ud]
14086+++ dg-scan
14087+ |= [todo=(list itype) sub=isub fuel=@ud ids=(list @ud)]
14088+ ^- (unit dgscan)
14089+ ?~ todo `[ids fuel]
14090+ ?: =(0 fuel) ~
14091+ =. fuel (dec fuel)
14092+ =/ t=itype i.todo
14093+ ?: ?=(?(%var %avar %rvar %nvar %rnvar %tag) -.t)
14094+ =/ node-id=@ud ?:(?=(%tag -.t) id.t +.t)
14095+ =/ found=(unit itype) (itype-lookup node-id sub)
14096+ ?~ found $(todo t.todo, ids [node-id ids])
14097+ ?: &(?=(?(%rvar %rnvar) -.u.found) =(node-id +.u.found))
14098+ $(todo t.todo, ids [node-id ids])
14099+ $(todo [u.found t.todo])
14100+ ?: ?=(%jrec -.t) $(todo t.todo)
14101+ ?+ -.t ~
14102+ %collection $(todo (weld args.t t.todo))
14103+ %union $(todo (weld args.t (weld cases.t t.todo)))
14104+ %face $(todo [body.t t.todo])
14105+ %fn $(todo [sample.t product.t t.todo])
14106+ %cell $(todo [hed.t tal.t t.todo])
14107+ %atom $(todo t.todo)
14108+ %any-atom $(todo t.todo)
14109+ %flag $(todo t.todo)
14110+ %noun $(todo t.todo)
14111+ %empty $(todo t.todo)
14112+ %const $(todo t.todo)
14113+ ==
14114+::
14115+++ dg-scan-ids
14116+ |= [ids=(list @ud) sub=isub fuel=@ud blocked=(list @ud)]
14117+ ^- (unit dgscan)
14118+ ?~ ids `[blocked fuel]
14119+ =/ one=(unit dgscan) (dg-scan ~[[%var i.ids]] sub fuel blocked)
14120+ ?~ one ~
14121+ $(ids t.ids, fuel fuel.u.one, blocked ids.u.one)
14122+::
14123+++ dg-env
14124+ |= [env=ienv sub=isub fuel=@ud blocked=(list @ud)]
14125+ ^- (unit dgscan)
14126+ ?~ env `[blocked fuel]
14127+ =/ sc=ischeme scheme.i.env
14128+ :: Quantifiers are local to the scheme: first find raw free IDs, then
14129+ :: follow those IDs in the module substitution without capturing them.
14130+ =/ raw=(unit dgscan) (dg-scan ~[typ.sc] ~ fuel ~)
14131+ ?~ raw ~
14132+ =/ free=(list @ud) (skim ids.u.raw |=(n=@ud !(lien vars.sc |=(q=@ud =(q n)))))
14133+ =/ resolved=(unit dgscan) (dg-scan-ids free sub fuel.u.raw blocked)
14134+ ?~ resolved ~
14135+ $(env t.env, fuel fuel.u.resolved, blocked ids.u.resolved)
14136+::
14137+++ dg-obligations
14138+ |= [pending=(list dgo) sub=isub fuel=@ud blocked=(list @ud)]
14139+ ^- (unit dgscan)
14140+ ?~ pending `[blocked fuel]
14141+ =/ found=(unit dgscan) (dg-scan ~[left.i.pending right.i.pending] sub fuel blocked)
14142+ ?~ found ~
14143+ $(pending t.pending, fuel fuel.u.found, blocked ids.u.found)
14144+::
14145+++ dg-tags
14146+ |= [tags=(list ipending) sub=isub fuel=@ud blocked=(list @ud)]
14147+ ^- (unit dgscan)
14148+ ?~ tags `[blocked fuel]
14149+ ?: =(0 fuel) ~
14150+ =/ found=(unit itype) (itype-lookup id.i.tags sub)
14151+ ?~ found $(tags t.tags, fuel (dec fuel), blocked [id.i.tags blocked])
14152+ :: Until this entry is explicitly discharged, retain variables reachable
14153+ :: through its binding; mere existence of a substitution is not proof.
14154+ =/ reached=(unit dgscan) (dg-scan ~[u.found] sub (dec fuel) blocked)
14155+ ?~ reached ~
14156+ $(tags t.tags, fuel fuel.u.reached, blocked ids.u.reached)
14157+::
14158+++ dg-generalize
14159+ |= [typ=itype env=ienv pending=(list dgo) tags=(list ipending) captured=(list @ud) state=istate fuel=@ud]
14160+ ^- (unit ischeme)
14161+ :: Bound the obligation list and all graph/substitution walks. The
14162+ :: substitution is assumed checker-owned and occurs-checked.
14163+ ?: (gth (lent pending) 64) ~
14164+ =/ capt=(unit dgscan) (dg-scan-ids captured sub.state fuel ~)
14165+ ?~ capt ~
14166+ =/ env-free=(unit dgscan) (dg-env env sub.state fuel.u.capt ids.u.capt)
14167+ ?~ env-free ~
14168+ =/ obligations=(unit dgscan) (dg-obligations pending sub.state fuel.u.env-free ids.u.env-free)
14169+ ?~ obligations ~
14170+ =/ tagged=(unit dgscan) (dg-tags tags sub.state fuel.u.obligations ids.u.obligations)
14171+ ?~ tagged ~
14172+ =/ bounded=(unit dgscan) (dg-scan ~[typ] sub.state fuel.u.tagged ~)
14173+ ?~ bounded ~
14174+ =/ normalized=itype (itype-normalize typ sub.state)
14175+ =/ vars=(list @ud) (unique-type-vars (itype-vars normalized))
14176+ =/ quantified=(list @ud) (skim vars |=(n=@ud !(lien ids.u.tagged |=(b=@ud =(b n)))))
14177+ `[[normalized quantified]]
14178+::
14179++$ dgcommit [env=ienv state=istate]
14180+:: A branch literal must not acquire a value face through replay.
14181+++ dg-literal-target-safe
14182+ |= target=itype
14183+ ^- ?
14184+ ?: ?=(%union -.target)
14185+ (levy cases.target |=(c=itype ?=(?(%const %cell) -.c)))
14186+ ?=(?(%const %atom %any-atom %flag %noun) -.target)
14187+::
14188+++ dg-replay-edges
14189+ |= [edges=(list dgo) state=istate fuel=@ud]
14190+ ^- (unit istate)
14191+ ?~ edges `state
14192+ ?: =(0 fuel) ~
14193+ =/ trial=ifit (itype-fit left.i.edges right.i.edges sub.state next.state)
14194+ ?. ?=(%ok -.trial) ~
14195+ =/ valid=?
14196+ ?: ?=(%tag -.left.i.edges)
14197+ ?. constructor.left.i.edges
14198+ =/ closed=(unit dgscan) (dg-scan ~[right.i.edges] sub.trial 512 ~)
14199+ ?~ closed |
14200+ ?^ ids.u.closed |
14201+ (dg-literal-target-safe (itype-normalize right.i.edges sub.trial))
14202+ =((itype-walk left.i.edges sub.trial) (itype-walk right.i.edges sub.trial))
14203+ =((itype-walk left.i.edges sub.trial) (itype-walk right.i.edges sub.trial))
14204+ ?. valid ~
14205+ $(edges t.edges, state state(sub sub.trial, next next.trial), fuel (dec fuel))
14206+::
14207+++ dg-close-env
14208+ |= [env=ienv sub=isub fuel=@ud]
14209+ ^- (unit ienv)
14210+ ?~ env `~
14211+ ?: =(0 fuel) ~
14212+ =/ s=ischeme scheme.i.env
14213+ :: Quantified IDs are scheme-local and cannot be rewritten on publication.
14214+ ?. (levy vars.s |=(n=@ud ?=(~ (itype-lookup n sub)))) ~
14215+ =/ bounded=(unit dgscan) (dg-scan ~[typ.s] sub (dec fuel) ~)
14216+ ?~ bounded ~
14217+ =/ normalized=itype (itype-normalize typ.s sub)
14218+ ?: (itype-has-tag normalized) ~
14219+ =/ vars=(list @ud) (unique-type-vars (itype-vars normalized))
14220+ ?. (levy vars |=(n=@ud (lien vars.s |=(v=@ud =(v n))))) ~
14221+ =/ rest=(unit ienv) (dg-close-env t.env sub fuel.u.bounded)
14222+ ?~ rest ~
14223+ `[[name.i.env [normalized vars.s]] u.rest]
14224+::
14225+:: A deferred boolean branch has exactly the two literal flag patterns.
14226+:: Arms are inferred in order. Equal types are retained; two direct pending
14227+:: literals may instead retain source-owned obligations for later context.
14228+++ dg-boolean-patterns
14229+ |= e=expr
14230+ ^- ?
14231+ ?. ?=(%branch -.e) |
14232+ ?~ arms.e |
14233+ ?~ t.arms.e |
14234+ ?^ t.t.arms.e |
14235+ =/ x=arm i.arms.e
14236+ =/ y=arm i.t.arms.e
14237+ ?. &(?=(%lit -.pat.x) ?=(%lit -.pat.y)) |
14238+ ?. &(=(%loobean form.lit.pat.x) =(%loobean form.lit.pat.y)) |
14239+ !=(val.lit.pat.x val.lit.pat.y)
14240+:: Only a direct source literal which created its own unbound pending tag
14241+:: may create a branch edge. The caller must retain the exact source and state.
14242+++ dg-owned-arm-literal
14243+ |= [e=expr t=itype tags=(list ipending) sub=isub initial=@ud]
14244+ ^- ?
14245+ ?. ?=(%lit -.e) |
14246+ ?. ?=(%tag -.t) |
14247+ ?: constructor.t |
14248+ ?. =(lit.e literal.t) |
14249+ ?: (lth id.t initial) |
14250+ ?^ (itype-lookup id.t sub) |
14251+ (lien tags |=(x=ipending &(=(id.x id.t) =(literal.x literal.t))))
14252+++ dg-boolean-branch
14253+ |= [e=expr env=ienv state=istate]
14254+ ^- iresult
14255+ ?. (dg-boolean-patterns e) [%| ["deferred branch patterns need unsupported inference" ~]]
14256+ ?> ?=(%branch -.e)
14257+ ?> ?=(^ arms.e)
14258+ ?> ?=(^ t.arms.e)
14259+ =/ x=arm i.arms.e
14260+ =/ y=arm i.t.arms.e
14261+ =/ subject=iresult (infer-fragment subject.e env state)
14262+ ?: ?=(%| -.subject) subject
14263+ =/ su=(unit isub) (itype-unify typ.p.subject [%flag ~] sub.state.p.subject)
14264+ ?~ su [%| ["deferred branch subject does not unify with ?" ~]]
14265+ =/ left=iresult (infer-fragment val.x env state.p.subject(sub u.su))
14266+ ?: ?=(%| -.left) left
14267+ =/ right=iresult (infer-fragment val.y env state.p.left)
14268+ ?: ?=(%| -.right) right
14269+ ?. (dg-stable-fit typ.p.left typ.p.right sub.state.p.right)
14270+ =/ st=istate state.p.right
14271+ ?. (dg-owned-arm-literal val.x typ.p.left tags.st sub.st next.state)
14272+ [%| ["deferred branch arm context needs unsupported inference" ~]]
14273+ ?. (dg-owned-arm-literal val.y typ.p.right tags.st sub.st next.state)
14274+ [%| ["deferred branch arm context needs unsupported inference" ~]]
14275+ ?> ?=(%tag -.typ.p.left)
14276+ ?> ?=(%tag -.typ.p.right)
14277+ ?: =(id.typ.p.left id.typ.p.right)
14278+ [%| ["deferred branch arm context needs unsupported inference" ~]]
14279+ ?: (gth (lent obligations.st) 62)
14280+ [%| ["deferred branch arm context needs unsupported inference" ~]]
14281+ =/ result=itype [%var next.st]
14282+ =/ ex=dgo [typ.p.left result (span-of val.x) (span-of e)]
14283+ =/ ey=dgo [typ.p.right result (span-of val.y) (span-of e)]
14284+ [%& result st(next +(next.st), obligations [ex ey obligations.st])]
14285+ [%& typ.p.left state.p.right]
14286+::
14287+:: A direct tuple literal may wait for a later exact result context.
14288+:: Each pending literal retains its source tag and its own fit obligation.
14289+++ dg-infer-tuple-items
14290+ |= [items=(list item) env=ienv state=istate]
14291+ ^- iresult
14292+ ?~ items [%| ["empty cell is not supported by partial inference" ~]]
14293+ =/ head=iresult (infer-fragment val.i.items env state)
14294+ ?: ?=(%| -.head) head
14295+ =/ typ=itype typ.p.head
14296+ =/ st=istate state.p.head
14297+ =/ adjusted=(unit [typ=itype state=istate])
14298+ ?. (dg-owned-arm-literal val.i.items typ tags.st sub.st next.state) `[typ st]
14299+ ?: (gth (lent obligations.st) 63) ~
14300+ =/ pending=itype [%var next.st]
14301+ =/ edge=dgo [typ pending (span-of val.i.items) at.i.items]
14302+ `[pending st(next +(next.st), obligations [edge obligations.st])]
14303+ ?~ adjusted [%| ["deferred tuple context needs unsupported inference" ~]]
14304+ =. typ typ.u.adjusted
14305+ =. st state.u.adjusted
14306+ =. typ ?~(face.i.items typ [%face u.face.i.items typ])
14307+ ?~ t.items [%& typ st]
14308+ =/ tail=iresult $(items t.items, state st)
14309+ ?: ?=(%| -.tail) tail
14310+ [%& [%cell typ typ.p.tail] state.p.tail]
14311+::
14312+:: Deferred inference uses only source forms whose successful fit sites are
14313+:: guarded below; a shared source-node budget bounds this screen.
14314+++ dg-safe-expressions
14315+ |= [todo=(list expr) fuel=@ud]
14316+ ^- (unit @ud)
14317+ ?~ todo `fuel
14318+ =/ first=(unit @ud) (dg-safe-expression i.todo fuel)
14319+ ?~ first ~
14320+ $(todo t.todo, fuel u.first)
14321+++ dg-safe-items
14322+ |= [items=(list item) fuel=@ud]
14323+ ^- (unit @ud)
14324+ ?~ items `fuel
14325+ =/ first=(unit @ud) (dg-safe-expression val.i.items fuel)
14326+ ?~ first ~
14327+ $(items t.items, fuel u.first)
14328+++ dg-safe-expression
14329+ |= [e=expr fuel=@ud]
14330+ ^- (unit @ud)
14331+ ?: =(0 fuel) ~
14332+ =. fuel (dec fuel)
14333+ ?+ -.e ~
14334+ ?(%lit %ctor) `fuel
14335+ %wing ?:(?=([@ ~] names.e) `fuel ~)
14336+ %str
14337+ ?. (levy pieces.e |=(p=piece ?=(%text -.p))) ~
14338+ `fuel
14339+ %group $(e inner.e, fuel fuel)
14340+ %body
14341+ ?^ defs.e ~
14342+ $(e final.e, fuel fuel)
14343+ %gate $(e body.e, fuel fuel)
14344+ %gate-wide $(e body.e, fuel fuel)
14345+ %tuple (dg-safe-items items.e fuel)
14346+ %branch
14347+ ?. (dg-boolean-patterns e) ~
14348+ ?> ?=(^ arms.e)
14349+ ?> ?=(^ t.arms.e)
14350+ =/ subject=(unit @ud) $(e subject.e, fuel fuel)
14351+ ?~ subject ~
14352+ (dg-safe-expressions ~[val.i.arms.e val.i.t.arms.e] u.subject)
14353+ %cast $(e val.e, fuel fuel)
14354+ %call
14355+ =/ head=(unit @ud) $(e head.e, fuel fuel)
14356+ ?~ head ~
14357+ (dg-safe-expressions args.e u.head)
14358+ ==
14359+:: Exact normalized equality is preserved by all later substitutions.
14360+:: The bounded scan declines opaque types and oversized inputs.
14361+++ dg-stable-fit
14362+ |= [actual=itype expected=itype sub=isub]
14363+ ^- ?
14364+ ?~ (dg-scan ~[actual expected] sub 512 ~) |
14365+ =((itype-normalize actual sub) (itype-normalize expected sub))
14366+::
14367+:: A positional call peels sample-slot faces during its separate face check.
14368+:: Require its argument, sample and result closed so that check stays valid.
14369+++ dg-stable-call-fit
14370+ |= [actual=itype expected=itype product=itype sub=isub positional=?]
14371+ ^- ?
14372+ =/ checked=(unit dgscan) (dg-scan ~[actual expected product] sub 512 ~)
14373+ ?~ checked |
14374+ ?: &(positional ?=(^ ids.u.checked)) |
14375+ =((itype-normalize actual sub) (itype-normalize expected sub))
14376+::
14377+:: One definition attempt retains state only when inference succeeds.
14378++$ dg-step [env=ienv state=istate pending=(list dgo)]
14379+++ dg-stage-one
14380+ |= [d=def env=ienv state=istate]
14381+ ^- (unit dg-step)
14382+ ?> ?=(%value -.d)
14383+ ?~ (dg-safe-expression val.d 512) ~
14384+ =/ local=istate (reserve-def-caps val.d state)
14385+ :: This first slice declines all written capitals and holes/projections.
14386+ ?^ caps.local ~
14387+ =/ ordinary=iresult (infer-fragment val.d env local)
14388+ ?: ?=(%| -.ordinary) ~
14389+ =/ typ=itype typ.p.ordinary
14390+ =/ after=istate state.p.ordinary
14391+ =/ edges=(list dgo) obligations.after
14392+ ?. =(binders.after binders.state) ~
14393+ ?. =(molds.after molds.state) ~
14394+ ?. =(globals.after globals.state) ~
14395+ ?. =(externals.after externals.state) ~
14396+ ?. =(surs.after surs.state) ~
14397+ ?. =(mark-externals.after mark-externals.state) ~
14398+ ?. =(marks.after marks.state) ~
14399+ ?. =(jimports.after jimports.state) ~
14400+ ?. =(reserved-molds.after reserved-molds.state) ~
14401+ ?. =(params.after params.state) ~
14402+ ?. =(active.after active.state) ~
14403+ ?. =(in-mold.after in-mold.state) ~
14404+ ?. =(at.after at.state) ~
14405+ ?. =(top-molds.after top-molds.state) ~
14406+ ?. =(prelude.after prelude.state) ~
14407+ ?. =(gate-defs.after gate-defs.state) ~
14408+ ?. =(head-evidence.after head-evidence.state) ~
14409+ ?. =(grec-index.after grec-index.state) ~
14410+ ?. =(defer.after defer.state) ~
14411+ ?. =(holes.after holes.state) ~
14412+ ?. =(caps.after caps.state) ~
14413+ ?. =(projections.after projections.state) ~
14414+ ?: (unsupported-atom-vars (itype-normalize typ sub.after) caps.after binders.after sub.after) ~
14415+ ?: (itype-has-nvar (itype-normalize typ sub.after)) ~
14416+ =/ scheme=(unit ischeme) (dg-generalize typ env edges tags.after ~ after 32.768)
14417+ ?~ scheme ~
14418+ `[[[name.d u.scheme] env] after edges]
14419+:: Retry only definitions that did not infer. Successful definitions are
14420+:: committed into the local transaction, never published until all close.
14421+++ dg-stage
14422+ |= [ds=(list def) base=ienv env=ienv state=istate pending=(list dgo) fuel=@ud]
14423+ ^- (unit dgcommit)
14424+ ?: (gth fuel 64) ~
14425+ ?: (gth (lent ds) fuel) ~
14426+ =/ remaining=(list def) ds
14427+ =/ waiting=(list def) ~
14428+ =/ progress=? |
14429+ =/ attempts=@ud (mul fuel fuel)
14430+ |-
14431+ ?~ remaining
14432+ ?^ waiting
14433+ ?. progress ~
14434+ $(remaining (flop waiting), waiting ~, progress |)
14435+ =/ replayed=(unit istate) (dg-replay-edges pending state 64)
14436+ ?~ replayed ~
14437+ ?: (pending-tags tags.u.replayed sub.u.replayed) ~
14438+ =/ closed-edges=(unit dgscan) (dg-obligations pending sub.u.replayed 32.768 ~)
14439+ ?~ closed-edges ~
14440+ ?^ ids.u.closed-edges ~
14441+ =/ rechecked=(unit istate) (dg-replay-edges pending u.replayed 64)
14442+ ?~ rechecked ~
14443+ ?. =(sub.u.rechecked sub.u.replayed) ~
14444+ ?. =(next.u.rechecked next.u.replayed) ~
14445+ =/ closed=(unit ienv) (dg-close-env env sub.u.replayed 32.768)
14446+ ?~ closed ~
14447+ `[[u.closed u.replayed(defer ~, obligations ~)]]
14448+ ?: =(0 attempts) ~
14449+ =. attempts (dec attempts)
14450+ =/ d=def i.remaining
14451+ ?: ?=(%mold -.d) $(remaining t.remaining)
14452+ ?^ (ienv-lookup name.d base) $(remaining t.remaining)
14453+ ?^ (ienv-lookup name.d env) ~
14454+ =/ done=(unit dg-step) (dg-stage-one d env state)
14455+ ?~ done $(remaining t.remaining, waiting [d waiting])
14456+ $(remaining t.remaining, env env.u.done, state state.u.done, pending pending.u.done, progress &)
14457+::
14458+:: Cheap bounded eligibility check on the already parsed source. This
14459+:: deliberately covers only direct constructor calls beneath transparent
14460+:: groups, gates, casts and definition-free bodies. Other shapes decline
14461+:: this fallback without a second parse or resolution pass.
14462+++ dg-direct-source
14463+ |= [e=expr fuel=@ud]
14464+ ^- ?
14465+ ?: =(0 fuel) |
14466+ ?+ -.e |
14467+ %group $(e inner.e, fuel (dec fuel))
14468+ %gate $(e body.e, fuel (dec fuel))
14469+ %gate-wide $(e body.e, fuel (dec fuel))
14470+ %cast $(e val.e, fuel (dec fuel))
14471+ %body ?~(defs.e $(e final.e, fuel (dec fuel)) |)
14472+ %call
14473+ ?. ?=([* ~] args.e) |
14474+ ?=(%ctor -.i.args.e)
14475+ ==
14476+++ dg-source-candidate
14477+ |= [ds=(list def) fuel=@ud]
14478+ ^- ?
14479+ ?~ ds |
14480+ ?: =(0 fuel) |
14481+ ?. ?=(%value -.i.ds) $(ds t.ds, fuel (dec fuel))
14482+ ?: (dg-direct-source val.i.ds 64) &
14483+ $(ds t.ds, fuel (dec fuel))
14484+::
14485+++ dg-prepared-source
14486+ |= [e=expr fuel=@ud]
14487+ ^- ?
14488+ ?: (dg-direct-source e fuel) &
14489+ ?: =(0 fuel) |
14490+ ?+ -.e |
14491+ %group $(e inner.e, fuel (dec fuel))
14492+ %gate $(e body.e, fuel (dec fuel))
14493+ %gate-wide $(e body.e, fuel (dec fuel))
14494+ %cast $(e val.e, fuel (dec fuel))
14495+ %body ?~(defs.e $(e final.e, fuel (dec fuel)) |)
14496+ %tuple &
14497+ ==
14498+++ dg-prepared-candidate
14499+ |= [ds=(list def) fuel=@ud]
14500+ ^- ?
14501+ ?~ ds |
14502+ ?: =(0 fuel) |
14503+ ?. ?=(%value -.i.ds) $(ds t.ds, fuel (dec fuel))
14504+ ?: (dg-prepared-source val.i.ds 64) &
14505+ $(ds t.ds, fuel (dec fuel))
14506+::
14507+++ dg-interface-safe
14508+ |= [env=ienv]
14509+ ^- ?
14510+ ?~ env &
14511+ =/ sc=ischeme scheme.i.env
14512+ ?: |((itype-has-hidden-recursive typ.sc) (itype-has-hidden-generic typ.sc)) |
14513+ ?: (gth (lent vars.sc) 26) |
14514+ $(env t.env)
14515+:: Parse status and the transaction result come from the same source parse.
14516++$ dgparse [parsed=? result=(unit dgcommit)]
14517+++ dg-root-source
14518+ |= [at=path src=@t]
14519+ ^- (unit dgcommit)
14520+ result:(dg-root-detail at src)
14521+++ dg-root-detail
14522+ |= [at=path src=@t]
14523+ ^- dgparse
14524+ =/ parsed (parse at src)
14525+ ?: ?=(%| -.parsed) [| ~]
14526+ =/ transact
14527+ |.
14528+ ?^ imports.p.parsed ~
14529+ ?. (module-scope-valid p.parsed ~ ~) ~
14530+ ?^ (duplicate-defs defs.p.parsed) ~
14531+ =/ defs=(list def) defs.p.parsed
14532+ ?: (gth (lent defs) 64) ~
14533+ =/ molds=imolds (collect-simple-molds defs)
14534+ =/ globals=(list term) (global-value-names defs)
14535+ =/ resolution=iresolved (resolve-groups defs molds globals ~ ~ ~ ~ ~ ~ at ~)
14536+ ?^ grouped.resolution ~
14537+ ?^ artifacts.resolution ~
14538+ =/ base=ienv env.resolution
14539+ =/ free=(unit dgscan) (dg-env base ~ 32.768 ~)
14540+ ?~ free ~
14541+ ?^ ids.u.free ~
14542+ =/ all=(unit dgscan) (dg-all-env-ids base 32.768 ~)
14543+ ?~ all ~
14544+ =/ fresh=@ud (dg-next-id ids.u.all 0)
14545+ =/ st=istate *istate
14546+ =. st st(next fresh, defer `~, molds molds, globals globals, at at, top-molds (turn molds |=(m=[name=term body=shape] name.m)), in-mold |, jrec-fuel 256)
14547+ =/ checked-molds=(each imold-types @t) (module-mold-types molds st)
14548+ ?: ?=(%| -.checked-molds) ~
14549+ (dg-stage defs base base st ~ 64)
14550+ ::
14551+ [& (transact)]
14552+:: The caller supplies the trusted prepared prelude. This transaction is
14553+:: only report evidence; the ordinary module resolver does not publish it.
14554+++ dg-root-prepared
14555+ |= [at=path src=@t prepared=iprelude]
14556+ ^- (unit dgcommit)
14557+ ?: ?=([%ui %api *] at) ~
14558+ ?: ?=([%ui %stores *] at) ~
14559+ ?: (gth (met 3 src) 65.536) ~
14560+ =/ parsed (parse at src)
14561+ ?: ?=(%| -.parsed) ~
14562+ ?^ imports.p.parsed ~
14563+ ?. (module-scope-valid p.parsed values.prepared molds.prepared) ~
14564+ ?^ (duplicate-defs defs.p.parsed) ~
14565+ =/ defs=(list def) defs.p.parsed
14566+ ?: (gth (lent defs) 64) ~
14567+ ?: (lien (global-value-names defs) |=(n=term =(n %main))) ~
14568+ ?. (dg-prepared-candidate defs 64) ~
14569+ =/ local-molds=imolds (collect-simple-molds defs)
14570+ =/ globals=(list term) (weld values.prepared (global-value-names defs))
14571+ =/ iface=ifile iface.prepared
14572+ =/ prelude=(unit ifile) `iface
14573+ =/ resolution=iresolved
14574+ (resolve-groups defs local-molds globals ~ ~ ~ ~ ~ molds.prepared at prelude)
14575+ ?^ grouped.resolution ~
14576+ ?^ artifacts.resolution ~
14577+ =/ base=ienv env.resolution
14578+ =/ templates=ienv
14579+ (turn molds.iface |=(x=[name=term template=ischeme] [name.x template.x]))
14580+ =/ all-env=ienv (weld base (weld values.iface templates))
14581+ =/ free=(unit dgscan) (dg-env all-env ~ 32.768 ~)
14582+ ?~ free ~
14583+ ?^ ids.u.free ~
14584+ =/ all=(unit dgscan) (dg-all-env-ids all-env 32.768 ~)
14585+ ?~ all ~
14586+ =/ fresh=@ud (dg-next-id ids.u.all 0)
14587+ =/ st=istate *istate
14588+ =. st st(next fresh, defer `~, molds local-molds, globals globals, at at, reserved-molds molds.prepared, prelude prelude, top-molds (turn local-molds |=(m=[name=term body=shape] name.m)), in-mold |, jrec-fuel 256)
14589+ =/ checked-molds=(each imold-types @t) (module-mold-types local-molds st)
14590+ ?: ?=(%| -.checked-molds) ~
14591+ (dg-stage defs base base st ~ 64)
14592+::
14593+++ dg-all-env-ids
14594+ |= [env=ienv fuel=@ud ids=(list @ud)]
14595+ ^- (unit dgscan)
14596+ ?~ env `[ids fuel]
14597+ ?: =(0 fuel) ~
14598+ =/ sc=ischeme scheme.i.env
14599+ ?: (itype-has-tag typ.sc) ~
14600+ =/ raw=(unit dgscan) (dg-scan ~[typ.sc] ~ (dec fuel) ids)
14601+ ?~ raw ~
14602+ =/ quant=(unit dgscan) (dg-scan-ids vars.sc ~ fuel.u.raw ids.u.raw)
14603+ ?~ quant ~
14604+ $(env t.env, fuel fuel.u.quant, ids ids.u.quant)
14605+::
14606+++ dg-next-id
14607+ |= [ids=(list @ud) largest=@ud]
14608+ ^- @ud
14609+ ?~ ids +(largest)
14610+ $(ids t.ids, largest (max largest i.ids))
14611+::
14612+++ dg-eligible-ctor
14613+ |= [e=expr head=itype actual=itype expected=itype state=istate]
14614+ ^- (unit dgo)
14615+ ?. ?=(%call -.e) ~
14616+ ?. ?=([* ~] args.e) ~
14617+ ?. ?=(%ctor -.i.args.e) ~
14618+ ?. ?=(%fn -.head) ~
14619+ ?. ?=(%fn -.expected) ~
14620+ ?. ?=(%tag -.actual) ~
14621+ ?. constructor.actual ~
14622+ ?. ?=(%var -.product.expected) ~
14623+ ?^ (itype-lookup id.product.expected sub.state) ~
14624+ =/ bounded=(unit dgscan) (dg-scan ~[sample.expected] sub.state 256 ~)
14625+ ?~ bounded ~
14626+ ?^ ids.u.bounded ~
14627+ `[[actual expected (span-of i.args.e) (span-of head.e)]]
14628+::
14629+:: Experimental per-module, source-derived recursive tree index.
14630+:: The two tags and the exact children/list/self layout are fixed-shape
14631+:: checks, so ordinary definitions incur no type-tree or source scans.
14632+++ grec-tagged-fields
14633+ |= sh=shape
14634+ ^- (unit [tag=@ fields=(list field)])
14635+ ?. ?=(%cell -.sh) ~
14636+ ?~ fields.sh ~
14637+ =/ head=field i.fields.sh
14638+ ?. ?=(%bare -.head) ~
14639+ ?. ?=(%const -.shape.head) ~
14640+ ?. &(?=(%term form.lit.shape.head) =(%tas aura.lit.shape.head)) ~
14641+ `[val.lit.shape.head t.fields.sh]
14642+++ grec-tree-children
14643+ |= [fs=(list field) param=@t]
14644+ ^- (unit field)
14645+ ?~ fs ~
14646+ ?~ t.fs `i.fs
14647+ ?^ t.t.fs ~
14648+ =/ event=field i.fs
14649+ =/ kids=field i.t.fs
14650+ ?. &(?=(%face -.event) ?=(%face -.kids)) ~
14651+ ?. !=(name.event name.kids) ~
14652+ ?. ?=(%fn -.shape.event) ~
14653+ ?. ?=(%aura -.sample.shape.event) ~
14654+ ?. =(%t aura.sample.shape.event) ~
14655+ ?. ?=(%tvar -.product.shape.event) ~
14656+ ?. =(param name.product.shape.event) ~
14657+ `kids
14658+::
14659+++ grec-tree-proof
14660+ |= [name=term sh=shape]
14661+ ^- ?
14662+ ?. ?=(%generic -.sh) |
14663+ ?. ?=([@ ~] vars.sh) |
14664+ =/ param=@t i.vars.sh
14665+ ?. ?=(%union -.body.sh) |
14666+ ?. ?=([* [* ~]] cases.body.sh) |
14667+ =/ a=(unit [tag=@ fields=(list field)]) (grec-tagged-fields i.cases.body.sh)
14668+ =/ b=(unit [tag=@ fields=(list field)]) (grec-tagged-fields i.t.cases.body.sh)
14669+ ?~ a |
14670+ ?~ b |
14671+ ?. !=(tag.u.a tag.u.b) |
14672+ ?. ?=([* ~] fields.u.a) |
14673+ =/ value=field i.fields.u.a
14674+ ?. ?=(%face -.value) |
14675+ ?. ?=(%aura -.shape.value) |
14676+ ?. =(%t aura.shape.value) |
14677+ =/ selected=(unit field) (grec-tree-children fields.u.b param)
14678+ ?~ selected |
14679+ =/ kids=field u.selected
14680+ ?. ?=(%face -.kids) |
14681+ ?. ?=(%apply -.shape.kids) |
14682+ ?. =(ref.shape.kids ~[%list]) |
14683+ ?. ?=([* ~] args.shape.kids) |
14684+ =/ self=shape i.args.shape.kids
14685+ ?. ?=(%apply -.self) |
14686+ ?. =(ref.self ~[name]) |
14687+ ?. ?=([* ~] args.self) |
14688+ ?. ?=(%tvar -.i.args.self) |
14689+ =(name.i.args.self param)
14690++$ grec-collected [molds=imolds proofs=(map term shape)]
14691+:: Experimental one-layer analysis view, never an exported mold identity.
14692+++ grec-unfold-view
14693+ |= [typ=itype fuel=@ud]
14694+ ^- (unit [view=itype left=@ud])
14695+ ?. ?=(%grec -.typ) ~
14696+ ?: =(fuel 0) ~
14697+ ?. ?=([* ~] args.typ) ~
14698+ =/ sh=shape proof.typ
14699+ ?. (grec-tree-proof name.typ sh) ~
14700+ ?> ?=(%generic -.sh)
14701+ ?> ?=([@ ~] vars.sh)
14702+ ?> ?=(%union -.body.sh)
14703+ ?> ?=([* [* ~]] cases.body.sh)
14704+ =/ ca=shape i.cases.body.sh
14705+ =/ cb=shape i.t.cases.body.sh
14706+ ?> ?=(%cell -.ca)
14707+ ?> ?=(%cell -.cb)
14708+ ?> ?=([* [* ~]] fields.ca)
14709+ ?> ?=([* *] fields.cb)
14710+ =/ tag-a=field i.fields.ca
14711+ =/ tag-b=field i.fields.cb
14712+ ?> ?=(%bare -.tag-a)
14713+ ?> ?=(%bare -.tag-b)
14714+ ?> ?=(%const -.shape.tag-a)
14715+ ?> ?=(%const -.shape.tag-b)
14716+ =/ text-field=field i.t.fields.ca
14717+ ?> ?=(%face -.text-field)
14718+ =/ branch=(list field) t.fields.cb
14719+ =/ kids=(unit field) (grec-tree-children branch i.vars.sh)
14720+ ?~ kids ~
14721+ ?> ?=(%face -.u.kids)
14722+ =/ children=itype [%face name.u.kids [%collection %list ~[typ]]]
14723+ ?> ?=(^ branch)
14724+ =/ payload=itype
14725+ ?~ t.branch children
14726+ =/ event=field i.branch
14727+ ?> ?=(%face -.event)
14728+ [%cell [%face name.event [%fn [%atom %t] i.args.typ]] children]
14729+ =/ leaf=itype [%cell [%const lit.shape.tag-a] [%face name.text-field [%atom %t]]]
14730+ =/ node=itype [%cell [%const lit.shape.tag-b] payload]
14731+ `[[%union ~[leaf node] ~ ~ ~] (dec fuel)]
14732+::
14733+++ grec-collect-molds
14734+ |= ds=(list def)
14735+ ^- grec-collected
14736+ ?~ ds [~ *(map term shape)]
14737+ =/ rest=grec-collected $(ds t.ds)
14738+ ?. ?=(%mold -.i.ds) rest
14739+ =/ name=term name.i.ds
14740+ =/ body=shape shape.i.ds
14741+ =/ proofs=(map term shape) proofs.rest
14742+ =? proofs (grec-tree-proof name body) (~(put by proofs) name body)
14743+ [[[name body] molds.rest] proofs]
14744+::
14745+
11550--
14746--
jibb-dev/lib/jibb/internal.jibb+2
@@ -18,6 +18,8 @@
18:: Private compiler primitive wrappers; execution is a later milestone.
18:: Private compiler primitive wrappers; execution is a later milestone.
19++ add-atom |= args=[A A] (raw-add.core args)
19++ add-atom |= args=[A A] (raw-add.core args)
20++ dec-atom |= atom=A (raw-dec.core atom)
20++ dec-atom |= atom=A (raw-dec.core atom)
21+++ trip-text |= value=@t (raw-trip.core value)
22+++ tuba-text |= values (raw-tuba.core values)
21
23
22:: Transparent request data. Identity and path fields are writable and do not
24:: Transparent request data. Identity and path fields are writable and do not
23:: prove a schema or watchability. A future executor must bind them to checked
25:: prove a schema or watchability. A future executor must bind them to checked
jibb-dev/lib/jibb/prelude.jibb+171
@@ -343,3 +343,174 @@
343 [%watch a=(ask M)]
343 [%watch a=(ask M)]
344 [%every gap=@dr reply=$-(@da M)]
344 [%every gap=@dr reply=$-(@da M)]
345 [%url reply=$-(path M)]
345 [%url reply=$-(path M)]
346+
347+:: Count a finite list with the source-backed addition gate.
348+++ lent |= xs=(list A)
349+ ^- @ud
350+ ?- xs
351+ ~ 0
352+ [item rest] (add 1 (lent rest))
353+
354+++ lth |= args=[A A]
355+ ?- args
356+ [x y] (gth y x)
357+
358+++ gte |= args=[A A]
359+ ?- args
360+ [x y] (not (gth y x))
361+
362+++ lte |= args=[A A]
363+ ?- args
364+ [x y] (not (gth x y))
365+
366+++ zing |= xss=(list (list A))
367+ ^- (list A)
368+ ?- xss
369+ ~ ~
370+ [xs rest] (weld xs (zing rest))
371+
372+++ lead |= first=A |= second=B [first second]
373+++ late |= second=B |= first=A [first second]
374+
375+++ succ |= x=A (add x 1)
376+
377+++ trip |= value=@t (trip-text.internal value)
378+++ tuba |= values=(list @tD) (tuba-text.internal values)
379+
380+:: UI values are source-level descriptions only. Nested element payloads are
381+:: erased in the nonrecursive union; the public constructors below retain the
382+:: typed composition boundaries. Raw-constructor encapsulation, rendering and
383+:: execution are not established by this slice.
384++$ length
385+ [%chars n=@ud]
386+ [%fill n=@ud]
387+ %shrink
388+
389++$ align
390+ %start
391+ %center
392+ %end
393+
394++$ role
395+ %body
396+ %caption
397+ %label
398+
399++$ tone
400+ %normal
401+ %muted
402+ %accent
403+ %danger
404+
405++$ attr
406+ [%pad %s0]
407+ [%pad %s1]
408+ [%pad %s2]
409+ [%pad %s3]
410+ [%gap %s0]
411+ [%gap %s1]
412+ [%gap %s2]
413+ [%gap %s3]
414+ [%width width=length]
415+ [%align align=align]
416+ [%role role=role]
417+ [%tone tone=tone]
418+
419++$ element |$ [M]
420+ [%row attrs=(list attr) kids=*]
421+ [%column attrs=(list attr) kids=*]
422+ [%wrap attrs=(list attr) kids=*]
423+ [%stack attrs=(list attr) kids=*]
424+ [%el attrs=(list attr) kid=*]
425+ [%para kids=*]
426+ [%text words=@t]
427+ [%heading level=@ud words=@t]
428+ [%each items=*]
429+ [%table columns=* rows=*]
430+ [%image source=qath description=@t]
431+ [%image-unsafe source=[url=@t width=@ud height=@ud] description=@t]
432+ [%link target=qath label=@t]
433+ [%link-unsafe target=@t label=@t]
434+ [%button label=@t message=M]
435+ [%toggle on=? label=@t message=M]
436+ [%field label=@t value=@t reply=$-(@t M)]
437+ [%form message=M kids=*]
438+ [%island payload=*]
439+
440+++ row |= [attrs=(list attr) kids=(list (element M))]
441+ ^- (element M) [%row attrs kids]
442+
443+++ column |= [attrs=(list attr) kids=(list (element M))]
444+ ^- (element M) [%column attrs kids]
445+
446+++ wrap |= [attrs=(list attr) kids=(list (element M))]
447+ ^- (element M) [%wrap attrs kids]
448+
449+++ stack |= [attrs=(list attr) kids=(list (element M))]
450+ ^- (element M) [%stack attrs kids]
451+
452+++ el |= [attrs=(list attr) kid=(element M)]
453+ ^- (element M) [%el attrs kid]
454+
455+++ para |= kids=(list (element M))
456+ ^- (element M) [%para kids]
457+
458+++ text |= words=@t
459+ ^- (element M) [%text words]
460+
461+++ heading |= [level=@ud words=@t]
462+ ^- (element M) [%heading level words]
463+
464+++ each |= items=(list [key=K el=(element M)])
465+ ^- (element M) [%each items]
466+
467+++ table |= [columns=(list [header=@t width=length align=align]) rows=(list [key=K cells=(list (element M))])]
468+ ^- (element M) [%table columns rows]
469+
470+++ image |= [source=qath description=@t]
471+ ^- (element M) [%image source description]
472+
473+++ image-unsafe |= [source=[url=@t width=@ud height=@ud] description=@t]
474+ ^- (element M) [%image-unsafe source description]
475+
476+++ link |= [target=qath label=@t]
477+ ^- (element M) [%link target label]
478+
479+++ link-unsafe |= [target=@t label=@t]
480+ ^- (element M) [%link-unsafe target label]
481+
482+++ button |= [label=@t message=M]
483+ ^- (element M) [%button label message]
484+
485+++ toggle |= [on=? label=@t message=M]
486+ ^- (element M) [%toggle on label message]
487+
488+++ field |= [label=@t value=@t reply=$-(@t M)]
489+ ^- (element M) [%field label value reply]
490+
491+++ form |= [message=M kids=(list (element M))]
492+ ^- (element M) [%form message kids]
493+
494++$ theme
495+ [ space=[s1=@t s2=@t s3=@t]
496+ tones=[normal=@t background=@t accent=@t danger=@t muted=@t]
497+ wide=@t
498+ lang=@t
499+ zone=@t
500+ font=(unit qath)
501+ dark=(unit [tones=[normal=@t background=@t accent=@t danger=@t muted=@t]])
502+
503++$ program |$ [D X M]
504+ [init=$-(D X) update=$-([M X] [X (list (cmd M))]) view=$-(X (element M)) subs=$-(X (list (sub M)))]
505+
506+++ program |= [init=$-(D X) update=$-([M X] [X (list (cmd M))]) view=$-(X (element M)) subs=$-(X (list (sub M)))]
507+ ^- (program D X M) [init update view subs]
508+
509+++ island |= [p=(program D X M) data=D]
510+ ^- (element !!) [%island [p data]]
511+
512++$ page |$ [R D]
513+ [load=$-(R (ask D)) view=$-(D (element !!))]
514+
515+++ page |= [load=$-(R (ask D)) view=$-(D (element !!))]
516+ ^- (page R D) [load view]
my-app/ui/theme.jibb+1−1
@@ -5,4 +5,4 @@
5 lang="en"
5 lang="en"
6 zone="UTC"
6 zone="UTC"
7 font=`%/static/fonts/inter.woff2
7 font=`%/static/fonts/inter.woff2
8− dark=[tones=[normal="#eee" background="#111" accent="#4c9" danger="#f28b82" muted="#aaa"]]
8+ dark=`[tones=[normal="#eee" background="#111" accent="#4c9" danger="#f28b82" muted="#aaa"]]
tests/golden/doc-overview-02-theme/source.jibb+1−1
@@ -5,4 +5,4 @@
5 lang="en"
5 lang="en"
6 zone="UTC"
6 zone="UTC"
7 font=`%/static/fonts/inter.woff2
7 font=`%/static/fonts/inter.woff2
8− dark=[tones=[normal="#eee" background="#111" accent="#4c9" danger="#f28b82" muted="#aaa"]]
8+ dark=`[tones=[normal="#eee" background="#111" accent="#4c9" danger="#f28b82" muted="#aaa"]]
tests/golden/doc-overview-02-theme/tokens.txt+24−23
@@ -62,27 +62,28 @@
628:5 NEWLINE
628:5 NEWLINE
638:5 name dark
638:5 name dark
648:9 tight glyph =
648:9 tight glyph =
65−8:10 tight glyph [
65+8:10 tight glyph `
66−8:11 tight name tones
66+8:11 tight glyph [
67−8:16 tight glyph =
67+8:12 tight name tones
68−8:17 tight glyph [
68+8:17 tight glyph =
69+8:18 tight glyph [
69−8:18 tight name normal
70+8:19 tight name normal
70−8:24 tight glyph =
71−8:25 tight str "#eee"
71+8:25 tight glyph =
72+8:26 tight str "#eee"
72−8:32 name background
73+8:33 name background
73−8:42 tight glyph =
74−8:43 tight str "#111"
74+8:43 tight glyph =
75+8:44 tight str "#111"
75−8:50 name accent
76+8:51 name accent
76−8:56 tight glyph =
77−8:57 tight str "#4c9"
77+8:57 tight glyph =
78+8:58 tight str "#4c9"
78−8:64 name danger
79+8:65 name danger
79−8:70 tight glyph =
80+8:71 tight glyph =
80−8:71 tight str "#f28b82"
81+8:72 tight str "#f28b82"
81−8:81 name muted
82+8:82 name muted
82−8:86 tight glyph =
83−8:87 tight str "#aaa"
83+8:87 tight glyph =
84−8:93 tight glyph ]
84+8:88 tight str "#aaa"
858:94 tight glyph ]
858:94 tight glyph ]
86+8:95 tight glyph ]
86−8:95 DEDENT
87+8:96 DEDENT
87−8:95 DEDENT
88+8:96 DEDENT
88−8:95 NEWLINE
89+8:96 NEWLINE
tests/golden/doc-overview-02-theme/tree.txt+9−8
@@ -22,11 +22,12 @@
22 (face 7:5 font
22 (face 7:5 font
23 (unit 7:10 (qath 7:11 static fonts inter.woff2)))
23 (unit 7:10 (qath 7:11 static fonts inter.woff2)))
24 (face 8:5 dark
24 (face 8:5 dark
25− (tuple 8:10
25+ (unit 8:10
26− (face 8:11 tones
26+ (tuple 8:11
27− (tuple 8:17
27+ (face 8:12 tones
28+ (tuple 8:18
28− (face 8:18 normal (str 8:25 "#eee"))
29+ (face 8:19 normal (str 8:26 "#eee"))
29− (face 8:32 background (str 8:43 "#111"))
30+ (face 8:33 background (str 8:44 "#111"))
30− (face 8:50 accent (str 8:57 "#4c9"))
31+ (face 8:51 accent (str 8:58 "#4c9"))
31− (face 8:64 danger (str 8:71 "#f28b82"))
32+ (face 8:65 danger (str 8:72 "#f28b82"))
32− (face 8:81 muted (str 8:87 "#aaa")))))))))))
33+ (face 8:82 muted (str 8:88 "#aaa"))))))))))))
tests/golden/module-import-cycle/source.jibb+1−1
@@ -1,2 +1,2 @@
1/= a /ui/a
1/= a /ui/a
2−++ text (identity.a "hi")
2+++ text-value (identity.a "hi")
tests/golden/module-import-cycle/tokens.txt+6−6
@@ -6,9 +6,9 @@
61:11 tight knot a
61:11 tight knot a
72:1 NEWLINE
72:1 NEWLINE
82:1 glyph ++
82:1 glyph ++
9−2:4 name text
9+2:4 name text-value
10−2:9 glyph (
10+2:15 glyph (
11−2:10 tight wing identity.a
11+2:16 tight wing identity.a
12−2:21 str "hi"
12+2:27 str "hi"
13−2:25 tight glyph )
13+2:31 tight glyph )
14−2:26 NEWLINE
14+2:32 NEWLINE
tests/golden/module-import-cycle/tree.txt+3−3
@@ -1,5 +1,5 @@
1(module
1(module
2 (jibb 1:1 a /ui/a)
2 (jibb 1:1 a /ui/a)
3− (value 2:1 text
3+ (value 2:1 text-value
4− (group 2:9
4+ (group 2:15
5− (call 2:10 (wing 2:10 identity.a) (str 2:21 "hi")))))
5+ (call 2:16 (wing 2:16 identity.a) (str 2:27 "hi")))))
tests/golden/module-import-identity/source.jibb+1−1
@@ -1,3 +1,3 @@
1/= lib /ui/lib
1/= lib /ui/lib
2−++ text (identity.lib "hi")
2+++ text-value (identity.lib "hi")
3++ ship (identity.lib ~zod)
3++ ship (identity.lib ~zod)
tests/golden/module-import-identity/tokens.txt+5−5
@@ -6,11 +6,11 @@
61:13 tight knot lib
61:13 tight knot lib
72:1 NEWLINE
72:1 NEWLINE
82:1 glyph ++
82:1 glyph ++
9−2:4 name text
9+2:4 name text-value
10−2:9 glyph (
10+2:15 glyph (
11−2:10 tight wing identity.lib
11+2:16 tight wing identity.lib
12−2:23 str "hi"
12+2:29 str "hi"
13−2:27 tight glyph )
13+2:33 tight glyph )
143:1 NEWLINE
143:1 NEWLINE
153:1 glyph ++
153:1 glyph ++
163:4 name ship
163:4 name ship
tests/golden/module-import-identity/tree.txt+3−3
@@ -1,8 +1,8 @@
1(module
1(module
2 (jibb 1:1 lib /ui/lib)
2 (jibb 1:1 lib /ui/lib)
3− (value 2:1 text
3+ (value 2:1 text-value
4− (group 2:9
4+ (group 2:15
5− (call 2:10 (wing 2:10 identity.lib) (str 2:23 "hi"))))
5+ (call 2:16 (wing 2:16 identity.lib) (str 2:29 "hi"))))
6 (value 3:1 ship
6 (value 3:1 ship
7 (group 3:9
7 (group 3:9
8 (call 3:10 (wing 3:10 identity.lib) (lit 3:23 ~zod)))))
8 (call 3:10 (wing 3:10 identity.lib) (lit 3:23 ~zod)))))
tests/golden/module-import-identity/types.txt+1−1
@@ -1,3 +1,3 @@
1partial inference; module not checked
1partial inference; module not checked
2−++ text: @t
2+++ text-value: @t
3++ ship: @p
3++ ship: @p
tests/golden/module-import-transitive/source.jibb+1−1
@@ -1,2 +1,2 @@
1/= a /ui/a
1/= a /ui/a
2−++ text (identity.a "hi")
2+++ text-value (identity.a "hi")
tests/golden/module-import-transitive/tokens.txt+6−6
@@ -6,9 +6,9 @@
61:11 tight knot a
61:11 tight knot a
72:1 NEWLINE
72:1 NEWLINE
82:1 glyph ++
82:1 glyph ++
9−2:4 name text
9+2:4 name text-value
10−2:9 glyph (
10+2:15 glyph (
11−2:10 tight wing identity.a
11+2:16 tight wing identity.a
12−2:21 str "hi"
12+2:27 str "hi"
13−2:25 tight glyph )
13+2:31 tight glyph )
14−2:26 NEWLINE
14+2:32 NEWLINE
tests/golden/module-import-transitive/tree.txt+3−3
@@ -1,5 +1,5 @@
1(module
1(module
2 (jibb 1:1 a /ui/a)
2 (jibb 1:1 a /ui/a)
3− (value 2:1 text
3+ (value 2:1 text-value
4− (group 2:9
4+ (group 2:15
5− (call 2:10 (wing 2:10 identity.a) (str 2:21 "hi")))))
5+ (call 2:16 (wing 2:16 identity.a) (str 2:27 "hi")))))
tests/golden/module-import-transitive/types.txt+1−1
@@ -1,2 +1,2 @@
1partial inference; module not checked
1partial inference; module not checked
2−++ text: @t
2+++ text-value: @t
tests/golden/module-import-unused-invalid/source.jibb+1−1
@@ -1,2 +1,2 @@
1/= good /ui/good
1/= good /ui/good
2−++ text (identity.good "hi")
2+++ text-value (identity.good "hi")
tests/golden/module-import-unused-invalid/tokens.txt+6−6
@@ -6,9 +6,9 @@
61:14 tight knot good
61:14 tight knot good
72:1 NEWLINE
72:1 NEWLINE
82:1 glyph ++
82:1 glyph ++
9−2:4 name text
9+2:4 name text-value
10−2:9 glyph (
10+2:15 glyph (
11−2:10 tight wing identity.good
11+2:16 tight wing identity.good
12−2:24 str "hi"
12+2:30 str "hi"
13−2:28 tight glyph )
13+2:34 tight glyph )
14−2:29 NEWLINE
14+2:35 NEWLINE
tests/golden/module-import-unused-invalid/tree.txt+3−3
@@ -1,5 +1,5 @@
1(module
1(module
2 (jibb 1:1 good /ui/good)
2 (jibb 1:1 good /ui/good)
3− (value 2:1 text
3+ (value 2:1 text-value
4− (group 2:9
4+ (group 2:15
5− (call 2:10 (wing 2:10 identity.good) (str 2:24 "hi")))))
5+ (call 2:16 (wing 2:16 identity.good) (str 2:30 "hi")))))
tests/golden/module-import-unused-invalid/types.txt+1−1
@@ -1,2 +1,2 @@
1partial inference; module not checked
1partial inference; module not checked
2−++ text: @t
2+++ text-value: @t
tests/golden/types-arithmetic-module/source.jibb+1−1
@@ -1,7 +1,7 @@
1/= math /ui/math
1/= math /ui/math
2++ decimal ^- @ud (sum.math 1 2)
2++ decimal ^- @ud (sum.math 1 2)
3++ hex ^- @ux (sum.math 0x1 0x2)
3++ hex ^- @ux (sum.math 0x1 0x2)
4−++ text ^- @t (alias.math "a" "b")
4+++ text-value ^- @t (alias.math "a" "b")
5++ ship ^- @p (down.math ~zod)
5++ ship ^- @p (down.math ~zod)
6++ reject-bool (sum.math %.y %.n)
6++ reject-bool (sum.math %.y %.n)
7++ reject-down (down.math %.y)
7++ reject-down (down.math %.y)
tests/golden/types-arithmetic-module/tokens.txt+8−8
@@ -26,14 +26,14 @@
263:32 tight glyph )
263:32 tight glyph )
274:1 NEWLINE
274:1 NEWLINE
284:1 glyph ++
284:1 glyph ++
29−4:4 name text
29+4:4 name text-value
30−4:9 glyph ^-
30+4:15 glyph ^-
31−4:12 aura @t
31+4:18 aura @t
32−4:15 glyph (
32+4:21 glyph (
33−4:16 tight wing alias.math
33+4:22 tight wing alias.math
34−4:27 str "a"
34+4:33 str "a"
35−4:31 str "b"
35+4:37 str "b"
36−4:34 tight glyph )
36+4:40 tight glyph )
375:1 NEWLINE
375:1 NEWLINE
385:1 glyph ++
385:1 glyph ++
395:4 name ship
395:4 name ship
tests/golden/types-arithmetic-module/tree.txt+5−5
@@ -10,11 +10,11 @@
10 (aura 3:11 @ux)
10 (aura 3:11 @ux)
11 (group 3:15
11 (group 3:15
12 (call 3:16 (wing 3:16 sum.math) (lit 3:25 0x1) (lit 3:29 0x2)))))
12 (call 3:16 (wing 3:16 sum.math) (lit 3:25 0x1) (lit 3:29 0x2)))))
13− (value 4:1 text
13+ (value 4:1 text-value
14− (cast 4:9
14+ (cast 4:15
15− (aura 4:12 @t)
15+ (aura 4:18 @t)
16− (group 4:15
16+ (group 4:21
17− (call 4:16 (wing 4:16 alias.math) (str 4:27 "a") (str 4:31 "b")))))
17+ (call 4:22 (wing 4:22 alias.math) (str 4:33 "a") (str 4:37 "b")))))
18 (value 5:1 ship
18 (value 5:1 ship
19 (cast 5:9
19 (cast 5:9
20 (aura 5:12 @p)
20 (aura 5:12 @p)
tests/golden/types-arithmetic-module/types.txt+1−1
@@ -1,7 +1,7 @@
1partial inference; module not checked
1partial inference; module not checked
2++ decimal: @ud
2++ decimal: @ud
3++ hex: @ux
3++ hex: @ux
4−++ text: @t
4+++ text-value: @t
5++ ship: @p
5++ ship: @p
6++ reject-bool: call's sample and argument types do not unify
6++ reject-bool: call's sample and argument types do not unify
7/tests/golden/types-arithmetic-module/source.jibb:6:17: called gate has type $-([a=A b=A] A) where A is an atom other than ?
7/tests/golden/types-arithmetic-module/source.jibb:6:17: called gate has type $-([a=A b=A] A) where A is an atom other than ?
tests/golden/types-cell-branch-context/about.txtnew file+4
@@ -0,0 +1,4 @@
1+source: Grammar, Branching and Molds — branch arms share the expected result type; unresolved tags need context; written record faces remain part of values.
2+tests: Closed cell result context flows into bounded loobean branches. The checker preserves previously inferred cases and faces, leaves wrong or inconsistent fields, unresolved tags, and open generic context unsupported.
3+expect: parses
4+expect-types: a partial inference report
tests/golden/types-cell-branch-context/modules.txtnew file+1
@@ -0,0 +1 @@
1+# Use the actual source-backed prelude.
tests/golden/types-cell-branch-context/source.jibbnew file+37
@@ -0,0 +1,37 @@
1+++ choose |= flag=?
2+ ^- [@t (unit @t)] ?- flag
3+ %.y ["yes" ~]
4+ %.n ["no" ~]
5+++ bad |= flag=?
6+ ^- [@t (unit @t)] ?- flag
7+ %.y ["yes" ~]
8+ %.n [~zod ~]
9+++ pending |= flag=?
10+ ^- [@t (unit @t)] ?- flag
11+ %.y ["yes" ~]
12+ %.n [%waiting ~]
13+++ already |= flag=?
14+ ^- [@t @t] ?- flag
15+ %.y ["yes" "a"]
16+ %.n ["no" "b"]
17++$ rec [name=@t place=(unit @t)]
18+++ named |= flag=?
19+ ^- rec ?- flag
20+ %.y [name="yes" place=~]
21+ %.n [name="no" place=~]
22+++ wrong |= flag=?
23+ ^- rec ?- flag
24+ %.y [name="yes" place=~]
25+ %.n [other="no" place=~]
26+++ different |= flag=?
27+ ^- rec ?- flag
28+ %.y [name="yes" place=~]
29+ %.n ["no" ~]
30+++ open |= [flag=? value=A]
31+ ^- [A (unit A)] ?- flag
32+ %.y [value ~]
33+ %.n [value ~]
34+++ waiting |= flag=?
35+ ^- rec ?- flag
36+ %.y [name="yes" place=~]
37+ %.n [name=%waiting place=~]
tests/golden/types-cell-branch-context/tokens.txtnew file+308
@@ -0,0 +1,308 @@
1+1:1 glyph ++
2+1:4 name choose
3+1:11 glyph |=
4+1:14 name flag
5+1:18 tight glyph =
6+1:19 tight glyph ?
7+2:3 INDENT
8+2:3 glyph ^-
9+2:6 glyph [
10+2:7 tight aura @t
11+2:10 glyph (
12+2:11 tight name unit
13+2:16 aura @t
14+2:18 tight glyph )
15+2:19 tight glyph ]
16+2:21 glyph ?-
17+2:24 name flag
18+3:5 INDENT
19+3:5 lit %.y
20+3:9 glyph [
21+3:10 tight str "yes"
22+3:16 lit ~
23+3:17 tight glyph ]
24+4:5 NEWLINE
25+4:5 lit %.n
26+4:9 glyph [
27+4:10 tight str "no"
28+4:15 lit ~
29+4:16 tight glyph ]
30+5:1 DEDENT
31+5:1 DEDENT
32+5:1 NEWLINE
33+5:1 glyph ++
34+5:4 name bad
35+5:8 glyph |=
36+5:11 name flag
37+5:15 tight glyph =
38+5:16 tight glyph ?
39+6:3 INDENT
40+6:3 glyph ^-
41+6:6 glyph [
42+6:7 tight aura @t
43+6:10 glyph (
44+6:11 tight name unit
45+6:16 aura @t
46+6:18 tight glyph )
47+6:19 tight glyph ]
48+6:21 glyph ?-
49+6:24 name flag
50+7:5 INDENT
51+7:5 lit %.y
52+7:9 glyph [
53+7:10 tight str "yes"
54+7:16 lit ~
55+7:17 tight glyph ]
56+8:5 NEWLINE
57+8:5 lit %.n
58+8:9 glyph [
59+8:10 tight lit ~zod
60+8:15 lit ~
61+8:16 tight glyph ]
62+9:1 DEDENT
63+9:1 DEDENT
64+9:1 NEWLINE
65+9:1 glyph ++
66+9:4 name pending
67+9:12 glyph |=
68+9:15 name flag
69+9:19 tight glyph =
70+9:20 tight glyph ?
71+10:3 INDENT
72+10:3 glyph ^-
73+10:6 glyph [
74+10:7 tight aura @t
75+10:10 glyph (
76+10:11 tight name unit
77+10:16 aura @t
78+10:18 tight glyph )
79+10:19 tight glyph ]
80+10:21 glyph ?-
81+10:24 name flag
82+11:5 INDENT
83+11:5 lit %.y
84+11:9 glyph [
85+11:10 tight str "yes"
86+11:16 lit ~
87+11:17 tight glyph ]
88+12:5 NEWLINE
89+12:5 lit %.n
90+12:9 glyph [
91+12:10 tight lit %waiting
92+12:19 lit ~
93+12:20 tight glyph ]
94+13:1 DEDENT
95+13:1 DEDENT
96+13:1 NEWLINE
97+13:1 glyph ++
98+13:4 name already
99+13:12 glyph |=
100+13:15 name flag
101+13:19 tight glyph =
102+13:20 tight glyph ?
103+14:3 INDENT
104+14:3 glyph ^-
105+14:6 glyph [
106+14:7 tight aura @t
107+14:10 aura @t
108+14:12 tight glyph ]
109+14:14 glyph ?-
110+14:17 name flag
111+15:5 INDENT
112+15:5 lit %.y
113+15:9 glyph [
114+15:10 tight str "yes"
115+15:16 str "a"
116+15:19 tight glyph ]
117+16:5 NEWLINE
118+16:5 lit %.n
119+16:9 glyph [
120+16:10 tight str "no"
121+16:15 str "b"
122+16:18 tight glyph ]
123+17:1 DEDENT
124+17:1 DEDENT
125+17:1 NEWLINE
126+17:1 glyph +$
127+17:4 name rec
128+17:8 glyph [
129+17:9 tight name name
130+17:13 tight glyph =
131+17:14 tight aura @t
132+17:17 name place
133+17:22 tight glyph =
134+17:23 tight glyph (
135+17:24 tight name unit
136+17:29 aura @t
137+17:31 tight glyph )
138+17:32 tight glyph ]
139+18:1 NEWLINE
140+18:1 glyph ++
141+18:4 name named
142+18:10 glyph |=
143+18:13 name flag
144+18:17 tight glyph =
145+18:18 tight glyph ?
146+19:3 INDENT
147+19:3 glyph ^-
148+19:6 name rec
149+19:10 glyph ?-
150+19:13 name flag
151+20:5 INDENT
152+20:5 lit %.y
153+20:9 glyph [
154+20:10 tight name name
155+20:14 tight glyph =
156+20:15 tight str "yes"
157+20:21 name place
158+20:26 tight glyph =
159+20:27 tight lit ~
160+20:28 tight glyph ]
161+21:5 NEWLINE
162+21:5 lit %.n
163+21:9 glyph [
164+21:10 tight name name
165+21:14 tight glyph =
166+21:15 tight str "no"
167+21:20 name place
168+21:25 tight glyph =
169+21:26 tight lit ~
170+21:27 tight glyph ]
171+22:1 DEDENT
172+22:1 DEDENT
173+22:1 NEWLINE
174+22:1 glyph ++
175+22:4 name wrong
176+22:10 glyph |=
177+22:13 name flag
178+22:17 tight glyph =
179+22:18 tight glyph ?
180+23:3 INDENT
181+23:3 glyph ^-
182+23:6 name rec
183+23:10 glyph ?-
184+23:13 name flag
185+24:5 INDENT
186+24:5 lit %.y
187+24:9 glyph [
188+24:10 tight name name
189+24:14 tight glyph =
190+24:15 tight str "yes"
191+24:21 name place
192+24:26 tight glyph =
193+24:27 tight lit ~
194+24:28 tight glyph ]
195+25:5 NEWLINE
196+25:5 lit %.n
197+25:9 glyph [
198+25:10 tight name other
199+25:15 tight glyph =
200+25:16 tight str "no"
201+25:21 name place
202+25:26 tight glyph =
203+25:27 tight lit ~
204+25:28 tight glyph ]
205+26:1 DEDENT
206+26:1 DEDENT
207+26:1 NEWLINE
208+26:1 glyph ++
209+26:4 name different
210+26:14 glyph |=
211+26:17 name flag
212+26:21 tight glyph =
213+26:22 tight glyph ?
214+27:3 INDENT
215+27:3 glyph ^-
216+27:6 name rec
217+27:10 glyph ?-
218+27:13 name flag
219+28:5 INDENT
220+28:5 lit %.y
221+28:9 glyph [
222+28:10 tight name name
223+28:14 tight glyph =
224+28:15 tight str "yes"
225+28:21 name place
226+28:26 tight glyph =
227+28:27 tight lit ~
228+28:28 tight glyph ]
229+29:5 NEWLINE
230+29:5 lit %.n
231+29:9 glyph [
232+29:10 tight str "no"
233+29:15 lit ~
234+29:16 tight glyph ]
235+30:1 DEDENT
236+30:1 DEDENT
237+30:1 NEWLINE
238+30:1 glyph ++
239+30:4 name open
240+30:9 glyph |=
241+30:12 glyph [
242+30:13 tight name flag
243+30:17 tight glyph =
244+30:18 tight glyph ?
245+30:20 name value
246+30:25 tight glyph =
247+30:26 tight tvar A
248+30:27 tight glyph ]
249+31:3 INDENT
250+31:3 glyph ^-
251+31:6 glyph [
252+31:7 tight tvar A
253+31:9 glyph (
254+31:10 tight name unit
255+31:15 tvar A
256+31:16 tight glyph )
257+31:17 tight glyph ]
258+31:19 glyph ?-
259+31:22 name flag
260+32:5 INDENT
261+32:5 lit %.y
262+32:9 glyph [
263+32:10 tight name value
264+32:16 lit ~
265+32:17 tight glyph ]
266+33:5 NEWLINE
267+33:5 lit %.n
268+33:9 glyph [
269+33:10 tight name value
270+33:16 lit ~
271+33:17 tight glyph ]
272+34:1 DEDENT
273+34:1 DEDENT
274+34:1 NEWLINE
275+34:1 glyph ++
276+34:4 name waiting
277+34:12 glyph |=
278+34:15 name flag
279+34:19 tight glyph =
280+34:20 tight glyph ?
281+35:3 INDENT
282+35:3 glyph ^-
283+35:6 name rec
284+35:10 glyph ?-
285+35:13 name flag
286+36:5 INDENT
287+36:5 lit %.y
288+36:9 glyph [
289+36:10 tight name name
290+36:14 tight glyph =
291+36:15 tight str "yes"
292+36:21 name place
293+36:26 tight glyph =
294+36:27 tight lit ~
295+36:28 tight glyph ]
296+37:5 NEWLINE
297+37:5 lit %.n
298+37:9 glyph [
299+37:10 tight name name
300+37:14 tight glyph =
301+37:15 tight lit %waiting
302+37:24 name place
303+37:29 tight glyph =
304+37:30 tight lit ~
305+37:31 tight glyph ]
306+37:32 DEDENT
307+37:32 DEDENT
308+37:32 NEWLINE
tests/golden/types-cell-branch-context/tree.txtnew file+156
@@ -0,0 +1,156 @@
1+(module
2+ (value 1:1 choose
3+ (gate 1:11
4+ (face 1:14 flag (flag 1:19))
5+ (body 2:3
6+ (cast 2:3
7+ (cell 2:6
8+ (aura 2:7 @t)
9+ (apply 2:10 unit (aura 2:16 @t)))
10+ (branch 2:21
11+ (wing 2:24 flag)
12+ (arm 3:5
13+ (lit 3:5 %.y)
14+ (tuple 3:9 (str 3:10 "yes") (lit 3:16 ~)))
15+ (arm 4:5
16+ (lit 4:5 %.n)
17+ (tuple 4:9 (str 4:10 "no") (lit 4:15 ~))))))))
18+ (value 5:1 bad
19+ (gate 5:8
20+ (face 5:11 flag (flag 5:16))
21+ (body 6:3
22+ (cast 6:3
23+ (cell 6:6
24+ (aura 6:7 @t)
25+ (apply 6:10 unit (aura 6:16 @t)))
26+ (branch 6:21
27+ (wing 6:24 flag)
28+ (arm 7:5
29+ (lit 7:5 %.y)
30+ (tuple 7:9 (str 7:10 "yes") (lit 7:16 ~)))
31+ (arm 8:5
32+ (lit 8:5 %.n)
33+ (tuple 8:9 (lit 8:10 ~zod) (lit 8:15 ~))))))))
34+ (value 9:1 pending
35+ (gate 9:12
36+ (face 9:15 flag (flag 9:20))
37+ (body 10:3
38+ (cast 10:3
39+ (cell 10:6
40+ (aura 10:7 @t)
41+ (apply 10:10 unit (aura 10:16 @t)))
42+ (branch 10:21
43+ (wing 10:24 flag)
44+ (arm 11:5
45+ (lit 11:5 %.y)
46+ (tuple 11:9 (str 11:10 "yes") (lit 11:16 ~)))
47+ (arm 12:5
48+ (lit 12:5 %.n)
49+ (tuple 12:9 (lit 12:10 %waiting) (lit 12:19 ~))))))))
50+ (value 13:1 already
51+ (gate 13:12
52+ (face 13:15 flag (flag 13:20))
53+ (body 14:3
54+ (cast 14:3
55+ (cell 14:6 (aura 14:7 @t) (aura 14:10 @t))
56+ (branch 14:14
57+ (wing 14:17 flag)
58+ (arm 15:5
59+ (lit 15:5 %.y)
60+ (tuple 15:9 (str 15:10 "yes") (str 15:16 "a")))
61+ (arm 16:5
62+ (lit 16:5 %.n)
63+ (tuple 16:9 (str 16:10 "no") (str 16:15 "b"))))))))
64+ (mold 17:1 rec
65+ (cell 17:8
66+ (face 17:9 name (aura 17:14 @t))
67+ (face 17:17 place
68+ (apply 17:23 unit (aura 17:29 @t)))))
69+ (value 18:1 named
70+ (gate 18:10
71+ (face 18:13 flag (flag 18:18))
72+ (body 19:3
73+ (cast 19:3
74+ (ref 19:6 rec)
75+ (branch 19:10
76+ (wing 19:13 flag)
77+ (arm 20:5
78+ (lit 20:5 %.y)
79+ (tuple 20:9
80+ (face 20:10 name (str 20:15 "yes"))
81+ (face 20:21 place (lit 20:27 ~))))
82+ (arm 21:5
83+ (lit 21:5 %.n)
84+ (tuple 21:9
85+ (face 21:10 name (str 21:15 "no"))
86+ (face 21:20 place (lit 21:26 ~)))))))))
87+ (value 22:1 wrong
88+ (gate 22:10
89+ (face 22:13 flag (flag 22:18))
90+ (body 23:3
91+ (cast 23:3
92+ (ref 23:6 rec)
93+ (branch 23:10
94+ (wing 23:13 flag)
95+ (arm 24:5
96+ (lit 24:5 %.y)
97+ (tuple 24:9
98+ (face 24:10 name (str 24:15 "yes"))
99+ (face 24:21 place (lit 24:27 ~))))
100+ (arm 25:5
101+ (lit 25:5 %.n)
102+ (tuple 25:9
103+ (face 25:10 other (str 25:16 "no"))
104+ (face 25:21 place (lit 25:27 ~)))))))))
105+ (value 26:1 different
106+ (gate 26:14
107+ (face 26:17 flag (flag 26:22))
108+ (body 27:3
109+ (cast 27:3
110+ (ref 27:6 rec)
111+ (branch 27:10
112+ (wing 27:13 flag)
113+ (arm 28:5
114+ (lit 28:5 %.y)
115+ (tuple 28:9
116+ (face 28:10 name (str 28:15 "yes"))
117+ (face 28:21 place (lit 28:27 ~))))
118+ (arm 29:5
119+ (lit 29:5 %.n)
120+ (tuple 29:9 (str 29:10 "no") (lit 29:15 ~))))))))
121+ (value 30:1 open
122+ (gate 30:9
123+ (cell 30:12
124+ (face 30:13 flag (flag 30:18))
125+ (face 30:20 value (tvar 30:26 A)))
126+ (body 31:3
127+ (cast 31:3
128+ (cell 31:6
129+ (tvar 31:7 A)
130+ (apply 31:9 unit (tvar 31:15 A)))
131+ (branch 31:19
132+ (wing 31:22 flag)
133+ (arm 32:5
134+ (lit 32:5 %.y)
135+ (tuple 32:9 (wing 32:10 value) (lit 32:16 ~)))
136+ (arm 33:5
137+ (lit 33:5 %.n)
138+ (tuple 33:9 (wing 33:10 value) (lit 33:16 ~))))))))
139+ (value 34:1 waiting
140+ (gate 34:12
141+ (face 34:15 flag (flag 34:20))
142+ (body 35:3
143+ (cast 35:3
144+ (ref 35:6 rec)
145+ (branch 35:10
146+ (wing 35:13 flag)
147+ (arm 36:5
148+ (lit 36:5 %.y)
149+ (tuple 36:9
150+ (face 36:10 name (str 36:15 "yes"))
151+ (face 36:21 place (lit 36:27 ~))))
152+ (arm 37:5
153+ (lit 37:5 %.n)
154+ (tuple 37:9
155+ (face 37:10 name (lit 37:15 %waiting))
156+ (face 37:24 place (lit 37:30 ~))))))))))
tests/golden/types-cell-branch-context/types.txtnew file+11
@@ -0,0 +1,11 @@
1+partial inference; module not checked
2+++ choose: $-(? [@t (unit @t)])
3+++ bad: branch tag or union context is not supported by partial inference
4+++ pending: branch tag or union context is not supported by partial inference
5+++ already: $-(? [@t @t])
6++$ rec: not checked
7+++ named: $-(? [name=@t place=(unit @t)])
8+++ wrong: branch tag or union context is not supported by partial inference
9+++ different: branch tag or union context is not supported by partial inference
10+++ open: branch widening is not supported by partial inference
11+++ waiting: branch tag or union context is not supported by partial inference
tests/golden/types-cell-pattern-schemes/source.jibb+1−1
@@ -10,7 +10,7 @@
10++ identity |= x
10++ identity |= x
11 ?- x
11 ?- x
12 [a b c] [a b c]
12 [a b c] [a b c]
13−++ text (identity "hi" ~zod %.y)
13+++ text-value (identity "hi" ~zod %.y)
14++ ship (identity ~zod "hi" %.n)
14++ ship (identity ~zod "hi" %.n)
15++ shared |= x=[A A A]
15++ shared |= x=[A A A]
16 ?- x
16 ?- x
tests/golden/types-cell-pattern-schemes/tokens.txt+7−7
@@ -73,13 +73,13 @@
7313:1 DEDENT
7313:1 DEDENT
7413:1 NEWLINE
7413:1 NEWLINE
7513:1 glyph ++
7513:1 glyph ++
76−13:4 name text
76+13:4 name text-value
77−13:9 glyph (
77+13:15 glyph (
78−13:10 tight name identity
78+13:16 tight name identity
79−13:19 str "hi"
79+13:25 str "hi"
80−13:24 lit ~zod
80+13:30 lit ~zod
81−13:29 lit %.y
81+13:35 lit %.y
82−13:32 tight glyph )
82+13:38 tight glyph )
8314:1 NEWLINE
8314:1 NEWLINE
8414:1 glyph ++
8414:1 glyph ++
8514:4 name ship
8514:4 name ship
tests/golden/types-cell-pattern-schemes/tree.txt+3−3
@@ -31,9 +31,9 @@
31 (arm 12:5
31 (arm 12:5
32 (cell 12:5 (bind 12:6 a) (bind 12:8 b) (bind 12:10 c))
32 (cell 12:5 (bind 12:6 a) (bind 12:8 b) (bind 12:10 c))
33 (tuple 12:13 (wing 12:14 a) (wing 12:16 b) (wing 12:18 c)))))))
33 (tuple 12:13 (wing 12:14 a) (wing 12:16 b) (wing 12:18 c)))))))
34− (value 13:1 text
34+ (value 13:1 text-value
35− (group 13:9
35+ (group 13:15
36− (call 13:10 (wing 13:10 identity) (str 13:19 "hi") (lit 13:24 ~zod) (lit 13:29 %.y))))
36+ (call 13:16 (wing 13:16 identity) (str 13:25 "hi") (lit 13:30 ~zod) (lit 13:35 %.y))))
37 (value 14:1 ship
37 (value 14:1 ship
38 (group 14:9
38 (group 14:9
39 (call 14:10 (wing 14:10 identity) (lit 14:19 ~zod) (str 14:24 "hi") (lit 14:29 %.n))))
39 (call 14:10 (wing 14:10 identity) (lit 14:19 ~zod) (str 14:24 "hi") (lit 14:29 %.n))))
tests/golden/types-cell-pattern-schemes/types.txt+1−1
@@ -3,7 +3,7 @@ partial inference; module not checked
3++ maybe-union: cell pattern subject is not supported by partial inference
3++ maybe-union: cell pattern subject is not supported by partial inference
4++ maybe-list: cell pattern subject is not supported by partial inference
4++ maybe-list: cell pattern subject is not supported by partial inference
5++ identity: $-([A [B C]] [A [B C]])
5++ identity: $-([A [B C]] [A [B C]])
6−++ text: [@t [@p ?]]
6+++ text-value: [@t [@p ?]]
7++ ship: [@p [@t ?]]
7++ ship: [@p [@t ?]]
8++ shared: $-([A [A A]] [A [A A]])
8++ shared: $-([A [A A]] [A [A A]])
9++ wrong: call's sample and argument types do not unify
9++ wrong: call's sample and argument types do not unify
tests/golden/types-generic-result-context/source.jibb+9−9
@@ -10,15 +10,15 @@
10+$ swap |$ [A B] (choice B A)
10+$ swap |$ [A B] (choice B A)
11+$ repeated |$ [A] (choice A A)
11+$ repeated |$ [A] (choice A A)
12+$ phantom |$ [A B] (choice A @p)
12+$ phantom |$ [A B] (choice A @p)
13−++ wrap |= x=A ^- (choice A @p) [%one x]
13+++ wrap-value |= x=A ^- (choice A @p) [%one x]
14−++ wrap-repeat |= x=A ^- (repeated A) [%one x]
14+++ wrap-value-repeat |= x=A ^- (repeated A) [%one x]
15−++ use-msg ^- (choice msg @p) (wrap %idle)
15+++ use-msg ^- (choice msg @p) (wrap-value %idle)
16−++ use-alias ^- (swap @p msg) (wrap %idle)
16+++ use-alias ^- (swap @p msg) (wrap-value %idle)
17−++ use-repeated ^- (repeated msg) (wrap-repeat %idle)
17+++ use-repeated ^- (repeated msg) (wrap-value-repeat %idle)
18−++ use-distinct ^- (choice other @p) (wrap %idle)
18+++ use-distinct ^- (choice other @p) (wrap-value %idle)
19++ independent |= [m=msg n=other]
19++ independent |= [m=msg n=other]
20− [(^- (choice msg @p) (wrap m)) (^- (choice other @p) (wrap n))]
20+ [(^- (choice msg @p) (wrap-value m)) (^- (choice other @p) (wrap-value n))]
21++ pending
21++ pending
22 ~& %orphan
22 ~& %orphan
23− ^- (choice msg @p) (wrap %idle)
23+ ^- (choice msg @p) (wrap-value %idle)
24−++ wrong-case ^- (choice msg @p) (wrap %absent)
24+++ wrong-case ^- (choice msg @p) (wrap-value %absent)
tests/golden/types-generic-result-context/tokens.txt+65−65
@@ -76,37 +76,37 @@
7612:33 tight glyph )
7612:33 tight glyph )
7713:1 NEWLINE
7713:1 NEWLINE
7813:1 glyph ++
7813:1 glyph ++
79−13:4 name wrap
79+13:4 name wrap-value
80−13:9 glyph |=
80+13:15 glyph |=
81−13:12 name x
81+13:18 name x
82−13:13 tight glyph =
82+13:19 tight glyph =
83−13:14 tight tvar A
83+13:20 tight tvar A
84−13:16 glyph ^-
84+13:22 glyph ^-
85−13:19 glyph (
85+13:25 glyph (
86−13:20 tight name choice
86+13:26 tight name choice
87−13:27 tvar A
87+13:33 tvar A
88−13:29 aura @p
88+13:35 aura @p
89−13:31 tight glyph )
89+13:37 tight glyph )
90−13:33 glyph [
90+13:39 glyph [
91−13:34 tight lit %one
91+13:40 tight lit %one
92−13:39 name x
92+13:45 name x
93−13:40 tight glyph ]
93+13:46 tight glyph ]
9414:1 NEWLINE
9414:1 NEWLINE
9514:1 glyph ++
9514:1 glyph ++
96−14:4 name wrap-repeat
96+14:4 name wrap-value-repeat
97−14:16 glyph |=
97+14:22 glyph |=
98−14:19 name x
98+14:25 name x
99−14:20 tight glyph =
99+14:26 tight glyph =
100−14:21 tight tvar A
100+14:27 tight tvar A
101−14:23 glyph ^-
101+14:29 glyph ^-
102−14:26 glyph (
102+14:32 glyph (
103−14:27 tight name repeated
103+14:33 tight name repeated
104−14:36 tvar A
104+14:42 tvar A
105−14:37 tight glyph )
105+14:43 tight glyph )
106−14:39 glyph [
106+14:45 glyph [
107−14:40 tight lit %one
107+14:46 tight lit %one
108−14:45 name x
108+14:51 name x
109−14:46 tight glyph ]
109+14:52 tight glyph ]
11015:1 NEWLINE
11015:1 NEWLINE
11115:1 glyph ++
11115:1 glyph ++
11215:4 name use-msg
11215:4 name use-msg
@@ -117,9 +117,9 @@
11715:27 aura @p
11715:27 aura @p
11815:29 tight glyph )
11815:29 tight glyph )
11915:31 glyph (
11915:31 glyph (
120−15:32 tight name wrap
120+15:32 tight name wrap-value
121−15:37 lit %idle
121+15:43 lit %idle
122−15:42 tight glyph )
122+15:48 tight glyph )
12316:1 NEWLINE
12316:1 NEWLINE
12416:1 glyph ++
12416:1 glyph ++
12516:4 name use-alias
12516:4 name use-alias
@@ -130,9 +130,9 @@
13016:26 name msg
13016:26 name msg
13116:29 tight glyph )
13116:29 tight glyph )
13216:31 glyph (
13216:31 glyph (
133−16:32 tight name wrap
133+16:32 tight name wrap-value
134−16:37 lit %idle
134+16:43 lit %idle
135−16:42 tight glyph )
135+16:48 tight glyph )
13617:1 NEWLINE
13617:1 NEWLINE
13717:1 glyph ++
13717:1 glyph ++
13817:4 name use-repeated
13817:4 name use-repeated
@@ -142,9 +142,9 @@
14217:30 name msg
14217:30 name msg
14317:33 tight glyph )
14317:33 tight glyph )
14417:35 glyph (
14417:35 glyph (
145−17:36 tight name wrap-repeat
145+17:36 tight name wrap-value-repeat
146−17:48 lit %idle
146+17:54 lit %idle
147−17:53 tight glyph )
147+17:59 tight glyph )
14818:1 NEWLINE
14818:1 NEWLINE
14918:1 glyph ++
14918:1 glyph ++
15018:4 name use-distinct
15018:4 name use-distinct
@@ -155,9 +155,9 @@
15518:34 aura @p
15518:34 aura @p
15618:36 tight glyph )
15618:36 tight glyph )
15718:38 glyph (
15718:38 glyph (
158−18:39 tight name wrap
158+18:39 tight name wrap-value
159−18:44 lit %idle
159+18:50 lit %idle
160−18:49 tight glyph )
160+18:55 tight glyph )
16119:1 NEWLINE
16119:1 NEWLINE
16219:1 glyph ++
16219:1 glyph ++
16319:4 name independent
16319:4 name independent
@@ -180,23 +180,23 @@
18020:20 aura @p
18020:20 aura @p
18120:22 tight glyph )
18120:22 tight glyph )
18220:24 glyph (
18220:24 glyph (
183−20:25 tight name wrap
183+20:25 tight name wrap-value
184−20:30 name m
184+20:36 name m
185−20:31 tight glyph )
186−20:32 tight glyph )
185+20:37 tight glyph )
187−20:34 glyph (
186+20:38 tight glyph )
188−20:35 tight glyph ^-
187+20:40 glyph (
189−20:38 glyph (
188+20:41 tight glyph ^-
189+20:44 glyph (
190−20:39 tight name choice
190+20:45 tight name choice
191−20:46 name other
191+20:52 name other
192−20:52 aura @p
192+20:58 aura @p
193−20:54 tight glyph )
193+20:60 tight glyph )
194−20:56 glyph (
195−20:57 tight name wrap
196−20:62 name n
194+20:62 glyph (
197−20:63 tight glyph )
195+20:63 tight name wrap-value
196+20:74 name n
197+20:75 tight glyph )
198−20:64 tight glyph )
198+20:76 tight glyph )
199−20:65 tight glyph ]
199+20:77 tight glyph ]
20021:1 DEDENT
20021:1 DEDENT
20121:1 NEWLINE
20121:1 NEWLINE
20221:1 glyph ++
20221:1 glyph ++
@@ -212,9 +212,9 @@
21223:20 aura @p
21223:20 aura @p
21323:22 tight glyph )
21323:22 tight glyph )
21423:24 glyph (
21423:24 glyph (
215−23:25 tight name wrap
215+23:25 tight name wrap-value
216−23:30 lit %idle
216+23:36 lit %idle
217−23:35 tight glyph )
217+23:41 tight glyph )
21824:1 DEDENT
21824:1 DEDENT
21924:1 DEDENT
21924:1 DEDENT
22024:1 NEWLINE
22024:1 NEWLINE
@@ -227,7 +227,7 @@
22724:30 aura @p
22724:30 aura @p
22824:32 tight glyph )
22824:32 tight glyph )
22924:34 glyph (
22924:34 glyph (
230−24:35 tight name wrap
230+24:35 tight name wrap-value
231−24:40 lit %absent
231+24:46 lit %absent
232−24:47 tight glyph )
232+24:53 tight glyph )
233−24:48 NEWLINE
233+24:54 NEWLINE
tests/golden/types-generic-result-context/tree.txt+24−24
@@ -21,38 +21,38 @@
21 (mold 12:1 phantom
21 (mold 12:1 phantom
22 (generic 12:12 A B
22 (generic 12:12 A B
23 (apply 12:21 choice (tvar 12:29 A) (aura 12:31 @p))))
23 (apply 12:21 choice (tvar 12:29 A) (aura 12:31 @p))))
24− (value 13:1 wrap
24+ (value 13:1 wrap-value
25− (gate 13:9
25+ (gate 13:15
26− (face 13:12 x (tvar 13:14 A))
26+ (face 13:18 x (tvar 13:20 A))
27− (cast 13:16
27+ (cast 13:22
28− (apply 13:19 choice (tvar 13:27 A) (aura 13:29 @p))
28+ (apply 13:25 choice (tvar 13:33 A) (aura 13:35 @p))
29− (tuple 13:33 (lit 13:34 %one) (wing 13:39 x)))))
29+ (tuple 13:39 (lit 13:40 %one) (wing 13:45 x)))))
30− (value 14:1 wrap-repeat
30+ (value 14:1 wrap-value-repeat
31− (gate 14:16
31+ (gate 14:22
32− (face 14:19 x (tvar 14:21 A))
32+ (face 14:25 x (tvar 14:27 A))
33− (cast 14:23
33+ (cast 14:29
34− (apply 14:26 repeated (tvar 14:36 A))
34+ (apply 14:32 repeated (tvar 14:42 A))
35− (tuple 14:39 (lit 14:40 %one) (wing 14:45 x)))))
35+ (tuple 14:45 (lit 14:46 %one) (wing 14:51 x)))))
36 (value 15:1 use-msg
36 (value 15:1 use-msg
37 (cast 15:12
37 (cast 15:12
38 (apply 15:15 choice (ref 15:23 msg) (aura 15:27 @p))
38 (apply 15:15 choice (ref 15:23 msg) (aura 15:27 @p))
39 (group 15:31
39 (group 15:31
40− (call 15:32 (wing 15:32 wrap) (lit 15:37 %idle)))))
40+ (call 15:32 (wing 15:32 wrap-value) (lit 15:43 %idle)))))
41 (value 16:1 use-alias
41 (value 16:1 use-alias
42 (cast 16:14
42 (cast 16:14
43 (apply 16:17 swap (aura 16:23 @p) (ref 16:26 msg))
43 (apply 16:17 swap (aura 16:23 @p) (ref 16:26 msg))
44 (group 16:31
44 (group 16:31
45− (call 16:32 (wing 16:32 wrap) (lit 16:37 %idle)))))
45+ (call 16:32 (wing 16:32 wrap-value) (lit 16:43 %idle)))))
46 (value 17:1 use-repeated
46 (value 17:1 use-repeated
47 (cast 17:17
47 (cast 17:17
48 (apply 17:20 repeated (ref 17:30 msg))
48 (apply 17:20 repeated (ref 17:30 msg))
49 (group 17:35
49 (group 17:35
50− (call 17:36 (wing 17:36 wrap-repeat) (lit 17:48 %idle)))))
50+ (call 17:36 (wing 17:36 wrap-value-repeat) (lit 17:54 %idle)))))
51 (value 18:1 use-distinct
51 (value 18:1 use-distinct
52 (cast 18:17
52 (cast 18:17
53 (apply 18:20 choice (ref 18:28 other) (aura 18:34 @p))
53 (apply 18:20 choice (ref 18:28 other) (aura 18:34 @p))
54 (group 18:38
54 (group 18:38
55− (call 18:39 (wing 18:39 wrap) (lit 18:44 %idle)))))
55+ (call 18:39 (wing 18:39 wrap-value) (lit 18:50 %idle)))))
56 (value 19:1 independent
56 (value 19:1 independent
57 (gate 19:16
57 (gate 19:16
58 (cell 19:19
58 (cell 19:19
@@ -64,12 +64,12 @@
64 (cast 20:5
64 (cast 20:5
65 (apply 20:8 choice (ref 20:16 msg) (aura 20:20 @p))
65 (apply 20:8 choice (ref 20:16 msg) (aura 20:20 @p))
66 (group 20:24
66 (group 20:24
67− (call 20:25 (wing 20:25 wrap) (wing 20:30 m)))))
67+ (call 20:25 (wing 20:25 wrap-value) (wing 20:36 m)))))
68− (group 20:34
68+ (group 20:40
69− (cast 20:35
69+ (cast 20:41
70− (apply 20:38 choice (ref 20:46 other) (aura 20:52 @p))
70+ (apply 20:44 choice (ref 20:52 other) (aura 20:58 @p))
71− (group 20:56
71+ (group 20:62
72− (call 20:57 (wing 20:57 wrap) (wing 20:62 n)))))))))
72+ (call 20:63 (wing 20:63 wrap-value) (wing 20:74 n)))))))))
73 (value 21:1 pending
73 (value 21:1 pending
74 (body 22:3
74 (body 22:3
75 (trace 22:3
75 (trace 22:3
@@ -78,9 +78,9 @@
78 (cast 23:5
78 (cast 23:5
79 (apply 23:8 choice (ref 23:16 msg) (aura 23:20 @p))
79 (apply 23:8 choice (ref 23:16 msg) (aura 23:20 @p))
80 (group 23:24
80 (group 23:24
81− (call 23:25 (wing 23:25 wrap) (lit 23:30 %idle))))))))
81+ (call 23:25 (wing 23:25 wrap-value) (lit 23:36 %idle))))))))
82 (value 24:1 wrong-case
82 (value 24:1 wrong-case
83 (cast 24:15
83 (cast 24:15
84 (apply 24:18 choice (ref 24:26 msg) (aura 24:30 @p))
84 (apply 24:18 choice (ref 24:26 msg) (aura 24:30 @p))
85 (group 24:34
85 (group 24:34
86− (call 24:35 (wing 24:35 wrap) (lit 24:40 %absent))))))
86+ (call 24:35 (wing 24:35 wrap-value) (lit 24:46 %absent))))))
tests/golden/types-generic-result-context/types.txt+6−6
@@ -5,8 +5,8 @@ partial inference; module not checked
5+$ swap: not checked
5+$ swap: not checked
6+$ repeated: not checked
6+$ repeated: not checked
7+$ phantom: not checked
7+$ phantom: not checked
8−++ wrap: $-(A (choice A @p))
8+++ wrap-value: $-(A (choice A @p))
9−++ wrap-repeat: $-(A (choice A A))
9+++ wrap-value-repeat: $-(A (choice A A))
10++ use-msg: (choice msg @p)
10++ use-msg: (choice msg @p)
11++ use-alias: (choice msg @p)
11++ use-alias: (choice msg @p)
12++ use-repeated: (choice msg msg)
12++ use-repeated: (choice msg msg)
@@ -15,8 +15,8 @@ partial inference; module not checked
15++ pending: tag needs context in partial inference
15++ pending: tag needs context in partial inference
16++ wrong-case: msg has no case `%absent`
16++ wrong-case: msg has no case `%absent`
17/tests/golden/types-generic-result-context/source.jibb:24:35: expected union
17/tests/golden/types-generic-result-context/source.jibb:24:35: expected union
18−++ wrong-case ^- (choice msg @p) (wrap %absent)
18+++ wrong-case ^- (choice msg @p) (wrap-value %absent)
19 ^
19 ^
20−/tests/golden/types-generic-result-context/source.jibb:24:40: tag
20+/tests/golden/types-generic-result-context/source.jibb:24:46: tag
21−++ wrong-case ^- (choice msg @p) (wrap %absent)
21+++ wrong-case ^- (choice msg @p) (wrap-value %absent)
22− ^
22+ ^
tests/golden/types-generic-union-escaping/module-trees.txt+4−4
@@ -6,10 +6,10 @@
6/ui/mid.jibb
6/ui/mid.jibb
7(module
7(module
8 (jibb 1:1 base /ui/base)
8 (jibb 1:1 base /ui/base)
9− (value 2:1 text
9+ (value 2:1 text-value
10− (cast 2:9
10+ (cast 2:15
11− (apply 2:12 phantom.base (aura 2:26 @t))
11+ (apply 2:18 phantom.base (aura 2:32 @t))
12− (lit 2:30 %yes)))
12+ (lit 2:36 %yes)))
13 (value 3:1 ship
13 (value 3:1 ship
14 (cast 3:9
14 (cast 3:9
15 (apply 3:12 phantom.base (aura 3:26 @p))
15 (apply 3:12 phantom.base (aura 3:26 @p))
tests/golden/types-generic-union-escaping/modules/ui/mid.jibb+1−1
@@ -1,3 +1,3 @@
1/= base /ui/base
1/= base /ui/base
2−++ text ^- (phantom.base @t) %yes
2+++ text-value ^- (phantom.base @t) %yes
3++ ship ^- (phantom.base @p) %yes
3++ ship ^- (phantom.base @p) %yes
tests/golden/types-generic-union-escaping/source.jibb+1−1
@@ -1,3 +1,3 @@
1/= mid /ui/mid
1/= mid /ui/mid
2−++ text-value text.mid
2+++ text-value text-value.mid
3++ ship-value ship.mid
3++ ship-value ship.mid
tests/golden/types-generic-union-escaping/tokens.txt+1−1
@@ -7,7 +7,7 @@
72:1 NEWLINE
72:1 NEWLINE
82:1 glyph ++
82:1 glyph ++
92:4 name text-value
92:4 name text-value
10−2:15 wing text.mid
10+2:15 wing text-value.mid
113:1 NEWLINE
113:1 NEWLINE
123:1 glyph ++
123:1 glyph ++
133:4 name ship-value
133:4 name ship-value
tests/golden/types-generic-union-escaping/tree.txt+1−1
@@ -1,4 +1,4 @@
1(module
1(module
2 (jibb 1:1 mid /ui/mid)
2 (jibb 1:1 mid /ui/mid)
3− (value 2:1 text-value (wing 2:15 text.mid))
3+ (value 2:1 text-value (wing 2:15 text-value.mid))
4 (value 3:1 ship-value (wing 3:15 ship.mid)))
4 (value 3:1 ship-value (wing 3:15 ship.mid)))
tests/golden/types-list-patterns/about.txt+1−1
@@ -1,4 +1,4 @@
1source: Grammar, Patterns: "Every case needs an arm or a catch-all"; "A name in a pattern always binds anew". Modules: no name may shadow an in-scope name.
1source: Grammar, Patterns: "Every case needs an arm or a catch-all"; "A name in a pattern always binds anew". Modules: no name may shadow an in-scope name.
2−tests: Both orders of an exhaustive list branch bind the head and tail with their respective types; unsupported subjects or patterns, conflicting binders, and unrelated unresolved tags fail closed.
2+tests: Both orders of an exhaustive list branch bind the head and tail with their respective types; unsupported subjects or patterns, conflicting binders, and unrelated unresolved tags fail closed; a nonempty arm of `(list !!)` is unreachable.
3expect: parses
3expect: parses
4expect-types: a partial inference report
4expect-types: a partial inference report
tests/golden/types-list-patterns/types.txt+1−1
@@ -12,6 +12,6 @@ partial inference; module not checked
12++ unresolved: list branch results need unsupported inference
12++ unresolved: list branch results need unsupported inference
13++ duplicate-arm: branch is not supported by partial inference
13++ duplicate-arm: branch is not supported by partial inference
14++ unrelated: tag needs context in partial inference
14++ unrelated: tag needs context in partial inference
15−++ empty-elements: sample mold is not supported by partial inference
15+++ empty-elements: list nonempty pattern is unreachable
16+$ maybe: cases proven disjoint; mold not checked
16+$ maybe: cases proven disjoint; mold not checked
17++ unit-shape: unit branch pattern is not supported by partial inference
17++ unit-shape: unit branch pattern is not supported by partial inference
tests/golden/types-nested-shallow-preserve/source.jibb+15−15
@@ -1,25 +1,25 @@
1−+$ length
1++$ extent
2 [%fill n=@ud]
2 [%fill n=@ud]
3 %shrink
3 %shrink
4−+$ attr
4++$ attribute
5− [%width length]
5+ [%width extent]
6 [%gap @tas]
6 [%gap @tas]
7++ number-id |= x=@ud x
7++ number-id |= x=@ud x
8−++ plain ^- attr width+[%fill 1]
8+++ plain ^- attribute width+[%fill 1]
9−++ direct ^- attr [%width [%fill 1]]
9+++ direct ^- attribute [%width [%fill 1]]
10−++ list ^- (list attr) ~[width+[%fill 1]]
10+++ list ^- (list attribute) ~[width+[%fill 1]]
11−++ accept |= value=attr value
11+++ accept |= value=attribute value
12++ call (accept width+[%fill 1])
12++ call (accept width+[%fill 1])
13−++ simple-call ^- attr width+[%fill (number-id 1)]
13+++ simple-call ^- attribute width+[%fill (number-id 1)]
14−++ grouped-call ^- attr width+[%fill ((number-id 1))]
14+++ grouped-call ^- attribute width+[%fill ((number-id 1))]
15−++ cast-call ^- attr width+[%fill (^- @ud (number-id 1))]
15+++ cast-call ^- attribute width+[%fill (^- @ud (number-id 1))]
16−++ nested-call ^- attr width+[%fill (number-id (number-id 1))]
16+++ nested-call ^- attribute width+[%fill (number-id (number-id 1))]
17−++ bad-tag ^- attr width+[%missing 1]
17+++ bad-tag ^- attribute width+[%missing 1]
18−++ bad-number ^- attr width+[%fill "bad"]
18+++ bad-number ^- attribute width+[%fill "bad"]
19++ pending
19++ pending
20 ~& %unrelated
20 ~& %unrelated
21− ^- attr width+[%fill (number-id 1)]
21+ ^- attribute width+[%fill (number-id 1)]
22−++ singleton ^- attr width+%shrink
22+++ singleton ^- attribute width+%shrink
23+$ event
23+$ event
24 [%got value=@t]
24 [%got value=@t]
25 %idle
25 %idle
tests/golden/types-nested-shallow-preserve/tokens.txt+107−107
@@ -1,5 +1,5 @@
11:1 glyph +$
11:1 glyph +$
2−1:4 name length
2+1:4 name extent
32:3 INDENT
32:3 INDENT
42:3 glyph [
42:3 glyph [
52:4 tight lit %fill
52:4 tight lit %fill
@@ -12,11 +12,11 @@
124:1 DEDENT
124:1 DEDENT
134:1 NEWLINE
134:1 NEWLINE
144:1 glyph +$
144:1 glyph +$
15−4:4 name attr
15+4:4 name attribute
165:3 INDENT
165:3 INDENT
175:3 glyph [
175:3 glyph [
185:4 tight lit %width
185:4 tight lit %width
19−5:11 name length
19+5:11 name extent
205:17 tight glyph ]
205:17 tight glyph ]
216:3 NEWLINE
216:3 NEWLINE
226:3 glyph [
226:3 glyph [
@@ -36,49 +36,49 @@
368:1 glyph ++
368:1 glyph ++
378:4 name plain
378:4 name plain
388:10 glyph ^-
388:10 glyph ^-
39−8:13 name attr
39+8:13 name attribute
40−8:18 name width
40+8:23 name width
41−8:23 tight glyph +
41+8:28 tight glyph +
42−8:24 tight glyph [
42+8:29 tight glyph [
43−8:25 tight lit %fill
43+8:30 tight lit %fill
44−8:31 lit 1
44+8:36 lit 1
45−8:32 tight glyph ]
45+8:37 tight glyph ]
469:1 NEWLINE
469:1 NEWLINE
479:1 glyph ++
479:1 glyph ++
489:4 name direct
489:4 name direct
499:11 glyph ^-
499:11 glyph ^-
50−9:14 name attr
50+9:14 name attribute
51−9:19 glyph [
51+9:24 glyph [
52−9:20 tight lit %width
52+9:25 tight lit %width
53−9:27 glyph [
53+9:32 glyph [
54−9:28 tight lit %fill
54+9:33 tight lit %fill
55−9:34 lit 1
55+9:39 lit 1
56−9:35 tight glyph ]
56+9:40 tight glyph ]
57−9:36 tight glyph ]
57+9:41 tight glyph ]
5810:1 NEWLINE
5810:1 NEWLINE
5910:1 glyph ++
5910:1 glyph ++
6010:4 name list
6010:4 name list
6110:9 glyph ^-
6110:9 glyph ^-
6210:12 glyph (
6210:12 glyph (
6310:13 tight name list
6310:13 tight name list
64−10:18 name attr
64+10:18 name attribute
65−10:22 tight glyph )
65+10:27 tight glyph )
66−10:24 glyph ~[
66+10:29 glyph ~[
67−10:26 tight name width
68−10:31 tight glyph +
67+10:31 tight name width
68+10:36 tight glyph +
69−10:32 tight glyph [
69+10:37 tight glyph [
70−10:33 tight lit %fill
70+10:38 tight lit %fill
71−10:39 lit 1
71+10:44 lit 1
72−10:40 tight glyph ]
72+10:45 tight glyph ]
73−10:41 tight glyph ]
73+10:46 tight glyph ]
7411:1 NEWLINE
7411:1 NEWLINE
7511:1 glyph ++
7511:1 glyph ++
7611:4 name accept
7611:4 name accept
7711:11 glyph |=
7711:11 glyph |=
7811:14 name value
7811:14 name value
7911:19 tight glyph =
7911:19 tight glyph =
80−11:20 tight name attr
80+11:20 tight name attribute
81−11:25 name value
81+11:30 name value
8212:1 NEWLINE
8212:1 NEWLINE
8312:1 glyph ++
8312:1 glyph ++
8412:4 name call
8412:4 name call
@@ -95,89 +95,89 @@
9513:1 glyph ++
9513:1 glyph ++
9613:4 name simple-call
9613:4 name simple-call
9713:16 glyph ^-
9713:16 glyph ^-
98−13:19 name attr
98+13:19 name attribute
99−13:24 name width
99+13:29 name width
100−13:29 tight glyph +
100+13:34 tight glyph +
101−13:30 tight glyph [
101+13:35 tight glyph [
102−13:31 tight lit %fill
102+13:36 tight lit %fill
103−13:37 glyph (
103+13:42 glyph (
104−13:38 tight name number-id
104+13:43 tight name number-id
105−13:48 lit 1
105+13:53 lit 1
106−13:49 tight glyph )
106+13:54 tight glyph )
107−13:50 tight glyph ]
107+13:55 tight glyph ]
10814:1 NEWLINE
10814:1 NEWLINE
10914:1 glyph ++
10914:1 glyph ++
11014:4 name grouped-call
11014:4 name grouped-call
11114:17 glyph ^-
11114:17 glyph ^-
112−14:20 name attr
112+14:20 name attribute
113−14:25 name width
113+14:30 name width
114−14:30 tight glyph +
114+14:35 tight glyph +
115−14:31 tight glyph [
115+14:36 tight glyph [
116−14:32 tight lit %fill
116+14:37 tight lit %fill
117−14:38 glyph (
117+14:43 glyph (
118−14:39 tight glyph (
118+14:44 tight glyph (
119−14:40 tight name number-id
119+14:45 tight name number-id
120−14:50 lit 1
120+14:55 lit 1
121−14:51 tight glyph )
121+14:56 tight glyph )
122−14:52 tight glyph )
122+14:57 tight glyph )
123−14:53 tight glyph ]
123+14:58 tight glyph ]
12415:1 NEWLINE
12415:1 NEWLINE
12515:1 glyph ++
12515:1 glyph ++
12615:4 name cast-call
12615:4 name cast-call
12715:14 glyph ^-
12715:14 glyph ^-
128−15:17 name attr
128+15:17 name attribute
129−15:22 name width
129+15:27 name width
130−15:27 tight glyph +
130+15:32 tight glyph +
131−15:28 tight glyph [
131+15:33 tight glyph [
132−15:29 tight lit %fill
132+15:34 tight lit %fill
133−15:35 glyph (
133+15:40 glyph (
134−15:36 tight glyph ^-
134+15:41 tight glyph ^-
135−15:39 aura @ud
135+15:44 aura @ud
136−15:43 glyph (
136+15:48 glyph (
137−15:44 tight name number-id
137+15:49 tight name number-id
138−15:54 lit 1
138+15:59 lit 1
139−15:55 tight glyph )
139+15:60 tight glyph )
140−15:56 tight glyph )
140+15:61 tight glyph )
141−15:57 tight glyph ]
141+15:62 tight glyph ]
14216:1 NEWLINE
14216:1 NEWLINE
14316:1 glyph ++
14316:1 glyph ++
14416:4 name nested-call
14416:4 name nested-call
14516:16 glyph ^-
14516:16 glyph ^-
146−16:19 name attr
146+16:19 name attribute
147−16:24 name width
147+16:29 name width
148−16:29 tight glyph +
148+16:34 tight glyph +
149−16:30 tight glyph [
149+16:35 tight glyph [
150−16:31 tight lit %fill
150+16:36 tight lit %fill
151−16:37 glyph (
151+16:42 glyph (
152−16:38 tight name number-id
152+16:43 tight name number-id
153−16:48 glyph (
153+16:53 glyph (
154−16:49 tight name number-id
154+16:54 tight name number-id
155−16:59 lit 1
155+16:64 lit 1
156−16:60 tight glyph )
156+16:65 tight glyph )
157−16:61 tight glyph )
157+16:66 tight glyph )
158−16:62 tight glyph ]
158+16:67 tight glyph ]
15917:1 NEWLINE
15917:1 NEWLINE
16017:1 glyph ++
16017:1 glyph ++
16117:4 name bad-tag
16117:4 name bad-tag
16217:12 glyph ^-
16217:12 glyph ^-
163−17:15 name attr
163+17:15 name attribute
164−17:20 name width
164+17:25 name width
165−17:25 tight glyph +
165+17:30 tight glyph +
166−17:26 tight glyph [
166+17:31 tight glyph [
167−17:27 tight lit %missing
167+17:32 tight lit %missing
168−17:36 lit 1
168+17:41 lit 1
169−17:37 tight glyph ]
169+17:42 tight glyph ]
17018:1 NEWLINE
17018:1 NEWLINE
17118:1 glyph ++
17118:1 glyph ++
17218:4 name bad-number
17218:4 name bad-number
17318:15 glyph ^-
17318:15 glyph ^-
174−18:18 name attr
174+18:18 name attribute
175−18:23 name width
175+18:28 name width
176−18:28 tight glyph +
176+18:33 tight glyph +
177−18:29 tight glyph [
177+18:34 tight glyph [
178−18:30 tight lit %fill
178+18:35 tight lit %fill
179−18:36 str "bad"
179+18:41 str "bad"
180−18:41 tight glyph ]
180+18:46 tight glyph ]
18119:1 NEWLINE
18119:1 NEWLINE
18219:1 glyph ++
18219:1 glyph ++
18319:4 name pending
18319:4 name pending
@@ -186,26 +186,26 @@
18620:6 lit %unrelated
18620:6 lit %unrelated
18721:5 INDENT
18721:5 INDENT
18821:5 glyph ^-
18821:5 glyph ^-
189−21:8 name attr
189+21:8 name attribute
190−21:13 name width
190+21:18 name width
191−21:18 tight glyph +
191+21:23 tight glyph +
192−21:19 tight glyph [
192+21:24 tight glyph [
193−21:20 tight lit %fill
193+21:25 tight lit %fill
194−21:26 glyph (
194+21:31 glyph (
195−21:27 tight name number-id
195+21:32 tight name number-id
196−21:37 lit 1
196+21:42 lit 1
197−21:38 tight glyph )
197+21:43 tight glyph )
198−21:39 tight glyph ]
198+21:44 tight glyph ]
19922:1 DEDENT
19922:1 DEDENT
20022:1 DEDENT
20022:1 DEDENT
20122:1 NEWLINE
20122:1 NEWLINE
20222:1 glyph ++
20222:1 glyph ++
20322:4 name singleton
20322:4 name singleton
20422:14 glyph ^-
20422:14 glyph ^-
205−22:17 name attr
205+22:17 name attribute
206−22:22 name width
206+22:27 name width
207−22:27 tight glyph +
207+22:32 tight glyph +
208−22:28 tight lit %shrink
208+22:33 tight lit %shrink
20923:1 NEWLINE
20923:1 NEWLINE
21023:1 glyph +$
21023:1 glyph +$
21123:4 name event
21123:4 name event
tests/golden/types-nested-shallow-preserve/tree.txt+61−61
@@ -1,13 +1,13 @@
1(module
1(module
2− (mold 1:1 length
2+ (mold 1:1 extent
3 (union 2:3
3 (union 2:3
4 (cell 2:3
4 (cell 2:3
5 (const 2:4 %fill)
5 (const 2:4 %fill)
6 (face 2:10 n (aura 2:12 @ud)))
6 (face 2:10 n (aura 2:12 @ud)))
7 (const 3:3 %shrink)))
7 (const 3:3 %shrink)))
8− (mold 4:1 attr
8+ (mold 4:1 attribute
9 (union 5:3
9 (union 5:3
10− (cell 5:3 (const 5:4 %width) (ref 5:11 length))
10+ (cell 5:3 (const 5:4 %width) (ref 5:11 extent))
11 (cell 6:3 (const 6:4 %gap) (aura 6:9 @tas))))
11 (cell 6:3 (const 6:4 %gap) (aura 6:9 @tas))))
12 (value 7:1 number-id
12 (value 7:1 number-id
13 (gate 7:14
13 (gate 7:14
@@ -15,25 +15,25 @@
15 (wing 7:23 x)))
15 (wing 7:23 x)))
16 (value 8:1 plain
16 (value 8:1 plain
17 (cast 8:10
17 (cast 8:10
18− (ref 8:13 attr)
18+ (ref 8:13 attribute)
19− (pair 8:18 width
19+ (pair 8:23 width
20− (tuple 8:24 (lit 8:25 %fill) (lit 8:31 1)))))
20+ (tuple 8:29 (lit 8:30 %fill) (lit 8:36 1)))))
21 (value 9:1 direct
21 (value 9:1 direct
22 (cast 9:11
22 (cast 9:11
23− (ref 9:14 attr)
23+ (ref 9:14 attribute)
24− (tuple 9:19
24+ (tuple 9:24
25− (lit 9:20 %width)
25+ (lit 9:25 %width)
26− (tuple 9:27 (lit 9:28 %fill) (lit 9:34 1)))))
26+ (tuple 9:32 (lit 9:33 %fill) (lit 9:39 1)))))
27 (value 10:1 list
27 (value 10:1 list
28 (cast 10:9
28 (cast 10:9
29− (apply 10:12 list (ref 10:18 attr))
29+ (apply 10:12 list (ref 10:18 attribute))
30− (list 10:24
30+ (list 10:29
31− (pair 10:26 width
31+ (pair 10:31 width
32− (tuple 10:32 (lit 10:33 %fill) (lit 10:39 1))))))
32+ (tuple 10:37 (lit 10:38 %fill) (lit 10:44 1))))))
33 (value 11:1 accept
33 (value 11:1 accept
34 (gate 11:11
34 (gate 11:11
35− (face 11:14 value (ref 11:20 attr))
35+ (face 11:14 value (ref 11:20 attribute))
36− (wing 11:25 value)))
36+ (wing 11:30 value)))
37 (value 12:1 call
37 (value 12:1 call
38 (group 12:9
38 (group 12:9
39 (call 12:10
39 (call 12:10
@@ -42,69 +42,69 @@
42 (tuple 12:23 (lit 12:24 %fill) (lit 12:30 1))))))
42 (tuple 12:23 (lit 12:24 %fill) (lit 12:30 1))))))
43 (value 13:1 simple-call
43 (value 13:1 simple-call
44 (cast 13:16
44 (cast 13:16
45− (ref 13:19 attr)
45+ (ref 13:19 attribute)
46− (pair 13:24 width
46+ (pair 13:29 width
47− (tuple 13:30
47+ (tuple 13:35
48− (lit 13:31 %fill)
48+ (lit 13:36 %fill)
49− (group 13:37
49+ (group 13:42
50− (call 13:38 (wing 13:38 number-id) (lit 13:48 1)))))))
50+ (call 13:43 (wing 13:43 number-id) (lit 13:53 1)))))))
51 (value 14:1 grouped-call
51 (value 14:1 grouped-call
52 (cast 14:17
52 (cast 14:17
53− (ref 14:20 attr)
53+ (ref 14:20 attribute)
54− (pair 14:25 width
54+ (pair 14:30 width
55− (tuple 14:31
55+ (tuple 14:36
56− (lit 14:32 %fill)
56+ (lit 14:37 %fill)
57− (group 14:38
57+ (group 14:43
58− (group 14:39
58+ (group 14:44
59− (call 14:40 (wing 14:40 number-id) (lit 14:50 1))))))))
59+ (call 14:45 (wing 14:45 number-id) (lit 14:55 1))))))))
60 (value 15:1 cast-call
60 (value 15:1 cast-call
61 (cast 15:14
61 (cast 15:14
62− (ref 15:17 attr)
62+ (ref 15:17 attribute)
63− (pair 15:22 width
63+ (pair 15:27 width
64− (tuple 15:28
64+ (tuple 15:33
65− (lit 15:29 %fill)
65+ (lit 15:34 %fill)
66− (group 15:35
66+ (group 15:40
67− (cast 15:36
67+ (cast 15:41
68− (aura 15:39 @ud)
68+ (aura 15:44 @ud)
69− (group 15:43
69+ (group 15:48
70− (call 15:44 (wing 15:44 number-id) (lit 15:54 1)))))))))
70+ (call 15:49 (wing 15:49 number-id) (lit 15:59 1)))))))))
71 (value 16:1 nested-call
71 (value 16:1 nested-call
72 (cast 16:16
72 (cast 16:16
73− (ref 16:19 attr)
73+ (ref 16:19 attribute)
74− (pair 16:24 width
74+ (pair 16:29 width
75− (tuple 16:30
75+ (tuple 16:35
76− (lit 16:31 %fill)
76+ (lit 16:36 %fill)
77− (group 16:37
77+ (group 16:42
78− (call 16:38
78+ (call 16:43
79− (wing 16:38 number-id)
79+ (wing 16:43 number-id)
80− (group 16:48
80+ (group 16:53
81− (call 16:49 (wing 16:49 number-id) (lit 16:59 1)))))))))
81+ (call 16:54 (wing 16:54 number-id) (lit 16:64 1)))))))))
82 (value 17:1 bad-tag
82 (value 17:1 bad-tag
83 (cast 17:12
83 (cast 17:12
84− (ref 17:15 attr)
84+ (ref 17:15 attribute)
85− (pair 17:20 width
85+ (pair 17:25 width
86− (tuple 17:26 (lit 17:27 %missing) (lit 17:36 1)))))
86+ (tuple 17:31 (lit 17:32 %missing) (lit 17:41 1)))))
87 (value 18:1 bad-number
87 (value 18:1 bad-number
88 (cast 18:15
88 (cast 18:15
89− (ref 18:18 attr)
89+ (ref 18:18 attribute)
90− (pair 18:23 width
90+ (pair 18:28 width
91− (tuple 18:29 (lit 18:30 %fill) (str 18:36 "bad")))))
91+ (tuple 18:34 (lit 18:35 %fill) (str 18:41 "bad")))))
92 (value 19:1 pending
92 (value 19:1 pending
93 (body 20:3
93 (body 20:3
94 (trace 20:3
94 (trace 20:3
95 (lit 20:6 %unrelated)
95 (lit 20:6 %unrelated)
96 (body 21:5
96 (body 21:5
97 (cast 21:5
97 (cast 21:5
98− (ref 21:8 attr)
98+ (ref 21:8 attribute)
99− (pair 21:13 width
99+ (pair 21:18 width
100− (tuple 21:19
100+ (tuple 21:24
101− (lit 21:20 %fill)
101+ (lit 21:25 %fill)
102− (group 21:26
102+ (group 21:31
103− (call 21:27 (wing 21:27 number-id) (lit 21:37 1))))))))))
103+ (call 21:32 (wing 21:32 number-id) (lit 21:42 1))))))))))
104 (value 22:1 singleton
104 (value 22:1 singleton
105 (cast 22:14
105 (cast 22:14
106− (ref 22:17 attr)
106+ (ref 22:17 attribute)
107− (pair 22:22 width (lit 22:28 %shrink))))
107+ (pair 22:27 width (lit 22:33 %shrink))))
108 (mold 23:1 event
108 (mold 23:1 event
109 (union 24:3
109 (union 24:3
110 (cell 24:3
110 (cell 24:3
tests/golden/types-nested-shallow-preserve/types.txt+20−20
@@ -1,32 +1,32 @@
1partial inference; module not checked
1partial inference; module not checked
2−+$ length: cases proven disjoint; mold not checked
2++$ extent: cases proven disjoint; mold not checked
3−+$ attr: cases proven disjoint; mold not checked
3++$ attribute: cases proven disjoint; mold not checked
4++ number-id: $-(@ud @ud)
4++ number-id: $-(@ud @ud)
5−++ plain: attr
5+++ plain: attribute
6−++ direct: attr
6+++ direct: attribute
7−++ list: (list attr)
7+++ list: (list attribute)
8−++ accept: $-(attr attr)
8+++ accept: $-(attribute attribute)
9−++ call: attr
9+++ call: attribute
10−++ simple-call: attr
10+++ simple-call: attribute
11−++ grouped-call: attr
11+++ grouped-call: attribute
12−++ cast-call: attr
12+++ cast-call: attribute
13−++ nested-call: attr
13+++ nested-call: attribute
14++ bad-tag: cast mold and expression type do not unify
14++ bad-tag: cast mold and expression type do not unify
15/tests/golden/types-nested-shallow-preserve/source.jibb:17:15: cast mold
15/tests/golden/types-nested-shallow-preserve/source.jibb:17:15: cast mold
16−++ bad-tag ^- attr width+[%missing 1]
16+++ bad-tag ^- attribute width+[%missing 1]
17 ^
17 ^
18−/tests/golden/types-nested-shallow-preserve/source.jibb:17:20: expression
18+/tests/golden/types-nested-shallow-preserve/source.jibb:17:25: expression
19−++ bad-tag ^- attr width+[%missing 1]
19+++ bad-tag ^- attribute width+[%missing 1]
20− ^
20+ ^
21++ bad-number: cast mold and expression type do not unify
21++ bad-number: cast mold and expression type do not unify
22/tests/golden/types-nested-shallow-preserve/source.jibb:18:18: cast mold
22/tests/golden/types-nested-shallow-preserve/source.jibb:18:18: cast mold
23−++ bad-number ^- attr width+[%fill "bad"]
23+++ bad-number ^- attribute width+[%fill "bad"]
24 ^
24 ^
25−/tests/golden/types-nested-shallow-preserve/source.jibb:18:23: expression
25+/tests/golden/types-nested-shallow-preserve/source.jibb:18:28: expression
26−++ bad-number ^- attr width+[%fill "bad"]
26+++ bad-number ^- attribute width+[%fill "bad"]
27− ^
27+ ^
28++ pending: tag needs context in partial inference
28++ pending: tag needs context in partial inference
29−++ singleton: attr
29+++ singleton: attribute
30+$ event: cases proven disjoint; mold not checked
30+$ event: cases proven disjoint; mold not checked
31+$ envelope: cases proven disjoint; mold not checked
31+$ envelope: cases proven disjoint; mold not checked
32++ constructor: envelope
32++ constructor: envelope
tests/golden/types-pair-context/source.jibb+14−14
@@ -3,30 +3,30 @@
3 %s1
3 %s1
4 %s2
4 %s2
5 %s3
5 %s3
6−+$ length
6++$ extent
7 [%fill n=@ud]
7 [%fill n=@ud]
8 %shrink
8 %shrink
9−+$ attr
9++$ attribute
10 [%gap spacing]
10 [%gap spacing]
11 [%pad spacing]
11 [%pad spacing]
12− [%width length]
12+ [%width extent]
13−+$ other-attr
13++$ other-attribute
14 [%gap spacing]
14 [%gap spacing]
15 [%pad spacing]
15 [%pad spacing]
16− [%width length]
16+ [%width extent]
17−++ one ^- attr gap+%s2
17+++ one ^- attribute gap+%s2
18−++ equiv ^- attr [%gap %s2]
18+++ equiv ^- attribute [%gap %s2]
19−++ attrs ^- (list attr) ~[gap+%s2 pad+%s3 width+[%fill 1]]
19+++ attributes ^- (list attribute) ~[gap+%s2 pad+%s3 width+[%fill 1]]
20++ gap-structural ^- [@tas @tas] gap+%s2
20++ gap-structural ^- [@tas @tas] gap+%s2
21−++ nested ^- attr width+[%fill 1]
21+++ nested ^- attribute width+[%fill 1]
22−++ mismatch ^- attr gap+%shrink
22+++ mismatch ^- attribute gap+%shrink
23−++ missing ^- attr width+[%oops 1]
23+++ missing ^- attribute width+[%oops 1]
24++ pending gap+%s2
24++ pending gap+%s2
25−++ cross-origin ^- attr ^- other-attr gap+%s2
25+++ cross-origin ^- attribute ^- other-attribute gap+%s2
26++ noun-pair ^- [* *] gap+%s2
26++ noun-pair ^- [* *] gap+%s2
27++ atom-pair ^- [@ta @tas] gap+%s2
27++ atom-pair ^- [@ta @tas] gap+%s2
28++ wrong-head ^- [@ud @tas] gap+%s2
28++ wrong-head ^- [@ud @tas] gap+%s2
29−++ wrong-number ^- attr width+[%fill "hi"]
29+++ wrong-number ^- attribute width+[%fill "hi"]
30++ unrelated
30++ unrelated
31 ~& %dangling
31 ~& %dangling
32− ^- attr gap+%s2
32+ ^- attribute gap+%s2
tests/golden/types-pair-context/tokens.txt+71−71
@@ -11,7 +11,7 @@
116:1 DEDENT
116:1 DEDENT
126:1 NEWLINE
126:1 NEWLINE
136:1 glyph +$
136:1 glyph +$
14−6:4 name length
14+6:4 name extent
157:3 INDENT
157:3 INDENT
167:3 glyph [
167:3 glyph [
177:4 tight lit %fill
177:4 tight lit %fill
@@ -24,7 +24,7 @@
249:1 DEDENT
249:1 DEDENT
259:1 NEWLINE
259:1 NEWLINE
269:1 glyph +$
269:1 glyph +$
27−9:4 name attr
27+9:4 name attribute
2810:3 INDENT
2810:3 INDENT
2910:3 glyph [
2910:3 glyph [
3010:4 tight lit %gap
3010:4 tight lit %gap
@@ -38,12 +38,12 @@
3812:3 NEWLINE
3812:3 NEWLINE
3912:3 glyph [
3912:3 glyph [
4012:4 tight lit %width
4012:4 tight lit %width
41−12:11 name length
41+12:11 name extent
4212:17 tight glyph ]
4212:17 tight glyph ]
4313:1 DEDENT
4313:1 DEDENT
4413:1 NEWLINE
4413:1 NEWLINE
4513:1 glyph +$
4513:1 glyph +$
46−13:4 name other-attr
46+13:4 name other-attribute
4714:3 INDENT
4714:3 INDENT
4814:3 glyph [
4814:3 glyph [
4914:4 tight lit %gap
4914:4 tight lit %gap
@@ -57,48 +57,48 @@
5716:3 NEWLINE
5716:3 NEWLINE
5816:3 glyph [
5816:3 glyph [
5916:4 tight lit %width
5916:4 tight lit %width
60−16:11 name length
60+16:11 name extent
6116:17 tight glyph ]
6116:17 tight glyph ]
6217:1 DEDENT
6217:1 DEDENT
6317:1 NEWLINE
6317:1 NEWLINE
6417:1 glyph ++
6417:1 glyph ++
6517:4 name one
6517:4 name one
6617:8 glyph ^-
6617:8 glyph ^-
67−17:11 name attr
67+17:11 name attribute
68−17:16 name gap
68+17:21 name gap
69−17:19 tight glyph +
69+17:24 tight glyph +
70−17:20 tight lit %s2
70+17:25 tight lit %s2
7118:1 NEWLINE
7118:1 NEWLINE
7218:1 glyph ++
7218:1 glyph ++
7318:4 name equiv
7318:4 name equiv
7418:10 glyph ^-
7418:10 glyph ^-
75−18:13 name attr
75+18:13 name attribute
76−18:18 glyph [
76+18:23 glyph [
77−18:19 tight lit %gap
77+18:24 tight lit %gap
78−18:24 lit %s2
78+18:29 lit %s2
79−18:27 tight glyph ]
79+18:32 tight glyph ]
8019:1 NEWLINE
8019:1 NEWLINE
8119:1 glyph ++
8119:1 glyph ++
82−19:4 name attrs
82+19:4 name attributes
83−19:10 glyph ^-
83+19:15 glyph ^-
84−19:13 glyph (
84+19:18 glyph (
85−19:14 tight name list
85+19:19 tight name list
86−19:19 name attr
86+19:24 name attribute
87−19:23 tight glyph )
87+19:33 tight glyph )
88−19:25 glyph ~[
88+19:35 glyph ~[
89−19:27 tight name gap
89+19:37 tight name gap
90−19:30 tight glyph +
90+19:40 tight glyph +
91−19:31 tight lit %s2
91+19:41 tight lit %s2
92−19:35 name pad
92+19:45 name pad
93−19:38 tight glyph +
94−19:39 tight lit %s3
95−19:43 name width
9619:48 tight glyph +
9319:48 tight glyph +
97−19:49 tight glyph [
94+19:49 tight lit %s3
95+19:53 name width
96+19:58 tight glyph +
97+19:59 tight glyph [
98−19:50 tight lit %fill
98+19:60 tight lit %fill
99−19:56 lit 1
99+19:66 lit 1
100−19:57 tight glyph ]
100+19:67 tight glyph ]
101−19:58 tight glyph ]
101+19:68 tight glyph ]
10220:1 NEWLINE
10220:1 NEWLINE
10320:1 glyph ++
10320:1 glyph ++
10420:4 name gap-structural
10420:4 name gap-structural
@@ -114,32 +114,32 @@
11421:1 glyph ++
11421:1 glyph ++
11521:4 name nested
11521:4 name nested
11621:11 glyph ^-
11621:11 glyph ^-
117−21:14 name attr
117+21:14 name attribute
118−21:19 name width
118+21:24 name width
119−21:24 tight glyph +
119+21:29 tight glyph +
120−21:25 tight glyph [
120+21:30 tight glyph [
121−21:26 tight lit %fill
121+21:31 tight lit %fill
122−21:32 lit 1
122+21:37 lit 1
123−21:33 tight glyph ]
123+21:38 tight glyph ]
12422:1 NEWLINE
12422:1 NEWLINE
12522:1 glyph ++
12522:1 glyph ++
12622:4 name mismatch
12622:4 name mismatch
12722:13 glyph ^-
12722:13 glyph ^-
128−22:16 name attr
128+22:16 name attribute
129−22:21 name gap
129+22:26 name gap
130−22:24 tight glyph +
130+22:29 tight glyph +
131−22:25 tight lit %shrink
131+22:30 tight lit %shrink
13223:1 NEWLINE
13223:1 NEWLINE
13323:1 glyph ++
13323:1 glyph ++
13423:4 name missing
13423:4 name missing
13523:12 glyph ^-
13523:12 glyph ^-
136−23:15 name attr
136+23:15 name attribute
137−23:20 name width
137+23:25 name width
138−23:25 tight glyph +
138+23:30 tight glyph +
139−23:26 tight glyph [
139+23:31 tight glyph [
140−23:27 tight lit %oops
140+23:32 tight lit %oops
141−23:33 lit 1
141+23:38 lit 1
142−23:34 tight glyph ]
142+23:39 tight glyph ]
14324:1 NEWLINE
14324:1 NEWLINE
14424:1 glyph ++
14424:1 glyph ++
14524:4 name pending
14524:4 name pending
@@ -150,12 +150,12 @@
15025:1 glyph ++
15025:1 glyph ++
15125:4 name cross-origin
15125:4 name cross-origin
15225:17 glyph ^-
15225:17 glyph ^-
153−25:20 name attr
153+25:20 name attribute
154−25:25 glyph ^-
154+25:30 glyph ^-
155−25:28 name other-attr
155+25:33 name other-attribute
156−25:39 name gap
156+25:49 name gap
157−25:42 tight glyph +
157+25:52 tight glyph +
158−25:43 tight lit %s2
158+25:53 tight lit %s2
15926:1 NEWLINE
15926:1 NEWLINE
16026:1 glyph ++
16026:1 glyph ++
16126:4 name noun-pair
16126:4 name noun-pair
@@ -193,13 +193,13 @@
19329:1 glyph ++
19329:1 glyph ++
19429:4 name wrong-number
19429:4 name wrong-number
19529:17 glyph ^-
19529:17 glyph ^-
196−29:20 name attr
196+29:20 name attribute
197−29:25 name width
197+29:30 name width
198−29:30 tight glyph +
198+29:35 tight glyph +
199−29:31 tight glyph [
199+29:36 tight glyph [
200−29:32 tight lit %fill
200+29:37 tight lit %fill
201−29:38 str "hi"
201+29:43 str "hi"
202−29:42 tight glyph ]
202+29:47 tight glyph ]
20330:1 NEWLINE
20330:1 NEWLINE
20430:1 glyph ++
20430:1 glyph ++
20530:4 name unrelated
20530:4 name unrelated
@@ -208,10 +208,10 @@
20831:6 lit %dangling
20831:6 lit %dangling
20932:5 INDENT
20932:5 INDENT
21032:5 glyph ^-
21032:5 glyph ^-
211−32:8 name attr
211+32:8 name attribute
212−32:13 name gap
212+32:18 name gap
213−32:16 tight glyph +
213+32:21 tight glyph +
214−32:17 tight lit %s2
214+32:22 tight lit %s2
215−32:20 DEDENT
215+32:25 DEDENT
216−32:20 DEDENT
216+32:25 DEDENT
217−32:20 NEWLINE
217+32:25 NEWLINE
tests/golden/types-pair-context/tree.txt+34−34
@@ -1,64 +1,64 @@
1(module
1(module
2 (mold 1:1 spacing
2 (mold 1:1 spacing
3 (union 2:3 (const 2:3 %s0) (const 3:3 %s1) (const 4:3 %s2) (const 5:3 %s3)))
3 (union 2:3 (const 2:3 %s0) (const 3:3 %s1) (const 4:3 %s2) (const 5:3 %s3)))
4− (mold 6:1 length
4+ (mold 6:1 extent
5 (union 7:3
5 (union 7:3
6 (cell 7:3
6 (cell 7:3
7 (const 7:4 %fill)
7 (const 7:4 %fill)
8 (face 7:10 n (aura 7:12 @ud)))
8 (face 7:10 n (aura 7:12 @ud)))
9 (const 8:3 %shrink)))
9 (const 8:3 %shrink)))
10− (mold 9:1 attr
10+ (mold 9:1 attribute
11 (union 10:3
11 (union 10:3
12 (cell 10:3 (const 10:4 %gap) (ref 10:9 spacing))
12 (cell 10:3 (const 10:4 %gap) (ref 10:9 spacing))
13 (cell 11:3 (const 11:4 %pad) (ref 11:9 spacing))
13 (cell 11:3 (const 11:4 %pad) (ref 11:9 spacing))
14− (cell 12:3 (const 12:4 %width) (ref 12:11 length))))
14+ (cell 12:3 (const 12:4 %width) (ref 12:11 extent))))
15− (mold 13:1 other-attr
15+ (mold 13:1 other-attribute
16 (union 14:3
16 (union 14:3
17 (cell 14:3 (const 14:4 %gap) (ref 14:9 spacing))
17 (cell 14:3 (const 14:4 %gap) (ref 14:9 spacing))
18 (cell 15:3 (const 15:4 %pad) (ref 15:9 spacing))
18 (cell 15:3 (const 15:4 %pad) (ref 15:9 spacing))
19− (cell 16:3 (const 16:4 %width) (ref 16:11 length))))
19+ (cell 16:3 (const 16:4 %width) (ref 16:11 extent))))
20 (value 17:1 one
20 (value 17:1 one
21 (cast 17:8
21 (cast 17:8
22− (ref 17:11 attr)
22+ (ref 17:11 attribute)
23− (pair 17:16 gap (lit 17:20 %s2))))
23+ (pair 17:21 gap (lit 17:25 %s2))))
24 (value 18:1 equiv
24 (value 18:1 equiv
25 (cast 18:10
25 (cast 18:10
26− (ref 18:13 attr)
26+ (ref 18:13 attribute)
27− (tuple 18:18 (lit 18:19 %gap) (lit 18:24 %s2))))
27+ (tuple 18:23 (lit 18:24 %gap) (lit 18:29 %s2))))
28− (value 19:1 attrs
28+ (value 19:1 attributes
29− (cast 19:10
29+ (cast 19:15
30− (apply 19:13 list (ref 19:19 attr))
30+ (apply 19:18 list (ref 19:24 attribute))
31− (list 19:25
31+ (list 19:35
32− (pair 19:27 gap (lit 19:31 %s2))
32+ (pair 19:37 gap (lit 19:41 %s2))
33− (pair 19:35 pad (lit 19:39 %s3))
33+ (pair 19:45 pad (lit 19:49 %s3))
34− (pair 19:43 width
34+ (pair 19:53 width
35− (tuple 19:49 (lit 19:50 %fill) (lit 19:56 1))))))
35+ (tuple 19:59 (lit 19:60 %fill) (lit 19:66 1))))))
36 (value 20:1 gap-structural
36 (value 20:1 gap-structural
37 (cast 20:19
37 (cast 20:19
38 (cell 20:22 (aura 20:23 @tas) (aura 20:28 @tas))
38 (cell 20:22 (aura 20:23 @tas) (aura 20:28 @tas))
39 (pair 20:34 gap (lit 20:38 %s2))))
39 (pair 20:34 gap (lit 20:38 %s2))))
40 (value 21:1 nested
40 (value 21:1 nested
41 (cast 21:11
41 (cast 21:11
42− (ref 21:14 attr)
42+ (ref 21:14 attribute)
43− (pair 21:19 width
43+ (pair 21:24 width
44− (tuple 21:25 (lit 21:26 %fill) (lit 21:32 1)))))
44+ (tuple 21:30 (lit 21:31 %fill) (lit 21:37 1)))))
45 (value 22:1 mismatch
45 (value 22:1 mismatch
46 (cast 22:13
46 (cast 22:13
47− (ref 22:16 attr)
47+ (ref 22:16 attribute)
48− (pair 22:21 gap (lit 22:25 %shrink))))
48+ (pair 22:26 gap (lit 22:30 %shrink))))
49 (value 23:1 missing
49 (value 23:1 missing
50 (cast 23:12
50 (cast 23:12
51− (ref 23:15 attr)
51+ (ref 23:15 attribute)
52− (pair 23:20 width
52+ (pair 23:25 width
53− (tuple 23:26 (lit 23:27 %oops) (lit 23:33 1)))))
53+ (tuple 23:31 (lit 23:32 %oops) (lit 23:38 1)))))
54 (value 24:1 pending
54 (value 24:1 pending
55 (pair 24:12 gap (lit 24:16 %s2)))
55 (pair 24:12 gap (lit 24:16 %s2)))
56 (value 25:1 cross-origin
56 (value 25:1 cross-origin
57 (cast 25:17
57 (cast 25:17
58− (ref 25:20 attr)
58+ (ref 25:20 attribute)
59− (cast 25:25
59+ (cast 25:30
60− (ref 25:28 other-attr)
60+ (ref 25:33 other-attribute)
61− (pair 25:39 gap (lit 25:43 %s2)))))
61+ (pair 25:49 gap (lit 25:53 %s2)))))
62 (value 26:1 noun-pair
62 (value 26:1 noun-pair
63 (cast 26:14
63 (cast 26:14
64 (cell 26:17 (noun 26:18) (noun 26:20))
64 (cell 26:17 (noun 26:18) (noun 26:20))
@@ -73,14 +73,14 @@
73 (pair 28:29 gap (lit 28:33 %s2))))
73 (pair 28:29 gap (lit 28:33 %s2))))
74 (value 29:1 wrong-number
74 (value 29:1 wrong-number
75 (cast 29:17
75 (cast 29:17
76− (ref 29:20 attr)
76+ (ref 29:20 attribute)
77− (pair 29:25 width
77+ (pair 29:30 width
78− (tuple 29:31 (lit 29:32 %fill) (str 29:38 "hi")))))
78+ (tuple 29:36 (lit 29:37 %fill) (str 29:43 "hi")))))
79 (value 30:1 unrelated
79 (value 30:1 unrelated
80 (body 31:3
80 (body 31:3
81 (trace 31:3
81 (trace 31:3
82 (lit 31:6 %dangling)
82 (lit 31:6 %dangling)
83 (body 32:5
83 (body 32:5
84 (cast 32:5
84 (cast 32:5
85− (ref 32:8 attr)
85+ (ref 32:8 attribute)
86− (pair 32:13 gap (lit 32:17 %s2))))))))
86+ (pair 32:18 gap (lit 32:22 %s2))))))))
tests/golden/types-pair-context/types.txt+19−19
@@ -1,27 +1,27 @@
1partial inference; module not checked
1partial inference; module not checked
2+$ spacing: cases proven disjoint; mold not checked
2+$ spacing: cases proven disjoint; mold not checked
3−+$ length: cases proven disjoint; mold not checked
3++$ extent: cases proven disjoint; mold not checked
4−+$ attr: cases proven disjoint; mold not checked
4++$ attribute: cases proven disjoint; mold not checked
5−+$ other-attr: cases proven disjoint; mold not checked
5++$ other-attribute: cases proven disjoint; mold not checked
6−++ one: attr
6+++ one: attribute
7−++ equiv: attr
7+++ equiv: attribute
8−++ attrs: (list attr)
8+++ attributes: (list attribute)
9++ gap-structural: [@tas @tas]
9++ gap-structural: [@tas @tas]
10−++ nested: attr
10+++ nested: attribute
11++ mismatch: cast mold and expression type do not unify
11++ mismatch: cast mold and expression type do not unify
12/tests/golden/types-pair-context/source.jibb:22:16: cast mold
12/tests/golden/types-pair-context/source.jibb:22:16: cast mold
13−++ mismatch ^- attr gap+%shrink
13+++ mismatch ^- attribute gap+%shrink
14 ^
14 ^
15−/tests/golden/types-pair-context/source.jibb:22:21: expression
15+/tests/golden/types-pair-context/source.jibb:22:26: expression
16−++ mismatch ^- attr gap+%shrink
16+++ mismatch ^- attribute gap+%shrink
17− ^
17+ ^
18++ missing: cast mold and expression type do not unify
18++ missing: cast mold and expression type do not unify
19/tests/golden/types-pair-context/source.jibb:23:15: cast mold
19/tests/golden/types-pair-context/source.jibb:23:15: cast mold
20−++ missing ^- attr width+[%oops 1]
20+++ missing ^- attribute width+[%oops 1]
21 ^
21 ^
22−/tests/golden/types-pair-context/source.jibb:23:20: expression
22+/tests/golden/types-pair-context/source.jibb:23:25: expression
23−++ missing ^- attr width+[%oops 1]
23+++ missing ^- attribute width+[%oops 1]
24− ^
24+ ^
25++ pending: tag needs context in partial inference
25++ pending: tag needs context in partial inference
26++ cross-origin: cast constraint is not supported by partial inference
26++ cross-origin: cast constraint is not supported by partial inference
27++ noun-pair: [* *]
27++ noun-pair: [* *]
@@ -35,9 +35,9 @@ partial inference; module not checked
35 ^
35 ^
36++ wrong-number: cast mold and expression type do not unify
36++ wrong-number: cast mold and expression type do not unify
37/tests/golden/types-pair-context/source.jibb:29:20: cast mold
37/tests/golden/types-pair-context/source.jibb:29:20: cast mold
38−++ wrong-number ^- attr width+[%fill "hi"]
38+++ wrong-number ^- attribute width+[%fill "hi"]
39 ^
39 ^
40−/tests/golden/types-pair-context/source.jibb:29:25: expression
40+/tests/golden/types-pair-context/source.jibb:29:30: expression
41−++ wrong-number ^- attr width+[%fill "hi"]
41+++ wrong-number ^- attribute width+[%fill "hi"]
42− ^
42+ ^
43++ unrelated: tag needs context in partial inference
43++ unrelated: tag needs context in partial inference
tests/golden/types-partial-aura-family/source.jibb+1−1
@@ -1,7 +1,7 @@
1++ decimal |= x=@ud ^- @u x
1++ decimal |= x=@ud ^- @u x
2++ hex ^- @u 0x1f
2++ hex ^- @u 0x1f
3++ base32 |= x=@uv ^- @u x
3++ base32 |= x=@uv ^- @u x
4−++ text |= x=@tD ^- @t x
4+++ text-value |= x=@tD ^- @t x
5++ narrow |= x=@t ^- @tD x
5++ narrow |= x=@t ^- @tD x
6++ siblings |= x=@ux ^- @ud x
6++ siblings |= x=@ux ^- @ud x
7++ dup |= p=[A A] p
7++ dup |= p=[A A] p
tests/golden/types-partial-aura-family/tokens.txt+8−8
@@ -25,14 +25,14 @@
253:26 name x
253:26 name x
264:1 NEWLINE
264:1 NEWLINE
274:1 glyph ++
274:1 glyph ++
28−4:4 name text
28+4:4 name text-value
29−4:9 glyph |=
29+4:15 glyph |=
30−4:12 name x
30+4:18 name x
31−4:13 tight glyph =
31+4:19 tight glyph =
32−4:14 tight aura @tD
32+4:20 tight aura @tD
33−4:18 glyph ^-
33+4:24 glyph ^-
34−4:21 aura @t
34+4:27 aura @t
35−4:24 name x
35+4:30 name x
365:1 NEWLINE
365:1 NEWLINE
375:1 glyph ++
375:1 glyph ++
385:4 name narrow
385:4 name narrow
tests/golden/types-partial-aura-family/tree.txt+4−4
@@ -9,10 +9,10 @@
9 (gate 3:11
9 (gate 3:11
10 (face 3:14 x (aura 3:16 @uv))
10 (face 3:14 x (aura 3:16 @uv))
11 (cast 3:20 (aura 3:23 @u) (wing 3:26 x))))
11 (cast 3:20 (aura 3:23 @u) (wing 3:26 x))))
12− (value 4:1 text
12+ (value 4:1 text-value
13− (gate 4:9
13+ (gate 4:15
14− (face 4:12 x (aura 4:14 @tD))
14+ (face 4:18 x (aura 4:20 @tD))
15− (cast 4:18 (aura 4:21 @t) (wing 4:24 x))))
15+ (cast 4:24 (aura 4:27 @t) (wing 4:30 x))))
16 (value 5:1 narrow
16 (value 5:1 narrow
17 (gate 5:11
17 (gate 5:11
18 (face 5:14 x (aura 5:16 @t))
18 (face 5:14 x (aura 5:16 @t))
tests/golden/types-partial-aura-family/types.txt+1−1
@@ -2,7 +2,7 @@ partial inference; module not checked
2++ decimal: $-(@ud @u)
2++ decimal: $-(@ud @u)
3++ hex: @u
3++ hex: @u
4++ base32: $-(@uv @u)
4++ base32: $-(@uv @u)
5−++ text: $-(@tD @t)
5+++ text-value: $-(@tD @t)
6++ narrow: cast mold and expression type do not unify
6++ narrow: cast mold and expression type do not unify
7/tests/golden/types-partial-aura-family/source.jibb:5:22: cast mold has type @tD
7/tests/golden/types-partial-aura-family/source.jibb:5:22: cast mold has type @tD
8++ narrow |= x=@t ^- @tD x
8++ narrow |= x=@t ^- @tD x
tests/golden/types-partial-locals/source.jibb+2−2
@@ -32,9 +32,9 @@
32++ local-mold |= x
32++ local-mold |= x
33 +$ item @t
33 +$ item @t
34 x
34 x
35−++ wrap |= y |=(z y)
35+++ wrap-value |= y |=(z y)
36++ through-global |= x
36++ through-global |= x
37− ++ local (wrap x)
37+ ++ local (wrap-value x)
38 ~& ^- @t (local ~zod)
38 ~& ^- @t (local ~zod)
39 ^- @p (local "hi")
39 ^- @p (local "hi")
40++ nested-shadow |= x
40++ nested-shadow |= x
tests/golden/types-partial-locals/tokens.txt+10−10
@@ -180,13 +180,13 @@
18035:1 DEDENT
18035:1 DEDENT
18135:1 NEWLINE
18135:1 NEWLINE
18235:1 glyph ++
18235:1 glyph ++
183−35:4 name wrap
183+35:4 name wrap-value
184−35:9 glyph |=
184+35:15 glyph |=
185−35:12 name y
185+35:18 name y
186−35:14 glyph |=(
186+35:20 glyph |=(
187−35:17 tight name z
187+35:23 tight name z
188−35:19 name y
188+35:25 name y
189−35:20 tight glyph )
189+35:26 tight glyph )
19036:1 NEWLINE
19036:1 NEWLINE
19136:1 glyph ++
19136:1 glyph ++
19236:4 name through-global
19236:4 name through-global
@@ -196,9 +196,9 @@
19637:3 glyph ++
19637:3 glyph ++
19737:6 name local
19737:6 name local
19837:12 glyph (
19837:12 glyph (
199−37:13 tight name wrap
199+37:13 tight name wrap-value
200−37:18 name x
200+37:24 name x
201−37:19 tight glyph )
201+37:25 tight glyph )
20238:3 NEWLINE
20238:3 NEWLINE
20338:3 glyph ~&
20338:3 glyph ~&
20438:6 glyph ^-
20438:6 glyph ^-
tests/golden/types-partial-locals/tree.txt+5−5
@@ -88,17 +88,17 @@
88 (body 33:3
88 (body 33:3
89 (mold 33:3 item (aura 33:11 @t))
89 (mold 33:3 item (aura 33:11 @t))
90 (wing 34:3 x))))
90 (wing 34:3 x))))
91− (value 35:1 wrap
91+ (value 35:1 wrap-value
92− (gate 35:9
92+ (gate 35:15
93− (bind 35:12 y)
93+ (bind 35:18 y)
94− (gate-wide 35:14 (bind 35:17 z) (wing 35:19 y))))
94+ (gate-wide 35:20 (bind 35:23 z) (wing 35:25 y))))
95 (value 36:1 through-global
95 (value 36:1 through-global
96 (gate 36:19
96 (gate 36:19
97 (bind 36:22 x)
97 (bind 36:22 x)
98 (body 37:3
98 (body 37:3
99 (value 37:3 local
99 (value 37:3 local
100 (group 37:12
100 (group 37:12
101− (call 37:13 (wing 37:13 wrap) (wing 37:18 x))))
101+ (call 37:13 (wing 37:13 wrap-value) (wing 37:24 x))))
102 (trace 38:3
102 (trace 38:3
103 (cast 38:6
103 (cast 38:6
104 (aura 38:9 @t)
104 (aura 38:9 @t)
tests/golden/types-partial-locals/types.txt+1−1
@@ -21,7 +21,7 @@ partial inference; module not checked
21 ^
21 ^
22++ unused-bad: local definitions need unsupported inference
22++ unused-bad: local definitions need unsupported inference
23++ local-mold: $-(A A)
23++ local-mold: $-(A A)
24−++ wrap: $-(A $-(B A))
24+++ wrap-value: $-(A $-(B A))
25++ through-global: cast mold and expression type do not unify
25++ through-global: cast mold and expression type do not unify
26/tests/golden/types-partial-locals/source.jibb:39:8: cast mold has type @p
26/tests/golden/types-partial-locals/source.jibb:39:8: cast mold has type @p
27 ^- @p (local "hi")
27 ^- @p (local "hi")
tests/golden/types-partial-union-nested-nouns/about.txtnew file+4
@@ -0,0 +1,4 @@
1+source: docs/spec/grammar.md, Molds, Unions: "Cases must differ as nouns"; "a cell with an empty position at any depth is itself empty".
2+tests: Nested zero literals compare by noun across spelling, while distinct nested constants are disjoint. An empty field below an unknown gate makes the whole cell empty; without that field, gate inhabitation is unknown. A fully inhabited cell overlaps the noun mold. This reports pairwise partial mold analysis, not checked molds.
3+expect: parses
4+expect-types: a partial inference report
tests/golden/types-partial-union-nested-nouns/source.jibbnew file+18
@@ -0,0 +1,18 @@
1++$ nested-zero
2+ [%tag [%$ @t]]
3+ [%tag [~ @t]]
4++$ nested-flag-zero
5+ [%tag [%.y @t]]
6+ [%tag [%$ @t]]
7++$ nested-distinct
8+ [%tag [%a @t]]
9+ [%tag [%b @t]]
10++$ empty-beneath-unknown
11+ *
12+ [%tag [$-(@t @t) !!]]
13++$ unknown-inhabitation
14+ *
15+ [%tag [$-(@t @t) @t]]
16++$ known-inhabitation
17+ *
18+ [%tag [@t @p]]
tests/golden/types-partial-union-nested-nouns/tokens.txtnew file+108
@@ -0,0 +1,108 @@
1+1:1 glyph +$
2+1:4 name nested-zero
3+2:3 INDENT
4+2:3 glyph [
5+2:4 tight lit %tag
6+2:9 glyph [
7+2:10 tight lit %$
8+2:13 aura @t
9+2:15 tight glyph ]
10+2:16 tight glyph ]
11+3:3 NEWLINE
12+3:3 glyph [
13+3:4 tight lit %tag
14+3:9 glyph [
15+3:10 tight lit ~
16+3:12 aura @t
17+3:14 tight glyph ]
18+3:15 tight glyph ]
19+4:1 DEDENT
20+4:1 NEWLINE
21+4:1 glyph +$
22+4:4 name nested-flag-zero
23+5:3 INDENT
24+5:3 glyph [
25+5:4 tight lit %tag
26+5:9 glyph [
27+5:10 tight lit %.y
28+5:14 aura @t
29+5:16 tight glyph ]
30+5:17 tight glyph ]
31+6:3 NEWLINE
32+6:3 glyph [
33+6:4 tight lit %tag
34+6:9 glyph [
35+6:10 tight lit %$
36+6:13 aura @t
37+6:15 tight glyph ]
38+6:16 tight glyph ]
39+7:1 DEDENT
40+7:1 NEWLINE
41+7:1 glyph +$
42+7:4 name nested-distinct
43+8:3 INDENT
44+8:3 glyph [
45+8:4 tight lit %tag
46+8:9 glyph [
47+8:10 tight lit %a
48+8:13 aura @t
49+8:15 tight glyph ]
50+8:16 tight glyph ]
51+9:3 NEWLINE
52+9:3 glyph [
53+9:4 tight lit %tag
54+9:9 glyph [
55+9:10 tight lit %b
56+9:13 aura @t
57+9:15 tight glyph ]
58+9:16 tight glyph ]
59+10:1 DEDENT
60+10:1 NEWLINE
61+10:1 glyph +$
62+10:4 name empty-beneath-unknown
63+11:3 INDENT
64+11:3 glyph *
65+12:3 NEWLINE
66+12:3 glyph [
67+12:4 tight lit %tag
68+12:9 glyph [
69+12:10 tight glyph $-(
70+12:13 tight aura @t
71+12:16 aura @t
72+12:18 tight glyph )
73+12:20 glyph !!
74+12:22 tight glyph ]
75+12:23 tight glyph ]
76+13:1 DEDENT
77+13:1 NEWLINE
78+13:1 glyph +$
79+13:4 name unknown-inhabitation
80+14:3 INDENT
81+14:3 glyph *
82+15:3 NEWLINE
83+15:3 glyph [
84+15:4 tight lit %tag
85+15:9 glyph [
86+15:10 tight glyph $-(
87+15:13 tight aura @t
88+15:16 aura @t
89+15:18 tight glyph )
90+15:20 aura @t
91+15:22 tight glyph ]
92+15:23 tight glyph ]
93+16:1 DEDENT
94+16:1 NEWLINE
95+16:1 glyph +$
96+16:4 name known-inhabitation
97+17:3 INDENT
98+17:3 glyph *
99+18:3 NEWLINE
100+18:3 glyph [
101+18:4 tight lit %tag
102+18:9 glyph [
103+18:10 tight aura @t
104+18:13 aura @p
105+18:15 tight glyph ]
106+18:16 tight glyph ]
107+18:17 DEDENT
108+18:17 NEWLINE
tests/golden/types-partial-union-nested-nouns/tree.txtnew file+47
@@ -0,0 +1,47 @@
1+(module
2+ (mold 1:1 nested-zero
3+ (union 2:3
4+ (cell 2:3
5+ (const 2:4 %tag)
6+ (cell 2:9 (const 2:10 %$) (aura 2:13 @t)))
7+ (cell 3:3
8+ (const 3:4 %tag)
9+ (cell 3:9 (const 3:10 ~) (aura 3:12 @t)))))
10+ (mold 4:1 nested-flag-zero
11+ (union 5:3
12+ (cell 5:3
13+ (const 5:4 %tag)
14+ (cell 5:9 (const 5:10 %.y) (aura 5:14 @t)))
15+ (cell 6:3
16+ (const 6:4 %tag)
17+ (cell 6:9 (const 6:10 %$) (aura 6:13 @t)))))
18+ (mold 7:1 nested-distinct
19+ (union 8:3
20+ (cell 8:3
21+ (const 8:4 %tag)
22+ (cell 8:9 (const 8:10 %a) (aura 8:13 @t)))
23+ (cell 9:3
24+ (const 9:4 %tag)
25+ (cell 9:9 (const 9:10 %b) (aura 9:13 @t)))))
26+ (mold 10:1 empty-beneath-unknown
27+ (union 11:3
28+ (noun 11:3)
29+ (cell 12:3
30+ (const 12:4 %tag)
31+ (cell 12:9
32+ (fn 12:10 (aura 12:13 @t) (aura 12:16 @t))
33+ (void 12:20)))))
34+ (mold 13:1 unknown-inhabitation
35+ (union 14:3
36+ (noun 14:3)
37+ (cell 15:3
38+ (const 15:4 %tag)
39+ (cell 15:9
40+ (fn 15:10 (aura 15:13 @t) (aura 15:16 @t))
41+ (aura 15:20 @t)))))
42+ (mold 16:1 known-inhabitation
43+ (union 17:3
44+ (noun 17:3)
45+ (cell 18:3
46+ (const 18:4 %tag)
47+ (cell 18:9 (aura 18:10 @t) (aura 18:13 @p))))))
tests/golden/types-partial-union-nested-nouns/types.txtnew file+25
@@ -0,0 +1,25 @@
1+partial inference; module not checked
2++$ nested-zero: overlapping cases; mold not checked
3+/tests/golden/types-partial-union-nested-nouns/source.jibb:2:3: first union case
4+ [%tag [%$ @t]]
5+ ^
6+/tests/golden/types-partial-union-nested-nouns/source.jibb:3:3: overlapping case
7+ [%tag [~ @t]]
8+ ^
9++$ nested-flag-zero: overlapping cases; mold not checked
10+/tests/golden/types-partial-union-nested-nouns/source.jibb:5:3: first union case
11+ [%tag [%.y @t]]
12+ ^
13+/tests/golden/types-partial-union-nested-nouns/source.jibb:6:3: overlapping case
14+ [%tag [%$ @t]]
15+ ^
16++$ nested-distinct: cases proven disjoint; mold not checked
17++$ empty-beneath-unknown: cases proven disjoint; mold not checked
18++$ unknown-inhabitation: case disjointness unresolved; mold not checked
19++$ known-inhabitation: overlapping cases; mold not checked
20+/tests/golden/types-partial-union-nested-nouns/source.jibb:17:3: first union case
21+ *
22+ ^
23+/tests/golden/types-partial-union-nested-nouns/source.jibb:18:3: overlapping case
24+ [%tag [@t @p]]
25+ ^
tests/golden/types-prelude-arithmetic/about.txt+1−1
@@ -1,4 +1,4 @@
1source: docs/spec/grammar.md, Molds, Atoms: "Arithmetic rejects loobean operands: `?` contains only 0 and 1, while an arithmetic result need not."
1source: docs/spec/grammar.md, Molds, Atoms: "Arithmetic rejects loobean operands: `?` contains only 0 and 1, while an arithmetic result need not."
2−tests: The source-backed add, dec and gth wrappers preserve numeric auras, constrained generic types, and independent comparison behavior. Loobean operands are rejected by add and dec; lent remains unavailable. Primitive lowering, jet recognition and execution remain unfinished. The module report is partial.
2+tests: The source-backed add, dec and gth wrappers preserve numeric auras, constrained generic types, and independent comparison behavior. Loobean operands are rejected by add and dec; the source-backed lent infers list lengths. Primitive lowering, jet recognition and execution remain unfinished. The module report is partial.
3expect: parses
3expect: parses
4expect-types: a partial inference report
4expect-types: a partial inference report
tests/golden/types-prelude-arithmetic/source.jibb+1−1
@@ -15,7 +15,7 @@
15++ add-hex (add 0x1 0x2)
15++ add-hex (add 0x1 0x2)
16++ reject-bool-dec (dec %.n)
16++ reject-bool-dec (dec %.n)
17++ dec-hex (dec 0x2)
17++ dec-hex (dec 0x2)
18−++ unavailable-length (lent ~["a"])
18+++ list-length (lent ~["a"])
19++ captured |= x=? (add x x)
19++ captured |= x=? (add x x)
20++ captured-local |= x=?
20++ captured-local |= x=?
21 ++ local |= y=? (add x y)
21 ++ local |= y=? (add x y)
tests/golden/types-prelude-arithmetic/tokens.txt+7−7
@@ -142,13 +142,13 @@
14217:20 tight glyph )
14217:20 tight glyph )
14318:1 NEWLINE
14318:1 NEWLINE
14418:1 glyph ++
14418:1 glyph ++
145−18:4 name unavailable-length
145+18:4 name list-length
146−18:23 glyph (
146+18:16 glyph (
147−18:24 tight name lent
147+18:17 tight name lent
148−18:29 glyph ~[
148+18:22 glyph ~[
149−18:31 tight str "a"
149+18:24 tight str "a"
150−18:34 tight glyph ]
150+18:27 tight glyph ]
151−18:35 tight glyph )
151+18:28 tight glyph )
15219:1 NEWLINE
15219:1 NEWLINE
15319:1 glyph ++
15319:1 glyph ++
15419:4 name captured
15419:4 name captured
tests/golden/types-prelude-arithmetic/tree.txt+5−5
@@ -57,11 +57,11 @@
57 (value 17:1 dec-hex
57 (value 17:1 dec-hex
58 (group 17:12
58 (group 17:12
59 (call 17:13 (wing 17:13 dec) (lit 17:17 0x2))))
59 (call 17:13 (wing 17:13 dec) (lit 17:17 0x2))))
60− (value 18:1 unavailable-length
60+ (value 18:1 list-length
61− (group 18:23
61+ (group 18:16
62− (call 18:24
62+ (call 18:17
63− (wing 18:24 lent)
63+ (wing 18:17 lent)
64− (list 18:29 (str 18:31 "a")))))
64+ (list 18:22 (str 18:24 "a")))))
65 (value 19:1 captured
65 (value 19:1 captured
66 (gate 19:13
66 (gate 19:13
67 (face 19:16 x (flag 19:18))
67 (face 19:16 x (flag 19:18))
tests/golden/types-prelude-arithmetic/types.txt+1−1
@@ -38,7 +38,7 @@ partial inference; module not checked
38++ reject-bool-dec (dec %.n)
38++ reject-bool-dec (dec %.n)
39 ^
39 ^
40++ dec-hex: @ux
40++ dec-hex: @ux
41−++ unavailable-length: name is not available to partial inference
41+++ list-length: @ud
42++ captured: call's sample and argument types do not unify
42++ captured: call's sample and argument types do not unify
43/tests/golden/types-prelude-arithmetic/source.jibb:19:21: called gate has type $-([A A] A) where A is an atom other than ?
43/tests/golden/types-prelude-arithmetic/source.jibb:19:21: called gate has type $-([A A] A) where A is an atom other than ?
44++ captured |= x=? (add x x)
44++ captured |= x=? (add x x)
tests/golden/types-prelude-bond/source.jibb+1−1
@@ -1,6 +1,6 @@
1++ choose (bond |=(~ "default"))
1++ choose (bond |=(~ "default"))
2++ missing (choose ~)
2++ missing (choose ~)
3++ present (choose `"found")
3++ present (choose `"found")
4−++ wrap |= fallback=$-(~ A) (bond fallback)
4+++ wrap-value |= fallback=$-(~ A) (bond fallback)
5++ choose-ship (bond |=(~ ~zod))
5++ choose-ship (bond |=(~ ~zod))
6++ present-ship (choose-ship `~zod)
6++ present-ship (choose-ship `~zod)
tests/golden/types-prelude-bond/tokens.txt+12−12
@@ -24,18 +24,18 @@
243:28 tight glyph )
243:28 tight glyph )
254:1 NEWLINE
254:1 NEWLINE
264:1 glyph ++
264:1 glyph ++
27−4:4 name wrap
27+4:4 name wrap-value
28−4:9 glyph |=
28+4:15 glyph |=
29−4:12 name fallback
29+4:18 name fallback
30−4:20 tight glyph =
30+4:26 tight glyph =
31−4:21 tight glyph $-(
31+4:27 tight glyph $-(
32−4:24 tight lit ~
32+4:30 tight lit ~
33−4:26 tvar A
33+4:32 tvar A
34−4:27 tight glyph )
34+4:33 tight glyph )
35−4:29 glyph (
35+4:35 glyph (
36−4:30 tight name bond
36+4:36 tight name bond
37−4:35 name fallback
37+4:41 name fallback
38−4:43 tight glyph )
38+4:49 tight glyph )
395:1 NEWLINE
395:1 NEWLINE
405:1 glyph ++
405:1 glyph ++
415:4 name choose-ship
415:4 name choose-ship
tests/golden/types-prelude-bond/tree.txt+6−6
@@ -12,12 +12,12 @@
12 (call 3:13
12 (call 3:13
13 (wing 3:13 choose)
13 (wing 3:13 choose)
14 (unit 3:20 (str 3:21 "found")))))
14 (unit 3:20 (str 3:21 "found")))))
15− (value 4:1 wrap
15+ (value 4:1 wrap-value
16− (gate 4:9
16+ (gate 4:15
17− (face 4:12 fallback
17+ (face 4:18 fallback
18− (fn 4:21 (const 4:24 ~) (tvar 4:26 A)))
18+ (fn 4:27 (const 4:30 ~) (tvar 4:32 A)))
19− (group 4:29
19+ (group 4:35
20− (call 4:30 (wing 4:30 bond) (wing 4:35 fallback)))))
20+ (call 4:36 (wing 4:36 bond) (wing 4:41 fallback)))))
21 (value 5:1 choose-ship
21 (value 5:1 choose-ship
22 (group 5:16
22 (group 5:16
23 (call 5:17
23 (call 5:17
tests/golden/types-prelude-bond/types.txt+1−1
@@ -2,6 +2,6 @@ partial inference; module not checked
2++ choose: $-((unit @t) @t)
2++ choose: $-((unit @t) @t)
3++ missing: @t
3++ missing: @t
4++ present: @t
4++ present: @t
5−++ wrap: $-($-(~ A) $-((unit A) A))
5+++ wrap-value: $-($-(~ A) $-((unit A) A))
6++ choose-ship: $-((unit @p) @p)
6++ choose-ship: $-((unit @p) @p)
7++ present-ship: @p
7++ present-ship: @p
tests/golden/types-prelude-cmd/source.jibb+4−4
@@ -8,9 +8,9 @@
8++ wait ^- (cmd @t) [%wait ~s30 "done"]
8++ wait ^- (cmd @t) [%wait ~s30 "done"]
9++ who ^- (cmd @t) [%who |=(p=@p "done")]
9++ who ^- (cmd @t) [%who |=(p=@p "done")]
10++ wrong-message ^- (cmd @t) [%wait ~s30 ~zod]
10++ wrong-message ^- (cmd @t) [%wait ~s30 ~zod]
11−++ wrap |= x=A ^- (cmd A) [%wait ~s30 x]
11+++ wrap-value |= x=A ^- (cmd A) [%wait ~s30 x]
12−++ wrap-text (wrap "hello")
12+++ wrap-value-text (wrap-value "hello")
13−++ wrap-ship (wrap ~zod)
13+++ wrap-value-ship (wrap-value ~zod)
14++ wrong-reply ^- (cmd @t) [%who |=(p=@p ~zod)]
14++ wrong-reply ^- (cmd @t) [%who |=(p=@p ~zod)]
15++ commands ^- (list (cmd @t)) ~[[%go "/home"] [%wait ~s30 "done"]]
15++ commands ^- (list (cmd @t)) ~[[%go "/home"] [%wait ~s30 "done"]]
16++ commands-bad ^- (list (cmd @t)) ~[[%go "/home"] [%wait ~s30 ~zod]]
16++ commands-bad ^- (list (cmd @t)) ~[[%go "/home"] [%wait ~s30 ~zod]]
@@ -18,4 +18,4 @@
18 ^- (cmd @t) [%poke p |=(r=@p "done")]
18 ^- (cmd @t) [%poke p |=(r=@p "done")]
19++ wrong-case ^- (cmd @t) %oops
19++ wrong-case ^- (cmd @t) %oops
20++ use-text |= x=(cmd @t) x
20++ use-text |= x=(cmd @t) x
21−++ cross (use-text (wrap ~zod))
21+++ cross (use-text (wrap-value ~zod))
tests/golden/types-prelude-cmd/tokens.txt+30−30
@@ -138,35 +138,35 @@
13810:46 tight glyph ]
13810:46 tight glyph ]
13911:1 NEWLINE
13911:1 NEWLINE
14011:1 glyph ++
14011:1 glyph ++
141−11:4 name wrap
141+11:4 name wrap-value
142−11:9 glyph |=
142+11:15 glyph |=
143−11:12 name x
143+11:18 name x
144−11:13 tight glyph =
144+11:19 tight glyph =
145−11:14 tight tvar A
145+11:20 tight tvar A
146−11:16 glyph ^-
146+11:22 glyph ^-
147−11:19 glyph (
147+11:25 glyph (
148−11:20 tight name cmd
148+11:26 tight name cmd
149−11:24 tvar A
149+11:30 tvar A
150−11:25 tight glyph )
150+11:31 tight glyph )
151−11:27 glyph [
151+11:33 glyph [
152−11:28 tight lit %wait
152+11:34 tight lit %wait
153−11:34 lit ~s30
153+11:40 lit ~s30
154−11:39 name x
154+11:45 name x
155−11:40 tight glyph ]
155+11:46 tight glyph ]
15612:1 NEWLINE
15612:1 NEWLINE
15712:1 glyph ++
15712:1 glyph ++
158−12:4 name wrap-text
158+12:4 name wrap-value-text
159−12:14 glyph (
159+12:20 glyph (
160−12:15 tight name wrap
160+12:21 tight name wrap-value
161−12:20 str "hello"
161+12:32 str "hello"
162−12:27 tight glyph )
162+12:39 tight glyph )
16313:1 NEWLINE
16313:1 NEWLINE
16413:1 glyph ++
16413:1 glyph ++
165−13:4 name wrap-ship
165+13:4 name wrap-value-ship
166−13:14 glyph (
166+13:20 glyph (
167−13:15 tight name wrap
167+13:21 tight name wrap-value
168−13:20 lit ~zod
168+13:32 lit ~zod
169−13:24 tight glyph )
169+13:36 tight glyph )
17014:1 NEWLINE
17014:1 NEWLINE
17114:1 glyph ++
17114:1 glyph ++
17214:4 name wrong-reply
17214:4 name wrong-reply
@@ -278,8 +278,8 @@
27821:10 glyph (
27821:10 glyph (
27921:11 tight name use-text
27921:11 tight name use-text
28021:20 glyph (
28021:20 glyph (
281−21:21 tight name wrap
281+21:21 tight name wrap-value
282−21:26 lit ~zod
282+21:32 lit ~zod
283−21:30 tight glyph )
283+21:36 tight glyph )
284−21:31 tight glyph )
284+21:37 tight glyph )
285−21:32 NEWLINE
285+21:38 NEWLINE
tests/golden/types-prelude-cmd/tree.txt+13−13
@@ -59,18 +59,18 @@
59 (cast 10:18
59 (cast 10:18
60 (apply 10:21 cmd (aura 10:26 @t))
60 (apply 10:21 cmd (aura 10:26 @t))
61 (tuple 10:30 (lit 10:31 %wait) (lit 10:37 ~s30) (lit 10:42 ~zod))))
61 (tuple 10:30 (lit 10:31 %wait) (lit 10:37 ~s30) (lit 10:42 ~zod))))
62− (value 11:1 wrap
62+ (value 11:1 wrap-value
63− (gate 11:9
63+ (gate 11:15
64− (face 11:12 x (tvar 11:14 A))
64+ (face 11:18 x (tvar 11:20 A))
65− (cast 11:16
65+ (cast 11:22
66− (apply 11:19 cmd (tvar 11:24 A))
66+ (apply 11:25 cmd (tvar 11:30 A))
67− (tuple 11:27 (lit 11:28 %wait) (lit 11:34 ~s30) (wing 11:39 x)))))
67+ (tuple 11:33 (lit 11:34 %wait) (lit 11:40 ~s30) (wing 11:45 x)))))
68− (value 12:1 wrap-text
68+ (value 12:1 wrap-value-text
69− (group 12:14
69+ (group 12:20
70− (call 12:15 (wing 12:15 wrap) (str 12:20 "hello"))))
70+ (call 12:21 (wing 12:21 wrap-value) (str 12:32 "hello"))))
71− (value 13:1 wrap-ship
71+ (value 13:1 wrap-value-ship
72− (group 13:14
72+ (group 13:20
73− (call 13:15 (wing 13:15 wrap) (lit 13:20 ~zod))))
73+ (call 13:21 (wing 13:21 wrap-value) (lit 13:32 ~zod))))
74 (value 14:1 wrong-reply
74 (value 14:1 wrong-reply
75 (cast 14:16
75 (cast 14:16
76 (apply 14:19 cmd (aura 14:24 @t))
76 (apply 14:19 cmd (aura 14:24 @t))
@@ -119,4 +119,4 @@
119 (call 21:11
119 (call 21:11
120 (wing 21:11 use-text)
120 (wing 21:11 use-text)
121 (group 21:20
121 (group 21:20
122− (call 21:21 (wing 21:21 wrap) (lit 21:26 ~zod)))))))
122+ (call 21:21 (wing 21:21 wrap-value) (lit 21:32 ~zod)))))))
tests/golden/types-prelude-cmd/types.txt+7−7
@@ -20,9 +20,9 @@ partial inference; module not checked
20/tests/golden/types-prelude-cmd/source.jibb:10:30: expression
20/tests/golden/types-prelude-cmd/source.jibb:10:30: expression
21++ wrong-message ^- (cmd @t) [%wait ~s30 ~zod]
21++ wrong-message ^- (cmd @t) [%wait ~s30 ~zod]
22 ^
22 ^
23−++ wrap: $-(A (cmd A))
23+++ wrap-value: $-(A (cmd A))
24−++ wrap-text: (cmd @t)
24+++ wrap-value-text: (cmd @t)
25−++ wrap-ship: (cmd @p)
25+++ wrap-value-ship: (cmd @p)
26++ wrong-reply: cast mold and expression type do not unify
26++ wrong-reply: cast mold and expression type do not unify
27/tests/golden/types-prelude-cmd/source.jibb:14:19: cast mold
27/tests/golden/types-prelude-cmd/source.jibb:14:19: cast mold
28++ wrong-reply ^- (cmd @t) [%who |=(p=@p ~zod)]
28++ wrong-reply ^- (cmd @t) [%who |=(p=@p ~zod)]
@@ -49,8 +49,8 @@ partial inference; module not checked
49++ use-text: $-((cmd @t) (cmd @t))
49++ use-text: $-((cmd @t) (cmd @t))
50++ cross: call's sample and argument types do not unify
50++ cross: call's sample and argument types do not unify
51/tests/golden/types-prelude-cmd/source.jibb:21:21: called gate
51/tests/golden/types-prelude-cmd/source.jibb:21:21: called gate
52−++ cross (use-text (wrap ~zod))
52+++ cross (use-text (wrap-value ~zod))
53 ^
53 ^
54−/tests/golden/types-prelude-cmd/source.jibb:21:26: argument has type @p
54+/tests/golden/types-prelude-cmd/source.jibb:21:32: argument has type @p
55−++ cross (use-text (wrap ~zod))
55+++ cross (use-text (wrap-value ~zod))
56− ^
56+ ^
tests/golden/types-prelude-comparison/about.txtnew file+4
@@ -0,0 +1,4 @@
1+source: docs/spec/grammar.md, Molds, Atoms: "Comparison may take loobeans and returns `?`." The prelude inventory includes `lth`, `gte`, and `lte`.
2+tests: Source-backed comparisons infer for less, greater and equal ordered operands, both loobean orders, a shared generic atom type and matching hex auras. Distinct explicit auras fail closed. The report is partial; backend lowering, execution and jet recognition remain unverified.
3+expect: parses
4+expect-types: a partial inference report
tests/golden/types-prelude-comparison/modules.txtnew file+1
@@ -0,0 +1 @@
1+# no module fixtures
tests/golden/types-prelude-comparison/source.jibbnew file+18
@@ -0,0 +1,18 @@
1+++ less (lth 1 2)
2+++ greater (lth 2 1)
3+++ equal (lth 1 1)
4+++ gte-less (gte 1 2)
5+++ gte-greater (gte 2 1)
6+++ gte-equal (gte 1 1)
7+++ lte-less (lte 1 2)
8+++ lte-greater (lte 2 1)
9+++ lte-equal (lte 1 1)
10+++ flags-forward (gte %.y %.n)
11+++ flags-reverse (lte %.n %.y)
12+++ flags-equal (lth %.y %.y)
13+++ hex (lth 0x1 0x2)
14+++ generic-lth |= [a=A b=A] (lth a b)
15+++ generic-gte |= [a=A b=A] (gte a b)
16+++ generic-lte |= [a=A b=A] (lte a b)
17+++ bad-aura (lth 0x1 (^- @ud 1))
18+++ bad-kind (gte ~zod "text")
tests/golden/types-prelude-comparison/tokens.txtnew file+175
@@ -0,0 +1,175 @@
1+1:1 glyph ++
2+1:4 name less
3+1:9 glyph (
4+1:10 tight name lth
5+1:14 lit 1
6+1:16 lit 2
7+1:17 tight glyph )
8+2:1 NEWLINE
9+2:1 glyph ++
10+2:4 name greater
11+2:12 glyph (
12+2:13 tight name lth
13+2:17 lit 2
14+2:19 lit 1
15+2:20 tight glyph )
16+3:1 NEWLINE
17+3:1 glyph ++
18+3:4 name equal
19+3:10 glyph (
20+3:11 tight name lth
21+3:15 lit 1
22+3:17 lit 1
23+3:18 tight glyph )
24+4:1 NEWLINE
25+4:1 glyph ++
26+4:4 name gte-less
27+4:13 glyph (
28+4:14 tight name gte
29+4:18 lit 1
30+4:20 lit 2
31+4:21 tight glyph )
32+5:1 NEWLINE
33+5:1 glyph ++
34+5:4 name gte-greater
35+5:16 glyph (
36+5:17 tight name gte
37+5:21 lit 2
38+5:23 lit 1
39+5:24 tight glyph )
40+6:1 NEWLINE
41+6:1 glyph ++
42+6:4 name gte-equal
43+6:14 glyph (
44+6:15 tight name gte
45+6:19 lit 1
46+6:21 lit 1
47+6:22 tight glyph )
48+7:1 NEWLINE
49+7:1 glyph ++
50+7:4 name lte-less
51+7:13 glyph (
52+7:14 tight name lte
53+7:18 lit 1
54+7:20 lit 2
55+7:21 tight glyph )
56+8:1 NEWLINE
57+8:1 glyph ++
58+8:4 name lte-greater
59+8:16 glyph (
60+8:17 tight name lte
61+8:21 lit 2
62+8:23 lit 1
63+8:24 tight glyph )
64+9:1 NEWLINE
65+9:1 glyph ++
66+9:4 name lte-equal
67+9:14 glyph (
68+9:15 tight name lte
69+9:19 lit 1
70+9:21 lit 1
71+9:22 tight glyph )
72+10:1 NEWLINE
73+10:1 glyph ++
74+10:4 name flags-forward
75+10:18 glyph (
76+10:19 tight name gte
77+10:23 lit %.y
78+10:27 lit %.n
79+10:30 tight glyph )
80+11:1 NEWLINE
81+11:1 glyph ++
82+11:4 name flags-reverse
83+11:18 glyph (
84+11:19 tight name lte
85+11:23 lit %.n
86+11:27 lit %.y
87+11:30 tight glyph )
88+12:1 NEWLINE
89+12:1 glyph ++
90+12:4 name flags-equal
91+12:16 glyph (
92+12:17 tight name lth
93+12:21 lit %.y
94+12:25 lit %.y
95+12:28 tight glyph )
96+13:1 NEWLINE
97+13:1 glyph ++
98+13:4 name hex
99+13:8 glyph (
100+13:9 tight name lth
101+13:13 lit 0x1
102+13:17 lit 0x2
103+13:20 tight glyph )
104+14:1 NEWLINE
105+14:1 glyph ++
106+14:4 name generic-lth
107+14:16 glyph |=
108+14:19 glyph [
109+14:20 tight name a
110+14:21 tight glyph =
111+14:22 tight tvar A
112+14:24 name b
113+14:25 tight glyph =
114+14:26 tight tvar A
115+14:27 tight glyph ]
116+14:29 glyph (
117+14:30 tight name lth
118+14:34 name a
119+14:36 name b
120+14:37 tight glyph )
121+15:1 NEWLINE
122+15:1 glyph ++
123+15:4 name generic-gte
124+15:16 glyph |=
125+15:19 glyph [
126+15:20 tight name a
127+15:21 tight glyph =
128+15:22 tight tvar A
129+15:24 name b
130+15:25 tight glyph =
131+15:26 tight tvar A
132+15:27 tight glyph ]
133+15:29 glyph (
134+15:30 tight name gte
135+15:34 name a
136+15:36 name b
137+15:37 tight glyph )
138+16:1 NEWLINE
139+16:1 glyph ++
140+16:4 name generic-lte
141+16:16 glyph |=
142+16:19 glyph [
143+16:20 tight name a
144+16:21 tight glyph =
145+16:22 tight tvar A
146+16:24 name b
147+16:25 tight glyph =
148+16:26 tight tvar A
149+16:27 tight glyph ]
150+16:29 glyph (
151+16:30 tight name lte
152+16:34 name a
153+16:36 name b
154+16:37 tight glyph )
155+17:1 NEWLINE
156+17:1 glyph ++
157+17:4 name bad-aura
158+17:13 glyph (
159+17:14 tight name lth
160+17:18 lit 0x1
161+17:22 glyph (
162+17:23 tight glyph ^-
163+17:26 aura @ud
164+17:30 lit 1
165+17:31 tight glyph )
166+17:32 tight glyph )
167+18:1 NEWLINE
168+18:1 glyph ++
169+18:4 name bad-kind
170+18:13 glyph (
171+18:14 tight name gte
172+18:18 lit ~zod
173+18:23 str "text"
174+18:29 tight glyph )
175+18:30 NEWLINE
tests/golden/types-prelude-comparison/tree.txtnew file+71
@@ -0,0 +1,71 @@
1+(module
2+ (value 1:1 less
3+ (group 1:9
4+ (call 1:10 (wing 1:10 lth) (lit 1:14 1) (lit 1:16 2))))
5+ (value 2:1 greater
6+ (group 2:12
7+ (call 2:13 (wing 2:13 lth) (lit 2:17 2) (lit 2:19 1))))
8+ (value 3:1 equal
9+ (group 3:10
10+ (call 3:11 (wing 3:11 lth) (lit 3:15 1) (lit 3:17 1))))
11+ (value 4:1 gte-less
12+ (group 4:13
13+ (call 4:14 (wing 4:14 gte) (lit 4:18 1) (lit 4:20 2))))
14+ (value 5:1 gte-greater
15+ (group 5:16
16+ (call 5:17 (wing 5:17 gte) (lit 5:21 2) (lit 5:23 1))))
17+ (value 6:1 gte-equal
18+ (group 6:14
19+ (call 6:15 (wing 6:15 gte) (lit 6:19 1) (lit 6:21 1))))
20+ (value 7:1 lte-less
21+ (group 7:13
22+ (call 7:14 (wing 7:14 lte) (lit 7:18 1) (lit 7:20 2))))
23+ (value 8:1 lte-greater
24+ (group 8:16
25+ (call 8:17 (wing 8:17 lte) (lit 8:21 2) (lit 8:23 1))))
26+ (value 9:1 lte-equal
27+ (group 9:14
28+ (call 9:15 (wing 9:15 lte) (lit 9:19 1) (lit 9:21 1))))
29+ (value 10:1 flags-forward
30+ (group 10:18
31+ (call 10:19 (wing 10:19 gte) (lit 10:23 %.y) (lit 10:27 %.n))))
32+ (value 11:1 flags-reverse
33+ (group 11:18
34+ (call 11:19 (wing 11:19 lte) (lit 11:23 %.n) (lit 11:27 %.y))))
35+ (value 12:1 flags-equal
36+ (group 12:16
37+ (call 12:17 (wing 12:17 lth) (lit 12:21 %.y) (lit 12:25 %.y))))
38+ (value 13:1 hex
39+ (group 13:8
40+ (call 13:9 (wing 13:9 lth) (lit 13:13 0x1) (lit 13:17 0x2))))
41+ (value 14:1 generic-lth
42+ (gate 14:16
43+ (cell 14:19
44+ (face 14:20 a (tvar 14:22 A))
45+ (face 14:24 b (tvar 14:26 A)))
46+ (group 14:29
47+ (call 14:30 (wing 14:30 lth) (wing 14:34 a) (wing 14:36 b)))))
48+ (value 15:1 generic-gte
49+ (gate 15:16
50+ (cell 15:19
51+ (face 15:20 a (tvar 15:22 A))
52+ (face 15:24 b (tvar 15:26 A)))
53+ (group 15:29
54+ (call 15:30 (wing 15:30 gte) (wing 15:34 a) (wing 15:36 b)))))
55+ (value 16:1 generic-lte
56+ (gate 16:16
57+ (cell 16:19
58+ (face 16:20 a (tvar 16:22 A))
59+ (face 16:24 b (tvar 16:26 A)))
60+ (group 16:29
61+ (call 16:30 (wing 16:30 lte) (wing 16:34 a) (wing 16:36 b)))))
62+ (value 17:1 bad-aura
63+ (group 17:13
64+ (call 17:14
65+ (wing 17:14 lth)
66+ (lit 17:18 0x1)
67+ (group 17:22
68+ (cast 17:23 (aura 17:26 @ud) (lit 17:30 1))))))
69+ (value 18:1 bad-kind
70+ (group 18:13
71+ (call 18:14 (wing 18:14 gte) (lit 18:18 ~zod) (str 18:23 "text")))))
tests/golden/types-prelude-comparison/types.txtnew file+31
@@ -0,0 +1,31 @@
1+partial inference; module not checked
2+++ less: ?
3+++ greater: ?
4+++ equal: ?
5+++ gte-less: ?
6+++ gte-greater: ?
7+++ gte-equal: ?
8+++ lte-less: ?
9+++ lte-greater: ?
10+++ lte-equal: ?
11+++ flags-forward: ?
12+++ flags-reverse: ?
13+++ flags-equal: ?
14+++ hex: ?
15+++ generic-lth: $-([a=A b=A] ?) where A is an atom
16+++ generic-gte: $-([a=A b=A] ?) where A is an atom
17+++ generic-lte: $-([a=A b=A] ?) where A is an atom
18+++ bad-aura: call's sample and argument types do not unify
19+/tests/golden/types-prelude-comparison/source.jibb:17:14: called gate has type $-([A A] ?) where A is an atom
20+++ bad-aura (lth 0x1 (^- @ud 1))
21+ ^
22+/tests/golden/types-prelude-comparison/source.jibb:17:18: argument has type [@ux @ud]
23+++ bad-aura (lth 0x1 (^- @ud 1))
24+ ^
25+++ bad-kind: call's sample and argument types do not unify
26+/tests/golden/types-prelude-comparison/source.jibb:18:14: called gate has type $-([A A] ?) where A is an atom
27+++ bad-kind (gte ~zod "text")
28+ ^
29+/tests/golden/types-prelude-comparison/source.jibb:18:18: argument has type [@p @t]
30+++ bad-kind (gte ~zod "text")
31+ ^
tests/golden/types-prelude-lead-late/about.txtnew file+4
@@ -0,0 +1,4 @@
1+source: docs/spec/overview.md, Prelude: "Hoon's standard library regrouped, written in Jibb"; Function helpers include section 2n.
2+tests: Source-backed curried lead and late infer independent argument types, reverse output positions correctly, and preserve generic gates as ordinary values. Explicit context accepts a null unit; an uncontextualized null remains unsupported and an incompatible annotated result reports its sites. This is a partial inference report; Jibb lowering, execution and jet recognition remain unverified.
3+expect: parses
4+expect-types: a partial inference report
tests/golden/types-prelude-lead-late/modules.txtnew file+1
@@ -0,0 +1 @@
1+# no module fixtures
tests/golden/types-prelude-lead-late/source.jibbnew file+10
@@ -0,0 +1,10 @@
1+++ text-ship ((lead "hi") ~zod)
2+++ ship-text ((late "hi") ~zod)
3+++ first-fn (lead "hi")
4+++ generic-lead |= [x=A y=B] ((lead x) y)
5+++ generic-late |= [x=A y=B] ((late x) y)
6+++ generic-gate |= [f=$-(A B) x=C] ((lead f) x)
7+++ reversed-gate |= [f=$-(A B) x=C] ((late f) x)
8+++ null-lead ((lead (^- (unit @t) ~)) "tail")
9+++ unresolved ((lead ~) "tail")
10+++ bad ^- [@p @t] ((lead "hi") ~zod)
tests/golden/types-prelude-lead-late/tokens.txtnew file+151
@@ -0,0 +1,151 @@
1+1:1 glyph ++
2+1:4 name text-ship
3+1:14 glyph (
4+1:15 tight glyph (
5+1:16 tight name lead
6+1:21 str "hi"
7+1:25 tight glyph )
8+1:27 lit ~zod
9+1:31 tight glyph )
10+2:1 NEWLINE
11+2:1 glyph ++
12+2:4 name ship-text
13+2:14 glyph (
14+2:15 tight glyph (
15+2:16 tight name late
16+2:21 str "hi"
17+2:25 tight glyph )
18+2:27 lit ~zod
19+2:31 tight glyph )
20+3:1 NEWLINE
21+3:1 glyph ++
22+3:4 name first-fn
23+3:13 glyph (
24+3:14 tight name lead
25+3:19 str "hi"
26+3:23 tight glyph )
27+4:1 NEWLINE
28+4:1 glyph ++
29+4:4 name generic-lead
30+4:17 glyph |=
31+4:20 glyph [
32+4:21 tight name x
33+4:22 tight glyph =
34+4:23 tight tvar A
35+4:25 name y
36+4:26 tight glyph =
37+4:27 tight tvar B
38+4:28 tight glyph ]
39+4:30 glyph (
40+4:31 tight glyph (
41+4:32 tight name lead
42+4:37 name x
43+4:38 tight glyph )
44+4:40 name y
45+4:41 tight glyph )
46+5:1 NEWLINE
47+5:1 glyph ++
48+5:4 name generic-late
49+5:17 glyph |=
50+5:20 glyph [
51+5:21 tight name x
52+5:22 tight glyph =
53+5:23 tight tvar A
54+5:25 name y
55+5:26 tight glyph =
56+5:27 tight tvar B
57+5:28 tight glyph ]
58+5:30 glyph (
59+5:31 tight glyph (
60+5:32 tight name late
61+5:37 name x
62+5:38 tight glyph )
63+5:40 name y
64+5:41 tight glyph )
65+6:1 NEWLINE
66+6:1 glyph ++
67+6:4 name generic-gate
68+6:17 glyph |=
69+6:20 glyph [
70+6:21 tight name f
71+6:22 tight glyph =
72+6:23 tight glyph $-(
73+6:26 tight tvar A
74+6:28 tvar B
75+6:29 tight glyph )
76+6:31 name x
77+6:32 tight glyph =
78+6:33 tight tvar C
79+6:34 tight glyph ]
80+6:36 glyph (
81+6:37 tight glyph (
82+6:38 tight name lead
83+6:43 name f
84+6:44 tight glyph )
85+6:46 name x
86+6:47 tight glyph )
87+7:1 NEWLINE
88+7:1 glyph ++
89+7:4 name reversed-gate
90+7:18 glyph |=
91+7:21 glyph [
92+7:22 tight name f
93+7:23 tight glyph =
94+7:24 tight glyph $-(
95+7:27 tight tvar A
96+7:29 tvar B
97+7:30 tight glyph )
98+7:32 name x
99+7:33 tight glyph =
100+7:34 tight tvar C
101+7:35 tight glyph ]
102+7:37 glyph (
103+7:38 tight glyph (
104+7:39 tight name late
105+7:44 name f
106+7:45 tight glyph )
107+7:47 name x
108+7:48 tight glyph )
109+8:1 NEWLINE
110+8:1 glyph ++
111+8:4 name null-lead
112+8:14 glyph (
113+8:15 tight glyph (
114+8:16 tight name lead
115+8:21 glyph (
116+8:22 tight glyph ^-
117+8:25 glyph (
118+8:26 tight name unit
119+8:31 aura @t
120+8:33 tight glyph )
121+8:35 lit ~
122+8:36 tight glyph )
123+8:37 tight glyph )
124+8:39 str "tail"
125+8:45 tight glyph )
126+9:1 NEWLINE
127+9:1 glyph ++
128+9:4 name unresolved
129+9:15 glyph (
130+9:16 tight glyph (
131+9:17 tight name lead
132+9:22 lit ~
133+9:23 tight glyph )
134+9:25 str "tail"
135+9:31 tight glyph )
136+10:1 NEWLINE
137+10:1 glyph ++
138+10:4 name bad
139+10:8 glyph ^-
140+10:11 glyph [
141+10:12 tight aura @p
142+10:15 aura @t
143+10:17 tight glyph ]
144+10:19 glyph (
145+10:20 tight glyph (
146+10:21 tight name lead
147+10:26 str "hi"
148+10:30 tight glyph )
149+10:32 lit ~zod
150+10:36 tight glyph )
151+10:37 NEWLINE
tests/golden/types-prelude-lead-late/tree.txtnew file+83
@@ -0,0 +1,83 @@
1+(module
2+ (value 1:1 text-ship
3+ (group 1:14
4+ (call 1:15
5+ (group 1:15
6+ (call 1:16 (wing 1:16 lead) (str 1:21 "hi")))
7+ (lit 1:27 ~zod))))
8+ (value 2:1 ship-text
9+ (group 2:14
10+ (call 2:15
11+ (group 2:15
12+ (call 2:16 (wing 2:16 late) (str 2:21 "hi")))
13+ (lit 2:27 ~zod))))
14+ (value 3:1 first-fn
15+ (group 3:13
16+ (call 3:14 (wing 3:14 lead) (str 3:19 "hi"))))
17+ (value 4:1 generic-lead
18+ (gate 4:17
19+ (cell 4:20
20+ (face 4:21 x (tvar 4:23 A))
21+ (face 4:25 y (tvar 4:27 B)))
22+ (group 4:30
23+ (call 4:31
24+ (group 4:31
25+ (call 4:32 (wing 4:32 lead) (wing 4:37 x)))
26+ (wing 4:40 y)))))
27+ (value 5:1 generic-late
28+ (gate 5:17
29+ (cell 5:20
30+ (face 5:21 x (tvar 5:23 A))
31+ (face 5:25 y (tvar 5:27 B)))
32+ (group 5:30
33+ (call 5:31
34+ (group 5:31
35+ (call 5:32 (wing 5:32 late) (wing 5:37 x)))
36+ (wing 5:40 y)))))
37+ (value 6:1 generic-gate
38+ (gate 6:17
39+ (cell 6:20
40+ (face 6:21 f
41+ (fn 6:23 (tvar 6:26 A) (tvar 6:28 B)))
42+ (face 6:31 x (tvar 6:33 C)))
43+ (group 6:36
44+ (call 6:37
45+ (group 6:37
46+ (call 6:38 (wing 6:38 lead) (wing 6:43 f)))
47+ (wing 6:46 x)))))
48+ (value 7:1 reversed-gate
49+ (gate 7:18
50+ (cell 7:21
51+ (face 7:22 f
52+ (fn 7:24 (tvar 7:27 A) (tvar 7:29 B)))
53+ (face 7:32 x (tvar 7:34 C)))
54+ (group 7:37
55+ (call 7:38
56+ (group 7:38
57+ (call 7:39 (wing 7:39 late) (wing 7:44 f)))
58+ (wing 7:47 x)))))
59+ (value 8:1 null-lead
60+ (group 8:14
61+ (call 8:15
62+ (group 8:15
63+ (call 8:16
64+ (wing 8:16 lead)
65+ (group 8:21
66+ (cast 8:22
67+ (apply 8:25 unit (aura 8:31 @t))
68+ (lit 8:35 ~)))))
69+ (str 8:39 "tail"))))
70+ (value 9:1 unresolved
71+ (group 9:15
72+ (call 9:16
73+ (group 9:16
74+ (call 9:17 (wing 9:17 lead) (lit 9:22 ~)))
75+ (str 9:25 "tail"))))
76+ (value 10:1 bad
77+ (cast 10:8
78+ (cell 10:11 (aura 10:12 @p) (aura 10:15 @t))
79+ (group 10:19
80+ (call 10:20
81+ (group 10:20
82+ (call 10:21 (wing 10:21 lead) (str 10:26 "hi")))
83+ (lit 10:32 ~zod))))))
tests/golden/types-prelude-lead-late/types.txtnew file+17
@@ -0,0 +1,17 @@
1+partial inference; module not checked
2+++ text-ship: [@t @p]
3+++ ship-text: [@p @t]
4+++ first-fn: $-(A [@t A])
5+++ generic-lead: $-([x=A y=B] [A B])
6+++ generic-late: $-([x=A y=B] [B A])
7+++ generic-gate: $-([f=$-(A B) x=C] [$-(A B) C])
8+++ reversed-gate: $-([f=$-(A B) x=C] [C $-(A B)])
9+++ null-lead: [(unit @t) @t]
10+++ unresolved: `~` needs context in partial inference
11+++ bad: cast mold and expression type do not unify
12+/tests/golden/types-prelude-lead-late/source.jibb:10:11: cast mold has type [@p @t]
13+++ bad ^- [@p @t] ((lead "hi") ~zod)
14+ ^
15+/tests/golden/types-prelude-lead-late/source.jibb:10:19: expression has type [@t @p]
16+++ bad ^- [@p @t] ((lead "hi") ~zod)
17+ ^
tests/golden/types-prelude-lent/about.txtnew file+4
@@ -0,0 +1,4 @@
1+source: docs/spec/overview.md, The prelude: "Lists | 2b | turn, weld, snag, lent, sort, skim"
2+tests: Source-backed lent checks empty and cons lists, values of different element types including gates, and an independently generic list argument; a non-list fails with both sites. The source implements length by recursion and addition. This checks partial inference only; lowering, execution and jet recognition remain unfinished.
3+expect: parses
4+expect-types: a partial inference report
tests/golden/types-prelude-lent/modules.txtnew file+1
@@ -0,0 +1 @@
1+# no module fixtures
tests/golden/types-prelude-lent/source.jibbnew file+8
@@ -0,0 +1,8 @@
1+++ empty (lent ~)
2+++ singleton (lent ~["a"])
3+++ cons (lent ["a" ~])
4+++ numbers (lent ~[1 2])
5+++ ships (lent ~[~zod ~nec])
6+++ gate-list (lent ~[same])
7+++ generic |= xs=(list A) (lent xs)
8+++ bad (lent "not a list")
tests/golden/types-prelude-lent/tokens.txtnew file+76
@@ -0,0 +1,76 @@
1+1:1 glyph ++
2+1:4 name empty
3+1:10 glyph (
4+1:11 tight name lent
5+1:16 lit ~
6+1:17 tight glyph )
7+2:1 NEWLINE
8+2:1 glyph ++
9+2:4 name singleton
10+2:14 glyph (
11+2:15 tight name lent
12+2:20 glyph ~[
13+2:22 tight str "a"
14+2:25 tight glyph ]
15+2:26 tight glyph )
16+3:1 NEWLINE
17+3:1 glyph ++
18+3:4 name cons
19+3:9 glyph (
20+3:10 tight name lent
21+3:15 glyph [
22+3:16 tight str "a"
23+3:20 lit ~
24+3:21 tight glyph ]
25+3:22 tight glyph )
26+4:1 NEWLINE
27+4:1 glyph ++
28+4:4 name numbers
29+4:12 glyph (
30+4:13 tight name lent
31+4:18 glyph ~[
32+4:20 tight lit 1
33+4:22 lit 2
34+4:23 tight glyph ]
35+4:24 tight glyph )
36+5:1 NEWLINE
37+5:1 glyph ++
38+5:4 name ships
39+5:10 glyph (
40+5:11 tight name lent
41+5:16 glyph ~[
42+5:18 tight lit ~zod
43+5:23 lit ~nec
44+5:27 tight glyph ]
45+5:28 tight glyph )
46+6:1 NEWLINE
47+6:1 glyph ++
48+6:4 name gate-list
49+6:14 glyph (
50+6:15 tight name lent
51+6:20 glyph ~[
52+6:22 tight name same
53+6:26 tight glyph ]
54+6:27 tight glyph )
55+7:1 NEWLINE
56+7:1 glyph ++
57+7:4 name generic
58+7:12 glyph |=
59+7:15 name xs
60+7:17 tight glyph =
61+7:18 tight glyph (
62+7:19 tight name list
63+7:24 tvar A
64+7:25 tight glyph )
65+7:27 glyph (
66+7:28 tight name lent
67+7:33 name xs
68+7:35 tight glyph )
69+8:1 NEWLINE
70+8:1 glyph ++
71+8:4 name bad
72+8:8 glyph (
73+8:9 tight name lent
74+8:14 str "not a list"
75+8:26 tight glyph )
76+8:27 NEWLINE
tests/golden/types-prelude-lent/tree.txtnew file+38
@@ -0,0 +1,38 @@
1+(module
2+ (value 1:1 empty
3+ (group 1:10
4+ (call 1:11 (wing 1:11 lent) (lit 1:16 ~))))
5+ (value 2:1 singleton
6+ (group 2:14
7+ (call 2:15
8+ (wing 2:15 lent)
9+ (list 2:20 (str 2:22 "a")))))
10+ (value 3:1 cons
11+ (group 3:9
12+ (call 3:10
13+ (wing 3:10 lent)
14+ (tuple 3:15 (str 3:16 "a") (lit 3:20 ~)))))
15+ (value 4:1 numbers
16+ (group 4:12
17+ (call 4:13
18+ (wing 4:13 lent)
19+ (list 4:18 (lit 4:20 1) (lit 4:22 2)))))
20+ (value 5:1 ships
21+ (group 5:10
22+ (call 5:11
23+ (wing 5:11 lent)
24+ (list 5:16 (lit 5:18 ~zod) (lit 5:23 ~nec)))))
25+ (value 6:1 gate-list
26+ (group 6:14
27+ (call 6:15
28+ (wing 6:15 lent)
29+ (list 6:20 (wing 6:22 same)))))
30+ (value 7:1 generic
31+ (gate 7:12
32+ (face 7:15 xs
33+ (apply 7:18 list (tvar 7:24 A)))
34+ (group 7:27
35+ (call 7:28 (wing 7:28 lent) (wing 7:33 xs)))))
36+ (value 8:1 bad
37+ (group 8:8
38+ (call 8:9 (wing 8:9 lent) (str 8:14 "not a list")))))
tests/golden/types-prelude-lent/types.txtnew file+15
@@ -0,0 +1,15 @@
1+partial inference; module not checked
2+++ empty: @ud
3+++ singleton: @ud
4+++ cons: @ud
5+++ numbers: @ud
6+++ ships: @ud
7+++ gate-list: @ud
8+++ generic: $-((list A) @ud)
9+++ bad: call's sample and argument types do not unify
10+/tests/golden/types-prelude-lent/source.jibb:8:9: called gate has type $-((list A) @ud)
11+++ bad (lent "not a list")
12+ ^
13+/tests/golden/types-prelude-lent/source.jibb:8:14: argument has type @t
14+++ bad (lent "not a list")
15+ ^
tests/golden/types-prelude-list-alias/source.jibb+1−1
@@ -2,6 +2,6 @@
2++ path-id |= x=path x
2++ path-id |= x=path x
3++ tape-id |= x=tape x
3++ tape-id |= x=tape x
4++ spot-id |= x=spot x
4++ spot-id |= x=spot x
5−++ text |= x=(bag @t) x
5+++ text-value |= x=(bag @t) x
6++ ship |= x=(bag @p) x
6++ ship |= x=(bag @p) x
7++ wrong ^- (bag @t) ~[~zod]
7++ wrong ^- (bag @t) ~[~zod]
tests/golden/types-prelude-list-alias/tokens.txt+9−9
@@ -34,15 +34,15 @@
344:22 name x
344:22 name x
355:1 NEWLINE
355:1 NEWLINE
365:1 glyph ++
365:1 glyph ++
37−5:4 name text
37+5:4 name text-value
38−5:9 glyph |=
38+5:15 glyph |=
39−5:12 name x
39+5:18 name x
40−5:13 tight glyph =
40+5:19 tight glyph =
41−5:14 tight glyph (
41+5:20 tight glyph (
42−5:15 tight name bag
42+5:21 tight name bag
43−5:19 aura @t
43+5:25 aura @t
44−5:21 tight glyph )
44+5:27 tight glyph )
45−5:23 name x
45+5:29 name x
466:1 NEWLINE
466:1 NEWLINE
476:1 glyph ++
476:1 glyph ++
486:4 name ship
486:4 name ship
tests/golden/types-prelude-list-alias/tree.txt+5−5
@@ -14,11 +14,11 @@
14 (gate 4:12
14 (gate 4:12
15 (face 4:15 x (ref 4:17 spot))
15 (face 4:15 x (ref 4:17 spot))
16 (wing 4:22 x)))
16 (wing 4:22 x)))
17− (value 5:1 text
17+ (value 5:1 text-value
18− (gate 5:9
18+ (gate 5:15
19− (face 5:12 x
19+ (face 5:18 x
20− (apply 5:14 bag (aura 5:19 @t)))
20+ (apply 5:20 bag (aura 5:25 @t)))
21− (wing 5:23 x)))
21+ (wing 5:29 x)))
22 (value 6:1 ship
22 (value 6:1 ship
23 (gate 6:9
23 (gate 6:9
24 (face 6:12 x
24 (face 6:12 x
tests/golden/types-prelude-list-alias/types.txt+1−1
@@ -3,7 +3,7 @@ partial inference; module not checked
3++ path-id: $-((list @ta) (list @ta))
3++ path-id: $-((list @ta) (list @ta))
4++ tape-id: $-((list @tD) (list @tD))
4++ tape-id: $-((list @tD) (list @tD))
5++ spot-id: $-([p=(list @ta) q=[p=[p=@ q=@] q=[p=@ q=@]]] [p=(list @ta) q=[p=[p=@ q=@] q=[p=@ q=@]]])
5++ spot-id: $-([p=(list @ta) q=[p=[p=@ q=@] q=[p=@ q=@]]] [p=(list @ta) q=[p=[p=@ q=@] q=[p=@ q=@]]])
6−++ text: $-((list @t) (list @t))
6+++ text-value: $-((list @t) (list @t))
7++ ship: $-((list @p) (list @p))
7++ ship: $-((list @p) (list @p))
8++ wrong: list item does not fit its expected type
8++ wrong: list item does not fit its expected type
9/tests/golden/types-prelude-list-alias/source.jibb:7:13: expected item has type @t
9/tests/golden/types-prelude-list-alias/source.jibb:7:13: expected item has type @t
tests/golden/types-prelude-succ/about.txtnew file+4
@@ -0,0 +1,4 @@
1+source: Overview, Prelude: “Hoon's standard library regrouped, written in Jibb”; Decisions, Loobean arithmetic: “Arithmetic rejects loobean operands”.
2+tests: The source-backed successor preserves a shared atom aura, accepts decimal and hexadecimal atoms, infers a generic arithmetic constraint and rejects a loobean. This is a partial inference report; Jibb execution and jet recognition remain unverified.
3+expect: parses
4+expect-types: a partial inference report
tests/golden/types-prelude-succ/modules.txtnew file+1
@@ -0,0 +1 @@
1+# no module fixtures
tests/golden/types-prelude-succ/source.jibbnew file+4
@@ -0,0 +1,4 @@
1+++ n (succ 1)
2+++ hx (succ 0x1f)
3+++ generic |= x=A (succ x)
4+++ bad (succ %.y)
tests/golden/types-prelude-succ/tokens.txtnew file+32
@@ -0,0 +1,32 @@
1+1:1 glyph ++
2+1:4 name n
3+1:6 glyph (
4+1:7 tight name succ
5+1:12 lit 1
6+1:13 tight glyph )
7+2:1 NEWLINE
8+2:1 glyph ++
9+2:4 name hx
10+2:7 glyph (
11+2:8 tight name succ
12+2:13 lit 0x1f
13+2:17 tight glyph )
14+3:1 NEWLINE
15+3:1 glyph ++
16+3:4 name generic
17+3:12 glyph |=
18+3:15 name x
19+3:16 tight glyph =
20+3:17 tight tvar A
21+3:19 glyph (
22+3:20 tight name succ
23+3:25 name x
24+3:26 tight glyph )
25+4:1 NEWLINE
26+4:1 glyph ++
27+4:4 name bad
28+4:8 glyph (
29+4:9 tight name succ
30+4:14 lit %.y
31+4:17 tight glyph )
32+4:18 NEWLINE
tests/golden/types-prelude-succ/tree.txtnew file+15
@@ -0,0 +1,15 @@
1+(module
2+ (value 1:1 n
3+ (group 1:6
4+ (call 1:7 (wing 1:7 succ) (lit 1:12 1))))
5+ (value 2:1 hx
6+ (group 2:7
7+ (call 2:8 (wing 2:8 succ) (lit 2:13 0x1f))))
8+ (value 3:1 generic
9+ (gate 3:12
10+ (face 3:15 x (tvar 3:17 A))
11+ (group 3:19
12+ (call 3:20 (wing 3:20 succ) (wing 3:25 x)))))
13+ (value 4:1 bad
14+ (group 4:8
15+ (call 4:9 (wing 4:9 succ) (lit 4:14 %.y)))))
tests/golden/types-prelude-succ/types.txtnew file+11
@@ -0,0 +1,11 @@
1+partial inference; module not checked
2+++ n: @ud
3+++ hx: @ux
4+++ generic: $-(A A) where A is an atom other than ?
5+++ bad: call's sample and argument types do not unify
6+/tests/golden/types-prelude-succ/source.jibb:4:9: called gate has type $-(A A) where A is an atom other than ?
7+++ bad (succ %.y)
8+ ^
9+/tests/golden/types-prelude-succ/source.jibb:4:14: argument has type ?
10+++ bad (succ %.y)
11+ ^
tests/golden/types-prelude-text/about.txtnew file+4
@@ -0,0 +1,4 @@
1+source: docs/spec/overview.md, Prelude: "Text ... crip, trip, cass, cuss, trim, tufa, tuba"; the target ship's Hoon 135 definitions give trip and tuba their tape and UTF-32 types.
2+tests: Source-backed trip and tuba wrappers preserve cord, tape and UTF-32 list types through composition and generic list length. Empty input infers; non-cord and non-tape arguments fail. Primitive lowering and execution remain unfinished. The module report is partial.
3+expect: parses
4+expect-types: a partial inference report
tests/golden/types-prelude-text/modules.txtnew file+1
@@ -0,0 +1 @@
1+# no module fixtures
tests/golden/types-prelude-text/source.jibbnew file+8
@@ -0,0 +1,8 @@
1+++ to-tape (trip "abc")
2+++ to-codepoints (tuba (trip "abc"))
3+++ empty-codepoints (tuba ~)
4+++ count-codepoints |= value=@t
5+ (lent (tuba (trip value)))
6+++ bad-trip (trip ~zod)
7+++ bad-tuba (tuba "abc")
8+++ bad-tuba-items (tuba ~[~zod])
tests/golden/types-prelude-text/tokens.txtnew file+66
@@ -0,0 +1,66 @@
1+1:1 glyph ++
2+1:4 name to-tape
3+1:12 glyph (
4+1:13 tight name trip
5+1:18 str "abc"
6+1:23 tight glyph )
7+2:1 NEWLINE
8+2:1 glyph ++
9+2:4 name to-codepoints
10+2:18 glyph (
11+2:19 tight name tuba
12+2:24 glyph (
13+2:25 tight name trip
14+2:30 str "abc"
15+2:35 tight glyph )
16+2:36 tight glyph )
17+3:1 NEWLINE
18+3:1 glyph ++
19+3:4 name empty-codepoints
20+3:21 glyph (
21+3:22 tight name tuba
22+3:27 lit ~
23+3:28 tight glyph )
24+4:1 NEWLINE
25+4:1 glyph ++
26+4:4 name count-codepoints
27+4:21 glyph |=
28+4:24 name value
29+4:29 tight glyph =
30+4:30 tight aura @t
31+5:3 INDENT
32+5:3 glyph (
33+5:4 tight name lent
34+5:9 glyph (
35+5:10 tight name tuba
36+5:15 glyph (
37+5:16 tight name trip
38+5:21 name value
39+5:26 tight glyph )
40+5:27 tight glyph )
41+5:28 tight glyph )
42+6:1 DEDENT
43+6:1 NEWLINE
44+6:1 glyph ++
45+6:4 name bad-trip
46+6:13 glyph (
47+6:14 tight name trip
48+6:19 lit ~zod
49+6:23 tight glyph )
50+7:1 NEWLINE
51+7:1 glyph ++
52+7:4 name bad-tuba
53+7:13 glyph (
54+7:14 tight name tuba
55+7:19 str "abc"
56+7:24 tight glyph )
57+8:1 NEWLINE
58+8:1 glyph ++
59+8:4 name bad-tuba-items
60+8:19 glyph (
61+8:20 tight name tuba
62+8:25 glyph ~[
63+8:27 tight lit ~zod
64+8:31 tight glyph ]
65+8:32 tight glyph )
66+8:33 NEWLINE
tests/golden/types-prelude-text/tree.txtnew file+36
@@ -0,0 +1,36 @@
1+(module
2+ (value 1:1 to-tape
3+ (group 1:12
4+ (call 1:13 (wing 1:13 trip) (str 1:18 "abc"))))
5+ (value 2:1 to-codepoints
6+ (group 2:18
7+ (call 2:19
8+ (wing 2:19 tuba)
9+ (group 2:24
10+ (call 2:25 (wing 2:25 trip) (str 2:30 "abc"))))))
11+ (value 3:1 empty-codepoints
12+ (group 3:21
13+ (call 3:22 (wing 3:22 tuba) (lit 3:27 ~))))
14+ (value 4:1 count-codepoints
15+ (gate 4:21
16+ (face 4:24 value (aura 4:30 @t))
17+ (body 5:3
18+ (group 5:3
19+ (call 5:4
20+ (wing 5:4 lent)
21+ (group 5:9
22+ (call 5:10
23+ (wing 5:10 tuba)
24+ (group 5:15
25+ (call 5:16 (wing 5:16 trip) (wing 5:21 value))))))))))
26+ (value 6:1 bad-trip
27+ (group 6:13
28+ (call 6:14 (wing 6:14 trip) (lit 6:19 ~zod))))
29+ (value 7:1 bad-tuba
30+ (group 7:13
31+ (call 7:14 (wing 7:14 tuba) (str 7:19 "abc"))))
32+ (value 8:1 bad-tuba-items
33+ (group 8:19
34+ (call 8:20
35+ (wing 8:20 tuba)
36+ (list 8:25 (lit 8:27 ~zod))))))
tests/golden/types-prelude-text/types.txtnew file+26
@@ -0,0 +1,26 @@
1+partial inference; module not checked
2+++ to-tape: (list @tD)
3+++ to-codepoints: (list @c)
4+++ empty-codepoints: (list @c)
5+++ count-codepoints: $-(@t @ud)
6+++ bad-trip: call's sample and argument types do not unify
7+/tests/golden/types-prelude-text/source.jibb:6:14: called gate has type $-(@t (list @tD))
8+++ bad-trip (trip ~zod)
9+ ^
10+/tests/golden/types-prelude-text/source.jibb:6:19: argument has type @p
11+++ bad-trip (trip ~zod)
12+ ^
13+++ bad-tuba: call's sample and argument types do not unify
14+/tests/golden/types-prelude-text/source.jibb:7:14: called gate has type $-((list @tD) (list @c))
15+++ bad-tuba (tuba "abc")
16+ ^
17+/tests/golden/types-prelude-text/source.jibb:7:19: argument has type @t
18+++ bad-tuba (tuba "abc")
19+ ^
20+++ bad-tuba-items: list item does not fit its expected type
21+/tests/golden/types-prelude-text/source.jibb:8:20: expected item has type @tD
22+++ bad-tuba-items (tuba ~[~zod])
23+ ^
24+/tests/golden/types-prelude-text/source.jibb:8:27: list item has type @p
25+++ bad-tuba-items (tuba ~[~zod])
26+ ^
tests/golden/types-prelude-ui/about.txtnew file+4
@@ -0,0 +1,4 @@
1+source: docs/spec/overview.md, Prelude, The Elm architecture on Urbit, and Layout and styling.
2+tests: Exact source-backed UI/program/page constructor schemes; static and message-bearing composition; concrete islands and pages; invalid attributes, malformed keyed/table inputs, child-message mismatch, mismatched island data, and ordinary inference of a concrete raw element constructor. Nested element payloads are erased only in the nonrecursive runtime mold, not in public constructor signatures.
3+expect: parses
4+expect-types: supported declarations infer exact types and invalid compositions report errors; the child-message mismatch fails closed as an unsupported constraint. No raw-constructor encapsulation, duplicate-attribute check, rendering, navigation, storage, or execution is claimed.
tests/golden/types-prelude-ui/modules.txtnew file+1
@@ -0,0 +1 @@
1+# no module fixtures
tests/golden/types-prelude-ui/source.jibbnew file+78
@@ -0,0 +1,78 @@
1++$ msg
2+ %save
3+ %toggle
4+ [%edited value=@t]
5++$ model [count=@ud]
6+
7+++ row-scheme row
8+++ column-scheme column
9+++ wrap-scheme wrap
10+++ stack-scheme stack
11+++ el-scheme el
12+++ para-scheme para
13+++ text-scheme text
14+++ heading-scheme heading
15+++ each-scheme each
16+++ table-scheme table
17+++ image-scheme image
18+++ image-unsafe-scheme image-unsafe
19+++ link-scheme link
20+++ link-unsafe-scheme link-unsafe
21+++ button-scheme button
22+++ toggle-scheme toggle
23+++ field-scheme field
24+++ form-scheme form
25+++ island-scheme island
26+++ program-scheme program
27+++ page-scheme page
28+
29+++ static-text ^- (element !!) (text "hello")
30+++ raw-text ^- (element !!) (row ~ ~[[%text "raw"]])
31+++ static-ui ^- (element !!)
32+ column ~[pad+%s1 gap+%s2 width+[%fill 1] align+%center role+%body tone+%muted] ~[
33+ text "one"
34+ para ~[(text "two")]
35+ heading 2 "heading"
36+++ static-media ^- (element !!)
37+ stack ~[width+[%chars 20]] ~[
38+ image %/images/logo.png "Logo"
39+ link %/home "Home"
40+++ unsafe-media ^- (element !!)
41+ wrap ~[width+%shrink role+%caption tone+%accent] ~[
42+ image-unsafe [url="https://example.com/a.png" width=20 height=10] "Remote"
43+ link-unsafe "/elsewhere" "Elsewhere"
44+++ save-message ^- msg %save
45+++ toggle-message ^- msg %toggle
46+++ save-button ^- (element msg) (button "Save" save-message)
47+++ enabled-toggle ^- (element msg) (toggle %.y "Enabled" toggle-message)
48+++ edit-message |= value=@t ^- msg [%edited value]
49+++ name-field ^- (element msg) (field "Name" "value" edit-message)
50+++ controls ^- (element msg)
51+ (form save-message ~[save-button enabled-toggle name-field])
52+++ keyed |= items=(list [key=@t el=(element msg)])
53+ ^- (element msg) (each items)
54+++ tabular |= rows=(list [key=@ud cells=(list (element msg))])
55+ ^- (element msg)
56+ (table ~[[header="Name" width=[%fill 1] align=%start]] rows)
57+
58+++ bad-pad ^- (element !!) (row ~[pad+%s4] ~)
59+++ bad-width ^- (element !!) (row ~[width+[%chars "wide"]] ~)
60+++ malformed-each ^- (element msg) (each ~[[key="row" kid=(text "child")]])
61+++ malformed-table ^- (element msg)
62+ (table ~[[header="Name" width=%shrink]] ~)
63+++ ship-control ^- (element @p) (button "Ship" ~zod)
64+++ text-row |= kids=(list (element @t)) ^- (element @t) (row ~ kids)
65+++ bad-child (text-row ~[ship-control])
66+
67+++ init |= input=@t ^- model [count=0]
68+++ update |= [message=msg state=model]
69+ ^- [model (list (cmd msg))] [state ~]
70+++ view |= state=model ^- (element msg) (controls)
71+++ subs |= state=model ^- (list (sub msg)) ~
72+++ concrete-program ^- (program @t model msg) (program init update view subs)
73+++ embedded ^- (element !!) (island concrete-program "seed")
74+++ mismatched-island-data ^- (element !!) (island concrete-program ~zod)
75+
76+++ load |= route=@t ^- (ask model) (pure [count=0])
77+++ page-view |= data=model ^- (element !!) (text "page")
78+++ static-page ^- (page @t model) (page load page-view)
tests/golden/types-prelude-ui/tokens.txtnew file+728
@@ -0,0 +1,728 @@
1+1:1 glyph +$
2+1:4 name msg
3+2:3 INDENT
4+2:3 lit %save
5+3:3 NEWLINE
6+3:3 lit %toggle
7+4:3 NEWLINE
8+4:3 glyph [
9+4:4 tight lit %edited
10+4:12 name value
11+4:17 tight glyph =
12+4:18 tight aura @t
13+4:20 tight glyph ]
14+5:1 DEDENT
15+5:1 NEWLINE
16+5:1 glyph +$
17+5:4 name model
18+5:10 glyph [
19+5:11 tight name count
20+5:16 tight glyph =
21+5:17 tight aura @ud
22+5:20 tight glyph ]
23+7:1 NEWLINE
24+7:1 glyph ++
25+7:4 name row-scheme
26+7:15 name row
27+8:1 NEWLINE
28+8:1 glyph ++
29+8:4 name column-scheme
30+8:18 name column
31+9:1 NEWLINE
32+9:1 glyph ++
33+9:4 name wrap-scheme
34+9:16 name wrap
35+10:1 NEWLINE
36+10:1 glyph ++
37+10:4 name stack-scheme
38+10:17 name stack
39+11:1 NEWLINE
40+11:1 glyph ++
41+11:4 name el-scheme
42+11:14 name el
43+12:1 NEWLINE
44+12:1 glyph ++
45+12:4 name para-scheme
46+12:16 name para
47+13:1 NEWLINE
48+13:1 glyph ++
49+13:4 name text-scheme
50+13:16 name text
51+14:1 NEWLINE
52+14:1 glyph ++
53+14:4 name heading-scheme
54+14:19 name heading
55+15:1 NEWLINE
56+15:1 glyph ++
57+15:4 name each-scheme
58+15:16 name each
59+16:1 NEWLINE
60+16:1 glyph ++
61+16:4 name table-scheme
62+16:17 name table
63+17:1 NEWLINE
64+17:1 glyph ++
65+17:4 name image-scheme
66+17:17 name image
67+18:1 NEWLINE
68+18:1 glyph ++
69+18:4 name image-unsafe-scheme
70+18:24 name image-unsafe
71+19:1 NEWLINE
72+19:1 glyph ++
73+19:4 name link-scheme
74+19:16 name link
75+20:1 NEWLINE
76+20:1 glyph ++
77+20:4 name link-unsafe-scheme
78+20:23 name link-unsafe
79+21:1 NEWLINE
80+21:1 glyph ++
81+21:4 name button-scheme
82+21:18 name button
83+22:1 NEWLINE
84+22:1 glyph ++
85+22:4 name toggle-scheme
86+22:18 name toggle
87+23:1 NEWLINE
88+23:1 glyph ++
89+23:4 name field-scheme
90+23:17 name field
91+24:1 NEWLINE
92+24:1 glyph ++
93+24:4 name form-scheme
94+24:16 name form
95+25:1 NEWLINE
96+25:1 glyph ++
97+25:4 name island-scheme
98+25:18 name island
99+26:1 NEWLINE
100+26:1 glyph ++
101+26:4 name program-scheme
102+26:19 name program
103+27:1 NEWLINE
104+27:1 glyph ++
105+27:4 name page-scheme
106+27:16 name page
107+29:1 NEWLINE
108+29:1 glyph ++
109+29:4 name static-text
110+29:16 glyph ^-
111+29:19 glyph (
112+29:20 tight name element
113+29:28 glyph !!
114+29:30 tight glyph )
115+29:32 glyph (
116+29:33 tight name text
117+29:38 str "hello"
118+29:45 tight glyph )
119+30:1 NEWLINE
120+30:1 glyph ++
121+30:4 name raw-text
122+30:13 glyph ^-
123+30:16 glyph (
124+30:17 tight name element
125+30:25 glyph !!
126+30:27 tight glyph )
127+30:29 glyph (
128+30:30 tight name row
129+30:34 lit ~
130+30:36 glyph ~[
131+30:38 tight glyph [
132+30:39 tight lit %text
133+30:45 str "raw"
134+30:50 tight glyph ]
135+30:51 tight glyph ]
136+30:52 tight glyph )
137+31:1 NEWLINE
138+31:1 glyph ++
139+31:4 name static-ui
140+31:14 glyph ^-
141+31:17 glyph (
142+31:18 tight name element
143+31:26 glyph !!
144+31:28 tight glyph )
145+32:3 INDENT
146+32:3 name column
147+32:10 glyph ~[
148+32:12 tight name pad
149+32:15 tight glyph +
150+32:16 tight lit %s1
151+32:20 name gap
152+32:23 tight glyph +
153+32:24 tight lit %s2
154+32:28 name width
155+32:33 tight glyph +
156+32:34 tight glyph [
157+32:35 tight lit %fill
158+32:41 lit 1
159+32:42 tight glyph ]
160+32:44 name align
161+32:49 tight glyph +
162+32:50 tight lit %center
163+32:58 name role
164+32:62 tight glyph +
165+32:63 tight lit %body
166+32:69 name tone
167+32:73 tight glyph +
168+32:74 tight lit %muted
169+32:80 tight glyph ]
170+32:82 glyph ~[
171+33:5 INDENT
172+33:5 name text
173+33:10 str "one"
174+34:5 NEWLINE
175+34:5 name para
176+34:10 glyph ~[
177+34:12 tight glyph (
178+34:13 tight name text
179+34:18 str "two"
180+34:23 tight glyph )
181+34:24 tight glyph ]
182+35:5 NEWLINE
183+35:5 name heading
184+35:13 lit 2
185+35:15 str "heading"
186+36:1 DEDENT
187+36:1 DEDENT
188+36:1 NEWLINE
189+36:1 glyph ++
190+36:4 name static-media
191+36:17 glyph ^-
192+36:20 glyph (
193+36:21 tight name element
194+36:29 glyph !!
195+36:31 tight glyph )
196+37:3 INDENT
197+37:3 name stack
198+37:9 glyph ~[
199+37:11 tight name width
200+37:16 tight glyph +
201+37:17 tight glyph [
202+37:18 tight lit %chars
203+37:25 lit 20
204+37:27 tight glyph ]
205+37:28 tight glyph ]
206+37:30 glyph ~[
207+38:5 INDENT
208+38:5 name image
209+38:11 glyph %/
210+38:13 tight knot images
211+38:19 tight glyph /
212+38:20 tight knot logo.png
213+38:29 str "Logo"
214+39:5 NEWLINE
215+39:5 name link
216+39:10 glyph %/
217+39:12 tight knot home
218+39:17 str "Home"
219+40:1 DEDENT
220+40:1 DEDENT
221+40:1 NEWLINE
222+40:1 glyph ++
223+40:4 name unsafe-media
224+40:17 glyph ^-
225+40:20 glyph (
226+40:21 tight name element
227+40:29 glyph !!
228+40:31 tight glyph )
229+41:3 INDENT
230+41:3 name wrap
231+41:8 glyph ~[
232+41:10 tight name width
233+41:15 tight glyph +
234+41:16 tight lit %shrink
235+41:24 name role
236+41:28 tight glyph +
237+41:29 tight lit %caption
238+41:38 name tone
239+41:42 tight glyph +
240+41:43 tight lit %accent
241+41:50 tight glyph ]
242+41:52 glyph ~[
243+42:5 INDENT
244+42:5 name image-unsafe
245+42:18 glyph [
246+42:19 tight name url
247+42:22 tight glyph =
248+42:23 tight str "https://example.com/a.png"
249+42:51 name width
250+42:56 tight glyph =
251+42:57 tight lit 20
252+42:60 name height
253+42:66 tight glyph =
254+42:67 tight lit 10
255+42:69 tight glyph ]
256+42:71 str "Remote"
257+43:5 NEWLINE
258+43:5 name link-unsafe
259+43:17 str "/elsewhere"
260+43:30 str "Elsewhere"
261+44:1 DEDENT
262+44:1 DEDENT
263+44:1 NEWLINE
264+44:1 glyph ++
265+44:4 name save-message
266+44:17 glyph ^-
267+44:20 name msg
268+44:24 lit %save
269+45:1 NEWLINE
270+45:1 glyph ++
271+45:4 name toggle-message
272+45:19 glyph ^-
273+45:22 name msg
274+45:26 lit %toggle
275+46:1 NEWLINE
276+46:1 glyph ++
277+46:4 name save-button
278+46:16 glyph ^-
279+46:19 glyph (
280+46:20 tight name element
281+46:28 name msg
282+46:31 tight glyph )
283+46:33 glyph (
284+46:34 tight name button
285+46:41 str "Save"
286+46:48 name save-message
287+46:60 tight glyph )
288+47:1 NEWLINE
289+47:1 glyph ++
290+47:4 name enabled-toggle
291+47:19 glyph ^-
292+47:22 glyph (
293+47:23 tight name element
294+47:31 name msg
295+47:34 tight glyph )
296+47:36 glyph (
297+47:37 tight name toggle
298+47:44 lit %.y
299+47:48 str "Enabled"
300+47:58 name toggle-message
301+47:72 tight glyph )
302+48:1 NEWLINE
303+48:1 glyph ++
304+48:4 name edit-message
305+48:17 glyph |=
306+48:20 name value
307+48:25 tight glyph =
308+48:26 tight aura @t
309+48:29 glyph ^-
310+48:32 name msg
311+48:36 glyph [
312+48:37 tight lit %edited
313+48:45 name value
314+48:50 tight glyph ]
315+49:1 NEWLINE
316+49:1 glyph ++
317+49:4 name name-field
318+49:15 glyph ^-
319+49:18 glyph (
320+49:19 tight name element
321+49:27 name msg
322+49:30 tight glyph )
323+49:32 glyph (
324+49:33 tight name field
325+49:39 str "Name"
326+49:46 str "value"
327+49:54 name edit-message
328+49:66 tight glyph )
329+50:1 NEWLINE
330+50:1 glyph ++
331+50:4 name controls
332+50:13 glyph ^-
333+50:16 glyph (
334+50:17 tight name element
335+50:25 name msg
336+50:28 tight glyph )
337+51:3 INDENT
338+51:3 glyph (
339+51:4 tight name form
340+51:9 name save-message
341+51:22 glyph ~[
342+51:24 tight name save-button
343+51:36 name enabled-toggle
344+51:51 name name-field
345+51:61 tight glyph ]
346+51:62 tight glyph )
347+52:1 DEDENT
348+52:1 NEWLINE
349+52:1 glyph ++
350+52:4 name keyed
351+52:10 glyph |=
352+52:13 name items
353+52:18 tight glyph =
354+52:19 tight glyph (
355+52:20 tight name list
356+52:25 glyph [
357+52:26 tight name key
358+52:29 tight glyph =
359+52:30 tight aura @t
360+52:33 name el
361+52:35 tight glyph =
362+52:36 tight glyph (
363+52:37 tight name element
364+52:45 name msg
365+52:48 tight glyph )
366+52:49 tight glyph ]
367+52:50 tight glyph )
368+53:3 INDENT
369+53:3 glyph ^-
370+53:6 glyph (
371+53:7 tight name element
372+53:15 name msg
373+53:18 tight glyph )
374+53:20 glyph (
375+53:21 tight name each
376+53:26 name items
377+53:31 tight glyph )
378+54:1 DEDENT
379+54:1 NEWLINE
380+54:1 glyph ++
381+54:4 name tabular
382+54:12 glyph |=
383+54:15 name rows
384+54:19 tight glyph =
385+54:20 tight glyph (
386+54:21 tight name list
387+54:26 glyph [
388+54:27 tight name key
389+54:30 tight glyph =
390+54:31 tight aura @ud
391+54:35 name cells
392+54:40 tight glyph =
393+54:41 tight glyph (
394+54:42 tight name list
395+54:47 glyph (
396+54:48 tight name element
397+54:56 name msg
398+54:59 tight glyph )
399+54:60 tight glyph )
400+54:61 tight glyph ]
401+54:62 tight glyph )
402+55:3 INDENT
403+55:3 glyph ^-
404+55:6 glyph (
405+55:7 tight name element
406+55:15 name msg
407+55:18 tight glyph )
408+56:5 INDENT
409+56:5 glyph (
410+56:6 tight name table
411+56:12 glyph ~[
412+56:14 tight glyph [
413+56:15 tight name header
414+56:21 tight glyph =
415+56:22 tight str "Name"
416+56:29 name width
417+56:34 tight glyph =
418+56:35 tight glyph [
419+56:36 tight lit %fill
420+56:42 lit 1
421+56:43 tight glyph ]
422+56:45 name align
423+56:50 tight glyph =
424+56:51 tight lit %start
425+56:57 tight glyph ]
426+56:58 tight glyph ]
427+56:60 name rows
428+56:64 tight glyph )
429+58:1 DEDENT
430+58:1 DEDENT
431+58:1 NEWLINE
432+58:1 glyph ++
433+58:4 name bad-pad
434+58:12 glyph ^-
435+58:15 glyph (
436+58:16 tight name element
437+58:24 glyph !!
438+58:26 tight glyph )
439+58:28 glyph (
440+58:29 tight name row
441+58:33 glyph ~[
442+58:35 tight name pad
443+58:38 tight glyph +
444+58:39 tight lit %s4
445+58:42 tight glyph ]
446+58:44 lit ~
447+58:45 tight glyph )
448+59:1 NEWLINE
449+59:1 glyph ++
450+59:4 name bad-width
451+59:14 glyph ^-
452+59:17 glyph (
453+59:18 tight name element
454+59:26 glyph !!
455+59:28 tight glyph )
456+59:30 glyph (
457+59:31 tight name row
458+59:35 glyph ~[
459+59:37 tight name width
460+59:42 tight glyph +
461+59:43 tight glyph [
462+59:44 tight lit %chars
463+59:51 str "wide"
464+59:57 tight glyph ]
465+59:58 tight glyph ]
466+59:60 lit ~
467+59:61 tight glyph )
468+60:1 NEWLINE
469+60:1 glyph ++
470+60:4 name malformed-each
471+60:19 glyph ^-
472+60:22 glyph (
473+60:23 tight name element
474+60:31 name msg
475+60:34 tight glyph )
476+60:36 glyph (
477+60:37 tight name each
478+60:42 glyph ~[
479+60:44 tight glyph [
480+60:45 tight name key
481+60:48 tight glyph =
482+60:49 tight str "row"
483+60:55 name kid
484+60:58 tight glyph =
485+60:59 tight glyph (
486+60:60 tight name text
487+60:65 str "child"
488+60:72 tight glyph )
489+60:73 tight glyph ]
490+60:74 tight glyph ]
491+60:75 tight glyph )
492+61:1 NEWLINE
493+61:1 glyph ++
494+61:4 name malformed-table
495+61:20 glyph ^-
496+61:23 glyph (
497+61:24 tight name element
498+61:32 name msg
499+61:35 tight glyph )
500+62:3 INDENT
501+62:3 glyph (
502+62:4 tight name table
503+62:10 glyph ~[
504+62:12 tight glyph [
505+62:13 tight name header
506+62:19 tight glyph =
507+62:20 tight str "Name"
508+62:27 name width
509+62:32 tight glyph =
510+62:33 tight lit %shrink
511+62:40 tight glyph ]
512+62:41 tight glyph ]
513+62:43 lit ~
514+62:44 tight glyph )
515+63:1 DEDENT
516+63:1 NEWLINE
517+63:1 glyph ++
518+63:4 name ship-control
519+63:17 glyph ^-
520+63:20 glyph (
521+63:21 tight name element
522+63:29 aura @p
523+63:31 tight glyph )
524+63:33 glyph (
525+63:34 tight name button
526+63:41 str "Ship"
527+63:48 lit ~zod
528+63:52 tight glyph )
529+64:1 NEWLINE
530+64:1 glyph ++
531+64:4 name text-row
532+64:13 glyph |=
533+64:16 name kids
534+64:20 tight glyph =
535+64:21 tight glyph (
536+64:22 tight name list
537+64:27 glyph (
538+64:28 tight name element
539+64:36 aura @t
540+64:38 tight glyph )
541+64:39 tight glyph )
542+64:41 glyph ^-
543+64:44 glyph (
544+64:45 tight name element
545+64:53 aura @t
546+64:55 tight glyph )
547+64:57 glyph (
548+64:58 tight name row
549+64:62 lit ~
550+64:64 name kids
551+64:68 tight glyph )
552+65:1 NEWLINE
553+65:1 glyph ++
554+65:4 name bad-child
555+65:14 glyph (
556+65:15 tight name text-row
557+65:24 glyph ~[
558+65:26 tight name ship-control
559+65:38 tight glyph ]
560+65:39 tight glyph )
561+67:1 NEWLINE
562+67:1 glyph ++
563+67:4 name init
564+67:9 glyph |=
565+67:12 name input
566+67:17 tight glyph =
567+67:18 tight aura @t
568+67:21 glyph ^-
569+67:24 name model
570+67:30 glyph [
571+67:31 tight name count
572+67:36 tight glyph =
573+67:37 tight lit 0
574+67:38 tight glyph ]
575+68:1 NEWLINE
576+68:1 glyph ++
577+68:4 name update
578+68:11 glyph |=
579+68:14 glyph [
580+68:15 tight name message
581+68:22 tight glyph =
582+68:23 tight name msg
583+68:27 name state
584+68:32 tight glyph =
585+68:33 tight name model
586+68:38 tight glyph ]
587+69:3 INDENT
588+69:3 glyph ^-
589+69:6 glyph [
590+69:7 tight name model
591+69:13 glyph (
592+69:14 tight name list
593+69:19 glyph (
594+69:20 tight name cmd
595+69:24 name msg
596+69:27 tight glyph )
597+69:28 tight glyph )
598+69:29 tight glyph ]
599+69:31 glyph [
600+69:32 tight name state
601+69:38 lit ~
602+69:39 tight glyph ]
603+70:1 DEDENT
604+70:1 NEWLINE
605+70:1 glyph ++
606+70:4 name view
607+70:9 glyph |=
608+70:12 name state
609+70:17 tight glyph =
610+70:18 tight name model
611+70:24 glyph ^-
612+70:27 glyph (
613+70:28 tight name element
614+70:36 name msg
615+70:39 tight glyph )
616+70:41 glyph (
617+70:42 tight name controls
618+70:50 tight glyph )
619+71:1 NEWLINE
620+71:1 glyph ++
621+71:4 name subs
622+71:9 glyph |=
623+71:12 name state
624+71:17 tight glyph =
625+71:18 tight name model
626+71:24 glyph ^-
627+71:27 glyph (
628+71:28 tight name list
629+71:33 glyph (
630+71:34 tight name sub
631+71:38 name msg
632+71:41 tight glyph )
633+71:42 tight glyph )
634+71:44 lit ~
635+72:1 NEWLINE
636+72:1 glyph ++
637+72:4 name concrete-program
638+72:21 glyph ^-
639+72:24 glyph (
640+72:25 tight name program
641+72:33 aura @t
642+72:36 name model
643+72:42 name msg
644+72:45 tight glyph )
645+72:47 glyph (
646+72:48 tight name program
647+72:56 name init
648+72:61 name update
649+72:68 name view
650+72:73 name subs
651+72:77 tight glyph )
652+73:1 NEWLINE
653+73:1 glyph ++
654+73:4 name embedded
655+73:13 glyph ^-
656+73:16 glyph (
657+73:17 tight name element
658+73:25 glyph !!
659+73:27 tight glyph )
660+73:29 glyph (
661+73:30 tight name island
662+73:37 name concrete-program
663+73:54 str "seed"
664+73:60 tight glyph )
665+74:1 NEWLINE
666+74:1 glyph ++
667+74:4 name mismatched-island-data
668+74:27 glyph ^-
669+74:30 glyph (
670+74:31 tight name element
671+74:39 glyph !!
672+74:41 tight glyph )
673+74:43 glyph (
674+74:44 tight name island
675+74:51 name concrete-program
676+74:68 lit ~zod
677+74:72 tight glyph )
678+76:1 NEWLINE
679+76:1 glyph ++
680+76:4 name load
681+76:9 glyph |=
682+76:12 name route
683+76:17 tight glyph =
684+76:18 tight aura @t
685+76:21 glyph ^-
686+76:24 glyph (
687+76:25 tight name ask
688+76:29 name model
689+76:34 tight glyph )
690+76:36 glyph (
691+76:37 tight name pure
692+76:42 glyph [
693+76:43 tight name count
694+76:48 tight glyph =
695+76:49 tight lit 0
696+76:50 tight glyph ]
697+76:51 tight glyph )
698+77:1 NEWLINE
699+77:1 glyph ++
700+77:4 name page-view
701+77:14 glyph |=
702+77:17 name data
703+77:21 tight glyph =
704+77:22 tight name model
705+77:28 glyph ^-
706+77:31 glyph (
707+77:32 tight name element
708+77:40 glyph !!
709+77:42 tight glyph )
710+77:44 glyph (
711+77:45 tight name text
712+77:50 str "page"
713+77:56 tight glyph )
714+78:1 NEWLINE
715+78:1 glyph ++
716+78:4 name static-page
717+78:16 glyph ^-
718+78:19 glyph (
719+78:20 tight name page
720+78:25 aura @t
721+78:28 name model
722+78:33 tight glyph )
723+78:35 glyph (
724+78:36 tight name page
725+78:41 name load
726+78:46 name page-view
727+78:55 tight glyph )
728+78:56 NEWLINE
tests/golden/types-prelude-ui/tree.txtnew file+300
@@ -0,0 +1,300 @@
1+(module
2+ (mold 1:1 msg
3+ (union 2:3
4+ (const 2:3 %save)
5+ (const 3:3 %toggle)
6+ (cell 4:3
7+ (const 4:4 %edited)
8+ (face 4:12 value (aura 4:18 @t)))))
9+ (mold 5:1 model
10+ (cell 5:10
11+ (face 5:11 count (aura 5:17 @ud))))
12+ (value 7:1 row-scheme (wing 7:15 row))
13+ (value 8:1 column-scheme (wing 8:18 column))
14+ (value 9:1 wrap-scheme (wing 9:16 wrap))
15+ (value 10:1 stack-scheme (wing 10:17 stack))
16+ (value 11:1 el-scheme (wing 11:14 el))
17+ (value 12:1 para-scheme (wing 12:16 para))
18+ (value 13:1 text-scheme (wing 13:16 text))
19+ (value 14:1 heading-scheme (wing 14:19 heading))
20+ (value 15:1 each-scheme (wing 15:16 each))
21+ (value 16:1 table-scheme (wing 16:17 table))
22+ (value 17:1 image-scheme (wing 17:17 image))
23+ (value 18:1 image-unsafe-scheme (wing 18:24 image-unsafe))
24+ (value 19:1 link-scheme (wing 19:16 link))
25+ (value 20:1 link-unsafe-scheme (wing 20:23 link-unsafe))
26+ (value 21:1 button-scheme (wing 21:18 button))
27+ (value 22:1 toggle-scheme (wing 22:18 toggle))
28+ (value 23:1 field-scheme (wing 23:17 field))
29+ (value 24:1 form-scheme (wing 24:16 form))
30+ (value 25:1 island-scheme (wing 25:18 island))
31+ (value 26:1 program-scheme (wing 26:19 program))
32+ (value 27:1 page-scheme (wing 27:16 page))
33+ (value 29:1 static-text
34+ (cast 29:16
35+ (apply 29:19 element (void 29:28))
36+ (group 29:32
37+ (call 29:33 (wing 29:33 text) (str 29:38 "hello")))))
38+ (value 30:1 raw-text
39+ (cast 30:13
40+ (apply 30:16 element (void 30:25))
41+ (group 30:29
42+ (call 30:30
43+ (wing 30:30 row)
44+ (lit 30:34 ~)
45+ (list 30:36
46+ (tuple 30:38 (lit 30:39 %text) (str 30:45 "raw")))))))
47+ (value 31:1 static-ui
48+ (cast 31:14
49+ (apply 31:17 element (void 31:26))
50+ (body 32:3
51+ (call 32:3
52+ (wing 32:3 column)
53+ (list 32:10
54+ (pair 32:12 pad (lit 32:16 %s1))
55+ (pair 32:20 gap (lit 32:24 %s2))
56+ (pair 32:28 width
57+ (tuple 32:34 (lit 32:35 %fill) (lit 32:41 1)))
58+ (pair 32:44 align (lit 32:50 %center))
59+ (pair 32:58 role (lit 32:63 %body))
60+ (pair 32:69 tone (lit 32:74 %muted)))
61+ (list 32:82
62+ (call 33:5 (wing 33:5 text) (str 33:10 "one"))
63+ (call 34:5
64+ (wing 34:5 para)
65+ (list 34:10
66+ (group 34:12
67+ (call 34:13 (wing 34:13 text) (str 34:18 "two")))))
68+ (call 35:5 (wing 35:5 heading) (lit 35:13 2) (str 35:15 "heading")))))))
69+ (value 36:1 static-media
70+ (cast 36:17
71+ (apply 36:20 element (void 36:29))
72+ (body 37:3
73+ (call 37:3
74+ (wing 37:3 stack)
75+ (list 37:9
76+ (pair 37:11 width
77+ (tuple 37:17 (lit 37:18 %chars) (lit 37:25 20))))
78+ (list 37:30
79+ (call 38:5 (wing 38:5 image) (qath 38:11 images logo.png) (str 38:29 "Logo"))
80+ (call 39:5 (wing 39:5 link) (qath 39:10 home) (str 39:17 "Home")))))))
81+ (value 40:1 unsafe-media
82+ (cast 40:17
83+ (apply 40:20 element (void 40:29))
84+ (body 41:3
85+ (call 41:3
86+ (wing 41:3 wrap)
87+ (list 41:8
88+ (pair 41:10 width (lit 41:16 %shrink))
89+ (pair 41:24 role (lit 41:29 %caption))
90+ (pair 41:38 tone (lit 41:43 %accent)))
91+ (list 41:52
92+ (call 42:5
93+ (wing 42:5 image-unsafe)
94+ (tuple 42:18
95+ (face 42:19 url (str 42:23 "https://example.com/a.png"))
96+ (face 42:51 width (lit 42:57 20))
97+ (face 42:60 height (lit 42:67 10)))
98+ (str 42:71 "Remote"))
99+ (call 43:5 (wing 43:5 link-unsafe) (str 43:17 "/elsewhere") (str 43:30 "Elsewhere")))))))
100+ (value 44:1 save-message
101+ (cast 44:17 (ref 44:20 msg) (lit 44:24 %save)))
102+ (value 45:1 toggle-message
103+ (cast 45:19 (ref 45:22 msg) (lit 45:26 %toggle)))
104+ (value 46:1 save-button
105+ (cast 46:16
106+ (apply 46:19 element (ref 46:28 msg))
107+ (group 46:33
108+ (call 46:34 (wing 46:34 button) (str 46:41 "Save") (wing 46:48 save-message)))))
109+ (value 47:1 enabled-toggle
110+ (cast 47:19
111+ (apply 47:22 element (ref 47:31 msg))
112+ (group 47:36
113+ (call 47:37 (wing 47:37 toggle) (lit 47:44 %.y) (str 47:48 "Enabled") (wing 47:58 toggle-message)))))
114+ (value 48:1 edit-message
115+ (gate 48:17
116+ (face 48:20 value (aura 48:26 @t))
117+ (cast 48:29
118+ (ref 48:32 msg)
119+ (tuple 48:36 (lit 48:37 %edited) (wing 48:45 value)))))
120+ (value 49:1 name-field
121+ (cast 49:15
122+ (apply 49:18 element (ref 49:27 msg))
123+ (group 49:32
124+ (call 49:33 (wing 49:33 field) (str 49:39 "Name") (str 49:46 "value") (wing 49:54 edit-message)))))
125+ (value 50:1 controls
126+ (cast 50:13
127+ (apply 50:16 element (ref 50:25 msg))
128+ (body 51:3
129+ (group 51:3
130+ (call 51:4
131+ (wing 51:4 form)
132+ (wing 51:9 save-message)
133+ (list 51:22 (wing 51:24 save-button) (wing 51:36 enabled-toggle) (wing 51:51 name-field)))))))
134+ (value 52:1 keyed
135+ (gate 52:10
136+ (face 52:13 items
137+ (apply 52:19 list
138+ (cell 52:25
139+ (face 52:26 key (aura 52:30 @t))
140+ (face 52:33 el
141+ (apply 52:36 element (ref 52:45 msg))))))
142+ (body 53:3
143+ (cast 53:3
144+ (apply 53:6 element (ref 53:15 msg))
145+ (group 53:20
146+ (call 53:21 (wing 53:21 each) (wing 53:26 items)))))))
147+ (value 54:1 tabular
148+ (gate 54:12
149+ (face 54:15 rows
150+ (apply 54:20 list
151+ (cell 54:26
152+ (face 54:27 key (aura 54:31 @ud))
153+ (face 54:35 cells
154+ (apply 54:41 list
155+ (apply 54:47 element (ref 54:56 msg)))))))
156+ (body 55:3
157+ (cast 55:3
158+ (apply 55:6 element (ref 55:15 msg))
159+ (body 56:5
160+ (group 56:5
161+ (call 56:6
162+ (wing 56:6 table)
163+ (list 56:12
164+ (tuple 56:14
165+ (face 56:15 header (str 56:22 "Name"))
166+ (face 56:29 width
167+ (tuple 56:35 (lit 56:36 %fill) (lit 56:42 1)))
168+ (face 56:45 align (lit 56:51 %start))))
169+ (wing 56:60 rows))))))))
170+ (value 58:1 bad-pad
171+ (cast 58:12
172+ (apply 58:15 element (void 58:24))
173+ (group 58:28
174+ (call 58:29
175+ (wing 58:29 row)
176+ (list 58:33
177+ (pair 58:35 pad (lit 58:39 %s4)))
178+ (lit 58:44 ~)))))
179+ (value 59:1 bad-width
180+ (cast 59:14
181+ (apply 59:17 element (void 59:26))
182+ (group 59:30
183+ (call 59:31
184+ (wing 59:31 row)
185+ (list 59:35
186+ (pair 59:37 width
187+ (tuple 59:43 (lit 59:44 %chars) (str 59:51 "wide"))))
188+ (lit 59:60 ~)))))
189+ (value 60:1 malformed-each
190+ (cast 60:19
191+ (apply 60:22 element (ref 60:31 msg))
192+ (group 60:36
193+ (call 60:37
194+ (wing 60:37 each)
195+ (list 60:42
196+ (tuple 60:44
197+ (face 60:45 key (str 60:49 "row"))
198+ (face 60:55 kid
199+ (group 60:59
200+ (call 60:60 (wing 60:60 text) (str 60:65 "child"))))))))))
201+ (value 61:1 malformed-table
202+ (cast 61:20
203+ (apply 61:23 element (ref 61:32 msg))
204+ (body 62:3
205+ (group 62:3
206+ (call 62:4
207+ (wing 62:4 table)
208+ (list 62:10
209+ (tuple 62:12
210+ (face 62:13 header (str 62:20 "Name"))
211+ (face 62:27 width (lit 62:33 %shrink))))
212+ (lit 62:43 ~))))))
213+ (value 63:1 ship-control
214+ (cast 63:17
215+ (apply 63:20 element (aura 63:29 @p))
216+ (group 63:33
217+ (call 63:34 (wing 63:34 button) (str 63:41 "Ship") (lit 63:48 ~zod)))))
218+ (value 64:1 text-row
219+ (gate 64:13
220+ (face 64:16 kids
221+ (apply 64:21 list
222+ (apply 64:27 element (aura 64:36 @t))))
223+ (cast 64:41
224+ (apply 64:44 element (aura 64:53 @t))
225+ (group 64:57
226+ (call 64:58 (wing 64:58 row) (lit 64:62 ~) (wing 64:64 kids))))))
227+ (value 65:1 bad-child
228+ (group 65:14
229+ (call 65:15
230+ (wing 65:15 text-row)
231+ (list 65:24 (wing 65:26 ship-control)))))
232+ (value 67:1 init
233+ (gate 67:9
234+ (face 67:12 input (aura 67:18 @t))
235+ (cast 67:21
236+ (ref 67:24 model)
237+ (tuple 67:30
238+ (face 67:31 count (lit 67:37 0))))))
239+ (value 68:1 update
240+ (gate 68:11
241+ (cell 68:14
242+ (face 68:15 message (ref 68:23 msg))
243+ (face 68:27 state (ref 68:33 model)))
244+ (body 69:3
245+ (cast 69:3
246+ (cell 69:6
247+ (ref 69:7 model)
248+ (apply 69:13 list
249+ (apply 69:19 cmd (ref 69:24 msg))))
250+ (tuple 69:31 (wing 69:32 state) (lit 69:38 ~))))))
251+ (value 70:1 view
252+ (gate 70:9
253+ (face 70:12 state (ref 70:18 model))
254+ (cast 70:24
255+ (apply 70:27 element (ref 70:36 msg))
256+ (group 70:41 (wing 70:42 controls)))))
257+ (value 71:1 subs
258+ (gate 71:9
259+ (face 71:12 state (ref 71:18 model))
260+ (cast 71:24
261+ (apply 71:27 list
262+ (apply 71:33 sub (ref 71:38 msg)))
263+ (lit 71:44 ~))))
264+ (value 72:1 concrete-program
265+ (cast 72:21
266+ (apply 72:24 program (aura 72:33 @t) (ref 72:36 model) (ref 72:42 msg))
267+ (group 72:47
268+ (call 72:48 (wing 72:48 program) (wing 72:56 init) (wing 72:61 update) (wing 72:68 view) (wing 72:73 subs)))))
269+ (value 73:1 embedded
270+ (cast 73:13
271+ (apply 73:16 element (void 73:25))
272+ (group 73:29
273+ (call 73:30 (wing 73:30 island) (wing 73:37 concrete-program) (str 73:54 "seed")))))
274+ (value 74:1 mismatched-island-data
275+ (cast 74:27
276+ (apply 74:30 element (void 74:39))
277+ (group 74:43
278+ (call 74:44 (wing 74:44 island) (wing 74:51 concrete-program) (lit 74:68 ~zod)))))
279+ (value 76:1 load
280+ (gate 76:9
281+ (face 76:12 route (aura 76:18 @t))
282+ (cast 76:21
283+ (apply 76:24 ask (ref 76:29 model))
284+ (group 76:36
285+ (call 76:37
286+ (wing 76:37 pure)
287+ (tuple 76:42
288+ (face 76:43 count (lit 76:49 0))))))))
289+ (value 77:1 page-view
290+ (gate 77:14
291+ (face 77:17 data (ref 77:22 model))
292+ (cast 77:28
293+ (apply 77:31 element (void 77:40))
294+ (group 77:44
295+ (call 77:45 (wing 77:45 text) (str 77:50 "page"))))))
296+ (value 78:1 static-page
297+ (cast 78:16
298+ (apply 78:19 page (aura 78:25 @t) (ref 78:28 model))
299+ (group 78:35
300+ (call 78:36 (wing 78:36 page) (wing 78:41 load) (wing 78:46 page-view))))))
tests/golden/types-prelude-ui/types.txtnew file+85
@@ -0,0 +1,85 @@
1+partial inference; module not checked
2++$ msg: cases proven disjoint; mold not checked
3++$ model: not checked
4+++ row-scheme: $-([attrs=(list attr) kids=(list (element A))] (element A))
5+++ column-scheme: $-([attrs=(list attr) kids=(list (element A))] (element A))
6+++ wrap-scheme: $-([attrs=(list attr) kids=(list (element A))] (element A))
7+++ stack-scheme: $-([attrs=(list attr) kids=(list (element A))] (element A))
8+++ el-scheme: $-([attrs=(list attr) kid=(element A)] (element A))
9+++ para-scheme: $-((list (element A)) (element A))
10+++ text-scheme: $-(@t (element A))
11+++ heading-scheme: $-([level=@ud words=@t] (element A))
12+++ each-scheme: $-((list [key=A el=(element B)]) (element B))
13+++ table-scheme: $-([columns=(list [header=@t [width=length align=align]]) rows=(list [key=A cells=(list (element B))])] (element B))
14+++ image-scheme: $-([source=qath description=@t] (element A))
15+++ image-unsafe-scheme: $-([source=[url=@t [width=@ud height=@ud]] description=@t] (element A))
16+++ link-scheme: $-([target=qath label=@t] (element A))
17+++ link-unsafe-scheme: $-([target=@t label=@t] (element A))
18+++ button-scheme: $-([label=@t message=A] (element A))
19+++ toggle-scheme: $-([on=? [label=@t message=A]] (element A))
20+++ field-scheme: $-([label=@t [value=@t reply=$-(@t A)]] (element A))
21+++ form-scheme: $-([message=A kids=(list (element A))] (element A))
22+++ island-scheme: $-([p=[init=$-(A B) [update=$-([C B] [B (list (cmd C))]) [view=$-(B (element C)) subs=$-(B (list (sub C)))]]] data=A] (element !!))
23+++ program-scheme: $-([init=$-(A B) [update=$-([C B] [B (list (cmd C))]) [view=$-(B (element C)) subs=$-(B (list (sub C)))]]] [init=$-(A B) [update=$-([C B] [B (list (cmd C))]) [view=$-(B (element C)) subs=$-(B (list (sub C)))]]])
24+++ page-scheme: $-([load=$-(A (ask B)) view=$-(B (element !!))] [load=$-(A (ask B)) view=$-(B (element !!))])
25+++ static-text: (element !!)
26+++ raw-text: (element !!)
27+++ static-ui: (element !!)
28+++ static-media: (element !!)
29+++ unsafe-media: (element !!)
30+++ save-message: msg
31+++ toggle-message: msg
32+++ save-button: (element msg)
33+++ enabled-toggle: (element msg)
34+++ edit-message: $-(@t msg)
35+++ name-field: (element msg)
36+++ controls: (element msg)
37+++ keyed: $-((list [key=@t el=(element msg)]) (element msg))
38+++ tabular: $-((list [key=@ud cells=(list (element msg))]) (element msg))
39+++ bad-pad: list item does not fit its expected type
40+/tests/golden/types-prelude-ui/source.jibb:58:29: expected item
41+++ bad-pad ^- (element !!) (row ~[pad+%s4] ~)
42+ ^
43+/tests/golden/types-prelude-ui/source.jibb:58:35: list item
44+++ bad-pad ^- (element !!) (row ~[pad+%s4] ~)
45+ ^
46+++ bad-width: list item does not fit its expected type
47+/tests/golden/types-prelude-ui/source.jibb:59:31: expected item
48+++ bad-width ^- (element !!) (row ~[width+[%chars "wide"]] ~)
49+ ^
50+/tests/golden/types-prelude-ui/source.jibb:59:37: list item
51+++ bad-width ^- (element !!) (row ~[width+[%chars "wide"]] ~)
52+ ^
53+++ malformed-each: list item does not fit its expected type
54+/tests/golden/types-prelude-ui/source.jibb:60:37: expected item
55+++ malformed-each ^- (element msg) (each ~[[key="row" kid=(text "child")]])
56+ ^
57+/tests/golden/types-prelude-ui/source.jibb:60:44: list item
58+++ malformed-each ^- (element msg) (each ~[[key="row" kid=(text "child")]])
59+ ^
60+++ malformed-table: list item does not fit its expected type
61+/tests/golden/types-prelude-ui/source.jibb:62:4: expected item
62+ (table ~[[header="Name" width=%shrink]] ~)
63+ ^
64+/tests/golden/types-prelude-ui/source.jibb:62:12: list item
65+ (table ~[[header="Name" width=%shrink]] ~)
66+ ^
67+++ ship-control: (element @p)
68+++ text-row: $-((list (element @t)) (element @t))
69+++ bad-child: list item constraint is not supported by partial inference
70+++ init: $-(@t [count=@ud])
71+++ update: $-([message=msg state=[count=@ud]] [count=@ud (list (cmd msg))])
72+++ view: $-([count=@ud] (element msg))
73+++ subs: $-([count=@ud] (list (sub msg)))
74+++ concrete-program: [init=$-(@t [count=@ud]) [update=$-([msg count=@ud] [count=@ud (list (cmd msg))]) [view=$-([count=@ud] (element msg)) subs=$-([count=@ud] (list (sub msg)))]]]
75+++ embedded: (element !!)
76+++ mismatched-island-data: call's sample and argument types do not unify
77+/tests/golden/types-prelude-ui/source.jibb:74:44: called gate
78+++ mismatched-island-data ^- (element !!) (island concrete-program ~zod)
79+ ^
80+/tests/golden/types-prelude-ui/source.jibb:74:51: argument
81+++ mismatched-island-data ^- (element !!) (island concrete-program ~zod)
82+ ^
83+++ load: $-(@t (ask [count=@ud]))
84+++ page-view: $-([count=@ud] (element !!))
85+++ static-page: [load=$-(@t (ask.internal [count=@ud])) view=$-([count=@ud] (element !!))]
tests/golden/types-prelude-zing/about.txtnew file+4
@@ -0,0 +1,4 @@
1+source: docs/spec/overview.md, Prelude: "Hoon's standard library regrouped, written in Jibb"; the Lists row includes section 2b.
2+tests: Source-backed zing infers empty and nested text lists, ship elements, independently generic element types and gate elements, and reports both sites for a non-list. The Jibb type is homogeneous (list (list A)) to (list A); Hoon's raw heterogeneous noun-list behavior is outside this type. This checks partial inference only; backend execution and jet recognition remain unverified.
3+expect: parses
4+expect-types: a partial inference report
tests/golden/types-prelude-zing/modules.txtnew file+1
@@ -0,0 +1 @@
1+# no module fixtures
tests/golden/types-prelude-zing/source.jibbnew file+6
@@ -0,0 +1,6 @@
1+++ empty (zing (^- (list (list @t)) ~))
2+++ nested (zing ~[~["a" "b"] ~[] ~["c"]])
3+++ ships (zing ~[~[~zod] ~[~nec]])
4+++ generic |= xss=(list (list A)) (zing xss)
5+++ gates |= xss=(list (list $-(A B))) (zing xss)
6+++ bad (zing "not a list of lists")
tests/golden/types-prelude-zing/tokens.txtnew file+92
@@ -0,0 +1,92 @@
1+1:1 glyph ++
2+1:4 name empty
3+1:10 glyph (
4+1:11 tight name zing
5+1:16 glyph (
6+1:17 tight glyph ^-
7+1:20 glyph (
8+1:21 tight name list
9+1:26 glyph (
10+1:27 tight name list
11+1:32 aura @t
12+1:34 tight glyph )
13+1:35 tight glyph )
14+1:37 lit ~
15+1:38 tight glyph )
16+1:39 tight glyph )
17+2:1 NEWLINE
18+2:1 glyph ++
19+2:4 name nested
20+2:11 glyph (
21+2:12 tight name zing
22+2:17 glyph ~[
23+2:19 tight glyph ~[
24+2:21 tight str "a"
25+2:25 str "b"
26+2:28 tight glyph ]
27+2:30 glyph ~[
28+2:32 tight glyph ]
29+2:34 glyph ~[
30+2:36 tight str "c"
31+2:39 tight glyph ]
32+2:40 tight glyph ]
33+2:41 tight glyph )
34+3:1 NEWLINE
35+3:1 glyph ++
36+3:4 name ships
37+3:10 glyph (
38+3:11 tight name zing
39+3:16 glyph ~[
40+3:18 tight glyph ~[
41+3:20 tight lit ~zod
42+3:24 tight glyph ]
43+3:26 glyph ~[
44+3:28 tight lit ~nec
45+3:32 tight glyph ]
46+3:33 tight glyph ]
47+3:34 tight glyph )
48+4:1 NEWLINE
49+4:1 glyph ++
50+4:4 name generic
51+4:12 glyph |=
52+4:15 name xss
53+4:18 tight glyph =
54+4:19 tight glyph (
55+4:20 tight name list
56+4:25 glyph (
57+4:26 tight name list
58+4:31 tvar A
59+4:32 tight glyph )
60+4:33 tight glyph )
61+4:35 glyph (
62+4:36 tight name zing
63+4:41 name xss
64+4:44 tight glyph )
65+5:1 NEWLINE
66+5:1 glyph ++
67+5:4 name gates
68+5:10 glyph |=
69+5:13 name xss
70+5:16 tight glyph =
71+5:17 tight glyph (
72+5:18 tight name list
73+5:23 glyph (
74+5:24 tight name list
75+5:29 glyph $-(
76+5:32 tight tvar A
77+5:34 tvar B
78+5:35 tight glyph )
79+5:36 tight glyph )
80+5:37 tight glyph )
81+5:39 glyph (
82+5:40 tight name zing
83+5:45 name xss
84+5:48 tight glyph )
85+6:1 NEWLINE
86+6:1 glyph ++
87+6:4 name bad
88+6:8 glyph (
89+6:9 tight name zing
90+6:14 str "not a list of lists"
91+6:35 tight glyph )
92+6:36 NEWLINE
tests/golden/types-prelude-zing/tree.txtnew file+43
@@ -0,0 +1,43 @@
1+(module
2+ (value 1:1 empty
3+ (group 1:10
4+ (call 1:11
5+ (wing 1:11 zing)
6+ (group 1:16
7+ (cast 1:17
8+ (apply 1:20 list
9+ (apply 1:26 list (aura 1:32 @t)))
10+ (lit 1:37 ~))))))
11+ (value 2:1 nested
12+ (group 2:11
13+ (call 2:12
14+ (wing 2:12 zing)
15+ (list 2:17
16+ (list 2:19 (str 2:21 "a") (str 2:25 "b"))
17+ (list 2:30)
18+ (list 2:34 (str 2:36 "c"))))))
19+ (value 3:1 ships
20+ (group 3:10
21+ (call 3:11
22+ (wing 3:11 zing)
23+ (list 3:16
24+ (list 3:18 (lit 3:20 ~zod))
25+ (list 3:26 (lit 3:28 ~nec))))))
26+ (value 4:1 generic
27+ (gate 4:12
28+ (face 4:15 xss
29+ (apply 4:19 list
30+ (apply 4:25 list (tvar 4:31 A))))
31+ (group 4:35
32+ (call 4:36 (wing 4:36 zing) (wing 4:41 xss)))))
33+ (value 5:1 gates
34+ (gate 5:10
35+ (face 5:13 xss
36+ (apply 5:17 list
37+ (apply 5:23 list
38+ (fn 5:29 (tvar 5:32 A) (tvar 5:34 B)))))
39+ (group 5:39
40+ (call 5:40 (wing 5:40 zing) (wing 5:45 xss)))))
41+ (value 6:1 bad
42+ (group 6:8
43+ (call 6:9 (wing 6:9 zing) (str 6:14 "not a list of lists")))))
tests/golden/types-prelude-zing/types.txtnew file+13
@@ -0,0 +1,13 @@
1+partial inference; module not checked
2+++ empty: (list @t)
3+++ nested: (list @t)
4+++ ships: (list @p)
5+++ generic: $-((list (list A)) (list A))
6+++ gates: $-((list (list $-(A B))) (list $-(A B)))
7+++ bad: call's sample and argument types do not unify
8+/tests/golden/types-prelude-zing/source.jibb:6:9: called gate has type $-((list (list A)) (list A))
9+++ bad (zing "not a list of lists")
10+ ^
11+/tests/golden/types-prelude-zing/source.jibb:6:14: argument has type @t
12+++ bad (zing "not a list of lists")
13+ ^
tests/golden/types-recursion-scc-import/source.jibb+1−1
@@ -1,3 +1,3 @@
1/= lib /ui/lib
1/= lib /ui/lib
2−++ text ^- @t (left.lib "hello")
2+++ text-value ^- @t (left.lib "hello")
3++ ship ^- @p (right.lib "hello")
3++ ship ^- @p (right.lib "hello")
tests/golden/types-recursion-scc-import/tokens.txt+7−7
@@ -6,13 +6,13 @@
61:12 tight knot lib
61:12 tight knot lib
72:1 NEWLINE
72:1 NEWLINE
82:1 glyph ++
82:1 glyph ++
9−2:4 name text
9+2:4 name text-value
10−2:9 glyph ^-
10+2:15 glyph ^-
11−2:12 aura @t
11+2:18 aura @t
12−2:15 glyph (
12+2:21 glyph (
13−2:16 tight wing left.lib
13+2:22 tight wing left.lib
14−2:25 str "hello"
14+2:31 str "hello"
15−2:32 tight glyph )
15+2:38 tight glyph )
163:1 NEWLINE
163:1 NEWLINE
173:1 glyph ++
173:1 glyph ++
183:4 name ship
183:4 name ship
tests/golden/types-recursion-scc-import/tree.txt+5−5
@@ -1,10 +1,10 @@
1(module
1(module
2 (jibb 1:1 lib /ui/lib)
2 (jibb 1:1 lib /ui/lib)
3− (value 2:1 text
3+ (value 2:1 text-value
4− (cast 2:9
4+ (cast 2:15
5− (aura 2:12 @t)
5+ (aura 2:18 @t)
6− (group 2:15
6+ (group 2:21
7− (call 2:16 (wing 2:16 left.lib) (str 2:25 "hello")))))
7+ (call 2:22 (wing 2:22 left.lib) (str 2:31 "hello")))))
8 (value 3:1 ship
8 (value 3:1 ship
9 (cast 3:9
9 (cast 3:9
10 (aura 3:12 @p)
10 (aura 3:12 @p)
tests/golden/types-recursion-scc-import/types.txt+1−1
@@ -1,3 +1,3 @@
1partial inference; module not checked
1partial inference; module not checked
2−++ text: @t
2+++ text-value: @t
3++ ship: @p
3++ ship: @p
tests/golden/types-union-finite-context/source.jibb+1−1
@@ -35,7 +35,7 @@
35 * %stay
35 * %stay
36++ binder |= x=input ^- ?
36++ binder |= x=input ^- ?
37 ?- x
37 ?- x
38− [%p flag text] flag
38+ [%p flag words] flag
39 %other %.n
39 %other %.n
40++ unresolved |= x=input ^- (list @t)
40++ unresolved |= x=input ^- (list @t)
41 ~& %pending
41 ~& %pending
tests/golden/types-union-finite-context/tokens.txt+3−3
@@ -244,9 +244,9 @@
24438:5 glyph [
24438:5 glyph [
24538:6 tight lit %p
24538:6 tight lit %p
24638:9 name flag
24638:9 name flag
247−38:14 name text
247+38:14 name words
248−38:18 tight glyph ]
248+38:19 tight glyph ]
249−38:20 name flag
249+38:21 name flag
25039:5 NEWLINE
25039:5 NEWLINE
25139:5 lit %other
25139:5 lit %other
25239:12 lit %.n
25239:12 lit %.n
tests/golden/types-union-finite-context/tree.txt+2−2
@@ -111,8 +111,8 @@
111 (branch 37:3
111 (branch 37:3
112 (wing 37:6 x)
112 (wing 37:6 x)
113 (arm 38:5
113 (arm 38:5
114− (cell 38:5 (lit 38:6 %p) (bind 38:9 flag) (bind 38:14 text))
114+ (cell 38:5 (lit 38:6 %p) (bind 38:9 flag) (bind 38:14 words))
115− (wing 38:20 flag))
115+ (wing 38:21 flag))
116 (arm 39:5 (lit 39:5 %other) (lit 39:12 %.n)))))))
116 (arm 39:5 (lit 39:5 %other) (lit 39:12 %.n)))))))
117 (value 40:1 unresolved
117 (value 40:1 unresolved
118 (gate 40:15
118 (gate 40:15
tests/golden/types-union-finite-limit/about.txt+1−1
@@ -1,4 +1,4 @@
1source: Grammar, Patterns: "Every case needs an arm or a catch-all"; Molds: the empty mold `!!` has no values.
1source: Grammar, Patterns: "Every case needs an arm or a catch-all"; Molds: the empty mold `!!` has no values.
2−tests: Whole-case matching remains available without expanding many booleans. Partial matching succeeds below the implementation's 64-alternative limit and fails closed above it; empty union cases remain unsupported rather than falsely checked.
2+tests: Whole-case matching remains available without expanding many booleans. Partial matching succeeds below the implementation's 64-alternative limit and fails closed above it; a proven empty case is excluded from coverage, allowing the only inhabited case to be matched.
3expect: parses
3expect: parses
4expect-types: a partial inference report
4expect-types: a partial inference report
tests/golden/types-union-finite-limit/types.txt+1−1
@@ -7,4 +7,4 @@ partial inference; module not checked
7+$ over: cases proven disjoint; mold not checked
7+$ over: cases proven disjoint; mold not checked
8++ capped: union pattern expansion needs unsupported inference
8++ capped: union pattern expansion needs unsupported inference
9+$ empty-msg: cases proven disjoint; mold not checked
9+$ empty-msg: cases proven disjoint; mold not checked
10−++ one: sample mold is not supported by partial inference
10+++ one: $-(empty-msg @t)
tests/golden/types-union-nonwing-subject/source.jibb+13−13
@@ -8,24 +8,24 @@
8++ passthrough |= x=input x
8++ passthrough |= x=input x
9++ grouped |= x=input ^- (list @t)
9++ grouped |= x=input ^- (list @t)
10 ?- (x)
10 ?- (x)
11− [%item flag text] ~[text]
11+ [%item flag words] ~[words]
12 %none ~
12 %none ~
13++ call |= x=input ^- (list @t)
13++ call |= x=input ^- (list @t)
14 ?- (local-id x)
14 ?- (local-id x)
15− [%item flag text] ~[text]
15+ [%item flag words] ~[words]
16 %none ~
16 %none ~
17++ nested |= x=input ^- result
17++ nested |= x=input ^- result
18 ?- (local-id (passthrough x))
18 ?- (local-id (passthrough x))
19− [%item flag text] %good
19+ [%item flag words] %good
20 %none %empty
20 %none %empty
21++ finite |= x=input ^- (list @t)
21++ finite |= x=input ^- (list @t)
22 ?- (local-id x)
22 ?- (local-id x)
23− [%item %.y text] ~[text]
23+ [%item %.y words] ~[words]
24− [%item %.n text] ~[]
24+ [%item %.n words] ~[]
25 %none ~
25 %none ~
26++ wrong |= x=input ^- result
26++ wrong |= x=input ^- result
27 ?- (local-id x)
27 ?- (local-id x)
28− [%item flag text] %missing
28+ [%item flag words] %missing
29 %none %empty
29 %none %empty
30++ missing |= x=input ^- (list @t)
30++ missing |= x=input ^- (list @t)
31 ?- (local-id x)
31 ?- (local-id x)
@@ -34,7 +34,7 @@
34 ?- (local-id x)
34 ?- (local-id x)
35 %none ~
35 %none ~
36 %none ~
36 %none ~
37− [%item flag text] ~[text]
37+ [%item flag words] ~[words]
38++ shadow |= x=input ^- result
38++ shadow |= x=input ^- result
39 ?- (local-id x)
39 ?- (local-id x)
40 [%item flag same] %good
40 [%item flag same] %good
@@ -42,19 +42,19 @@
42++ pending |= x=input ^- result
42++ pending |= x=input ^- result
43 ~& %dangling
43 ~& %dangling
44 ?- (local-id x)
44 ?- (local-id x)
45− [%item flag text] %good
45+ [%item flag words] %good
46 %none %empty
46 %none %empty
47++ unknown |= x ^- (list @t)
47++ unknown |= x ^- (list @t)
48 ?- (local-id x)
48 ?- (local-id x)
49− [%item flag text] ~[text]
49+ [%item flag words] ~[words]
50 %none ~
50 %none ~
51++ nonunion |= x=@t ^- (list @t)
51++ nonunion |= x=@t ^- (list @t)
52 ?- (local-id x)
52 ?- (local-id x)
53− [%item flag text] ~[text]
53+ [%item flag words] ~[words]
54 %none ~
54 %none ~
55++ explicit |= [x=input y=A] ^- (list A)
55++ explicit |= [x=input y=A] ^- (list A)
56 ?- (local-id x)
56 ?- (local-id x)
57− [%item flag text] ~["text"]
57+ [%item flag words] ~["text"]
58 %none ~
58 %none ~
59+$ payload |$ [A]
59+$ payload |$ [A]
60 [%present value=A]
60 [%present value=A]
@@ -65,12 +65,12 @@
65 %none ~
65 %none ~
66++ bad-subject |= x=input ^- result
66++ bad-subject |= x=input ^- result
67 ?- (passthrough "wrong")
67 ?- (passthrough "wrong")
68− [%item flag text] %missing
68+ [%item flag words] %missing
69 %none %empty
69 %none %empty
70++ first-of |= [a b] a
70++ first-of |= [a b] a
71++ pending-subject |= x=input ^- result
71++ pending-subject |= x=input ^- result
72 ?- (first-of x %dangling)
72 ?- (first-of x %dangling)
73− [%item flag text] %good
73+ [%item flag words] %good
74 %none %empty
74 %none %empty
75++ duplicate-flag-subject |= x=@t ^- (list @t)
75++ duplicate-flag-subject |= x=@t ^- (list @t)
76 ?- (passthrough x)
76 ?- (passthrough x)
tests/golden/types-union-nonwing-subject/tokens.txt+54−54
@@ -56,11 +56,11 @@
5611:5 glyph [
5611:5 glyph [
5711:6 tight lit %item
5711:6 tight lit %item
5811:12 name flag
5811:12 name flag
59−11:17 name text
59+11:17 name words
60−11:21 tight glyph ]
60+11:22 tight glyph ]
61−11:23 glyph ~[
61+11:24 glyph ~[
62−11:25 tight name text
62+11:26 tight name words
63−11:29 tight glyph ]
63+11:31 tight glyph ]
6412:5 NEWLINE
6412:5 NEWLINE
6512:5 lit %none
6512:5 lit %none
6612:11 lit ~
6612:11 lit ~
@@ -88,11 +88,11 @@
8815:5 glyph [
8815:5 glyph [
8915:6 tight lit %item
8915:6 tight lit %item
9015:12 name flag
9015:12 name flag
91−15:17 name text
91+15:17 name words
92−15:21 tight glyph ]
92+15:22 tight glyph ]
93−15:23 glyph ~[
93+15:24 glyph ~[
94−15:25 tight name text
94+15:26 tight name words
95−15:29 tight glyph ]
95+15:31 tight glyph ]
9616:5 NEWLINE
9616:5 NEWLINE
9716:5 lit %none
9716:5 lit %none
9816:11 lit ~
9816:11 lit ~
@@ -120,9 +120,9 @@
12019:5 glyph [
12019:5 glyph [
12119:6 tight lit %item
12119:6 tight lit %item
12219:12 name flag
12219:12 name flag
123−19:17 name text
123+19:17 name words
124−19:21 tight glyph ]
124+19:22 tight glyph ]
125−19:23 lit %good
125+19:24 lit %good
12620:5 NEWLINE
12620:5 NEWLINE
12720:5 lit %none
12720:5 lit %none
12820:11 lit %empty
12820:11 lit %empty
@@ -150,19 +150,19 @@
15023:5 glyph [
15023:5 glyph [
15123:6 tight lit %item
15123:6 tight lit %item
15223:12 lit %.y
15223:12 lit %.y
153−23:16 name text
153+23:16 name words
154−23:20 tight glyph ]
154+23:21 tight glyph ]
155−23:22 glyph ~[
155+23:23 glyph ~[
156−23:24 tight name text
156+23:25 tight name words
157−23:28 tight glyph ]
157+23:30 tight glyph ]
15824:5 NEWLINE
15824:5 NEWLINE
15924:5 glyph [
15924:5 glyph [
16024:6 tight lit %item
16024:6 tight lit %item
16124:12 lit %.n
16124:12 lit %.n
162−24:16 name text
162+24:16 name words
163−24:20 tight glyph ]
163+24:21 tight glyph ]
164−24:22 glyph ~[
164+24:23 glyph ~[
165−24:24 tight glyph ]
165+24:25 tight glyph ]
16625:5 NEWLINE
16625:5 NEWLINE
16725:5 lit %none
16725:5 lit %none
16825:11 lit ~
16825:11 lit ~
@@ -187,9 +187,9 @@
18728:5 glyph [
18728:5 glyph [
18828:6 tight lit %item
18828:6 tight lit %item
18928:12 name flag
18928:12 name flag
190−28:17 name text
190+28:17 name words
191−28:21 tight glyph ]
191+28:22 tight glyph ]
192−28:23 lit %missing
192+28:24 lit %missing
19329:5 NEWLINE
19329:5 NEWLINE
19429:5 lit %none
19429:5 lit %none
19529:11 lit %empty
19529:11 lit %empty
@@ -246,11 +246,11 @@
24637:5 glyph [
24637:5 glyph [
24737:6 tight lit %item
24737:6 tight lit %item
24837:12 name flag
24837:12 name flag
249−37:17 name text
249+37:17 name words
250−37:21 tight glyph ]
250+37:22 tight glyph ]
251−37:23 glyph ~[
251+37:24 glyph ~[
252−37:25 tight name text
252+37:26 tight name words
253−37:29 tight glyph ]
253+37:31 tight glyph ]
25438:1 DEDENT
25438:1 DEDENT
25538:1 DEDENT
25538:1 DEDENT
25638:1 NEWLINE
25638:1 NEWLINE
@@ -302,9 +302,9 @@
30245:7 glyph [
30245:7 glyph [
30345:8 tight lit %item
30345:8 tight lit %item
30445:14 name flag
30445:14 name flag
305−45:19 name text
305+45:19 name words
306−45:23 tight glyph ]
306+45:24 tight glyph ]
307−45:25 lit %good
307+45:26 lit %good
30846:7 NEWLINE
30846:7 NEWLINE
30946:7 lit %none
30946:7 lit %none
31046:13 lit %empty
31046:13 lit %empty
@@ -331,11 +331,11 @@
33149:5 glyph [
33149:5 glyph [
33249:6 tight lit %item
33249:6 tight lit %item
33349:12 name flag
33349:12 name flag
334−49:17 name text
334+49:17 name words
335−49:21 tight glyph ]
335+49:22 tight glyph ]
336−49:23 glyph ~[
336+49:24 glyph ~[
337−49:25 tight name text
337+49:26 tight name words
338−49:29 tight glyph ]
338+49:31 tight glyph ]
33950:5 NEWLINE
33950:5 NEWLINE
34050:5 lit %none
34050:5 lit %none
34150:11 lit ~
34150:11 lit ~
@@ -363,11 +363,11 @@
36353:5 glyph [
36353:5 glyph [
36453:6 tight lit %item
36453:6 tight lit %item
36553:12 name flag
36553:12 name flag
366−53:17 name text
366+53:17 name words
367−53:21 tight glyph ]
367+53:22 tight glyph ]
368−53:23 glyph ~[
368+53:24 glyph ~[
369−53:25 tight name text
369+53:26 tight name words
370−53:29 tight glyph ]
370+53:31 tight glyph ]
37154:5 NEWLINE
37154:5 NEWLINE
37254:5 lit %none
37254:5 lit %none
37354:11 lit ~
37354:11 lit ~
@@ -400,11 +400,11 @@
40057:5 glyph [
40057:5 glyph [
40157:6 tight lit %item
40157:6 tight lit %item
40257:12 name flag
40257:12 name flag
403−57:17 name text
403+57:17 name words
404−57:21 tight glyph ]
404+57:22 tight glyph ]
405−57:23 glyph ~[
405+57:24 glyph ~[
406−57:25 tight str "text"
406+57:26 tight str "text"
407−57:31 tight glyph ]
407+57:32 tight glyph ]
40858:5 NEWLINE
40858:5 NEWLINE
40958:5 lit %none
40958:5 lit %none
41058:11 lit ~
41058:11 lit ~
@@ -486,9 +486,9 @@
48668:5 glyph [
48668:5 glyph [
48768:6 tight lit %item
48768:6 tight lit %item
48868:12 name flag
48868:12 name flag
489−68:17 name text
489+68:17 name words
490−68:21 tight glyph ]
490+68:22 tight glyph ]
491−68:23 lit %missing
491+68:24 lit %missing
49269:5 NEWLINE
49269:5 NEWLINE
49369:5 lit %none
49369:5 lit %none
49469:11 lit %empty
49469:11 lit %empty
@@ -523,9 +523,9 @@
52373:5 glyph [
52373:5 glyph [
52473:6 tight lit %item
52473:6 tight lit %item
52573:12 name flag
52573:12 name flag
526−73:17 name text
526+73:17 name words
527−73:21 tight glyph ]
527+73:22 tight glyph ]
528−73:23 lit %good
528+73:24 lit %good
52974:5 NEWLINE
52974:5 NEWLINE
53074:5 lit %none
53074:5 lit %none
53174:11 lit %empty
53174:11 lit %empty
tests/golden/types-union-nonwing-subject/tree.txt+26−26
@@ -23,8 +23,8 @@
23 (branch 10:3
23 (branch 10:3
24 (group 10:6 (wing 10:7 x))
24 (group 10:6 (wing 10:7 x))
25 (arm 11:5
25 (arm 11:5
26− (cell 11:5 (lit 11:6 %item) (bind 11:12 flag) (bind 11:17 text))
26+ (cell 11:5 (lit 11:6 %item) (bind 11:12 flag) (bind 11:17 words))
27− (list 11:23 (wing 11:25 text)))
27+ (list 11:24 (wing 11:26 words)))
28 (arm 12:5 (lit 12:5 %none) (lit 12:11 ~)))))))
28 (arm 12:5 (lit 12:5 %none) (lit 12:11 ~)))))))
29 (value 13:1 call
29 (value 13:1 call
30 (gate 13:9
30 (gate 13:9
@@ -36,8 +36,8 @@
36 (group 14:6
36 (group 14:6
37 (call 14:7 (wing 14:7 local-id) (wing 14:16 x)))
37 (call 14:7 (wing 14:7 local-id) (wing 14:16 x)))
38 (arm 15:5
38 (arm 15:5
39− (cell 15:5 (lit 15:6 %item) (bind 15:12 flag) (bind 15:17 text))
39+ (cell 15:5 (lit 15:6 %item) (bind 15:12 flag) (bind 15:17 words))
40− (list 15:23 (wing 15:25 text)))
40+ (list 15:24 (wing 15:26 words)))
41 (arm 16:5 (lit 16:5 %none) (lit 16:11 ~)))))))
41 (arm 16:5 (lit 16:5 %none) (lit 16:11 ~)))))))
42 (value 17:1 nested
42 (value 17:1 nested
43 (gate 17:11
43 (gate 17:11
@@ -52,8 +52,8 @@
52 (group 18:16
52 (group 18:16
53 (call 18:17 (wing 18:17 passthrough) (wing 18:29 x)))))
53 (call 18:17 (wing 18:17 passthrough) (wing 18:29 x)))))
54 (arm 19:5
54 (arm 19:5
55− (cell 19:5 (lit 19:6 %item) (bind 19:12 flag) (bind 19:17 text))
55+ (cell 19:5 (lit 19:6 %item) (bind 19:12 flag) (bind 19:17 words))
56− (lit 19:23 %good))
56+ (lit 19:24 %good))
57 (arm 20:5 (lit 20:5 %none) (lit 20:11 %empty)))))))
57 (arm 20:5 (lit 20:5 %none) (lit 20:11 %empty)))))))
58 (value 21:1 finite
58 (value 21:1 finite
59 (gate 21:11
59 (gate 21:11
@@ -65,11 +65,11 @@
65 (group 22:6
65 (group 22:6
66 (call 22:7 (wing 22:7 local-id) (wing 22:16 x)))
66 (call 22:7 (wing 22:7 local-id) (wing 22:16 x)))
67 (arm 23:5
67 (arm 23:5
68− (cell 23:5 (lit 23:6 %item) (lit 23:12 %.y) (bind 23:16 text))
68+ (cell 23:5 (lit 23:6 %item) (lit 23:12 %.y) (bind 23:16 words))
69− (list 23:22 (wing 23:24 text)))
69+ (list 23:23 (wing 23:25 words)))
70 (arm 24:5
70 (arm 24:5
71− (cell 24:5 (lit 24:6 %item) (lit 24:12 %.n) (bind 24:16 text))
71+ (cell 24:5 (lit 24:6 %item) (lit 24:12 %.n) (bind 24:16 words))
72− (list 24:22))
72+ (list 24:23))
73 (arm 25:5 (lit 25:5 %none) (lit 25:11 ~)))))))
73 (arm 25:5 (lit 25:5 %none) (lit 25:11 ~)))))))
74 (value 26:1 wrong
74 (value 26:1 wrong
75 (gate 26:10
75 (gate 26:10
@@ -81,8 +81,8 @@
81 (group 27:6
81 (group 27:6
82 (call 27:7 (wing 27:7 local-id) (wing 27:16 x)))
82 (call 27:7 (wing 27:7 local-id) (wing 27:16 x)))
83 (arm 28:5
83 (arm 28:5
84− (cell 28:5 (lit 28:6 %item) (bind 28:12 flag) (bind 28:17 text))
84+ (cell 28:5 (lit 28:6 %item) (bind 28:12 flag) (bind 28:17 words))
85− (lit 28:23 %missing))
85+ (lit 28:24 %missing))
86 (arm 29:5 (lit 29:5 %none) (lit 29:11 %empty)))))))
86 (arm 29:5 (lit 29:5 %none) (lit 29:11 %empty)))))))
87 (value 30:1 missing
87 (value 30:1 missing
88 (gate 30:12
88 (gate 30:12
@@ -106,8 +106,8 @@
106 (arm 35:5 (lit 35:5 %none) (lit 35:11 ~))
106 (arm 35:5 (lit 35:5 %none) (lit 35:11 ~))
107 (arm 36:5 (lit 36:5 %none) (lit 36:11 ~))
107 (arm 36:5 (lit 36:5 %none) (lit 36:11 ~))
108 (arm 37:5
108 (arm 37:5
109− (cell 37:5 (lit 37:6 %item) (bind 37:12 flag) (bind 37:17 text))
109+ (cell 37:5 (lit 37:6 %item) (bind 37:12 flag) (bind 37:17 words))
110− (list 37:23 (wing 37:25 text))))))))
110+ (list 37:24 (wing 37:26 words))))))))
111 (value 38:1 shadow
111 (value 38:1 shadow
112 (gate 38:11
112 (gate 38:11
113 (face 38:14 x (ref 38:16 input))
113 (face 38:14 x (ref 38:16 input))
@@ -134,8 +134,8 @@
134 (group 44:8
134 (group 44:8
135 (call 44:9 (wing 44:9 local-id) (wing 44:18 x)))
135 (call 44:9 (wing 44:9 local-id) (wing 44:18 x)))
136 (arm 45:7
136 (arm 45:7
137− (cell 45:7 (lit 45:8 %item) (bind 45:14 flag) (bind 45:19 text))
137+ (cell 45:7 (lit 45:8 %item) (bind 45:14 flag) (bind 45:19 words))
138− (lit 45:25 %good))
138+ (lit 45:26 %good))
139 (arm 46:7 (lit 46:7 %none) (lit 46:13 %empty)))))))))
139 (arm 46:7 (lit 46:7 %none) (lit 46:13 %empty)))))))))
140 (value 47:1 unknown
140 (value 47:1 unknown
141 (gate 47:12
141 (gate 47:12
@@ -147,8 +147,8 @@
147 (group 48:6
147 (group 48:6
148 (call 48:7 (wing 48:7 local-id) (wing 48:16 x)))
148 (call 48:7 (wing 48:7 local-id) (wing 48:16 x)))
149 (arm 49:5
149 (arm 49:5
150− (cell 49:5 (lit 49:6 %item) (bind 49:12 flag) (bind 49:17 text))
150+ (cell 49:5 (lit 49:6 %item) (bind 49:12 flag) (bind 49:17 words))
151− (list 49:23 (wing 49:25 text)))
151+ (list 49:24 (wing 49:26 words)))
152 (arm 50:5 (lit 50:5 %none) (lit 50:11 ~)))))))
152 (arm 50:5 (lit 50:5 %none) (lit 50:11 ~)))))))
153 (value 51:1 nonunion
153 (value 51:1 nonunion
154 (gate 51:13
154 (gate 51:13
@@ -160,8 +160,8 @@
160 (group 52:6
160 (group 52:6
161 (call 52:7 (wing 52:7 local-id) (wing 52:16 x)))
161 (call 52:7 (wing 52:7 local-id) (wing 52:16 x)))
162 (arm 53:5
162 (arm 53:5
163− (cell 53:5 (lit 53:6 %item) (bind 53:12 flag) (bind 53:17 text))
163+ (cell 53:5 (lit 53:6 %item) (bind 53:12 flag) (bind 53:17 words))
164− (list 53:23 (wing 53:25 text)))
164+ (list 53:24 (wing 53:26 words)))
165 (arm 54:5 (lit 54:5 %none) (lit 54:11 ~)))))))
165 (arm 54:5 (lit 54:5 %none) (lit 54:11 ~)))))))
166 (value 55:1 explicit
166 (value 55:1 explicit
167 (gate 55:13
167 (gate 55:13
@@ -175,8 +175,8 @@
175 (group 56:6
175 (group 56:6
176 (call 56:7 (wing 56:7 local-id) (wing 56:16 x)))
176 (call 56:7 (wing 56:7 local-id) (wing 56:16 x)))
177 (arm 57:5
177 (arm 57:5
178− (cell 57:5 (lit 57:6 %item) (bind 57:12 flag) (bind 57:17 text))
178+ (cell 57:5 (lit 57:6 %item) (bind 57:12 flag) (bind 57:17 words))
179− (list 57:23 (str 57:25 "text")))
179+ (list 57:24 (str 57:26 "text")))
180 (arm 58:5 (lit 58:5 %none) (lit 58:11 ~)))))))
180 (arm 58:5 (lit 58:5 %none) (lit 58:11 ~)))))))
181 (mold 59:1 payload
181 (mold 59:1 payload
182 (generic 59:12 A
182 (generic 59:12 A
@@ -211,8 +211,8 @@
211 (group 67:6
211 (group 67:6
212 (call 67:7 (wing 67:7 passthrough) (str 67:19 "wrong")))
212 (call 67:7 (wing 67:7 passthrough) (str 67:19 "wrong")))
213 (arm 68:5
213 (arm 68:5
214− (cell 68:5 (lit 68:6 %item) (bind 68:12 flag) (bind 68:17 text))
214+ (cell 68:5 (lit 68:6 %item) (bind 68:12 flag) (bind 68:17 words))
215− (lit 68:23 %missing))
215+ (lit 68:24 %missing))
216 (arm 69:5 (lit 69:5 %none) (lit 69:11 %empty)))))))
216 (arm 69:5 (lit 69:5 %none) (lit 69:11 %empty)))))))
217 (value 70:1 first-of
217 (value 70:1 first-of
218 (gate 70:13
218 (gate 70:13
@@ -228,8 +228,8 @@
228 (group 72:6
228 (group 72:6
229 (call 72:7 (wing 72:7 first-of) (wing 72:16 x) (lit 72:18 %dangling)))
229 (call 72:7 (wing 72:7 first-of) (wing 72:16 x) (lit 72:18 %dangling)))
230 (arm 73:5
230 (arm 73:5
231− (cell 73:5 (lit 73:6 %item) (bind 73:12 flag) (bind 73:17 text))
231+ (cell 73:5 (lit 73:6 %item) (bind 73:12 flag) (bind 73:17 words))
232− (lit 73:23 %good))
232+ (lit 73:24 %good))
233 (arm 74:5 (lit 74:5 %none) (lit 74:11 %empty)))))))
233 (arm 74:5 (lit 74:5 %none) (lit 74:11 %empty)))))))
234 (value 75:1 duplicate-flag-subject
234 (value 75:1 duplicate-flag-subject
235 (gate 75:27
235 (gate 75:27
tests/golden/types-union-nonwing-subject/types.txt+3−3
@@ -11,9 +11,9 @@ partial inference; module not checked
11/tests/golden/types-union-nonwing-subject/source.jibb:26:24: expected union
11/tests/golden/types-union-nonwing-subject/source.jibb:26:24: expected union
12++ wrong |= x=input ^- result
12++ wrong |= x=input ^- result
13 ^
13 ^
14−/tests/golden/types-union-nonwing-subject/source.jibb:28:23: tag
14+/tests/golden/types-union-nonwing-subject/source.jibb:28:24: tag
15− [%item flag text] %missing
15+ [%item flag words] %missing
16− ^
16+ ^
17++ missing: missing union case [%item [flag=? text=@t]]
17++ missing: missing union case [%item [flag=? text=@t]]
18++ dead: branch arm is covered by earlier arms
18++ dead: branch arm is covered by earlier arms
19/tests/golden/types-union-nonwing-subject/source.jibb:36:5: covered arm
19/tests/golden/types-union-nonwing-subject/source.jibb:36:5: covered arm
tests/golden/types-union-runtime-equality/about.txtnew file+3
@@ -0,0 +1,3 @@
1+source: Grammar, Molds: union cases differ as nouns; `?` is the two loobean atoms, and `!!` is empty.
2+tests: Nested equal zero nouns with different auras overlap; a loobean case contains `%.n`; ancestor and descendant atom auras overlap. An empty nested field makes a case disjoint. Different outer tags remain disjoint even when their nested zero nouns are equal.
3+expect-types: partial mold analysis with both sites of definite overlaps; `keep` infers for the distinct-tag mold. The report does not establish that the other molds or the module are checked.
tests/golden/types-union-runtime-equality/source.jibbnew file+16
@@ -0,0 +1,16 @@
1++$ mixed-zero
2+ [%tag [%.y @t]]
3+ [%tag [%$ @p]]
4++$ flag-one
5+ [%tag ?]
6+ [%tag %.n]
7++$ aura-family
8+ [%tag @ta]
9+ [%tag @t]
10++$ empty-field
11+ [%tag [!! @t]]
12+ [%tag [* @p]]
13++$ distinct-tags
14+ [%left [%.y @t]]
15+ [%right [%$ @p]]
16+++ keep |= x=distinct-tags x
tests/golden/types-union-runtime-equality/tokens.txtnew file+96
@@ -0,0 +1,96 @@
1+1:1 glyph +$
2+1:4 name mixed-zero
3+2:3 INDENT
4+2:3 glyph [
5+2:4 tight lit %tag
6+2:9 glyph [
7+2:10 tight lit %.y
8+2:14 aura @t
9+2:16 tight glyph ]
10+2:17 tight glyph ]
11+3:3 NEWLINE
12+3:3 glyph [
13+3:4 tight lit %tag
14+3:9 glyph [
15+3:10 tight lit %$
16+3:13 aura @p
17+3:15 tight glyph ]
18+3:16 tight glyph ]
19+4:1 DEDENT
20+4:1 NEWLINE
21+4:1 glyph +$
22+4:4 name flag-one
23+5:3 INDENT
24+5:3 glyph [
25+5:4 tight lit %tag
26+5:9 glyph ?
27+5:10 tight glyph ]
28+6:3 NEWLINE
29+6:3 glyph [
30+6:4 tight lit %tag
31+6:9 lit %.n
32+6:12 tight glyph ]
33+7:1 DEDENT
34+7:1 NEWLINE
35+7:1 glyph +$
36+7:4 name aura-family
37+8:3 INDENT
38+8:3 glyph [
39+8:4 tight lit %tag
40+8:9 aura @ta
41+8:12 tight glyph ]
42+9:3 NEWLINE
43+9:3 glyph [
44+9:4 tight lit %tag
45+9:9 aura @t
46+9:11 tight glyph ]
47+10:1 DEDENT
48+10:1 NEWLINE
49+10:1 glyph +$
50+10:4 name empty-field
51+11:3 INDENT
52+11:3 glyph [
53+11:4 tight lit %tag
54+11:9 glyph [
55+11:10 tight glyph !!
56+11:13 aura @t
57+11:15 tight glyph ]
58+11:16 tight glyph ]
59+12:3 NEWLINE
60+12:3 glyph [
61+12:4 tight lit %tag
62+12:9 glyph [
63+12:10 tight glyph *
64+12:12 aura @p
65+12:14 tight glyph ]
66+12:15 tight glyph ]
67+13:1 DEDENT
68+13:1 NEWLINE
69+13:1 glyph +$
70+13:4 name distinct-tags
71+14:3 INDENT
72+14:3 glyph [
73+14:4 tight lit %left
74+14:10 glyph [
75+14:11 tight lit %.y
76+14:15 aura @t
77+14:17 tight glyph ]
78+14:18 tight glyph ]
79+15:3 NEWLINE
80+15:3 glyph [
81+15:4 tight lit %right
82+15:11 glyph [
83+15:12 tight lit %$
84+15:15 aura @p
85+15:17 tight glyph ]
86+15:18 tight glyph ]
87+16:1 DEDENT
88+16:1 NEWLINE
89+16:1 glyph ++
90+16:4 name keep
91+16:9 glyph |=
92+16:12 name x
93+16:13 tight glyph =
94+16:14 tight name distinct-tags
95+16:28 name x
96+16:29 NEWLINE
tests/golden/types-union-runtime-equality/tree.txtnew file+37
@@ -0,0 +1,37 @@
1+(module
2+ (mold 1:1 mixed-zero
3+ (union 2:3
4+ (cell 2:3
5+ (const 2:4 %tag)
6+ (cell 2:9 (const 2:10 %.y) (aura 2:14 @t)))
7+ (cell 3:3
8+ (const 3:4 %tag)
9+ (cell 3:9 (const 3:10 %$) (aura 3:13 @p)))))
10+ (mold 4:1 flag-one
11+ (union 5:3
12+ (cell 5:3 (const 5:4 %tag) (flag 5:9))
13+ (cell 6:3 (const 6:4 %tag) (const 6:9 %.n))))
14+ (mold 7:1 aura-family
15+ (union 8:3
16+ (cell 8:3 (const 8:4 %tag) (aura 8:9 @ta))
17+ (cell 9:3 (const 9:4 %tag) (aura 9:9 @t))))
18+ (mold 10:1 empty-field
19+ (union 11:3
20+ (cell 11:3
21+ (const 11:4 %tag)
22+ (cell 11:9 (void 11:10) (aura 11:13 @t)))
23+ (cell 12:3
24+ (const 12:4 %tag)
25+ (cell 12:9 (noun 12:10) (aura 12:12 @p)))))
26+ (mold 13:1 distinct-tags
27+ (union 14:3
28+ (cell 14:3
29+ (const 14:4 %left)
30+ (cell 14:10 (const 14:11 %.y) (aura 14:15 @t)))
31+ (cell 15:3
32+ (const 15:4 %right)
33+ (cell 15:11 (const 15:12 %$) (aura 15:15 @p)))))
34+ (value 16:1 keep
35+ (gate 16:9
36+ (face 16:12 x (ref 16:14 distinct-tags))
37+ (wing 16:28 x))))
tests/golden/types-union-runtime-equality/types.txtnew file+25
@@ -0,0 +1,25 @@
1+partial inference; module not checked
2++$ mixed-zero: overlapping cases; mold not checked
3+/tests/golden/types-union-runtime-equality/source.jibb:2:3: first union case
4+ [%tag [%.y @t]]
5+ ^
6+/tests/golden/types-union-runtime-equality/source.jibb:3:3: overlapping case
7+ [%tag [%$ @p]]
8+ ^
9++$ flag-one: overlapping cases; mold not checked
10+/tests/golden/types-union-runtime-equality/source.jibb:5:3: first union case
11+ [%tag ?]
12+ ^
13+/tests/golden/types-union-runtime-equality/source.jibb:6:3: overlapping case
14+ [%tag %.n]
15+ ^
16++$ aura-family: overlapping cases; mold not checked
17+/tests/golden/types-union-runtime-equality/source.jibb:8:3: first union case
18+ [%tag @ta]
19+ ^
20+/tests/golden/types-union-runtime-equality/source.jibb:9:3: overlapping case
21+ [%tag @t]
22+ ^
23++$ empty-field: cases proven disjoint; mold not checked
24++$ distinct-tags: cases proven disjoint; mold not checked
25+++ keep: $-(distinct-tags distinct-tags)
tests/golden/types-union-source-alias/about.txtnew file+4
@@ -0,0 +1,4 @@
1+source: Grammar, Unions: "Cases must differ as nouns"; Grammar, Generic molds.
2+tests: A one-hop local generic alias with a literal head is proven disjoint from a different head, including with outer generic parameters. Same-head and equal-noun zero spellings with overlapping payloads report both case sites; this partial report does not claim the full module is checked.
3+expect: parses
4+expect-types: a partial inference report
tests/golden/types-union-source-alias/source.jibbnew file+18
@@ -0,0 +1,18 @@
1++$ tagged |$ [A] [%wrapped A]
2++$ choice
3+ (tagged @t)
4+ [%other @p]
5+++ id |= x=choice x
6++$ poly |$ [A B]
7+ (tagged A)
8+ [%second B]
9+++ typed |= x=(poly @t @p) x
10++$ same
11+ (tagged @t)
12+ [%wrapped @p]
13+++ collide |= x=same x
14++$ zero |$ [A] [%.y A]
15++$ same-zero
16+ (zero @t)
17+ [%$ @p]
18+++ collide-zero |= x=same-zero x
tests/golden/types-union-source-alias/tokens.txtnew file+119
@@ -0,0 +1,119 @@
1+1:1 glyph +$
2+1:4 name tagged
3+1:11 glyph |$
4+1:14 glyph [
5+1:15 tight tvar A
6+1:16 tight glyph ]
7+1:18 glyph [
8+1:19 tight lit %wrapped
9+1:28 tvar A
10+1:29 tight glyph ]
11+2:1 NEWLINE
12+2:1 glyph +$
13+2:4 name choice
14+3:3 INDENT
15+3:3 glyph (
16+3:4 tight name tagged
17+3:11 aura @t
18+3:13 tight glyph )
19+4:3 NEWLINE
20+4:3 glyph [
21+4:4 tight lit %other
22+4:11 aura @p
23+4:13 tight glyph ]
24+5:1 DEDENT
25+5:1 NEWLINE
26+5:1 glyph ++
27+5:4 name id
28+5:7 glyph |=
29+5:10 name x
30+5:11 tight glyph =
31+5:12 tight name choice
32+5:19 name x
33+6:1 NEWLINE
34+6:1 glyph +$
35+6:4 name poly
36+6:9 glyph |$
37+6:12 glyph [
38+6:13 tight tvar A
39+6:15 tvar B
40+6:16 tight glyph ]
41+7:3 INDENT
42+7:3 glyph (
43+7:4 tight name tagged
44+7:11 tvar A
45+7:12 tight glyph )
46+8:3 NEWLINE
47+8:3 glyph [
48+8:4 tight lit %second
49+8:12 tvar B
50+8:13 tight glyph ]
51+9:1 DEDENT
52+9:1 NEWLINE
53+9:1 glyph ++
54+9:4 name typed
55+9:10 glyph |=
56+9:13 name x
57+9:14 tight glyph =
58+9:15 tight glyph (
59+9:16 tight name poly
60+9:21 aura @t
61+9:24 aura @p
62+9:26 tight glyph )
63+9:28 name x
64+10:1 NEWLINE
65+10:1 glyph +$
66+10:4 name same
67+11:3 INDENT
68+11:3 glyph (
69+11:4 tight name tagged
70+11:11 aura @t
71+11:13 tight glyph )
72+12:3 NEWLINE
73+12:3 glyph [
74+12:4 tight lit %wrapped
75+12:13 aura @p
76+12:15 tight glyph ]
77+13:1 DEDENT
78+13:1 NEWLINE
79+13:1 glyph ++
80+13:4 name collide
81+13:12 glyph |=
82+13:15 name x
83+13:16 tight glyph =
84+13:17 tight name same
85+13:22 name x
86+14:1 NEWLINE
87+14:1 glyph +$
88+14:4 name zero
89+14:9 glyph |$
90+14:12 glyph [
91+14:13 tight tvar A
92+14:14 tight glyph ]
93+14:16 glyph [
94+14:17 tight lit %.y
95+14:21 tvar A
96+14:22 tight glyph ]
97+15:1 NEWLINE
98+15:1 glyph +$
99+15:4 name same-zero
100+16:3 INDENT
101+16:3 glyph (
102+16:4 tight name zero
103+16:9 aura @t
104+16:11 tight glyph )
105+17:3 NEWLINE
106+17:3 glyph [
107+17:4 tight lit %$
108+17:7 aura @p
109+17:9 tight glyph ]
110+18:1 DEDENT
111+18:1 NEWLINE
112+18:1 glyph ++
113+18:4 name collide-zero
114+18:17 glyph |=
115+18:20 name x
116+18:21 tight glyph =
117+18:22 tight name same-zero
118+18:32 name x
119+18:33 NEWLINE
tests/golden/types-union-source-alias/tree.txtnew file+41
@@ -0,0 +1,41 @@
1+(module
2+ (mold 1:1 tagged
3+ (generic 1:11 A
4+ (cell 1:18 (const 1:19 %wrapped) (tvar 1:28 A))))
5+ (mold 2:1 choice
6+ (union 3:3
7+ (apply 3:3 tagged (aura 3:11 @t))
8+ (cell 4:3 (const 4:4 %other) (aura 4:11 @p))))
9+ (value 5:1 id
10+ (gate 5:7
11+ (face 5:10 x (ref 5:12 choice))
12+ (wing 5:19 x)))
13+ (mold 6:1 poly
14+ (generic 6:9 A B
15+ (union 7:3
16+ (apply 7:3 tagged (tvar 7:11 A))
17+ (cell 8:3 (const 8:4 %second) (tvar 8:12 B)))))
18+ (value 9:1 typed
19+ (gate 9:10
20+ (face 9:13 x
21+ (apply 9:15 poly (aura 9:21 @t) (aura 9:24 @p)))
22+ (wing 9:28 x)))
23+ (mold 10:1 same
24+ (union 11:3
25+ (apply 11:3 tagged (aura 11:11 @t))
26+ (cell 12:3 (const 12:4 %wrapped) (aura 12:13 @p))))
27+ (value 13:1 collide
28+ (gate 13:12
29+ (face 13:15 x (ref 13:17 same))
30+ (wing 13:22 x)))
31+ (mold 14:1 zero
32+ (generic 14:9 A
33+ (cell 14:16 (const 14:17 %.y) (tvar 14:21 A))))
34+ (mold 15:1 same-zero
35+ (union 16:3
36+ (apply 16:3 zero (aura 16:9 @t))
37+ (cell 17:3 (const 17:4 %$) (aura 17:7 @p))))
38+ (value 18:1 collide-zero
39+ (gate 18:17
40+ (face 18:20 x (ref 18:22 same-zero))
41+ (wing 18:32 x))))
tests/golden/types-union-source-alias/types.txtnew file+23
@@ -0,0 +1,23 @@
1+partial inference; module not checked
2++$ tagged: not checked
3++$ choice: cases proven disjoint; mold not checked
4+++ id: $-(choice choice)
5++$ poly: cases proven disjoint; mold not checked
6+++ typed: $-((poly @t @p) (poly @t @p))
7++$ same: overlapping cases; mold not checked
8+/tests/golden/types-union-source-alias/source.jibb:11:3: first union case
9+ (tagged @t)
10+ ^
11+/tests/golden/types-union-source-alias/source.jibb:12:3: overlapping case
12+ [%wrapped @p]
13+ ^
14+++ collide: sample mold is not supported by partial inference
15++$ zero: not checked
16++$ same-zero: overlapping cases; mold not checked
17+/tests/golden/types-union-source-alias/source.jibb:16:3: first union case
18+ (zero @t)
19+ ^
20+/tests/golden/types-union-source-alias/source.jibb:17:3: overlapping case
21+ [%$ @p]
22+ ^
23+++ collide-zero: sample mold is not supported by partial inference
tests/golden/types-unit-context/source.jibb+3−3
@@ -16,8 +16,8 @@
16++ accept |= x=(unit msg) x
16++ accept |= x=(unit msg) x
17++ call (accept `%stay)
17++ call (accept `%stay)
18++ bad-call (accept `%bad)
18++ bad-call (accept `%bad)
19−++ field ^- record [`%go ~[`"hi"]]
19+++ field-value ^- record [`%go ~[`"hi"]]
20−++ field-bad ^- record [`%bad ~[`"hi"]]
20+++ field-value-bad ^- record [`%bad ~[`"hi"]]
21++ mimic-mismatch ^- (mimic @t) `"hi"
21++ mimic-mismatch ^- (mimic @t) `"hi"
22++ without-context `%go
22++ without-context `%go
23++ pending
23++ pending
@@ -31,7 +31,7 @@
31+$ alt
31+$ alt
32 %go
32 %go
33 %stay
33 %stay
34−++ field-wrong-payload ^- record [`%go ~[`~zod]]
34+++ field-value-wrong-payload ^- record [`%go ~[`~zod]]
35++ wrong-name ^- record [wrong=`%go xs=~[`"hi"]]
35++ wrong-name ^- record [wrong=`%go xs=~[`"hi"]]
36++ wrong-union |= x=alt ^- record [`x ~[`"hi"]]
36++ wrong-union |= x=alt ^- record [`x ~[`"hi"]]
37++ no-field-context |= x=A ^- [a=A] [wrong=x]
37++ no-field-context |= x=A ^- [a=A] [wrong=x]
tests/golden/types-unit-context/tokens.txt+33−33
@@ -169,30 +169,30 @@
16918:26 tight glyph )
16918:26 tight glyph )
17019:1 NEWLINE
17019:1 NEWLINE
17119:1 glyph ++
17119:1 glyph ++
172−19:4 name field
172+19:4 name field-value
173−19:10 glyph ^-
173+19:16 glyph ^-
174−19:13 name record
174+19:19 name record
175−19:20 glyph [
175+19:26 glyph [
176−19:21 tight glyph `
176+19:27 tight glyph `
177−19:22 tight lit %go
177+19:28 tight lit %go
178−19:26 glyph ~[
178+19:32 glyph ~[
179−19:28 tight glyph `
179+19:34 tight glyph `
180−19:29 tight str "hi"
180+19:35 tight str "hi"
181−19:33 tight glyph ]
181+19:39 tight glyph ]
182−19:34 tight glyph ]
182+19:40 tight glyph ]
18320:1 NEWLINE
18320:1 NEWLINE
18420:1 glyph ++
18420:1 glyph ++
185−20:4 name field-bad
185+20:4 name field-value-bad
186−20:14 glyph ^-
186+20:20 glyph ^-
187−20:17 name record
187+20:23 name record
188−20:24 glyph [
188+20:30 glyph [
189−20:25 tight glyph `
189+20:31 tight glyph `
190−20:26 tight lit %bad
190+20:32 tight lit %bad
191−20:31 glyph ~[
191+20:37 glyph ~[
192−20:33 tight glyph `
192+20:39 tight glyph `
193−20:34 tight str "hi"
193+20:40 tight str "hi"
194−20:38 tight glyph ]
194+20:44 tight glyph ]
195−20:39 tight glyph ]
195+20:45 tight glyph ]
19621:1 NEWLINE
19621:1 NEWLINE
19721:1 glyph ++
19721:1 glyph ++
19821:4 name mimic-mismatch
19821:4 name mimic-mismatch
@@ -278,17 +278,17 @@
27834:1 DEDENT
27834:1 DEDENT
27934:1 NEWLINE
27934:1 NEWLINE
28034:1 glyph ++
28034:1 glyph ++
281−34:4 name field-wrong-payload
281+34:4 name field-value-wrong-payload
282−34:24 glyph ^-
282+34:30 glyph ^-
283−34:27 name record
283+34:33 name record
284−34:34 glyph [
284+34:40 glyph [
285−34:35 tight glyph `
285+34:41 tight glyph `
286−34:36 tight lit %go
286+34:42 tight lit %go
287−34:40 glyph ~[
287+34:46 glyph ~[
288−34:42 tight glyph `
288+34:48 tight glyph `
289−34:43 tight lit ~zod
289+34:49 tight lit ~zod
290−34:47 tight glyph ]
290+34:53 tight glyph ]
291−34:48 tight glyph ]
291+34:54 tight glyph ]
29235:1 NEWLINE
29235:1 NEWLINE
29335:1 glyph ++
29335:1 glyph ++
29435:4 name wrong-name
29435:4 name wrong-name
tests/golden/types-unit-context/tree.txt+21−21
@@ -70,20 +70,20 @@
70 (call 18:14
70 (call 18:14
71 (wing 18:14 accept)
71 (wing 18:14 accept)
72 (unit 18:21 (lit 18:22 %bad)))))
72 (unit 18:21 (lit 18:22 %bad)))))
73− (value 19:1 field
73+ (value 19:1 field-value
74− (cast 19:10
74+ (cast 19:16
75− (ref 19:13 record)
75+ (ref 19:19 record)
76− (tuple 19:20
76+ (tuple 19:26
77− (unit 19:21 (lit 19:22 %go))
77+ (unit 19:27 (lit 19:28 %go))
78− (list 19:26
78+ (list 19:32
79− (unit 19:28 (str 19:29 "hi"))))))
79+ (unit 19:34 (str 19:35 "hi"))))))
80− (value 20:1 field-bad
80+ (value 20:1 field-value-bad
81− (cast 20:14
81+ (cast 20:20
82− (ref 20:17 record)
82+ (ref 20:23 record)
83− (tuple 20:24
83+ (tuple 20:30
84− (unit 20:25 (lit 20:26 %bad))
84+ (unit 20:31 (lit 20:32 %bad))
85− (list 20:31
85+ (list 20:37
86− (unit 20:33 (str 20:34 "hi"))))))
86+ (unit 20:39 (str 20:40 "hi"))))))
87 (value 21:1 mimic-mismatch
87 (value 21:1 mimic-mismatch
88 (cast 21:19
88 (cast 21:19
89 (apply 21:22 mimic (aura 21:29 @t))
89 (apply 21:22 mimic (aura 21:29 @t))
@@ -120,13 +120,13 @@
120 (unit 30:29 (str 30:30 "hi")))))
120 (unit 30:29 (str 30:30 "hi")))))
121 (mold 31:1 alt
121 (mold 31:1 alt
122 (union 32:3 (const 32:3 %go) (const 33:3 %stay)))
122 (union 32:3 (const 32:3 %go) (const 33:3 %stay)))
123− (value 34:1 field-wrong-payload
123+ (value 34:1 field-value-wrong-payload
124− (cast 34:24
124+ (cast 34:30
125− (ref 34:27 record)
125+ (ref 34:33 record)
126− (tuple 34:34
126+ (tuple 34:40
127− (unit 34:35 (lit 34:36 %go))
127+ (unit 34:41 (lit 34:42 %go))
128− (list 34:40
128+ (list 34:46
129− (unit 34:42 (lit 34:43 ~zod))))))
129+ (unit 34:48 (lit 34:49 ~zod))))))
130 (value 35:1 wrong-name
130 (value 35:1 wrong-name
131 (cast 35:15
131 (cast 35:15
132 (ref 35:18 record)
132 (ref 35:18 record)
tests/golden/types-unit-context/types.txt+15−15
@@ -43,14 +43,14 @@ partial inference; module not checked
43/tests/golden/types-unit-context/source.jibb:18:22: tag
43/tests/golden/types-unit-context/source.jibb:18:22: tag
44++ bad-call (accept `%bad)
44++ bad-call (accept `%bad)
45 ^
45 ^
46−++ field: [u=(unit msg) xs=(list (unit @t))]
46+++ field-value: [u=(unit msg) xs=(list (unit @t))]
47−++ field-bad: msg has no case `%bad`
47+++ field-value-bad: msg has no case `%bad`
48−/tests/golden/types-unit-context/source.jibb:20:17: expected union
48+/tests/golden/types-unit-context/source.jibb:20:23: expected union
49−++ field-bad ^- record [`%bad ~[`"hi"]]
49+++ field-value-bad ^- record [`%bad ~[`"hi"]]
50− ^
50+ ^
51−/tests/golden/types-unit-context/source.jibb:20:26: tag
51+/tests/golden/types-unit-context/source.jibb:20:32: tag
52−++ field-bad ^- record [`%bad ~[`"hi"]]
52+++ field-value-bad ^- record [`%bad ~[`"hi"]]
53− ^
53+ ^
54++ mimic-mismatch: cast constraint is not supported by partial inference
54++ mimic-mismatch: cast constraint is not supported by partial inference
55++ without-context: tag needs context in partial inference
55++ without-context: tag needs context in partial inference
56++ pending: tag needs context in partial inference
56++ pending: tag needs context in partial inference
@@ -58,13 +58,13 @@ partial inference; module not checked
58++ preserve: $-(A (unit A))
58++ preserve: $-(A (unit A))
59++ force: explicit capital constraints are not supported by partial inference
59++ force: explicit capital constraints are not supported by partial inference
60+$ alt: cases proven disjoint; mold not checked
60+$ alt: cases proven disjoint; mold not checked
61−++ field-wrong-payload: unit payload does not fit its expected type
61+++ field-value-wrong-payload: unit payload does not fit its expected type
62−/tests/golden/types-unit-context/source.jibb:34:27: expected unit payload has type @t
62+/tests/golden/types-unit-context/source.jibb:34:33: expected unit payload has type @t
63−++ field-wrong-payload ^- record [`%go ~[`~zod]]
63+++ field-value-wrong-payload ^- record [`%go ~[`~zod]]
64− ^
64+ ^
65−/tests/golden/types-unit-context/source.jibb:34:43: payload has type @p
65+/tests/golden/types-unit-context/source.jibb:34:49: payload has type @p
66−++ field-wrong-payload ^- record [`%go ~[`~zod]]
66+++ field-value-wrong-payload ^- record [`%go ~[`~zod]]
67− ^
67+ ^
68++ wrong-name: cast mold and expression type do not unify
68++ wrong-name: cast mold and expression type do not unify
69/tests/golden/types-unit-context/source.jibb:35:18: cast mold
69/tests/golden/types-unit-context/source.jibb:35:18: cast mold
70++ wrong-name ^- record [wrong=`%go xs=~[`"hi"]]
70++ wrong-name ^- record [wrong=`%go xs=~[`"hi"]]
tests/importer/about.txt+3−1
@@ -9,7 +9,9 @@ explicit union argument when the exact call wrapper and collection provenance
9are validated and all union cases are static and pairwise disjoint. Cases
9are validated and all union cases are static and pairwise disjoint. Cases
10cover overlap, collapsed branches, multiple or nested unions, dependent
10cover overlap, collapsed branches, multiple or nested unions, dependent
11branches, forged subject, sample and tail wrappers, and a shadowed
11branches, forged subject, sample and tail wrappers, and a shadowed
12+collection. `explicit-unknown` has distinct outer tags and a local `word` alias
13+for `@t`, so its source cases can be proved disjoint. `explicit-wut-overlap` and `explicit-collapsed`
12−collection. Tagged source cases exercise bare null payloads, overlapping tags and hidden
14+now have positive overlap witnesses from the original source cases. Tagged source cases exercise bare null payloads, overlapping tags and hidden
13invalid dependencies, named payload dependencies, valid and collapsed enums,
15invalid dependencies, named payload dependencies, valid and collapsed enums,
14direct and transitively aliased overlaps, nested collections, shadowed jar and
16direct and transitively aliased overlaps, nested collections, shadowed jar and
15jug dependencies, Ford-name collisions, zuse local-name precedence and the
17jug dependencies, Ford-name collisions, zuse local-name precedence and the
tests/importer/tree.txt+3−3
@@ -74,11 +74,11 @@ explicit-graph: error: Hoon union disjointness could not be verified
74explicit-graph-unsupported: error: signed and float auras cannot be imported
74explicit-graph-unsupported: error: signed and float auras cannot be imported
75explicit-wut-safe: (union [ok @ud] [err @t])
75explicit-wut-safe: (union [ok @ud] [err @t])
76explicit-percent-overlap: error: Hoon union disjointness could not be verified
76explicit-percent-overlap: error: Hoon union disjointness could not be verified
77−explicit-wut-overlap: error: Hoon union disjointness could not be verified
77+explicit-wut-overlap: error: Hoon union cases overlap
78−explicit-collapsed: error: Hoon union disjointness could not be verified
78+explicit-collapsed: error: Hoon union cases overlap
79explicit-subsumed: error: Hoon union disjointness could not be verified
79explicit-subsumed: error: Hoon union disjointness could not be verified
80explicit-three: (union [a @ud] [b @t] [c @p])
80explicit-three: (union [a @ud] [b @t] [c @p])
81−explicit-unknown: error: a Hoon union needs a source-level disjointness check
81+explicit-unknown: (union [x @t] [y @t])
82explicit-nested: error: Hoon union disjointness could not be verified
82explicit-nested: error: Hoon union disjointness could not be verified
83collection-union-wrapper: valid; forged subject, sample and tail rejected
83collection-union-wrapper: valid; forged subject, sample and tail rejected
84collection-union-list: (list (union [x @ud] [y @t]))
84collection-union-list: (list (union [x @ud] [y @t]))
tests/lib/jibb-bridge.hoon+5−2
@@ -136,6 +136,9 @@
136 [%fixture %raw-rec [%& [%ref %fixture %chain]]]
136 [%fixture %raw-rec [%& [%ref %fixture %chain]]]
137 [%fixture %bad-arity [%& [%apply %list ~[[%atom %t ~] [%atom %ud ~]]]]]
137 [%fixture %bad-arity [%& [%apply %list ~[[%atom %t ~] [%atom %ud ~]]]]]
138 [%fixture %bad-argument [%& [%apply %list ~[[%fork ~[[%atom %tas [~ %a]] [%atom %tas [~ %a]]]]]]]]
138 [%fixture %bad-argument [%& [%apply %list ~[[%fork ~[[%atom %tas [~ %a]] [%atom %tas [~ %a]]]]]]]]
139+ [%fixture %mixed-zero (read-named-diagnostic:jibb-import %fixture %mixed-zero cor)]
140+ [%fixture %separate-tags (read %separate-tags)]
141+ [%fixture %separate-terms (read %separate-terms)]
139 [%fixture %nested-choice (read %nested-choice)]
142 [%fixture %nested-choice (read %nested-choice)]
140 [%fixture %collapsed (read %collapsed)]
143 [%fixture %collapsed (read %collapsed)]
141 [%fixture %dollar (read %dollar)]
144 [%fixture %dollar (read %dollar)]
@@ -150,7 +153,7 @@
150 [%fixture %duplicate [%& [%atom %ud ~]]]
153 [%fixture %duplicate [%& [%atom %ud ~]]]
151 [%missing %title [%& [%atom %t ~]]]
154 [%missing %title [%& [%atom %t ~]]]
152 ==
155 ==
153− =/ report=@t (golden-types-imports:jibb /test/jibb src external)
156+ =/ report=@t (golden-types-with-reader-diagnostics:jibb /test/jibb src external ~)
154 =/ dep=@t (crip "/- fixture\0a++ chain-id |= x=chain.fixture x\0a")
157 =/ dep=@t (crip "/- fixture\0a++ chain-id |= x=chain.fixture x\0a")
155 =/ root=@t (crip "/= helper /ui/helper\0a++ use chain-id.helper\0a")
158 =/ root=@t (crip "/= helper /ui/helper\0a++ use chain-id.helper\0a")
156 =/ prelude=@t (crip "++ prelude-id |= x x\0a")
159 =/ prelude=@t (crip "++ prelude-id |= x x\0a")
@@ -161,5 +164,5 @@
161 (crip "/- fixture\0a++ canonical ^- (unit @t) `\"hi\"\0a++ lookalike ^- zero-lookalike.fixture `\"hi\"\0a")
164 (crip "/- fixture\0a++ canonical ^- (unit @t) `\"hi\"\0a++ lookalike ^- zero-lookalike.fixture `\"hi\"\0a")
162 =/ unit-report=@t
165 =/ unit-report=@t
163 (golden-types-with-prelude:jibb /ui/unit-client/jibb unit-client external ~ ~ unit-prelude)
166 (golden-types-with-prelude:jibb /ui/unit-client/jibb unit-client external ~ ~ unit-prelude)
164− (cat 3 report (cat 3 (crip "\0areader-collapsed: {(show-result:jibb-import (read %collapsed))}\0a") (cat 3 hidden (cat 3 '\0a' (cat 3 unit-report (cat 3 '\0a' (cat 3 noun-synthetic (cat 3 '\0a' (cat 3 recursive-list-synthetic (cat 3 '\0a' named-recursive-synthetic))))))))))
167+ (cat 3 report (cat 3 (crip "\0areader-collapsed: {(show-result:jibb-import (read %collapsed))}\0areader-mixed-zero: {(show-result:jibb-import (read %mixed-zero))}\0areader-separate-tags: {(show-result:jibb-import (read %separate-tags))}\0areader-separate-terms: {(show-result:jibb-import (read %separate-terms))}\0a") (cat 3 hidden (cat 3 '\0a' (cat 3 unit-report (cat 3 '\0a' (cat 3 noun-synthetic (cat 3 '\0a' (cat 3 recursive-list-synthetic (cat 3 '\0a' named-recursive-synthetic))))))))))
165--
168--
tests/lib/jibb-cell-branch.hoonnew file+53
@@ -0,0 +1,53 @@
1+:: Bounded closed-cell branch context; no runtime or island claim.
2+/+ jibb
3+/* public %jibb /lib/jibb/prelude/jibb
4+/* internal %jibb /lib/jibb/internal/jibb
5+/* good %txt /tests/type-cell-branch/good/txt
6+/* bad %txt /tests/type-cell-branch/bad/txt
7+|%
8+++ text
9+ |= lines=wain
10+ ^- @t
11+ (rap 3 (turn lines |=(line=@t (cat 3 line '\0a'))))
12+++ test-cell-branch
13+ ^- tang
14+ ?~ good ~[leaf+"cell branch good source missing"]
15+ ?~ bad ~[leaf+"cell branch bad source missing"]
16+ =/ prep=(unit iprelude:jibb) (prepare-prelude-with-internal:jibb public internal)
17+ ?~ prep ~[leaf+"cell branch prelude unavailable"]
18+ =/ a (parse:jibb /tests/branch/jibb (text good))
19+ =/ b (parse:jibb /tests/branch/jibb (text bad))
20+ ?: |(?=(%| -.a) ?=(%| -.b)) ~[leaf+"cell branch source parse failed"]
21+ =/ ad=(list def:jibb) defs.p.a
22+ =/ bd=(list def:jibb) defs.p.b
23+ ?. &(?=([* ~] ad) ?=([* ~] bd) ?=(%value -.i.ad) ?=(%value -.i.bd))
24+ ~[leaf+"cell branch declarations unavailable"]
25+ =/ unit-scheme=(unit ischeme:jibb) (find-jibb-mold:jibb %unit iface.u.prep)
26+ ?~ unit-scheme ~[leaf+"cell branch unit unavailable"]
27+ =/ computed=(unit itype:jibb) (template-apply:jibb u.unit-scheme ~[[%atom %t]])
28+ ?~ computed ~[leaf+"cell branch unit instantiation failed"]
29+ =/ expected=itype:jibb [%cell [%atom %t] u.computed]
30+ =/ env=ienv:jibb ~[[%flag [[%flag ~] ~]]]
31+ =/ state=istate:jibb *istate:jibb
32+ =. state state(prelude `iface.u.prep, jrec-fuel 256)
33+ =/ original=iresult:jibb (infer-fragment:jibb val.i.bd env state)
34+ =/ failed=iresult:jibb (infer-closed-cell-branch:jibb val.i.bd expected env state (span-of:jibb val.i.bd))
35+ =/ success=iresult:jibb (infer-closed-cell-branch:jibb val.i.ad expected env state (span-of:jibb val.i.ad))
36+ =/ hidden=isub:jibb ~[[55 [%face %x [%atom %t]]]]
37+ ?. (closed-cell-branch-eligible:jibb val.i.bd expected ~) ~[leaf+"negative branch is not eligible"]
38+ ?. ?=(%| -.original) ~[leaf+"original negative branch unexpectedly inferred"]
39+ ?. =(original failed) ~[leaf+"failed retry changed the original result"]
40+ ?. ?=(%& -.success) ~[leaf+"valid closed branch did not infer"]
41+ ?: (closed-cell-branch-eligible:jibb val.i.ad expected hidden) ~[leaf+"structural substitution accepted"]
42+ =/ atom=expr:jibb *expr:jibb
43+ =/ nodes=(list expr:jibb) (reap 512 atom)
44+ ?. (closed-cell-retry-safe:jibb nodes 512) ~[leaf+"exact source budget rejected"]
45+ ?: (closed-cell-retry-safe:jibb [atom nodes] 512) ~[leaf+"source budget exceeded"]
46+ =/ binding=ibinding:jibb [55 [%atom %t]]
47+ =/ subs=isub:jibb (reap 512 binding)
48+ ?. (closed-cell-sub-safe:jibb subs 512) ~[leaf+"exact substitution budget rejected"]
49+ ?: (closed-cell-sub-safe:jibb [binding subs] 512) ~[leaf+"substitution budget exceeded"]
50+ =/ nested=expr:jibb [%branch *span:jibb atom ~]
51+ ?: (closed-cell-retry-safe:jibb ~[nested] 512) ~[leaf+"recursive retry was not excluded"]
52+ ~
53+--
tests/lib/jibb-deferred-context.hoonnew file+83
@@ -0,0 +1,83 @@
1+/+ jibb
2+/* rich %txt /tests/type-deferred-context/rich/txt
3+/* plain %txt /tests/type-deferred-context/plain/txt
4+/* simple %txt /tests/type-deferred-context/simple/txt
5+/* missing %txt /tests/type-deferred-context/missing/txt
6+/* wrong %txt /tests/type-deferred-context/wrong/txt
7+/* duplicate %txt /tests/type-deferred-context/duplicate/txt
8+/* dangling %txt /tests/type-deferred-context/dangling/txt
9+/* collision-early %txt /tests/type-deferred-context/collision-early/txt
10+/* collision-late %txt /tests/type-deferred-context/collision-late/txt
11+/* expected %txt /tests/type-deferred-context/report/txt
12+|%
13+++ text
14+ |= lines=wain
15+ ^- @t
16+ (rap 3 (turn lines |=(line=@t (cat 3 line '\0a'))))
17+++ test-context
18+ ^- tang
19+ =/ at=path /ui/context/jibb
20+ =/ good=(list wain) ~[rich plain simple]
21+ =/ bad=(list wain) ~[missing wrong duplicate dangling collision-early collision-late]
22+ ?. (levy (weld good bad) |=(src=wain ?=(^ src))) ~[leaf+"source missing"]
23+ =/ source=@t (text rich)
24+ =/ parsed (parse:jibb at source)
25+ ?: ?=(%| -.parsed) ~[leaf+"positive source does not parse"]
26+ =/ result=jfile-result:jibb (infer-jibb-file:jibb at source ~ ~ ~ ~[at] ~ ~ ~ ~)
27+ ?: ?=(%| -.result) ~[leaf+"positive library did not publish"]
28+ =/ values=ienv:jibb values.iface.p.result
29+ =/ built=(unit ischeme:jibb) (ienv-lookup:jibb %built values)
30+ ?~ built ~[leaf+"built missing"]
31+ ?~ vars.u.built ~[leaf+"principal polymorphism lost"]
32+ ?^ t.vars.u.built ~[leaf+"unexpected additional quantifiers"]
33+ =/ built-type=itype:jibb typ.u.built
34+ ?. ?=(%fn -.built-type) ~[leaf+"built is not a gate"]
35+ ?. ?=(%var -.sample.built-type) ~[leaf+"built sample is not generic"]
36+ ?. =(sample.built-type product.built-type) ~[leaf+"built input and result differ"]
37+ ?. =(id.sample.built-type i.vars.u.built) ~[leaf+"built quantified identity differs"]
38+ =/ reveal=(unit ischeme:jibb) (ienv-lookup:jibb %reveal values)
39+ =/ reveal-ship=(unit ischeme:jibb) (ienv-lookup:jibb %reveal-ship values)
40+ ?~ reveal ~[leaf+"text result missing"]
41+ ?~ reveal-ship ~[leaf+"ship result missing"]
42+ ?. ?=([%atom %t] typ.u.reveal) ~[leaf+"text result changed"]
43+ ?. ?=([%atom %p] typ.u.reveal-ship) ~[leaf+"ship result changed"]
44+ =/ report=@t (golden-types-with-marks:jibb at source ~ ~)
45+ ?. =((to-wain:format (cat 3 report '\0a')) expected) ~[leaf+"report differs from committed types"]
46+ =/ rest-good=(list wain) ~[plain simple]
47+ =/ checked=?
48+ %+ levy rest-good
49+ |= src=wain
50+ =/ source=@t (text src)
51+ =/ parsed (parse:jibb at source)
52+ ?: ?=(%| -.parsed) |
53+ =/ result=jfile-result:jibb (infer-jibb-file:jibb at source ~ ~ ~ ~[at] ~ ~ ~ ~)
54+ ?=(%& -.result)
55+ ?. checked ~[leaf+"simple positive declined or did not parse"]
56+ =. checked
57+ %+ levy bad
58+ |= src=wain
59+ =/ source=@t (text src)
60+ =/ parsed (parse:jibb at source)
61+ ?: ?=(%| -.parsed) |
62+ =/ result=jfile-result:jibb (infer-jibb-file:jibb at source ~ ~ ~ ~[at] ~ ~ ~ ~)
63+ ?=(%| -.result)
64+ ?. checked ~[leaf+"negative source published or did not parse"]
65+ =/ literal=lit:jibb [%term %tas %none '%none']
66+ =/ actual=itype:jibb [%tag 10 literal |]
67+ =/ st=istate:jibb *istate:jibb
68+ =. st st(next 20)
69+ ?^ (dg-stage:jibb ~ ~ ~ st ~ 65) ~[leaf+"oversized retry fuel accepted"]
70+ ?^ (dg-stage:jibb defs.p.parsed ~ ~ st ~ 0) ~[leaf+"source beyond retry fuel accepted"]
71+ =/ atom=itype:jibb [%const literal]
72+ =/ faced=itype:jibb [%face %named atom]
73+ =/ union=itype:jibb [%union ~[atom [%cell [%const [%term %tas %some '%some']] [%face %value [%atom %t]]]] ~ ~ ~]
74+ =/ faced-case=itype:jibb [%union ~[faced] ~ ~ ~]
75+ =/ fit
76+ |= target=itype:jibb
77+ ^- ?
78+ =/ edge=dgo:jibb [actual target *span:jibb *span:jibb]
79+ ?=(^ (dg-replay-edges:jibb ~[edge] st 64))
80+ ?. &((fit atom) (fit union)) ~[leaf+"plain literal replay declined"]
81+ ?: |((fit faced) (fit faced-case)) ~[leaf+"faced literal replay accepted"]
82+ ~
83+--
tests/lib/jibb-deferred-prepared.hoonnew file+114
@@ -0,0 +1,114 @@
1+:: Prepared-prelude initializer recovery remains a partial report only.
2+/+ jibb
3+/* prelude %jibb /lib/jibb/prelude/jibb
4+/* internal %jibb /lib/jibb/internal/jibb
5+/* good %txt /tests/type-deferred-prepared/good/txt
6+/* tuple-only %txt /tests/type-deferred-prepared/tuple-only/txt
7+/* wrong-unit %txt /tests/type-deferred-prepared/wrong-unit/txt
8+/* wrong-draft %txt /tests/type-deferred-prepared/wrong-draft/txt
9+/* unrelated-tag %txt /tests/type-deferred-prepared/unrelated-tag/txt
10+/* mold-collision %txt /tests/type-deferred-prepared/mold-collision/txt
11+/* no-final-cast %txt /tests/type-deferred-prepared/no-final-cast/txt
12+/* no-prelude %txt /tests/type-deferred-prepared/no-prelude/txt
13+/* main-source %txt /tests/type-deferred-prepared/main/txt
14+/* imported %txt /tests/type-deferred-prepared/imported/txt
15+/* expected %txt /tests/type-deferred-prepared/expected/txt
16+/* expected-control %txt /tests/type-deferred-prepared/expected-control/txt
17+/* expected-tuple-only %txt /tests/type-deferred-prepared/expected-tuple-only/txt
18+|%
19+++ text
20+ |= lines=wain
21+ ^- @t
22+ (rap 3 (turn lines |=(line=@t (cat 3 line '\0a'))))
23+++ check-prepared
24+ |= [where=path source=wain valid=?]
25+ ^- tang
26+ ?~ source ~[leaf+"source fixture missing"]
27+ =/ src=@t (text source)
28+ =/ parsed (parse:jibb where src)
29+ ?: ?=(%| -.parsed) ~[leaf+"source does not parse"]
30+ =/ prepared=(unit iprelude:jibb) (prepare-prelude-with-internal:jibb prelude internal)
31+ ?~ prepared ~[leaf+"prelude unavailable"]
32+ =/ recovered=? ?=(^ (dg-root-prepared:jibb where src u.prepared))
33+ ?. =(valid recovered) ~[leaf+"prepared initializer transaction result changed"]
34+ ~
35+++ check-no-prelude
36+ ^- tang
37+ =/ at=path /ui/prepared/jibb
38+ =/ src=@t (text no-prelude)
39+ ?: ?=(^ (dg-root-source:jibb at src))
40+ ~[leaf+"no-prelude source transaction recovered tuple initializer"]
41+ =/ legacy=jfile-result:jibb
42+ (infer-jibb-file:jibb at src ~ ~ ~ ~[at] ~ ~ ~ ~)
43+ ?: ?=(%& -.legacy) ~[leaf+"no-prelude resolver published recovered tuple initializer"]
44+ ~
45+++ check-ordinary
46+ ^- tang
47+ =/ prepared=(unit iprelude:jibb) (prepare-prelude-with-internal:jibb prelude internal)
48+ ?~ prepared ~[leaf+"prelude unavailable"]
49+ =/ at=path /ui/prepared/jibb
50+ =/ ordinary=jfile-result:jibb
51+ (infer-jibb-file:jibb at (text good) ~ ~ ~ ~[at] values.u.prepared molds.u.prepared ~ `iface.u.prepared)
52+ ?: ?=(%& -.ordinary) ~[leaf+"ordinary full-module path published recovered initializer"]
53+ ~
54+++ check-report
55+ |= [source=wain wanted=wain]
56+ ^- tang
57+ ?~ source ~[leaf+"report source fixture missing"]
58+ ?~ wanted ~[leaf+"expected report fixture missing"]
59+ =/ prepared=(unit iprelude:jibb) (prepare-prelude-with-internal:jibb prelude internal)
60+ ?~ prepared ~[leaf+"prelude unavailable"]
61+ =/ report=@t (golden-types-with-prepared-prelude:jibb /ui/prepared/jibb (text source) ~ ~ ~ prepared)
62+ =/ report-lines=wain (to-wain:format (cat 3 report '\0a'))
63+ ?~ report-lines ~[leaf+"prepared report is empty"]
64+ ?. =('partial inference; module not checked' i.report-lines)
65+ ~[leaf+"partial disclaimer changed"]
66+ ?. =(report-lines wanted) ~[leaf+"prepared report differs from exact recovered types"]
67+ ~
68+++ check-prepared-binding
69+ ^- tang
70+ =/ prepared=(unit iprelude:jibb) (prepare-prelude-with-internal:jibb prelude internal)
71+ ?~ prepared ~[leaf+"prelude unavailable"]
72+ =/ at=path /ui/prepared/jibb
73+ =/ src=@t (text good)
74+ =/ pre=(unit ifile:jibb) `iface.u.prepared
75+ =/ report
76+ |= [vals=(list term) ms=(list term) p=(unit ifile:jibb) prep=(unit iprelude:jibb)]
77+ ^- @t
78+ (golden-types-in-context-core:jibb at src ~ ~ ~ vals ms p prep)
79+ =/ vals=(list term) values.u.prepared
80+ =/ ms=(list term) molds.u.prepared
81+ ?: =((report vals ms pre prepared) (report vals ms pre ~))
82+ ~[leaf+"exact prepared binding did not recover the initializer"]
83+ ?. =((report ~ ms pre prepared) (report ~ ms pre ~))
84+ ~[leaf+"mismatched value inventory reached prepared recovery"]
85+ ?. =((report vals ~ pre prepared) (report vals ~ pre ~))
86+ ~[leaf+"mismatched mold inventory reached prepared recovery"]
87+ ?. =((report vals ms ~ prepared) (report vals ms ~ ~))
88+ ~[leaf+"mismatched prelude interface reached prepared recovery"]
89+ ~
90+++ test-prepared
91+ ^- tang
92+ =/ at=path /ui/prepared/jibb
93+ =/ checks=(list tang)
94+ :~ (check-prepared at good &)
95+ (check-prepared at tuple-only &)
96+ (check-prepared at no-prelude &)
97+ (check-prepared at wrong-unit |)
98+ (check-prepared at wrong-draft |)
99+ (check-prepared at unrelated-tag |)
100+ (check-prepared at mold-collision |)
101+ (check-prepared at no-final-cast |)
102+ (check-prepared at main-source |)
103+ (check-prepared at imported |)
104+ (check-prepared /ui/api/prepared/jibb good |)
105+ (check-prepared /ui/stores/prepared/jibb good |)
106+ check-no-prelude
107+ check-ordinary
108+ check-prepared-binding
109+ (check-report good expected)
110+ (check-report tuple-only expected-tuple-only)
111+ (check-report no-final-cast expected-control)
112+ ==
113+ (zing checks)
114+--
tests/lib/jibb-deferred-resolver.hoonnew file+113
@@ -0,0 +1,113 @@
1+:: Source-level normal resolver and report integration; no island claim.
2+/+ jibb
3+/* good %txt /tests/type-deferred-resolver/good/txt
4+/* conflict %txt /tests/type-deferred-resolver/conflict/txt
5+/* missing %txt /tests/type-deferred-resolver/missing/txt
6+/* hole %txt /tests/type-deferred-resolver/hole/txt
7+/* duplicate %txt /tests/type-deferred-resolver/duplicate/txt
8+/* face %txt /tests/type-deferred-resolver/face/txt
9+/* store %txt /tests/type-deferred-resolver/store/txt
10+/* stability-early %txt /tests/type-deferred-resolver/stability-early/txt
11+/* stability-late %txt /tests/type-deferred-resolver/stability-late/txt
12+/* stability-simple-early %txt /tests/type-deferred-resolver/stability-simple-early/txt
13+/* stability-simple-late %txt /tests/type-deferred-resolver/stability-simple-late/txt
14+/* stability-output-early %txt /tests/type-deferred-resolver/stability-output-early/txt
15+/* stability-output-late %txt /tests/type-deferred-resolver/stability-output-late/txt
16+/* stability-slot-early %txt /tests/type-deferred-resolver/stability-slot-early/txt
17+/* stability-slot-late %txt /tests/type-deferred-resolver/stability-slot-late/txt
18+/* public %jibb /lib/jibb/prelude/jibb
19+/* internal %jibb /lib/jibb/internal/jibb
20+/* expected %txt /tests/type-deferred-resolver/expected/txt
21+|%
22+++ text
23+ |= lines=wain
24+ ^- @t
25+ (rap 3 (turn lines |=(line=@t (cat 3 line '\0a'))))
26+++ case-no-fallback
27+ |= [source=@t public=@t internal=@t]
28+ ^- @t
29+ =/ prep=(unit iprelude:jibb) (prepare-prelude-with-internal:jibb public internal)
30+ ?~ prep 'BAD prelude'
31+ =/ plain=(each module:jibb error:jibb) (parse:jibb /ui/test/jibb source)
32+ ?: ?=(%| -.plain) 'BAD source parse:jibb'
33+ ?. (module-scope-valid:jibb p.plain values.u.prep molds.u.prep) 'BAD prelude scope'
34+ =/ prelude-result=jfile-result:jibb (infer-jibb-file:jibb /ui/test/jibb source ~ ~ ~ ~[/ui/test/jibb] values.u.prep molds.u.prep ~ `iface.u.prep)
35+ ?: ?=(%& -.prelude-result) 'BAD prepared prelude fallback'
36+ =/ imported-source=@t (cat 3 '/= dep /ui/dep\0a' source)
37+ =/ dependencies=jbundle:jibb ~[[/ui/dep/jibb '++ value 1']]
38+ =/ parsed=(each module:jibb error:jibb) (parse:jibb /ui/test/jibb imported-source)
39+ ?: ?=(%| -.parsed) 'BAD import source parse:jibb'
40+ =/ deps=jimports-result:jibb (resolve-jibb-imports:jibb imports.p.parsed ~ ~ dependencies ~[/ui/test/jibb] ~ ~ ~ ~)
41+ ?: ?=(%| -.deps) 'BAD dependency resolution'
42+ =/ imported-result=jfile-result:jibb (infer-jibb-file:jibb /ui/test/jibb imported-source ~ ~ dependencies ~[/ui/test/jibb] ~ ~ ~ ~)
43+ ?: ?=(%& -.imported-result) 'BAD imported fallback'
44+ 'prelude and import fallback declined'
45+++ resolver-report
46+ |= [good=@t conflict=@t missing=@t hole=@t duplicate=@t face=@t store=@t public=@t internal=@t]
47+ ^- @t
48+ =/ lines=(list @t)
49+ =/ at=path /ui/obligation/jibb
50+ =/ expect-reject
51+ |= [label=@t source=@t]
52+ ^- @t
53+ =/ parsed (parse:jibb at source)
54+ ?: ?=(%| -.parsed) (crip "BAD-{(trip label)}-parse")
55+ =/ got=jfile-result:jibb (infer-jibb-file:jibb at source ~ ~ ~ ~[at] ~ ~ ~ ~)
56+ ?:(?=(%| -.got) (crip "{(trip label)} rejected without interface") (crip "BAD-{(trip label)}-published"))
57+ =/ result=jfile-result:jibb (infer-jibb-file:jibb at good ~ ~ ~ ~[at] ~ ~ ~ ~)
58+ ?: ?=(%| -.result) ~[(crip "BAD-valid: {(trip p.result)}")]
59+ =/ iface=ifile:jibb iface.p.result
60+ =/ built=(unit ischeme:jibb) (ienv-lookup:jibb %built values.iface)
61+ ?~ built ~['BAD-missing-built']
62+ =/ text=(unit ischeme:jibb) (ienv-lookup:jibb %reveal values.iface)
63+ =/ ship=(unit ischeme:jibb) (ienv-lookup:jibb %reveal-ship values.iface)
64+ ?~ text ~['BAD-missing-text']
65+ ?~ ship ~['BAD-missing-ship']
66+ =/ report=@t (golden-types-with-marks:jibb at good ~ ~)
67+ =/ store-at=path /ui/stores/test/jibb
68+ =/ store-parsed (parse:jibb store-at store)
69+ ?: ?=(%| -.store-parsed) ~['BAD-store-parse']
70+ =/ store-result=jfile-result:jibb (infer-jibb-file:jibb store-at store ~ ~ ~ ~[store-at] ~ ~ ~ ~)
71+ =/ shown=itype:jibb (canonical-itype:jibb typ.u.built vars.u.built)
72+ :~ ?:(?=(^ vars.u.built) 'interface retains independent polymorphism' 'BAD-principal')
73+ ?:(?=([%atom %t] typ.u.text) 'text use inferred' 'BAD-text')
74+ ?:(?=([%atom %p] typ.u.ship) 'ship use inferred' 'BAD-ship')
75+ (crip "stored built: {(show-itype:jibb shown ~)}")
76+ report
77+ (expect-reject 'conflict' conflict)
78+ (expect-reject 'missing' missing)
79+ (expect-reject 'hole' hole)
80+ (expect-reject 'duplicate' duplicate)
81+ (expect-reject 'face' face)
82+ ?:(?=(%| -.store-result) 'store declined without interface' 'BAD-store-published')
83+ 'conflict report:'
84+ (golden-types-with-marks:jibb at conflict ~ ~)
85+ 'store report:'
86+ (golden-types-with-marks:jibb store-at store ~ ~)
87+ ==
88+ =. lines (snoc lines (case-no-fallback good public internal))
89+ (of-wain:format lines)
90+++ test-deferred-resolver
91+ ^- tang
92+ =/ result=@t (resolver-report (text good) (text conflict) (text missing) (text hole) (text duplicate) (text face) (text store) public internal)
93+ ?. =((to-wain:format (cat 3 result '\0a')) expected) ~[leaf+"deferred resolver report differs"]
94+ =/ closed=itype:jibb [%cell [%face %foo [%atom %t]] [%atom %t]]
95+ =/ open=itype:jibb [%cell [%face %foo [%var 500]] [%atom %t]]
96+ =/ tag=itype:jibb [%tag 501 *lit:jibb |]
97+ ?. (dg-stable-call-fit:jibb closed closed [%atom %t] ~ &) ~[leaf+"closed positional fit declined"]
98+ ?: (dg-stable-call-fit:jibb open open [%atom %t] ~ &) ~[leaf+"open positional face accepted"]
99+ ?: (dg-stable-call-fit:jibb closed closed tag ~ &) ~[leaf+"pending positional result accepted"]
100+ ?. (dg-stable-call-fit:jibb open open [%atom %t] ~ |) ~[leaf+"equal single argument declined"]
101+ =/ samples=(list wain)
102+ ~[stability-early stability-late stability-simple-early stability-simple-late stability-output-early stability-output-late stability-slot-early stability-slot-late]
103+ |-
104+ ?~ samples ~
105+ ?~ i.samples ~[leaf+"deferred stability source missing"]
106+ =/ at=path /ui/stability/jibb
107+ =/ src=@t (text i.samples)
108+ =/ parsed (parse:jibb at src)
109+ ?: ?=(%| -.parsed) ~[leaf+"deferred stability source does not parse"]
110+ =/ result=jfile-result:jibb (infer-jibb-file:jibb at src ~ ~ ~ ~[at] ~ ~ ~ ~)
111+ ?: ?=(%& -.result) ~[leaf+"unstable deferred fit published an interface"]
112+ $(samples t.samples)
113+--
tests/lib/jibb-deferred.hoonnew file+244
@@ -0,0 +1,244 @@
1+:: Partial source-owned deferred type transaction; not module or island validation.
2+/+ jibb
3+/* nested-src %txt /tests/type-deferred/nested-src/txt
4+/* principal-src %txt /tests/type-deferred/principal-src/txt
5+/* missing-src %txt /tests/type-deferred/missing-src/txt
6+/* conflict-src %txt /tests/type-deferred/conflict-src/txt
7+/* duplicate-src %txt /tests/type-deferred/duplicate-src/txt
8+/* hole-src %txt /tests/type-deferred/hole-src/txt
9+/* local-src %txt /tests/type-deferred/local-src/txt
10+/* mutual-src %txt /tests/type-deferred/mutual-src/txt
11+/* mold-hole-src %txt /tests/type-deferred/mold-hole-src/txt
12+/* face-good-src %txt /tests/type-deferred/face-good-src/txt
13+/* face-bad-src %txt /tests/type-deferred/face-bad-src/txt
14+/* expected %txt /tests/type-deferred/expected/txt
15+|%
16+++ text
17+ |= lines=wain
18+ ^- @t
19+ (rap 3 (turn lines |=(line=@t (cat 3 line '\0a'))))
20+++ case-nested
21+ |= source=@t
22+ ^- (list @t)
23+ =/ result=(unit dgcommit:jibb) (checked-source /ui/obligation/jibb source)
24+ ?~ result ~['BAD-nested-transaction']
25+ =/ nested=(unit ischeme:jibb) (ienv-lookup:jibb %nested env.u.result)
26+ =/ alias=(unit ischeme:jibb) (ienv-lookup:jibb %alias env.u.result)
27+ =/ main=(unit ischeme:jibb) (ienv-lookup:jibb %main env.u.result)
28+ ?~ nested ~['BAD-nested']
29+ ?~ alias ~['BAD-alias']
30+ ?~ main ~['BAD-main']
31+ :~ ?:(=(typ.u.nested typ.u.alias) 'nested lexical gate and alias agree' 'BAD-alias-type')
32+ ?:(=(typ.u.nested typ.u.main) 'later source context closes nested constructor' 'BAD-main-type')
33+ ?:(!(pending-tags:jibb tags.state.u.result sub.state.u.result) 'nested obligation discharged' 'BAD-pending')
34+ ==
35+++ case-principal
36+ |= source=@t
37+ ^- (list @t)
38+ =/ result=(unit dgcommit:jibb) (checked-source /ui/obligation/jibb source)
39+ ?~ result ~['BAD-root-transaction']
40+ =/ built=(unit ischeme:jibb) (ienv-lookup:jibb %built env.u.result)
41+ =/ text=(unit ischeme:jibb) (ienv-lookup:jibb %reveal env.u.result)
42+ =/ ship=(unit ischeme:jibb) (ienv-lookup:jibb %reveal-ship env.u.result)
43+ ?~ built ~['BAD-built']
44+ ?~ text ~['BAD-text']
45+ ?~ ship ~['BAD-ship']
46+ :~ ?:(?=(^ vars.u.built) 'independent built result stays polymorphic' 'BAD-principal')
47+ ?:(?=([%atom %t] typ.u.text) 'text use inferred' 'BAD-text-type')
48+ ?:(?=([%atom %p] typ.u.ship) 'ship use inferred independently' 'BAD-ship-type')
49+ ==
50+++ case-negative
51+ |= [missing=@t conflict=@t duplicate=@t hole=@t]
52+ ^- (list @t)
53+ :~ ?:(?=(~ (checked-source /ui/obligation/jibb missing)) 'missing constructor leaves no result' 'BAD-missing')
54+ ?:(?=(~ (checked-source /ui/obligation/jibb conflict)) 'conflicting context leaves no result' 'BAD-conflict')
55+ ?:(?=(~ (checked-source /ui/obligation/jibb duplicate)) 'duplicate source binding declined' 'BAD-duplicate')
56+ ?:(?=(~ (checked-source /ui/obligation/jibb hole)) 'definition hole does not escape' 'BAD-hole')
57+ ==
58+++ case-groups
59+ |= [local=@t mutual=@t]
60+ ^- (list @t)
61+ :~ ?:(?=(~ (checked-source /ui/obligation/jibb local)) 'local deferred definition declined' 'BAD-local')
62+ ?:(?=(~ (checked-source /ui/obligation/jibb mutual)) 'recursive deferred group declined' 'BAD-group')
63+ ==
64+++ case-mold-hole
65+ |= hole=@t
66+ ^- (list @t)
67+ :~ ?:(?=(~ (checked-source /ui/a/jibb hole)) 'unused mold hole declined' 'unused mold hole committed')
68+ ==
69+++ case-fresh
70+ ^- (list @t)
71+ =/ env=ienv:jibb ~[[%x [[%fn [%var 1.000.007] [%var 1.000.007]] ~[1.000.007 2.000.001]]]]
72+ =/ scanned=(unit dgscan:jibb) (dg-all-env-ids:jibb env 200 ~)
73+ =/ small=(unit dgscan:jibb) (dg-all-env-ids:jibb env 1 ~)
74+ ?~ scanned ~['BAD-scan']
75+ :~ ?:(=(2.000.002 (dg-next-id:jibb ids.u.scanned 0)) 'fresh ID exceeds raw and quantified IDs' 'BAD-fresh')
76+ ?:(?=(~ small) 'fresh ID scan respects budget' 'BAD-fuel')
77+ ==
78+++ case-safety
79+ ^- (list @t)
80+ =/ actual=itype:jibb [%cell [%atom %ud] [%cell [%face %wrong [%atom %t]] [%atom %p]]]
81+ =/ expected=itype:jibb [%cell [%atom %ud] [%var 0]]
82+ =/ correct=itype:jibb [%cell [%face %right [%atom %t]] [%atom %p]]
83+ =/ bound=isub:jibb ~[[0 correct]]
84+ =/ with-binding=ifit:jibb (itype-fit:jibb actual expected bound 1)
85+ =/ dropped=ifit:jibb (itype-fit:jibb actual expected ~ 1)
86+ =/ open-edges=(list dgo:jibb) ~[[[%var 20] [%var 21] *span:jibb *span:jibb]]
87+ =/ st=istate:jibb *istate:jibb
88+ =. st st(next 2.000.002)
89+ =/ partial=(unit istate:jibb) (dg-replay-edges:jibb open-edges st 64)
90+ ?~ partial ~['BAD-partial-replay']
91+ =/ still-open=(unit dgscan:jibb) (dg-obligations:jibb open-edges sub.u.partial 100 ~)
92+ ?~ still-open ~['BAD-open-scan']
93+ =/ tag-literal=lit:jibb [%term %tas %got '%got']
94+ =/ target=itype:jibb [%fn [%atom %t] [%union ~[[%cell [%const tag-literal] [%face %value [%atom %t]]]] ~ ~ ~]]
95+ =/ edge=dgo:jibb [[%tag 10 tag-literal &] target *span:jibb *span:jibb]
96+ =/ complete=(unit istate:jibb) (dg-replay-edges:jibb ~[edge] st 64)
97+ ?~ complete ~['BAD-complete-replay']
98+ =/ closed=(unit dgscan:jibb) (dg-obligations:jibb ~[edge] sub.u.complete 100 ~)
99+ ?~ closed ~['BAD-closed-scan']
100+ =/ repeated=(unit istate:jibb) (dg-replay-edges:jibb ~[edge] u.complete 64)
101+ ?~ repeated ~['BAD-final-replay']
102+ =/ open-env=ienv:jibb ~[[%x [[%var 55] ~]]]
103+ =/ raw-atom=itype:jibb [%var 900]
104+ =/ atom-sub=isub:jibb ~[[900 [%avar 901]]]
105+ =/ normalized-atom=itype:jibb (itype-normalize:jibb raw-atom atom-sub)
106+ =/ capture-state=istate:jibb st(sub ~[[500 [%var 42]]])
107+ =/ capture-env=ienv:jibb ~[[%polymorphic [[%fn [%var 42] [%var 500]] ~[42]]]]
108+ =/ capture-check=(unit ischeme:jibb) (dg-generalize:jibb [%fn [%var 42] [%var 43]] capture-env ~ ~ ~ capture-state 300)
109+ ?~ capture-check ~['BAD-capture-scan']
110+ =/ explicit-capture=(unit ischeme:jibb) (dg-generalize:jibb [%fn [%var 80] [%var 81]] ~ ~ ~ ~[80] st 300)
111+ ?~ explicit-capture ~['BAD-explicit-capture-scan']
112+ =/ tag-lit=lit:jibb [%term %tas %watch '%watch']
113+ =/ bound-tag-state=istate:jibb st(sub ~[[720 [%var 721]]])
114+ =/ tag-check=(unit ischeme:jibb) (dg-generalize:jibb [%fn [%var 721] [%var 722]] ~ ~ ~[[720 tag-lit]] ~ bound-tag-state 300)
115+ ?~ tag-check ~['BAD-tag-scan']
116+ =/ cycle=(list dgo:jibb) ~[[[%var 710] [%var 711] *span:jibb *span:jibb] [[%var 711] [%var 712] *span:jibb *span:jibb] [[%var 712] [%var 710] *span:jibb *span:jibb]]
117+ =/ cyc=(unit ischeme:jibb) (dg-generalize:jibb [%fn [%var 710] [%fn [%var 712] [%var 713]]] ~ cycle ~ ~ st 300)
118+ ?~ cyc ~['BAD-cycle-scan']
119+ :~ ?:(!?=(%ok -.with-binding) 'original structural binding rejects wrong face' 'BAD-wrong-face')
120+ ?:(?=(%ok -.dropped) 'dropping binding would accept wrong face' 'BAD-counterexample')
121+ ?:(?=(^ ids.u.still-open) 'unresolved edge remains open after fit' 'BAD-open-edge')
122+ ?:(?=(~ ids.u.closed) 'closed constructor edge has no free IDs' 'BAD-closed-edge')
123+ ?:(&(=(sub.u.repeated sub.u.complete) =(next.u.repeated next.u.complete)) 'final replay is unchanged' 'BAD-final-state')
124+ ?:(?=(~ (dg-close-env:jibb open-env ~ 100)) 'open interface stays unpublished' 'BAD-open-interface')
125+ ?:(!(unsupported-atom-vars:jibb raw-atom ~ ~ atom-sub) 'raw bound variable hides atom constraint' 'BAD-raw-atom')
126+ ?:((unsupported-atom-vars:jibb normalized-atom ~ ~ atom-sub) 'normalized unsupported atom constraint rejected' 'BAD-normalized-atom')
127+ ?:(=(vars.u.capture-check ~[43]) 'scheme-local quantifier cannot hide captured ID' 'BAD-capture')
128+ ?:(=(vars.u.explicit-capture ~[81]) 'captured outer variable remains monomorphic' 'BAD-explicit-capture')
129+ ?:(=(vars.u.tag-check ~[722]) 'pending tag binding keeps reachable variable monomorphic' 'BAD-tag-binding')
130+ ?:(=(vars.u.cyc ~[713]) 'recursive obligation component stays monomorphic' 'BAD-cycle')
131+ ==
132+++ case-face-source
133+ |= [good-src=@t bad-src=@t]
134+ ^- (list @t)
135+ =/ good=(unit dgcommit:jibb) (checked-source /ui/test/jibb good-src)
136+ =/ bad=(unit dgcommit:jibb) (checked-source /ui/test/jibb bad-src)
137+ :~ ?:(?=(^ good) 'faced callback source accepted' 'BAD-faced-source')
138+ ?:(?=(~ bad) 'wrong nested callback face rejected' 'BAD-wrong-face-source')
139+ ==
140+++ case-face-replay
141+ ^- (list @t)
142+ =/ tag=lit:jibb [%term %tas %got '%got']
143+ =/ cases=(list itype:jibb) ~[[%cell [%const tag] [%face %value [%atom %t]]]]
144+ =/ callback=itype:jibb [%fn [%face %value [%atom %t]] [%union cases ~ ~ ~]]
145+ =/ edge=dgo:jibb [[%tag 10 tag &] callback *span:jibb *span:jibb]
146+ =/ st=istate:jibb *istate:jibb
147+ =. st st(next 20)
148+ =/ solved=(unit istate:jibb) (dg-replay-edges:jibb ~[edge] st 64)
149+ ?~ solved ~['BAD-faced-replay']
150+ =/ after-left=itype:jibb (itype-walk:jibb left.edge sub.u.solved)
151+ =/ after-right=itype:jibb (itype-walk:jibb right.edge sub.u.solved)
152+ =/ record-output=itype:jibb [%cell [%face %answer [%atom %t]] [%atom %p]]
153+ =/ wrong=itype:jibb [%fn [%face %different [%atom %t]] [%union cases ~ ~ ~]]
154+ =/ hostile=istate:jibb st(sub ~[[10 wrong]])
155+ =/ rejected=(unit istate:jibb) (dg-replay-edges:jibb ~[edge] hostile 64)
156+ :~ ?:(=(after-left after-right) 'constructor resolves to exact callback' 'BAD-not-exact')
157+ ?:((itype-has-face:jibb left.edge sub.u.solved) 'callback retains its face' 'BAD-face-lost')
158+ ?:(!(itype-face-asym:jibb left.edge right.edge sub.u.solved) 'post-fit face asymmetry is absent' 'BAD-face-asymmetry')
159+ ?:((itype-output-may-be-cell:jibb record-output sub.u.solved) 'record output stays cell-capable' 'BAD-output')
160+ ?:(?=(~ rejected) 'prebound incompatible callback is rejected' 'BAD-incompatible')
161+ ==
162+++ checked-source
163+ |= [at=path source=@t]
164+ ^- (unit dgcommit:jibb)
165+ =/ detail=dgparse:jibb (dg-root-detail:jibb at source)
166+ ?> parsed.detail
167+ result.detail
168+++ case-grec-scan
169+ ^- (list @t)
170+ =/ tree=itype:jibb [%grec /ui/test/jibb %tree ~ *shape:jibb ~[[%var 7]]]
171+ =/ bounded=(unit dgscan:jibb) (dg-scan:jibb ~[tree] ~ 256 ~)
172+ =/ env=ienv:jibb ~[[%t [tree ~[7]]]]
173+ =/ all=(unit dgscan:jibb) (dg-all-env-ids:jibb env 256 ~)
174+ :~ ?:(?=(~ bounded) 'grec constraint scan declines' 'BAD-grec-scan')
175+ ?:(?=(~ all) 'grec fresh-id scan declines' 'BAD-grec-freshness')
176+ ==
177+++ case-default-behavior
178+ ^- @t
179+ =/ parsed (parse:jibb /ui/test/jibb '++ example (send |=%got)')
180+ ?: ?=(%| -.parsed) 'BAD parse'
181+ ?~ defs.p.parsed 'BAD missing definition'
182+ =/ d=def:jibb i.defs.p.parsed
183+ ?. ?=(%value -.d) 'BAD not value'
184+ =/ callback=itype:jibb [%fn [%atom %t] [%var 100]]
185+ =/ head=itype:jibb [%fn callback callback]
186+ =/ env=ienv:jibb ~[[%send [head ~[100]]]]
187+ =/ state=istate:jibb *istate:jibb
188+ =/ ordinary=iresult:jibb (infer-fragment:jibb val.d env state)
189+ ?: ?=(%& -.ordinary) 'BAD default deferred inference accepted'
190+ =/ enabled=iresult:jibb (infer-fragment:jibb val.d env state(defer `~))
191+ ?: ?=(%| -.enabled) 'BAD explicit capability failed'
192+ ?~ obligations.state.p.enabled 'BAD missing obligation'
193+ 'default inference declines; explicit capability creates obligation'
194+++ case-screen-bounds
195+ ^- @t
196+ =/ parsed (parse:jibb /ui/test/jibb '++ example (send |=%got)\0a++ other 1\0a')
197+ ?: ?=(%| -.parsed) 'BAD parse'
198+ =/ ds=(list def:jibb) defs.p.parsed
199+ ?. ?=([* [* ~]] ds) 'BAD definitions'
200+ =/ good=def:jibb i.ds
201+ =/ other=def:jibb i.t.ds
202+ ?. &(?=(%value -.good) ?=(%value -.other)) 'BAD value types'
203+ =/ raw=expr:jibb val.good
204+ ?. ?=(%group -.raw) 'BAD group'
205+ =/ call=expr:jibb inner.raw
206+ ?. ?=(%call -.call) 'BAD call'
207+ =/ wrap
208+ |= [n=@ud e=expr:jibb]
209+ ^- expr:jibb
210+ |-
211+ ?~ n e
212+ $(n (dec n), e [%group (span-of:jibb e) e])
213+ =/ w63=expr:jibb (wrap 63 call)
214+ =/ w64=expr:jibb (wrap 64 call)
215+ ?. (dg-direct-source:jibb w63 64) 'BAD 63 wrappers rejected'
216+ ?: (dg-direct-source:jibb w64 64) 'BAD 64 wrappers accepted'
217+ =/ exact=(list def:jibb) (weld (reap 63 other) ~[good])
218+ =/ over=(list def:jibb) [other exact]
219+ ?. (dg-source-candidate:jibb exact 64) 'BAD exact definitions rejected'
220+ ?: (dg-source-candidate:jibb over 64) 'BAD excessive definitions accepted'
221+ =/ unsupported=expr:jibb [%trace (span-of:jibb call) call call]
222+ ?: (dg-direct-source:jibb unsupported 64) 'BAD unsupported wrapper accepted'
223+ 'candidate screen boundaries passed'
224+++ deferred-report
225+ |= [nested-src=@t principal-src=@t missing-src=@t conflict-src=@t duplicate-src=@t hole-src=@t local-src=@t mutual-src=@t mold-hole-src=@t face-good-src=@t face-bad-src=@t]
226+ ^- @t
227+ =/ lines=(list @t) (case-nested nested-src)
228+ =. lines (weld lines (case-principal principal-src))
229+ =. lines (weld lines (case-negative missing-src conflict-src duplicate-src hole-src))
230+ =. lines (weld lines (case-groups local-src mutual-src))
231+ =. lines (weld lines (case-mold-hole mold-hole-src))
232+ =. lines (weld lines case-fresh)
233+ =. lines (weld lines case-safety)
234+ =. lines (weld lines (case-face-source face-good-src face-bad-src))
235+ =. lines (weld lines case-face-replay)
236+ =. lines (weld lines case-grec-scan)
237+ =. lines (weld lines ~[case-default-behavior case-screen-bounds])
238+ (of-wain:format lines)
239+++ test-deferred
240+ ^- tang
241+ =/ result=@t (deferred-report (text nested-src) (text principal-src) (text missing-src) (text conflict-src) (text duplicate-src) (text hole-src) (text local-src) (text mutual-src) (text mold-hole-src) (text face-good-src) (text face-bad-src))
242+ ?. =((to-wain:format (cat 3 result '\0a')) expected) ~[leaf+"deferred partial transaction report differs"]
243+ ~
244+--
tests/lib/jibb-direct-gate-guards.hoonnew file+172
@@ -0,0 +1,172 @@
1+:: Direct layout evidence must retain provenance and final face constraints.
2+/+ jibb
3+|%
4+++ direct-evidence-errors
5+ ^- (list tape)
6+ =/ pre=@t '++ apply |= [f=$-([A B] B) n=@t] f\0a'
7+ =/ dupe=@t '++ apply |= [f=$-([A B] B) n=@t] f\0a++ apply |= [f=$-([A B] B) n=@t] f\0a'
8+ =/ root=@t '++ target |= [a=@t b=@p] b\0a++ main (apply target "x")\0a'
9+ =/ parsed (parse:jibb /tests/test/jibb root)
10+ ?> ?=(%& -.parsed)
11+ =/ ds=(list def:jibb) defs.p.parsed
12+ ?> ?=(^ ds)
13+ ?> ?=(^ t.ds)
14+ ?> ?=(%value -.i.t.ds)
15+ =/ expr=expr:jibb val.i.t.ds
16+ =? expr ?=(%group -.expr) inner.expr
17+ =/ txt=itype:jibb [%atom %t]
18+ =/ ship=itype:jibb [%atom %p]
19+ =/ target=itype:jibb [%fn [%cell [%face %a txt] [%face %b ship]] ship]
20+ =/ expected-fn=itype:jibb [%fn [%cell [%var 0] [%var 1]] [%var 1]]
21+ =/ expected-sample=itype:jibb [%cell [%face %f expected-fn] [%face %n txt]]
22+ =/ actual=itype:jibb [%cell target txt]
23+ =/ scheme=ischeme:jibb [[%fn expected-sample expected-fn] ~[0 1]]
24+ =/ changed=ischeme:jibb [[%fn expected-sample ship] ~[0 1]]
25+ =/ iface=ifile:jibb [~[[%apply scheme]] ~ /lib/jibb/prelude/jibb ~ ~ ~ `pre ~]
26+ =/ stale=ifile:jibb iface(values ~[[%apply changed]])
27+ =/ dup=ifile:jibb iface(source `dupe)
28+ =/ env=ienv:jibb ~[[%target [target ~]]]
29+ =/ registry=(map term def:jibb) (direct-checked-gates:jibb ds env)
30+ =/ evidence=(unit igate-prelude-evidence:jibb) (direct-prelude-evidence:jibb ds `iface)
31+ ?> ?=(^ evidence)
32+ =/ st=istate:jibb *istate:jibb
33+ =. st st(globals ~[%apply %target %main], prelude `iface, gate-defs registry, head-evidence evidence, next 10)
34+ =/ good=(unit ifit:jibb) (direct-gate-call-fit:jibb expr actual expected-sample env st)
35+ =/ bad=(unit ifit:jibb) (direct-gate-call-fit:jibb expr actual expected-sample env st(prelude `stale))
36+ =/ dupe-evidence=(unit igate-prelude-evidence:jibb) (direct-prelude-evidence:jibb ds `dup)
37+ =/ head=(unit def:jibb) (~(get by gates.u.evidence) %apply)
38+ ?> ?=(^ head)
39+ =/ head-sample=(unit sample:jibb) (direct-gate-sample:jibb u.head)
40+ ?> ?=(^ head-sample)
41+ ?> ?=(%cell -.u.head-sample)
42+ ?> ?=(%call -.expr)
43+ =/ pos=ifit:jibb (direct-positional-fit:jibb args.expr items.u.head-sample actual expected-sample env st ~ 10)
44+ =/ checks=(list @t)
45+ :~
46+ ?:(?=(%ok -.pos) 'positional-fit-ok' 'BAD-positional-fit')
47+ ?:(?=(^ good) 'original-evidence-usable' 'BAD-original-evidence')
48+ ?: &(?=(~ bad) =(source.iface source.stale) =(at.iface at.stale) !=(values.iface values.stale))
49+ 'changed-value-scheme-rejected'
50+ 'BAD-stale-evidence'
51+ ?:(?=(~ dupe-evidence) 'duplicate-source-rejected' 'BAD-duplicate-source')
52+ ==
53+
54+ ?: =(checks ~['positional-fit-ok' 'original-evidence-usable' 'changed-value-scheme-rejected' 'duplicate-source-rejected']) ~
55+ ~["direct-evidence-errors direct gate guard failed"]
56+++ late-face-errors
57+ ^- (list tape)
58+ =/ pre=@t '++ apply |= [first=[foo=A] second=A f=$-([C D] D)] f\0a'
59+ =/ dupe=@t '++ apply |= [f=$-([A B] B) n=@t] f\0a++ apply |= [f=$-([A B] B) n=@t] f\0a'
60+ =/ root=@t '++ target |= [a=@t b=@p] b\0a++ main (apply x y target)\0a'
61+ =/ parsed (parse:jibb /tests/test/jibb root)
62+ ?> ?=(%& -.parsed)
63+ =/ ds=(list def:jibb) defs.p.parsed
64+ ?> ?=(^ ds)
65+ ?> ?=(^ t.ds)
66+ ?> ?=(%value -.i.t.ds)
67+ =/ expr=expr:jibb val.i.t.ds
68+ =? expr ?=(%group -.expr) inner.expr
69+ =/ txt=itype:jibb [%atom %t]
70+ =/ ship=itype:jibb [%atom %p]
71+ =/ target=itype:jibb [%fn [%cell [%face %a txt] [%face %b ship]] ship]
72+ =/ expected-fn=itype:jibb [%fn [%cell [%var 1] [%var 2]] [%var 2]]
73+ =/ expected-sample=itype:jibb [%cell [%face %first [%face %foo [%var 0]]] [%cell [%face %second [%var 0]] [%face %f expected-fn]]]
74+ =/ actual=itype:jibb [%cell [%var 0] [%cell txt target]]
75+ =/ scheme=ischeme:jibb [[%fn expected-sample expected-fn] ~[0 1]]
76+ =/ changed=ischeme:jibb [[%fn expected-sample ship] ~[0 1]]
77+ =/ iface=ifile:jibb [~[[%apply scheme]] ~ /lib/jibb/prelude/jibb ~ ~ ~ `pre ~]
78+ =/ stale=ifile:jibb iface(values ~[[%apply changed]])
79+ =/ dup=ifile:jibb iface(source `dupe)
80+ =/ env=ienv:jibb ~[[%target [target ~]]]
81+ =/ registry=(map term def:jibb) (direct-checked-gates:jibb ds env)
82+ =/ evidence=(unit igate-prelude-evidence:jibb) (direct-prelude-evidence:jibb ds `iface)
83+ ?> ?=(^ evidence)
84+ =/ st=istate:jibb *istate:jibb
85+ =. st st(globals ~[%apply %target %main], prelude `iface, gate-defs registry, head-evidence evidence, next 10)
86+ =/ good=(unit ifit:jibb) (direct-gate-call-fit:jibb expr actual expected-sample env st)
87+ =/ bad=(unit ifit:jibb) (direct-gate-call-fit:jibb expr actual expected-sample env st(prelude `stale))
88+ =/ dupe-evidence=(unit igate-prelude-evidence:jibb) (direct-prelude-evidence:jibb ds `dup)
89+ =/ head=(unit def:jibb) (~(get by gates.u.evidence) %apply)
90+ ?> ?=(^ head)
91+ =/ head-sample=(unit sample:jibb) (direct-gate-sample:jibb u.head)
92+ ?> ?=(^ head-sample)
93+ ?> ?=(%cell -.u.head-sample)
94+ ?> ?=(%call -.expr)
95+ =/ pos=ifit:jibb (direct-positional-fit:jibb args.expr items.u.head-sample actual expected-sample env st ~ 10)
96+ =/ checks=(list @t)
97+ :~
98+ ?: ?=(%ok -.pos)
99+ ?:((itype-positional-slot-face-asym:jibb [%var 0] [%face %foo [%var 0]] sub.pos) 'LATE-FACE-ASYMMETRY' 'no-late-asymmetry')
100+ 'no-positional-fit'
101+ ?:(?=(%ok -.pos) 'positional-fit-ok' 'BAD-positional-fit')
102+ ?:(?=(^ good) 'original-evidence-usable' 'late-face-rejected')
103+ ?: &(?=(~ bad) =(source.iface source.stale) =(at.iface at.stale) !=(values.iface values.stale))
104+ 'changed-value-scheme-rejected'
105+ 'BAD-stale-evidence'
106+ ?:(?=(~ dupe-evidence) 'duplicate-source-rejected' 'BAD-duplicate-source')
107+ ==
108+
109+ ?: =(checks ~['LATE-FACE-ASYMMETRY' 'positional-fit-ok' 'late-face-rejected' 'changed-value-scheme-rejected' 'duplicate-source-rejected']) ~
110+ ~["late-face-errors direct gate guard failed"]
111+++ symmetric-face-errors
112+ ^- (list tape)
113+ =/ pre=@t '++ apply |= [first=[foo=A] second=A f=$-([C D] D)] f\0a'
114+ =/ dupe=@t '++ apply |= [f=$-([A B] B) n=@t] f\0a++ apply |= [f=$-([A B] B) n=@t] f\0a'
115+ =/ root=@t '++ target |= [a=@t b=@p] b\0a++ main (apply x y target)\0a'
116+ =/ parsed (parse:jibb /tests/test/jibb root)
117+ ?> ?=(%& -.parsed)
118+ =/ ds=(list def:jibb) defs.p.parsed
119+ ?> ?=(^ ds)
120+ ?> ?=(^ t.ds)
121+ ?> ?=(%value -.i.t.ds)
122+ =/ expr=expr:jibb val.i.t.ds
123+ =? expr ?=(%group -.expr) inner.expr
124+ =/ txt=itype:jibb [%atom %t]
125+ =/ ship=itype:jibb [%atom %p]
126+ =/ target=itype:jibb [%fn [%cell [%face %a txt] [%face %b ship]] ship]
127+ =/ expected-fn=itype:jibb [%fn [%cell [%var 1] [%var 2]] [%var 2]]
128+ =/ expected-sample=itype:jibb [%cell [%face %first [%face %foo [%var 0]]] [%cell [%face %second [%var 0]] [%face %f expected-fn]]]
129+ =/ actual=itype:jibb [%cell [%face %foo [%var 0]] [%cell txt target]]
130+ =/ scheme=ischeme:jibb [[%fn expected-sample expected-fn] ~[0 1]]
131+ =/ changed=ischeme:jibb [[%fn expected-sample ship] ~[0 1]]
132+ =/ iface=ifile:jibb [~[[%apply scheme]] ~ /lib/jibb/prelude/jibb ~ ~ ~ `pre ~]
133+ =/ stale=ifile:jibb iface(values ~[[%apply changed]])
134+ =/ dup=ifile:jibb iface(source `dupe)
135+ =/ env=ienv:jibb ~[[%target [target ~]]]
136+ =/ registry=(map term def:jibb) (direct-checked-gates:jibb ds env)
137+ =/ evidence=(unit igate-prelude-evidence:jibb) (direct-prelude-evidence:jibb ds `iface)
138+ ?> ?=(^ evidence)
139+ =/ st=istate:jibb *istate:jibb
140+ =. st st(globals ~[%apply %target %main], prelude `iface, gate-defs registry, head-evidence evidence, next 10)
141+ =/ good=(unit ifit:jibb) (direct-gate-call-fit:jibb expr actual expected-sample env st)
142+ =/ bad=(unit ifit:jibb) (direct-gate-call-fit:jibb expr actual expected-sample env st(prelude `stale))
143+ =/ dupe-evidence=(unit igate-prelude-evidence:jibb) (direct-prelude-evidence:jibb ds `dup)
144+ =/ head=(unit def:jibb) (~(get by gates.u.evidence) %apply)
145+ ?> ?=(^ head)
146+ =/ head-sample=(unit sample:jibb) (direct-gate-sample:jibb u.head)
147+ ?> ?=(^ head-sample)
148+ ?> ?=(%cell -.u.head-sample)
149+ ?> ?=(%call -.expr)
150+ =/ pos=ifit:jibb (direct-positional-fit:jibb args.expr items.u.head-sample actual expected-sample env st ~ 10)
151+ =/ checks=(list @t)
152+ :~
153+ ?: ?=(%ok -.pos)
154+ ?:((itype-positional-slot-face-asym:jibb [%face %foo [%var 0]] [%face %foo [%var 0]] sub.pos) 'LATE-FACE-ASYMMETRY' 'symmetric-after-later-binding')
155+ 'no-positional-fit'
156+ ?:(?=(%ok -.pos) 'positional-fit-ok' 'BAD-positional-fit')
157+ ?:(?=(^ good) 'original-evidence-usable' 'BAD-original-evidence')
158+ ?: &(?=(~ bad) =(source.iface source.stale) =(at.iface at.stale) !=(values.iface values.stale))
159+ 'changed-value-scheme-rejected'
160+ 'BAD-stale-evidence'
161+ ?:(?=(~ dupe-evidence) 'duplicate-source-rejected' 'BAD-duplicate-source')
162+ ==
163+
164+ ?: =(checks ~['symmetric-after-later-binding' 'positional-fit-ok' 'original-evidence-usable' 'changed-value-scheme-rejected' 'duplicate-source-rejected']) ~
165+ ~["symmetric-face-errors direct gate guard failed"]
166+++ direct-gate-guard-errors
167+ ^- (list tape)
168+ (weld direct-evidence-errors (weld late-face-errors symmetric-face-errors))
169+++ test-direct-gate-guards
170+ ^- tang
171+ (turn direct-gate-guard-errors |=(reason=tape leaf+reason))
172+--
tests/lib/jibb-direct-gate-source.hoonnew file+46
@@ -0,0 +1,46 @@
1+:: Exercise direct-source gate layouts through a synthetic program scaffold.
2+/+ jibb
3+/* real-prelude %jibb /lib/jibb/prelude/jibb
4+/* real-internal %jibb /lib/jibb/internal/jibb
5+/* source %txt /tests/type-direct-gate/source/txt
6+/* expected %txt /tests/type-direct-gate/expected/txt
7+|%
8+++ text
9+ |= lines=wain
10+ ^- @t
11+ (rap 3 (turn lines |=(line=@t (cat 3 line '\0a'))))
12+++ direct-gate-prepared
13+ |= [prelude=@t internal=@t]
14+ ^- (unit iprelude:jibb)
15+ :: Program and element come from the real prelude; only layout helpers are synthetic.
16+ =/ extra=@t '\0a++ choose-layout |= [f=$-([A B] C) value=[A B]] (f value)\0a++ higher |= [f=$-([@t [x=@t y=@p]] @t) marker=?] f\0a++ higher-generic |= [f=$-([@t X] X) state=X] state\0a'
17+ (prepare-prelude-with-internal:jibb (cat 3 prelude extra) internal)
18+++ direct-gate-source-output
19+ |= [src=@t prepared=(unit iprelude:jibb)]
20+ ^- @t
21+ (golden-types-with-prepared-prelude:jibb /tests/sub/client/jibb src ~ ~ ~ prepared)
22+++ direct-gate-projection-errors
23+ |= prepared=(unit iprelude:jibb)
24+ ^- (list tape)
25+ ?~ prepared ~["synthetic prelude did not prepare"]
26+ =/ src=@t '+$ message\0a %start\0a %stop\0a+$ record [count=@ud label=@t]\0a++ init-record |= input=@t ^- record [count=0 label=input]\0a++ view-record |= state=record ^- (element message) (text "view")\0a++ subs-record |= state=record ^- (list (sub message)) ~\0a++ update-proj-good |= [msg=message state=record]\0a ^- [record (list (cmd message))]\0a [(proj [count=0 label="projected" extra=%.y]) ~]\0a++ program-projection (program init-record update-proj-good view-record subs-record)\0a'
27+ =/ out=jfile-result:jibb (infer-jibb-file:jibb /tests/direct/client/jibb src ~ ~ ~ ~[/tests/direct/client/jibb] values.u.prepared molds.u.prepared ~ `iface.u.prepared)
28+ ?: ?=(%| -.out) ~["projection-bearing module did not infer"]
29+ =/ defs=(list iwidth-definition:jibb) (skim elaborations.iface.p.out |=(d=iwidth-definition:jibb =(%update-proj-good name.d)))
30+ ?~ defs ~["projection-bearing update lost its elaboration"]
31+ ?~ projections.i.defs ~["projection action is missing"]
32+ ?: !=(1 (lent projections.i.defs)) ~["unexpected projection action count"]
33+ ?. =(steps.i.projections.i.defs ~[[%count 2] [%label 6]]) ~["projection axes changed"]
34+ ~
35+++ test-direct-gate-source
36+ ^- tang
37+ ?~ source ~[leaf+"direct gate source is missing"]
38+ ?~ expected ~[leaf+"direct gate expected output is missing"]
39+ =/ prepared=(unit iprelude:jibb) (direct-gate-prepared real-prelude real-internal)
40+ =/ errors=(list tape) (direct-gate-projection-errors prepared)
41+ ?^ errors (turn errors |=(reason=tape leaf+reason))
42+ =/ got=@t (direct-gate-source-output (text source) prepared)
43+ ?. =((to-wain:format (cat 3 got '\0a')) expected)
44+ ~[leaf+"direct gate source output differs from its golden"]
45+ ~
46+--
tests/lib/jibb-empty.hoonnew file+174
@@ -0,0 +1,174 @@
1+:: Source-backed empty-mold checks; no backend/runtime claim.
2+/+ jibb
3+/* real-prelude %jibb /lib/jibb/prelude/jibb
4+/* real-internal %jibb /lib/jibb/internal/jibb
5+/* good %txt /tests/type-empty/good/txt
6+/* overlap %txt /tests/type-empty/overlap/txt
7+/* dead %txt /tests/type-empty/dead/txt
8+/* missing %txt /tests/type-empty/missing/txt
9+/* standard-good %txt /tests/type-empty/standard-good/txt
10+/* list-dead %txt /tests/type-empty/list-dead/txt
11+/* unit-dead %txt /tests/type-empty/unit-dead/txt
12+/* late-cap %txt /tests/type-empty/late-cap/txt
13+/* list-live %txt /tests/type-empty/list-live/txt
14+/* list-open %txt /tests/type-empty/list-open/txt
15+/* face-source %txt /tests/type-empty/face-source/txt
16+/* expected %txt /tests/type-empty/expected/txt
17+|%
18+++ text
19+ |= lines=wain
20+ ^- @t
21+ (rap 3 (turn lines |=(line=@t (cat 3 line '\0a'))))
22+++ line
23+ |= [label=@t ok=?]
24+ ^- @t
25+ (crip "{(trip label)}: {?:(ok "ok" "BAD")}")
26+++ face-retained
27+ |= [source=@t prelude=ifile:jibb]
28+ ^- ?
29+ =/ parsed=(each module:jibb error:jibb) (parse:jibb /tests/empty/jibb source)
30+ ?: ?=(%| -.parsed) |
31+ =/ ds=(list def:jibb) defs.p.parsed
32+ ?. ?=([* ~] ds) |
33+ =/ d=def:jibb i.ds
34+ ?. ?=(%value -.d) |
35+ =/ typ=itype:jibb [%collection %list ~[[%empty ~]]]
36+ =/ env=ienv:jibb ~[[%xs [typ ~]]]
37+ =/ state=istate:jibb *istate:jibb
38+ =. state state(prelude `prelude, jrec-fuel 256)
39+ =/ expected=itype:jibb [%cell [%atom %t] [%atom %t]]
40+ =/ result=(unit iresult:jibb)
41+ (empty-list-null-branch:jibb val.d env state `[expected (span-of:jibb val.d)])
42+ ?~ result |
43+ ?: ?=(%| -.u.result) |
44+ (itype-has-face:jibb typ.p.u.result sub.state.p.u.result)
45+++ empty-output
46+ |= [pre=@t internal=@t good=@t overlap=@t dead=@t missing=@t standard-good=@t list-dead=@t unit-dead=@t late-cap=@t list-live=@t list-open=@t face-source=@t]
47+ ^- @t
48+ =/ prep=(unit iprelude:jibb) (prepare-prelude-with-internal:jibb pre internal)
49+ ?~ prep 'BAD prelude preparation'
50+ =/ f=path /tests/empty/jibb
51+ =/ valid=jfile-result:jibb (infer-jibb-file:jibb f good ~ ~ ~ ~[f] ~ ~ ~ ~)
52+ ?: ?=(%| -.valid) 'BAD checked empty source'
53+ =/ never=(unit ischeme:jibb) (find-jibb-mold:jibb %never iface.p.valid)
54+ ?~ never 'BAD never export'
55+ =/ select=(unit ischeme:jibb) (ienv-lookup:jibb %select values.iface.p.valid)
56+ ?~ select 'BAD select export'
57+ =/ split=(unit ischeme:jibb) (find-jibb-mold:jibb %split iface.p.valid)
58+ ?~ split 'BAD split export'
59+ ?. ?=(%fn -.typ.u.select) 'BAD select gate'
60+ =/ selected=itype:jibb sample.typ.u.select
61+ =? selected ?=(%face -.selected) body.selected
62+ =/ parsed-overlap=(each module:jibb error:jibb) (parse:jibb f overlap)
63+ =/ parsed-dead=(each module:jibb error:jibb) (parse:jibb f dead)
64+ =/ parsed-missing=(each module:jibb error:jibb) (parse:jibb f missing)
65+ =/ parsed-list=(each module:jibb error:jibb) (parse:jibb f list-dead)
66+ =/ parsed-unit=(each module:jibb error:jibb) (parse:jibb f unit-dead)
67+ =/ invalid=jfile-result:jibb (infer-jibb-file:jibb f overlap ~ ~ ~ ~[f] ~ ~ ~ ~)
68+ =/ dead-result=jfile-result:jibb (infer-jibb-file:jibb f dead ~ ~ ~ ~[f] ~ ~ ~ ~)
69+ =/ missing-result=jfile-result:jibb (infer-jibb-file:jibb f missing ~ ~ ~ ~[f] ~ ~ ~ ~)
70+ =/ standard=jfile-result:jibb (infer-jibb-file:jibb f standard-good ~ ~ ~ ~[f] values.u.prep molds.u.prep ~ `iface.u.prep)
71+ =/ only=(unit ischeme:jibb)
72+ ?- -.standard
73+ %& (ienv-lookup:jibb %list-only values.iface.p.standard)
74+ %| ~
75+ ==
76+ =/ only-context=(unit ischeme:jibb)
77+ ?- -.standard
78+ %& (ienv-lookup:jibb %list-only-context values.iface.p.standard)
79+ %| ~
80+ ==
81+ =/ only-good=?
82+ ?~ only |
83+ ?. ?=(%fn -.typ.u.only) |
84+ =/ sample=itype:jibb sample.typ.u.only
85+ =? sample ?=(%face -.sample) body.sample
86+ &(=(sample [%collection %list ~[[%empty ~]]]) =(product.typ.u.only [%atom %t]))
87+ =/ parsed-live=(each module:jibb error:jibb) (parse:jibb f list-live)
88+ =/ parsed-open=(each module:jibb error:jibb) (parse:jibb f list-open)
89+ =/ live-result=jfile-result:jibb (infer-jibb-file:jibb f list-live ~ ~ ~ ~[f] values.u.prep molds.u.prep ~ `iface.u.prep)
90+ =/ open-result=jfile-result:jibb (infer-jibb-file:jibb f list-open ~ ~ ~ ~[f] values.u.prep molds.u.prep ~ `iface.u.prep)
91+ =/ bad-list=jfile-result:jibb (infer-jibb-file:jibb f list-dead ~ ~ ~ ~[f] values.u.prep molds.u.prep ~ `iface.u.prep)
92+ =/ bad-unit=jfile-result:jibb (infer-jibb-file:jibb f unit-dead ~ ~ ~ ~[f] values.u.prep molds.u.prep ~ `iface.u.prep)
93+ =/ atom=itype:jibb [%atom %t]
94+ =/ void=itype:jibb [%empty ~]
95+ =/ fn=itype:jibb [%fn atom atom]
96+ =/ impossible=itype:jibb [%cell fn [%face %field void]]
97+ =/ singleton=itype:jibb [%collection %list ~[void]]
98+ =/ proof=(unit [empty=? left=@ud]) (itype-empty-proof:jibb impossible ~ 4)
99+ =/ list-proof=(unit [empty=? left=@ud]) (itype-empty-proof:jibb singleton ~ 4)
100+ =/ fn-proof=(unit [empty=? left=@ud]) (itype-empty-proof:jibb [%fn void void] ~ 4)
101+ =/ unknown=(unit [empty=? left=@ud]) (itype-empty-proof:jibb [%var 23] ~ 4)
102+ =/ too-short=(unit [empty=? left=@ud]) (itype-empty-proof:jibb [%face %field void] ~ 1)
103+ =/ enough=(unit [empty=? left=@ud]) (itype-empty-proof:jibb [%face %field void] ~ 2)
104+ =/ empty-fit=ifit:jibb (itype-fit:jibb void atom ~ 17)
105+ =/ nested-fit=ifit:jibb (itype-fit:jibb impossible atom ~ 17)
106+ =/ atom-fit=ifit:jibb (itype-fit:jibb atom void ~ 17)
107+ =/ cap=icaps:jibb ~[['A' 23 *span:jibb]]
108+ =/ open-live=(unit [result=?(%yes %no %unknown) left=@ud]) (itype-inhabited-proof:jibb [%var 23] ~ ~ 4)
109+ =/ capital-live=(unit [result=?(%yes %no %unknown) left=@ud]) (itype-inhabited-proof:jibb [%var 23] ~ cap 4)
110+ =/ bound-empty=(unit [result=?(%yes %no %unknown) left=@ud]) (itype-inhabited-proof:jibb [%var 23] ~[[23 void]] cap 4)
111+ =/ opaque=itype:jibb [%recursive %opaque %mold ~]
112+ =/ opaque-live=(unit [result=?(%yes %no %unknown) left=@ud]) (itype-inhabited-proof:jibb opaque ~ ~ 4)
113+ =/ rejected-cases=(unit (list itype:jibb)) (itype-live-cases:jibb ~[opaque] ~ ~ 4)
114+ =/ no-gates=igate-free:jibb (gate-free-type:jibb impossible 8 ~)
115+ =/ list-gates=igate-free:jibb (gate-free-type:jibb singleton 8 ~)
116+ =/ checks=(list [label=@t ok=?])
117+ :~ ['empty mold exported' =([%empty ~] typ.u.never)]
118+ ['live union selector preserves type' &(=(typ.u.split selected) =([%atom %t] product.typ.u.select))]
119+ ['overlap parses and is rejected' &(?=(%& -.parsed-overlap) ?=(%| -.invalid))]
120+ ['dead empty case parses and is rejected' &(?=(%& -.parsed-dead) ?=(%| -.dead-result))]
121+ ['missing live case parses and is rejected' &(?=(%& -.parsed-missing) ?=(%| -.missing-result))]
122+ ['standard list and unit identities checked' ?=(%& -.standard)]
123+ ['single null list gate keeps its exact sample and result' only-good]
124+ ['contextual single null list gate checks' ?=(^ only-context)]
125+ ['contextual single null list arm retains faces' (face-retained face-source iface.u.prep)]
126+ ['one null arm on inhabited list declines' &(?=(%& -.parsed-live) ?=(%| -.live-result))]
127+ ['one null arm on generic list declines' &(?=(%& -.parsed-open) ?=(%| -.open-result))]
128+ ['empty list nonempty arm parses and is rejected' &(?=(%& -.parsed-list) ?=(%| -.bad-list))]
129+ ['empty unit present arm parses and is rejected' &(?=(%& -.parsed-unit) ?=(%| -.bad-unit))]
130+ ['nested empty proof' ?:(?=(~ proof) | empty.u.proof)]
131+ ['list of empty is inhabited' ?:(?=(~ list-proof) | !empty.u.list-proof)]
132+ ['gate returning empty is not empty' ?:(?=(~ fn-proof) | !empty.u.fn-proof)]
133+ ['unbound type not proved empty' ?:(?=(~ unknown) | !empty.u.unknown)]
134+ ['unbound inference type reachability unknown' ?:(?=(~ open-live) | =(%unknown result.u.open-live))]
135+ ['written capital can have a value' ?:(?=(~ capital-live) | =(%yes result.u.capital-live))]
136+ ['bound empty capital is unreachable' ?:(?=(~ bound-empty) | =(%no result.u.bound-empty))]
137+ ['opaque recursion reachability unknown' ?:(?=(~ opaque-live) | =(%unknown result.u.opaque-live))]
138+ ['opaque union case declines coverage proof' ?=(~ rejected-cases)]
139+ ['one proof node exhausted' ?=(~ too-short)]
140+ ['two proof nodes succeed' ?:(?=(~ enough) | &(empty.u.enough =(0 left.u.enough)))]
141+ ['empty fits a concrete type' ?=(%ok -.empty-fit)]
142+ ['empty cell fits a concrete type' ?=(%ok -.nested-fit)]
143+ ['inhabited atom does not fit empty' ?=(%bad -.atom-fit)]
144+ ['empty gate-bearing cell is gate-free' &(=(%yes verdict.no-gates) !inhabited.no-gates)]
145+ ['list of empty is gate-free and inhabited' &(=(%yes verdict.list-gates) inhabited.list-gates)]
146+ ==
147+ =/ report=@t (golden-types-in-context:jibb f good ~ ~ ~ ~ ~ ~)
148+ =/ overlap-report=@t (golden-types-in-context:jibb f overlap ~ ~ ~ ~ ~ ~)
149+ =/ dead-report=@t (golden-types-in-context:jibb f dead ~ ~ ~ ~ ~ ~)
150+ =/ missing-report=@t (golden-types-in-context:jibb f missing ~ ~ ~ ~ ~ ~)
151+ =/ list-report=@t (golden-types-with-prepared-prelude:jibb f list-dead ~ ~ ~ prep)
152+ =/ unit-report=@t (golden-types-with-prepared-prelude:jibb f unit-dead ~ ~ ~ prep)
153+ =/ late-report=@t (golden-types-with-prepared-prelude:jibb f late-cap ~ ~ ~ prep)
154+ (rap 3 ~[(of-wain:format (turn checks line)) '\0a' report '\0a' overlap-report '\0a' dead-report '\0a' missing-report '\0a' list-report '\0a' unit-report '\0a' late-report])
155+++ test-empty
156+ ^- tang
157+ ?~ good ~[leaf+"empty source missing"]
158+ ?~ overlap ~[leaf+"overlap source missing"]
159+ ?~ dead ~[leaf+"dead case source missing"]
160+ ?~ missing ~[leaf+"missing case source missing"]
161+ ?~ standard-good ~[leaf+"standard type source missing"]
162+ ?~ list-dead ~[leaf+"empty list source missing"]
163+ ?~ unit-dead ~[leaf+"empty unit source missing"]
164+ ?~ late-cap ~[leaf+"late capital source missing"]
165+ ?~ list-live ~[leaf+"inhabited list source missing"]
166+ ?~ list-open ~[leaf+"generic list source missing"]
167+ ?~ face-source ~[leaf+"face source missing"]
168+ ?~ expected ~[leaf+"expected output missing"]
169+ =/ actual=@t
170+ (empty-output real-prelude real-internal (text good) (text overlap) (text dead) (text missing) (text standard-good) (text list-dead) (text unit-dead) (text late-cap) (text list-live) (text list-open) (text face-source))
171+ ?. =((to-wain:format (cat 3 actual '\0a')) expected)
172+ ~[leaf+"empty mold output differs from expected"]
173+ ~
174+--
tests/lib/jibb-full-overlap-basic.hoonnew file+143
@@ -0,0 +1,143 @@
1+:: Source-bound full-module overlap diagnostics.
2+/+ jibb
3+/* same %txt /tests/type-full-overlap/same/txt
4+/* zero %txt /tests/type-full-overlap/zero/txt
5+/* unsupported %txt /tests/type-full-overlap/unsupported/txt
6+/* precedence %txt /tests/type-full-overlap/precedence/txt
7+/* duplicate %txt /tests/type-full-overlap/duplicate/txt
8+/* invalid %txt /tests/type-full-overlap/invalid/txt
9+/* distinct %txt /tests/type-full-overlap/distinct/txt
10+/* parent %txt /tests/type-full-overlap/parent/txt
11+/* child %txt /tests/type-full-overlap/child/txt
12+/* generic %txt /tests/type-full-overlap/generic/txt
13+/* duplicate-generic %txt /tests/type-full-overlap/duplicate-generic/txt
14+/* expected %txt /tests/type-full-overlap/expected-basic/txt
15+|%
16++$ overlap-evidence [file=path source=@t name=term cases=upair:jibb]
17++$ detailed-result
18+ (each [iface=ifile:jibb cache=jcache:jibb] [message=@t overlap=(unit overlap-evidence)])
19+++ source-pair
20+ |= [file=path source=@t name=term]
21+ ^- (unit upair:jibb)
22+ =/ parsed (parse:jibb file source)
23+ ?: ?=(%| -.parsed) ~
24+ =/ molds=imolds:jibb (collect-simple-molds:jibb defs.p.parsed)
25+ =/ found=(unit shape:jibb) (find-simple-mold:jibb name molds)
26+ ?~ found ~
27+ =/ sh=shape:jibb u.found
28+ =? sh ?=(%generic -.sh) body.sh
29+ ?. ?=(%union -.sh) ~
30+ ?~ cases.sh ~
31+ ?~ t.cases.sh ~
32+ `[at.i.cases.sh at.i.t.cases.sh %overlap]
33+++ source-witness
34+ |= [file=path source=@t name=term]
35+ ^- ?
36+ =/ parsed (parse:jibb file source)
37+ ?: ?=(%| -.parsed) |
38+ =/ molds=imolds:jibb (collect-simple-molds:jibb defs.p.parsed)
39+ =/ found=(unit shape:jibb) (find-simple-mold:jibb name molds)
40+ ?~ found |
41+ =/ sh=shape:jibb u.found
42+ =? sh ?=(%generic -.sh) body.sh
43+ ?. ?=(%union -.sh) |
44+ ?=(^ (union-source-overlap:jibb cases.sh molds 256))
45+++ detailed
46+ |= [file=path source=@t modules=jbundle:jibb]
47+ ^- detailed-result
48+ (infer-jibb-file-detailed:jibb file source ~ ~ modules ~[file] ~ ~ ~ ~)
49+++ expected-overlap
50+ |= [file=path source=@t name=term]
51+ ^- ?
52+ =/ expected=(unit upair:jibb) (source-pair file source name)
53+ ?~ expected |
54+ =/ result=detailed-result (detailed file source ~)
55+ ?: ?=(%& -.result) |
56+ ?~ overlap.p.result |
57+ =/ ev=overlap-evidence u.overlap.p.result
58+ ?& !=(0 message.p.result)
59+ =(file.ev file)
60+ =(source.ev source)
61+ =(name.ev name)
62+ =(cases.ev u.expected)
63+ =(%overlap relation.cases.ev)
64+ =(3 line.beg.first.cases.ev)
65+ =(3 col.beg.first.cases.ev)
66+ =(4 line.beg.second.cases.ev)
67+ =(3 col.beg.second.cases.ev)
68+ ==
69+++ plain-failure
70+ |= [file=path source=@t]
71+ ^- ?
72+ =/ parsed (parse:jibb file source)
73+ ?: ?=(%| -.parsed) |
74+ =/ result=detailed-result (detailed file source ~)
75+ ?: ?=(%& -.result) |
76+ &(!=(0 message.p.result) ?=(~ overlap.p.result))
77+++ run
78+ |= [same=@t zero=@t unsupported=@t precedence=@t duplicate=@t invalid=@t distinct=@t parent=@t child=@t generic=@t duplicate-generic=@t]
79+ ^- (list [@t ?])
80+ =/ root=path /ui/root/jibb
81+ =/ names256=(list @t) (turn (gulf 0 255) |=(n=@ud (scot %ud n)))
82+ =/ names257=(list @t) (turn (gulf 0 256) |=(n=@ud (scot %ud n)))
83+ =/ child-file=path /ui/child/jibb
84+ =/ good-parsed (parse:jibb root distinct)
85+ =/ good-result=detailed-result (detailed root distinct ~)
86+ =/ bad-parsed (parse:jibb root invalid)
87+ =/ bad-result=detailed-result (detailed root invalid ~)
88+ =/ invalid-clean=?
89+ ?: ?=(%& -.bad-parsed) |
90+ ?: ?=(%& -.bad-result) |
91+ &(!=(0 message.p.bad-result) ?=(~ overlap.p.bad-result))
92+ =/ legacy=jfile-result:jibb (infer-jibb-file:jibb root same ~ ~ ~ ~[root] ~ ~ ~ ~)
93+ =/ legacy-excerpts=?
94+ ?: ?=(%& -.legacy) |
95+ =/ lines=wain (to-wain:format p.legacy)
96+ &((lien lines |=(line=@t =(line '/ui/root.jibb:3:3: first union case'))) (lien lines |=(line=@t =(line '/ui/root.jibb:4:3: overlapping case'))))
97+ =/ imported=detailed-result (detailed root parent ~[[child-file child]])
98+ =/ child-pair=(unit upair:jibb) (source-pair child-file child %child-bad)
99+ =/ import-valid=?
100+ ?: ?=(%& -.imported) |
101+ ?: =(0 message.p.imported) |
102+ ?~ overlap.p.imported |
103+ ?~ child-pair |
104+ =/ ev=overlap-evidence u.overlap.p.imported
105+ ?& =(file.ev child-file)
106+ =(source.ev child)
107+ =(name.ev %child-bad)
108+ =(cases.ev u.child-pair)
109+ ==
110+ :~ ['256 generic parameters accepted by scan' (module-mold-params-valid:jibb names256 *(set @t) 256)]
111+ ['257 generic parameters exhaust scan' !(module-mold-params-valid:jibb names257 *(set @t) 256)]
112+ ['duplicate generic parameters fail scan' !(module-mold-params-valid:jibb ~['A' 'A'] *(set @t) 256)]
113+ ['same head has source-bound overlap' (expected-overlap root same %bad)]
114+ ['zero spelling has source-bound overlap' (expected-overlap root zero %bad)]
115+ ['generic wrapper has source-bound overlap' (expected-overlap root generic %bad)]
116+ ['duplicate generic parameters remain unstructured' (plain-failure root duplicate-generic)]
117+ ['unsupported remains unstructured' (plain-failure root unsupported)]
118+ ['later overlap exists in precedence source' (source-witness root precedence %bad)]
119+ ['earlier unsupported mold takes precedence' (plain-failure root precedence)]
120+ ['duplicate source parsed but rejects without overlap' (plain-failure root duplicate)]
121+ ['invalid source rejects without overlap' invalid-clean]
122+ ['distinct alias source parses and checks' &(?=(%& -.good-parsed) ?=(%& -.good-result))]
123+ ['parent itself has different positive overlap' (source-witness root parent %parent-bad)]
124+ ['legacy full-module error contains both excerpts' legacy-excerpts]
125+ ['import overlap retains exact child source' import-valid]
126+ ==
127+++ text
128+ |= lines=wain
129+ ^- @t
130+ (rap 3 (turn lines |=(line=@t (cat 3 line '\0a'))))
131+++ output
132+ |= [same=@t zero=@t unsupported=@t precedence=@t duplicate=@t invalid=@t distinct=@t parent=@t child=@t generic=@t duplicate-generic=@t]
133+ ^- @t
134+ =/ result=(list [@t ?]) (run same zero unsupported precedence duplicate invalid distinct parent child generic duplicate-generic)
135+ (of-wain:format (turn result |=(entry=[@t ?] (crip "{(trip -.entry)}: {?:(+.entry "ok" "BAD")}"))))
136+++ test-full-overlap-basic
137+ ^- tang
138+ ?~ expected ~[leaf+"expected output missing"]
139+ =/ actual=@t (output (text same) (text zero) (text unsupported) (text precedence) (text duplicate) (text invalid) (text distinct) (text parent) (text child) (text generic) (text duplicate-generic))
140+ ?. =((to-wain:format (cat 3 actual '\0a')) expected)
141+ ~[leaf+"full-module overlap output differs"]
142+ ~
143+--
tests/lib/jibb-full-overlap-graph.hoonnew file+126
@@ -0,0 +1,126 @@
1+:: Source-bound full-module overlap diagnostics.
2+/+ jibb
3+/* parent %txt /tests/type-full-overlap/parent/txt
4+/* child %txt /tests/type-full-overlap/child/txt
5+/* distinct %txt /tests/type-full-overlap/distinct/txt
6+/* expected %txt /tests/type-full-overlap/expected-graph/txt
7+|%
8++$ overlap-evidence [file=path source=@t name=term cases=upair:jibb]
9++$ detailed-result
10+ (each [iface=ifile:jibb cache=jcache:jibb] [message=@t overlap=(unit overlap-evidence)])
11+++ detailed
12+ |= [file=path source=@t modules=jbundle:jibb]
13+ ^- detailed-result
14+ (infer-jibb-file-detailed:jibb file source ~ ~ modules ~[file] ~ ~ ~ ~)
15+++ source-pair
16+ |= [file=path source=@t]
17+ ^- (unit upair:jibb)
18+ =/ parsed (parse:jibb file source)
19+ ?: ?=(%| -.parsed) ~
20+ =/ molds=imolds:jibb (collect-simple-molds:jibb defs.p.parsed)
21+ =/ found=(unit shape:jibb) (find-simple-mold:jibb %child-bad molds)
22+ ?~ found ~
23+ ?. ?=(%union -.u.found) ~
24+ ?~ cases.u.found ~
25+ ?~ t.cases.u.found ~
26+ `[at.i.cases.u.found at.i.t.cases.u.found %overlap]
27+++ failure-message
28+ |= [r=detailed-result expected-message=@t]
29+ ^- ?
30+ ?: ?=(%& -.r) |
31+ &(=(message.p.r expected-message) ?=(~ overlap.p.r))
32+++ run
33+ |= [parent=@t child=@t distinct=@t]
34+ ^- (list [@t ?])
35+ =/ root=path /ui/root/jibb
36+ =/ child-file=path /ui/child/jibb
37+ =/ good-parsed (parse:jibb child-file distinct)
38+ =/ parent-parsed (parse:jibb root parent)
39+ =/ child-parsed (parse:jibb child-file child)
40+ ?: ?=(%| -.good-parsed) ~[['BAD valid child parse' |]]
41+ ?: ?=(%| -.parent-parsed) ~[['BAD parent parse' |]]
42+ ?: ?=(%| -.child-parsed) ~[['BAD child parse' |]]
43+ =/ child-pair=(unit upair:jibb) (source-pair child-file child)
44+ ?~ child-pair ~[['BAD child pair' |]]
45+ =/ old=detailed-result (detailed child-file distinct ~)
46+ =/ cache-controls=[rebuilt=? stale=? source-bound=?]
47+ ?: ?=(%| -.old) [| | |]
48+ =/ previous=ifile:jibb iface.p.old
49+ =/ source-bound=?
50+ ?~ source.previous |
51+ ?~ graph.previous |
52+ ?& =(at.previous child-file)
53+ =(u.source.previous distinct)
54+ (request-graph-reusable:jibb previous distinct ~ ~ ~ ~ ~ ~ ~)
55+ !(request-graph-reusable:jibb previous child ~ ~ ~ ~ ~ ~ ~)
56+ ==
57+ =/ detached=ifile:jibb previous(graph ~)
58+ =/ rebuilt=detailed-result
59+ (infer-jibb-file-detailed:jibb root parent ~ ~ ~[[child-file child]] ~[root] ~ ~ ~[[child-file detached]] ~)
60+ =/ stale=detailed-result
61+ (infer-jibb-file-detailed:jibb root parent ~ ~ ~[[child-file child]] ~[root] ~ ~ ~[[child-file previous]] ~)
62+ =/ rebuilt-ok=?
63+ ?: ?=(%& -.rebuilt) |
64+ ?~ overlap.p.rebuilt |
65+ ?& =(file.u.overlap.p.rebuilt child-file)
66+ =(source.u.overlap.p.rebuilt child)
67+ =(name.u.overlap.p.rebuilt %child-bad)
68+ =(cases.u.overlap.p.rebuilt u.child-pair)
69+ ==
70+ =/ stale-ok=?
71+ ?: ?=(%& -.stale) |
72+ &(=(message.p.stale 'cached module evidence needs unsupported inference') ?=(~ overlap.p.stale))
73+ [rebuilt-ok stale-ok source-bound]
74+ =/ middle=@t (of-wain:format ~['/= leaf /ui/leaf' '+$ okay @t'])
75+ =/ leaf-file=path /ui/leaf/jibb
76+ =/ middle-parsed (parse:jibb child-file middle)
77+ =/ transitive=detailed-result
78+ (infer-jibb-file-detailed:jibb root parent ~ ~ ~[[child-file middle] [leaf-file child]] ~[root] ~ ~ ~ ~)
79+ =/ transitive-ok=?
80+ ?: ?=(%| -.middle-parsed) |
81+ ?: ?=(%& -.transitive) |
82+ ?~ overlap.p.transitive |
83+ ?& =(file.u.overlap.p.transitive leaf-file)
84+ =(source.u.overlap.p.transitive child)
85+ =(name.u.overlap.p.transitive %child-bad)
86+ =(cases.u.overlap.p.transitive u.child-pair)
87+ ==
88+ =/ clean-failure
89+ |= r=detailed-result
90+ ^- ?
91+ ?: ?=(%& -.r) |
92+ &(!=(0 message.p.r) ?=(~ overlap.p.r))
93+ =/ private-src=@t (of-wain:format ~['/= secret /lib/jibb/internal' '+$ good @t'])
94+ =/ cycle-src=@t (of-wain:format ~['/= mine /ui/root' '+$ good @t'])
95+ =/ private-parsed (parse:jibb root private-src)
96+ =/ cycle-parsed (parse:jibb root cycle-src)
97+ =/ private-result=detailed-result (detailed root private-src ~)
98+ =/ cycle-result=detailed-result (detailed root cycle-src ~)
99+ =/ duplicate-result=detailed-result (detailed root parent ~[[child-file child] [child-file child]])
100+ =/ missing-result=detailed-result (detailed root parent ~)
101+ :~ ['detached cache rebuild preserves child evidence' rebuilt.cache-controls]
102+ ['mismatched graph cache declines without evidence' stale.cache-controls]
103+ ['verified cache source binding' source-bound.cache-controls]
104+ ['private import declines before source proof' &(?=(%& -.private-parsed) (failure-message private-result 'the prelude internal module is private'))]
105+ ['active cycle declines before source proof' &(?=(%& -.cycle-parsed) (failure-message cycle-result (crip "import cycle at {(spud root)}")))]
106+ ['duplicate child sources decline without evidence' (clean-failure duplicate-result)]
107+ ['missing child source declines without evidence' (clean-failure missing-result)]
108+ ['transitive import retains leaf source' transitive-ok]
109+ ==
110+++ text
111+ |= lines=wain
112+ ^- @t
113+ (rap 3 (turn lines |=(line=@t (cat 3 line '\0a'))))
114+++ output
115+ |= [parent=@t child=@t distinct=@t]
116+ ^- @t
117+ =/ result=(list [@t ?]) (run parent child distinct)
118+ (of-wain:format (turn result |=(entry=[@t ?] (crip "{(trip -.entry)}: {?:(+.entry "ok" "BAD")}"))))
119+++ test-full-overlap-graph
120+ ^- tang
121+ ?~ expected ~[leaf+"expected output missing"]
122+ =/ actual=@t (output (text parent) (text child) (text distinct))
123+ ?. =((to-wain:format (cat 3 actual '\0a')) expected)
124+ ~[leaf+"full-module overlap output differs"]
125+ ~
126+--
tests/lib/jibb-gate-free-guards.hoonnew file+79
@@ -0,0 +1,79 @@
1+:: Budgeted gate-free verdicts require a witness and an inhabited sibling.
2+/+ jibb
3+|%
4+++ gate-free-guard-errors
5+ ^- (list tape)
6+ =/ atom=itype:jibb [%atom %t]
7+ =/ flag=itype:jibb [%flag ~]
8+ =/ noun=itype:jibb [%noun ~]
9+ =/ var=itype:jibb [%var 0]
10+ =/ gate=itype:jibb [%fn atom atom]
11+ =/ item=itype:jibb [%cell [%face %id [%atom %ud]] [%cell [%face %done flag] [%face %text atom]]]
12+ =/ model=itype:jibb [%cell [%face %todos [%collection %list ~[item]]] [%cell [%face %draft atom] [%face %error [%union ~[[%const [%null %n 0 '~']] [%cell [%const [%null %n 0 '~']] [%face %u atom]]] ~ ~ ~]]]]
13+ =/ with-callback=itype:jibb [%cell [%face %data atom] [%face %callback gate]]
14+ =/ ask-like=itype:jibb [%union ~[[%cell [%const [%term %tas %pure '%pure']] [%face %value atom]] [%cell [%const [%term %tas %agent '%agent']] [%face %receive gate]]] ~ ~ ~]
15+ =/ sub-like=itype:jibb [%union ~[[%cell [%const [%term %tas %watch '%watch']] [%face %request ask-like]] [%cell [%const [%term %tas %every '%every']] [%face %reply gate]]] ~ ~ ~]
16+ =/ controls=(list [name=@t typ=itype:jibb fuel=@ud want=?(%yes %no %unknown)])
17+ :~ ['atom' atom 8 %yes]
18+ ['flag' flag 8 %yes]
19+ ['atom variable' [%avar 0] 8 %yes]
20+ ['open variable' var 8 %unknown]
21+ ['noun' noun 8 %unknown]
22+ ['raw gate' gate 8 %no]
23+ ['data item' item 30 %yes]
24+ ['todo model' model 100 %yes]
25+ ['callback field' with-callback 30 %no]
26+ ['ask receiver' ask-like 100 %no]
27+ ['subscription receiver' sub-like 100 %no]
28+ ['list of data items' [%collection %list ~[item]] 40 %yes]
29+ ['list of gates' [%collection %list ~[gate]] 20 %no]
30+ ['other collection' [%collection %map ~[atom atom]] 20 %unknown]
31+ ['open list member' [%collection %list ~[var]] 20 %unknown]
32+ ['known-inhabited noun after gate' [%cell gate noun] 30 %no]
33+ ['known-inhabited noun before gate' [%cell noun gate] 30 %no]
34+ ['unknown sibling after gate' [%cell gate var] 30 %unknown]
35+ ['unknown sibling before gate' [%cell var gate] 30 %unknown]
36+ ['nested unknown sibling' [%cell [%face %callback gate] [%face %other var]] 30 %unknown]
37+ ['unknown union and gate union' [%union ~[var gate] ~ ~ ~] 30 %no]
38+ ['empty union' [%union ~ ~ ~ ~] 30 %unknown]
39+ ['validated jrec qath' [%jrec /lib/jibb/internal/jibb %qath ~ %i %ta %t] 30 %yes]
40+ ['jrec gate sibling' [%cell gate [%jrec /lib/jibb/internal/jibb %qath ~ %i %ta %t]] 30 %no]
41+ ['jrec list member' [%collection %list ~[[%jrec /lib/jibb/internal/jibb %qath ~ %i %ta %t]]] 30 %yes]
42+ ['nominal recursion' [%recursive %sur %node ~] 30 %unknown]
43+ ['unknown sibling budget' [%cell gate var] 2 %unknown]
44+ ['known sibling budget' [%cell gate atom] 2 %unknown]
45+ ['zero budget' atom 0 %unknown]
46+ ['one atom budget' atom 1 %yes]
47+ ['cell needs 3 visits' [%cell atom flag] 2 %unknown]
48+ ['cell exact 3 visits' [%cell atom flag] 3 %yes]
49+ ==
50+ =/ errors=(list @t)
51+ %+ turn controls
52+ |= c=[name=@t typ=itype:jibb fuel=@ud want=?(%yes %no %unknown)]
53+ =/ result=igate-free:jibb (gate-free-type:jibb typ.c fuel.c ~)
54+ ?: =(want.c verdict.result) ''
55+ (cat 3 name.c ': wrong verdict')
56+ =/ a=igate-free:jibb (gate-free-type:jibb with-callback 30 ~)
57+ =? errors !=(path.a `~[[%tail ~] [%field %callback]]) ['callback path incorrect' errors]
58+ =/ b=igate-free:jibb (gate-free-type:jibb [%collection %list ~[gate]] 20 ~)
59+ =? errors !=(path.b `~[[%item ~]]) ['list path incorrect' errors]
60+ =/ c=igate-free:jibb (gate-free-type:jibb model 100 ~)
61+ =? errors ?=(^ path.c) ['gate-free result carries witness path' errors]
62+ :: The explicit budget is shared across the entire normalized type.
63+ =/ deep
64+ |= depth=@ud
65+ ^- itype:jibb
66+ =/ out=itype:jibb [%atom %t]
67+ |-
68+ ?: =(0 depth) out
69+ $(depth (dec depth), out [%face %nested out])
70+ =/ fits=igate-free:jibb (gate-free-type:jibb (deep 255) 256 ~)
71+ =/ exceeds=igate-free:jibb (gate-free-type:jibb (deep 256) 256 ~)
72+ =? errors !=(%yes verdict.fits) ['256 node budget rejected exact fit' errors]
73+ =? errors !=(%unknown verdict.exceeds) ['257 node budget did not fail closed' errors]
74+ =/ errors (skim errors |=(x=@t !=(x '')))
75+ (turn errors trip)
76+++ test-gate-free-guards
77+ ^- tang
78+ (turn gate-free-guard-errors |=(reason=tape leaf+reason))
79+--
tests/lib/jibb-gate-free-source.hoonnew file+95
@@ -0,0 +1,95 @@
1+:: Source-backed mold analysis of the actual todo model; not island checking.
2+/+ jibb, jibb-import
3+/* prelude %jibb /lib/jibb/prelude/jibb
4+/* internal %jibb /lib/jibb/internal/jibb
5+/* sur %txt /tests/type-api-paths/todo-sur/txt
6+/* action %txt /tests/type-api-paths/todo-action/txt
7+/* todos %txt /tests/type-api-paths/todos/txt
8+/* update %txt /tests/type-api-paths/todo-update/txt
9+/* item %txt /tests/type-api-paths/todo-item/txt
10+/* api %txt /tests/type-api-paths/api/txt
11+/* source %txt /tests/type-gate-free/todo/txt
12+/* gate-source %txt /tests/type-gate-free/todo-gate/txt
13+/* noun-source %txt /tests/type-gate-free/todo-noun/txt
14+/* expected %txt /tests/type-gate-free/expected/txt
15+|%
16+++ text
17+ |= lines=wain
18+ ^- @t
19+ (rap 3 (turn lines |=(line=@t (cat 3 line '\0a'))))
20+++ gate-free-source-report
21+ |= [public=@t private=@t sur-text=@t action-text=@t todos-text=@t update-text=@t item-text=@t api-text=@t source-text=@t gate-text=@t noun-text=@t]
22+ ^- @t
23+ =/ prepared=(unit iprelude:jibb) (prepare-prelude-with-internal:jibb public private)
24+ ?~ prepared 'prelude unavailable'
25+ =/ todo=type -:(ride -:!>(..zuse) sur-text)
26+ =/ subject=type [%cell [%face %todo todo] -:!>(..zuse)]
27+ =/ ma=* (read-mark:jibb-import %todo-action -:(ride subject action-text))
28+ =/ mt=* (read-mark:jibb-import %todos -:(ride subject todos-text))
29+ =/ mu=* (read-mark:jibb-import %todo-update -:(ride subject update-text))
30+ =/ mi=* (read-mark:jibb-import %todo-item -:(ride subject item-text))
31+ =/ marks=imark-externals:jibb ~[[%todo-action ma] [%todos mt] [%todo-update mu] [%todo-item mi]]
32+ =/ item-input=* (read-named:jibb-import %todo %item todo)
33+ =/ inputs=iexternals:jibb ~[[%todo %item item-input]]
34+ =/ modules=jbundle:jibb ~[[/ui/api/todo/jibb api-text]]
35+ =/ at=path /ui/todo-list/jibb
36+ =/ model (gate-free-mold-source:jibb at source-text %model inputs marks modules prepared 256)
37+ ?: ?=(%| -.model) 'todo model unavailable'
38+ ?. =(%yes verdict.result.p.model) 'todo model not proven gate-free'
39+ ?. &(=(at.p.model at) =(source.p.model source-text) =(name.p.model %model) =(prepared.p.model u.prepared) =(externals.p.model inputs) =(marks.p.model marks) =(modules.p.model modules)) 'source evidence changed'
40+ ?~ dependencies.p.model 'resolved dependency evidence missing'
41+ ?. ?=(%cell -.typ.mold.p.model) 'selected model scheme missing'
42+ ?. &(=(256 requested.p.model) =(256 budget.p.model)) 'requested budget not retained'
43+ =/ callback (gate-free-mold-source:jibb at gate-text %model inputs marks modules prepared 256)
44+ ?: ?=(%| -.callback) 'callback model unavailable'
45+ ?. =(%no verdict.result.p.callback) 'callback was not found'
46+ ?~ path.result.p.callback 'callback path missing'
47+ ?. (lien u.path.result.p.callback |=(part=igf-segment:jibb ?=([%field %callback] part))) 'callback field not in witness'
48+ =/ noun (gate-free-mold-source:jibb at noun-text %model inputs marks modules prepared 256)
49+ ?: ?=(%| -.noun) 'noun model unavailable'
50+ ?. =(%unknown verdict.result.p.noun) 'noun model not unknown'
51+ =/ tiny=@t '+$ sample @t\0a'
52+ =/ low (gate-free-mold-source:jibb /tests/tiny/jibb tiny %sample ~ ~ ~ prepared 0)
53+ ?: ?=(%| -.low) 'zero fuel unavailable'
54+ ?. &(=(%unknown verdict.result.p.low) =(0 budget.p.low)) 'zero fuel not unknown'
55+ =/ capped (gate-free-mold-source:jibb /tests/tiny/jibb tiny %sample ~ ~ ~ prepared 999)
56+ ?: ?=(%| -.capped) 'large fuel unavailable'
57+ ?. &(=(999 requested.p.capped) =(256 budget.p.capped) =(%yes verdict.result.p.capped) =(255 left.result.p.capped)) 'fuel cap incorrect'
58+ =/ matched (gate-free-mold-source:jibb /tests/tiny/jibb tiny %sample ~ ~ ~[[/tests/tiny/jibb tiny]] prepared 256)
59+ ?: ?=(%| -.matched) 'matching root source rejected'
60+ =/ unused-sur=@t '/- unused\0a+$ sample @t\0a'
61+ =/ unused (gate-free-mold-source:jibb /tests/tiny/jibb unused-sur %sample ~ ~ ~ prepared 256)
62+ ?: ?=(%| -.unused) 'unused sur source unexpectedly required'
63+ =/ cycle-source=@t '/= child /tests/child\0a+$ sample @t\0a'
64+ =/ child-source=@t '/= root /tests/tiny\0a+$ child @t\0a'
65+ =/ cycle (gate-free-mold-source:jibb /tests/tiny/jibb cycle-source %sample ~ ~ ~[[/tests/child/jibb child-source]] prepared 256)
66+ ?. ?=(%| -.cycle) 'root import cycle accepted'
67+ =/ unprepared (gate-free-mold-source:jibb /tests/tiny/jibb tiny %sample ~ ~ ~ ~ 256)
68+ ?. ?=(%| -.unprepared) 'missing prelude accepted'
69+ =/ cases=(list [name=@t path=path src=@t mold=term external=iexternals:jibb mark=imark-externals:jibb bundle=jbundle:jibb])
70+ :~ ['missing mold' at source-text %missing inputs marks modules]
71+ ['missing API' at source-text %model inputs marks ~]
72+ ['missing mark' at source-text %model inputs (skim marks |=(m=[mark=term result=*] !=(%todo-update mark.m))) modules]
73+ ['root mismatch' at source-text %model inputs marks [[at gate-text] modules]]
74+ ['duplicate root' at source-text %model inputs marks [[at source-text] [at source-text] modules]]
75+ ['duplicate field' at (cat 3 source-text '\0a+$ duplicate [x=@t x=@p]\0a') %model inputs marks modules]
76+ ['invalid syntax' at '++ incomplete |=' %model inputs marks modules]
77+ ['private root' /lib/jibb/internal/jibb source-text %model inputs marks modules]
78+ ['API root' /ui/api/todo/jibb source-text %model inputs marks modules]
79+ ['store root poke' /ui/stores/cart/jibb '+$ poke @t\0a' %poke ~ ~ ~]
80+ ==
81+ =/ errors=(list @t)
82+ %+ turn cases
83+ |= c=[name=@t path=path src=@t mold=term external=iexternals:jibb mark=imark-externals:jibb bundle=jbundle:jibb]
84+ =/ got (gate-free-mold-source:jibb path.c src.c mold.c external.c mark.c bundle.c prepared 256)
85+ ?: ?=(%| -.got) ''
86+ (cat 3 name.c ': unexpectedly succeeded')
87+ =/ errors (skim errors |=(x=@t !=(x '')))
88+ ?^ errors (of-wain:format errors)
89+ 'todo model: gate-free\0acallback model: gate at callback\0anoun model: unknown\0azero fuel: unknown\0aoversized fuel: capped\0ainvalid inputs: rejected\0asource evidence: retained\0amatching root and unused sur: accepted\0aroot import cycle: rejected'
90+++ test-gate-free-source
91+ ^- tang
92+ =/ actual (gate-free-source-report prelude internal (text sur) (text action) (text todos) (text update) (text item) (text api) (text source) (text gate-source) (text noun-source))
93+ ?. =((to-wain:format (cat 3 actual '\0a')) expected) ~[leaf+"gate-free mold report differs from expected"]
94+ ~
95+--
tests/lib/jibb-generic-construction.hoonnew file+141
@@ -0,0 +1,141 @@
1+:: Source-proven generic tree construction; not a backend/runtime test.
2+/+ jibb
3+/* real-prelude %jibb /lib/jibb/prelude/jibb
4+/* real-internal %jibb /lib/jibb/internal/jibb
5+/* tree %txt /tests/type-generic-construction/tree/txt
6+/* alias %txt /tests/type-generic-construction/alias/txt
7+/* client %txt /tests/type-generic-construction/client/txt
8+/* alias-client %txt /tests/type-generic-construction/alias-client/txt
9+/* tree-no-event %txt /tests/type-generic-construction/tree-no-event/txt
10+/* no-event-client %txt /tests/type-generic-construction/no-event-client/txt
11+/* owner-positive %txt /tests/type-generic-construction/owner-positive/txt
12+/* owner-negative %txt /tests/type-generic-construction/owner-negative/txt
13+/* sibling-values %txt /tests/type-generic-construction/sibling-values/txt
14+/* expected %txt /tests/type-generic-construction/expected/txt
15+|%
16+++ text
17+ |= lines=wain
18+ ^- @t
19+ (rap 3 (turn lines |=(line=@t (cat 3 line '\0a'))))
20+++ line
21+ |= [label=@t ok=?]
22+ ^- @t
23+ (crip "{(trip label)}: {?:(ok "ok" "BAD")}")
24+++ construction-output
25+ |= [pre=@t internal=@t tree=@t alias=@t client=@t alias-client=@t tree-no-event=@t no-event-client=@t owner-positive=@t owner-negative=@t sibling-values=@t]
26+ ^- @t
27+ =/ prep=(unit iprelude:jibb) (prepare-prelude-with-internal:jibb pre internal)
28+ ?~ prep 'BAD prelude preparation'
29+ :: Complete owner is checked by the real source interface, not this unit state.
30+ =/ owner=jfile-result:jibb
31+ (infer-jibb-file:jibb /ui/tree/jibb owner-positive ~ ~ ~ ~[/ui/tree/jibb] values.u.prep molds.u.prep ~ `iface.u.prep)
32+ ?: ?=(%| -.owner) 'BAD valid owner'
33+ =/ bad-owner=jfile-result:jibb
34+ (infer-jibb-file:jibb /ui/tree/jibb owner-negative ~ ~ ~ ~[/ui/tree/jibb] values.u.prep molds.u.prep ~ `iface.u.prep)
35+ =/ bad-parse=(each module:jibb error:jibb) (parse:jibb /ui/tree/jibb owner-negative)
36+ =/ mold=(unit ischeme:jibb) (find-jibb-mold:jibb %node-tree iface.p.owner)
37+ ?~ mold 'BAD owner mold'
38+ ?. ?=(%grec -.typ.u.mold) 'BAD nominal owner'
39+ =/ generic=itype:jibb typ.u.mold(args ~[[%var 42]])
40+ =/ target=itype:jibb typ.u.mold(args ~[[%atom %t]])
41+ ?> ?=(%grec -.generic)
42+ ?> ?=(%grec -.target)
43+ =/ owner-leaf=(unit ischeme:jibb) (ienv-lookup:jibb %made-leaf values.iface.p.owner)
44+ =/ owner-node=(unit ischeme:jibb) (ienv-lookup:jibb %made-node values.iface.p.owner)
45+ =/ leaf-ok=? ?~(owner-leaf | &(?=(~ vars.u.owner-leaf) =(target typ.u.owner-leaf)))
46+ =/ node-ok=? ?~(owner-node | &(?=(~ vars.u.owner-node) =(target typ.u.owner-node)))
47+ =/ foreign=itype:jibb target(at /ui/foreign/jibb)
48+ =/ view=(unit [view=itype:jibb left=@ud]) (grec-unfold-view:jibb generic 2)
49+ ?~ view 'BAD generic view'
50+ =/ target-view=(unit [view=itype:jibb left=@ud]) (grec-unfold-view:jibb target 2)
51+ ?~ target-view 'BAD target view'
52+ =/ expected-leaf=itype:jibb [%cell [%const [%term %tas %text '%text']] [%face %value [%atom %t]]]
53+ =/ expected-node=itype:jibb [%cell [%const [%term %tas %node '%node']] [%cell [%face %event [%fn [%atom %t] [%var 42]]] [%face %children [%collection %list ~[generic]]]]]
54+ =/ expected-view=itype:jibb [%union ~[expected-leaf expected-node] ~ ~ ~]
55+ =/ wrong-view=(unit [view=itype:jibb left=@ud]) (grec-unfold-view:jibb foreign 2)
56+ =/ malformed=shape:jibb *shape:jibb
57+ =/ parsed=(each module:jibb error:jibb) (parse:jibb /tests/tree/values/jibb sibling-values)
58+ ?: ?=(%| -.parsed) 'BAD values parse'
59+ =/ ds=(list def:jibb) defs.p.parsed
60+ ?. ?=([* [* [* [* ~]]]] ds) 'BAD values count'
61+ =/ a=def:jibb i.ds
62+ =/ b=def:jibb i.t.ds
63+ =/ c=def:jibb i.t.t.ds
64+ =/ d=def:jibb i.t.t.t.ds
65+ ?. &(?=(%value -.a) ?=(%value -.b) ?=(%value -.c) ?=(%value -.d)) 'BAD value declarations'
66+ =/ env=ienv:jibb ~[[%text-event [[%fn [%atom %t] [%atom %t]] ~]]]
67+ =/ tag=ipending:jibb [100 [%term %tas %unrelated '%unrelated']]
68+ =/ projection=iwprojection:jibb *iwprojection:jibb
69+ =/ st=istate:jibb *istate:jibb
70+ =. st st(next 201, prelude `iface.u.prep, tags ~[tag], holes ~[[99 (span-of:jibb val.a)]], projections ~[projection])
71+ =/ r0=iresult:jibb (infer-call-context-arg:jibb val.a target env st(jrec-fuel 0) (span-of:jibb val.a))
72+ =/ r1=iresult:jibb (infer-call-context-arg:jibb val.a target env st(jrec-fuel 1) (span-of:jibb val.a))
73+ =/ rnode=iresult:jibb (infer-call-context-arg:jibb val.b target env st(jrec-fuel 1) (span-of:jibb val.b))
74+ =/ short=iresult:jibb (infer-call-context-arg:jibb val.c target env st(jrec-fuel 1) (span-of:jibb val.c))
75+ =/ nested=iresult:jibb (infer-call-context-arg:jibb val.c target env st(jrec-fuel 2) (span-of:jibb val.c))
76+ =/ sibling-short=iresult:jibb (infer-call-context-arg:jibb val.d target env st(jrec-fuel 2) (span-of:jibb val.d))
77+ =/ siblings=iresult:jibb (infer-call-context-arg:jibb val.d target env st(jrec-fuel 3) (span-of:jibb val.d))
78+ =/ retry=iresult:jibb (infer-call-context-arg:jibb val.a target env st(jrec-fuel 1) (span-of:jibb val.a))
79+ =/ failed-retry=iresult:jibb (infer-call-context-arg:jibb val.a target env st(jrec-fuel 0) (span-of:jibb val.a))
80+ =/ rvar=iresult:jibb (infer-call-context-arg:jibb val.b generic env st(jrec-fuel 1) (span-of:jibb val.b))
81+ =/ hidden=istate:jibb st(sub ~[[200 target]], jrec-fuel 2)
82+ =/ rhidden=iresult:jibb (infer-call-context-arg:jibb val.a [%var 200] env hidden (span-of:jibb val.a))
83+ =/ hidden-safe=?
84+ ?: ?=(%| -.rhidden) &
85+ =/ fit=ifit:jibb (itype-fit:jibb typ.p.rhidden [%var 200] sub.state.p.rhidden next.state.p.rhidden)
86+ ?=(%unknown -.fit)
87+ =/ exact=isub:jibb (turn (gulf 1 4.096) |=(n=@ud [(add 1.000 n) [%atom %t]]))
88+ =/ over=isub:jibb [[9.999 [%atom %t]] exact]
89+ =/ face-exact=isub:jibb (turn (gulf 1 4.095) |=(n=@ud [(add 1.000 n) [%atom %t]]))
90+ =/ checks=(list [label=@t ok=?])
91+ :~ ['complete owner' ?=(%& -.owner)]
92+ ['owner exports constructed nominal values' &(leaf-ok node-ok)]
93+ ['invalid owner declined' &(?=(%& -.bad-parse) ?=(%| -.bad-owner))]
94+ ['view spends one step' =(1 left.u.view)]
95+ ['view retains argument and child identity' =(expected-view view.u.view)]
96+ ['zero view fuel declined' ?=(~ (grec-unfold-view:jibb generic 0))]
97+ ['malformed proof declined' ?=(~ (grec-unfold-view:jibb generic(proof malformed) 2))]
98+ ['foreign recursive tail retained' ?:(?=(~ wrong-view) | !=(view.u.wrong-view view.u.target-view))]
99+ ['zero inference fuel declined' ?=(%| -.r0)]
100+ ['one-step leaf retains nominal identity' ?:(?=(%& -.r1) &(=(target typ.p.r1) =(0 jrec-fuel.state.p.r1)) |)]
101+ ['one-step node succeeds' ?:(?=(%& -.rnode) &(=(target typ.p.rnode) =(0 jrec-fuel.state.p.rnode)) |)]
102+ ['nested one-step declined' ?=(%| -.short)]
103+ ['nested two-step succeeds' ?:(?=(%& -.nested) &(=(target typ.p.nested) =(0 jrec-fuel.state.p.nested)) |)]
104+ ['siblings share fuel' &(?=(%| -.sibling-short) ?:(?=(%& -.siblings) =(0 jrec-fuel.state.p.siblings) |))]
105+ ['same-state retry agrees' =(r1 retry)]
106+ ['failed retry agrees' =(r0 failed-retry)]
107+ ['argument binding retains source identity' ?:(?=(%& -.rvar) =(target (itype-normalize:jibb typ.p.rvar sub.state.p.rvar)) |)]
108+ ['pending tag retained' ?:(?=(%& -.r1) (lien tags.state.p.r1 |=(entry=ipending:jibb =(entry tag))) |)]
109+ ['pending hole retained' ?:(?=(%& -.r1) =(holes.st holes.state.p.r1) |)]
110+ ['projection evidence retained' ?:(?=(%& -.r1) =(projections.st projections.state.p.r1) |)]
111+ ['hidden variable declined' hidden-safe]
112+ ['scan exact limit' (grec-direct-context:jibb target exact)]
113+ ['scan over limit declined' !(grec-direct-context:jibb target over)]
114+ ['faced scan exact limit' (grec-direct-context:jibb [%face %field target] face-exact)]
115+ ['faced scan over limit declined' !(grec-direct-context:jibb [%face %field target] exact)]
116+ ['structural substitution declined' !(grec-direct-context:jibb target ~[[9 [%cell [%atom %t] [%atom %t]]]])]
117+ ==
118+ =/ modules=jbundle:jibb ~[[/ui/tree/jibb tree] [/ui/tree-two/jibb tree] [/ui/tree-alias/jibb alias]]
119+ =/ small=jbundle:jibb ~[[/ui/tree/jibb tree-no-event] [/ui/tree-two/jibb tree-no-event]]
120+ =/ report=@t (golden-types-with-prepared-prelude:jibb /tests/tree/client/jibb client ~ ~ modules prep)
121+ =/ aliases=@t (golden-types-with-prepared-prelude:jibb /tests/tree/alias-client/jibb alias-client ~ ~ modules prep)
122+ =/ no-event=@t (golden-types-with-prepared-prelude:jibb /tests/tree/no-event-client/jibb no-event-client ~ ~ small prep)
123+ (cat 3 (of-wain:format (turn checks line)) (cat 3 '\0a' (cat 3 report (cat 3 '\0a' (cat 3 aliases (cat 3 '\0a' no-event))))))
124+++ test-generic-construction
125+ ^- tang
126+ ?~ tree ~[leaf+"tree source missing"]
127+ ?~ alias ~[leaf+"alias source missing"]
128+ ?~ client ~[leaf+"client source missing"]
129+ ?~ alias-client ~[leaf+"alias client missing"]
130+ ?~ tree-no-event ~[leaf+"tree without event missing"]
131+ ?~ no-event-client ~[leaf+"no-event client missing"]
132+ ?~ owner-positive ~[leaf+"owner source missing"]
133+ ?~ owner-negative ~[leaf+"invalid owner source missing"]
134+ ?~ sibling-values ~[leaf+"sibling source missing"]
135+ ?~ expected ~[leaf+"expected output missing"]
136+ =/ actual=@t
137+ (construction-output real-prelude real-internal (text tree) (text alias) (text client) (text alias-client) (text tree-no-event) (text no-event-client) (text owner-positive) (text owner-negative) (text sibling-values))
138+ ?. =((to-wain:format (cat 3 actual '\0a')) expected)
139+ ~[leaf+"generic construction output differs from expected"]
140+ ~
141+--
tests/lib/jibb-generic-pattern.hoonnew file+165
@@ -0,0 +1,165 @@
1+:: Source-proven generic recursive patterns; no backend/runtime claim.
2+/+ jibb
3+/* real-prelude %jibb /lib/jibb/prelude/jibb
4+/* real-internal %jibb /lib/jibb/internal/jibb
5+/* tree %txt /tests/type-generic-construction/tree/txt
6+/* alias %txt /tests/type-generic-construction/alias/txt
7+/* tree-no-event %txt /tests/type-generic-construction/tree-no-event/txt
8+/* client %txt /tests/type-generic-pattern/client/txt
9+/* no-event %txt /tests/type-generic-pattern/no-event/txt
10+/* values %txt /tests/type-generic-pattern/values/txt
11+/* poly-values %txt /tests/type-generic-pattern/poly-values/txt
12+/* owner %txt /tests/type-generic-pattern/owner/txt
13+/* owner-bad %txt /tests/type-generic-pattern/owner-bad/txt
14+/* expected %txt /tests/type-generic-pattern/expected/txt
15+|%
16+++ text
17+ |= lines=wain
18+ ^- @t
19+ (rap 3 (turn lines |=(line=@t (cat 3 line '\0a'))))
20+++ line
21+ |= [label=@t ok=?]
22+ ^- @t
23+ (crip "{(trip label)}: {?:(ok "ok" "BAD")}")
24+++ pattern-output
25+ |= [pre=@t internal=@t tree=@t alias=@t tree-no-event=@t client=@t no-event=@t values=@t poly-values=@t owner=@t owner-bad=@t]
26+ ^- @t
27+ =/ prep=(unit iprelude:jibb) (prepare-prelude-with-internal:jibb pre internal)
28+ ?~ prep 'BAD prelude preparation'
29+ =/ checked=jfile-result:jibb
30+ (infer-jibb-file:jibb /ui/tree/jibb owner ~ ~ ~ ~[/ui/tree/jibb] values.u.prep molds.u.prep ~ `iface.u.prep)
31+ ?: ?=(%| -.checked) 'BAD valid owner'
32+ =/ bad-parse=(each module:jibb error:jibb) (parse:jibb /ui/tree/jibb owner-bad)
33+ =/ bad=jfile-result:jibb
34+ (infer-jibb-file:jibb /ui/tree/jibb owner-bad ~ ~ ~ ~[/ui/tree/jibb] values.u.prep molds.u.prep ~ `iface.u.prep)
35+ =/ mold=(unit ischeme:jibb) (find-jibb-mold:jibb %node-tree iface.p.checked)
36+ ?~ mold 'BAD owner mold'
37+ ?. ?=(%grec -.typ.u.mold) 'BAD nominal owner'
38+ =/ target=itype:jibb typ.u.mold(args ~[[%atom %t]])
39+ =/ generic=itype:jibb typ.u.mold(args ~[[%var 42]])
40+ ?> ?=(%grec -.target)
41+ ?> ?=(%grec -.generic)
42+ =/ desc=(unit ischeme:jibb) (ienv-lookup:jibb %describe values.iface.p.checked)
43+ =/ children=(unit ischeme:jibb) (ienv-lookup:jibb %children values.iface.p.checked)
44+ =/ rebuild=(unit ischeme:jibb) (ienv-lookup:jibb %rebuild values.iface.p.checked)
45+ ?~ desc 'BAD owner describe missing'
46+ ?~ children 'BAD owner children missing'
47+ ?~ rebuild 'BAD owner rebuild missing'
48+ ?. &(?=(%fn -.typ.u.desc) ?=(%fn -.typ.u.children) ?=(%fn -.typ.u.rebuild)) 'BAD owner gate types'
49+ ?. ?=([@ ~] vars.u.children) 'BAD owner children quantification'
50+ =/ desc-sample=itype:jibb sample.typ.u.desc
51+ =/ children-sample=itype:jibb sample.typ.u.children
52+ =/ rebuild-sample=itype:jibb sample.typ.u.rebuild
53+ =? desc-sample ?=(%face -.desc-sample) body.desc-sample
54+ =? children-sample ?=(%face -.children-sample) body.children-sample
55+ =? rebuild-sample ?=(%face -.rebuild-sample) body.rebuild-sample
56+ =/ quantified=itype:jibb typ.u.mold(args ~[[%var i.vars.u.children]])
57+ =/ parsed=(each module:jibb error:jibb) (parse:jibb /tests/tree/values/jibb values)
58+ ?: ?=(%| -.parsed) 'BAD values parse'
59+ =/ ds=(list def:jibb) defs.p.parsed
60+ ?. ?=([* [* [* [* [* ~]]]]] ds) 'BAD value count'
61+ =/ a=def:jibb i.ds
62+ =/ b=def:jibb i.t.ds
63+ ?. &(?=(%value -.a) ?=(%value -.b)) 'BAD value declarations'
64+ =/ c=def:jibb i.t.t.ds
65+ =/ d=def:jibb i.t.t.t.ds
66+ =/ e=def:jibb i.t.t.t.t.ds
67+ ?. &(?=(%value -.c) ?=(%value -.d) ?=(%value -.e)) 'BAD extra value declarations'
68+ ?. &(?=(%branch -.val.c) ?=(%branch -.val.d) ?=(%branch -.val.e)) 'BAD extra branches'
69+ ?. ?=([* *] arms.val.c) 'BAD fallback arms'
70+ =/ sample-arm=arm:jibb i.arms.val.c
71+ =/ parsed-poly=(each module:jibb error:jibb) (parse:jibb /tests/tree/poly/jibb poly-values)
72+ ?: ?=(%| -.parsed-poly) 'BAD polymorphic values parse'
73+ =/ ps=(list def:jibb) defs.p.parsed-poly
74+ ?. ?=([* ~] ps) 'BAD polymorphic value count'
75+ =/ p=def:jibb i.ps
76+ ?. ?=(%value -.p) 'BAD polymorphic value'
77+ ?. ?=(%branch -.val.p) 'BAD polymorphic branch'
78+ =/ env=ienv:jibb ~[[%x [target ~]]]
79+ =/ poly=ienv:jibb ~[[%x [generic ~[42]]]]
80+ =/ tag=ipending:jibb [100 [%term %tas %unrelated '%unrelated']]
81+ =/ projection=iwprojection:jibb *iwprojection:jibb
82+ =/ st=istate:jibb *istate:jibb
83+ =. st st(next 201, prelude `iface.u.prep, tags ~[tag], holes ~[[99 (span-of:jibb val.a)]], projections ~[projection])
84+ =/ zero=iresult:jibb (infer-fragment:jibb val.a env st(jrec-fuel 0))
85+ =/ one=iresult:jibb (infer-fragment:jibb val.a env st(jrec-fuel 1))
86+ =/ short=iresult:jibb (infer-fragment:jibb val.b env st(jrec-fuel 1))
87+ =/ nested=iresult:jibb (infer-fragment:jibb val.b env st(jrec-fuel 2))
88+ =/ retry=iresult:jibb (infer-fragment:jibb val.a env st(jrec-fuel 1))
89+ =/ hidden=ienv:jibb ~[[%x [[%var 200] ~]]]
90+ =/ hidden-result=iresult:jibb (infer-fragment:jibb val.a hidden st(sub ~[[200 target]], jrec-fuel 2))
91+ =/ first=(unit iresult:jibb) (grec-single-wing-subject:jibb subject.val.p poly st(jrec-fuel 4))
92+ =/ second=(unit iresult:jibb) (grec-single-wing-subject:jibb subject.val.p poly st(next 202, jrec-fuel 4))
93+ ?~ first 'BAD first scheme lookup'
94+ ?~ second 'BAD second scheme lookup'
95+ ?. &(?=(%& -.u.first) ?=(%& -.u.second)) 'BAD scheme inference'
96+ =/ ft=itype:jibb typ.p.u.first
97+ =/ stype=itype:jibb typ.p.u.second
98+ ?. &(?=(%grec -.ft) ?=(%grec -.stype)) 'BAD scheme nominal identity'
99+ ?. &(?=([* ~] args.ft) ?=([* ~] args.stype)) 'BAD scheme argument count'
100+ =/ pmissing=iresult:jibb (infer-fragment:jibb val.p poly st(jrec-fuel 4))
101+ =/ view=(unit [view=itype:jibb left=@ud]) (grec-unfold-view:jibb target 1)
102+ ?~ view 'BAD recursive view'
103+ =/ many=(list arm:jibb)
104+ =/ n=@ud 128
105+ =/ out=(list arm:jibb) ~
106+ |-
107+ ?: =(0 n) out
108+ $(n (dec n), out [sample-arm out])
109+ =/ in-view=iresult:jibb [%& target st(jrec-fuel 1)]
110+ =/ exact=expr:jibb val.c(arms many)
111+ =/ over=expr:jibb val.c(arms [sample-arm many])
112+ =/ rexact=iresult:jibb (grec-match-view:jibb exact in-view)
113+ =/ rover=iresult:jibb (grec-match-view:jibb over in-view)
114+ =/ hidden-view=iresult:jibb [%& [%var 200] st(sub ~[[200 target]], jrec-fuel 1)]
115+ =/ rhidden-view=iresult:jibb (grec-match-view:jibb exact hidden-view)
116+ =/ fallback=iresult:jibb (infer-fragment:jibb val.c env st(jrec-fuel 1))
117+ =/ checks=(list [label=@t ok=?])
118+ :~ ['owner describe has nominal sample and text result' &(=(target desc-sample) =([%atom %t] product.typ.u.desc))]
119+ ['owner rebuild preserves nominal identity' &(=(target rebuild-sample) =(target product.typ.u.rebuild))]
120+ ['owner children preserves quantified recursive identity' &(=(quantified children-sample) =([%collection %list ~[quantified]] product.typ.u.children))]
121+ ['invalid owner parses and is rejected' &(?=(%& -.bad-parse) ?=(%| -.bad))]
122+ ['zero fuel declined' ?=(%| -.zero)]
123+ ['one-step match' ?:(?=(%& -.one) &(=([%atom %t] typ.p.one) =(0 jrec-fuel.state.p.one)) |)]
124+ ['nested match requires two steps' &(?=(%| -.short) ?:(?=(%& -.nested) =(0 jrec-fuel.state.p.nested) |))]
125+ ['same-state retry agrees' =(one retry)]
126+ ['pending tag retained' ?:(?=(%& -.one) (lien tags.state.p.one |=(entry=ipending:jibb =(entry tag))) |)]
127+ ['pending hole retained' ?:(?=(%& -.one) =(holes.st holes.state.p.one) |)]
128+ ['projection evidence retained' ?:(?=(%& -.one) =(projections.st projections.state.p.one) |)]
129+ ['raw bound variable declined' ?=(%| -.hidden-result)]
130+ ['polymorphic scheme gets fresh identities' &(=([%var 201] i.args.ft) =([%var 202] i.args.stype) =(at.ft at.stype) =(name.ft name.stype) =(proof.ft proof.stype))]
131+ ['polymorphic missing arm declined' ?=(%| -.pmissing)]
132+ ['catch-all eligible' (grec-patterns-eligible:jibb arms.val.c view.u.view 128)]
133+ ['whole binder stays unsupported' !(grec-patterns-eligible:jibb arms.val.d view.u.view 128)]
134+ ['whole structural tail stays unsupported' !(grec-patterns-eligible:jibb arms.val.e view.u.view 128)]
135+ ['128 arms eligible' (grec-patterns-eligible:jibb many view.u.view 128)]
136+ ['129 arms declined' !(grec-patterns-eligible:jibb [sample-arm many] view.u.view 128)]
137+ ['zero arm budget declined' !(grec-patterns-eligible:jibb ~[sample-arm] view.u.view 0)]
138+ ['128-arm view consumes one step' ?:(?=(%& -.rexact) &(?=(%union -.typ.p.rexact) =(0 jrec-fuel.state.p.rexact)) |)]
139+ ['129-arm view rolls back' =(in-view rover)]
140+ ['hidden view stays nominally unknown' =(hidden-view rhidden-view)]
141+ ['catch-all keeps fuel and pending state' ?:(?=(%& -.fallback) &(=(0 jrec-fuel.state.p.fallback) =(holes.st holes.state.p.fallback) =(projections.st projections.state.p.fallback) (lien tags.state.p.fallback |=(entry=ipending:jibb =(entry tag)))) |)]
142+ ==
143+ =/ modules=jbundle:jibb ~[[/ui/tree/jibb tree] [/ui/tree-two/jibb tree] [/ui/tree-alias/jibb alias]]
144+ =/ small=jbundle:jibb ~[[/ui/tree/jibb tree-no-event]]
145+ =/ report=@t (golden-types-with-prepared-prelude:jibb /tests/tree/client/jibb client ~ ~ modules prep)
146+ =/ noreport=@t (golden-types-with-prepared-prelude:jibb /tests/tree/no-event/jibb no-event ~ ~ small prep)
147+ (cat 3 (of-wain:format (turn checks line)) (cat 3 '\0a' (cat 3 report (cat 3 '\0a' noreport))))
148+++ test-generic-pattern
149+ ^- tang
150+ ?~ tree ~[leaf+"tree source missing"]
151+ ?~ alias ~[leaf+"alias source missing"]
152+ ?~ tree-no-event ~[leaf+"tree without event missing"]
153+ ?~ client ~[leaf+"client source missing"]
154+ ?~ no-event ~[leaf+"no-event client missing"]
155+ ?~ values ~[leaf+"values source missing"]
156+ ?~ poly-values ~[leaf+"polymorphic values source missing"]
157+ ?~ owner ~[leaf+"owner source missing"]
158+ ?~ owner-bad ~[leaf+"invalid owner source missing"]
159+ ?~ expected ~[leaf+"expected output missing"]
160+ =/ actual=@t
161+ (pattern-output real-prelude real-internal (text tree) (text alias) (text tree-no-event) (text client) (text no-event) (text values) (text poly-values) (text owner) (text owner-bad))
162+ ?. =((to-wain:format (cat 3 actual '\0a')) expected)
163+ ~[leaf+"generic pattern output differs from expected"]
164+ ~
165+--
tests/lib/jibb-generic-recursion.hoonnew file+170
@@ -0,0 +1,170 @@
1+:: Source-backed recursive identities; this is not the runtime UI element model.
2+/+ jibb
3+/* real-prelude %jibb /lib/jibb/prelude/jibb
4+/* real-internal %jibb /lib/jibb/internal/jibb
5+/* tree %txt /tests/type-generic-recursion/tree/txt
6+/* changed %txt /tests/type-generic-recursion/tree-changed/txt
7+/* alias %txt /tests/type-generic-recursion/alias/txt
8+/* client %txt /tests/type-generic-recursion/client/txt
9+/* bad-mold %txt /tests/type-generic-recursion/bad-mold/txt
10+/* bad-constructor %txt /tests/type-generic-recursion/bad-constructor/txt
11+/* bad-parameter %txt /tests/type-generic-recursion/bad-parameter/txt
12+/* local-shadow %txt /tests/type-generic-recursion/local-shadow/txt
13+/* local-distinct %txt /tests/type-generic-recursion/local-distinct/txt
14+/* local-only %txt /tests/type-generic-recursion/local-only/txt
15+/* list-shadow %txt /tests/type-generic-recursion/list-shadow/txt
16+/* chain %txt /tests/type-generic-recursion/chain/txt
17+/* bad-match %txt /tests/type-generic-recursion/bad-match/txt
18+/* expected %txt /tests/type-generic-recursion/expected/txt
19+|%
20+++ text
21+ |= lines=wain
22+ ^- @t
23+ (rap 3 (turn lines |=(line=@t (cat 3 line '\0a'))))
24+++ altered-list-source
25+ |= pre=@t
26+ ^- (unit @t)
27+ =/ lines=wain (to-wain:format pre)
28+ =/ old=@t ' [i=A t=(list A)]'
29+ =/ matches=(list @t) (skim lines |=(line=@t =(line old)))
30+ ?. =(1 (lent matches)) ~
31+ =/ changed=wain (turn lines |=(line=@t ?:(=(line old) ' [i=@t t=(list A)]' line)))
32+ `(text changed)
33+++ result-line
34+ |= [label=@t ok=?]
35+ ^- @t
36+ (crip "{(trip label)}: {?:(ok "ok" "BAD")}")
37+++ generic-output
38+ |= [pre=@t internal=@t tree=@t changed=@t alias=@t client=@t invalid=(list [label=@t src=@t]) shadow=@t chain=@t]
39+ ^- @t
40+ =/ prep=(unit iprelude:jibb) (prepare-prelude-with-internal:jibb pre internal)
41+ ?~ prep 'BAD prelude preparation'
42+ =/ module=jfile-result:jibb
43+ (infer-jibb-file:jibb /ui/tree/jibb tree ~ ~ ~ ~[/ui/tree/jibb] values.u.prep molds.u.prep ~ `iface.u.prep)
44+ ?: ?=(%| -.module) (cat 3 'BAD recursive module: ' p.module)
45+ =/ scheme=(unit ischeme:jibb) (find-jibb-mold:jibb %node-tree iface.p.module)
46+ ?~ scheme 'BAD missing recursive mold'
47+ ?. ?=(%grec -.typ.u.scheme) 'BAD missing recursive identity'
48+ =/ typ=itype:jibb typ.u.scheme
49+ ?> ?=(%grec -.typ)
50+ =/ t=itype:jibb typ(args ~[[%atom %t]])
51+ ?> ?=(%grec -.t)
52+ =/ p=itype:jibb typ(args ~[[%atom %p]])
53+ =/ variable=itype:jibb typ(args ~[[%var 91]])
54+ =/ other=itype:jibb t(at /ui/other/jibb)
55+ =/ numeric=itype:jibb [%cell t [%nvar 99]]
56+ =/ chain-parsed=(each module:jibb error:jibb) (parse:jibb /ui/tree/jibb chain)
57+ ?: ?=(%| -.chain-parsed) 'BAD chain source parse'
58+ =/ chain-molds=imolds:jibb (collect-simple-molds:jibb defs.p.chain-parsed)
59+ =/ chain-shape=(unit shape:jibb) (find-simple-mold:jibb %chain chain-molds)
60+ ?~ chain-shape 'BAD chain source mold'
61+ =/ no-index=istate:jibb *istate:jibb
62+ =. no-index no-index(at /ui/tree/jibb, molds chain-molds, top-molds ~[%chain], prelude `iface.u.prep)
63+ =/ checks=(list [label=@t ok=?])
64+ :~ ['source module complete' ?=([%& *] module)]
65+ ['generic mold quantified' =(1 (lent vars.u.scheme))]
66+ ['distinct arguments decline' ?=(~ (itype-unify:jibb t p ~))]
67+ ['distinct origins decline' ?=(~ (itype-unify:jibb t other ~))]
68+ ['occurs check' ?=(~ (itype-unify:jibb [%var 91] variable ~))]
69+ ['cell construction stays opaque' =(%unknown -:(itype-fit:jibb [%cell [%atom %tas] [%atom %t]] t ~ 0))]
70+ ['noun construction stays opaque' =(%unknown -:(itype-fit:jibb [%noun ~] t ~ 0))]
71+ ['unindexed recursion declined' ?=(~ (simple-source-generic-recursive:jibb %chain u.chain-shape ~[[%atom %t]] no-index))]
72+ ['alteration rejects missing line' ?=(~ (altered-list-source 'absent'))]
73+ ['alteration rejects repeated line' ?=(~ (altered-list-source (text ~[' [i=A t=(list A)]' ' [i=A t=(list A)]'])))]
74+ ['gate freedom unknown' =(%unknown verdict:(gate-free-type:jibb t 64 ~))]
75+ ['gate defaulting conservative' &((itype-has-gate:jibb t) =(numeric (default-decimals:jibb numeric)))]
76+ ==
77+ =/ invalid-lines=(list @t)
78+ %+ turn invalid
79+ |= c=[label=@t src=@t]
80+ =/ parsed=(each module:jibb error:jibb) (parse:jibb /ui/tree/jibb src.c)
81+ =/ r=jfile-result:jibb
82+ (infer-jibb-file:jibb /ui/tree/jibb src.c ~ ~ ~ ~[/ui/tree/jibb] values.u.prep molds.u.prep ~ `iface.u.prep)
83+ (result-line label.c &(?=(%& -.parsed) ?=(%| -.r)))
84+ =/ shadow-result=jfile-result:jibb
85+ (infer-jibb-file:jibb /ui/tree/jibb shadow ~ ~ ~ ~[/ui/tree/jibb] values.u.prep ~ ~ `iface.u.prep)
86+ =/ altered-source=(unit @t) (altered-list-source pre)
87+ ?~ altered-source 'BAD canonical list source was missing or repeated'
88+ =/ altered=@t u.altered-source
89+ =/ altered-prep=(unit iprelude:jibb) (prepare-prelude-with-internal:jibb altered internal)
90+ =/ altered-result=jfile-result:jibb
91+ ?~ altered-prep [%| 'altered prelude unavailable']
92+ (infer-jibb-file:jibb /ui/tree/jibb tree ~ ~ ~ ~[/ui/tree/jibb] values.u.altered-prep molds.u.altered-prep ~ `iface.u.altered-prep)
93+ =/ parsed=(each module:jibb error:jibb) (parse:jibb /tests/tree/client/jibb client)
94+ ?: ?=(%| -.parsed) 'BAD client parse'
95+ =/ modules=jbundle:jibb ~[[/ui/tree/jibb tree] [/ui/tree-two/jibb tree] [/ui/tree-alias/jibb alias]]
96+ =/ first=jimports-result:jibb
97+ (resolve-jibb-imports:jibb imports.p.parsed ~ ~ modules ~[/tests/tree/client/jibb] values.u.prep molds.u.prep ~ `iface.u.prep)
98+ ?: ?=(%| -.first) 'BAD import resolution'
99+ =/ reuse=jimports-result:jibb
100+ (resolve-jibb-imports:jibb imports.p.parsed ~ ~ modules ~[/tests/tree/client/jibb] values.u.prep molds.u.prep cache.p.first `iface.u.prep)
101+ =/ changed-modules=jbundle:jibb ~[[/ui/tree/jibb changed] [/ui/tree-two/jibb tree] [/ui/tree-alias/jibb alias]]
102+ =/ stale=jimports-result:jibb
103+ (resolve-jibb-imports:jibb imports.p.parsed ~ ~ changed-modules ~[/tests/tree/client/jibb] values.u.prep molds.u.prep cache.p.first `iface.u.prep)
104+ =/ fresh=jimports-result:jibb
105+ (resolve-jibb-imports:jibb imports.p.parsed ~ ~ changed-modules ~[/tests/tree/client/jibb] values.u.prep molds.u.prep ~ `iface.u.prep)
106+ =/ duplicate-modules=jbundle:jibb [[/ui/tree/jibb tree] modules]
107+ =/ duplicate=jimports-result:jibb
108+ (resolve-jibb-imports:jibb imports.p.parsed ~ ~ duplicate-modules ~[/tests/tree/client/jibb] values.u.prep molds.u.prep cache.p.first `iface.u.prep)
109+ =/ cycle=jimports-result:jibb
110+ (resolve-jibb-imports:jibb imports.p.parsed ~ ~ modules ~[/ui/tree/jibb] values.u.prep molds.u.prep cache.p.first `iface.u.prep)
111+ =/ prelude-other=ifile:jibb iface.u.prep(source ~)
112+ =/ mismatch=jimports-result:jibb
113+ (resolve-jibb-imports:jibb imports.p.parsed ~ ~ modules ~[/tests/tree/client/jibb] values.u.prep molds.u.prep cache.p.first `prelude-other)
114+ =/ old=(unit ifile:jibb) (find-jibb-interface:jibb %first resolved.p.first)
115+ =/ new=(unit ifile:jibb) ?:(?=(%& -.fresh) (find-jibb-interface:jibb %first resolved.p.fresh) ~)
116+ =/ shape-changed=?
117+ ?~ old |
118+ ?~ new |
119+ =/ a=(unit ischeme:jibb) (find-jibb-mold:jibb %node-tree u.old)
120+ =/ b=(unit ischeme:jibb) (find-jibb-mold:jibb %node-tree u.new)
121+ ?~ a |
122+ ?~ b |
123+ ?. &(?=(%grec -.typ.u.a) ?=(%grec -.typ.u.b)) |
124+ !=(proof.typ.u.a proof.typ.u.b)
125+ =/ reuse-ok=? ?:(?=(%| -.reuse) | =(resolved.p.first resolved.p.reuse))
126+ =/ shadow-parsed=(each module:jibb error:jibb) (parse:jibb /ui/tree/jibb shadow)
127+ =/ altered-parsed=(each module:jibb error:jibb) (parse:jibb /lib/jibb/prelude/jibb altered)
128+ =/ more=(list [label=@t ok=?])
129+ :~ ['unreserved local list shadow declined' &(?=(%& -.shadow-parsed) ?=(%| -.shadow-result))]
130+ ['altered prelude list declined' &(?=(%& -.altered-parsed) ?=(%| -.altered-result))]
131+ ['cached source reuse' reuse-ok]
132+ ['changed source invalidates cache' ?=(%| -.stale)]
133+ ['changed source fresh proof' &(?=(%& -.fresh) shape-changed)]
134+ ['duplicate source declined' ?=(%| -.duplicate)]
135+ ['active import cycle declined' ?=(%| -.cycle)]
136+ ['changed prelude invalidates cache' ?=(%| -.mismatch)]
137+ ==
138+ =/ lines=(list @t) (weld (turn checks result-line) (weld invalid-lines (turn more result-line)))
139+ =/ report=@t (golden-types-with-prepared-prelude:jibb /tests/tree/client/jibb client ~ ~ modules prep)
140+ (cat 3 (of-wain:format lines) (cat 3 '\0a' report))
141+++ test-generic-recursion
142+ ^- tang
143+ ?~ tree ~[leaf+"recursive source is missing"]
144+ ?~ changed ~[leaf+"changed recursive source is missing"]
145+ ?~ alias ~[leaf+"recursive alias is missing"]
146+ ?~ client ~[leaf+"recursive client is missing"]
147+ ?~ bad-mold ~[leaf+"invalid mold fixture is missing"]
148+ ?~ bad-constructor ~[leaf+"constructor fixture is missing"]
149+ ?~ bad-match ~[leaf+"match fixture is missing"]
150+ ?~ bad-parameter ~[leaf+"parameter fixture is missing"]
151+ ?~ local-shadow ~[leaf+"local shadow fixture is missing"]
152+ ?~ local-distinct ~[leaf+"distinct local shadow fixture is missing"]
153+ ?~ local-only ~[leaf+"local recursion fixture is missing"]
154+ ?~ list-shadow ~[leaf+"list shadow fixture is missing"]
155+ ?~ chain ~[leaf+"unindexed chain fixture is missing"]
156+ ?~ expected ~[leaf+"recursive expected output is missing"]
157+ =/ invalid=(list [label=@t src=@t])
158+ :~ ['unused mold hole declined' (text bad-mold)]
159+ ['invalid constructor declined' (text bad-constructor)]
160+ ['invalid matching declined' (text bad-match)]
161+ ['nonuniform recursion declined' (text bad-parameter)]
162+ ['identical local shadow declined' (text local-shadow)]
163+ ['different local shadow declined' (text local-distinct)]
164+ ['local recursion declined' (text local-only)]
165+ ==
166+ =/ actual=@t (generic-output real-prelude real-internal (text tree) (text changed) (text alias) (text client) invalid (text list-shadow) (text chain))
167+ ?. =((to-wain:format (cat 3 actual '\0a')) expected)
168+ ~[leaf+"generic recursion output differs from expected"]
169+ ~
170+--
tests/lib/jibb-import-overlap.hoonnew file+80
@@ -0,0 +1,80 @@
1+/+ jibb, jibb-import
2+/* sur %txt /tests/type-import-overlap/sur/txt
3+/* source %txt /tests/type-import-overlap/source/txt
4+/* expected %txt /tests/type-import-overlap/expected/txt
5+|%
6+++ text
7+ |= lines=wain
8+ ^- @t
9+ (rap 3 (turn lines |=(line=@t (cat 3 line '\0a'))))
10+++ test-import-overlap
11+ ^- tang
12+ ?~ sur ~[leaf+"overlap fixture source is missing"]
13+ ?~ source ~[leaf+"overlap fixture client is missing"]
14+ ?~ expected ~[leaf+"overlap fixture expected output is missing"]
15+ =/ got (overlap-output (text sur) (text source))
16+ ?. =((to-wain:format (cat 3 got '\0a')) expected)
17+ ~[leaf+"overlap output differs from expected"]
18+ ~
19+++ bounded-screen-status
20+^- @t
21+?. ?=(~ (bounded-no-spec-unions:jibb-import [1 2] 2)) 'three-node noun exceeded limit'
22+=/ exact (bounded-no-spec-unions:jibb-import [1 2] 3)
23+?. =(exact `0) 'three-node exact budget failed'
24+?. ?=(~ (bounded-no-spec-unions:jibb-import [[[[1 2] 3] 4] 5] 8)) 'deep noun exceeded limit'
25+?. =((bounded-no-spec-unions:jibb-import [[[[1 2] 3] 4] 5] 9) `0) 'deep exact budget failed'
26+?. ?=(~ (bounded-no-spec-unions:jibb-import [1 2 3 4 5] 8)) 'wide noun exceeded limit'
27+?. =((bounded-no-spec-unions:jibb-import [1 2 3 4 5] 9) `0) 'wide exact budget failed'
28+?. ?=(~ (bounded-no-spec-unions:jibb-import [%bcwt [[1 2] [[3 4] 0]]] 100)) 'nested $? accepted'
29+?. ?=(~ (bounded-no-spec-unions:jibb-import [%bccn [[1 2] [[3 4] 0]]] 100)) 'nested $% accepted'
30+?. ?=(~ (bounded-no-spec-unions:jibb-import [%bckt [1 2] [3 4]] 100)) 'nested $^ accepted'
31+=/ very-deep=*
32+ =/ n=@ud 1.000
33+ =/ node=* 0
34+ |-
35+ ?: =(n 0) node
36+ $(n (dec n), node [node n])
37+?. =((bounded-no-spec-unions:jibb-import very-deep 2.001) `0) 'deep 2,001-node exact budget failed'
38+?. ?=(~ (bounded-no-spec-unions:jibb-import very-deep 2.000)) 'deep 2,001-node limit exceeded'
39+=/ xs=(list spec)
40+ (turn (gulf 1 128) |=(n=@ud `spec`[%bccl ~[[%leaf %tas n] [%base [%atom %t]]]]))
41+?~ xs 'generated source cases missing'
42+=/ first=(unit @ud) (bounded-no-spec-unions:jibb-import i.xs 1.000)
43+?~ first 'simple source case unavailable'
44+=/ total=@ud (mul 128 (sub 1.000 u.first))
45+=/ at=(unit (list tagged-case:jibb-import)) (tagged-bounded-cases:jibb-import xs ~ total 128)
46+?~ at '128 exact cases rejected'
47+?. =((lent u.at) 128) 'a source case was omitted'
48+?. ?=(~ (tagged-bounded-cases:jibb-import xs ~ (dec total) 128)) 'source node limit exceeded'
49+=/ over=(list spec) (weld xs ~[`spec`[%bccl ~[[%leaf %tas 129] [%base [%atom %t]]]]])
50+?. ?=(~ (tagged-bounded-cases:jibb-import over ~ 100.000 128)) '129 cases exceeded limit'
51+=/ nested=spec [%bccl ~[[%leaf %tas %x] [%bcwt ~[[%leaf %tas %a] [%leaf %tas %b]]]]]
52+?. ?=(~ (tagged-bounded-cases:jibb-import ~[nested] ~ 1.000 128)) 'nested union case accepted'
53+=/ unknown=spec [%base [%atom %t]]
54+?. ?=(~ (tagged-bounded-cases:jibb-import ~[unknown] ~ 1.000 128)) 'non-tagged source accepted'
55+'bounded source screen controls passed'
56+
57+++ overlap-output
58+ |= [sur-text=@t src=@t]
59+ ^- @t
60+ =/ cor=type -:(ride -:!>(..zuse) sur-text)
61+ =/ names=(list term)
62+ ~[%mixed-zero %nonzero %unequal-singletons %swapped %separate-tags %separate-terms %different-value %different-tail %unknown-middle %unsupported-gate %dollar-percent %identical %cross-zero %boolean-tail %empty-tail]
63+ =/ cases=wall
64+ %+ turn names
65+ |= n=term
66+ "{(trip n)}: {(show-import-diagnostic:jibb-import (read-named-diagnostic:jibb-import %fixture n cor))}"
67+ =/ other=type (~(play ut cor) (ream '*separate-tags'))
68+ =/ provenance=wall
69+ :~ "mismatched-selected: {(show-result:jibb-import (read-mold-in:jibb-import %fixture %mixed-zero other cor))}"
70+ "missing: {(show-result:jibb-import (read-named:jibb-import %fixture %missing cor))}"
71+ "bare-zuse: {(show-result:jibb-import (read-named:jibb-import %fixture %mixed-zero -:!>(..zuse)))}"
72+ ==
73+ =/ external=(list [module=term name=term result=*])
74+ :~ [%fixture %mixed-zero (read-named-diagnostic:jibb-import %fixture %mixed-zero cor)]
75+ [%fixture %separate-tags (read-named-diagnostic:jibb-import %fixture %separate-tags cor)]
76+ [%fixture %unknown-middle (read-named-diagnostic:jibb-import %fixture %unknown-middle cor)]
77+ ==
78+ =/ report=@t (golden-types-with-reader-diagnostics:jibb /ui/test/jibb src external ~)
79+ (cat 3 (of-wain:format (turn (weld cases (weld ~[(trip bounded-screen-status)] provenance)) |=(line=tape (crip line)))) (cat 3 '\0a' report))
80+--
tests/lib/jibb-import-structural.hoonnew file+82
@@ -0,0 +1,82 @@
1+/+ jibb, jibb-import
2+/* sur %txt /tests/type-import-structural/sur/txt
3+/* source %txt /tests/type-import-structural/source/txt
4+/* expected %txt /tests/type-import-structural/expected/txt
5+|%
6+++ text
7+ |= lines=wain
8+ ^- @t
9+ (rap 3 (turn lines |=(line=@t (cat 3 line '\0a'))))
10+++ test-import-structural
11+ ^- tang
12+ ?~ sur ~[leaf+"structural overlap /sur is missing"]
13+ ?~ source ~[leaf+"structural overlap client is missing"]
14+ ?~ expected ~[leaf+"structural overlap expected is missing"]
15+ =/ got (structural-output (text sur) (text source))
16+ ?. =((to-wain:format (cat 3 got '\0a')) expected)
17+ ~[leaf+"structural overlap output differs from expected"]
18+ ~
19+++ structural-output
20+ |= [sur-text=@t src=@t]
21+ ^- @t
22+ =/ cor=type -:(ride -:!>(..zuse) sur-text)
23+ =/ names=(list term)
24+ ~[%same-alias %separate-alias %deep-match %deep-distinct %tail-distinct %later-overlap %many-safe %open-atoms %different-aura]
25+ =/ cases=wall
26+ %+ turn names
27+ |= n=term
28+ "{(trip n)}: {(show-import-diagnostic:jibb-import (read-named-diagnostic:jibb-import %fixture n cor))}"
29+ =/ ext=(list [module=term name=term result=*])
30+ :~ [%fixture %deep-match (read-named-diagnostic:jibb-import %fixture %deep-match cor)]
31+ [%fixture %separate-alias (read-named-diagnostic:jibb-import %fixture %separate-alias cor)]
32+ [%fixture %different-aura (read-named-diagnostic:jibb-import %fixture %different-aura cor)]
33+ [%fixture %later-overlap (read-named-diagnostic:jibb-import %fixture %later-overlap cor)]
34+ ==
35+ =/ report=@t (golden-types-with-reader-diagnostics:jibb /ui/structural/jibb src ext ~)
36+ =/ zero=imported:jibb-import [%atom %tas `0]
37+ =/ one=imported:jibb-import [%atom %tas `1]
38+ =/ two=imported:jibb-import [%atom %tas `2]
39+ =/ txt=imported:jibb-import [%atom %t ~]
40+ =/ ship=imported:jibb-import [%atom %p ~]
41+ =/ flag=imported:jibb-import [%atom %f ~]
42+ =/ opaque=imported:jibb-import [%ref %m %x]
43+ =/ named=imported:jibb-import [%named %m %x zero]
44+ =/ arm (local-arm-source:jibb-import cor %later-overlap)
45+ ?~ arm !!
46+ =/ shape (local-mold-spec:jibb-import u.arm %later-overlap)
47+ ?~ shape !!
48+ =/ body (tagged-default-union:jibb-import u.shape 4)
49+ ?~ body !!
50+ ?> ?=([%bcwt *] u.body)
51+ =/ specs=(list spec) p.u.body
52+ ?~ specs !!
53+ =/ checks=(list [label=@t ok=?])
54+ :~ ['same literal' ?=([~ [%.y *]] (overlap-pair:jibb-import zero zero 20))]
55+ ['different literals' ?=([~ [%.n *]] (overlap-pair:jibb-import one two 20))]
56+ ['named expands' ?=([~ [%.y *]] (overlap-pair:jibb-import named zero 20))]
57+ ['opaque declines' ?=([~ [%.n *]] (overlap-pair:jibb-import opaque opaque 20))]
58+ ['opaque versus noun' ?=([~ [%.n *]] (overlap-pair:jibb-import opaque [%noun ~] 20))]
59+ ['unknown aura' ?=([~ [%.n *]] (overlap-pair:jibb-import ship txt 20))]
60+ ['open admits zero' ?=([~ [%.y *]] (overlap-pair:jibb-import flag zero 20))]
61+ ['different tail' ?=([~ [%.n *]] (overlap-pair:jibb-import [%cell zero one] [%cell zero two] 20))]
62+ ['nested face' ?=([~ [%.y *]] (overlap-pair:jibb-import [%face %a [%cell named one]] [%face %b [%cell zero one]] 20))]
63+ ['fork later case' ?=([~ [%.y *]] (overlap-pair:jibb-import [%fork ~[one zero]] zero 20))]
64+ ['empty fuel' ?=(~ (overlap-pair:jibb-import zero zero 0))]
65+ ['cell needs both' ?=(~ (overlap-pair:jibb-import [%cell zero one] [%cell zero one] 2))]
66+ ['later pair' ?=([~ [%.y *]] (overlap-case-pairs:jibb-import ~[one two zero zero] 100))]
67+ ['pair fuel' ?=(~ (overlap-case-pairs:jibb-import ~[one two zero zero] 2))]
68+ ['void' ?=([~ [%.n *]] (overlap-pair:jibb-import [%void ~] [%noun ~] 20))]
69+ ['void position' ?=([~ [%.n *]] (overlap-pair:jibb-import [%cell zero [%void ~]] [%cell zero [%noun ~]] 20))]
70+ ['opaque apply' ?=([~ [%.n *]] (overlap-pair:jibb-import [%apply %list ~[txt]] [%noun ~] 20))]
71+ ['source node fuel' ?=(~ (overlap-source-cases:jibb-import specs 1 128))]
72+ ['source case cap' ?=(~ (overlap-source-cases:jibb-import specs 4.096 3))]
73+ ['wrong projected head' !(overlap-projections-match:jibb-import ~[[%a i.specs]] ~[[%cell [%atom %tas `%b] txt]])]
74+ ['wrong case count' !(overlap-projections-match:jibb-import ~[[%a i.specs]] ~)]
75+ ==
76+ =/ results=wall
77+ %+ turn checks
78+ |= c=[label=@t ok=?]
79+ "{(trip label.c)}: {?:(ok.c "ok" "BAD")}"
80+ =/ lines=(list @t) (turn (weld cases results) |=(line=tape (crip line)))
81+ (cat 3 (of-wain:format lines) (cat 3 '\0a' report))
82+--
tests/lib/jibb-list-alias-guards.hoon+1−1
@@ -4,7 +4,7 @@
4|%
4|%
5++ list-alias-output
5++ list-alias-output
6 ^- @t
6 ^- @t
7− =/ src=@t (crip "++ text |= x=(alias @t) x\0a++ ship |= x=(alias @p) x\0a++ wrong ^- (alias @t) ~[~zod]\0a++ shadow |= x=(list @t)\0a +$ list @t\0a x\0a")
7+ =/ src=@t (crip "++ text-value |= x=(alias @t) x\0a++ ship |= x=(alias @p) x\0a++ wrong ^- (alias @t) ~[~zod]\0a++ shadow |= x=(list @t)\0a +$ list @t\0a x\0a")
8 =/ canonical=@t (crip "+$ list |$ [A]\0a ~\0a [i=A t=(list A)]\0a+$ bag |$ [A] (list A)\0a+$ alias |$ [A] (bag A)\0a")
8 =/ canonical=@t (crip "+$ list |$ [A]\0a ~\0a [i=A t=(list A)]\0a+$ bag |$ [A] (list A)\0a+$ alias |$ [A] (bag A)\0a")
9 =/ altered=@t (crip "+$ list |$ [A] [A A]\0a+$ bag |$ [A] (list A)\0a+$ alias |$ [A] (bag A)\0a")
9 =/ altered=@t (crip "+$ list |$ [A] [A A]\0a+$ bag |$ [A] (list A)\0a+$ alias |$ [A] (bag A)\0a")
10 =/ omitted=@t (crip "+$ bag |$ [A] (list A)\0a+$ alias |$ [A] (bag A)\0a")
10 =/ omitted=@t (crip "+$ bag |$ [A] (list A)\0a+$ alias |$ [A] (bag A)\0a")
tests/lib/jibb-page-main.hoonnew file+168
@@ -0,0 +1,168 @@
1+:: Static and direct data-page kind checks, without rendering or execution.
2+/+ jibb, jibb-import
3+/* prelude %jibb /lib/jibb/prelude/jibb
4+/* internal %jibb /lib/jibb/internal/jibb
5+/* sur %txt /tests/type-api-paths/todo-sur/txt
6+/* action %txt /tests/type-api-paths/todo-action/txt
7+/* todos %txt /tests/type-api-paths/todos/txt
8+/* update %txt /tests/type-api-paths/todo-update/txt
9+/* item %txt /tests/type-api-paths/todo-item/txt
10+/* todo-api %txt /tests/type-page-main/todo-api/txt
11+/* todo-island %txt /tests/type-page-main/todo-island/txt
12+/* blog-sur %txt /tests/type-page-main/blog-sur/txt
13+/* posts %txt /tests/type-page-main/posts-mark/txt
14+/* blog-api %txt /tests/type-page-main/blog-api/txt
15+/* card %txt /tests/type-page-main/card/txt
16+/* about %txt /tests/type-page-main/static/txt
17+/* blog-index %txt /tests/type-page-main/blog-index/txt
18+/* index %txt /tests/type-page-main/index/txt
19+/* ctor-page %txt /tests/type-page-main/ctor-page/txt
20+/* wrong-static %txt /tests/type-page-main/wrong-static/txt
21+/* arbitrary-main %txt /tests/type-page-main/arbitrary-main/txt
22+/* page-alias %txt /tests/type-page-main/page-alias/txt
23+/* indirect-load %txt /tests/type-page-main/indirect-load/txt
24+/* pure-load %txt /tests/type-page-main/pure-load/txt
25+/* hand-built-load %txt /tests/type-page-main/hand-built-load/txt
26+/* typed-load %txt /tests/type-page-main/typed-load/txt
27+/* diff-load %txt /tests/type-page-main/diff-load/txt
28+|%
29+++ text
30+ |= lines=wain
31+ ^- @t
32+ (rap 3 (turn lines |=(line=@t (cat 3 line '\0a'))))
33+::
34+++ page-main-detailed
35+ |= [at=path src=@t externals=iexternals:jibb marks=imark-externals:jibb modules=jbundle:jibb prepared=iprelude:jibb]
36+ ^- jfile-detailed-result:jibb
37+ (infer-jibb-file-detailed:jibb at src externals marks modules ~[at] values.prepared molds.prepared ~ `iface.prepared)
38+::
39+++ page-main-reader-inputs
40+ |= [sur=@t action=@t todos=@t update=@t item=@t blog-sur=@t posts=@t]
41+ ^- [marks=imark-externals:jibb externals=iexternals:jibb]
42+ =/ todo=type -:(ride -:!>(..zuse) sur)
43+ =/ todo-subject=type [%cell [%face %todo todo] -:!>(..zuse)]
44+ =/ ma=* (read-mark:jibb-import %todo-action -:(ride todo-subject action))
45+ =/ mt=* (read-mark:jibb-import %todos -:(ride todo-subject todos))
46+ =/ mu=* (read-mark:jibb-import %todo-update -:(ride todo-subject update))
47+ =/ mi=* (read-mark:jibb-import %todo-item -:(ride todo-subject item))
48+ =/ blog=type -:(ride -:!>(..zuse) blog-sur)
49+ =/ blog-subject=type [%cell [%face %blog blog] -:!>(..zuse)]
50+ =/ mp=* (read-mark:jibb-import %posts -:(ride blog-subject posts))
51+ =/ item-input=* (read-named:jibb-import %todo %item todo)
52+ =/ post-input=* (read-named:jibb-import %blog %post blog)
53+ :_ ~[[%todo %item item-input] [%blog %post post-input]]
54+ ~[[%todo-action ma] [%todos mt] [%todo-update mu] [%todo-item mi] [%posts mp]]
55+::
56+++ page-main-positive
57+ |= [label=tape at=path src=@t expected=@t consumer-at=path consumer=@t face=term externals=iexternals:jibb marks=imark-externals:jibb modules=jbundle:jibb prepared=iprelude:jibb]
58+ ^- (list tape)
59+ =/ detailed=jfile-detailed-result:jibb
60+ (page-main-detailed at src externals marks modules prepared)
61+ ?: ?=(%| -.detailed)
62+ ~[(weld label (weld ": rejected: " (trip message.p.detailed)))]
63+ =/ checked=ifile:jibb iface.p.detailed
64+ ?~ graph.checked ~[(weld label ": request graph is missing")]
65+ =/ main=(unit ischeme:jibb) (ienv-lookup:jibb %main values.checked)
66+ ?~ main ~[(weld label ": main is missing")]
67+ ?. &(?=(~ vars.u.main) ?=(~ (itype-vars:jibb typ.u.main)))
68+ ~[(weld label ": main is not closed")]
69+ =/ actual=@t (crip (show-itype:jibb typ.u.main ~))
70+ ?. =(actual expected)
71+ ~[(weld label (weld ": main type was " (trip actual)))]
72+ =/ imported=jfile-detailed-result:jibb
73+ (page-main-detailed consumer-at consumer externals marks modules prepared)
74+ ?: ?=(%| -.imported)
75+ ~[(weld label (weld ": downstream import rejected: " (trip message.p.imported)))]
76+ =/ use=(unit ischeme:jibb) (ienv-lookup:jibb %imported values.iface.p.imported)
77+ ?~ use ~[(weld label ": downstream main is missing")]
78+ =/ expected-import=itype:jibb
79+ (itype-in-import:jibb typ.u.main checked face `iface.prepared)
80+ ?. &(?=(~ vars.u.use) =(typ.u.use expected-import))
81+ ~[(weld label ": downstream main type differs")]
82+ ~
83+::
84+++ page-main-negative
85+ |= [label=@t at=path src=@t externals=iexternals:jibb marks=imark-externals:jibb modules=jbundle:jibb prepared=iprelude:jibb]
86+ ^- (list tape)
87+ =/ bad=jfile-detailed-result:jibb
88+ (page-main-detailed at src externals marks modules prepared)
89+ ?: ?=(%& -.bad) ~[(weld (trip label) ": accepted")]
90+ ~
91+::
92+++ page-main-errors
93+ |= [public=@t private=@t sur=@t action=@t todos=@t update=@t item=@t todo-api=@t todo-island=@t blog-sur=@t posts=@t blog-api=@t card=@t about=@t blog-index=@t index=@t ctor-page=@t negatives=(list [label=@t src=@t])]
94+ ^- (list tape)
95+ =/ prepared=(unit iprelude:jibb)
96+ (prepare-prelude-with-internal:jibb public private)
97+ ?~ prepared ~["page prelude did not prepare"]
98+ =/ inputs=[marks=imark-externals:jibb externals=iexternals:jibb]
99+ (page-main-reader-inputs sur action todos update item blog-sur posts)
100+ =/ modules=jbundle:jibb
101+ :~ [/ui/api/todo/jibb todo-api]
102+ [/ui/todo-list/jibb todo-island]
103+ [/ui/api/blog/jibb blog-api]
104+ [/ui/components/card/jibb card]
105+ [/ui/about/jibb about]
106+ [/ui/blog/index/jibb blog-index]
107+ [/ui/index/jibb index]
108+ [/tests/page-main/ctor/jibb ctor-page]
109+ ==
110+ =/ about-consumer=@t '/= about-page /ui/about\0a++ imported main.about-page\0a'
111+ =/ blog-consumer=@t '/= blog-page /ui/blog/index\0a++ imported main.blog-page\0a'
112+ =/ index-consumer=@t '/= index-page /ui/index\0a++ imported main.index-page\0a'
113+ =/ ctor-consumer=@t '/= ctor-page /tests/page-main/ctor\0a++ imported main.ctor-page\0a'
114+ =/ positives=(list (list tape))
115+ :~ (page-main-positive "about" /ui/about/jibb about '(element !!)' /tests/page-main/about-consumer/jibb about-consumer %about-page externals.inputs marks.inputs modules u.prepared)
116+ (page-main-positive "blog index" /ui/blog/index/jibb blog-index '[load=$-(~ (ask (list [title=@t slug=@ta]))) view=$-((list [title=@t slug=@ta]) (element !!))]' /tests/page-main/blog-consumer/jibb blog-consumer %blog-page externals.inputs marks.inputs modules u.prepared)
117+ (page-main-positive "index" /ui/index/jibb index '[load=$-(~ (ask (list [id=@ud [done=? text=@t]]))) view=$-((list [id=@ud [done=? text=@t]]) (element !!))]' /tests/page-main/index-consumer/jibb index-consumer %index-page externals.inputs marks.inputs modules u.prepared)
118+ (page-main-positive "constructor reply" /tests/page-main/ctor/jibb ctor-page '[load=$-(~ (ask [%got todos=(list [id=@ud [done=? text=@t]])])) view=$-([%got todos=(list [id=@ud [done=? text=@t]])] (element !!))]' /tests/page-main/ctor-consumer/jibb ctor-consumer %ctor-page externals.inputs marks.inputs modules u.prepared)
119+ ==
120+ =/ failures=(list tape) (zing positives)
121+ ?^ failures failures
122+ =/ at=path /ui/index/jibb
123+ =/ checked-result=jfile-detailed-result:jibb
124+ (page-main-detailed at index externals.inputs marks.inputs modules u.prepared)
125+ ?: ?=(%| -.checked-result) ~["index disappeared before evidence controls"]
126+ =/ checked=ifile:jibb iface.p.checked-result
127+ ?~ graph.checked ~["index graph disappeared before evidence controls"]
128+ =/ parsed (parse:jibb at index)
129+ ?: ?=(%| -.parsed) ~["index source no longer parses"]
130+ =/ main=(unit def:jibb) (program-main-def:jibb defs.p.parsed)
131+ ?~ main ~["index main definition is missing"]
132+ =/ parts=(unit [load=term view=term]) (page-main-parts:jibb u.main)
133+ ?~ parts ~["index page parts are missing"]
134+ =/ others=(list irequest-evidence:jibb)
135+ (skim requests.u.graph.checked |=(r=irequest-evidence:jibb !&(=(api-at.r /ui/api/todo/jibb) =(%todos name.r))))
136+ =/ missing=irequest-graph:jibb u.graph.checked(requests others)
137+ =/ resolved=ijimports:jibb
138+ =/ found=(unit ifile:jibb)
139+ =/ api=jfile-detailed-result:jibb
140+ (page-main-detailed /ui/api/todo/jibb todo-api externals.inputs marks.inputs modules u.prepared)
141+ ?: ?=(%| -.api) ~
142+ `iface.p.api
143+ ?~ found ~
144+ ~[[%todo u.found]]
145+ ?. ?=([* ~] resolved) ~["todo API evidence control did not check"]
146+ ?: (page-main-closed:jibb u.parts defs.p.parsed values.checked `iface.u.prepared resolved missing)
147+ ~["unknown request evidence passed data-page checking"]
148+ =/ store=(list tape)
149+ (page-main-negative 'store path' /ui/stores/about/jibb about externals.inputs marks.inputs modules u.prepared)
150+ ?^ store store
151+ (zing (turn negatives |=(c=[label=@t src=@t] (page-main-negative label.c /ui/index/jibb src.c externals.inputs marks.inputs modules u.prepared))))
152+::
153+++ test-page-main
154+ ^- tang
155+ =/ negatives=(list [label=@t src=@t])
156+ :~ ['wrong static message' (text wrong-static)]
157+ ['arbitrary main' (text arbitrary-main)]
158+ ['page alias' (text page-alias)]
159+ ['indirect load' (text indirect-load)]
160+ ['pure load' (text pure-load)]
161+ ['hand-built load' (text hand-built-load)]
162+ ['typed load' (text typed-load)]
163+ ['diff load' (text diff-load)]
164+ ==
165+ =/ failures=(list tape)
166+ (page-main-errors prelude internal (text sur) (text action) (text todos) (text update) (text item) (text todo-api) (text todo-island) (text blog-sur) (text posts) (text blog-api) (text card) (text about) (text blog-index) (text index) (text ctor-page) negatives)
167+ (turn failures |=(reason=tape leaf+reason))
168+--
tests/lib/jibb-program-init.hoonnew file+134
@@ -0,0 +1,134 @@
1+:: Transactional direct-program initializer context, without UI execution.
2+/+ jibb
3+/* prelude %jibb /lib/jibb/prelude/jibb
4+/* internal %jibb /lib/jibb/internal/jibb
5+/* initializer %txt /tests/type-program-main/initializer/txt
6+/* initializer-consumer %txt /tests/type-program-main/initializer-consumer/txt
7+/* initializer-unfaced %txt /tests/type-program-main/initializer-unfaced/txt
8+/* initializer-error %txt /tests/type-program-main/initializer-error/txt
9+/* initializer-earlier %txt /tests/type-program-main/initializer-earlier/txt
10+/* initializer-model %txt /tests/type-program-main/initializer-model/txt
11+/* initializer-message %txt /tests/type-program-main/initializer-message/txt
12+/* initializer-generic %txt /tests/type-program-main/initializer-generic/txt
13+/* initializer-missing %txt /tests/type-program-main/initializer-missing/txt
14+/* initializer-tag %txt /tests/type-program-main/initializer-tag/txt
15+/* initializer-no-main %txt /tests/type-program-main/initializer-no-main/txt
16+/* initializer-subs %txt /tests/type-program-main/initializer-subs/txt
17+|%
18+++ text
19+ |= lines=wain
20+ ^- @t
21+ (rap 3 (turn lines |=(line=@t (cat 3 line '\0a'))))
22+::
23+++ program-init-prepared
24+ |= [public=@t private=@t]
25+ ^- (unit iprelude:jibb)
26+ (prepare-prelude-with-internal:jibb public private)
27+::
28+++ program-init-detailed
29+ |= [at=path src=@t modules=jbundle:jibb prepared=iprelude:jibb]
30+ ^- jfile-detailed-result:jibb
31+ (infer-jibb-file-detailed:jibb at src ~ ~ modules ~[at] values.prepared molds.prepared ~ `iface.prepared)
32+::
33+++ program-init-legacy
34+ |= [at=path src=@t modules=jbundle:jibb prepared=iprelude:jibb]
35+ ^- jfile-result:jibb
36+ (infer-jibb-file:jibb at src ~ ~ modules ~[at] values.prepared molds.prepared ~ `iface.prepared)
37+::
38+++ program-init-positive
39+ |= [at=path src=@t downstream=(unit @t) prepared=iprelude:jibb]
40+ ^- (list tape)
41+ =/ detailed=jfile-detailed-result:jibb (program-init-detailed at src ~ prepared)
42+ ?: ?=(%| -.detailed) ~["contextual direct program init was rejected"]
43+ =/ checked=ifile:jibb iface.p.detailed
44+ =/ legacy=jfile-result:jibb (program-init-legacy at src ~ prepared)
45+ ?: ?=(%| -.legacy) ~["legacy adapter rejected contextual init"]
46+ ?. =(values.checked values.iface.p.legacy) ~["contextual structured and legacy values differ"]
47+ =/ init=(unit ischeme:jibb) (ienv-lookup:jibb %init values.checked)
48+ =/ main=(unit ischeme:jibb) (ienv-lookup:jibb %main values.checked)
49+ ?~ init ~["contextual init interface is missing"]
50+ ?~ main ~["contextual main interface is missing"]
51+ ?. ?=(~ vars.u.init) ~["contextual init interface is not closed"]
52+ =/ expected=tape "$-((list @t) [xs=(list @t) [draft=@t error=(unit @t)]])"
53+ ?. =((show-itype:jibb typ.u.init ~) expected) ~["contextual init interface type differs"]
54+ ?. ?=(~ vars.u.main) ~["contextual main interface is not closed"]
55+ =/ fields=(list itype:jibb) (record-fields-named:jibb %init typ.u.main ~)
56+ ?. =(fields ~[typ.u.init]) ~["contextual main initializer field differs"]
57+ ?~ source.checked ~["contextual program source evidence is missing"]
58+ ?. =(u.source.checked src) ~["contextual program source evidence differs"]
59+ ?~ graph.checked ~["contextual program request graph is missing"]
60+ ?~ downstream ~
61+ =/ consumer-at=path /tests/program-main/initializer-consumer/jibb
62+ =/ imported=jfile-detailed-result:jibb
63+ (program-init-detailed consumer-at u.downstream ~[[at src]] prepared)
64+ ?: ?=(%| -.imported) ~[(weld "downstream contextual initializer import was rejected: " (trip message.p.imported))]
65+ =/ use=(unit ischeme:jibb) (ienv-lookup:jibb %imported values.iface.p.imported)
66+ ?~ use ~["downstream contextual initializer is missing"]
67+ ?. =((show-itype:jibb typ.u.use ~) expected) ~["downstream contextual initializer type differs"]
68+ ?. =(u.use u.init) ~["downstream contextual initializer scheme differs"]
69+ ~
70+::
71+++ program-init-negative
72+ |= [label=@t at=path src=@t boundary=@t prepared=iprelude:jibb]
73+ ^- (list tape)
74+ =/ detailed=jfile-detailed-result:jibb (program-init-detailed at src ~ prepared)
75+ ?: ?=(%& -.detailed) ~[(weld (trip label) ": structured check accepted")]
76+ ?. ?=(~ overlap.p.detailed) ~[(weld (trip label) ": unexpected overlap evidence")]
77+ ?. =(message.p.detailed boundary) ~[(weld (trip label) ": rejected at the wrong boundary")]
78+ =/ legacy=jfile-result:jibb (program-init-legacy at src ~ prepared)
79+ ?: ?=(%& -.legacy) ~[(weld (trip label) ": legacy check accepted")]
80+ ?. =(p.legacy boundary) ~[(weld (trip label) ": legacy boundary differs")]
81+ ~
82+::
83+++ program-init-negative-cases
84+ |= [cases=(list [label=@t at=path src=@t boundary=@t]) prepared=iprelude:jibb]
85+ ^- (list tape)
86+ ?~ cases ~
87+ %+ weld
88+ (program-init-negative label.i.cases at.i.cases src.i.cases boundary.i.cases prepared)
89+ $(cases t.cases)
90+::
91+++ program-init-errors
92+ |= [public=@t private=@t island=@t downstream=@t unfaced=@t negatives=(list @t)]
93+ ^- (list tape)
94+ =/ prepared=(unit iprelude:jibb) (program-init-prepared public private)
95+ ?~ prepared ~["synthetic program prelude did not prepare for contextual init"]
96+ =/ at=path /tests/program-main/initializer/jibb
97+ =/ positives=(list tape)
98+ %+ weld
99+ (program-init-positive at island `downstream u.prepared)
100+ (program-init-positive /tests/program-main/initializer-unfaced/jibb unfaced ~ u.prepared)
101+ ?. =(9 (lent negatives)) ~["contextual negative fixture count differs"]
102+ =/ definitions=@t (crip "module definitions need unsupported inference: {(spud at)}")
103+ =/ cases=(list [label=@t at=path src=@t boundary=@t])
104+ :~ ['incompatible error field' at (snag 0 negatives) definitions]
105+ ['earlier tuple mismatch' at (snag 1 negatives) definitions]
106+ ['inconsistent model' at (snag 2 negatives) definitions]
107+ ['inconsistent message' at (snag 3 negatives) definitions]
108+ ['missing/generic data sample' at (snag 4 negatives) definitions]
109+ ['missing initializer' at (snag 5 negatives) definitions]
110+ ['unrelated pending tag' at (snag 6 negatives) definitions]
111+ ['non-main same source' at (snag 7 negatives) definitions]
112+ ['init and subs unresolved' at (snag 8 negatives) definitions]
113+ :- 'API path'
114+ [/ui/api/program-main/jibb island 'module kind needs unsupported inference: /ui/api/program-main/jibb']
115+ :- 'store path'
116+ [/ui/stores/program-main/jibb island 'module kind needs unsupported inference: /ui/stores/program-main/jibb']
117+ ==
118+ (weld positives (program-init-negative-cases cases u.prepared))
119+::
120+++ test-program-init
121+ ^- tang
122+ =/ negatives=(list @t)
123+ :~ (text initializer-error)
124+ (text initializer-earlier)
125+ (text initializer-model)
126+ (text initializer-message)
127+ (text initializer-generic)
128+ (text initializer-missing)
129+ (text initializer-tag)
130+ (text initializer-no-main)
131+ (text initializer-subs)
132+ ==
133+ (turn (program-init-errors prelude internal (text initializer) (text initializer-consumer) (text initializer-unfaced) negatives) |=(reason=tape leaf+reason))
134+--
tests/lib/jibb-program-main.hoonnew file+141
@@ -0,0 +1,141 @@
1+:: Narrow closed program-main checking, without execution or watchability claims.
2+/+ jibb
3+/* prelude %jibb /lib/jibb/prelude/jibb
4+/* internal %jibb /lib/jibb/internal/jibb
5+/* source %txt /tests/type-program-main/source/txt
6+/* consumer %txt /tests/type-program-main/consumer/txt
7+/* gate-model %txt /tests/type-program-main/gate-model/txt
8+/* gate-data %txt /tests/type-program-main/gate-data/txt
9+/* nonempty-subs %txt /tests/type-program-main/nonempty-subs/txt
10+/* mismatched-model %txt /tests/type-program-main/mismatched-model/txt
11+/* arbitrary-main %txt /tests/type-program-main/arbitrary-main/txt
12+/* alias-main %txt /tests/type-program-main/alias-main/txt
13+/* open-message %txt /tests/type-program-main/open-message/txt
14+|%
15+++ text
16+ |= lines=wain
17+ ^- @t
18+ (rap 3 (turn lines |=(line=@t (cat 3 line '\0a'))))
19+::
20+++ program-prepared
21+ |= [public=@t private=@t]
22+ ^- (unit iprelude:jibb)
23+ (prepare-prelude-with-internal:jibb public private)
24+::
25+++ program-main-detailed
26+ |= [at=path src=@t modules=jbundle:jibb prepared=iprelude:jibb]
27+ ^- jfile-detailed-result:jibb
28+ (infer-jibb-file-detailed:jibb at src ~ ~ modules ~[at] values.prepared molds.prepared ~ `iface.prepared)
29+::
30+++ program-main-legacy
31+ |= [at=path src=@t modules=jbundle:jibb prepared=iprelude:jibb]
32+ ^- jfile-result:jibb
33+ (infer-jibb-file:jibb at src ~ ~ modules ~[at] values.prepared molds.prepared ~ `iface.prepared)
34+::
35+++ program-main-negative-errors
36+ |= [label=@t at=path src=@t prepared=iprelude:jibb]
37+ ^- (list tape)
38+ =/ detailed=jfile-detailed-result:jibb (program-main-detailed at src ~ prepared)
39+ ?: ?=(%& -.detailed) ~[(weld (trip label) ": structured check accepted")]
40+ ?. ?=(~ overlap.p.detailed) ~[(weld (trip label) ": unexpected overlap evidence")]
41+ =/ legacy=jfile-result:jibb (program-main-legacy at src ~ prepared)
42+ ?: ?=(%& -.legacy) ~[(weld (trip label) ": legacy check accepted")]
43+ ?. =(p.legacy message.p.detailed) ~[(weld (trip label) ": adapter messages differ")]
44+ ~
45+::
46+++ program-main-errors
47+ |= [public=@t private=@t island=@t downstream=@t negatives=(list @t)]
48+ ^- (list tape)
49+ =/ prepared=(unit iprelude:jibb)
50+ (program-prepared public private)
51+ ?~ prepared ~["synthetic program prelude did not prepare"]
52+ =/ at=path /tests/program-main/island/jibb
53+ =/ detailed=jfile-detailed-result:jibb (program-main-detailed at island ~ u.prepared)
54+ ?: ?=(%| -.detailed) ~["direct closed program main was rejected"]
55+ =/ checked=ifile:jibb iface.p.detailed
56+ ?~ graph.checked ~["program request graph evidence is missing"]
57+ =/ legacy=jfile-result:jibb (program-main-legacy at island ~ u.prepared)
58+ ?: ?=(%| -.legacy) ~["legacy adapter rejected a closed program main"]
59+ ?. =(values.checked values.iface.p.legacy) ~["structured and legacy interface values differ"]
60+ =/ init=(unit ischeme:jibb) (ienv-lookup:jibb %init values.checked)
61+ =/ update=(unit ischeme:jibb) (ienv-lookup:jibb %update values.checked)
62+ =/ view=(unit ischeme:jibb) (ienv-lookup:jibb %view values.checked)
63+ =/ subs=(unit ischeme:jibb) (ienv-lookup:jibb %subs values.checked)
64+ =/ main=(unit ischeme:jibb) (ienv-lookup:jibb %main values.checked)
65+ ?~ init ~["init interface is missing"]
66+ ?~ update ~["update interface is missing"]
67+ ?~ view ~["view interface is missing"]
68+ ?~ subs ~["subs interface is missing"]
69+ ?~ main ~["main interface is missing"]
70+ =/ parsed (parse:jibb at island)
71+ ?: ?=(%| -.parsed) ~["program source no longer parses"]
72+ =/ main-def=(unit def:jibb) (program-main-def:jibb defs.p.parsed)
73+ ?~ main-def ~["program main definition is missing"]
74+ =/ parts (program-main-parts:jibb u.main-def)
75+ ?~ parts ~["program main parts are missing"]
76+ ?: (program-main-closed:jibb u.parts defs.p.parsed values.checked ~ ~ u.graph.checked)
77+ ~["program kind was accepted without its source-backed prelude"]
78+ =/ program-scheme=(unit ischeme:jibb) (ienv-lookup:jibb %program values.iface.u.prepared)
79+ ?~ program-scheme ~["synthetic program scheme is missing"]
80+ ?. ?=(%fn -.typ.u.program-scheme) ~["synthetic program value is not a gate"]
81+ =/ broken-values=ienv:jibb
82+ (skim values.iface.u.prepared |=(entry=[name=term scheme=ischeme:jibb] !=(%program name.entry)))
83+ =/ broken=ifile:jibb
84+ iface.u.prepared(values [[%program [[%fn sample.typ.u.program-scheme [%atom %ud]] vars.u.program-scheme]] broken-values])
85+ =/ malformed=jfile-detailed-result:jibb
86+ (infer-jibb-file-detailed:jibb at island ~ ~ ~ ~[at] values.u.prepared molds.u.prepared ~ `broken)
87+ ?: ?=(%& -.malformed) ~["program result was not checked against the program mold"]
88+ =/ kind-error=@t (crip "module kind needs unsupported inference: {(spud at)}")
89+ ?. =(message.p.malformed kind-error) ~["malformed program failed before the kind check"]
90+ =/ open=jfile-detailed-result:jibb
91+ (program-main-detailed at (snag 6 negatives) ~ u.prepared)
92+ ?: ?=(%& -.open) ~["open program message was accepted"]
93+ =/ other-values=ienv:jibb
94+ (skim values.checked |=(entry=[name=term scheme=ischeme:jibb] !=(%main name.entry)))
95+ =/ open-values=ienv:jibb [[%main u.main(vars ~[0])] other-values]
96+ ?: (program-main-closed:jibb u.parts defs.p.parsed open-values `iface.u.prepared ~ u.graph.checked)
97+ ~["generic main scheme passed the closure check"]
98+ =/ model=itype:jibb [%face %count [%atom %ud]]
99+ ?. =(u.init [[%fn [%atom %t] model] ~]) ~["init interface type differs"]
100+ ?. ?=(~ vars.u.main) ~["main interface is not closed"]
101+ =/ init-fields=(list itype:jibb) (record-fields-named:jibb %init typ.u.main ~)
102+ =/ update-fields=(list itype:jibb) (record-fields-named:jibb %update typ.u.main ~)
103+ =/ view-fields=(list itype:jibb) (record-fields-named:jibb %view typ.u.main ~)
104+ =/ subs-fields=(list itype:jibb) (record-fields-named:jibb %subs typ.u.main ~)
105+ ?. =(init-fields ~[typ.u.init]) ~["main initializer field differs"]
106+ ?. &(=(1 (lent update-fields)) =(1 (lent view-fields)) =(1 (lent subs-fields)))
107+ ~["main component fields differ"]
108+ ?~ source.checked ~["program source evidence is missing"]
109+ ?. =(u.source.checked island) ~["program source evidence differs"]
110+ =/ consumer-at=path /tests/program-main/consumer/jibb
111+ =/ imported=jfile-detailed-result:jibb
112+ (program-main-detailed consumer-at downstream ~[[at island]] u.prepared)
113+ ?: ?=(%| -.imported) ~[(weld "ordinary downstream program import was rejected: " (trip message.p.imported))]
114+ =/ use=(unit ischeme:jibb) (ienv-lookup:jibb %imported values.iface.p.imported)
115+ ?~ use ~["downstream imported initializer is missing"]
116+ ?. =(u.use u.init) ~["downstream imported initializer type differs"]
117+ ?. =(7 (lent negatives)) ~["focused negative fixture count differs"]
118+ =/ cases=(list [label=@t at=path src=@t])
119+ :~ ['gate in model' at (snag 0 negatives)]
120+ ['gate in data' at (snag 1 negatives)]
121+ ['nonempty subs' at (snag 2 negatives)]
122+ ['mismatched model' at (snag 3 negatives)]
123+ ['arbitrary main' at (snag 4 negatives)]
124+ ['store path' /ui/stores/program-main/jibb island]
125+ ['program alias' at (snag 5 negatives)]
126+ ==
127+ (zing (turn cases |=(c=[label=@t at=path src=@t] (program-main-negative-errors label.c at.c src.c u.prepared))))
128+::
129+++ test-program-main
130+ ^- tang
131+ =/ negatives=(list @t)
132+ :~ (text gate-model)
133+ (text gate-data)
134+ (text nonempty-subs)
135+ (text mismatched-model)
136+ (text arbitrary-main)
137+ (text alias-main)
138+ (text open-message)
139+ ==
140+ (turn (program-main-errors prelude internal (text source) (text consumer) negatives) |=(reason=tape leaf+reason))
141+--
tests/lib/jibb-program-update.hoonnew file+139
@@ -0,0 +1,139 @@
1+:: Transactional direct-program update result context, without UI execution.
2+/+ jibb
3+/* prelude %jibb /lib/jibb/prelude/jibb
4+/* internal %jibb /lib/jibb/internal/jibb
5+/* source %txt /tests/type-program-update/source/txt
6+/* consumer %txt /tests/type-program-update/consumer/txt
7+/* wrong-result %txt /tests/type-program-update/wrong-result/txt
8+/* wrong-model %txt /tests/type-program-update/wrong-model/txt
9+/* wrong-message %txt /tests/type-program-update/wrong-message/txt
10+/* malformed-sample %txt /tests/type-program-update/malformed-sample/txt
11+/* three-slot-sample %txt /tests/type-program-update/three-slot-sample/txt
12+/* non-main %txt /tests/type-program-update/non-main/txt
13+/* unrelated-tag %txt /tests/type-program-update/unrelated-tag/txt
14+/* missing-list %txt /tests/type-program-update/missing-list/txt
15+|%
16+++ text
17+ |= lines=wain
18+ ^- @t
19+ (rap 3 (turn lines |=(line=@t (cat 3 line '\0a'))))
20+::
21+++ program-update-prepared
22+ |= [public=@t private=@t]
23+ ^- (unit iprelude:jibb)
24+ (prepare-prelude-with-internal:jibb public private)
25+::
26+++ program-update-detailed
27+ |= [at=path src=@t modules=jbundle:jibb prepared=iprelude:jibb]
28+ ^- jfile-detailed-result:jibb
29+ (infer-jibb-file-detailed:jibb at src ~ ~ modules ~[at] values.prepared molds.prepared ~ `iface.prepared)
30+::
31+++ program-update-legacy
32+ |= [at=path src=@t modules=jbundle:jibb prepared=iprelude:jibb]
33+ ^- jfile-result:jibb
34+ (infer-jibb-file:jibb at src ~ ~ modules ~[at] values.prepared molds.prepared ~ `iface.prepared)
35+::
36+++ program-update-positive
37+ |= [at=path src=@t downstream=@t prepared=iprelude:jibb]
38+ ^- (list tape)
39+ =/ detailed=jfile-detailed-result:jibb (program-update-detailed at src ~ prepared)
40+ ?: ?=(%| -.detailed) ~["contextual direct program update was rejected"]
41+ =/ checked=ifile:jibb iface.p.detailed
42+ =/ legacy=jfile-result:jibb (program-update-legacy at src ~ prepared)
43+ ?: ?=(%| -.legacy) ~["legacy adapter rejected contextual update"]
44+ ?. =(values.checked values.iface.p.legacy) ~["contextual structured and legacy values differ"]
45+ =/ update=(unit ischeme:jibb) (ienv-lookup:jibb %update values.checked)
46+ =/ main=(unit ischeme:jibb) (ienv-lookup:jibb %main values.checked)
47+ ?~ update ~["contextual update interface is missing"]
48+ ?~ main ~["contextual main interface is missing"]
49+ ?. ?=(~ vars.u.update) ~["contextual update interface is not closed"]
50+ =/ expected=tape "$-([event=message current=[count=@ud]] [count=@ud (list (cmd message))])"
51+ ?. =((show-itype:jibb typ.u.update ~) expected) ~["contextual update interface type differs"]
52+ ?. ?=(~ vars.u.main) ~["contextual main interface is not closed"]
53+ =/ fields=(list itype:jibb) (record-fields-named:jibb %update typ.u.main ~)
54+ ?. ?=([* ~] fields) ~["contextual main update field is missing"]
55+ =/ main-expected=tape "$-([message count=@ud] [count=@ud (list (cmd message))])"
56+ ?. =((show-itype:jibb i.fields ~) main-expected) ~["contextual main update field differs"]
57+ ?~ source.checked ~["contextual program source evidence is missing"]
58+ ?. =(u.source.checked src) ~["contextual program source evidence differs"]
59+ ?~ graph.checked ~["contextual program request graph is missing"]
60+ =/ consumer-at=path /tests/program-update/consumer/jibb
61+ =/ imported=jfile-detailed-result:jibb
62+ (program-update-detailed consumer-at downstream ~[[at src]] prepared)
63+ ?: ?=(%| -.imported) ~[(weld "downstream contextual update import was rejected: " (trip message.p.imported))]
64+ =/ use=(unit ischeme:jibb) (ienv-lookup:jibb %imported values.iface.p.imported)
65+ ?~ use ~["downstream contextual update is missing"]
66+ =/ imported-expected=tape "$-([message.island-prog count=@ud] [count=@ud (list (cmd message.island-prog))])"
67+ ?. =((show-itype:jibb typ.u.use ~) imported-expected) ~["downstream contextual update type differs"]
68+ ?. ?=(~ vars.u.use) ~["downstream contextual update is not closed"]
69+ ~
70+::
71+++ program-update-negative
72+ |= [label=@t at=path src=@t boundary=@t prepared=iprelude:jibb]
73+ ^- (list tape)
74+ =/ detailed=jfile-detailed-result:jibb (program-update-detailed at src ~ prepared)
75+ ?: ?=(%& -.detailed) ~[(weld (trip label) ": structured check accepted")]
76+ ?. ?=(~ overlap.p.detailed) ~[(weld (trip label) ": unexpected overlap evidence")]
77+ ?. =(message.p.detailed boundary) ~[(weld (trip label) ": rejected at the wrong boundary")]
78+ =/ legacy=jfile-result:jibb (program-update-legacy at src ~ prepared)
79+ ?: ?=(%& -.legacy) ~[(weld (trip label) ": legacy check accepted")]
80+ ?. =(p.legacy boundary) ~[(weld (trip label) ": legacy boundary differs")]
81+ ~
82+::
83+++ program-update-negative-cases
84+ |= [cases=(list [label=@t at=path src=@t boundary=@t prepared=iprelude:jibb])]
85+ ^- (list tape)
86+ ?~ cases ~
87+ %+ weld
88+ (program-update-negative label.i.cases at.i.cases src.i.cases boundary.i.cases prepared.i.cases)
89+ $(cases t.cases)
90+::
91+++ program-update-errors
92+ |= [public=@t private=@t island=@t downstream=@t negatives=(list @t)]
93+ ^- (list tape)
94+ =/ prepared=(unit iprelude:jibb) (program-update-prepared public private)
95+ ?~ prepared ~["synthetic program prelude did not prepare for contextual update"]
96+ ?. =(8 (lent negatives)) ~["contextual update negative fixture count differs"]
97+ =/ at=path /tests/program-update/island/jibb
98+ =/ definitions=@t (crip "module definitions need unsupported inference: {(spud at)}")
99+ =/ without-cmd=iprelude:jibb
100+ =/ kept=imold-types:jibb
101+ (skim molds.iface.u.prepared |=(m=[name=term template=ischeme:jibb] !=(%cmd name.m)))
102+ [iface.u.prepared(molds kept) values.u.prepared molds.u.prepared]
103+ =/ without-list=iprelude:jibb
104+ =/ kept=imold-types:jibb
105+ (skim molds.iface.u.prepared |=(m=[name=term template=ischeme:jibb] !=(%list name.m)))
106+ [iface.u.prepared(molds kept) values.u.prepared molds.u.prepared]
107+ =/ cases=(list [label=@t at=path src=@t boundary=@t prepared=iprelude:jibb])
108+ :~ ['wrong result constructor' at (snag 0 negatives) definitions u.prepared]
109+ ['inconsistent model' at (snag 1 negatives) definitions u.prepared]
110+ ['inconsistent message' at (snag 2 negatives) definitions u.prepared]
111+ ['malformed sample' at (snag 3 negatives) definitions u.prepared]
112+ ['non-two-slot sample' at (snag 4 negatives) definitions u.prepared]
113+ ['non-main same source' at (snag 5 negatives) definitions u.prepared]
114+ ['unrelated pending tag' at (snag 6 negatives) definitions u.prepared]
115+ ['missing canonical cmd' at island definitions without-cmd]
116+ ['missing canonical list' at (snag 7 negatives) definitions without-list]
117+ :- 'API path'
118+ [/ui/api/program-update/jibb island 'module kind needs unsupported inference: /ui/api/program-update/jibb' u.prepared]
119+ :- 'store path'
120+ [/ui/stores/program-update/jibb island 'module kind needs unsupported inference: /ui/stores/program-update/jibb' u.prepared]
121+ ==
122+ %+ weld
123+ (program-update-positive at island downstream u.prepared)
124+ (program-update-negative-cases cases)
125+::
126+++ test-program-update
127+ ^- tang
128+ =/ negatives=(list @t)
129+ :~ (text wrong-result)
130+ (text wrong-model)
131+ (text wrong-message)
132+ (text malformed-sample)
133+ (text three-slot-sample)
134+ (text non-main)
135+ (text unrelated-tag)
136+ (text missing-list)
137+ ==
138+ (turn (program-update-errors prelude internal (text source) (text consumer) negatives) |=(reason=tape leaf+reason))
139+--
tests/lib/jibb-program-watch.hoonnew file+209
@@ -0,0 +1,209 @@
1+:: Direct request-value watchability for a synthetic program over the real todo API.
2+/+ jibb, jibb-import
3+/* prelude %jibb /lib/jibb/prelude/jibb
4+/* internal %jibb /lib/jibb/internal/jibb
5+/* sur %txt /tests/type-api-paths/todo-sur/txt
6+/* action %txt /tests/type-api-paths/todo-action/txt
7+/* todos %txt /tests/type-api-paths/todos/txt
8+/* update %txt /tests/type-api-paths/todo-update/txt
9+/* item %txt /tests/type-api-paths/todo-item/txt
10+/* api %txt /tests/type-api-paths/api/txt
11+|%
12+++ text
13+ |= lines=wain
14+ ^- @t
15+ (rap 3 (turn lines |=(line=@t (cat 3 line '\0a'))))
16+::
17+++ program-watch-prepared
18+ |= [public=@t private=@t]
19+ ^- (unit iprelude:jibb)
20+ (prepare-prelude-with-internal:jibb public private)
21+::
22+++ program-watch-detailed
23+ |= [at=path src=@t externals=iexternals:jibb marks=imark-externals:jibb modules=jbundle:jibb prepared=iprelude:jibb]
24+ ^- jfile-detailed-result:jibb
25+ (infer-jibb-file-detailed:jibb at src externals marks modules ~[at] values.prepared molds.prepared ~ `iface.prepared)
26+::
27+++ program-watch-source
28+ |= [extra=@t subscriptions=@t]
29+ ^- @t
30+ %+ rap 3
31+ :~ '/= api /ui/api/todo\0a'
32+ '+$ model [count=@ud]\0a'
33+ '+$ msg\0a [%got todos=(list item.api)]\0a [%one item=todo-item.api]\0a %other\0a'
34+ extra
35+ '++ main (program init update view subs)\0a'
36+ '++ init |= input=@t ^- model [count=0]\0a'
37+ '++ update |= [m=msg state=model]\0a ^- [model (list (cmd msg))] [state ~]\0a'
38+ '++ view |= state=model ^- (element msg) (text "view")\0a'
39+ subscriptions
40+ ==
41+::
42+++ program-watch-agent-source
43+ ^- @t
44+ %+ rap 3
45+ :~ '/= api /ui/api/todo\0a'
46+ '+$ model [count=@ud]\0a'
47+ '++ receive |= input=[mark=@tas state=(unit *) fact=*]\0a ^- [state=* message=@t] [state=0 message="ok"]\0a'
48+ '++ request-path ^- path ~[%todos]\0a'
49+ '++ request ^- (ask @t)\0a [%agent api="/ui/api/todo" case=%todos agent=%todo path=request-path scry=~ receive=receive]\0a'
50+ '++ main (program init update view subs)\0a'
51+ '++ init |= input=@t ^- model [count=0]\0a'
52+ '++ update |= [m=@t state=model]\0a ^- [model (list (cmd @t))] [state ~]\0a'
53+ '++ view |= state=model ^- (element @t) (text "ok")\0a'
54+ '++ subs |= state=model\0a ^- (list (sub @t))\0a ~[[%watch request]]\0a'
55+ ==
56+::
57+++ program-watch-errors
58+ |= [public=@t private=@t sur=@t action=@t todos=@t update=@t item=@t api=@t]
59+ ^- (list tape)
60+ =/ prepared=(unit iprelude:jibb) (program-watch-prepared public private)
61+ ?~ prepared ~["synthetic program prelude did not prepare"]
62+ =/ todo=type -:(ride -:!>(..zuse) sur)
63+ =/ subject=type [%cell [%face %todo todo] -:!>(..zuse)]
64+ =/ ma=* (read-mark:jibb-import %todo-action -:(ride subject action))
65+ =/ mt=* (read-mark:jibb-import %todos -:(ride subject todos))
66+ =/ mu=* (read-mark:jibb-import %todo-update -:(ride subject update))
67+ =/ mi=* (read-mark:jibb-import %todo-item -:(ride subject item))
68+ =/ marks=imark-externals:jibb ~[[%todo-action ma] [%todos mt] [%todo-update mu] [%todo-item mi]]
69+ =/ item-input=* (read-named:jibb-import %todo %item todo)
70+ =/ externals=iexternals:jibb ~[[%todo %item item-input]]
71+ =/ api-at=path /ui/api/todo/jibb
72+ =/ api-result=jfile-detailed-result:jibb
73+ (program-watch-detailed api-at api externals marks ~ u.prepared)
74+ ?: ?=(%| -.api-result) ~["real todo API did not check"]
75+ =/ api-iface=ifile:jibb iface.p.api-result
76+ ?~ graph.api-iface ~["real todo API evidence is missing"]
77+ =/ direct-subs=@t '++ subs |= state=model\0a ^- (list (sub msg))\0a ~[[%watch (todos.api |=%got)]]\0a'
78+ =/ island=@t (program-watch-source '' direct-subs)
79+ =/ at=path /tests/program-watch/island/jibb
80+ =/ modules=jbundle:jibb ~[[api-at api]]
81+ =/ detailed=jfile-detailed-result:jibb
82+ (program-watch-detailed at island externals marks modules u.prepared)
83+ ?: ?=(%| -.detailed) ~[(weld "direct request watch was rejected: " (trip message.p.detailed))]
84+ =/ checked=ifile:jibb iface.p.detailed
85+ ?~ graph.checked ~["program request graph evidence is missing"]
86+ =/ legacy=jfile-result:jibb
87+ (infer-jibb-file:jibb at island externals marks modules ~[at] values.u.prepared molds.u.prepared ~ `iface.u.prepared)
88+ ?: ?=(%| -.legacy) ~["legacy adapter rejected a direct request watch"]
89+ ?. =(values.checked values.iface.p.legacy) ~["structured and legacy interface values differ"]
90+ =/ subs=(unit ischeme:jibb) (ienv-lookup:jibb %subs values.checked)
91+ =/ main=(unit ischeme:jibb) (ienv-lookup:jibb %main values.checked)
92+ ?~ subs ~["subs interface is missing"]
93+ ?~ main ~["main interface is missing"]
94+ ?. &(?=(~ vars.u.subs) ?=(~ (itype-vars:jibb typ.u.subs))) ~["subs interface is not closed"]
95+ =/ subs-fields=(list itype:jibb) (record-fields-named:jibb %subs typ.u.main ~)
96+ ?. ?=([* ~] subs-fields) ~["closed program does not have one subs field"]
97+ =/ model=(unit ischeme:jibb) (find-jibb-mold:jibb %model checked)
98+ =/ msg=(unit ischeme:jibb) (find-jibb-mold:jibb %msg checked)
99+ =/ list-template=(unit ischeme:jibb) (find-jibb-mold:jibb %list iface.u.prepared)
100+ =/ sub=(unit ischeme:jibb) (find-jibb-mold:jibb %sub iface.u.prepared)
101+ ?~ model ~["model mold is missing"]
102+ ?~ msg ~["message mold is missing"]
103+ ?~ list-template ~["list mold is missing"]
104+ ?~ sub ~["sub mold is missing"]
105+ =/ message-sub=(unit itype:jibb) (template-apply:jibb u.sub ~[typ.u.msg])
106+ ?~ message-sub ~["message subscription type did not instantiate"]
107+ =/ subs-result=(unit itype:jibb) (template-apply:jibb u.list-template ~[u.message-sub])
108+ ?~ subs-result ~["subscription list type did not instantiate"]
109+ =/ expected-subs=itype:jibb [%fn typ.u.model u.subs-result]
110+ ?. =(typ.u.subs expected-subs) ~["subs interface has the wrong exact type"]
111+ ?. =((lent requests.u.graph.checked) (lent requests.u.graph.api-iface)) ~["merged API evidence count differs"]
112+ ?. (levy requests.u.graph.checked |=(r=irequest-evidence:jibb (lien requests.u.graph.api-iface |=(a=irequest-evidence:jibb =(r a))))) ~["merged API evidence differs"]
113+ =/ matching=(list irequest-evidence:jibb)
114+ (skim requests.u.graph.checked |=(r=irequest-evidence:jibb &(=(api-at.r api-at) =(%todos name.r))))
115+ ?. ?=([* ~] matching) ~["direct todos evidence is not unique"]
116+ =/ evidence=irequest-evidence:jibb i.matching
117+ ?. =(api-source.evidence api) ~["request evidence does not retain the exact API source"]
118+ ?. &(?=(~ scry.path.path.evidence) ?=(~ diffs.path.evidence) ?=(~ diffs.path.path.evidence))
119+ ~["plain todos evidence acquired scry or diffs"]
120+ ?: (lien segments.path.path.evidence |=(p=pseg:jibb !?=(%knot -.p))) ~["plain todos evidence acquired parameters"]
121+ =/ consumer-at=path /tests/program-watch/consumer/jibb
122+ =/ consumer=@t '/= island-prog /tests/program-watch/island\0a++ imported subs.island-prog\0a'
123+ =/ imported=jfile-detailed-result:jibb
124+ (program-watch-detailed consumer-at consumer externals marks [[at island] modules] u.prepared)
125+ ?: ?=(%| -.imported) ~["downstream program import was rejected"]
126+ =/ imported-subs=(unit ischeme:jibb) (ienv-lookup:jibb %imported values.iface.p.imported)
127+ ?~ imported-subs ~["downstream imported subs is missing"]
128+ =/ expected-import=itype:jibb (itype-in-import:jibb typ.u.subs checked %island-prog `iface.u.prepared)
129+ ?. &(?=(~ vars.u.imported-subs) =(typ.u.imported-subs expected-import)) ~["downstream imported subs type differs"]
130+ =/ parsed (parse:jibb at island)
131+ ?: ?=(%| -.parsed) ~["program source no longer parses"]
132+ =/ main-def=(unit def:jibb) (program-main-def:jibb defs.p.parsed)
133+ ?~ main-def ~["program main definition is missing"]
134+ =/ parts (program-main-parts:jibb u.main-def)
135+ ?~ parts ~["program main parts are missing"]
136+ =/ resolved=ijimports:jibb ~[[%api api-iface]]
137+ =/ others=(list irequest-evidence:jibb)
138+ (skim requests.u.graph.checked |=(r=irequest-evidence:jibb !&(=(api-at.r api-at) =(%todos name.r))))
139+ =/ missing=irequest-graph:jibb u.graph.checked(requests others)
140+ =/ mismatch=irequest-graph:jibb u.graph.checked(requests [evidence(api-source 'mismatched') others])
141+ =/ scry=irequest-graph:jibb u.graph.checked(requests [evidence(scry.path.path `~[[%knot ~.peek]]) others])
142+ =/ ambiguous=irequest-graph:jibb u.graph.checked(requests [evidence requests.u.graph.checked])
143+ =/ evidence-cases=(list [label=tape graph=irequest-graph:jibb])
144+ :~ ["missing evidence" missing]
145+ ["API-source mismatch" mismatch]
146+ ["scry declaration evidence" scry]
147+ ["ambiguous evidence" ambiguous]
148+ ==
149+ =/ evidence-failures=(list tape)
150+ %+ murn evidence-cases
151+ |= c=[label=tape graph=irequest-graph:jibb]
152+ ?: (program-main-closed:jibb u.parts defs.p.parsed values.checked `iface.u.prepared resolved graph.c)
153+ `label.c
154+ ~
155+ ?^ evidence-failures ~[(weld "bad evidence passed watchability: " i.evidence-failures)]
156+ =/ ordinary-values=ienv:jibb
157+ (skim values.api-iface |=(entry=[name=term scheme=ischeme:jibb] !=(%todos name.entry)))
158+ =/ forged=ifile:jibb
159+ api-iface(values [[%todos [[%fn [%atom %t] [%atom %t]] ~]] ordinary-values])
160+ ?: (program-main-closed:jibb u.parts defs.p.parsed values.checked `iface.u.prepared ~[[%api forged]] u.graph.checked)
161+ ~["same-named non-derived member passed watchability"]
162+ =/ detached=ifile:jibb api-iface(graph `u.graph.api-iface(requests ~))
163+ ?: (program-main-closed:jibb u.parts defs.p.parsed values.checked `iface.u.prepared ~[[%api detached]] u.graph.checked)
164+ ~["evidence outside the selected interface passed watchability"]
165+ =/ incoherent=irequest-evidence:jibb evidence(name.path.path %other)
166+ =/ api-others=(list irequest-evidence:jibb)
167+ (skim requests.u.graph.api-iface |=(r=irequest-evidence:jibb !&(=(api-at.r api-at) =(%todos name.r))))
168+ =/ incoherent-api=ifile:jibb api-iface(graph `u.graph.api-iface(requests [incoherent api-others]))
169+ =/ incoherent-graph=irequest-graph:jibb u.graph.checked(requests [incoherent others])
170+ ?: (program-main-closed:jibb u.parts defs.p.parsed values.checked `iface.u.prepared ~[[%api incoherent-api]] incoherent-graph)
171+ ~["inconsistent request case names passed watchability"]
172+ =/ kind-error=@t (crip "module kind needs unsupported inference: {(spud at)}")
173+ =/ negatives=(list [label=tape src=@t])
174+ :~ :- "pure watch"
175+ (program-watch-source '' '++ subs |= state=model\0a ^- (list (sub msg))\0a ~[[%watch (pure %other)]]\0a')
176+ :- "correctly typed hand-built agent"
177+ program-watch-agent-source
178+ :- "request helper"
179+ (program-watch-source '++ request ^- (ask msg) (todos.api |=%got)\0a' '++ subs |= state=model\0a ^- (list (sub msg))\0a ~[[%watch request]]\0a')
180+ :- "request alias"
181+ (program-watch-source '++ request todos.api\0a' '++ subs |= state=model\0a ^- (list (sub msg))\0a ~[[%watch (request |=%got)]]\0a')
182+ :- "parameterized todo-by-id"
183+ (program-watch-source '' '++ subs |= state=model\0a ^- (list (sub msg))\0a ~[[%watch (todo-by-id.api 1 |=%one)]]\0a')
184+ :- "diff changes"
185+ (program-watch-source '++ fold |= [d=[%todo-update todo-update.api] s=todos.api] s\0a' '++ subs |= state=model\0a ^- (list (sub msg))\0a ~[[%watch (changes.api |=%got fold)]]\0a')
186+ :- "multi-item subscriptions"
187+ (program-watch-source '++ first ^- (sub msg) [%watch (todos.api |=%got)]\0a++ second ^- (sub msg) [%watch (pure %other)]\0a' '++ subs |= state=model\0a ^- (list (sub msg))\0a ~[first second]\0a')
188+ ==
189+ %+ weld (turn evidence-failures |=(reason=tape reason))
190+ %+ murn negatives
191+ |= c=[label=tape src=@t]
192+ =/ bad=jfile-detailed-result:jibb
193+ (program-watch-detailed at src.c externals marks modules u.prepared)
194+ ?: ?=(%& -.bad) `[(weld label.c ": accepted")]
195+ ?. =(message.p.bad kind-error) `[(weld label.c ": did not reach watchability")]
196+ ~
197+::
198+++ test-program-watch
199+ ^- tang
200+ ?~ sur ~[leaf+"program-watch fixture sur is missing"]
201+ ?~ action ~[leaf+"program-watch fixture action is missing"]
202+ ?~ todos ~[leaf+"program-watch fixture todos is missing"]
203+ ?~ update ~[leaf+"program-watch fixture update is missing"]
204+ ?~ item ~[leaf+"program-watch fixture item is missing"]
205+ ?~ api ~[leaf+"program-watch fixture api is missing"]
206+ =/ failures=(list tape)
207+ (program-watch-errors prelude internal (text sur) (text action) (text todos) (text update) (text item) (text api))
208+ (turn failures |=(reason=tape leaf+reason))
209+--
tests/lib/jibb-request-guards.hoon+2−2
@@ -127,8 +127,8 @@
127 =/ bad-cache=jcache:jibb ~[[helper-at mismatched]]
127 =/ bad-cache=jcache:jibb ~[[helper-at mismatched]]
128 =/ wrong (infer-jibb-file:jibb client transitive ~ marks bundle ~[client] values.u.prep molds.u.prep bad-cache pre)
128 =/ wrong (infer-jibb-file:jibb client transitive ~ marks bundle ~[client] values.u.prep molds.u.prep bad-cache pre)
129 ?: ?=(%& -.wrong) 'cache key and interface path mismatch accepted'
129 ?: ?=(%& -.wrong) 'cache key and interface path mismatch accepted'
130− =/ old-client=@t '++ text "safe"\0a'
130+ =/ old-client=@t '++ text-value "safe"\0a'
131− =/ dep=@t '/= c /lib/client\0a++ value text.c\0a'
131+ =/ dep=@t '/= c /lib/client\0a++ value text-value.c\0a'
132 =/ root=@t '/= h /lib/helper\0a++ x value.h\0a'
132 =/ root=@t '/= h /lib/helper\0a++ x value.h\0a'
133 =/ cycle-bundle=jbundle:jibb ~[[client old-client] [helper-at dep]]
133 =/ cycle-bundle=jbundle:jibb ~[[client old-client] [helper-at dep]]
134 =/ cycle-legacy=ifile:jibb legacy(source `dep)
134 =/ cycle-legacy=ifile:jibb legacy(source `dep)
tests/lib/jibb-theme.hoonnew file+86
@@ -0,0 +1,86 @@
1+:: Full checking for the documented theme mold and real app theme only.
2+/+ jibb
3+/* prelude %jibb /lib/jibb/prelude/jibb
4+/* internal %jibb /lib/jibb/internal/jibb
5+/* source %txt /tests/type-theme/source/txt
6+/* dark-absent %txt /tests/type-theme/dark-absent/txt
7+/* wrong-nested-aura %txt /tests/type-theme/wrong-nested-aura/txt
8+/* missing-field %txt /tests/type-theme/missing-field/txt
9+/* wrong-font %txt /tests/type-theme/wrong-font/txt
10+/* wrong-dark %txt /tests/type-theme/wrong-dark/txt
11+|%
12+++ text
13+ |= lines=wain
14+ ^- @t
15+ (rap 3 (turn lines |=(line=@t (cat 3 line '\0a'))))
16+::
17+++ theme-detailed
18+ |= [at=path src=@t modules=jbundle:jibb prepared=iprelude:jibb]
19+ ^- jfile-detailed-result:jibb
20+ (infer-jibb-file-detailed:jibb at src ~ ~ modules ~[at] values.prepared molds.prepared ~ `iface.prepared)
21+::
22+++ theme-positive
23+ |= [label=tape src=@t expected=tape prepared=iprelude:jibb]
24+ ^- (list tape)
25+ =/ at=path /ui/theme/jibb
26+ =/ detailed=jfile-detailed-result:jibb
27+ (theme-detailed at src ~ prepared)
28+ ?: ?=(%| -.detailed)
29+ ~[(weld label (weld ": rejected: " (trip message.p.detailed)))]
30+ =/ checked=ifile:jibb iface.p.detailed
31+ =/ theme=(unit ischeme:jibb) (ienv-lookup:jibb %theme values.checked)
32+ ?~ theme ~[(weld label ": theme is missing")]
33+ ?. &(?=(~ vars.u.theme) ?=(~ (itype-vars:jibb typ.u.theme)))
34+ ~[(weld label ": theme is not closed")]
35+ =/ actual=tape (show-itype:jibb typ.u.theme ~)
36+ ?. =(actual expected)
37+ ~[(weld label (weld ": theme type was " actual))]
38+ =/ consumer-at=path /tests/theme/consumer/jibb
39+ =/ consumer=@t '/= app-theme /ui/theme\0a++ imported theme.app-theme\0a'
40+ =/ imported=jfile-detailed-result:jibb
41+ (theme-detailed consumer-at consumer ~[[at src]] prepared)
42+ ?: ?=(%| -.imported)
43+ ~[(weld label (weld ": downstream import rejected: " (trip message.p.imported)))]
44+ =/ use=(unit ischeme:jibb) (ienv-lookup:jibb %imported values.iface.p.imported)
45+ ?~ use ~[(weld label ": downstream theme is missing")]
46+ =/ expected-import=itype:jibb
47+ (itype-in-import:jibb typ.u.theme checked %app-theme `iface.prepared)
48+ ?. &(?=(~ vars.u.use) =(typ.u.use expected-import))
49+ ~[(weld label ": downstream theme type differs")]
50+ ~
51+::
52+++ theme-negative
53+ |= [label=tape src=@t prepared=iprelude:jibb]
54+ ^- (list tape)
55+ =/ bad=jfile-detailed-result:jibb
56+ (theme-detailed /ui/theme/jibb src ~ prepared)
57+ ?: ?=(%& -.bad) ~[(weld label ": accepted")]
58+ ~
59+::
60+++ theme-errors
61+ |= [public=@t private=@t source=@t dark-absent=@t wrong-nested-aura=@t missing-field=@t wrong-font=@t wrong-dark=@t]
62+ ^- (list tape)
63+ =/ prepared=(unit iprelude:jibb)
64+ (prepare-prelude-with-internal:jibb public private)
65+ ?~ prepared ~["theme prelude did not prepare"]
66+ =/ expected=tape "[space=[s1=@t [s2=@t s3=@t]] [tones=[normal=@t [background=@t [accent=@t [danger=@t muted=@t]]]] [wide=@t [lang=@t [zone=@t [font=(unit qath.internal) dark=(unit [tones=[normal=@t [background=@t [accent=@t [danger=@t muted=@t]]]]])]]]]]]"
67+ =/ negatives=(list [label=tape src=@t])
68+ :~ ["wrong nested aura" wrong-nested-aura]
69+ ["missing required field" missing-field]
70+ ["wrong font type" wrong-font]
71+ ["wrong dark type" wrong-dark]
72+ ==
73+ =/ positives=(list (list tape))
74+ :~ (theme-positive "dark present" source expected u.prepared)
75+ (theme-positive "dark absent" dark-absent expected u.prepared)
76+ ==
77+ =/ failures=(list tape) (zing positives)
78+ ?^ failures failures
79+ (zing (turn negatives |=(c=[label=tape src=@t] (theme-negative label.c src.c u.prepared))))
80+::
81+++ test-theme
82+ ^- tang
83+ =/ failures=(list tape)
84+ (theme-errors prelude internal (text source) (text dark-absent) (text wrong-nested-aura) (text missing-field) (text wrong-font) (text wrong-dark))
85+ (turn failures |=(reason=tape leaf+reason))
86+--
tests/lib/jibb-todo-full.hoonnew file+157
@@ -0,0 +1,157 @@
1+:: Full unchanged todo island through real readers, without UI execution.
2+/+ jibb, jibb-import
3+/* prelude %jibb /lib/jibb/prelude/jibb
4+/* internal %jibb /lib/jibb/internal/jibb
5+/* sur %txt /tests/type-api-paths/todo-sur/txt
6+/* action %txt /tests/type-api-paths/todo-action/txt
7+/* todos %txt /tests/type-api-paths/todos/txt
8+/* update %txt /tests/type-api-paths/todo-update/txt
9+/* item %txt /tests/type-api-paths/todo-item/txt
10+/* api %txt /tests/type-api-paths/api/txt
11+/* source %txt /tests/type-gate-free/todo/txt
12+/* wrong-model %txt /tests/type-todo-full/wrong-model/txt
13+/* wrong-message %txt /tests/type-todo-full/wrong-message/txt
14+/* wrong-result %txt /tests/type-todo-full/wrong-result/txt
15+/* ambiguous-mapper %txt /tests/type-todo-full/ambiguous-mapper/txt
16+/* open-key %txt /tests/type-todo-full/open-key/txt
17+/* alias %txt /tests/type-todo-full/alias/txt
18+/* wrong-watch %txt /tests/type-todo-full/wrong-watch/txt
19+/* non-gate-view %txt /tests/type-todo-full/non-gate-view/txt
20+/* expected %txt /tests/type-todo-full/expected/txt
21+|%
22+++ text
23+ |= lines=wain
24+ ^- @t
25+ (rap 3 (turn lines |=(line=@t (cat 3 line '\0a'))))
26+::
27+++ todo-full-detailed
28+ |= [at=path src=@t externals=iexternals:jibb marks=imark-externals:jibb modules=jbundle:jibb prepared=iprelude:jibb]
29+ ^- jfile-detailed-result:jibb
30+ (infer-jibb-file-detailed:jibb at src externals marks modules ~[at] values.prepared molds.prepared ~ `iface.prepared)
31+::
32+++ todo-full-reader-inputs
33+ |= [sur=@t action=@t todos=@t update=@t item=@t]
34+ ^- [marks=imark-externals:jibb externals=iexternals:jibb]
35+ =/ todo=type -:(ride -:!>(..zuse) sur)
36+ =/ subject=type [%cell [%face %todo todo] -:!>(..zuse)]
37+ =/ ma=* (read-mark:jibb-import %todo-action -:(ride subject action))
38+ =/ mt=* (read-mark:jibb-import %todos -:(ride subject todos))
39+ =/ mu=* (read-mark:jibb-import %todo-update -:(ride subject update))
40+ =/ mi=* (read-mark:jibb-import %todo-item -:(ride subject item))
41+ =/ marks=imark-externals:jibb ~[[%todo-action ma] [%todos mt] [%todo-update mu] [%todo-item mi]]
42+ =/ item-input=* (read-named:jibb-import %todo %item todo)
43+ [marks ~[[%todo %item item-input]]]
44+::
45+++ todo-full-report
46+ |= [public=@t private=@t sur=@t action=@t todos=@t update=@t item=@t api=@t src=@t]
47+ ^- @t
48+ =/ prepared=(unit iprelude:jibb) (prepare-prelude-with-internal:jibb public private)
49+ ?~ prepared 'prelude unavailable'
50+ =/ inputs=[marks=imark-externals:jibb externals=iexternals:jibb]
51+ (todo-full-reader-inputs sur action todos update item)
52+ =/ marks=imark-externals:jibb marks.inputs
53+ =/ externals=iexternals:jibb externals.inputs
54+ =/ api-at=path /ui/api/todo/jibb
55+ =/ at=path /ui/todo-list/jibb
56+ =/ modules=jbundle:jibb ~[[api-at api]]
57+ =/ detailed=jfile-detailed-result:jibb
58+ (todo-full-detailed at src externals marks modules u.prepared)
59+ ?: ?=(%| -.detailed) (cat 3 'full todo rejected: ' message.p.detailed)
60+ =/ checked=ifile:jibb iface.p.detailed
61+ =/ main=(unit ischeme:jibb) (ienv-lookup:jibb %main values.checked)
62+ ?~ main 'full todo main missing'
63+ (cat 3 'full todo accepted\0a' (crip (show-itype:jibb typ.u.main ~)))
64+::
65+++ todo-full-legacy-report
66+ |= [public=@t private=@t sur=@t action=@t todos=@t update=@t item=@t api=@t src=@t]
67+ ^- @t
68+ =/ prepared=(unit iprelude:jibb) (prepare-prelude-with-internal:jibb public private)
69+ ?~ prepared 'prelude unavailable'
70+ =/ inputs=[marks=imark-externals:jibb externals=iexternals:jibb]
71+ (todo-full-reader-inputs sur action todos update item)
72+ =/ marks=imark-externals:jibb marks.inputs
73+ =/ externals=iexternals:jibb externals.inputs
74+ =/ api-at=path /ui/api/todo/jibb
75+ =/ at=path /ui/todo-list/jibb
76+ =/ modules=jbundle:jibb ~[[api-at api]]
77+ =/ legacy=jfile-result:jibb
78+ (infer-jibb-file:jibb at src externals marks modules ~[at] values.u.prepared molds.u.prepared ~ `iface.u.prepared)
79+ ?: ?=(%| -.legacy) (cat 3 'legacy full todo rejected: ' p.legacy)
80+ =/ checked=ifile:jibb iface.p.legacy
81+ =/ main=(unit ischeme:jibb) (ienv-lookup:jibb %main values.checked)
82+ ?~ main 'legacy full todo main missing'
83+ (cat 3 'full todo accepted\0a' (crip (show-itype:jibb typ.u.main ~)))
84+::
85+++ todo-full-import-report
86+ |= [public=@t private=@t sur=@t action=@t todos=@t update=@t item=@t api=@t src=@t]
87+ ^- @t
88+ =/ prepared=(unit iprelude:jibb) (prepare-prelude-with-internal:jibb public private)
89+ ?~ prepared 'prelude unavailable'
90+ =/ inputs=[marks=imark-externals:jibb externals=iexternals:jibb]
91+ (todo-full-reader-inputs sur action todos update item)
92+ =/ at=path /ui/todo-list/jibb
93+ =/ root=jfile-detailed-result:jibb
94+ (todo-full-detailed at src externals.inputs marks.inputs ~[[/ui/api/todo/jibb api]] u.prepared)
95+ ?: ?=(%| -.root) (cat 3 'full todo root rejected: ' message.p.root)
96+ =/ main=(unit ischeme:jibb) (ienv-lookup:jibb %main values.iface.p.root)
97+ ?~ main 'full todo root main missing'
98+ =/ consumer-at=path /tests/todo-full/consumer/jibb
99+ =/ consumer=@t '/= island-prog /ui/todo-list\0a++ imported main.island-prog\0a'
100+ =/ imported=jfile-detailed-result:jibb
101+ (todo-full-detailed consumer-at consumer externals.inputs marks.inputs ~[[at src] [/ui/api/todo/jibb api]] u.prepared)
102+ ?: ?=(%| -.imported) (cat 3 'downstream full todo import rejected: ' message.p.imported)
103+ =/ use=(unit ischeme:jibb) (ienv-lookup:jibb %imported values.iface.p.imported)
104+ ?~ use 'downstream imported main missing'
105+ =/ expected-import=itype:jibb
106+ (itype-in-import:jibb typ.u.main iface.p.root %island-prog `iface.u.prepared)
107+ ?. &(?=(~ vars.u.use) =(typ.u.use expected-import)) 'downstream main type differs'
108+ 'downstream import accepted'
109+::
110+++ todo-full-negative-report
111+ |= [public=@t private=@t sur=@t action=@t todos=@t update=@t item=@t api=@t label=@t src=@t]
112+ ^- @t
113+ =/ prepared=(unit iprelude:jibb) (prepare-prelude-with-internal:jibb public private)
114+ ?~ prepared 'prelude unavailable'
115+ =/ inputs=[marks=imark-externals:jibb externals=iexternals:jibb]
116+ (todo-full-reader-inputs sur action todos update item)
117+ =/ at=path /ui/todo-list/jibb
118+ =/ structured=jfile-detailed-result:jibb
119+ (todo-full-detailed at src externals.inputs marks.inputs ~[[/ui/api/todo/jibb api]] u.prepared)
120+ ?: ?=(%& -.structured) (cat 3 label ': BAD accepted')
121+ (cat 3 label ': rejected')
122+::
123+++ test-todo-full
124+ ^- tang
125+ =/ report=@t
126+ (todo-full-report prelude internal (text sur) (text action) (text todos) (text update) (text item) (text api) (text source))
127+ ?. =((to-wain:format (cat 3 report '\0a')) expected)
128+ ~[leaf+"full todo report differs"]
129+ =/ legacy=@t
130+ (todo-full-legacy-report prelude internal (text sur) (text action) (text todos) (text update) (text item) (text api) (text source))
131+ ?. =((to-wain:format (cat 3 legacy '\0a')) expected)
132+ ~[leaf+"legacy full todo report differs"]
133+ =/ imported=@t
134+ (todo-full-import-report prelude internal (text sur) (text action) (text todos) (text update) (text item) (text api) (text source))
135+ ?. =(imported 'downstream import accepted')
136+ ~[leaf+"downstream full todo import differs"]
137+ =/ negatives=(list [label=@t src=@t])
138+ :~ ['wrong model' (text wrong-model)]
139+ ['wrong message' (text wrong-message)]
140+ ['wrong result' (text wrong-result)]
141+ ['ambiguous mapper' (text ambiguous-mapper)]
142+ ['open key' (text open-key)]
143+ ['mapper alias' (text alias)]
144+ ['wrong watch' (text wrong-watch)]
145+ ['non-gate view' (text non-gate-view)]
146+ ==
147+ =/ bad=(list @t)
148+ %+ murn negatives
149+ |= c=[label=@t src=@t]
150+ =/ expected=@t (cat 3 label.c ': rejected')
151+ =/ actual=@t
152+ (todo-full-negative-report prelude internal (text sur) (text action) (text todos) (text update) (text item) (text api) label.c src.c)
153+ ?. =(expected actual) `actual
154+ ~
155+ ?^ bad (turn bad |=(reason=@t leaf+(trip reason)))
156+ ~
157+--
tests/lib/jibb-todo-partial.hoonnew file+58
@@ -0,0 +1,58 @@
1+:: The exact todo island through real readers: partial reports only.
2+/+ jibb, jibb-import
3+/* prelude %jibb /lib/jibb/prelude/jibb
4+/* internal %jibb /lib/jibb/internal/jibb
5+/* sur %txt /tests/type-api-paths/todo-sur/txt
6+/* action %txt /tests/type-api-paths/todo-action/txt
7+/* todos %txt /tests/type-api-paths/todos/txt
8+/* update %txt /tests/type-api-paths/todo-update/txt
9+/* item %txt /tests/type-api-paths/todo-item/txt
10+/* api %txt /tests/type-api-paths/api/txt
11+/* source %txt /tests/type-gate-free/todo/txt
12+/* expected %txt /tests/type-todo-partial/expected/txt
13+|%
14+++ text
15+ |= lines=wain
16+ ^- @t
17+ (rap 3 (turn lines |=(line=@t (cat 3 line '\0a'))))
18+++ todo-island-report
19+ |= [public=@t private=@t sur-text=@t action-text=@t todos-text=@t update-text=@t item-text=@t api-text=@t source-text=@t]
20+ ^- @t
21+ =/ prepared=(unit iprelude:jibb) (prepare-prelude-with-internal:jibb public private)
22+ ?~ prepared 'prelude unavailable'
23+ =/ todo=type -:(ride -:!>(..zuse) sur-text)
24+ =/ subject=type [%cell [%face %todo todo] -:!>(..zuse)]
25+ =/ ma=* (read-mark:jibb-import %todo-action -:(ride subject action-text))
26+ =/ mt=* (read-mark:jibb-import %todos -:(ride subject todos-text))
27+ =/ mu=* (read-mark:jibb-import %todo-update -:(ride subject update-text))
28+ =/ mi=* (read-mark:jibb-import %todo-item -:(ride subject item-text))
29+ =/ marks=imark-externals:jibb ~[[%todo-action ma] [%todos mt] [%todo-update mu] [%todo-item mi]]
30+ =/ item-input=* (read-named:jibb-import %todo %item todo)
31+ =/ inputs=iexternals:jibb ~[[%todo %item item-input]]
32+ =/ modules=jbundle:jibb ~[[/ui/api/todo/jibb api-text]]
33+ =/ at=path /ui/todo-list/jibb
34+ =/ normal=@t (golden-types-with-prepared-prelude:jibb at source-text inputs marks modules prepared)
35+ =/ missing-mark=imark-externals:jibb (skim marks |=(x=[mark=term result=*] !=(%todo-update mark.x)))
36+ =/ duplicate-mark=imark-externals:jibb [[%todo-action ma] marks]
37+ =/ negative=(list [label=@t externals=iexternals:jibb marks=imark-externals:jibb])
38+ :~ ['missing-mark' inputs missing-mark]
39+ ['duplicate-mark' inputs duplicate-mark]
40+ ['missing-selected-sur' ~ marks]
41+ ==
42+ =/ failures=(list @t)
43+ %+ turn negative
44+ |= c=[label=@t externals=iexternals:jibb marks=imark-externals:jibb]
45+ =/ bad (infer-jibb-file:jibb /ui/api/todo/jibb api-text externals.c marks.c ~ ~[/ui/api/todo/jibb] values.u.prepared molds.u.prepared ~ `iface.u.prepared)
46+ ?: ?=(%| -.bad) (cat 3 label.c ': rejected')
47+ (cat 3 label.c ': BAD accepted')
48+ =/ missing-module=@t (golden-types-with-prepared-prelude:jibb at source-text inputs marks ~ prepared)
49+ (of-wain:format (weld ~['unchanged todo: partial inference only' normal 'negative API imports'] (weld failures ~['missing module: partial report' missing-module])))
50+++ test-todo-partial
51+ ^- tang
52+ ?~ source ~[leaf+"todo source fixture is missing"]
53+ ?~ expected ~[leaf+"todo partial report is missing"]
54+ =/ report=@t (todo-island-report prelude internal (text sur) (text action) (text todos) (text update) (text item) (text api) (text source))
55+ ?. =((to-wain:format (cat 3 report '\0a')) expected)
56+ ~[leaf+"unchanged todo partial report differs from its golden"]
57+ ~
58+--
tests/lib/jibb-union-alias-overlap.hoonnew file+107
@@ -0,0 +1,107 @@
1+:: Source-backed alias overlap diagnostics, without a full module claim.
2+/+ jibb
3+/* positive %txt /tests/type-union-alias-overlap/positive/txt
4+/* negative %txt /tests/type-union-alias-overlap/negative/txt
5+/* nonzero %txt /tests/type-union-alias-overlap/nonzero/txt
6+/* multi %txt /tests/type-union-alias-overlap/multi/txt
7+/* opaque %txt /tests/type-union-alias-overlap/opaque/txt
8+/* wrong %txt /tests/type-union-alias-overlap/wrong/txt
9+/* duplicate %txt /tests/type-union-alias-overlap/duplicate/txt
10+/* qualified %txt /tests/type-union-alias-overlap/qualified/txt
11+/* flag-source %txt /tests/type-union-alias-overlap/flag-source/txt
12+/* expected %txt /tests/type-union-alias-overlap/expected/txt
13+|%
14+++ checks
15+ |= [positive=@t negative=@t nonzero=@t multi=@t opaque=@t wrong=@t duplicate=@t qualified=@t flag-source=@t]
16+ ^- (list [@t ?])
17+ =/ project
18+ |= [source=@t name=term]
19+ ^- (unit [cases=(list shape:jibb) molds=imolds:jibb])
20+ =/ parsed (parse:jibb /tests/overlap/jibb source)
21+ ?: ?=(%| -.parsed) ~
22+ =/ molds=imolds:jibb (collect-simple-molds:jibb defs.p.parsed)
23+ =/ found=(unit shape:jibb) (find-simple-mold:jibb name molds)
24+ ?~ found ~
25+ =/ sh=shape:jibb u.found
26+ =? sh ?=(%generic -.sh) body.sh
27+ ?. ?=(%union -.sh) ~
28+ `[cases.sh molds]
29+ =/ a (project positive %same)
30+ =/ z (project positive %same-zero)
31+ =/ d (project negative %distinct-head)
32+ =/ c (project negative %distinct-constant)
33+ =/ e (project negative %empty-payload)
34+ =/ g (project negative %generic)
35+ =/ x (project negative %unknown-name)
36+ =/ nz (project nonzero %same)
37+ =/ m (project multi %choice)
38+ =/ o (project opaque %choice)
39+ =/ w (project wrong %bad)
40+ =/ dup (project duplicate %choice)
41+ =/ q (project qualified %choice)
42+ =/ fz (project flag-source %flag-zero)
43+ =/ fn (project flag-source %flag-nonzero)
44+ ?~ a ~[['BAD same parse' |]]
45+ ?~ z ~[['BAD zero parse' |]]
46+ ?~ d ~[['BAD distinct parse' |]]
47+ ?~ c ~[['BAD constants parse' |]]
48+ ?~ e ~[['BAD empty parse' |]]
49+ ?~ g ~[['BAD generic parse' |]]
50+ ?~ x ~[['BAD reference parse' |]]
51+ ?~ nz ~[['BAD nonzero parse' |]]
52+ ?~ m ~[['BAD multi parse' |]]
53+ ?~ o ~[['BAD opaque parse' |]]
54+ ?~ w ~[['BAD wrong arity parse' |]]
55+ ?~ dup ~[['BAD duplicate parse' |]]
56+ ?~ q ~[['BAD qualified parse' |]]
57+ ?~ fz ~[['BAD flag-zero parse' |]]
58+ ?~ fn ~[['BAD flag-nonzero parse' |]]
59+ ?~ cases.u.a ~[['BAD same cases' |]]
60+ ?~ t.cases.u.a ~[['BAD second same case' |]]
61+ =/ same=(unit upair:jibb) (union-source-overlap:jibb cases.u.a molds.u.a 256)
62+ =/ zero=(unit upair:jibb) (union-source-overlap:jibb cases.u.z molds.u.z 256)
63+ =/ report=wain (to-wain:format (golden-types-in-context:jibb /tests/overlap/jibb positive ~ ~ ~ ~ ~ ~))
64+ =/ failed=jfile-result:jibb (infer-jibb-file:jibb /tests/overlap/jibb positive ~ ~ ~ ~[/tests/overlap/jibb] ~ ~ ~ ~)
65+ =/ nonzero-report=wain (to-wain:format (golden-types-in-context:jibb /tests/overlap/jibb nonzero ~ ~ ~ ~ ~ ~))
66+ :~ ['same head and inhabited payload overlap' ?=(^ same)]
67+ ['zero spelling overlap' ?=(^ zero)]
68+ ['original same-case spans retained' ?~(same | &(=(first.u.same at.i.cases.u.a) =(second.u.same at.i.t.cases.u.a)))]
69+ ['partial report displays same overlap' (lien report |=(line=@t =(line '+$ same: overlapping cases; mold not checked')))]
70+ ['partial report displays zero overlap' (lien report |=(line=@t =(line '+$ same-zero: overlapping cases; mold not checked')))]
71+ ['distinct heads do not overlap' ?=(~ (union-source-overlap:jibb cases.u.d molds.u.d 256))]
72+ ['distinct singleton payloads do not overlap' ?=(~ (union-source-overlap:jibb cases.u.c molds.u.c 256))]
73+ ['empty payload has no witness' ?=(~ (union-source-overlap:jibb cases.u.e molds.u.e 256))]
74+ ['outer variable has no witness' ?=(~ (union-source-overlap:jibb cases.u.g molds.u.g 256))]
75+ ['unresolved reference has no witness' ?=(~ (union-source-overlap:jibb cases.u.x molds.u.x 256))]
76+ ['equal nonzero singleton payload overlaps' ?=(^ (union-source-overlap:jibb cases.u.nz molds.u.nz 256))]
77+ ['nonzero overlap reported' (lien nonzero-report |=(line=@t =(line '+$ same: overlapping cases; mold not checked')))]
78+ ['late pair in three cases overlaps' ?=(^ (union-source-overlap:jibb cases.u.m molds.u.m 256))]
79+ ['opaque gate payload declines' ?=(~ (union-source-overlap:jibb cases.u.o molds.u.o 256))]
80+ ['wrong alias arity declines' ?=(~ (union-source-overlap:jibb cases.u.w molds.u.w 256))]
81+ ['full module remains rejected' ?=(%| -.failed)]
82+ ['first source excerpt retained' (lien report |=(line=@t =(line '/tests/overlap.jibb:3:3: first union case')))]
83+ ['second source excerpt retained' (lien report |=(line=@t =(line '/tests/overlap.jibb:4:3: overlapping case')))]
84+ ['flag and zero payload overlap' ?=(^ (union-source-overlap:jibb cases.u.fz molds.u.fz 256))]
85+ ['flag and nonzero payload decline' ?=(~ (union-source-overlap:jibb cases.u.fn molds.u.fn 256))]
86+ ['duplicate owner declines' ?=(~ (union-source-overlap:jibb cases.u.dup molds.u.dup 256))]
87+ ['qualified owner declines' ?=(~ (union-source-overlap:jibb cases.u.q molds.u.q 256))]
88+ ['20 proof fuel succeeds' ?=(^ (union-source-overlap:jibb cases.u.a molds.u.a 20))]
89+ ['19 proof fuel declines' ?=(~ (union-source-overlap:jibb cases.u.a molds.u.a 19))]
90+ ['zero proof fuel declines' ?=(~ (union-source-overlap:jibb cases.u.a molds.u.a 0))]
91+ ==
92+++ overlap-output
93+ |= [positive=@t negative=@t nonzero=@t multi=@t opaque=@t wrong=@t duplicate=@t qualified=@t flag-source=@t]
94+ ^- @t
95+ =/ result=(list [@t ?]) (checks positive negative nonzero multi opaque wrong duplicate qualified flag-source)
96+ (of-wain:format (turn result |=(entry=[@t ?] (crip "{(trip -.entry)}: {?:(+.entry "ok" "BAD")}"))))
97+++ text
98+ |= lines=wain
99+ ^- @t
100+ (rap 3 (turn lines |=(line=@t (cat 3 line '\0a'))))
101+++ test-union-alias-overlap
102+ ^- tang
103+ ?~ expected ~[leaf+"expected output missing"]
104+ =/ actual=@t (overlap-output (text positive) (text negative) (text nonzero) (text multi) (text opaque) (text wrong) (text duplicate) (text qualified) (text flag-source))
105+ ?. =((to-wain:format (cat 3 actual '\0a')) expected) ~[leaf+"generic union overlap output differs"]
106+ ~
107+--
tests/lib/jibb-union-source.hoonnew file+152
@@ -0,0 +1,152 @@
1+:: Bounded source-backed generic-union proof checks; no runtime claim.
2+/+ jibb
3+/* prelude %jibb /lib/jibb/prelude/jibb
4+/* internal %jibb /lib/jibb/internal/jibb
5+/* good %txt /tests/type-union-source/good/txt
6+/* same %txt /tests/type-union-source/same/txt
7+/* zero %txt /tests/type-union-source/zero/txt
8+/* nested %txt /tests/type-union-source/nested/txt
9+/* duplicate %txt /tests/type-union-source/duplicate/txt
10+/* wrong %txt /tests/type-union-source/wrong/txt
11+/* duplicate-params %txt /tests/type-union-source/duplicate-params/txt
12+/* hidden-ref %txt /tests/type-union-source/hidden-ref/txt
13+/* qualified %txt /tests/type-union-source/qualified/txt
14+/* direct-source %txt /tests/type-union-source/direct-source/txt
15+/* wide-source %txt /tests/type-union-source/wide-source/txt
16+/* free-source %txt /tests/type-union-source/free-source/txt
17+/* late-source %txt /tests/type-union-source/late-source/txt
18+/* shadow-source %txt /tests/type-union-source/shadow-source/txt
19+/* mixed-source %txt /tests/type-union-source/mixed-source/txt
20+/* expected %txt /tests/type-union-source/expected/txt
21+|%
22+++ checks
23+ |= [public=@t internal=@t good=@t same=@t zero=@t nested=@t duplicate=@t wrong=@t duplicate-params=@t hidden-ref=@t qualified=@t direct-source=@t wide-source=@t free-source=@t late-source=@t shadow-source=@t mixed-source=@t]
24+ ^- (list [@t ?])
25+ =/ module-choice
26+ |= [source=@t name=term]
27+ ^- (unit [cases=(list shape:jibb) molds=imolds:jibb])
28+ =/ parsed (parse:jibb /tests/empty/jibb source)
29+ ?: ?=(%| -.parsed) ~
30+ =/ molds=imolds:jibb (collect-simple-molds:jibb defs.p.parsed)
31+ =/ found=(unit shape:jibb) (find-simple-mold:jibb name molds)
32+ ?~ found ~
33+ ?. ?=(%union -.u.found) ~
34+ `[cases.u.found molds]
35+ =/ g=(unit [cases=(list shape:jibb) molds=imolds:jibb]) (module-choice good %choice)
36+ =/ s=(unit [cases=(list shape:jibb) molds=imolds:jibb]) (module-choice same %bad)
37+ =/ z=(unit [cases=(list shape:jibb) molds=imolds:jibb]) (module-choice zero %bad)
38+ =/ n=(unit [cases=(list shape:jibb) molds=imolds:jibb]) (module-choice nested %choice)
39+ =/ d=(unit [cases=(list shape:jibb) molds=imolds:jibb]) (module-choice duplicate %choice)
40+ =/ w=(unit [cases=(list shape:jibb) molds=imolds:jibb]) (module-choice wrong %bad)
41+ =/ dp=(unit [cases=(list shape:jibb) molds=imolds:jibb]) (module-choice duplicate-params %choice)
42+ =/ hr=(unit [cases=(list shape:jibb) molds=imolds:jibb]) (module-choice hidden-ref %choice)
43+ =/ q=(unit [cases=(list shape:jibb) molds=imolds:jibb]) (module-choice qualified %choice)
44+ =/ direct=(unit [cases=(list shape:jibb) molds=imolds:jibb]) (module-choice direct-source %choice)
45+ =/ wide=(unit [cases=(list shape:jibb) molds=imolds:jibb]) (module-choice wide-source %choice)
46+ =/ free=(unit [cases=(list shape:jibb) molds=imolds:jibb]) (module-choice free-source %choice)
47+ =/ late=(unit [cases=(list shape:jibb) molds=imolds:jibb]) (module-choice late-source %choice)
48+ ?~ g ~[['BAD good parse' |]]
49+ ?~ s ~[['BAD same parse' |]]
50+ ?~ z ~[['BAD zero parse' |]]
51+ ?~ n ~[['BAD nested parse' |]]
52+ ?~ d ~[['BAD duplicate parse' |]]
53+ ?~ w ~[['BAD arity parse' |]]
54+ ?~ dp ~[['BAD duplicate params parse' |]]
55+ ?~ hr ~[['BAD hidden ref parse' |]]
56+ ?~ q ~[['BAD qualified parse' |]]
57+ ?~ direct ~[['BAD direct parse' |]]
58+ ?~ wide ~[['BAD wide parse' |]]
59+ ?~ free ~[['BAD free parse' |]]
60+ ?~ late ~[['BAD late parse' |]]
61+ ?~ cases.u.late ~[['BAD late cases' |]]
62+ =/ chosen=(unit shape:jibb) (find-simple-mold:jibb %choice molds.u.g)
63+ ?~ chosen ~[['BAD chosen source' |]]
64+ =/ late-shape=(unit shape:jibb) (find-simple-mold:jibb %choice molds.u.late)
65+ ?~ late-shape ~[['BAD late source' |]]
66+ =/ mixed-parsed=(each module:jibb error:jibb) (parse:jibb /tests/empty/jibb mixed-source)
67+ ?: ?=(%| -.mixed-parsed) ~[['BAD mixed parse' |]]
68+ =/ mixed-collected=grec-collected:jibb (grec-collect-molds:jibb defs.p.mixed-parsed)
69+ =/ mixed-tree=(unit shape:jibb) (~(get by proofs.mixed-collected) %node-tree)
70+ =/ prep=(unit iprelude:jibb) (prepare-prelude-with-internal:jibb public internal)
71+ ?~ prep ~[['BAD prepared prelude' |]]
72+ =/ mixed-result=jfile-result:jibb
73+ (infer-jibb-file:jibb /tests/empty/jibb mixed-source ~ ~ ~ ~[/tests/empty/jibb] values.u.prep molds.u.prep ~ `iface.u.prep)
74+ =/ mixed-report=wain (to-wain:format (golden-types-with-prepared-prelude:jibb /tests/empty/jibb mixed-source ~ ~ ~ prep))
75+ =/ good-report=wain (to-wain:format (golden-types-in-context:jibb /tests/empty/jibb good ~ ~ ~ ~ ~ ~))
76+ =/ shadow-report=wain (to-wain:format (golden-types-in-context:jibb /tests/empty/jibb shadow-source ~ ~ ~ ~ ~ ~))
77+ =/ good-checked=jfile-result:jibb
78+ (infer-jibb-file:jibb /tests/empty/jibb good ~ ~ ~ ~[/tests/empty/jibb] ~ ~ ~ ~)
79+ =/ collision-checked=jfile-result:jibb
80+ (infer-jibb-file:jibb /tests/empty/jibb same ~ ~ ~ ~[/tests/empty/jibb] ~ ~ ~ ~)
81+ =/ zero-checked=jfile-result:jibb
82+ (infer-jibb-file:jibb /tests/empty/jibb zero ~ ~ ~ ~[/tests/empty/jibb] ~ ~ ~ ~)
83+ =/ arity-checked=jfile-result:jibb
84+ (infer-jibb-file:jibb /tests/empty/jibb wrong ~ ~ ~ ~[/tests/empty/jibb] ~ ~ ~ ~)
85+ =/ shadow-parsed=(each module:jibb error:jibb) (parse:jibb /tests/empty/jibb shadow-source)
86+ =/ shadow-checked=jfile-result:jibb
87+ (infer-jibb-file:jibb /tests/empty/jibb shadow-source ~ ~ ~ ~[/tests/empty/jibb] ~ ~ ~ ~)
88+ =/ state=istate:jibb *istate:jibb
89+ =/ idx=[at=path source=@t prelude=ifile:jibb shapes=(map term shape:jibb)] [/tests/empty/jibb '' *ifile:jibb *(map term shape:jibb)]
90+ =/ cap256=icaps:jibb (turn (gulf 0 255) |=(n=@ud ['A' n *span:jibb]))
91+ =/ cap257=icaps:jibb (turn (gulf 0 256) |=(n=@ud ['A' n *span:jibb]))
92+ =/ initial=istate:jibb
93+ state(molds molds.u.g, at /tests/empty/jibb, active ~[%outer], caps ~[['Q' 17 *span:jibb]], tags ~[[42 [%term %tas %pending '%pending']]], sub ~[[71 [%atom %t]]], next 100)
94+ =/ preserved=(unit [typ=itype:jibb state=istate:jibb]) (infer-simple-shape:jibb u.chosen initial)
95+ =/ structured=istate:jibb initial(params ~[['A' [%cell [%atom %t] [%atom %t]]]])
96+ =/ rejected=(unit [typ=itype:jibb state=istate:jibb]) (infer-simple-shape:jibb u.chosen structured)
97+ =/ delayed=istate:jibb initial(molds molds.u.late, in-mold &, params ~[['A' [%var 3]]])
98+ =/ first=(unit [typ=itype:jibb state=istate:jibb]) (infer-simple-shape:jibb i.cases.u.late delayed)
99+ =/ incomplete=(unit [typ=itype:jibb state=istate:jibb]) (infer-simple-shape:jibb u.late-shape delayed)
100+ :~ ['source generic distinct' (union-source-distinct-tags:jibb cases.u.g molds.u.g 256)]
101+ ['actual inference preserves pending and scoped state' ?:(?=(~ preserved) | =(state.u.preserved initial))]
102+ ['actual inference rejects structural state' ?=(~ rejected)]
103+ ['later source failure returns no partial state' &(?=(^ first) ?=(~ incomplete))]
104+ ['actual local owner shadow rejected' &(?=(%& -.shadow-parsed) ?=(%| -.shadow-checked))]
105+ ['full generic-alias module checks' ?=(%& -.good-checked)]
106+ ['same-head module is not published' ?=(%| -.collision-checked)]
107+ ['mixed-zero module is not published' ?=(%| -.zero-checked)]
108+ ['wrong-arity module is not published' ?=(%| -.arity-checked)]
109+ ['partial report uses source proof' (lien good-report |=(line=@t =(line '+$ choice: cases proven disjoint; mold not checked')))]
110+ ['partial report preserves shadow diagnostic' (lien shadow-report |=(line=@t =(line '++ bad: local molds shadow a name')))]
111+ ['recognized recursive tree causes conservative decline' &(?=(^ mixed-tree) ?=(%| -.mixed-result))]
112+ ['mixed partial report remains source-only' (lien mixed-report |=(line=@t =(line '+$ choice: cases proven disjoint; mold not checked')))]
113+ ['source exact fuel 18' (union-source-distinct-tags:jibb cases.u.g molds.u.g 18)]
114+ ['source 17 fuel declines' !(union-source-distinct-tags:jibb cases.u.g molds.u.g 17)]
115+ ['same head declines' !(union-source-distinct-tags:jibb cases.u.s molds.u.s 256)]
116+ ['equal noun cross spelling declines' !(union-source-distinct-tags:jibb cases.u.z molds.u.z 256)]
117+ ['nested application declines' !(union-source-distinct-tags:jibb cases.u.n molds.u.n 256)]
118+ ['duplicate owner declines' !(union-source-distinct-tags:jibb cases.u.d molds.u.d 256)]
119+ ['wrong arity declines' !(union-source-distinct-tags:jibb cases.u.w molds.u.w 256)]
120+ ['duplicate parameters decline' !(union-source-distinct-tags:jibb cases.u.dp molds.u.dp 256)]
121+ ['hidden body reference declines' !(union-source-distinct-tags:jibb cases.u.hr molds.u.hr 256)]
122+ ['qualified import declines' !(union-source-distinct-tags:jibb cases.u.q molds.u.q 256)]
123+ ['direct cases use existing proof' !(union-source-distinct-tags:jibb cases.u.direct molds.u.direct 256)]
124+ ['wide alias body declines' !(union-source-distinct-tags:jibb cases.u.wide molds.u.wide 256)]
125+ ['undeclared body parameter declines' !(union-source-distinct-tags:jibb cases.u.free molds.u.free 256)]
126+ ['empty state accepted' (union-source-state-safe:jibb state 256)]
127+ ['simple outer generic accepted' (union-source-state-safe:jibb state(params ~[['A' [%var 3]]], sub ~[[3 [%var 5]]]) 256)]
128+ ['structured outer argument declined' !(union-source-state-safe:jibb state(params ~[['A' [%cell [%atom %t] [%atom %t]]]]) 256)]
129+ ['structured substitution declined' !(union-source-state-safe:jibb state(sub ~[[3 [%cell [%atom %t] [%atom %t]]]]) 256)]
130+ ['pending hole declined' !(union-source-state-safe:jibb state(holes ~[[3 *span:jibb]]) 256)]
131+ ['recursive index declined' !(union-source-state-safe:jibb state(grec-index `idx) 256)]
132+ ['deferred transaction declined' !(union-source-state-safe:jibb state(defer `~) 256)]
133+ ['pending obligation declined' !(union-source-state-safe:jibb state(obligations ~[[[%var 1] [%var 2] *span:jibb *span:jibb]]) 256)]
134+ ['256 state entries accepted' (union-source-state-safe:jibb state(caps cap256) 256)]
135+ ['257 state entries declined' !(union-source-state-safe:jibb state(caps cap257) 256)]
136+ ==
137+++ source-output
138+ |= [public=@t internal=@t good=@t same=@t zero=@t nested=@t duplicate=@t wrong=@t duplicate-params=@t hidden-ref=@t qualified=@t direct-source=@t wide-source=@t free-source=@t late-source=@t shadow-source=@t mixed-source=@t]
139+ ^- @t
140+ =/ result=(list [@t ?]) (checks public internal good same zero nested duplicate wrong duplicate-params hidden-ref qualified direct-source wide-source free-source late-source shadow-source mixed-source)
141+ (of-wain:format (turn result |=(entry=[@t ?] (crip "{(trip -.entry)}: {?:(+.entry "ok" "BAD")}"))))
142+++ text
143+ |= lines=wain
144+ ^- @t
145+ (rap 3 (turn lines |=(line=@t (cat 3 line '\0a'))))
146+++ test-union-source
147+ ^- tang
148+ ?~ expected ~[leaf+"expected output missing"]
149+ =/ actual=@t (source-output prelude internal (text good) (text same) (text zero) (text nested) (text duplicate) (text wrong) (text duplicate-params) (text hidden-ref) (text qualified) (text direct-source) (text wide-source) (text free-source) (text late-source) (text shadow-source) (text mixed-source))
150+ ?. =((to-wain:format (cat 3 actual '\0a')) expected) ~[leaf+"generic union source output differs"]
151+ ~
152+--
tests/lib/jibb.hoon+1352−1286
@@ -1362,1058 +1362,1102 @@
1362/* tok-415 %txt /tests/golden/types-capital-distinct/tokens/txt
1362/* tok-415 %txt /tests/golden/types-capital-distinct/tokens/txt
1363/* tre-415 %txt /tests/golden/types-capital-distinct/tree/txt
1363/* tre-415 %txt /tests/golden/types-capital-distinct/tree/txt
1364/* typ-415 %txt /tests/golden/types-capital-distinct/types/txt
1364/* typ-415 %txt /tests/golden/types-capital-distinct/types/txt
1365−/* src-416 %jibb /tests/golden/types-cell-pattern-many/source/jibb
1365+/* src-416 %jibb /tests/golden/types-cell-branch-context/source/jibb
1366−/* tok-416 %txt /tests/golden/types-cell-pattern-many/tokens/txt
1366+/* tok-416 %txt /tests/golden/types-cell-branch-context/tokens/txt
1367−/* tre-416 %txt /tests/golden/types-cell-pattern-many/tree/txt
1367+/* tre-416 %txt /tests/golden/types-cell-branch-context/tree/txt
1368−/* typ-416 %txt /tests/golden/types-cell-pattern-many/types/txt
1368+/* typ-416 %txt /tests/golden/types-cell-branch-context/types/txt
1369−/* src-417 %jibb /tests/golden/types-cell-pattern-schemes/source/jibb
1369+/* src-417 %jibb /tests/golden/types-cell-pattern-many/source/jibb
1370−/* tok-417 %txt /tests/golden/types-cell-pattern-schemes/tokens/txt
1370+/* tok-417 %txt /tests/golden/types-cell-pattern-many/tokens/txt
1371−/* tre-417 %txt /tests/golden/types-cell-pattern-schemes/tree/txt
1371+/* tre-417 %txt /tests/golden/types-cell-pattern-many/tree/txt
1372−/* typ-417 %txt /tests/golden/types-cell-pattern-schemes/types/txt
1372+/* typ-417 %txt /tests/golden/types-cell-pattern-many/types/txt
1373−/* src-418 %jibb /tests/golden/types-cell-pattern-tail/source/jibb
1373+/* src-418 %jibb /tests/golden/types-cell-pattern-schemes/source/jibb
1374−/* tok-418 %txt /tests/golden/types-cell-pattern-tail/tokens/txt
1374+/* tok-418 %txt /tests/golden/types-cell-pattern-schemes/tokens/txt
1375−/* tre-418 %txt /tests/golden/types-cell-pattern-tail/tree/txt
1375+/* tre-418 %txt /tests/golden/types-cell-pattern-schemes/tree/txt
1376−/* typ-418 %txt /tests/golden/types-cell-pattern-tail/types/txt
1376+/* typ-418 %txt /tests/golden/types-cell-pattern-schemes/types/txt
1377−/* src-419 %jibb /tests/golden/types-constructor-context/source/jibb
1377+/* src-419 %jibb /tests/golden/types-cell-pattern-tail/source/jibb
1378−/* tok-419 %txt /tests/golden/types-constructor-context/tokens/txt
1378+/* tok-419 %txt /tests/golden/types-cell-pattern-tail/tokens/txt
1379−/* tre-419 %txt /tests/golden/types-constructor-context/tree/txt
1379+/* tre-419 %txt /tests/golden/types-cell-pattern-tail/tree/txt
1380−/* typ-419 %txt /tests/golden/types-constructor-context/types/txt
1380+/* typ-419 %txt /tests/golden/types-cell-pattern-tail/types/txt
1381−/* src-420 %jibb /tests/golden/types-deferred-call-context/source/jibb
1381+/* src-420 %jibb /tests/golden/types-constructor-context/source/jibb
1382−/* tok-420 %txt /tests/golden/types-deferred-call-context/tokens/txt
1382+/* tok-420 %txt /tests/golden/types-constructor-context/tokens/txt
1383−/* tre-420 %txt /tests/golden/types-deferred-call-context/tree/txt
1383+/* tre-420 %txt /tests/golden/types-constructor-context/tree/txt
1384−/* typ-420 %txt /tests/golden/types-deferred-call-context/types/txt
1384+/* typ-420 %txt /tests/golden/types-constructor-context/types/txt
1385−/* src-421 %jibb /tests/golden/types-equal-head-disjoint/source/jibb
1385+/* src-421 %jibb /tests/golden/types-deferred-call-context/source/jibb
1386−/* tok-421 %txt /tests/golden/types-equal-head-disjoint/tokens/txt
1386+/* tok-421 %txt /tests/golden/types-deferred-call-context/tokens/txt
1387−/* tre-421 %txt /tests/golden/types-equal-head-disjoint/tree/txt
1387+/* tre-421 %txt /tests/golden/types-deferred-call-context/tree/txt
1388−/* typ-421 %txt /tests/golden/types-equal-head-disjoint/types/txt
1388+/* typ-421 %txt /tests/golden/types-deferred-call-context/types/txt
1389−/* src-422 %jibb /tests/golden/types-flag-branch-context/source/jibb
1389+/* src-422 %jibb /tests/golden/types-equal-head-disjoint/source/jibb
1390−/* tok-422 %txt /tests/golden/types-flag-branch-context/tokens/txt
1390+/* tok-422 %txt /tests/golden/types-equal-head-disjoint/tokens/txt
1391−/* tre-422 %txt /tests/golden/types-flag-branch-context/tree/txt
1391+/* tre-422 %txt /tests/golden/types-equal-head-disjoint/tree/txt
1392−/* typ-422 %txt /tests/golden/types-flag-branch-context/types/txt
1392+/* typ-422 %txt /tests/golden/types-equal-head-disjoint/types/txt
1393−/* src-423 %jibb /tests/golden/types-generic-arity/source/jibb
1393+/* src-423 %jibb /tests/golden/types-flag-branch-context/source/jibb
1394−/* tok-423 %txt /tests/golden/types-generic-arity/tokens/txt
1394+/* tok-423 %txt /tests/golden/types-flag-branch-context/tokens/txt
1395−/* tre-423 %txt /tests/golden/types-generic-arity/tree/txt
1395+/* tre-423 %txt /tests/golden/types-flag-branch-context/tree/txt
1396−/* typ-423 %txt /tests/golden/types-generic-arity/types/txt
1396+/* typ-423 %txt /tests/golden/types-flag-branch-context/types/txt
1397−/* src-424 %jibb /tests/golden/types-generic-face-inference/source/jibb
1397+/* src-424 %jibb /tests/golden/types-generic-arity/source/jibb
1398−/* tok-424 %txt /tests/golden/types-generic-face-inference/tokens/txt
1398+/* tok-424 %txt /tests/golden/types-generic-arity/tokens/txt
1399−/* tre-424 %txt /tests/golden/types-generic-face-inference/tree/txt
1399+/* tre-424 %txt /tests/golden/types-generic-arity/tree/txt
1400−/* typ-424 %txt /tests/golden/types-generic-face-inference/types/txt
1400+/* typ-424 %txt /tests/golden/types-generic-arity/types/txt
1401−/* src-425 %jibb /tests/golden/types-generic-gates/source/jibb
1401+/* src-425 %jibb /tests/golden/types-generic-face-inference/source/jibb
1402−/* tok-425 %txt /tests/golden/types-generic-gates/tokens/txt
1402+/* tok-425 %txt /tests/golden/types-generic-face-inference/tokens/txt
1403−/* tre-425 %txt /tests/golden/types-generic-gates/tree/txt
1403+/* tre-425 %txt /tests/golden/types-generic-face-inference/tree/txt
1404−/* typ-425 %txt /tests/golden/types-generic-gates/types/txt
1404+/* typ-425 %txt /tests/golden/types-generic-face-inference/types/txt
1405−/* src-426 %jibb /tests/golden/types-generic-import-reverse/source/jibb
1405+/* src-426 %jibb /tests/golden/types-generic-gates/source/jibb
1406−/* tok-426 %txt /tests/golden/types-generic-import-reverse/tokens/txt
1406+/* tok-426 %txt /tests/golden/types-generic-gates/tokens/txt
1407−/* tre-426 %txt /tests/golden/types-generic-import-reverse/tree/txt
1407+/* tre-426 %txt /tests/golden/types-generic-gates/tree/txt
1408−/* mod-426-1 %jibb /tests/golden/types-generic-import-reverse/modules/ui/lib/jibb
1408+/* typ-426 %txt /tests/golden/types-generic-gates/types/txt
1409−/* typ-426 %txt /tests/golden/types-generic-import-reverse/types/txt
1409+/* src-427 %jibb /tests/golden/types-generic-import-reverse/source/jibb
1410−/* mtre-426 %txt /tests/golden/types-generic-import-reverse/module-trees/txt
1410+/* tok-427 %txt /tests/golden/types-generic-import-reverse/tokens/txt
1411−/* src-427 %jibb /tests/golden/types-generic-lexical-alias/source/jibb
1411+/* tre-427 %txt /tests/golden/types-generic-import-reverse/tree/txt
1412−/* tok-427 %txt /tests/golden/types-generic-lexical-alias/tokens/txt
1412+/* mod-427-1 %jibb /tests/golden/types-generic-import-reverse/modules/ui/lib/jibb
1413−/* tre-427 %txt /tests/golden/types-generic-lexical-alias/tree/txt
1413+/* typ-427 %txt /tests/golden/types-generic-import-reverse/types/txt
1414−/* typ-427 %txt /tests/golden/types-generic-lexical-alias/types/txt
1414+/* mtre-427 %txt /tests/golden/types-generic-import-reverse/module-trees/txt
1415−/* src-428 %jibb /tests/golden/types-generic-local-parameter/source/jibb
1415+/* src-428 %jibb /tests/golden/types-generic-lexical-alias/source/jibb
1416−/* tok-428 %txt /tests/golden/types-generic-local-parameter/tokens/txt
1416+/* tok-428 %txt /tests/golden/types-generic-lexical-alias/tokens/txt
1417−/* tre-428 %txt /tests/golden/types-generic-local-parameter/tree/txt
1417+/* tre-428 %txt /tests/golden/types-generic-lexical-alias/tree/txt
1418−/* typ-428 %txt /tests/golden/types-generic-local-parameter/types/txt
1418+/* typ-428 %txt /tests/golden/types-generic-lexical-alias/types/txt
1419−/* src-429 %jibb /tests/golden/types-generic-local-scope/source/jibb
1419+/* src-429 %jibb /tests/golden/types-generic-local-parameter/source/jibb
1420−/* tok-429 %txt /tests/golden/types-generic-local-scope/tokens/txt
1420+/* tok-429 %txt /tests/golden/types-generic-local-parameter/tokens/txt
1421−/* tre-429 %txt /tests/golden/types-generic-local-scope/tree/txt
1421+/* tre-429 %txt /tests/golden/types-generic-local-parameter/tree/txt
1422−/* typ-429 %txt /tests/golden/types-generic-local-scope/types/txt
1422+/* typ-429 %txt /tests/golden/types-generic-local-parameter/types/txt
1423−/* src-430 %jibb /tests/golden/types-generic-module/source/jibb
1423+/* src-430 %jibb /tests/golden/types-generic-local-scope/source/jibb
1424−/* tok-430 %txt /tests/golden/types-generic-module/tokens/txt
1424+/* tok-430 %txt /tests/golden/types-generic-local-scope/tokens/txt
1425−/* tre-430 %txt /tests/golden/types-generic-module/tree/txt
1425+/* tre-430 %txt /tests/golden/types-generic-local-scope/tree/txt
1426−/* mod-430-1 %jibb /tests/golden/types-generic-module/modules/ui/lib/jibb
1426+/* typ-430 %txt /tests/golden/types-generic-local-scope/types/txt
1427−/* typ-430 %txt /tests/golden/types-generic-module/types/txt
1427+/* src-431 %jibb /tests/golden/types-generic-module/source/jibb
1428−/* mtre-430 %txt /tests/golden/types-generic-module/module-trees/txt
1428+/* tok-431 %txt /tests/golden/types-generic-module/tokens/txt
1429−/* src-431 %jibb /tests/golden/types-generic-nested-scope/source/jibb
1429+/* tre-431 %txt /tests/golden/types-generic-module/tree/txt
1430−/* tok-431 %txt /tests/golden/types-generic-nested-scope/tokens/txt
1430+/* mod-431-1 %jibb /tests/golden/types-generic-module/modules/ui/lib/jibb
1431−/* tre-431 %txt /tests/golden/types-generic-nested-scope/tree/txt
1431+/* typ-431 %txt /tests/golden/types-generic-module/types/txt
1432−/* typ-431 %txt /tests/golden/types-generic-nested-scope/types/txt
1432+/* mtre-431 %txt /tests/golden/types-generic-module/module-trees/txt
1433−/* src-432 %jibb /tests/golden/types-generic-parameters/source/jibb
1433+/* src-432 %jibb /tests/golden/types-generic-nested-scope/source/jibb
1434−/* tok-432 %txt /tests/golden/types-generic-parameters/tokens/txt
1434+/* tok-432 %txt /tests/golden/types-generic-nested-scope/tokens/txt
1435−/* tre-432 %txt /tests/golden/types-generic-parameters/tree/txt
1435+/* tre-432 %txt /tests/golden/types-generic-nested-scope/tree/txt
1436−/* typ-432 %txt /tests/golden/types-generic-parameters/types/txt
1436+/* typ-432 %txt /tests/golden/types-generic-nested-scope/types/txt
1437−/* src-433 %jibb /tests/golden/types-generic-record/source/jibb
1437+/* src-433 %jibb /tests/golden/types-generic-parameters/source/jibb
1438−/* tok-433 %txt /tests/golden/types-generic-record/tokens/txt
1438+/* tok-433 %txt /tests/golden/types-generic-parameters/tokens/txt
1439−/* tre-433 %txt /tests/golden/types-generic-record/tree/txt
1439+/* tre-433 %txt /tests/golden/types-generic-parameters/tree/txt
1440−/* typ-433 %txt /tests/golden/types-generic-record/types/txt
1440+/* typ-433 %txt /tests/golden/types-generic-parameters/types/txt
1441−/* src-434 %jibb /tests/golden/types-generic-recursive-union/source/jibb
1441+/* src-434 %jibb /tests/golden/types-generic-record/source/jibb
1442−/* tok-434 %txt /tests/golden/types-generic-recursive-union/tokens/txt
1442+/* tok-434 %txt /tests/golden/types-generic-record/tokens/txt
1443−/* tre-434 %txt /tests/golden/types-generic-recursive-union/tree/txt
1443+/* tre-434 %txt /tests/golden/types-generic-record/tree/txt
1444−/* typ-434 %txt /tests/golden/types-generic-recursive-union/types/txt
1444+/* typ-434 %txt /tests/golden/types-generic-record/types/txt
1445−/* src-435 %jibb /tests/golden/types-generic-repeated/source/jibb
1445+/* src-435 %jibb /tests/golden/types-generic-recursive-union/source/jibb
1446−/* tok-435 %txt /tests/golden/types-generic-repeated/tokens/txt
1446+/* tok-435 %txt /tests/golden/types-generic-recursive-union/tokens/txt
1447−/* tre-435 %txt /tests/golden/types-generic-repeated/tree/txt
1447+/* tre-435 %txt /tests/golden/types-generic-recursive-union/tree/txt
1448−/* typ-435 %txt /tests/golden/types-generic-repeated/types/txt
1448+/* typ-435 %txt /tests/golden/types-generic-recursive-union/types/txt
1449−/* src-436 %jibb /tests/golden/types-generic-result-context/source/jibb
1449+/* src-436 %jibb /tests/golden/types-generic-repeated/source/jibb
1450−/* tok-436 %txt /tests/golden/types-generic-result-context/tokens/txt
1450+/* tok-436 %txt /tests/golden/types-generic-repeated/tokens/txt
1451−/* tre-436 %txt /tests/golden/types-generic-result-context/tree/txt
1451+/* tre-436 %txt /tests/golden/types-generic-repeated/tree/txt
1452−/* typ-436 %txt /tests/golden/types-generic-result-context/types/txt
1452+/* typ-436 %txt /tests/golden/types-generic-repeated/types/txt
1453−/* src-437 %jibb /tests/golden/types-generic-union-alias/source/jibb
1453+/* src-437 %jibb /tests/golden/types-generic-result-context/source/jibb
1454−/* tok-437 %txt /tests/golden/types-generic-union-alias/tokens/txt
1454+/* tok-437 %txt /tests/golden/types-generic-result-context/tokens/txt
1455−/* tre-437 %txt /tests/golden/types-generic-union-alias/tree/txt
1455+/* tre-437 %txt /tests/golden/types-generic-result-context/tree/txt
1456−/* typ-437 %txt /tests/golden/types-generic-union-alias/types/txt
1456+/* typ-437 %txt /tests/golden/types-generic-result-context/types/txt
1457−/* src-438 %jibb /tests/golden/types-generic-union-alias-face/source/jibb
1457+/* src-438 %jibb /tests/golden/types-generic-union-alias/source/jibb
1458−/* tok-438 %txt /tests/golden/types-generic-union-alias-face/tokens/txt
1458+/* tok-438 %txt /tests/golden/types-generic-union-alias/tokens/txt
1459−/* tre-438 %txt /tests/golden/types-generic-union-alias-face/tree/txt
1459+/* tre-438 %txt /tests/golden/types-generic-union-alias/tree/txt
1460−/* mod-438-1 %jibb /tests/golden/types-generic-union-alias-face/modules/ui/base/jibb
1460+/* typ-438 %txt /tests/golden/types-generic-union-alias/types/txt
1461−/* typ-438 %txt /tests/golden/types-generic-union-alias-face/types/txt
1461+/* src-439 %jibb /tests/golden/types-generic-union-alias-face/source/jibb
1462−/* mtre-438 %txt /tests/golden/types-generic-union-alias-face/module-trees/txt
1462+/* tok-439 %txt /tests/golden/types-generic-union-alias-face/tokens/txt
1463−/* src-439 %jibb /tests/golden/types-generic-union-capitals/source/jibb
1463+/* tre-439 %txt /tests/golden/types-generic-union-alias-face/tree/txt
1464−/* tok-439 %txt /tests/golden/types-generic-union-capitals/tokens/txt
1464+/* mod-439-1 %jibb /tests/golden/types-generic-union-alias-face/modules/ui/base/jibb
1465−/* tre-439 %txt /tests/golden/types-generic-union-capitals/tree/txt
1465+/* typ-439 %txt /tests/golden/types-generic-union-alias-face/types/txt
1466−/* typ-439 %txt /tests/golden/types-generic-union-capitals/types/txt
1466+/* mtre-439 %txt /tests/golden/types-generic-union-alias-face/module-trees/txt
1467−/* src-440 %jibb /tests/golden/types-generic-union-errors/source/jibb
1467+/* src-440 %jibb /tests/golden/types-generic-union-capitals/source/jibb
1468−/* tok-440 %txt /tests/golden/types-generic-union-errors/tokens/txt
1468+/* tok-440 %txt /tests/golden/types-generic-union-capitals/tokens/txt
1469−/* tre-440 %txt /tests/golden/types-generic-union-errors/tree/txt
1469+/* tre-440 %txt /tests/golden/types-generic-union-capitals/tree/txt
1470−/* typ-440 %txt /tests/golden/types-generic-union-errors/types/txt
1470+/* typ-440 %txt /tests/golden/types-generic-union-capitals/types/txt
1471−/* src-441 %jibb /tests/golden/types-generic-union-escaping/source/jibb
1471+/* src-441 %jibb /tests/golden/types-generic-union-errors/source/jibb
1472−/* tok-441 %txt /tests/golden/types-generic-union-escaping/tokens/txt
1472+/* tok-441 %txt /tests/golden/types-generic-union-errors/tokens/txt
1473−/* tre-441 %txt /tests/golden/types-generic-union-escaping/tree/txt
1473+/* tre-441 %txt /tests/golden/types-generic-union-errors/tree/txt
1474−/* mod-441-1 %jibb /tests/golden/types-generic-union-escaping/modules/ui/base/jibb
1474+/* typ-441 %txt /tests/golden/types-generic-union-errors/types/txt
1475−/* mod-441-2 %jibb /tests/golden/types-generic-union-escaping/modules/ui/mid/jibb
1475+/* src-442 %jibb /tests/golden/types-generic-union-escaping/source/jibb
1476−/* typ-441 %txt /tests/golden/types-generic-union-escaping/types/txt
1476+/* tok-442 %txt /tests/golden/types-generic-union-escaping/tokens/txt
1477−/* mtre-441 %txt /tests/golden/types-generic-union-escaping/module-trees/txt
1477+/* tre-442 %txt /tests/golden/types-generic-union-escaping/tree/txt
1478−/* src-442 %jibb /tests/golden/types-generic-union-import/source/jibb
1478+/* mod-442-1 %jibb /tests/golden/types-generic-union-escaping/modules/ui/base/jibb
1479−/* tok-442 %txt /tests/golden/types-generic-union-import/tokens/txt
1479+/* mod-442-2 %jibb /tests/golden/types-generic-union-escaping/modules/ui/mid/jibb
1480−/* tre-442 %txt /tests/golden/types-generic-union-import/tree/txt
1480+/* typ-442 %txt /tests/golden/types-generic-union-escaping/types/txt
1481−/* mod-442-1 %jibb /tests/golden/types-generic-union-import/modules/ui/shared/jibb
1481+/* mtre-442 %txt /tests/golden/types-generic-union-escaping/module-trees/txt
1482−/* mod-442-2 %jibb /tests/golden/types-generic-union-import/modules/ui/twin/jibb
1482+/* src-443 %jibb /tests/golden/types-generic-union-import/source/jibb
1483−/* typ-442 %txt /tests/golden/types-generic-union-import/types/txt
1483+/* tok-443 %txt /tests/golden/types-generic-union-import/tokens/txt
1484−/* mtre-442 %txt /tests/golden/types-generic-union-import/module-trees/txt
1484+/* tre-443 %txt /tests/golden/types-generic-union-import/tree/txt
1485−/* src-443 %jibb /tests/golden/types-generic-union-local/source/jibb
1485+/* mod-443-1 %jibb /tests/golden/types-generic-union-import/modules/ui/shared/jibb
1486−/* tok-443 %txt /tests/golden/types-generic-union-local/tokens/txt
1486+/* mod-443-2 %jibb /tests/golden/types-generic-union-import/modules/ui/twin/jibb
1487−/* tre-443 %txt /tests/golden/types-generic-union-local/tree/txt
1487+/* typ-443 %txt /tests/golden/types-generic-union-import/types/txt
1488−/* typ-443 %txt /tests/golden/types-generic-union-local/types/txt
1488+/* mtre-443 %txt /tests/golden/types-generic-union-import/module-trees/txt
1489−/* src-444 %jibb /tests/golden/types-generic-union-transitive/source/jibb
1489+/* src-444 %jibb /tests/golden/types-generic-union-local/source/jibb
1490−/* tok-444 %txt /tests/golden/types-generic-union-transitive/tokens/txt
1490+/* tok-444 %txt /tests/golden/types-generic-union-local/tokens/txt
1491−/* tre-444 %txt /tests/golden/types-generic-union-transitive/tree/txt
1491+/* tre-444 %txt /tests/golden/types-generic-union-local/tree/txt
1492−/* mod-444-1 %jibb /tests/golden/types-generic-union-transitive/modules/ui/base/jibb
1492+/* typ-444 %txt /tests/golden/types-generic-union-local/types/txt
1493−/* mod-444-2 %jibb /tests/golden/types-generic-union-transitive/modules/ui/mid/jibb
1493+/* src-445 %jibb /tests/golden/types-generic-union-transitive/source/jibb
1494−/* typ-444 %txt /tests/golden/types-generic-union-transitive/types/txt
1494+/* tok-445 %txt /tests/golden/types-generic-union-transitive/tokens/txt
1495−/* mtre-444 %txt /tests/golden/types-generic-union-transitive/module-trees/txt
1495+/* tre-445 %txt /tests/golden/types-generic-union-transitive/tree/txt
1496−/* src-445 %jibb /tests/golden/types-hole-concrete/source/jibb
1496+/* mod-445-1 %jibb /tests/golden/types-generic-union-transitive/modules/ui/base/jibb
1497−/* tok-445 %txt /tests/golden/types-hole-concrete/tokens/txt
1497+/* mod-445-2 %jibb /tests/golden/types-generic-union-transitive/modules/ui/mid/jibb
1498−/* tre-445 %txt /tests/golden/types-hole-concrete/tree/txt
1498+/* typ-445 %txt /tests/golden/types-generic-union-transitive/types/txt
1499−/* typ-445 %txt /tests/golden/types-hole-concrete/types/txt
1499+/* mtre-445 %txt /tests/golden/types-generic-union-transitive/module-trees/txt
1500−/* src-446 %jibb /tests/golden/types-hole-generic-mold/source/jibb
1500+/* src-446 %jibb /tests/golden/types-hole-concrete/source/jibb
1501−/* tok-446 %txt /tests/golden/types-hole-generic-mold/tokens/txt
1501+/* tok-446 %txt /tests/golden/types-hole-concrete/tokens/txt
1502−/* tre-446 %txt /tests/golden/types-hole-generic-mold/tree/txt
1502+/* tre-446 %txt /tests/golden/types-hole-concrete/tree/txt
1503−/* typ-446 %txt /tests/golden/types-hole-generic-mold/types/txt
1503+/* typ-446 %txt /tests/golden/types-hole-concrete/types/txt
1504−/* src-447 %jibb /tests/golden/types-hole-local-boundary/source/jibb
1504+/* src-447 %jibb /tests/golden/types-hole-generic-mold/source/jibb
1505−/* tok-447 %txt /tests/golden/types-hole-local-boundary/tokens/txt
1505+/* tok-447 %txt /tests/golden/types-hole-generic-mold/tokens/txt
1506−/* tre-447 %txt /tests/golden/types-hole-local-boundary/tree/txt
1506+/* tre-447 %txt /tests/golden/types-hole-generic-mold/tree/txt
1507−/* typ-447 %txt /tests/golden/types-hole-local-boundary/types/txt
1507+/* typ-447 %txt /tests/golden/types-hole-generic-mold/types/txt
1508−/* src-448 %jibb /tests/golden/types-hole-module-boundary/source/jibb
1508+/* src-448 %jibb /tests/golden/types-hole-local-boundary/source/jibb
1509−/* tok-448 %txt /tests/golden/types-hole-module-boundary/tokens/txt
1509+/* tok-448 %txt /tests/golden/types-hole-local-boundary/tokens/txt
1510−/* tre-448 %txt /tests/golden/types-hole-module-boundary/tree/txt
1510+/* tre-448 %txt /tests/golden/types-hole-local-boundary/tree/txt
1511−/* mod-448-1 %jibb /tests/golden/types-hole-module-boundary/modules/ui/lib/jibb
1511+/* typ-448 %txt /tests/golden/types-hole-local-boundary/types/txt
1512−/* typ-448 %txt /tests/golden/types-hole-module-boundary/types/txt
1512+/* src-449 %jibb /tests/golden/types-hole-module-boundary/source/jibb
1513−/* mtre-448 %txt /tests/golden/types-hole-module-boundary/module-trees/txt
1513+/* tok-449 %txt /tests/golden/types-hole-module-boundary/tokens/txt
1514−/* src-449 %jibb /tests/golden/types-hole-named-complex/source/jibb
1514+/* tre-449 %txt /tests/golden/types-hole-module-boundary/tree/txt
1515−/* tok-449 %txt /tests/golden/types-hole-named-complex/tokens/txt
1515+/* mod-449-1 %jibb /tests/golden/types-hole-module-boundary/modules/ui/lib/jibb
1516−/* tre-449 %txt /tests/golden/types-hole-named-complex/tree/txt
1516+/* typ-449 %txt /tests/golden/types-hole-module-boundary/types/txt
1517−/* typ-449 %txt /tests/golden/types-hole-named-complex/types/txt
1517+/* mtre-449 %txt /tests/golden/types-hole-module-boundary/module-trees/txt
1518−/* src-450 %jibb /tests/golden/types-hole-numeric-capture/source/jibb
1518+/* src-450 %jibb /tests/golden/types-hole-named-complex/source/jibb
1519−/* tok-450 %txt /tests/golden/types-hole-numeric-capture/tokens/txt
1519+/* tok-450 %txt /tests/golden/types-hole-named-complex/tokens/txt
1520−/* tre-450 %txt /tests/golden/types-hole-numeric-capture/tree/txt
1520+/* tre-450 %txt /tests/golden/types-hole-named-complex/tree/txt
1521−/* typ-450 %txt /tests/golden/types-hole-numeric-capture/types/txt
1521+/* typ-450 %txt /tests/golden/types-hole-named-complex/types/txt
1522−/* src-451 %jibb /tests/golden/types-hole-unbound-mold/source/jibb
1522+/* src-451 %jibb /tests/golden/types-hole-numeric-capture/source/jibb
1523−/* tok-451 %txt /tests/golden/types-hole-unbound-mold/tokens/txt
1523+/* tok-451 %txt /tests/golden/types-hole-numeric-capture/tokens/txt
1524−/* tre-451 %txt /tests/golden/types-hole-unbound-mold/tree/txt
1524+/* tre-451 %txt /tests/golden/types-hole-numeric-capture/tree/txt
1525−/* typ-451 %txt /tests/golden/types-hole-unbound-mold/types/txt
1525+/* typ-451 %txt /tests/golden/types-hole-numeric-capture/types/txt
1526−/* src-452 %jibb /tests/golden/types-hole-unsupported/source/jibb
1526+/* src-452 %jibb /tests/golden/types-hole-unbound-mold/source/jibb
1527−/* tok-452 %txt /tests/golden/types-hole-unsupported/tokens/txt
1527+/* tok-452 %txt /tests/golden/types-hole-unbound-mold/tokens/txt
1528−/* tre-452 %txt /tests/golden/types-hole-unsupported/tree/txt
1528+/* tre-452 %txt /tests/golden/types-hole-unbound-mold/tree/txt
1529−/* typ-452 %txt /tests/golden/types-hole-unsupported/types/txt
1529+/* typ-452 %txt /tests/golden/types-hole-unbound-mold/types/txt
1530−/* src-453 %jibb /tests/golden/types-hole-user-generic/source/jibb
1530+/* src-453 %jibb /tests/golden/types-hole-unsupported/source/jibb
1531−/* tok-453 %txt /tests/golden/types-hole-user-generic/tokens/txt
1531+/* tok-453 %txt /tests/golden/types-hole-unsupported/tokens/txt
1532−/* tre-453 %txt /tests/golden/types-hole-user-generic/tree/txt
1532+/* tre-453 %txt /tests/golden/types-hole-unsupported/tree/txt
1533−/* typ-453 %txt /tests/golden/types-hole-user-generic/types/txt
1533+/* typ-453 %txt /tests/golden/types-hole-unsupported/types/txt
1534−/* src-454 %jibb /tests/golden/types-hole-user-named/source/jibb
1534+/* src-454 %jibb /tests/golden/types-hole-user-generic/source/jibb
1535−/* tok-454 %txt /tests/golden/types-hole-user-named/tokens/txt
1535+/* tok-454 %txt /tests/golden/types-hole-user-generic/tokens/txt
1536−/* tre-454 %txt /tests/golden/types-hole-user-named/tree/txt
1536+/* tre-454 %txt /tests/golden/types-hole-user-generic/tree/txt
1537−/* typ-454 %txt /tests/golden/types-hole-user-named/types/txt
1537+/* typ-454 %txt /tests/golden/types-hole-user-generic/types/txt
1538−/* src-455 %jibb /tests/golden/types-hole-user-value/source/jibb
1538+/* src-455 %jibb /tests/golden/types-hole-user-named/source/jibb
1539−/* tok-455 %txt /tests/golden/types-hole-user-value/tokens/txt
1539+/* tok-455 %txt /tests/golden/types-hole-user-named/tokens/txt
1540−/* tre-455 %txt /tests/golden/types-hole-user-value/tree/txt
1540+/* tre-455 %txt /tests/golden/types-hole-user-named/tree/txt
1541−/* typ-455 %txt /tests/golden/types-hole-user-value/types/txt
1541+/* typ-455 %txt /tests/golden/types-hole-user-named/types/txt
1542−/* src-456 %jibb /tests/golden/types-import-duplicate-mark/source/jibb
1542+/* src-456 %jibb /tests/golden/types-hole-user-value/source/jibb
1543−/* tok-456 %txt /tests/golden/types-import-duplicate-mark/tokens/txt
1543+/* tok-456 %txt /tests/golden/types-hole-user-value/tokens/txt
1544−/* tre-456 %txt /tests/golden/types-import-duplicate-mark/tree/txt
1544+/* tre-456 %txt /tests/golden/types-hole-user-value/tree/txt
1545−/* typ-456 %txt /tests/golden/types-import-duplicate-mark/types/txt
1545+/* typ-456 %txt /tests/golden/types-hole-user-value/types/txt
1546−/* mark-456-1 %txt /tests/golden/types-import-duplicate-mark/mar/duplicate/txt
1546+/* src-457 %jibb /tests/golden/types-import-duplicate-mark/source/jibb
1547−/* src-457 %jibb /tests/golden/types-import-duplicate-sur/source/jibb
1547+/* tok-457 %txt /tests/golden/types-import-duplicate-mark/tokens/txt
1548−/* tok-457 %txt /tests/golden/types-import-duplicate-sur/tokens/txt
1548+/* tre-457 %txt /tests/golden/types-import-duplicate-mark/tree/txt
1549−/* tre-457 %txt /tests/golden/types-import-duplicate-sur/tree/txt
1549+/* typ-457 %txt /tests/golden/types-import-duplicate-mark/types/txt
1550−/* typ-457 %txt /tests/golden/types-import-duplicate-sur/types/txt
1550+/* mark-457-1 %txt /tests/golden/types-import-duplicate-mark/mar/duplicate/txt
1551−/* imp-457-1 %txt /tests/golden/types-import-duplicate-sur/sur/fixture/txt
1551+/* src-458 %jibb /tests/golden/types-import-duplicate-sur/source/jibb
1552−/* imp-457-2 %txt /tests/golden/types-import-duplicate-sur/sur/fixture/txt
1552+/* tok-458 %txt /tests/golden/types-import-duplicate-sur/tokens/txt
1553−/* imp-457-3 %txt /tests/golden/types-import-duplicate-sur/sur/fixture/txt
1553+/* tre-458 %txt /tests/golden/types-import-duplicate-sur/tree/txt
1554−/* src-458 %jibb /tests/golden/types-import-hoon-flags/source/jibb
1554+/* typ-458 %txt /tests/golden/types-import-duplicate-sur/types/txt
1555−/* tok-458 %txt /tests/golden/types-import-hoon-flags/tokens/txt
1555+/* imp-458-1 %txt /tests/golden/types-import-duplicate-sur/sur/fixture/txt
1556−/* tre-458 %txt /tests/golden/types-import-hoon-flags/tree/txt
1556+/* imp-458-2 %txt /tests/golden/types-import-duplicate-sur/sur/fixture/txt
1557−/* typ-458 %txt /tests/golden/types-import-hoon-flags/types/txt
1557+/* imp-458-3 %txt /tests/golden/types-import-duplicate-sur/sur/fixture/txt
1558−/* imp-458-1 %txt /tests/golden/types-import-hoon-flags/sur/flags/txt
1558+/* src-459 %jibb /tests/golden/types-import-hoon-flags/source/jibb
1559−/* imp-458-2 %txt /tests/golden/types-import-hoon-flags/sur/flags/txt
1559+/* tok-459 %txt /tests/golden/types-import-hoon-flags/tokens/txt
1560−/* imp-458-3 %txt /tests/golden/types-import-hoon-flags/sur/flags/txt
1560+/* tre-459 %txt /tests/golden/types-import-hoon-flags/tree/txt
1561−/* imp-458-4 %txt /tests/golden/types-import-hoon-flags/sur/flags/txt
1561+/* typ-459 %txt /tests/golden/types-import-hoon-flags/types/txt
1562−/* src-459 %jibb /tests/golden/types-import-hoon-noun/source/jibb
1562+/* imp-459-1 %txt /tests/golden/types-import-hoon-flags/sur/flags/txt
1563−/* tok-459 %txt /tests/golden/types-import-hoon-noun/tokens/txt
1563+/* imp-459-2 %txt /tests/golden/types-import-hoon-flags/sur/flags/txt
1564−/* tre-459 %txt /tests/golden/types-import-hoon-noun/tree/txt
1564+/* imp-459-3 %txt /tests/golden/types-import-hoon-flags/sur/flags/txt
1565−/* typ-459 %txt /tests/golden/types-import-hoon-noun/types/txt
1565+/* imp-459-4 %txt /tests/golden/types-import-hoon-flags/sur/flags/txt
1566−/* imp-459-1 %txt /tests/golden/types-import-hoon-noun/sur/fixture/txt
1566+/* src-460 %jibb /tests/golden/types-import-hoon-noun/source/jibb
1567−/* imp-459-2 %txt /tests/golden/types-import-hoon-noun/sur/fixture/txt
1567+/* tok-460 %txt /tests/golden/types-import-hoon-noun/tokens/txt
1568−/* imp-459-3 %txt /tests/golden/types-import-hoon-noun/sur/fixture/txt
1568+/* tre-460 %txt /tests/golden/types-import-hoon-noun/tree/txt
1569−/* imp-459-4 %txt /tests/golden/types-import-hoon-noun/sur/fixture/txt
1569+/* typ-460 %txt /tests/golden/types-import-hoon-noun/types/txt
1570−/* src-460 %jibb /tests/golden/types-import-mark/source/jibb
1570+/* imp-460-1 %txt /tests/golden/types-import-hoon-noun/sur/fixture/txt
1571−/* tok-460 %txt /tests/golden/types-import-mark/tokens/txt
1571+/* imp-460-2 %txt /tests/golden/types-import-hoon-noun/sur/fixture/txt
1572−/* tre-460 %txt /tests/golden/types-import-mark/tree/txt
1572+/* imp-460-3 %txt /tests/golden/types-import-hoon-noun/sur/fixture/txt
1573−/* typ-460 %txt /tests/golden/types-import-mark/types/txt
1573+/* imp-460-4 %txt /tests/golden/types-import-hoon-noun/sur/fixture/txt
1574−/* imp-460-1 %txt /tests/golden/types-import-mark/sur/fixture/txt
1574+/* src-461 %jibb /tests/golden/types-import-mark/source/jibb
1575−/* mark-460-1 %txt /tests/golden/types-import-mark/mar/label/txt
1575+/* tok-461 %txt /tests/golden/types-import-mark/tokens/txt
1576−/* src-461 %jibb /tests/golden/types-import-mark-record/source/jibb
1576+/* tre-461 %txt /tests/golden/types-import-mark/tree/txt
1577−/* tok-461 %txt /tests/golden/types-import-mark-record/tokens/txt
1577+/* typ-461 %txt /tests/golden/types-import-mark/types/txt
1578−/* tre-461 %txt /tests/golden/types-import-mark-record/tree/txt
1578+/* imp-461-1 %txt /tests/golden/types-import-mark/sur/fixture/txt
1579−/* typ-461 %txt /tests/golden/types-import-mark-record/types/txt
1579+/* mark-461-1 %txt /tests/golden/types-import-mark/mar/label/txt
1580−/* mark-461-1 %txt /tests/golden/types-import-mark-record/mar/note/txt
1580+/* src-462 %jibb /tests/golden/types-import-mark-record/source/jibb
1581−/* mark-461-2 %txt /tests/golden/types-import-mark-record/mar/choice/txt
1581+/* tok-462 %txt /tests/golden/types-import-mark-record/tokens/txt
1582−/* src-462 %jibb /tests/golden/types-import-missing-mold/source/jibb
1582+/* tre-462 %txt /tests/golden/types-import-mark-record/tree/txt
1583−/* tok-462 %txt /tests/golden/types-import-missing-mold/tokens/txt
1583+/* typ-462 %txt /tests/golden/types-import-mark-record/types/txt
1584−/* tre-462 %txt /tests/golden/types-import-missing-mold/tree/txt
1584+/* mark-462-1 %txt /tests/golden/types-import-mark-record/mar/note/txt
1585−/* typ-462 %txt /tests/golden/types-import-missing-mold/types/txt
1585+/* mark-462-2 %txt /tests/golden/types-import-mark-record/mar/choice/txt
1586−/* imp-462-1 %txt /tests/golden/types-import-missing-mold/sur/fixture/txt
1586+/* src-463 %jibb /tests/golden/types-import-missing-mold/source/jibb
1587−/* src-463 %jibb /tests/golden/types-import-sur/source/jibb
1587+/* tok-463 %txt /tests/golden/types-import-missing-mold/tokens/txt
1588−/* tok-463 %txt /tests/golden/types-import-sur/tokens/txt
1588+/* tre-463 %txt /tests/golden/types-import-missing-mold/tree/txt
1589−/* tre-463 %txt /tests/golden/types-import-sur/tree/txt
1589+/* typ-463 %txt /tests/golden/types-import-missing-mold/types/txt
1590−/* typ-463 %txt /tests/golden/types-import-sur/types/txt
1590+/* imp-463-1 %txt /tests/golden/types-import-missing-mold/sur/fixture/txt
1591−/* imp-463-1 %txt /tests/golden/types-import-sur/sur/fixture/txt
1591+/* src-464 %jibb /tests/golden/types-import-sur/source/jibb
1592−/* imp-463-2 %txt /tests/golden/types-import-sur/sur/fixture/txt
1592+/* tok-464 %txt /tests/golden/types-import-sur/tokens/txt
1593−/* src-464 %jibb /tests/golden/types-import-sur-record-graph/source/jibb
1593+/* tre-464 %txt /tests/golden/types-import-sur/tree/txt
1594−/* tok-464 %txt /tests/golden/types-import-sur-record-graph/tokens/txt
1594+/* typ-464 %txt /tests/golden/types-import-sur/types/txt
1595−/* tre-464 %txt /tests/golden/types-import-sur-record-graph/tree/txt
1595+/* imp-464-1 %txt /tests/golden/types-import-sur/sur/fixture/txt
1596−/* mod-464-1 %jibb /tests/golden/types-import-sur-record-graph/modules/ui/lib/jibb
1596+/* imp-464-2 %txt /tests/golden/types-import-sur/sur/fixture/txt
1597−/* typ-464 %txt /tests/golden/types-import-sur-record-graph/types/txt
1597+/* src-465 %jibb /tests/golden/types-import-sur-record-graph/source/jibb
1598−/* imp-464-1 %txt /tests/golden/types-import-sur-record-graph/sur/fixture/txt
1598+/* tok-465 %txt /tests/golden/types-import-sur-record-graph/tokens/txt
1599−/* mtre-464 %txt /tests/golden/types-import-sur-record-graph/module-trees/txt
1599+/* tre-465 %txt /tests/golden/types-import-sur-record-graph/tree/txt
1600−/* src-465 %jibb /tests/golden/types-import-tlon-notes/source/jibb
1600+/* mod-465-1 %jibb /tests/golden/types-import-sur-record-graph/modules/ui/lib/jibb
1601−/* tok-465 %txt /tests/golden/types-import-tlon-notes/tokens/txt
1601+/* typ-465 %txt /tests/golden/types-import-sur-record-graph/types/txt
1602−/* tre-465 %txt /tests/golden/types-import-tlon-notes/tree/txt
1602+/* imp-465-1 %txt /tests/golden/types-import-sur-record-graph/sur/fixture/txt
1603−/* typ-465 %txt /tests/golden/types-import-tlon-notes/types/txt
1603+/* mtre-465 %txt /tests/golden/types-import-sur-record-graph/module-trees/txt
1604−/* imp-465-1 %txt /tests/golden/types-import-tlon-notes/sur/notes/txt
1604+/* src-466 %jibb /tests/golden/types-import-tlon-notes/source/jibb
1605−/* imp-465-2 %txt /tests/golden/types-import-tlon-notes/sur/notes/txt
1605+/* tok-466 %txt /tests/golden/types-import-tlon-notes/tokens/txt
1606−/* imp-465-3 %txt /tests/golden/types-import-tlon-notes/sur/notes/txt
1606+/* tre-466 %txt /tests/golden/types-import-tlon-notes/tree/txt
1607−/* imp-465-4 %txt /tests/golden/types-import-tlon-notes/sur/notes/txt
1607+/* typ-466 %txt /tests/golden/types-import-tlon-notes/types/txt
1608−/* imp-465-5 %txt /tests/golden/types-import-tlon-notes/sur/notes/txt
1608+/* imp-466-1 %txt /tests/golden/types-import-tlon-notes/sur/notes/txt
1609−/* imp-465-6 %txt /tests/golden/types-import-tlon-notes/sur/notes/txt
1609+/* imp-466-2 %txt /tests/golden/types-import-tlon-notes/sur/notes/txt
1610−/* imp-465-7 %txt /tests/golden/types-import-tlon-notes/sur/notes/txt
1610+/* imp-466-3 %txt /tests/golden/types-import-tlon-notes/sur/notes/txt
1611−/* src-466 %jibb /tests/golden/types-list-branch/source/jibb
1611+/* imp-466-4 %txt /tests/golden/types-import-tlon-notes/sur/notes/txt
1612−/* tok-466 %txt /tests/golden/types-list-branch/tokens/txt
1612+/* imp-466-5 %txt /tests/golden/types-import-tlon-notes/sur/notes/txt
1613−/* tre-466 %txt /tests/golden/types-list-branch/tree/txt
1613+/* imp-466-6 %txt /tests/golden/types-import-tlon-notes/sur/notes/txt
1614−/* typ-466 %txt /tests/golden/types-list-branch/types/txt
1614+/* imp-466-7 %txt /tests/golden/types-import-tlon-notes/sur/notes/txt
1615−/* src-467 %jibb /tests/golden/types-list-cons/source/jibb
1615+/* src-467 %jibb /tests/golden/types-list-branch/source/jibb
1616−/* tok-467 %txt /tests/golden/types-list-cons/tokens/txt
1616+/* tok-467 %txt /tests/golden/types-list-branch/tokens/txt
1617−/* tre-467 %txt /tests/golden/types-list-cons/tree/txt
1617+/* tre-467 %txt /tests/golden/types-list-branch/tree/txt
1618−/* typ-467 %txt /tests/golden/types-list-cons/types/txt
1618+/* typ-467 %txt /tests/golden/types-list-branch/types/txt
1619−/* src-468 %jibb /tests/golden/types-list-context/source/jibb
1619+/* src-468 %jibb /tests/golden/types-list-cons/source/jibb
1620−/* tok-468 %txt /tests/golden/types-list-context/tokens/txt
1620+/* tok-468 %txt /tests/golden/types-list-cons/tokens/txt
1621−/* tre-468 %txt /tests/golden/types-list-context/tree/txt
1621+/* tre-468 %txt /tests/golden/types-list-cons/tree/txt
1622−/* typ-468 %txt /tests/golden/types-list-context/types/txt
1622+/* typ-468 %txt /tests/golden/types-list-cons/types/txt
1623−/* src-469 %jibb /tests/golden/types-list-imported/source/jibb
1623+/* src-469 %jibb /tests/golden/types-list-context/source/jibb
1624−/* tok-469 %txt /tests/golden/types-list-imported/tokens/txt
1624+/* tok-469 %txt /tests/golden/types-list-context/tokens/txt
1625−/* tre-469 %txt /tests/golden/types-list-imported/tree/txt
1625+/* tre-469 %txt /tests/golden/types-list-context/tree/txt
1626−/* typ-469 %txt /tests/golden/types-list-imported/types/txt
1626+/* typ-469 %txt /tests/golden/types-list-context/types/txt
1627−/* imp-469-1 %txt /tests/golden/types-list-imported/sur/fixture/txt
1627+/* src-470 %jibb /tests/golden/types-list-imported/source/jibb
1628−/* imp-469-2 %txt /tests/golden/types-list-imported/sur/fixture/txt
1628+/* tok-470 %txt /tests/golden/types-list-imported/tokens/txt
1629−/* src-470 %jibb /tests/golden/types-list-open/source/jibb
1629+/* tre-470 %txt /tests/golden/types-list-imported/tree/txt
1630−/* tok-470 %txt /tests/golden/types-list-open/tokens/txt
1630+/* typ-470 %txt /tests/golden/types-list-imported/types/txt
1631−/* tre-470 %txt /tests/golden/types-list-open/tree/txt
1631+/* imp-470-1 %txt /tests/golden/types-list-imported/sur/fixture/txt
1632−/* typ-470 %txt /tests/golden/types-list-open/types/txt
1632+/* imp-470-2 %txt /tests/golden/types-list-imported/sur/fixture/txt
1633−/* src-471 %jibb /tests/golden/types-list-open-constraints/source/jibb
1633+/* src-471 %jibb /tests/golden/types-list-open/source/jibb
1634−/* tok-471 %txt /tests/golden/types-list-open-constraints/tokens/txt
1634+/* tok-471 %txt /tests/golden/types-list-open/tokens/txt
1635−/* tre-471 %txt /tests/golden/types-list-open-constraints/tree/txt
1635+/* tre-471 %txt /tests/golden/types-list-open/tree/txt
1636−/* typ-471 %txt /tests/golden/types-list-open-constraints/types/txt
1636+/* typ-471 %txt /tests/golden/types-list-open/types/txt
1637−/* src-472 %jibb /tests/golden/types-list-pattern-imported/source/jibb
1637+/* src-472 %jibb /tests/golden/types-list-open-constraints/source/jibb
1638−/* tok-472 %txt /tests/golden/types-list-pattern-imported/tokens/txt
1638+/* tok-472 %txt /tests/golden/types-list-open-constraints/tokens/txt
1639−/* tre-472 %txt /tests/golden/types-list-pattern-imported/tree/txt
1639+/* tre-472 %txt /tests/golden/types-list-open-constraints/tree/txt
1640−/* typ-472 %txt /tests/golden/types-list-pattern-imported/types/txt
1640+/* typ-472 %txt /tests/golden/types-list-open-constraints/types/txt
1641−/* imp-472-1 %txt /tests/golden/types-list-pattern-imported/sur/fixture/txt
1641+/* src-473 %jibb /tests/golden/types-list-pattern-imported/source/jibb
1642−/* imp-472-2 %txt /tests/golden/types-list-pattern-imported/sur/fixture/txt
1642+/* tok-473 %txt /tests/golden/types-list-pattern-imported/tokens/txt
1643−/* src-473 %jibb /tests/golden/types-list-patterns/source/jibb
1643+/* tre-473 %txt /tests/golden/types-list-pattern-imported/tree/txt
1644−/* tok-473 %txt /tests/golden/types-list-patterns/tokens/txt
1644+/* typ-473 %txt /tests/golden/types-list-pattern-imported/types/txt
1645−/* tre-473 %txt /tests/golden/types-list-patterns/tree/txt
1645+/* imp-473-1 %txt /tests/golden/types-list-pattern-imported/sur/fixture/txt
1646−/* typ-473 %txt /tests/golden/types-list-patterns/types/txt
1646+/* imp-473-2 %txt /tests/golden/types-list-pattern-imported/sur/fixture/txt
1647−/* src-474 %jibb /tests/golden/types-list-zero-fit/source/jibb
1647+/* src-474 %jibb /tests/golden/types-list-patterns/source/jibb
1648−/* tok-474 %txt /tests/golden/types-list-zero-fit/tokens/txt
1648+/* tok-474 %txt /tests/golden/types-list-patterns/tokens/txt
1649−/* tre-474 %txt /tests/golden/types-list-zero-fit/tree/txt
1649+/* tre-474 %txt /tests/golden/types-list-patterns/tree/txt
1650−/* typ-474 %txt /tests/golden/types-list-zero-fit/types/txt
1650+/* typ-474 %txt /tests/golden/types-list-patterns/types/txt
1651−/* src-475 %jibb /tests/golden/types-literal-constructor-nouns/source/jibb
1651+/* src-475 %jibb /tests/golden/types-list-zero-fit/source/jibb
1652−/* tok-475 %txt /tests/golden/types-literal-constructor-nouns/tokens/txt
1652+/* tok-475 %txt /tests/golden/types-list-zero-fit/tokens/txt
1653−/* tre-475 %txt /tests/golden/types-literal-constructor-nouns/tree/txt
1653+/* tre-475 %txt /tests/golden/types-list-zero-fit/tree/txt
1654−/* typ-475 %txt /tests/golden/types-literal-constructor-nouns/types/txt
1654+/* typ-475 %txt /tests/golden/types-list-zero-fit/types/txt
1655−/* src-476 %jibb /tests/golden/types-local-capitals/source/jibb
1655+/* src-476 %jibb /tests/golden/types-literal-constructor-nouns/source/jibb
1656−/* tok-476 %txt /tests/golden/types-local-capitals/tokens/txt
1656+/* tok-476 %txt /tests/golden/types-literal-constructor-nouns/tokens/txt
1657−/* tre-476 %txt /tests/golden/types-local-capitals/tree/txt
1657+/* tre-476 %txt /tests/golden/types-literal-constructor-nouns/tree/txt
1658−/* typ-476 %txt /tests/golden/types-local-capitals/types/txt
1658+/* typ-476 %txt /tests/golden/types-literal-constructor-nouns/types/txt
1659−/* src-477 %jibb /tests/golden/types-local-recursive/source/jibb
1659+/* src-477 %jibb /tests/golden/types-local-capitals/source/jibb
1660−/* tok-477 %txt /tests/golden/types-local-recursive/tokens/txt
1660+/* tok-477 %txt /tests/golden/types-local-capitals/tokens/txt
1661−/* tre-477 %txt /tests/golden/types-local-recursive/tree/txt
1661+/* tre-477 %txt /tests/golden/types-local-capitals/tree/txt
1662−/* typ-477 %txt /tests/golden/types-local-recursive/types/txt
1662+/* typ-477 %txt /tests/golden/types-local-capitals/types/txt
1663−/* src-478 %jibb /tests/golden/types-local-scc/source/jibb
1663+/* src-478 %jibb /tests/golden/types-local-recursive/source/jibb
1664−/* tok-478 %txt /tests/golden/types-local-scc/tokens/txt
1664+/* tok-478 %txt /tests/golden/types-local-recursive/tokens/txt
1665−/* tre-478 %txt /tests/golden/types-local-scc/tree/txt
1665+/* tre-478 %txt /tests/golden/types-local-recursive/tree/txt
1666−/* typ-478 %txt /tests/golden/types-local-scc/types/txt
1666+/* typ-478 %txt /tests/golden/types-local-recursive/types/txt
1667−/* src-479 %jibb /tests/golden/types-local-scc-adversarial/source/jibb
1667+/* src-479 %jibb /tests/golden/types-local-scc/source/jibb
1668−/* tok-479 %txt /tests/golden/types-local-scc-adversarial/tokens/txt
1668+/* tok-479 %txt /tests/golden/types-local-scc/tokens/txt
1669−/* tre-479 %txt /tests/golden/types-local-scc-adversarial/tree/txt
1669+/* tre-479 %txt /tests/golden/types-local-scc/tree/txt
1670−/* typ-479 %txt /tests/golden/types-local-scc-adversarial/types/txt
1670+/* typ-479 %txt /tests/golden/types-local-scc/types/txt
1671−/* src-480 %jibb /tests/golden/types-loobean-singleton-source/source/jibb
1671+/* src-480 %jibb /tests/golden/types-local-scc-adversarial/source/jibb
1672−/* tok-480 %txt /tests/golden/types-loobean-singleton-source/tokens/txt
1672+/* tok-480 %txt /tests/golden/types-local-scc-adversarial/tokens/txt
1673−/* tre-480 %txt /tests/golden/types-loobean-singleton-source/tree/txt
1673+/* tre-480 %txt /tests/golden/types-local-scc-adversarial/tree/txt
1674−/* typ-480 %txt /tests/golden/types-loobean-singleton-source/types/txt
1674+/* typ-480 %txt /tests/golden/types-local-scc-adversarial/types/txt
1675−/* src-481 %jibb /tests/golden/types-loobean-union-context/source/jibb
1675+/* src-481 %jibb /tests/golden/types-loobean-singleton-source/source/jibb
1676−/* tok-481 %txt /tests/golden/types-loobean-union-context/tokens/txt
1676+/* tok-481 %txt /tests/golden/types-loobean-singleton-source/tokens/txt
1677−/* tre-481 %txt /tests/golden/types-loobean-union-context/tree/txt
1677+/* tre-481 %txt /tests/golden/types-loobean-singleton-source/tree/txt
1678−/* typ-481 %txt /tests/golden/types-loobean-union-context/types/txt
1678+/* typ-481 %txt /tests/golden/types-loobean-singleton-source/types/txt
1679−/* src-482 %jibb /tests/golden/types-missing-tag-context/source/jibb
1679+/* src-482 %jibb /tests/golden/types-loobean-union-context/source/jibb
1680−/* tok-482 %txt /tests/golden/types-missing-tag-context/tokens/txt
1680+/* tok-482 %txt /tests/golden/types-loobean-union-context/tokens/txt
1681−/* tre-482 %txt /tests/golden/types-missing-tag-context/tree/txt
1681+/* tre-482 %txt /tests/golden/types-loobean-union-context/tree/txt
1682−/* typ-482 %txt /tests/golden/types-missing-tag-context/types/txt
1682+/* typ-482 %txt /tests/golden/types-loobean-union-context/types/txt
1683−/* src-483 %jibb /tests/golden/types-missing-tag-imported/source/jibb
1683+/* src-483 %jibb /tests/golden/types-missing-tag-context/source/jibb
1684−/* tok-483 %txt /tests/golden/types-missing-tag-imported/tokens/txt
1684+/* tok-483 %txt /tests/golden/types-missing-tag-context/tokens/txt
1685−/* tre-483 %txt /tests/golden/types-missing-tag-imported/tree/txt
1685+/* tre-483 %txt /tests/golden/types-missing-tag-context/tree/txt
1686−/* typ-483 %txt /tests/golden/types-missing-tag-imported/types/txt
1686+/* typ-483 %txt /tests/golden/types-missing-tag-context/types/txt
1687−/* imp-483-1 %txt /tests/golden/types-missing-tag-imported/sur/fixture/txt
1687+/* src-484 %jibb /tests/golden/types-missing-tag-imported/source/jibb
1688−/* imp-483-2 %txt /tests/golden/types-missing-tag-imported/sur/fixture/txt
1688+/* tok-484 %txt /tests/golden/types-missing-tag-imported/tokens/txt
1689−/* src-484 %jibb /tests/golden/types-missing-tag-named/source/jibb
1689+/* tre-484 %txt /tests/golden/types-missing-tag-imported/tree/txt
1690−/* tok-484 %txt /tests/golden/types-missing-tag-named/tokens/txt
1690+/* typ-484 %txt /tests/golden/types-missing-tag-imported/types/txt
1691−/* tre-484 %txt /tests/golden/types-missing-tag-named/tree/txt
1691+/* imp-484-1 %txt /tests/golden/types-missing-tag-imported/sur/fixture/txt
1692−/* typ-484 %txt /tests/golden/types-missing-tag-named/types/txt
1692+/* imp-484-2 %txt /tests/golden/types-missing-tag-imported/sur/fixture/txt
1693−/* src-485 %jibb /tests/golden/types-module-field-duplicate/source/jibb
1693+/* src-485 %jibb /tests/golden/types-missing-tag-named/source/jibb
1694−/* tok-485 %txt /tests/golden/types-module-field-duplicate/tokens/txt
1694+/* tok-485 %txt /tests/golden/types-missing-tag-named/tokens/txt
1695−/* tre-485 %txt /tests/golden/types-module-field-duplicate/tree/txt
1695+/* tre-485 %txt /tests/golden/types-missing-tag-named/tree/txt
1696−/* mod-485-1 %jibb /tests/golden/types-module-field-duplicate/modules/ui/lib/jibb
1696+/* typ-485 %txt /tests/golden/types-missing-tag-named/types/txt
1697−/* typ-485 %txt /tests/golden/types-module-field-duplicate/types/txt
1697+/* src-486 %jibb /tests/golden/types-module-field-duplicate/source/jibb
1698−/* mtre-485 %txt /tests/golden/types-module-field-duplicate/module-trees/txt
1698+/* tok-486 %txt /tests/golden/types-module-field-duplicate/tokens/txt
1699−/* src-486 %jibb /tests/golden/types-module-field-nonrecord/source/jibb
1699+/* tre-486 %txt /tests/golden/types-module-field-duplicate/tree/txt
1700−/* tok-486 %txt /tests/golden/types-module-field-nonrecord/tokens/txt
1700+/* mod-486-1 %jibb /tests/golden/types-module-field-duplicate/modules/ui/lib/jibb
1701−/* tre-486 %txt /tests/golden/types-module-field-nonrecord/tree/txt
1701+/* typ-486 %txt /tests/golden/types-module-field-duplicate/types/txt
1702−/* mod-486-1 %jibb /tests/golden/types-module-field-nonrecord/modules/ui/lib/jibb
1702+/* mtre-486 %txt /tests/golden/types-module-field-duplicate/module-trees/txt
1703−/* typ-486 %txt /tests/golden/types-module-field-nonrecord/types/txt
1703+/* src-487 %jibb /tests/golden/types-module-field-nonrecord/source/jibb
1704−/* mtre-486 %txt /tests/golden/types-module-field-nonrecord/module-trees/txt
1704+/* tok-487 %txt /tests/golden/types-module-field-nonrecord/tokens/txt
1705−/* src-487 %jibb /tests/golden/types-module-field-path/source/jibb
1705+/* tre-487 %txt /tests/golden/types-module-field-nonrecord/tree/txt
1706−/* tok-487 %txt /tests/golden/types-module-field-path/tokens/txt
1706+/* mod-487-1 %jibb /tests/golden/types-module-field-nonrecord/modules/ui/lib/jibb
1707−/* tre-487 %txt /tests/golden/types-module-field-path/tree/txt
1707+/* typ-487 %txt /tests/golden/types-module-field-nonrecord/types/txt
1708−/* mod-487-1 %jibb /tests/golden/types-module-field-path/modules/ui/lib/jibb
1708+/* mtre-487 %txt /tests/golden/types-module-field-nonrecord/module-trees/txt
1709−/* typ-487 %txt /tests/golden/types-module-field-path/types/txt
1709+/* src-488 %jibb /tests/golden/types-module-field-path/source/jibb
1710−/* mtre-487 %txt /tests/golden/types-module-field-path/module-trees/txt
1710+/* tok-488 %txt /tests/golden/types-module-field-path/tokens/txt
1711−/* src-488 %jibb /tests/golden/types-module-field-shadow/source/jibb
1711+/* tre-488 %txt /tests/golden/types-module-field-path/tree/txt
1712−/* tok-488 %txt /tests/golden/types-module-field-shadow/tokens/txt
1712+/* mod-488-1 %jibb /tests/golden/types-module-field-path/modules/ui/lib/jibb
1713−/* tre-488 %txt /tests/golden/types-module-field-shadow/tree/txt
1713+/* typ-488 %txt /tests/golden/types-module-field-path/types/txt
1714−/* mod-488-1 %jibb /tests/golden/types-module-field-shadow/modules/ui/lib/jibb
1714+/* mtre-488 %txt /tests/golden/types-module-field-path/module-trees/txt
1715−/* typ-488 %txt /tests/golden/types-module-field-shadow/types/txt
1715+/* src-489 %jibb /tests/golden/types-module-field-shadow/source/jibb
1716−/* mtre-488 %txt /tests/golden/types-module-field-shadow/module-trees/txt
1716+/* tok-489 %txt /tests/golden/types-module-field-shadow/tokens/txt
1717−/* src-489 %jibb /tests/golden/types-module-fixtures/source/jibb
1717+/* tre-489 %txt /tests/golden/types-module-field-shadow/tree/txt
1718−/* tok-489 %txt /tests/golden/types-module-fixtures/tokens/txt
1718+/* mod-489-1 %jibb /tests/golden/types-module-field-shadow/modules/ui/lib/jibb
1719−/* tre-489 %txt /tests/golden/types-module-fixtures/tree/txt
1719+/* typ-489 %txt /tests/golden/types-module-field-shadow/types/txt
1720−/* mod-489-1 %jibb /tests/golden/types-module-fixtures/modules/ui/api/blog/jibb
1720+/* mtre-489 %txt /tests/golden/types-module-field-shadow/module-trees/txt
1721−/* mod-489-2 %jibb /tests/golden/types-module-fixtures/modules/ui/components/card/jibb
1721+/* src-490 %jibb /tests/golden/types-module-fixtures/source/jibb
1722−/* typ-489 %txt /tests/golden/types-module-fixtures/types/txt
1722+/* tok-490 %txt /tests/golden/types-module-fixtures/tokens/txt
1723−/* mtre-489 %txt /tests/golden/types-module-fixtures/module-trees/txt
1723+/* tre-490 %txt /tests/golden/types-module-fixtures/tree/txt
1724−/* src-490 %jibb /tests/golden/types-module-mixed/source/jibb
1724+/* mod-490-1 %jibb /tests/golden/types-module-fixtures/modules/ui/api/blog/jibb
1725−/* tok-490 %txt /tests/golden/types-module-mixed/tokens/txt
1725+/* mod-490-2 %jibb /tests/golden/types-module-fixtures/modules/ui/components/card/jibb
1726−/* tre-490 %txt /tests/golden/types-module-mixed/tree/txt
1726+/* typ-490 %txt /tests/golden/types-module-fixtures/types/txt
1727−/* mod-490-1 %jibb /tests/golden/types-module-mixed/modules/ui/helper/jibb
1727+/* mtre-490 %txt /tests/golden/types-module-fixtures/module-trees/txt
1728−/* typ-490 %txt /tests/golden/types-module-mixed/types/txt
1728+/* src-491 %jibb /tests/golden/types-module-mixed/source/jibb
1729−/* imp-490-1 %txt /tests/golden/types-module-mixed/sur/fixture/txt
1729+/* tok-491 %txt /tests/golden/types-module-mixed/tokens/txt
1730−/* mark-490-1 %txt /tests/golden/types-module-mixed/mar/label/txt
1730+/* tre-491 %txt /tests/golden/types-module-mixed/tree/txt
1731−/* mtre-490 %txt /tests/golden/types-module-mixed/module-trees/txt
1731+/* mod-491-1 %jibb /tests/golden/types-module-mixed/modules/ui/helper/jibb
1732−/* src-491 %jibb /tests/golden/types-multi-call/source/jibb
1732+/* typ-491 %txt /tests/golden/types-module-mixed/types/txt
1733−/* tok-491 %txt /tests/golden/types-multi-call/tokens/txt
1733+/* imp-491-1 %txt /tests/golden/types-module-mixed/sur/fixture/txt
1734−/* tre-491 %txt /tests/golden/types-multi-call/tree/txt
1734+/* mark-491-1 %txt /tests/golden/types-module-mixed/mar/label/txt
1735−/* typ-491 %txt /tests/golden/types-multi-call/types/txt
1735+/* mtre-491 %txt /tests/golden/types-module-mixed/module-trees/txt
1736−/* src-492 %jibb /tests/golden/types-multi-import/source/jibb
1736+/* src-492 %jibb /tests/golden/types-multi-call/source/jibb
1737−/* tok-492 %txt /tests/golden/types-multi-import/tokens/txt
1737+/* tok-492 %txt /tests/golden/types-multi-call/tokens/txt
1738−/* tre-492 %txt /tests/golden/types-multi-import/tree/txt
1738+/* tre-492 %txt /tests/golden/types-multi-call/tree/txt
1739−/* mod-492-1 %jibb /tests/golden/types-multi-import/modules/ui/lib/jibb
1739+/* typ-492 %txt /tests/golden/types-multi-call/types/txt
1740−/* typ-492 %txt /tests/golden/types-multi-import/types/txt
1740+/* src-493 %jibb /tests/golden/types-multi-import/source/jibb
1741−/* mtre-492 %txt /tests/golden/types-multi-import/module-trees/txt
1741+/* tok-493 %txt /tests/golden/types-multi-import/tokens/txt
1742−/* src-493 %jibb /tests/golden/types-nested-missing-tag/source/jibb
1742+/* tre-493 %txt /tests/golden/types-multi-import/tree/txt
1743−/* tok-493 %txt /tests/golden/types-nested-missing-tag/tokens/txt
1743+/* mod-493-1 %jibb /tests/golden/types-multi-import/modules/ui/lib/jibb
1744−/* tre-493 %txt /tests/golden/types-nested-missing-tag/tree/txt
1744+/* typ-493 %txt /tests/golden/types-multi-import/types/txt
1745−/* typ-493 %txt /tests/golden/types-nested-missing-tag/types/txt
1745+/* mtre-493 %txt /tests/golden/types-multi-import/module-trees/txt
1746−/* src-494 %jibb /tests/golden/types-nested-noun-context/source/jibb
1746+/* src-494 %jibb /tests/golden/types-nested-missing-tag/source/jibb
1747−/* tok-494 %txt /tests/golden/types-nested-noun-context/tokens/txt
1747+/* tok-494 %txt /tests/golden/types-nested-missing-tag/tokens/txt
1748−/* tre-494 %txt /tests/golden/types-nested-noun-context/tree/txt
1748+/* tre-494 %txt /tests/golden/types-nested-missing-tag/tree/txt
1749−/* typ-494 %txt /tests/golden/types-nested-noun-context/types/txt
1749+/* typ-494 %txt /tests/golden/types-nested-missing-tag/types/txt
1750−/* src-495 %jibb /tests/golden/types-nested-shallow-preserve/source/jibb
1750+/* src-495 %jibb /tests/golden/types-nested-noun-context/source/jibb
1751−/* tok-495 %txt /tests/golden/types-nested-shallow-preserve/tokens/txt
1751+/* tok-495 %txt /tests/golden/types-nested-noun-context/tokens/txt
1752−/* tre-495 %txt /tests/golden/types-nested-shallow-preserve/tree/txt
1752+/* tre-495 %txt /tests/golden/types-nested-noun-context/tree/txt
1753−/* typ-495 %txt /tests/golden/types-nested-shallow-preserve/types/txt
1753+/* typ-495 %txt /tests/golden/types-nested-noun-context/types/txt
1754−/* src-496 %jibb /tests/golden/types-nested-union-context/source/jibb
1754+/* src-496 %jibb /tests/golden/types-nested-shallow-preserve/source/jibb
1755−/* tok-496 %txt /tests/golden/types-nested-union-context/tokens/txt
1755+/* tok-496 %txt /tests/golden/types-nested-shallow-preserve/tokens/txt
1756−/* tre-496 %txt /tests/golden/types-nested-union-context/tree/txt
1756+/* tre-496 %txt /tests/golden/types-nested-shallow-preserve/tree/txt
1757−/* typ-496 %txt /tests/golden/types-nested-union-context/types/txt
1757+/* typ-496 %txt /tests/golden/types-nested-shallow-preserve/types/txt
1758−/* src-497 %jibb /tests/golden/types-null-context/source/jibb
1758+/* src-497 %jibb /tests/golden/types-nested-union-context/source/jibb
1759−/* tok-497 %txt /tests/golden/types-null-context/tokens/txt
1759+/* tok-497 %txt /tests/golden/types-nested-union-context/tokens/txt
1760−/* tre-497 %txt /tests/golden/types-null-context/tree/txt
1760+/* tre-497 %txt /tests/golden/types-nested-union-context/tree/txt
1761−/* typ-497 %txt /tests/golden/types-null-context/types/txt
1761+/* typ-497 %txt /tests/golden/types-nested-union-context/types/txt
1762−/* src-498 %jibb /tests/golden/types-null-overlap/source/jibb
1762+/* src-498 %jibb /tests/golden/types-null-context/source/jibb
1763−/* tok-498 %txt /tests/golden/types-null-overlap/tokens/txt
1763+/* tok-498 %txt /tests/golden/types-null-context/tokens/txt
1764−/* tre-498 %txt /tests/golden/types-null-overlap/tree/txt
1764+/* tre-498 %txt /tests/golden/types-null-context/tree/txt
1765−/* typ-498 %txt /tests/golden/types-null-overlap/types/txt
1765+/* typ-498 %txt /tests/golden/types-null-context/types/txt
1766−/* src-499 %jibb /tests/golden/types-null-unresolved/source/jibb
1766+/* src-499 %jibb /tests/golden/types-null-overlap/source/jibb
1767−/* tok-499 %txt /tests/golden/types-null-unresolved/tokens/txt
1767+/* tok-499 %txt /tests/golden/types-null-overlap/tokens/txt
1768−/* tre-499 %txt /tests/golden/types-null-unresolved/tree/txt
1768+/* tre-499 %txt /tests/golden/types-null-overlap/tree/txt
1769−/* typ-499 %txt /tests/golden/types-null-unresolved/types/txt
1769+/* typ-499 %txt /tests/golden/types-null-overlap/types/txt
1770−/* src-500 %jibb /tests/golden/types-pair-context/source/jibb
1770+/* src-500 %jibb /tests/golden/types-null-unresolved/source/jibb
1771−/* tok-500 %txt /tests/golden/types-pair-context/tokens/txt
1771+/* tok-500 %txt /tests/golden/types-null-unresolved/tokens/txt
1772−/* tre-500 %txt /tests/golden/types-pair-context/tree/txt
1772+/* tre-500 %txt /tests/golden/types-null-unresolved/tree/txt
1773−/* typ-500 %txt /tests/golden/types-pair-context/types/txt
1773+/* typ-500 %txt /tests/golden/types-null-unresolved/types/txt
1774−/* src-501 %jibb /tests/golden/types-partial-apply/source/jibb
1774+/* src-501 %jibb /tests/golden/types-pair-context/source/jibb
1775−/* tok-501 %txt /tests/golden/types-partial-apply/tokens/txt
1775+/* tok-501 %txt /tests/golden/types-pair-context/tokens/txt
1776−/* tre-501 %txt /tests/golden/types-partial-apply/tree/txt
1776+/* tre-501 %txt /tests/golden/types-pair-context/tree/txt
1777−/* typ-501 %txt /tests/golden/types-partial-apply/types/txt
1777+/* typ-501 %txt /tests/golden/types-pair-context/types/txt
1778−/* src-502 %jibb /tests/golden/types-partial-atom-alias/source/jibb
1778+/* src-502 %jibb /tests/golden/types-partial-apply/source/jibb
1779−/* tok-502 %txt /tests/golden/types-partial-atom-alias/tokens/txt
1779+/* tok-502 %txt /tests/golden/types-partial-apply/tokens/txt
1780−/* tre-502 %txt /tests/golden/types-partial-atom-alias/tree/txt
1780+/* tre-502 %txt /tests/golden/types-partial-apply/tree/txt
1781−/* typ-502 %txt /tests/golden/types-partial-atom-alias/types/txt
1781+/* typ-502 %txt /tests/golden/types-partial-apply/types/txt
1782−/* src-503 %jibb /tests/golden/types-partial-atom-constraint/source/jibb
1782+/* src-503 %jibb /tests/golden/types-partial-atom-alias/source/jibb
1783−/* tok-503 %txt /tests/golden/types-partial-atom-constraint/tokens/txt
1783+/* tok-503 %txt /tests/golden/types-partial-atom-alias/tokens/txt
1784−/* tre-503 %txt /tests/golden/types-partial-atom-constraint/tree/txt
1784+/* tre-503 %txt /tests/golden/types-partial-atom-alias/tree/txt
1785−/* typ-503 %txt /tests/golden/types-partial-atom-constraint/types/txt
1785+/* typ-503 %txt /tests/golden/types-partial-atom-alias/types/txt
1786−/* src-504 %jibb /tests/golden/types-partial-atom-widening/source/jibb
1786+/* src-504 %jibb /tests/golden/types-partial-atom-constraint/source/jibb
1787−/* tok-504 %txt /tests/golden/types-partial-atom-widening/tokens/txt
1787+/* tok-504 %txt /tests/golden/types-partial-atom-constraint/tokens/txt
1788−/* tre-504 %txt /tests/golden/types-partial-atom-widening/tree/txt
1788+/* tre-504 %txt /tests/golden/types-partial-atom-constraint/tree/txt
1789−/* typ-504 %txt /tests/golden/types-partial-atom-widening/types/txt
1789+/* typ-504 %txt /tests/golden/types-partial-atom-constraint/types/txt
1790−/* src-505 %jibb /tests/golden/types-partial-aura/source/jibb
1790+/* src-505 %jibb /tests/golden/types-partial-atom-widening/source/jibb
1791−/* tok-505 %txt /tests/golden/types-partial-aura/tokens/txt
1791+/* tok-505 %txt /tests/golden/types-partial-atom-widening/tokens/txt
1792−/* tre-505 %txt /tests/golden/types-partial-aura/tree/txt
1792+/* tre-505 %txt /tests/golden/types-partial-atom-widening/tree/txt
1793−/* typ-505 %txt /tests/golden/types-partial-aura/types/txt
1793+/* typ-505 %txt /tests/golden/types-partial-atom-widening/types/txt
1794−/* src-506 %jibb /tests/golden/types-partial-aura-family/source/jibb
1794+/* src-506 %jibb /tests/golden/types-partial-aura/source/jibb
1795−/* tok-506 %txt /tests/golden/types-partial-aura-family/tokens/txt
1795+/* tok-506 %txt /tests/golden/types-partial-aura/tokens/txt
1796−/* tre-506 %txt /tests/golden/types-partial-aura-family/tree/txt
1796+/* tre-506 %txt /tests/golden/types-partial-aura/tree/txt
1797−/* typ-506 %txt /tests/golden/types-partial-aura-family/types/txt
1797+/* typ-506 %txt /tests/golden/types-partial-aura/types/txt
1798−/* src-507 %jibb /tests/golden/types-partial-aura-generalization/source/jibb
1798+/* src-507 %jibb /tests/golden/types-partial-aura-family/source/jibb
1799−/* tok-507 %txt /tests/golden/types-partial-aura-generalization/tokens/txt
1799+/* tok-507 %txt /tests/golden/types-partial-aura-family/tokens/txt
1800−/* tre-507 %txt /tests/golden/types-partial-aura-generalization/tree/txt
1800+/* tre-507 %txt /tests/golden/types-partial-aura-family/tree/txt
1801−/* typ-507 %txt /tests/golden/types-partial-aura-generalization/types/txt
1801+/* typ-507 %txt /tests/golden/types-partial-aura-family/types/txt
1802−/* src-508 %jibb /tests/golden/types-partial-bare-atom/source/jibb
1802+/* src-508 %jibb /tests/golden/types-partial-aura-generalization/source/jibb
1803−/* tok-508 %txt /tests/golden/types-partial-bare-atom/tokens/txt
1803+/* tok-508 %txt /tests/golden/types-partial-aura-generalization/tokens/txt
1804−/* tre-508 %txt /tests/golden/types-partial-bare-atom/tree/txt
1804+/* tre-508 %txt /tests/golden/types-partial-aura-generalization/tree/txt
1805−/* typ-508 %txt /tests/golden/types-partial-bare-atom/types/txt
1805+/* typ-508 %txt /tests/golden/types-partial-aura-generalization/types/txt
1806−/* src-509 %jibb /tests/golden/types-partial-branch-widening/source/jibb
1806+/* src-509 %jibb /tests/golden/types-partial-bare-atom/source/jibb
1807−/* tok-509 %txt /tests/golden/types-partial-branch-widening/tokens/txt
1807+/* tok-509 %txt /tests/golden/types-partial-bare-atom/tokens/txt
1808−/* tre-509 %txt /tests/golden/types-partial-branch-widening/tree/txt
1808+/* tre-509 %txt /tests/golden/types-partial-bare-atom/tree/txt
1809−/* typ-509 %txt /tests/golden/types-partial-branch-widening/types/txt
1809+/* typ-509 %txt /tests/golden/types-partial-bare-atom/types/txt
1810−/* src-510 %jibb /tests/golden/types-partial-conflicting-sites/source/jibb
1810+/* src-510 %jibb /tests/golden/types-partial-branch-widening/source/jibb
1811−/* tok-510 %txt /tests/golden/types-partial-conflicting-sites/tokens/txt
1811+/* tok-510 %txt /tests/golden/types-partial-branch-widening/tokens/txt
1812−/* tre-510 %txt /tests/golden/types-partial-conflicting-sites/tree/txt
1812+/* tre-510 %txt /tests/golden/types-partial-branch-widening/tree/txt
1813−/* typ-510 %txt /tests/golden/types-partial-conflicting-sites/types/txt
1813+/* typ-510 %txt /tests/golden/types-partial-branch-widening/types/txt
1814−/* src-511 %jibb /tests/golden/types-partial-decimal-default/source/jibb
1814+/* src-511 %jibb /tests/golden/types-partial-conflicting-sites/source/jibb
1815−/* tok-511 %txt /tests/golden/types-partial-decimal-default/tokens/txt
1815+/* tok-511 %txt /tests/golden/types-partial-conflicting-sites/tokens/txt
1816−/* tre-511 %txt /tests/golden/types-partial-decimal-default/tree/txt
1816+/* tre-511 %txt /tests/golden/types-partial-conflicting-sites/tree/txt
1817−/* typ-511 %txt /tests/golden/types-partial-decimal-default/types/txt
1817+/* typ-511 %txt /tests/golden/types-partial-conflicting-sites/types/txt
1818−/* src-512 %jibb /tests/golden/types-partial-dependency-chain/source/jibb
1818+/* src-512 %jibb /tests/golden/types-partial-decimal-default/source/jibb
1819−/* tok-512 %txt /tests/golden/types-partial-dependency-chain/tokens/txt
1819+/* tok-512 %txt /tests/golden/types-partial-decimal-default/tokens/txt
1820−/* tre-512 %txt /tests/golden/types-partial-dependency-chain/tree/txt
1820+/* tre-512 %txt /tests/golden/types-partial-decimal-default/tree/txt
1821−/* typ-512 %txt /tests/golden/types-partial-dependency-chain/types/txt
1821+/* typ-512 %txt /tests/golden/types-partial-decimal-default/types/txt
1822−/* src-513 %jibb /tests/golden/types-partial-explicit-capital/source/jibb
1822+/* src-513 %jibb /tests/golden/types-partial-dependency-chain/source/jibb
1823−/* tok-513 %txt /tests/golden/types-partial-explicit-capital/tokens/txt
1823+/* tok-513 %txt /tests/golden/types-partial-dependency-chain/tokens/txt
1824−/* tre-513 %txt /tests/golden/types-partial-explicit-capital/tree/txt
1824+/* tre-513 %txt /tests/golden/types-partial-dependency-chain/tree/txt
1825−/* typ-513 %txt /tests/golden/types-partial-explicit-capital/types/txt
1825+/* typ-513 %txt /tests/golden/types-partial-dependency-chain/types/txt
1826−/* src-514 %jibb /tests/golden/types-partial-forward/source/jibb
1826+/* src-514 %jibb /tests/golden/types-partial-explicit-capital/source/jibb
1827−/* tok-514 %txt /tests/golden/types-partial-forward/tokens/txt
1827+/* tok-514 %txt /tests/golden/types-partial-explicit-capital/tokens/txt
1828−/* tre-514 %txt /tests/golden/types-partial-forward/tree/txt
1828+/* tre-514 %txt /tests/golden/types-partial-explicit-capital/tree/txt
1829−/* typ-514 %txt /tests/golden/types-partial-forward/types/txt
1829+/* typ-514 %txt /tests/golden/types-partial-explicit-capital/types/txt
1830−/* src-515 %jibb /tests/golden/types-partial-generalization/source/jibb
1830+/* src-515 %jibb /tests/golden/types-partial-forward/source/jibb
1831−/* tok-515 %txt /tests/golden/types-partial-generalization/tokens/txt
1831+/* tok-515 %txt /tests/golden/types-partial-forward/tokens/txt
1832−/* tre-515 %txt /tests/golden/types-partial-generalization/tree/txt
1832+/* tre-515 %txt /tests/golden/types-partial-forward/tree/txt
1833−/* typ-515 %txt /tests/golden/types-partial-generalization/types/txt
1833+/* typ-515 %txt /tests/golden/types-partial-forward/types/txt
1834−/* src-516 %jibb /tests/golden/types-partial-identity/source/jibb
1834+/* src-516 %jibb /tests/golden/types-partial-generalization/source/jibb
1835−/* tok-516 %txt /tests/golden/types-partial-identity/tokens/txt
1835+/* tok-516 %txt /tests/golden/types-partial-generalization/tokens/txt
1836−/* tre-516 %txt /tests/golden/types-partial-identity/tree/txt
1836+/* tre-516 %txt /tests/golden/types-partial-generalization/tree/txt
1837−/* typ-516 %txt /tests/golden/types-partial-identity/types/txt
1837+/* typ-516 %txt /tests/golden/types-partial-generalization/types/txt
1838−/* src-517 %jibb /tests/golden/types-partial-independent-atoms/source/jibb
1838+/* src-517 %jibb /tests/golden/types-partial-identity/source/jibb
1839−/* tok-517 %txt /tests/golden/types-partial-independent-atoms/tokens/txt
1839+/* tok-517 %txt /tests/golden/types-partial-identity/tokens/txt
1840−/* tre-517 %txt /tests/golden/types-partial-independent-atoms/tree/txt
1840+/* tre-517 %txt /tests/golden/types-partial-identity/tree/txt
1841−/* typ-517 %txt /tests/golden/types-partial-independent-atoms/types/txt
1841+/* typ-517 %txt /tests/golden/types-partial-identity/types/txt
1842−/* src-518 %jibb /tests/golden/types-partial-local-molds/source/jibb
1842+/* src-518 %jibb /tests/golden/types-partial-independent-atoms/source/jibb
1843−/* tok-518 %txt /tests/golden/types-partial-local-molds/tokens/txt
1843+/* tok-518 %txt /tests/golden/types-partial-independent-atoms/tokens/txt
1844−/* tre-518 %txt /tests/golden/types-partial-local-molds/tree/txt
1844+/* tre-518 %txt /tests/golden/types-partial-independent-atoms/tree/txt
1845−/* typ-518 %txt /tests/golden/types-partial-local-molds/types/txt
1845+/* typ-518 %txt /tests/golden/types-partial-independent-atoms/types/txt
1846−/* src-519 %jibb /tests/golden/types-partial-locals/source/jibb
1846+/* src-519 %jibb /tests/golden/types-partial-local-molds/source/jibb
1847−/* tok-519 %txt /tests/golden/types-partial-locals/tokens/txt
1847+/* tok-519 %txt /tests/golden/types-partial-local-molds/tokens/txt
1848−/* tre-519 %txt /tests/golden/types-partial-locals/tree/txt
1848+/* tre-519 %txt /tests/golden/types-partial-local-molds/tree/txt
1849−/* typ-519 %txt /tests/golden/types-partial-locals/types/txt
1849+/* typ-519 %txt /tests/golden/types-partial-local-molds/types/txt
1850−/* src-520 %jibb /tests/golden/types-partial-many-atom-constraints/source/jibb
1850+/* src-520 %jibb /tests/golden/types-partial-locals/source/jibb
1851−/* tok-520 %txt /tests/golden/types-partial-many-atom-constraints/tokens/txt
1851+/* tok-520 %txt /tests/golden/types-partial-locals/tokens/txt
1852−/* tre-520 %txt /tests/golden/types-partial-many-atom-constraints/tree/txt
1852+/* tre-520 %txt /tests/golden/types-partial-locals/tree/txt
1853−/* typ-520 %txt /tests/golden/types-partial-many-atom-constraints/types/txt
1853+/* typ-520 %txt /tests/golden/types-partial-locals/types/txt
1854−/* src-521 %jibb /tests/golden/types-partial-mold-bare-aura/source/jibb
1854+/* src-521 %jibb /tests/golden/types-partial-many-atom-constraints/source/jibb
1855−/* tok-521 %txt /tests/golden/types-partial-mold-bare-aura/tokens/txt
1855+/* tok-521 %txt /tests/golden/types-partial-many-atom-constraints/tokens/txt
1856−/* tre-521 %txt /tests/golden/types-partial-mold-bare-aura/tree/txt
1856+/* tre-521 %txt /tests/golden/types-partial-many-atom-constraints/tree/txt
1857−/* typ-521 %txt /tests/golden/types-partial-mold-bare-aura/types/txt
1857+/* typ-521 %txt /tests/golden/types-partial-many-atom-constraints/types/txt
1858−/* src-522 %jibb /tests/golden/types-partial-mold-composite/source/jibb
1858+/* src-522 %jibb /tests/golden/types-partial-mold-bare-aura/source/jibb
1859−/* tok-522 %txt /tests/golden/types-partial-mold-composite/tokens/txt
1859+/* tok-522 %txt /tests/golden/types-partial-mold-bare-aura/tokens/txt
1860−/* tre-522 %txt /tests/golden/types-partial-mold-composite/tree/txt
1860+/* tre-522 %txt /tests/golden/types-partial-mold-bare-aura/tree/txt
1861−/* typ-522 %txt /tests/golden/types-partial-mold-composite/types/txt
1861+/* typ-522 %txt /tests/golden/types-partial-mold-bare-aura/types/txt
1862−/* src-523 %jibb /tests/golden/types-partial-mold-forward/source/jibb
1862+/* src-523 %jibb /tests/golden/types-partial-mold-composite/source/jibb
1863−/* tok-523 %txt /tests/golden/types-partial-mold-forward/tokens/txt
1863+/* tok-523 %txt /tests/golden/types-partial-mold-composite/tokens/txt
1864−/* tre-523 %txt /tests/golden/types-partial-mold-forward/tree/txt
1864+/* tre-523 %txt /tests/golden/types-partial-mold-composite/tree/txt
1865−/* typ-523 %txt /tests/golden/types-partial-mold-forward/types/txt
1865+/* typ-523 %txt /tests/golden/types-partial-mold-composite/types/txt
1866−/* src-524 %jibb /tests/golden/types-partial-mold-recursive/source/jibb
1866+/* src-524 %jibb /tests/golden/types-partial-mold-forward/source/jibb
1867−/* tok-524 %txt /tests/golden/types-partial-mold-recursive/tokens/txt
1867+/* tok-524 %txt /tests/golden/types-partial-mold-forward/tokens/txt
1868−/* tre-524 %txt /tests/golden/types-partial-mold-recursive/tree/txt
1868+/* tre-524 %txt /tests/golden/types-partial-mold-forward/tree/txt
1869−/* typ-524 %txt /tests/golden/types-partial-mold-recursive/types/txt
1869+/* typ-524 %txt /tests/golden/types-partial-mold-forward/types/txt
1870−/* src-525 %jibb /tests/golden/types-partial-occurs/source/jibb
1870+/* src-525 %jibb /tests/golden/types-partial-mold-recursive/source/jibb
1871−/* tok-525 %txt /tests/golden/types-partial-occurs/tokens/txt
1871+/* tok-525 %txt /tests/golden/types-partial-mold-recursive/tokens/txt
1872−/* tre-525 %txt /tests/golden/types-partial-occurs/tree/txt
1872+/* tre-525 %txt /tests/golden/types-partial-mold-recursive/tree/txt
1873−/* typ-525 %txt /tests/golden/types-partial-occurs/types/txt
1873+/* typ-525 %txt /tests/golden/types-partial-mold-recursive/types/txt
1874−/* src-526 %jibb /tests/golden/types-partial-projection/source/jibb
1874+/* src-526 %jibb /tests/golden/types-partial-occurs/source/jibb
1875−/* tok-526 %txt /tests/golden/types-partial-projection/tokens/txt
1875+/* tok-526 %txt /tests/golden/types-partial-occurs/tokens/txt
1876−/* tre-526 %txt /tests/golden/types-partial-projection/tree/txt
1876+/* tre-526 %txt /tests/golden/types-partial-occurs/tree/txt
1877−/* typ-526 %txt /tests/golden/types-partial-projection/types/txt
1877+/* typ-526 %txt /tests/golden/types-partial-occurs/types/txt
1878−/* src-527 %jibb /tests/golden/types-partial-shadow-global/source/jibb
1878+/* src-527 %jibb /tests/golden/types-partial-projection/source/jibb
1879−/* tok-527 %txt /tests/golden/types-partial-shadow-global/tokens/txt
1879+/* tok-527 %txt /tests/golden/types-partial-projection/tokens/txt
1880−/* tre-527 %txt /tests/golden/types-partial-shadow-global/tree/txt
1880+/* tre-527 %txt /tests/golden/types-partial-projection/tree/txt
1881−/* typ-527 %txt /tests/golden/types-partial-shadow-global/types/txt
1881+/* typ-527 %txt /tests/golden/types-partial-projection/types/txt
1882−/* src-528 %jibb /tests/golden/types-partial-shared-tvar/source/jibb
1882+/* src-528 %jibb /tests/golden/types-partial-shadow-global/source/jibb
1883−/* tok-528 %txt /tests/golden/types-partial-shared-tvar/tokens/txt
1883+/* tok-528 %txt /tests/golden/types-partial-shadow-global/tokens/txt
1884−/* tre-528 %txt /tests/golden/types-partial-shared-tvar/tree/txt
1884+/* tre-528 %txt /tests/golden/types-partial-shadow-global/tree/txt
1885−/* typ-528 %txt /tests/golden/types-partial-shared-tvar/types/txt
1885+/* typ-528 %txt /tests/golden/types-partial-shadow-global/types/txt
1886−/* src-529 %jibb /tests/golden/types-partial-union-cases/source/jibb
1886+/* src-529 %jibb /tests/golden/types-partial-shared-tvar/source/jibb
1887−/* tok-529 %txt /tests/golden/types-partial-union-cases/tokens/txt
1887+/* tok-529 %txt /tests/golden/types-partial-shared-tvar/tokens/txt
1888−/* tre-529 %txt /tests/golden/types-partial-union-cases/tree/txt
1888+/* tre-529 %txt /tests/golden/types-partial-shared-tvar/tree/txt
1889−/* typ-529 %txt /tests/golden/types-partial-union-cases/types/txt
1889+/* typ-529 %txt /tests/golden/types-partial-shared-tvar/types/txt
1890−/* src-530 %jibb /tests/golden/types-partial-union-edges/source/jibb
1890+/* src-530 %jibb /tests/golden/types-partial-union-cases/source/jibb
1891−/* tok-530 %txt /tests/golden/types-partial-union-edges/tokens/txt
1891+/* tok-530 %txt /tests/golden/types-partial-union-cases/tokens/txt
1892−/* tre-530 %txt /tests/golden/types-partial-union-edges/tree/txt
1892+/* tre-530 %txt /tests/golden/types-partial-union-cases/tree/txt
1893−/* typ-530 %txt /tests/golden/types-partial-union-edges/types/txt
1893+/* typ-530 %txt /tests/golden/types-partial-union-cases/types/txt
1894−/* src-531 %jibb /tests/golden/types-partial-unresolved-tag/source/jibb
1894+/* src-531 %jibb /tests/golden/types-partial-union-edges/source/jibb
1895−/* tok-531 %txt /tests/golden/types-partial-unresolved-tag/tokens/txt
1895+/* tok-531 %txt /tests/golden/types-partial-union-edges/tokens/txt
1896−/* tre-531 %txt /tests/golden/types-partial-unresolved-tag/tree/txt
1896+/* tre-531 %txt /tests/golden/types-partial-union-edges/tree/txt
1897−/* typ-531 %txt /tests/golden/types-partial-unresolved-tag/types/txt
1897+/* typ-531 %txt /tests/golden/types-partial-union-edges/types/txt
1898−/* src-532 %jibb /tests/golden/types-positional-faces/source/jibb
1898+/* src-532 %jibb /tests/golden/types-partial-union-nested-nouns/source/jibb
1899−/* tok-532 %txt /tests/golden/types-positional-faces/tokens/txt
1899+/* tok-532 %txt /tests/golden/types-partial-union-nested-nouns/tokens/txt
1900−/* tre-532 %txt /tests/golden/types-positional-faces/tree/txt
1900+/* tre-532 %txt /tests/golden/types-partial-union-nested-nouns/tree/txt
1901−/* typ-532 %txt /tests/golden/types-positional-faces/types/txt
1901+/* typ-532 %txt /tests/golden/types-partial-union-nested-nouns/types/txt
1902−/* src-533 %jibb /tests/golden/types-prelude-arithmetic/source/jibb
1902+/* src-533 %jibb /tests/golden/types-partial-unresolved-tag/source/jibb
1903−/* tok-533 %txt /tests/golden/types-prelude-arithmetic/tokens/txt
1903+/* tok-533 %txt /tests/golden/types-partial-unresolved-tag/tokens/txt
1904−/* tre-533 %txt /tests/golden/types-prelude-arithmetic/tree/txt
1904+/* tre-533 %txt /tests/golden/types-partial-unresolved-tag/tree/txt
1905−/* typ-533 %txt /tests/golden/types-prelude-arithmetic/types/txt
1905+/* typ-533 %txt /tests/golden/types-partial-unresolved-tag/types/txt
1906−/* src-534 %jibb /tests/golden/types-prelude-ask/source/jibb
1906+/* src-534 %jibb /tests/golden/types-positional-faces/source/jibb
1907−/* tok-534 %txt /tests/golden/types-prelude-ask/tokens/txt
1907+/* tok-534 %txt /tests/golden/types-positional-faces/tokens/txt
1908−/* tre-534 %txt /tests/golden/types-prelude-ask/tree/txt
1908+/* tre-534 %txt /tests/golden/types-positional-faces/tree/txt
1909−/* typ-534 %txt /tests/golden/types-prelude-ask/types/txt
1909+/* typ-534 %txt /tests/golden/types-positional-faces/types/txt
1910−/* src-535 %jibb /tests/golden/types-prelude-bond/source/jibb
1910+/* src-535 %jibb /tests/golden/types-prelude-arithmetic/source/jibb
1911−/* tok-535 %txt /tests/golden/types-prelude-bond/tokens/txt
1911+/* tok-535 %txt /tests/golden/types-prelude-arithmetic/tokens/txt
1912−/* tre-535 %txt /tests/golden/types-prelude-bond/tree/txt
1912+/* tre-535 %txt /tests/golden/types-prelude-arithmetic/tree/txt
1913−/* typ-535 %txt /tests/golden/types-prelude-bond/types/txt
1913+/* typ-535 %txt /tests/golden/types-prelude-arithmetic/types/txt
1914−/* src-536 %jibb /tests/golden/types-prelude-cmd/source/jibb
1914+/* src-536 %jibb /tests/golden/types-prelude-ask/source/jibb
1915−/* tok-536 %txt /tests/golden/types-prelude-cmd/tokens/txt
1915+/* tok-536 %txt /tests/golden/types-prelude-ask/tokens/txt
1916−/* tre-536 %txt /tests/golden/types-prelude-cmd/tree/txt
1916+/* tre-536 %txt /tests/golden/types-prelude-ask/tree/txt
1917−/* typ-536 %txt /tests/golden/types-prelude-cmd/types/txt
1917+/* typ-536 %txt /tests/golden/types-prelude-ask/types/txt
1918−/* src-537 %jibb /tests/golden/types-prelude-direct/source/jibb
1918+/* src-537 %jibb /tests/golden/types-prelude-bond/source/jibb
1919−/* tok-537 %txt /tests/golden/types-prelude-direct/tokens/txt
1919+/* tok-537 %txt /tests/golden/types-prelude-bond/tokens/txt
1920−/* tre-537 %txt /tests/golden/types-prelude-direct/tree/txt
1920+/* tre-537 %txt /tests/golden/types-prelude-bond/tree/txt
1921−/* typ-537 %txt /tests/golden/types-prelude-direct/types/txt
1921+/* typ-537 %txt /tests/golden/types-prelude-bond/types/txt
1922−/* src-538 %jibb /tests/golden/types-prelude-functional/source/jibb
1922+/* src-538 %jibb /tests/golden/types-prelude-cmd/source/jibb
1923−/* tok-538 %txt /tests/golden/types-prelude-functional/tokens/txt
1923+/* tok-538 %txt /tests/golden/types-prelude-cmd/tokens/txt
1924−/* tre-538 %txt /tests/golden/types-prelude-functional/tree/txt
1924+/* tre-538 %txt /tests/golden/types-prelude-cmd/tree/txt
1925−/* typ-538 %txt /tests/golden/types-prelude-functional/types/txt
1925+/* typ-538 %txt /tests/golden/types-prelude-cmd/types/txt
1926−/* src-539 %jibb /tests/golden/types-prelude-generic-alias/source/jibb
1926+/* src-539 %jibb /tests/golden/types-prelude-comparison/source/jibb
1927−/* tok-539 %txt /tests/golden/types-prelude-generic-alias/tokens/txt
1927+/* tok-539 %txt /tests/golden/types-prelude-comparison/tokens/txt
1928−/* tre-539 %txt /tests/golden/types-prelude-generic-alias/tree/txt
1928+/* tre-539 %txt /tests/golden/types-prelude-comparison/tree/txt
1929−/* mod-539-1 %jibb /tests/golden/types-prelude-generic-alias/modules/ui/alias-helper/jibb
1929+/* typ-539 %txt /tests/golden/types-prelude-comparison/types/txt
1930−/* typ-539 %txt /tests/golden/types-prelude-generic-alias/types/txt
1930+/* src-540 %jibb /tests/golden/types-prelude-direct/source/jibb
1931−/* mtre-539 %txt /tests/golden/types-prelude-generic-alias/module-trees/txt
1931+/* tok-540 %txt /tests/golden/types-prelude-direct/tokens/txt
1932−/* src-540 %jibb /tests/golden/types-prelude-interface/source/jibb
1932+/* tre-540 %txt /tests/golden/types-prelude-direct/tree/txt
1933−/* tok-540 %txt /tests/golden/types-prelude-interface/tokens/txt
1933+/* typ-540 %txt /tests/golden/types-prelude-direct/types/txt
1934−/* tre-540 %txt /tests/golden/types-prelude-interface/tree/txt
1934+/* src-541 %jibb /tests/golden/types-prelude-functional/source/jibb
1935−/* mod-540-1 %jibb /tests/golden/types-prelude-interface/modules/ui/left/jibb
1935+/* tok-541 %txt /tests/golden/types-prelude-functional/tokens/txt
1936−/* mod-540-2 %jibb /tests/golden/types-prelude-interface/modules/ui/right/jibb
1936+/* tre-541 %txt /tests/golden/types-prelude-functional/tree/txt
1937−/* typ-540 %txt /tests/golden/types-prelude-interface/types/txt
1937+/* typ-541 %txt /tests/golden/types-prelude-functional/types/txt
1938−/* mtre-540 %txt /tests/golden/types-prelude-interface/module-trees/txt
1938+/* src-542 %jibb /tests/golden/types-prelude-generic-alias/source/jibb
1939−/* src-541 %jibb /tests/golden/types-prelude-like/source/jibb
1939+/* tok-542 %txt /tests/golden/types-prelude-generic-alias/tokens/txt
1940−/* tok-541 %txt /tests/golden/types-prelude-like/tokens/txt
1940+/* tre-542 %txt /tests/golden/types-prelude-generic-alias/tree/txt
1941−/* tre-541 %txt /tests/golden/types-prelude-like/tree/txt
1941+/* mod-542-1 %jibb /tests/golden/types-prelude-generic-alias/modules/ui/alias-helper/jibb
1942−/* typ-541 %txt /tests/golden/types-prelude-like/types/txt
1942+/* typ-542 %txt /tests/golden/types-prelude-generic-alias/types/txt
1943−/* src-542 %jibb /tests/golden/types-prelude-list-alias/source/jibb
1943+/* mtre-542 %txt /tests/golden/types-prelude-generic-alias/module-trees/txt
1944−/* tok-542 %txt /tests/golden/types-prelude-list-alias/tokens/txt
1944+/* src-543 %jibb /tests/golden/types-prelude-interface/source/jibb
1945−/* tre-542 %txt /tests/golden/types-prelude-list-alias/tree/txt
1945+/* tok-543 %txt /tests/golden/types-prelude-interface/tokens/txt
1946−/* typ-542 %txt /tests/golden/types-prelude-list-alias/types/txt
1946+/* tre-543 %txt /tests/golden/types-prelude-interface/tree/txt
1947−/* src-543 %jibb /tests/golden/types-prelude-list-functions/source/jibb
1947+/* mod-543-1 %jibb /tests/golden/types-prelude-interface/modules/ui/left/jibb
1948−/* tok-543 %txt /tests/golden/types-prelude-list-functions/tokens/txt
1948+/* mod-543-2 %jibb /tests/golden/types-prelude-interface/modules/ui/right/jibb
1949−/* tre-543 %txt /tests/golden/types-prelude-list-functions/tree/txt
1949+/* typ-543 %txt /tests/golden/types-prelude-interface/types/txt
1950−/* mod-543-1 %jibb /tests/golden/types-prelude-list-functions/modules/ui/lib/jibb
1950+/* mtre-543 %txt /tests/golden/types-prelude-interface/module-trees/txt
1951−/* typ-543 %txt /tests/golden/types-prelude-list-functions/types/txt
1951+/* src-544 %jibb /tests/golden/types-prelude-lead-late/source/jibb
1952−/* mtre-543 %txt /tests/golden/types-prelude-list-functions/module-trees/txt
1952+/* tok-544 %txt /tests/golden/types-prelude-lead-late/tokens/txt
1953−/* src-544 %jibb /tests/golden/types-prelude-list-helpers/source/jibb
1953+/* tre-544 %txt /tests/golden/types-prelude-lead-late/tree/txt
1954−/* tok-544 %txt /tests/golden/types-prelude-list-helpers/tokens/txt
1954+/* typ-544 %txt /tests/golden/types-prelude-lead-late/types/txt
1955−/* tre-544 %txt /tests/golden/types-prelude-list-helpers/tree/txt
1955+/* src-545 %jibb /tests/golden/types-prelude-lent/source/jibb
1956−/* typ-544 %txt /tests/golden/types-prelude-list-helpers/types/txt
1956+/* tok-545 %txt /tests/golden/types-prelude-lent/tokens/txt
1957−/* src-545 %jibb /tests/golden/types-prelude-predicates/source/jibb
1957+/* tre-545 %txt /tests/golden/types-prelude-lent/tree/txt
1958−/* tok-545 %txt /tests/golden/types-prelude-predicates/tokens/txt
1958+/* typ-545 %txt /tests/golden/types-prelude-lent/types/txt
1959−/* tre-545 %txt /tests/golden/types-prelude-predicates/tree/txt
1959+/* src-546 %jibb /tests/golden/types-prelude-like/source/jibb
1960−/* typ-545 %txt /tests/golden/types-prelude-predicates/types/txt
1960+/* tok-546 %txt /tests/golden/types-prelude-like/tokens/txt
1961−/* src-546 %jibb /tests/golden/types-prelude-sub/source/jibb
1961+/* tre-546 %txt /tests/golden/types-prelude-like/tree/txt
1962−/* tok-546 %txt /tests/golden/types-prelude-sub/tokens/txt
1962+/* typ-546 %txt /tests/golden/types-prelude-like/types/txt
1963−/* tre-546 %txt /tests/golden/types-prelude-sub/tree/txt
1963+/* src-547 %jibb /tests/golden/types-prelude-list-alias/source/jibb
1964−/* typ-546 %txt /tests/golden/types-prelude-sub/types/txt
1964+/* tok-547 %txt /tests/golden/types-prelude-list-alias/tokens/txt
1965−/* src-547 %jibb /tests/golden/types-prelude-sub-nested/source/jibb
1965+/* tre-547 %txt /tests/golden/types-prelude-list-alias/tree/txt
1966−/* tok-547 %txt /tests/golden/types-prelude-sub-nested/tokens/txt
1966+/* typ-547 %txt /tests/golden/types-prelude-list-alias/types/txt
1967−/* tre-547 %txt /tests/golden/types-prelude-sub-nested/tree/txt
1967+/* src-548 %jibb /tests/golden/types-prelude-list-functions/source/jibb
1968−/* typ-547 %txt /tests/golden/types-prelude-sub-nested/types/txt
1968+/* tok-548 %txt /tests/golden/types-prelude-list-functions/tokens/txt
1969−/* src-548 %jibb /tests/golden/types-prelude-unit-helpers/source/jibb
1969+/* tre-548 %txt /tests/golden/types-prelude-list-functions/tree/txt
1970−/* tok-548 %txt /tests/golden/types-prelude-unit-helpers/tokens/txt
1970+/* mod-548-1 %jibb /tests/golden/types-prelude-list-functions/modules/ui/lib/jibb
1971−/* tre-548 %txt /tests/golden/types-prelude-unit-helpers/tree/txt
1971+/* typ-548 %txt /tests/golden/types-prelude-list-functions/types/txt
1972−/* typ-548 %txt /tests/golden/types-prelude-unit-helpers/types/txt
1972+/* mtre-548 %txt /tests/golden/types-prelude-list-functions/module-trees/txt
1973−/* src-549 %jibb /tests/golden/types-proj-explicit-context/source/jibb
1973+/* src-549 %jibb /tests/golden/types-prelude-list-helpers/source/jibb
1974−/* tok-549 %txt /tests/golden/types-proj-explicit-context/tokens/txt
1974+/* tok-549 %txt /tests/golden/types-prelude-list-helpers/tokens/txt
1975−/* tre-549 %txt /tests/golden/types-proj-explicit-context/tree/txt
1975+/* tre-549 %txt /tests/golden/types-prelude-list-helpers/tree/txt
1976−/* typ-549 %txt /tests/golden/types-proj-explicit-context/types/txt
1976+/* typ-549 %txt /tests/golden/types-prelude-list-helpers/types/txt
1977−/* src-550 %jibb /tests/golden/types-proj-nested-no-implicit/source/jibb
1977+/* src-550 %jibb /tests/golden/types-prelude-predicates/source/jibb
1978−/* tok-550 %txt /tests/golden/types-proj-nested-no-implicit/tokens/txt
1978+/* tok-550 %txt /tests/golden/types-prelude-predicates/tokens/txt
1979−/* tre-550 %txt /tests/golden/types-proj-nested-no-implicit/tree/txt
1979+/* tre-550 %txt /tests/golden/types-prelude-predicates/tree/txt
1980−/* typ-550 %txt /tests/golden/types-proj-nested-no-implicit/types/txt
1980+/* typ-550 %txt /tests/golden/types-prelude-predicates/types/txt
1981−/* src-551 %jibb /tests/golden/types-proj-reserved-imported-definition/source/jibb
1981+/* src-551 %jibb /tests/golden/types-prelude-sub/source/jibb
1982−/* tok-551 %txt /tests/golden/types-proj-reserved-imported-definition/tokens/txt
1982+/* tok-551 %txt /tests/golden/types-prelude-sub/tokens/txt
1983−/* tre-551 %txt /tests/golden/types-proj-reserved-imported-definition/tree/txt
1983+/* tre-551 %txt /tests/golden/types-prelude-sub/tree/txt
1984−/* mod-551-1 %jibb /tests/golden/types-proj-reserved-imported-definition/modules/ui/lib/jibb
1984+/* typ-551 %txt /tests/golden/types-prelude-sub/types/txt
1985−/* typ-551 %txt /tests/golden/types-proj-reserved-imported-definition/types/txt
1985+/* src-552 %jibb /tests/golden/types-prelude-sub-nested/source/jibb
1986−/* mtre-551 %txt /tests/golden/types-proj-reserved-imported-definition/module-trees/txt
1986+/* tok-552 %txt /tests/golden/types-prelude-sub-nested/tokens/txt
1987−/* src-552 %jibb /tests/golden/types-proj-reserved-jibb-import/source/jibb
1987+/* tre-552 %txt /tests/golden/types-prelude-sub-nested/tree/txt
1988−/* tok-552 %txt /tests/golden/types-proj-reserved-jibb-import/tokens/txt
1988+/* typ-552 %txt /tests/golden/types-prelude-sub-nested/types/txt
1989−/* tre-552 %txt /tests/golden/types-proj-reserved-jibb-import/tree/txt
1989+/* src-553 %jibb /tests/golden/types-prelude-succ/source/jibb
1990−/* mod-552-1 %jibb /tests/golden/types-proj-reserved-jibb-import/modules/ui/lib/jibb
1990+/* tok-553 %txt /tests/golden/types-prelude-succ/tokens/txt
1991−/* typ-552 %txt /tests/golden/types-proj-reserved-jibb-import/types/txt
1991+/* tre-553 %txt /tests/golden/types-prelude-succ/tree/txt
1992−/* mtre-552 %txt /tests/golden/types-proj-reserved-jibb-import/module-trees/txt
1992+/* typ-553 %txt /tests/golden/types-prelude-succ/types/txt
1993−/* src-553 %jibb /tests/golden/types-proj-reserved-local/source/jibb
1993+/* src-554 %jibb /tests/golden/types-prelude-text/source/jibb
1994−/* tok-553 %txt /tests/golden/types-proj-reserved-local/tokens/txt
1994+/* tok-554 %txt /tests/golden/types-prelude-text/tokens/txt
1995−/* tre-553 %txt /tests/golden/types-proj-reserved-local/tree/txt
1995+/* tre-554 %txt /tests/golden/types-prelude-text/tree/txt
1996−/* typ-553 %txt /tests/golden/types-proj-reserved-local/types/txt
1996+/* typ-554 %txt /tests/golden/types-prelude-text/types/txt
1997−/* src-554 %jibb /tests/golden/types-proj-reserved-local-mold/source/jibb
1997+/* src-555 %jibb /tests/golden/types-prelude-ui/source/jibb
1998−/* tok-554 %txt /tests/golden/types-proj-reserved-local-mold/tokens/txt
1998+/* tok-555 %txt /tests/golden/types-prelude-ui/tokens/txt
1999−/* tre-554 %txt /tests/golden/types-proj-reserved-local-mold/tree/txt
1999+/* tre-555 %txt /tests/golden/types-prelude-ui/tree/txt
2000−/* typ-554 %txt /tests/golden/types-proj-reserved-local-mold/types/txt
2000+/* typ-555 %txt /tests/golden/types-prelude-ui/types/txt
2001−/* src-555 %jibb /tests/golden/types-proj-reserved-mark-import/source/jibb
2001+/* src-556 %jibb /tests/golden/types-prelude-unit-helpers/source/jibb
2002−/* tok-555 %txt /tests/golden/types-proj-reserved-mark-import/tokens/txt
2002+/* tok-556 %txt /tests/golden/types-prelude-unit-helpers/tokens/txt
2003−/* tre-555 %txt /tests/golden/types-proj-reserved-mark-import/tree/txt
2003+/* tre-556 %txt /tests/golden/types-prelude-unit-helpers/tree/txt
2004−/* typ-555 %txt /tests/golden/types-proj-reserved-mark-import/types/txt
2004+/* typ-556 %txt /tests/golden/types-prelude-unit-helpers/types/txt
2005−/* src-556 %jibb /tests/golden/types-proj-reserved-mold/source/jibb
2005+/* src-557 %jibb /tests/golden/types-prelude-zing/source/jibb
2006−/* tok-556 %txt /tests/golden/types-proj-reserved-mold/tokens/txt
2006+/* tok-557 %txt /tests/golden/types-prelude-zing/tokens/txt
2007−/* tre-556 %txt /tests/golden/types-proj-reserved-mold/tree/txt
2007+/* tre-557 %txt /tests/golden/types-prelude-zing/tree/txt
2008−/* typ-556 %txt /tests/golden/types-proj-reserved-mold/types/txt
2008+/* typ-557 %txt /tests/golden/types-prelude-zing/types/txt
2009−/* src-557 %jibb /tests/golden/types-proj-reserved-pattern/source/jibb
2009+/* src-558 %jibb /tests/golden/types-proj-explicit-context/source/jibb
2010−/* tok-557 %txt /tests/golden/types-proj-reserved-pattern/tokens/txt
2010+/* tok-558 %txt /tests/golden/types-proj-explicit-context/tokens/txt
2011−/* tre-557 %txt /tests/golden/types-proj-reserved-pattern/tree/txt
2011+/* tre-558 %txt /tests/golden/types-proj-explicit-context/tree/txt
2012−/* typ-557 %txt /tests/golden/types-proj-reserved-pattern/types/txt
2012+/* typ-558 %txt /tests/golden/types-proj-explicit-context/types/txt
2013−/* src-558 %jibb /tests/golden/types-proj-reserved-positive/source/jibb
2013+/* src-559 %jibb /tests/golden/types-proj-nested-no-implicit/source/jibb
2014−/* tok-558 %txt /tests/golden/types-proj-reserved-positive/tokens/txt
2014+/* tok-559 %txt /tests/golden/types-proj-nested-no-implicit/tokens/txt
2015−/* tre-558 %txt /tests/golden/types-proj-reserved-positive/tree/txt
2015+/* tre-559 %txt /tests/golden/types-proj-nested-no-implicit/tree/txt
2016−/* typ-558 %txt /tests/golden/types-proj-reserved-positive/types/txt
2016+/* typ-559 %txt /tests/golden/types-proj-nested-no-implicit/types/txt
2017−/* src-559 %jibb /tests/golden/types-proj-reserved-sample/source/jibb
2017+/* src-560 %jibb /tests/golden/types-proj-reserved-imported-definition/source/jibb
2018−/* tok-559 %txt /tests/golden/types-proj-reserved-sample/tokens/txt
2018+/* tok-560 %txt /tests/golden/types-proj-reserved-imported-definition/tokens/txt
2019−/* tre-559 %txt /tests/golden/types-proj-reserved-sample/tree/txt
2019+/* tre-560 %txt /tests/golden/types-proj-reserved-imported-definition/tree/txt
2020−/* typ-559 %txt /tests/golden/types-proj-reserved-sample/types/txt
2020+/* mod-560-1 %jibb /tests/golden/types-proj-reserved-imported-definition/modules/ui/lib/jibb
2021−/* src-560 %jibb /tests/golden/types-proj-reserved-sur-import/source/jibb
2021+/* typ-560 %txt /tests/golden/types-proj-reserved-imported-definition/types/txt
2022−/* tok-560 %txt /tests/golden/types-proj-reserved-sur-import/tokens/txt
2022+/* mtre-560 %txt /tests/golden/types-proj-reserved-imported-definition/module-trees/txt
2023−/* tre-560 %txt /tests/golden/types-proj-reserved-sur-import/tree/txt
2023+/* src-561 %jibb /tests/golden/types-proj-reserved-jibb-import/source/jibb
2024−/* typ-560 %txt /tests/golden/types-proj-reserved-sur-import/types/txt
2024+/* tok-561 %txt /tests/golden/types-proj-reserved-jibb-import/tokens/txt
2025−/* src-561 %jibb /tests/golden/types-proj-reserved-unused-pattern/source/jibb
2025+/* tre-561 %txt /tests/golden/types-proj-reserved-jibb-import/tree/txt
2026−/* tok-561 %txt /tests/golden/types-proj-reserved-unused-pattern/tokens/txt
2026+/* mod-561-1 %jibb /tests/golden/types-proj-reserved-jibb-import/modules/ui/lib/jibb
2027−/* tre-561 %txt /tests/golden/types-proj-reserved-unused-pattern/tree/txt
2027+/* typ-561 %txt /tests/golden/types-proj-reserved-jibb-import/types/txt
2028−/* typ-561 %txt /tests/golden/types-proj-reserved-unused-pattern/types/txt
2028+/* mtre-561 %txt /tests/golden/types-proj-reserved-jibb-import/module-trees/txt
2029−/* src-562 %jibb /tests/golden/types-proj-reserved-unused-sample/source/jibb
2029+/* src-562 %jibb /tests/golden/types-proj-reserved-local/source/jibb
2030−/* tok-562 %txt /tests/golden/types-proj-reserved-unused-sample/tokens/txt
2030+/* tok-562 %txt /tests/golden/types-proj-reserved-local/tokens/txt
2031−/* tre-562 %txt /tests/golden/types-proj-reserved-unused-sample/tree/txt
2031+/* tre-562 %txt /tests/golden/types-proj-reserved-local/tree/txt
2032−/* typ-562 %txt /tests/golden/types-proj-reserved-unused-sample/types/txt
2032+/* typ-562 %txt /tests/golden/types-proj-reserved-local/types/txt
2033−/* src-563 %jibb /tests/golden/types-proj-reserved-unused-value/source/jibb
2033+/* src-563 %jibb /tests/golden/types-proj-reserved-local-mold/source/jibb
2034−/* tok-563 %txt /tests/golden/types-proj-reserved-unused-value/tokens/txt
2034+/* tok-563 %txt /tests/golden/types-proj-reserved-local-mold/tokens/txt
2035−/* tre-563 %txt /tests/golden/types-proj-reserved-unused-value/tree/txt
2035+/* tre-563 %txt /tests/golden/types-proj-reserved-local-mold/tree/txt
2036−/* typ-563 %txt /tests/golden/types-proj-reserved-unused-value/types/txt
2036+/* typ-563 %txt /tests/golden/types-proj-reserved-local-mold/types/txt
2037−/* src-564 %jibb /tests/golden/types-proj-reserved-value/source/jibb
2037+/* src-564 %jibb /tests/golden/types-proj-reserved-mark-import/source/jibb
2038−/* tok-564 %txt /tests/golden/types-proj-reserved-value/tokens/txt
2038+/* tok-564 %txt /tests/golden/types-proj-reserved-mark-import/tokens/txt
2039−/* tre-564 %txt /tests/golden/types-proj-reserved-value/tree/txt
2039+/* tre-564 %txt /tests/golden/types-proj-reserved-mark-import/tree/txt
2040−/* typ-564 %txt /tests/golden/types-proj-reserved-value/types/txt
2040+/* typ-564 %txt /tests/golden/types-proj-reserved-mark-import/types/txt
2041−/* src-565 %jibb /tests/golden/types-proj-single-duplicate/source/jibb
2041+/* src-565 %jibb /tests/golden/types-proj-reserved-mold/source/jibb
2042−/* tok-565 %txt /tests/golden/types-proj-single-duplicate/tokens/txt
2042+/* tok-565 %txt /tests/golden/types-proj-reserved-mold/tokens/txt
2043−/* tre-565 %txt /tests/golden/types-proj-single-duplicate/tree/txt
2043+/* tre-565 %txt /tests/golden/types-proj-reserved-mold/tree/txt
2044−/* typ-565 %txt /tests/golden/types-proj-single-duplicate/types/txt
2044+/* typ-565 %txt /tests/golden/types-proj-reserved-mold/types/txt
2045−/* src-566 %jibb /tests/golden/types-proj-single-field/source/jibb
2045+/* src-566 %jibb /tests/golden/types-proj-reserved-pattern/source/jibb
2046−/* tok-566 %txt /tests/golden/types-proj-single-field/tokens/txt
2046+/* tok-566 %txt /tests/golden/types-proj-reserved-pattern/tokens/txt
2047−/* tre-566 %txt /tests/golden/types-proj-single-field/tree/txt
2047+/* tre-566 %txt /tests/golden/types-proj-reserved-pattern/tree/txt
2048−/* typ-566 %txt /tests/golden/types-proj-single-field/types/txt
2048+/* typ-566 %txt /tests/golden/types-proj-reserved-pattern/types/txt
2049−/* src-567 %jibb /tests/golden/types-proj-single-sample-face/source/jibb
2049+/* src-567 %jibb /tests/golden/types-proj-reserved-positive/source/jibb
2050−/* tok-567 %txt /tests/golden/types-proj-single-sample-face/tokens/txt
2050+/* tok-567 %txt /tests/golden/types-proj-reserved-positive/tokens/txt
2051−/* tre-567 %txt /tests/golden/types-proj-single-sample-face/tree/txt
2051+/* tre-567 %txt /tests/golden/types-proj-reserved-positive/tree/txt
2052−/* typ-567 %txt /tests/golden/types-proj-single-sample-face/types/txt
2052+/* typ-567 %txt /tests/golden/types-proj-reserved-positive/types/txt
2053−/* src-568 %jibb /tests/golden/types-proj-single-wrapped/source/jibb
2053+/* src-568 %jibb /tests/golden/types-proj-reserved-sample/source/jibb
2054−/* tok-568 %txt /tests/golden/types-proj-single-wrapped/tokens/txt
2054+/* tok-568 %txt /tests/golden/types-proj-reserved-sample/tokens/txt
2055−/* tre-568 %txt /tests/golden/types-proj-single-wrapped/tree/txt
2055+/* tre-568 %txt /tests/golden/types-proj-reserved-sample/tree/txt
2056−/* typ-568 %txt /tests/golden/types-proj-single-wrapped/types/txt
2056+/* typ-568 %txt /tests/golden/types-proj-reserved-sample/types/txt
2057−/* src-569 %jibb /tests/golden/types-qath-faces/source/jibb
2057+/* src-569 %jibb /tests/golden/types-proj-reserved-sur-import/source/jibb
2058−/* tok-569 %txt /tests/golden/types-qath-faces/tokens/txt
2058+/* tok-569 %txt /tests/golden/types-proj-reserved-sur-import/tokens/txt
2059−/* tre-569 %txt /tests/golden/types-qath-faces/tree/txt
2059+/* tre-569 %txt /tests/golden/types-proj-reserved-sur-import/tree/txt
2060−/* typ-569 %txt /tests/golden/types-qath-faces/types/txt
2060+/* typ-569 %txt /tests/golden/types-proj-reserved-sur-import/types/txt
2061−/* src-570 %jibb /tests/golden/types-qath-holes/source/jibb
2061+/* src-570 %jibb /tests/golden/types-proj-reserved-unused-pattern/source/jibb
2062−/* tok-570 %txt /tests/golden/types-qath-holes/tokens/txt
2062+/* tok-570 %txt /tests/golden/types-proj-reserved-unused-pattern/tokens/txt
2063−/* tre-570 %txt /tests/golden/types-qath-holes/tree/txt
2063+/* tre-570 %txt /tests/golden/types-proj-reserved-unused-pattern/tree/txt
2064−/* typ-570 %txt /tests/golden/types-qath-holes/types/txt
2064+/* typ-570 %txt /tests/golden/types-proj-reserved-unused-pattern/types/txt
2065−/* src-571 %jibb /tests/golden/types-qath-module-identity/source/jibb
2065+/* src-571 %jibb /tests/golden/types-proj-reserved-unused-sample/source/jibb
2066−/* tok-571 %txt /tests/golden/types-qath-module-identity/tokens/txt
2066+/* tok-571 %txt /tests/golden/types-proj-reserved-unused-sample/tokens/txt
2067−/* tre-571 %txt /tests/golden/types-qath-module-identity/tree/txt
2067+/* tre-571 %txt /tests/golden/types-proj-reserved-unused-sample/tree/txt
2068−/* mod-571-1 %jibb /tests/golden/types-qath-module-identity/modules/ui/one/jibb
2068+/* typ-571 %txt /tests/golden/types-proj-reserved-unused-sample/types/txt
2069−/* mod-571-2 %jibb /tests/golden/types-qath-module-identity/modules/ui/two/jibb
2069+/* src-572 %jibb /tests/golden/types-proj-reserved-unused-value/source/jibb
2070−/* mod-571-3 %jibb /tests/golden/types-qath-module-identity/modules/ui/mid/jibb
2070+/* tok-572 %txt /tests/golden/types-proj-reserved-unused-value/tokens/txt
2071−/* typ-571 %txt /tests/golden/types-qath-module-identity/types/txt
2071+/* tre-572 %txt /tests/golden/types-proj-reserved-unused-value/tree/txt
2072−/* mtre-571 %txt /tests/golden/types-qath-module-identity/module-trees/txt
2072+/* typ-572 %txt /tests/golden/types-proj-reserved-unused-value/types/txt
2073−/* src-572 %jibb /tests/golden/types-qath-recursive/source/jibb
2073+/* src-573 %jibb /tests/golden/types-proj-reserved-value/source/jibb
2074−/* tok-572 %txt /tests/golden/types-qath-recursive/tokens/txt
2074+/* tok-573 %txt /tests/golden/types-proj-reserved-value/tokens/txt
2075−/* tre-572 %txt /tests/golden/types-qath-recursive/tree/txt
2075+/* tre-573 %txt /tests/golden/types-proj-reserved-value/tree/txt
2076−/* typ-572 %txt /tests/golden/types-qath-recursive/types/txt
2076+/* typ-573 %txt /tests/golden/types-proj-reserved-value/types/txt
2077−/* src-573 %jibb /tests/golden/types-record-bound-variable/source/jibb
2077+/* src-574 %jibb /tests/golden/types-proj-single-duplicate/source/jibb
2078−/* tok-573 %txt /tests/golden/types-record-bound-variable/tokens/txt
2078+/* tok-574 %txt /tests/golden/types-proj-single-duplicate/tokens/txt
2079−/* tre-573 %txt /tests/golden/types-record-bound-variable/tree/txt
2079+/* tre-574 %txt /tests/golden/types-proj-single-duplicate/tree/txt
2080−/* typ-573 %txt /tests/golden/types-record-bound-variable/types/txt
2080+/* typ-574 %txt /tests/golden/types-proj-single-duplicate/types/txt
2081−/* src-574 %jibb /tests/golden/types-record-cast-context/source/jibb
2081+/* src-575 %jibb /tests/golden/types-proj-single-field/source/jibb
2082−/* tok-574 %txt /tests/golden/types-record-cast-context/tokens/txt
2082+/* tok-575 %txt /tests/golden/types-proj-single-field/tokens/txt
2083−/* tre-574 %txt /tests/golden/types-record-cast-context/tree/txt
2083+/* tre-575 %txt /tests/golden/types-proj-single-field/tree/txt
2084−/* typ-574 %txt /tests/golden/types-record-cast-context/types/txt
2084+/* typ-575 %txt /tests/golden/types-proj-single-field/types/txt
2085−/* src-575 %jibb /tests/golden/types-record-change/source/jibb
2085+/* src-576 %jibb /tests/golden/types-proj-single-sample-face/source/jibb
2086−/* tok-575 %txt /tests/golden/types-record-change/tokens/txt
2086+/* tok-576 %txt /tests/golden/types-proj-single-sample-face/tokens/txt
2087−/* tre-575 %txt /tests/golden/types-record-change/tree/txt
2087+/* tre-576 %txt /tests/golden/types-proj-single-sample-face/tree/txt
2088−/* typ-575 %txt /tests/golden/types-record-change/types/txt
2088+/* typ-576 %txt /tests/golden/types-proj-single-sample-face/types/txt
2089−/* src-576 %jibb /tests/golden/types-record-change-generic/source/jibb
2089+/* src-577 %jibb /tests/golden/types-proj-single-wrapped/source/jibb
2090−/* tok-576 %txt /tests/golden/types-record-change-generic/tokens/txt
2090+/* tok-577 %txt /tests/golden/types-proj-single-wrapped/tokens/txt
2091−/* tre-576 %txt /tests/golden/types-record-change-generic/tree/txt
2091+/* tre-577 %txt /tests/golden/types-proj-single-wrapped/tree/txt
2092−/* typ-576 %txt /tests/golden/types-record-change-generic/types/txt
2092+/* typ-577 %txt /tests/golden/types-proj-single-wrapped/types/txt
2093−/* src-577 %jibb /tests/golden/types-record-faces/source/jibb
2093+/* src-578 %jibb /tests/golden/types-qath-faces/source/jibb
2094−/* tok-577 %txt /tests/golden/types-record-faces/tokens/txt
2094+/* tok-578 %txt /tests/golden/types-qath-faces/tokens/txt
2095−/* tre-577 %txt /tests/golden/types-record-faces/tree/txt
2095+/* tre-578 %txt /tests/golden/types-qath-faces/tree/txt
2096−/* typ-577 %txt /tests/golden/types-record-faces/types/txt
2096+/* typ-578 %txt /tests/golden/types-qath-faces/types/txt
2097−/* src-578 %jibb /tests/golden/types-record-field-edit-separate/source/jibb
2097+/* src-579 %jibb /tests/golden/types-qath-holes/source/jibb
2098−/* tok-578 %txt /tests/golden/types-record-field-edit-separate/tokens/txt
2098+/* tok-579 %txt /tests/golden/types-qath-holes/tokens/txt
2099−/* tre-578 %txt /tests/golden/types-record-field-edit-separate/tree/txt
2099+/* tre-579 %txt /tests/golden/types-qath-holes/tree/txt
2100−/* typ-578 %txt /tests/golden/types-record-field-edit-separate/types/txt
2100+/* typ-579 %txt /tests/golden/types-qath-holes/types/txt
2101−/* src-579 %jibb /tests/golden/types-record-field-expr-duplicate/source/jibb
2101+/* src-580 %jibb /tests/golden/types-qath-module-identity/source/jibb
2102−/* tok-579 %txt /tests/golden/types-record-field-expr-duplicate/tokens/txt
2102+/* tok-580 %txt /tests/golden/types-qath-module-identity/tokens/txt
2103−/* tre-579 %txt /tests/golden/types-record-field-expr-duplicate/tree/txt
2103+/* tre-580 %txt /tests/golden/types-qath-module-identity/tree/txt
2104−/* typ-579 %txt /tests/golden/types-record-field-expr-duplicate/types/txt
2104+/* mod-580-1 %jibb /tests/golden/types-qath-module-identity/modules/ui/one/jibb
2105−/* src-580 %jibb /tests/golden/types-record-field-expr-separate/source/jibb
2105+/* mod-580-2 %jibb /tests/golden/types-qath-module-identity/modules/ui/two/jibb
2106−/* tok-580 %txt /tests/golden/types-record-field-expr-separate/tokens/txt
2106+/* mod-580-3 %jibb /tests/golden/types-qath-module-identity/modules/ui/mid/jibb
2107−/* tre-580 %txt /tests/golden/types-record-field-expr-separate/tree/txt
2107+/* typ-580 %txt /tests/golden/types-qath-module-identity/types/txt
2108−/* typ-580 %txt /tests/golden/types-record-field-expr-separate/types/txt
2108+/* mtre-580 %txt /tests/golden/types-qath-module-identity/module-trees/txt
2109−/* src-581 %jibb /tests/golden/types-record-field-module-reachable/source/jibb
2109+/* src-581 %jibb /tests/golden/types-qath-recursive/source/jibb
2110−/* tok-581 %txt /tests/golden/types-record-field-module-reachable/tokens/txt
2110+/* tok-581 %txt /tests/golden/types-qath-recursive/tokens/txt
2111−/* tre-581 %txt /tests/golden/types-record-field-module-reachable/tree/txt
2111+/* tre-581 %txt /tests/golden/types-qath-recursive/tree/txt
2112−/* mod-581-1 %jibb /tests/golden/types-record-field-module-reachable/modules/ui/lib/jibb
2112+/* typ-581 %txt /tests/golden/types-qath-recursive/types/txt
2113−/* typ-581 %txt /tests/golden/types-record-field-module-reachable/types/txt
2113+/* src-582 %jibb /tests/golden/types-record-bound-variable/source/jibb
2114−/* mtre-581 %txt /tests/golden/types-record-field-module-reachable/module-trees/txt
2114+/* tok-582 %txt /tests/golden/types-record-bound-variable/tokens/txt
2115−/* src-582 %jibb /tests/golden/types-record-field-module-unused/source/jibb
2115+/* tre-582 %txt /tests/golden/types-record-bound-variable/tree/txt
2116−/* tok-582 %txt /tests/golden/types-record-field-module-unused/tokens/txt
2116+/* typ-582 %txt /tests/golden/types-record-bound-variable/types/txt
2117−/* tre-582 %txt /tests/golden/types-record-field-module-unused/tree/txt
2117+/* src-583 %jibb /tests/golden/types-record-cast-context/source/jibb
2118−/* mod-582-1 %jibb /tests/golden/types-record-field-module-unused/modules/ui/good/jibb
2118+/* tok-583 %txt /tests/golden/types-record-cast-context/tokens/txt
2119−/* mod-582-2 %jibb /tests/golden/types-record-field-module-unused/modules/ui/unused/jibb
2119+/* tre-583 %txt /tests/golden/types-record-cast-context/tree/txt
2120−/* typ-582 %txt /tests/golden/types-record-field-module-unused/types/txt
2120+/* typ-583 %txt /tests/golden/types-record-cast-context/types/txt
2121−/* mtre-582 %txt /tests/golden/types-record-field-module-unused/module-trees/txt
2121+/* src-584 %jibb /tests/golden/types-record-change/source/jibb
2122−/* src-583 %jibb /tests/golden/types-record-field-nested-mold/source/jibb
2122+/* tok-584 %txt /tests/golden/types-record-change/tokens/txt
2123−/* tok-583 %txt /tests/golden/types-record-field-nested-mold/tokens/txt
2123+/* tre-584 %txt /tests/golden/types-record-change/tree/txt
2124−/* tre-583 %txt /tests/golden/types-record-field-nested-mold/tree/txt
2124+/* typ-584 %txt /tests/golden/types-record-change/types/txt
2125−/* typ-583 %txt /tests/golden/types-record-field-nested-mold/types/txt
2125+/* src-585 %jibb /tests/golden/types-record-change-generic/source/jibb
2126−/* src-584 %jibb /tests/golden/types-record-field-outer-inner/source/jibb
2126+/* tok-585 %txt /tests/golden/types-record-change-generic/tokens/txt
2127−/* tok-584 %txt /tests/golden/types-record-field-outer-inner/tokens/txt
2127+/* tre-585 %txt /tests/golden/types-record-change-generic/tree/txt
2128−/* tre-584 %txt /tests/golden/types-record-field-outer-inner/tree/txt
2128+/* typ-585 %txt /tests/golden/types-record-change-generic/types/txt
2129−/* typ-584 %txt /tests/golden/types-record-field-outer-inner/types/txt
2129+/* src-586 %jibb /tests/golden/types-record-faces/source/jibb
2130−/* src-585 %jibb /tests/golden/types-record-field-sample-duplicate/source/jibb
2130+/* tok-586 %txt /tests/golden/types-record-faces/tokens/txt
2131−/* tok-585 %txt /tests/golden/types-record-field-sample-duplicate/tokens/txt
2131+/* tre-586 %txt /tests/golden/types-record-faces/tree/txt
2132−/* tre-585 %txt /tests/golden/types-record-field-sample-duplicate/tree/txt
2132+/* typ-586 %txt /tests/golden/types-record-faces/types/txt
2133−/* typ-585 %txt /tests/golden/types-record-field-sample-duplicate/types/txt
2133+/* src-587 %jibb /tests/golden/types-record-field-edit-separate/source/jibb
2134−/* src-586 %jibb /tests/golden/types-record-field-separate-molds/source/jibb
2134+/* tok-587 %txt /tests/golden/types-record-field-edit-separate/tokens/txt
2135−/* tok-586 %txt /tests/golden/types-record-field-separate-molds/tokens/txt
2135+/* tre-587 %txt /tests/golden/types-record-field-edit-separate/tree/txt
2136−/* tre-586 %txt /tests/golden/types-record-field-separate-molds/tree/txt
2136+/* typ-587 %txt /tests/golden/types-record-field-edit-separate/types/txt
2137−/* typ-586 %txt /tests/golden/types-record-field-separate-molds/types/txt
2137+/* src-588 %jibb /tests/golden/types-record-field-expr-duplicate/source/jibb
2138−/* src-587 %jibb /tests/golden/types-record-field-unused-mold/source/jibb
2138+/* tok-588 %txt /tests/golden/types-record-field-expr-duplicate/tokens/txt
2139−/* tok-587 %txt /tests/golden/types-record-field-unused-mold/tokens/txt
2139+/* tre-588 %txt /tests/golden/types-record-field-expr-duplicate/tree/txt
2140−/* tre-587 %txt /tests/golden/types-record-field-unused-mold/tree/txt
2140+/* typ-588 %txt /tests/golden/types-record-field-expr-duplicate/types/txt
2141−/* typ-587 %txt /tests/golden/types-record-field-unused-mold/types/txt
2141+/* src-589 %jibb /tests/golden/types-record-field-expr-separate/source/jibb
2142−/* src-588 %jibb /tests/golden/types-record-import/source/jibb
2142+/* tok-589 %txt /tests/golden/types-record-field-expr-separate/tokens/txt
2143−/* tok-588 %txt /tests/golden/types-record-import/tokens/txt
2143+/* tre-589 %txt /tests/golden/types-record-field-expr-separate/tree/txt
2144−/* tre-588 %txt /tests/golden/types-record-import/tree/txt
2144+/* typ-589 %txt /tests/golden/types-record-field-expr-separate/types/txt
2145−/* mod-588-1 %jibb /tests/golden/types-record-import/modules/ui/lib/jibb
2145+/* src-590 %jibb /tests/golden/types-record-field-module-reachable/source/jibb
2146−/* typ-588 %txt /tests/golden/types-record-import/types/txt
2146+/* tok-590 %txt /tests/golden/types-record-field-module-reachable/tokens/txt
2147−/* mtre-588 %txt /tests/golden/types-record-import/module-trees/txt
2147+/* tre-590 %txt /tests/golden/types-record-field-module-reachable/tree/txt
2148−/* src-589 %jibb /tests/golden/types-record-local-scheme/source/jibb
2148+/* mod-590-1 %jibb /tests/golden/types-record-field-module-reachable/modules/ui/lib/jibb
2149−/* tok-589 %txt /tests/golden/types-record-local-scheme/tokens/txt
2149+/* typ-590 %txt /tests/golden/types-record-field-module-reachable/types/txt
2150−/* tre-589 %txt /tests/golden/types-record-local-scheme/tree/txt
2150+/* mtre-590 %txt /tests/golden/types-record-field-module-reachable/module-trees/txt
2151−/* typ-589 %txt /tests/golden/types-record-local-scheme/types/txt
2151+/* src-591 %jibb /tests/golden/types-record-field-module-unused/source/jibb
2152−/* src-590 %jibb /tests/golden/types-record-nested/source/jibb
2152+/* tok-591 %txt /tests/golden/types-record-field-module-unused/tokens/txt
2153−/* tok-590 %txt /tests/golden/types-record-nested/tokens/txt
2153+/* tre-591 %txt /tests/golden/types-record-field-module-unused/tree/txt
2154−/* tre-590 %txt /tests/golden/types-record-nested/tree/txt
2154+/* mod-591-1 %jibb /tests/golden/types-record-field-module-unused/modules/ui/good/jibb
2155−/* typ-590 %txt /tests/golden/types-record-nested/types/txt
2155+/* mod-591-2 %jibb /tests/golden/types-record-field-module-unused/modules/ui/unused/jibb
2156−/* src-591 %jibb /tests/golden/types-record-to-tuple/source/jibb
2156+/* typ-591 %txt /tests/golden/types-record-field-module-unused/types/txt
2157−/* tok-591 %txt /tests/golden/types-record-to-tuple/tokens/txt
2157+/* mtre-591 %txt /tests/golden/types-record-field-module-unused/module-trees/txt
2158−/* tre-591 %txt /tests/golden/types-record-to-tuple/tree/txt
2158+/* src-592 %jibb /tests/golden/types-record-field-nested-mold/source/jibb
2159−/* typ-591 %txt /tests/golden/types-record-to-tuple/types/txt
2159+/* tok-592 %txt /tests/golden/types-record-field-nested-mold/tokens/txt
2160−/* src-592 %jibb /tests/golden/types-recursion-scc-failures/source/jibb
2160+/* tre-592 %txt /tests/golden/types-record-field-nested-mold/tree/txt
2161−/* tok-592 %txt /tests/golden/types-recursion-scc-failures/tokens/txt
2161+/* typ-592 %txt /tests/golden/types-record-field-nested-mold/types/txt
2162−/* tre-592 %txt /tests/golden/types-recursion-scc-failures/tree/txt
2162+/* src-593 %jibb /tests/golden/types-record-field-outer-inner/source/jibb
2163−/* typ-592 %txt /tests/golden/types-recursion-scc-failures/types/txt
2163+/* tok-593 %txt /tests/golden/types-record-field-outer-inner/tokens/txt
2164−/* src-593 %jibb /tests/golden/types-recursion-scc-groups/source/jibb
2164+/* tre-593 %txt /tests/golden/types-record-field-outer-inner/tree/txt
2165−/* tok-593 %txt /tests/golden/types-recursion-scc-groups/tokens/txt
2165+/* typ-593 %txt /tests/golden/types-record-field-outer-inner/types/txt
2166−/* tre-593 %txt /tests/golden/types-recursion-scc-groups/tree/txt
2166+/* src-594 %jibb /tests/golden/types-record-field-sample-duplicate/source/jibb
2167−/* typ-593 %txt /tests/golden/types-recursion-scc-groups/types/txt
2167+/* tok-594 %txt /tests/golden/types-record-field-sample-duplicate/tokens/txt
2168−/* src-594 %jibb /tests/golden/types-recursion-scc-import/source/jibb
2168+/* tre-594 %txt /tests/golden/types-record-field-sample-duplicate/tree/txt
2169−/* tok-594 %txt /tests/golden/types-recursion-scc-import/tokens/txt
2169+/* typ-594 %txt /tests/golden/types-record-field-sample-duplicate/types/txt
2170−/* tre-594 %txt /tests/golden/types-recursion-scc-import/tree/txt
2170+/* src-595 %jibb /tests/golden/types-record-field-separate-molds/source/jibb
2171−/* mod-594-1 %jibb /tests/golden/types-recursion-scc-import/modules/ui/lib/jibb
2171+/* tok-595 %txt /tests/golden/types-record-field-separate-molds/tokens/txt
2172−/* typ-594 %txt /tests/golden/types-recursion-scc-import/types/txt
2172+/* tre-595 %txt /tests/golden/types-record-field-separate-molds/tree/txt
2173−/* mtre-594 %txt /tests/golden/types-recursion-scc-import/module-trees/txt
2173+/* typ-595 %txt /tests/golden/types-record-field-separate-molds/types/txt
2174−/* src-595 %jibb /tests/golden/types-recursion-scc-import-bad/source/jibb
2174+/* src-596 %jibb /tests/golden/types-record-field-unused-mold/source/jibb
2175−/* tok-595 %txt /tests/golden/types-recursion-scc-import-bad/tokens/txt
2175+/* tok-596 %txt /tests/golden/types-record-field-unused-mold/tokens/txt
2176−/* tre-595 %txt /tests/golden/types-recursion-scc-import-bad/tree/txt
2176+/* tre-596 %txt /tests/golden/types-record-field-unused-mold/tree/txt
2177−/* mod-595-1 %jibb /tests/golden/types-recursion-scc-import-bad/modules/ui/lib/jibb
2177+/* typ-596 %txt /tests/golden/types-record-field-unused-mold/types/txt
2178−/* typ-595 %txt /tests/golden/types-recursion-scc-import-bad/types/txt
2178+/* src-597 %jibb /tests/golden/types-record-import/source/jibb
2179−/* mtre-595 %txt /tests/golden/types-recursion-scc-import-bad/module-trees/txt
2179+/* tok-597 %txt /tests/golden/types-record-import/tokens/txt
2180−/* src-596 %jibb /tests/golden/types-recursion-scc-local/source/jibb
2180+/* tre-597 %txt /tests/golden/types-record-import/tree/txt
2181−/* tok-596 %txt /tests/golden/types-recursion-scc-local/tokens/txt
2181+/* mod-597-1 %jibb /tests/golden/types-record-import/modules/ui/lib/jibb
2182−/* tre-596 %txt /tests/golden/types-recursion-scc-local/tree/txt
2182+/* typ-597 %txt /tests/golden/types-record-import/types/txt
2183−/* typ-596 %txt /tests/golden/types-recursion-scc-local/types/txt
2183+/* mtre-597 %txt /tests/golden/types-record-import/module-trees/txt
2184−/* src-597 %jibb /tests/golden/types-recursion-scc-order/source/jibb
2184+/* src-598 %jibb /tests/golden/types-record-local-scheme/source/jibb
2185−/* tok-597 %txt /tests/golden/types-recursion-scc-order/tokens/txt
2185+/* tok-598 %txt /tests/golden/types-record-local-scheme/tokens/txt
2186−/* tre-597 %txt /tests/golden/types-recursion-scc-order/tree/txt
2186+/* tre-598 %txt /tests/golden/types-record-local-scheme/tree/txt
2187−/* typ-597 %txt /tests/golden/types-recursion-scc-order/types/txt
2187+/* typ-598 %txt /tests/golden/types-record-local-scheme/types/txt
2188−/* src-598 %jibb /tests/golden/types-recursion-scc-shadow/source/jibb
2188+/* src-599 %jibb /tests/golden/types-record-nested/source/jibb
2189−/* tok-598 %txt /tests/golden/types-recursion-scc-shadow/tokens/txt
2189+/* tok-599 %txt /tests/golden/types-record-nested/tokens/txt
2190−/* tre-598 %txt /tests/golden/types-recursion-scc-shadow/tree/txt
2190+/* tre-599 %txt /tests/golden/types-record-nested/tree/txt
2191−/* typ-598 %txt /tests/golden/types-recursion-scc-shadow/types/txt
2191+/* typ-599 %txt /tests/golden/types-record-nested/types/txt
2192−/* src-599 %jibb /tests/golden/types-recursive-branch/source/jibb
2192+/* src-600 %jibb /tests/golden/types-record-to-tuple/source/jibb
2193−/* tok-599 %txt /tests/golden/types-recursive-branch/tokens/txt
2193+/* tok-600 %txt /tests/golden/types-record-to-tuple/tokens/txt
2194−/* tre-599 %txt /tests/golden/types-recursive-branch/tree/txt
2194+/* tre-600 %txt /tests/golden/types-record-to-tuple/tree/txt
2195−/* typ-599 %txt /tests/golden/types-recursive-branch/types/txt
2195+/* typ-600 %txt /tests/golden/types-record-to-tuple/types/txt
2196−/* src-600 %jibb /tests/golden/types-recursive-gate/source/jibb
2196+/* src-601 %jibb /tests/golden/types-recursion-scc-failures/source/jibb
2197−/* tok-600 %txt /tests/golden/types-recursive-gate/tokens/txt
2197+/* tok-601 %txt /tests/golden/types-recursion-scc-failures/tokens/txt
2198−/* tre-600 %txt /tests/golden/types-recursive-gate/tree/txt
2198+/* tre-601 %txt /tests/golden/types-recursion-scc-failures/tree/txt
2199−/* typ-600 %txt /tests/golden/types-recursive-gate/types/txt
2199+/* typ-601 %txt /tests/golden/types-recursion-scc-failures/types/txt
2200−/* src-601 %jibb /tests/golden/types-recursive-sample/source/jibb
2200+/* src-602 %jibb /tests/golden/types-recursion-scc-groups/source/jibb
2201−/* tok-601 %txt /tests/golden/types-recursive-sample/tokens/txt
2201+/* tok-602 %txt /tests/golden/types-recursion-scc-groups/tokens/txt
2202−/* tre-601 %txt /tests/golden/types-recursive-sample/tree/txt
2202+/* tre-602 %txt /tests/golden/types-recursion-scc-groups/tree/txt
2203−/* typ-601 %txt /tests/golden/types-recursive-sample/types/txt
2203+/* typ-602 %txt /tests/golden/types-recursion-scc-groups/types/txt
2204−/* src-602 %jibb /tests/golden/types-request-normal/source/jibb
2204+/* src-603 %jibb /tests/golden/types-recursion-scc-import/source/jibb
2205−/* tok-602 %txt /tests/golden/types-request-normal/tokens/txt
2205+/* tok-603 %txt /tests/golden/types-recursion-scc-import/tokens/txt
2206−/* tre-602 %txt /tests/golden/types-request-normal/tree/txt
2206+/* tre-603 %txt /tests/golden/types-recursion-scc-import/tree/txt
2207−/* mod-602-1 %jibb /tests/golden/types-request-normal/modules/ui/api/demo/jibb
2207+/* mod-603-1 %jibb /tests/golden/types-recursion-scc-import/modules/ui/lib/jibb
2208−/* typ-602 %txt /tests/golden/types-request-normal/types/txt
2208+/* typ-603 %txt /tests/golden/types-recursion-scc-import/types/txt
2209−/* mark-602-1 %txt /tests/golden/types-request-normal/mar/full/txt
2209+/* mtre-603 %txt /tests/golden/types-recursion-scc-import/module-trees/txt
2210−/* mtre-602 %txt /tests/golden/types-request-normal/module-trees/txt
2210+/* src-604 %jibb /tests/golden/types-recursion-scc-import-bad/source/jibb
2211−/* src-603 %jibb /tests/golden/types-scope-library-poke/source/jibb
2211+/* tok-604 %txt /tests/golden/types-recursion-scc-import-bad/tokens/txt
2212−/* tok-603 %txt /tests/golden/types-scope-library-poke/tokens/txt
2212+/* tre-604 %txt /tests/golden/types-recursion-scc-import-bad/tree/txt
2213−/* tre-603 %txt /tests/golden/types-scope-library-poke/tree/txt
2213+/* mod-604-1 %jibb /tests/golden/types-recursion-scc-import-bad/modules/ui/lib/jibb
2214−/* typ-603 %txt /tests/golden/types-scope-library-poke/types/txt
2214+/* typ-604 %txt /tests/golden/types-recursion-scc-import-bad/types/txt
2215−/* src-604 %jibb /tests/golden/types-scope-root-api/source/jibb
2215+/* mtre-604 %txt /tests/golden/types-recursion-scc-import-bad/module-trees/txt
2216−/* tok-604 %txt /tests/golden/types-scope-root-api/tokens/txt
2216+/* src-605 %jibb /tests/golden/types-recursion-scc-local/source/jibb
2217−/* tre-604 %txt /tests/golden/types-scope-root-api/tree/txt
2217+/* tok-605 %txt /tests/golden/types-recursion-scc-local/tokens/txt
2218−/* typ-604 %txt /tests/golden/types-scope-root-api/types/txt
2218+/* tre-605 %txt /tests/golden/types-recursion-scc-local/tree/txt
2219−/* src-605 %jibb /tests/golden/types-scope-store-duplicate/source/jibb
2219+/* typ-605 %txt /tests/golden/types-recursion-scc-local/types/txt
2220−/* tok-605 %txt /tests/golden/types-scope-store-duplicate/tokens/txt
2220+/* src-606 %jibb /tests/golden/types-recursion-scc-order/source/jibb
2221−/* tre-605 %txt /tests/golden/types-scope-store-duplicate/tree/txt
2221+/* tok-606 %txt /tests/golden/types-recursion-scc-order/tokens/txt
2222−/* typ-605 %txt /tests/golden/types-scope-store-duplicate/types/txt
2222+/* tre-606 %txt /tests/golden/types-recursion-scc-order/tree/txt
2223−/* src-606 %jibb /tests/golden/types-scope-store-shadow/source/jibb
2223+/* typ-606 %txt /tests/golden/types-recursion-scc-order/types/txt
2224−/* tok-606 %txt /tests/golden/types-scope-store-shadow/tokens/txt
2224+/* src-607 %jibb /tests/golden/types-recursion-scc-shadow/source/jibb
2225−/* tre-606 %txt /tests/golden/types-scope-store-shadow/tree/txt
2225+/* tok-607 %txt /tests/golden/types-recursion-scc-shadow/tokens/txt
2226−/* typ-606 %txt /tests/golden/types-scope-store-shadow/types/txt
2226+/* tre-607 %txt /tests/golden/types-recursion-scc-shadow/tree/txt
2227−/* src-607 %jibb /tests/golden/types-single-case-pattern/source/jibb
2227+/* typ-607 %txt /tests/golden/types-recursion-scc-shadow/types/txt
2228−/* tok-607 %txt /tests/golden/types-single-case-pattern/tokens/txt
2228+/* src-608 %jibb /tests/golden/types-recursive-branch/source/jibb
2229−/* tre-607 %txt /tests/golden/types-single-case-pattern/tree/txt
2229+/* tok-608 %txt /tests/golden/types-recursive-branch/tokens/txt
2230−/* typ-607 %txt /tests/golden/types-single-case-pattern/types/txt
2230+/* tre-608 %txt /tests/golden/types-recursive-branch/tree/txt
2231−/* src-608 %jibb /tests/golden/types-string-interpolation/source/jibb
2231+/* typ-608 %txt /tests/golden/types-recursive-branch/types/txt
2232−/* tok-608 %txt /tests/golden/types-string-interpolation/tokens/txt
2232+/* src-609 %jibb /tests/golden/types-recursive-gate/source/jibb
2233−/* tre-608 %txt /tests/golden/types-string-interpolation/tree/txt
2233+/* tok-609 %txt /tests/golden/types-recursive-gate/tokens/txt
2234−/* typ-608 %txt /tests/golden/types-string-interpolation/types/txt
2234+/* tre-609 %txt /tests/golden/types-recursive-gate/tree/txt
2235−/* src-609 %jibb /tests/golden/types-tuple-context/source/jibb
2235+/* typ-609 %txt /tests/golden/types-recursive-gate/types/txt
2236−/* tok-609 %txt /tests/golden/types-tuple-context/tokens/txt
2236+/* src-610 %jibb /tests/golden/types-recursive-sample/source/jibb
2237−/* tre-609 %txt /tests/golden/types-tuple-context/tree/txt
2237+/* tok-610 %txt /tests/golden/types-recursive-sample/tokens/txt
2238−/* typ-609 %txt /tests/golden/types-tuple-context/types/txt
2238+/* tre-610 %txt /tests/golden/types-recursive-sample/tree/txt
2239−/* src-610 %jibb /tests/golden/types-tuple-context-nested/source/jibb
2239+/* typ-610 %txt /tests/golden/types-recursive-sample/types/txt
2240−/* tok-610 %txt /tests/golden/types-tuple-context-nested/tokens/txt
2240+/* src-611 %jibb /tests/golden/types-request-normal/source/jibb
2241−/* tre-610 %txt /tests/golden/types-tuple-context-nested/tree/txt
2241+/* tok-611 %txt /tests/golden/types-request-normal/tokens/txt
2242−/* typ-610 %txt /tests/golden/types-tuple-context-nested/types/txt
2242+/* tre-611 %txt /tests/golden/types-request-normal/tree/txt
2243−/* src-611 %jibb /tests/golden/types-union-alias/source/jibb
2243+/* mod-611-1 %jibb /tests/golden/types-request-normal/modules/ui/api/demo/jibb
2244−/* tok-611 %txt /tests/golden/types-union-alias/tokens/txt
2244+/* typ-611 %txt /tests/golden/types-request-normal/types/txt
2245−/* tre-611 %txt /tests/golden/types-union-alias/tree/txt
2245+/* mark-611-1 %txt /tests/golden/types-request-normal/mar/full/txt
2246−/* typ-611 %txt /tests/golden/types-union-alias/types/txt
2246+/* mtre-611 %txt /tests/golden/types-request-normal/module-trees/txt
2247−/* src-612 %jibb /tests/golden/types-union-branch-context/source/jibb
2247+/* src-612 %jibb /tests/golden/types-scope-library-poke/source/jibb
2248−/* tok-612 %txt /tests/golden/types-union-branch-context/tokens/txt
2248+/* tok-612 %txt /tests/golden/types-scope-library-poke/tokens/txt
2249−/* tre-612 %txt /tests/golden/types-union-branch-context/tree/txt
2249+/* tre-612 %txt /tests/golden/types-scope-library-poke/tree/txt
2250−/* typ-612 %txt /tests/golden/types-union-branch-context/types/txt
2250+/* typ-612 %txt /tests/golden/types-scope-library-poke/types/txt
2251−/* src-613 %jibb /tests/golden/types-union-branch-pending/source/jibb
2251+/* src-613 %jibb /tests/golden/types-scope-root-api/source/jibb
2252−/* tok-613 %txt /tests/golden/types-union-branch-pending/tokens/txt
2252+/* tok-613 %txt /tests/golden/types-scope-root-api/tokens/txt
2253−/* tre-613 %txt /tests/golden/types-union-branch-pending/tree/txt
2253+/* tre-613 %txt /tests/golden/types-scope-root-api/tree/txt
2254−/* typ-613 %txt /tests/golden/types-union-branch-pending/types/txt
2254+/* typ-613 %txt /tests/golden/types-scope-root-api/types/txt
2255−/* src-614 %jibb /tests/golden/types-union-constructor-shape/source/jibb
2255+/* src-614 %jibb /tests/golden/types-scope-store-duplicate/source/jibb
2256−/* tok-614 %txt /tests/golden/types-union-constructor-shape/tokens/txt
2256+/* tok-614 %txt /tests/golden/types-scope-store-duplicate/tokens/txt
2257−/* tre-614 %txt /tests/golden/types-union-constructor-shape/tree/txt
2257+/* tre-614 %txt /tests/golden/types-scope-store-duplicate/tree/txt
2258−/* typ-614 %txt /tests/golden/types-union-constructor-shape/types/txt
2258+/* typ-614 %txt /tests/golden/types-scope-store-duplicate/types/txt
2259−/* src-615 %jibb /tests/golden/types-union-context-flow/source/jibb
2259+/* src-615 %jibb /tests/golden/types-scope-store-shadow/source/jibb
2260−/* tok-615 %txt /tests/golden/types-union-context-flow/tokens/txt
2260+/* tok-615 %txt /tests/golden/types-scope-store-shadow/tokens/txt
2261−/* tre-615 %txt /tests/golden/types-union-context-flow/tree/txt
2261+/* tre-615 %txt /tests/golden/types-scope-store-shadow/tree/txt
2262−/* typ-615 %txt /tests/golden/types-union-context-flow/types/txt
2262+/* typ-615 %txt /tests/golden/types-scope-store-shadow/types/txt
2263−/* src-616 %jibb /tests/golden/types-union-finite/source/jibb
2263+/* src-616 %jibb /tests/golden/types-single-case-pattern/source/jibb
2264−/* tok-616 %txt /tests/golden/types-union-finite/tokens/txt
2264+/* tok-616 %txt /tests/golden/types-single-case-pattern/tokens/txt
2265−/* tre-616 %txt /tests/golden/types-union-finite/tree/txt
2265+/* tre-616 %txt /tests/golden/types-single-case-pattern/tree/txt
2266−/* typ-616 %txt /tests/golden/types-union-finite/types/txt
2266+/* typ-616 %txt /tests/golden/types-single-case-pattern/types/txt
2267−/* src-617 %jibb /tests/golden/types-union-finite-context/source/jibb
2267+/* src-617 %jibb /tests/golden/types-string-interpolation/source/jibb
2268−/* tok-617 %txt /tests/golden/types-union-finite-context/tokens/txt
2268+/* tok-617 %txt /tests/golden/types-string-interpolation/tokens/txt
2269−/* tre-617 %txt /tests/golden/types-union-finite-context/tree/txt
2269+/* tre-617 %txt /tests/golden/types-string-interpolation/tree/txt
2270−/* typ-617 %txt /tests/golden/types-union-finite-context/types/txt
2270+/* typ-617 %txt /tests/golden/types-string-interpolation/types/txt
2271−/* src-618 %jibb /tests/golden/types-union-finite-generic/source/jibb
2271+/* src-618 %jibb /tests/golden/types-tuple-context/source/jibb
2272−/* tok-618 %txt /tests/golden/types-union-finite-generic/tokens/txt
2272+/* tok-618 %txt /tests/golden/types-tuple-context/tokens/txt
2273−/* tre-618 %txt /tests/golden/types-union-finite-generic/tree/txt
2273+/* tre-618 %txt /tests/golden/types-tuple-context/tree/txt
2274−/* typ-618 %txt /tests/golden/types-union-finite-generic/types/txt
2274+/* typ-618 %txt /tests/golden/types-tuple-context/types/txt
2275−/* src-619 %jibb /tests/golden/types-union-finite-limit/source/jibb
2275+/* src-619 %jibb /tests/golden/types-tuple-context-nested/source/jibb
2276−/* tok-619 %txt /tests/golden/types-union-finite-limit/tokens/txt
2276+/* tok-619 %txt /tests/golden/types-tuple-context-nested/tokens/txt
2277−/* tre-619 %txt /tests/golden/types-union-finite-limit/tree/txt
2277+/* tre-619 %txt /tests/golden/types-tuple-context-nested/tree/txt
2278−/* typ-619 %txt /tests/golden/types-union-finite-limit/types/txt
2278+/* typ-619 %txt /tests/golden/types-tuple-context-nested/types/txt
2279−/* src-620 %jibb /tests/golden/types-union-import/source/jibb
2279+/* src-620 %jibb /tests/golden/types-union-alias/source/jibb
2280−/* tok-620 %txt /tests/golden/types-union-import/tokens/txt
2280+/* tok-620 %txt /tests/golden/types-union-alias/tokens/txt
2281−/* tre-620 %txt /tests/golden/types-union-import/tree/txt
2281+/* tre-620 %txt /tests/golden/types-union-alias/tree/txt
2282−/* mod-620-1 %jibb /tests/golden/types-union-import/modules/ui/lib/jibb
2282+/* typ-620 %txt /tests/golden/types-union-alias/types/txt
2283−/* typ-620 %txt /tests/golden/types-union-import/types/txt
2283+/* src-621 %jibb /tests/golden/types-union-branch-context/source/jibb
2284−/* mtre-620 %txt /tests/golden/types-union-import/module-trees/txt
2284+/* tok-621 %txt /tests/golden/types-union-branch-context/tokens/txt
2285−/* src-621 %jibb /tests/golden/types-union-local-pending/source/jibb
2285+/* tre-621 %txt /tests/golden/types-union-branch-context/tree/txt
2286−/* tok-621 %txt /tests/golden/types-union-local-pending/tokens/txt
2286+/* typ-621 %txt /tests/golden/types-union-branch-context/types/txt
2287−/* tre-621 %txt /tests/golden/types-union-local-pending/tree/txt
2287+/* src-622 %jibb /tests/golden/types-union-branch-pending/source/jibb
2288−/* typ-621 %txt /tests/golden/types-union-local-pending/types/txt
2288+/* tok-622 %txt /tests/golden/types-union-branch-pending/tokens/txt
2289−/* src-622 %jibb /tests/golden/types-union-nonwing-subject/source/jibb
2289+/* tre-622 %txt /tests/golden/types-union-branch-pending/tree/txt
2290−/* tok-622 %txt /tests/golden/types-union-nonwing-subject/tokens/txt
2290+/* typ-622 %txt /tests/golden/types-union-branch-pending/types/txt
2291−/* tre-622 %txt /tests/golden/types-union-nonwing-subject/tree/txt
2291+/* src-623 %jibb /tests/golden/types-union-constructor-shape/source/jibb
2292−/* typ-622 %txt /tests/golden/types-union-nonwing-subject/types/txt
2292+/* tok-623 %txt /tests/golden/types-union-constructor-shape/tokens/txt
2293−/* src-623 %jibb /tests/golden/types-union-overlap/source/jibb
2293+/* tre-623 %txt /tests/golden/types-union-constructor-shape/tree/txt
2294−/* tok-623 %txt /tests/golden/types-union-overlap/tokens/txt
2294+/* typ-623 %txt /tests/golden/types-union-constructor-shape/types/txt
2295−/* tre-623 %txt /tests/golden/types-union-overlap/tree/txt
2295+/* src-624 %jibb /tests/golden/types-union-context-flow/source/jibb
2296−/* typ-623 %txt /tests/golden/types-union-overlap/types/txt
2296+/* tok-624 %txt /tests/golden/types-union-context-flow/tokens/txt
2297−/* src-624 %jibb /tests/golden/types-union-overlap-nested/source/jibb
2297+/* tre-624 %txt /tests/golden/types-union-context-flow/tree/txt
2298−/* tok-624 %txt /tests/golden/types-union-overlap-nested/tokens/txt
2298+/* typ-624 %txt /tests/golden/types-union-context-flow/types/txt
2299−/* tre-624 %txt /tests/golden/types-union-overlap-nested/tree/txt
2299+/* src-625 %jibb /tests/golden/types-union-finite/source/jibb
2300−/* typ-624 %txt /tests/golden/types-union-overlap-nested/types/txt
2300+/* tok-625 %txt /tests/golden/types-union-finite/tokens/txt
2301−/* src-625 %jibb /tests/golden/types-union-pattern-result-context/source/jibb
2301+/* tre-625 %txt /tests/golden/types-union-finite/tree/txt
2302−/* tok-625 %txt /tests/golden/types-union-pattern-result-context/tokens/txt
2302+/* typ-625 %txt /tests/golden/types-union-finite/types/txt
2303−/* tre-625 %txt /tests/golden/types-union-pattern-result-context/tree/txt
2303+/* src-626 %jibb /tests/golden/types-union-finite-context/source/jibb
2304−/* typ-625 %txt /tests/golden/types-union-pattern-result-context/types/txt
2304+/* tok-626 %txt /tests/golden/types-union-finite-context/tokens/txt
2305−/* src-626 %jibb /tests/golden/types-union-pattern-result-controls/source/jibb
2305+/* tre-626 %txt /tests/golden/types-union-finite-context/tree/txt
2306−/* tok-626 %txt /tests/golden/types-union-pattern-result-controls/tokens/txt
2306+/* typ-626 %txt /tests/golden/types-union-finite-context/types/txt
2307−/* tre-626 %txt /tests/golden/types-union-pattern-result-controls/tree/txt
2307+/* src-627 %jibb /tests/golden/types-union-finite-generic/source/jibb
2308−/* typ-626 %txt /tests/golden/types-union-pattern-result-controls/types/txt
2308+/* tok-627 %txt /tests/golden/types-union-finite-generic/tokens/txt
2309−/* src-627 %jibb /tests/golden/types-union-patterns/source/jibb
2309+/* tre-627 %txt /tests/golden/types-union-finite-generic/tree/txt
2310−/* tok-627 %txt /tests/golden/types-union-patterns/tokens/txt
2310+/* typ-627 %txt /tests/golden/types-union-finite-generic/types/txt
2311−/* tre-627 %txt /tests/golden/types-union-patterns/tree/txt
2311+/* src-628 %jibb /tests/golden/types-union-finite-limit/source/jibb
2312−/* typ-627 %txt /tests/golden/types-union-patterns/types/txt
2312+/* tok-628 %txt /tests/golden/types-union-finite-limit/tokens/txt
2313−/* src-628 %jibb /tests/golden/types-union-patterns-generic/source/jibb
2313+/* tre-628 %txt /tests/golden/types-union-finite-limit/tree/txt
2314−/* tok-628 %txt /tests/golden/types-union-patterns-generic/tokens/txt
2314+/* typ-628 %txt /tests/golden/types-union-finite-limit/types/txt
2315−/* tre-628 %txt /tests/golden/types-union-patterns-generic/tree/txt
2315+/* src-629 %jibb /tests/golden/types-union-import/source/jibb
2316−/* typ-628 %txt /tests/golden/types-union-patterns-generic/types/txt
2316+/* tok-629 %txt /tests/golden/types-union-import/tokens/txt
2317−/* src-629 %jibb /tests/golden/types-union-patterns-import/source/jibb
2317+/* tre-629 %txt /tests/golden/types-union-import/tree/txt
2318−/* tok-629 %txt /tests/golden/types-union-patterns-import/tokens/txt
2318+/* mod-629-1 %jibb /tests/golden/types-union-import/modules/ui/lib/jibb
2319−/* tre-629 %txt /tests/golden/types-union-patterns-import/tree/txt
2319+/* typ-629 %txt /tests/golden/types-union-import/types/txt
2320−/* mod-629-1 %jibb /tests/golden/types-union-patterns-import/modules/ui/lib/jibb
2320+/* mtre-629 %txt /tests/golden/types-union-import/module-trees/txt
2321−/* typ-629 %txt /tests/golden/types-union-patterns-import/types/txt
2321+/* src-630 %jibb /tests/golden/types-union-local-pending/source/jibb
2322−/* mtre-629 %txt /tests/golden/types-union-patterns-import/module-trees/txt
2322+/* tok-630 %txt /tests/golden/types-union-local-pending/tokens/txt
2323−/* src-630 %jibb /tests/golden/types-union-phantom-generic/source/jibb
2323+/* tre-630 %txt /tests/golden/types-union-local-pending/tree/txt
2324−/* tok-630 %txt /tests/golden/types-union-phantom-generic/tokens/txt
2324+/* typ-630 %txt /tests/golden/types-union-local-pending/types/txt
2325−/* tre-630 %txt /tests/golden/types-union-phantom-generic/tree/txt
2325+/* src-631 %jibb /tests/golden/types-union-nonwing-subject/source/jibb
2326−/* typ-630 %txt /tests/golden/types-union-phantom-generic/types/txt
2326+/* tok-631 %txt /tests/golden/types-union-nonwing-subject/tokens/txt
2327−/* src-631 %jibb /tests/golden/types-union-polymorphic-identity/source/jibb
2327+/* tre-631 %txt /tests/golden/types-union-nonwing-subject/tree/txt
2328−/* tok-631 %txt /tests/golden/types-union-polymorphic-identity/tokens/txt
2328+/* typ-631 %txt /tests/golden/types-union-nonwing-subject/types/txt
2329−/* tre-631 %txt /tests/golden/types-union-polymorphic-identity/tree/txt
2329+/* src-632 %jibb /tests/golden/types-union-overlap/source/jibb
2330−/* mod-631-1 %jibb /tests/golden/types-union-polymorphic-identity/modules/ui/one/jibb
2330+/* tok-632 %txt /tests/golden/types-union-overlap/tokens/txt
2331−/* mod-631-2 %jibb /tests/golden/types-union-polymorphic-identity/modules/ui/two/jibb
2331+/* tre-632 %txt /tests/golden/types-union-overlap/tree/txt
2332−/* typ-631 %txt /tests/golden/types-union-polymorphic-identity/types/txt
2332+/* typ-632 %txt /tests/golden/types-union-overlap/types/txt
2333−/* mtre-631 %txt /tests/golden/types-union-polymorphic-identity/module-trees/txt
2333+/* src-633 %jibb /tests/golden/types-union-overlap-nested/source/jibb
2334−/* src-632 %jibb /tests/golden/types-union-print-cross-namespace/source/jibb
2334+/* tok-633 %txt /tests/golden/types-union-overlap-nested/tokens/txt
2335−/* tok-632 %txt /tests/golden/types-union-print-cross-namespace/tokens/txt
2335+/* tre-633 %txt /tests/golden/types-union-overlap-nested/tree/txt
2336−/* tre-632 %txt /tests/golden/types-union-print-cross-namespace/tree/txt
2336+/* typ-633 %txt /tests/golden/types-union-overlap-nested/types/txt
2337−/* mod-632-1 %jibb /tests/golden/types-union-print-cross-namespace/modules/ui/lib/jibb
2337+/* src-634 %jibb /tests/golden/types-union-pattern-result-context/source/jibb
2338−/* typ-632 %txt /tests/golden/types-union-print-cross-namespace/types/txt
2338+/* tok-634 %txt /tests/golden/types-union-pattern-result-context/tokens/txt
2339−/* mtre-632 %txt /tests/golden/types-union-print-cross-namespace/module-trees/txt
2339+/* tre-634 %txt /tests/golden/types-union-pattern-result-context/tree/txt
2340−/* src-633 %jibb /tests/golden/types-union-print-distinct/source/jibb
2340+/* typ-634 %txt /tests/golden/types-union-pattern-result-context/types/txt
2341−/* tok-633 %txt /tests/golden/types-union-print-distinct/tokens/txt
2341+/* src-635 %jibb /tests/golden/types-union-pattern-result-controls/source/jibb
2342−/* tre-633 %txt /tests/golden/types-union-print-distinct/tree/txt
2342+/* tok-635 %txt /tests/golden/types-union-pattern-result-controls/tokens/txt
2343−/* mod-633-1 %jibb /tests/golden/types-union-print-distinct/modules/ui/left/jibb
2343+/* tre-635 %txt /tests/golden/types-union-pattern-result-controls/tree/txt
2344−/* mod-633-2 %jibb /tests/golden/types-union-print-distinct/modules/ui/right/jibb
2344+/* typ-635 %txt /tests/golden/types-union-pattern-result-controls/types/txt
2345−/* mod-633-3 %jibb /tests/golden/types-union-print-distinct/modules/ui/twin/jibb
2345+/* src-636 %jibb /tests/golden/types-union-patterns/source/jibb
2346−/* typ-633 %txt /tests/golden/types-union-print-distinct/types/txt
2346+/* tok-636 %txt /tests/golden/types-union-patterns/tokens/txt
2347−/* mtre-633 %txt /tests/golden/types-union-print-distinct/module-trees/txt
2347+/* tre-636 %txt /tests/golden/types-union-patterns/tree/txt
2348−/* src-634 %jibb /tests/golden/types-union-print-escape/source/jibb
2348+/* typ-636 %txt /tests/golden/types-union-patterns/types/txt
2349−/* tok-634 %txt /tests/golden/types-union-print-escape/tokens/txt
2349+/* src-637 %jibb /tests/golden/types-union-patterns-generic/source/jibb
2350−/* tre-634 %txt /tests/golden/types-union-print-escape/tree/txt
2350+/* tok-637 %txt /tests/golden/types-union-patterns-generic/tokens/txt
2351−/* typ-634 %txt /tests/golden/types-union-print-escape/types/txt
2351+/* tre-637 %txt /tests/golden/types-union-patterns-generic/tree/txt
2352−/* src-635 %jibb /tests/golden/types-union-print-local/source/jibb
2352+/* typ-637 %txt /tests/golden/types-union-patterns-generic/types/txt
2353−/* tok-635 %txt /tests/golden/types-union-print-local/tokens/txt
2353+/* src-638 %jibb /tests/golden/types-union-patterns-import/source/jibb
2354−/* tre-635 %txt /tests/golden/types-union-print-local/tree/txt
2354+/* tok-638 %txt /tests/golden/types-union-patterns-import/tokens/txt
2355−/* typ-635 %txt /tests/golden/types-union-print-local/types/txt
2355+/* tre-638 %txt /tests/golden/types-union-patterns-import/tree/txt
2356−/* src-636 %jibb /tests/golden/types-union-print-nested/source/jibb
2356+/* mod-638-1 %jibb /tests/golden/types-union-patterns-import/modules/ui/lib/jibb
2357−/* tok-636 %txt /tests/golden/types-union-print-nested/tokens/txt
2357+/* typ-638 %txt /tests/golden/types-union-patterns-import/types/txt
2358−/* tre-636 %txt /tests/golden/types-union-print-nested/tree/txt
2358+/* mtre-638 %txt /tests/golden/types-union-patterns-import/module-trees/txt
2359−/* typ-636 %txt /tests/golden/types-union-print-nested/types/txt
2359+/* src-639 %jibb /tests/golden/types-union-phantom-generic/source/jibb
2360−/* src-637 %jibb /tests/golden/types-union-print-same-origin/source/jibb
2360+/* tok-639 %txt /tests/golden/types-union-phantom-generic/tokens/txt
2361−/* tok-637 %txt /tests/golden/types-union-print-same-origin/tokens/txt
2361+/* tre-639 %txt /tests/golden/types-union-phantom-generic/tree/txt
2362−/* tre-637 %txt /tests/golden/types-union-print-same-origin/tree/txt
2362+/* typ-639 %txt /tests/golden/types-union-phantom-generic/types/txt
2363−/* mod-637-1 %jibb /tests/golden/types-union-print-same-origin/modules/ui/shared/jibb
2363+/* src-640 %jibb /tests/golden/types-union-polymorphic-identity/source/jibb
2364−/* typ-637 %txt /tests/golden/types-union-print-same-origin/types/txt
2364+/* tok-640 %txt /tests/golden/types-union-polymorphic-identity/tokens/txt
2365−/* mtre-637 %txt /tests/golden/types-union-print-same-origin/module-trees/txt
2365+/* tre-640 %txt /tests/golden/types-union-polymorphic-identity/tree/txt
2366−/* src-638 %jibb /tests/golden/types-union-print-transitive/source/jibb
2366+/* mod-640-1 %jibb /tests/golden/types-union-polymorphic-identity/modules/ui/one/jibb
2367−/* tok-638 %txt /tests/golden/types-union-print-transitive/tokens/txt
2367+/* mod-640-2 %jibb /tests/golden/types-union-polymorphic-identity/modules/ui/two/jibb
2368−/* tre-638 %txt /tests/golden/types-union-print-transitive/tree/txt
2368+/* typ-640 %txt /tests/golden/types-union-polymorphic-identity/types/txt
2369−/* mod-638-1 %jibb /tests/golden/types-union-print-transitive/modules/ui/mid/jibb
2369+/* mtre-640 %txt /tests/golden/types-union-polymorphic-identity/module-trees/txt
2370−/* mod-638-2 %jibb /tests/golden/types-union-print-transitive/modules/ui/base/jibb
2370+/* src-641 %jibb /tests/golden/types-union-print-cross-namespace/source/jibb
2371−/* typ-638 %txt /tests/golden/types-union-print-transitive/types/txt
2371+/* tok-641 %txt /tests/golden/types-union-print-cross-namespace/tokens/txt
2372−/* mtre-638 %txt /tests/golden/types-union-print-transitive/module-trees/txt
2372+/* tre-641 %txt /tests/golden/types-union-print-cross-namespace/tree/txt
2373−/* src-639 %jibb /tests/golden/types-union-singleton/source/jibb
2373+/* mod-641-1 %jibb /tests/golden/types-union-print-cross-namespace/modules/ui/lib/jibb
2374−/* tok-639 %txt /tests/golden/types-union-singleton/tokens/txt
2374+/* typ-641 %txt /tests/golden/types-union-print-cross-namespace/types/txt
2375−/* tre-639 %txt /tests/golden/types-union-singleton/tree/txt
2375+/* mtre-641 %txt /tests/golden/types-union-print-cross-namespace/module-trees/txt
2376−/* typ-639 %txt /tests/golden/types-union-singleton/types/txt
2376+/* src-642 %jibb /tests/golden/types-union-print-distinct/source/jibb
2377−/* src-640 %jibb /tests/golden/types-union-tag-atoms/source/jibb
2377+/* tok-642 %txt /tests/golden/types-union-print-distinct/tokens/txt
2378−/* tok-640 %txt /tests/golden/types-union-tag-atoms/tokens/txt
2378+/* tre-642 %txt /tests/golden/types-union-print-distinct/tree/txt
2379−/* tre-640 %txt /tests/golden/types-union-tag-atoms/tree/txt
2379+/* mod-642-1 %jibb /tests/golden/types-union-print-distinct/modules/ui/left/jibb
2380−/* typ-640 %txt /tests/golden/types-union-tag-atoms/types/txt
2380+/* mod-642-2 %jibb /tests/golden/types-union-print-distinct/modules/ui/right/jibb
2381−/* src-641 %jibb /tests/golden/types-union-tags/source/jibb
2381+/* mod-642-3 %jibb /tests/golden/types-union-print-distinct/modules/ui/twin/jibb
2382−/* tok-641 %txt /tests/golden/types-union-tags/tokens/txt
2382+/* typ-642 %txt /tests/golden/types-union-print-distinct/types/txt
2383−/* tre-641 %txt /tests/golden/types-union-tags/tree/txt
2383+/* mtre-642 %txt /tests/golden/types-union-print-distinct/module-trees/txt
2384−/* typ-641 %txt /tests/golden/types-union-tags/types/txt
2384+/* src-643 %jibb /tests/golden/types-union-print-escape/source/jibb
2385−/* src-642 %jibb /tests/golden/types-union-unresolved/source/jibb
2385+/* tok-643 %txt /tests/golden/types-union-print-escape/tokens/txt
2386−/* tok-642 %txt /tests/golden/types-union-unresolved/tokens/txt
2386+/* tre-643 %txt /tests/golden/types-union-print-escape/tree/txt
2387−/* tre-642 %txt /tests/golden/types-union-unresolved/tree/txt
2387+/* typ-643 %txt /tests/golden/types-union-print-escape/types/txt
2388−/* typ-642 %txt /tests/golden/types-union-unresolved/types/txt
2388+/* src-644 %jibb /tests/golden/types-union-print-local/source/jibb
2389−/* src-643 %jibb /tests/golden/types-union-unresolved-flow/source/jibb
2389+/* tok-644 %txt /tests/golden/types-union-print-local/tokens/txt
2390−/* tok-643 %txt /tests/golden/types-union-unresolved-flow/tokens/txt
2390+/* tre-644 %txt /tests/golden/types-union-print-local/tree/txt
2391−/* tre-643 %txt /tests/golden/types-union-unresolved-flow/tree/txt
2391+/* typ-644 %txt /tests/golden/types-union-print-local/types/txt
2392−/* typ-643 %txt /tests/golden/types-union-unresolved-flow/types/txt
2392+/* src-645 %jibb /tests/golden/types-union-print-nested/source/jibb
2393−/* src-644 %jibb /tests/golden/types-unit-construction/source/jibb
2393+/* tok-645 %txt /tests/golden/types-union-print-nested/tokens/txt
2394−/* tok-644 %txt /tests/golden/types-unit-construction/tokens/txt
2394+/* tre-645 %txt /tests/golden/types-union-print-nested/tree/txt
2395−/* tre-644 %txt /tests/golden/types-unit-construction/tree/txt
2395+/* typ-645 %txt /tests/golden/types-union-print-nested/types/txt
2396−/* typ-644 %txt /tests/golden/types-unit-construction/types/txt
2396+/* src-646 %jibb /tests/golden/types-union-print-same-origin/source/jibb
2397−/* src-645 %jibb /tests/golden/types-unit-context/source/jibb
2397+/* tok-646 %txt /tests/golden/types-union-print-same-origin/tokens/txt
2398−/* tok-645 %txt /tests/golden/types-unit-context/tokens/txt
2398+/* tre-646 %txt /tests/golden/types-union-print-same-origin/tree/txt
2399−/* tre-645 %txt /tests/golden/types-unit-context/tree/txt
2399+/* mod-646-1 %jibb /tests/golden/types-union-print-same-origin/modules/ui/shared/jibb
2400−/* typ-645 %txt /tests/golden/types-unit-context/types/txt
2400+/* typ-646 %txt /tests/golden/types-union-print-same-origin/types/txt
2401−/* src-646 %jibb /tests/golden/types-unit-patterns/source/jibb
2401+/* mtre-646 %txt /tests/golden/types-union-print-same-origin/module-trees/txt
2402−/* tok-646 %txt /tests/golden/types-unit-patterns/tokens/txt
2402+/* src-647 %jibb /tests/golden/types-union-print-transitive/source/jibb
2403−/* tre-646 %txt /tests/golden/types-unit-patterns/tree/txt
2403+/* tok-647 %txt /tests/golden/types-union-print-transitive/tokens/txt
2404−/* typ-646 %txt /tests/golden/types-unit-patterns/types/txt
2404+/* tre-647 %txt /tests/golden/types-union-print-transitive/tree/txt
2405−/* src-647 %jibb /tests/golden/types-value-cycle-shadow/source/jibb
2405+/* mod-647-1 %jibb /tests/golden/types-union-print-transitive/modules/ui/mid/jibb
2406−/* tok-647 %txt /tests/golden/types-value-cycle-shadow/tokens/txt
2406+/* mod-647-2 %jibb /tests/golden/types-union-print-transitive/modules/ui/base/jibb
2407−/* tre-647 %txt /tests/golden/types-value-cycle-shadow/tree/txt
2407+/* typ-647 %txt /tests/golden/types-union-print-transitive/types/txt
2408−/* typ-647 %txt /tests/golden/types-value-cycle-shadow/types/txt
2408+/* mtre-647 %txt /tests/golden/types-union-print-transitive/module-trees/txt
2409−/* src-648 %jibb /tests/golden/types-value-cycle-unsupported/source/jibb
2409+/* src-648 %jibb /tests/golden/types-union-runtime-equality/source/jibb
2410−/* tok-648 %txt /tests/golden/types-value-cycle-unsupported/tokens/txt
2410+/* tok-648 %txt /tests/golden/types-union-runtime-equality/tokens/txt
2411−/* tre-648 %txt /tests/golden/types-value-cycle-unsupported/tree/txt
2411+/* tre-648 %txt /tests/golden/types-union-runtime-equality/tree/txt
2412−/* typ-648 %txt /tests/golden/types-value-cycle-unsupported/types/txt
2412+/* typ-648 %txt /tests/golden/types-union-runtime-equality/types/txt
2413−/* src-649 %jibb /tests/golden/types-value-cycles/source/jibb
2413+/* src-649 %jibb /tests/golden/types-union-singleton/source/jibb
2414−/* tok-649 %txt /tests/golden/types-value-cycles/tokens/txt
2414+/* tok-649 %txt /tests/golden/types-union-singleton/tokens/txt
2415−/* tre-649 %txt /tests/golden/types-value-cycles/tree/txt
2415+/* tre-649 %txt /tests/golden/types-union-singleton/tree/txt
2416−/* typ-649 %txt /tests/golden/types-value-cycles/types/txt
2416+/* typ-649 %txt /tests/golden/types-union-singleton/types/txt
2417+/* src-650 %jibb /tests/golden/types-union-source-alias/source/jibb
2418+/* tok-650 %txt /tests/golden/types-union-source-alias/tokens/txt
2419+/* tre-650 %txt /tests/golden/types-union-source-alias/tree/txt
2420+/* typ-650 %txt /tests/golden/types-union-source-alias/types/txt
2421+/* src-651 %jibb /tests/golden/types-union-tag-atoms/source/jibb
2422+/* tok-651 %txt /tests/golden/types-union-tag-atoms/tokens/txt
2423+/* tre-651 %txt /tests/golden/types-union-tag-atoms/tree/txt
2424+/* typ-651 %txt /tests/golden/types-union-tag-atoms/types/txt
2425+/* src-652 %jibb /tests/golden/types-union-tags/source/jibb
2426+/* tok-652 %txt /tests/golden/types-union-tags/tokens/txt
2427+/* tre-652 %txt /tests/golden/types-union-tags/tree/txt
2428+/* typ-652 %txt /tests/golden/types-union-tags/types/txt
2429+/* src-653 %jibb /tests/golden/types-union-unresolved/source/jibb
2430+/* tok-653 %txt /tests/golden/types-union-unresolved/tokens/txt
2431+/* tre-653 %txt /tests/golden/types-union-unresolved/tree/txt
2432+/* typ-653 %txt /tests/golden/types-union-unresolved/types/txt
2433+/* src-654 %jibb /tests/golden/types-union-unresolved-flow/source/jibb
2434+/* tok-654 %txt /tests/golden/types-union-unresolved-flow/tokens/txt
2435+/* tre-654 %txt /tests/golden/types-union-unresolved-flow/tree/txt
2436+/* typ-654 %txt /tests/golden/types-union-unresolved-flow/types/txt
2437+/* src-655 %jibb /tests/golden/types-unit-construction/source/jibb
2438+/* tok-655 %txt /tests/golden/types-unit-construction/tokens/txt
2439+/* tre-655 %txt /tests/golden/types-unit-construction/tree/txt
2440+/* typ-655 %txt /tests/golden/types-unit-construction/types/txt
2441+/* src-656 %jibb /tests/golden/types-unit-context/source/jibb
2442+/* tok-656 %txt /tests/golden/types-unit-context/tokens/txt
2443+/* tre-656 %txt /tests/golden/types-unit-context/tree/txt
2444+/* typ-656 %txt /tests/golden/types-unit-context/types/txt
2445+/* src-657 %jibb /tests/golden/types-unit-patterns/source/jibb
2446+/* tok-657 %txt /tests/golden/types-unit-patterns/tokens/txt
2447+/* tre-657 %txt /tests/golden/types-unit-patterns/tree/txt
2448+/* typ-657 %txt /tests/golden/types-unit-patterns/types/txt
2449+/* src-658 %jibb /tests/golden/types-value-cycle-shadow/source/jibb
2450+/* tok-658 %txt /tests/golden/types-value-cycle-shadow/tokens/txt
2451+/* tre-658 %txt /tests/golden/types-value-cycle-shadow/tree/txt
2452+/* typ-658 %txt /tests/golden/types-value-cycle-shadow/types/txt
2453+/* src-659 %jibb /tests/golden/types-value-cycle-unsupported/source/jibb
2454+/* tok-659 %txt /tests/golden/types-value-cycle-unsupported/tokens/txt
2455+/* tre-659 %txt /tests/golden/types-value-cycle-unsupported/tree/txt
2456+/* typ-659 %txt /tests/golden/types-value-cycle-unsupported/types/txt
2457+/* src-660 %jibb /tests/golden/types-value-cycles/source/jibb
2458+/* tok-660 %txt /tests/golden/types-value-cycles/tokens/txt
2459+/* tre-660 %txt /tests/golden/types-value-cycles/tree/txt
2460+/* typ-660 %txt /tests/golden/types-value-cycles/types/txt
2417=/ prepared-prelude (prepare-prelude-with-internal:jibb prelude-source internal-source)
2461=/ prepared-prelude (prepare-prelude-with-internal:jibb prelude-source internal-source)
2418|%
2462|%
2419:: one arm per case
2463:: one arm per case
@@ -3248,474 +3292,496 @@
3248 (weld (check ~.types-arithmetic-scopes src-414 `tok-414 `tre-414) (check-module-types ~.types-arithmetic-scopes ~[%tests %golden ~.types-arithmetic-scopes %source %jibb] src-414 `typ-414 ~ ~ ~))
3292 (weld (check ~.types-arithmetic-scopes src-414 `tok-414 `tre-414) (check-module-types ~.types-arithmetic-scopes ~[%tests %golden ~.types-arithmetic-scopes %source %jibb] src-414 `typ-414 ~ ~ ~))
3249++ test-types-capital-distinct
3293++ test-types-capital-distinct
3250 (weld (check ~.types-capital-distinct src-415 `tok-415 `tre-415) (check-types ~.types-capital-distinct ~[%tests %golden ~.types-capital-distinct %source %jibb] src-415 `typ-415))
3294 (weld (check ~.types-capital-distinct src-415 `tok-415 `tre-415) (check-types ~.types-capital-distinct ~[%tests %golden ~.types-capital-distinct %source %jibb] src-415 `typ-415))
3295+++ test-types-cell-branch-context
3296+ (weld (check ~.types-cell-branch-context src-416 `tok-416 `tre-416) (check-module-types ~.types-cell-branch-context ~[%tests %golden ~.types-cell-branch-context %source %jibb] src-416 `typ-416 ~ ~ ~))
3251++ test-types-cell-pattern-many
3297++ test-types-cell-pattern-many
3252− (weld (check ~.types-cell-pattern-many src-416 `tok-416 `tre-416) (check-module-types ~.types-cell-pattern-many ~[%tests %golden ~.types-cell-pattern-many %source %jibb] src-416 `typ-416 ~ ~ ~))
3298+ (weld (check ~.types-cell-pattern-many src-417 `tok-417 `tre-417) (check-module-types ~.types-cell-pattern-many ~[%tests %golden ~.types-cell-pattern-many %source %jibb] src-417 `typ-417 ~ ~ ~))
3253++ test-types-cell-pattern-schemes
3299++ test-types-cell-pattern-schemes
3254− (weld (check ~.types-cell-pattern-schemes src-417 `tok-417 `tre-417) (check-module-types ~.types-cell-pattern-schemes ~[%tests %golden ~.types-cell-pattern-schemes %source %jibb] src-417 `typ-417 ~ ~ ~))
3300+ (weld (check ~.types-cell-pattern-schemes src-418 `tok-418 `tre-418) (check-module-types ~.types-cell-pattern-schemes ~[%tests %golden ~.types-cell-pattern-schemes %source %jibb] src-418 `typ-418 ~ ~ ~))
3255++ test-types-cell-pattern-tail
3301++ test-types-cell-pattern-tail
3256− (weld (check ~.types-cell-pattern-tail src-418 `tok-418 `tre-418) (check-module-types ~.types-cell-pattern-tail ~[%tests %golden ~.types-cell-pattern-tail %source %jibb] src-418 `typ-418 ~ ~ ~))
3302+ (weld (check ~.types-cell-pattern-tail src-419 `tok-419 `tre-419) (check-module-types ~.types-cell-pattern-tail ~[%tests %golden ~.types-cell-pattern-tail %source %jibb] src-419 `typ-419 ~ ~ ~))
3257++ test-types-constructor-context
3303++ test-types-constructor-context
3258− (weld (check ~.types-constructor-context src-419 `tok-419 `tre-419) (check-types ~.types-constructor-context ~[%tests %golden ~.types-constructor-context %source %jibb] src-419 `typ-419))
3304+ (weld (check ~.types-constructor-context src-420 `tok-420 `tre-420) (check-types ~.types-constructor-context ~[%tests %golden ~.types-constructor-context %source %jibb] src-420 `typ-420))
3259++ test-types-deferred-call-context
3305++ test-types-deferred-call-context
3260− (weld (check ~.types-deferred-call-context src-420 `tok-420 `tre-420) (check-module-types ~.types-deferred-call-context ~[%tests %golden ~.types-deferred-call-context %source %jibb] src-420 `typ-420 ~ ~ ~))
3306+ (weld (check ~.types-deferred-call-context src-421 `tok-421 `tre-421) (check-module-types ~.types-deferred-call-context ~[%tests %golden ~.types-deferred-call-context %source %jibb] src-421 `typ-421 ~ ~ ~))
3261++ test-types-equal-head-disjoint
3307++ test-types-equal-head-disjoint
3262− (weld (check ~.types-equal-head-disjoint src-421 `tok-421 `tre-421) (check-types ~.types-equal-head-disjoint ~[%tests %golden ~.types-equal-head-disjoint %source %jibb] src-421 `typ-421))
3308+ (weld (check ~.types-equal-head-disjoint src-422 `tok-422 `tre-422) (check-types ~.types-equal-head-disjoint ~[%tests %golden ~.types-equal-head-disjoint %source %jibb] src-422 `typ-422))
3263++ test-types-flag-branch-context
3309++ test-types-flag-branch-context
3264− (weld (check ~.types-flag-branch-context src-422 `tok-422 `tre-422) (check-module-types ~.types-flag-branch-context ~[%tests %golden ~.types-flag-branch-context %source %jibb] src-422 `typ-422 ~ ~ ~))
3310+ (weld (check ~.types-flag-branch-context src-423 `tok-423 `tre-423) (check-module-types ~.types-flag-branch-context ~[%tests %golden ~.types-flag-branch-context %source %jibb] src-423 `typ-423 ~ ~ ~))
3265++ test-types-generic-arity
3311++ test-types-generic-arity
3266− (weld (check ~.types-generic-arity src-423 `tok-423 `tre-423) (check-types ~.types-generic-arity ~[%tests %golden ~.types-generic-arity %source %jibb] src-423 `typ-423))
3312+ (weld (check ~.types-generic-arity src-424 `tok-424 `tre-424) (check-types ~.types-generic-arity ~[%tests %golden ~.types-generic-arity %source %jibb] src-424 `typ-424))
3267++ test-types-generic-face-inference
3313++ test-types-generic-face-inference
3268− (weld (check ~.types-generic-face-inference src-424 `tok-424 `tre-424) (check-types ~.types-generic-face-inference ~[%tests %golden ~.types-generic-face-inference %source %jibb] src-424 `typ-424))
3314+ (weld (check ~.types-generic-face-inference src-425 `tok-425 `tre-425) (check-types ~.types-generic-face-inference ~[%tests %golden ~.types-generic-face-inference %source %jibb] src-425 `typ-425))
3269++ test-types-generic-gates
3315++ test-types-generic-gates
3270− (weld (check ~.types-generic-gates src-425 `tok-425 `tre-425) (check-types ~.types-generic-gates ~[%tests %golden ~.types-generic-gates %source %jibb] src-425 `typ-425))
3316+ (weld (check ~.types-generic-gates src-426 `tok-426 `tre-426) (check-types ~.types-generic-gates ~[%tests %golden ~.types-generic-gates %source %jibb] src-426 `typ-426))
3271++ test-types-generic-import-reverse
3317++ test-types-generic-import-reverse
3272− (weld (weld (check ~.types-generic-import-reverse src-426 `tok-426 `tre-426) (check-module-types ~.types-generic-import-reverse ~[%tests %golden ~.types-generic-import-reverse %source %jibb] src-426 `typ-426 ~ ~ ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-426-1]])) (check-module-trees ~.types-generic-import-reverse `mtre-426 ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-426-1]]))
3318+ (weld (weld (check ~.types-generic-import-reverse src-427 `tok-427 `tre-427) (check-module-types ~.types-generic-import-reverse ~[%tests %golden ~.types-generic-import-reverse %source %jibb] src-427 `typ-427 ~ ~ ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-427-1]])) (check-module-trees ~.types-generic-import-reverse `mtre-427 ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-427-1]]))
3273++ test-types-generic-lexical-alias
3319++ test-types-generic-lexical-alias
3274− (weld (check ~.types-generic-lexical-alias src-427 `tok-427 `tre-427) (check-types ~.types-generic-lexical-alias ~[%tests %golden ~.types-generic-lexical-alias %source %jibb] src-427 `typ-427))
3320+ (weld (check ~.types-generic-lexical-alias src-428 `tok-428 `tre-428) (check-types ~.types-generic-lexical-alias ~[%tests %golden ~.types-generic-lexical-alias %source %jibb] src-428 `typ-428))
3275++ test-types-generic-local-parameter
3321++ test-types-generic-local-parameter
3276− (weld (check ~.types-generic-local-parameter src-428 `tok-428 `tre-428) (check-types ~.types-generic-local-parameter ~[%tests %golden ~.types-generic-local-parameter %source %jibb] src-428 `typ-428))
3322+ (weld (check ~.types-generic-local-parameter src-429 `tok-429 `tre-429) (check-types ~.types-generic-local-parameter ~[%tests %golden ~.types-generic-local-parameter %source %jibb] src-429 `typ-429))
3277++ test-types-generic-local-scope
3323++ test-types-generic-local-scope
3278− (weld (check ~.types-generic-local-scope src-429 `tok-429 `tre-429) (check-types ~.types-generic-local-scope ~[%tests %golden ~.types-generic-local-scope %source %jibb] src-429 `typ-429))
3324+ (weld (check ~.types-generic-local-scope src-430 `tok-430 `tre-430) (check-types ~.types-generic-local-scope ~[%tests %golden ~.types-generic-local-scope %source %jibb] src-430 `typ-430))
3279++ test-types-generic-module
3325++ test-types-generic-module
3280− (weld (weld (check ~.types-generic-module src-430 `tok-430 `tre-430) (check-module-types ~.types-generic-module ~[%tests %golden ~.types-generic-module %source %jibb] src-430 `typ-430 ~ ~ ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-430-1]])) (check-module-trees ~.types-generic-module `mtre-430 ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-430-1]]))
3326+ (weld (weld (check ~.types-generic-module src-431 `tok-431 `tre-431) (check-module-types ~.types-generic-module ~[%tests %golden ~.types-generic-module %source %jibb] src-431 `typ-431 ~ ~ ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-431-1]])) (check-module-trees ~.types-generic-module `mtre-431 ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-431-1]]))
3281++ test-types-generic-nested-scope
3327++ test-types-generic-nested-scope
3282− (weld (check ~.types-generic-nested-scope src-431 `tok-431 `tre-431) (check-types ~.types-generic-nested-scope ~[%tests %golden ~.types-generic-nested-scope %source %jibb] src-431 `typ-431))
3328+ (weld (check ~.types-generic-nested-scope src-432 `tok-432 `tre-432) (check-types ~.types-generic-nested-scope ~[%tests %golden ~.types-generic-nested-scope %source %jibb] src-432 `typ-432))
3283++ test-types-generic-parameters
3329++ test-types-generic-parameters
3284− (weld (check ~.types-generic-parameters src-432 `tok-432 `tre-432) (check-types ~.types-generic-parameters ~[%tests %golden ~.types-generic-parameters %source %jibb] src-432 `typ-432))
3330+ (weld (check ~.types-generic-parameters src-433 `tok-433 `tre-433) (check-types ~.types-generic-parameters ~[%tests %golden ~.types-generic-parameters %source %jibb] src-433 `typ-433))
3285++ test-types-generic-record
3331++ test-types-generic-record
3286− (weld (check ~.types-generic-record src-433 `tok-433 `tre-433) (check-types ~.types-generic-record ~[%tests %golden ~.types-generic-record %source %jibb] src-433 `typ-433))
3332+ (weld (check ~.types-generic-record src-434 `tok-434 `tre-434) (check-types ~.types-generic-record ~[%tests %golden ~.types-generic-record %source %jibb] src-434 `typ-434))
3287++ test-types-generic-recursive-union
3333++ test-types-generic-recursive-union
3288− (weld (check ~.types-generic-recursive-union src-434 `tok-434 `tre-434) (check-types ~.types-generic-recursive-union ~[%tests %golden ~.types-generic-recursive-union %source %jibb] src-434 `typ-434))
3334+ (weld (check ~.types-generic-recursive-union src-435 `tok-435 `tre-435) (check-types ~.types-generic-recursive-union ~[%tests %golden ~.types-generic-recursive-union %source %jibb] src-435 `typ-435))
3289++ test-types-generic-repeated
3335++ test-types-generic-repeated
3290− (weld (check ~.types-generic-repeated src-435 `tok-435 `tre-435) (check-types ~.types-generic-repeated ~[%tests %golden ~.types-generic-repeated %source %jibb] src-435 `typ-435))
3336+ (weld (check ~.types-generic-repeated src-436 `tok-436 `tre-436) (check-types ~.types-generic-repeated ~[%tests %golden ~.types-generic-repeated %source %jibb] src-436 `typ-436))
3291++ test-types-generic-result-context
3337++ test-types-generic-result-context
3292− (weld (check ~.types-generic-result-context src-436 `tok-436 `tre-436) (check-types ~.types-generic-result-context ~[%tests %golden ~.types-generic-result-context %source %jibb] src-436 `typ-436))
3338+ (weld (check ~.types-generic-result-context src-437 `tok-437 `tre-437) (check-types ~.types-generic-result-context ~[%tests %golden ~.types-generic-result-context %source %jibb] src-437 `typ-437))
3293++ test-types-generic-union-alias
3339++ test-types-generic-union-alias
3294− (weld (check ~.types-generic-union-alias src-437 `tok-437 `tre-437) (check-types ~.types-generic-union-alias ~[%tests %golden ~.types-generic-union-alias %source %jibb] src-437 `typ-437))
3340+ (weld (check ~.types-generic-union-alias src-438 `tok-438 `tre-438) (check-types ~.types-generic-union-alias ~[%tests %golden ~.types-generic-union-alias %source %jibb] src-438 `typ-438))
3295++ test-types-generic-union-alias-face
3341++ test-types-generic-union-alias-face
3296− (weld (weld (check ~.types-generic-union-alias-face src-438 `tok-438 `tre-438) (check-module-types ~.types-generic-union-alias-face ~[%tests %golden ~.types-generic-union-alias-face %source %jibb] src-438 `typ-438 ~ ~ ~[['/ui/base.jibb' ~[~.ui ~.base ~.jibb] mod-438-1]])) (check-module-trees ~.types-generic-union-alias-face `mtre-438 ~[['/ui/base.jibb' ~[~.ui ~.base ~.jibb] mod-438-1]]))
3342+ (weld (weld (check ~.types-generic-union-alias-face src-439 `tok-439 `tre-439) (check-module-types ~.types-generic-union-alias-face ~[%tests %golden ~.types-generic-union-alias-face %source %jibb] src-439 `typ-439 ~ ~ ~[['/ui/base.jibb' ~[~.ui ~.base ~.jibb] mod-439-1]])) (check-module-trees ~.types-generic-union-alias-face `mtre-439 ~[['/ui/base.jibb' ~[~.ui ~.base ~.jibb] mod-439-1]]))
3297++ test-types-generic-union-capitals
3343++ test-types-generic-union-capitals
3298− (weld (check ~.types-generic-union-capitals src-439 `tok-439 `tre-439) (check-types ~.types-generic-union-capitals ~[%tests %golden ~.types-generic-union-capitals %source %jibb] src-439 `typ-439))
3344+ (weld (check ~.types-generic-union-capitals src-440 `tok-440 `tre-440) (check-types ~.types-generic-union-capitals ~[%tests %golden ~.types-generic-union-capitals %source %jibb] src-440 `typ-440))
3299++ test-types-generic-union-errors
3345++ test-types-generic-union-errors
3300− (weld (check ~.types-generic-union-errors src-440 `tok-440 `tre-440) (check-types ~.types-generic-union-errors ~[%tests %golden ~.types-generic-union-errors %source %jibb] src-440 `typ-440))
3346+ (weld (check ~.types-generic-union-errors src-441 `tok-441 `tre-441) (check-types ~.types-generic-union-errors ~[%tests %golden ~.types-generic-union-errors %source %jibb] src-441 `typ-441))
3301++ test-types-generic-union-escaping
3347++ test-types-generic-union-escaping
3302− (weld (weld (check ~.types-generic-union-escaping src-441 `tok-441 `tre-441) (check-module-types ~.types-generic-union-escaping ~[%tests %golden ~.types-generic-union-escaping %source %jibb] src-441 `typ-441 ~ ~ ~[['/ui/base.jibb' ~[~.ui ~.base ~.jibb] mod-441-1] ['/ui/mid.jibb' ~[~.ui ~.mid ~.jibb] mod-441-2]])) (check-module-trees ~.types-generic-union-escaping `mtre-441 ~[['/ui/base.jibb' ~[~.ui ~.base ~.jibb] mod-441-1] ['/ui/mid.jibb' ~[~.ui ~.mid ~.jibb] mod-441-2]]))
3348+ (weld (weld (check ~.types-generic-union-escaping src-442 `tok-442 `tre-442) (check-module-types ~.types-generic-union-escaping ~[%tests %golden ~.types-generic-union-escaping %source %jibb] src-442 `typ-442 ~ ~ ~[['/ui/base.jibb' ~[~.ui ~.base ~.jibb] mod-442-1] ['/ui/mid.jibb' ~[~.ui ~.mid ~.jibb] mod-442-2]])) (check-module-trees ~.types-generic-union-escaping `mtre-442 ~[['/ui/base.jibb' ~[~.ui ~.base ~.jibb] mod-442-1] ['/ui/mid.jibb' ~[~.ui ~.mid ~.jibb] mod-442-2]]))
3303++ test-types-generic-union-import
3349++ test-types-generic-union-import
3304− (weld (weld (check ~.types-generic-union-import src-442 `tok-442 `tre-442) (check-module-types ~.types-generic-union-import ~[%tests %golden ~.types-generic-union-import %source %jibb] src-442 `typ-442 ~ ~ ~[['/ui/shared.jibb' ~[~.ui ~.shared ~.jibb] mod-442-1] ['/ui/twin.jibb' ~[~.ui ~.twin ~.jibb] mod-442-2]])) (check-module-trees ~.types-generic-union-import `mtre-442 ~[['/ui/shared.jibb' ~[~.ui ~.shared ~.jibb] mod-442-1] ['/ui/twin.jibb' ~[~.ui ~.twin ~.jibb] mod-442-2]]))
3350+ (weld (weld (check ~.types-generic-union-import src-443 `tok-443 `tre-443) (check-module-types ~.types-generic-union-import ~[%tests %golden ~.types-generic-union-import %source %jibb] src-443 `typ-443 ~ ~ ~[['/ui/shared.jibb' ~[~.ui ~.shared ~.jibb] mod-443-1] ['/ui/twin.jibb' ~[~.ui ~.twin ~.jibb] mod-443-2]])) (check-module-trees ~.types-generic-union-import `mtre-443 ~[['/ui/shared.jibb' ~[~.ui ~.shared ~.jibb] mod-443-1] ['/ui/twin.jibb' ~[~.ui ~.twin ~.jibb] mod-443-2]]))
3305++ test-types-generic-union-local
3351++ test-types-generic-union-local
3306− (weld (check ~.types-generic-union-local src-443 `tok-443 `tre-443) (check-types ~.types-generic-union-local ~[%tests %golden ~.types-generic-union-local %source %jibb] src-443 `typ-443))
3352+ (weld (check ~.types-generic-union-local src-444 `tok-444 `tre-444) (check-types ~.types-generic-union-local ~[%tests %golden ~.types-generic-union-local %source %jibb] src-444 `typ-444))
3307++ test-types-generic-union-transitive
3353++ test-types-generic-union-transitive
3308− (weld (weld (check ~.types-generic-union-transitive src-444 `tok-444 `tre-444) (check-module-types ~.types-generic-union-transitive ~[%tests %golden ~.types-generic-union-transitive %source %jibb] src-444 `typ-444 ~ ~ ~[['/ui/base.jibb' ~[~.ui ~.base ~.jibb] mod-444-1] ['/ui/mid.jibb' ~[~.ui ~.mid ~.jibb] mod-444-2]])) (check-module-trees ~.types-generic-union-transitive `mtre-444 ~[['/ui/base.jibb' ~[~.ui ~.base ~.jibb] mod-444-1] ['/ui/mid.jibb' ~[~.ui ~.mid ~.jibb] mod-444-2]]))
3354+ (weld (weld (check ~.types-generic-union-transitive src-445 `tok-445 `tre-445) (check-module-types ~.types-generic-union-transitive ~[%tests %golden ~.types-generic-union-transitive %source %jibb] src-445 `typ-445 ~ ~ ~[['/ui/base.jibb' ~[~.ui ~.base ~.jibb] mod-445-1] ['/ui/mid.jibb' ~[~.ui ~.mid ~.jibb] mod-445-2]])) (check-module-trees ~.types-generic-union-transitive `mtre-445 ~[['/ui/base.jibb' ~[~.ui ~.base ~.jibb] mod-445-1] ['/ui/mid.jibb' ~[~.ui ~.mid ~.jibb] mod-445-2]]))
3309++ test-types-hole-concrete
3355++ test-types-hole-concrete
3310− (weld (check ~.types-hole-concrete src-445 `tok-445 `tre-445) (check-types ~.types-hole-concrete ~[%tests %golden ~.types-hole-concrete %source %jibb] src-445 `typ-445))
3356+ (weld (check ~.types-hole-concrete src-446 `tok-446 `tre-446) (check-types ~.types-hole-concrete ~[%tests %golden ~.types-hole-concrete %source %jibb] src-446 `typ-446))
3311++ test-types-hole-generic-mold
3357++ test-types-hole-generic-mold
3312− (weld (check ~.types-hole-generic-mold src-446 `tok-446 `tre-446) (check-types ~.types-hole-generic-mold ~[%tests %golden ~.types-hole-generic-mold %source %jibb] src-446 `typ-446))
3358+ (weld (check ~.types-hole-generic-mold src-447 `tok-447 `tre-447) (check-types ~.types-hole-generic-mold ~[%tests %golden ~.types-hole-generic-mold %source %jibb] src-447 `typ-447))
3313++ test-types-hole-local-boundary
3359++ test-types-hole-local-boundary
3314− (weld (check ~.types-hole-local-boundary src-447 `tok-447 `tre-447) (check-types ~.types-hole-local-boundary ~[%tests %golden ~.types-hole-local-boundary %source %jibb] src-447 `typ-447))
3360+ (weld (check ~.types-hole-local-boundary src-448 `tok-448 `tre-448) (check-types ~.types-hole-local-boundary ~[%tests %golden ~.types-hole-local-boundary %source %jibb] src-448 `typ-448))
3315++ test-types-hole-module-boundary
3361++ test-types-hole-module-boundary
3316− (weld (weld (check ~.types-hole-module-boundary src-448 `tok-448 `tre-448) (check-module-types ~.types-hole-module-boundary ~[%tests %golden ~.types-hole-module-boundary %source %jibb] src-448 `typ-448 ~ ~ ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-448-1]])) (check-module-trees ~.types-hole-module-boundary `mtre-448 ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-448-1]]))
3362+ (weld (weld (check ~.types-hole-module-boundary src-449 `tok-449 `tre-449) (check-module-types ~.types-hole-module-boundary ~[%tests %golden ~.types-hole-module-boundary %source %jibb] src-449 `typ-449 ~ ~ ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-449-1]])) (check-module-trees ~.types-hole-module-boundary `mtre-449 ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-449-1]]))
3317++ test-types-hole-named-complex
3363++ test-types-hole-named-complex
3318− (weld (check ~.types-hole-named-complex src-449 `tok-449 `tre-449) (check-types ~.types-hole-named-complex ~[%tests %golden ~.types-hole-named-complex %source %jibb] src-449 `typ-449))
3364+ (weld (check ~.types-hole-named-complex src-450 `tok-450 `tre-450) (check-types ~.types-hole-named-complex ~[%tests %golden ~.types-hole-named-complex %source %jibb] src-450 `typ-450))
3319++ test-types-hole-numeric-capture
3365++ test-types-hole-numeric-capture
3320− (weld (check ~.types-hole-numeric-capture src-450 `tok-450 `tre-450) (check-types ~.types-hole-numeric-capture ~[%tests %golden ~.types-hole-numeric-capture %source %jibb] src-450 `typ-450))
3366+ (weld (check ~.types-hole-numeric-capture src-451 `tok-451 `tre-451) (check-types ~.types-hole-numeric-capture ~[%tests %golden ~.types-hole-numeric-capture %source %jibb] src-451 `typ-451))
3321++ test-types-hole-unbound-mold
3367++ test-types-hole-unbound-mold
3322− (weld (check ~.types-hole-unbound-mold src-451 `tok-451 `tre-451) (check-types ~.types-hole-unbound-mold ~[%tests %golden ~.types-hole-unbound-mold %source %jibb] src-451 `typ-451))
3368+ (weld (check ~.types-hole-unbound-mold src-452 `tok-452 `tre-452) (check-types ~.types-hole-unbound-mold ~[%tests %golden ~.types-hole-unbound-mold %source %jibb] src-452 `typ-452))
3323++ test-types-hole-unsupported
3369++ test-types-hole-unsupported
3324− (weld (check ~.types-hole-unsupported src-452 `tok-452 `tre-452) (check-types ~.types-hole-unsupported ~[%tests %golden ~.types-hole-unsupported %source %jibb] src-452 `typ-452))
3370+ (weld (check ~.types-hole-unsupported src-453 `tok-453 `tre-453) (check-types ~.types-hole-unsupported ~[%tests %golden ~.types-hole-unsupported %source %jibb] src-453 `typ-453))
3325++ test-types-hole-user-generic
3371++ test-types-hole-user-generic
3326− (weld (check ~.types-hole-user-generic src-453 `tok-453 `tre-453) (check-types ~.types-hole-user-generic ~[%tests %golden ~.types-hole-user-generic %source %jibb] src-453 `typ-453))
3372+ (weld (check ~.types-hole-user-generic src-454 `tok-454 `tre-454) (check-types ~.types-hole-user-generic ~[%tests %golden ~.types-hole-user-generic %source %jibb] src-454 `typ-454))
3327++ test-types-hole-user-named
3373++ test-types-hole-user-named
3328− (weld (check ~.types-hole-user-named src-454 `tok-454 `tre-454) (check-types ~.types-hole-user-named ~[%tests %golden ~.types-hole-user-named %source %jibb] src-454 `typ-454))
3374+ (weld (check ~.types-hole-user-named src-455 `tok-455 `tre-455) (check-types ~.types-hole-user-named ~[%tests %golden ~.types-hole-user-named %source %jibb] src-455 `typ-455))
3329++ test-types-hole-user-value
3375++ test-types-hole-user-value
3330− (weld (check ~.types-hole-user-value src-455 `tok-455 `tre-455) (check-types ~.types-hole-user-value ~[%tests %golden ~.types-hole-user-value %source %jibb] src-455 `typ-455))
3376+ (weld (check ~.types-hole-user-value src-456 `tok-456 `tre-456) (check-types ~.types-hole-user-value ~[%tests %golden ~.types-hole-user-value %source %jibb] src-456 `typ-456))
3331++ test-types-import-duplicate-mark
3377++ test-types-import-duplicate-mark
3332− (weld (check ~.types-import-duplicate-mark src-456 `tok-456 `tre-456) (check-mark-types ~.types-import-duplicate-mark ~[%tests %golden ~.types-import-duplicate-mark %source %jibb] src-456 `typ-456 ~ ~[[%duplicate mark-456-1]]))
3378+ (weld (check ~.types-import-duplicate-mark src-457 `tok-457 `tre-457) (check-mark-types ~.types-import-duplicate-mark ~[%tests %golden ~.types-import-duplicate-mark %source %jibb] src-457 `typ-457 ~ ~[[%duplicate mark-457-1]]))
3333++ test-types-import-duplicate-sur
3379++ test-types-import-duplicate-sur
3334− (weld (check ~.types-import-duplicate-sur src-457 `tok-457 `tre-457) (check-import-types ~.types-import-duplicate-sur ~[%tests %golden ~.types-import-duplicate-sur %source %jibb] src-457 `typ-457 ~[[%fixture %direct imp-457-1] [%fixture %nested imp-457-2] [%fixture %valid imp-457-3]]))
3380+ (weld (check ~.types-import-duplicate-sur src-458 `tok-458 `tre-458) (check-import-types ~.types-import-duplicate-sur ~[%tests %golden ~.types-import-duplicate-sur %source %jibb] src-458 `typ-458 ~[[%fixture %direct imp-458-1] [%fixture %nested imp-458-2] [%fixture %valid imp-458-3]]))
3335++ test-types-import-hoon-flags
3381++ test-types-import-hoon-flags
3336− (weld (check ~.types-import-hoon-flags src-458 `tok-458 `tre-458) (check-import-types ~.types-import-hoon-flags ~[%tests %golden ~.types-import-hoon-flags %source %jibb] src-458 `typ-458 ~[[%flags %flag imp-458-1] [%flags %yes imp-458-2] [%flags %no imp-458-3] [%flags %record imp-458-4]]))
3382+ (weld (check ~.types-import-hoon-flags src-459 `tok-459 `tre-459) (check-import-types ~.types-import-hoon-flags ~[%tests %golden ~.types-import-hoon-flags %source %jibb] src-459 `typ-459 ~[[%flags %flag imp-459-1] [%flags %yes imp-459-2] [%flags %no imp-459-3] [%flags %record imp-459-4]]))
3337++ test-types-import-hoon-noun
3383++ test-types-import-hoon-noun
3338− (weld (check ~.types-import-hoon-noun src-459 `tok-459 `tre-459) (check-import-types ~.types-import-hoon-noun ~[%tests %golden ~.types-import-hoon-noun %source %jibb] src-459 `typ-459 ~[[%fixture %any imp-459-1] [%fixture %payload imp-459-2] [%fixture %option imp-459-3] [%fixture %overlap imp-459-4]]))
3384+ (weld (check ~.types-import-hoon-noun src-460 `tok-460 `tre-460) (check-import-types ~.types-import-hoon-noun ~[%tests %golden ~.types-import-hoon-noun %source %jibb] src-460 `typ-460 ~[[%fixture %any imp-460-1] [%fixture %payload imp-460-2] [%fixture %option imp-460-3] [%fixture %overlap imp-460-4]]))
3339++ test-types-import-mark
3385++ test-types-import-mark
3340− (weld (check ~.types-import-mark src-460 `tok-460 `tre-460) (check-mark-types ~.types-import-mark ~[%tests %golden ~.types-import-mark %source %jibb] src-460 `typ-460 ~[[%fixture %title imp-460-1]] ~[[%label mark-460-1]]))
3386+ (weld (check ~.types-import-mark src-461 `tok-461 `tre-461) (check-mark-types ~.types-import-mark ~[%tests %golden ~.types-import-mark %source %jibb] src-461 `typ-461 ~[[%fixture %title imp-461-1]] ~[[%label mark-461-1]]))
3341++ test-types-import-mark-record
3387++ test-types-import-mark-record
3342− (weld (check ~.types-import-mark-record src-461 `tok-461 `tre-461) (check-mark-types ~.types-import-mark-record ~[%tests %golden ~.types-import-mark-record %source %jibb] src-461 `typ-461 ~ ~[[%note mark-461-1] [%choice mark-461-2]]))
3388+ (weld (check ~.types-import-mark-record src-462 `tok-462 `tre-462) (check-mark-types ~.types-import-mark-record ~[%tests %golden ~.types-import-mark-record %source %jibb] src-462 `typ-462 ~ ~[[%note mark-462-1] [%choice mark-462-2]]))
3343++ test-types-import-missing-mold
3389++ test-types-import-missing-mold
3344− (weld (check ~.types-import-missing-mold src-462 `tok-462 `tre-462) (check-import-types ~.types-import-missing-mold ~[%tests %golden ~.types-import-missing-mold %source %jibb] src-462 `typ-462 ~[[%fixture %missing imp-462-1]]))
3390+ (weld (check ~.types-import-missing-mold src-463 `tok-463 `tre-463) (check-import-types ~.types-import-missing-mold ~[%tests %golden ~.types-import-missing-mold %source %jibb] src-463 `typ-463 ~[[%fixture %missing imp-463-1]]))
3345++ test-types-import-sur
3391++ test-types-import-sur
3346− (weld (check ~.types-import-sur src-463 `tok-463 `tre-463) (check-import-types ~.types-import-sur ~[%tests %golden ~.types-import-sur %source %jibb] src-463 `typ-463 ~[[%fixture %title imp-463-1] [%fixture %pair imp-463-2]]))
3392+ (weld (check ~.types-import-sur src-464 `tok-464 `tre-464) (check-import-types ~.types-import-sur ~[%tests %golden ~.types-import-sur %source %jibb] src-464 `typ-464 ~[[%fixture %title imp-464-1] [%fixture %pair imp-464-2]]))
3347++ test-types-import-sur-record-graph
3393++ test-types-import-sur-record-graph
3348− (weld (weld (check ~.types-import-sur-record-graph src-464 `tok-464 `tre-464) (check-module-types ~.types-import-sur-record-graph ~[%tests %golden ~.types-import-sur-record-graph %source %jibb] src-464 `typ-464 ~[[%fixture %entry imp-464-1]] ~ ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-464-1]])) (check-module-trees ~.types-import-sur-record-graph `mtre-464 ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-464-1]]))
3394+ (weld (weld (check ~.types-import-sur-record-graph src-465 `tok-465 `tre-465) (check-module-types ~.types-import-sur-record-graph ~[%tests %golden ~.types-import-sur-record-graph %source %jibb] src-465 `typ-465 ~[[%fixture %entry imp-465-1]] ~ ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-465-1]])) (check-module-trees ~.types-import-sur-record-graph `mtre-465 ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-465-1]]))
3349++ test-types-import-tlon-notes
3395++ test-types-import-tlon-notes
3350− (weld (check ~.types-import-tlon-notes src-465 `tok-465 `tre-465) (check-import-types ~.types-import-tlon-notes ~[%tests %golden ~.types-import-tlon-notes %source %jibb] src-465 `typ-465 ~[[%notes %u-note imp-465-1] [%notes %a-note imp-465-2] [%notes %u-notebook imp-465-3] [%notes %u-notes imp-465-4] [%notes %log imp-465-5] [%notes %import-node imp-465-6] [%notes %a-notebook imp-465-7]]))
3396+ (weld (check ~.types-import-tlon-notes src-466 `tok-466 `tre-466) (check-import-types ~.types-import-tlon-notes ~[%tests %golden ~.types-import-tlon-notes %source %jibb] src-466 `typ-466 ~[[%notes %u-note imp-466-1] [%notes %a-note imp-466-2] [%notes %u-notebook imp-466-3] [%notes %u-notes imp-466-4] [%notes %log imp-466-5] [%notes %import-node imp-466-6] [%notes %a-notebook imp-466-7]]))
3351++ test-types-list-branch
3397++ test-types-list-branch
3352− (weld (check ~.types-list-branch src-466 `tok-466 `tre-466) (check-module-types ~.types-list-branch ~[%tests %golden ~.types-list-branch %source %jibb] src-466 `typ-466 ~ ~ ~))
3398+ (weld (check ~.types-list-branch src-467 `tok-467 `tre-467) (check-module-types ~.types-list-branch ~[%tests %golden ~.types-list-branch %source %jibb] src-467 `typ-467 ~ ~ ~))
3353++ test-types-list-cons
3399++ test-types-list-cons
3354− (weld (check ~.types-list-cons src-467 `tok-467 `tre-467) (check-module-types ~.types-list-cons ~[%tests %golden ~.types-list-cons %source %jibb] src-467 `typ-467 ~ ~ ~))
3400+ (weld (check ~.types-list-cons src-468 `tok-468 `tre-468) (check-module-types ~.types-list-cons ~[%tests %golden ~.types-list-cons %source %jibb] src-468 `typ-468 ~ ~ ~))
3355++ test-types-list-context
3401++ test-types-list-context
3356− (weld (check ~.types-list-context src-468 `tok-468 `tre-468) (check-module-types ~.types-list-context ~[%tests %golden ~.types-list-context %source %jibb] src-468 `typ-468 ~ ~ ~))
3402+ (weld (check ~.types-list-context src-469 `tok-469 `tre-469) (check-module-types ~.types-list-context ~[%tests %golden ~.types-list-context %source %jibb] src-469 `typ-469 ~ ~ ~))
3357++ test-types-list-imported
3403++ test-types-list-imported
3358− (weld (check ~.types-list-imported src-469 `tok-469 `tre-469) (check-module-types ~.types-list-imported ~[%tests %golden ~.types-list-imported %source %jibb] src-469 `typ-469 ~[[%fixture %texts imp-469-1] [%fixture %ships imp-469-2]] ~ ~))
3404+ (weld (check ~.types-list-imported src-470 `tok-470 `tre-470) (check-module-types ~.types-list-imported ~[%tests %golden ~.types-list-imported %source %jibb] src-470 `typ-470 ~[[%fixture %texts imp-470-1] [%fixture %ships imp-470-2]] ~ ~))
3359++ test-types-list-open
3405++ test-types-list-open
3360− (weld (check ~.types-list-open src-470 `tok-470 `tre-470) (check-module-types ~.types-list-open ~[%tests %golden ~.types-list-open %source %jibb] src-470 `typ-470 ~ ~ ~))
3406+ (weld (check ~.types-list-open src-471 `tok-471 `tre-471) (check-module-types ~.types-list-open ~[%tests %golden ~.types-list-open %source %jibb] src-471 `typ-471 ~ ~ ~))
3361++ test-types-list-open-constraints
3407++ test-types-list-open-constraints
3362− (weld (check ~.types-list-open-constraints src-471 `tok-471 `tre-471) (check-module-types ~.types-list-open-constraints ~[%tests %golden ~.types-list-open-constraints %source %jibb] src-471 `typ-471 ~ ~ ~))
3408+ (weld (check ~.types-list-open-constraints src-472 `tok-472 `tre-472) (check-module-types ~.types-list-open-constraints ~[%tests %golden ~.types-list-open-constraints %source %jibb] src-472 `typ-472 ~ ~ ~))
3363++ test-types-list-pattern-imported
3409++ test-types-list-pattern-imported
3364− (weld (check ~.types-list-pattern-imported src-472 `tok-472 `tre-472) (check-module-types ~.types-list-pattern-imported ~[%tests %golden ~.types-list-pattern-imported %source %jibb] src-472 `typ-472 ~[[%fixture %texts imp-472-1] [%fixture %text-set imp-472-2]] ~ ~))
3410+ (weld (check ~.types-list-pattern-imported src-473 `tok-473 `tre-473) (check-module-types ~.types-list-pattern-imported ~[%tests %golden ~.types-list-pattern-imported %source %jibb] src-473 `typ-473 ~[[%fixture %texts imp-473-1] [%fixture %text-set imp-473-2]] ~ ~))
3365++ test-types-list-patterns
3411++ test-types-list-patterns
3366− (weld (check ~.types-list-patterns src-473 `tok-473 `tre-473) (check-module-types ~.types-list-patterns ~[%tests %golden ~.types-list-patterns %source %jibb] src-473 `typ-473 ~ ~ ~))
3412+ (weld (check ~.types-list-patterns src-474 `tok-474 `tre-474) (check-module-types ~.types-list-patterns ~[%tests %golden ~.types-list-patterns %source %jibb] src-474 `typ-474 ~ ~ ~))
3367++ test-types-list-zero-fit
3413++ test-types-list-zero-fit
3368− (weld (check ~.types-list-zero-fit src-474 `tok-474 `tre-474) (check-module-types ~.types-list-zero-fit ~[%tests %golden ~.types-list-zero-fit %source %jibb] src-474 `typ-474 ~ ~ ~))
3414+ (weld (check ~.types-list-zero-fit src-475 `tok-475 `tre-475) (check-module-types ~.types-list-zero-fit ~[%tests %golden ~.types-list-zero-fit %source %jibb] src-475 `typ-475 ~ ~ ~))
3369++ test-types-literal-constructor-nouns
3415++ test-types-literal-constructor-nouns
3370− (weld (check ~.types-literal-constructor-nouns src-475 `tok-475 `tre-475) (check-types ~.types-literal-constructor-nouns ~[%tests %golden ~.types-literal-constructor-nouns %source %jibb] src-475 `typ-475))
3416+ (weld (check ~.types-literal-constructor-nouns src-476 `tok-476 `tre-476) (check-types ~.types-literal-constructor-nouns ~[%tests %golden ~.types-literal-constructor-nouns %source %jibb] src-476 `typ-476))
3371++ test-types-local-capitals
3417++ test-types-local-capitals
3372− (weld (check ~.types-local-capitals src-476 `tok-476 `tre-476) (check-module-types ~.types-local-capitals ~[%tests %golden ~.types-local-capitals %source %jibb] src-476 `typ-476 ~ ~ ~))
3418+ (weld (check ~.types-local-capitals src-477 `tok-477 `tre-477) (check-module-types ~.types-local-capitals ~[%tests %golden ~.types-local-capitals %source %jibb] src-477 `typ-477 ~ ~ ~))
3373++ test-types-local-recursive
3419++ test-types-local-recursive
3374− (weld (check ~.types-local-recursive src-477 `tok-477 `tre-477) (check-module-types ~.types-local-recursive ~[%tests %golden ~.types-local-recursive %source %jibb] src-477 `typ-477 ~ ~ ~))
3420+ (weld (check ~.types-local-recursive src-478 `tok-478 `tre-478) (check-module-types ~.types-local-recursive ~[%tests %golden ~.types-local-recursive %source %jibb] src-478 `typ-478 ~ ~ ~))
3375++ test-types-local-scc
3421++ test-types-local-scc
3376− (weld (check ~.types-local-scc src-478 `tok-478 `tre-478) (check-module-types ~.types-local-scc ~[%tests %golden ~.types-local-scc %source %jibb] src-478 `typ-478 ~ ~ ~))
3422+ (weld (check ~.types-local-scc src-479 `tok-479 `tre-479) (check-module-types ~.types-local-scc ~[%tests %golden ~.types-local-scc %source %jibb] src-479 `typ-479 ~ ~ ~))
3377++ test-types-local-scc-adversarial
3423++ test-types-local-scc-adversarial
3378− (weld (check ~.types-local-scc-adversarial src-479 `tok-479 `tre-479) (check-module-types ~.types-local-scc-adversarial ~[%tests %golden ~.types-local-scc-adversarial %source %jibb] src-479 `typ-479 ~ ~ ~))
3424+ (weld (check ~.types-local-scc-adversarial src-480 `tok-480 `tre-480) (check-module-types ~.types-local-scc-adversarial ~[%tests %golden ~.types-local-scc-adversarial %source %jibb] src-480 `typ-480 ~ ~ ~))
3379++ test-types-loobean-singleton-source
3425++ test-types-loobean-singleton-source
3380− (weld (check ~.types-loobean-singleton-source src-480 `tok-480 `tre-480) (check-types ~.types-loobean-singleton-source ~[%tests %golden ~.types-loobean-singleton-source %source %jibb] src-480 `typ-480))
3426+ (weld (check ~.types-loobean-singleton-source src-481 `tok-481 `tre-481) (check-types ~.types-loobean-singleton-source ~[%tests %golden ~.types-loobean-singleton-source %source %jibb] src-481 `typ-481))
3381++ test-types-loobean-union-context
3427++ test-types-loobean-union-context
3382− (weld (check ~.types-loobean-union-context src-481 `tok-481 `tre-481) (check-types ~.types-loobean-union-context ~[%tests %golden ~.types-loobean-union-context %source %jibb] src-481 `typ-481))
3428+ (weld (check ~.types-loobean-union-context src-482 `tok-482 `tre-482) (check-types ~.types-loobean-union-context ~[%tests %golden ~.types-loobean-union-context %source %jibb] src-482 `typ-482))
3383++ test-types-missing-tag-context
3429++ test-types-missing-tag-context
3384− (weld (check ~.types-missing-tag-context src-482 `tok-482 `tre-482) (check-module-types ~.types-missing-tag-context ~[%tests %golden ~.types-missing-tag-context %source %jibb] src-482 `typ-482 ~ ~ ~))
3430+ (weld (check ~.types-missing-tag-context src-483 `tok-483 `tre-483) (check-module-types ~.types-missing-tag-context ~[%tests %golden ~.types-missing-tag-context %source %jibb] src-483 `typ-483 ~ ~ ~))
3385++ test-types-missing-tag-imported
3431++ test-types-missing-tag-imported
3386− (weld (check ~.types-missing-tag-imported src-483 `tok-483 `tre-483) (check-import-types ~.types-missing-tag-imported ~[%tests %golden ~.types-missing-tag-imported %source %jibb] src-483 `typ-483 ~[[%fixture %choice imp-483-1] [%fixture %nested-choice imp-483-2]]))
3432+ (weld (check ~.types-missing-tag-imported src-484 `tok-484 `tre-484) (check-import-types ~.types-missing-tag-imported ~[%tests %golden ~.types-missing-tag-imported %source %jibb] src-484 `typ-484 ~[[%fixture %choice imp-484-1] [%fixture %nested-choice imp-484-2]]))
3387++ test-types-missing-tag-named
3433++ test-types-missing-tag-named
3388− (weld (check ~.types-missing-tag-named src-484 `tok-484 `tre-484) (check-module-types ~.types-missing-tag-named ~[%tests %golden ~.types-missing-tag-named %source %jibb] src-484 `typ-484 ~ ~ ~))
3434+ (weld (check ~.types-missing-tag-named src-485 `tok-485 `tre-485) (check-module-types ~.types-missing-tag-named ~[%tests %golden ~.types-missing-tag-named %source %jibb] src-485 `typ-485 ~ ~ ~))
3389++ test-types-module-field-duplicate
3435++ test-types-module-field-duplicate
3390− (weld (weld (check ~.types-module-field-duplicate src-485 `tok-485 `tre-485) (check-module-types ~.types-module-field-duplicate ~[%tests %golden ~.types-module-field-duplicate %source %jibb] src-485 `typ-485 ~ ~ ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-485-1]])) (check-module-trees ~.types-module-field-duplicate `mtre-485 ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-485-1]]))
3436+ (weld (weld (check ~.types-module-field-duplicate src-486 `tok-486 `tre-486) (check-module-types ~.types-module-field-duplicate ~[%tests %golden ~.types-module-field-duplicate %source %jibb] src-486 `typ-486 ~ ~ ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-486-1]])) (check-module-trees ~.types-module-field-duplicate `mtre-486 ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-486-1]]))
3391++ test-types-module-field-nonrecord
3437++ test-types-module-field-nonrecord
3392− (weld (weld (check ~.types-module-field-nonrecord src-486 `tok-486 `tre-486) (check-module-types ~.types-module-field-nonrecord ~[%tests %golden ~.types-module-field-nonrecord %source %jibb] src-486 `typ-486 ~ ~ ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-486-1]])) (check-module-trees ~.types-module-field-nonrecord `mtre-486 ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-486-1]]))
3438+ (weld (weld (check ~.types-module-field-nonrecord src-487 `tok-487 `tre-487) (check-module-types ~.types-module-field-nonrecord ~[%tests %golden ~.types-module-field-nonrecord %source %jibb] src-487 `typ-487 ~ ~ ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-487-1]])) (check-module-trees ~.types-module-field-nonrecord `mtre-487 ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-487-1]]))
3393++ test-types-module-field-path
3439++ test-types-module-field-path
3394− (weld (weld (check ~.types-module-field-path src-487 `tok-487 `tre-487) (check-module-types ~.types-module-field-path ~[%tests %golden ~.types-module-field-path %source %jibb] src-487 `typ-487 ~ ~ ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-487-1]])) (check-module-trees ~.types-module-field-path `mtre-487 ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-487-1]]))
3440+ (weld (weld (check ~.types-module-field-path src-488 `tok-488 `tre-488) (check-module-types ~.types-module-field-path ~[%tests %golden ~.types-module-field-path %source %jibb] src-488 `typ-488 ~ ~ ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-488-1]])) (check-module-trees ~.types-module-field-path `mtre-488 ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-488-1]]))
3395++ test-types-module-field-shadow
3441++ test-types-module-field-shadow
3396− (weld (weld (check ~.types-module-field-shadow src-488 `tok-488 `tre-488) (check-module-types ~.types-module-field-shadow ~[%tests %golden ~.types-module-field-shadow %source %jibb] src-488 `typ-488 ~ ~ ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-488-1]])) (check-module-trees ~.types-module-field-shadow `mtre-488 ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-488-1]]))
3442+ (weld (weld (check ~.types-module-field-shadow src-489 `tok-489 `tre-489) (check-module-types ~.types-module-field-shadow ~[%tests %golden ~.types-module-field-shadow %source %jibb] src-489 `typ-489 ~ ~ ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-489-1]])) (check-module-trees ~.types-module-field-shadow `mtre-489 ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-489-1]]))
3397++ test-types-module-fixtures
3443++ test-types-module-fixtures
3398− (weld (weld (check-at ~.types-module-fixtures ~[~.ui ~.blog ~.index ~.jibb] src-489 `tok-489 `tre-489) (check-module-types ~.types-module-fixtures ~[~.ui ~.blog ~.index ~.jibb] src-489 `typ-489 ~ ~ ~[['/ui/api/blog.jibb' ~[~.ui ~.api ~.blog ~.jibb] mod-489-1] ['/ui/components/card.jibb' ~[~.ui ~.components ~.card ~.jibb] mod-489-2]])) (check-module-trees ~.types-module-fixtures `mtre-489 ~[['/ui/api/blog.jibb' ~[~.ui ~.api ~.blog ~.jibb] mod-489-1] ['/ui/components/card.jibb' ~[~.ui ~.components ~.card ~.jibb] mod-489-2]]))
3444+ (weld (weld (check-at ~.types-module-fixtures ~[~.ui ~.blog ~.index ~.jibb] src-490 `tok-490 `tre-490) (check-module-types ~.types-module-fixtures ~[~.ui ~.blog ~.index ~.jibb] src-490 `typ-490 ~ ~ ~[['/ui/api/blog.jibb' ~[~.ui ~.api ~.blog ~.jibb] mod-490-1] ['/ui/components/card.jibb' ~[~.ui ~.components ~.card ~.jibb] mod-490-2]])) (check-module-trees ~.types-module-fixtures `mtre-490 ~[['/ui/api/blog.jibb' ~[~.ui ~.api ~.blog ~.jibb] mod-490-1] ['/ui/components/card.jibb' ~[~.ui ~.components ~.card ~.jibb] mod-490-2]]))
3399++ test-types-module-mixed
3445++ test-types-module-mixed
3400− (weld (weld (check ~.types-module-mixed src-490 `tok-490 `tre-490) (check-module-types ~.types-module-mixed ~[%tests %golden ~.types-module-mixed %source %jibb] src-490 `typ-490 ~[[%fixture %title imp-490-1]] ~[[%label mark-490-1]] ~[['/ui/helper.jibb' ~[~.ui ~.helper ~.jibb] mod-490-1]])) (check-module-trees ~.types-module-mixed `mtre-490 ~[['/ui/helper.jibb' ~[~.ui ~.helper ~.jibb] mod-490-1]]))
3446+ (weld (weld (check ~.types-module-mixed src-491 `tok-491 `tre-491) (check-module-types ~.types-module-mixed ~[%tests %golden ~.types-module-mixed %source %jibb] src-491 `typ-491 ~[[%fixture %title imp-491-1]] ~[[%label mark-491-1]] ~[['/ui/helper.jibb' ~[~.ui ~.helper ~.jibb] mod-491-1]])) (check-module-trees ~.types-module-mixed `mtre-491 ~[['/ui/helper.jibb' ~[~.ui ~.helper ~.jibb] mod-491-1]]))
3401++ test-types-multi-call
3447++ test-types-multi-call
3402− (weld (check ~.types-multi-call src-491 `tok-491 `tre-491) (check-module-types ~.types-multi-call ~[%tests %golden ~.types-multi-call %source %jibb] src-491 `typ-491 ~ ~ ~))
3448+ (weld (check ~.types-multi-call src-492 `tok-492 `tre-492) (check-module-types ~.types-multi-call ~[%tests %golden ~.types-multi-call %source %jibb] src-492 `typ-492 ~ ~ ~))
3403++ test-types-multi-import
3449++ test-types-multi-import
3404− (weld (weld (check ~.types-multi-import src-492 `tok-492 `tre-492) (check-module-types ~.types-multi-import ~[%tests %golden ~.types-multi-import %source %jibb] src-492 `typ-492 ~ ~ ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-492-1]])) (check-module-trees ~.types-multi-import `mtre-492 ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-492-1]]))
3450+ (weld (weld (check ~.types-multi-import src-493 `tok-493 `tre-493) (check-module-types ~.types-multi-import ~[%tests %golden ~.types-multi-import %source %jibb] src-493 `typ-493 ~ ~ ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-493-1]])) (check-module-trees ~.types-multi-import `mtre-493 ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-493-1]]))
3405++ test-types-nested-missing-tag
3451++ test-types-nested-missing-tag
3406− (weld (check ~.types-nested-missing-tag src-493 `tok-493 `tre-493) (check-module-types ~.types-nested-missing-tag ~[%tests %golden ~.types-nested-missing-tag %source %jibb] src-493 `typ-493 ~ ~ ~))
3452+ (weld (check ~.types-nested-missing-tag src-494 `tok-494 `tre-494) (check-module-types ~.types-nested-missing-tag ~[%tests %golden ~.types-nested-missing-tag %source %jibb] src-494 `typ-494 ~ ~ ~))
3407++ test-types-nested-noun-context
3453++ test-types-nested-noun-context
3408− (weld (check ~.types-nested-noun-context src-494 `tok-494 `tre-494) (check-types ~.types-nested-noun-context ~[%tests %golden ~.types-nested-noun-context %source %jibb] src-494 `typ-494))
3454+ (weld (check ~.types-nested-noun-context src-495 `tok-495 `tre-495) (check-types ~.types-nested-noun-context ~[%tests %golden ~.types-nested-noun-context %source %jibb] src-495 `typ-495))
3409++ test-types-nested-shallow-preserve
3455++ test-types-nested-shallow-preserve
3410− (weld (check ~.types-nested-shallow-preserve src-495 `tok-495 `tre-495) (check-module-types ~.types-nested-shallow-preserve ~[%tests %golden ~.types-nested-shallow-preserve %source %jibb] src-495 `typ-495 ~ ~ ~))
3456+ (weld (check ~.types-nested-shallow-preserve src-496 `tok-496 `tre-496) (check-module-types ~.types-nested-shallow-preserve ~[%tests %golden ~.types-nested-shallow-preserve %source %jibb] src-496 `typ-496 ~ ~ ~))
3411++ test-types-nested-union-context
3457++ test-types-nested-union-context
3412− (weld (check ~.types-nested-union-context src-496 `tok-496 `tre-496) (check-types ~.types-nested-union-context ~[%tests %golden ~.types-nested-union-context %source %jibb] src-496 `typ-496))
3458+ (weld (check ~.types-nested-union-context src-497 `tok-497 `tre-497) (check-types ~.types-nested-union-context ~[%tests %golden ~.types-nested-union-context %source %jibb] src-497 `typ-497))
3413++ test-types-null-context
3459++ test-types-null-context
3414− (weld (check ~.types-null-context src-497 `tok-497 `tre-497) (check-types ~.types-null-context ~[%tests %golden ~.types-null-context %source %jibb] src-497 `typ-497))
3460+ (weld (check ~.types-null-context src-498 `tok-498 `tre-498) (check-types ~.types-null-context ~[%tests %golden ~.types-null-context %source %jibb] src-498 `typ-498))
3415++ test-types-null-overlap
3461++ test-types-null-overlap
3416− (weld (check ~.types-null-overlap src-498 `tok-498 `tre-498) (check-types ~.types-null-overlap ~[%tests %golden ~.types-null-overlap %source %jibb] src-498 `typ-498))
3462+ (weld (check ~.types-null-overlap src-499 `tok-499 `tre-499) (check-types ~.types-null-overlap ~[%tests %golden ~.types-null-overlap %source %jibb] src-499 `typ-499))
3417++ test-types-null-unresolved
3463++ test-types-null-unresolved
3418− (weld (check ~.types-null-unresolved src-499 `tok-499 `tre-499) (check-types ~.types-null-unresolved ~[%tests %golden ~.types-null-unresolved %source %jibb] src-499 `typ-499))
3464+ (weld (check ~.types-null-unresolved src-500 `tok-500 `tre-500) (check-types ~.types-null-unresolved ~[%tests %golden ~.types-null-unresolved %source %jibb] src-500 `typ-500))
3419++ test-types-pair-context
3465++ test-types-pair-context
3420− (weld (check ~.types-pair-context src-500 `tok-500 `tre-500) (check-module-types ~.types-pair-context ~[%tests %golden ~.types-pair-context %source %jibb] src-500 `typ-500 ~ ~ ~))
3466+ (weld (check ~.types-pair-context src-501 `tok-501 `tre-501) (check-module-types ~.types-pair-context ~[%tests %golden ~.types-pair-context %source %jibb] src-501 `typ-501 ~ ~ ~))
3421++ test-types-partial-apply
3467++ test-types-partial-apply
3422− (weld (check ~.types-partial-apply src-501 `tok-501 `tre-501) (check-types ~.types-partial-apply ~[%tests %golden ~.types-partial-apply %source %jibb] src-501 `typ-501))
3468+ (weld (check ~.types-partial-apply src-502 `tok-502 `tre-502) (check-types ~.types-partial-apply ~[%tests %golden ~.types-partial-apply %source %jibb] src-502 `typ-502))
3423++ test-types-partial-atom-alias
3469++ test-types-partial-atom-alias
3424− (weld (check ~.types-partial-atom-alias src-502 `tok-502 `tre-502) (check-types ~.types-partial-atom-alias ~[%tests %golden ~.types-partial-atom-alias %source %jibb] src-502 `typ-502))
3470+ (weld (check ~.types-partial-atom-alias src-503 `tok-503 `tre-503) (check-types ~.types-partial-atom-alias ~[%tests %golden ~.types-partial-atom-alias %source %jibb] src-503 `typ-503))
3425++ test-types-partial-atom-constraint
3471++ test-types-partial-atom-constraint
3426− (weld (check ~.types-partial-atom-constraint src-503 `tok-503 `tre-503) (check-types ~.types-partial-atom-constraint ~[%tests %golden ~.types-partial-atom-constraint %source %jibb] src-503 `typ-503))
3472+ (weld (check ~.types-partial-atom-constraint src-504 `tok-504 `tre-504) (check-types ~.types-partial-atom-constraint ~[%tests %golden ~.types-partial-atom-constraint %source %jibb] src-504 `typ-504))
3427++ test-types-partial-atom-widening
3473++ test-types-partial-atom-widening
3428− (weld (check ~.types-partial-atom-widening src-504 `tok-504 `tre-504) (check-types ~.types-partial-atom-widening ~[%tests %golden ~.types-partial-atom-widening %source %jibb] src-504 `typ-504))
3474+ (weld (check ~.types-partial-atom-widening src-505 `tok-505 `tre-505) (check-types ~.types-partial-atom-widening ~[%tests %golden ~.types-partial-atom-widening %source %jibb] src-505 `typ-505))
3429++ test-types-partial-aura
3475++ test-types-partial-aura
3430− (weld (check ~.types-partial-aura src-505 `tok-505 `tre-505) (check-types ~.types-partial-aura ~[%tests %golden ~.types-partial-aura %source %jibb] src-505 `typ-505))
3476+ (weld (check ~.types-partial-aura src-506 `tok-506 `tre-506) (check-types ~.types-partial-aura ~[%tests %golden ~.types-partial-aura %source %jibb] src-506 `typ-506))
3431++ test-types-partial-aura-family
3477++ test-types-partial-aura-family
3432− (weld (check ~.types-partial-aura-family src-506 `tok-506 `tre-506) (check-types ~.types-partial-aura-family ~[%tests %golden ~.types-partial-aura-family %source %jibb] src-506 `typ-506))
3478+ (weld (check ~.types-partial-aura-family src-507 `tok-507 `tre-507) (check-types ~.types-partial-aura-family ~[%tests %golden ~.types-partial-aura-family %source %jibb] src-507 `typ-507))
3433++ test-types-partial-aura-generalization
3479++ test-types-partial-aura-generalization
3434− (weld (check ~.types-partial-aura-generalization src-507 `tok-507 `tre-507) (check-types ~.types-partial-aura-generalization ~[%tests %golden ~.types-partial-aura-generalization %source %jibb] src-507 `typ-507))
3480+ (weld (check ~.types-partial-aura-generalization src-508 `tok-508 `tre-508) (check-types ~.types-partial-aura-generalization ~[%tests %golden ~.types-partial-aura-generalization %source %jibb] src-508 `typ-508))
3435++ test-types-partial-bare-atom
3481++ test-types-partial-bare-atom
3436− (weld (check ~.types-partial-bare-atom src-508 `tok-508 `tre-508) (check-types ~.types-partial-bare-atom ~[%tests %golden ~.types-partial-bare-atom %source %jibb] src-508 `typ-508))
3482+ (weld (check ~.types-partial-bare-atom src-509 `tok-509 `tre-509) (check-types ~.types-partial-bare-atom ~[%tests %golden ~.types-partial-bare-atom %source %jibb] src-509 `typ-509))
3437++ test-types-partial-branch-widening
3483++ test-types-partial-branch-widening
3438− (weld (check ~.types-partial-branch-widening src-509 `tok-509 `tre-509) (check-types ~.types-partial-branch-widening ~[%tests %golden ~.types-partial-branch-widening %source %jibb] src-509 `typ-509))
3484+ (weld (check ~.types-partial-branch-widening src-510 `tok-510 `tre-510) (check-types ~.types-partial-branch-widening ~[%tests %golden ~.types-partial-branch-widening %source %jibb] src-510 `typ-510))
3439++ test-types-partial-conflicting-sites
3485++ test-types-partial-conflicting-sites
3440− (weld (check ~.types-partial-conflicting-sites src-510 `tok-510 `tre-510) (check-types ~.types-partial-conflicting-sites ~[%tests %golden ~.types-partial-conflicting-sites %source %jibb] src-510 `typ-510))
3486+ (weld (check ~.types-partial-conflicting-sites src-511 `tok-511 `tre-511) (check-types ~.types-partial-conflicting-sites ~[%tests %golden ~.types-partial-conflicting-sites %source %jibb] src-511 `typ-511))
3441++ test-types-partial-decimal-default
3487++ test-types-partial-decimal-default
3442− (weld (check ~.types-partial-decimal-default src-511 `tok-511 `tre-511) (check-types ~.types-partial-decimal-default ~[%tests %golden ~.types-partial-decimal-default %source %jibb] src-511 `typ-511))
3488+ (weld (check ~.types-partial-decimal-default src-512 `tok-512 `tre-512) (check-types ~.types-partial-decimal-default ~[%tests %golden ~.types-partial-decimal-default %source %jibb] src-512 `typ-512))
3443++ test-types-partial-dependency-chain
3489++ test-types-partial-dependency-chain
3444− (weld (check ~.types-partial-dependency-chain src-512 `tok-512 `tre-512) (check-types ~.types-partial-dependency-chain ~[%tests %golden ~.types-partial-dependency-chain %source %jibb] src-512 `typ-512))
3490+ (weld (check ~.types-partial-dependency-chain src-513 `tok-513 `tre-513) (check-types ~.types-partial-dependency-chain ~[%tests %golden ~.types-partial-dependency-chain %source %jibb] src-513 `typ-513))
3445++ test-types-partial-explicit-capital
3491++ test-types-partial-explicit-capital
3446− (weld (check ~.types-partial-explicit-capital src-513 `tok-513 `tre-513) (check-types ~.types-partial-explicit-capital ~[%tests %golden ~.types-partial-explicit-capital %source %jibb] src-513 `typ-513))
3492+ (weld (check ~.types-partial-explicit-capital src-514 `tok-514 `tre-514) (check-types ~.types-partial-explicit-capital ~[%tests %golden ~.types-partial-explicit-capital %source %jibb] src-514 `typ-514))
3447++ test-types-partial-forward
3493++ test-types-partial-forward
3448− (weld (check ~.types-partial-forward src-514 `tok-514 `tre-514) (check-types ~.types-partial-forward ~[%tests %golden ~.types-partial-forward %source %jibb] src-514 `typ-514))
3494+ (weld (check ~.types-partial-forward src-515 `tok-515 `tre-515) (check-types ~.types-partial-forward ~[%tests %golden ~.types-partial-forward %source %jibb] src-515 `typ-515))
3449++ test-types-partial-generalization
3495++ test-types-partial-generalization
3450− (weld (check ~.types-partial-generalization src-515 `tok-515 `tre-515) (check-types ~.types-partial-generalization ~[%tests %golden ~.types-partial-generalization %source %jibb] src-515 `typ-515))
3496+ (weld (check ~.types-partial-generalization src-516 `tok-516 `tre-516) (check-types ~.types-partial-generalization ~[%tests %golden ~.types-partial-generalization %source %jibb] src-516 `typ-516))
3451++ test-types-partial-identity
3497++ test-types-partial-identity
3452− (weld (check ~.types-partial-identity src-516 `tok-516 `tre-516) (check-types ~.types-partial-identity ~[%tests %golden ~.types-partial-identity %source %jibb] src-516 `typ-516))
3498+ (weld (check ~.types-partial-identity src-517 `tok-517 `tre-517) (check-types ~.types-partial-identity ~[%tests %golden ~.types-partial-identity %source %jibb] src-517 `typ-517))
3453++ test-types-partial-independent-atoms
3499++ test-types-partial-independent-atoms
3454− (weld (check ~.types-partial-independent-atoms src-517 `tok-517 `tre-517) (check-types ~.types-partial-independent-atoms ~[%tests %golden ~.types-partial-independent-atoms %source %jibb] src-517 `typ-517))
3500+ (weld (check ~.types-partial-independent-atoms src-518 `tok-518 `tre-518) (check-types ~.types-partial-independent-atoms ~[%tests %golden ~.types-partial-independent-atoms %source %jibb] src-518 `typ-518))
3455++ test-types-partial-local-molds
3501++ test-types-partial-local-molds
3456− (weld (check ~.types-partial-local-molds src-518 `tok-518 `tre-518) (check-types ~.types-partial-local-molds ~[%tests %golden ~.types-partial-local-molds %source %jibb] src-518 `typ-518))
3502+ (weld (check ~.types-partial-local-molds src-519 `tok-519 `tre-519) (check-types ~.types-partial-local-molds ~[%tests %golden ~.types-partial-local-molds %source %jibb] src-519 `typ-519))
3457++ test-types-partial-locals
3503++ test-types-partial-locals
3458− (weld (check ~.types-partial-locals src-519 `tok-519 `tre-519) (check-types ~.types-partial-locals ~[%tests %golden ~.types-partial-locals %source %jibb] src-519 `typ-519))
3504+ (weld (check ~.types-partial-locals src-520 `tok-520 `tre-520) (check-types ~.types-partial-locals ~[%tests %golden ~.types-partial-locals %source %jibb] src-520 `typ-520))
3459++ test-types-partial-many-atom-constraints
3505++ test-types-partial-many-atom-constraints
3460− (weld (check ~.types-partial-many-atom-constraints src-520 `tok-520 `tre-520) (check-types ~.types-partial-many-atom-constraints ~[%tests %golden ~.types-partial-many-atom-constraints %source %jibb] src-520 `typ-520))
3506+ (weld (check ~.types-partial-many-atom-constraints src-521 `tok-521 `tre-521) (check-types ~.types-partial-many-atom-constraints ~[%tests %golden ~.types-partial-many-atom-constraints %source %jibb] src-521 `typ-521))
3461++ test-types-partial-mold-bare-aura
3507++ test-types-partial-mold-bare-aura
3462− (weld (check ~.types-partial-mold-bare-aura src-521 `tok-521 `tre-521) (check-types ~.types-partial-mold-bare-aura ~[%tests %golden ~.types-partial-mold-bare-aura %source %jibb] src-521 `typ-521))
3508+ (weld (check ~.types-partial-mold-bare-aura src-522 `tok-522 `tre-522) (check-types ~.types-partial-mold-bare-aura ~[%tests %golden ~.types-partial-mold-bare-aura %source %jibb] src-522 `typ-522))
3463++ test-types-partial-mold-composite
3509++ test-types-partial-mold-composite
3464− (weld (check ~.types-partial-mold-composite src-522 `tok-522 `tre-522) (check-types ~.types-partial-mold-composite ~[%tests %golden ~.types-partial-mold-composite %source %jibb] src-522 `typ-522))
3510+ (weld (check ~.types-partial-mold-composite src-523 `tok-523 `tre-523) (check-types ~.types-partial-mold-composite ~[%tests %golden ~.types-partial-mold-composite %source %jibb] src-523 `typ-523))
3465++ test-types-partial-mold-forward
3511++ test-types-partial-mold-forward
3466− (weld (check ~.types-partial-mold-forward src-523 `tok-523 `tre-523) (check-types ~.types-partial-mold-forward ~[%tests %golden ~.types-partial-mold-forward %source %jibb] src-523 `typ-523))
3512+ (weld (check ~.types-partial-mold-forward src-524 `tok-524 `tre-524) (check-types ~.types-partial-mold-forward ~[%tests %golden ~.types-partial-mold-forward %source %jibb] src-524 `typ-524))
3467++ test-types-partial-mold-recursive
3513++ test-types-partial-mold-recursive
3468− (weld (check ~.types-partial-mold-recursive src-524 `tok-524 `tre-524) (check-types ~.types-partial-mold-recursive ~[%tests %golden ~.types-partial-mold-recursive %source %jibb] src-524 `typ-524))
3514+ (weld (check ~.types-partial-mold-recursive src-525 `tok-525 `tre-525) (check-types ~.types-partial-mold-recursive ~[%tests %golden ~.types-partial-mold-recursive %source %jibb] src-525 `typ-525))
3469++ test-types-partial-occurs
3515++ test-types-partial-occurs
3470− (weld (check ~.types-partial-occurs src-525 `tok-525 `tre-525) (check-types ~.types-partial-occurs ~[%tests %golden ~.types-partial-occurs %source %jibb] src-525 `typ-525))
3516+ (weld (check ~.types-partial-occurs src-526 `tok-526 `tre-526) (check-types ~.types-partial-occurs ~[%tests %golden ~.types-partial-occurs %source %jibb] src-526 `typ-526))
3471++ test-types-partial-projection
3517++ test-types-partial-projection
3472− (weld (check ~.types-partial-projection src-526 `tok-526 `tre-526) (check-types ~.types-partial-projection ~[%tests %golden ~.types-partial-projection %source %jibb] src-526 `typ-526))
3518+ (weld (check ~.types-partial-projection src-527 `tok-527 `tre-527) (check-types ~.types-partial-projection ~[%tests %golden ~.types-partial-projection %source %jibb] src-527 `typ-527))
3473++ test-types-partial-shadow-global
3519++ test-types-partial-shadow-global
3474− (weld (check ~.types-partial-shadow-global src-527 `tok-527 `tre-527) (check-types ~.types-partial-shadow-global ~[%tests %golden ~.types-partial-shadow-global %source %jibb] src-527 `typ-527))
3520+ (weld (check ~.types-partial-shadow-global src-528 `tok-528 `tre-528) (check-types ~.types-partial-shadow-global ~[%tests %golden ~.types-partial-shadow-global %source %jibb] src-528 `typ-528))
3475++ test-types-partial-shared-tvar
3521++ test-types-partial-shared-tvar
3476− (weld (check ~.types-partial-shared-tvar src-528 `tok-528 `tre-528) (check-types ~.types-partial-shared-tvar ~[%tests %golden ~.types-partial-shared-tvar %source %jibb] src-528 `typ-528))
3522+ (weld (check ~.types-partial-shared-tvar src-529 `tok-529 `tre-529) (check-types ~.types-partial-shared-tvar ~[%tests %golden ~.types-partial-shared-tvar %source %jibb] src-529 `typ-529))
3477++ test-types-partial-union-cases
3523++ test-types-partial-union-cases
3478− (weld (check ~.types-partial-union-cases src-529 `tok-529 `tre-529) (check-types ~.types-partial-union-cases ~[%tests %golden ~.types-partial-union-cases %source %jibb] src-529 `typ-529))
3524+ (weld (check ~.types-partial-union-cases src-530 `tok-530 `tre-530) (check-types ~.types-partial-union-cases ~[%tests %golden ~.types-partial-union-cases %source %jibb] src-530 `typ-530))
3479++ test-types-partial-union-edges
3525++ test-types-partial-union-edges
3480− (weld (check ~.types-partial-union-edges src-530 `tok-530 `tre-530) (check-types ~.types-partial-union-edges ~[%tests %golden ~.types-partial-union-edges %source %jibb] src-530 `typ-530))
3526+ (weld (check ~.types-partial-union-edges src-531 `tok-531 `tre-531) (check-types ~.types-partial-union-edges ~[%tests %golden ~.types-partial-union-edges %source %jibb] src-531 `typ-531))
3527+++ test-types-partial-union-nested-nouns
3528+ (weld (check ~.types-partial-union-nested-nouns src-532 `tok-532 `tre-532) (check-types ~.types-partial-union-nested-nouns ~[%tests %golden ~.types-partial-union-nested-nouns %source %jibb] src-532 `typ-532))
3481++ test-types-partial-unresolved-tag
3529++ test-types-partial-unresolved-tag
3482− (weld (check ~.types-partial-unresolved-tag src-531 `tok-531 `tre-531) (check-types ~.types-partial-unresolved-tag ~[%tests %golden ~.types-partial-unresolved-tag %source %jibb] src-531 `typ-531))
3530+ (weld (check ~.types-partial-unresolved-tag src-533 `tok-533 `tre-533) (check-types ~.types-partial-unresolved-tag ~[%tests %golden ~.types-partial-unresolved-tag %source %jibb] src-533 `typ-533))
3483++ test-types-positional-faces
3531++ test-types-positional-faces
3484− (weld (check ~.types-positional-faces src-532 `tok-532 `tre-532) (check-types ~.types-positional-faces ~[%tests %golden ~.types-positional-faces %source %jibb] src-532 `typ-532))
3532+ (weld (check ~.types-positional-faces src-534 `tok-534 `tre-534) (check-types ~.types-positional-faces ~[%tests %golden ~.types-positional-faces %source %jibb] src-534 `typ-534))
3485++ test-types-prelude-arithmetic
3533++ test-types-prelude-arithmetic
3486− (weld (check ~.types-prelude-arithmetic src-533 `tok-533 `tre-533) (check-module-types ~.types-prelude-arithmetic ~[%tests %golden ~.types-prelude-arithmetic %source %jibb] src-533 `typ-533 ~ ~ ~))
3534+ (weld (check ~.types-prelude-arithmetic src-535 `tok-535 `tre-535) (check-module-types ~.types-prelude-arithmetic ~[%tests %golden ~.types-prelude-arithmetic %source %jibb] src-535 `typ-535 ~ ~ ~))
3487++ test-types-prelude-ask
3535++ test-types-prelude-ask
3488− (weld (check ~.types-prelude-ask src-534 `tok-534 `tre-534) (check-module-types ~.types-prelude-ask ~[%tests %golden ~.types-prelude-ask %source %jibb] src-534 `typ-534 ~ ~ ~))
3536+ (weld (check ~.types-prelude-ask src-536 `tok-536 `tre-536) (check-module-types ~.types-prelude-ask ~[%tests %golden ~.types-prelude-ask %source %jibb] src-536 `typ-536 ~ ~ ~))
3489++ test-types-prelude-bond
3537++ test-types-prelude-bond
3490− (weld (check ~.types-prelude-bond src-535 `tok-535 `tre-535) (check-module-types ~.types-prelude-bond ~[%tests %golden ~.types-prelude-bond %source %jibb] src-535 `typ-535 ~ ~ ~))
3538+ (weld (check ~.types-prelude-bond src-537 `tok-537 `tre-537) (check-module-types ~.types-prelude-bond ~[%tests %golden ~.types-prelude-bond %source %jibb] src-537 `typ-537 ~ ~ ~))
3491++ test-types-prelude-cmd
3539++ test-types-prelude-cmd
3492− (weld (check ~.types-prelude-cmd src-536 `tok-536 `tre-536) (check-module-types ~.types-prelude-cmd ~[%tests %golden ~.types-prelude-cmd %source %jibb] src-536 `typ-536 ~ ~ ~))
3540+ (weld (check ~.types-prelude-cmd src-538 `tok-538 `tre-538) (check-module-types ~.types-prelude-cmd ~[%tests %golden ~.types-prelude-cmd %source %jibb] src-538 `typ-538 ~ ~ ~))
3541+++ test-types-prelude-comparison
3542+ (weld (check ~.types-prelude-comparison src-539 `tok-539 `tre-539) (check-module-types ~.types-prelude-comparison ~[%tests %golden ~.types-prelude-comparison %source %jibb] src-539 `typ-539 ~ ~ ~))
3493++ test-types-prelude-direct
3543++ test-types-prelude-direct
3494− (weld (check ~.types-prelude-direct src-537 `tok-537 `tre-537) (check-module-types ~.types-prelude-direct ~[%tests %golden ~.types-prelude-direct %source %jibb] src-537 `typ-537 ~ ~ ~))
3544+ (weld (check ~.types-prelude-direct src-540 `tok-540 `tre-540) (check-module-types ~.types-prelude-direct ~[%tests %golden ~.types-prelude-direct %source %jibb] src-540 `typ-540 ~ ~ ~))
3495++ test-types-prelude-functional
3545++ test-types-prelude-functional
3496− (weld (check ~.types-prelude-functional src-538 `tok-538 `tre-538) (check-module-types ~.types-prelude-functional ~[%tests %golden ~.types-prelude-functional %source %jibb] src-538 `typ-538 ~ ~ ~))
3546+ (weld (check ~.types-prelude-functional src-541 `tok-541 `tre-541) (check-module-types ~.types-prelude-functional ~[%tests %golden ~.types-prelude-functional %source %jibb] src-541 `typ-541 ~ ~ ~))
3497++ test-types-prelude-generic-alias
3547++ test-types-prelude-generic-alias
3498− (weld (weld (check ~.types-prelude-generic-alias src-539 `tok-539 `tre-539) (check-module-types ~.types-prelude-generic-alias ~[%tests %golden ~.types-prelude-generic-alias %source %jibb] src-539 `typ-539 ~ ~ ~[['/ui/alias-helper.jibb' ~[~.ui ~.alias-helper ~.jibb] mod-539-1]])) (check-module-trees ~.types-prelude-generic-alias `mtre-539 ~[['/ui/alias-helper.jibb' ~[~.ui ~.alias-helper ~.jibb] mod-539-1]]))
3548+ (weld (weld (check ~.types-prelude-generic-alias src-542 `tok-542 `tre-542) (check-module-types ~.types-prelude-generic-alias ~[%tests %golden ~.types-prelude-generic-alias %source %jibb] src-542 `typ-542 ~ ~ ~[['/ui/alias-helper.jibb' ~[~.ui ~.alias-helper ~.jibb] mod-542-1]])) (check-module-trees ~.types-prelude-generic-alias `mtre-542 ~[['/ui/alias-helper.jibb' ~[~.ui ~.alias-helper ~.jibb] mod-542-1]]))
3499++ test-types-prelude-interface
3549++ test-types-prelude-interface
3500− (weld (weld (check ~.types-prelude-interface src-540 `tok-540 `tre-540) (check-module-types ~.types-prelude-interface ~[%tests %golden ~.types-prelude-interface %source %jibb] src-540 `typ-540 ~ ~ ~[['/ui/left.jibb' ~[~.ui ~.left ~.jibb] mod-540-1] ['/ui/right.jibb' ~[~.ui ~.right ~.jibb] mod-540-2]])) (check-module-trees ~.types-prelude-interface `mtre-540 ~[['/ui/left.jibb' ~[~.ui ~.left ~.jibb] mod-540-1] ['/ui/right.jibb' ~[~.ui ~.right ~.jibb] mod-540-2]]))
3550+ (weld (weld (check ~.types-prelude-interface src-543 `tok-543 `tre-543) (check-module-types ~.types-prelude-interface ~[%tests %golden ~.types-prelude-interface %source %jibb] src-543 `typ-543 ~ ~ ~[['/ui/left.jibb' ~[~.ui ~.left ~.jibb] mod-543-1] ['/ui/right.jibb' ~[~.ui ~.right ~.jibb] mod-543-2]])) (check-module-trees ~.types-prelude-interface `mtre-543 ~[['/ui/left.jibb' ~[~.ui ~.left ~.jibb] mod-543-1] ['/ui/right.jibb' ~[~.ui ~.right ~.jibb] mod-543-2]]))
3551+++ test-types-prelude-lead-late
3552+ (weld (check ~.types-prelude-lead-late src-544 `tok-544 `tre-544) (check-module-types ~.types-prelude-lead-late ~[%tests %golden ~.types-prelude-lead-late %source %jibb] src-544 `typ-544 ~ ~ ~))
3553+++ test-types-prelude-lent
3554+ (weld (check ~.types-prelude-lent src-545 `tok-545 `tre-545) (check-module-types ~.types-prelude-lent ~[%tests %golden ~.types-prelude-lent %source %jibb] src-545 `typ-545 ~ ~ ~))
3501++ test-types-prelude-like
3555++ test-types-prelude-like
3502− (weld (check ~.types-prelude-like src-541 `tok-541 `tre-541) (check-module-types ~.types-prelude-like ~[%tests %golden ~.types-prelude-like %source %jibb] src-541 `typ-541 ~ ~ ~))
3556+ (weld (check ~.types-prelude-like src-546 `tok-546 `tre-546) (check-module-types ~.types-prelude-like ~[%tests %golden ~.types-prelude-like %source %jibb] src-546 `typ-546 ~ ~ ~))
3503++ test-types-prelude-list-alias
3557++ test-types-prelude-list-alias
3504− (weld (check ~.types-prelude-list-alias src-542 `tok-542 `tre-542) (check-module-types ~.types-prelude-list-alias ~[%tests %golden ~.types-prelude-list-alias %source %jibb] src-542 `typ-542 ~ ~ ~))
3558+ (weld (check ~.types-prelude-list-alias src-547 `tok-547 `tre-547) (check-module-types ~.types-prelude-list-alias ~[%tests %golden ~.types-prelude-list-alias %source %jibb] src-547 `typ-547 ~ ~ ~))
3505++ test-types-prelude-list-functions
3559++ test-types-prelude-list-functions
3506− (weld (weld (check ~.types-prelude-list-functions src-543 `tok-543 `tre-543) (check-module-types ~.types-prelude-list-functions ~[%tests %golden ~.types-prelude-list-functions %source %jibb] src-543 `typ-543 ~ ~ ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-543-1]])) (check-module-trees ~.types-prelude-list-functions `mtre-543 ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-543-1]]))
3560+ (weld (weld (check ~.types-prelude-list-functions src-548 `tok-548 `tre-548) (check-module-types ~.types-prelude-list-functions ~[%tests %golden ~.types-prelude-list-functions %source %jibb] src-548 `typ-548 ~ ~ ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-548-1]])) (check-module-trees ~.types-prelude-list-functions `mtre-548 ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-548-1]]))
3507++ test-types-prelude-list-helpers
3561++ test-types-prelude-list-helpers
3508− (weld (check ~.types-prelude-list-helpers src-544 `tok-544 `tre-544) (check-module-types ~.types-prelude-list-helpers ~[%tests %golden ~.types-prelude-list-helpers %source %jibb] src-544 `typ-544 ~ ~ ~))
3562+ (weld (check ~.types-prelude-list-helpers src-549 `tok-549 `tre-549) (check-module-types ~.types-prelude-list-helpers ~[%tests %golden ~.types-prelude-list-helpers %source %jibb] src-549 `typ-549 ~ ~ ~))
3509++ test-types-prelude-predicates
3563++ test-types-prelude-predicates
3510− (weld (check ~.types-prelude-predicates src-545 `tok-545 `tre-545) (check-module-types ~.types-prelude-predicates ~[%tests %golden ~.types-prelude-predicates %source %jibb] src-545 `typ-545 ~ ~ ~))
3564+ (weld (check ~.types-prelude-predicates src-550 `tok-550 `tre-550) (check-module-types ~.types-prelude-predicates ~[%tests %golden ~.types-prelude-predicates %source %jibb] src-550 `typ-550 ~ ~ ~))
3511++ test-types-prelude-sub
3565++ test-types-prelude-sub
3512− (weld (check ~.types-prelude-sub src-546 `tok-546 `tre-546) (check-module-types ~.types-prelude-sub ~[%tests %golden ~.types-prelude-sub %source %jibb] src-546 `typ-546 ~ ~ ~))
3566+ (weld (check ~.types-prelude-sub src-551 `tok-551 `tre-551) (check-module-types ~.types-prelude-sub ~[%tests %golden ~.types-prelude-sub %source %jibb] src-551 `typ-551 ~ ~ ~))
3513++ test-types-prelude-sub-nested
3567++ test-types-prelude-sub-nested
3514− (weld (check ~.types-prelude-sub-nested src-547 `tok-547 `tre-547) (check-module-types ~.types-prelude-sub-nested ~[%tests %golden ~.types-prelude-sub-nested %source %jibb] src-547 `typ-547 ~ ~ ~))
3568+ (weld (check ~.types-prelude-sub-nested src-552 `tok-552 `tre-552) (check-module-types ~.types-prelude-sub-nested ~[%tests %golden ~.types-prelude-sub-nested %source %jibb] src-552 `typ-552 ~ ~ ~))
3569+++ test-types-prelude-succ
3570+ (weld (check ~.types-prelude-succ src-553 `tok-553 `tre-553) (check-module-types ~.types-prelude-succ ~[%tests %golden ~.types-prelude-succ %source %jibb] src-553 `typ-553 ~ ~ ~))
3571+++ test-types-prelude-text
3572+ (weld (check ~.types-prelude-text src-554 `tok-554 `tre-554) (check-module-types ~.types-prelude-text ~[%tests %golden ~.types-prelude-text %source %jibb] src-554 `typ-554 ~ ~ ~))
3573+++ test-types-prelude-ui
3574+ (weld (check ~.types-prelude-ui src-555 `tok-555 `tre-555) (check-module-types ~.types-prelude-ui ~[%tests %golden ~.types-prelude-ui %source %jibb] src-555 `typ-555 ~ ~ ~))
3515++ test-types-prelude-unit-helpers
3575++ test-types-prelude-unit-helpers
3516− (weld (check ~.types-prelude-unit-helpers src-548 `tok-548 `tre-548) (check-module-types ~.types-prelude-unit-helpers ~[%tests %golden ~.types-prelude-unit-helpers %source %jibb] src-548 `typ-548 ~ ~ ~))
3576+ (weld (check ~.types-prelude-unit-helpers src-556 `tok-556 `tre-556) (check-module-types ~.types-prelude-unit-helpers ~[%tests %golden ~.types-prelude-unit-helpers %source %jibb] src-556 `typ-556 ~ ~ ~))
3577+++ test-types-prelude-zing
3578+ (weld (check ~.types-prelude-zing src-557 `tok-557 `tre-557) (check-module-types ~.types-prelude-zing ~[%tests %golden ~.types-prelude-zing %source %jibb] src-557 `typ-557 ~ ~ ~))
3517++ test-types-proj-explicit-context
3579++ test-types-proj-explicit-context
3518− (weld (check ~.types-proj-explicit-context src-549 `tok-549 `tre-549) (check-module-types ~.types-proj-explicit-context ~[%tests %golden ~.types-proj-explicit-context %source %jibb] src-549 `typ-549 ~ ~ ~))
3580+ (weld (check ~.types-proj-explicit-context src-558 `tok-558 `tre-558) (check-module-types ~.types-proj-explicit-context ~[%tests %golden ~.types-proj-explicit-context %source %jibb] src-558 `typ-558 ~ ~ ~))
3519++ test-types-proj-nested-no-implicit
3581++ test-types-proj-nested-no-implicit
3520− (weld (check ~.types-proj-nested-no-implicit src-550 `tok-550 `tre-550) (check-module-types ~.types-proj-nested-no-implicit ~[%tests %golden ~.types-proj-nested-no-implicit %source %jibb] src-550 `typ-550 ~ ~ ~))
3582+ (weld (check ~.types-proj-nested-no-implicit src-559 `tok-559 `tre-559) (check-module-types ~.types-proj-nested-no-implicit ~[%tests %golden ~.types-proj-nested-no-implicit %source %jibb] src-559 `typ-559 ~ ~ ~))
3521++ test-types-proj-reserved-imported-definition
3583++ test-types-proj-reserved-imported-definition
3522− (weld (weld (check ~.types-proj-reserved-imported-definition src-551 `tok-551 `tre-551) (check-module-types ~.types-proj-reserved-imported-definition ~[%tests %golden ~.types-proj-reserved-imported-definition %source %jibb] src-551 `typ-551 ~ ~ ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-551-1]])) (check-module-trees ~.types-proj-reserved-imported-definition `mtre-551 ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-551-1]]))
3584+ (weld (weld (check ~.types-proj-reserved-imported-definition src-560 `tok-560 `tre-560) (check-module-types ~.types-proj-reserved-imported-definition ~[%tests %golden ~.types-proj-reserved-imported-definition %source %jibb] src-560 `typ-560 ~ ~ ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-560-1]])) (check-module-trees ~.types-proj-reserved-imported-definition `mtre-560 ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-560-1]]))
3523++ test-types-proj-reserved-jibb-import
3585++ test-types-proj-reserved-jibb-import
3524− (weld (weld (check ~.types-proj-reserved-jibb-import src-552 `tok-552 `tre-552) (check-module-types ~.types-proj-reserved-jibb-import ~[%tests %golden ~.types-proj-reserved-jibb-import %source %jibb] src-552 `typ-552 ~ ~ ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-552-1]])) (check-module-trees ~.types-proj-reserved-jibb-import `mtre-552 ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-552-1]]))
3586+ (weld (weld (check ~.types-proj-reserved-jibb-import src-561 `tok-561 `tre-561) (check-module-types ~.types-proj-reserved-jibb-import ~[%tests %golden ~.types-proj-reserved-jibb-import %source %jibb] src-561 `typ-561 ~ ~ ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-561-1]])) (check-module-trees ~.types-proj-reserved-jibb-import `mtre-561 ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-561-1]]))
3525++ test-types-proj-reserved-local
3587++ test-types-proj-reserved-local
3526− (weld (check ~.types-proj-reserved-local src-553 `tok-553 `tre-553) (check-module-types ~.types-proj-reserved-local ~[%tests %golden ~.types-proj-reserved-local %source %jibb] src-553 `typ-553 ~ ~ ~))
3588+ (weld (check ~.types-proj-reserved-local src-562 `tok-562 `tre-562) (check-module-types ~.types-proj-reserved-local ~[%tests %golden ~.types-proj-reserved-local %source %jibb] src-562 `typ-562 ~ ~ ~))
3527++ test-types-proj-reserved-local-mold
3589++ test-types-proj-reserved-local-mold
3528− (weld (check ~.types-proj-reserved-local-mold src-554 `tok-554 `tre-554) (check-module-types ~.types-proj-reserved-local-mold ~[%tests %golden ~.types-proj-reserved-local-mold %source %jibb] src-554 `typ-554 ~ ~ ~))
3590+ (weld (check ~.types-proj-reserved-local-mold src-563 `tok-563 `tre-563) (check-module-types ~.types-proj-reserved-local-mold ~[%tests %golden ~.types-proj-reserved-local-mold %source %jibb] src-563 `typ-563 ~ ~ ~))
3529++ test-types-proj-reserved-mark-import
3591++ test-types-proj-reserved-mark-import
3530− (weld (check ~.types-proj-reserved-mark-import src-555 `tok-555 `tre-555) (check-module-types ~.types-proj-reserved-mark-import ~[%tests %golden ~.types-proj-reserved-mark-import %source %jibb] src-555 `typ-555 ~ ~ ~))
3592+ (weld (check ~.types-proj-reserved-mark-import src-564 `tok-564 `tre-564) (check-module-types ~.types-proj-reserved-mark-import ~[%tests %golden ~.types-proj-reserved-mark-import %source %jibb] src-564 `typ-564 ~ ~ ~))
3531++ test-types-proj-reserved-mold
3593++ test-types-proj-reserved-mold
3532− (weld (check ~.types-proj-reserved-mold src-556 `tok-556 `tre-556) (check-module-types ~.types-proj-reserved-mold ~[%tests %golden ~.types-proj-reserved-mold %source %jibb] src-556 `typ-556 ~ ~ ~))
3594+ (weld (check ~.types-proj-reserved-mold src-565 `tok-565 `tre-565) (check-module-types ~.types-proj-reserved-mold ~[%tests %golden ~.types-proj-reserved-mold %source %jibb] src-565 `typ-565 ~ ~ ~))
3533++ test-types-proj-reserved-pattern
3595++ test-types-proj-reserved-pattern
3534− (weld (check ~.types-proj-reserved-pattern src-557 `tok-557 `tre-557) (check-module-types ~.types-proj-reserved-pattern ~[%tests %golden ~.types-proj-reserved-pattern %source %jibb] src-557 `typ-557 ~ ~ ~))
3596+ (weld (check ~.types-proj-reserved-pattern src-566 `tok-566 `tre-566) (check-module-types ~.types-proj-reserved-pattern ~[%tests %golden ~.types-proj-reserved-pattern %source %jibb] src-566 `typ-566 ~ ~ ~))
3535++ test-types-proj-reserved-positive
3597++ test-types-proj-reserved-positive
3536− (weld (check ~.types-proj-reserved-positive src-558 `tok-558 `tre-558) (check-module-types ~.types-proj-reserved-positive ~[%tests %golden ~.types-proj-reserved-positive %source %jibb] src-558 `typ-558 ~ ~ ~))
3598+ (weld (check ~.types-proj-reserved-positive src-567 `tok-567 `tre-567) (check-module-types ~.types-proj-reserved-positive ~[%tests %golden ~.types-proj-reserved-positive %source %jibb] src-567 `typ-567 ~ ~ ~))
3537++ test-types-proj-reserved-sample
3599++ test-types-proj-reserved-sample
3538− (weld (check ~.types-proj-reserved-sample src-559 `tok-559 `tre-559) (check-module-types ~.types-proj-reserved-sample ~[%tests %golden ~.types-proj-reserved-sample %source %jibb] src-559 `typ-559 ~ ~ ~))
3600+ (weld (check ~.types-proj-reserved-sample src-568 `tok-568 `tre-568) (check-module-types ~.types-proj-reserved-sample ~[%tests %golden ~.types-proj-reserved-sample %source %jibb] src-568 `typ-568 ~ ~ ~))
3539++ test-types-proj-reserved-sur-import
3601++ test-types-proj-reserved-sur-import
3540− (weld (check ~.types-proj-reserved-sur-import src-560 `tok-560 `tre-560) (check-module-types ~.types-proj-reserved-sur-import ~[%tests %golden ~.types-proj-reserved-sur-import %source %jibb] src-560 `typ-560 ~ ~ ~))
3602+ (weld (check ~.types-proj-reserved-sur-import src-569 `tok-569 `tre-569) (check-module-types ~.types-proj-reserved-sur-import ~[%tests %golden ~.types-proj-reserved-sur-import %source %jibb] src-569 `typ-569 ~ ~ ~))
3541++ test-types-proj-reserved-unused-pattern
3603++ test-types-proj-reserved-unused-pattern
3542− (weld (check ~.types-proj-reserved-unused-pattern src-561 `tok-561 `tre-561) (check-module-types ~.types-proj-reserved-unused-pattern ~[%tests %golden ~.types-proj-reserved-unused-pattern %source %jibb] src-561 `typ-561 ~ ~ ~))
3604+ (weld (check ~.types-proj-reserved-unused-pattern src-570 `tok-570 `tre-570) (check-module-types ~.types-proj-reserved-unused-pattern ~[%tests %golden ~.types-proj-reserved-unused-pattern %source %jibb] src-570 `typ-570 ~ ~ ~))
3543++ test-types-proj-reserved-unused-sample
3605++ test-types-proj-reserved-unused-sample
3544− (weld (check ~.types-proj-reserved-unused-sample src-562 `tok-562 `tre-562) (check-module-types ~.types-proj-reserved-unused-sample ~[%tests %golden ~.types-proj-reserved-unused-sample %source %jibb] src-562 `typ-562 ~ ~ ~))
3606+ (weld (check ~.types-proj-reserved-unused-sample src-571 `tok-571 `tre-571) (check-module-types ~.types-proj-reserved-unused-sample ~[%tests %golden ~.types-proj-reserved-unused-sample %source %jibb] src-571 `typ-571 ~ ~ ~))
3545++ test-types-proj-reserved-unused-value
3607++ test-types-proj-reserved-unused-value
3546− (weld (check ~.types-proj-reserved-unused-value src-563 `tok-563 `tre-563) (check-module-types ~.types-proj-reserved-unused-value ~[%tests %golden ~.types-proj-reserved-unused-value %source %jibb] src-563 `typ-563 ~ ~ ~))
3608+ (weld (check ~.types-proj-reserved-unused-value src-572 `tok-572 `tre-572) (check-module-types ~.types-proj-reserved-unused-value ~[%tests %golden ~.types-proj-reserved-unused-value %source %jibb] src-572 `typ-572 ~ ~ ~))
3547++ test-types-proj-reserved-value
3609++ test-types-proj-reserved-value
3548− (weld (check ~.types-proj-reserved-value src-564 `tok-564 `tre-564) (check-module-types ~.types-proj-reserved-value ~[%tests %golden ~.types-proj-reserved-value %source %jibb] src-564 `typ-564 ~ ~ ~))
3610+ (weld (check ~.types-proj-reserved-value src-573 `tok-573 `tre-573) (check-module-types ~.types-proj-reserved-value ~[%tests %golden ~.types-proj-reserved-value %source %jibb] src-573 `typ-573 ~ ~ ~))
3549++ test-types-proj-single-duplicate
3611++ test-types-proj-single-duplicate
3550− (weld (check ~.types-proj-single-duplicate src-565 `tok-565 `tre-565) (check-module-types ~.types-proj-single-duplicate ~[%tests %golden ~.types-proj-single-duplicate %source %jibb] src-565 `typ-565 ~ ~ ~))
3612+ (weld (check ~.types-proj-single-duplicate src-574 `tok-574 `tre-574) (check-module-types ~.types-proj-single-duplicate ~[%tests %golden ~.types-proj-single-duplicate %source %jibb] src-574 `typ-574 ~ ~ ~))
3551++ test-types-proj-single-field
3613++ test-types-proj-single-field
3552− (weld (check ~.types-proj-single-field src-566 `tok-566 `tre-566) (check-module-types ~.types-proj-single-field ~[%tests %golden ~.types-proj-single-field %source %jibb] src-566 `typ-566 ~ ~ ~))
3614+ (weld (check ~.types-proj-single-field src-575 `tok-575 `tre-575) (check-module-types ~.types-proj-single-field ~[%tests %golden ~.types-proj-single-field %source %jibb] src-575 `typ-575 ~ ~ ~))
3553++ test-types-proj-single-sample-face
3615++ test-types-proj-single-sample-face
3554− (weld (check ~.types-proj-single-sample-face src-567 `tok-567 `tre-567) (check-module-types ~.types-proj-single-sample-face ~[%tests %golden ~.types-proj-single-sample-face %source %jibb] src-567 `typ-567 ~ ~ ~))
3616+ (weld (check ~.types-proj-single-sample-face src-576 `tok-576 `tre-576) (check-module-types ~.types-proj-single-sample-face ~[%tests %golden ~.types-proj-single-sample-face %source %jibb] src-576 `typ-576 ~ ~ ~))
3555++ test-types-proj-single-wrapped
3617++ test-types-proj-single-wrapped
3556− (weld (check ~.types-proj-single-wrapped src-568 `tok-568 `tre-568) (check-module-types ~.types-proj-single-wrapped ~[%tests %golden ~.types-proj-single-wrapped %source %jibb] src-568 `typ-568 ~ ~ ~))
3618+ (weld (check ~.types-proj-single-wrapped src-577 `tok-577 `tre-577) (check-module-types ~.types-proj-single-wrapped ~[%tests %golden ~.types-proj-single-wrapped %source %jibb] src-577 `typ-577 ~ ~ ~))
3557++ test-types-qath-faces
3619++ test-types-qath-faces
3558− (weld (check ~.types-qath-faces src-569 `tok-569 `tre-569) (check-module-types ~.types-qath-faces ~[%tests %golden ~.types-qath-faces %source %jibb] src-569 `typ-569 ~ ~ ~))
3620+ (weld (check ~.types-qath-faces src-578 `tok-578 `tre-578) (check-module-types ~.types-qath-faces ~[%tests %golden ~.types-qath-faces %source %jibb] src-578 `typ-578 ~ ~ ~))
3559++ test-types-qath-holes
3621++ test-types-qath-holes
3560− (weld (check ~.types-qath-holes src-570 `tok-570 `tre-570) (check-module-types ~.types-qath-holes ~[%tests %golden ~.types-qath-holes %source %jibb] src-570 `typ-570 ~ ~ ~))
3622+ (weld (check ~.types-qath-holes src-579 `tok-579 `tre-579) (check-module-types ~.types-qath-holes ~[%tests %golden ~.types-qath-holes %source %jibb] src-579 `typ-579 ~ ~ ~))
3561++ test-types-qath-module-identity
3623++ test-types-qath-module-identity
3562− (weld (weld (check ~.types-qath-module-identity src-571 `tok-571 `tre-571) (check-module-types ~.types-qath-module-identity ~[%tests %golden ~.types-qath-module-identity %source %jibb] src-571 `typ-571 ~ ~ ~[['/ui/one.jibb' ~[~.ui ~.one ~.jibb] mod-571-1] ['/ui/two.jibb' ~[~.ui ~.two ~.jibb] mod-571-2] ['/ui/mid.jibb' ~[~.ui ~.mid ~.jibb] mod-571-3]])) (check-module-trees ~.types-qath-module-identity `mtre-571 ~[['/ui/one.jibb' ~[~.ui ~.one ~.jibb] mod-571-1] ['/ui/two.jibb' ~[~.ui ~.two ~.jibb] mod-571-2] ['/ui/mid.jibb' ~[~.ui ~.mid ~.jibb] mod-571-3]]))
3624+ (weld (weld (check ~.types-qath-module-identity src-580 `tok-580 `tre-580) (check-module-types ~.types-qath-module-identity ~[%tests %golden ~.types-qath-module-identity %source %jibb] src-580 `typ-580 ~ ~ ~[['/ui/one.jibb' ~[~.ui ~.one ~.jibb] mod-580-1] ['/ui/two.jibb' ~[~.ui ~.two ~.jibb] mod-580-2] ['/ui/mid.jibb' ~[~.ui ~.mid ~.jibb] mod-580-3]])) (check-module-trees ~.types-qath-module-identity `mtre-580 ~[['/ui/one.jibb' ~[~.ui ~.one ~.jibb] mod-580-1] ['/ui/two.jibb' ~[~.ui ~.two ~.jibb] mod-580-2] ['/ui/mid.jibb' ~[~.ui ~.mid ~.jibb] mod-580-3]]))
3563++ test-types-qath-recursive
3625++ test-types-qath-recursive
3564− (weld (check ~.types-qath-recursive src-572 `tok-572 `tre-572) (check-module-types ~.types-qath-recursive ~[%tests %golden ~.types-qath-recursive %source %jibb] src-572 `typ-572 ~ ~ ~))
3626+ (weld (check ~.types-qath-recursive src-581 `tok-581 `tre-581) (check-module-types ~.types-qath-recursive ~[%tests %golden ~.types-qath-recursive %source %jibb] src-581 `typ-581 ~ ~ ~))
3565++ test-types-record-bound-variable
3627++ test-types-record-bound-variable
3566− (weld (check ~.types-record-bound-variable src-573 `tok-573 `tre-573) (check-types ~.types-record-bound-variable ~[%tests %golden ~.types-record-bound-variable %source %jibb] src-573 `typ-573))
3628+ (weld (check ~.types-record-bound-variable src-582 `tok-582 `tre-582) (check-types ~.types-record-bound-variable ~[%tests %golden ~.types-record-bound-variable %source %jibb] src-582 `typ-582))
3567++ test-types-record-cast-context
3629++ test-types-record-cast-context
3568− (weld (check ~.types-record-cast-context src-574 `tok-574 `tre-574) (check-module-types ~.types-record-cast-context ~[%tests %golden ~.types-record-cast-context %source %jibb] src-574 `typ-574 ~ ~ ~))
3630+ (weld (check ~.types-record-cast-context src-583 `tok-583 `tre-583) (check-module-types ~.types-record-cast-context ~[%tests %golden ~.types-record-cast-context %source %jibb] src-583 `typ-583 ~ ~ ~))
3569++ test-types-record-change
3631++ test-types-record-change
3570− (weld (check ~.types-record-change src-575 `tok-575 `tre-575) (check-module-types ~.types-record-change ~[%tests %golden ~.types-record-change %source %jibb] src-575 `typ-575 ~ ~ ~))
3632+ (weld (check ~.types-record-change src-584 `tok-584 `tre-584) (check-module-types ~.types-record-change ~[%tests %golden ~.types-record-change %source %jibb] src-584 `typ-584 ~ ~ ~))
3571++ test-types-record-change-generic
3633++ test-types-record-change-generic
3572− (weld (check ~.types-record-change-generic src-576 `tok-576 `tre-576) (check-module-types ~.types-record-change-generic ~[%tests %golden ~.types-record-change-generic %source %jibb] src-576 `typ-576 ~ ~ ~))
3634+ (weld (check ~.types-record-change-generic src-585 `tok-585 `tre-585) (check-module-types ~.types-record-change-generic ~[%tests %golden ~.types-record-change-generic %source %jibb] src-585 `typ-585 ~ ~ ~))
3573++ test-types-record-faces
3635++ test-types-record-faces
3574− (weld (check ~.types-record-faces src-577 `tok-577 `tre-577) (check-types ~.types-record-faces ~[%tests %golden ~.types-record-faces %source %jibb] src-577 `typ-577))
3636+ (weld (check ~.types-record-faces src-586 `tok-586 `tre-586) (check-types ~.types-record-faces ~[%tests %golden ~.types-record-faces %source %jibb] src-586 `typ-586))
3575++ test-types-record-field-edit-separate
3637++ test-types-record-field-edit-separate
3576− (weld (check ~.types-record-field-edit-separate src-578 `tok-578 `tre-578) (check-types ~.types-record-field-edit-separate ~[%tests %golden ~.types-record-field-edit-separate %source %jibb] src-578 `typ-578))
3638+ (weld (check ~.types-record-field-edit-separate src-587 `tok-587 `tre-587) (check-types ~.types-record-field-edit-separate ~[%tests %golden ~.types-record-field-edit-separate %source %jibb] src-587 `typ-587))
3577++ test-types-record-field-expr-duplicate
3639++ test-types-record-field-expr-duplicate
3578− (weld (check ~.types-record-field-expr-duplicate src-579 `tok-579 `tre-579) (check-types ~.types-record-field-expr-duplicate ~[%tests %golden ~.types-record-field-expr-duplicate %source %jibb] src-579 `typ-579))
3640+ (weld (check ~.types-record-field-expr-duplicate src-588 `tok-588 `tre-588) (check-types ~.types-record-field-expr-duplicate ~[%tests %golden ~.types-record-field-expr-duplicate %source %jibb] src-588 `typ-588))
3579++ test-types-record-field-expr-separate
3641++ test-types-record-field-expr-separate
3580− (weld (check ~.types-record-field-expr-separate src-580 `tok-580 `tre-580) (check-types ~.types-record-field-expr-separate ~[%tests %golden ~.types-record-field-expr-separate %source %jibb] src-580 `typ-580))
3642+ (weld (check ~.types-record-field-expr-separate src-589 `tok-589 `tre-589) (check-types ~.types-record-field-expr-separate ~[%tests %golden ~.types-record-field-expr-separate %source %jibb] src-589 `typ-589))
3581++ test-types-record-field-module-reachable
3643++ test-types-record-field-module-reachable
3582− (weld (weld (check ~.types-record-field-module-reachable src-581 `tok-581 `tre-581) (check-module-types ~.types-record-field-module-reachable ~[%tests %golden ~.types-record-field-module-reachable %source %jibb] src-581 `typ-581 ~ ~ ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-581-1]])) (check-module-trees ~.types-record-field-module-reachable `mtre-581 ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-581-1]]))
3644+ (weld (weld (check ~.types-record-field-module-reachable src-590 `tok-590 `tre-590) (check-module-types ~.types-record-field-module-reachable ~[%tests %golden ~.types-record-field-module-reachable %source %jibb] src-590 `typ-590 ~ ~ ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-590-1]])) (check-module-trees ~.types-record-field-module-reachable `mtre-590 ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-590-1]]))
3583++ test-types-record-field-module-unused
3645++ test-types-record-field-module-unused
3584− (weld (weld (check ~.types-record-field-module-unused src-582 `tok-582 `tre-582) (check-module-types ~.types-record-field-module-unused ~[%tests %golden ~.types-record-field-module-unused %source %jibb] src-582 `typ-582 ~ ~ ~[['/ui/good.jibb' ~[~.ui ~.good ~.jibb] mod-582-1] ['/ui/unused.jibb' ~[~.ui ~.unused ~.jibb] mod-582-2]])) (check-module-trees ~.types-record-field-module-unused `mtre-582 ~[['/ui/good.jibb' ~[~.ui ~.good ~.jibb] mod-582-1] ['/ui/unused.jibb' ~[~.ui ~.unused ~.jibb] mod-582-2]]))
3646+ (weld (weld (check ~.types-record-field-module-unused src-591 `tok-591 `tre-591) (check-module-types ~.types-record-field-module-unused ~[%tests %golden ~.types-record-field-module-unused %source %jibb] src-591 `typ-591 ~ ~ ~[['/ui/good.jibb' ~[~.ui ~.good ~.jibb] mod-591-1] ['/ui/unused.jibb' ~[~.ui ~.unused ~.jibb] mod-591-2]])) (check-module-trees ~.types-record-field-module-unused `mtre-591 ~[['/ui/good.jibb' ~[~.ui ~.good ~.jibb] mod-591-1] ['/ui/unused.jibb' ~[~.ui ~.unused ~.jibb] mod-591-2]]))
3585++ test-types-record-field-nested-mold
3647++ test-types-record-field-nested-mold
3586− (weld (check ~.types-record-field-nested-mold src-583 `tok-583 `tre-583) (check-types ~.types-record-field-nested-mold ~[%tests %golden ~.types-record-field-nested-mold %source %jibb] src-583 `typ-583))
3648+ (weld (check ~.types-record-field-nested-mold src-592 `tok-592 `tre-592) (check-types ~.types-record-field-nested-mold ~[%tests %golden ~.types-record-field-nested-mold %source %jibb] src-592 `typ-592))
3587++ test-types-record-field-outer-inner
3649++ test-types-record-field-outer-inner
3588− (weld (check ~.types-record-field-outer-inner src-584 `tok-584 `tre-584) (check-types ~.types-record-field-outer-inner ~[%tests %golden ~.types-record-field-outer-inner %source %jibb] src-584 `typ-584))
3650+ (weld (check ~.types-record-field-outer-inner src-593 `tok-593 `tre-593) (check-types ~.types-record-field-outer-inner ~[%tests %golden ~.types-record-field-outer-inner %source %jibb] src-593 `typ-593))
3589++ test-types-record-field-sample-duplicate
3651++ test-types-record-field-sample-duplicate
3590− (weld (check ~.types-record-field-sample-duplicate src-585 `tok-585 `tre-585) (check-types ~.types-record-field-sample-duplicate ~[%tests %golden ~.types-record-field-sample-duplicate %source %jibb] src-585 `typ-585))
3652+ (weld (check ~.types-record-field-sample-duplicate src-594 `tok-594 `tre-594) (check-types ~.types-record-field-sample-duplicate ~[%tests %golden ~.types-record-field-sample-duplicate %source %jibb] src-594 `typ-594))
3591++ test-types-record-field-separate-molds
3653++ test-types-record-field-separate-molds
3592− (weld (check ~.types-record-field-separate-molds src-586 `tok-586 `tre-586) (check-types ~.types-record-field-separate-molds ~[%tests %golden ~.types-record-field-separate-molds %source %jibb] src-586 `typ-586))
3654+ (weld (check ~.types-record-field-separate-molds src-595 `tok-595 `tre-595) (check-types ~.types-record-field-separate-molds ~[%tests %golden ~.types-record-field-separate-molds %source %jibb] src-595 `typ-595))
3593++ test-types-record-field-unused-mold
3655++ test-types-record-field-unused-mold
3594− (weld (check ~.types-record-field-unused-mold src-587 `tok-587 `tre-587) (check-types ~.types-record-field-unused-mold ~[%tests %golden ~.types-record-field-unused-mold %source %jibb] src-587 `typ-587))
3656+ (weld (check ~.types-record-field-unused-mold src-596 `tok-596 `tre-596) (check-types ~.types-record-field-unused-mold ~[%tests %golden ~.types-record-field-unused-mold %source %jibb] src-596 `typ-596))
3595++ test-types-record-import
3657++ test-types-record-import
3596− (weld (weld (check ~.types-record-import src-588 `tok-588 `tre-588) (check-module-types ~.types-record-import ~[%tests %golden ~.types-record-import %source %jibb] src-588 `typ-588 ~ ~ ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-588-1]])) (check-module-trees ~.types-record-import `mtre-588 ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-588-1]]))
3658+ (weld (weld (check ~.types-record-import src-597 `tok-597 `tre-597) (check-module-types ~.types-record-import ~[%tests %golden ~.types-record-import %source %jibb] src-597 `typ-597 ~ ~ ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-597-1]])) (check-module-trees ~.types-record-import `mtre-597 ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-597-1]]))
3597++ test-types-record-local-scheme
3659++ test-types-record-local-scheme
3598− (weld (check ~.types-record-local-scheme src-589 `tok-589 `tre-589) (check-types ~.types-record-local-scheme ~[%tests %golden ~.types-record-local-scheme %source %jibb] src-589 `typ-589))
3660+ (weld (check ~.types-record-local-scheme src-598 `tok-598 `tre-598) (check-types ~.types-record-local-scheme ~[%tests %golden ~.types-record-local-scheme %source %jibb] src-598 `typ-598))
3599++ test-types-record-nested
3661++ test-types-record-nested
3600− (weld (check ~.types-record-nested src-590 `tok-590 `tre-590) (check-types ~.types-record-nested ~[%tests %golden ~.types-record-nested %source %jibb] src-590 `typ-590))
3662+ (weld (check ~.types-record-nested src-599 `tok-599 `tre-599) (check-types ~.types-record-nested ~[%tests %golden ~.types-record-nested %source %jibb] src-599 `typ-599))
3601++ test-types-record-to-tuple
3663++ test-types-record-to-tuple
3602− (weld (check ~.types-record-to-tuple src-591 `tok-591 `tre-591) (check-types ~.types-record-to-tuple ~[%tests %golden ~.types-record-to-tuple %source %jibb] src-591 `typ-591))
3664+ (weld (check ~.types-record-to-tuple src-600 `tok-600 `tre-600) (check-types ~.types-record-to-tuple ~[%tests %golden ~.types-record-to-tuple %source %jibb] src-600 `typ-600))
3603++ test-types-recursion-scc-failures
3665++ test-types-recursion-scc-failures
3604− (weld (check ~.types-recursion-scc-failures src-592 `tok-592 `tre-592) (check-module-types ~.types-recursion-scc-failures ~[%tests %golden ~.types-recursion-scc-failures %source %jibb] src-592 `typ-592 ~ ~ ~))
3666+ (weld (check ~.types-recursion-scc-failures src-601 `tok-601 `tre-601) (check-module-types ~.types-recursion-scc-failures ~[%tests %golden ~.types-recursion-scc-failures %source %jibb] src-601 `typ-601 ~ ~ ~))
3605++ test-types-recursion-scc-groups
3667++ test-types-recursion-scc-groups
3606− (weld (check ~.types-recursion-scc-groups src-593 `tok-593 `tre-593) (check-module-types ~.types-recursion-scc-groups ~[%tests %golden ~.types-recursion-scc-groups %source %jibb] src-593 `typ-593 ~ ~ ~))
3668+ (weld (check ~.types-recursion-scc-groups src-602 `tok-602 `tre-602) (check-module-types ~.types-recursion-scc-groups ~[%tests %golden ~.types-recursion-scc-groups %source %jibb] src-602 `typ-602 ~ ~ ~))
3607++ test-types-recursion-scc-import
3669++ test-types-recursion-scc-import
3608− (weld (weld (check ~.types-recursion-scc-import src-594 `tok-594 `tre-594) (check-module-types ~.types-recursion-scc-import ~[%tests %golden ~.types-recursion-scc-import %source %jibb] src-594 `typ-594 ~ ~ ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-594-1]])) (check-module-trees ~.types-recursion-scc-import `mtre-594 ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-594-1]]))
3670+ (weld (weld (check ~.types-recursion-scc-import src-603 `tok-603 `tre-603) (check-module-types ~.types-recursion-scc-import ~[%tests %golden ~.types-recursion-scc-import %source %jibb] src-603 `typ-603 ~ ~ ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-603-1]])) (check-module-trees ~.types-recursion-scc-import `mtre-603 ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-603-1]]))
3609++ test-types-recursion-scc-import-bad
3671++ test-types-recursion-scc-import-bad
3610− (weld (weld (check ~.types-recursion-scc-import-bad src-595 `tok-595 `tre-595) (check-module-types ~.types-recursion-scc-import-bad ~[%tests %golden ~.types-recursion-scc-import-bad %source %jibb] src-595 `typ-595 ~ ~ ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-595-1]])) (check-module-trees ~.types-recursion-scc-import-bad `mtre-595 ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-595-1]]))
3672+ (weld (weld (check ~.types-recursion-scc-import-bad src-604 `tok-604 `tre-604) (check-module-types ~.types-recursion-scc-import-bad ~[%tests %golden ~.types-recursion-scc-import-bad %source %jibb] src-604 `typ-604 ~ ~ ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-604-1]])) (check-module-trees ~.types-recursion-scc-import-bad `mtre-604 ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-604-1]]))
3611++ test-types-recursion-scc-local
3673++ test-types-recursion-scc-local
3612− (weld (check ~.types-recursion-scc-local src-596 `tok-596 `tre-596) (check-module-types ~.types-recursion-scc-local ~[%tests %golden ~.types-recursion-scc-local %source %jibb] src-596 `typ-596 ~ ~ ~))
3674+ (weld (check ~.types-recursion-scc-local src-605 `tok-605 `tre-605) (check-module-types ~.types-recursion-scc-local ~[%tests %golden ~.types-recursion-scc-local %source %jibb] src-605 `typ-605 ~ ~ ~))
3613++ test-types-recursion-scc-order
3675++ test-types-recursion-scc-order
3614− (weld (check ~.types-recursion-scc-order src-597 `tok-597 `tre-597) (check-module-types ~.types-recursion-scc-order ~[%tests %golden ~.types-recursion-scc-order %source %jibb] src-597 `typ-597 ~ ~ ~))
3676+ (weld (check ~.types-recursion-scc-order src-606 `tok-606 `tre-606) (check-module-types ~.types-recursion-scc-order ~[%tests %golden ~.types-recursion-scc-order %source %jibb] src-606 `typ-606 ~ ~ ~))
3615++ test-types-recursion-scc-shadow
3677++ test-types-recursion-scc-shadow
3616− (weld (check ~.types-recursion-scc-shadow src-598 `tok-598 `tre-598) (check-module-types ~.types-recursion-scc-shadow ~[%tests %golden ~.types-recursion-scc-shadow %source %jibb] src-598 `typ-598 ~ ~ ~))
3678+ (weld (check ~.types-recursion-scc-shadow src-607 `tok-607 `tre-607) (check-module-types ~.types-recursion-scc-shadow ~[%tests %golden ~.types-recursion-scc-shadow %source %jibb] src-607 `typ-607 ~ ~ ~))
3617++ test-types-recursive-branch
3679++ test-types-recursive-branch
3618− (weld (check ~.types-recursive-branch src-599 `tok-599 `tre-599) (check-module-types ~.types-recursive-branch ~[%tests %golden ~.types-recursive-branch %source %jibb] src-599 `typ-599 ~ ~ ~))
3680+ (weld (check ~.types-recursive-branch src-608 `tok-608 `tre-608) (check-module-types ~.types-recursive-branch ~[%tests %golden ~.types-recursive-branch %source %jibb] src-608 `typ-608 ~ ~ ~))
3619++ test-types-recursive-gate
3681++ test-types-recursive-gate
3620− (weld (check ~.types-recursive-gate src-600 `tok-600 `tre-600) (check-types ~.types-recursive-gate ~[%tests %golden ~.types-recursive-gate %source %jibb] src-600 `typ-600))
3682+ (weld (check ~.types-recursive-gate src-609 `tok-609 `tre-609) (check-types ~.types-recursive-gate ~[%tests %golden ~.types-recursive-gate %source %jibb] src-609 `typ-609))
3621++ test-types-recursive-sample
3683++ test-types-recursive-sample
3622− (weld (check ~.types-recursive-sample src-601 `tok-601 `tre-601) (check-types ~.types-recursive-sample ~[%tests %golden ~.types-recursive-sample %source %jibb] src-601 `typ-601))
3684+ (weld (check ~.types-recursive-sample src-610 `tok-610 `tre-610) (check-types ~.types-recursive-sample ~[%tests %golden ~.types-recursive-sample %source %jibb] src-610 `typ-610))
3623++ test-types-request-normal
3685++ test-types-request-normal
3624− (weld (weld (check ~.types-request-normal src-602 `tok-602 `tre-602) (check-module-types ~.types-request-normal ~[%tests %golden ~.types-request-normal %source %jibb] src-602 `typ-602 ~ ~[[%full mark-602-1]] ~[['/ui/api/demo.jibb' ~[~.ui ~.api ~.demo ~.jibb] mod-602-1]])) (check-module-trees ~.types-request-normal `mtre-602 ~[['/ui/api/demo.jibb' ~[~.ui ~.api ~.demo ~.jibb] mod-602-1]]))
3686+ (weld (weld (check ~.types-request-normal src-611 `tok-611 `tre-611) (check-module-types ~.types-request-normal ~[%tests %golden ~.types-request-normal %source %jibb] src-611 `typ-611 ~ ~[[%full mark-611-1]] ~[['/ui/api/demo.jibb' ~[~.ui ~.api ~.demo ~.jibb] mod-611-1]])) (check-module-trees ~.types-request-normal `mtre-611 ~[['/ui/api/demo.jibb' ~[~.ui ~.api ~.demo ~.jibb] mod-611-1]]))
3625++ test-types-scope-library-poke
3687++ test-types-scope-library-poke
3626− (weld (check-at ~.types-scope-library-poke ~[~.ui ~.lib ~.library ~.jibb] src-603 `tok-603 `tre-603) (check-module-types ~.types-scope-library-poke ~[~.ui ~.lib ~.library ~.jibb] src-603 `typ-603 ~ ~ ~))
3688+ (weld (check-at ~.types-scope-library-poke ~[~.ui ~.lib ~.library ~.jibb] src-612 `tok-612 `tre-612) (check-module-types ~.types-scope-library-poke ~[~.ui ~.lib ~.library ~.jibb] src-612 `typ-612 ~ ~ ~))
3627++ test-types-scope-root-api
3689++ test-types-scope-root-api
3628− (weld (check-at ~.types-scope-root-api ~[~.ui ~.api ~.todo ~.jibb] src-604 `tok-604 `tre-604) (check-module-types ~.types-scope-root-api ~[~.ui ~.api ~.todo ~.jibb] src-604 `typ-604 ~ ~ ~))
3690+ (weld (check-at ~.types-scope-root-api ~[~.ui ~.api ~.todo ~.jibb] src-613 `tok-613 `tre-613) (check-module-types ~.types-scope-root-api ~[~.ui ~.api ~.todo ~.jibb] src-613 `typ-613 ~ ~ ~))
3629++ test-types-scope-store-duplicate
3691++ test-types-scope-store-duplicate
3630− (weld (check-at ~.types-scope-store-duplicate ~[~.ui ~.stores ~.cart ~.jibb] src-605 `tok-605 `tre-605) (check-module-types ~.types-scope-store-duplicate ~[~.ui ~.stores ~.cart ~.jibb] src-605 `typ-605 ~ ~ ~))
3692+ (weld (check-at ~.types-scope-store-duplicate ~[~.ui ~.stores ~.cart ~.jibb] src-614 `tok-614 `tre-614) (check-module-types ~.types-scope-store-duplicate ~[~.ui ~.stores ~.cart ~.jibb] src-614 `typ-614 ~ ~ ~))
3631++ test-types-scope-store-shadow
3693++ test-types-scope-store-shadow
3632− (weld (check-at ~.types-scope-store-shadow ~[~.ui ~.stores ~.cart ~.jibb] src-606 `tok-606 `tre-606) (check-module-types ~.types-scope-store-shadow ~[~.ui ~.stores ~.cart ~.jibb] src-606 `typ-606 ~ ~ ~))
3694+ (weld (check-at ~.types-scope-store-shadow ~[~.ui ~.stores ~.cart ~.jibb] src-615 `tok-615 `tre-615) (check-module-types ~.types-scope-store-shadow ~[~.ui ~.stores ~.cart ~.jibb] src-615 `typ-615 ~ ~ ~))
3633++ test-types-single-case-pattern
3695++ test-types-single-case-pattern
3634− (weld (check ~.types-single-case-pattern src-607 `tok-607 `tre-607) (check-module-types ~.types-single-case-pattern ~[%tests %golden ~.types-single-case-pattern %source %jibb] src-607 `typ-607 ~ ~ ~))
3696+ (weld (check ~.types-single-case-pattern src-616 `tok-616 `tre-616) (check-module-types ~.types-single-case-pattern ~[%tests %golden ~.types-single-case-pattern %source %jibb] src-616 `typ-616 ~ ~ ~))
3635++ test-types-string-interpolation
3697++ test-types-string-interpolation
3636− (weld (check ~.types-string-interpolation src-608 `tok-608 `tre-608) (check-module-types ~.types-string-interpolation ~[%tests %golden ~.types-string-interpolation %source %jibb] src-608 `typ-608 ~ ~ ~))
3698+ (weld (check ~.types-string-interpolation src-617 `tok-617 `tre-617) (check-module-types ~.types-string-interpolation ~[%tests %golden ~.types-string-interpolation %source %jibb] src-617 `typ-617 ~ ~ ~))
3637++ test-types-tuple-context
3699++ test-types-tuple-context
3638− (weld (check ~.types-tuple-context src-609 `tok-609 `tre-609) (check-module-types ~.types-tuple-context ~[%tests %golden ~.types-tuple-context %source %jibb] src-609 `typ-609 ~ ~ ~))
3700+ (weld (check ~.types-tuple-context src-618 `tok-618 `tre-618) (check-module-types ~.types-tuple-context ~[%tests %golden ~.types-tuple-context %source %jibb] src-618 `typ-618 ~ ~ ~))
3639++ test-types-tuple-context-nested
3701++ test-types-tuple-context-nested
3640− (weld (check ~.types-tuple-context-nested src-610 `tok-610 `tre-610) (check-module-types ~.types-tuple-context-nested ~[%tests %golden ~.types-tuple-context-nested %source %jibb] src-610 `typ-610 ~ ~ ~))
3702+ (weld (check ~.types-tuple-context-nested src-619 `tok-619 `tre-619) (check-module-types ~.types-tuple-context-nested ~[%tests %golden ~.types-tuple-context-nested %source %jibb] src-619 `typ-619 ~ ~ ~))
3641++ test-types-union-alias
3703++ test-types-union-alias
3642− (weld (check ~.types-union-alias src-611 `tok-611 `tre-611) (check-types ~.types-union-alias ~[%tests %golden ~.types-union-alias %source %jibb] src-611 `typ-611))
3704+ (weld (check ~.types-union-alias src-620 `tok-620 `tre-620) (check-types ~.types-union-alias ~[%tests %golden ~.types-union-alias %source %jibb] src-620 `typ-620))
3643++ test-types-union-branch-context
3705++ test-types-union-branch-context
3644− (weld (check ~.types-union-branch-context src-612 `tok-612 `tre-612) (check-types ~.types-union-branch-context ~[%tests %golden ~.types-union-branch-context %source %jibb] src-612 `typ-612))
3706+ (weld (check ~.types-union-branch-context src-621 `tok-621 `tre-621) (check-types ~.types-union-branch-context ~[%tests %golden ~.types-union-branch-context %source %jibb] src-621 `typ-621))
3645++ test-types-union-branch-pending
3707++ test-types-union-branch-pending
3646− (weld (check ~.types-union-branch-pending src-613 `tok-613 `tre-613) (check-types ~.types-union-branch-pending ~[%tests %golden ~.types-union-branch-pending %source %jibb] src-613 `typ-613))
3708+ (weld (check ~.types-union-branch-pending src-622 `tok-622 `tre-622) (check-types ~.types-union-branch-pending ~[%tests %golden ~.types-union-branch-pending %source %jibb] src-622 `typ-622))
3647++ test-types-union-constructor-shape
3709++ test-types-union-constructor-shape
3648− (weld (check ~.types-union-constructor-shape src-614 `tok-614 `tre-614) (check-types ~.types-union-constructor-shape ~[%tests %golden ~.types-union-constructor-shape %source %jibb] src-614 `typ-614))
3710+ (weld (check ~.types-union-constructor-shape src-623 `tok-623 `tre-623) (check-types ~.types-union-constructor-shape ~[%tests %golden ~.types-union-constructor-shape %source %jibb] src-623 `typ-623))
3649++ test-types-union-context-flow
3711++ test-types-union-context-flow
3650− (weld (check ~.types-union-context-flow src-615 `tok-615 `tre-615) (check-types ~.types-union-context-flow ~[%tests %golden ~.types-union-context-flow %source %jibb] src-615 `typ-615))
3712+ (weld (check ~.types-union-context-flow src-624 `tok-624 `tre-624) (check-types ~.types-union-context-flow ~[%tests %golden ~.types-union-context-flow %source %jibb] src-624 `typ-624))
3651++ test-types-union-finite
3713++ test-types-union-finite
3652− (weld (check ~.types-union-finite src-616 `tok-616 `tre-616) (check-module-types ~.types-union-finite ~[%tests %golden ~.types-union-finite %source %jibb] src-616 `typ-616 ~ ~ ~))
3714+ (weld (check ~.types-union-finite src-625 `tok-625 `tre-625) (check-module-types ~.types-union-finite ~[%tests %golden ~.types-union-finite %source %jibb] src-625 `typ-625 ~ ~ ~))
3653++ test-types-union-finite-context
3715++ test-types-union-finite-context
3654− (weld (check ~.types-union-finite-context src-617 `tok-617 `tre-617) (check-module-types ~.types-union-finite-context ~[%tests %golden ~.types-union-finite-context %source %jibb] src-617 `typ-617 ~ ~ ~))
3716+ (weld (check ~.types-union-finite-context src-626 `tok-626 `tre-626) (check-module-types ~.types-union-finite-context ~[%tests %golden ~.types-union-finite-context %source %jibb] src-626 `typ-626 ~ ~ ~))
3655++ test-types-union-finite-generic
3717++ test-types-union-finite-generic
3656− (weld (check ~.types-union-finite-generic src-618 `tok-618 `tre-618) (check-module-types ~.types-union-finite-generic ~[%tests %golden ~.types-union-finite-generic %source %jibb] src-618 `typ-618 ~ ~ ~))
3718+ (weld (check ~.types-union-finite-generic src-627 `tok-627 `tre-627) (check-module-types ~.types-union-finite-generic ~[%tests %golden ~.types-union-finite-generic %source %jibb] src-627 `typ-627 ~ ~ ~))
3657++ test-types-union-finite-limit
3719++ test-types-union-finite-limit
3658− (weld (check ~.types-union-finite-limit src-619 `tok-619 `tre-619) (check-module-types ~.types-union-finite-limit ~[%tests %golden ~.types-union-finite-limit %source %jibb] src-619 `typ-619 ~ ~ ~))
3720+ (weld (check ~.types-union-finite-limit src-628 `tok-628 `tre-628) (check-module-types ~.types-union-finite-limit ~[%tests %golden ~.types-union-finite-limit %source %jibb] src-628 `typ-628 ~ ~ ~))
3659++ test-types-union-import
3721++ test-types-union-import
3660− (weld (weld (check ~.types-union-import src-620 `tok-620 `tre-620) (check-module-types ~.types-union-import ~[%tests %golden ~.types-union-import %source %jibb] src-620 `typ-620 ~ ~ ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-620-1]])) (check-module-trees ~.types-union-import `mtre-620 ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-620-1]]))
3722+ (weld (weld (check ~.types-union-import src-629 `tok-629 `tre-629) (check-module-types ~.types-union-import ~[%tests %golden ~.types-union-import %source %jibb] src-629 `typ-629 ~ ~ ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-629-1]])) (check-module-trees ~.types-union-import `mtre-629 ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-629-1]]))
3661++ test-types-union-local-pending
3723++ test-types-union-local-pending
3662− (weld (check ~.types-union-local-pending src-621 `tok-621 `tre-621) (check-types ~.types-union-local-pending ~[%tests %golden ~.types-union-local-pending %source %jibb] src-621 `typ-621))
3724+ (weld (check ~.types-union-local-pending src-630 `tok-630 `tre-630) (check-types ~.types-union-local-pending ~[%tests %golden ~.types-union-local-pending %source %jibb] src-630 `typ-630))
3663++ test-types-union-nonwing-subject
3725++ test-types-union-nonwing-subject
3664− (weld (check ~.types-union-nonwing-subject src-622 `tok-622 `tre-622) (check-module-types ~.types-union-nonwing-subject ~[%tests %golden ~.types-union-nonwing-subject %source %jibb] src-622 `typ-622 ~ ~ ~))
3726+ (weld (check ~.types-union-nonwing-subject src-631 `tok-631 `tre-631) (check-module-types ~.types-union-nonwing-subject ~[%tests %golden ~.types-union-nonwing-subject %source %jibb] src-631 `typ-631 ~ ~ ~))
3665++ test-types-union-overlap
3727++ test-types-union-overlap
3666− (weld (check ~.types-union-overlap src-623 `tok-623 `tre-623) (check-types ~.types-union-overlap ~[%tests %golden ~.types-union-overlap %source %jibb] src-623 `typ-623))
3728+ (weld (check ~.types-union-overlap src-632 `tok-632 `tre-632) (check-types ~.types-union-overlap ~[%tests %golden ~.types-union-overlap %source %jibb] src-632 `typ-632))
3667++ test-types-union-overlap-nested
3729++ test-types-union-overlap-nested
3668− (weld (check ~.types-union-overlap-nested src-624 `tok-624 `tre-624) (check-types ~.types-union-overlap-nested ~[%tests %golden ~.types-union-overlap-nested %source %jibb] src-624 `typ-624))
3730+ (weld (check ~.types-union-overlap-nested src-633 `tok-633 `tre-633) (check-types ~.types-union-overlap-nested ~[%tests %golden ~.types-union-overlap-nested %source %jibb] src-633 `typ-633))
3669++ test-types-union-pattern-result-context
3731++ test-types-union-pattern-result-context
3670− (weld (check ~.types-union-pattern-result-context src-625 `tok-625 `tre-625) (check-module-types ~.types-union-pattern-result-context ~[%tests %golden ~.types-union-pattern-result-context %source %jibb] src-625 `typ-625 ~ ~ ~))
3732+ (weld (check ~.types-union-pattern-result-context src-634 `tok-634 `tre-634) (check-module-types ~.types-union-pattern-result-context ~[%tests %golden ~.types-union-pattern-result-context %source %jibb] src-634 `typ-634 ~ ~ ~))
3671++ test-types-union-pattern-result-controls
3733++ test-types-union-pattern-result-controls
3672− (weld (check ~.types-union-pattern-result-controls src-626 `tok-626 `tre-626) (check-module-types ~.types-union-pattern-result-controls ~[%tests %golden ~.types-union-pattern-result-controls %source %jibb] src-626 `typ-626 ~ ~ ~))
3734+ (weld (check ~.types-union-pattern-result-controls src-635 `tok-635 `tre-635) (check-module-types ~.types-union-pattern-result-controls ~[%tests %golden ~.types-union-pattern-result-controls %source %jibb] src-635 `typ-635 ~ ~ ~))
3673++ test-types-union-patterns
3735++ test-types-union-patterns
3674− (weld (check ~.types-union-patterns src-627 `tok-627 `tre-627) (check-module-types ~.types-union-patterns ~[%tests %golden ~.types-union-patterns %source %jibb] src-627 `typ-627 ~ ~ ~))
3736+ (weld (check ~.types-union-patterns src-636 `tok-636 `tre-636) (check-module-types ~.types-union-patterns ~[%tests %golden ~.types-union-patterns %source %jibb] src-636 `typ-636 ~ ~ ~))
3675++ test-types-union-patterns-generic
3737++ test-types-union-patterns-generic
3676− (weld (check ~.types-union-patterns-generic src-628 `tok-628 `tre-628) (check-module-types ~.types-union-patterns-generic ~[%tests %golden ~.types-union-patterns-generic %source %jibb] src-628 `typ-628 ~ ~ ~))
3738+ (weld (check ~.types-union-patterns-generic src-637 `tok-637 `tre-637) (check-module-types ~.types-union-patterns-generic ~[%tests %golden ~.types-union-patterns-generic %source %jibb] src-637 `typ-637 ~ ~ ~))
3677++ test-types-union-patterns-import
3739++ test-types-union-patterns-import
3678− (weld (weld (check ~.types-union-patterns-import src-629 `tok-629 `tre-629) (check-module-types ~.types-union-patterns-import ~[%tests %golden ~.types-union-patterns-import %source %jibb] src-629 `typ-629 ~ ~ ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-629-1]])) (check-module-trees ~.types-union-patterns-import `mtre-629 ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-629-1]]))
3740+ (weld (weld (check ~.types-union-patterns-import src-638 `tok-638 `tre-638) (check-module-types ~.types-union-patterns-import ~[%tests %golden ~.types-union-patterns-import %source %jibb] src-638 `typ-638 ~ ~ ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-638-1]])) (check-module-trees ~.types-union-patterns-import `mtre-638 ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-638-1]]))
3679++ test-types-union-phantom-generic
3741++ test-types-union-phantom-generic
3680− (weld (check ~.types-union-phantom-generic src-630 `tok-630 `tre-630) (check-types ~.types-union-phantom-generic ~[%tests %golden ~.types-union-phantom-generic %source %jibb] src-630 `typ-630))
3742+ (weld (check ~.types-union-phantom-generic src-639 `tok-639 `tre-639) (check-types ~.types-union-phantom-generic ~[%tests %golden ~.types-union-phantom-generic %source %jibb] src-639 `typ-639))
3681++ test-types-union-polymorphic-identity
3743++ test-types-union-polymorphic-identity
3682− (weld (weld (check ~.types-union-polymorphic-identity src-631 `tok-631 `tre-631) (check-module-types ~.types-union-polymorphic-identity ~[%tests %golden ~.types-union-polymorphic-identity %source %jibb] src-631 `typ-631 ~ ~ ~[['/ui/one.jibb' ~[~.ui ~.one ~.jibb] mod-631-1] ['/ui/two.jibb' ~[~.ui ~.two ~.jibb] mod-631-2]])) (check-module-trees ~.types-union-polymorphic-identity `mtre-631 ~[['/ui/one.jibb' ~[~.ui ~.one ~.jibb] mod-631-1] ['/ui/two.jibb' ~[~.ui ~.two ~.jibb] mod-631-2]]))
3744+ (weld (weld (check ~.types-union-polymorphic-identity src-640 `tok-640 `tre-640) (check-module-types ~.types-union-polymorphic-identity ~[%tests %golden ~.types-union-polymorphic-identity %source %jibb] src-640 `typ-640 ~ ~ ~[['/ui/one.jibb' ~[~.ui ~.one ~.jibb] mod-640-1] ['/ui/two.jibb' ~[~.ui ~.two ~.jibb] mod-640-2]])) (check-module-trees ~.types-union-polymorphic-identity `mtre-640 ~[['/ui/one.jibb' ~[~.ui ~.one ~.jibb] mod-640-1] ['/ui/two.jibb' ~[~.ui ~.two ~.jibb] mod-640-2]]))
3683++ test-types-union-print-cross-namespace
3745++ test-types-union-print-cross-namespace
3684− (weld (weld (check ~.types-union-print-cross-namespace src-632 `tok-632 `tre-632) (check-module-types ~.types-union-print-cross-namespace ~[%tests %golden ~.types-union-print-cross-namespace %source %jibb] src-632 `typ-632 ~ ~ ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-632-1]])) (check-module-trees ~.types-union-print-cross-namespace `mtre-632 ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-632-1]]))
3746+ (weld (weld (check ~.types-union-print-cross-namespace src-641 `tok-641 `tre-641) (check-module-types ~.types-union-print-cross-namespace ~[%tests %golden ~.types-union-print-cross-namespace %source %jibb] src-641 `typ-641 ~ ~ ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-641-1]])) (check-module-trees ~.types-union-print-cross-namespace `mtre-641 ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-641-1]]))
3685++ test-types-union-print-distinct
3747++ test-types-union-print-distinct
3686− (weld (weld (check ~.types-union-print-distinct src-633 `tok-633 `tre-633) (check-module-types ~.types-union-print-distinct ~[%tests %golden ~.types-union-print-distinct %source %jibb] src-633 `typ-633 ~ ~ ~[['/ui/left.jibb' ~[~.ui ~.left ~.jibb] mod-633-1] ['/ui/right.jibb' ~[~.ui ~.right ~.jibb] mod-633-2] ['/ui/twin.jibb' ~[~.ui ~.twin ~.jibb] mod-633-3]])) (check-module-trees ~.types-union-print-distinct `mtre-633 ~[['/ui/left.jibb' ~[~.ui ~.left ~.jibb] mod-633-1] ['/ui/right.jibb' ~[~.ui ~.right ~.jibb] mod-633-2] ['/ui/twin.jibb' ~[~.ui ~.twin ~.jibb] mod-633-3]]))
3748+ (weld (weld (check ~.types-union-print-distinct src-642 `tok-642 `tre-642) (check-module-types ~.types-union-print-distinct ~[%tests %golden ~.types-union-print-distinct %source %jibb] src-642 `typ-642 ~ ~ ~[['/ui/left.jibb' ~[~.ui ~.left ~.jibb] mod-642-1] ['/ui/right.jibb' ~[~.ui ~.right ~.jibb] mod-642-2] ['/ui/twin.jibb' ~[~.ui ~.twin ~.jibb] mod-642-3]])) (check-module-trees ~.types-union-print-distinct `mtre-642 ~[['/ui/left.jibb' ~[~.ui ~.left ~.jibb] mod-642-1] ['/ui/right.jibb' ~[~.ui ~.right ~.jibb] mod-642-2] ['/ui/twin.jibb' ~[~.ui ~.twin ~.jibb] mod-642-3]]))
3687++ test-types-union-print-escape
3749++ test-types-union-print-escape
3688− (weld (check ~.types-union-print-escape src-634 `tok-634 `tre-634) (check-types ~.types-union-print-escape ~[%tests %golden ~.types-union-print-escape %source %jibb] src-634 `typ-634))
3750+ (weld (check ~.types-union-print-escape src-643 `tok-643 `tre-643) (check-types ~.types-union-print-escape ~[%tests %golden ~.types-union-print-escape %source %jibb] src-643 `typ-643))
3689++ test-types-union-print-local
3751++ test-types-union-print-local
3690− (weld (check ~.types-union-print-local src-635 `tok-635 `tre-635) (check-types ~.types-union-print-local ~[%tests %golden ~.types-union-print-local %source %jibb] src-635 `typ-635))
3752+ (weld (check ~.types-union-print-local src-644 `tok-644 `tre-644) (check-types ~.types-union-print-local ~[%tests %golden ~.types-union-print-local %source %jibb] src-644 `typ-644))
3691++ test-types-union-print-nested
3753++ test-types-union-print-nested
3692− (weld (check ~.types-union-print-nested src-636 `tok-636 `tre-636) (check-types ~.types-union-print-nested ~[%tests %golden ~.types-union-print-nested %source %jibb] src-636 `typ-636))
3754+ (weld (check ~.types-union-print-nested src-645 `tok-645 `tre-645) (check-types ~.types-union-print-nested ~[%tests %golden ~.types-union-print-nested %source %jibb] src-645 `typ-645))
3693++ test-types-union-print-same-origin
3755++ test-types-union-print-same-origin
3694− (weld (weld (check ~.types-union-print-same-origin src-637 `tok-637 `tre-637) (check-module-types ~.types-union-print-same-origin ~[%tests %golden ~.types-union-print-same-origin %source %jibb] src-637 `typ-637 ~ ~ ~[['/ui/shared.jibb' ~[~.ui ~.shared ~.jibb] mod-637-1]])) (check-module-trees ~.types-union-print-same-origin `mtre-637 ~[['/ui/shared.jibb' ~[~.ui ~.shared ~.jibb] mod-637-1]]))
3756+ (weld (weld (check ~.types-union-print-same-origin src-646 `tok-646 `tre-646) (check-module-types ~.types-union-print-same-origin ~[%tests %golden ~.types-union-print-same-origin %source %jibb] src-646 `typ-646 ~ ~ ~[['/ui/shared.jibb' ~[~.ui ~.shared ~.jibb] mod-646-1]])) (check-module-trees ~.types-union-print-same-origin `mtre-646 ~[['/ui/shared.jibb' ~[~.ui ~.shared ~.jibb] mod-646-1]]))
3695++ test-types-union-print-transitive
3757++ test-types-union-print-transitive
3696− (weld (weld (check ~.types-union-print-transitive src-638 `tok-638 `tre-638) (check-module-types ~.types-union-print-transitive ~[%tests %golden ~.types-union-print-transitive %source %jibb] src-638 `typ-638 ~ ~ ~[['/ui/mid.jibb' ~[~.ui ~.mid ~.jibb] mod-638-1] ['/ui/base.jibb' ~[~.ui ~.base ~.jibb] mod-638-2]])) (check-module-trees ~.types-union-print-transitive `mtre-638 ~[['/ui/mid.jibb' ~[~.ui ~.mid ~.jibb] mod-638-1] ['/ui/base.jibb' ~[~.ui ~.base ~.jibb] mod-638-2]]))
3758+ (weld (weld (check ~.types-union-print-transitive src-647 `tok-647 `tre-647) (check-module-types ~.types-union-print-transitive ~[%tests %golden ~.types-union-print-transitive %source %jibb] src-647 `typ-647 ~ ~ ~[['/ui/mid.jibb' ~[~.ui ~.mid ~.jibb] mod-647-1] ['/ui/base.jibb' ~[~.ui ~.base ~.jibb] mod-647-2]])) (check-module-trees ~.types-union-print-transitive `mtre-647 ~[['/ui/mid.jibb' ~[~.ui ~.mid ~.jibb] mod-647-1] ['/ui/base.jibb' ~[~.ui ~.base ~.jibb] mod-647-2]]))
3759+++ test-types-union-runtime-equality
3760+ (weld (check ~.types-union-runtime-equality src-648 `tok-648 `tre-648) (check-types ~.types-union-runtime-equality ~[%tests %golden ~.types-union-runtime-equality %source %jibb] src-648 `typ-648))
3697++ test-types-union-singleton
3761++ test-types-union-singleton
3698− (weld (check ~.types-union-singleton src-639 `tok-639 `tre-639) (check-types ~.types-union-singleton ~[%tests %golden ~.types-union-singleton %source %jibb] src-639 `typ-639))
3762+ (weld (check ~.types-union-singleton src-649 `tok-649 `tre-649) (check-types ~.types-union-singleton ~[%tests %golden ~.types-union-singleton %source %jibb] src-649 `typ-649))
3763+++ test-types-union-source-alias
3764+ (weld (check ~.types-union-source-alias src-650 `tok-650 `tre-650) (check-types ~.types-union-source-alias ~[%tests %golden ~.types-union-source-alias %source %jibb] src-650 `typ-650))
3699++ test-types-union-tag-atoms
3765++ test-types-union-tag-atoms
3700− (weld (check ~.types-union-tag-atoms src-640 `tok-640 `tre-640) (check-types ~.types-union-tag-atoms ~[%tests %golden ~.types-union-tag-atoms %source %jibb] src-640 `typ-640))
3766+ (weld (check ~.types-union-tag-atoms src-651 `tok-651 `tre-651) (check-types ~.types-union-tag-atoms ~[%tests %golden ~.types-union-tag-atoms %source %jibb] src-651 `typ-651))
3701++ test-types-union-tags
3767++ test-types-union-tags
3702− (weld (check ~.types-union-tags src-641 `tok-641 `tre-641) (check-types ~.types-union-tags ~[%tests %golden ~.types-union-tags %source %jibb] src-641 `typ-641))
3768+ (weld (check ~.types-union-tags src-652 `tok-652 `tre-652) (check-types ~.types-union-tags ~[%tests %golden ~.types-union-tags %source %jibb] src-652 `typ-652))
3703++ test-types-union-unresolved
3769++ test-types-union-unresolved
3704− (weld (check ~.types-union-unresolved src-642 `tok-642 `tre-642) (check-types ~.types-union-unresolved ~[%tests %golden ~.types-union-unresolved %source %jibb] src-642 `typ-642))
3770+ (weld (check ~.types-union-unresolved src-653 `tok-653 `tre-653) (check-types ~.types-union-unresolved ~[%tests %golden ~.types-union-unresolved %source %jibb] src-653 `typ-653))
3705++ test-types-union-unresolved-flow
3771++ test-types-union-unresolved-flow
3706− (weld (check ~.types-union-unresolved-flow src-643 `tok-643 `tre-643) (check-types ~.types-union-unresolved-flow ~[%tests %golden ~.types-union-unresolved-flow %source %jibb] src-643 `typ-643))
3772+ (weld (check ~.types-union-unresolved-flow src-654 `tok-654 `tre-654) (check-types ~.types-union-unresolved-flow ~[%tests %golden ~.types-union-unresolved-flow %source %jibb] src-654 `typ-654))
3707++ test-types-unit-construction
3773++ test-types-unit-construction
3708− (weld (check ~.types-unit-construction src-644 `tok-644 `tre-644) (check-module-types ~.types-unit-construction ~[%tests %golden ~.types-unit-construction %source %jibb] src-644 `typ-644 ~ ~ ~))
3774+ (weld (check ~.types-unit-construction src-655 `tok-655 `tre-655) (check-module-types ~.types-unit-construction ~[%tests %golden ~.types-unit-construction %source %jibb] src-655 `typ-655 ~ ~ ~))
3709++ test-types-unit-context
3775++ test-types-unit-context
3710− (weld (check ~.types-unit-context src-645 `tok-645 `tre-645) (check-module-types ~.types-unit-context ~[%tests %golden ~.types-unit-context %source %jibb] src-645 `typ-645 ~ ~ ~))
3776+ (weld (check ~.types-unit-context src-656 `tok-656 `tre-656) (check-module-types ~.types-unit-context ~[%tests %golden ~.types-unit-context %source %jibb] src-656 `typ-656 ~ ~ ~))
3711++ test-types-unit-patterns
3777++ test-types-unit-patterns
3712− (weld (check ~.types-unit-patterns src-646 `tok-646 `tre-646) (check-types ~.types-unit-patterns ~[%tests %golden ~.types-unit-patterns %source %jibb] src-646 `typ-646))
3778+ (weld (check ~.types-unit-patterns src-657 `tok-657 `tre-657) (check-types ~.types-unit-patterns ~[%tests %golden ~.types-unit-patterns %source %jibb] src-657 `typ-657))
3713++ test-types-value-cycle-shadow
3779++ test-types-value-cycle-shadow
3714− (weld (check ~.types-value-cycle-shadow src-647 `tok-647 `tre-647) (check-module-types ~.types-value-cycle-shadow ~[%tests %golden ~.types-value-cycle-shadow %source %jibb] src-647 `typ-647 ~ ~ ~))
3780+ (weld (check ~.types-value-cycle-shadow src-658 `tok-658 `tre-658) (check-module-types ~.types-value-cycle-shadow ~[%tests %golden ~.types-value-cycle-shadow %source %jibb] src-658 `typ-658 ~ ~ ~))
3715++ test-types-value-cycle-unsupported
3781++ test-types-value-cycle-unsupported
3716− (weld (check ~.types-value-cycle-unsupported src-648 `tok-648 `tre-648) (check-module-types ~.types-value-cycle-unsupported ~[%tests %golden ~.types-value-cycle-unsupported %source %jibb] src-648 `typ-648 ~ ~ ~))
3782+ (weld (check ~.types-value-cycle-unsupported src-659 `tok-659 `tre-659) (check-module-types ~.types-value-cycle-unsupported ~[%tests %golden ~.types-value-cycle-unsupported %source %jibb] src-659 `typ-659 ~ ~ ~))
3717++ test-types-value-cycles
3783++ test-types-value-cycles
3718− (weld (check ~.types-value-cycles src-649 `tok-649 `tre-649) (check-module-types ~.types-value-cycles ~[%tests %golden ~.types-value-cycles %source %jibb] src-649 `typ-649 ~ ~ ~))
3784+ (weld (check ~.types-value-cycles src-660 `tok-660 `tre-660) (check-module-types ~.types-value-cycles ~[%tests %golden ~.types-value-cycles %source %jibb] src-660 `typ-660 ~ ~ ~))
3719::
3785::
3720:: +check: run golden:jibb on a case and compare both outputs
3786:: +check: run golden:jibb on a case and compare both outputs
3721::
3787::
tests/type-cell-branch/about.txtnew file+2
@@ -0,0 +1,2 @@
1+source: Grammar, Branching and Molds — result context constrains each branch while written faces and pending tags are preserved.
2+tests: A closed cell result context, failed retry rollback, structural-substitution uncertainty, and exact source/substitution retry screen limits. The shared test arm runs under eval and on the ship.
tests/type-cell-branch/bad.txtnew file+3
@@ -0,0 +1,3 @@
1+++ probe ?- flag
2+ %.y ["yes" ~]
3+ %.n [~zod ~]
tests/type-cell-branch/good.txtnew file+3
@@ -0,0 +1,3 @@
1+++ probe ?- flag
2+ %.y ["yes" ~]
3+ %.n ["no" ~]
tests/type-deferred-context/about.txtnew file+3
@@ -0,0 +1,3 @@
1+source: docs/spec/grammar.md, Tag resolution: “A variable constrained by tag resolution, and any it mentions, doesn't generalize; it stays open until something in the module fixes it.”
2+
3+Tests bounded deferred source-order retries and source-owned literal branch obligations in import-free libraries. Each negative source must parse before it is rejected. This does not establish island kind, watchability or standard-prelude list semantics.
tests/type-deferred-context/collision-early.txtnew file+27
@@ -0,0 +1,27 @@
1+++ incompatible ^- $-(? other) choose
2++$ message
3+ [%got value=@t]
4+ [%other value=@p]
5++$ maybe
6+ %none
7+ [%some value=@t]
8++$ other
9+ %none
10+ [%ship value=@p]
11+++ final ^- $-(? maybe) choose
12+++ final-ship ^- $-(? other) choose-ship
13+++ choose |= flag=?
14+ ?- flag
15+ %.y %none
16+ %.n %none
17+++ choose-ship |= flag=?
18+ ?- flag
19+ %.y %none
20+ %.n %none
21+++ send |= f=$-(@t A) f
22+++ first (send |=%got)
23+++ fixed ^- $-(@t message) first
24+++ make |= ignored=A |= x=B x
25+++ built (make choose)
26+++ reveal (built "hello")
27+++ reveal-ship (built ~zod)
tests/type-deferred-context/collision-late.txtnew file+28
@@ -0,0 +1,28 @@
1++$ message
2+ [%got value=@t]
3+ [%other value=@p]
4++$ maybe
5+ %none
6+ [%some value=@t]
7++$ other
8+ %none
9+ [%ship value=@p]
10+++ final ^- $-(? maybe) choose
11+++ final-ship ^- $-(? other) choose-ship
12+++ choose |= flag=?
13+ ?- flag
14+ %.y %none
15+ %.n %none
16+++ choose-ship |= flag=?
17+ ?- flag
18+ %.y %none
19+ %.n %none
20+++ send |= f=$-(@t A) f
21+++ first (send |=%got)
22+++ fixed ^- $-(@t message) first
23+++ make |= ignored=A |= x=B x
24+++ built (make choose)
25+++ reveal (built "hello")
26+++ reveal-ship (built ~zod)
27+
28+++ incompatible ^- $-(? other) choose
tests/type-deferred-context/dangling.txtnew file+16
@@ -0,0 +1,16 @@
1++$ message
2+ [%got value=@t]
3+ [%other value=@p]
4++$ maybe
5+ %none
6+ [%some value=@t]
7+++ final ^- $-(? maybe) choose
8+++ choose |= flag=?
9+ ?- flag
10+ %.y %none
11+ %.n %none
12+++ send |= f=$-(@t A) f
13+++ first (send |=%got)
14+++ fixed ^- $-(@t message) first
15+
16+++ unrelated |= x=@t %dangling
tests/type-deferred-context/duplicate.txtnew file+14
@@ -0,0 +1,14 @@
1++$ message
2+ [%got value=@t]
3+ [%other value=@p]
4++$ maybe
5+ %none
6+ [%some value=@t]
7+++ final ^- $-(? maybe) choose
8+++ choose |= flag=?
9+ ?- flag
10+ %.y %none
11+ %.y %none
12+++ send |= f=$-(@t A) f
13+++ first (send |=%got)
14+++ fixed ^- $-(@t message) first
tests/type-deferred-context/missing.txtnew file+14
@@ -0,0 +1,14 @@
1++$ message
2+ [%got value=@t]
3+ [%other value=@p]
4++$ maybe
5+ %none
6+ [%some value=@t]
7+++ final ^- $-(? maybe) choose
8+++ choose |= flag=?
9+ ?- flag
10+ %.y %none
11+ %.n %absent
12+++ send |= f=$-(@t A) f
13+++ first (send |=%got)
14+++ fixed ^- $-(@t message) first
tests/type-deferred-context/plain.txtnew file+11
@@ -0,0 +1,11 @@
1+++ final ^- $-(@t message) second
2++$ message
3+ [%got value=@t]
4+ [%other value=@p]
5+++ send |= f=$-(@t A) f
6+++ make |= ignored=A |= x=B x
7+++ first (send |=%got)
8+++ second first
9+++ built (make first)
10+++ reveal (built "hello")
11+++ reveal-ship (built ~zod)
tests/type-deferred-context/report.txtnew file+15
@@ -0,0 +1,15 @@
1+partial inference; module not checked
2++$ message: cases proven disjoint; mold not checked
3++$ maybe: cases proven disjoint; mold not checked
4++$ other: cases proven disjoint; mold not checked
5+++ final: $-(? maybe)
6+++ final-ship: $-(? other)
7+++ choose: $-(? maybe)
8+++ choose-ship: $-(? other)
9+++ send: $-($-(@t A) $-(@t A))
10+++ first: $-(@t message)
11+++ fixed: $-(@t message)
12+++ make: $-(A $-(B B))
13+++ built: $-(A A)
14+++ reveal: @t
15+++ reveal-ship: @p
tests/type-deferred-context/rich.txtnew file+27
@@ -0,0 +1,27 @@
1++$ message
2+ [%got value=@t]
3+ [%other value=@p]
4++$ maybe
5+ %none
6+ %stop
7+ [%some value=@t]
8++$ other
9+ %none
10+ [%ship value=@p]
11+++ final ^- $-(? maybe) choose
12+++ final-ship ^- $-(? other) choose-ship
13+++ choose |= flag=?
14+ ?- flag
15+ %.y %none
16+ %.n %stop
17+++ choose-ship |= flag=?
18+ ?- flag
19+ %.y %none
20+ %.n %none
21+++ send |= f=$-(@t A) f
22+++ first (send |=%got)
23+++ fixed ^- $-(@t message) first
24+++ make |= ignored=A |= x=B x
25+++ built (make choose)
26+++ reveal (built "hello")
27+++ reveal-ship (built ~zod)
tests/type-deferred-context/simple.txtnew file+10
@@ -0,0 +1,10 @@
1++$ message
2+ [%got value=@t]
3+ [%other value=@p]
4+++ final ^- $-(@t message) (pick %.y)
5+++ pick |= flag=?
6+ ?- flag
7+ %.y first
8+ %.n first
9+++ send |= f=$-(@t A) f
10+++ first (send |=%got)
tests/type-deferred-context/wrong.txtnew file+14
@@ -0,0 +1,14 @@
1++$ message
2+ [%got value=@t]
3+ [%other value=@p]
4++$ maybe
5+ %none
6+ [%some value=@t]
7+++ final ^- $-(? @t) choose
8+++ choose |= flag=?
9+ ?- flag
10+ %.y %none
11+ %.n %none
12+++ send |= f=$-(@t A) f
13+++ first (send |=%got)
14+++ fixed ^- $-(@t message) first
tests/type-deferred-prepared/expected-control.txtnew file+7
@@ -0,0 +1,7 @@
1+partial inference; module not checked
2++$ model: not checked
3++$ message: cases proven disjoint; mold not checked
4+++ initial: `~` needs context in partial inference
5+++ send: $-($-(@t A) $-(@t A))
6+++ first: call constraint is not supported by partial inference
7+++ fixed: name is not available to partial inference
tests/type-deferred-prepared/expected-tuple-only.txtnew file+4
@@ -0,0 +1,4 @@
1+partial inference; module not checked
2++$ model: not checked
3+++ final: $-((list @t) [(list @t) [@t (unit @t)]])
4+++ initial: $-((list @t) [(list @t) [@t (unit @t)]])
tests/type-deferred-prepared/expected.txtnew file+8
@@ -0,0 +1,8 @@
1+partial inference; module not checked
2++$ model: not checked
3++$ message: cases proven disjoint; mold not checked
4+++ final: $-((list @t) [(list @t) [@t (unit @t)]])
5+++ initial: $-((list @t) [(list @t) [@t (unit @t)]])
6+++ send: $-($-(@t A) $-(@t A))
7+++ first: $-(@t message)
8+++ fixed: $-(@t message)
tests/type-deferred-prepared/good.txtnew file+9
@@ -0,0 +1,9 @@
1++$ model [xs=(list @t) draft=@t error=(unit @t)]
2++$ message
3+ [%got value=@t]
4+ [%other value=@p]
5+++ final ^- $-((list @t) [(list @t) @t (unit @t)]) initial
6+++ initial |= xs=(list @t) [xs "" ~]
7+++ send |= f=$-(@t A) f
8+++ first (send |=%got)
9+++ fixed ^- $-(@t message) first
tests/type-deferred-prepared/imported.txtnew file+11
@@ -0,0 +1,11 @@
1+/= other /ui/other
2+
3++$ model [xs=(list @t) draft=@t error=(unit @t)]
4++$ message
5+ [%got value=@t]
6+ [%other value=@p]
7+++ final ^- $-((list @t) [(list @t) @t (unit @t)]) initial
8+++ initial |= xs=(list @t) [xs "" ~]
9+++ send |= f=$-(@t A) f
10+++ first (send |=%got)
11+++ fixed ^- $-(@t message) first
tests/type-deferred-prepared/main.txtnew file+10
@@ -0,0 +1,10 @@
1++$ model [xs=(list @t) draft=@t error=(unit @t)]
2++$ message
3+ [%got value=@t]
4+ [%other value=@p]
5+++ final ^- $-((list @t) [(list @t) @t (unit @t)]) initial
6+++ initial |= xs=(list @t) [xs "" ~]
7+++ send |= f=$-(@t A) f
8+++ first (send |=%got)
9+++ fixed ^- $-(@t message) first
10+++ main initial
tests/type-deferred-prepared/mold-collision.txtnew file+9
@@ -0,0 +1,9 @@
1++$ list [xs=(list @t) draft=@t error=(unit @t)]
2++$ message
3+ [%got value=@t]
4+ [%other value=@p]
5+++ final ^- $-((list @t) [(list @t) @t (unit @t)]) initial
6+++ initial |= xs=(list @t) [xs "" ~]
7+++ send |= f=$-(@t A) f
8+++ first (send |=%got)
9+++ fixed ^- $-(@t message) first
tests/type-deferred-prepared/no-final-cast.txtnew file+8
@@ -0,0 +1,8 @@
1++$ model [xs=(list @t) draft=@t error=(unit @t)]
2++$ message
3+ [%got value=@t]
4+ [%other value=@p]
5+++ initial |= xs=(list @t) [xs "" ~]
6+++ send |= f=$-(@t A) f
7+++ first (send |=%got)
8+++ fixed ^- $-(@t message) first
tests/type-deferred-prepared/no-prelude.txtnew file+9
@@ -0,0 +1,9 @@
1++$ maybe
2+ %none
3+ [%some value=@t]
4++$ model [draft=@t error=maybe]
5+++ final ^- $-(@t [@t maybe]) initial
6+++ initial |= draft=@t [draft %none]
7+++ send |= f=$-(@t A) f
8+++ first (send |=%some)
9+++ fixed ^- $-(@t maybe) first
tests/type-deferred-prepared/tuple-only.txtnew file+3
@@ -0,0 +1,3 @@
1++$ model [xs=(list @t) draft=@t error=(unit @t)]
2+++ final ^- $-((list @t) [(list @t) @t (unit @t)]) initial
3+++ initial |= xs=(list @t) [xs "" ~]
tests/type-deferred-prepared/unrelated-tag.txtnew file+11
@@ -0,0 +1,11 @@
1++$ model [xs=(list @t) draft=@t error=(unit @t)]
2++$ message
3+ [%got value=@t]
4+ [%other value=@p]
5+++ final ^- $-((list @t) [(list @t) @t (unit @t)]) initial
6+++ initial |= xs=(list @t) [xs "" ~]
7+++ send |= f=$-(@t A) f
8+++ first (send |=%got)
9+++ fixed ^- $-(@t message) first
10+
11+++ unresolved |= x=@t %dangling
tests/type-deferred-prepared/wrong-draft.txtnew file+9
@@ -0,0 +1,9 @@
1++$ model [xs=(list @t) draft=@t error=(unit @t)]
2++$ message
3+ [%got value=@t]
4+ [%other value=@p]
5+++ final ^- $-((list @t) [(list @t) @t (unit @t)]) initial
6+++ initial |= xs=(list @t) [xs ~zod ~]
7+++ send |= f=$-(@t A) f
8+++ first (send |=%got)
9+++ fixed ^- $-(@t message) first
tests/type-deferred-prepared/wrong-unit.txtnew file+9
@@ -0,0 +1,9 @@
1++$ model [xs=(list @t) draft=@t error=(unit @t)]
2++$ message
3+ [%got value=@t]
4+ [%other value=@p]
5+++ final ^- $-((list @t) [(list @t) @t (unit @t)]) initial
6+++ initial |= xs=(list @t) [xs "" %absent]
7+++ send |= f=$-(@t A) f
8+++ first (send |=%got)
9+++ fixed ^- $-(@t message) first
tests/type-deferred-resolver/about.txtnew file+5
@@ -0,0 +1,5 @@
1+source: docs/spec/grammar.md, Tag resolution: “A variable constrained by tag resolution, and any it mentions, doesn't generalize; it stays open until something in the module fixes it.”
2+
3+Import-free, no-prelude ordinary library resolution: principal generalized result and matching report, with conflicting constructors, holes, duplicate bindings, nested faces and store kind rejected atomically. Resolved imports and the actual prepared prelude are also checked as fail-closed boundaries.
4+
5+Both source orders decline when a later substitution changes a previously checked face-propagation condition. Controls cover compound and direct calls, an unresolved result tag that becomes `*`, and an unresolved positional slot that becomes faced. Positive low-level checks preserve closed positional fits and equal single-argument fits with open variables.
tests/type-deferred-resolver/conflict.txtnew file+12
@@ -0,0 +1,12 @@
1++$ message
2+ [%got value=@t]
3+ [%other value=@p]
4++$ alternate
5+ [%got value=@t]
6+ [%other value=@p]
7+++ send |= f=$-(@t A) f
8+++ first (send |=%got)
9+++ second first
10+++ typed ^- $-(@t message) second
11+
12+++ clash ^- $-(@t alternate) first
tests/type-deferred-resolver/duplicate.txtnew file+12
@@ -0,0 +1,12 @@
1++$ message
2+ [%got value=@t]
3+ [%other value=@p]
4++$ alternate
5+ [%got value=@t]
6+ [%other value=@p]
7+++ send |= f=$-(@t A) f
8+++ first (send |=%got)
9+++ second first
10+++ typed ^- $-(@t message) second
11+
12+++ send |= arg=@p arg
tests/type-deferred-resolver/expected.txtnew file+42
@@ -0,0 +1,42 @@
1+interface retains independent polymorphism
2+text use inferred
3+ship use inferred
4+stored built: $-(A A)
5+partial inference; module not checked
6++$ message: cases proven disjoint; mold not checked
7+++ send: $-($-(@t A) $-(@t A))
8+++ make: $-(A $-(B B))
9+++ first: $-(@t message)
10+++ second: $-(@t message)
11+++ built: $-(A A)
12+++ typed: $-(@t message)
13+++ reveal: @t
14+++ reveal-ship: @p
15+conflict rejected without interface
16+missing rejected without interface
17+hole rejected without interface
18+duplicate rejected without interface
19+face rejected without interface
20+store declined without interface
21+conflict report:
22+partial inference; module not checked
23++$ message: cases proven disjoint; mold not checked
24++$ alternate: cases proven disjoint; mold not checked
25+++ send: $-($-(@t A) $-(@t A))
26+++ first: call constraint is not supported by partial inference
27+++ second: name is not available to partial inference
28+++ typed: name is not available to partial inference
29+++ clash: name is not available to partial inference
30+store report:
31+partial inference; module not checked
32++$ poke: not checked
33++$ message: cases proven disjoint; mold not checked
34+++ send: $-($-(@t A) $-(@t A))
35+++ make: $-(A $-(B B))
36+++ first: call constraint is not supported by partial inference
37+++ second: name is not available to partial inference
38+++ built: name is not available to partial inference
39+++ typed: name is not available to partial inference
40+++ reveal: name is not available to partial inference
41+++ reveal-ship: name is not available to partial inference
42+prelude and import fallback declined
tests/type-deferred-resolver/face.txtnew file+6
@@ -0,0 +1,6 @@
1++$ message
2+ [%got payload=[who=@t n=@ud]]
3+ %idle
4+++ send |= f=$-([wrong=@t n=@ud] A) f
5+++ nested (send |=%got)
6+++ typed ^- $-([wrong=@t n=@ud] message) nested
tests/type-deferred-resolver/good.txtnew file+11
@@ -0,0 +1,11 @@
1++$ message
2+ [%got value=@t]
3+ [%other value=@p]
4+++ send |= f=$-(@t A) f
5+++ make |= ignored=A |= x=B x
6+++ first (send |=%got)
7+++ second first
8+++ built (make first)
9+++ typed ^- $-(@t message) second
10+++ reveal (built "hello")
11+++ reveal-ship (built ~zod)
tests/type-deferred-resolver/hole.txtnew file+12
@@ -0,0 +1,12 @@
1++$ message
2+ [%got value=@t]
3+ [%other value=@p]
4++$ alternate
5+ [%got value=@t]
6+ [%other value=@p]
7+++ send |= f=$-(@t A) f
8+++ first (send |=%got)
9+++ second first
10+++ typed ^- $-(@t message) second
11+
12+++ hole ^- _ %idle
tests/type-deferred-resolver/missing.txtnew file+10
@@ -0,0 +1,10 @@
1++$ message
2+ [%got value=@t]
3+ [%other value=@p]
4++$ alternate
5+ [%got value=@t]
6+ [%other value=@p]
7+++ send |= f=$-(@t A) f
8+++ first (send |=%absent)
9+++ second first
10+++ typed ^- $-(@t message) second
tests/type-deferred-resolver/stability-early.txtnew file+6
@@ -0,0 +1,6 @@
1++$ single [%got value=@t]
2+++ request |= f=$-(@t A) f
3+++ accept |= pair=[A [foo=A]] pair
4+++ waiting (request |=%got)
5+++ wrapped (accept [waiting waiting])
6+++ reveal ^- $-(@t single) waiting
tests/type-deferred-resolver/stability-late.txtnew file+6
@@ -0,0 +1,6 @@
1++$ single [%got value=@t]
2+++ request |= f=$-(@t A) f
3+++ accept |= pair=[A [foo=A]] pair
4+++ waiting (request |=%got)
5+++ reveal ^- $-(@t single) waiting
6+++ wrapped (accept [waiting waiting])
tests/type-deferred-resolver/stability-output-early.txtnew file+9
@@ -0,0 +1,9 @@
1++$ single [%got value=@t]
2+++ send |= f=$-(@t A) f
3+++ pending (send |=%got)
4+++ finish ^- $-(@t single) pending
5+++ accept |= [foo=@t bar=@t] %idle
6+++ foo-value ^- [foo=@t] "a"
7+++ bar-value ^- [bar=@t] "b"
8+++ value (accept foo-value bar-value)
9+++ reveal ^- * value
tests/type-deferred-resolver/stability-output-late.txtnew file+9
@@ -0,0 +1,9 @@
1++$ single [%got value=@t]
2+++ send |= f=$-(@t A) f
3+++ pending (send |=%got)
4+++ finish ^- $-(@t single) pending
5+++ accept |= [foo=@t bar=@t] %idle
6+++ foo-value ^- [foo=@t] "a"
7+++ bar-value ^- [bar=@t] "b"
8+++ prior ^- * (accept foo-value bar-value)
9+++ value (accept foo-value bar-value)
tests/type-deferred-resolver/stability-simple-early.txtnew file+6
@@ -0,0 +1,6 @@
1++$ single [%got value=@t]
2+++ request |= f=$-(@t A) f
3+++ accept |= x=[foo=A] x
4+++ waiting (request |=%got)
5+++ wrapped (accept waiting)
6+++ reveal ^- $-(@t single) waiting
tests/type-deferred-resolver/stability-simple-late.txtnew file+6
@@ -0,0 +1,6 @@
1++$ single [%got value=@t]
2+++ request |= f=$-(@t A) f
3+++ accept |= x=[foo=A] x
4+++ waiting (request |=%got)
5+++ reveal ^- $-(@t single) waiting
6+++ wrapped (accept waiting)
tests/type-deferred-resolver/stability-slot-early.txtnew file+9
@@ -0,0 +1,9 @@
1++$ single [%got value=@t]
2+++ request |= f=$-(@t A) f
3+++ label |= x=A [foo=x]
4+++ accept |= x=[[foo=A] @t] x
5+++ pending (request |=%got)
6+++ first (pending "hello")
7+++ labeled (label first)
8+++ value (accept labeled "b")
9+++ finish ^- $-(@t single) pending
tests/type-deferred-resolver/stability-slot-late.txtnew file+9
@@ -0,0 +1,9 @@
1++$ single [%got value=@t]
2+++ request |= f=$-(@t A) f
3+++ label |= x=A [foo=x]
4+++ accept |= x=[[foo=A] @t] x
5+++ pending (request |=%got)
6+++ first (pending "hello")
7+++ labeled (label first)
8+++ finish ^- $-(@t single) pending
9+++ value (accept labeled "b")
tests/type-deferred-resolver/store.txtnew file+12
@@ -0,0 +1,12 @@
1++$ poke @t
2++$ message
3+ [%got value=@t]
4+ [%other value=@p]
5+++ send |= f=$-(@t A) f
6+++ make |= ignored=A |= x=B x
7+++ first (send |=%got)
8+++ second first
9+++ built (make first)
10+++ typed ^- $-(@t message) second
11+++ reveal (built "hello")
12+++ reveal-ship (built ~zod)
tests/type-deferred/about.txtnew file+3
@@ -0,0 +1,3 @@
1+source: docs/spec/grammar.md, Tag resolution: “A variable constrained by tag resolution, and any it mentions, doesn't generalize; it stays open until something in the module fixes it.”
2+
3+Source-owned deferred constructor transaction: partial type artifact only; no module kind, runtime or watchability proof. Every source case checks parse success in the same analysis. Captured IDs and replay safety are checked directly.
tests/type-deferred/conflict-src.txtnew file+12
@@ -0,0 +1,12 @@
1++$ message
2+ [%got value=@t]
3+ [%other value=@p]
4++$ alternate
5+ [%got value=@t]
6+ [%other value=@p]
7+++ send |= f=$-(@t A) f
8+++ first (send |=%got)
9+++ second first
10+++ main ^- $-(@t message) second
11+
12+++ clash ^- $-(@t alternate) first
tests/type-deferred/duplicate-src.txtnew file+12
@@ -0,0 +1,12 @@
1++$ message
2+ [%got value=@t]
3+ [%other value=@p]
4++$ alternate
5+ [%got value=@t]
6+ [%other value=@p]
7+++ send |= f=$-(@t A) f
8+++ first (send |=%got)
9+++ second first
10+++ main ^- $-(@t message) second
11+
12+++ send |= arg=@p arg
tests/type-deferred/expected.txtnew file+38
@@ -0,0 +1,38 @@
1+nested lexical gate and alias agree
2+later source context closes nested constructor
3+nested obligation discharged
4+independent built result stays polymorphic
5+text use inferred
6+ship use inferred independently
7+missing constructor leaves no result
8+conflicting context leaves no result
9+duplicate source binding declined
10+definition hole does not escape
11+local deferred definition declined
12+recursive deferred group declined
13+unused mold hole declined
14+fresh ID exceeds raw and quantified IDs
15+fresh ID scan respects budget
16+original structural binding rejects wrong face
17+dropping binding would accept wrong face
18+unresolved edge remains open after fit
19+closed constructor edge has no free IDs
20+final replay is unchanged
21+open interface stays unpublished
22+raw bound variable hides atom constraint
23+normalized unsupported atom constraint rejected
24+scheme-local quantifier cannot hide captured ID
25+captured outer variable remains monomorphic
26+pending tag binding keeps reachable variable monomorphic
27+recursive obligation component stays monomorphic
28+faced callback source accepted
29+wrong nested callback face rejected
30+constructor resolves to exact callback
31+callback retains its face
32+post-fit face asymmetry is absent
33+record output stays cell-capable
34+prebound incompatible callback is rejected
35+grec constraint scan declines
36+grec fresh-id scan declines
37+default inference declines; explicit capability creates obligation
38+candidate screen boundaries passed
tests/type-deferred/face-bad-src.txtnew file+6
@@ -0,0 +1,6 @@
1++$ message
2+ [%got payload=[who=@t n=@ud]]
3+ %idle
4+++ send |= f=$-([wrong=@t n=@ud] A) f
5+++ nested (send |=%got)
6+++ main ^- $-([wrong=@t n=@ud] message) nested
tests/type-deferred/face-good-src.txtnew file+6
@@ -0,0 +1,6 @@
1++$ message
2+ [%got payload=[who=@t n=@ud]]
3+ %idle
4+++ send |= f=$-([who=@t n=@ud] A) f
5+++ nested (send |=%got)
6+++ main ^- $-([who=@t n=@ud] message) nested
tests/type-deferred/hole-src.txtnew file+12
@@ -0,0 +1,12 @@
1++$ message
2+ [%got value=@t]
3+ [%other value=@p]
4++$ alternate
5+ [%got value=@t]
6+ [%other value=@p]
7+++ send |= f=$-(@t A) f
8+++ first (send |=%got)
9+++ second first
10+++ main ^- $-(@t message) second
11+
12+++ hole ^- _ %idle
tests/type-deferred/local-src.txtnew file+8
@@ -0,0 +1,8 @@
1++$ message
2+ [%got value=@t]
3+ %idle
4+++ send |= f=$-(@t A) f
5+++ outer |= input=@t
6+ ++ tmp (send |=%got)
7+ tmp
8+++ main ^- $-(@t $-(@t message)) outer
tests/type-deferred/missing-src.txtnew file+10
@@ -0,0 +1,10 @@
1++$ message
2+ [%got value=@t]
3+ [%other value=@p]
4++$ alternate
5+ [%got value=@t]
6+ [%other value=@p]
7+++ send |= f=$-(@t A) f
8+++ first (send |=%absent)
9+++ second first
10+++ main ^- $-(@t message) second
tests/type-deferred/mold-hole-src.txtnew file+12
@@ -0,0 +1,12 @@
1++$ message
2+ [%got value=@t]
3+ [%other value=@p]
4++$ alternate
5+ [%got value=@t]
6+ [%other value=@p]
7+++ send |= f=$-(@t A) f
8+++ first (send |=%got)
9+++ second first
10+++ main ^- $-(@t message) second
11+
12++$ unused _
tests/type-deferred/mutual-src.txtnew file+7
@@ -0,0 +1,7 @@
1++$ message
2+ [%got value=@t]
3+ %idle
4+++ send |= f=$-(@t A) f
5+++ first |= input=@t (second (send |=%got))
6+++ second |= callback=$-(@t message) (first "hello")
7+++ main ^- $-(@t message) (send |=%got)
tests/type-deferred/nested-src.txtnew file+7
@@ -0,0 +1,7 @@
1++$ message
2+ [%got value=@t]
3+ %idle
4+++ send |= f=$-(@t A) f
5+++ nested |= x=@t (send |=%got)
6+++ alias nested
7+++ main ^- $-(@t $-(@t message)) alias
tests/type-deferred/principal-src.txtnew file+11
@@ -0,0 +1,11 @@
1++$ message
2+ [%got value=@t]
3+ [%other value=@p]
4+++ send |= f=$-(@t A) f
5+++ make |= ignored=A |= x=B x
6+++ first (send |=%got)
7+++ second first
8+++ built (make first)
9+++ main ^- $-(@t message) second
10+++ reveal (built "hello")
11+++ reveal-ship (built ~zod)
tests/type-direct-gate/about.txtnew file+4
@@ -0,0 +1,4 @@
1+source: Grammar, Types and molds: “A body can't force two distinct capitals to be equal; use the same capital wherever a type must be shared.”
2+tests: A source-backed test prelude with a deliberately synthetic element and program exercises direct named and unnamed higher-order gates, record-valued models, nested field faces, incompatible samples, shared and distinct capitals, pending tags, aliases, captured and distinct capitals, equal-flattened source layouts, and projection-bearing bodies. It does not establish an island kind, runtime representation, or watchability.
3+expect: parses
4+expect-types: a partial inference report
tests/type-direct-gate/expected.txtnew file+86
@@ -0,0 +1,86 @@
1+partial inference; module not checked
2++$ message: cases proven disjoint; mold not checked
3+++ init: $-(@t @ud)
4+++ update: $-([msg=message state=@ud] [@ud (list (cmd message))])
5+++ view: $-(@ud (element message))
6+++ subs: $-(@ud (list (sub message)))
7+++ direct: [init=$-(@t @ud) [update=$-([message @ud] [@ud (list (cmd message))]) [view=$-(@ud (element message)) subs=$-(@ud (list (sub message)))]]]
8+++ wrong-init: $-(@p @ud)
9+++ different-data: [init=$-(@p @ud) [update=$-([message @ud] [@ud (list (cmd message))]) [view=$-(@ud (element message)) subs=$-(@ud (list (sub message)))]]]
10+++ wrong-update: $-([msg=message state=@p] [@p (list (cmd message))])
11+++ mismatched-model: call constraint is not supported by partial inference
12+++ wrong-view: $-(@p (element message))
13+++ mismatched-view: call constraint is not supported by partial inference
14+++ wrong-subs: $-(@p (list (sub message)))
15+++ mismatched-subs: call constraint is not supported by partial inference
16++$ other: cases proven disjoint; mold not checked
17+++ wrong-msg-update: $-([msg=other state=@ud] [@ud (list (cmd other))])
18+++ mismatched-message: call constraint is not supported by partial inference
19+++ pending: tag needs context in partial inference
20+++ program-value: $-([init=$-(A B) [update=$-([C B] [B (list (cmd C))]) [view=$-(B (element C)) subs=$-(B (list (sub C)))]]] [init=$-(A B) [update=$-([C B] [B (list (cmd C))]) [view=$-(B (element C)) subs=$-(B (list (sub C)))]]])
21+++ update-unfaced: $-([message @ud] [@ud (list (cmd message))])
22+++ direct-unfaced: [init=$-(@t @ud) [update=$-([message @ud] [@ud (list (cmd message))]) [view=$-(@ud (element message)) subs=$-(@ud (list (sub message)))]]]
23++$ record: not checked
24+++ init-record: $-(@t [count=@ud label=@t])
25+++ update-record: $-([msg=message state=[count=@ud label=@t]] [[count=@ud label=@t] (list (cmd message))])
26+++ update-record-unfaced: $-([message [count=@ud label=@t]] [[count=@ud label=@t] (list (cmd message))])
27+++ view-record: $-([count=@ud label=@t] (element message))
28+++ subs-record: $-([count=@ud label=@t] (list (sub message)))
29+++ program-record: [init=$-(@t [count=@ud label=@t]) [update=$-([message [count=@ud label=@t]] [[count=@ud label=@t] (list (cmd message))]) [view=$-([count=@ud label=@t] (element message)) subs=$-([count=@ud label=@t] (list (sub message)))]]]
30+++ program-record-unfaced: [init=$-(@t [count=@ud label=@t]) [update=$-([message [count=@ud label=@t]] [[count=@ud label=@t] (list (cmd message))]) [view=$-([count=@ud label=@t] (element message)) subs=$-([count=@ud label=@t] (list (sub message)))]]]
31+++ bad-update-record: $-([msg=message state=[other=@ud label=@t]] [[count=@ud label=@t] (list (cmd message))])
32+++ program-wrong-nested-face: call constraint is not supported by partial inference
33+++ update-pending: tag needs context in partial inference
34+++ program-pending: name is not available to partial inference
35+++ update-proj: $-([msg=message state=[count=@ud [label=@t extra=?]]] [[count=@ud label=@t] (list (cmd message))])
36+++ pass-fn: $-($-([A B] C) $-([A B] C))
37+++ pass-named: $-([msg=message state=@ud] [@ud (list (cmd message))])
38+++ pass-unnamed: $-([message @ud] [@ud (list (cmd message))])
39+++ forced-same: $-($-([A A] @t) $-([A A] @t))
40+++ forced-distinct: distinct type variables `A` and `B` must not be forced equal; use the same capital for a shared type
41+/tests/sub/client.jibb:55:29: first type variable
42+++ forced-distinct |= f=$-([A B] @t) (forced-same f)
43+ ^
44+/tests/sub/client.jibb:55:31: second type variable
45+++ forced-distinct |= f=$-([A B] @t) (forced-same f)
46+ ^
47+++ known-label: $-($-([left=@t right=@p] @ud) $-([left=@t right=@p] @ud))
48+++ matching-label: $-([left=@t right=@p] @ud)
49+++ different-label: $-([x=@t y=@p] @ud)
50+++ match-label: $-([left=@t right=@p] @ud)
51+++ mismatch-label: call's sample and argument types do not unify
52+/tests/sub/client.jibb:60:20: called gate has type $-($-([left=@t right=@p] @ud) $-([left=@t right=@p] @ud))
53+++ mismatch-label (known-label different-label)
54+ ^
55+/tests/sub/client.jibb:60:32: argument has type $-([x=@t y=@p] @ud)
56+++ mismatch-label (known-label different-label)
57+ ^
58+++ unknown-call: $-($-([A B] C) $-([A B] C))
59+++ update-proj-good: $-([msg=message state=[count=@ud label=@t]] [[count=@ud label=@t] (list (cmd message))])
60+++ program-projection: [init=$-(@t [count=@ud label=@t]) [update=$-([message [count=@ud label=@t]] [[count=@ud label=@t] (list (cmd message))]) [view=$-([count=@ud label=@t] (element message)) subs=$-([count=@ud label=@t] (list (sub message)))]]]
61+++ program-alias: $-([init=$-(A B) [update=$-([C B] [B (list (cmd C))]) [view=$-(B (element C)) subs=$-(B (list (sub C)))]]] [init=$-(A B) [update=$-([C B] [B (list (cmd C))]) [view=$-(B (element C)) subs=$-(B (list (sub C)))]]])
62+++ through-head-alias: call constraint is not supported by partial inference
63+++ update-alias: $-([msg=message state=@ud] [@ud (list (cmd message))])
64+++ through-arg-alias: call constraint is not supported by partial inference
65+++ select-update: branch tag or union context is not supported by partial inference
66+++ through-branch: name is not available to partial inference
67+++ local-shadow: sample shadows a name
68+++ nested-layout: $-([a=@t [x=@t y=@p]] @t)
69+++ flat-layout: $-([a=@t [x=@t y=@p]] @t)
70+++ nested-accept: call constraint is not supported by partial inference
71+++ flat-accept: call constraint is not supported by partial inference
72+++ higher-nested: $-([@t [x=@t y=@p]] @t)
73+++ higher-flat: $-([@t [x=@t y=@p]] @t)
74+++ nested-ret: $-([a=@t [x=@t y=@p]] [x=@t y=@p])
75+++ flat-ret: $-([a=@t [x=@t y=@p]] [x=@t y=@p])
76+++ higher-generic-nested: [x=@t y=@p]
77+++ higher-generic-flat: call constraint is not supported by partial inference
78+++ global-id: $-(A A)
79+++ capture-good: $-([a=@t state=A] A)
80+++ capture-text: @t
81+++ capture-ship: @p
82+++ capture-bad: $-([a=A state=B] A)
83+++ capture-distinct: call constraint is not supported by partial inference
84+++ capture-caller: call constraint is not supported by partial inference
85+++ capture-local: call constraint is not supported by partial inference
86+++ capture-distinct-caller: call constraint is not supported by partial inference
tests/type-direct-gate/source.txtnew file+96
@@ -0,0 +1,96 @@
1++$ message
2+ %start
3+ %stop
4+++ init |= input=@t ^- @ud 1
5+++ update |= [msg=message state=@ud]
6+ ^- [@ud (list (cmd message))] [state ~]
7+++ view |= state=@ud ^- (element message) (text "view")
8+++ subs |= state=@ud ^- (list (sub message)) ~
9+++ direct (program init update view subs)
10+++ wrong-init |= input=@p ^- @ud 1
11+++ different-data (program wrong-init update view subs)
12+++ wrong-update |= [msg=message state=@p]
13+ ^- [@p (list (cmd message))] [state ~]
14+++ mismatched-model (program init wrong-update view subs)
15+++ wrong-view |= state=@p ^- (element message) (text "view")
16+++ mismatched-view (program init update wrong-view subs)
17+++ wrong-subs |= state=@p ^- (list (sub message)) ~
18+++ mismatched-subs (program init update view wrong-subs)
19++$ other
20+ %start
21+ %stop
22+++ wrong-msg-update |= [msg=other state=@ud]
23+ ^- [@ud (list (cmd other))] [state ~]
24+++ mismatched-message (program init wrong-msg-update view subs)
25+++ pending
26+ ~& %unrelated
27+ (program init update view subs)
28+++ program-value program
29+++ update-unfaced |= input=[message @ud]
30+ ^- [@ud (list (cmd message))] [0 ~]
31+++ direct-unfaced (program init update-unfaced view subs)
32++$ record [count=@ud label=@t]
33+++ init-record |= input=@t ^- record [count=0 label=input]
34+++ update-record |= [msg=message state=record]
35+ ^- [record (list (cmd message))] [state ~]
36+++ update-record-unfaced |= args=[message record]
37+ ^- [record (list (cmd message))] [[count=0 label=""] ~]
38+++ view-record |= state=record ^- (element message) (text "view")
39+++ subs-record |= state=record ^- (list (sub message)) ~
40+++ program-record (program init-record update-record view-record subs-record)
41+++ program-record-unfaced (program init-record update-record-unfaced view-record subs-record)
42+++ bad-update-record |= [msg=message state=[other=@ud label=@t]]
43+ ^- [record (list (cmd message))] [[count=0 label=""] ~]
44+++ program-wrong-nested-face (program init-record bad-update-record view-record subs-record)
45+++ update-pending |= [msg=message state=record]
46+ ~& %orphan
47+ ^- [record (list (cmd message))] [state ~]
48+++ program-pending (program init-record update-pending view-record subs-record)
49+++ update-proj |= [msg=message state=[count=@ud label=@t extra=?]]
50+ ^- [record (list (cmd message))] [(proj state) ~]
51+++ pass-fn |= f=$-([A B] C) f
52+++ pass-named (pass-fn update)
53+++ pass-unnamed (pass-fn update-unfaced)
54+++ forced-same |= f=$-([A A] @t) f
55+++ forced-distinct |= f=$-([A B] @t) (forced-same f)
56+++ known-label |= f=$-([left=@t right=@p] @ud) f
57+++ matching-label |= [left=@t right=@p] ^- @ud 0
58+++ different-label |= [x=@t y=@p] ^- @ud 0
59+++ match-label (known-label matching-label)
60+++ mismatch-label (known-label different-label)
61+++ unknown-call |= f (pass-fn f)
62+++ update-proj-good |= [msg=message state=record]
63+ ^- [record (list (cmd message))]
64+ [(proj [count=0 label="projected" extra=%.y]) ~]
65+++ program-projection (program init-record update-proj-good view-record subs-record)
66+++ program-alias program
67+++ through-head-alias (program-alias init update view subs)
68+++ update-alias update
69+++ through-arg-alias (program init update-alias view subs)
70+++ select-update |= flag=?
71+ ?- flag
72+ %.y update
73+ %.n update-unfaced
74+++ through-branch (program init (select-update %.y) view subs)
75+++ local-shadow |= update (program init update view subs)
76+++ nested-layout |= [a=@t [x=@t y=@p]] a
77+++ flat-layout |= [a=@t x=@t y=@p] a
78+++ nested-accept (choose-layout nested-layout ["first" ["second" ~zod]])
79+++ flat-accept (choose-layout flat-layout ["first" ["second" ~zod]])
80+++ higher-nested (higher nested-layout %.y)
81+++ higher-flat (higher flat-layout %.y)
82+++ nested-ret |= [a=@t [x=@t y=@p]] [x=x y=y]
83+++ flat-ret |= [a=@t x=@t y=@p] [x=x y=y]
84+++ higher-generic-nested (higher-generic nested-ret [x="two" y=~zod])
85+++ higher-generic-flat (higher-generic flat-ret [x="two" y=~zod])
86+++ global-id |= x=A x
87+++ capture-good |= [a=@t state=A] (global-id state)
88+++ capture-text (higher-generic capture-good "hello")
89+++ capture-ship (higher-generic capture-good ~zod)
90+++ capture-bad |= [a=A state=B] (global-id a)
91+++ capture-distinct (higher-generic capture-bad ~zod)
92+++ capture-caller |= value=A (higher-generic capture-good value)
93+++ capture-local |= value=A
94+ ++ local-function |= [a=@t state=A] value
95+ (higher-generic local-function value)
96+++ capture-distinct-caller |= [left=A right=B] ^- B (higher-generic capture-good left)
tests/type-empty/about.txtnew file+3
@@ -0,0 +1,3 @@
1+source: Grammar, Molds: the empty mold `!!` has no values. Patterns: every case needs an arm or a catch-all; an already-covered arm is an error.
2+tests: Checked interfaces retain empty molds and nested empty cell positions; only inhabited union cases need coverage. Standard list and unit null values remain inhabited, while their empty payload arms are unreachable. Fixed opaque reachability, late capital constraints, proof limits and directional fit are checked conservatively. The report is partial, and runtime behavior is not tested.
3+expect: shared eval and ship guard
tests/type-empty/dead.txtnew file+7
@@ -0,0 +1,7 @@
1++$ split
2+ [%dead [!! @t]]
3+ [%live @t]
4+++ select |= x=split
5+ ?- x
6+ [%dead impossible] "dead"
7+ [%live text] text
tests/type-empty/expected.txtnew file+59
@@ -0,0 +1,59 @@
1+empty mold exported: ok
2+live union selector preserves type: ok
3+overlap parses and is rejected: ok
4+dead empty case parses and is rejected: ok
5+missing live case parses and is rejected: ok
6+standard list and unit identities checked: ok
7+single null list gate keeps its exact sample and result: ok
8+contextual single null list gate checks: ok
9+contextual single null list arm retains faces: ok
10+one null arm on inhabited list declines: ok
11+one null arm on generic list declines: ok
12+empty list nonempty arm parses and is rejected: ok
13+empty unit present arm parses and is rejected: ok
14+nested empty proof: ok
15+list of empty is inhabited: ok
16+gate returning empty is not empty: ok
17+unbound type not proved empty: ok
18+unbound inference type reachability unknown: ok
19+written capital can have a value: ok
20+bound empty capital is unreachable: ok
21+opaque recursion reachability unknown: ok
22+opaque union case declines coverage proof: ok
23+one proof node exhausted: ok
24+two proof nodes succeed: ok
25+empty fits a concrete type: ok
26+empty cell fits a concrete type: ok
27+inhabited atom does not fit empty: ok
28+empty gate-bearing cell is gate-free: ok
29+list of empty is gate-free and inhabited: ok
30+partial inference; module not checked
31++$ never: not checked
32++$ box: not checked
33++$ split: cases proven disjoint; mold not checked
34+++ identity: $-(!! !!)
35+++ generic-empty: $-([x=!! y=@t] [x=!! y=@t])
36+++ select: $-(split @t)
37+++ crash: !!
38+partial inference; module not checked
39++$ broken: overlapping cases; mold not checked
40+/tests/empty.jibb:2:3: first union case
41+ [%tag [%.y @t]]
42+ ^
43+/tests/empty.jibb:3:3: overlapping case
44+ [%tag [%$ @p]]
45+ ^
46+partial inference; module not checked
47++$ split: cases proven disjoint; mold not checked
48+++ select: union pattern is not supported by partial inference
49+partial inference; module not checked
50++$ split: cases proven disjoint; mold not checked
51+++ select: union pattern is not supported by partial inference
52+partial inference; module not checked
53+++ probe: list nonempty pattern is unreachable
54+partial inference; module not checked
55+++ probe: unit present pattern is unreachable
56+partial inference; module not checked
57+++ probe-late: explicit capital constraints are not supported by partial inference
58+++ probe-outer: explicit capital constraints are not supported by partial inference
59+++ probe-rec: explicit capital constraints are not supported by partial inference
tests/type-empty/face-source.txtnew file+2
@@ -0,0 +1,2 @@
1+++ branch ?- xs
2+ ~ [x="yes" y="no"]
tests/type-empty/good.txtnew file+11
@@ -0,0 +1,11 @@
1++$ never !!
2++$ box |$ [A] [x=A y=@t]
3++$ split
4+ [%dead [!! @t]]
5+ [%live @t]
6+++ identity |= x=never x
7+++ generic-empty |= x=(box !!) x
8+++ select |= x=split
9+ ?- x
10+ [%live text] text
11+++ crash ^- !! !!
tests/type-empty/late-cap.txtnew file+16
@@ -0,0 +1,16 @@
1+++ probe-late |= xs=(list A)
2+ ?- xs
3+ ~ !!
4+ [item rest] ^- !! item
5+++ probe-outer |= xs=(list A)
6+ ++ inspect |= ys=(list A)
7+ ?- ys
8+ ~ !!
9+ [item rest] ^- !! item
10+ (inspect xs)
11+++ probe-rec |= xs=(list A)
12+ ?- xs
13+ ~ !!
14+ [item rest]
15+ ~& ^- !! item
16+ (probe-rec rest)
tests/type-empty/list-dead.txtnew file+4
@@ -0,0 +1,4 @@
1+++ probe |= xs=(list !!)
2+ ?- xs
3+ ~ "nil"
4+ [x rest] "cons"
tests/type-empty/list-live.txtnew file+3
@@ -0,0 +1,3 @@
1+++ no |= xs=(list @t)
2+ ?- xs
3+ ~ "nil"
tests/type-empty/list-open.txtnew file+3
@@ -0,0 +1,3 @@
1+++ no |= xs=(list A)
2+ ?- xs
3+ ~ "nil"
tests/type-empty/missing.txtnew file+6
@@ -0,0 +1,6 @@
1++$ split
2+ [%dead [!! @t]]
3+ [%live @t]
4+++ select |= x=split
5+ ?- x
6+ [%dead impossible] "dead"
tests/type-empty/overlap.txtnew file+3
@@ -0,0 +1,3 @@
1++$ broken
2+ [%tag [%.y @t]]
3+ [%tag [%$ @p]]
tests/type-empty/standard-good.txtnew file+11
@@ -0,0 +1,11 @@
1+++ list-id |= xs=(list !!) xs
2+++ unit-id |= maybe=(unit !!) maybe
3+++ list-only |= xs=(list !!)
4+ ?- xs
5+ ~ "nil"
6+++ list-only-context |= xs=(list !!)
7+ ^- @t ?- xs
8+ ~ "nil"
9+++ unit-only |= maybe=(unit !!)
10+ ?- maybe
11+ ~ "nil"
tests/type-empty/unit-dead.txtnew file+4
@@ -0,0 +1,4 @@
1+++ probe |= maybe=(unit !!)
2+ ?- maybe
3+ ~ "nil"
4+ [~ x] "some"
tests/type-full-overlap/about.txtnew file+3
@@ -0,0 +1,3 @@
1+source: docs/spec/grammar.md, Molds: “Cases must differ as nouns”.
2+tests: Full-module overlap evidence retains the defining source and both case spans through ordinary Jibb imports, and legacy errors render the excerpts. Distinct cases check; duplicate names, stale caches, cycles, private imports and other unsupported inputs retain their own earlier errors. Specialized API and prelude paths remain outside this diagnostic slice.
3+expect: shared eval and ship guards
tests/type-full-overlap/child.txtnew file+4
@@ -0,0 +1,4 @@
1++$ tagged |$ [A] [%wrapped A]
2++$ child-bad
3+ (tagged @t)
4+ [%wrapped @p]
tests/type-full-overlap/distinct.txtnew file+5
@@ -0,0 +1,5 @@
1++$ tagged |$ [A] [%wrapped A]
2++$ good
3+ (tagged @t)
4+ [%other @p]
5+++ id |= x=good x
tests/type-full-overlap/duplicate-generic.txtnew file+4
@@ -0,0 +1,4 @@
1++$ tagged |$ [A] [%wrapped A]
2++$ bad |$ [B B]
3+ (tagged @t)
4+ [%wrapped @p]
tests/type-full-overlap/duplicate.txtnew file+5
@@ -0,0 +1,5 @@
1++$ tagged |$ [A] [%wrapped A]
2++$ tagged |$ [A] [%other A]
3++$ bad
4+ (tagged @t)
5+ [%wrapped @p]
tests/type-full-overlap/expected-basic.txtnew file+16
@@ -0,0 +1,16 @@
1+256 generic parameters accepted by scan: ok
2+257 generic parameters exhaust scan: ok
3+duplicate generic parameters fail scan: ok
4+same head has source-bound overlap: ok
5+zero spelling has source-bound overlap: ok
6+generic wrapper has source-bound overlap: ok
7+duplicate generic parameters remain unstructured: ok
8+unsupported remains unstructured: ok
9+later overlap exists in precedence source: ok
10+earlier unsupported mold takes precedence: ok
11+duplicate source parsed but rejects without overlap: ok
12+invalid source rejects without overlap: ok
13+distinct alias source parses and checks: ok
14+parent itself has different positive overlap: ok
15+legacy full-module error contains both excerpts: ok
16+import overlap retains exact child source: ok
tests/type-full-overlap/expected-graph.txtnew file+8
@@ -0,0 +1,8 @@
1+detached cache rebuild preserves child evidence: ok
2+mismatched graph cache declines without evidence: ok
3+verified cache source binding: ok
4+private import declines before source proof: ok
5+active cycle declines before source proof: ok
6+duplicate child sources decline without evidence: ok
7+missing child source declines without evidence: ok
8+transitive import retains leaf source: ok
tests/type-full-overlap/generic.txtnew file+4
@@ -0,0 +1,4 @@
1++$ tagged |$ [A] [%wrapped A]
2++$ bad |$ [B]
3+ (tagged @t)
4+ [%wrapped @p]
tests/type-full-overlap/invalid.txtnew file+4
@@ -0,0 +1,4 @@
1++$ tagged |$ [A] [%wrapped A]
2++$ bad
3+ (tagged @t
4+ [%wrapped @p]
tests/type-full-overlap/parent.txtnew file+5
@@ -0,0 +1,5 @@
1+/= lib /ui/child
2++$ tagged |$ [A] [%wrapped A]
3++$ parent-bad
4+ (tagged @t)
5+ [%wrapped @p]
tests/type-full-overlap/precedence.txtnew file+5
@@ -0,0 +1,5 @@
1++$ unresolved (missing @t)
2++$ tagged |$ [A] [%wrapped A]
3++$ bad
4+ (tagged @t)
5+ [%wrapped @p]
tests/type-full-overlap/same.txtnew file+4
@@ -0,0 +1,4 @@
1++$ tagged |$ [A] [%wrapped A]
2++$ bad
3+ (tagged @t)
4+ [%wrapped @p]
tests/type-full-overlap/unsupported.txtnew file+4
@@ -0,0 +1,4 @@
1++$ tagged |$ [A] [%wrapped A]
2++$ bad |$ [A]
3+ (tagged A)
4+ [%wrapped @t]
tests/type-full-overlap/zero.txtnew file+4
@@ -0,0 +1,4 @@
1++$ zero |$ [A] [%.y A]
2++$ bad
3+ (zero @t)
4+ [%$ @p]
tests/type-gate-free/about.txtnew file+1
@@ -0,0 +1 @@
1+The unchanged todo island source is used only to resolve its model mold through the actual todo API, /sur and mark readers. The eval runner verifies its copy matches the application source. Controls also add a callback or noun field and exercise unavailable, malformed and ambiguous input. This is partial mold analysis only: no complete module, island kind, runtime or watchability claim is made.
tests/type-gate-free/expected.txtnew file+9
@@ -0,0 +1,9 @@
1+todo model: gate-free
2+callback model: gate at callback
3+noun model: unknown
4+zero fuel: unknown
5+oversized fuel: capped
6+invalid inputs: rejected
7+source evidence: retained
8+matching root and unused sur: accepted
9+root import cycle: rejected
tests/type-gate-free/todo-gate.txtnew file+40
@@ -0,0 +1,40 @@
1+/= todo /ui/api/todo
2+
3+++ main (program init update view subs)
4+
5++$ model [todos=(list item.todo) draft=@t error=(unit @t) callback=$-(@t @t)]
6++$ msg
7+ [%typed text=@t]
8+ %submit
9+ [%toggled id=@ud]
10+ [%got todos=(list item.todo)]
11+ [%acked err=(unit @t)]
12+
13+++ init |= ts=(list item.todo)
14+ [ts "" ~]
15+
16+++ update |= [=msg m=model]
17+ ?- msg
18+ [%typed t]
19+ ?- (gth (lent (tuba (trip t))) 80)
20+ %.y [m(draft=t error=`"Too long") ~]
21+ %.n [m(draft=t error=~) ~]
22+ %submit [m(draft="") ~[[%poke (todo-action.todo [%add draft.m]) |=%acked]]]
23+ [%toggled id] [m ~[[%poke (todo-action.todo [%toggle id]) |=%acked]]]
24+ [%got ts] [m(todos=ts) ~]
25+ [%acked err] [m(error=err) ~]
26+
27+++ subs |= m=model
28+ ~[[%watch (todos.todo |=%got)]]
29+
30+++ view |= m=model
31+ column ~[gap+%s2] ~[
32+ heading 2 "Todos"
33+ each (turn todos.m row-of)
34+ row ~[gap+%s1] ~[
35+ el ~[width+[%fill 1]] (field "New todo" draft.m |=%typed)
36+ button "Add" %submit
37+ el ~[tone+%danger] (text (fall error.m ""))
38+
39+++ row-of |= t=item.todo
40+ [id.t (toggle done.t text.t [%toggled id.t])]
tests/type-gate-free/todo-noun.txtnew file+40
@@ -0,0 +1,40 @@
1+/= todo /ui/api/todo
2+
3+++ main (program init update view subs)
4+
5++$ model [todos=(list item.todo) draft=@t error=(unit @t) opaque=*]
6++$ msg
7+ [%typed text=@t]
8+ %submit
9+ [%toggled id=@ud]
10+ [%got todos=(list item.todo)]
11+ [%acked err=(unit @t)]
12+
13+++ init |= ts=(list item.todo)
14+ [ts "" ~]
15+
16+++ update |= [=msg m=model]
17+ ?- msg
18+ [%typed t]
19+ ?- (gth (lent (tuba (trip t))) 80)
20+ %.y [m(draft=t error=`"Too long") ~]
21+ %.n [m(draft=t error=~) ~]
22+ %submit [m(draft="") ~[[%poke (todo-action.todo [%add draft.m]) |=%acked]]]
23+ [%toggled id] [m ~[[%poke (todo-action.todo [%toggle id]) |=%acked]]]
24+ [%got ts] [m(todos=ts) ~]
25+ [%acked err] [m(error=err) ~]
26+
27+++ subs |= m=model
28+ ~[[%watch (todos.todo |=%got)]]
29+
30+++ view |= m=model
31+ column ~[gap+%s2] ~[
32+ heading 2 "Todos"
33+ each (turn todos.m row-of)
34+ row ~[gap+%s1] ~[
35+ el ~[width+[%fill 1]] (field "New todo" draft.m |=%typed)
36+ button "Add" %submit
37+ el ~[tone+%danger] (text (fall error.m ""))
38+
39+++ row-of |= t=item.todo
40+ [id.t (toggle done.t text.t [%toggled id.t])]
tests/type-gate-free/todo.txtnew file+40
@@ -0,0 +1,40 @@
1+/= todo /ui/api/todo
2+
3+++ main (program init update view subs)
4+
5++$ model [todos=(list item.todo) draft=@t error=(unit @t)]
6++$ msg
7+ [%typed text=@t]
8+ %submit
9+ [%toggled id=@ud]
10+ [%got todos=(list item.todo)]
11+ [%acked err=(unit @t)]
12+
13+++ init |= ts=(list item.todo)
14+ [ts "" ~]
15+
16+++ update |= [=msg m=model]
17+ ?- msg
18+ [%typed t]
19+ ?- (gth (lent (tuba (trip t))) 80)
20+ %.y [m(draft=t error=`"Too long") ~]
21+ %.n [m(draft=t error=~) ~]
22+ %submit [m(draft="") ~[[%poke (todo-action.todo [%add draft.m]) |=%acked]]]
23+ [%toggled id] [m ~[[%poke (todo-action.todo [%toggle id]) |=%acked]]]
24+ [%got ts] [m(todos=ts) ~]
25+ [%acked err] [m(error=err) ~]
26+
27+++ subs |= m=model
28+ ~[[%watch (todos.todo |=%got)]]
29+
30+++ view |= m=model
31+ column ~[gap+%s2] ~[
32+ heading 2 "Todos"
33+ each (turn todos.m row-of)
34+ row ~[gap+%s1] ~[
35+ el ~[width+[%fill 1]] (field "New todo" draft.m |=%typed)
36+ button "Add" %submit
37+ el ~[tone+%danger] (text (fall error.m ""))
38+
39+++ row-of |= t=item.todo
40+ [id.t (toggle done.t text.t [%toggled id.t])]
tests/type-generic-construction/about.txtnew file+9
@@ -0,0 +1,9 @@
1+source: docs/spec/grammar.md:57,135 — “Molds may be recursive”; “recursive molds go by name and module”.
2+
3+This shared eval/ship fixture checks a narrow source-proven tree construction
4+slice. It exercises both recognized source shapes, type arguments and aliases,
5+nominal origins, contextual field and payload constraints, shared fuel, and
6+unrelated pending state. The source reports are explicitly partial; a separate
7+owner check requires the entire library to succeed before interface export.
8+The view and substitution scan limits do not bound all inference or retries.
9+No runtime lowering, watchability, island acceptance or backend claim is made.
tests/type-generic-construction/alias-client.txtnew file+12
@@ -0,0 +1,12 @@
1+/= first /ui/tree
2+/= again /ui/tree
3+/= second /ui/tree-two
4+/= via /ui/tree-alias
5+++ text-event |= x=@t x
6+++ ship-event |= x=@t ~zod
7+++ via-leaf ^- (alias.via @t) [%text value="x"]
8+++ via-node ^- (alias.via @p) [%node event=ship-event children=~]
9+++ cross-alias |= x=(alias.via @t) ^- (node-tree.first @t) [%node event=text-event children=~[x]]
10+++ cross-owner |= x=(node-tree.again @t) ^- (alias.via @t) [%node event=text-event children=~[x]]
11+++ wrong-owner |= x=(node-tree.second @t) ^- (alias.via @t) [%node event=text-event children=~[x]]
12+++ wrong-arg |= x=(alias.via @p) ^- (node-tree.first @t) [%node event=text-event children=~[x]]
tests/type-generic-construction/alias.txtnew file+3
@@ -0,0 +1,3 @@
1+/= source /ui/tree
2++$ alias |$ [A] (node-tree.source A)
3+++ identity |= x=(alias A) x
tests/type-generic-construction/client.txtnew file+24
@@ -0,0 +1,24 @@
1+/= first /ui/tree
2+/= second /ui/tree-two
3+++ text-event |= value=@t value
4+++ ship-event |= value=@t ~zod
5+++ leaf ^- (node-tree.first @t) [%text value="hi"]
6+++ ship-leaf ^- (node-tree.first @p) [%text value="hi"]
7+++ node ^- (node-tree.first @t) [%node event=text-event children=~]
8+++ ship-node ^- (node-tree.first @p) [%node event=ship-event children=~]
9+++ nested ^- (node-tree.first @t) [%node event=text-event children=~[[%text value="x"]]]
10+++ wrong-event ^- (node-tree.first @p) [%node event=text-event children=~]
11+++ wrong-leaf ^- (node-tree.first @t) [%text value=~zod]
12+++ wrong-label ^- (node-tree.first @t) [%text other="hi"]
13+++ bad-tag ^- (node-tree.first @t) [%missing value="hi"]
14+++ foreign |= x=(node-tree.second @t) ^- (node-tree.first @t) [%node event=text-event children=~[x]]
15+++ generic |= event=$-(@t A) ^- (node-tree.first A) [%node event=event children=~]
16+++ pending |= x=(node-tree.first @t) [%missing x]
17+++ extra ^- (node-tree.first @t) [%text value="hi" extra="bad"]
18+++ misplaced ^- (node-tree.first @t) [%text value=~zod]
19+++ bad-child ^- (node-tree.first @t) [%node event=text-event children=~["bad"]]
20+++ bad-children ^- (node-tree.first @t) [%node event=text-event children="bad"]
21+++ label-swap ^- (node-tree.first @t) [%node children=~ event=text-event]
22+++ wrong-nominal |= child=(node-tree.second @p) ^- (node-tree.first @t) [%node event=text-event children=~[child]]
23+++ wrong-argument |= child=(node-tree.first @p) ^- (node-tree.first @t) [%node event=text-event children=~[child]]
24+++ keep-generic |= f=$-(@t A) ^- (node-tree.first A) [%node event=f children=~[[%text value="x"]]]
tests/type-generic-construction/expected.txtnew file+65
@@ -0,0 +1,65 @@
1+complete owner: ok
2+owner exports constructed nominal values: ok
3+invalid owner declined: ok
4+view spends one step: ok
5+view retains argument and child identity: ok
6+zero view fuel declined: ok
7+malformed proof declined: ok
8+foreign recursive tail retained: ok
9+zero inference fuel declined: ok
10+one-step leaf retains nominal identity: ok
11+one-step node succeeds: ok
12+nested one-step declined: ok
13+nested two-step succeeds: ok
14+siblings share fuel: ok
15+same-state retry agrees: ok
16+failed retry agrees: ok
17+argument binding retains source identity: ok
18+pending tag retained: ok
19+pending hole retained: ok
20+projection evidence retained: ok
21+hidden variable declined: ok
22+scan exact limit: ok
23+scan over limit declined: ok
24+faced scan exact limit: ok
25+faced scan over limit declined: ok
26+structural substitution declined: ok
27+partial inference; module not checked
28+++ text-event: $-(@t @t)
29+++ ship-event: $-(@t @p)
30+++ leaf: (node-tree.first @t)
31+++ ship-leaf: (node-tree.first @p)
32+++ node: (node-tree.first @t)
33+++ ship-node: (node-tree.first @p)
34+++ nested: (node-tree.first @t)
35+++ wrong-event: recursive mold case does not fit its source shape
36+++ wrong-leaf: recursive mold case does not fit its source shape
37+++ wrong-label: recursive mold case does not fit its source shape
38+++ bad-tag: recursive mold constructor has no matching case
39+++ foreign: list item constraint is not supported by partial inference
40+++ generic: $-($-(@t A) (node-tree.first A))
41+++ pending: tag needs context in partial inference
42+++ extra: recursive mold case does not fit its source shape
43+++ misplaced: recursive mold case does not fit its source shape
44+++ bad-child: list item constraint is not supported by partial inference
45+++ bad-children: recursive mold case needs unsupported inference
46+++ label-swap: recursive mold case does not fit its source shape
47+++ wrong-nominal: list item constraint is not supported by partial inference
48+++ wrong-argument: list item constraint is not supported by partial inference
49+++ keep-generic: $-($-(@t A) (node-tree.first A))
50+partial inference; module not checked
51+++ text-event: $-(@t @t)
52+++ ship-event: $-(@t @p)
53+++ via-leaf: (alias.via @t)
54+++ via-node: (alias.via @p)
55+++ cross-alias: $-((alias.via @t) (node-tree.first @t))
56+++ cross-owner: $-((node-tree.again @t) (alias.via @t))
57+++ wrong-owner: list item constraint is not supported by partial inference
58+++ wrong-arg: list item constraint is not supported by partial inference
59+partial inference; module not checked
60+++ leaf: (node-tree.first @t)
61+++ node: (node-tree.first @p)
62+++ nested: (node-tree.first @t)
63+++ generic: $-(A (node-tree.first A))
64+++ wrong-owner: list item constraint is not supported by partial inference
65+++ wrong-field: recursive mold case needs unsupported inference
tests/type-generic-construction/no-event-client.txtnew file+8
@@ -0,0 +1,8 @@
1+/= first /ui/tree
2+/= second /ui/tree-two
3+++ leaf ^- (node-tree.first @t) [%text value="x"]
4+++ node ^- (node-tree.first @p) [%node children=~]
5+++ nested ^- (node-tree.first @t) [%node children=~[[%text value="x"]]]
6+++ generic |= x=A ^- (node-tree.first A) [%node children=~]
7+++ wrong-owner |= x=(node-tree.second @t) ^- (node-tree.first @t) [%node children=~[x]]
8+++ wrong-field ^- (node-tree.first @t) [%node children="x"]
tests/type-generic-construction/owner-negative.txtnew file+10
@@ -0,0 +1,10 @@
1++$ node-tree |$ [M]
2+ [%text value=@t]
3+ [%node event=$-(@t M) children=(list (node-tree M))]
4+++ text-id |= x=(node-tree @t) x
5+++ ship-id |= x=(node-tree @p) x
6+++ generic-id |= x=(node-tree A) x
7+++ text-event |= x=@t x
8+++ made-leaf ^- (node-tree @t) [%text value="x"]
9+++ made-node ^- (node-tree @t) [%node event=text-event children=~[[%text value="x"]]]
10+++ invalid ^- (node-tree @t) [%text value=~zod]
tests/type-generic-construction/owner-positive.txtnew file+9
@@ -0,0 +1,9 @@
1++$ node-tree |$ [M]
2+ [%text value=@t]
3+ [%node event=$-(@t M) children=(list (node-tree M))]
4+++ text-id |= x=(node-tree @t) x
5+++ ship-id |= x=(node-tree @p) x
6+++ generic-id |= x=(node-tree A) x
7+++ text-event |= x=@t x
8+++ made-leaf ^- (node-tree @t) [%text value="x"]
9+++ made-node ^- (node-tree @t) [%node event=text-event children=~[[%text value="x"]]]
tests/type-generic-construction/sibling-values.txtnew file+4
@@ -0,0 +1,4 @@
1+++ leaf [%text value="x"]
2+++ node [%node event=text-event children=~]
3+++ nested [%node event=text-event children=~[[%text value="x"]]]
4+++ siblings [%node event=text-event children=~[[%text value="x"] [%text value="y"]]]
tests/type-generic-construction/tree-no-event.txtnew file+4
@@ -0,0 +1,4 @@
1++$ node-tree |$ [M]
2+ [%text value=@t]
3+ [%node children=(list (node-tree M))]
4+++ generic-id |= x=(node-tree A) x
tests/type-generic-construction/tree.txtnew file+6
@@ -0,0 +1,6 @@
1++$ node-tree |$ [M]
2+ [%text value=@t]
3+ [%node event=$-(@t M) children=(list (node-tree M))]
4+++ text-id |= x=(node-tree @t) x
5+++ ship-id |= x=(node-tree @p) x
6+++ generic-id |= x=(node-tree A) x
tests/type-generic-pattern/about.txtnew file+10
@@ -0,0 +1,10 @@
1+source: docs/spec/grammar.md:57,135 — “Molds may be recursive”; “recursive molds go by name and module”.
2+
3+This shared eval/ship fixture checks a narrow source-proven recursive tree
4+pattern slice, including explicit tags, nonbinding catch-alls, binder scopes,
5+payload arguments, recursive children, aliases, coverage failures, shared
6+fuel, pending state and the 128-arm screening boundary. The source client
7+reports are explicitly partial. A separate owner check requires all ordinary
8+definitions to succeed before interface export. Whole-case binders, nested
9+recursive patterns and unresolved recursive origins remain unsupported. No
10+runtime lowering, watchability, island acceptance or backend claim is made.
tests/type-generic-pattern/client.txtnew file+166
@@ -0,0 +1,166 @@
1+/= first /ui/tree
2+/= second /ui/tree-two
3+/= via /ui/tree-alias
4+++ describe |= x=(node-tree.first @t)
5+ ?- x
6+ [%text value] value
7+ [%node event children] (event "click")
8+++ reverse |= x=(node-tree.first @p)
9+ ?- x
10+ [%node event children] (event "click")
11+ [%text value] ~zod
12+++ generic-children |= x=(node-tree.first A)
13+ ^- (list (node-tree.first A)) ?- x
14+ [%text value] ~
15+ [%node event kids] kids
16+++ alias-children |= x=(alias.via @p)
17+ ^- (list (node-tree.first @p)) ?- x
18+ [%text value] ~
19+ [%node event kids] kids
20+++ rebuild |= x=(node-tree.first @t)
21+ ^- (node-tree.first @t) ?- x
22+ [%text value] [%text value=value]
23+ [%node event children] [%node event=event children=children]
24+++ wrong-return |= x=(node-tree.first @t)
25+ ?- x
26+ [%text value] value
27+ [%node event kids] ~zod
28+++ duplicate |= x=(node-tree.first @t)
29+ ?- x
30+ [%text a] a
31+ [%text b] b
32+++ missing |= x=(node-tree.first @t)
33+ ?- x
34+ [%text a] a
35+++ shadow |= x=(node-tree.first @t)
36+ ?- x
37+ [%text x] x
38+ [%node event kids] "node"
39+++ bad-tag |= x=(node-tree.first @t)
40+ ?- x
41+ [%text value] value
42+ [%other event kids] "node"
43+++ whole-tail |= x=(node-tree.first @t)
44+ ?- x
45+ [%text value] value
46+ [%node payload] payload
47+++ unknown |= x
48+ ?- x
49+ [%text value] value
50+ [%node event kids] "node"
51+++ pending |= x=(node-tree.first @t)
52+ ?- x
53+ [%text value] [%unrelated value]
54+ [%node event kids] [%unrelated "node"]
55+++ dead |= x=(node-tree.first @t)
56+ ?- x
57+ [%text a] a
58+ [%node event kids] (event "ok")
59+ [%text b] b
60+++ wild |= x=(node-tree.first @t)
61+ ?- x
62+ [%text *] "text"
63+ [%node * *] "node"
64+++ whole-wild |= x=(node-tree.first @t)
65+ ?- x
66+ [%text value] value
67+ * "other"
68+++ foreign-children |= x=(node-tree.first @t)
69+ ^- (list (node-tree.second @t)) ?- x
70+ [%text value] ~
71+ [%node event kids] kids
72+++ wrong-argument |= x=(node-tree.first @t)
73+ ^- (list (node-tree.first @p)) ?- x
74+ [%text value] ~
75+ [%node event kids] kids
76+++ nested-child |= x=(node-tree.first @t)
77+ ?- x
78+ [%text value] value
79+ [%node event kids] ?- kids
80+ ~ "empty"
81+ [item remainder] ?- item
82+ [%text value] value
83+ [%node action rest] (action "click")
84+++ duplicate-binder |= x=(node-tree.first @t)
85+ ?- x
86+ [%text value] value
87+ [%node event event] "node"
88+++ target-shadow |= x=(node-tree.first @t)
89+ ?- x
90+ [%text value] value
91+ [%node event x] "node"
92+++ grouped |= x=(node-tree.first @t)
93+ ?- (x)
94+ [%text value] value
95+ [%node event kids] (event "click")
96+++ called |= x=(node-tree.first @t)
97+ ?- (generic-id.first x)
98+ [%text value] value
99+ [%node event kids] (event "click")
100+++ missing-context |= x=(node-tree.first @t)
101+ ^- @t ?- x
102+ [%text item] item
103+++ missing-node |= x=(node-tree.first @t)
104+ ?- x
105+ [%node action kids] (action "click")
106+++ single-wild |= x=(node-tree.first @t)
107+ ?- x
108+ * "all"
109+++ single-bind |= x=(node-tree.first @t)
110+ ?- x
111+ all all
112+++ polymorphic-source ^- (node-tree.first A) [%text value="source"]
113+++ polymorphic-match ?- polymorphic-source
114+ [%text words] words
115+++ all |= x=(node-tree.first @t)
116+ ?- x
117+ * "all"
118+++ catch-tail |= x=(node-tree.first @t)
119+ ?- x
120+ [%text value] value
121+ * "node"
122+++ catch-first-dead |= x=(node-tree.first @t)
123+ ?- x
124+ * "all"
125+ [%text value] value
126+++ late-dead |= x=(node-tree.first @t)
127+ ?- x
128+ [%text value] value
129+ [%node event kids] (event "click")
130+ * "dead"
131+++ duplicate-third |= x=(node-tree.first @t)
132+ ?- x
133+ [%text value] value
134+ [%node event kids] (event "click")
135+ [%text other] other
136+++ nominal-result |= x=(node-tree.first A)
137+ ?- x
138+ [%text value] x
139+ * x
140+++ nominal-context |= x=(node-tree.first A)
141+ ^- (node-tree.first A) ?- x
142+ [%text value] x
143+ * x
144+++ forbidden-bind |= x=(node-tree.first @t)
145+ ?- x
146+ [%text value] value
147+ rest rest
148+++ missing-again |= x=(node-tree.first @t)
149+ ?- x
150+ [%text value] value
151+++ catch-pending |= x=(node-tree.first @t)
152+ ?- x
153+ [%text value] [%unrelated value]
154+ * [%unrelated "node"]
155+++ called-all |= x=(node-tree.first @t)
156+ ?- (generic-id.first x)
157+ * "all"
158+++ called-context |= x=(node-tree.first @t)
159+ ^- @t ?- (generic-id.first x)
160+ * "all"
161+++ called-nominal |= x=(node-tree.first A)
162+ ^- (node-tree.first A) ?- (generic-id.first x)
163+ * x
164+++ called-missing |= x=(node-tree.first @t)
165+ ?- (generic-id.first x)
166+ [%text value] value
tests/type-generic-pattern/expected.txtnew file+91
@@ -0,0 +1,91 @@
1+owner describe has nominal sample and text result: ok
2+owner rebuild preserves nominal identity: ok
3+owner children preserves quantified recursive identity: ok
4+invalid owner parses and is rejected: ok
5+zero fuel declined: ok
6+one-step match: ok
7+nested match requires two steps: ok
8+same-state retry agrees: ok
9+pending tag retained: ok
10+pending hole retained: ok
11+projection evidence retained: ok
12+raw bound variable declined: ok
13+polymorphic scheme gets fresh identities: ok
14+polymorphic missing arm declined: ok
15+catch-all eligible: ok
16+whole binder stays unsupported: ok
17+whole structural tail stays unsupported: ok
18+128 arms eligible: ok
19+129 arms declined: ok
20+zero arm budget declined: ok
21+128-arm view consumes one step: ok
22+129-arm view rolls back: ok
23+hidden view stays nominally unknown: ok
24+catch-all keeps fuel and pending state: ok
25+partial inference; module not checked
26+++ describe: $-((node-tree.first @t) @t)
27+++ reverse: $-((node-tree.first @p) @p)
28+++ generic-children: $-((node-tree.first A) (list (node-tree.first A)))
29+++ alias-children: $-((alias.via @p) (list (node-tree.first @p)))
30+++ rebuild: $-((node-tree.first @t) (node-tree.first @t))
31+++ wrong-return: union branch result matching needs unsupported inference
32+++ duplicate: branch arm is covered by earlier arms
33+/tests/tree/client.jibb:31:5: covered arm
34+ [%text b] b
35+ ^
36+++ missing: missing union case [%node [event=$-(@t @t) children=(list (node-tree.first @t))]]
37+++ shadow: pattern binder shadows a name
38+++ bad-tag: branch is not supported by partial inference
39+++ whole-tail: branch is not supported by partial inference
40+++ unknown: branch is not supported by partial inference
41+++ pending: union branch result matching needs unsupported inference
42+++ dead: branch arm is covered by earlier arms
43+/tests/tree/client.jibb:59:5: covered arm
44+ [%text b] b
45+ ^
46+++ wild: $-((node-tree.first @t) @t)
47+++ whole-wild: $-((node-tree.first @t) @t)
48+++ foreign-children: union branch result constraint is not supported by partial inference
49+++ wrong-argument: union branch result constraint is not supported by partial inference
50+++ nested-child: $-((node-tree.first @t) @t)
51+++ duplicate-binder: pattern binder shadows a name
52+++ target-shadow: pattern binder shadows a name
53+++ grouped: $-((node-tree.first @t) @t)
54+++ called: $-((node-tree.first @t) @t)
55+++ missing-context: missing union case [%node [event=$-(@t @t) children=(list (node-tree.first @t))]]
56+++ missing-node: missing union case [%text value=@t]
57+++ single-wild: $-((node-tree.first @t) @t)
58+++ single-bind: branch is not supported by partial inference
59+++ polymorphic-source: (node-tree.first A)
60+++ polymorphic-match: missing union case [%node [event=$-(@t A) children=(list (node-tree.first A))]]
61+++ all: $-((node-tree.first @t) @t)
62+++ catch-tail: $-((node-tree.first @t) @t)
63+++ catch-first-dead: branch arm is covered by earlier arms
64+/tests/tree/client.jibb:125:5: covered arm
65+ [%text value] value
66+ ^
67+++ late-dead: branch arm is covered by earlier arms
68+/tests/tree/client.jibb:130:5: covered arm
69+ * "dead"
70+ ^
71+++ duplicate-third: branch arm is covered by earlier arms
72+/tests/tree/client.jibb:135:5: covered arm
73+ [%text other] other
74+ ^
75+++ nominal-result: $-((node-tree.first A) (node-tree.first A))
76+++ nominal-context: $-((node-tree.first A) (node-tree.first A))
77+++ forbidden-bind: branch is not supported by partial inference
78+++ missing-again: missing union case [%node [event=$-(@t @t) children=(list (node-tree.first @t))]]
79+++ catch-pending: union branch result matching needs unsupported inference
80+++ called-all: branch pattern is not supported by partial inference
81+++ called-context: $-((node-tree.first @t) @t)
82+++ called-nominal: $-((node-tree.first A) (node-tree.first A))
83+++ called-missing: single-case pattern needs unsupported inference
84+partial inference; module not checked
85+++ words: $-((node-tree.first @t) @t)
86+++ children: $-((node-tree.first A) (list (node-tree.first A)))
87+++ duplicate: branch arm is covered by earlier arms
88+/tests/tree/no-event.jibb:13:5: covered arm
89+ [%text b] b
90+ ^
91+++ nested-pattern: branch is not supported by partial inference
tests/type-generic-pattern/no-event.txtnew file+17
@@ -0,0 +1,17 @@
1+/= first /ui/tree
2+++ words |= x=(node-tree.first @t)
3+ ?- x
4+ [%text value] value
5+ [%node kids] "node"
6+++ children |= x=(node-tree.first A)
7+ ^- (list (node-tree.first A)) ?- x
8+ [%text value] ~
9+ [%node kids] kids
10+++ duplicate |= x=(node-tree.first @t)
11+ ?- x
12+ [%text a] a
13+ [%text b] b
14+++ nested-pattern |= x=(node-tree.first @t)
15+ ?- x
16+ [%text value] value
17+ [%node [first rest]] "node"
tests/type-generic-pattern/owner-bad.txtnew file+22
@@ -0,0 +1,22 @@
1++$ node-tree |$ [M]
2+ [%text value=@t]
3+ [%node event=$-(@t M) children=(list (node-tree M))]
4+++ text-id |= x=(node-tree @t) x
5+++ ship-id |= x=(node-tree @p) x
6+++ generic-id |= x=(node-tree A) x
7+++ describe |= x=(node-tree @t)
8+ ?- x
9+ [%text value] value
10+ [%node event kids] (event "click")
11+++ children |= x=(node-tree A)
12+ ^- (list (node-tree A)) ?- x
13+ [%text value] ~
14+ [%node event kids] kids
15+++ rebuild |= x=(node-tree @t)
16+ ^- (node-tree @t) ?- x
17+ [%text value] [%text value=value]
18+ [%node event kids] [%node event=event children=kids]
19+++ wrong |= x=(node-tree @t)
20+ ?- x
21+ [%text value] value
22+ [%node event event] "bad"
tests/type-generic-pattern/owner.txtnew file+18
@@ -0,0 +1,18 @@
1++$ node-tree |$ [M]
2+ [%text value=@t]
3+ [%node event=$-(@t M) children=(list (node-tree M))]
4+++ text-id |= x=(node-tree @t) x
5+++ ship-id |= x=(node-tree @p) x
6+++ generic-id |= x=(node-tree A) x
7+++ describe |= x=(node-tree @t)
8+ ?- x
9+ [%text value] value
10+ [%node event kids] (event "click")
11+++ children |= x=(node-tree A)
12+ ^- (list (node-tree A)) ?- x
13+ [%text value] ~
14+ [%node event kids] kids
15+++ rebuild |= x=(node-tree @t)
16+ ^- (node-tree @t) ?- x
17+ [%text value] [%text value=value]
18+ [%node event kids] [%node event=event children=kids]
tests/type-generic-pattern/poly-values.txtnew file+2
@@ -0,0 +1,2 @@
1+++ missing ?- x
2+ [%text value] value
tests/type-generic-pattern/values.txtnew file+18
@@ -0,0 +1,18 @@
1+++ simple ?- x
2+ [%text value] value
3+ [%node event kids] (event "click")
4+++ nested ?- x
5+ [%text value] value
6+ [%node event kids] ?- kids
7+ ~ "empty"
8+ [item remainder] ?- item
9+ [%text value] value
10+ [%node action rest] (action "click")
11+++ fallback ?- x
12+ [%text value] value
13+ * "node"
14+++ whole-bind ?- x
15+ other other
16+++ whole-tail ?- x
17+ [%node payload] "node"
18+ * "other"
tests/type-generic-recursion/about.txtnew file+14
@@ -0,0 +1,14 @@
1+source: docs/spec/grammar.md:57,135,162 — “Molds may be recursive”; “recursive molds go by name and module”; a number defaults when its `++` is checked.
2+
3+This shared eval and ship fixture checks a deliberately narrow source-backed
4+recursive identity: two distinct tagged cases, a text leaf and a node with a
5+message-producing gate and a list of recursive children. The test-only tree is
6+not the UI `element` representation. A complete import-free owner module must
7+check before its interface is published. Same-origin aliases retain identity,
8+while different origins, unproved casts and broader matching remain unsupported.
9+A wrong-aura constructor fails the complete owner check. An opaque recursive type prevents premature numeric defaulting;
10+its gate-freedom remains unknown. Source/cache/prelude changes, cycles,
11+nonuniform recursion, invalid unused molds and local shadows fail closed.
12+
13+The client report explicitly remains partial. No runtime layout, program kind,
14+watchability or backend behavior is claimed.
tests/type-generic-recursion/alias.txtnew file+3
@@ -0,0 +1,3 @@
1+/= source /ui/tree
2++$ alias |$ [A] (node-tree.source A)
3+++ identity |= x=(alias A) x
tests/type-generic-recursion/bad-constructor.txtnew file+8
@@ -0,0 +1,8 @@
1++$ node-tree |$ [M]
2+ [%text value=@t]
3+ [%node event=$-(@t M) children=(list (node-tree M))]
4+++ text-id |= x=(node-tree @t) x
5+++ ship-id |= x=(node-tree @p) x
6+++ generic-id |= x=(node-tree A) x
7+
8+++ construct ^- (node-tree @t) [%text value=~zod]
tests/type-generic-recursion/bad-match.txtnew file+10
@@ -0,0 +1,10 @@
1++$ node-tree |$ [M]
2+ [%text value=@t]
3+ [%node event=$-(@t M) children=(list (node-tree M))]
4+++ text-id |= x=(node-tree @t) x
5+++ ship-id |= x=(node-tree @p) x
6+++ generic-id |= x=(node-tree A) x
7+++ match |= x=(node-tree @t)
8+ ?- x
9+ [%text value] value
10+ [%node event event] "node"
tests/type-generic-recursion/bad-mold.txtnew file+8
@@ -0,0 +1,8 @@
1++$ node-tree |$ [M]
2+ [%text value=@t]
3+ [%node event=$-(@t M) children=(list (node-tree M))]
4+++ text-id |= x=(node-tree @t) x
5+++ ship-id |= x=(node-tree @p) x
6+++ generic-id |= x=(node-tree A) x
7+
8++$ unused _
tests/type-generic-recursion/bad-parameter.txtnew file+6
@@ -0,0 +1,6 @@
1++$ node-tree |$ [M]
2+ [%text value=@t]
3+ [%node event=$-(@t M) children=(list (node-tree @t))]
4+++ text-id |= x=(node-tree @t) x
5+++ ship-id |= x=(node-tree @p) x
6+++ generic-id |= x=(node-tree A) x
tests/type-generic-recursion/chain.txtnew file+3
@@ -0,0 +1,3 @@
1++$ chain |$ [A]
2+ ~
3+ [i=A t=(chain A)]
tests/type-generic-recursion/client.txtnew file+11
@@ -0,0 +1,11 @@
1+/= first /ui/tree
2+/= again /ui/tree
3+/= second /ui/tree-two
4+/= via /ui/tree-alias
5+++ from-first |= x=(node-tree.first @t) x
6+++ from-again |= x=(node-tree.again @p) x
7+++ same-origin |= x=(node-tree.first @t) ^- (node-tree.again @t) x
8+++ from-alias |= x=(alias.via @t) x
9+++ through-alias |= x=(node-tree.first @t) ^- (alias.via @t) x
10+++ different-origin |= x=(node-tree.first @t) ^- (node-tree.second @t) x
11+++ independent |= [a=(node-tree.first @t) b=(node-tree.first @p)] [(generic-id.first a) (generic-id.first b)]
tests/type-generic-recursion/expected.txtnew file+35
@@ -0,0 +1,35 @@
1+source module complete: ok
2+generic mold quantified: ok
3+distinct arguments decline: ok
4+distinct origins decline: ok
5+occurs check: ok
6+cell construction stays opaque: ok
7+noun construction stays opaque: ok
8+unindexed recursion declined: ok
9+alteration rejects missing line: ok
10+alteration rejects repeated line: ok
11+gate freedom unknown: ok
12+gate defaulting conservative: ok
13+unused mold hole declined: ok
14+invalid constructor declined: ok
15+invalid matching declined: ok
16+nonuniform recursion declined: ok
17+identical local shadow declined: ok
18+different local shadow declined: ok
19+local recursion declined: ok
20+unreserved local list shadow declined: ok
21+altered prelude list declined: ok
22+cached source reuse: ok
23+changed source invalidates cache: ok
24+changed source fresh proof: ok
25+duplicate source declined: ok
26+active import cycle declined: ok
27+changed prelude invalidates cache: ok
28+partial inference; module not checked
29+++ from-first: $-((node-tree.first @t) (node-tree.first @t))
30+++ from-again: $-((node-tree.again @p) (node-tree.again @p))
31+++ same-origin: $-((node-tree.first @t) (node-tree.again @t))
32+++ from-alias: $-((alias.via @t) (alias.via @t))
33+++ through-alias: $-((node-tree.first @t) (alias.via @t))
34+++ different-origin: cast constraint is not supported by partial inference
35+++ independent: $-([a=(node-tree.first @t) b=(node-tree.first @p)] [(node-tree.first @t) (node-tree.first @p)])
tests/type-generic-recursion/list-shadow.txtnew file+4
@@ -0,0 +1,4 @@
1++$ list |$ [M] [%fake value=M]
2++$ node-tree |$ [M]
3+ [%text value=@t]
4+ [%node children=(list (node-tree M))]
tests/type-generic-recursion/local-distinct.txtnew file+11
@@ -0,0 +1,11 @@
1++$ node-tree |$ [M]
2+ [%text value=@t]
3+ [%node event=$-(@t M) children=(list (node-tree M))]
4+++ text-id |= x=(node-tree @t) x
5+++ ship-id |= x=(node-tree @p) x
6+++ generic-id |= x=(node-tree A) x
7+++ shadow |= x=@t
8+ +$ node-tree |$ [M]
9+ [%different value=@t]
10+ [%node event=$-(@t M) children=(list (node-tree M))]
11+ x
tests/type-generic-recursion/local-only.txtnew file+11
@@ -0,0 +1,11 @@
1++$ node-tree |$ [M]
2+ [%text value=@t]
3+ [%node event=$-(@t M) children=(list (node-tree M))]
4+++ text-id |= x=(node-tree @t) x
5+++ ship-id |= x=(node-tree @p) x
6+++ generic-id |= x=(node-tree A) x
7+++ local-only |= x=@t
8+ +$ local-tree |$ [M]
9+ [%text value=@t]
10+ [%node event=$-(@t M) children=(list (local-tree M))]
11+ x
tests/type-generic-recursion/local-shadow.txtnew file+11
@@ -0,0 +1,11 @@
1++$ node-tree |$ [M]
2+ [%text value=@t]
3+ [%node event=$-(@t M) children=(list (node-tree M))]
4+++ text-id |= x=(node-tree @t) x
5+++ ship-id |= x=(node-tree @p) x
6+++ generic-id |= x=(node-tree A) x
7+++ shadow |= x=@t
8+ +$ node-tree |$ [M]
9+ [%text value=@t]
10+ [%node event=$-(@t M) children=(list (node-tree M))]
11+ x
tests/type-generic-recursion/tree-changed.txtnew file+6
@@ -0,0 +1,6 @@
1++$ node-tree |$ [M]
2+ [%text value=@t]
3+ [%branch event=$-(@t M) children=(list (node-tree M))]
4+++ text-id |= x=(node-tree @t) x
5+++ ship-id |= x=(node-tree @p) x
6+++ generic-id |= x=(node-tree A) x
tests/type-generic-recursion/tree.txtnew file+6
@@ -0,0 +1,6 @@
1++$ node-tree |$ [M]
2+ [%text value=@t]
3+ [%node event=$-(@t M) children=(list (node-tree M))]
4+++ text-id |= x=(node-tree @t) x
5+++ ship-id |= x=(node-tree @p) x
6+++ generic-id |= x=(node-tree A) x
tests/type-import-overlap/about.txtnew file+24
@@ -0,0 +1,24 @@
1+Source-aware Hoon `$?` cases are independently evaluated before the reader
2+proves a shared runtime noun or a disjoint pair of literal outer tags. The
3+positive overlap witness checks supported projected atoms, cells, faces and
4+forks across the original cases. It compares singleton noun values regardless
5+of aura. Some overlap shapes remain unsupported.
6+
7+The mixed-aura zero and nonzero controls prove actual overlap. Boolean tails
8+share loobean nouns, and `~` is the null singleton, which overlaps `@t`; unequal,
9+opaque and other unproven payloads remain unsupported. The structured diagnostic
10+bridge reports a definite overlap at the Jibb use site, while the disjoint
11+case infers and an unresolved case stays unsupported. The Hoon source case
12+locations are unavailable in this fixture and are not claimed. This is a
13+partial report and does not prove the whole module was checked. This named
14+reader proof is not a mark-reader overlap diagnostic.
15+
16+The existing 4,096 source-proof fuel limits dependency-spec visits. Chapter
17+lookup, Hoon play, type projection, parsing and all other work are outside
18+that limit. Unknown or exhausted source proof stays unsupported.
19+
20+The added `$?` source screen caps the total raw noun nodes at 4,096 and
21+the case count at 128 before checking tags. The shared guard exercises exact
22+and exceeded budgets, deep and wide inputs, nested union forms, and unknown
23+source cases. These limits do not meter atom sizes, chapter lookup, Hoon play,
24+reader projection or other work. The pre-existing `$%` path is unchanged.
tests/type-import-overlap/expected.txtnew file+26
@@ -0,0 +1,26 @@
1+mixed-zero: invalid/overlap: Hoon union cases overlap
2+nonzero: invalid/overlap: Hoon union cases overlap
3+unequal-singletons: unsupported: a Hoon union needs a source-level disjointness check
4+swapped: invalid/overlap: Hoon union cases overlap
5+separate-tags: (union [left [ @t]] [right [(union @f:0 @f:1) @t]])
6+separate-terms: (union [left [ @t]] [right [yes @t]])
7+different-value: unsupported: a Hoon union needs a source-level disjointness check
8+different-tail: unsupported: a Hoon union needs a source-level disjointness check
9+unknown-middle: unsupported: a Hoon union needs a source-level disjointness check
10+unsupported-gate: unsupported: a Hoon union needs a source-level disjointness check
11+dollar-percent: (union [left [ @t]] [right [yes @t]])
12+identical: invalid/overlap: Hoon union cases overlap
13+cross-zero: invalid/overlap: Hoon union cases overlap
14+boolean-tail: invalid/overlap: Hoon union cases overlap
15+empty-tail: invalid/overlap: Hoon union cases overlap
16+bounded source screen controls passed
17+mismatched-selected: error: Hoon module provenance does not match the selected mold
18+missing: error: Hoon mold `missing` is not declared
19+bare-zuse: error: Hoon module provenance is unavailable
20+partial inference; module not checked
21+++ overlap: Hoon union cases overlap
22+/ui/test.jibb:2:17: invalid imported mold
23+++ overlap |= x=mixed-zero.fixture x
24+ ^
25+++ disjoint: $-(([%left [%$ @t]] [%right [? @t]]) ([%left [%$ @t]] [%right [? @t]]))
26+++ unknown: sample mold is not supported by partial inference
tests/type-import-overlap/source.txtnew file+4
@@ -0,0 +1,4 @@
1+/- fixture
2+++ overlap |= x=mixed-zero.fixture x
3+++ disjoint |= x=separate-tags.fixture x
4+++ unknown |= x=unknown-middle.fixture x
tests/type-import-overlap/sur.txtnew file+17
@@ -0,0 +1,17 @@
1+|%
2++$ mixed-zero $?([%tag %$ @t] [%tag ? @t])
3++$ nonzero $?([%tag %.n @t] [%tag ? @t])
4++$ unequal-singletons $?([%tag %.n @t] [%tag %$ @t])
5++$ swapped $?([%tag ? @t] [%tag %$ @t])
6++$ separate-tags $?([%left %$ @t] [%right ? @t])
7++$ separate-terms $?([%left %$ @t] [%right %yes @t])
8++$ different-value $?([%tag %yes @t] [%tag ? @t])
9++$ different-tail $?([%tag %$ @t] [%tag ? @p])
10++$ unknown-middle $?([%tag * @t] [%tag ? @t])
11++$ unsupported-gate $?([%tag %$ @t] [%tag ? $-(@t @t)])
12++$ dollar-percent $%([%left %$ @t] [%right %yes @t])
13++$ identical $?([%tag %$ @t] [%tag %$ @t])
14++$ cross-zero $?([%tag %.y @t] [%tag %$ @t])
15++$ boolean-tail $?([%tag %$ ?] [%tag ? ?])
16++$ empty-tail $?([%tag %$ ~] [%tag ? @t])
17+--
tests/type-import-structural/about.txtnew file+14
@@ -0,0 +1,14 @@
1+The actual Hoon source includes local aliases, nested cells, equal and unequal
2+singleton nouns, open auras and three-/four-case unions. The reader reports a
3+definite overlap only when its bounded structural witness finds a shared noun;
4+otherwise ordinary source-aware disjointness checks can still recover a union,
5+or the outcome remains unsupported. The checker report is partial and points
6+to the Jibb mold use; source-case positions are unavailable here.
7+
8+Low-level controls exercise void at the root and in a cell, opaque references
9+and applications, named and faced nodes, nested alternatives, source/tag
10+mismatches and source, pair and type-node fuel. The attempted Hoon source form
11+`+$ never !!` did not compile, so the void controls use an actual `%void`
12+reader node and do not claim a source-level empty mold. The positive proof
13+only bounds specific traversals; Hoon play, projection, chapter lookup, atom
14+byte sizes and the preexisting whole-graph checks are outside those budgets.
tests/type-import-structural/expected.txtnew file+41
@@ -0,0 +1,41 @@
1+same-alias: invalid/overlap: Hoon union cases overlap
2+separate-alias: (union [tag [one @t]] [tag [two @t]])
3+deep-match: invalid/overlap: Hoon union cases overlap
4+deep-distinct: (union [tag [[inner [one three]] @t]] [tag [[inner [two three]] @t]])
5+tail-distinct: unsupported: a Hoon union needs a source-level disjointness check
6+later-overlap: invalid/overlap: Hoon union cases overlap
7+many-safe: (union [tag [one @t]] [tag [two @t]] [tag [three @t]])
8+open-atoms: invalid/overlap: Hoon union cases overlap
9+different-aura: unsupported: Hoon union disjointness could not be verified
10+same literal: ok
11+different literals: ok
12+named expands: ok
13+opaque declines: ok
14+opaque versus noun: ok
15+unknown aura: ok
16+open admits zero: ok
17+different tail: ok
18+nested face: ok
19+fork later case: ok
20+empty fuel: ok
21+cell needs both: ok
22+later pair: ok
23+pair fuel: ok
24+void: ok
25+void position: ok
26+opaque apply: ok
27+source node fuel: ok
28+source case cap: ok
29+wrong projected head: ok
30+wrong case count: ok
31+partial inference; module not checked
32+++ overlap: Hoon union cases overlap
33+/ui/structural.jibb:2:20: invalid imported mold
34+++ overlap |= x=deep-match.fixture x
35+ ^
36+++ distinct: $-(([%tag [%one @t]] [%tag [%two @t]]) ([%tag [%one @t]] [%tag [%two @t]]))
37+++ unknown: sample mold is not supported by partial inference
38+++ multi: Hoon union cases overlap
39+/ui/structural.jibb:5:18: invalid imported mold
40+++ multi |= x=later-overlap.fixture x
41+ ^
tests/type-import-structural/source.txtnew file+5
@@ -0,0 +1,5 @@
1+/- fixture
2+++ overlap |= x=deep-match.fixture x
3+++ distinct |= x=separate-alias.fixture x
4+++ unknown |= x=different-aura.fixture x
5+++ multi |= x=later-overlap.fixture x
tests/type-import-structural/sur.txtnew file+12
@@ -0,0 +1,12 @@
1+|%
2++$ scalar ?(%$ %one)
3++$ same-alias $?([%tag scalar @t] [%tag %$ @t])
4++$ separate-alias $?([%tag %one @t] [%tag %two @t])
5++$ deep-match $?([%tag [%inner [%.y %three]] @t] [%tag [%inner [%$ %three]] @t])
6++$ deep-distinct $?([%tag [%inner [%one %three]] @t] [%tag [%inner [%two %three]] @t])
7++$ tail-distinct $?([%tag %$ %one] [%tag %.y %two])
8++$ later-overlap $?([%x %one @t] [%y %one @t] [%tag %.y @t] [%tag %$ @t])
9++$ many-safe $?([%tag %one @t] [%tag %two @t] [%tag %three @t])
10++$ open-atoms $?([%tag @t @ud] [%tag @tas @t])
11++$ different-aura $?([%tag @p @t] [%tag @t @t])
12+--
tests/type-import/about.txt+10−2
@@ -22,8 +22,16 @@ Jibb-written collection molds remain unsupported.
22A self-recursive /sur mold is an opaque module/name identity. Distinct names
22A self-recursive /sur mold is an opaque module/name identity. Distinct names
23or modules conflict; aliases, foreign references, unfolding and out-of-scope
23or modules conflict; aliases, foreign references, unfolding and out-of-scope
24names remain unsupported. The fixture checks these limits as well as malformed
24names remain unsupported. The fixture checks these limits as well as malformed
25−references and overlapping recursive graphs. The reader itself rejects an
25+references and overlapping recursive graphs. The reader rejects the overlapping
26−overlapping source union before Hoon can collapse it. A missing import and a
26+source union instead of publishing a collapsed result. A missing import and a
27duplicate supplied mold fail closed. The types output is partial and does not
27duplicate supplied mold fail closed. The types output is partial and does not
28claim that the module was checked. The same fixture runs under urbit eval and
28claim that the module was checked. The same fixture runs under urbit eval and
29through -test on the fake ship.
29through -test on the fake ship.
30+
31+The real-reader mixed-zero case places `%$` and `?` under the same outer tag;
32+both allow the noun zero, so the reader reports definite overlap. The distinct-tag
33+`%$`/`?` case and distinct-tag term singletons are successful reader/checker
34+controls. The reader also reports definite overlap for the collapsed source
35+whose two cases are both `[%x @ud]`. The overlap error points at the Jibb use site; the Hoon source case
36+positions are not available in this fixture. These are source-aware
37+reads and the checker report remains partial.
tests/type-import/expected.txt+10−1
@@ -104,7 +104,16 @@ partial inference; module not checked
104++ flag-extra: sample mold is not supported by partial inference
104++ flag-extra: sample mold is not supported by partial inference
105++ flag-faced: sample mold is not supported by partial inference
105++ flag-faced: sample mold is not supported by partial inference
106++ flag-malformed: sample mold is not supported by partial inference
106++ flag-malformed: sample mold is not supported by partial inference
107+++ mixed-zero: Hoon union cases overlap
108+/test.jibb:81:20: invalid imported mold
109+++ mixed-zero |= x=mixed-zero.fixture x
110+ ^
111+++ separate-tags: $-(([%left [%$ @t]] [%right [? @t]]) ([%left [%$ @t]] [%right [? @t]]))
112+++ separate-terms: $-(([%left [%$ @t]] [%right [%yes @t]]) ([%left [%$ @t]] [%right [%yes @t]]))
107−reader-collapsed: error: Hoon union disjointness could not be verified
113+reader-collapsed: error: Hoon union cases overlap
114+reader-mixed-zero: error: Hoon union cases overlap
115+reader-separate-tags: (union [left [ @t]] [right [(union @f:0 @f:1) @t]])
116+reader-separate-terms: (union [left [ @t]] [right [yes @t]])
108partial inference; module not checked
117partial inference; module not checked
109++ use: recursive mold name is not available in this scope
118++ use: recursive mold name is not available in this scope
110partial inference; module not checked
119partial inference; module not checked
tests/type-import/source.txt+5
@@ -76,3 +76,8 @@
76++ flag-extra |= x=flag-extra.fixture x
76++ flag-extra |= x=flag-extra.fixture x
77++ flag-faced |= x=flag-faced.fixture x
77++ flag-faced |= x=flag-faced.fixture x
78++ flag-malformed |= x=flag-malformed.fixture x
78++ flag-malformed |= x=flag-malformed.fixture x
79+
80+:: Real source-aware nested mixed-aura cases.
81+++ mixed-zero |= x=mixed-zero.fixture x
82+++ separate-tags |= x=separate-tags.fixture x
83+++ separate-terms |= x=separate-terms.fixture x
tests/type-import/sur.txt+3
@@ -21,4 +21,7 @@
21+$ zero-choice $@(~ [text=@t n=@ud])
21+$ zero-choice $@(~ [text=@t n=@ud])
22+$ zero-nested [entry=zero-choice code=@ud]
22+$ zero-nested [entry=zero-choice code=@ud]
23+$ zero-lookalike $@(~ [~ @t])
23+$ zero-lookalike $@(~ [~ @t])
24++$ mixed-zero $?([%tag %$ @t] [%tag ? @t])
25++$ separate-tags $?([%left %$ @t] [%right ? @t])
26++$ separate-terms $?([%left %$ @t] [%right %yes @t])
24--
27--
tests/type-list-alias/expected.txt+4−4
@@ -1,6 +1,6 @@
1canonical
1canonical
2partial inference; module not checked
2partial inference; module not checked
3−++ text: $-((list @t) (list @t))
3+++ text-value: $-((list @t) (list @t))
4++ ship: $-((list @p) (list @p))
4++ ship: $-((list @p) (list @p))
5++ wrong: list item does not fit its expected type
5++ wrong: list item does not fit its expected type
6/ui/test.jibb:3:13: expected item has type @t
6/ui/test.jibb:3:13: expected item has type @t
@@ -12,13 +12,13 @@ partial inference; module not checked
12++ shadow: local molds shadow a name
12++ shadow: local molds shadow a name
13altered
13altered
14partial inference; module not checked
14partial inference; module not checked
15−++ text: sample mold is not supported by partial inference
15+++ text-value: sample mold is not supported by partial inference
16++ ship: sample mold is not supported by partial inference
16++ ship: sample mold is not supported by partial inference
17++ wrong: cast mold is not supported by partial inference
17++ wrong: cast mold is not supported by partial inference
18++ shadow: sample mold is not supported by partial inference
18++ shadow: sample mold is not supported by partial inference
19omitted
19omitted
20partial inference; module not checked
20partial inference; module not checked
21−++ text: sample mold is not supported by partial inference
21+++ text-value: sample mold is not supported by partial inference
22++ ship: sample mold is not supported by partial inference
22++ ship: sample mold is not supported by partial inference
23++ wrong: cast mold is not supported by partial inference
23++ wrong: cast mold is not supported by partial inference
24++ shadow: sample mold is not supported by partial inference
24++ shadow: sample mold is not supported by partial inference
@@ -30,7 +30,7 @@ partial inference; module not checked
30prelude source does not parse; module import inference unsupported
30prelude source does not parse; module import inference unsupported
31cyclic
31cyclic
32partial inference; module not checked
32partial inference; module not checked
33−++ text: sample mold is not supported by partial inference
33+++ text-value: sample mold is not supported by partial inference
34++ ship: sample mold is not supported by partial inference
34++ ship: sample mold is not supported by partial inference
35++ wrong: cast mold is not supported by partial inference
35++ wrong: cast mold is not supported by partial inference
36++ shadow: local molds shadow a name
36++ shadow: local molds shadow a name
tests/type-page-main/about.txtnew file+3
@@ -0,0 +1,3 @@
1+source: my-app/ui/about.jibb, my-app/ui/blog/index.jibb and my-app/ui/index.jibb; their fixtures and real API/UI/reader sources must remain byte-identical.
2+tests: Shared eval and ship full checks for static and direct data pages, exact closed main types, a direct-constructor reply, structural downstream imports, and rejection of wrong/arbitrary mains, page aliases, indirect, pure, hand-built, typed and diff loads, missing evidence and store paths. No rendering or runtime request execution is claimed.
3+expect: shared eval and ship guards
tests/type-page-main/arbitrary-main.txtnew file+1
@@ -0,0 +1 @@
1+++ main 42
tests/type-page-main/blog-api.txtnew file+5
@@ -0,0 +1,5 @@
1+:: Fixture for the documented examples; not supplied by the design doc.
2+/% %posts
3+
4++$ paths
5+ [%posts /posts posts]
tests/type-page-main/blog-index.txtnew file+9
@@ -0,0 +1,9 @@
1+/- blog
2+/= api /ui/api/blog
3+/= card /ui/components/card
4+
5+++ main (page load view)
6+++ load |=(~ (posts.api same))
7+
8+++ view |= ps=(list post.blog)
9+ column ~[gap+%s2] (turn ps card.card)
tests/type-page-main/blog-sur.txtnew file+6
@@ -0,0 +1,6 @@
1+:: Fixture for the documented examples; not supplied by the design doc.
2+|%
3++$ title @t
4++$ post [title=title slug=@ta]
5++$ chain $@(~ [value=@ud next=chain])
6+--
tests/type-page-main/card.txtnew file+5
@@ -0,0 +1,5 @@
1+:: Fixture for the documented examples; not supplied by the design doc.
2+/- blog
3+
4+++ card |= p=post.blog
5+ text title.p
tests/type-page-main/ctor-page.txtnew file+10
@@ -0,0 +1,10 @@
1+/= todo /ui/api/todo
2+
3++$ msg
4+ [%got todos=(list item.todo)]
5+++ main (page load view)
6+++ load |= ~
7+ ^- (ask msg) (todos.todo |=%got)
8+
9+++ view |= m=msg
10+ text "Todos loaded"
tests/type-page-main/diff-load.txtnew file+11
@@ -0,0 +1,11 @@
1+/= todo /ui/api/todo
2+/= todo-list /ui/todo-list
3+
4+++ main (page load view)
5+++ fold |= [d=[%todo-update todo-update.todo] s=todos.todo] s
6+++ load |=(~ (changes.todo same fold))
7+
8+++ view |= ts=(list item.todo)
9+ column ~[pad+%s3] ~[
10+ heading 1 "My ship"
11+ island main.todo-list ts
tests/type-page-main/hand-built-load.txtnew file+14
@@ -0,0 +1,14 @@
1+/= todo /ui/api/todo
2+/= todo-list /ui/todo-list
3+
4+++ main (page load view)
5+++ load |=(~
6+ ^- (ask (list item.todo))
7+ [%agent api="/ui/api/todo" case=%todos agent=%todo path=~[%todos] scry=~ receive=receive])
8+++ receive |= input=[mark=@tas state=(unit *) fact=*]
9+ ^- [state=* message=(list item.todo)] [state=0 message=~]
10+
11+++ view |= ts=(list item.todo)
12+ column ~[pad+%s3] ~[
13+ heading 1 "My ship"
14+ island main.todo-list ts
tests/type-page-main/index.txtnew file+10
@@ -0,0 +1,10 @@
1+/= todo /ui/api/todo
2+/= todo-list /ui/todo-list
3+
4+++ main (page load view)
5+++ load |=(~ (todos.todo same))
6+
7+++ view |= ts=(list item.todo)
8+ column ~[pad+%s3] ~[
9+ heading 1 "My ship"
10+ island main.todo-list ts
tests/type-page-main/indirect-load.txtnew file+11
@@ -0,0 +1,11 @@
1+/= todo /ui/api/todo
2+/= todo-list /ui/todo-list
3+
4+++ main (page load view)
5+++ request |=(~ (todos.todo same))
6+++ load |=(~ (request ~))
7+
8+++ view |= ts=(list item.todo)
9+ column ~[pad+%s3] ~[
10+ heading 1 "My ship"
11+ island main.todo-list ts
tests/type-page-main/page-alias.txtnew file+11
@@ -0,0 +1,11 @@
1+/= todo /ui/api/todo
2+/= todo-list /ui/todo-list
3+
4+++ make-page page
5+++ main (make-page load view)
6+++ load |=(~ (todos.todo same))
7+
8+++ view |= ts=(list item.todo)
9+ column ~[pad+%s3] ~[
10+ heading 1 "My ship"
11+ island main.todo-list ts
tests/type-page-main/posts-mark.txtnew file+6
@@ -0,0 +1,6 @@
1+:: Fixture for the documented examples; not supplied by the design doc.
2+|_ a=(list post:blog)
3+++ grab |% ++ noun (list post:blog) --
4+++ grow |% ++ noun a --
5+++ grad %noun
6+--
tests/type-page-main/pure-load.txtnew file+10
@@ -0,0 +1,10 @@
1+/= todo /ui/api/todo
2+/= todo-list /ui/todo-list
3+
4+++ main (page load view)
5+++ load |=(~ (pure ~))
6+
7+++ view |= ts=(list item.todo)
8+ column ~[pad+%s3] ~[
9+ heading 1 "My ship"
10+ island main.todo-list ts
tests/type-page-main/static.txtnew file+7
@@ -0,0 +1,7 @@
1+++ main view
2+
3+++ view
4+ column ~[width+[%fill 1] pad+%s3 gap+%s2] ~[
5+ heading 1 "About this ship"
6+ para ~[(text "Hosted on Urbit. This page ships no JavaScript.")]
7+ el ~[tone+%accent] (link %/blog "Read the blog")
tests/type-page-main/todo-api.txtnew file+13
@@ -0,0 +1,13 @@
1+:: /ui/api/todo.jibb
2+/- todo
3+/% %todo-action
4+/% %todos
5+/% %todo-update
6+/% %todo-item
7+
8++$ item item.todo
9++$ poke todo-action
10++$ paths
11+ [%todos /todos todos]
12+ [%changes /changes (facts todos todo-update)]
13+ [%todo-by-id /todo/[id=@ud] todo-item]
tests/type-page-main/todo-island.txtnew file+40
@@ -0,0 +1,40 @@
1+/= todo /ui/api/todo
2+
3+++ main (program init update view subs)
4+
5++$ model [todos=(list item.todo) draft=@t error=(unit @t)]
6++$ msg
7+ [%typed text=@t]
8+ %submit
9+ [%toggled id=@ud]
10+ [%got todos=(list item.todo)]
11+ [%acked err=(unit @t)]
12+
13+++ init |= ts=(list item.todo)
14+ [ts "" ~]
15+
16+++ update |= [=msg m=model]
17+ ?- msg
18+ [%typed t]
19+ ?- (gth (lent (tuba (trip t))) 80)
20+ %.y [m(draft=t error=`"Too long") ~]
21+ %.n [m(draft=t error=~) ~]
22+ %submit [m(draft="") ~[[%poke (todo-action.todo [%add draft.m]) |=%acked]]]
23+ [%toggled id] [m ~[[%poke (todo-action.todo [%toggle id]) |=%acked]]]
24+ [%got ts] [m(todos=ts) ~]
25+ [%acked err] [m(error=err) ~]
26+
27+++ subs |= m=model
28+ ~[[%watch (todos.todo |=%got)]]
29+
30+++ view |= m=model
31+ column ~[gap+%s2] ~[
32+ heading 2 "Todos"
33+ each (turn todos.m row-of)
34+ row ~[gap+%s1] ~[
35+ el ~[width+[%fill 1]] (field "New todo" draft.m |=%typed)
36+ button "Add" %submit
37+ el ~[tone+%danger] (text (fall error.m ""))
38+
39+++ row-of |= t=item.todo
40+ [id.t (toggle done.t text.t [%toggled id.t])]
tests/type-page-main/typed-load.txtnew file+8
@@ -0,0 +1,8 @@
1+/= todo /ui/api/todo
2+/= todo-list /ui/todo-list
3+
4+++ main (page load view)
5+++ load |=(~ (todo-by-id.todo 1 |=%one))
6+
7+++ view |= item=todo-item.todo
8+ text "One todo"
tests/type-page-main/wrong-static.txtnew file+1
@@ -0,0 +1 @@
1+++ main (button "Go" %go)
tests/type-program-main/about.txtnew file+1
@@ -0,0 +1 @@
1+tests: A direct four-wing program main uses the ordinary source-backed program fit. Its init data and model are closed and gate-free within the shared 256-node budget, and subs syntactically returns null through transparent forms. The fixture checks exported and downstream imported types, source evidence, structured and legacy adapters, and fail-closed controls. It does not execute a program or establish runtime watchability.
tests/type-program-main/alias-main.txtnew file+11
@@ -0,0 +1,11 @@
1++$ message
2+ %start
3+ %stop
4++$ model [count=@ud]
5+++ main (program-alias init update view subs)
6+++ init |= input=@t ^- model [count=0]
7+++ update |= [msg=message state=model]
8+ ^- [model (list (cmd message))] [state ~]
9+++ view |= state=model ^- (element message) (text "view")
10+++ subs |= state=model ^- (list (sub message)) ~
11+++ program-alias program
tests/type-program-main/arbitrary-main.txtnew file+10
@@ -0,0 +1,10 @@
1++$ message
2+ %start
3+ %stop
4++$ model [count=@ud]
5+++ main init
6+++ init |= input=@t ^- model [count=0]
7+++ update |= [msg=message state=model]
8+ ^- [model (list (cmd message))] [state ~]
9+++ view |= state=model ^- (element message) (text "view")
10+++ subs |= state=model ^- (list (sub message)) ~
tests/type-program-main/consumer.txtnew file+2
@@ -0,0 +1,2 @@
1+/= island-prog /tests/program-main/island
2+++ imported init.main.island-prog
tests/type-program-main/gate-data.txtnew file+10
@@ -0,0 +1,10 @@
1++$ message
2+ %start
3+ %stop
4++$ model [count=@ud]
5+++ main (program init update view subs)
6+++ init |= input=$-(@t @t) ^- model [count=0]
7+++ update |= [msg=message state=model]
8+ ^- [model (list (cmd message))] [state ~]
9+++ view |= state=model ^- (element message) (text "view")
10+++ subs |= state=model ^- (list (sub message)) ~
tests/type-program-main/gate-model.txtnew file+11
@@ -0,0 +1,11 @@
1++$ message
2+ %start
3+ %stop
4++$ model [count=@ud callback=$-(@t @t)]
5+++ main (program init update view subs)
6+++ init |= input=@t ^- model [count=0 callback=echo]
7+++ update |= [msg=message state=model]
8+ ^- [model (list (cmd message))] [state ~]
9+++ view |= state=model ^- (element message) (text "view")
10+++ subs |= state=model ^- (list (sub message)) ~
11+++ echo |= input=@t input
tests/type-program-main/initializer-consumer.txtnew file+2
@@ -0,0 +1,2 @@
1+/= island-prog /tests/program-main/initializer
2+++ imported init.main.island-prog
tests/type-program-main/initializer-earlier.txtnew file+10
@@ -0,0 +1,10 @@
1++$ model [xs=(list @t) draft=@t error=(unit @t)]
2++$ message
3+ %start
4+ %stop
5+++ main (program init update view subs)
6+++ init |= ts=(list @t) [ts ~zod ~]
7+++ update |= [msg=message state=model]
8+ ^- [model (list (cmd message))] [state ~]
9+++ view |= state=model ^- (element message) (text "view")
10+++ subs |= state=model ^- (list (sub message)) ~
tests/type-program-main/initializer-error.txtnew file+10
@@ -0,0 +1,10 @@
1++$ model [xs=(list @t) draft=@t error=@t]
2++$ message
3+ %start
4+ %stop
5+++ main (program init update view subs)
6+++ init |= ts=(list @t) [ts "" ~]
7+++ update |= [msg=message state=model]
8+ ^- [model (list (cmd message))] [state ~]
9+++ view |= state=model ^- (element message) (text "view")
10+++ subs |= state=model ^- (list (sub message)) ~
tests/type-program-main/initializer-generic.txtnew file+10
@@ -0,0 +1,10 @@
1++$ model [xs=(list @t) draft=@t error=(unit @t)]
2++$ message
3+ %start
4+ %stop
5+++ main (program init update view subs)
6+++ init |= ts [ts "" ~]
7+++ update |= [msg=message state=model]
8+ ^- [model (list (cmd message))] [state ~]
9+++ view |= state=model ^- (element message) (text "view")
10+++ subs |= state=model ^- (list (sub message)) ~
tests/type-program-main/initializer-message.txtnew file+13
@@ -0,0 +1,13 @@
1++$ model [xs=(list @t) draft=@t error=(unit @t)]
2++$ message
3+ %start
4+ %stop
5++$ other
6+ %start
7+ %stop
8+++ main (program init update view subs)
9+++ init |= ts=(list @t) [ts "" ~]
10+++ update |= [msg=other state=model]
11+ ^- [model (list (cmd other))] [state ~]
12+++ view |= state=model ^- (element message) (text "view")
13+++ subs |= state=model ^- (list (sub message)) ~
tests/type-program-main/initializer-missing.txtnew file+9
@@ -0,0 +1,9 @@
1++$ model [xs=(list @t) draft=@t error=(unit @t)]
2++$ message
3+ %start
4+ %stop
5+++ main (program init update view subs)
6+++ update |= [msg=message state=model]
7+ ^- [model (list (cmd message))] [state ~]
8+++ view |= state=model ^- (element message) (text "view")
9+++ subs |= state=model ^- (list (sub message)) ~
tests/type-program-main/initializer-model.txtnew file+11
@@ -0,0 +1,11 @@
1++$ model [xs=(list @t) draft=@t error=(unit @t)]
2++$ other [xs=(list @t) draft=@t error=(unit @t) extra=@ud]
3++$ message
4+ %start
5+ %stop
6+++ main (program init update view subs)
7+++ init |= ts=(list @t) [ts "" ~]
8+++ update |= [msg=message state=other]
9+ ^- [other (list (cmd message))] [state ~]
10+++ view |= state=model ^- (element message) (text "view")
11+++ subs |= state=model ^- (list (sub message)) ~
tests/type-program-main/initializer-no-main.txtnew file+10
@@ -0,0 +1,10 @@
1++$ model [xs=(list @t) draft=@t error=(unit @t)]
2++$ message
3+ %start
4+ %stop
5+++ direct (program init update view subs)
6+++ init |= ts=(list @t) [ts "" ~]
7+++ update |= [msg=message state=model]
8+ ^- [model (list (cmd message))] [state ~]
9+++ view |= state=model ^- (element message) (text "view")
10+++ subs |= state=model ^- (list (sub message)) ~
tests/type-program-main/initializer-subs.txtnew file+10
@@ -0,0 +1,10 @@
1++$ model [xs=(list @t) draft=@t error=(unit @t)]
2++$ message
3+ %start
4+ %stop
5+++ main (program init update view subs)
6+++ init |= ts=(list @t) [ts "" ~]
7+++ update |= [msg=message state=model]
8+ ^- [model (list (cmd message))] [state ~]
9+++ view |= state=model ^- (element message) (text "view")
10+++ subs |= state ~
tests/type-program-main/initializer-tag.txtnew file+13
@@ -0,0 +1,13 @@
1++$ model [xs=(list @t) draft=@t error=(unit @t)]
2++$ message
3+ %start
4+ %stop
5+++ main (program init update view subs)
6+++ init |= ts=(list @t) [ts "" ~]
7+++ update |= [msg=message state=model]
8+ ^- [model (list (cmd message))] [state ~]
9+++ view |= state=model ^- (element message) (text "view")
10+++ subs |= state=model ^- (list (sub message)) ~
11+++ orphan
12+ ~& %unrelated
13+ 0
tests/type-program-main/initializer-unfaced.txtnew file+10
@@ -0,0 +1,10 @@
1++$ model [xs=(list @t) draft=@t error=(unit @t)]
2++$ message
3+ %start
4+ %stop
5+++ main (program init update view subs)
6+++ init |= ts=(list @t) [ts "" ~]
7+++ update |= input=[message model]
8+ ^- [model (list (cmd message))] [[~ "" ~] ~]
9+++ view |= state=model ^- (element message) (text "view")
10+++ subs |= state=model ^- (list (sub message)) ~
tests/type-program-main/initializer.txtnew file+12
@@ -0,0 +1,12 @@
1++$ model [xs=(list @t) draft=@t error=(unit @t)]
2++$ message
3+ %start
4+ %stop
5+++ main (program init update view subs)
6+++ init |= ts=(list @t) [ts "" ~]
7+++ update |= [msg=message state=model]
8+ ^- [model (list (cmd message))] [state ~]
9+++ view |= state=model ^- (element message) (text "view")
10+++ subs |= state=model
11+ ^- (list (sub message))
12+ (~)
tests/type-program-main/mismatched-model.txtnew file+10
@@ -0,0 +1,10 @@
1++$ message
2+ %start
3+ %stop
4++$ model [count=@ud]
5+++ main (program init update view subs)
6+++ init |= input=@t ^- model [count=0]
7+++ update |= [msg=message state=@p]
8+ ^- [@p (list (cmd message))] [state ~]
9+++ view |= state=model ^- (element message) (text "view")
10+++ subs |= state=model ^- (list (sub message)) ~
tests/type-program-main/nonempty-subs.txtnew file+12
@@ -0,0 +1,12 @@
1++$ message
2+ %start
3+ %stop
4++$ model [count=@ud]
5+++ main (program init update view subs)
6+++ init |= input=@t ^- model [count=0]
7+++ update |= [msg=message state=model]
8+ ^- [model (list (cmd message))] [state ~]
9+++ view |= state=model ^- (element message) (text "view")
10+++ subs |= state=model
11+ ^- (list (sub message))
12+ ~[[%watch (pure %start)]]
tests/type-program-main/open-message.txtnew file+7
@@ -0,0 +1,7 @@
1++$ model [count=@ud]
2+++ main (program init update view subs)
3+++ init |= input=@t ^- model [count=0]
4+++ update |= [msg=M state=model]
5+ ^- [model (list (cmd M))] [state ~]
6+++ view |= state=model ^- (element M) (text "view")
7+++ subs |= state=model ^- (list (sub M)) ~
tests/type-program-main/source.txtnew file+12
@@ -0,0 +1,12 @@
1++$ message
2+ %start
3+ %stop
4++$ model [count=@ud]
5+++ main (program (init) update view subs)
6+++ init |= input=@t ^- model [count=0]
7+++ update |= [msg=message state=model]
8+ ^- [model (list (cmd message))] [state ~]
9+++ view |= state=model ^- (element message) (text "view")
10+++ subs |= state=model
11+ ^- (list (sub message))
12+ (~)
tests/type-program-update/consumer.txtnew file+2
@@ -0,0 +1,2 @@
1+/= island-prog /tests/program-update/island
2+++ imported update.main.island-prog
tests/type-program-update/malformed-sample.txtnew file+9
@@ -0,0 +1,9 @@
1++$ model [count=@ud]
2++$ message %noop
3+++ main (program init update view subs)
4+++ init |= input=@t ^- model [count=0]
5+++ update |= event=message
6+ ?- event
7+ %noop [[count=0] ~]
8+++ view |= state=model ^- (element message) (text "view")
9+++ subs |= state=model ^- (list (sub message)) ~
tests/type-program-update/missing-list.txtnew file+15
@@ -0,0 +1,15 @@
1++$ model [count=@ud]
2++$ message
3+ %noop
4+ [%set value=@ud]
5+++ main (program init update view subs)
6+++ init |= input=@t ^- model [count=0]
7+++ update |= [event=message current=model]
8+ ?- event
9+ %noop [current ~]
10+ [%set value]
11+ ?- (gth value 10)
12+ %.y [current(count=value) ~]
13+ %.n [current ~]
14+++ view |= state=model ^- (element message) (text "view")
15+++ subs !!
tests/type-program-update/non-main.txtnew file+14
@@ -0,0 +1,14 @@
1++$ model [count=@ud]
2++$ message
3+ %noop
4+ [%set value=@ud]
5+++ init |= input=@t ^- model [count=0]
6+++ update |= [event=message current=model]
7+ ?- event
8+ %noop [current ~]
9+ [%set value]
10+ ?- (gth value 10)
11+ %.y [current(count=value) ~]
12+ %.n [current ~]
13+++ view |= state=model ^- (element message) (text "view")
14+++ subs |= state=model ^- (list (sub message)) ~
tests/type-program-update/source.txtnew file+15
@@ -0,0 +1,15 @@
1++$ model [count=@ud]
2++$ message
3+ %noop
4+ [%set value=@ud]
5+++ main (program init update view subs)
6+++ init |= input=@t ^- model [count=0]
7+++ update |= [event=message current=model]
8+ ?- event
9+ %noop [current ~]
10+ [%set value]
11+ ?- (gth value 10)
12+ %.y [current(count=value) ~]
13+ %.n [current ~]
14+++ view |= state=model ^- (element message) (text "view")
15+++ subs |= state=model ^- (list (sub message)) ~
tests/type-program-update/three-slot-sample.txtnew file+9
@@ -0,0 +1,9 @@
1++$ model [count=@ud]
2++$ message %noop
3+++ main (program init update view subs)
4+++ init |= input=@t ^- model [count=0]
5+++ update |= [event=message current=model extra=@ud]
6+ ?- event
7+ %noop [current ~]
8+++ view |= state=model ^- (element message) (text "view")
9+++ subs |= state=model ^- (list (sub message)) ~
tests/type-program-update/unrelated-tag.txtnew file+16
@@ -0,0 +1,16 @@
1++$ model [count=@ud]
2++$ message
3+ %noop
4+ [%set value=@ud]
5+++ main (program init update view subs)
6+++ init |= input=@t ^- model [count=0]
7+++ update |= [event=message current=model]
8+ ?- event
9+ %noop [current ~]
10+ [%set value]
11+ ?- (gth value 10)
12+ %.y [current(count=value) ~]
13+ %.n [current ~]
14+++ view |= state=model ^- (element message) (text "view")
15+++ subs |= state=model ^- (list (sub message)) ~
16+++ dangling |=%unrelated
tests/type-program-update/wrong-message.txtnew file+10
@@ -0,0 +1,10 @@
1++$ model [count=@ud]
2++$ message %noop
3++$ other-message %other
4+++ main (program init update view subs)
5+++ init |= input=@t ^- model [count=0]
6+++ update |= [event=other-message current=model]
7+ ?- event
8+ %other [current ~]
9+++ view |= state=model ^- (element message) (text "view")
10+++ subs |= state=model ^- (list (sub message)) ~
tests/type-program-update/wrong-model.txtnew file+12
@@ -0,0 +1,12 @@
1++$ model [count=@ud]
2++$ message
3+ %noop
4+ [%set value=@ud]
5+++ main (program init update view subs)
6+++ init |= input=@t ^- model [count=0]
7+++ update |= [event=message current=model]
8+ ?- event
9+ %noop [current ~]
10+ [%set value] [[count="wrong"] ~]
11+++ view |= state=model ^- (element message) (text "view")
12+++ subs |= state=model ^- (list (sub message)) ~
tests/type-program-update/wrong-result.txtnew file+12
@@ -0,0 +1,12 @@
1++$ model [count=@ud]
2++$ message
3+ %noop
4+ [%set value=@ud]
5+++ main (program init update view subs)
6+++ init |= input=@t ^- model [count=0]
7+++ update |= [event=message current=model]
8+ ?- event
9+ %noop [current ~]
10+ [%set value] [current `%noop]
11+++ view |= state=model ^- (element message) (text "view")
12+++ subs |= state=model ^- (list (sub message)) ~
tests/type-program-watch/about.txtnew file+1
@@ -0,0 +1 @@
1+tests: A synthetic closed program uses the real todo API and Hoon readers with synthetic init, update and view definitions. A singleton direct todos.api watch must match exact merged source-backed request evidence; the fixture checks its closed subs type and downstream import. Pure and hand-built requests, helpers and aliases, scry, missing, mismatched or ambiguous evidence, typed paths, diffs and multiple subscriptions are rejected. It does not execute the todo UI or establish runtime watching.
tests/type-theme/dark-absent.txtnew file+8
@@ -0,0 +1,8 @@
1+++ theme ^- theme
2+ [ space=[s1="4px" s2="8px" s3="16px"]
3+ tones=[normal="#222" background="#fff" accent="#17734f" danger="#b3261e" muted="#5f5f5f"]
4+ wide="60rem"
5+ lang="en"
6+ zone="UTC"
7+ font=`%/static/fonts/inter.woff2
8+ dark=~
tests/type-theme/missing-field.txtnew file+7
@@ -0,0 +1,7 @@
1+++ theme ^- theme
2+ [ space=[s1="4px" s2="8px" s3="16px"]
3+ tones=[normal="#222" background="#fff" accent="#17734f" danger="#b3261e" muted="#5f5f5f"]
4+ wide="60rem"
5+ lang="en"
6+ font=`%/static/fonts/inter.woff2
7+ dark=[tones=[normal="#eee" background="#111" accent="#4c9" danger="#f28b82" muted="#aaa"]]
tests/type-theme/source.txtnew file+8
@@ -0,0 +1,8 @@
1+++ theme ^- theme
2+ [ space=[s1="4px" s2="8px" s3="16px"]
3+ tones=[normal="#222" background="#fff" accent="#17734f" danger="#b3261e" muted="#5f5f5f"]
4+ wide="60rem"
5+ lang="en"
6+ zone="UTC"
7+ font=`%/static/fonts/inter.woff2
8+ dark=`[tones=[normal="#eee" background="#111" accent="#4c9" danger="#f28b82" muted="#aaa"]]
tests/type-theme/wrong-dark.txtnew file+8
@@ -0,0 +1,8 @@
1+++ theme ^- theme
2+ [ space=[s1="4px" s2="8px" s3="16px"]
3+ tones=[normal="#222" background="#fff" accent="#17734f" danger="#b3261e" muted="#5f5f5f"]
4+ wide="60rem"
5+ lang="en"
6+ zone="UTC"
7+ font=`%/static/fonts/inter.woff2
8+ dark="dark"
tests/type-theme/wrong-font.txtnew file+8
@@ -0,0 +1,8 @@
1+++ theme ^- theme
2+ [ space=[s1="4px" s2="8px" s3="16px"]
3+ tones=[normal="#222" background="#fff" accent="#17734f" danger="#b3261e" muted="#5f5f5f"]
4+ wide="60rem"
5+ lang="en"
6+ zone="UTC"
7+ font=`"/static/fonts/inter.woff2"
8+ dark=[tones=[normal="#eee" background="#111" accent="#4c9" danger="#f28b82" muted="#aaa"]]
tests/type-theme/wrong-nested-aura.txtnew file+8
@@ -0,0 +1,8 @@
1+++ theme ^- theme
2+ [ space=[s1="4px" s2="8px" s3="16px"]
3+ tones=[normal=~zod background="#fff" accent="#17734f" danger="#b3261e" muted="#5f5f5f"]
4+ wide="60rem"
5+ lang="en"
6+ zone="UTC"
7+ font=`%/static/fonts/inter.woff2
8+ dark=[tones=[normal="#eee" background="#111" accent="#4c9" danger="#f28b82" muted="#aaa"]]
tests/type-todo-full/about.txtnew file+3
@@ -0,0 +1,3 @@
1+source: docs/spec/overview.md, worked example 3; my-app/ui/todo-list.jibb must remain byte-identical to tests/type-gate-free/todo.txt.
2+tests: Full detailed and legacy checking of the unchanged todo island through the real Hoon readers and API. Assert the exact closed main type and structural downstream import, plus wrong model/message/result, ambiguous or open mapper, aliased mapper, non-gate view, and wrong watch rejection. The report does not execute Jibb or establish runtime watching.
3+expect: shared eval and ship guards
tests/type-todo-full/alias.txtnew file+42

This diff is too big to show here.

tests/type-todo-full/ambiguous-mapper.txtnew file+41

This diff is too big to show here.

tests/type-todo-full/expected.txtnew file+2

This diff is too big to show here.

tests/type-todo-full/non-gate-view.txtnew file+33

This diff is too big to show here.

tests/type-todo-full/open-key.txtnew file+40

This diff is too big to show here.

tests/type-todo-full/wrong-message.txtnew file+40

This diff is too big to show here.

tests/type-todo-full/wrong-model.txtnew file+40

This diff is too big to show here.

tests/type-todo-full/wrong-result.txtnew file+40

This diff is too big to show here.

tests/type-todo-full/wrong-watch.txtnew file+40

This diff is too big to show here.

tests/type-todo-partial/about.txtnew file+4

This diff is too big to show here.

tests/type-todo-partial/expected.txtnew file+17

This diff is too big to show here.

tests/type-union-alias-overlap/duplicate.txtnew file+5

This diff is too big to show here.

tests/type-union-alias-overlap/expected.txtnew file+25

This diff is too big to show here.

tests/type-union-alias-overlap/flag-source.txtnew file+7

This diff is too big to show here.

tests/type-union-alias-overlap/multi.txtnew file+5

This diff is too big to show here.

tests/type-union-alias-overlap/negative.txtnew file+16

This diff is too big to show here.

tests/type-union-alias-overlap/nonzero.txtnew file+4

This diff is too big to show here.

tests/type-union-alias-overlap/opaque.txtnew file+4

This diff is too big to show here.

tests/type-union-alias-overlap/positive.txtnew file+8

This diff is too big to show here.

tests/type-union-alias-overlap/qualified.txtnew file+5

This diff is too big to show here.

tests/type-union-alias-overlap/wrong.txtnew file+5

This diff is too big to show here.

tests/type-union-source/direct-source.txtnew file+3

This diff is too big to show here.

tests/type-union-source/duplicate-params.txtnew file+4

This diff is too big to show here.

tests/type-union-source/duplicate.txtnew file+5

This diff is too big to show here.

tests/type-union-source/expected.txtnew file+36

This diff is too big to show here.

tests/type-union-source/free-source.txtnew file+4

This diff is too big to show here.

tests/type-union-source/good.txtnew file+9

This diff is too big to show here.

tests/type-union-source/hidden-ref.txtnew file+5

This diff is too big to show here.

tests/type-union-source/late-source.txtnew file+4

This diff is too big to show here.

tests/type-union-source/mixed-source.txtnew file+8

This diff is too big to show here.

tests/type-union-source/nested.txtnew file+4

This diff is too big to show here.

tests/type-union-source/qualified.txtnew file+4

This diff is too big to show here.

tests/type-union-source/same.txtnew file+5

This diff is too big to show here.

tests/type-union-source/shadow-source.txtnew file+7

This diff is too big to show here.

tests/type-union-source/wide-source.txtnew file+4

This diff is too big to show here.

tests/type-union-source/wrong.txtnew file+5

This diff is too big to show here.

tests/type-union-source/zero.txtnew file+5

This diff is too big to show here.

tools/testdata/lead-late-hoon-reference.hoonnew file+24

This diff is too big to show here.

tools/testdata/ship-selftest+126−1

This diff is too big to show here.

tools/testdata/succ-hoon-reference.hoonnew file+9

This diff is too big to show here.

tools/testdata/zing-hoon-reference.hoonnew file+17

This diff is too big to show here.

tools/type-cell-branch-testnew file+43

This diff is too big to show here.

tools/type-deferred-context-testnew file+31

This diff is too big to show here.

tools/type-deferred-prepared-testnew file+49

This diff is too big to show here.

tools/type-deferred-resolver-testnew file+33

This diff is too big to show here.

tools/type-deferred-testnew file+32

This diff is too big to show here.

tools/type-direct-gate-testnew file+64

This diff is too big to show here.

tools/type-empty-testnew file+55

This diff is too big to show here.

tools/type-full-overlap-testnew file+49

This diff is too big to show here.

tools/type-gate-free-guards-testnew file+29

This diff is too big to show here.

tools/type-gate-free-source-testnew file+50

This diff is too big to show here.

tools/type-generic-construction-testnew file+49

This diff is too big to show here.

tools/type-generic-pattern-testnew file+52

This diff is too big to show here.

tools/type-generic-recursion-testnew file+61

This diff is too big to show here.

tools/type-import-overlap-testnew file+33

This diff is too big to show here.

tools/type-import-structural-testnew file+36

This diff is too big to show here.

tools/type-page-main-testnew file+86

This diff is too big to show here.

tools/type-program-init-testnew file+49

This diff is too big to show here.

tools/type-program-main-testnew file+46

This diff is too big to show here.

tools/type-program-update-testnew file+46

This diff is too big to show here.

tools/type-program-watch-testnew file+48

This diff is too big to show here.

tools/type-theme-testnew file+44

This diff is too big to show here.

tools/type-todo-full-testnew file+98

This diff is too big to show here.

tools/type-todo-partial-testnew file+55

This diff is too big to show here.

tools/type-union-alias-overlap-testnew file+52

This diff is too big to show here.

tools/type-union-source-testnew file+55

This diff is too big to show here.