on master help sign in
Infer a source-backed API request gate

Infer the polymorphic request gate for an imported API with one plain path and one full-state mark. Retain source, reader and graph evidence across cached and transitive imports, rebuilding unknown cached entries and rejecting stale or cyclic evidence. Exercise ordinary imports, cache boundaries and invalid calls under eval and on the ship. Request execution, runtime validation and watchability proof remain unfinished.

commitdde791cc64674c1b0baaf1aee4d29c7d56cb8a88 authoriko <mail@iko.soy> dateSat 31 Oct 2026, 09:29 (7 hours ago) parentae1ec26
18 files changed+963−276
docs/compiler.md+3−1 docs/development.md+2 docs/status.md+11−8 jibb-dev/lib/jibb.hoon+305−13 tests/golden/types-request-normal/about.txt+4 tests/golden/types-request-normal/mar/full.txt+5 tests/golden/types-request-normal/marks.txt+1 tests/golden/types-request-normal/module-trees.txt+5 tests/golden/types-request-normal/modules.txt+1 tests/golden/types-request-normal/modules/ui/api/demo.jibb+2 tests/golden/types-request-normal/source.jibb+9 tests/golden/types-request-normal/tokens.txt+95 tests/golden/types-request-normal/tree.txt+50 tests/golden/types-request-normal/types.txt+26 tests/lib/jibb-request-guards.hoon+149 tests/lib/jibb.hoon+262−253 tools/testdata/ship-selftest+2−1 tools/type-request-guards-test+31
docs/compiler.md+3−1
@@ -102,6 +102,8 @@ For a unique supported declaration, `+api-request-parts` retains that evidence w
102102
103103`+api-support-analysis-source` additionally infers supported ordinary API molds and values, resolves every declared mark, and retains their source, dependency and path evidence. Unsupported helpers or marks fail closed. An unused `/-` core is not independently validated, ordinary definitions that need derived gates remain unsupported, and this result is not a checked API interface or an exported request.
104104
105+The ordinary import resolver can expose a derived request-gate type for one plain API path with one full mark, no parameters, diffs or scry, and no other imports or definitions. Its sample is a reply gate from the full mark type to a fresh `M`; its result is `(ask M)`. Imported uses instantiate `M` independently. The complete checked source bundle, prelude, reserved scope, reader inputs, canonical API and case identities travel in a nonrecursive graph certificate across library imports. 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. These are trusted type-analysis artifacts: no request lowering, runtime schema validation or value watchability proof is supplied. Other API request shapes remain unsupported.
106+
105107`+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.
106108
107109The 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.
@@ -119,7 +121,7 @@ And the design notes:
119121
120122Source-backed `like` maps the product of an existing `(like A)` result while retaining its position and remaining input. The partial checker infers supported positional calls by peeling only known sample-slot faces, retaining faces belonging to values; ambiguous variable-bound spines and nested face loss remain unsupported. Backend execution remains outstanding.
121123
122−The internal prelude defines transparent `(ask M)` cases for pure, agent and store requests; the public prelude re-exports it and defines `pure` in Jibb. Preparation supplies the private module with `list.core` and `unit.core` only from validated canonical public templates. If a template is unavailable, an isolated check validates the private molds, but only molds independently inferred against the actual available templates enter the interface. The partial checker infers supported constructors and exhaustive matches; absent versus present-zero state remains distinguishable. Agent and store receiver fields carry raw nouns and cannot prove schema validity or watchability. Generated decoders, source-bound runtime validation, derived request gates, `sub` and island watch checks remain unfinished. Public prelude preparation is partial: consumers must verify that `ask` was actually exported with its source origin.
124+The internal prelude defines transparent `(ask M)` cases for pure, agent and store requests; the public prelude re-exports it and defines `pure` in Jibb. Preparation supplies the private module with `list.core` and `unit.core` only from validated canonical public templates. If a template is unavailable, an isolated check validates the private molds, but only molds independently inferred against the actual available templates enter the interface. The partial checker infers supported constructors and exhaustive matches; absent versus present-zero state remains distinguishable. Agent and store receiver fields carry raw nouns and cannot prove schema validity or watchability. Generated decoders, source-bound runtime validation, request lowering, other derived request shapes, `sub` and island watch checks remain unfinished. Public prelude preparation is partial: consumers must verify that `ask` was actually exported with its source origin.
123125
124126Public identity aliases of private generic unions retain their public name when the origin, arity and argument order match exactly, including through imported values. Fixed, reordered, repeated and phantom generic aliases remain unsupported where a safe public name cannot be recovered; a fixed nongeneric alias is not printed as though it accepted type arguments.
125127
docs/development.md+2
@@ -74,6 +74,7 @@ git clone https://github.com/urbit/tools /root/src/tools
7474| `tools/type-positional-face-guards-test` | Runs positional-call and nested-face guards under eval and on the ship |
7575| `tools/type-qath-guards-test` | Runs source-provenance, recursive unfolding and face guards under eval and on the ship |
7676| `tools/type-ask-guards-test` | Runs ask origin and canonical list/unit bootstrap guards under eval and on the ship |
77+| `tools/type-request-guards-test` | Runs request evidence, source consistency and cache provenance guards under eval and on the ship |
7778| `tools/type-proj-guards-test` | Runs projection evidence, name-scope and dependency guards under eval and on the ship |
7879| `tools/type-arithmetic-guards-test` | Runs restricted atom-variable, unification and projection guards under eval and on the ship |
7980| `tools/type-module-scope-test` | Checks the partial module checker’s prelude boundary and duplicate-source rejection against `tests/type-module-scope/expected.txt` under eval |
@@ -106,6 +107,7 @@ tools/type-generic-alias-test # generic union alias guards pass
106107tools/type-positional-face-guards-test # positional sample face guards pass
107108tools/type-qath-guards-test # qath source and unfolding guards pass
108109tools/type-ask-guards-test # ask source and bootstrap guards pass
110+tools/type-request-guards-test # request evidence and cache guards pass
109111tools/type-proj-guards-test # projection evidence and scope guards pass
110112tools/type-arithmetic-guards-test # arithmetic constraint guards pass
111113tools/type-module-scope-test # module/prelude scope golden report matches
docs/status.md+11−8
@@ -25,17 +25,19 @@ On 2026-10-31, @iko chose explicit, result-directed `(proj record)` to construct
2525
2626The 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.
2727
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. Derived requests, checked decoding, runtime validation, `sub` and island watch checking remain unimplemented.
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. Request lowering, checked decoding, runtime validation, `sub` and island watch checking remain unimplemented.
2929
3030The 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.
3131
32−For 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. It does not yet create callable request gates or establish watchability of values.
32+For 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.
3333
3434A separate supporting-definition analysis infers supported ordinary API molds and values and resolves all declared marks, retaining their source and dependency evidence. It fails closed on unsupported helpers or marks; unused `/-` cores are not independently validated, and definitions depending on derived gates remain unsupported. This does not check or export the whole API.
3535
36+Ordinary imports can infer the derived request-gate type for an API consisting of one plain path and one full mark, with no parameters, diffs, scry or additional definitions. The callback consumes that mark's type and produces a fresh `M`; the request result is `(ask M)`. Source-qualified request evidence and exact trusted graph inputs survive transitive imports and cached interfaces, while stale or ambiguous evidence fails closed. Unknown legacy cached entries are rebuilt from their supplied source. This is a narrow type-only interface: request execution, schema validation and proof that a request value is watchable remain unimplemented.
37+
3638The Hoon reader's tagged-union source proof also handles `$~` default wrappers. A shared eval and ship golden exercises the unmodified Tlon `epic.saga` mold as a named payload in a labeled downstream extension, alongside overlap, recursive, shadow and malformed-wrapper controls. The tagged-source helper peels at most four consecutive defaults; defaults inside dependency proofs spend the existing semantic-node budget. Other unverified nested unions and dependencies remain unsupported.
3739
38−The 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 create requests or check an API module. Complete private module checking, other API shapes, request gates, root API and kind checking, stores, complete `ask` and `pure` checking, lowering and runtime effects remain unfinished. A possible store or root API with `+$ poke` reports unsupported kind or scope, while definite duplicates and unrelated shadowing still report conflicts. The prelude includes the doc-exact generic `cmd` union; the prelude inventory is incomplete. The inference fragment supports unrestricted `@`, selected one-way widenings including aura-family ancestors, generalized atom constraints arising from explicit capitals or bare sample binders, acyclic local value definitions with captures, selected single self-recursive top-level and local gates, simple and nonrecursive generic mold aliases, selected faced record casts and field reads, and contextual tags, `~` and constructors for closed disjoint unions, including direct nonrecursive generic unions and propagation through complete loobean and unit-shaped branches in casts and known union-sample calls, including nested branches. Known loobean result context also propagates through supported complete branches and binder-only cell arms; binder-only arms over union subjects remain unsupported. A directly known named union can instantiate an unconstrained generic gate sample with its origin, generic arguments and faces preserved; unnamed, pending, recursive and variable-bound cases remain unsupported. A known gate with an unresolved result variable can receive a known enclosing result type before its arguments are inferred; unknown calls and unresolved targets remain conservative. Multi-argument calls form a right-nested sample, retain known faces and shared type variables, and can use known sample positions to contextualize list and union arguments. A definite mismatch points to the failing argument when the fragment can establish it, otherwise to the combined sample; unsupported contextual forms still fail closed. For a supported recursive gate, the checker infers the sample first and uses its exact type, including field faces, for one monomorphic self reference. It generalizes after the body is checked; subsequent uses instantiate it independently. Incompatible recursive arguments can report the gate and argument sites. For a complete loobean branch with one direct self-call arm, a separately inferred closed base type can seed the recursive result before the whole body is checked. Open or pending base types do not seed it; other branch shapes remain subject to the fragment’s existing limits. A supported single local recursive gate also uses a monomorphic self reference and generalizes variables free of the enclosing environment after checking its body; captured variables remain shared. The checker collects written capitals per `++` before inference, excluding nested definitions: a capital used in an enclosing definition is shared with its locals even when written later, while a capital introduced only in a local definition is generalized there. Sibling locals can introduce independent capitals with the same spelling; generic mold parameters keep their own scope. Top-level groups of syntactic gates are inferred together with monomorphic placeholders and shared substitutions, then generalized only after the whole group checks; downstream uses and library interfaces instantiate those schemes independently. A dependency graph identifies groups with two iterative depth-first passes; its conservative local-reference edges can reject otherwise valid programs. Supported local mutually recursive gate groups also use shared monomorphic placeholders and generalize only after the group checks, preserving captured outer variables. A bounded dependency proof reports certain non-gate cycles through values and gates when an explicit atom or loobean result cast and simple unshadowed expressions establish the cycle. Other mixed gate/value cycles, polymorphic recursion, unresolved literal constraints and unresolved branch joins remain unsupported. Reporting repeats inference for a single recursive gate outside a group; grouped reports use the stored schemes. Its performance cost remains unmeasured. A single-arm cell pattern accepts two or more binders, the last capturing the remaining tail; duplicate and shadowed binders are rejected. A structured single-arm pattern also works for a known non-union cell when coverage is proven, including nested literal and wildcard positions. Intermediate union or collection tails, nested patterns, wildcards and faced records remain unsupported. String interpolation accepts known atom auras, unrestricted `@`, tapes and isolated decimal literals; a known cell asks for a printer, and an explicitly generic atom asks for an aura. Loobeans, term singletons, non-tape collections, open types and a type fixed only later remain unsupported. A known closed union with two or more arms supports patterns that provably cover or exclude each remaining case, including payload binders, imported and generic cases, and binder-free catch-alls. Partial boolean patterns can split known `?` positions into their two noun values, up to 64 alternatives across the union; binders retain their original case type. Missing alternatives and covered arms are reported. Other partial patterns, expansions above the limit, binders spanning distinct cases, differing arm result types and some complex two-arm subjects remain unsupported. A cast or known call sample can supply result context through whole-case arms and supported finite loobean refinements for a known union accessed by a wing, a grouped wing or a supported shallow call, including nested cell and list positions; other partial-pattern contexts and subject forms remain unsupported. The Grammar’s `step` block infers in this fragment, but its module is not yet checked. A bare tag proved absent from a known union reports the union and tag sites in casts, single-argument calls, unit payloads, list items and supported branch arms; imported unnamed unions print their cases. Ordered fit replay can identify a missing tag nested in a syntactic tuple, stopping at an earlier mismatch or uncertainty. Known faced records support uniquely named field changes, including nested wings, with field context passed to replacements and the original record type retained. Missing fields, empty changes and definite mismatches report sites; the expected-type site is the edit because the original field declaration location is not retained. Unknown or partly unfaced spines, ambiguous fields and repeated edits remain unsupported. A known record cast supplies field context to its tuple or record initializer, including nested list and union fields; mismatch diagnostics use the cast mold because the original field declaration location is not retained. Isolated cart-style `init` and `update` expressions infer, while the complete cart-store fails closed because its kind and declaration scope remain unchecked. Uncontextualized list literals infer a fresh element type, including empty and nested lists, with independently generalized uses. Unresolved item tags and uncertain widening remain unsupported. Backtick unit construction uses the validated standard prelude unit template, infers its payload without losing pending constraints, and makes the prelude’s `some` available. Ordinary result annotations also let its `bind`, `biff`, `both`, `clap`, `clef` and `flit` infer. A known unit in a cast, call, list item or record field supplies context to its payload, including nested units and lists; mismatches identify the payload and context. Unrelated union identities, some variable-dependent fits, and missing or altered prelude unit templates remain unsupported. Contextual null-headed cells fit their cases, but do not supply a `|=%$` constructor; unresolved nulls remain pending and are reported separately from tags. A known union of `~` and a null-headed cell supports a complete `~` / `[~ value]` branch in either order, including shadow checks; unknown subjects, missing or duplicate arms, and unresolved branch results remain unsupported. This fragment infers the prelude’s `fall` and `need` signatures. With the validated prelude list and a known cast or gate sample, empty, nonempty and nested list literals infer their element types, including contextual union tags; a mismatched element names both sites. In that context `~` and zero-valued terms fit an empty list, and two-item unfaced cells form cons lists, including nested cons and imported-list contexts; invalid heads or tails name both sites. A known gate sample also supplies context to matching positions in a single tuple or record argument, including nested cells; zero literals can fit list positions. A bound zero constant remains unsupported rather than a definite mismatch, and an unknown callee does not supply context. Faced or longer cells and a missing or altered prelude list fail closed. A known list result also supplies context through complete loobean, unit-shaped and list-shaped branches, including recursive and nested branches. For a known standard list with a supported element type, a complete `~` / `[item rest]` branch infers the element and tail types in either arm order and checks binders for shadowing. Unknown subjects, unsupported element types and other or incomplete list patterns remain unsupported. A value with type variable `A` can fit a field whose type is that same `A`, including in generic union payloads and nested or repeated record fields. Other variable-dependent face merges remain unsupported. Forced equality of distinct written capitals now reports both source sites, following @iko’s decision; forcing one to a concrete type remains unsupported. Imported record spines with repeated faces fail closed where used, but only with a generic unsupported diagnostic. Hoon may erase unfaced nested-cell boundaries, so the check can conservatively reject valid names in distinct erased scopes. Supported closed unions print using an in-scope name or imported alias; an unnamed nongeneric union prints its cases, parenthesized when nested. The latter is print-only. Generic union types retain all arguments in their printed name; if that name is unavailable, the partial printer reports the limitation. Different import faces for the same origin remain compatible; compatibility across distinct union origins and some generic-argument comparisons remain unsupported. Nonrecursive generic aliases can reorder, repeat or omit parameters while retaining a union’s origin, including through local scopes and library interfaces. A generic union declared directly inside a body remains unsupported, as do differing-variable face constraints in a union payload. A transitive generic union whose name is unavailable is reported as unsupported instead of hiding its arguments. Unfixed decimal literals default to `@ud` in gate-free inferred types; recursive molds, general branch tag context, other constraint cases and defaulting inside gate types still need work. Collection recognition checks the originating core and fails closed on shadows or unsupported Ford subject shapes; a wrapper regression also rejects forged subjects, samples and tails. Its golden fixtures include three real Tlon files. A Clay test passes a Ford-built nested union through the reader into partial inference. The partial prelude includes `murn`, `join`, `snip`, `rear` and the 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.
40+The 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 narrow one-path, one-full-mark request-gate type 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. Contextual null-headed cells fit their cases, but do not supply a `|=%$` constructor; unresolved nulls remain pending and are reported separately from tags. A known union of `~` and a null-headed cell supports a complete `~` / `[~ value]` branch in either order, including shadow checks; unknown subjects, missing or duplicate arms, and unresolved branch results remain unsupported. This fragment infers the prelude’s `fall` and `need` signatures. With the validated prelude list and a known cast or gate sample, empty, nonempty and nested list literals infer their element types, including contextual union tags; a mismatched element names both sites. In that context `~` and zero-valued terms fit an empty list, and two-item unfaced cells form cons lists, including nested cons and imported-list contexts; invalid heads or tails name both sites. A known gate sample also supplies context to matching positions in a single tuple or record argument, including nested cells; zero literals can fit list positions. A bound zero constant remains unsupported rather than a definite mismatch, and an unknown callee does not supply context. Faced or longer cells and a missing or altered prelude list fail closed. A known list result also supplies context through complete loobean, unit-shaped and list-shaped branches, including recursive and nested branches. For a known standard list with a supported element type, a complete `~` / `[item rest]` branch infers the element and tail types in either arm order and checks binders for shadowing. Unknown subjects, unsupported element types and other or incomplete list patterns remain unsupported. A value with type variable `A` can fit a field whose type is that same `A`, including in generic union payloads and nested or repeated record fields. Other variable-dependent face merges remain unsupported. Forced equality of distinct written capitals now reports both source sites, following @iko’s decision; forcing one to a concrete type remains unsupported. Imported record spines with repeated faces fail closed where used, but only with a generic unsupported diagnostic. Hoon may erase unfaced nested-cell boundaries, so the check can conservatively reject valid names in distinct erased scopes. Supported closed unions print using an in-scope name or imported alias; an unnamed nongeneric union prints its cases, parenthesized when nested. The latter is print-only. Generic union types retain all arguments in their printed name; if that name is unavailable, the partial printer reports the limitation. Different import faces for the same origin remain compatible; compatibility across distinct union origins and some generic-argument comparisons remain unsupported. Nonrecursive generic aliases can reorder, repeat or omit parameters while retaining a union’s origin, including through local scopes and library interfaces. A generic union declared directly inside a body remains unsupported, as do differing-variable face constraints in a union payload. A transitive generic union whose name is unavailable is reported as unsupported instead of hiding its arguments. Unfixed decimal literals default to `@ud` in gate-free inferred types; recursive molds, general branch tag context, other constraint cases and defaulting inside gate types still need work. Collection recognition checks the originating core and fails closed on shadows or unsupported Ford subject shapes; a wrapper regression also rejects forged subjects, samples and tails. Its golden fixtures include three real Tlon files. A Clay test passes a Ford-built nested union through the reader into partial inference. The partial prelude includes `murn`, `join`, `snip`, `rear` and the 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.
3941
4042The 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.
4143
@@ -55,8 +57,8 @@ What the plan asks for, and where it is:
5557
5658Besides the plan's list:
5759
58−- 637 golden cases: 417 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.
59−- The 637-case corpus passed under `urbit eval` in 89.7 s while other checks were running. The fake ship passed all 658 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 and API-evidence guards, with 60.3 s for sync and 81.5 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.
60+- 638 golden cases: 418 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.
61+- The 638-case corpus passed under `urbit eval` in 90.4 s while other checks were running. The fake ship passed all 660 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 and request guards, with 64.3 s for sync and 80.5 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.
6062- `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.
6163- 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.
6264- 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).
@@ -147,14 +149,15 @@ Besides the plan's list:
147149| f69493d | 2026-10-31 | Derive supported request components from API declarations |
148150| f0f6954 | 2026-10-31 | Analyze supported API helper definitions and declared marks |
149151| 3f55af7 | 2026-10-31 | Define source-backed transparent ask and pure |
150−| This change | 2026-10-31 | Prove selected default-wrapped Hoon unions from source |
152+| ae1ec26 | 2026-10-31 | Prove selected default-wrapped Hoon unions from source |
153+| This change | 2026-10-31 | Infer a source-backed request-gate type through ordinary imports |
151154
152155## Checking it
153156
154157On a machine set up as [development.md](development.md) says:
155158
156159```
157−tools/golden # 637 cases under urbit eval
160+tools/golden # 638 cases under urbit eval
158161tools/importer-test # the Hoon importer fixture projection
159162tools/type-import-default-test # default-wrapped source proof golden
160163tools/type-import-test # the importer/checker bridge fixture
@@ -176,7 +179,7 @@ tools/testdata/selftest # the tools themselves
176179tools/doc-blocks docs/spec # the doc's examples are golden cases
177180tools/ship start
178181tools/ship gen-tests --check # tests/lib/jibb.hoon is up to date
179−tools/ship test # the same 637 cases as -test arms on the ship
182+tools/ship test # the same 638 cases as -test arms on the ship
180183tools/testdata/ship-selftest
181184tools/testdata/clay-fixtures-selftest # scratch fixture cleanup without a ship
182185tools/ship check-commit # |commit stores .jibb files
jibb-dev/lib/jibb.hoon+305−13
@@ -4628,6 +4628,21 @@
46284628:: proofs to fewer than 1,024 cells; the projection planner has a separate
46294629:: 4,096-step bound. These are inference limits, not language limits.
46304630::
4631+:: A single plain API path with one full mark can expose a polymorphic
4632+:: request-gate type through ordinary imports. Its source-derived schema,
4633+:: canonical API path and complete dependency evidence travel with checked
4634+:: interfaces. The closure is bound to the exact supplied bundle, prelude,
4635+:: scope and trusted reader results; unknown cached entries are rebuilt.
4636+:: Request-bearing closures are limited to 256 source paths and requests.
4637+:: This is type inference only: there is no request lowering, runtime schema
4638+:: validator or proof that an arbitrary ask value is watchable.
4639+::
4640+:: In one synthetic eval of a 48-module deep and 48-module wide request-free
4641+:: graph, baseline versus certificate inference took 21.53 s versus 23.10 s
4642+:: elapsed (21.10 s versus 22.34 s CPU), including startup. The deep cache's
4643+:: jam grew from 2,402 to 4,209 bytes (+1,807 bytes). These single-run figures
4644+:: are not production memory or performance benchmarks.
4645+::
46314646+$ itype
46324647 $~ [%var 0]
46334648 $% [%var id=@ud]
@@ -5396,7 +5411,15 @@
53965411+$ iderived [name=term agent=term mark=term]
53975412+$ iwidth-definition [name=term original=expr typ=itype sub=isub projections=(list iwprojection)]
53985413+$ iwidth-dependency [at=path source=(unit @t) definitions=(list iwidth-definition)]
5399−+$ ifile [values=ienv molds=imold-types at=path derived=(list iderived) elaborations=(list iwidth-definition) dependencies=(list iwidth-dependency) source=(unit @t)]
5414+:: Nonrecursive request evidence is compiler-owned metadata, not a property
5415+:: of an arbitrary ask value. Reader graphs and source inputs are trusted.
5416++$ irequest-evidence
5417+ [api-at=path name=term path=iapi-path-typed api-source=@t public-source=@t internal-source=@t prelude-values=(list term) prelude-molds=(list term) externals=iexternals marks=imark-externals]
5418+:: A unit distinguishes a verified empty closure from a detached legacy file.
5419+:: The opaque prelude is an exact trusted input, not a recursive interface mold.
5420++$ irequest-graph
5421+ [paths=(set path) requests=(list irequest-evidence) bundle-input=* prelude-input=* prelude-values=(list term) prelude-molds=(list term) externals=iexternals marks=imark-externals]
5422++$ ifile [values=ienv molds=imold-types at=path derived=(list iderived) elaborations=(list iwidth-definition) dependencies=(list iwidth-dependency) source=(unit @t) graph=(unit irequest-graph)]
54005423+$ ijimports (list [face=term interface=ifile])
54015424+$ icap [name=@t id=@ud at=span]
54025425+$ icaps (list icap)
@@ -10086,7 +10109,7 @@
1008610109 =/ plus=ischeme [[%fn [%cell b b] b] ~[0]]
1008710110 =/ minus=ischeme [[%fn b b] ~[0]]
1008810111 =/ greater=ischeme [[%fn pair [%flag ~]] ~[0]]
10089− [~[[%raw-add plus] [%raw-dec minus] [%raw-gth greater]] ~ /lib/jibb/primitives/jibb ~ ~ ~ ~]
10112+ [~[[%raw-add plus] [%raw-dec minus] [%raw-gth greater]] ~ /lib/jibb/primitives/jibb ~ ~ ~ ~ ~]
1009010113::
1009110114++ infer-private-internal
1009210115 |= [src=@t public-source=@t]
@@ -10129,7 +10152,7 @@
1012910152 =/ unit-molds=imolds ~[[%unit u.unit-decl]]
1013010153 =/ unit-state=istate [0 ~ ~ ~ unit-molds ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ | /lib/jibb/prelude/jibb ~[%unit] ~ ~ 256 ~]
1013110154 =/ unit-types=imold-types (partial-prelude-molds unit-molds unit-state)
10132− =/ unit-iface=ifile [~ unit-types /lib/jibb/prelude/jibb ~ ~ ~ ~]
10155+ =/ unit-iface=ifile [~ unit-types /lib/jibb/prelude/jibb ~ ~ ~ ~ ~]
1013310156 =/ found=(unit ischeme) (find-jibb-mold %unit unit-iface)
1013410157 ?~ found ~
1013510158 ?. (standard-unit-template u.found /lib/jibb/prelude/jibb) ~
@@ -10165,7 +10188,7 @@
1016510188 =/ resolution=iresolved (resolve-groups defs.mod molds globals ~ ~ ~ ~ js reserved at ~)
1016610189 =/ env=ienv env.resolution
1016710190 ?. (module-values-complete defs.mod env) ~
10168− `[env u.usable at ~ artifacts.resolution ~ `src]
10191+ `[env u.usable at ~ artifacts.resolution ~ `src ~]
1016910192::
1017010193++ partial-prelude-interface-with-internal
1017110194 |= [src=@t internal-source=(unit @t)]
@@ -10205,9 +10228,9 @@
1020510228 =/ mold-prelude=(unit ifile)
1020610229 ?~ declared-list ~
1020710230 ?. (standard-prelude-list u.declared-list) ~
10208− `[~ ~[[%list [[%collection %list ~[[%var 0]]] ~[0]]]] at ~ ~ ~ ~]
10231+ `[~ ~[[%list [[%collection %list ~[[%var 0]]] ~[0]]]] at ~ ~ ~ ~ ~]
1020910232 =/ mt=imold-types (partial-prelude-molds molds state(prelude mold-prelude))
10210− =/ partial=ifile [~ mt at ~ ~ ~ ~]
10233+ =/ partial=ifile [~ mt at ~ ~ ~ ~ ~]
1021110234 :: An explicitly qualified re-export must resolve. Other unsupported
1021210235 :: prelude declarations remain reserved but absent from the interface.
1021310236 =/ required=imolds
@@ -10224,7 +10247,7 @@
1022410247 =/ deps=(list iwidth-dependency)
1022510248 ?~ u.private ~
1022610249 ~[[at.interface.i.u.private source.interface.i.u.private elaborations.interface.i.u.private]]
10227− `[env mt at ~ artifacts.resolution deps `src]
10250+ `[env mt at ~ artifacts.resolution deps `src ~]
1022810251::
1022910252++ partial-prelude-interface
1023010253 |= src=@t
@@ -10275,6 +10298,66 @@
1027510298 ?: =(at at.i.cache) `iface.i.cache
1027610299 $(cache t.cache)
1027710300::
10301+:: These certificates retain the complete checked source closure. The
10302+:: trusted host must supply the identical prepared prelude and reader nouns.
10303+:: Exact bundle equality binds all source paths and versions; the set
10304+:: retains transitive paths for active-cycle checks. Request-bearing graphs
10305+:: alone have a size limit; incompatible diamond evidence fails closed.
10306+++ request-graph-requests-add
10307+ |= [pending=(list irequest-evidence) acc=(list irequest-evidence) fuel=@ud]
10308+ ^- (unit (list irequest-evidence))
10309+ ?~ pending `acc
10310+ ?: =(0 fuel) ~
10311+ =/ hit=(list irequest-evidence)
10312+ (skim acc |=(x=irequest-evidence &(=(api-at.x api-at.i.pending) =(name.x name.i.pending))))
10313+ ?^ hit
10314+ ?. ?=([* ~] hit) ~
10315+ ?. =(i.hit i.pending) ~
10316+ $(pending t.pending, fuel (dec fuel))
10317+ $(pending t.pending, acc [i.pending acc], fuel (dec fuel))
10318+++ request-graph-inputs-match
10319+ |= [g=irequest-graph externals=iexternals marks=imark-externals modules=jbundle values=(list term) molds=(list term) prelude=(unit ifile)]
10320+ ^- ?
10321+ ?& =(bundle-input.g modules)
10322+ =(prelude-input.g prelude)
10323+ =(prelude-values.g values)
10324+ =(prelude-molds.g molds)
10325+ =(externals.g externals)
10326+ =(marks.g marks)
10327+ ==
10328+++ request-graph-merge
10329+ |= [imports=ijimports g=irequest-graph fuel=@ud]
10330+ ^- (unit irequest-graph)
10331+ ?~ imports `g
10332+ ?: =(0 fuel) ~
10333+ =/ child=ifile interface.i.imports
10334+ ?~ graph.child ~
10335+ =/ cg=irequest-graph u.graph.child
10336+ ?. ?& =(bundle-input.g bundle-input.cg)
10337+ =(prelude-input.g prelude-input.cg)
10338+ =(prelude-values.g prelude-values.cg)
10339+ =(prelude-molds.g prelude-molds.cg)
10340+ =(externals.g externals.cg)
10341+ =(marks.g marks.cg)
10342+ ==
10343+ ~
10344+ =/ merged=(set path) (~(uni in:..zuse paths.g) paths.cg)
10345+ =/ rs=(unit (list irequest-evidence))
10346+ (request-graph-requests-add requests.cg requests.g (add 1 (lent requests.cg)))
10347+ ?~ rs ~
10348+ ?: &(?=(^ u.rs) |((gth (lent ~(tap in:..zuse merged)) 256) (gth (lent u.rs) 256))) ~
10349+ $(imports t.imports, g g(paths merged, requests u.rs), fuel (dec fuel))
10350+++ request-graph-reusable
10351+ |= [f=ifile src=@t externals=iexternals marks=imark-externals modules=jbundle active=(list path) values=(list term) molds=(list term) prelude=(unit ifile)]
10352+ ^- ?
10353+ ?~ source.f |
10354+ ?. =(u.source.f src) |
10355+ ?~ graph.f |
10356+ =/ g=irequest-graph u.graph.f
10357+ ?. (request-graph-inputs-match g externals marks modules values molds prelude) |
10358+ ?. (~(has in:..zuse paths.g) at.f) |
10359+ !(lien active |=(p=path (~(has in:..zuse paths.g) p)))
10360+::
1027810361++ resolve-jibb-imports
1027910362 |= [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)]
1028010363 ^- jimports-result
@@ -10292,7 +10375,16 @@
1029210375 ?^ t.found [%| (crip "duplicate module sources: {(spud at)}")]
1029310376 =/ cached=(unit ifile) (find-jibb-cache at cache)
1029410377 =/ iface=jfile-result
10295− ?^ cached [%& [u.cached cache]]
10378+ ?^ cached
10379+ ?. =(at.u.cached at) [%| 'cached module identity needs unsupported inference']
10380+ ?~ graph.u.cached
10381+ :: A detached legacy interface has unknown evidence. Rebuild it
10382+ :: against the current graph, without retaining any stale entry.
10383+ =/ clean=jcache (skim cache |=(x=[at=path iface=ifile] !=(at.x at)))
10384+ (infer-jibb-file at source.i.found externals mark-externals modules [at active] prelude-values prelude-molds clean prelude)
10385+ ?. (request-graph-reusable u.cached source.i.found externals mark-externals modules active prelude-values prelude-molds prelude)
10386+ [%| 'cached module evidence needs unsupported inference']
10387+ [%& [u.cached cache]]
1029610388 (infer-jibb-file at source.i.found externals mark-externals modules [at active] prelude-values prelude-molds cache prelude)
1029710389 ?: ?=(%| -.iface) [%| p.iface]
1029810390 =/ rest=jimports-result $(imports t.imports, cache cache.p.iface)
@@ -10542,6 +10634,27 @@
1054210634 (api-path-analysis p.parsed marks values.u.prepared molds.u.prepared)
1054310635 ?~ paths [%| 'API path declaration needs unsupported analysis']
1054410636 [%& [file src u.prepared externals marks cache.p.deps u.paths]]
10637+:: Graph-aware variant preserves the caller active stack and cache.
10638+++ api-path-evidence-graph
10639+ |= [file=path src=@t externals=iexternals marks=imark-externals modules=jbundle active=(list path) cache=jcache prepared=(unit iprelude)]
10640+ ^- (each iapi-path-evidence @t)
10641+ ?~ active [%| 'API analysis needs an active graph']
10642+ ?. =(i.active file) [%| 'API analysis active graph does not start at the source']
10643+ ?: (lien t.active |=(p=path =(p file))) [%| 'API analysis active graph contains a cycle']
10644+ ?. ?=([%ui %api @ %jibb ~] file) [%| 'API path evidence requires /ui/api/<agent>.jibb']
10645+ =/ parsed (parse file src)
10646+ ?: ?=(%| -.parsed) [%| 'API path evidence source does not parse']
10647+ =/ duplicate=(unit idiag) (duplicate-defs defs.p.parsed)
10648+ ?^ duplicate [%| (show-duplicate-fields file src u.duplicate)]
10649+ ?~ prepared [%| 'API path evidence needs the prepared prelude']
10650+ =/ public=ifile iface.u.prepared
10651+ =/ deps=jimports-result
10652+ (resolve-jibb-imports imports.p.parsed externals marks modules active values.u.prepared molds.u.prepared cache `public)
10653+ ?: ?=(%| -.deps) [%| p.deps]
10654+ =/ paths=(unit (list iapi-path-typed))
10655+ (api-path-analysis p.parsed marks values.u.prepared molds.u.prepared)
10656+ ?~ paths [%| 'API path declaration needs unsupported analysis']
10657+ [%& [file src u.prepared externals marks cache.p.deps u.paths]]
1054510658::
1054610659:: This query classifies a unique path declaration only. Missing evidence
1054710660:: or a nonunique name is unknown; it proves nothing about an ask value.
@@ -10643,6 +10756,175 @@
1064310756 =/ resolution=iresolved (resolve-groups ordinary molds globals externals surs marks declared resolved.p.deps reserved file prelude)
1064410757 ?. (module-values-complete ordinary env.resolution) [%| 'API ordinary definitions need unsupported inference']
1064510758 [%& [evidence env.resolution p.mts u.mark-types artifacts.resolution]]
10759+:: Preserve the same graph context through supporting definitions.
10760+++ api-support-analysis-graph
10761+ |= [file=path src=@t externals=iexternals marks=imark-externals modules=jbundle active=(list path) cache=jcache prepared=(unit iprelude)]
10762+ ^- (each iapi-support-evidence @t)
10763+ =/ path-result (api-path-evidence-graph file src externals marks modules active cache prepared)
10764+ ?: ?=(%| -.path-result) [%| p.path-result]
10765+ =/ evidence=iapi-path-evidence p.path-result
10766+ =/ parsed (parse file src)
10767+ ?: ?=(%| -.parsed) [%| 'API source does not parse']
10768+ =/ mod=module p.parsed
10769+ =/ ordinary=(list def)
10770+ (skim defs.mod |=(d=def !&(?=(%mold -.d) |(=(%paths name.d) =(%poke name.d)))))
10771+ =/ prep=iprelude prepared.evidence
10772+ ?. (module-scope-valid mod(defs ordinary) values.prep molds.prep) [%| 'API ordinary scope needs unsupported inference']
10773+ =/ vals=(list term) (global-value-names ordinary)
10774+ ?: (lien vals |=(n=term =(n %main))) [%| 'API module kind needs unsupported inference']
10775+ =/ declared=(list term) (collect-mark-imports imports.mod)
10776+ =/ mark-types=(unit (list iapi-mark-type)) (api-diff-types declared marks declared)
10777+ ?~ mark-types [%| 'API declared marks need unsupported inference']
10778+ =/ prelude=(unit ifile) `iface.prep
10779+ =/ deps=jimports-result
10780+ (resolve-jibb-imports imports.mod externals marks modules active values.prep molds.prep dependencies.evidence prelude)
10781+ ?: ?=(%| -.deps) [%| p.deps]
10782+ =/ molds=imolds (collect-simple-molds ordinary)
10783+ =/ globals=(list term) (weld values.prep (weld (import-binding-names imports.mod) vals))
10784+ =/ surs=(list term) (collect-sur-imports imports.mod)
10785+ =/ reserved=(list term) (weld molds.prep (turn resolved.p.deps |=(j=[face=term interface=ifile] face.j)))
10786+ =/ top=(list term) (turn molds |=(m=[name=term body=shape] name.m))
10787+ =/ state=istate [0 ~ ~ ~ molds globals externals surs marks declared resolved.p.deps reserved ~ ~ ~ | file top prelude ~ 256 ~]
10788+ =/ mts=(each imold-types @t) (module-mold-types molds state)
10789+ ?: ?=(%| -.mts) [%| p.mts]
10790+ =/ resolution=iresolved (resolve-groups ordinary molds globals externals surs marks declared resolved.p.deps reserved file prelude)
10791+ ?. (module-values-complete ordinary env.resolution) [%| 'API ordinary definitions need unsupported inference']
10792+ [%& [evidence env.resolution p.mts u.mark-types artifacts.resolution]]
10793+::
10794+:: Type-analysis artifact for one plain request. The resolver may publish
10795+:: its interface only together with trusted source and reader evidence.
10796+:: No lowering or runtime validator exists.
10797+:: Value watchability remains unproved even for a watchable declaration.
10798++$ ione-request-interface
10799+ [support=iapi-support-evidence parts=iapi-request-parts iface=ifile]
10800+++ request-compatible-ask
10801+ |= prelude=iprelude
10802+ ^- (unit ischeme)
10803+ =/ public=ifile iface.prelude
10804+ ?. =(at.public /lib/jibb/prelude/jibb) ~
10805+ =/ ask=(unit ischeme) (find-jibb-mold %ask public)
10806+ ?~ ask ~
10807+ ?. ?=([@ ~] vars.u.ask) ~
10808+ ?. ?=(%union -.typ.u.ask) ~
10809+ ?. =(origin.typ.u.ask `[/lib/jibb/internal/jibb %ask]) ~
10810+ ?. (identity-union-parameters vars.u.ask args.typ.u.ask) ~
10811+ =/ m=@ud i.vars.u.ask
10812+ ?: (itype-var-is-atom m typ.u.ask) ~
10813+ ?. (levy (itype-vars typ.u.ask) |=(n=@ud =(n m))) ~
10814+ ?: (itype-has-tag typ.u.ask) ~
10815+ =/ private=(list iwidth-dependency)
10816+ (skim dependencies.public |=(d=iwidth-dependency =(at.d /lib/jibb/internal/jibb)))
10817+ ?. ?=([* ~] private) ~
10818+ ?~ source.i.private ~
10819+ =/ path=(unit ischeme) (find-jibb-mold %path public)
10820+ ?~ path ~
10821+ ?^ vars.u.path ~
10822+ =/ path-type=itype [%collection %list ~[[%atom %ta]]]
10823+ ?. =(typ.u.path path-type) ~
10824+ =/ unit-template=(unit ischeme) (find-jibb-mold %unit public)
10825+ ?~ unit-template ~
10826+ ?. (standard-unit-template u.unit-template /lib/jibb/prelude/jibb) ~
10827+ =/ state-unit=(unit itype) (template-apply u.unit-template ~[[%noun ~]])
10828+ ?~ state-unit ~
10829+ =/ path-unit=(unit itype) (template-apply u.unit-template ~[path-type])
10830+ ?~ path-unit ~
10831+ =/ output=itype [%cell [%face %state [%noun ~]] [%face %message [%var m]]]
10832+ =/ agent-input=itype [%cell [%face %mark [%atom %tas]] [%cell [%face %state u.state-unit] [%face %fact [%noun ~]]]]
10833+ =/ store-input=itype [%cell [%face %state u.state-unit] [%face %fact [%noun ~]]]
10834+ =/ pure-case=itype [%cell [%const [%term %tas %pure '%pure']] [%face %value [%var m]]]
10835+ =/ agent-case=itype
10836+ [%cell [%const [%term %tas %agent '%agent']] [%cell [%face %api [%atom %t]] [%cell [%face %case [%atom %tas]] [%cell [%face %agent [%atom %tas]] [%cell [%face %path path-type] [%cell [%face %scry u.path-unit] [%face %receive [%fn agent-input output]]]]]]]]
10837+ =/ store-case=itype
10838+ [%cell [%const [%term %tas %store '%store']] [%cell [%face %module [%atom %t]] [%cell [%face %name [%atom %tas]] [%face %receive [%fn store-input output]]]]]
10839+ ?. =(cases.typ.u.ask ~[pure-case agent-case store-case]) ~
10840+ ask
10841+::
10842+:: The first supported standalone API has exactly one mark import and one
10843+:: plain path declaration, with no other definitions or imports. No partial
10844+:: success is published when source, schema, or a required mold is unknown.
10845+++ one-request-interface-source
10846+ |= [file=path src=@t externals=iexternals marks=imark-externals modules=jbundle prepared=(unit iprelude)]
10847+ ^- (each ione-request-interface @t)
10848+ =/ out (api-support-analysis-source file src externals marks modules prepared)
10849+ ?: ?=(%| -.out) [%| p.out]
10850+ =/ support=iapi-support-evidence p.out
10851+ =/ ev=iapi-path-evidence paths.support
10852+ =/ parsed (parse file src)
10853+ ?: ?=(%| -.parsed) [%| 'request source does not parse']
10854+ =/ mod=module p.parsed
10855+ ?. ?=([[%mark *] ~] imports.mod) [%| 'request imports need unsupported inference']
10856+ ?. ?=([[%mold *] ~] defs.mod) [%| 'request definitions need unsupported inference']
10857+ ?. =(%paths name.i.defs.mod) [%| 'request declaration needs unsupported inference']
10858+ ?. ?=([* ~] paths.ev) [%| 'request count needs unsupported inference']
10859+ =/ p=iapi-path-typed i.paths.ev
10860+ =/ parts=(unit iapi-request-parts) (api-request-parts `ev name.path.p)
10861+ ?~ parts [%| 'request components need unsupported inference']
10862+ ?^ parameters.u.parts [%| 'request parameters need unsupported inference']
10863+ ?^ fold.u.parts [%| 'request fold needs unsupported inference']
10864+ ?^ scry.path.p [%| 'request scry needs unsupported inference']
10865+ ?. ?=([* ~] marks.support) [%| 'request marks need unsupported inference']
10866+ ?^ (itype-vars reply-sample.u.parts) [%| 'request payload needs unsupported inference']
10867+ ?: (itype-has-tag reply-sample.u.parts) [%| 'request payload needs unsupported inference']
10868+ =/ ask=(unit ischeme) (request-compatible-ask prepared.ev)
10869+ ?~ ask [%| 'request ask needs unsupported inference']
10870+ =/ result=(unit itype) (template-apply u.ask ~[[%var 0]])
10871+ ?~ result [%| 'request ask needs unsupported inference']
10872+ =/ callback=itype [%fn reply-sample.u.parts [%var 0]]
10873+ =/ scheme=ischeme [[%fn callback u.result] ~[0]]
10874+ =/ mark=iapi-mark-type i.marks.support
10875+ =/ prelude=iprelude prepared.ev
10876+ =/ public=ifile iface.prelude
10877+ ?~ source.public [%| 'request prelude source needs unsupported inference']
10878+ =/ private=(list iwidth-dependency)
10879+ (skim dependencies.public |=(d=iwidth-dependency =(at.d /lib/jibb/internal/jibb)))
10880+ ?. ?=([* ~] private) [%| 'request internal source needs unsupported inference']
10881+ ?~ source.i.private [%| 'request internal source needs unsupported inference']
10882+ =/ req=irequest-evidence
10883+ [file name.path.p p src u.source.public u.source.i.private values.prelude molds.prelude externals marks]
10884+ =/ interface=ifile [~[[name.path.p scheme]] ~[[name.mark [typ.mark ~]]] file ~ ~ ~ `src `[(silt `(list path)`~[file]) ~[req] modules `public values.prelude molds.prelude externals marks]]
10885+ [%& [support u.parts interface]]
10886+:: Graph-aware request artifact; resolver use remains type-only.
10887+++ one-request-interface-graph
10888+ |= [file=path src=@t externals=iexternals marks=imark-externals modules=jbundle active=(list path) cache=jcache prepared=(unit iprelude)]
10889+ ^- (each ione-request-interface @t)
10890+ =/ out (api-support-analysis-graph file src externals marks modules active cache prepared)
10891+ ?: ?=(%| -.out) [%| p.out]
10892+ =/ support=iapi-support-evidence p.out
10893+ =/ ev=iapi-path-evidence paths.support
10894+ =/ parsed (parse file src)
10895+ ?: ?=(%| -.parsed) [%| 'request source does not parse']
10896+ =/ mod=module p.parsed
10897+ ?. ?=([[%mark *] ~] imports.mod) [%| 'request imports need unsupported inference']
10898+ ?. ?=([[%mold *] ~] defs.mod) [%| 'request definitions need unsupported inference']
10899+ ?. =(%paths name.i.defs.mod) [%| 'request declaration needs unsupported inference']
10900+ ?. ?=([* ~] paths.ev) [%| 'request count needs unsupported inference']
10901+ =/ p=iapi-path-typed i.paths.ev
10902+ =/ parts=(unit iapi-request-parts) (api-request-parts `ev name.path.p)
10903+ ?~ parts [%| 'request components need unsupported inference']
10904+ ?^ parameters.u.parts [%| 'request parameters need unsupported inference']
10905+ ?^ fold.u.parts [%| 'request fold needs unsupported inference']
10906+ ?^ scry.path.p [%| 'request scry needs unsupported inference']
10907+ ?. ?=([* ~] marks.support) [%| 'request marks need unsupported inference']
10908+ ?^ (itype-vars reply-sample.u.parts) [%| 'request payload needs unsupported inference']
10909+ ?: (itype-has-tag reply-sample.u.parts) [%| 'request payload needs unsupported inference']
10910+ =/ ask=(unit ischeme) (request-compatible-ask prepared.ev)
10911+ ?~ ask [%| 'request ask needs unsupported inference']
10912+ =/ result=(unit itype) (template-apply u.ask ~[[%var 0]])
10913+ ?~ result [%| 'request ask needs unsupported inference']
10914+ =/ callback=itype [%fn reply-sample.u.parts [%var 0]]
10915+ =/ scheme=ischeme [[%fn callback u.result] ~[0]]
10916+ =/ mark=iapi-mark-type i.marks.support
10917+ =/ prelude=iprelude prepared.ev
10918+ =/ public=ifile iface.prelude
10919+ ?~ source.public [%| 'request prelude source needs unsupported inference']
10920+ =/ private=(list iwidth-dependency)
10921+ (skim dependencies.public |=(d=iwidth-dependency =(at.d /lib/jibb/internal/jibb)))
10922+ ?. ?=([* ~] private) [%| 'request internal source needs unsupported inference']
10923+ ?~ source.i.private [%| 'request internal source needs unsupported inference']
10924+ =/ req=irequest-evidence
10925+ [file name.path.p p src u.source.public u.source.i.private values.prelude molds.prelude externals marks]
10926+ =/ interface=ifile [~[[name.path.p scheme]] ~[[name.mark [typ.mark ~]]] file ~ ~ ~ `src `[(silt `(list path)`~[file]) ~[req] modules `public values.prelude molds.prelude externals marks]]
10927+ [%& [support u.parts interface]]
1064610928::
1064710929++ api-mark-exports
1064810930 |= [marks=(list term) all=(list term) externals=imark-externals]
@@ -10687,7 +10969,7 @@
1068710969 =/ mark=(unit itype) (find-imported-mark n mark-externals marks)
1068810970 ?~ mark ~
1068910971 =/ sc=ischeme [[%fn u.mark typ.u.poke] ~]
10690− `[~[[n sc]] (api-mark-exports marks marks mark-externals) at ~[[n i.t.t.at n]] ~ ~ ~]
10972+ `[~[[n sc]] (api-mark-exports marks marks mark-externals) at ~[[n i.t.t.at n]] ~ ~ ~ ~]
1069110973::
1069210974++ infer-jibb-file
1069310975 |= [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)]
@@ -10699,9 +10981,16 @@
1069910981 ?^ duplicate [%| (show-duplicate-fields at src u.duplicate)]
1070010982 ?: ?=([%ui %api *] at)
1070110983 =/ iface=(unit ifile) (api-poke-interface at mod mark-externals prelude-values prelude-molds prelude)
10702− ?~ iface [%| (crip "API module needs unsupported inference: {(spud at)}")]
10703− =/ checked=ifile u.iface(source `src)
10704− [%& [checked [[at checked] cache]]]
10984+ ?^ iface
10985+ =/ checked=ifile u.iface(source `src, graph `[(silt `(list path)`~[at]) ~ modules prelude prelude-values prelude-molds externals mark-externals])
10986+ [%& [checked [[at checked] cache]]]
10987+ ?~ prelude [%| (crip "API module needs unsupported inference: {(spud at)}")]
10988+ =/ prepared=iprelude [u.prelude prelude-values prelude-molds]
10989+ =/ request=(each ione-request-interface @t)
10990+ (one-request-interface-graph at src externals mark-externals modules active cache `prepared)
10991+ ?: ?=(%| -.request) [%| (crip "API module needs unsupported inference: {(spud at)}")]
10992+ =/ checked=ifile iface.p.request
10993+ [%& [checked [[at checked] dependencies.paths.support.p.request]]]
1070510994 ?. (module-scope-valid mod prelude-values prelude-molds)
1070610995 ?: (pending-declared-poke at mod prelude-values prelude-molds)
1070710996 [%| (crip "module kind or scope needs unsupported inference: {(spud at)}")]
@@ -10724,7 +11013,10 @@
1072411013 =/ env=ienv env.resolution
1072511014 ?. (module-values-complete defs.mod env)
1072611015 [%| (crip "module definitions need unsupported inference: {(spud at)}")]
10727− =/ iface=ifile [env p.mts at ~ artifacts.resolution ~ `src]
11016+ =/ initial=irequest-graph [(silt `(list path)`~[at]) ~ modules prelude prelude-values prelude-molds externals mark-externals]
11017+ =/ graph=(unit irequest-graph) (request-graph-merge resolved.p.js initial (add 1 (lent resolved.p.js)))
11018+ ?~ graph [%| 'module request evidence needs unsupported inference']
11019+ =/ iface=ifile [env p.mts at ~ artifacts.resolution ~ `src graph]
1072811020 [%& [iface [[at iface] cache.p.js]]]
1072911021::
1073011022:: +golden-types-with-modules fails closed for imports without prelude
tests/golden/types-request-normal/about.txtnew file+4
@@ -0,0 +1,4 @@
1+source: docs/spec/overview.md, Agent APIs: "A path case is a request name, a path and a type. A plain mold is full state"; Effects: "its reply always gets full state."
2+tests: A real mark and one plain API path infer imported request calls at independent cord, ship and generic reply types; wrong callbacks, non-gates, extra arguments and pending constraints remain failures or unsupported. This partial report neither checks watchability nor implements request lowering or runtime validation.
3+expect: parses
4+expect-types: partial inference; module not checked
tests/golden/types-request-normal/mar/full.txtnew file+5
@@ -0,0 +1,5 @@
1+|_ a=@t
2+++ grab |% ++ noun @t --
3+++ grow |% ++ noun a --
4+++ grad %noun
5+--
tests/golden/types-request-normal/marks.txtnew file+1
@@ -0,0 +1 @@
1+full
tests/golden/types-request-normal/module-trees.txtnew file+5
@@ -0,0 +1,5 @@
1+/ui/api/demo.jibb
2+(module
3+ (mark 1:1 %full)
4+ (mold 2:1 paths
5+ (cell 2:10 (const 2:11 %plain) (path 2:18 /plain) (ref 2:25 full))))
tests/golden/types-request-normal/modules.txtnew file+1
@@ -0,0 +1 @@
1+/ui/api/demo.jibb
tests/golden/types-request-normal/modules/ui/api/demo.jibbnew file+2
@@ -0,0 +1,2 @@
1+/% %full
2++$ paths [%plain /plain full]
tests/golden/types-request-normal/source.jibbnew file+9
@@ -0,0 +1,9 @@
1+/= api /ui/api/demo
2+++ cord (plain.api |=(x=@t "ok"))
3+++ ship (plain.api |=(x=@t ~zod))
4+++ generic |= convert=$-(@t A) (plain.api convert)
5+++ wrong-callback (plain.api |=(x=@p "wrong"))
6+++ wrong-value (plain.api "wrong")
7+++ extra (plain.api |=(x=@t "ok") "extra")
8+++ pending ~& %pending
9+ (plain.api |=(x=@t "ok"))
tests/golden/types-request-normal/tokens.txtnew file+95
@@ -0,0 +1,95 @@
1+1:1 glyph /=
2+1:4 name api
3+1:8 glyph /
4+1:9 tight knot ui
5+1:11 tight glyph /
6+1:12 tight knot api
7+1:15 tight glyph /
8+1:16 tight knot demo
9+2:1 NEWLINE
10+2:1 glyph ++
11+2:4 name cord
12+2:9 glyph (
13+2:10 tight wing plain.api
14+2:20 glyph |=(
15+2:23 tight name x
16+2:24 tight glyph =
17+2:25 tight aura @t
18+2:28 str "ok"
19+2:32 tight glyph )
20+2:33 tight glyph )
21+3:1 NEWLINE
22+3:1 glyph ++
23+3:4 name ship
24+3:9 glyph (
25+3:10 tight wing plain.api
26+3:20 glyph |=(
27+3:23 tight name x
28+3:24 tight glyph =
29+3:25 tight aura @t
30+3:28 lit ~zod
31+3:32 tight glyph )
32+3:33 tight glyph )
33+4:1 NEWLINE
34+4:1 glyph ++
35+4:4 name generic
36+4:12 glyph |=
37+4:15 name convert
38+4:22 tight glyph =
39+4:23 tight glyph $-(
40+4:26 tight aura @t
41+4:29 tvar A
42+4:30 tight glyph )
43+4:32 glyph (
44+4:33 tight wing plain.api
45+4:43 name convert
46+4:50 tight glyph )
47+5:1 NEWLINE
48+5:1 glyph ++
49+5:4 name wrong-callback
50+5:19 glyph (
51+5:20 tight wing plain.api
52+5:30 glyph |=(
53+5:33 tight name x
54+5:34 tight glyph =
55+5:35 tight aura @p
56+5:38 str "wrong"
57+5:45 tight glyph )
58+5:46 tight glyph )
59+6:1 NEWLINE
60+6:1 glyph ++
61+6:4 name wrong-value
62+6:16 glyph (
63+6:17 tight wing plain.api
64+6:27 str "wrong"
65+6:34 tight glyph )
66+7:1 NEWLINE
67+7:1 glyph ++
68+7:4 name extra
69+7:10 glyph (
70+7:11 tight wing plain.api
71+7:21 glyph |=(
72+7:24 tight name x
73+7:25 tight glyph =
74+7:26 tight aura @t
75+7:29 str "ok"
76+7:33 tight glyph )
77+7:35 str "extra"
78+7:42 tight glyph )
79+8:1 NEWLINE
80+8:1 glyph ++
81+8:4 name pending
82+8:12 glyph ~&
83+8:15 lit %pending
84+9:3 INDENT
85+9:3 glyph (
86+9:4 tight wing plain.api
87+9:14 glyph |=(
88+9:17 tight name x
89+9:18 tight glyph =
90+9:19 tight aura @t
91+9:22 str "ok"
92+9:26 tight glyph )
93+9:27 tight glyph )
94+9:28 DEDENT
95+9:28 NEWLINE
tests/golden/types-request-normal/tree.txtnew file+50
@@ -0,0 +1,50 @@
1+(module
2+ (jibb 1:1 api /ui/api/demo)
3+ (value 2:1 cord
4+ (group 2:9
5+ (call 2:10
6+ (wing 2:10 plain.api)
7+ (gate-wide 2:20
8+ (face 2:23 x (aura 2:25 @t))
9+ (str 2:28 "ok")))))
10+ (value 3:1 ship
11+ (group 3:9
12+ (call 3:10
13+ (wing 3:10 plain.api)
14+ (gate-wide 3:20
15+ (face 3:23 x (aura 3:25 @t))
16+ (lit 3:28 ~zod)))))
17+ (value 4:1 generic
18+ (gate 4:12
19+ (face 4:15 convert
20+ (fn 4:23 (aura 4:26 @t) (tvar 4:29 A)))
21+ (group 4:32
22+ (call 4:33 (wing 4:33 plain.api) (wing 4:43 convert)))))
23+ (value 5:1 wrong-callback
24+ (group 5:19
25+ (call 5:20
26+ (wing 5:20 plain.api)
27+ (gate-wide 5:30
28+ (face 5:33 x (aura 5:35 @p))
29+ (str 5:38 "wrong")))))
30+ (value 6:1 wrong-value
31+ (group 6:16
32+ (call 6:17 (wing 6:17 plain.api) (str 6:27 "wrong"))))
33+ (value 7:1 extra
34+ (group 7:10
35+ (call 7:11
36+ (wing 7:11 plain.api)
37+ (gate-wide 7:21
38+ (face 7:24 x (aura 7:26 @t))
39+ (str 7:29 "ok"))
40+ (str 7:35 "extra"))))
41+ (value 8:1 pending
42+ (trace 8:12
43+ (lit 8:15 %pending)
44+ (body 9:3
45+ (group 9:3
46+ (call 9:4
47+ (wing 9:4 plain.api)
48+ (gate-wide 9:14
49+ (face 9:17 x (aura 9:19 @t))
50+ (str 9:22 "ok"))))))))
tests/golden/types-request-normal/types.txtnew file+26
@@ -0,0 +1,26 @@
1+partial inference; module not checked
2+++ cord: (ask @t)
3+++ ship: (ask @p)
4+++ generic: $-($-(@t A) (ask A))
5+++ wrong-callback: call's sample and argument types do not unify
6+/tests/golden/types-request-normal/source.jibb:5:20: called gate
7+++ wrong-callback (plain.api |=(x=@p "wrong"))
8+ ^
9+/tests/golden/types-request-normal/source.jibb:5:30: argument has type $-(@p @t)
10+++ wrong-callback (plain.api |=(x=@p "wrong"))
11+ ^
12+++ wrong-value: call's sample and argument types do not unify
13+/tests/golden/types-request-normal/source.jibb:6:17: called gate
14+++ wrong-value (plain.api "wrong")
15+ ^
16+/tests/golden/types-request-normal/source.jibb:6:27: argument has type @t
17+++ wrong-value (plain.api "wrong")
18+ ^
19+++ extra: call's sample and argument types do not unify
20+/tests/golden/types-request-normal/source.jibb:7:11: called gate
21+++ extra (plain.api |=(x=@t "ok") "extra")
22+ ^
23+/tests/golden/types-request-normal/source.jibb:7:21: argument has type [$-(@t @t) @t]
24+++ extra (plain.api |=(x=@t "ok") "extra")
25+ ^
26+++ pending: tag needs context in partial inference
tests/lib/jibb-request-guards.hoonnew file+149
@@ -0,0 +1,149 @@
1+:: Source-backed request certificate and cache boundary checks.
2+/+ jibb
3+/* public %jibb /lib/jibb/prelude/jibb
4+/* internal %jibb /lib/jibb/internal/jibb
5+|%
6+++ request-guard-report
7+ ^- @t
8+ =/ prelude=@t public
9+ =/ src=@t '/% %full\0a+$ paths [%plain /plain full]\0a'
10+ =/ left=@t '/= api /ui/api/demo\0a++ left |= reply=$-(@t A) (plain.api reply)\0a'
11+ =/ right=@t '/= api /ui/api/demo\0a++ right |= reply=$-(@t A) (plain.api reply)\0a'
12+ =/ diamond=@t '/= left /lib/left\0a/= right /lib/right\0a++ cord (left.left |=(x=@t "ok"))\0a++ ship (right.right |=(x=@t ~zod))\0a'
13+ =/ reverse=@t '/= right /lib/right\0a/= left /lib/left\0a++ ship (right.right |=(x=@t ~zod))\0a++ cord (left.left |=(x=@t "ok"))\0a'
14+ =/ other=@t '/= api /ui/api/other\0a++ other |= reply=$-(@t A) (plain.api reply)\0a'
15+ =/ twoapi=@t '/= left /lib/left\0a/= other /lib/other-helper\0a++ cord (left.left |=(x=@t "ok"))\0a++ ship (other.other |=(x=@t ~zod))\0a'
16+ =/ changed=@t '/% %full\0a+$ paths [%changed /changed full]\0a'
17+ =/ prep=(unit iprelude:jibb) (prepare-prelude-with-internal:jibb prelude internal)
18+ ?~ prep 'prelude unavailable'
19+ =/ api=path /ui/api/demo/jibb
20+ =/ client=path /lib/client/jibb
21+ =/ left-at=path /lib/left/jibb
22+ =/ right-at=path /lib/right/jibb
23+ =/ marks=imark-externals:jibb ~[[%full [%& [%atom %t ~]]]]
24+ =/ bundle=jbundle:jibb ~[[api src] [left-at left] [right-at right]]
25+ =/ pre=(unit ifile:jibb) `iface.u.prep
26+ =/ fresh (infer-jibb-file:jibb client diamond ~ marks bundle ~[client] values.u.prep molds.u.prep ~ pre)
27+ ?: ?=(%| -.fresh) (cat 3 'diamond failed: ' p.fresh)
28+ =/ left-iface=(unit ifile:jibb) (find-jibb-cache:jibb left-at cache.p.fresh)
29+ =/ right-iface=(unit ifile:jibb) (find-jibb-cache:jibb right-at cache.p.fresh)
30+ ?~ left-iface 'left interface missing'
31+ ?~ right-iface 'right interface missing'
32+ ?~ graph.u.left-iface 'left source graph missing'
33+ ?~ graph.u.right-iface 'right source graph missing'
34+ ?. ?=([* ~] requests.u.graph.u.left-iface) 'left source certificate missing'
35+ ?. ?=([* ~] requests.u.graph.u.right-iface) 'right source certificate missing'
36+ =/ detached=jcache:jibb ~[[left-at u.left-iface] [right-at u.right-iface]]
37+ =/ reused (infer-jibb-file:jibb client diamond ~ marks bundle ~[client] values.u.prep molds.u.prep detached pre)
38+ ?: ?=(%| -.reused) (cat 3 'detached helper certificates rejected: ' p.reused)
39+ ?~ graph.iface.p.reused 'diamond graph missing'
40+ ?. ?=([* ~] requests.u.graph.iface.p.reused) 'diamond request evidence missing or duplicated'
41+ =/ reversed (infer-jibb-file:jibb client reverse ~ marks bundle ~[client] values.u.prep molds.u.prep detached pre)
42+ ?: ?=(%| -.reversed) (cat 3 'reversed diamond rejected: ' p.reversed)
43+ ?~ graph.iface.p.reversed 'reversed diamond graph missing'
44+ ?. ?=([* ~] requests.u.graph.iface.p.reversed) 'reversed diamond duplicated request'
45+ =/ other-api=path /ui/api/other/jibb
46+ =/ other-at=path /lib/other-helper/jibb
47+ =/ multi-bundle=jbundle:jibb ~[[api src] [left-at left] [other-api src] [other-at other]]
48+ =/ multi (infer-jibb-file:jibb client twoapi ~ marks multi-bundle ~[client] values.u.prep molds.u.prep ~ pre)
49+ ?: ?=(%| -.multi) (cat 3 'different API paths failed: ' p.multi)
50+ ?~ graph.iface.p.multi 'different API graph missing'
51+ =/ all=(list irequest-evidence:jibb) requests.u.graph.iface.p.multi
52+ ?. =((lent all) 2) 'distinct API path requests were merged'
53+ ?. =((lent (skim all |=(r=irequest-evidence:jibb =(api-at.r api)))) 1) 'original API identity lost'
54+ ?. =((lent (skim all |=(r=irequest-evidence:jibb =(api-at.r other-api)))) 1) 'other API identity lost'
55+ =/ missing-api=jbundle:jibb ~[[left-at left] [right-at right]]
56+ =/ absent (infer-jibb-file:jibb client diamond ~ marks missing-api ~[client] values.u.prep molds.u.prep detached pre)
57+ ?: ?=(%& -.absent) 'missing certified API source accepted'
58+ =/ different-api=jbundle:jibb ~[[api changed] [left-at left] [right-at right]]
59+ =/ stale (infer-jibb-file:jibb client diamond ~ marks different-api ~[client] values.u.prep molds.u.prep detached pre)
60+ ?: ?=(%& -.stale) 'changed API source accepted'
61+ =/ duplicate-api=jbundle:jibb ~[[api src] [api src] [left-at left] [right-at right]]
62+ =/ duplicate (infer-jibb-file:jibb client diamond ~ marks duplicate-api ~[client] values.u.prep molds.u.prep detached pre)
63+ ?: ?=(%& -.duplicate) 'duplicate certified API sources accepted'
64+ =/ different-marks=imark-externals:jibb ~[[%full [%& [%atom %p ~]]]]
65+ =/ stale-mark (infer-jibb-file:jibb client diamond ~ different-marks bundle ~[client] values.u.prep molds.u.prep detached pre)
66+ ?: ?=(%& -.stale-mark) 'changed reader result accepted'
67+ =/ changed-public=@t (cat 3 prelude '\0a:: modified\0a')
68+ =/ public-prep=(unit iprelude:jibb) (prepare-prelude-with-internal:jibb changed-public internal)
69+ ?~ public-prep 'comment-only prelude did not prepare'
70+ =/ stale-public (infer-jibb-file:jibb client diamond ~ marks bundle ~[client] values.u.public-prep molds.u.public-prep detached `iface.u.public-prep)
71+ ?: ?=(%& -.stale-public) 'changed public source accepted'
72+ =/ changed-internal=@t (cat 3 internal '\0a:: modified\0a')
73+ =/ internal-prep=(unit iprelude:jibb) (prepare-prelude-with-internal:jibb prelude changed-internal)
74+ ?~ internal-prep 'comment-only internal did not prepare'
75+ =/ stale-internal (infer-jibb-file:jibb client diamond ~ marks bundle ~[client] values.u.internal-prep molds.u.internal-prep detached `iface.u.internal-prep)
76+ ?: ?=(%& -.stale-internal) 'changed internal source accepted'
77+ 'certificate controls passed'
78+++ request-legacy-report
79+ ^- @t
80+ =/ prelude=@t public
81+ =/ src=@t '/% %full\0a+$ paths [%plain /plain full]\0a'
82+ =/ helper=@t '/= api /ui/api/demo\0a++ fetch |= reply=$-(@t A) (plain.api reply)\0a'
83+ =/ transitive=@t '/= lib /lib/helper\0a++ cord (fetch.lib |=(x=@t "ok"))\0a++ ship (fetch.lib |=(x=@t ~zod))\0a'
84+ =/ prep=(unit iprelude:jibb) (prepare-prelude-with-internal:jibb prelude internal)
85+ ?~ prep 'prelude unavailable'
86+ =/ api=path /ui/api/demo/jibb
87+ =/ client=path /lib/client/jibb
88+ =/ helper-at=path /lib/helper/jibb
89+ =/ marks=imark-externals:jibb ~[[%full [%& [%atom %t ~]]]]
90+ =/ bundle=jbundle:jibb ~[[api src] [helper-at helper]]
91+ =/ pre=(unit ifile:jibb) `iface.u.prep
92+ =/ simple=@t '++ value "old"\0a'
93+ =/ simple-root=@t '/= h /lib/helper\0a++ value value.h\0a'
94+ =/ simple-bundle=jbundle:jibb ~[[helper-at simple]]
95+ =/ simple-built (infer-jibb-file:jibb helper-at simple ~ marks simple-bundle ~[helper-at] values.u.prep molds.u.prep ~ pre)
96+ ?: ?=(%| -.simple-built) 'simple helper setup failed'
97+ =/ legacy=ifile:jibb iface.p.simple-built(graph ~)
98+ =/ old-cache=jcache:jibb ~[[helper-at legacy]]
99+ =/ rebuilt (infer-jibb-file:jibb client simple-root ~ marks simple-bundle ~[client] values.u.prep molds.u.prep old-cache pre)
100+ ?: ?=(%| -.rebuilt) (cat 3 'legacy simple rebuild failed: ' p.rebuilt)
101+ =/ simple-new=(unit ifile:jibb) (find-jibb-cache:jibb helper-at cache.p.rebuilt)
102+ ?~ simple-new 'rebuilt simple helper missing'
103+ ?~ graph.u.simple-new 'simple helper was not recertified'
104+ =/ upgraded (infer-jibb-file:jibb client transitive ~ marks bundle ~[client] values.u.prep molds.u.prep old-cache pre)
105+ ?: ?=(%| -.upgraded) (cat 3 'legacy changed helper failed: ' p.upgraded)
106+ =/ new=(unit ifile:jibb) (find-jibb-cache:jibb helper-at cache.p.upgraded)
107+ ?~ new 'rebuilt request helper missing'
108+ ?. =(source.u.new `helper) 'legacy helper source survived'
109+ ?~ graph.u.new 'request helper graph missing'
110+ ?. ?=([* ~] requests.u.graph.u.new) 'request helper evidence missing'
111+ =/ duplicated=jcache:jibb ~[[helper-at legacy] [helper-at legacy]]
112+ =/ duplicate-rebuilt (infer-jibb-file:jibb client simple-root ~ marks simple-bundle ~[client] values.u.prep molds.u.prep duplicated pre)
113+ ?: ?=(%| -.duplicate-rebuilt) 'duplicate legacy rebuild failed'
114+ =/ helper-entries (skim cache.p.duplicate-rebuilt |=(c=[at=path iface=ifile:jibb] =(at.c helper-at)))
115+ ?. ?=([* ~] helper-entries) 'duplicate stale helper entries remained'
116+ =/ api-iface=(unit ifile:jibb) (find-jibb-cache:jibb api cache.p.upgraded)
117+ ?~ api-iface 'rebuilt API interface missing'
118+ =/ legacy-api=ifile:jibb u.api-iface(graph ~)
119+ =/ both-stale=jcache:jibb ~[[helper-at legacy] [api legacy-api]]
120+ =/ child-rebuilt (infer-jibb-file:jibb client transitive ~ marks bundle ~[client] values.u.prep molds.u.prep both-stale pre)
121+ ?: ?=(%| -.child-rebuilt) 'transitive unknown child rebuild failed'
122+ =/ api-new=(unit ifile:jibb) (find-jibb-cache:jibb api cache.p.child-rebuilt)
123+ ?~ api-new 'rebuilt transitive API missing'
124+ ?~ graph.u.api-new 'rebuilt transitive API has no graph'
125+ ?. ?=([* ~] requests.u.graph.u.api-new) 'rebuilt transitive API request missing'
126+ =/ mismatched=ifile:jibb legacy(at /lib/other/jibb)
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)
129+ ?: ?=(%& -.wrong) 'cache key and interface path mismatch accepted'
130+ =/ old-client=@t '++ text "safe"\0a'
131+ =/ dep=@t '/= c /lib/client\0a++ value text.c\0a'
132+ =/ root=@t '/= h /lib/helper\0a++ x value.h\0a'
133+ =/ cycle-bundle=jbundle:jibb ~[[client old-client] [helper-at dep]]
134+ =/ cycle-legacy=ifile:jibb legacy(source `dep)
135+ =/ cycle-cache=jcache:jibb ~[[helper-at cycle-legacy]]
136+ =/ cycle (infer-jibb-file:jibb client root ~ marks cycle-bundle ~[client] values.u.prep molds.u.prep cycle-cache pre)
137+ ?: ?=(%& -.cycle) 'legacy ancestor cycle accepted'
138+ 'legacy cache controls passed'
139+++ request-guard-errors
140+ ^- (list tape)
141+ =/ result=@t request-guard-report
142+ ?. =(result 'certificate controls passed') ~[(trip result)]
143+ =/ legacy=@t request-legacy-report
144+ ?: =(legacy 'legacy cache controls passed') ~
145+ ~[(trip legacy)]
146+++ test-request-guard
147+ ^- tang
148+ (turn request-guard-errors |=(reason=tape leaf+reason))
149+--
tests/lib/jibb.hoon+262−253
@@ -2157,212 +2157,219 @@
21572157/* tok-590 %txt /tests/golden/types-recursive-sample/tokens/txt
21582158/* tre-590 %txt /tests/golden/types-recursive-sample/tree/txt
21592159/* typ-590 %txt /tests/golden/types-recursive-sample/types/txt
2160−/* src-591 %jibb /tests/golden/types-scope-library-poke/source/jibb
2161−/* tok-591 %txt /tests/golden/types-scope-library-poke/tokens/txt
2162−/* tre-591 %txt /tests/golden/types-scope-library-poke/tree/txt
2163−/* typ-591 %txt /tests/golden/types-scope-library-poke/types/txt
2164−/* src-592 %jibb /tests/golden/types-scope-root-api/source/jibb
2165−/* tok-592 %txt /tests/golden/types-scope-root-api/tokens/txt
2166−/* tre-592 %txt /tests/golden/types-scope-root-api/tree/txt
2167−/* typ-592 %txt /tests/golden/types-scope-root-api/types/txt
2168−/* src-593 %jibb /tests/golden/types-scope-store-duplicate/source/jibb
2169−/* tok-593 %txt /tests/golden/types-scope-store-duplicate/tokens/txt
2170−/* tre-593 %txt /tests/golden/types-scope-store-duplicate/tree/txt
2171−/* typ-593 %txt /tests/golden/types-scope-store-duplicate/types/txt
2172−/* src-594 %jibb /tests/golden/types-scope-store-shadow/source/jibb
2173−/* tok-594 %txt /tests/golden/types-scope-store-shadow/tokens/txt
2174−/* tre-594 %txt /tests/golden/types-scope-store-shadow/tree/txt
2175−/* typ-594 %txt /tests/golden/types-scope-store-shadow/types/txt
2176−/* src-595 %jibb /tests/golden/types-single-case-pattern/source/jibb
2177−/* tok-595 %txt /tests/golden/types-single-case-pattern/tokens/txt
2178−/* tre-595 %txt /tests/golden/types-single-case-pattern/tree/txt
2179−/* typ-595 %txt /tests/golden/types-single-case-pattern/types/txt
2180−/* src-596 %jibb /tests/golden/types-string-interpolation/source/jibb
2181−/* tok-596 %txt /tests/golden/types-string-interpolation/tokens/txt
2182−/* tre-596 %txt /tests/golden/types-string-interpolation/tree/txt
2183−/* typ-596 %txt /tests/golden/types-string-interpolation/types/txt
2184−/* src-597 %jibb /tests/golden/types-tuple-context/source/jibb
2185−/* tok-597 %txt /tests/golden/types-tuple-context/tokens/txt
2186−/* tre-597 %txt /tests/golden/types-tuple-context/tree/txt
2187−/* typ-597 %txt /tests/golden/types-tuple-context/types/txt
2188−/* src-598 %jibb /tests/golden/types-tuple-context-nested/source/jibb
2189−/* tok-598 %txt /tests/golden/types-tuple-context-nested/tokens/txt
2190−/* tre-598 %txt /tests/golden/types-tuple-context-nested/tree/txt
2191−/* typ-598 %txt /tests/golden/types-tuple-context-nested/types/txt
2192−/* src-599 %jibb /tests/golden/types-union-alias/source/jibb
2193−/* tok-599 %txt /tests/golden/types-union-alias/tokens/txt
2194−/* tre-599 %txt /tests/golden/types-union-alias/tree/txt
2195−/* typ-599 %txt /tests/golden/types-union-alias/types/txt
2196−/* src-600 %jibb /tests/golden/types-union-branch-context/source/jibb
2197−/* tok-600 %txt /tests/golden/types-union-branch-context/tokens/txt
2198−/* tre-600 %txt /tests/golden/types-union-branch-context/tree/txt
2199−/* typ-600 %txt /tests/golden/types-union-branch-context/types/txt
2200−/* src-601 %jibb /tests/golden/types-union-branch-pending/source/jibb
2201−/* tok-601 %txt /tests/golden/types-union-branch-pending/tokens/txt
2202−/* tre-601 %txt /tests/golden/types-union-branch-pending/tree/txt
2203−/* typ-601 %txt /tests/golden/types-union-branch-pending/types/txt
2204−/* src-602 %jibb /tests/golden/types-union-constructor-shape/source/jibb
2205−/* tok-602 %txt /tests/golden/types-union-constructor-shape/tokens/txt
2206−/* tre-602 %txt /tests/golden/types-union-constructor-shape/tree/txt
2207−/* typ-602 %txt /tests/golden/types-union-constructor-shape/types/txt
2208−/* src-603 %jibb /tests/golden/types-union-context-flow/source/jibb
2209−/* tok-603 %txt /tests/golden/types-union-context-flow/tokens/txt
2210−/* tre-603 %txt /tests/golden/types-union-context-flow/tree/txt
2211−/* typ-603 %txt /tests/golden/types-union-context-flow/types/txt
2212−/* src-604 %jibb /tests/golden/types-union-finite/source/jibb
2213−/* tok-604 %txt /tests/golden/types-union-finite/tokens/txt
2214−/* tre-604 %txt /tests/golden/types-union-finite/tree/txt
2215−/* typ-604 %txt /tests/golden/types-union-finite/types/txt
2216−/* src-605 %jibb /tests/golden/types-union-finite-context/source/jibb
2217−/* tok-605 %txt /tests/golden/types-union-finite-context/tokens/txt
2218−/* tre-605 %txt /tests/golden/types-union-finite-context/tree/txt
2219−/* typ-605 %txt /tests/golden/types-union-finite-context/types/txt
2220−/* src-606 %jibb /tests/golden/types-union-finite-generic/source/jibb
2221−/* tok-606 %txt /tests/golden/types-union-finite-generic/tokens/txt
2222−/* tre-606 %txt /tests/golden/types-union-finite-generic/tree/txt
2223−/* typ-606 %txt /tests/golden/types-union-finite-generic/types/txt
2224−/* src-607 %jibb /tests/golden/types-union-finite-limit/source/jibb
2225−/* tok-607 %txt /tests/golden/types-union-finite-limit/tokens/txt
2226−/* tre-607 %txt /tests/golden/types-union-finite-limit/tree/txt
2227−/* typ-607 %txt /tests/golden/types-union-finite-limit/types/txt
2228−/* src-608 %jibb /tests/golden/types-union-import/source/jibb
2229−/* tok-608 %txt /tests/golden/types-union-import/tokens/txt
2230−/* tre-608 %txt /tests/golden/types-union-import/tree/txt
2231−/* mod-608-1 %jibb /tests/golden/types-union-import/modules/ui/lib/jibb
2232−/* typ-608 %txt /tests/golden/types-union-import/types/txt
2233−/* mtre-608 %txt /tests/golden/types-union-import/module-trees/txt
2234−/* src-609 %jibb /tests/golden/types-union-local-pending/source/jibb
2235−/* tok-609 %txt /tests/golden/types-union-local-pending/tokens/txt
2236−/* tre-609 %txt /tests/golden/types-union-local-pending/tree/txt
2237−/* typ-609 %txt /tests/golden/types-union-local-pending/types/txt
2238−/* src-610 %jibb /tests/golden/types-union-nonwing-subject/source/jibb
2239−/* tok-610 %txt /tests/golden/types-union-nonwing-subject/tokens/txt
2240−/* tre-610 %txt /tests/golden/types-union-nonwing-subject/tree/txt
2241−/* typ-610 %txt /tests/golden/types-union-nonwing-subject/types/txt
2242−/* src-611 %jibb /tests/golden/types-union-overlap/source/jibb
2243−/* tok-611 %txt /tests/golden/types-union-overlap/tokens/txt
2244−/* tre-611 %txt /tests/golden/types-union-overlap/tree/txt
2245−/* typ-611 %txt /tests/golden/types-union-overlap/types/txt
2246−/* src-612 %jibb /tests/golden/types-union-overlap-nested/source/jibb
2247−/* tok-612 %txt /tests/golden/types-union-overlap-nested/tokens/txt
2248−/* tre-612 %txt /tests/golden/types-union-overlap-nested/tree/txt
2249−/* typ-612 %txt /tests/golden/types-union-overlap-nested/types/txt
2250−/* src-613 %jibb /tests/golden/types-union-pattern-result-context/source/jibb
2251−/* tok-613 %txt /tests/golden/types-union-pattern-result-context/tokens/txt
2252−/* tre-613 %txt /tests/golden/types-union-pattern-result-context/tree/txt
2253−/* typ-613 %txt /tests/golden/types-union-pattern-result-context/types/txt
2254−/* src-614 %jibb /tests/golden/types-union-pattern-result-controls/source/jibb
2255−/* tok-614 %txt /tests/golden/types-union-pattern-result-controls/tokens/txt
2256−/* tre-614 %txt /tests/golden/types-union-pattern-result-controls/tree/txt
2257−/* typ-614 %txt /tests/golden/types-union-pattern-result-controls/types/txt
2258−/* src-615 %jibb /tests/golden/types-union-patterns/source/jibb
2259−/* tok-615 %txt /tests/golden/types-union-patterns/tokens/txt
2260−/* tre-615 %txt /tests/golden/types-union-patterns/tree/txt
2261−/* typ-615 %txt /tests/golden/types-union-patterns/types/txt
2262−/* src-616 %jibb /tests/golden/types-union-patterns-generic/source/jibb
2263−/* tok-616 %txt /tests/golden/types-union-patterns-generic/tokens/txt
2264−/* tre-616 %txt /tests/golden/types-union-patterns-generic/tree/txt
2265−/* typ-616 %txt /tests/golden/types-union-patterns-generic/types/txt
2266−/* src-617 %jibb /tests/golden/types-union-patterns-import/source/jibb
2267−/* tok-617 %txt /tests/golden/types-union-patterns-import/tokens/txt
2268−/* tre-617 %txt /tests/golden/types-union-patterns-import/tree/txt
2269−/* mod-617-1 %jibb /tests/golden/types-union-patterns-import/modules/ui/lib/jibb
2270−/* typ-617 %txt /tests/golden/types-union-patterns-import/types/txt
2271−/* mtre-617 %txt /tests/golden/types-union-patterns-import/module-trees/txt
2272−/* src-618 %jibb /tests/golden/types-union-phantom-generic/source/jibb
2273−/* tok-618 %txt /tests/golden/types-union-phantom-generic/tokens/txt
2274−/* tre-618 %txt /tests/golden/types-union-phantom-generic/tree/txt
2275−/* typ-618 %txt /tests/golden/types-union-phantom-generic/types/txt
2276−/* src-619 %jibb /tests/golden/types-union-polymorphic-identity/source/jibb
2277−/* tok-619 %txt /tests/golden/types-union-polymorphic-identity/tokens/txt
2278−/* tre-619 %txt /tests/golden/types-union-polymorphic-identity/tree/txt
2279−/* mod-619-1 %jibb /tests/golden/types-union-polymorphic-identity/modules/ui/one/jibb
2280−/* mod-619-2 %jibb /tests/golden/types-union-polymorphic-identity/modules/ui/two/jibb
2281−/* typ-619 %txt /tests/golden/types-union-polymorphic-identity/types/txt
2282−/* mtre-619 %txt /tests/golden/types-union-polymorphic-identity/module-trees/txt
2283−/* src-620 %jibb /tests/golden/types-union-print-cross-namespace/source/jibb
2284−/* tok-620 %txt /tests/golden/types-union-print-cross-namespace/tokens/txt
2285−/* tre-620 %txt /tests/golden/types-union-print-cross-namespace/tree/txt
2286−/* mod-620-1 %jibb /tests/golden/types-union-print-cross-namespace/modules/ui/lib/jibb
2287−/* typ-620 %txt /tests/golden/types-union-print-cross-namespace/types/txt
2288−/* mtre-620 %txt /tests/golden/types-union-print-cross-namespace/module-trees/txt
2289−/* src-621 %jibb /tests/golden/types-union-print-distinct/source/jibb
2290−/* tok-621 %txt /tests/golden/types-union-print-distinct/tokens/txt
2291−/* tre-621 %txt /tests/golden/types-union-print-distinct/tree/txt
2292−/* mod-621-1 %jibb /tests/golden/types-union-print-distinct/modules/ui/left/jibb
2293−/* mod-621-2 %jibb /tests/golden/types-union-print-distinct/modules/ui/right/jibb
2294−/* mod-621-3 %jibb /tests/golden/types-union-print-distinct/modules/ui/twin/jibb
2295−/* typ-621 %txt /tests/golden/types-union-print-distinct/types/txt
2296−/* mtre-621 %txt /tests/golden/types-union-print-distinct/module-trees/txt
2297−/* src-622 %jibb /tests/golden/types-union-print-escape/source/jibb
2298−/* tok-622 %txt /tests/golden/types-union-print-escape/tokens/txt
2299−/* tre-622 %txt /tests/golden/types-union-print-escape/tree/txt
2300−/* typ-622 %txt /tests/golden/types-union-print-escape/types/txt
2301−/* src-623 %jibb /tests/golden/types-union-print-local/source/jibb
2302−/* tok-623 %txt /tests/golden/types-union-print-local/tokens/txt
2303−/* tre-623 %txt /tests/golden/types-union-print-local/tree/txt
2304−/* typ-623 %txt /tests/golden/types-union-print-local/types/txt
2305−/* src-624 %jibb /tests/golden/types-union-print-nested/source/jibb
2306−/* tok-624 %txt /tests/golden/types-union-print-nested/tokens/txt
2307−/* tre-624 %txt /tests/golden/types-union-print-nested/tree/txt
2308−/* typ-624 %txt /tests/golden/types-union-print-nested/types/txt
2309−/* src-625 %jibb /tests/golden/types-union-print-same-origin/source/jibb
2310−/* tok-625 %txt /tests/golden/types-union-print-same-origin/tokens/txt
2311−/* tre-625 %txt /tests/golden/types-union-print-same-origin/tree/txt
2312−/* mod-625-1 %jibb /tests/golden/types-union-print-same-origin/modules/ui/shared/jibb
2313−/* typ-625 %txt /tests/golden/types-union-print-same-origin/types/txt
2314−/* mtre-625 %txt /tests/golden/types-union-print-same-origin/module-trees/txt
2315−/* src-626 %jibb /tests/golden/types-union-print-transitive/source/jibb
2316−/* tok-626 %txt /tests/golden/types-union-print-transitive/tokens/txt
2317−/* tre-626 %txt /tests/golden/types-union-print-transitive/tree/txt
2318−/* mod-626-1 %jibb /tests/golden/types-union-print-transitive/modules/ui/mid/jibb
2319−/* mod-626-2 %jibb /tests/golden/types-union-print-transitive/modules/ui/base/jibb
2320−/* typ-626 %txt /tests/golden/types-union-print-transitive/types/txt
2321−/* mtre-626 %txt /tests/golden/types-union-print-transitive/module-trees/txt
2322−/* src-627 %jibb /tests/golden/types-union-singleton/source/jibb
2323−/* tok-627 %txt /tests/golden/types-union-singleton/tokens/txt
2324−/* tre-627 %txt /tests/golden/types-union-singleton/tree/txt
2325−/* typ-627 %txt /tests/golden/types-union-singleton/types/txt
2326−/* src-628 %jibb /tests/golden/types-union-tag-atoms/source/jibb
2327−/* tok-628 %txt /tests/golden/types-union-tag-atoms/tokens/txt
2328−/* tre-628 %txt /tests/golden/types-union-tag-atoms/tree/txt
2329−/* typ-628 %txt /tests/golden/types-union-tag-atoms/types/txt
2330−/* src-629 %jibb /tests/golden/types-union-tags/source/jibb
2331−/* tok-629 %txt /tests/golden/types-union-tags/tokens/txt
2332−/* tre-629 %txt /tests/golden/types-union-tags/tree/txt
2333−/* typ-629 %txt /tests/golden/types-union-tags/types/txt
2334−/* src-630 %jibb /tests/golden/types-union-unresolved/source/jibb
2335−/* tok-630 %txt /tests/golden/types-union-unresolved/tokens/txt
2336−/* tre-630 %txt /tests/golden/types-union-unresolved/tree/txt
2337−/* typ-630 %txt /tests/golden/types-union-unresolved/types/txt
2338−/* src-631 %jibb /tests/golden/types-union-unresolved-flow/source/jibb
2339−/* tok-631 %txt /tests/golden/types-union-unresolved-flow/tokens/txt
2340−/* tre-631 %txt /tests/golden/types-union-unresolved-flow/tree/txt
2341−/* typ-631 %txt /tests/golden/types-union-unresolved-flow/types/txt
2342−/* src-632 %jibb /tests/golden/types-unit-construction/source/jibb
2343−/* tok-632 %txt /tests/golden/types-unit-construction/tokens/txt
2344−/* tre-632 %txt /tests/golden/types-unit-construction/tree/txt
2345−/* typ-632 %txt /tests/golden/types-unit-construction/types/txt
2346−/* src-633 %jibb /tests/golden/types-unit-context/source/jibb
2347−/* tok-633 %txt /tests/golden/types-unit-context/tokens/txt
2348−/* tre-633 %txt /tests/golden/types-unit-context/tree/txt
2349−/* typ-633 %txt /tests/golden/types-unit-context/types/txt
2350−/* src-634 %jibb /tests/golden/types-unit-patterns/source/jibb
2351−/* tok-634 %txt /tests/golden/types-unit-patterns/tokens/txt
2352−/* tre-634 %txt /tests/golden/types-unit-patterns/tree/txt
2353−/* typ-634 %txt /tests/golden/types-unit-patterns/types/txt
2354−/* src-635 %jibb /tests/golden/types-value-cycle-shadow/source/jibb
2355−/* tok-635 %txt /tests/golden/types-value-cycle-shadow/tokens/txt
2356−/* tre-635 %txt /tests/golden/types-value-cycle-shadow/tree/txt
2357−/* typ-635 %txt /tests/golden/types-value-cycle-shadow/types/txt
2358−/* src-636 %jibb /tests/golden/types-value-cycle-unsupported/source/jibb
2359−/* tok-636 %txt /tests/golden/types-value-cycle-unsupported/tokens/txt
2360−/* tre-636 %txt /tests/golden/types-value-cycle-unsupported/tree/txt
2361−/* typ-636 %txt /tests/golden/types-value-cycle-unsupported/types/txt
2362−/* src-637 %jibb /tests/golden/types-value-cycles/source/jibb
2363−/* tok-637 %txt /tests/golden/types-value-cycles/tokens/txt
2364−/* tre-637 %txt /tests/golden/types-value-cycles/tree/txt
2365−/* typ-637 %txt /tests/golden/types-value-cycles/types/txt
2160+/* src-591 %jibb /tests/golden/types-request-normal/source/jibb
2161+/* tok-591 %txt /tests/golden/types-request-normal/tokens/txt
2162+/* tre-591 %txt /tests/golden/types-request-normal/tree/txt
2163+/* mod-591-1 %jibb /tests/golden/types-request-normal/modules/ui/api/demo/jibb
2164+/* typ-591 %txt /tests/golden/types-request-normal/types/txt
2165+/* mark-591-1 %txt /tests/golden/types-request-normal/mar/full/txt
2166+/* mtre-591 %txt /tests/golden/types-request-normal/module-trees/txt
2167+/* src-592 %jibb /tests/golden/types-scope-library-poke/source/jibb
2168+/* tok-592 %txt /tests/golden/types-scope-library-poke/tokens/txt
2169+/* tre-592 %txt /tests/golden/types-scope-library-poke/tree/txt
2170+/* typ-592 %txt /tests/golden/types-scope-library-poke/types/txt
2171+/* src-593 %jibb /tests/golden/types-scope-root-api/source/jibb
2172+/* tok-593 %txt /tests/golden/types-scope-root-api/tokens/txt
2173+/* tre-593 %txt /tests/golden/types-scope-root-api/tree/txt
2174+/* typ-593 %txt /tests/golden/types-scope-root-api/types/txt
2175+/* src-594 %jibb /tests/golden/types-scope-store-duplicate/source/jibb
2176+/* tok-594 %txt /tests/golden/types-scope-store-duplicate/tokens/txt
2177+/* tre-594 %txt /tests/golden/types-scope-store-duplicate/tree/txt
2178+/* typ-594 %txt /tests/golden/types-scope-store-duplicate/types/txt
2179+/* src-595 %jibb /tests/golden/types-scope-store-shadow/source/jibb
2180+/* tok-595 %txt /tests/golden/types-scope-store-shadow/tokens/txt
2181+/* tre-595 %txt /tests/golden/types-scope-store-shadow/tree/txt
2182+/* typ-595 %txt /tests/golden/types-scope-store-shadow/types/txt
2183+/* src-596 %jibb /tests/golden/types-single-case-pattern/source/jibb
2184+/* tok-596 %txt /tests/golden/types-single-case-pattern/tokens/txt
2185+/* tre-596 %txt /tests/golden/types-single-case-pattern/tree/txt
2186+/* typ-596 %txt /tests/golden/types-single-case-pattern/types/txt
2187+/* src-597 %jibb /tests/golden/types-string-interpolation/source/jibb
2188+/* tok-597 %txt /tests/golden/types-string-interpolation/tokens/txt
2189+/* tre-597 %txt /tests/golden/types-string-interpolation/tree/txt
2190+/* typ-597 %txt /tests/golden/types-string-interpolation/types/txt
2191+/* src-598 %jibb /tests/golden/types-tuple-context/source/jibb
2192+/* tok-598 %txt /tests/golden/types-tuple-context/tokens/txt
2193+/* tre-598 %txt /tests/golden/types-tuple-context/tree/txt
2194+/* typ-598 %txt /tests/golden/types-tuple-context/types/txt
2195+/* src-599 %jibb /tests/golden/types-tuple-context-nested/source/jibb
2196+/* tok-599 %txt /tests/golden/types-tuple-context-nested/tokens/txt
2197+/* tre-599 %txt /tests/golden/types-tuple-context-nested/tree/txt
2198+/* typ-599 %txt /tests/golden/types-tuple-context-nested/types/txt
2199+/* src-600 %jibb /tests/golden/types-union-alias/source/jibb
2200+/* tok-600 %txt /tests/golden/types-union-alias/tokens/txt
2201+/* tre-600 %txt /tests/golden/types-union-alias/tree/txt
2202+/* typ-600 %txt /tests/golden/types-union-alias/types/txt
2203+/* src-601 %jibb /tests/golden/types-union-branch-context/source/jibb
2204+/* tok-601 %txt /tests/golden/types-union-branch-context/tokens/txt
2205+/* tre-601 %txt /tests/golden/types-union-branch-context/tree/txt
2206+/* typ-601 %txt /tests/golden/types-union-branch-context/types/txt
2207+/* src-602 %jibb /tests/golden/types-union-branch-pending/source/jibb
2208+/* tok-602 %txt /tests/golden/types-union-branch-pending/tokens/txt
2209+/* tre-602 %txt /tests/golden/types-union-branch-pending/tree/txt
2210+/* typ-602 %txt /tests/golden/types-union-branch-pending/types/txt
2211+/* src-603 %jibb /tests/golden/types-union-constructor-shape/source/jibb
2212+/* tok-603 %txt /tests/golden/types-union-constructor-shape/tokens/txt
2213+/* tre-603 %txt /tests/golden/types-union-constructor-shape/tree/txt
2214+/* typ-603 %txt /tests/golden/types-union-constructor-shape/types/txt
2215+/* src-604 %jibb /tests/golden/types-union-context-flow/source/jibb
2216+/* tok-604 %txt /tests/golden/types-union-context-flow/tokens/txt
2217+/* tre-604 %txt /tests/golden/types-union-context-flow/tree/txt
2218+/* typ-604 %txt /tests/golden/types-union-context-flow/types/txt
2219+/* src-605 %jibb /tests/golden/types-union-finite/source/jibb
2220+/* tok-605 %txt /tests/golden/types-union-finite/tokens/txt
2221+/* tre-605 %txt /tests/golden/types-union-finite/tree/txt
2222+/* typ-605 %txt /tests/golden/types-union-finite/types/txt
2223+/* src-606 %jibb /tests/golden/types-union-finite-context/source/jibb
2224+/* tok-606 %txt /tests/golden/types-union-finite-context/tokens/txt
2225+/* tre-606 %txt /tests/golden/types-union-finite-context/tree/txt
2226+/* typ-606 %txt /tests/golden/types-union-finite-context/types/txt
2227+/* src-607 %jibb /tests/golden/types-union-finite-generic/source/jibb
2228+/* tok-607 %txt /tests/golden/types-union-finite-generic/tokens/txt
2229+/* tre-607 %txt /tests/golden/types-union-finite-generic/tree/txt
2230+/* typ-607 %txt /tests/golden/types-union-finite-generic/types/txt
2231+/* src-608 %jibb /tests/golden/types-union-finite-limit/source/jibb
2232+/* tok-608 %txt /tests/golden/types-union-finite-limit/tokens/txt
2233+/* tre-608 %txt /tests/golden/types-union-finite-limit/tree/txt
2234+/* typ-608 %txt /tests/golden/types-union-finite-limit/types/txt
2235+/* src-609 %jibb /tests/golden/types-union-import/source/jibb
2236+/* tok-609 %txt /tests/golden/types-union-import/tokens/txt
2237+/* tre-609 %txt /tests/golden/types-union-import/tree/txt
2238+/* mod-609-1 %jibb /tests/golden/types-union-import/modules/ui/lib/jibb
2239+/* typ-609 %txt /tests/golden/types-union-import/types/txt
2240+/* mtre-609 %txt /tests/golden/types-union-import/module-trees/txt
2241+/* src-610 %jibb /tests/golden/types-union-local-pending/source/jibb
2242+/* tok-610 %txt /tests/golden/types-union-local-pending/tokens/txt
2243+/* tre-610 %txt /tests/golden/types-union-local-pending/tree/txt
2244+/* typ-610 %txt /tests/golden/types-union-local-pending/types/txt
2245+/* src-611 %jibb /tests/golden/types-union-nonwing-subject/source/jibb
2246+/* tok-611 %txt /tests/golden/types-union-nonwing-subject/tokens/txt
2247+/* tre-611 %txt /tests/golden/types-union-nonwing-subject/tree/txt
2248+/* typ-611 %txt /tests/golden/types-union-nonwing-subject/types/txt
2249+/* src-612 %jibb /tests/golden/types-union-overlap/source/jibb
2250+/* tok-612 %txt /tests/golden/types-union-overlap/tokens/txt
2251+/* tre-612 %txt /tests/golden/types-union-overlap/tree/txt
2252+/* typ-612 %txt /tests/golden/types-union-overlap/types/txt
2253+/* src-613 %jibb /tests/golden/types-union-overlap-nested/source/jibb
2254+/* tok-613 %txt /tests/golden/types-union-overlap-nested/tokens/txt
2255+/* tre-613 %txt /tests/golden/types-union-overlap-nested/tree/txt
2256+/* typ-613 %txt /tests/golden/types-union-overlap-nested/types/txt
2257+/* src-614 %jibb /tests/golden/types-union-pattern-result-context/source/jibb
2258+/* tok-614 %txt /tests/golden/types-union-pattern-result-context/tokens/txt
2259+/* tre-614 %txt /tests/golden/types-union-pattern-result-context/tree/txt
2260+/* typ-614 %txt /tests/golden/types-union-pattern-result-context/types/txt
2261+/* src-615 %jibb /tests/golden/types-union-pattern-result-controls/source/jibb
2262+/* tok-615 %txt /tests/golden/types-union-pattern-result-controls/tokens/txt
2263+/* tre-615 %txt /tests/golden/types-union-pattern-result-controls/tree/txt
2264+/* typ-615 %txt /tests/golden/types-union-pattern-result-controls/types/txt
2265+/* src-616 %jibb /tests/golden/types-union-patterns/source/jibb
2266+/* tok-616 %txt /tests/golden/types-union-patterns/tokens/txt
2267+/* tre-616 %txt /tests/golden/types-union-patterns/tree/txt
2268+/* typ-616 %txt /tests/golden/types-union-patterns/types/txt
2269+/* src-617 %jibb /tests/golden/types-union-patterns-generic/source/jibb
2270+/* tok-617 %txt /tests/golden/types-union-patterns-generic/tokens/txt
2271+/* tre-617 %txt /tests/golden/types-union-patterns-generic/tree/txt
2272+/* typ-617 %txt /tests/golden/types-union-patterns-generic/types/txt
2273+/* src-618 %jibb /tests/golden/types-union-patterns-import/source/jibb
2274+/* tok-618 %txt /tests/golden/types-union-patterns-import/tokens/txt
2275+/* tre-618 %txt /tests/golden/types-union-patterns-import/tree/txt
2276+/* mod-618-1 %jibb /tests/golden/types-union-patterns-import/modules/ui/lib/jibb
2277+/* typ-618 %txt /tests/golden/types-union-patterns-import/types/txt
2278+/* mtre-618 %txt /tests/golden/types-union-patterns-import/module-trees/txt
2279+/* src-619 %jibb /tests/golden/types-union-phantom-generic/source/jibb
2280+/* tok-619 %txt /tests/golden/types-union-phantom-generic/tokens/txt
2281+/* tre-619 %txt /tests/golden/types-union-phantom-generic/tree/txt
2282+/* typ-619 %txt /tests/golden/types-union-phantom-generic/types/txt
2283+/* src-620 %jibb /tests/golden/types-union-polymorphic-identity/source/jibb
2284+/* tok-620 %txt /tests/golden/types-union-polymorphic-identity/tokens/txt
2285+/* tre-620 %txt /tests/golden/types-union-polymorphic-identity/tree/txt
2286+/* mod-620-1 %jibb /tests/golden/types-union-polymorphic-identity/modules/ui/one/jibb
2287+/* mod-620-2 %jibb /tests/golden/types-union-polymorphic-identity/modules/ui/two/jibb
2288+/* typ-620 %txt /tests/golden/types-union-polymorphic-identity/types/txt
2289+/* mtre-620 %txt /tests/golden/types-union-polymorphic-identity/module-trees/txt
2290+/* src-621 %jibb /tests/golden/types-union-print-cross-namespace/source/jibb
2291+/* tok-621 %txt /tests/golden/types-union-print-cross-namespace/tokens/txt
2292+/* tre-621 %txt /tests/golden/types-union-print-cross-namespace/tree/txt
2293+/* mod-621-1 %jibb /tests/golden/types-union-print-cross-namespace/modules/ui/lib/jibb
2294+/* typ-621 %txt /tests/golden/types-union-print-cross-namespace/types/txt
2295+/* mtre-621 %txt /tests/golden/types-union-print-cross-namespace/module-trees/txt
2296+/* src-622 %jibb /tests/golden/types-union-print-distinct/source/jibb
2297+/* tok-622 %txt /tests/golden/types-union-print-distinct/tokens/txt
2298+/* tre-622 %txt /tests/golden/types-union-print-distinct/tree/txt
2299+/* mod-622-1 %jibb /tests/golden/types-union-print-distinct/modules/ui/left/jibb
2300+/* mod-622-2 %jibb /tests/golden/types-union-print-distinct/modules/ui/right/jibb
2301+/* mod-622-3 %jibb /tests/golden/types-union-print-distinct/modules/ui/twin/jibb
2302+/* typ-622 %txt /tests/golden/types-union-print-distinct/types/txt
2303+/* mtre-622 %txt /tests/golden/types-union-print-distinct/module-trees/txt
2304+/* src-623 %jibb /tests/golden/types-union-print-escape/source/jibb
2305+/* tok-623 %txt /tests/golden/types-union-print-escape/tokens/txt
2306+/* tre-623 %txt /tests/golden/types-union-print-escape/tree/txt
2307+/* typ-623 %txt /tests/golden/types-union-print-escape/types/txt
2308+/* src-624 %jibb /tests/golden/types-union-print-local/source/jibb
2309+/* tok-624 %txt /tests/golden/types-union-print-local/tokens/txt
2310+/* tre-624 %txt /tests/golden/types-union-print-local/tree/txt
2311+/* typ-624 %txt /tests/golden/types-union-print-local/types/txt
2312+/* src-625 %jibb /tests/golden/types-union-print-nested/source/jibb
2313+/* tok-625 %txt /tests/golden/types-union-print-nested/tokens/txt
2314+/* tre-625 %txt /tests/golden/types-union-print-nested/tree/txt
2315+/* typ-625 %txt /tests/golden/types-union-print-nested/types/txt
2316+/* src-626 %jibb /tests/golden/types-union-print-same-origin/source/jibb
2317+/* tok-626 %txt /tests/golden/types-union-print-same-origin/tokens/txt
2318+/* tre-626 %txt /tests/golden/types-union-print-same-origin/tree/txt
2319+/* mod-626-1 %jibb /tests/golden/types-union-print-same-origin/modules/ui/shared/jibb
2320+/* typ-626 %txt /tests/golden/types-union-print-same-origin/types/txt
2321+/* mtre-626 %txt /tests/golden/types-union-print-same-origin/module-trees/txt
2322+/* src-627 %jibb /tests/golden/types-union-print-transitive/source/jibb
2323+/* tok-627 %txt /tests/golden/types-union-print-transitive/tokens/txt
2324+/* tre-627 %txt /tests/golden/types-union-print-transitive/tree/txt
2325+/* mod-627-1 %jibb /tests/golden/types-union-print-transitive/modules/ui/mid/jibb
2326+/* mod-627-2 %jibb /tests/golden/types-union-print-transitive/modules/ui/base/jibb
2327+/* typ-627 %txt /tests/golden/types-union-print-transitive/types/txt
2328+/* mtre-627 %txt /tests/golden/types-union-print-transitive/module-trees/txt
2329+/* src-628 %jibb /tests/golden/types-union-singleton/source/jibb
2330+/* tok-628 %txt /tests/golden/types-union-singleton/tokens/txt
2331+/* tre-628 %txt /tests/golden/types-union-singleton/tree/txt
2332+/* typ-628 %txt /tests/golden/types-union-singleton/types/txt
2333+/* src-629 %jibb /tests/golden/types-union-tag-atoms/source/jibb
2334+/* tok-629 %txt /tests/golden/types-union-tag-atoms/tokens/txt
2335+/* tre-629 %txt /tests/golden/types-union-tag-atoms/tree/txt
2336+/* typ-629 %txt /tests/golden/types-union-tag-atoms/types/txt
2337+/* src-630 %jibb /tests/golden/types-union-tags/source/jibb
2338+/* tok-630 %txt /tests/golden/types-union-tags/tokens/txt
2339+/* tre-630 %txt /tests/golden/types-union-tags/tree/txt
2340+/* typ-630 %txt /tests/golden/types-union-tags/types/txt
2341+/* src-631 %jibb /tests/golden/types-union-unresolved/source/jibb
2342+/* tok-631 %txt /tests/golden/types-union-unresolved/tokens/txt
2343+/* tre-631 %txt /tests/golden/types-union-unresolved/tree/txt
2344+/* typ-631 %txt /tests/golden/types-union-unresolved/types/txt
2345+/* src-632 %jibb /tests/golden/types-union-unresolved-flow/source/jibb
2346+/* tok-632 %txt /tests/golden/types-union-unresolved-flow/tokens/txt
2347+/* tre-632 %txt /tests/golden/types-union-unresolved-flow/tree/txt
2348+/* typ-632 %txt /tests/golden/types-union-unresolved-flow/types/txt
2349+/* src-633 %jibb /tests/golden/types-unit-construction/source/jibb
2350+/* tok-633 %txt /tests/golden/types-unit-construction/tokens/txt
2351+/* tre-633 %txt /tests/golden/types-unit-construction/tree/txt
2352+/* typ-633 %txt /tests/golden/types-unit-construction/types/txt
2353+/* src-634 %jibb /tests/golden/types-unit-context/source/jibb
2354+/* tok-634 %txt /tests/golden/types-unit-context/tokens/txt
2355+/* tre-634 %txt /tests/golden/types-unit-context/tree/txt
2356+/* typ-634 %txt /tests/golden/types-unit-context/types/txt
2357+/* src-635 %jibb /tests/golden/types-unit-patterns/source/jibb
2358+/* tok-635 %txt /tests/golden/types-unit-patterns/tokens/txt
2359+/* tre-635 %txt /tests/golden/types-unit-patterns/tree/txt
2360+/* typ-635 %txt /tests/golden/types-unit-patterns/types/txt
2361+/* src-636 %jibb /tests/golden/types-value-cycle-shadow/source/jibb
2362+/* tok-636 %txt /tests/golden/types-value-cycle-shadow/tokens/txt
2363+/* tre-636 %txt /tests/golden/types-value-cycle-shadow/tree/txt
2364+/* typ-636 %txt /tests/golden/types-value-cycle-shadow/types/txt
2365+/* src-637 %jibb /tests/golden/types-value-cycle-unsupported/source/jibb
2366+/* tok-637 %txt /tests/golden/types-value-cycle-unsupported/tokens/txt
2367+/* tre-637 %txt /tests/golden/types-value-cycle-unsupported/tree/txt
2368+/* typ-637 %txt /tests/golden/types-value-cycle-unsupported/types/txt
2369+/* src-638 %jibb /tests/golden/types-value-cycles/source/jibb
2370+/* tok-638 %txt /tests/golden/types-value-cycles/tokens/txt
2371+/* tre-638 %txt /tests/golden/types-value-cycles/tree/txt
2372+/* typ-638 %txt /tests/golden/types-value-cycles/types/txt
23662373=/ prepared-prelude (prepare-prelude-with-internal:jibb prelude-source internal-source)
23672374|%
23682375:: one arm per case
@@ -3547,100 +3554,102 @@
35473554 (weld (check ~.types-recursive-gate src-589 `tok-589 `tre-589) (check-types ~.types-recursive-gate ~[%tests %golden ~.types-recursive-gate %source %jibb] src-589 `typ-589))
35483555++ test-types-recursive-sample
35493556 (weld (check ~.types-recursive-sample src-590 `tok-590 `tre-590) (check-types ~.types-recursive-sample ~[%tests %golden ~.types-recursive-sample %source %jibb] src-590 `typ-590))
3557+++ test-types-request-normal
3558+ (weld (weld (check ~.types-request-normal src-591 `tok-591 `tre-591) (check-module-types ~.types-request-normal ~[%tests %golden ~.types-request-normal %source %jibb] src-591 `typ-591 ~ ~[[%full mark-591-1]] ~[['/ui/api/demo.jibb' ~[~.ui ~.api ~.demo ~.jibb] mod-591-1]])) (check-module-trees ~.types-request-normal `mtre-591 ~[['/ui/api/demo.jibb' ~[~.ui ~.api ~.demo ~.jibb] mod-591-1]]))
35503559++ test-types-scope-library-poke
3551− (weld (check-at ~.types-scope-library-poke ~[~.ui ~.lib ~.library ~.jibb] src-591 `tok-591 `tre-591) (check-module-types ~.types-scope-library-poke ~[~.ui ~.lib ~.library ~.jibb] src-591 `typ-591 ~ ~ ~))
3560+ (weld (check-at ~.types-scope-library-poke ~[~.ui ~.lib ~.library ~.jibb] src-592 `tok-592 `tre-592) (check-module-types ~.types-scope-library-poke ~[~.ui ~.lib ~.library ~.jibb] src-592 `typ-592 ~ ~ ~))
35523561++ test-types-scope-root-api
3553− (weld (check-at ~.types-scope-root-api ~[~.ui ~.api ~.todo ~.jibb] src-592 `tok-592 `tre-592) (check-module-types ~.types-scope-root-api ~[~.ui ~.api ~.todo ~.jibb] src-592 `typ-592 ~ ~ ~))
3562+ (weld (check-at ~.types-scope-root-api ~[~.ui ~.api ~.todo ~.jibb] src-593 `tok-593 `tre-593) (check-module-types ~.types-scope-root-api ~[~.ui ~.api ~.todo ~.jibb] src-593 `typ-593 ~ ~ ~))
35543563++ test-types-scope-store-duplicate
3555− (weld (check-at ~.types-scope-store-duplicate ~[~.ui ~.stores ~.cart ~.jibb] src-593 `tok-593 `tre-593) (check-module-types ~.types-scope-store-duplicate ~[~.ui ~.stores ~.cart ~.jibb] src-593 `typ-593 ~ ~ ~))
3564+ (weld (check-at ~.types-scope-store-duplicate ~[~.ui ~.stores ~.cart ~.jibb] src-594 `tok-594 `tre-594) (check-module-types ~.types-scope-store-duplicate ~[~.ui ~.stores ~.cart ~.jibb] src-594 `typ-594 ~ ~ ~))
35563565++ test-types-scope-store-shadow
3557− (weld (check-at ~.types-scope-store-shadow ~[~.ui ~.stores ~.cart ~.jibb] src-594 `tok-594 `tre-594) (check-module-types ~.types-scope-store-shadow ~[~.ui ~.stores ~.cart ~.jibb] src-594 `typ-594 ~ ~ ~))
3566+ (weld (check-at ~.types-scope-store-shadow ~[~.ui ~.stores ~.cart ~.jibb] src-595 `tok-595 `tre-595) (check-module-types ~.types-scope-store-shadow ~[~.ui ~.stores ~.cart ~.jibb] src-595 `typ-595 ~ ~ ~))
35583567++ test-types-single-case-pattern
3559− (weld (check ~.types-single-case-pattern src-595 `tok-595 `tre-595) (check-module-types ~.types-single-case-pattern ~[%tests %golden ~.types-single-case-pattern %source %jibb] src-595 `typ-595 ~ ~ ~))
3568+ (weld (check ~.types-single-case-pattern src-596 `tok-596 `tre-596) (check-module-types ~.types-single-case-pattern ~[%tests %golden ~.types-single-case-pattern %source %jibb] src-596 `typ-596 ~ ~ ~))
35603569++ test-types-string-interpolation
3561− (weld (check ~.types-string-interpolation src-596 `tok-596 `tre-596) (check-module-types ~.types-string-interpolation ~[%tests %golden ~.types-string-interpolation %source %jibb] src-596 `typ-596 ~ ~ ~))
3570+ (weld (check ~.types-string-interpolation src-597 `tok-597 `tre-597) (check-module-types ~.types-string-interpolation ~[%tests %golden ~.types-string-interpolation %source %jibb] src-597 `typ-597 ~ ~ ~))
35623571++ test-types-tuple-context
3563− (weld (check ~.types-tuple-context src-597 `tok-597 `tre-597) (check-module-types ~.types-tuple-context ~[%tests %golden ~.types-tuple-context %source %jibb] src-597 `typ-597 ~ ~ ~))
3572+ (weld (check ~.types-tuple-context src-598 `tok-598 `tre-598) (check-module-types ~.types-tuple-context ~[%tests %golden ~.types-tuple-context %source %jibb] src-598 `typ-598 ~ ~ ~))
35643573++ test-types-tuple-context-nested
3565− (weld (check ~.types-tuple-context-nested src-598 `tok-598 `tre-598) (check-module-types ~.types-tuple-context-nested ~[%tests %golden ~.types-tuple-context-nested %source %jibb] src-598 `typ-598 ~ ~ ~))
3574+ (weld (check ~.types-tuple-context-nested src-599 `tok-599 `tre-599) (check-module-types ~.types-tuple-context-nested ~[%tests %golden ~.types-tuple-context-nested %source %jibb] src-599 `typ-599 ~ ~ ~))
35663575++ test-types-union-alias
3567− (weld (check ~.types-union-alias src-599 `tok-599 `tre-599) (check-types ~.types-union-alias ~[%tests %golden ~.types-union-alias %source %jibb] src-599 `typ-599))
3576+ (weld (check ~.types-union-alias src-600 `tok-600 `tre-600) (check-types ~.types-union-alias ~[%tests %golden ~.types-union-alias %source %jibb] src-600 `typ-600))
35683577++ test-types-union-branch-context
3569− (weld (check ~.types-union-branch-context src-600 `tok-600 `tre-600) (check-types ~.types-union-branch-context ~[%tests %golden ~.types-union-branch-context %source %jibb] src-600 `typ-600))
3578+ (weld (check ~.types-union-branch-context src-601 `tok-601 `tre-601) (check-types ~.types-union-branch-context ~[%tests %golden ~.types-union-branch-context %source %jibb] src-601 `typ-601))
35703579++ test-types-union-branch-pending
3571− (weld (check ~.types-union-branch-pending src-601 `tok-601 `tre-601) (check-types ~.types-union-branch-pending ~[%tests %golden ~.types-union-branch-pending %source %jibb] src-601 `typ-601))
3580+ (weld (check ~.types-union-branch-pending src-602 `tok-602 `tre-602) (check-types ~.types-union-branch-pending ~[%tests %golden ~.types-union-branch-pending %source %jibb] src-602 `typ-602))
35723581++ test-types-union-constructor-shape
3573− (weld (check ~.types-union-constructor-shape src-602 `tok-602 `tre-602) (check-types ~.types-union-constructor-shape ~[%tests %golden ~.types-union-constructor-shape %source %jibb] src-602 `typ-602))
3582+ (weld (check ~.types-union-constructor-shape src-603 `tok-603 `tre-603) (check-types ~.types-union-constructor-shape ~[%tests %golden ~.types-union-constructor-shape %source %jibb] src-603 `typ-603))
35743583++ test-types-union-context-flow
3575− (weld (check ~.types-union-context-flow src-603 `tok-603 `tre-603) (check-types ~.types-union-context-flow ~[%tests %golden ~.types-union-context-flow %source %jibb] src-603 `typ-603))
3584+ (weld (check ~.types-union-context-flow src-604 `tok-604 `tre-604) (check-types ~.types-union-context-flow ~[%tests %golden ~.types-union-context-flow %source %jibb] src-604 `typ-604))
35763585++ test-types-union-finite
3577− (weld (check ~.types-union-finite src-604 `tok-604 `tre-604) (check-module-types ~.types-union-finite ~[%tests %golden ~.types-union-finite %source %jibb] src-604 `typ-604 ~ ~ ~))
3586+ (weld (check ~.types-union-finite src-605 `tok-605 `tre-605) (check-module-types ~.types-union-finite ~[%tests %golden ~.types-union-finite %source %jibb] src-605 `typ-605 ~ ~ ~))
35783587++ test-types-union-finite-context
3579− (weld (check ~.types-union-finite-context src-605 `tok-605 `tre-605) (check-module-types ~.types-union-finite-context ~[%tests %golden ~.types-union-finite-context %source %jibb] src-605 `typ-605 ~ ~ ~))
3588+ (weld (check ~.types-union-finite-context src-606 `tok-606 `tre-606) (check-module-types ~.types-union-finite-context ~[%tests %golden ~.types-union-finite-context %source %jibb] src-606 `typ-606 ~ ~ ~))
35803589++ test-types-union-finite-generic
3581− (weld (check ~.types-union-finite-generic src-606 `tok-606 `tre-606) (check-module-types ~.types-union-finite-generic ~[%tests %golden ~.types-union-finite-generic %source %jibb] src-606 `typ-606 ~ ~ ~))
3590+ (weld (check ~.types-union-finite-generic src-607 `tok-607 `tre-607) (check-module-types ~.types-union-finite-generic ~[%tests %golden ~.types-union-finite-generic %source %jibb] src-607 `typ-607 ~ ~ ~))
35823591++ test-types-union-finite-limit
3583− (weld (check ~.types-union-finite-limit src-607 `tok-607 `tre-607) (check-module-types ~.types-union-finite-limit ~[%tests %golden ~.types-union-finite-limit %source %jibb] src-607 `typ-607 ~ ~ ~))
3592+ (weld (check ~.types-union-finite-limit src-608 `tok-608 `tre-608) (check-module-types ~.types-union-finite-limit ~[%tests %golden ~.types-union-finite-limit %source %jibb] src-608 `typ-608 ~ ~ ~))
35843593++ test-types-union-import
3585− (weld (weld (check ~.types-union-import src-608 `tok-608 `tre-608) (check-module-types ~.types-union-import ~[%tests %golden ~.types-union-import %source %jibb] src-608 `typ-608 ~ ~ ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-608-1]])) (check-module-trees ~.types-union-import `mtre-608 ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-608-1]]))
3594+ (weld (weld (check ~.types-union-import src-609 `tok-609 `tre-609) (check-module-types ~.types-union-import ~[%tests %golden ~.types-union-import %source %jibb] src-609 `typ-609 ~ ~ ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-609-1]])) (check-module-trees ~.types-union-import `mtre-609 ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-609-1]]))
35863595++ test-types-union-local-pending
3587− (weld (check ~.types-union-local-pending src-609 `tok-609 `tre-609) (check-types ~.types-union-local-pending ~[%tests %golden ~.types-union-local-pending %source %jibb] src-609 `typ-609))
3596+ (weld (check ~.types-union-local-pending src-610 `tok-610 `tre-610) (check-types ~.types-union-local-pending ~[%tests %golden ~.types-union-local-pending %source %jibb] src-610 `typ-610))
35883597++ test-types-union-nonwing-subject
3589− (weld (check ~.types-union-nonwing-subject src-610 `tok-610 `tre-610) (check-module-types ~.types-union-nonwing-subject ~[%tests %golden ~.types-union-nonwing-subject %source %jibb] src-610 `typ-610 ~ ~ ~))
3598+ (weld (check ~.types-union-nonwing-subject src-611 `tok-611 `tre-611) (check-module-types ~.types-union-nonwing-subject ~[%tests %golden ~.types-union-nonwing-subject %source %jibb] src-611 `typ-611 ~ ~ ~))
35903599++ test-types-union-overlap
3591− (weld (check ~.types-union-overlap src-611 `tok-611 `tre-611) (check-types ~.types-union-overlap ~[%tests %golden ~.types-union-overlap %source %jibb] src-611 `typ-611))
3600+ (weld (check ~.types-union-overlap src-612 `tok-612 `tre-612) (check-types ~.types-union-overlap ~[%tests %golden ~.types-union-overlap %source %jibb] src-612 `typ-612))
35923601++ test-types-union-overlap-nested
3593− (weld (check ~.types-union-overlap-nested src-612 `tok-612 `tre-612) (check-types ~.types-union-overlap-nested ~[%tests %golden ~.types-union-overlap-nested %source %jibb] src-612 `typ-612))
3602+ (weld (check ~.types-union-overlap-nested src-613 `tok-613 `tre-613) (check-types ~.types-union-overlap-nested ~[%tests %golden ~.types-union-overlap-nested %source %jibb] src-613 `typ-613))
35943603++ test-types-union-pattern-result-context
3595− (weld (check ~.types-union-pattern-result-context src-613 `tok-613 `tre-613) (check-module-types ~.types-union-pattern-result-context ~[%tests %golden ~.types-union-pattern-result-context %source %jibb] src-613 `typ-613 ~ ~ ~))
3604+ (weld (check ~.types-union-pattern-result-context src-614 `tok-614 `tre-614) (check-module-types ~.types-union-pattern-result-context ~[%tests %golden ~.types-union-pattern-result-context %source %jibb] src-614 `typ-614 ~ ~ ~))
35963605++ test-types-union-pattern-result-controls
3597− (weld (check ~.types-union-pattern-result-controls src-614 `tok-614 `tre-614) (check-module-types ~.types-union-pattern-result-controls ~[%tests %golden ~.types-union-pattern-result-controls %source %jibb] src-614 `typ-614 ~ ~ ~))
3606+ (weld (check ~.types-union-pattern-result-controls src-615 `tok-615 `tre-615) (check-module-types ~.types-union-pattern-result-controls ~[%tests %golden ~.types-union-pattern-result-controls %source %jibb] src-615 `typ-615 ~ ~ ~))
35983607++ test-types-union-patterns
3599− (weld (check ~.types-union-patterns src-615 `tok-615 `tre-615) (check-module-types ~.types-union-patterns ~[%tests %golden ~.types-union-patterns %source %jibb] src-615 `typ-615 ~ ~ ~))
3608+ (weld (check ~.types-union-patterns src-616 `tok-616 `tre-616) (check-module-types ~.types-union-patterns ~[%tests %golden ~.types-union-patterns %source %jibb] src-616 `typ-616 ~ ~ ~))
36003609++ test-types-union-patterns-generic
3601− (weld (check ~.types-union-patterns-generic src-616 `tok-616 `tre-616) (check-module-types ~.types-union-patterns-generic ~[%tests %golden ~.types-union-patterns-generic %source %jibb] src-616 `typ-616 ~ ~ ~))
3610+ (weld (check ~.types-union-patterns-generic src-617 `tok-617 `tre-617) (check-module-types ~.types-union-patterns-generic ~[%tests %golden ~.types-union-patterns-generic %source %jibb] src-617 `typ-617 ~ ~ ~))
36023611++ test-types-union-patterns-import
3603− (weld (weld (check ~.types-union-patterns-import src-617 `tok-617 `tre-617) (check-module-types ~.types-union-patterns-import ~[%tests %golden ~.types-union-patterns-import %source %jibb] src-617 `typ-617 ~ ~ ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-617-1]])) (check-module-trees ~.types-union-patterns-import `mtre-617 ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-617-1]]))
3612+ (weld (weld (check ~.types-union-patterns-import src-618 `tok-618 `tre-618) (check-module-types ~.types-union-patterns-import ~[%tests %golden ~.types-union-patterns-import %source %jibb] src-618 `typ-618 ~ ~ ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-618-1]])) (check-module-trees ~.types-union-patterns-import `mtre-618 ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-618-1]]))
36043613++ test-types-union-phantom-generic
3605− (weld (check ~.types-union-phantom-generic src-618 `tok-618 `tre-618) (check-types ~.types-union-phantom-generic ~[%tests %golden ~.types-union-phantom-generic %source %jibb] src-618 `typ-618))
3614+ (weld (check ~.types-union-phantom-generic src-619 `tok-619 `tre-619) (check-types ~.types-union-phantom-generic ~[%tests %golden ~.types-union-phantom-generic %source %jibb] src-619 `typ-619))
36063615++ test-types-union-polymorphic-identity
3607− (weld (weld (check ~.types-union-polymorphic-identity src-619 `tok-619 `tre-619) (check-module-types ~.types-union-polymorphic-identity ~[%tests %golden ~.types-union-polymorphic-identity %source %jibb] src-619 `typ-619 ~ ~ ~[['/ui/one.jibb' ~[~.ui ~.one ~.jibb] mod-619-1] ['/ui/two.jibb' ~[~.ui ~.two ~.jibb] mod-619-2]])) (check-module-trees ~.types-union-polymorphic-identity `mtre-619 ~[['/ui/one.jibb' ~[~.ui ~.one ~.jibb] mod-619-1] ['/ui/two.jibb' ~[~.ui ~.two ~.jibb] mod-619-2]]))
3616+ (weld (weld (check ~.types-union-polymorphic-identity src-620 `tok-620 `tre-620) (check-module-types ~.types-union-polymorphic-identity ~[%tests %golden ~.types-union-polymorphic-identity %source %jibb] src-620 `typ-620 ~ ~ ~[['/ui/one.jibb' ~[~.ui ~.one ~.jibb] mod-620-1] ['/ui/two.jibb' ~[~.ui ~.two ~.jibb] mod-620-2]])) (check-module-trees ~.types-union-polymorphic-identity `mtre-620 ~[['/ui/one.jibb' ~[~.ui ~.one ~.jibb] mod-620-1] ['/ui/two.jibb' ~[~.ui ~.two ~.jibb] mod-620-2]]))
36083617++ test-types-union-print-cross-namespace
3609− (weld (weld (check ~.types-union-print-cross-namespace src-620 `tok-620 `tre-620) (check-module-types ~.types-union-print-cross-namespace ~[%tests %golden ~.types-union-print-cross-namespace %source %jibb] src-620 `typ-620 ~ ~ ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-620-1]])) (check-module-trees ~.types-union-print-cross-namespace `mtre-620 ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-620-1]]))
3618+ (weld (weld (check ~.types-union-print-cross-namespace src-621 `tok-621 `tre-621) (check-module-types ~.types-union-print-cross-namespace ~[%tests %golden ~.types-union-print-cross-namespace %source %jibb] src-621 `typ-621 ~ ~ ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-621-1]])) (check-module-trees ~.types-union-print-cross-namespace `mtre-621 ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-621-1]]))
36103619++ test-types-union-print-distinct
3611− (weld (weld (check ~.types-union-print-distinct src-621 `tok-621 `tre-621) (check-module-types ~.types-union-print-distinct ~[%tests %golden ~.types-union-print-distinct %source %jibb] src-621 `typ-621 ~ ~ ~[['/ui/left.jibb' ~[~.ui ~.left ~.jibb] mod-621-1] ['/ui/right.jibb' ~[~.ui ~.right ~.jibb] mod-621-2] ['/ui/twin.jibb' ~[~.ui ~.twin ~.jibb] mod-621-3]])) (check-module-trees ~.types-union-print-distinct `mtre-621 ~[['/ui/left.jibb' ~[~.ui ~.left ~.jibb] mod-621-1] ['/ui/right.jibb' ~[~.ui ~.right ~.jibb] mod-621-2] ['/ui/twin.jibb' ~[~.ui ~.twin ~.jibb] mod-621-3]]))
3620+ (weld (weld (check ~.types-union-print-distinct src-622 `tok-622 `tre-622) (check-module-types ~.types-union-print-distinct ~[%tests %golden ~.types-union-print-distinct %source %jibb] src-622 `typ-622 ~ ~ ~[['/ui/left.jibb' ~[~.ui ~.left ~.jibb] mod-622-1] ['/ui/right.jibb' ~[~.ui ~.right ~.jibb] mod-622-2] ['/ui/twin.jibb' ~[~.ui ~.twin ~.jibb] mod-622-3]])) (check-module-trees ~.types-union-print-distinct `mtre-622 ~[['/ui/left.jibb' ~[~.ui ~.left ~.jibb] mod-622-1] ['/ui/right.jibb' ~[~.ui ~.right ~.jibb] mod-622-2] ['/ui/twin.jibb' ~[~.ui ~.twin ~.jibb] mod-622-3]]))
36123621++ test-types-union-print-escape
3613− (weld (check ~.types-union-print-escape src-622 `tok-622 `tre-622) (check-types ~.types-union-print-escape ~[%tests %golden ~.types-union-print-escape %source %jibb] src-622 `typ-622))
3622+ (weld (check ~.types-union-print-escape src-623 `tok-623 `tre-623) (check-types ~.types-union-print-escape ~[%tests %golden ~.types-union-print-escape %source %jibb] src-623 `typ-623))
36143623++ test-types-union-print-local
3615− (weld (check ~.types-union-print-local src-623 `tok-623 `tre-623) (check-types ~.types-union-print-local ~[%tests %golden ~.types-union-print-local %source %jibb] src-623 `typ-623))
3624+ (weld (check ~.types-union-print-local src-624 `tok-624 `tre-624) (check-types ~.types-union-print-local ~[%tests %golden ~.types-union-print-local %source %jibb] src-624 `typ-624))
36163625++ test-types-union-print-nested
3617− (weld (check ~.types-union-print-nested src-624 `tok-624 `tre-624) (check-types ~.types-union-print-nested ~[%tests %golden ~.types-union-print-nested %source %jibb] src-624 `typ-624))
3626+ (weld (check ~.types-union-print-nested src-625 `tok-625 `tre-625) (check-types ~.types-union-print-nested ~[%tests %golden ~.types-union-print-nested %source %jibb] src-625 `typ-625))
36183627++ test-types-union-print-same-origin
3619− (weld (weld (check ~.types-union-print-same-origin src-625 `tok-625 `tre-625) (check-module-types ~.types-union-print-same-origin ~[%tests %golden ~.types-union-print-same-origin %source %jibb] src-625 `typ-625 ~ ~ ~[['/ui/shared.jibb' ~[~.ui ~.shared ~.jibb] mod-625-1]])) (check-module-trees ~.types-union-print-same-origin `mtre-625 ~[['/ui/shared.jibb' ~[~.ui ~.shared ~.jibb] mod-625-1]]))
3628+ (weld (weld (check ~.types-union-print-same-origin src-626 `tok-626 `tre-626) (check-module-types ~.types-union-print-same-origin ~[%tests %golden ~.types-union-print-same-origin %source %jibb] src-626 `typ-626 ~ ~ ~[['/ui/shared.jibb' ~[~.ui ~.shared ~.jibb] mod-626-1]])) (check-module-trees ~.types-union-print-same-origin `mtre-626 ~[['/ui/shared.jibb' ~[~.ui ~.shared ~.jibb] mod-626-1]]))
36203629++ test-types-union-print-transitive
3621− (weld (weld (check ~.types-union-print-transitive src-626 `tok-626 `tre-626) (check-module-types ~.types-union-print-transitive ~[%tests %golden ~.types-union-print-transitive %source %jibb] src-626 `typ-626 ~ ~ ~[['/ui/mid.jibb' ~[~.ui ~.mid ~.jibb] mod-626-1] ['/ui/base.jibb' ~[~.ui ~.base ~.jibb] mod-626-2]])) (check-module-trees ~.types-union-print-transitive `mtre-626 ~[['/ui/mid.jibb' ~[~.ui ~.mid ~.jibb] mod-626-1] ['/ui/base.jibb' ~[~.ui ~.base ~.jibb] mod-626-2]]))
3630+ (weld (weld (check ~.types-union-print-transitive src-627 `tok-627 `tre-627) (check-module-types ~.types-union-print-transitive ~[%tests %golden ~.types-union-print-transitive %source %jibb] src-627 `typ-627 ~ ~ ~[['/ui/mid.jibb' ~[~.ui ~.mid ~.jibb] mod-627-1] ['/ui/base.jibb' ~[~.ui ~.base ~.jibb] mod-627-2]])) (check-module-trees ~.types-union-print-transitive `mtre-627 ~[['/ui/mid.jibb' ~[~.ui ~.mid ~.jibb] mod-627-1] ['/ui/base.jibb' ~[~.ui ~.base ~.jibb] mod-627-2]]))
36223631++ test-types-union-singleton
3623− (weld (check ~.types-union-singleton src-627 `tok-627 `tre-627) (check-types ~.types-union-singleton ~[%tests %golden ~.types-union-singleton %source %jibb] src-627 `typ-627))
3632+ (weld (check ~.types-union-singleton src-628 `tok-628 `tre-628) (check-types ~.types-union-singleton ~[%tests %golden ~.types-union-singleton %source %jibb] src-628 `typ-628))
36243633++ test-types-union-tag-atoms
3625− (weld (check ~.types-union-tag-atoms src-628 `tok-628 `tre-628) (check-types ~.types-union-tag-atoms ~[%tests %golden ~.types-union-tag-atoms %source %jibb] src-628 `typ-628))
3634+ (weld (check ~.types-union-tag-atoms src-629 `tok-629 `tre-629) (check-types ~.types-union-tag-atoms ~[%tests %golden ~.types-union-tag-atoms %source %jibb] src-629 `typ-629))
36263635++ test-types-union-tags
3627− (weld (check ~.types-union-tags src-629 `tok-629 `tre-629) (check-types ~.types-union-tags ~[%tests %golden ~.types-union-tags %source %jibb] src-629 `typ-629))
3636+ (weld (check ~.types-union-tags src-630 `tok-630 `tre-630) (check-types ~.types-union-tags ~[%tests %golden ~.types-union-tags %source %jibb] src-630 `typ-630))
36283637++ test-types-union-unresolved
3629− (weld (check ~.types-union-unresolved src-630 `tok-630 `tre-630) (check-types ~.types-union-unresolved ~[%tests %golden ~.types-union-unresolved %source %jibb] src-630 `typ-630))
3638+ (weld (check ~.types-union-unresolved src-631 `tok-631 `tre-631) (check-types ~.types-union-unresolved ~[%tests %golden ~.types-union-unresolved %source %jibb] src-631 `typ-631))
36303639++ test-types-union-unresolved-flow
3631− (weld (check ~.types-union-unresolved-flow src-631 `tok-631 `tre-631) (check-types ~.types-union-unresolved-flow ~[%tests %golden ~.types-union-unresolved-flow %source %jibb] src-631 `typ-631))
3640+ (weld (check ~.types-union-unresolved-flow src-632 `tok-632 `tre-632) (check-types ~.types-union-unresolved-flow ~[%tests %golden ~.types-union-unresolved-flow %source %jibb] src-632 `typ-632))
36323641++ test-types-unit-construction
3633− (weld (check ~.types-unit-construction src-632 `tok-632 `tre-632) (check-module-types ~.types-unit-construction ~[%tests %golden ~.types-unit-construction %source %jibb] src-632 `typ-632 ~ ~ ~))
3642+ (weld (check ~.types-unit-construction src-633 `tok-633 `tre-633) (check-module-types ~.types-unit-construction ~[%tests %golden ~.types-unit-construction %source %jibb] src-633 `typ-633 ~ ~ ~))
36343643++ test-types-unit-context
3635− (weld (check ~.types-unit-context src-633 `tok-633 `tre-633) (check-module-types ~.types-unit-context ~[%tests %golden ~.types-unit-context %source %jibb] src-633 `typ-633 ~ ~ ~))
3644+ (weld (check ~.types-unit-context src-634 `tok-634 `tre-634) (check-module-types ~.types-unit-context ~[%tests %golden ~.types-unit-context %source %jibb] src-634 `typ-634 ~ ~ ~))
36363645++ test-types-unit-patterns
3637− (weld (check ~.types-unit-patterns src-634 `tok-634 `tre-634) (check-types ~.types-unit-patterns ~[%tests %golden ~.types-unit-patterns %source %jibb] src-634 `typ-634))
3646+ (weld (check ~.types-unit-patterns src-635 `tok-635 `tre-635) (check-types ~.types-unit-patterns ~[%tests %golden ~.types-unit-patterns %source %jibb] src-635 `typ-635))
36383647++ test-types-value-cycle-shadow
3639− (weld (check ~.types-value-cycle-shadow src-635 `tok-635 `tre-635) (check-module-types ~.types-value-cycle-shadow ~[%tests %golden ~.types-value-cycle-shadow %source %jibb] src-635 `typ-635 ~ ~ ~))
3648+ (weld (check ~.types-value-cycle-shadow src-636 `tok-636 `tre-636) (check-module-types ~.types-value-cycle-shadow ~[%tests %golden ~.types-value-cycle-shadow %source %jibb] src-636 `typ-636 ~ ~ ~))
36403649++ test-types-value-cycle-unsupported
3641− (weld (check ~.types-value-cycle-unsupported src-636 `tok-636 `tre-636) (check-module-types ~.types-value-cycle-unsupported ~[%tests %golden ~.types-value-cycle-unsupported %source %jibb] src-636 `typ-636 ~ ~ ~))
3650+ (weld (check ~.types-value-cycle-unsupported src-637 `tok-637 `tre-637) (check-module-types ~.types-value-cycle-unsupported ~[%tests %golden ~.types-value-cycle-unsupported %source %jibb] src-637 `typ-637 ~ ~ ~))
36423651++ test-types-value-cycles
3643− (weld (check ~.types-value-cycles src-637 `tok-637 `tre-637) (check-module-types ~.types-value-cycles ~[%tests %golden ~.types-value-cycles %source %jibb] src-637 `typ-637 ~ ~ ~))
3652+ (weld (check ~.types-value-cycles src-638 `tok-638 `tre-638) (check-module-types ~.types-value-cycles ~[%tests %golden ~.types-value-cycles %source %jibb] src-638 `typ-638 ~ ~ ~))
36443653::
36453654:: +check: run golden:jibb on a case and compare both outputs
36463655::
tools/testdata/ship-selftest+2−1
@@ -309,7 +309,8 @@ def generator_checks(tmp):
309309 'tests/lib/jibb-positional-face-guards.hoon',
310310 'tests/lib/jibb-generic-alias.hoon',
311311 'tests/lib/jibb-api-evidence.hoon',
312− 'tests/lib/jibb-ask-guards.hoon'}
312+ 'tests/lib/jibb-ask-guards.hoon',
313+ 'tests/lib/jibb-request-guards.hoon'}
313314 <= normal_tests, sorted(normal_tests))
314315 for label, kwargs in (('custom library', {'lib': STUB}),
315316 ('custom goldens', {'golden': CASES}),
tools/type-request-guards-testnew file+31
@@ -0,0 +1,31 @@
1+#!/usr/bin/env python3
2+"""Run the request certificate and cache provenance guards under eval."""
3+from pathlib import Path
4+import argparse
5+import subprocess
6+import sys
7+import tempfile
8+
9+root = Path(__file__).resolve().parent.parent
10+parser = argparse.ArgumentParser(description=__doc__)
11+parser.add_argument('--lib', default=str(root / 'jibb-dev/lib/jibb.hoon'))
12+args = parser.parse_args()
13+tests = (root / 'tests/lib/jibb-request-guards.hoon').read_text()
14+tests = tests[tests.index('\n|%\n') + 1:]
15+expression = ('=/ jibb .\n=/ suite\n' + tests +
16+ '\n=/ failures=(list tape) request-guard-errors:suite\n^- @t\n' +
17+ "?~ failures 'request guards passed'\n" +
18+ '(of-wain:format (turn failures crip))\n')
19+with tempfile.TemporaryDirectory(prefix='jibb-request-guards-') as tmp:
20+ program = Path(tmp) / 'guards.hoon'
21+ program.write_text(expression)
22+ result = subprocess.run([str(root / 'tools/hoon'), '--lib', args.lib, '--raw',
23+ '--cord', 'public=' + str(root / 'jibb-dev/lib/jibb/prelude.jibb'),
24+ '--cord', 'internal=' + str(root / 'jibb-dev/lib/jibb/internal.jibb'),
25+ '-f', str(program)], stdout=subprocess.PIPE)
26+if result.returncode:
27+ sys.exit(result.returncode)
28+if result.stdout != b'request guards passed\n':
29+ sys.stderr.buffer.write(result.stdout)
30+ sys.exit(1)
31+print('request certificate and cache guards passed')