on master help sign in
324 files changed+10634−3638
since splitsnapshots
unifiedsplit
README.md+13−1 docs/README.md+2 docs/compiler.md+25−3 docs/development.md+24−1 docs/prelude-inventory.md+10−4 docs/prompts/milestone-2.md+5−5 docs/spec/core-language.md+2−2 docs/spec/decisions.md+7−6 docs/spec/grammar.md+9−10 docs/spec/implementation-plan.md+1−1 docs/spec/overview.md+9−7 docs/status.md+49−11 jibb-dev/lib/jibb.hoon+1955−110 jibb-dev/lib/jibb/internal.jibb+1−1 jibb-dev/lib/jibb/prelude.jibb+158−2 my-app/ui/basket.jibb+2−2 my-app/ui/stores/cart.jibb+2−3 my-app/ui/theme.jibb+1−1 my-app/ui/todo-list.jibb+2−2 tests/golden/doc-core-02-update/source.jibb+2−2 tests/golden/doc-core-02-update/tokens.txt+22−28 tests/golden/doc-core-02-update/tree.txt+10−14 tests/golden/doc-grammar-02-buttons/modules.txt+1 tests/golden/doc-grammar-02-buttons/types.txt+4 tests/golden/doc-grammar-06-cart-store/source.jibb+2−3 tests/golden/doc-grammar-06-cart-store/tokens.txt+56−60 tests/golden/doc-grammar-06-cart-store/tree.txt+25−26 tests/golden/doc-grammar-06-cart-store/types.txt+5−1 tests/golden/doc-grammar-07-basket/source.jibb+2−2 tests/golden/doc-grammar-07-basket/tokens.txt+19−25 tests/golden/doc-grammar-07-basket/tree.txt+7−12 tests/golden/doc-overview-01-cmd-sub/source.jibb+1−1 tests/golden/doc-overview-01-cmd-sub/tokens.txt+11−11 tests/golden/doc-overview-01-cmd-sub/tree.txt+5−5 tests/golden/doc-overview-02-theme/source.jibb+1−1 tests/golden/doc-overview-02-theme/tokens.txt+24−23 tests/golden/doc-overview-02-theme/tree.txt+9−8 tests/golden/doc-overview-10-todo-list/source.jibb+2−2 tests/golden/doc-overview-10-todo-list/tokens.txt+22−28 tests/golden/doc-overview-10-todo-list/tree.txt+10−14 tests/golden/inline-mold-opaque/about.txt+1−1 tests/golden/inline-mold-opaque/source.jibb+1−1 tests/golden/inline-mold-opaque/tokens.txt+1−1 tests/golden/inline-mold-opaque/tree.txt+1−1 tests/golden/inline-namespaces/about.txt+1−1 tests/golden/inline-namespaces/source.jibb+1−1 tests/golden/inline-namespaces/tokens.txt+1−1 tests/golden/inline-namespaces/tree.txt+1−1 tests/golden/inline-requests/about.txt+2−2 tests/golden/inline-requests/source.jibb+1−1 tests/golden/inline-requests/tokens.txt+7−6 tests/golden/inline-requests/tree.txt+3−2 tests/golden/module-import-cycle/source.jibb+1−1 tests/golden/module-import-cycle/tokens.txt+6−6 tests/golden/module-import-cycle/tree.txt+3−3 tests/golden/module-import-identity/source.jibb+1−1 tests/golden/module-import-identity/tokens.txt+5−5 tests/golden/module-import-identity/tree.txt+3−3 tests/golden/module-import-identity/types.txt+1−1 tests/golden/module-import-transitive/source.jibb+1−1 tests/golden/module-import-transitive/tokens.txt+6−6 tests/golden/module-import-transitive/tree.txt+3−3 tests/golden/module-import-transitive/types.txt+1−1 tests/golden/module-import-unused-invalid/source.jibb+1−1 tests/golden/module-import-unused-invalid/tokens.txt+6−6 tests/golden/module-import-unused-invalid/tree.txt+3−3 tests/golden/module-import-unused-invalid/types.txt+1−1 tests/golden/prelude-unit-list-transforms/about.txt+2−2 tests/golden/prelude-unit-list-transforms/source.jibb+15−2 tests/golden/prelude-unit-list-transforms/tokens.txt+1030−950 tests/golden/prelude-unit-list-transforms/tree.txt+473−439 tests/golden/prelude-unit-list-transforms/types.txt+2−1 tests/golden/types-arithmetic-module/source.jibb+1−1 tests/golden/types-arithmetic-module/tokens.txt+8−8 tests/golden/types-arithmetic-module/tree.txt+5−5 tests/golden/types-arithmetic-module/types.txt+2−2 tests/golden/types-cell-pattern-schemes/source.jibb+1−1 tests/golden/types-cell-pattern-schemes/tokens.txt+7−7 tests/golden/types-cell-pattern-schemes/tree.txt+3−3 tests/golden/types-cell-pattern-schemes/types.txt+1−1 tests/golden/types-generic-face-inference/types.txt+7−1 tests/golden/types-generic-result-context/source.jibb+9−9 tests/golden/types-generic-result-context/tokens.txt+65−65 tests/golden/types-generic-result-context/tree.txt+24−24 tests/golden/types-generic-result-context/types.txt+6−6 tests/golden/types-generic-union-escaping/module-trees.txt+4−4 tests/golden/types-generic-union-escaping/modules/ui/mid.jibb+1−1 tests/golden/types-generic-union-escaping/source.jibb+1−1 tests/golden/types-generic-union-escaping/tokens.txt+1−1 tests/golden/types-generic-union-escaping/tree.txt+1−1 tests/golden/types-hole-numeric-capture/types.txt+10−4 tests/golden/types-nested-shallow-preserve/source.jibb+15−15 tests/golden/types-nested-shallow-preserve/tokens.txt+107−107 tests/golden/types-nested-shallow-preserve/tree.txt+61−61 tests/golden/types-nested-shallow-preserve/types.txt+20−20 tests/golden/types-pair-context/source.jibb+14−14 tests/golden/types-pair-context/tokens.txt+71−71 tests/golden/types-pair-context/tree.txt+34−34 tests/golden/types-pair-context/types.txt+19−19 tests/golden/types-partial-aura-family/source.jibb+1−1 tests/golden/types-partial-aura-family/tokens.txt+8−8 tests/golden/types-partial-aura-family/tree.txt+4−4 tests/golden/types-partial-aura-family/types.txt+1−1 tests/golden/types-partial-locals/source.jibb+2−2 tests/golden/types-partial-locals/tokens.txt+10−10 tests/golden/types-partial-locals/tree.txt+5−5 tests/golden/types-partial-locals/types.txt+1−1 tests/golden/types-prelude-ask/about.txt+1−1 tests/golden/types-prelude-ask/source.jibb+1−1 tests/golden/types-prelude-ask/tokens.txt+25−25 tests/golden/types-prelude-ask/tree.txt+11−11 tests/golden/types-prelude-ask/types.txt+1−1 tests/golden/types-prelude-bond/source.jibb+1−1 tests/golden/types-prelude-bond/tokens.txt+12−12 tests/golden/types-prelude-bond/tree.txt+6−6 tests/golden/types-prelude-bond/types.txt+1−1 tests/golden/types-prelude-cmd/source.jibb+6−6 tests/golden/types-prelude-cmd/tokens.txt+32−32 tests/golden/types-prelude-cmd/tree.txt+15−15 tests/golden/types-prelude-cmd/types.txt+8−8 tests/golden/types-prelude-list-alias/source.jibb+1−1 tests/golden/types-prelude-list-alias/tokens.txt+9−9 tests/golden/types-prelude-list-alias/tree.txt+5−5 tests/golden/types-prelude-list-alias/types.txt+1−1 tests/golden/types-prelude-ui/about.txt+4 tests/golden/types-prelude-ui/modules.txt+1 tests/golden/types-prelude-ui/source.jibb+78 tests/golden/types-prelude-ui/tokens.txt+728 tests/golden/types-prelude-ui/tree.txt+300 tests/golden/types-prelude-ui/types.txt+85 tests/golden/types-prelude-unit-helpers/about.txt+1−1 tests/golden/types-prelude-unit-helpers/source.jibb+6 tests/golden/types-prelude-unit-helpers/tokens.txt+113−1 tests/golden/types-prelude-unit-helpers/tree.txt+61−1 tests/golden/types-prelude-unit-helpers/types.txt+18 tests/golden/types-record-cast-context/types.txt+1−1 tests/golden/types-recursion-scc-import/source.jibb+1−1 tests/golden/types-recursion-scc-import/tokens.txt+7−7 tests/golden/types-recursion-scc-import/tree.txt+5−5 tests/golden/types-recursion-scc-import/types.txt+1−1 tests/golden/types-scope-library-poke/types.txt+2−1 tests/golden/types-scope-root-api/types.txt+1−1 tests/golden/types-union-finite-context/source.jibb+1−1 tests/golden/types-union-finite-context/tokens.txt+3−3 tests/golden/types-union-finite-context/tree.txt+2−2 tests/golden/types-union-nonwing-subject/source.jibb+13−13 tests/golden/types-union-nonwing-subject/tokens.txt+54−54 tests/golden/types-union-nonwing-subject/tree.txt+26−26 tests/golden/types-union-nonwing-subject/types.txt+3−3 tests/golden/types-union-polymorphic-identity/types.txt+1−1 tests/golden/types-unit-context/source.jibb+3−3 tests/golden/types-unit-context/tokens.txt+33−33 tests/golden/types-unit-context/tree.txt+21−21 tests/golden/types-unit-context/types.txt+15−15 tests/lib/jibb-buttons.hoon+81 tests/lib/jibb-deferred-prepared.hoon+114 tests/lib/jibb-deferred.hoon+1−1 tests/lib/jibb-direct-gate-source.hoon+3−3 tests/lib/jibb-doc-examples.hoon+166 tests/lib/jibb-generic-construction.hoon+2−2 tests/lib/jibb-generic-pattern.hoon+2−2 tests/lib/jibb-generic-recursion.hoon+4−4 tests/lib/jibb-list-alias-guards.hoon+1−1 tests/lib/jibb-page-main.hoon+168 tests/lib/jibb-poke-bridge.hoon+2−2 tests/lib/jibb-program-init.hoon+140 tests/lib/jibb-program-main.hoon+141 tests/lib/jibb-program-update.hoon+140 tests/lib/jibb-program-watch.hoon+209 tests/lib/jibb-request-guards.hoon+2−2 tests/lib/jibb-store.hoon+285 tests/lib/jibb-theme.hoon+86 tests/lib/jibb-todo-api.hoon+1−1 tests/lib/jibb-todo-full.hoon+157 tests/lib/jibb-union-source.hoon+2−2 tests/lib/jibb.hoon+573−566 tests/type-api-paths/poke-clash.txt+2 tests/type-buttons/error.txt+3 tests/type-buttons/expected.txt+2 tests/type-buttons/valid.txt+4 tests/type-deferred-prepared/expected-control.txt+7 tests/type-deferred-prepared/expected-tuple-only.txt+4 tests/type-deferred-prepared/expected.txt+8 tests/type-deferred-prepared/good.txt+9 tests/type-deferred-prepared/imported.txt+11 tests/type-deferred-prepared/main.txt+10 tests/type-deferred-prepared/mold-collision.txt+9 tests/type-deferred-prepared/no-final-cast.txt+8 tests/type-deferred-prepared/no-prelude.txt+9 tests/type-deferred-prepared/tuple-only.txt+3 tests/type-deferred-prepared/unrelated-tag.txt+11 tests/type-deferred-prepared/wrong-draft.txt+9 tests/type-deferred-prepared/wrong-unit.txt+9 tests/type-direct-gate/expected.txt+11−11 tests/type-direct-gate/source.txt+3−3 tests/type-gate-free/todo-gate.txt+2−2 tests/type-gate-free/todo-noun.txt+2−2 tests/type-gate-free/todo.txt+2−2 tests/type-generic-construction/alias-client.txt+4−4 tests/type-generic-construction/alias.txt+1−1 tests/type-generic-construction/client.txt+20−20 tests/type-generic-construction/expected.txt+13−13 tests/type-generic-construction/no-event-client.txt+6−6 tests/type-generic-construction/owner-negative.txt+8−8 tests/type-generic-construction/owner-positive.txt+7−7 tests/type-generic-construction/tree-no-event.txt+3−3 tests/type-generic-construction/tree.txt+5−5 tests/type-generic-pattern/client.txt+48−48 tests/type-generic-pattern/expected.txt+24−24 tests/type-generic-pattern/no-event.txt+5−5 tests/type-generic-pattern/owner-bad.txt+11−11 tests/type-generic-pattern/owner.txt+10−10 tests/type-generic-recursion/about.txt+1−1 tests/type-generic-recursion/alias.txt+1−1 tests/type-generic-recursion/bad-constructor.txt+6−6 tests/type-generic-recursion/bad-match.txt+6−6 tests/type-generic-recursion/bad-mold.txt+5−5 tests/type-generic-recursion/bad-parameter.txt+5−5 tests/type-generic-recursion/client.txt+6−6 tests/type-generic-recursion/expected.txt+5−5 tests/type-generic-recursion/list-shadow.txt+2−2 tests/type-generic-recursion/local-distinct.txt+7−7 tests/type-generic-recursion/local-only.txt+5−5 tests/type-generic-recursion/local-shadow.txt+7−7 tests/type-generic-recursion/tree-changed.txt+5−5 tests/type-generic-recursion/tree.txt+5−5 tests/type-list-alias/expected.txt+4−4 tests/type-page-main/about.txt+3 tests/type-page-main/arbitrary-main.txt+1 tests/type-page-main/blog-api.txt+5 tests/type-page-main/blog-index.txt+9 tests/type-page-main/blog-sur.txt+6 tests/type-page-main/card.txt+5 tests/type-page-main/ctor-page.txt+10 tests/type-page-main/diff-load.txt+11 tests/type-page-main/hand-built-load.txt+14 tests/type-page-main/index.txt+10 tests/type-page-main/indirect-load.txt+11 tests/type-page-main/page-alias.txt+11 tests/type-page-main/posts-mark.txt+6 tests/type-page-main/pure-load.txt+10 tests/type-page-main/static.txt+7 tests/type-page-main/todo-api.txt+13 tests/type-page-main/todo-island.txt+40 tests/type-page-main/typed-load.txt+8 tests/type-page-main/wrong-static.txt+1 tests/type-poke/about.txt+2−2 tests/type-poke/alias.txt+1−1 tests/type-poke/client.txt+13−13 tests/type-poke/direct.txt+1−1 tests/type-poke/expected.txt+21−21 tests/type-poke/exported.txt+4−4 tests/type-poke/inner.txt+1−1 tests/type-poke/public.txt+1−1 tests/type-poke/transitive.txt+1−1 tests/type-program-main/about.txt+1 tests/type-program-main/alias-main.txt+11 tests/type-program-main/arbitrary-main.txt+10 tests/type-program-main/consumer.txt+2 tests/type-program-main/gate-data.txt+10 tests/type-program-main/gate-model.txt+11 tests/type-program-main/initializer-consumer.txt+2 tests/type-program-main/initializer-earlier.txt+10 tests/type-program-main/initializer-error.txt+10 tests/type-program-main/initializer-generic.txt+10 tests/type-program-main/initializer-message.txt+13 tests/type-program-main/initializer-missing.txt+9 tests/type-program-main/initializer-model.txt+11 tests/type-program-main/initializer-no-main.txt+10 tests/type-program-main/initializer-subs.txt+10 tests/type-program-main/initializer-tag.txt+13 tests/type-program-main/initializer-unfaced.txt+10 tests/type-program-main/initializer.txt+12 tests/type-program-main/mismatched-model.txt+10 tests/type-program-main/nonempty-subs.txt+12 tests/type-program-main/open-message.txt+7 tests/type-program-main/source.txt+12 tests/type-program-update/consumer.txt+2 tests/type-program-update/malformed-sample.txt+9 tests/type-program-update/missing-list.txt+15 tests/type-program-update/non-main.txt+14 tests/type-program-update/source.txt+15 tests/type-program-update/three-slot-sample.txt+9 tests/type-program-update/unrelated-tag.txt+16 tests/type-program-update/wrong-message.txt+10 tests/type-program-update/wrong-model.txt+12 tests/type-program-update/wrong-result.txt+12 tests/type-program-watch/about.txt+1 tests/type-store/basket.txt+32 tests/type-store/cart.txt+12 tests/type-theme/dark-absent.txt+8 tests/type-theme/missing-field.txt+7 tests/type-theme/source.txt+8 tests/type-theme/wrong-dark.txt+8 tests/type-theme/wrong-font.txt+8 tests/type-theme/wrong-nested-aura.txt+8 tests/type-todo-api/expected.txt+1−1 tests/type-todo-api/negative-expected.txt+4−4 tests/type-todo-api/negative.txt+1−1 tests/type-todo-api/source.txt+1−1 tests/type-todo-full/about.txt+3 tests/type-todo-full/alias.txt+42 tests/type-todo-full/ambiguous-mapper.txt+41 tests/type-todo-full/expected.txt+2 tests/type-todo-full/non-gate-view.txt+33 tests/type-todo-full/open-key.txt+40 tests/type-todo-full/wrong-message.txt+40 tests/type-todo-full/wrong-model.txt+40 tests/type-todo-full/wrong-result.txt+40 tests/type-todo-full/wrong-watch.txt+40 tests/type-todo-partial/expected.txt+1−1 tests/type-union-source/mixed-source.txt+2−2 tools/testdata/ship-selftest+60 tools/type-buttons-test+40 tools/type-deferred-prepared-test+49 tools/type-doc-examples-test+49 tools/type-page-main-test+86 tools/type-program-init-test+49 tools/type-program-main-test+46 tools/type-program-update-test+46 tools/type-program-watch-test+48 tools/type-store-test+41 tools/type-theme-test+44 tools/type-todo-full-test+98
README.md+13−1
@@ -42,7 +42,19 @@ tools/hoon '(golden /a/b/jibb (crip "++ main view"))'
4242tools/hoon --raw --cord src=tests/golden/foo/source.jibb 'tree:(golden /a/b/jibb src)'
4343```
4444
45−`tools/testdata/selftest` tests both tools against a stub library, and `tools/doc-blocks` against Markdown it writes. `tools/importer-test` compares the partial Hoon importer's fixture projections against their golden file. `tools/type-import-test`, `tools/type-import-overlap-test`, `tools/type-import-structural-test`, `tools/type-union-source-test`, `tools/type-union-alias-overlap-test`, `tools/type-full-overlap-test`, `tools/type-generic-recursion-test`, `tools/type-generic-construction-test`, `tools/type-generic-pattern-test`, `tools/type-deferred-test`, `tools/type-deferred-resolver-test`, `tools/type-deferred-context-test`, `tools/type-empty-test`, `tools/type-cell-branch-test`, `tools/type-tlon-test`, `tools/type-mark-test`, `tools/type-poke-test` and `tools/type-api-paths-test` check importer/checker, prelude and partial API path analysis boundaries under eval; the ship suite runs the same fixtures.
45+`tools/testdata/selftest` tests both tools against a stub library, and `tools/doc-blocks` against Markdown it writes. `tools/importer-test` compares the partial Hoon importer's fixture projections against their golden file. `tools/type-import-test`, `tools/type-import-overlap-test`, `tools/type-import-structural-test`, `tools/type-union-source-test`, `tools/type-union-alias-overlap-test`, `tools/type-full-overlap-test`, `tools/type-generic-recursion-test`, `tools/type-generic-construction-test`, `tools/type-generic-pattern-test`, `tools/type-deferred-test`, `tools/type-deferred-prepared-test`, `tools/type-deferred-resolver-test`, `tools/type-deferred-context-test`, `tools/type-empty-test`, `tools/type-cell-branch-test`, `tools/type-tlon-test`, `tools/type-mark-test`, `tools/type-poke-test` and `tools/type-api-paths-test` check importer/checker, prelude and partial API path analysis boundaries under eval; the ship suite runs the same fixtures.
46+
47+The focused `tools/type-page-main-test` fully checks the byte-identical static about page and direct blog/todo data pages through the real readers, with exact main types, downstream imports and fail-closed syntax/evidence controls; the same fixture runs on the fake ship. It does not render pages or execute requests.
48+
49+The focused `tools/type-buttons-test` fully checks the documented `labelled` and `wide` definitions and the unchanged module's exact source-located unresolved-`%add` error through detailed and legacy inference. The eval test and fake-ship arm share the valid source, schemes and error fixtures. It does not render or execute UI.
50+
51+The focused `tools/type-doc-examples-test` fully checks the import-only example with real Hoon readers and the card module, the `view-day` and `step` modules, and the `cmd`/`sub` molds at their prelude path through detailed and legacy inference. The same fixture runs on the fake ship.
52+
53+The focused `tools/type-theme-test` fully checks the byte-identical real theme against the exact prelude mold, including its exported type, structural downstream import, dark absent/present forms and malformed-field negatives under eval with a shared fake-ship arm. It does not check contrast, render themes or route fonts.
54+
55+The focused `tools/type-store-test` checks the byte-identical cart store and basket through detailed and legacy inference, exact main and derived schemes, structural imports, direct store watch evidence and rejection controls under eval with a shared fake-ship arm. It does not lower or execute stores, support multi-action declarations, or permit store requests in page loads.
56+
57+The focused `tools/type-program-main-test` checks the narrow closed, subscription-free `main` slice and its shared fake-ship fixture. `tools/type-program-init-test` checks transactional initializer recovery for a synthetic direct program, including exact exported and imported types and rejection boundaries. `tools/type-program-update-test` checks derived result context for an unannotated two-slot update, including a union/boolean branch, downstream types and fail-closed controls under eval with a shared fake-ship arm. `tools/type-program-watch-test` uses the real todo readers with synthetic program components to check one direct request value against merged API-source evidence and reject hand-built, indirect, parameterized, diff and ambiguous subscriptions. These are static checks only: they do not run an island or establish runtime watching. `tools/type-todo-full-test` additionally checks the byte-identical todo island through both full-module APIs, verifies its exact closed `main` type and structural downstream import, and runs rejection controls.
4658
4759### The doc's examples
4860
docs/README.md+2
@@ -2,6 +2,8 @@
22
33Jibb's spec is a design doc by @iko, [Jibb — an Elm-architecture UI language for Urbit](https://claude.ai/artifact/DMBr48qzi5z8hcwn2ccPBv), and its repository copy in `spec/`. The repository copy records decisions made on 2026-10-30, including dropping `$?`, adding `%$` as a term literal and pattern, making `@` an unrestricted atom, treating `?` as two atoms for union disjointness, and the milestone 2 type and prelude decisions; the Claude document still needs to be synchronized. This folder also holds where the build stands, what is still open, and how to work on the code.
44
5+The current full-module checker also has a narrow static/data-page slice, documented in [compiler.md](compiler.md) and [status.md](status.md). Its shared eval/ship fixture checks the real about, blog index and todo index sources without claiming rendering or request execution. The shared theme fixture likewise full-checks the byte-identical real theme and its exact type without implementing theme behavior.
6+
57| File | What it holds |
68| --- | --- |
79| [spec/](spec/) | The doc's tabs, as Markdown |
docs/compiler.md+25−3
@@ -120,7 +120,7 @@ For a unique supported declaration, `+api-request-parts` retains that evidence w
120120
121121`+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.
122122
123−The ordinary import resolver can infer derived request-gate types for multiple supported API paths. A case may take one typed path parameter before its reply gate, or one diff fold after the reply; a case with both, multiple parameters or diffs, or a separate scry path remains unsupported. Each reply maps the full mark type to a fresh `M` and the request result is `(ask M)`. Checked ordinary API values and molds, declared mark molds and a supported poke constructor are exported too. Every selected `/sur` core must have a directly used, successfully read mold; unselected core bindings are not independently validated, and Jibb module imports remain unsupported in this API fragment. The unchanged todo API fits this fragment.
123+The ordinary import resolver can infer derived request-gate types for multiple supported API paths. A case may take one typed path parameter before its reply gate, or one diff fold after the reply; a case with both, multiple parameters or diffs, or a separate scry path remains unsupported. Each reply maps the full mark type to a fresh `M` and the request result is `(ask M)`. Checked ordinary API values and molds, declared mark molds and a supported generic poke command helper are exported too. Every selected `/sur` core must have a directly used, successfully read mold; unselected core bindings are not independently validated, and Jibb module imports remain unsupported in this API fragment. The unchanged todo API fits this fragment.
124124
125125A call whose direct result is a known named generic union can receive a matching same-origin, same-arity result context before its arguments are inferred. This retains the ordered generic arguments and existing capital checks; pending tags, recursive or variable-bound origins and unrestricted atom cases remain conservative. Constructor fitting reports unsupported when an unresolved or opaque case could contain the requested tagged head. It keeps definite missing-case errors for proven nonmatching cases, including an explicitly atom-only faced head. The real todo callback `|=%got` can infer when an `(ask msg)` result context fixes its message union; the uncontextualized call remains unsupported.
126126
@@ -128,6 +128,20 @@ A two-item tuple with an explicit term, null or loobean head can receive payload
128128
129129`+gate-free-type` is a separate three-way proof over normalized checker types: it reports a gate-free result, a gate-bearing witness with its field path, or unknown. It tracks conservative inhabitance before reporting a gate in a cell, spends one shared node budget, and treats opaque recursion, open variables, unknown collection forms and `*` conservatively. Source-proven `qath` and the recognized list/unit representations have dedicated proofs. `+gate-free-mold-source` parses and resolves one named mold with a fresh active-root graph, retaining the complete prepared prelude, source bundle, trusted reader inputs, dependency cache and inferred mold. It caps classification at 256 nodes; parsing, import resolution and type inference are not covered by that cap. The host must canonicalize paths and bind trusted sources and reader results to their versions. API, store and private roots decline; other definitions and unused imported Hoon bindings are not fully checked. This is mold analysis, not a module, kind, island, watchability or runtime check, and it does not infer general gate-free constraints.
130130
131+A full ordinary module may export a narrow checked program `main` only as a direct, unqualified `(program init update view subs)` call with four simple wing arguments, modulo transparent grouping. The canonical prepared prelude must supply both the `program` value and mold. The ordinary source-backed program fit and all normal mold, value and request-graph checks complete first. The inferred `main` must be closed and invariantly match an instantiated `program` mold from that prelude. The initializer must have a closed gate scheme; its data and model contain no open variables and share the existing 256-node gate-free budget, with `%yes` required for both. The named subscription gate may syntactically return null through transparent casts, groups and definition-free bodies. Alternatively, after a successful request-graph merge, it may return one singleton list containing an unfaced `[%watch request]` pair whose request is a direct `case.face` call with one direct constructor callback. The face must resolve to an imported interface whose member has the exact plain derived-request scheme. Exactly one merged request evidence must match its API path and case, agree with the declaration's inner name, and appear in that interface's own graph; the interface source must equal the evidence's API source. The declaration must have no scry, diffs or path parameters. Pure or hand-built requests, helpers, aliases, re-exports, typed paths, folds, multiple subscriptions and missing or ambiguous evidence fail closed. Arbitrary or aliased mains, API/store kinds, and gates or unknowns in data/model also fail closed. This retains source and graph evidence and permits ordinary downstream imports; it neither executes the program nor implements runtime watching.
132+
133+The same post-inference, post-request-graph kind boundary accepts a static `main` by instantiating its ordinary scheme, fitting it to canonical `(element !!)`, requiring the specialized result closed, and publishing that closed canonical scheme. Thus `main view` works when `view` is generic only in its element message. A data page must instead be a direct `(page load view)` call with simple wing arguments and a closed main type invariant against the instantiated canonical `page` mold. Its named load must be a direct gate whose transparent body is exactly `case.face reply`, with a simple wing or direct constructor reply. Page loads and direct program watches share the exact plain derived-member/request-evidence check: unique evidence in the selected interface's own graph, matching API source and inner case name, no typed path segments, diffs or scry. Page aliases, indirect or hand-built/pure/unknown requests, other main types and store paths fail closed. These are interface checks only, not rendering or runtime request claims.
134+
135+A store `main` is recognized only as a direct, unqualified `(store init update)` call with two simple wing arguments, modulo grouping, independently of its directory. Its module must declare exactly one ordinary `state` mold and one ordinary, nongeneric local `+$ poke` action mold. Both remain in ordinary mold/value inference and are exported. `+store-main-closed` checks the canonical closed store main, exact init/state equality, and an invariant `$-([action state] state)` update after erasing only the two outer binder faces. It deliberately performs no gate-free-state check. The direct form can recover a missing main from checked components; aliases and hand-built records cannot.
136+
137+The store interface adds a derived `$-([action $-((unit @t) M)] (cmd M))` poke helper and a generic `$-($-(state M) (ask M))` state request after validating the exact internal `raw-poke`, canonical `cmd`, standard `unit` and `ask` representations. Derived names must not collide with values, imports or other derived names. Store request certificates are distinct from API certificates and retain the exact store path, source, state and action identities across graph merges. `+derived-store-request-member` requires the selected interface's unique state member and action constructor to match freshly derived canonical schemes and the same certificate to occur in both interface and consumer graphs. Store state is watchable by definition only after those checks; page loads continue to accept API evidence alone. Multi-action declarations, lowering and execution are outside this slice.
138+
139+When only that program's initializer and `main` are unresolved, a bounded transactional retry can derive the initializer's expected gate from the resolved update, view and subscription components. It instantiates all schemes above the greatest variable ID in the module and prelude, reuses the source-backed positional fit and stable replay, and leaves only the initializer's data variable open. The named initializer must be a direct gate whose transparent body is a tuple ending in null. Its own sample fixes data; ordinary inference, product and whole-gate fits, pending-tag and finalization checks, and a fresh ordinary `main` inference must all succeed before the ordinary kind and graph checks publish anything. Aliases, non-main libraries, simultaneous unresolved subscriptions, nonempty subscriptions and unrelated pending tags decline.
140+
141+A component-local recovery sequence handles a recognized direct program whose context-dependent definitions cannot resolve ordinarily. Update first derives its result from its inferred two-slot sample and canonical `cmd`/`list` templates. Subscription recovery then checks the same message/model relation and the canonical fourth slot. A narrow keyed-view proof finds exactly one direct `each (turn xs mapper)` site, derives the mapper from the actual `each` and `turn` schemes, and recovers the view before the existing initializer and ordinary `main` retries. Every recovered scheme must be closed and freshly allocated above the current environment and prelude IDs. A source screen skips doomed ordinary attempts only for this keyed shape and never skips final `main` inference; non-gate views and aliases decline without crashing. Final publication still requires all module definitions, the program-mold and gate-free checks, and request-value watchability.
142+
143+Canonical `element` composition has two tightly scoped accommodations. Recursive result context is allowed only when every recursive side has the prepared prelude's `element` origin. When ordinary list-item fitting fails, an `element` target may instead prove its message argument invariantly or select one exact literal case with a full payload fit; a successful ordinary fit always takes precedence. This covers the unchanged todo's union controls and raw constructors without opening those paths to other unions. `tools/type-todo-full-test` checks the byte-identical island through both full APIs, the exact closed `main` type, structural downstream import, and model/message/mapper/watch rejection controls. It does not execute Jibb or implement runtime watching.
144+
131145Each case's canonical API identity and source-derived schema travel across imports in a nonrecursive graph certificate containing the exact source bundle, prelude, reserved scope and trusted reader results. Cached interfaces must match those inputs and cannot hide an active ancestor; unknown legacy entries are rebuilt from their unique supplied source. Request-bearing closures are limited to 256 paths and requests. Closed gate samples can also fit when an unnamed input slot corresponds to a named one, provided products are identical and nested value faces and ambiguous cell tails remain intact. This is type inference only: request lowering, runtime schema validation and value watchability proofs are not implemented.
132146
133147`+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.
@@ -136,6 +150,12 @@ The supplied prelude is parsed into a **partial interface**: all names actually
136150
137151`+prepare-prelude` derives the interface and declared-name inventory from the trusted vendored source. Hosts can reuse its result with `+golden-types-with-prepared-prelude`; they must pass the unchanged result of preparation, not an independently constructed value. Empty, malformed and duplicate-name prelude sources fail closed. The source-taking `+prepare-prelude` and `+golden-types-with-prelude` do not supply the internal module; their `-and-internal` or `-with-internal` variants accept its source for the supported private import. API files, modules with `main`, unsupported definitions and many other features remain outside this subset. The older `+golden-types-with-modules` entry point fails closed for imports because it has no prelude scope. None of these partial reports claims the module has been checked.
138152
153+The prepared interface includes the source-backed UI molds and constructors, the full nonrecursive `element` union, and the exact `program` and `page` records and builders. Its element union erases nested child, keyed-item and table payloads to `*`, while public constructor schemes retain typed composition and independent key parameters. `types-prelude-ui` checks those schemes and selected valid and invalid compositions. A child-message mismatch currently fails closed as an unsupported list-item constraint rather than a definite mismatch diagnostic. Raw-constructor encapsulation, duplicate-attribute checks, rendering, navigation, storage and execution remain outside this slice.
154+
155+The Grammar's buttons example has a shared full-check fixture. Without `add-button`, `labelled` and `wide` export their exact generic `(element A)` and `(list attr)` schemes through detailed and legacy inference. The ordinary call fit handles this by unifying a variable actual argument with the body of an expected faced slot, rather than putting the sample face on the argument's type. With the unchanged `add-button`, final incompleteness triggers a diagnostic-only retry bounded to 64 missing definitions. A pending tag retains its literal span, so the error says that nothing fixes the union of `%add` at the literal and includes its source excerpt. Other incomplete modules keep the generic error, and successful modules never run the retry. This checks types only; it does not render or execute buttons.
156+
157+The prepared interface also includes the exact documented `theme` mold. Full checking covers the unchanged real `/ui/theme.jibb`, its exact exported record and a structural downstream import, with dark absent/present and field/type rejection controls. The documented present dark record uses explicit backtick unit syntax, as the Decisions tab records; there is no theme-specific inference exception. This is type checking only: contrast validation, theme rendering and routing remain unimplemented.
158+
139159And the design notes:
140160
141161| Note | Says |
@@ -190,7 +210,7 @@ Note 4 has examples of each.
190210
191211Starting `urbit eval` and building the library takes about 8 s. A 2,000-line module of 400 definitions then parses in about a second. Loops over definitions, arms, lines and items are tail calls, so a long module grows no stack; nesting costs a few stack frames a level, and 100,000 nested brackets still parse (note 3).
192212
193−The experimental deferred constructor path can close a small import-free library transaction when ordinary resolution stalls. It retries definitions whose earlier attempts failed from their original states, retaining only successful attempts. A transaction with at most 64 definitions makes at most 4,096 attempts; it stops after a pass with no progress. This bounds the new attempt count, not each attempt's parsing, type walks or ordinary inference. Deferred definitions are restricted to simple one-component wings, literals, static strings, gates, transparent groups and empty bodies, calls, casts and a restricted boolean branch. Each successful call or cast fit must have exactly equal normalized operands so later substitutions cannot invalidate a face check. A multi-argument call also needs closed argument, sample and product types because positional face checks depend on slot boundaries and whether the result can be a cell. Other fits fail closed. A 512-node screen bounds visited expression nodes and a separate 512-node scan bounds each stability check; neither bounds mold shapes, string-piece checks, parsing, normalization, lookup, or total repeated inference. It accepts only a direct constructor callback with a closed input, records its pending fit under the source-owned inference state, and generalizes each definition against the live environment and pending constraints. Before publication it discharges and replays every edge, rejects unresolved tags or changed replay state, and checks that all molds and values are complete. The reporter reads the committed schemes for definitions added by the transaction. API and store paths, `main`, prepared preludes, imports, recursive groups, unresolved holes or written capitals, and new projection actions remain outside this path. `%grec` in the constraint or freshness scan is conservatively unsupported. This is not an island-kind, runtime, or watchability check.
213+The experimental deferred constructor path can close a small import-free library transaction when ordinary resolution stalls. It retries definitions whose earlier attempts failed from their original states, retaining only successful attempts. A transaction with at most 64 definitions makes at most 4,096 attempts; it stops after a pass with no progress. This bounds the new attempt count, not each attempt's parsing, type walks or ordinary inference. Deferred definitions are restricted to simple one-component wings, literals, static strings, gates, transparent groups and empty bodies, calls, casts and a restricted boolean branch. Each successful call or cast fit must have exactly equal normalized operands so later substitutions cannot invalidate a face check. A multi-argument call also needs closed argument, sample and product types because positional face checks depend on slot boundaries and whether the result can be a cell. Other fits fail closed. A 512-node screen bounds visited expression nodes and a separate 512-node scan bounds each stability check; neither bounds mold shapes, string-piece checks, parsing, normalization, lookup, or total repeated inference. It accepts only a direct constructor callback with a closed input, records its pending fit under the source-owned inference state, and generalizes each definition against the live environment and pending constraints. Before publication it discharges and replays every edge, rejects unresolved tags or changed replay state, and checks that all molds and values are complete. The reporter reads the committed schemes for definitions added by the transaction. API and store paths, `main`, prepared-prelude recovery, imports, recursive groups, unresolved holes or written capitals, and new projection actions remain outside this full-module path. `%grec` in the constraint or freshness scan is conservatively unsupported. This is not an island-kind, runtime, or watchability check.
194214
195215An expected cell type can supply context to both arms of a loobean branch. This slice first retains any ordinary inference that already fits. Otherwise it retries from the original state only when a syntax screen excludes nested branches, casts, gates and local bodies, and a substitution screen excludes structural bindings. Both arms must fit, their normalized results and the expected type must be closed, their result types must match, and both fits must replay without changing the final substitution or fresh-ID counter. A successful retry retains the original arm type and its written faces; a failed retry returns the original inference result. The source and substitution screens each visit at most 512 entries. This permits at most one extra attempt for an eligible branch; the screens do not bound preexisting inference, type walks, list construction, or work across separate analyses.
196216
@@ -198,6 +218,8 @@ In an isolated diagnostic with the real todo API and reader inputs, this cell co
198218
199219A deferred boolean branch must use both distinct literal loobean patterns. Its subject is unified with `?`; the arms are inferred in source order without contextual retry. Equal normalized arm types are retained directly. When both written arms are direct literals that each created their own unbound pending tag, the checker can instead retain two source-owned fit obligations to a shared, monomorphic result variable. A later definition may close that variable; replay uses the ordinary literal fit, requires a closed atomic target or a union of direct constant/cell cases, and rejects faced targets and faced union cases. It replays all edges under the final substitution without adding bindings or fresh IDs. This does not support deferred list literals, union-pattern reachability, arbitrary branch expressions or prepared-prelude/imported modules. It does not establish request watchability.
200220
201−Before a fallback, the checker screens the already parsed source for a direct single-constructor call beneath groups, gates, casts or bodies without local definitions. The screen visits at most 64 AST nodes per definition and rejects sources with more than 64 definitions or 65,536 bytes. A transaction is attempted at most once per resolver or report invocation and holds at most 64 pending edges. These limits do not bound the initial parsing, ordinary resolution, normalization, or total work across separate analyses. On the pre-recursive-index snapshot, startup-inclusive synthetic 1,000-gate comparisons had baseline/candidate user times of 25.97/29.30 seconds and 26.30/27.46 seconds in reverse order. These are limited shared-load measurements, not production benchmarks. The trimmed source-backed and direct-guard fixture passed in 28.13 seconds wall and 27.53 seconds user on one run after screening; its cases include parse-success checks in the same transaction source pass. The outer resolver and reporter each parse independently, and a fallback currently parses the source again.
221+With the caller's unchanged prepared prelude, the partial report can also recover a narrow import-free, non-main ordinary library initializer. A direct tuple literal may retain one source-owned fit obligation for each newly created pending literal until a later exact result cast closes them. A separate bounded candidate screen admits a direct tuple even without a constructor call. The prepared transaction requires exact agreement among the supplied interface, value inventory and reserved molds, and retains the API, store, import and `main` exclusions. It only adds recovered entries to the partial report: the ordinary full-module resolver does not publish them. Wrong unit or draft fields, unrelated pending tags and mold-name collisions fail closed; without the later final cast, the initializer remains not checked. This does not add list-literal deferral or import-aware recovery.
222+
223+Before the no-prepared-prelude fallback, the checker screens the already parsed source for a direct single-constructor call beneath groups, gates, casts or bodies without local definitions. The screen visits at most 64 AST nodes per definition and rejects sources with more than 64 definitions or 65,536 bytes. A transaction is attempted at most once per resolver or report invocation and holds at most 64 pending edges. These limits do not bound the initial parsing, ordinary resolution, normalization, or total work across separate analyses. On the pre-recursive-index snapshot, startup-inclusive synthetic 1,000-gate comparisons had baseline/candidate user times of 25.97/29.30 seconds and 26.30/27.46 seconds in reverse order. These are limited shared-load measurements, not production benchmarks. The trimmed source-backed and direct-guard fixture passed in 28.13 seconds wall and 27.53 seconds user on one run after screening; its cases include parse-success checks in the same transaction source pass. The outer resolver and reporter each parse independently, and a fallback currently parses the source again.
202224
203225A single sequential, startup-inclusive comparison against checkpoint `c96597d` measured user CPU for an unrelated stalled library at 25.04 seconds baseline and 26.32 seconds with the screened fallback; an incompatible constructor took 25.72 and 27.16 seconds; a direct constructor that the baseline declined and the candidate resolved took 24.46 and 26.79 seconds. These are small shared-load measurements, not a production benchmark. The screen was separately checked with a trapping fallback: the unrelated source skipped it, while the eligible conflicting source reached it.
docs/development.md+24−1
@@ -83,6 +83,7 @@ git clone https://github.com/urbit/tools /root/src/tools
8383| `tools/type-deferred-test` | Checks the bounded source-owned deferred inference transaction under eval and on the ship |
8484| `tools/type-deferred-resolver-test` | Checks deferred resolution, report consistency and atomic failure under eval and on the ship |
8585| `tools/type-deferred-context-test` | Checks deferred source order and literal branch contexts under eval and on the ship |
86+| `tools/type-deferred-prepared-test` | Checks prepared-prelude tuple initializer recovery, exact partial reports and fail-closed guards under eval and on the ship |
8687| `tools/type-cell-branch-test` | Checks closed-cell branch context, rollback and bounded retry screens under eval and on the ship |
8788| `tools/type-generic-alias-test` | Runs public/private generic union alias and provenance guards under eval and on the ship |
8889| `tools/type-positional-face-guards-test` | Runs positional-call and nested-face guards under eval and on the ship |
@@ -90,6 +91,16 @@ git clone https://github.com/urbit/tools /root/src/tools
9091| `tools/type-todo-partial-test` | Reports partial inference of the unchanged todo island through the real API and readers under eval and on the ship |
9192| `tools/type-todo-api-test` | Exercises the actual todo API through the real Hoon readers and partial checker |
9293| `tools/type-direct-gate-test` | Checks a synthetic source-backed program report and direct gate provenance under eval and on the ship |
94+| `tools/type-page-main-test` | Fully checks byte-identical static and direct data pages through real readers, exact main types, downstream imports and rejection guards under eval and on the ship |
95+| `tools/type-buttons-test` | Checks the documented valid button helpers and the unchanged unresolved-`%add` module through detailed and legacy inference under eval and on the ship |
96+| `tools/type-doc-examples-test` | Fully checks the import-only, view-day, step and cmd/sub doc fragments in their intended contexts through detailed and legacy inference under eval and on the ship |
97+| `tools/type-theme-test` | Fully checks the byte-identical real theme, its exact exported type, structural downstream import, dark absent/present forms and rejection guards under eval and on the ship |
98+| `tools/type-program-main-test` | Checks the narrow closed subscription-free program-main interface, downstream import and rejection guards under eval and on the ship |
99+| `tools/type-program-init-test` | Checks transactional direct-program initializer recovery, exact exported/imported types and fail-closed boundaries under eval and on the ship |
100+| `tools/type-program-update-test` | Checks transactional direct-program update result recovery, union/boolean context, exact exported/imported types and fail-closed boundaries under eval and on the ship |
101+| `tools/type-program-watch-test` | Checks direct singleton request-value watchability against merged real-todo evidence, exact types/imports and rejection boundaries under eval and on the ship |
102+| `tools/type-store-test` | Checks the unchanged cart/basket through detailed and legacy inference, exact store/derived schemes, malformed-prelude guards, structural imports, source-bound state watch evidence and rejection guards under eval and on the ship |
103+| `tools/type-todo-full-test` | Fully checks the byte-identical todo island through real readers, exact main type, structural downstream import and rejection controls under eval and on the ship |
93104| `tools/type-closed-gate-guards-test` | Checks closed gate sample labels and face uncertainty under eval and on the ship |
94105| `tools/type-constructor-fit-guards-test` | Checks constructor-case uncertainty and known mismatches under eval and on the ship |
95106| `tools/type-nested-union-guards-test` | Checks nested tagged-union case selection and uncertainty under eval and on the ship |
@@ -116,6 +127,7 @@ git clone https://github.com/urbit/tools /root/src/tools
116127
117128```
118129tools/golden # all cases pass
130+tools/golden --case types-prelude-ui # exact UI/program/page schemes and composition
119131tools/importer-test # Hoon importer fixture projections match
120132tools/type-import-default-test # default-wrapped source proofs match
121133tools/type-import-test # importer/checker bridge golden report matches
@@ -138,12 +150,23 @@ tools/type-qath-guards-test # qath source and unfolding guards pass
138150tools/type-todo-partial-test # unchanged todo partial report and reader failure controls
139151tools/type-todo-api-test # real todo API partial inference and reader guards pass
140152tools/type-direct-gate-test # direct gate source and provenance guards pass
153+tools/type-page-main-test # static/data pages, exact types, imports and rejection guards pass
154+tools/type-buttons-test # documented buttons schemes and exact pending-tag error
155+tools/type-doc-examples-test # remaining doc fragments fully check in context
156+tools/type-theme-test # real theme, exact type, structural import and rejection guards pass
157+tools/type-program-main-test # closed program-main interface and rejection guards pass
158+tools/type-program-init-test # transactional direct-program initializer context guards pass
159+tools/type-program-update-test # transactional direct-program update context guards pass
160+tools/type-program-watch-test # direct request-value watchability guards pass
161+tools/type-store-test # unchanged cart/basket, store evidence and rejection guards pass
162+tools/type-todo-full-test # byte-identical full todo, downstream import and rejection guards pass
141163tools/type-generic-recursion-test # source-backed recursive identities and provenance
142164tools/type-generic-construction-test # source-backed recursive construction and bounds
143165tools/type-generic-pattern-test # source-backed recursive patterns and bounds
144166tools/type-deferred-test # source-owned deferred inference guards
145167tools/type-deferred-resolver-test # resolver consistency and failure guards
146168tools/type-deferred-context-test # deferred source-order and branch guards
169+tools/type-deferred-prepared-test # prepared initializer reports and failure guards
147170tools/type-cell-branch-test # contextual branch rollback and bounds
148171tools/type-closed-gate-guards-test # closed gate fit guards pass
149172tools/type-constructor-fit-guards-test # constructor fit guards pass
@@ -214,4 +237,4 @@ Write `source.jibb` and `about.txt` by hand, run `tools/golden --update --case <
214237
215238A short subject in the imperative, then a body that says what changed and why, wrapped at 72 columns, as in `git log`. Each commit leaves every check passing.
216239
217−`tools/type-deferred-test` exercises the bounded, source-owned constructor transaction and low-level freshness/replay guards. `tools/type-deferred-resolver-test` checks the experimental import-free library resolver, report consistency, atomic failure, and that both source orders of a late face constraint decline. These checks do not establish island-kind or watchability support.
240+`tools/type-deferred-test` exercises the bounded, source-owned constructor transaction and low-level freshness/replay guards. `tools/type-deferred-resolver-test` checks the experimental import-free library resolver, report consistency, atomic failure, and that both source orders of a late face constraint decline. `tools/type-deferred-prepared-test` checks the separate partial-report-only prepared-prelude route, direct tuple-literal obligations, exact report types and its wrong-field, unrelated-tag, mold-collision and no-final-cast controls. These checks do not establish island-kind or watchability support.
docs/prelude-inventory.md+10−4
@@ -4,9 +4,15 @@ This is a working inventory, not a completed prelude interface. It lists top-lev
44
55The source is the fake ship's `%base` `/sys/hoon.hoon` (Hoon version 135), read through Clay with `tools/ship scry /cx/=base=/sys/hoon/hoon --raw`. SHA-256: `ef538ced0877230f02ff86f9fb7a0abc6833bb1cf0e8675742b4d6ce478fcc92`. It differs in bytes from [upstream Hoon at the inspected commit](https://github.com/urbit/urbit/blob/5a187fededc4582a34fcd6055c67bb63e0917b94/pkg/arvo/sys/hoon.hoon); verify against the actual target ship when updating this inventory.
66
7−The vendored prelude defines `poke` in its private internal module and re-exports it as a transparent type. The partial checker resolves its supported source shape and a narrow imported API constructor; complete checking of the private body, other API shapes, effect lowering and runtime execution remain unfinished. `qath` is defined there as a transparent recursive knot sequence and re-exported by the public prelude; the partial checker supports its named identity, selected construction and matching, and static application-path literals. The internal prelude also defines a transparent generic `ask` with pure, agent and store cases; the public prelude re-exports it and defines `pure`. Supported source construction and matching infer, while derived requests, source-schema validation and execution remain unfinished.
7+The vendored prelude defines `raw-poke` in its private internal module and re-exports it as a transparent type. Derived API/store `poke` helpers take an action and reply and return `(cmd M)` after checking the canonical `raw-poke`, `cmd` and `unit` shapes; complete checking of the private body, other API shapes, effect lowering and runtime execution remain unfinished. `qath` is defined there as a transparent recursive knot sequence and re-exported by the public prelude; the partial checker supports its named identity, selected construction and matching, and static application-path literals. The internal prelude also defines a transparent generic `ask` with pure, agent and store cases; the public prelude re-exports it and defines `pure`. Supported source construction and matching infer, while derived requests, source-schema validation and execution remain unfinished.
88
9−The prelude also declares the generic `cmd` mold exactly as in Overview, Effects. The partial checker infers its five cases and independent message types in the supported examples; complete module checking and backend validation remain outstanding. The public prelude also declares `sub`; the partial checker infers supported constructions, while request watchability and execution remain outstanding.
9+The prelude also declares the generic `cmd` mold exactly as in Overview, Effects. The partial checker infers its five cases and independent message types in the supported examples; the doc's `cmd`/`sub` block also passes full detailed and legacy checking at the prelude path with matching printed schemes. Backend validation, request watchability and execution remain outstanding.
10+
11+The public prelude now defines the UI `length`, `align`, `role`, `tone` and `attr` molds, a nonrecursive generic `element` union with one case per UI node, and the exact `program` and `page` records with their builders. Nested child, keyed-item and table payloads in the runtime union are erased to `*`; the public constructors retain typed children and independent key types, and `island` stores `[program data]` in its erased payload. The focused `types-prelude-ui` golden infers the complete union and constructor schemes, including static and message-bearing composition. Raw-constructor encapsulation, duplicate-attribute rejection, rendering, storage, navigation and execution are not established by this slice.
12+
13+The public prelude defines the approved generic `store` record `[init=S update=*]` and its builder, whose update argument is `$-([A S] S)` while the result exposes only `S`. Focused store coverage checks both exact schemes, the unchanged cart's closed main and derived generic poke/state gates, malformed-prelude controls and downstream structural imports. The local `+$ poke` remains an ordinary action mold. Store declaration checking and watch evidence are implemented; multi-action declarations, lowering and runtime execution are not.
14+
15+The public prelude also defines the exact `theme` mold: three space cords, five normal tone cords, `wide`, `lang` and `zone` cords, `(unit qath)` for `font`, and a unit containing the same five dark tone cords. The shared `type-theme` fixture fully checks the byte-identical real theme and its structural downstream import, including dark absent/present and malformed-field negatives. It does not implement contrast checking, rendering, routing or any other theme behavior.
1016
1117Hoon `+$` arms are marked **mold** below; `++` arms can be gates, doors or mold generators, and need individual inspection. Jibb's loobean `not` and Hoon's bitwise `not.bit` are distinct. Parser helpers outside 3g are excluded from the intended prelude except the specifically listed `slav` and `slaw`; the raw candidates below still need to be classified.
1218
@@ -26,7 +32,7 @@ The source-backed `gth` gate calls a compiler-supplied private comparison interf
2632
2733`biff`, `bind`, `bond`, `both`, `clap`, `clef`, `drop`, `fall`, `flit`, `hunt`, `lift`, `mate`, `need`, `some`.
2834
29−The following is an audit of the Hoon 135 bodies, not a completed Jibb interface. The partial checker infers `fall`, `need`, `some`, `bind`, `biff`, `bond`, `both`, `clap`, `clef`, `drop` and `flit`; the remaining written implementations have been parsed, but complete checker validation remains outstanding. Backend validation and jet recognition remain outstanding for all of them.
35+The following is an audit of the Hoon 135 bodies, not a completed Jibb interface. The partial checker infers `fall`, `need`, `some`, `bind`, `biff`, `bond`, `both`, `clap`, `clef`, `drop`, `flit` and `hunt`; the remaining written implementations have been parsed, but complete checker validation remains outstanding. Backend validation and jet recognition remain outstanding for all of them.
3036
3137| Name | Hoon behavior | Jibb status |
3238| --- | --- | --- |
@@ -39,7 +45,7 @@ The following is an audit of the Hoon 135 bodies, not a completed Jibb interface
3945| `drop` | Converts an absent unit to an empty list and a present unit to a singleton. | Written; inferred by the partial checker |
4046| `fall` | Returns the value of a present unit or the supplied fallback. | Written; inferred by the partial checker |
4147| `flit` | Returns a gate that wraps a value only if it satisfies the predicate. | Written |
42−| `hunt` | Returns the only present unit or chooses between two present values with an ordering gate. | Missing |
48+| `hunt` | Returns the only present unit or chooses between two present values with an ordering gate. | Written with the ordering gate first, as `(hunt ord a b)`; both ordering outcomes and absent units are inferred |
4349| `lift` | Takes a mold and a unit, then applies the mold to a present value as `bind` does. | Missing; Jibb molds are not callable values |
4450| `mate` | Returns the present unit if only one is present; when both are present it returns one if their values are equal and crashes otherwise. | Missing |
4551| `need` | Extracts a present value and crashes on an absent unit. | Written; inferred by the partial checker |
docs/prompts/milestone-2.md+5−5
@@ -49,7 +49,7 @@ And from the plan's Risks:
4949
5050## First steps
5151
52−1. **Specify the prelude inventory.** The checker needs the prelude's complete exported inventory and signatures; include all names from the listed Hoon library sections except explicitly excluded groups, as `docs/open-questions.md` question 3 records. The prelude imports private helpers and low-level primitives from a separate internal module without exposing them; its public foundational gates are implemented in Jibb on those primitives. The source-backed internal module defines `poke`, `ask` and `qath`; the public prelude re-exports them as ordinary transparent types that modules can construct and inspect, as questions 24 and 25 record. Their current representations and partial checker support are described in `docs/compiler.md`.
52+1. **Specify the prelude inventory.** The checker needs the prelude's complete exported inventory and signatures; include all names from the listed Hoon library sections except explicitly excluded groups, as `docs/open-questions.md` question 3 records. The prelude imports private helpers and low-level primitives from a separate internal module without exposing them; its public foundational gates are implemented in Jibb on those primitives. The source-backed internal module defines `raw-poke`, `ask` and `qath`; the public prelude re-exports them as ordinary transparent types that modules can construct and inspect, as questions 24 and 25 record. Their current representations and partial checker support are described in `docs/compiler.md`.
5353
5454 The plan's three core-language rules were adopted: gate-free `eq` arguments and map and set keys, with gates opaque for union matching; jetted prelude functions taking gates; and rejection of a non-gate value that depends on itself even through a gate.
55552. **Start the importer early**, as the plan's Risks ask: first on a small `/sur` file, then on Tlon's. "Suggested design" below has a way in.
@@ -70,7 +70,7 @@ The rules are scattered across the tabs. This is a map of them, not a replacemen
7070- Generic molds: `+$ result |$ [V E]` with cases below, applied as `(result V E)`; `|$` goes right after a `+$`'s name, and the prelude's `cmd` and `sub` use `|$ [M]`.
7171- `!!` is the empty mold, and as an expression it has any type. `*` is the noun type, not a type variable; generic positions such as the keys in `each` and `table` use a capital. A value of a more specific noun type can be used where `*` is expected.
7272- `_` is an inferable hole wherever a mold can appear, including an inferred path-segment aura. A hole resolved to an explicitly named generic variable is resolved; an unconstrained hole is an error. A named mold or value definition must determine its own holes without constraints from later uses.
73−- `poke`, `ask` and `qath` are transparent types defined in the internal prelude and re-exported normally. Derived gates and `pure` also construct requests; application-path literals have type `qath`.
73+- `raw-poke`, `ask` and `qath` are transparent types defined in the internal prelude and re-exported normally. Derived gates and `pure` also construct requests; application-path literals have type `qath`. A store's local `poke` is an ordinary action mold.
7474- The Literals table gives every other literal its type: `0x1f` a `@ux`, ships `@p`, dates `@da`, durations `@dr`, `~.knot` a `@ta`, strings `@t`, `` `x `` a `(unit A)`, `~[…]` a `(list A)`, `gap+%s2` the pair `[%gap %s2]`, `/posts/~zod` a `path`, `%/blog` a `qath`.
7575
7676**Tags, `~`, numbers and cells wait for their context** (Grammar: Tag resolution, Literals by context)
@@ -93,7 +93,7 @@ The rules are scattered across the tabs. This is a map of them, not a replacemen
9393
9494**Names and modules** (Grammar: Modules, Imports, Runes, Expressions; Core language: Programs and linking)
9595- "No name may shadow one already in scope, imports and the prelude included": samples, local `++`s and pattern binders too. The backends rely on it (Core language, "No shadowing").
96−- Molds and values have separate namespaces, "told apart by position": `todo-action.todo` is a mold and its constructor.
96+- Molds and values have separate namespaces, "told apart by position": `todo-action.todo` is a mold and `poke.todo` is its derived command helper.
9797- Local definitions may start any body, "visible to each other and the final expression".
9898- `/- todo` gives the molds of `/sur/todo.hoon` the module uses; `/% %todo-action` gives a mark's type, named after the mark, with no face; `/= card /ui/components/card` gives a Jibb module. API modules re-export their `/%` types, "not `/-` faces or `/=` modules". Import cycles are errors.
9999- Imports and prelude groups are records, read with `.`: `card.card`, `space.theme.theme`, `get.by`. "A module used as a whole value is a cell of its definitions, in name order."
@@ -110,8 +110,8 @@ The rules are scattered across the tabs. This is a map of them, not a replacemen
110110
111111**API files, stores and derived gates** (overview: Agent APIs, Effects; Grammar: Modules)
112112- `/ui/api/<agent>.jibb` declares `+$ poke` and `+$ paths`; "`poke` and `paths` are declarations, not molds." "A path case is a request name, a path and a type", and "A case can name another scry path, as in `[%changes /updates (facts todos todo-update) scry=/todos]`, used only by pages." An island may watch a request only when the checker proves it is watchable; a separate `scry=` path or unknown watchability is a type error.
113−- Each poke type gives a constructor, as `todo-action.todo`, and each path case a request, as `(todos.todo |=%got)`. A path with typed segments takes them too: the overview's `(post.api slug same)` suggests they come first. A `(facts full diff …)` case's request also takes a fold, as `$-([[%todo-update todo-update] todos] todos)`.
114−- A store's `+$ poke` is a declaration, not a mold. A store exports a constructor per poke type and a `state` request. Clashing derived names are errors, including clashes with an import face. The checker must account for the fact that the type of `main` determines whether a module is a store.
113+- Each API gives a generic `poke` command helper taking an action and reply, and each path case a request, as `(todos.todo |=%got)`. A path with typed segments takes them too: the overview's `(post.api slug same)` suggests they come first. A `(facts full diff …)` case's request also takes a fold, as `$-([[%todo-update todo-update] todos] todos)`.
114+- A store's local `+$ poke` is an ordinary action mold. A store exports a generic `poke` command helper and a `state` request. Clashing derived names are errors, including clashes with an import face. The checker must account for the fact that the type of `main` determines whether a module is a store.
115115
116116**The prelude** (overview: Prelude, Layout and styling, Links and URLs, Effects)
117117- Hoon's standard library regrouped, "written in Jibb and vendored as `/lib/jibb/prelude`", plus `eq`, `not`, `page`, `program`, `store`, `pure`, `island`, the layout elements and molds, `attr`, `theme`, and `cmd` and `sub` as the overview's Effects block writes them.
docs/spec/core-language.md+2−2
@@ -108,8 +108,8 @@ The todo island's `update`, from worked example 3:
108108 ?- (gth (lent (tuba (trip t))) 80)
109109 %.y [m(draft=t error=`"Too long") ~]
110110 %.n [m(draft=t error=~) ~]
111− %submit [m(draft="") ~[[%poke (todo-action.todo [%add draft.m]) |=%acked]]]
112− [%toggled id] [m ~[[%poke (todo-action.todo [%toggle id]) |=%acked]]]
111+ %submit [m(draft="") ~[(poke.todo [%add draft.m] |=%acked)]]
112+ [%toggled id] [m ~[(poke.todo [%toggle id] |=%acked)]]
113113 [%got ts] [m(todos=ts) ~]
114114 [%acked err] [m(error=err) ~]
115115```
docs/spec/decisions.md+7−6
@@ -31,11 +31,11 @@ The choices behind the Language tab, made on 2026-10-23; a later date marks a re
3131| Equality and negation | The gates `eq` and `not`, with Hoon's bitwise `not` exposed as `not.bit`; `eq`'s arguments and map and set keys contain no gates, even nested; the checker infers and generalizes that constraint; union matching never inspects a gate to distinguish cases | Decided 2026-10-30 |
3232| Special rules | No built-ins; type-directed rules are welcome, each listed in the Grammar tab | Decided 2026-10-29 |
3333| Inference | Hindley–Milner with aura variables; `@` is any atom, a specific atom fits `@` and a more specific aura fits an ancestor in its Hoon aura family, but each reverse needs a check, and repeated atom-constrained capitals give the same type; a number takes `@ud` only where its `++` isn't generic over its aura; distinct specific auras remain distinct; faces are part of record types, and an unnamed position can take a face but two different faces don't unify; principal types | Decided 2026-10-30 |
34−| Effects | The library unions `cmd` and `sub`; `poke`, `ask` and `qath` are transparent types defined in the internal prelude and re-exported normally; derived gates and `pure` also construct requests; islands read agents only by watching; replies get full state, and diffs take a fold; timers carry the time; `%who` gives the owner's `@p`; nacks reach replies as text | Decided 2026-10-31 |
35−| Poke representation | The source-backed private internal prelude module defines `poke`, and the public prelude re-exports it as an ordinary transparent type. Ordinary modules can construct and inspect its values | Decided 2026-10-31 |
34+| Effects | The library unions `cmd` and `sub`; `raw-poke`, `ask` and `qath` are transparent types defined in the internal prelude and re-exported normally; derived gates and `pure` also construct requests; islands read agents only by watching; replies get full state, and diffs take a fold; timers carry the time; `%who` gives the owner's `@p`; nacks reach replies as text | Decided 2026-11-01 |
35+| Poke representation | The source-backed private internal prelude module defines `raw-poke`, and the public prelude re-exports it as an ordinary transparent type. A store's local `poke` action remains an ordinary mold; derived helpers produce the runtime envelope | Decided 2026-11-01 |
3636| Agent APIs | `/ui/api/<agent>.jibb` with `+$ poke` and `+$ paths`, over the agent's mark types; a case is a name, a path and a type, with `(facts full diff …)` for diffs, told apart by mark; an optional scry path, for pages; an island may watch a request only when the checker proves it is watchable, so a separate scry path or unknown watchability is an error; typed segments by aura | Decided 2026-10-31 |
3737| Mark names | Any name: `/%` names types after marks, and constructors poke with their type's mark; no alias marks | Decided 2026-10-26 |
38−| Derived gates | API files and stores give a constructor per poke type and a checked request per path or store state; clashing names are errors, including a derived name that clashes with an import face | Decided 2026-10-30 |
38+| Derived gates | API files and stores give a generic `poke` command helper taking an action and reply, and a checked request per path or store state; clashing names are errors, including a derived name that clashes with an import face | Decided 2026-11-01 |
3939| Hoon types | A fixed translation table; `map`, `set`, `qeu`, `jar`, `jug` by name; `mop` as `(mop K V)`, read with `on`; imported `$%`, `$?` and `$^` cases must differ as nouns, and records with duplicate field names are errors where used; unused molds skipped | Decided 2026-10-30 |
4040| Record fields | Duplicate field names in a Jibb-written record are an error, as they are in an imported Hoon record | Decided 2026-10-31 |
4141| Record projection | The explicit type-directed operation `proj` takes a record and uses its expected result type to select its fields; no projection is inserted automatically. `proj` is reserved and cannot be defined or imported under that name. The result has exactly the fields declared by its type | Decided 2026-10-31 |
@@ -65,19 +65,20 @@ The choices behind the Language tab, made on 2026-10-23; a later date marks a re
6565| Page loading | `load` maps route parameters, `~` for none, to one `ask` or `pure`; pages render per request from a fresh scry of the path, or of its case's scry path; nothing is watched or kept | Decided 2026-10-29 |
6666| Compile targets | Nock on the ship, JavaScript in the browser | Decided |
6767| Optimizer | Basic lowering; holes later | Decided 2026-10-29 |
68−| Island `update` | In the browser | Decided |
68+| Island `update` | In the browser; returns the model and a list of commands, which the runtime processes one at a time in list order | Decided 2026-11-02 |
6969| Island `init` | Takes the page's data, returns the model | Decided 2026-10-29 |
7070| Island rendering | `view` re-runs on model changes; a keyed diff patches the DOM; holes later | Decided 2026-10-29 |
7171| Data crossing to the browser | No gates in island data or models | Decided 2026-10-29 |
7272| Inputs | A message per input event, none mid-composition; controls reset to the latest view after every event; fields read-only until the island starts | Decided 2026-10-29 |
7373| Transactions | None; one poke per command | Decided |
7474| Reloads | Restart from the model the page is served with | Decided 2026-10-29 |
75−| Shared state | Stores: browser agents written like API files, with `state`, `+$ poke` and `(store init update)`; the store's `+$ poke` is a declaration, not a mold; derived gates provide poke constructors and state requests; one per page | Decided 2026-10-31 |
75+| Shared state | Stores: browser agents written like API files, with `state`, a local `+$ poke` action mold and `(store init update)`; derived gates provide the generic `poke` command helper and state requests; one per page | Decided 2026-11-01 |
76+| Store builder | `+$ store |$ [S] [init=S update=*]`, with `++ store |= [init=S update=$-([A S] S)] ^- (store S) [init update]`: the builder checks action `A`, while `main` exposes only state `S`; the store kind check verifies `A` against the poke declaration | Decided 2026-11-01 |
7677| Subscriptions | By agent and path, shared per page; the first fact is full state, so no paths that need a scry path | Decided 2026-10-29 |
7778| Apps | One island under a catch-all route, given the path by `pure`; `%url` delivers the path on every change; in-section links act as `go`; focus moves to the first heading | Decided 2026-10-29 |
7879| Layout vocabulary | Jibb's elements and theme tokens; the stylesheet comes from the theme alone; chars and fill are inline; `[%fill n]` below 1 counts as 1 | Decided 2026-10-29 |
7980| Responsive layout | `stack` switches at the theme's `wide` | Decided 2026-10-29 |
80−| Theme | A prelude mold with every token required: spaces, five tones with `normal` and `background`, language, zone, `wide`, and an optional static font; 4.5:1 contrast enforced | Decided 2026-10-29 |
81+| Theme | A prelude mold with every token required: spaces, five tones with `normal` and `background`, language, zone, `wide`, and an optional static font; optional values such as dark tones use explicit backtick unit syntax; 4.5:1 contrast enforced | Decided 2026-11-01 |
8182| Dark mode | Hand-written dark tones under `dark`, used when the reader prefers dark | Decided 2026-10-27 |
8283| Links | All text escaped; in-app links are application paths, as `%/blog/(slug)`, with no query or fragment, checked at compile time against routes and static files; paths and unchecked `https`, `mailto` and `tel` URLs and root-relative cords such as `"/apps/groups"` have separate declarations; `link-unsafe`, `image-unsafe` and `go-unsafe` are the unchecked forms; both navigation declarations produce `[%go url=@t]`, with `go` converting the path to a cord including the app's base path; other cords render as text; a CSP on every page | Decided 2026-10-30 |
8384| Data layer | Hoon's nouns: units, treaps, loobeans | Decided |
docs/spec/grammar.md+9−10
@@ -91,7 +91,7 @@ Imports come first:
9191/= card /ui/components/card :: a Jibb module
9292```
9393
94−An imported Hoon record with duplicate field names is an error where used; imported union cases must differ as nouns. `/%` names a type after its mark, so it takes no face, and any mark name works; Hoon's `/%` binds the mark's core instead. Derived constructors such as `todo-action.todo` supply the agent and mark, so callers need not write those details. API modules re-export their `/%` types, not `/-` faces or `/=` modules. Import cycles are errors.
94+An imported Hoon record with duplicate field names is an error where used; imported union cases must differ as nouns. `/%` names a type after its mark, so it takes no face, and any mark name works; Hoon's `/%` binds the mark's core instead. Derived helpers such as `poke.todo` supply the agent and mark, so callers need not write those details. API modules re-export their `/%` types, not `/-` faces or `/=` modules. Import cycles are errors.
9595
9696## Modules
9797
@@ -99,10 +99,10 @@ A file is a module: imports, then definitions.
9999
100100- `+$ name mold` defines a mold; `++ name expr` a value.
101101- Names may refer to each other in any order, and no name may shadow one already in scope, imports and the prelude included.
102−- Molds and values have separate namespaces, told apart by position: `todo-action.todo` is a mold and its constructor, `todos.todo` a mold and a request.
102+- Molds and values have separate namespaces, told apart by position: `todo-action.todo` is a mold, `poke.todo` its command helper, and `todos.todo` a mold and a request.
103103- `main`'s type decides the kind: `(element !!)` a page; `(page R D)` a page with data, from parameters `R` to data `D`; `(program D X M)` an island, with data, model and messages; `(store S)` a store with state `S`. They're built by `(page load view)`, `(program init update view subs)` and `(store init update)`. A module without `main` is a library.
104104- Everything is exported and read through the import's face, as `card.card`. The prelude keeps private helpers in a separate internal module; it imports them without exposing them.
105−- An API module, `/ui/api/<agent>.jibb`, also exports derived gates: a constructor per `poke` type, adding the agent and mark, and a request per `paths` case, taking a reply over full state, plus a fold for `(facts full diff …)`. An island may watch a request only when the checker proves it is watchable. A request whose case has a separate `scry=` path, or whose watchability cannot be proved, is a type error. A store's `+$ poke` is a declaration, not a mold; a store exports a constructor per `poke` type and a `state` request. Clashing derived names are errors, including a derived name that clashes with an import face.
105+- An API module, `/ui/api/<agent>.jibb`, also exports derived gates: a generic `poke` command helper, adding the agent and mark and taking a reply, and a request per `paths` case, taking a reply over full state, plus a fold for `(facts full diff …)`. An island may watch a request only when the checker proves it is watchable. A request whose case has a separate `scry=` path, or whose watchability cannot be proved, is a type error. A store's local `+$ poke` is its ordinary action mold; a store exports a generic `poke` command helper and a `state` request. Clashing derived names are errors, including a derived name that clashes with an import face.
106106
107107Names the host reads, by file:
108108
@@ -130,8 +130,8 @@ A mold is only a type: never called on a noun, and with no default. Types are in
130130- **Paths**: `/todos` is constant, `/` empty, and `/todo/[id=@ud]` typed by aura. A typed segment may use `_` for an inferred aura; it still must resolve to an aura that the path rules can print and parse. `%/blog/(slug)` is an `qath`, checked against routes and static files.
131131- **Generic molds**: `+$ result |$ [V E]` with cases below; `|$` goes only right after a `+$`'s name.
132132- **Noun**: `*`, not a type variable; use a capital for a generic type. A value already known to have a more specific noun type, such as `@ud`, can be used where `*` is expected. **Empty**: `!!`.
133−- **Pokes**: `poke` is defined in the source-backed private internal prelude module and re-exported by the public prelude as an ordinary transparent type. Ordinary modules can construct and inspect its values.
134−- **Effect and application-path types**: `poke`, `ask` and `qath` are transparent types, defined in the internal prelude and re-exported normally; callers can construct and inspect their values. Derived gates and `pure` also construct requests, and application-path literals have type `qath`. `(facts full diff …)` appears only in an API file's `paths`.
133+- **Pokes**: `raw-poke` is defined in the source-backed private internal prelude module and re-exported by the public prelude as an ordinary transparent type. Ordinary modules can construct and inspect its values; derived `poke` helpers return commands.
134+- **Effect and application-path types**: `raw-poke`, `ask` and `qath` are transparent types, defined in the internal prelude and re-exported normally; callers can construct and inspect their values. Derived gates and `pure` also construct requests, and application-path literals have type `qath`. `(facts full diff …)` appears only in an API file's `paths`.
135135- **Identity**: recursive molds go by name and module.
136136
137137`eq`'s arguments and map and set keys must contain no gates, even nested inside another value. The checker infers this gate-free constraint on type variables and retains it when generalizing a `++`, so a generic helper that calls `eq` stays generic over gate-free types. Printed types show the constraint as `$-([A A] ?) where A contains no gates`. An inferred atom constraint prints as `$-([A A] A) where A is an atom`; an arithmetic atom constraint that excludes loobeans prints as `where A is an atom other than ?`. Multiple clauses are comma-separated, as `where A is an atom, B contains no gates`. Union-case matching treats gates as opaque and never inspects a gate to distinguish cases.
@@ -293,14 +293,13 @@ knot = { lower | digit | "-" | "." | "~" | "_" } ;
293293```jibb
294294:: /ui/stores/cart.jibb
295295+$ state [items=(list @t) open=?]
296−+$ cart-action
296++$ poke
297297 [%add item=@t]
298298 %toggle
299−+$ poke cart-action
300299
301300++ main (store init update)
302301++ init ^- state [~ %.n]
303−++ update |= [a=cart-action s=state]
302+++ update |= [a=poke s=state]
304303 ?- a
305304 [%add item] s(items=[item items.s])
306305 %toggle s(open=(not open.s))
@@ -326,8 +325,8 @@ knot = { lower | digit | "-" | "." | "~" | "_" } ;
326325++ update |= [=msg m=model]
327326 ?- msg
328327 [%noted t] [m(note=t) ~]
329− %add [m(note="") ~[[%poke (cart-action.cart [%add note.m]) |=%acked]]]
330− %toggle [m ~[[%poke (cart-action.cart %toggle) |=%acked]]]
328+ %add [m(note="") ~[(poke.cart [%add note.m] |=%acked)]]
329+ %toggle [m ~[(poke.cart %toggle |=%acked)]]
331330 [%got c] [m(cart=c) ~]
332331 [%acked err] [m ~]
333332
docs/spec/implementation-plan.md+1−1
@@ -73,7 +73,7 @@ For milestone 6. An island is one loop over one model: events become messages, `
7373- **Messages** come from controls, command replies, facts, timers and `%url`. *Proposed*: an island handles them one at a time, in arrival order.
7474- **Rendering**: a message changes the model when `update` returns a different noun; `view` then re-runs and a keyed diff patches the DOM. An unchanged model renders nothing. *Proposed*: the patch lands before the next message, so a crash in `view` belongs to one message.
7575- **Controls**: after every event, the control that fired is reset to the latest view, even when the model didn't change. A field's text is rewritten only when it differs from the screen, which keeps the caret and any IME composition.
76−- **Commands**: each reply arrives later as a new message, never inside the `update` that sent it. *Proposed*: commands run in list order, after the patch.
76+- **Commands**: an update may return several commands. The runtime processes them one at a time, in list order, after the patch. Each reply arrives later as a new message, never inside the `update` that sent it.
7777
7878| Control | Sends | When |
7979| --- | --- | --- |
docs/spec/overview.md+9−7
@@ -141,7 +141,7 @@ Loads and renders run in Nock.
141141
142142```jibb
143143+$ cmd |$ [M]
144− [%poke p=poke reply=$-((unit @t) M)]
144+ [%poke p=raw-poke reply=$-((unit @t) M)]
145145 [%go url=@t]
146146 [%wait gap=@dr msg=M]
147147 [%now reply=$-(@da M)]
@@ -152,7 +152,9 @@ Loads and renders run in Nock.
152152 [%url reply=$-(path M)]
153153```
154154
155−- `poke`, `ask` and `qath` are transparent types defined in the internal prelude and re-exported normally. Derived gates and `pure` also construct requests. A derived poke constructor such as `(todo-action.todo [%add draft.m])` checks its value and supplies the agent and mark, so one island can poke several agents. The agent's mark rechecks on the ship; a nack's `tang` reaches the reply as text. Store constructors poke the store in the browser.
155+An island's `update` returns `[model (list (cmd M))]`, so one message may produce several commands. The runtime processes the returned commands one at a time, in list order. A store's `update` consumes exactly one poke with the current state and returns the next state.
156+
157+- `raw-poke`, `ask` and `qath` are transparent types defined in the internal prelude and re-exported normally. Derived gates and `pure` also construct requests. A derived poke helper such as `(poke.todo [%add draft.m] |=%acked)` checks its value and supplies the agent and mark, returning a command whose reply becomes an island message, so one island can poke several agents. The agent's mark rechecks on the ship; a nack's `tang` reaches the reply as text. Store helpers poke the store in the browser.
156158- A request such as `(todos.todo |=%got)` comes from a declared path or a store's `state`; its reply always gets full state. A path with diffs also takes a fold, `(changes.todo |=%got apply)`, which the runtime applies first. Facts are checked; a bad one crashes the reply, which counts as a crashed `update`.
157159- Islands read agents only by watching. A watch's first fact must be full state, so watching a request whose path case has a separate `scry=` path is a type error in an island. The checker must prove a request is watchable; unknown watchability is also a type error. The runtime acks facts, rewatches after a kick or a dropped connection and reseeds from the first fact; a refused watch shows the crash notice.
158160- Watches match by agent and path, timers by gap, and the newest reply is always used. After each `update`, `subs` is diffed to start and stop watches and timers. `%now` and `%every` give the time, `%who` the owner's `@p` from `/~/name`; `%wait` is a one-shot delay.
@@ -163,7 +165,7 @@ Inputs send a message per `input` event, and one per IME composition, so validat
163165
164166- `init` runs on the ship with the page's data and returns only the model, jammed into the page; the browser resumes from it at start. A reload starts from the model the page is served with.
165167- A crash in `update` drops the message, keeps the model and shows the standard notice.
166−- Stores share state between a page's islands. A store module, written like an API file, has `state`, `+$ poke` and `++ main (store init update)`, where `update` applies a poke. The store's `+$ poke` is a declaration, not a mold. Islands import it with `/=` and use its derived gates: a constructor per poke type, and `(state.cart |=%got)`, whose first fact is the current state and each later fact the next.
168+- Stores share state between a page's islands. A store module, written like an API file, has `state`, `+$ poke` and `++ main (store init update)`, where `update` applies a poke. The store's local `+$ poke` is an ordinary action mold; the runtime envelope is `raw-poke`. The builder is `+$ store |$ [S] [init=S update=*]` with `++ store |= [init=S update=$-([A S] S)] ^- (store S) [init update]`: it checks action `A`, while `main` exposes only state `S`; the store kind check verifies `A` against the declaration. Islands import it with `/=` and use its derived gates: the generic `poke` command helper, and `(state.cart |=%got)`, whose first fact is the current state and each later fact the next.
167169- A store runs in the browser from its `init` when its first island starts, and lasts as long as the page. Islands keep what they watch in their own models.
168170- An app is a page whose view is one island under a catch-all route; its `load` passes the path with `pure`. The island's `%url` subscription delivers the path at start and after every change, back and forward included. `go` pushes history, and `go` or `link` within the section changes the island without a reload. Focus then moves to the new view's first heading, which screen readers announce.
169171
@@ -216,7 +218,7 @@ The theme, `++ theme` in `/ui/theme.jibb`, uses the prelude's `theme` mold, with
216218 lang="en"
217219 zone="UTC"
218220 font=`%/static/fonts/inter.woff2
219− dark=[tones=[normal="#eee" background="#111" accent="#4c9" danger="#f28b82" muted="#aaa"]]
221+ dark=`[tones=[normal="#eee" background="#111" accent="#4c9" danger="#f28b82" muted="#aaa"]]
220222```
221223
222224Style attributes compile to atomic classes in one stylesheet built from the theme, so islands can't compute a missing class. `[%chars n]` and `[%fill n]` become inline styles.
@@ -280,7 +282,7 @@ The host is one Gall agent on the `%jibb` desk, serving every Jibb desk, so app
280282
281283### Agent APIs
282284
283−Each agent Jibb talks to has `/ui/api/<agent>.jibb`, declaring its pokes in `+$ poke` and its paths in `+$ paths`, over types from the agent's own marks through `/%`. Importing it gives derived gates: a constructor per poke type, which pokes with that type's mark, and a request per path, which checks what comes back. Clashing derived names are errors.
285+Each agent Jibb talks to has `/ui/api/<agent>.jibb`, declaring its pokes in `+$ poke` and its paths in `+$ paths`, over types from the agent's own marks through `/%`. Importing it gives derived gates: a generic `poke` command helper, which checks the action and reply and pokes with the action's mark, and a request per path, which checks what comes back. Clashing derived names are errors.
284286
285287```jibb
286288:: /ui/api/todo.jibb
@@ -471,8 +473,8 @@ A `page`: each request scries `%blog` and renders in Nock.
471473 ?- (gth (lent (tuba (trip t))) 80)
472474 %.y [m(draft=t error=`"Too long") ~]
473475 %.n [m(draft=t error=~) ~]
474− %submit [m(draft="") ~[[%poke (todo-action.todo [%add draft.m]) |=%acked]]]
475− [%toggled id] [m ~[[%poke (todo-action.todo [%toggle id]) |=%acked]]]
476+ %submit [m(draft="") ~[(poke.todo [%add draft.m] |=%acked)]]
477+ [%toggled id] [m ~[(poke.todo [%toggle id] |=%acked)]]
476478 [%got ts] [m(todos=ts) ~]
477479 [%acked err] [m(error=err) ~]
478480
docs/status.md+49−11
@@ -1,6 +1,6 @@
11# Status
22
3−As of 2026-10-31. The plan is [spec/implementation-plan.md](spec/implementation-plan.md); each milestone ends with its checks passing on a fake ship.
3+As of 2026-11-02. The plan is [spec/implementation-plan.md](spec/implementation-plan.md); each milestone ends with its checks passing on a fake ship.
44
55| # | Milestone | Status |
66| --- | --- | --- |
@@ -31,9 +31,19 @@ A bounded local source proof recognizes a narrow class of generic-alias union ca
3131
3232The checker can experimentally discharge a narrowly scoped direct-constructor constraint while resolving an import-free library without a prepared prelude. It preserves independent generalized schemes and publishes only after all source molds, values, and recorded constraints close. API/store paths, `main`, imports, prepared preludes, recursive groups, open constraints, projection actions, and `%grec` in the constraint graph remain unsupported by this route. The fallback also declines source shapes outside its bounded direct-call screen. It does not yet typecheck the unchanged todo island or establish watchability.
3333
34−Closed cell context can now flow through a bounded loobean branch while preserving the inferred value faces and original failed-inference behavior. Open or structurally uncertain substitutions and nested retry shapes remain unsupported. This does not by itself provide the missing text and UI prelude definitions, cross-definition context, island-kind checks, or watchability evidence needed by the unchanged todo island.
34+A prepared-prelude partial report can recover a narrow import-free, non-main ordinary library initializer by deferring source-owned literals in a direct tuple until a later exact result cast. The prepared interface and declared-name inventories must agree exactly. API/store paths, `main` and imports remain excluded, and the ordinary full-module resolver does not publish the recovered interface. Wrong field types, unrelated tags and mold collisions fail closed; a no-final-cast control remains unchecked. `tools/type-deferred-prepared-test` checks the exact recovered types and unchanged `partial inference; module not checked` disclaimer under eval and on the ship. List-literal deferral and import-aware recovery remain unsupported.
3535
36−The internal prelude defines a transparent generic `ask` with pure, agent and store cases, re-exported alongside the Jibb-written `pure` gate. The partial checker infers supported constructors and exhaustive matches. Agent and store receivers operate on raw nouns; their fields do not prove schema validity or watchability. The public prelude now defines the documented source-backed `sub` union; supported `%watch` payloads retain the public `(ask M)` type. Constructing a `sub` does not prove that its request is watchable. Request lowering, checked decoding, runtime validation and island watch checking remain unimplemented.
36+Closed cell context can now flow through a bounded loobean branch while preserving the inferred value faces and original failed-inference behavior. Open or structurally uncertain substitutions and nested retry shapes remain unsupported. This does not by itself provide the remaining cross-definition context or complete island-kind and watchability checks needed by the unchanged todo island.
37+
38+The internal prelude defines a transparent generic `ask` with pure, agent and store cases, re-exported alongside the Jibb-written `pure` gate. The partial checker infers supported constructors and exhaustive matches. Agent and store receivers operate on raw nouns; their fields do not prove schema validity or watchability. The public prelude now defines the documented source-backed `sub` union; supported `%watch` payloads retain the public `(ask M)` type. Constructing a `sub` does not prove that its request is watchable. Request lowering, checked decoding, runtime validation and general island watch checking remain unimplemented; the separate direct-program proof below covers only one narrow static value shape.
39+
40+The public prelude now contains the source-backed UI length/attribute molds, all element constructors, and exact program/page records and builders. The full 19-case generic `element` union is nonrecursive: nested child, keyed-item and table payloads are `*`, while public constructor schemes preserve typed composition and independent key types. `island` returns `(element !!)` with `[program data]` as its erased payload. The focused UI golden checks exact schemes, static and message-bearing composition, concrete programs/pages/islands, malformed inputs and selected mismatches. A child-message mismatch fails closed as an unsupported constraint. Raw-constructor encapsulation, duplicate-attribute checks, rendering, storage, navigation and execution are not claimed.
41+
42+The remaining doc fragments now also have full detailed and legacy checks: the import-only module resolves its real `/sur`, mark and Jibb-module inputs; `view-day` and `step` check with their exact exported schemes; and the `cmd`/`sub` block checks at the prelude path against the canonical printed schemes. Additional consumers use all three imported names, and the shared eval/ship fixture rejects missing `/sur`, mark and Jibb-module inputs.
43+
44+The documented buttons library now fully checks its valid `labelled` and `wide` definitions with their exact generic element and attribute-list schemes. Ordinary positional calls unify a variable argument with the body of an expected faced sample slot without propagating that slot face. When full checking would otherwise reject an incomplete module, a failure-only retry of at most 64 missing definitions can report a still-pending tag at its source; the unchanged buttons module thus reports that nothing fixes the union of `%add`, with the actual excerpt, through both detailed and legacy inference. Successful checks do not run that retry. The shared eval/ship fixture is type checking only and claims no UI runtime.
45+
46+The public prelude now defines the exact documented `theme` record, including required text tokens, an optional `qath` font and optional dark tones. A shared eval/ship fixture fully checks the byte-identical `my-app/ui/theme.jibb`, checks its exact exported type and structural downstream import, and covers absent dark tones plus wrong nested auras, missing fields and wrong font/dark types. On 2026-11-01, @iko chose explicit backtick syntax for present units, and the documented dark record now uses it. No contrast check, rendering, routing or other theme behavior is implemented.
3747
3848Known same-origin generic-union result context can now constrain a call before its arguments are inferred. An unresolved or opaque constructor target stays unsupported rather than producing a definite mismatch; proven missing tags still report errors. A todo request with explicit `(ask msg)` context can infer `|=%got`; its uncontextualized form remains unsupported. A two-item literal-headed tuple can receive payload context from a known union of uniquely headed literal cells when its payload is a shallow wing-headed call with literal, wing or constructor arguments. Existing inference takes precedence when it fits; otherwise the checker tries the contextual path once. It conservatively declines that path when any substitution has a structural root, as well as for duplicate or opaque competitors. The guard scans substitutions per eligible tuple and may add one shallow inference; no global linear-time bound is claimed. This allows an explicitly typed todo subscription body to infer, but does not check the island or prove request watchability.
3949
@@ -41,18 +51,28 @@ A separate source-backed analysis can prove one named mold gate-free, report a d
4151
4252The partial checker can also match a directly named, checked root gate against a generic gate sample in a direct, unshadowed source-backed prelude call. It uses the written two-slot sample layouts to preserve nested record faces, then requires the complete call samples to be closed and tag-free and repeats the fit under the final substitution. The proof falls back to existing inference for unavailable or ambiguous source layouts, local or dynamic gates, aliases, recursive placeholders and open generic caller types. It preserves written-capital checks and projection evidence; it does not add `program`, check islands or prove request watchability. Prepared prelude source and interface remain a trusted pair.
4353
44−The API path analyzer can retain its source, complete prepared prelude, reader results and resolved dependencies as evidence, and classify a unique declaration as watchable, not watchable or unknown. It does not yet prove the provenance of request values or check island subscriptions. Prepared artifacts and reader results remain trusted host inputs.
54+A narrow full-module path now checks direct four-wing `(program init update view subs)` definitions named `main`. It requires the canonical prepared `program` value and mold, reuses ordinary source-backed program fitting, and publishes only after all ordinary module and request-graph checks. The inferred `main` must be closed and invariantly match the instantiated `program` mold. Initializer data and model must be closed and gate-free with `%yes` verdicts inside a shared 256-node budget. `subs` may syntactically return null through transparent forms, or one direct imported request watch after the request graph merges. The latter is only an unfaced two-item `[%watch (case.face |=%callback)]` singleton: the imported member must have the exact plain derived-request scheme, a unique merged request must match the API path and both case names and occur in the interface's own graph, the API source must be identical, and scry, diffs and parameters must be absent. Pure or hand-built values, helpers, aliases, re-exports, typed paths, folds, multiple watches and unknown or ambiguous evidence remain rejected. Checked interfaces retain source evidence and support ordinary downstream imports; no program execution or runtime watching is claimed. A transactional extension can recover a direct initializer whose transparent tuple body ends in null when update, view and subs are already resolved. It derives the expected gate through the ordinary positional program fit with fresh IDs and stable replay, then re-infers the actual initializer and `main` under all ordinary finalization and kind checks. Non-main libraries, aliases, nonempty or simultaneously unresolved subscriptions, and unrelated pending tags remain rejected.
55+
56+Static and direct data-page `main` checking now completes the unchanged about page, blog index and todo index through the real Hoon readers. Static generic element mains specialize to closed canonical `(element !!)`; direct pages require a closed invariant `page` type and a direct plain derived-request load. Page loads reuse the strict source/member/evidence identity checks used by program watches, rejecting aliases, indirect/hand-built/pure/unknown requests, typed paths, diffs and store paths. The shared eval and ship fixture asserts exact main types and structural downstream imports. Rendering, runtime loading and request execution remain unimplemented.
57+
58+The prelude now has the approved `store` mold and action-checking builder. The runtime envelope is the transparent `raw-poke`; a store's local `+$ poke` remains its ordinary action mold throughout inference. Direct two-wing store mains require closed state and action molds, exact init/state and update relations, and no gate-free-state restriction. Stores export those molds plus derived generic `poke` command and state-request gates. The command helper checks the canonical `raw-poke`, `cmd` and `unit` shapes, takes an action and reply, and returns `(cmd M)` directly. Separate source-bound store certificates prove only the actual imported state member watchable; API evidence checks and page-load rejection remain intact. The unchanged cart and basket pass detailed and legacy checking with exact mains, derived schemes and structural imports, including non-keyed view and null-sample initializer recovery. Multi-action declarations, lowering and runtime execution remain unsupported.
59+
60+The component-local program recovery now covers update, subscriptions, one direct keyed `each`/`turn` mapper and its view, then the existing initializer and ordinary `main` path. Each recovered scheme is closed and freshly allocated; a keyed source screen avoids repeated doomed ordinary attempts without skipping final `main`, and non-gate views decline safely. Canonical `element` recursion and exact singleton-case list fits are narrowly guarded, with successful ordinary fits taking precedence. The byte-identical unchanged todo now passes both detailed and legacy full-module checks with an exact closed `main` type and structural downstream import. Wrong models, messages, results, mappers, keys, aliases, non-gate views and watches fail closed. This is static checking only: no Jibb execution or runtime watching is claimed.
61+
62+The API path analyzer can retain its source, complete prepared prelude, reader results and resolved dependencies as evidence, and classify a unique declaration as watchable, not watchable or unknown. This remains declaration evidence rather than proof about an arbitrary request value. The narrow direct-program check above composes it with final value syntax, resolved imports and merged evidence for one plain request. Prepared artifacts and reader results remain trusted host inputs.
4563
4664For 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.
4765
4866A 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.
4967
50−Ordinary imports can infer derived request-gate types for multiple supported API paths. A case may take one typed segment before the reply or one diff fold after it; the unchanged todo API's plain, typed and diff requests infer, including a named closed fold. Checked ordinary API definitions, mark molds and a supported poke constructor are exported. Each `/sur` core must have a directly used, successfully read mold; unselected bindings are not independently validated. Jibb module imports, scry paths, multiple parameters or diffs and a parameter together with a fold remain unsupported. Source-qualified request evidence and exact trusted graph inputs survive transitive imports and cached interfaces, while stale or ambiguous evidence fails closed. This is a type-only interface: request execution, schema validation and proof that a request value is watchable remain unimplemented. In one loaded-machine run, the real-todo eval took 195.83 s wall and 67.83 s user CPU; the prior prototype took 111.81 s wall and 64.60 s user. Both include Hoon compilation and reader setup and overlapped other work, so they are not isolated checker benchmarks.
68+Ordinary imports can infer derived request-gate types for multiple supported API paths. A case may take one typed segment before the reply or one diff fold after it; the unchanged todo API's plain, typed and diff requests infer, including a named closed fold. Checked ordinary API definitions, mark molds and a supported generic poke command helper are exported. Each `/sur` core must have a directly used, successfully read mold; unselected bindings are not independently validated. Jibb module imports, scry paths, multiple parameters or diffs and a parameter together with a fold remain unsupported. Source-qualified request evidence and exact trusted graph inputs survive transitive imports and cached interfaces, while stale or ambiguous evidence fails closed. This is a type-only interface: request execution, schema validation and proof that a request value is watchable remain unimplemented. In one loaded-machine run, the real-todo eval took 195.83 s wall and 67.83 s user CPU; the prior prototype took 111.81 s wall and 64.60 s user. Both include Hoon compilation and reader setup and overlapped other work, so they are not isolated checker benchmarks.
5169
5270The 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.
5371
5472The repository spec records the subsequent type-system and prelude decisions, including the chosen `like` result-mapping gate; those changes also need synchronization to the Claude document. An initial inference fragment and a standalone Hoon type reader are being tested. The fragment explicitly reports that it does not check a module; partial bridges pass Hoon `*` in supported nonrecursive molds, selected Hoon atoms, term singletons, the null singleton, the two loobean singletons and their exact fork, nested faced or unfaced cells, supported disjoint unions and opaque standard collections from `/sur` molds and marks into inference. Collections retain their names and supported arguments for printing and unification; nested supported union arguments are retained too. The bridge trusts unchanged results from the source-aware reader; a materialized type graph alone cannot reveal cases Hoon already collapsed. The source-validated standard prelude `list` mold shares this representation with imported lists; other Jibb-written collection molds and most prelude collection operations remain unsupported; malformed names and arities fail closed. Selected self-recursive `/sur` molds, including Tlon `notes.import-node` with list-wrapped self references, cross as opaque module-and-name identities; aliases, foreign references, recursive marks, unfolding and construction remain unsupported. The reader handles mark samples, including a source-proved nonrecursive union from a single Ford-imported `/sur` core, recursive molds whose origins can be verified through Ford imports, nested collections, direct ordered maps, including source-validated named operands such as Tlon `notes.log`, certain ordered-map fields, direct `$^` unions whose cases can be proved disjoint, and one verified explicit union argument in a list, set, map or unit. Tagged `$%` cases can additionally use restricted local named payload molds, bare `~` fields and one level of local named tagged unions, as in real Tlon `notes`, with bounded source proof; unsupported or ambiguous dependencies fail closed. Ambiguous recursive origins fail closed; recognizable explicit unions are checked from source before Hoon can collapse their cases, as @iko confirmed for imported `$%`, `$?` and `$^`, while other nested unions, nested ordered maps, general union disjointness and complete import integration remain unfinished. Opt-in structured reader APIs preserve successful graphs and distinguish definite unsupported-aura and core evidence from failures the reader cannot prove; unverified union disjointness and name-only vase recognition remain unsupported. They revalidate and re-walk failed types. An opt-in partial checker entry point consumes unchanged reader results and reports definite aura or core errors at imported mold use sites when their inputs are unique. Ordered replay covers nested cell samples, record and function casts, and non-generic same-module aliases; unsupported prefixes, cycles and shadowing stop it. Union molds, generic applications, transitive modules and unsupported reader outcomes remain generic. Replay repeats inference and may add work. The partial checker resolves a subset of ordinary library imports in dependency order using supplied Jibb sources and a source-derived partial prelude interface, caches completed interfaces per run, detects missing sources and cycles, and resolves nested fields of imported values with independent scheme instantiation. The source-backed internal prelude defines `poke` and the public prelude re-exports it as a transparent type. A dedicated trusted preparation path supplies private comparison and arithmetic schemes to the Jibb-written `gth`, `add` and `dec` wrappers; ordinary imports cannot access them. The public `add` and `dec` wrappers use private arithmetic interfaces; supported inference preserves the shared atom constraint that excludes loobeans. Primitive execution, jet recognition and length remain unfinished. The partial checker resolves its supported source shape and rejects ordinary imports of the private path. An imported API with one mark and a matching direct `+$ poke` declaration can export a constructor and retain agent/mark metadata when the representation has the supported agent case. A separate partial analysis resolves supported API path declarations and their full and diff mark types, including the todo paths; it does not by itself create requests or check an API module. Ordinary imports additionally infer the supported multi-path request-gate types described above. Complete private module checking, other API shapes, request lowering, root API and kind checking, stores, complete `ask` and `pure` checking and runtime effects remain unfinished. A possible store or root API with `+$ poke` reports unsupported kind or scope, while definite duplicates and unrelated shadowing still report conflicts. The prelude includes the doc-exact generic `cmd` union; the prelude inventory is incomplete. The inference fragment supports unrestricted `@`, selected one-way widenings including aura-family ancestors, generalized atom constraints arising from explicit capitals or bare sample binders, acyclic local value definitions with captures, selected single self-recursive top-level and local gates, simple and nonrecursive generic mold aliases, selected faced record casts and field reads, and contextual tags, `~` and constructors for closed disjoint unions, including direct nonrecursive generic unions and propagation through complete loobean and unit-shaped branches in casts and known union-sample calls, including nested branches. Known loobean result context also propagates through supported complete branches and binder-only cell arms; binder-only arms over union subjects remain unsupported. A directly known named union can instantiate an unconstrained generic gate sample with its origin, generic arguments and faces preserved; unnamed, pending, recursive and variable-bound cases remain unsupported. A known gate with an unresolved result variable can receive a known enclosing result type before its arguments are inferred; unknown calls and unresolved targets remain conservative. Multi-argument calls form a right-nested sample, retain known faces and shared type variables, and can use known sample positions to contextualize list and union arguments. A definite mismatch points to the failing argument when the fragment can establish it, otherwise to the combined sample; unsupported contextual forms still fail closed. For a supported recursive gate, the checker infers the sample first and uses its exact type, including field faces, for one monomorphic self reference. It generalizes after the body is checked; subsequent uses instantiate it independently. Incompatible recursive arguments can report the gate and argument sites. For a complete loobean branch with one direct self-call arm, a separately inferred closed base type can seed the recursive result before the whole body is checked. Open or pending base types do not seed it; other branch shapes remain subject to the fragment’s existing limits. A supported single local recursive gate also uses a monomorphic self reference and generalizes variables free of the enclosing environment after checking its body; captured variables remain shared. The checker collects written capitals per `++` before inference, excluding nested definitions: a capital used in an enclosing definition is shared with its locals even when written later, while a capital introduced only in a local definition is generalized there. Sibling locals can introduce independent capitals with the same spelling; generic mold parameters keep their own scope. Top-level groups of syntactic gates are inferred together with monomorphic placeholders and shared substitutions, then generalized only after the whole group checks; downstream uses and library interfaces instantiate those schemes independently. A dependency graph identifies groups with two iterative depth-first passes; its conservative local-reference edges can reject otherwise valid programs. Supported local mutually recursive gate groups also use shared monomorphic placeholders and generalize only after the group checks, preserving captured outer variables. A bounded dependency proof reports certain non-gate cycles through values and gates when an explicit atom or loobean result cast and simple unshadowed expressions establish the cycle. Other mixed gate/value cycles, polymorphic recursion, unresolved literal constraints and unresolved branch joins remain unsupported. Reporting repeats inference for a single recursive gate outside a group; grouped reports use the stored schemes. Its performance cost remains unmeasured. A single-arm cell pattern accepts two or more binders, the last capturing the remaining tail; duplicate and shadowed binders are rejected. A structured single-arm pattern also works for a known non-union cell when coverage is proven, including nested literal and wildcard positions. Intermediate union or collection tails, nested patterns, wildcards and faced records remain unsupported. String interpolation accepts known atom auras, unrestricted `@`, tapes and isolated decimal literals; a known cell asks for a printer, and an explicitly generic atom asks for an aura. Loobeans, term singletons, non-tape collections, open types and a type fixed only later remain unsupported. A known closed union with two or more arms supports patterns that provably cover or exclude each remaining case, including payload binders, imported and generic cases, and binder-free catch-alls. Partial boolean patterns can split known `?` positions into their two noun values, up to 64 alternatives across the union; binders retain their original case type. Missing alternatives and covered arms are reported. Other partial patterns, expansions above the limit, binders spanning distinct cases, differing arm result types and some complex two-arm subjects remain unsupported. A cast or known call sample can supply result context through whole-case arms and supported finite loobean refinements for a known union accessed by a wing, a grouped wing or a supported shallow call, including nested cell and list positions; other partial-pattern contexts and subject forms remain unsupported. The Grammar’s `step` block infers in this fragment, but its module is not yet checked. A bare tag proved absent from a known union reports the union and tag sites in casts, single-argument calls, unit payloads, list items and supported branch arms; imported unnamed unions print their cases. Ordered fit replay can identify a missing tag nested in a syntactic tuple, stopping at an earlier mismatch or uncertainty. Known faced records support uniquely named field changes, including nested wings, with field context passed to replacements and the original record type retained. Missing fields, empty changes and definite mismatches report sites; the expected-type site is the edit because the original field declaration location is not retained. Unknown or partly unfaced spines, ambiguous fields and repeated edits remain unsupported. A known record cast supplies field context to its tuple or record initializer, including nested list and union fields; mismatch diagnostics use the cast mold because the original field declaration location is not retained. Isolated cart-style `init` and `update` expressions infer, while the complete cart-store fails closed because its kind and declaration scope remain unchecked. Uncontextualized list literals infer a fresh element type, including empty and nested lists, with independently generalized uses. Unresolved item tags and uncertain widening remain unsupported. Backtick unit construction uses the validated standard prelude unit template, infers its payload without losing pending constraints, and makes the prelude’s `some` available. Ordinary result annotations also let its `bind`, `biff`, `both`, `clap`, `clef` and `flit` infer. A known unit in a cast, call, list item or record field supplies context to its payload, including nested units and lists; mismatches identify the payload and context. Unrelated union identities, some variable-dependent fits, and missing or altered prelude unit templates remain unsupported. Literal singleton heads compare by runtime noun, so `|=%$` also matches explicit null- and loobean-zero-headed cases. When equal heads have disjoint payloads, the constructor selects a uniquely proven compatible payload; unknown and ambiguous candidates remain unsupported. Unresolved nulls remain pending and are reported separately from tags. A known union of `~` and a null-headed cell supports a complete `~` / `[~ value]` branch in either order, including shadow checks; unknown subjects, missing or duplicate arms, and unresolved branch results remain unsupported. This fragment infers the prelude’s `fall` and `need` signatures. With the validated prelude list and a known cast or gate sample, empty, nonempty and nested list literals infer their element types, including contextual union tags; a mismatched element names both sites. In that context `~` and zero-valued terms fit an empty list, and two-item unfaced cells form cons lists, including nested cons and imported-list contexts; invalid heads or tails name both sites. A known gate sample also supplies context to matching positions in a single tuple or record argument, including nested cells; zero literals can fit list positions. A bound zero constant remains unsupported rather than a definite mismatch, and an unknown callee does not supply context. Faced or longer cells and a missing or altered prelude list fail closed. A known list result also supplies context through complete loobean, unit-shaped and list-shaped branches, including recursive and nested branches. For a known standard list with a supported element type, a complete `~` / `[item rest]` branch infers the element and tail types in either arm order and checks binders for shadowing. Unknown subjects, unsupported element types and other or incomplete list patterns remain unsupported. A value with type variable `A` can fit a field whose type is that same `A`, including in generic union payloads and nested or repeated record fields. Other variable-dependent face merges remain unsupported. Forced equality of distinct written capitals now reports both source sites, following @iko’s decision; forcing one to a concrete type remains unsupported. Imported record spines with repeated faces fail closed where used, but only with a generic unsupported diagnostic. Hoon may erase unfaced nested-cell boundaries, so the check can conservatively reject valid names in distinct erased scopes. Supported closed unions print using an in-scope name or imported alias; an unnamed nongeneric union prints its cases, parenthesized when nested. The latter is print-only. Generic union types retain all arguments in their printed name; if that name is unavailable, the partial printer reports the limitation. Different import faces for the same origin remain compatible; compatibility across distinct union origins and some generic-argument comparisons remain unsupported. Nonrecursive generic aliases can reorder, repeat or omit parameters while retaining a union’s origin, including through local scopes and library interfaces. A generic union declared directly inside a body remains unsupported, as do differing-variable face constraints in a union payload. A transitive generic union whose name is unavailable is reported as unsupported instead of hiding its arguments. Unfixed decimal literals default to `@ud` in gate-free inferred types; recursive molds, general branch tag context, other constraint cases and defaulting inside gate types still need work. Collection recognition checks the originating core and fails closed on shadows or unsupported Ford subject shapes; a wrapper regression also rejects forged subjects, samples and tails. Its golden fixtures include three real Tlon files. A Clay test passes a Ford-built nested union through the reader into partial inference. The partial prelude includes `murn`, `join`, `snip`, `rear` and the agreed shared-type `clap`; supported calls infer, while backend validation remains outstanding, and [prelude-inventory.md](prelude-inventory.md) is a source audit, not the complete inventory or signatures. The milestone remains unfinished.
5573
74+The prelude now writes `hunt` with the ordering gate first, matching the target Hoon's `(hunt ord a b)`. Its focused golden infers both ordering outcomes and absent units, and reports mismatched unit payloads and ordering-gate samples. Execution and jet recognition remain unverified; `mate` still requires the missing `eq` and gate-free equality constraint.
75+
5676The shared prelude interface reserves every name present in the supplied vendored source and makes only supported inferred entries available, including `list`, `unit`, `same`, `fall`, `need`, `bond`, `lure`, `weld`, `snoc`, `turn` and `lent`. The validated standard `list` mold is injected when the prelude’s own gates are inferred; `weld` and `turn` have ordinary explicit result casts. An absent or altered `list` is not injected, and an altered declaration cannot leak through direct or transitive mold aliases. The same validated template is available when prelude mold aliases are prepared, so supported direct and transitive aliases can use it. Unsupported entries such as most list helpers remain reserved but unavailable; backend validation of the helpers remains outstanding. All callers use the same prelude origin, so a library can export a type containing unqualified `(unit A)` to another module. The source-only `+prepare-prelude` rejects empty, malformed, conflicting or import-bearing source; `+prepare-prelude-with-internal` also accepts the supported private internal import. Prepared values are trusted and must come unchanged from the matching preparation arm. When canonical public list or unit templates are missing or altered, independently inferred private molds remain available, while molds that depend on those templates do not. The module-scope fixture compares the prepared and source-taking paths against the real prelude and a two-module golden under eval and on the ship. The source and checker remain incomplete, so this does not establish complete shadowing coverage or a checked module.
5777
5878The prelude has a Jibb-written `succ` gate that increments through `add`; partial inference retains its arithmetic atom constraint. A Hoon translation agrees with Hoon on ten selected inputs. Jibb execution and jet recognition remain unverified.
@@ -61,7 +81,7 @@ The prelude has Jibb-written curried `lead` and `late` pair constructors, inferr
6181
6282The prelude also has a Jibb-written `zing` that concatenates homogeneous lists via `weld`. Its focused golden infers empty, nested text, ship, generic and gate-element lists and reports a non-list error; the same golden passes on the ship. A Hoon translation agrees with Hoon `zing` on selected finite inputs, not on Jibb execution. Hoon’s raw helper additionally accepts heterogeneous noun lists, which the Jibb signature does not express. Backend lowering and jet recognition remain unverified.
6383
64−The experimental deferred constructor transaction conservatively declines tuples, most branches, field reads, nonidentical successful call/cast fits, and multi-argument calls with open argument, sample or result types. This prevents a later substitution from invalidating an earlier face-propagation check; cases requiring deferred structural fits remain unsupported. It can retry source definitions after later dependencies become available, and a two-arm boolean branch can retain separately owned literal-result obligations until a later closed context resolves them. Faced targets or union cases, list literals and general union-pattern branches remain unsupported.
84+The experimental deferred constructor transaction conservatively declines general structural tuple fits, most branches, field reads, nonidentical successful call/cast fits, and multi-argument calls with open argument, sample or result types. This prevents a later substitution from invalidating an earlier face-propagation check; cases requiring deferred structural fits remain unsupported. It can retry source definitions after later dependencies become available, and a two-arm boolean branch can retain separately owned literal-result obligations until a later closed context resolves them. Faced targets or union cases, list literals and general union-pattern branches remain unsupported.
6585
6686The checked inference slice now represents `!!`, proves empty cell positions and filters proven-empty union cases. List and unit payload arms whose elements are empty are rejected as unreachable; fixed opaque cases fail closed when reachability is unknown. The new shared guard covers checked interfaces, partial diagnostics and proof budgets. Its shared guard runs under eval and on the ship.
6787
@@ -91,8 +111,8 @@ What the plan asks for, and where it is:
91111
92112Besides the plan's list:
93113
94−- 659 golden cases: 439 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.
95−- The 659-case corpus passed under `urbit eval` in 103.2 s while other checks were running. The fake ship passed all 705 tests, including the source-overlap, structural-overlap, generic-union source and alias-overlap, full-module overlap, deferred-context, generic-recursion, generic-construction, generic-pattern, deferred-inference, empty-mold and cell-branch fixtures, importer, importer/checker and mark/checker bridges, module scope, unification, hole, qath, ask, default-wrapper importer, projection, arithmetic, generic-alias, positional-face, API-evidence, request, closed-gate, todo API, constructor, sub, nested-union, gate-free and direct-gate guards and the unchanged todo report. Desk sync took 99.8 s while other checks were running. The importer golden compares 221 projections; `tools/clay-fixtures` builds the example Hoon fixtures through Clay, checks a recursive Ford import's origin, and passes Clay-built types through the Clay-built importer and partial checker.
114+- 660 golden cases: 440 that parse and 220 that fail, each failure at a stated line and column. One failing case has an unclear expectation (corpus question 3). The newer type-output cases exercise only the partial inference fragment. Each case's `about.txt` quotes the doc's words it tests.
115+- The 660-case corpus passed under `urbit eval` in 107.1 s while other checks were running. The fake ship passed all 717 tests, including the source-overlap, structural-overlap, generic-union source and alias-overlap, full-module overlap, deferred-context, generic-recursion, generic-construction, generic-pattern, deferred-inference, empty-mold and cell-branch fixtures, importer, importer/checker and mark/checker bridges, module scope, unification, hole, qath, ask, default-wrapper importer, projection, arithmetic, generic-alias, positional-face, API-evidence, request, closed-gate, todo API, constructor, sub, nested-union, gate-free and direct-gate guards and the unchanged todo report. Desk sync took 116.2 s and the ship's `-test` run took 246.2 s. 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.
96116- `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.
97117- 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.
98118- 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).
@@ -205,14 +225,24 @@ Besides the plan's list:
205225| b93a94b | 2026-10-31 | Prove local generic-alias union tags and add successor |
206226| 2826c93 | 2026-10-31 | Report generic-alias overlaps and retain deferred branch contexts |
207227| b5cdc80 | 2026-10-31 | Preserve full-module overlap source evidence |
208−| This change | 2026-10-31 | Add source-backed text conversion wrappers |
228+| ab6fdc1 | 2026-10-31 | Add source-backed text conversion wrappers |
229+| aa277c9 | 2026-10-31 | Recover prepared tuple initializers in partial reports |
230+| b4703e7 | 2026-11-01 | Check narrow closed subscription-free program mains |
231+| 26bf7a7 | 2026-11-01 | Recover narrow direct-program initializer contexts |
232+| 642d2c0 | 2026-11-01 | Prove direct request-value watchability for program subscriptions |
233+| 2e4d582 | 2026-11-01 | Add the source-backed UI, program and page prelude slice |
234+| a163965 | 2026-11-01 | Recover direct-program update result contexts |
235+| 46748b0 | 2026-11-01 | Check the unchanged todo island through component recovery |
236+| 1e17d5f | 2026-11-01 | Check static and direct data-page mains |
237+| 0517053 | 2026-11-01 | Add the theme mold and require explicit unit syntax |
238+| This change | 2026-11-01 | Check the unchanged cart store and basket |
209239
210240## Checking it
211241
212242On a machine set up as [development.md](development.md) says:
213243
214244```
215−tools/golden # 659 cases under urbit eval
245+tools/golden # 660 cases under urbit eval
216246tools/importer-test # the Hoon importer fixture projection
217247tools/type-import-default-test # default-wrapped source proof golden
218248tools/type-import-test # the importer/checker bridge fixture
@@ -235,19 +265,27 @@ tools/type-generic-pattern-test # source-proven recursive pattern guards
235265tools/type-deferred-test # source-owned deferred inference guards
236266tools/type-deferred-resolver-test # resolver consistency and failure guards
237267tools/type-deferred-context-test # deferred source-order and branch guards
268+tools/type-deferred-prepared-test # prepared initializer reports and failure guards
238269tools/type-empty-test # empty molds and coverage guards
239270tools/type-cell-branch-test # branch context and rollback guards
240271tools/type-positional-face-guards-test # positional sample face guards
241272tools/type-qath-guards-test # qath source and unfolding guards
242273tools/type-ask-guards-test # ask source and bootstrap guards
243274tools/type-proj-guards-test # projection evidence and scope guards
275+tools/type-buttons-test # documented buttons schemes and exact pending-tag error
276+tools/type-theme-test # byte-identical real theme, exact type and rejection guards
244277tools/type-module-scope-test # module and prelude scope fixture
278+tools/type-program-main-test # closed program-main interface and rejection guards
279+tools/type-program-init-test # transactional direct-program initializer context guards
280+tools/type-program-update-test # transactional direct-program update context guards
281+tools/type-program-watch-test # direct request-value watchability guards
282+tools/type-todo-full-test # byte-identical full todo and rejection guards
245283tools/hoon check-spans-test # prints <<>> when the span checker works
246284tools/testdata/selftest # the tools themselves
247285tools/doc-blocks docs/spec # the doc's examples are golden cases
248286tools/ship start
249287tools/ship gen-tests --check # tests/lib/jibb.hoon is up to date
250−tools/ship test # the same 659 cases as -test arms on the ship
288+tools/ship test # the same 660 cases as -test arms on the ship
251289tools/testdata/ship-selftest
252290tools/testdata/clay-fixtures-selftest # scratch fixture cleanup without a ship
253291tools/ship check-commit # |commit stores .jibb files
jibb-dev/lib/jibb.hoon+1955−110
@@ -774,39 +774,38 @@
774774:: (face 2:11 items
775775:: (apply 2:17 list (aura 2:23 @t)))
776776:: (face 2:27 open (flag 2:32))))
777−:: (mold 3:1 cart-action
777+:: (mold 3:1 poke
778778:: (union 4:3
779779:: (cell 4:3
780780:: (const 4:4 %add)
781781:: (face 4:9 item (aura 4:14 @t)))
782782:: (const 5:3 %toggle)))
783−:: (mold 6:1 poke (ref 6:9 cart-action))
784−:: (value 8:1 main
785−:: (group 8:9
786−:: (call 8:10 (wing 8:10 store) (wing 8:16 init) (wing 8:21 update))))
787−:: (value 9:1 init
788−:: (cast 9:9
789−:: (ref 9:12 state)
790−:: (tuple 9:18 (lit 9:19 ~) (lit 9:21 %.n))))
791−:: (value 10:1 update
792−:: (gate 10:11
793−:: (cell 10:14
794−:: (face 10:15 a (ref 10:17 cart-action))
795−:: (face 10:29 s (ref 10:31 state)))
796−:: (body 11:3
797−:: (branch 11:3
798−:: (wing 11:6 a)
783+:: (value 7:1 main
784+:: (group 7:9
785+:: (call 7:10 (wing 7:10 store) (wing 7:16 init) (wing 7:21 update))))
786+:: (value 8:1 init
787+:: (cast 8:9
788+:: (ref 8:12 state)
789+:: (tuple 8:18 (lit 8:19 ~) (lit 8:21 %.n))))
790+:: (value 9:1 update
791+:: (gate 9:11
792+:: (cell 9:14
793+:: (face 9:15 a (ref 9:17 poke))
794+:: (face 9:22 s (ref 9:24 state)))
795+:: (body 10:3
796+:: (branch 10:3
797+:: (wing 10:6 a)
798+:: (arm 11:5
799+:: (cell 11:5 (lit 11:6 %add) (bind 11:11 item))
800+:: (change 11:18 s
801+:: (edit 11:20 items
802+:: (tuple 11:26 (wing 11:27 item) (wing 11:32 items.s)))))
799803:: (arm 12:5
800−:: (cell 12:5 (lit 12:6 %add) (bind 12:11 item))
804+:: (lit 12:5 %toggle)
801805:: (change 12:18 s
802−:: (edit 12:20 items
803−:: (tuple 12:26 (wing 12:27 item) (wing 12:32 items.s)))))
804−:: (arm 13:5
805−:: (lit 13:5 %toggle)
806−:: (change 13:18 s
807−:: (edit 13:20 open
808−:: (group 13:25
809−:: (call 13:26 (wing 13:26 not) (wing 13:30 open.s)))))))))))
806+:: (edit 12:20 open
807+:: (group 12:25
808+:: (call 12:26 (wing 12:26 not) (wing 12:30 open.s)))))))))))
810809::
811810:: 4.3 Errors (+show-error): "<file>:<line>:<col>: <message>", then the
812811:: source line, then a caret under the column (col - 1 spaces, then ^).
@@ -4681,7 +4680,7 @@
46814680 ==
46824681+$ ibinding [id=@ud val=itype]
46834682+$ isub (list ibinding)
4684−+$ ipending [id=@ud literal=lit]
4683++$ ipending [id=@ud literal=lit at=span]
46854684::
46864685++ itype-lookup
46874686 |= [n=@ud sub=isub]
@@ -5203,6 +5202,13 @@
52035202 ?~ (itype-lookup id.i.tags sub) &
52045203 $(tags t.tags)
52055204::
5205+++ pending-tag-diagnostic
5206+ |= [tags=(list ipending) sub=isub]
5207+ ^- (unit [at=span msg=tape])
5208+ ?~ tags ~
5209+ ?^ (itype-lookup id.i.tags sub) $(tags t.tags)
5210+ `[at.i.tags (weld "nothing fixes the union of " (show-lit literal.i.tags))]
5211+::
52065212++ pending-null
52075213 |= [tags=(list ipending) sub=isub]
52085214 ^- ?
@@ -5487,6 +5493,13 @@
54875493 ?:(|(=(0 val.literal.actual) =(1 val.literal.actual)) [%ok sub next] [%bad ~])
54885494 ?: ?=(%any-atom -.expected) [%ok sub next]
54895495 [%bad ~]
5496+ :: A field on an expected sample slot labels the value's type; it does
5497+ :: not become a face on the actual argument. Unify with the slot body
5498+ :: rather than binding either variable to the face around the other.
5499+ ?: &(?=(%var -.actual) ?=(%face -.expected))
5500+ =/ unified=(unit isub) (itype-unify actual body.expected sub)
5501+ ?~ unified [%unknown ~]
5502+ [%ok u.unified next]
54905503 ?: &(uncertain (itype-face-asym actual expected sub)) [%unknown ~]
54915504 :: A known face labels the same noun. Peel it before applying the
54925505 :: directional unrestricted-atom rule, preserving raw-variable guards.
@@ -5516,14 +5529,6 @@
55165529 =/ first=ifit $(actual hed.actual, expected hed.expected, skip-width |, spine-proof |)
55175530 ?. ?=(%ok -.first) first
55185531 $(actual tal.actual, expected tal.expected, sub sub.first, next next.first, skip-width spine-checked, spine-proof spine-checked)
5519− :: A field may add a face to an occurrence of the very same type
5520− :: variable. Binding that variable to a face around itself would fail
5521− :: the occurs check, but its underlying type has already matched.
5522− ?: &(?=(%var -.actual) ?=(%face -.expected) =(actual (itype-walk body.expected sub)))
5523− [%ok sub next]
5524− :: Differing variables and faces need propagation that is not yet
5525− :: represented. Binding one to the face can create a false mismatch.
5526− ?: &(?=(%var -.actual) ?=(%face -.expected)) [%unknown ~]
55275532 ?: &(?=(%face -.actual) ?=(%var -.expected)) [%unknown ~]
55285533 ?: &(?=(%var -.actual) (itype-has-any-atom expected sub))
55295534 [%unknown ~]
@@ -5623,10 +5628,14 @@
56235628:: of an arbitrary ask value. Reader graphs and source inputs are trusted.
56245629+$ irequest-evidence
56255630 [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]
5631+:: Store requests have their own source-bound evidence. In particular, an
5632+:: API path certificate cannot make a store state member watchable, or vice versa.
5633++$ istore-request-evidence
5634+ [store-at=path source=@t state=itype action-name=term action=itype]
56265635:: A unit distinguishes a verified empty closure from a detached legacy file.
56275636:: The opaque prelude is an exact trusted input, not a recursive interface mold.
56285637+$ irequest-graph
5629− [paths=(set path) requests=(list irequest-evidence) bundle-input=* prelude-input=* prelude-values=(list term) prelude-molds=(list term) externals=iexternals marks=imark-externals]
5638+ [paths=(set path) requests=(list irequest-evidence) stores=(list istore-request-evidence) bundle-input=* prelude-input=* prelude-values=(list term) prelude-molds=(list term) externals=iexternals marks=imark-externals]
56305639+$ 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)]
56315640+$ ijimports (list [face=term interface=ifile])
56325641+$ icap [name=@t id=@ud at=span]
@@ -7477,7 +7486,12 @@
74777486 =/ target=itype (itype-walk expected sub.state)
74787487 =/ value=iresult (infer-call-context-arg i.items target env state context)
74797488 ?: ?=(%| -.value) value
7480− =/ fit=ifit (itype-fit typ.p.value target sub.state.p.value next.state.p.value)
7489+ =/ ordinary-fit=ifit (itype-fit typ.p.value target sub.state.p.value next.state.p.value)
7490+ =/ fit=ifit
7491+ ?: ?=(%ok -.ordinary-fit) ordinary-fit
7492+ ?: ?&(?=(%union -.target) ?=(^ prelude.state) =(origin.target `[at.u.prelude.state %element]))
7493+ (program-single-generic-fit typ.p.value target sub.state.p.value next.state.p.value)
7494+ ordinary-fit
74817495 ?: ?=(%unknown -.fit) [%| ["list item constraint is not supported by partial inference" ~]]
74827496 ?: ?=(%bad -.fit)
74837497 ?: |((itype-family-related typ.p.value target sub.state.p.value) (itype-has-any-atom typ.p.value sub.state.p.value) (itype-has-any-atom target sub.state.p.value))
@@ -7494,7 +7508,12 @@
74947508 =/ target=itype (itype-walk expected sub.state)
74957509 =/ value=iresult (infer-call-context-arg i.items target env state context)
74967510 ?: ?=(%| -.value) value
7497− =/ fit=ifit (itype-fit typ.p.value target sub.state.p.value next.state.p.value)
7511+ =/ ordinary-fit=ifit (itype-fit typ.p.value target sub.state.p.value next.state.p.value)
7512+ =/ fit=ifit
7513+ ?: ?=(%ok -.ordinary-fit) ordinary-fit
7514+ ?: ?&(?=(%union -.target) ?=(^ prelude.state) =(origin.target `[at.u.prelude.state %element]))
7515+ (program-single-generic-fit typ.p.value target sub.state.p.value next.state.p.value)
7516+ ordinary-fit
74987517 ?: ?=(%unknown -.fit) [%| ["list item constraint is not supported by partial inference" ~]]
74997518 ?: ?=(%bad -.fit)
75007519 =/ missing=(unit idiag) (missing-union-tag i.items target sub.state.p.value context)
@@ -8362,8 +8381,8 @@
83628381 %duration [%& [%atom %dr] state]
83638382 %knot [%& [%atom %ta] state]
83648383 %loobean [%& [%flag ~] state]
8365− %term [%& [%tag next.state lit.e |] state(next +(next.state), tags [[next.state lit.e] tags.state])]
8366− %null [%& [%tag next.state lit.e |] state(next +(next.state), tags [[next.state lit.e] tags.state])]
8384+ %term [%& [%tag next.state lit.e |] state(next +(next.state), tags [[next.state lit.e at.e] tags.state])]
8385+ %null [%& [%tag next.state lit.e |] state(next +(next.state), tags [[next.state lit.e at.e] tags.state])]
83678386 ==
83688387 %unit
83698388 ?~ prelude.state [%| ["unit construction needs the standard prelude in partial inference" ~]]
@@ -8430,12 +8449,15 @@
84308449 =/ target=iresult $(e [%wing at.e target.e])
84318450 ?: ?=(%| -.target) target
84328451 (infer-change-edits edits.e typ.p.target env state.p.target ~)
8433− %ctor [%& [%tag next.state tag.e &] state(next +(next.state), tags [[next.state tag.e] tags.state])]
8452+ %ctor [%& [%tag next.state tag.e &] state(next +(next.state), tags [[next.state tag.e at.e] tags.state])]
84348453 %trace
84358454 =/ traced=iresult $(e val.e)
84368455 ?: ?=(%| -.traced) traced
84378456 $(e then.e, state state.p.traced)
8438− %tuple (infer-simple-items items.e env state)
8457+ %tuple
8458+ ?: &(?=(^ defer.state) ?=(^ prelude.state))
8459+ (dg-infer-tuple-items items.e env state)
8460+ (infer-simple-items items.e env state)
84398461 %body
84408462 ?~ defs.e $(e final.e)
84418463 =/ local-names=(list term) (global-value-names defs.e)
@@ -8959,7 +8981,17 @@
89598981 ?~ args.result |
89608982 ?. =((lent args.result) (lent args.expected)) |
89618983 ?: |((itype-has-tag (itype-normalize result sub.state.p.head)) (itype-has-tag (itype-normalize expected sub.state.p.head))) |
8962− ?: |((itype-has-recursive (itype-normalize result sub.state.p.head)) (itype-has-recursive (itype-normalize expected sub.state.p.head))) |
8984+ =/ result-recursive=? (itype-has-recursive (itype-normalize result sub.state.p.head))
8985+ =/ expected-recursive=? (itype-has-recursive (itype-normalize expected sub.state.p.head))
8986+ =/ result-ok=?
8987+ ?. result-recursive &
8988+ ?~ prelude.state |
8989+ &(=(at.u.prelude.state /lib/jibb/prelude/jibb) =(origin.result `[at.u.prelude.state %element]))
8990+ =/ expected-ok=?
8991+ ?. expected-recursive &
8992+ ?~ prelude.state |
8993+ &(=(at.u.prelude.state /lib/jibb/prelude/jibb) =(origin.expected `[at.u.prelude.state %element]))
8994+ ?. &(result-ok expected-ok) |
89638995 ?: |((itype-has-any-atom result sub.state.p.head) (itype-has-any-atom expected sub.state.p.head)) |
89648996 &
89658997 ?. eligible (infer-call-with-head e env state head)
@@ -9241,6 +9273,8 @@
92419273 |= [e=expr expected=itype env=ienv state=istate context=span]
92429274 ^- iresult
92439275 ?: &(?=(^ defer.state) ?=(%branch -.e)) (infer-fragment e env state)
9276+ ?: &(?=(^ defer.state) ?=(^ prelude.state) ?=(%tuple -.e))
9277+ (infer-fragment e env state)
92449278 ?: ?=(%pair -.e) $(e (pair-as-cell e))
92459279 ?: ?=(%group -.e) $(e inner.e)
92469280 ?: &(?=(%body -.e) ?=(~ defs.e)) $(e final.e)
@@ -10232,12 +10266,36 @@
1023210266 (resolve-groups-core ds molds globals externals surs mark-externals marks jimports reserved-molds at prelude ~)
1023310267::
1023410268
10269++$ iadded-definition
10270+ [env=ienv checked=(map term def) artifacts=(list iwidth-definition)]
10271+++ add-supported-result
10272+ |= [d=def result=iresult initial=istate env=ienv checked=(map term def) artifacts=(list iwidth-definition)]
10273+ ^- (unit iadded-definition)
10274+ ?> ?=(%value -.d)
10275+ ?: ?=(%| -.result) ~
10276+ =. state.p.result (promote-restricted-numbers state.p.result env)
10277+ =. state.p.result (default-hole-numbers holes.state.p.result holes.initial state.p.result env !(itype-has-gate (itype-normalize typ.p.result sub.state.p.result)))
10278+ ?^ (unresolved-hole holes.state.p.result holes.initial state.p.result) ~
10279+ ?: (constrained-capitals caps.state.p.result sub.state.p.result) ~
10280+ =/ typ=itype (default-decimals (itype-normalize typ.p.result sub.state.p.result))
10281+ ?: |((pending-tags tags.state.p.result sub.state.p.result) (itype-has-tag typ)) ~
10282+ ?: (unsupported-atom-vars typ caps.state.p.result binders.state.p.result sub.state.p.result) ~
10283+ =/ vars=(list @ud) (unique-type-vars (itype-vars typ))
10284+ ?: (gth (lent vars) 26) ~
10285+ =/ finalized=(unit (list iwprojection))
10286+ (width-finalize projections.state.p.result sub.state.p.result vars)
10287+ ?~ finalized ~
10288+ =? artifacts ?=(^ u.finalized)
10289+ [[name.d val.d typ sub.state.p.result (flop u.finalized)] artifacts]
10290+ =? checked |(?=(%gate -.val.d) ?=(%gate-wide -.val.d)) (~(put by checked) name.d d)
10291+ `[[[name.d [typ vars]] env] checked artifacts]
1023510292++ add-supported-defs-core
1023610293 |= [ds=(list def) all-defs=(list def) checked=(map term def) heads=(unit igate-prelude-evidence) env=ienv molds=imolds globals=(list term) externals=iexternals surs=(list term) mark-externals=imark-externals marks=(list term) jimports=ijimports reserved-molds=(list term) at=path prelude=(unit ifile) artifacts=(list iwidth-definition) index=(unit [at=path source=@t prelude=ifile shapes=(map term shape)])]
1023710294 ^- [env=ienv artifacts=(list iwidth-definition)]
1023810295 ?~ ds [env artifacts]
1023910296 =/ d=def i.ds
1024010297 ?: ?=(%mold -.d) $(ds t.ds)
10298+ ?: (lien (program-recovery-names all-defs) |=(n=term =(n name.d))) $(ds t.ds)
1024110299 ?. (unique-value-name name.d globals) $(ds t.ds)
1024210300 ?^ (ienv-lookup name.d env) $(ds t.ds)
1024310301 =/ top=(list term) (turn molds |=(m=[name=term body=shape] name.m))
@@ -10248,23 +10306,35 @@
1024810306 =. initial (reserve-def-caps val.d initial)
1024910307 =/ result=iresult (infer-fragment val.d env initial)
1025010308 =? result ?=(%| -.result) (infer-recursive-gate d env initial)
10251− ?: ?=(%| -.result) $(ds t.ds)
10252− =. state.p.result (promote-restricted-numbers state.p.result env)
10253− =. state.p.result (default-hole-numbers holes.state.p.result holes.initial state.p.result env !(itype-has-gate (itype-normalize typ.p.result sub.state.p.result)))
10254− ?^ (unresolved-hole holes.state.p.result holes.initial state.p.result) $(ds t.ds)
10255− ?: (constrained-capitals caps.state.p.result sub.state.p.result) $(ds t.ds)
10256− =/ typ=itype (default-decimals (itype-normalize typ.p.result sub.state.p.result))
10257− ?: |((pending-tags tags.state.p.result sub.state.p.result) (itype-has-tag typ)) $(ds t.ds)
10258− ?: (unsupported-atom-vars typ caps.state.p.result binders.state.p.result sub.state.p.result) $(ds t.ds)
10259− =/ vars=(list @ud) (unique-type-vars (itype-vars typ))
10260− ?: (gth (lent vars) 26) $(ds t.ds)
10261− =/ finalized=(unit (list iwprojection))
10262− (width-finalize projections.state.p.result sub.state.p.result vars)
10263− ?~ finalized $(ds t.ds)
10264− =? artifacts ?=(^ u.finalized)
10265− [[name.d val.d typ sub.state.p.result (flop u.finalized)] artifacts]
10266− =? checked |(?=(%gate -.val.d) ?=(%gate-wide -.val.d)) (~(put by checked) name.d d)
10267− $(ds t.ds, env [[name.d [typ vars]] env], checked checked)
10309+ =/ added=(unit iadded-definition)
10310+ (add-supported-result d result initial env checked artifacts)
10311+ ?~ added $(ds t.ds)
10312+ $(ds t.ds, env env.u.added, checked checked.u.added, artifacts artifacts.u.added)
10313+::
10314+:: Full checking discards unsupported definitions. On that failure path only,
10315+:: retry a bounded number of missing definitions to explain a pending tag
10316+:: from the same ordinary inference state instead of hiding it behind the
10317+:: generic completeness error. No successful definition takes this path.
10318+++ module-pending-tag
10319+ |= [ds=(list def) env=ienv base=istate fuel=@ud]
10320+ ^- (unit [at=span msg=tape])
10321+ =/ checked=(map term def) (direct-checked-gates ds env)
10322+ =/ heads=(unit igate-prelude-evidence) (direct-prelude-evidence ds prelude.base)
10323+ |-
10324+ ?~ ds ~
10325+ ?: =(0 fuel) ~
10326+ =/ d=def i.ds
10327+ ?: ?=(%mold -.d) $(ds t.ds, fuel (dec fuel))
10328+ ?^ (ienv-lookup name.d env) $(ds t.ds, fuel (dec fuel))
10329+ =/ initial=istate base(gate-defs checked, head-evidence heads)
10330+ =. initial (reserve-def-caps val.d initial)
10331+ =/ result=iresult (infer-fragment val.d env initial)
10332+ =? result ?=(%| -.result) (infer-recursive-gate d env initial)
10333+ ?: ?=(%| -.result) $(ds t.ds, fuel (dec fuel))
10334+ =/ pending=(unit [at=span msg=tape])
10335+ (pending-tag-diagnostic tags.state.p.result sub.state.p.result)
10336+ ?^ pending pending
10337+ $(ds t.ds, fuel (dec fuel))
1026810338::
1026910339++ resolve-groups-core
1027010340 |= [ds=(list def) molds=imolds globals=(list term) externals=iexternals surs=(list term) mark-externals=imark-externals marks=(list term) jimports=ijimports reserved-molds=(list term) at=path prelude=(unit ifile) index=(unit [at=path source=@t prelude=ifile shapes=(map term shape)])]
@@ -11270,22 +11340,6 @@
1127011340 ?. (levy vals |=(n=term &((unique-value-name n vals) !(lien prelude-values |=(v=term =(n v)))))) |
1127111341 (levy mold-names |=(n=term &((unique-value-name n mold-names) !(lien prelude-molds |=(m=term =(n m))))))
1127211342::
11273−:: In an API file or before main's kind is known, a lone `+$ poke`
11274−:: may be a declaration rather than a mold that shadows the prelude. Do not call
11275−:: that one collision definite, and do not hide unrelated scope errors.
11276−++ pending-declared-poke
11277− |= [at=path mod=module prelude-values=(list term) prelude-molds=(list term)]
11278− ^- ?
11279− ?. (lien prelude-molds |=(n=term =(%poke n))) |
11280− ?. |(?=([%ui %api @ %jibb ~] at) (lien defs.mod |=(d=def &(?=(%value -.d) =(%main name.d))))) |
11281− =/ pokes=(list def)
11282− (skim defs.mod |=(d=def &(?=(%mold -.d) =(%poke name.d))))
11283− ?~ pokes |
11284− ?^ t.pokes |
11285− =/ remaining=(list def)
11286− (skim defs.mod |=(d=def !&(?=(%mold -.d) =(%poke name.d))))
11287− (module-scope-valid mod(defs remaining) prelude-values prelude-molds)
11288−::
1128911343:: A detailed failure is attached only to the first mold that actually
1129011344:: failed in this check, using that module's checked source mold table.
1129111345+$ imold-failure [message=@t overlap=(unit [name=term cases=upair])]
@@ -11640,6 +11694,25 @@
1164011694 =(externals.g externals)
1164111695 =(marks.g marks)
1164211696 ==
11697+++ request-graph-bounded
11698+ |= g=irequest-graph
11699+ ^- ?
11700+ =/ total=@ud (add (lent requests.g) (lent stores.g))
11701+ &((lte (lent ~(tap in:..zuse paths.g)) 256) (lte total 256))
11702+::
11703+++ store-graph-requests-add
11704+ |= [pending=(list istore-request-evidence) acc=(list istore-request-evidence) fuel=@ud]
11705+ ^- (unit (list istore-request-evidence))
11706+ ?~ pending `acc
11707+ ?: =(0 fuel) ~
11708+ =/ hit=(list istore-request-evidence)
11709+ (skim acc |=(x=istore-request-evidence =(store-at.x store-at.i.pending)))
11710+ ?^ hit
11711+ ?. ?=([* ~] hit) ~
11712+ ?. =(i.hit i.pending) ~
11713+ $(pending t.pending, fuel (dec fuel))
11714+ $(pending t.pending, acc [i.pending acc], fuel (dec fuel))
11715+::
1164311716++ request-graph-merge
1164411717 |= [imports=ijimports g=irequest-graph fuel=@ud]
1164511718 ^- (unit irequest-graph)
@@ -11660,8 +11733,13 @@
1166011733 =/ rs=(unit (list irequest-evidence))
1166111734 (request-graph-requests-add requests.cg requests.g (add 1 (lent requests.cg)))
1166211735 ?~ rs ~
11663− ?: &(?=(^ u.rs) |((gth (lent ~(tap in:..zuse merged)) 256) (gth (lent u.rs) 256))) ~
11664− $(imports t.imports, g g(paths merged, requests u.rs), fuel (dec fuel))
11736+ =/ ss=(unit (list istore-request-evidence))
11737+ (store-graph-requests-add stores.cg stores.g (add 1 (lent stores.cg)))
11738+ ?~ ss ~
11739+ =/ total=@ud (add (lent u.rs) (lent u.ss))
11740+ ?: &(?=(^ u.rs) |((gth (lent ~(tap in:..zuse merged)) 256) (gth total 256))) ~
11741+ ?: &(?=(^ u.ss) |((gth (lent ~(tap in:..zuse merged)) 256) (gth total 256))) ~
11742+ $(imports t.imports, g g(paths merged, requests u.rs, stores u.ss), fuel (dec fuel))
1166511743++ request-graph-reusable
1166611744 |= [f=ifile src=@t externals=iexternals marks=imark-externals modules=jbundle active=(list path) values=(list term) molds=(list term) prelude=(unit ifile)]
1166711745 ^- ?
@@ -11908,7 +11986,8 @@
1190811986 ?> ?=(%mold -.decl)
1190911987 =/ paths=(unit (list iapi-path)) (api-path-declaration shape.decl declared)
1191011988 ?~ paths ~
11911− ?. (api-derived-names-valid u.paths u.poke-names mod prelude-values) ~
11989+ =/ derived-pokes=(list term) ?~(pokes ~ ~[%poke])
11990+ ?. (api-derived-names-valid u.paths derived-pokes mod prelude-values) ~
1191211991 (api-path-types u.paths externals declared)
1191311992::
1191411993:: Source/graph entry for path analysis only. The returned paths retain
@@ -12119,6 +12198,29 @@
1211912198:: Value watchability remains unproved even for a watchable declaration.
1212012199+$ ione-request-interface
1212112200 [support=iapi-support-evidence parts=iapi-request-parts iface=ifile]
12201+++ compatible-raw-poke
12202+ |= prelude=iprelude
12203+ ^- (unit ischeme)
12204+ =/ public=ifile iface.prelude
12205+ ?. =(at.public /lib/jibb/prelude/jibb) ~
12206+ =/ poke=(unit ischeme) (find-jibb-mold %raw-poke public)
12207+ ?~ poke ~
12208+ ?^ vars.u.poke ~
12209+ ?. ?=(%union -.typ.u.poke) ~
12210+ ?^ args.typ.u.poke ~
12211+ ?. =(origin.typ.u.poke `[/lib/jibb/internal/jibb %raw-poke]) ~
12212+ ?: (itype-has-tag typ.u.poke) ~
12213+ =/ private=(list iwidth-dependency)
12214+ (skim dependencies.public |=(d=iwidth-dependency =(at.d /lib/jibb/internal/jibb)))
12215+ ?. ?=([* ~] private) ~
12216+ ?~ source.i.private ~
12217+ =/ agent-case=itype
12218+ [%cell [%const [%term %tas %agent '%agent']] [%cell [%face %agent [%atom %tas]] [%cell [%face %mark [%atom %tas]] [%face %payload [%noun ~]]]]]
12219+ =/ store-case=itype
12220+ [%cell [%const [%term %tas %store '%store']] [%cell [%face %module [%atom %t]] [%cell [%face %action [%atom %tas]] [%face %payload [%noun ~]]]]]
12221+ ?. =(cases.typ.u.poke ~[agent-case store-case]) ~
12222+ poke
12223+::
1212212224++ request-compatible-ask
1212312225 |= prelude=iprelude
1212412226 ^- (unit ischeme)
@@ -12215,7 +12317,7 @@
1221512317 ?~ source.i.private [%| 'request internal source needs unsupported inference']
1221612318 =/ req=irequest-evidence
1221712319 [file name.path.p p src u.source.public u.source.i.private values.prelude molds.prelude externals marks]
12218− =/ interface=ifile [~[[name.path.p scheme]] exports file ~ ~ ~ `src `[(silt `(list path)`~[file]) ~[req] modules `public values.prelude molds.prelude externals marks]]
12320+ =/ interface=ifile [~[[name.path.p scheme]] exports file ~ ~ ~ `src `[(silt `(list path)`~[file]) ~[req] ~ modules `public values.prelude molds.prelude externals marks]]
1221912321 [%& [support u.parts interface]]
1222012322:: Graph-aware request artifact; resolver use remains type-only.
1222112323++ one-request-interface-graph
@@ -12269,7 +12371,7 @@
1226912371 ?~ source.i.private [%| 'request internal source needs unsupported inference']
1227012372 =/ req=irequest-evidence
1227112373 [file name.path.p p src u.source.public u.source.i.private values.prelude molds.prelude externals marks]
12272− =/ interface=ifile [~[[name.path.p scheme]] exports file ~ ~ ~ `src `[(silt `(list path)`~[file]) ~[req] modules `public values.prelude molds.prelude externals marks]]
12374+ =/ interface=ifile [~[[name.path.p scheme]] exports file ~ ~ ~ `src `[(silt `(list path)`~[file]) ~[req] ~ modules `public values.prelude molds.prelude externals marks]]
1227312375 [%& [support u.parts interface]]
1227412376::
1227512377++ api-mark-exports
@@ -12290,7 +12392,7 @@
1229012392 ?^ (duplicate-defs defs.mod) ~
1229112393 ?~ prelude ~
1229212394 ?. =(at.u.prelude /lib/jibb/prelude/jibb) ~
12293− =/ poke=(unit ischeme) (find-jibb-mold %poke u.prelude)
12395+ =/ poke=(unit ischeme) (find-jibb-mold %raw-poke u.prelude)
1229412396 ?~ poke ~
1229512397 ?. ?=(%union -.typ.u.poke) ~
1229612398 ?^ vars.u.poke ~
@@ -12314,8 +12416,9 @@
1231412416 ?: |((lien prelude-values |=(x=term =(n x))) (lien prelude-molds |=(x=term =(n x)))) ~
1231512417 =/ mark=(unit itype) (find-imported-mark n mark-externals marks)
1231612418 ?~ mark ~
12317− =/ sc=ischeme [[%fn u.mark typ.u.poke] ~]
12318− `[~[[n sc]] (api-mark-exports marks marks mark-externals) at ~[[n i.t.t.at n]] ~ ~ ~ ~]
12419+ =/ sc=(unit ischeme) (derived-poke-command-scheme u.prelude u.mark)
12420+ ?~ sc ~
12421+ `[~[[%poke u.sc]] (api-mark-exports marks marks mark-externals) at ~[[n i.t.t.at n]] ~ ~ ~ ~]
1231912422::
1232012423:: Source-proven ordinary helpers validate each selected /sur dependency.
1232112424:: Unused or less direct cores remain unsupported by this first interface.
@@ -12438,11 +12541,1562 @@
1243812541 [%| 'API exported molds need unsupported inference']
1243912542 =/ env=ienv (weld values.u.gates (weld values.u.poke values.support))
1244012543 =/ graph=irequest-graph
12441− [(silt `(list path)`~[file]) requests.u.gates modules `public values.prep molds.prep externals marks]
12544+ [(silt `(list path)`~[file]) requests.u.gates ~ modules `public values.prep molds.prep externals marks]
1244212545 =/ iface=ifile
1244312546 [env exports file derived.u.poke elaborations.support ~ `src `graph]
1244412547 [%& [iface dependencies.ev]]
1244512548::
12549+:: A checked program main is only the direct four-component source call.
12550+:: Grouping is transparent, but aliases, qualified wings and other module
12551+:: kinds remain outside this slice.
12552+++ program-main-def
12553+ |= ds=(list def)
12554+ ^- (unit def)
12555+ ?~ ds ~
12556+ ?: &(?=(%value -.i.ds) =(%main name.i.ds)) `i.ds
12557+ $(ds t.ds)
12558+::
12559+++ program-main-wing
12560+ |= e=expr
12561+ ^- (unit term)
12562+ ?: ?=(%group -.e) $(e inner.e)
12563+ ?. ?=(%wing -.e) ~
12564+ ?. ?=([@ ~] names.e) ~
12565+ `i.names.e
12566+::
12567+++ program-main-args
12568+ |= d=def
12569+ ^- (unit (list expr))
12570+ ?. ?=(%value -.d) ~
12571+ |-
12572+ ?: ?=(%group -.val.d) $(val.d inner.val.d)
12573+ ?. ?=(%call -.val.d) ~
12574+ =/ head=(unit term) (program-main-wing head.val.d)
12575+ ?~ head ~
12576+ ?. =(%program u.head) ~
12577+ ?. ?=([* * * * ~] args.val.d) ~
12578+ `args.val.d
12579+::
12580+++ program-main-parts
12581+ |= d=def
12582+ ^- (unit [init=term update=term view=term subs=term])
12583+ ?. ?=(%value -.d) ~
12584+ |-
12585+ ?: ?=(%group -.val.d) $(val.d inner.val.d)
12586+ ?. ?=(%call -.val.d) ~
12587+ =/ head=(unit term) (program-main-wing head.val.d)
12588+ ?~ head ~
12589+ ?. =(%program u.head) ~
12590+ ?. ?=([* * * * ~] args.val.d) ~
12591+ =/ args=(list expr) args.val.d
12592+ ?> ?=([* * * * ~] args)
12593+ =/ init=(unit term) (program-main-wing i.args)
12594+ =/ update=(unit term) (program-main-wing i.t.args)
12595+ =/ view=(unit term) (program-main-wing i.t.t.args)
12596+ =/ subs=(unit term) (program-main-wing i.t.t.t.args)
12597+ ?~ init ~
12598+ ?~ update ~
12599+ ?~ view ~
12600+ ?~ subs ~
12601+ `[u.init u.update u.view u.subs]
12602+::
12603+:: A data page is only the direct two-component source call. Grouping is
12604+:: transparent, but page aliases, qualified wings and other kinds are not.
12605+++ page-main-parts
12606+ |= d=def
12607+ ^- (unit [load=term view=term])
12608+ ?. ?=(%value -.d) ~
12609+ |-
12610+ ?: ?=(%group -.val.d) $(val.d inner.val.d)
12611+ ?. ?=(%call -.val.d) ~
12612+ =/ head=(unit term) (program-main-wing head.val.d)
12613+ ?~ head ~
12614+ ?. =(%page u.head) ~
12615+ ?. ?=([* * ~] args.val.d) ~
12616+ =/ args=(list expr) args.val.d
12617+ ?> ?=([* * ~] args)
12618+ =/ load=(unit term) (program-main-wing i.args)
12619+ =/ view=(unit term) (program-main-wing i.t.args)
12620+ ?~ load ~
12621+ ?~ view ~
12622+ `[u.load u.view]
12623+::
12624+:: A store main is only the direct two-wing source call. Its local poke mold
12625+:: is checked here and remains in ordinary mold/value inference.
12626+++ store-main-parts
12627+ |= d=def
12628+ ^- (unit [init=term update=term])
12629+ ?. ?=(%value -.d) ~
12630+ |-
12631+ ?: ?=(%group -.val.d) $(val.d inner.val.d)
12632+ ?. ?=(%call -.val.d) ~
12633+ =/ head=(unit term) (program-main-wing head.val.d)
12634+ ?~ head ~
12635+ ?. =(%store u.head) ~
12636+ ?. ?=([* * ~] args.val.d) ~
12637+ =/ args=(list expr) args.val.d
12638+ ?> ?=([* * ~] args)
12639+ =/ init=(unit term) (program-main-wing i.args)
12640+ =/ update=(unit term) (program-main-wing i.t.args)
12641+ ?~ init ~
12642+ ?~ update ~
12643+ `[u.init u.update]
12644+::
12645++$ istore-declaration [action=term defs=(list def)]
12646+++ store-declaration
12647+ |= [mod=module prelude-values=(list term) prelude-molds=(list term)]
12648+ ^- (unit istore-declaration)
12649+ =/ ds=(list def) defs.mod
12650+ =/ pokes=(list def)
12651+ (skim ds |=(d=def &(?=(%mold -.d) =(%poke name.d))))
12652+ ?. ?=([* ~] pokes) ~
12653+ =/ states=(list def)
12654+ (skim ds |=(d=def &(?=(%mold -.d) =(%state name.d))))
12655+ ?. ?=([* ~] states) ~
12656+ =/ poke=def i.pokes
12657+ =/ state=def i.states
12658+ ?> &(?=(%mold -.poke) ?=(%mold -.state))
12659+ ?: ?=(%generic -.shape.state) ~
12660+ ?: ?=(%generic -.shape.poke) ~
12661+ =/ action=term %poke
12662+ =/ ordinary=(list def) ds
12663+ ?. (module-scope-valid mod prelude-values prelude-molds) ~
12664+ =/ derived=(list term) ~[%state action]
12665+ ?: (lien derived |=(n=term =(n %proj))) ~
12666+ =/ outer=(list term)
12667+ (weld prelude-values (weld (global-value-names ordinary) (api-import-faces imports.mod)))
12668+ ?. (levy derived |=(n=term &((unique-value-name n derived) !(lien outer |=(x=term =(n x)))))) ~
12669+ `[action ordinary]
12670+::
12671+++ program-empty-null
12672+ |= e=expr
12673+ ^- ?
12674+ ?- -.e
12675+ %lit =(%null form.lit.e)
12676+ %cast $(e val.e)
12677+ %group $(e inner.e)
12678+ %body ?~(defs.e $(e final.e) |)
12679+ * |
12680+ ==
12681+::
12682+++ program-subs-empty
12683+ |= d=def
12684+ ^- ?
12685+ ?. ?=(%value -.d) |
12686+ ?- -.val.d
12687+ %gate (program-empty-null body.val.d)
12688+ %gate-wide (program-empty-null body.val.d)
12689+ * |
12690+ ==
12691+::
12692+++ program-transparent
12693+ |= e=expr
12694+ ^- expr
12695+ ?- -.e
12696+ %group $(e inner.e)
12697+ %cast $(e val.e)
12698+ %body ?~(defs.e $(e final.e) e)
12699+ * e
12700+ ==
12701+++ program-init-tuple-null
12702+ |= d=def
12703+ ^- ?
12704+ ?. ?=(%value -.d) |
12705+ ?. |(?=(%gate -.val.d) ?=(%gate-wide -.val.d)) |
12706+ =/ body=expr
12707+ ?- -.val.d
12708+ %gate body.val.d
12709+ %gate-wide body.val.d
12710+ * !!
12711+ ==
12712+ =. body (program-transparent body)
12713+ ?. ?=(%tuple -.body) |
12714+ ?~ items.body |
12715+ (program-empty-null val:(rear items.body))
12716+::
12717+:: Recover only the update of an already recognized direct program main.
12718+:: Its written sample determines the message/model relationship; the canonical
12719+:: cmd, unit and update slot determine the result context. Publication is
12720+:: component-local so later subscription/view/initializer retries can accumulate.
12721+++ program-update-context
12722+ |= [main=def parts=[init=term update=term view=term subs=term] ds=(list def) resolution=iresolved initial=istate]
12723+ ^- (unit iresolved)
12724+ =/ env=ienv env.resolution
12725+ ?^ (ienv-lookup %main env) ~
12726+ ?^ (ienv-lookup update.parts env) ~
12727+ =/ updates=(list def)
12728+ (skim ds |=(d=def &(?=(%value -.d) =(update.parts name.d))))
12729+ ?. ?=([* ~] updates) ~
12730+ =/ update-def=def i.updates
12731+ ?> ?=(%value -.update-def)
12732+ =/ written-update=(unit sample) (direct-gate-sample update-def)
12733+ ?~ written-update ~
12734+ ?. ?=(%cell -.u.written-update) ~
12735+ ?. ?=([* * ~] items.u.written-update) ~
12736+ ?~ prelude.initial ~
12737+ =/ program=(unit ischeme) (ienv-lookup %program values.u.prelude.initial)
12738+ ?~ program ~
12739+ =/ command=(unit ischeme) (find-jibb-mold %cmd u.prelude.initial)
12740+ =/ list-template=(unit ischeme) (find-jibb-mold %list u.prelude.initial)
12741+ ?~ command ~
12742+ ?~ list-template ~
12743+ =/ heads=(unit igate-prelude-evidence) (direct-prelude-evidence ds prelude.initial)
12744+ ?~ heads ~
12745+ =/ written=(unit def) (~(get by gates.u.heads) %program)
12746+ ?~ written ~
12747+ =/ written-sample=(unit sample) (direct-gate-sample u.written)
12748+ ?~ written-sample ~
12749+ ?. ?=(%cell -.u.written-sample) ~
12750+ ?. ?=([* * * * ~] items.u.written-sample) ~
12751+ =/ checked=(map term def)
12752+ (~(put by (direct-checked-gates ds env)) update.parts update-def)
12753+ =/ templates=ienv
12754+ (turn molds.u.prelude.initial |=(x=[name=term template=ischeme] [name.x template.x]))
12755+ =/ scanned=(unit dgscan)
12756+ (dg-all-env-ids (weld env (weld values.u.prelude.initial templates)) 32.768 ~)
12757+ ?~ scanned ~
12758+ =. next.initial (dg-next-id ids.u.scanned 0)
12759+ =/ update-state=istate (reserve-def-caps val.update-def initial)
12760+ =/ sam=isample-result (infer-sample u.written-update env update-state)
12761+ ?: ?=(%| -.sam) ~
12762+ =/ actual-sample=itype (itype-normalize typ.p.sam sub.state.p.sam)
12763+ ?. ?=(%cell -.actual-sample) ~
12764+ =/ message=(unit itype)
12765+ (direct-slot-body hed.actual-sample (direct-sample-name i.items.u.written-update))
12766+ =/ model=(unit itype)
12767+ (direct-slot-body tal.actual-sample (direct-sample-name i.t.items.u.written-update))
12768+ ?~ message ~
12769+ ?~ model ~
12770+ =/ cmd=(unit itype) (template-apply u.command ~[u.message])
12771+ ?~ cmd ~
12772+ =/ command-result=(unit itype) (template-apply u.list-template ~[u.cmd])
12773+ ?~ command-result ~
12774+ =/ product=itype [%cell u.model u.command-result]
12775+ =/ instance=[typ=itype state=istate] (instantiate-scheme u.program state.p.sam)
12776+ ?. ?=(%fn -.typ.instance) ~
12777+ ?. ?=(%cell -.sample.typ.instance) ~
12778+ ?. ?=(%cell -.tal.sample.typ.instance) ~
12779+ =/ expected-update=(unit itype)
12780+ (direct-slot-body hed.tal.sample.typ.instance (direct-sample-name i.t.items.u.written-sample))
12781+ ?~ expected-update ~
12782+ ?. ?=(%fn -.u.expected-update) ~
12783+ :: Sample binders are not value faces. Strip only those two slot faces
12784+ :: for the invariant canonical-gate proof; the source-faced gate is still
12785+ :: used by the complete positional call and final ordinary result cast.
12786+ =/ canonical-candidate=itype [%fn [%cell u.message u.model] product]
12787+ =/ gate-fit=ifit
12788+ (direct-invariant canonical-candidate u.expected-update sub.state.instance next.state.instance)
12789+ ?. ?=(%ok -.gate-fit) ~
12790+ =/ closed=itype
12791+ (itype-normalize [%fn typ.p.sam product] sub.gate-fit)
12792+ ?. ?=(%fn -.closed) ~
12793+ :: The closed product no longer needs the canonical slot substitutions.
12794+ :: Start the body at its ordinary sample state so existing branch retries
12795+ :: keep their substitution guards, but retain the shared fresh-ID high water.
12796+ =/ st=istate state.p.sam(next next.gate-fit, gate-defs checked, head-evidence heads)
12797+ =/ body=expr
12798+ ?- -.val.update-def
12799+ %gate body.val.update-def
12800+ %gate-wide body.val.update-def
12801+ * !!
12802+ ==
12803+ =/ inferred=iresult
12804+ (infer-call-context-arg body product.closed env.p.sam st (span-of body))
12805+ ?: ?=(%| -.inferred) ~
12806+ =/ product-fit=ifit
12807+ (itype-fit typ.p.inferred product.closed sub.state.p.inferred next.state.p.inferred)
12808+ ?. ?=(%ok -.product-fit) ~
12809+ =/ merged-product=itype
12810+ (itype-merge-faces typ.p.inferred product.closed sub.product-fit)
12811+ =/ actual-cast=itype [%fn typ.p.sam merged-product]
12812+ =/ cast=ifit
12813+ (itype-fit actual-cast closed sub.product-fit next.product-fit)
12814+ ?. ?=(%ok -.cast) ~
12815+ =/ merged=itype (itype-merge-faces actual-cast closed sub.cast)
12816+ =/ adjusted=iresult
12817+ [%& merged state.p.inferred(sub sub.cast, next next.cast)]
12818+ =/ added=(unit iadded-definition)
12819+ (add-supported-result update-def adjusted update-state env checked artifacts.resolution)
12820+ ?~ added ~
12821+ =/ recovered=(unit ischeme) (ienv-lookup update.parts env.u.added)
12822+ ?~ recovered ~
12823+ ?. ?=(~ vars.u.recovered) ~
12824+ ?. ?=(~ (itype-vars typ.u.recovered)) ~
12825+ `[env.u.added grouped.resolution artifacts.u.added]
12826+::
12827+++ program-inferred-slot
12828+ |= [typ=itype name=(unit term)]
12829+ ^- itype
12830+ ?~ name typ
12831+ ?: &(?=(%face -.typ) =(name.typ u.name)) body.typ
12832+ typ
12833+::
12834+++ program-inferred-sample
12835+ |= [typ=itype sam=sample]
12836+ ^- itype
12837+ (program-inferred-slot typ (direct-sample-name sam))
12838+::
12839+++ program-two-slot-names
12840+ |= sam=sample
12841+ ^- (unit [first=(unit term) second=(unit term)])
12842+ ?- -.sam
12843+ %cell
12844+ ?. ?=([* * ~] items.sam) ~
12845+ `[(direct-sample-name i.items.sam) (direct-sample-name i.t.items.sam)]
12846+ %face
12847+ ?. ?=(%cell -.shape.sam) ~
12848+ ?. ?=([* * ~] fields.shape.sam) ~
12849+ `[(direct-field-name i.fields.shape.sam) (direct-field-name i.t.fields.shape.sam)]
12850+ * ~
12851+ ==
12852+::
12853+:: Read message/model from the checked update and its written source layout.
12854+:: The source names strip only top-level sample binder faces; nested value
12855+:: faces remain part of the canonical message and model.
12856+++ program-update-relation
12857+ |= [name=term ds=(list def) env=ienv]
12858+ ^- (unit [message=itype model=itype])
12859+ =/ update=(unit ischeme) (ienv-lookup name env)
12860+ ?~ update ~
12861+ ?. ?=(~ vars.u.update) ~
12862+ ?. ?=(~ (itype-vars typ.u.update)) ~
12863+ ?. ?=(%fn -.typ.u.update) ~
12864+ ?. ?=(%cell -.sample.typ.u.update) ~
12865+ =/ defs=(list def)
12866+ (skim ds |=(d=def &(?=(%value -.d) =(name name.d))))
12867+ ?. ?=([* ~] defs) ~
12868+ =/ written=(unit sample) (direct-gate-sample i.defs)
12869+ ?~ written ~
12870+ ?. ?=(%cell -.u.written) ~
12871+ ?. ?=([* * ~] items.u.written) ~
12872+ =/ message=(unit itype)
12873+ (direct-slot-body hed.sample.typ.u.update (direct-sample-name i.items.u.written))
12874+ =/ model=(unit itype)
12875+ (direct-slot-body tal.sample.typ.u.update (direct-sample-name i.t.items.u.written))
12876+ ?~ message ~
12877+ ?~ model ~
12878+ `[u.message u.model]
12879+::
12880+:: Recover an unannotated direct subscription component from the checked
12881+:: update relation and canonical fourth program slot. This establishes only
12882+:: the value type; the final program watch proof remains separate.
12883+++ program-subs-context
12884+ |= [parts=[init=term update=term view=term subs=term] ds=(list def) resolution=iresolved initial=istate]
12885+ ^- (unit iresolved)
12886+ =/ env=ienv env.resolution
12887+ ?^ (ienv-lookup %main env) ~
12888+ ?^ (ienv-lookup subs.parts env) ~
12889+ =/ relation=(unit [message=itype model=itype])
12890+ (program-update-relation update.parts ds env)
12891+ ?~ relation ~
12892+ =/ subs=(list def)
12893+ (skim ds |=(d=def &(?=(%value -.d) =(subs.parts name.d))))
12894+ ?. ?=([* ~] subs) ~
12895+ =/ subs-def=def i.subs
12896+ ?> ?=(%value -.subs-def)
12897+ =/ written-subs=(unit sample) (direct-gate-sample subs-def)
12898+ ?~ written-subs ~
12899+ ?~ prelude.initial ~
12900+ =/ program=(unit ischeme) (ienv-lookup %program values.u.prelude.initial)
12901+ =/ sub=(unit ischeme) (find-jibb-mold %sub u.prelude.initial)
12902+ =/ list-template=(unit ischeme) (find-jibb-mold %list u.prelude.initial)
12903+ ?~ program ~
12904+ ?~ sub ~
12905+ ?~ list-template ~
12906+ =/ heads=(unit igate-prelude-evidence) (direct-prelude-evidence ds prelude.initial)
12907+ ?~ heads ~
12908+ =/ written=(unit def) (~(get by gates.u.heads) %program)
12909+ ?~ written ~
12910+ =/ written-sample=(unit sample) (direct-gate-sample u.written)
12911+ ?~ written-sample ~
12912+ ?. ?=(%cell -.u.written-sample) ~
12913+ ?. ?=([* * * * ~] items.u.written-sample) ~
12914+ =/ checked=(map term def) (direct-checked-gates ds env)
12915+ =/ templates=ienv
12916+ (turn molds.u.prelude.initial |=(x=[name=term template=ischeme] [name.x template.x]))
12917+ =/ scanned=(unit dgscan)
12918+ (dg-all-env-ids (weld env (weld values.u.prelude.initial templates)) 32.768 ~)
12919+ ?~ scanned ~
12920+ =. next.initial (dg-next-id ids.u.scanned 0)
12921+ =/ subs-state=istate (reserve-def-caps val.subs-def initial)
12922+ =/ sam=isample-result (infer-sample u.written-subs env subs-state)
12923+ ?: ?=(%| -.sam) ~
12924+ =/ actual-model=itype (program-inferred-sample typ.p.sam u.written-subs)
12925+ ?. ?=(~ (itype-vars actual-model)) ~
12926+ ?: (itype-has-tag actual-model) ~
12927+ =/ model-fit=ifit
12928+ (direct-invariant actual-model model.u.relation sub.state.p.sam next.state.p.sam)
12929+ ?. ?=(%ok -.model-fit) ~
12930+ =/ message-sub=(unit itype) (template-apply u.sub ~[message.u.relation])
12931+ ?~ message-sub ~
12932+ =/ product=(unit itype) (template-apply u.list-template ~[u.message-sub])
12933+ ?~ product ~
12934+ =/ instance=[typ=itype state=istate]
12935+ (instantiate-scheme u.program state.p.sam(sub sub.model-fit, next next.model-fit))
12936+ ?. ?=(%fn -.typ.instance) ~
12937+ ?. ?=(%cell -.sample.typ.instance) ~
12938+ ?. ?=(%cell -.tal.sample.typ.instance) ~
12939+ ?. ?=(%cell -.tal.tal.sample.typ.instance) ~
12940+ =/ expected-subs=(unit itype)
12941+ (direct-slot-body tal.tal.tal.sample.typ.instance (direct-sample-name i.t.t.t.items.u.written-sample))
12942+ ?~ expected-subs ~
12943+ ?. ?=(%fn -.u.expected-subs) ~
12944+ =/ canonical=itype [%fn model.u.relation u.product]
12945+ =/ gate-fit=ifit
12946+ (direct-invariant canonical u.expected-subs sub.state.instance next.state.instance)
12947+ ?. ?=(%ok -.gate-fit) ~
12948+ =/ closed=itype
12949+ (itype-normalize [%fn typ.p.sam u.product] sub.gate-fit)
12950+ ?. ?=(%fn -.closed) ~
12951+ =/ body=expr
12952+ ?- -.val.subs-def
12953+ %gate body.val.subs-def
12954+ %gate-wide body.val.subs-def
12955+ * !!
12956+ ==
12957+ =/ st=istate
12958+ state.p.sam(next next.gate-fit, gate-defs checked, head-evidence heads)
12959+ =/ inferred=iresult
12960+ (infer-call-context-arg body product.closed env.p.sam st (span-of body))
12961+ ?: ?=(%| -.inferred) ~
12962+ =/ product-fit=ifit
12963+ (itype-fit typ.p.inferred product.closed sub.state.p.inferred next.state.p.inferred)
12964+ ?. ?=(%ok -.product-fit) ~
12965+ =/ merged-product=itype
12966+ (itype-merge-faces typ.p.inferred product.closed sub.product-fit)
12967+ =/ actual-cast=itype [%fn typ.p.sam merged-product]
12968+ =/ cast=ifit
12969+ (itype-fit actual-cast closed sub.product-fit next.product-fit)
12970+ ?. ?=(%ok -.cast) ~
12971+ =/ merged=itype (itype-merge-faces actual-cast closed sub.cast)
12972+ =/ adjusted=iresult
12973+ [%& merged state.p.inferred(sub sub.cast, next next.cast)]
12974+ =/ added=(unit iadded-definition)
12975+ (add-supported-result subs-def adjusted subs-state env checked artifacts.resolution)
12976+ ?~ added ~
12977+ =/ recovered=(unit ischeme) (ienv-lookup subs.parts env.u.added)
12978+ ?~ recovered ~
12979+ ?. ?=(~ vars.u.recovered) ~
12980+ ?. ?=(~ (itype-vars typ.u.recovered)) ~
12981+ `[env.u.added grouped.resolution artifacts.u.added]
12982+::
12983++$ iview-site [xs=expr mapper=term]
12984+++ program-view-site
12985+ |= e=expr
12986+ ^- (unit iview-site)
12987+ =. e (program-transparent e)
12988+ ?. ?=(%call -.e) ~
12989+ ?. ?=([* ~] args.e) ~
12990+ =/ each=expr (program-transparent head.e)
12991+ ?. ?=(%wing -.each) ~
12992+ ?. ?=([%each ~] names.each) ~
12993+ =/ turned=expr (program-transparent i.args.e)
12994+ ?. ?=(%call -.turned) ~
12995+ ?. ?=([* * ~] args.turned) ~
12996+ =/ turn=expr (program-transparent head.turned)
12997+ ?. ?=(%wing -.turn) ~
12998+ ?. ?=([%turn ~] names.turn) ~
12999+ =/ xs=expr (program-transparent i.args.turned)
13000+ ?. ?=(%wing -.xs) ~
13001+ ?~ names.xs ~
13002+ =/ mapper=(unit term) (program-main-wing i.t.args.turned)
13003+ ?~ mapper ~
13004+ `[xs u.mapper]
13005+::
13006+++ program-recovery-names
13007+ |= ds=(list def)
13008+ ^- (list term)
13009+ =/ main=(unit def) (program-main-def ds)
13010+ ?~ main ~
13011+ =/ parts=(unit [init=term update=term view=term subs=term])
13012+ (program-main-parts u.main)
13013+ ?~ parts ~
13014+ =/ views=(list def)
13015+ (skim ds |=(d=def &(?=(%value -.d) =(view.u.parts name.d))))
13016+ ?. ?=([* ~] views) ~
13017+ =/ view-def=def i.views
13018+ ?> ?=(%value -.view-def)
13019+ =/ written=(unit sample) (direct-gate-sample view-def)
13020+ ?~ written ~
13021+ =/ body=expr
13022+ ?- -.val.view-def
13023+ %gate body.val.view-def
13024+ %gate-wide body.val.view-def
13025+ * !!
13026+ ==
13027+ =/ sites=(unit (list iview-site)) (program-view-sites body ~)
13028+ ?~ sites ~
13029+ ?. ?=([* ~] u.sites) ~
13030+ =/ mapper=term mapper.i.u.sites
13031+ =/ components=(list term)
13032+ :~ init.u.parts
13033+ update.u.parts
13034+ view.u.parts
13035+ subs.u.parts
13036+ ==
13037+ ?: (lien components |=(n=term =(n mapper))) ~
13038+ =/ mappers=(list def)
13039+ (skim ds |=(d=def &(?=(%value -.d) =(mapper name.d))))
13040+ ?. ?=([* ~] mappers) ~
13041+ :~ init.u.parts
13042+ update.u.parts
13043+ view.u.parts
13044+ subs.u.parts
13045+ mapper
13046+ ==
13047+::
13048+++ program-sample-binders
13049+ |= sam=sample
13050+ ^- (list term)
13051+ ?- -.sam
13052+ %bind ~[name.sam]
13053+ %face ~[name.sam]
13054+ %pun ~[name.sam]
13055+ %cell (zing (turn items.sam |=(s=sample (program-sample-binders s))))
13056+ * ~
13057+ ==
13058+::
13059+++ program-pattern-binders
13060+ |= pat=pattern
13061+ ^- (list term)
13062+ ?- -.pat
13063+ %bind ~[name.pat]
13064+ %cell (zing (turn items.pat |=(p=pattern (program-pattern-binders p))))
13065+ * ~
13066+ ==
13067+::
13068+++ program-view-sites-merge
13069+ |= [a=(unit (list iview-site)) b=(unit (list iview-site))]
13070+ ^- (unit (list iview-site))
13071+ ?~ a ~
13072+ ?~ b ~
13073+ `(weld u.a u.b)
13074+::
13075+++ program-view-sites-exprs
13076+ |= [xs=(list expr) locals=(list term)]
13077+ ^- (unit (list iview-site))
13078+ ?~ xs `~
13079+ (program-view-sites-merge (program-view-sites i.xs locals) $(xs t.xs))
13080+::
13081+++ program-view-sites-items
13082+ |= [xs=(list item) locals=(list term)]
13083+ ^- (unit (list iview-site))
13084+ ?~ xs `~
13085+ (program-view-sites-merge (program-view-sites val.i.xs locals) $(xs t.xs))
13086+::
13087+++ program-view-sites-pieces
13088+ |= [xs=(list piece) locals=(list term)]
13089+ ^- (unit (list iview-site))
13090+ ?~ xs `~
13091+ =/ here=(unit (list iview-site))
13092+ ?- -.i.xs
13093+ %expr (program-view-sites p.i.xs locals)
13094+ %text `~
13095+ ==
13096+ (program-view-sites-merge here $(xs t.xs))
13097+::
13098+++ program-view-sites-qsegs
13099+ |= [xs=(list qseg) locals=(list term)]
13100+ ^- (unit (list iview-site))
13101+ ?~ xs `~
13102+ =/ here=(unit (list iview-site))
13103+ ?- -.i.xs
13104+ %expr (program-view-sites p.i.xs locals)
13105+ %knot `~
13106+ ==
13107+ (program-view-sites-merge here $(xs t.xs))
13108+::
13109+++ program-view-sites-edits
13110+ |= [xs=(list edit) locals=(list term)]
13111+ ^- (unit (list iview-site))
13112+ ?~ xs `~
13113+ (program-view-sites-merge (program-view-sites val.i.xs locals) $(xs t.xs))
13114+::
13115+++ program-view-sites-defs
13116+ |= [xs=(list def) locals=(list term)]
13117+ ^- (unit (list iview-site))
13118+ ?~ xs `~
13119+ =/ here=(unit (list iview-site))
13120+ ?: ?=(%mold -.i.xs) `~
13121+ (program-view-sites val.i.xs locals)
13122+ (program-view-sites-merge here $(xs t.xs))
13123+::
13124+++ program-view-sites-arms
13125+ |= [xs=(list arm) locals=(list term)]
13126+ ^- (unit (list iview-site))
13127+ ?~ xs `~
13128+ =/ nested=(list term) (weld (program-pattern-binders pat.i.xs) locals)
13129+ (program-view-sites-merge (program-view-sites val.i.xs nested) $(xs t.xs))
13130+::
13131+++ program-view-sites
13132+ |= [e=expr locals=(list term)]
13133+ ^- (unit (list iview-site))
13134+ =/ site=(unit iview-site) (program-view-site e)
13135+ ?^ site
13136+ =/ names=(list term) ~[%each %turn mapper.u.site]
13137+ ?> ?=(%wing -.xs.u.site)
13138+ =/ root=term (rear names.xs.u.site)
13139+ ?: |((lien names |=(n=term (lien locals |=(x=term =(n x))))) (lien locals |=(x=term =(root x))))
13140+ ~
13141+ `~[u.site]
13142+ ?- -.e
13143+ %str (program-view-sites-pieces pieces.e locals)
13144+ %qath (program-view-sites-qsegs segs.e locals)
13145+ %change (program-view-sites-edits edits.e locals)
13146+ %pair (program-view-sites val.e locals)
13147+ %unit (program-view-sites val.e locals)
13148+ %group (program-view-sites inner.e locals)
13149+ %list (program-view-sites-exprs items.e locals)
13150+ %tuple (program-view-sites-items items.e locals)
13151+ %gate
13152+ (program-view-sites body.e (weld (program-sample-binders sample.e) locals))
13153+ %gate-wide
13154+ (program-view-sites body.e (weld (program-sample-binders sample.e) locals))
13155+ %call
13156+ (program-view-sites-merge (program-view-sites head.e locals) (program-view-sites-exprs args.e locals))
13157+ %cast (program-view-sites val.e locals)
13158+ %trace
13159+ (program-view-sites-merge (program-view-sites val.e locals) (program-view-sites then.e locals))
13160+ %branch
13161+ (program-view-sites-merge (program-view-sites subject.e locals) (program-view-sites-arms arms.e locals))
13162+ %body
13163+ =/ nested=(list term) (weld (global-value-names defs.e) locals)
13164+ (program-view-sites-merge (program-view-sites-defs defs.e nested) (program-view-sites final.e nested))
13165+ * `~
13166+ ==
13167+::
13168+++ program-union-tag-case
13169+ |= [expected=itype tag=@]
13170+ ^- (unit itype)
13171+ ?. ?=(%union -.expected) ~
13172+ =/ remaining=(list itype) cases.expected
13173+ =/ found=(unit itype) ~
13174+ =/ seen=(set @) *(set @)
13175+ |-
13176+ ?~ remaining found
13177+ =/ case=itype i.remaining
13178+ =/ head=(unit @)
13179+ ?: ?=(%const -.case) `val.literal.case
13180+ ?. ?=(%cell -.case) ~
13181+ ?. ?=(%const -.hed.case) ~
13182+ `val.literal.hed.case
13183+ ?~ head ~
13184+ ?: (~(has in:..zuse seen) u.head) ~
13185+ =. seen (~(put in:..zuse seen) u.head)
13186+ =? found =(tag u.head)
13187+ ?^(found ~ `case)
13188+ $(remaining t.remaining)
13189+::
13190+++ program-single-case-fit
13191+ |= [actual=itype expected=itype sub=isub next=@ud]
13192+ ^- ifit
13193+ =. actual (itype-normalize actual sub)
13194+ =. expected (itype-normalize expected sub)
13195+ ?. ?=(%union -.expected) [%unknown ~]
13196+ =/ found=(unit itype)
13197+ ?: ?=(%const -.actual) `actual
13198+ ?: ?=(%tag -.actual) `actual
13199+ ?: ?=(%cell -.actual) `actual
13200+ ?. ?=(%union -.actual) ~
13201+ ?. ?=([* ~] cases.actual) ~
13202+ `i.cases.actual
13203+ ?~ found [%unknown ~]
13204+ =/ case=itype u.found
13205+ =/ tag=(unit lit)
13206+ ?: ?=(%const -.case) `literal.case
13207+ ?: ?=(%tag -.case) `literal.case
13208+ ?. ?=(%cell -.case) ~
13209+ =/ head=itype (projection-field-target hed.case)
13210+ ?: ?=(%const -.head) `literal.head
13211+ ?: ?=(%tag -.head) `literal.head
13212+ ~
13213+ ?~ tag [%unknown ~]
13214+ =/ chosen=(unit itype) (program-union-tag-case expected val.u.tag)
13215+ ?~ chosen [%unknown ~]
13216+ ?: |(?=(%const -.case) ?=(%tag -.case))
13217+ ?. ?=(%const -.u.chosen) [%unknown ~]
13218+ (itype-fit case u.chosen sub next)
13219+ ?. ?=(%cell -.case) [%unknown ~]
13220+ ?. ?=(%cell -.u.chosen) [%unknown ~]
13221+ =/ head-fit=ifit (itype-fit hed.case hed.u.chosen sub next)
13222+ ?. ?=(%ok -.head-fit) head-fit
13223+ (itype-fit tal.case tal.u.chosen sub.head-fit next.head-fit)
13224+::
13225+++ program-single-generic-fit
13226+ |= [actual=itype expected=itype sub=isub next=@ud]
13227+ ^- ifit
13228+ =. actual (itype-normalize actual sub)
13229+ =. expected (itype-normalize expected sub)
13230+ ?. &(?=(%union -.actual) ?=(%union -.expected)) [%unknown ~]
13231+ ?~ origin.actual [%unknown ~]
13232+ ?. =(origin.actual origin.expected) [%unknown ~]
13233+ ?. ?=([* ~] args.actual) [%unknown ~]
13234+ ?. ?=([* ~] args.expected) [%unknown ~]
13235+ =/ argument-fit=ifit (direct-invariant i.args.actual i.args.expected sub next)
13236+ ?: ?=(%ok -.argument-fit) argument-fit
13237+ (program-single-case-fit i.args.actual i.args.expected sub next)
13238+::
13239+++ program-keyed-product-fit
13240+ |= [actual=itype expected=itype element=ischeme sub=isub next=@ud]
13241+ ^- ifit
13242+ =. actual (itype-normalize actual sub)
13243+ =. expected (itype-normalize expected sub)
13244+ ?. &(?=(%cell -.actual) ?=(%cell -.expected)) [%unknown ~]
13245+ =/ key-fit=ifit
13246+ (itype-fit (projection-field-target hed.actual) (projection-field-target hed.expected) sub next)
13247+ ?. ?=(%ok -.key-fit) key-fit
13248+ =/ actual-el=itype
13249+ (itype-normalize (projection-field-target tal.actual) sub.key-fit)
13250+ =/ expected-el=itype
13251+ (itype-normalize (projection-field-target tal.expected) sub.key-fit)
13252+ ?. &(?=(%union -.actual-el) ?=(%union -.expected-el)) [%unknown ~]
13253+ ?. =(origin.actual-el origin.expected-el) [%unknown ~]
13254+ ?. ?=([* ~] args.actual-el) [%unknown ~]
13255+ ?. ?=([* ~] args.expected-el) [%unknown ~]
13256+ =/ canonical-actual=(unit itype)
13257+ (template-apply element ~[i.args.actual-el])
13258+ =/ canonical-expected=(unit itype)
13259+ (template-apply element ~[i.args.expected-el])
13260+ ?~ canonical-actual [%unknown ~]
13261+ ?~ canonical-expected [%unknown ~]
13262+ =/ actual-check=ifit
13263+ (direct-invariant actual-el u.canonical-actual sub.key-fit next.key-fit)
13264+ ?. ?=(%ok -.actual-check) actual-check
13265+ =/ expected-check=ifit
13266+ (direct-invariant expected-el u.canonical-expected sub.actual-check next.actual-check)
13267+ ?. ?=(%ok -.expected-check) expected-check
13268+ =/ case-fit=ifit
13269+ (program-single-case-fit i.args.actual-el i.args.expected-el sub.expected-check next.expected-check)
13270+ case-fit
13271+::
13272+:: A direct view without a keyed each/turn site still needs the message type
13273+:: from the checked update. Recover only that closed component; final main
13274+:: checking remains the canonical program-kind boundary.
13275+++ program-plain-view-context
13276+ |= [parts=[init=term update=term view=term subs=term] ds=(list def) resolution=iresolved initial=istate]
13277+ ^- (unit iresolved)
13278+ =/ env=ienv env.resolution
13279+ ?^ (ienv-lookup %main env) ~
13280+ ?^ (ienv-lookup view.parts env) ~
13281+ =/ relation=(unit [message=itype model=itype])
13282+ (program-update-relation update.parts ds env)
13283+ ?~ relation ~
13284+ =/ views=(list def)
13285+ (skim ds |=(d=def &(?=(%value -.d) =(view.parts name.d))))
13286+ ?. ?=([* ~] views) ~
13287+ =/ view-def=def i.views
13288+ ?> ?=(%value -.view-def)
13289+ =/ written-view=(unit sample) (direct-gate-sample view-def)
13290+ ?~ written-view ~
13291+ =/ body=expr
13292+ ?- -.val.view-def
13293+ %gate body.val.view-def
13294+ %gate-wide body.val.view-def
13295+ * !!
13296+ ==
13297+ =/ sites=(unit (list iview-site)) (program-view-sites body ~)
13298+ ?~ sites ~
13299+ ?^ u.sites ~
13300+ ?~ prelude.initial ~
13301+ ?~ (ienv-lookup %program values.u.prelude.initial) ~
13302+ =/ element=(unit ischeme) (find-jibb-mold %element u.prelude.initial)
13303+ ?~ element ~
13304+ =/ heads=(unit igate-prelude-evidence) (direct-prelude-evidence ds prelude.initial)
13305+ ?~ heads ~
13306+ ?~ (~(get by gates.u.heads) %program) ~
13307+ =/ checked=(map term def) (direct-checked-gates ds env)
13308+ =/ templates=ienv
13309+ (turn molds.u.prelude.initial |=(x=[name=term template=ischeme] [name.x template.x]))
13310+ =/ scanned=(unit dgscan)
13311+ (dg-all-env-ids (weld env (weld values.u.prelude.initial templates)) 32.768 ~)
13312+ ?~ scanned ~
13313+ =. next.initial (dg-next-id ids.u.scanned 0)
13314+ =/ view-state=istate (reserve-def-caps val.view-def initial)
13315+ =/ sam=isample-result (infer-sample u.written-view env view-state)
13316+ ?: ?=(%| -.sam) ~
13317+ =/ actual-model=itype (program-inferred-sample typ.p.sam u.written-view)
13318+ ?. ?=(~ (itype-vars actual-model)) ~
13319+ ?: (itype-has-tag actual-model) ~
13320+ =/ model-fit=ifit
13321+ (direct-invariant actual-model model.u.relation sub.state.p.sam next.state.p.sam)
13322+ ?. ?=(%ok -.model-fit) ~
13323+ =/ product=(unit itype) (template-apply u.element ~[message.u.relation])
13324+ ?~ product ~
13325+ =/ st=istate
13326+ state.p.sam(sub sub.model-fit, next next.model-fit, gate-defs checked, head-evidence heads)
13327+ =/ inferred=iresult
13328+ (infer-call-context-arg body u.product env.p.sam st (span-of body))
13329+ ?: ?=(%| -.inferred) ~
13330+ =/ product-fit=ifit
13331+ (itype-fit typ.p.inferred u.product sub.state.p.inferred next.state.p.inferred)
13332+ ?. ?=(%ok -.product-fit) ~
13333+ =/ merged-product=itype
13334+ (itype-merge-faces typ.p.inferred u.product sub.product-fit)
13335+ =/ actual-cast=itype [%fn typ.p.sam merged-product]
13336+ =/ closed=itype [%fn typ.p.sam u.product]
13337+ =/ cast=ifit
13338+ (itype-fit actual-cast closed sub.product-fit next.product-fit)
13339+ ?. ?=(%ok -.cast) ~
13340+ =/ merged=itype (itype-merge-faces actual-cast closed sub.cast)
13341+ =/ adjusted=iresult
13342+ [%& merged state.p.inferred(sub sub.cast, next next.cast)]
13343+ =/ added=(unit iadded-definition)
13344+ (add-supported-result view-def adjusted view-state env checked artifacts.resolution)
13345+ ?~ added ~
13346+ =/ recovered=(unit ischeme) (ienv-lookup view.parts env.u.added)
13347+ ?~ recovered ~
13348+ ?. ?=(~ vars.u.recovered) ~
13349+ ?. ?=(~ (itype-vars typ.u.recovered)) ~
13350+ `[env.u.added grouped.resolution artifacts.u.added]
13351+::
13352+:: Recover exactly one direct keyed each/turn row mapper, then its view.
13353+:: The prelude's own each and turn schemes determine the mapper gate: the
13354+:: key is inferred from the mapper body, never selected by this recovery.
13355+++ program-view-context
13356+ |= [parts=[init=term update=term view=term subs=term] ds=(list def) resolution=iresolved initial=istate]
13357+ ^- (unit iresolved)
13358+ =/ env=ienv env.resolution
13359+ ?^ (ienv-lookup %main env) ~
13360+ ?^ (ienv-lookup view.parts env) ~
13361+ =/ relation=(unit [message=itype model=itype])
13362+ (program-update-relation update.parts ds env)
13363+ ?~ relation ~
13364+ =/ views=(list def)
13365+ (skim ds |=(d=def &(?=(%value -.d) =(view.parts name.d))))
13366+ ?. ?=([* ~] views) ~
13367+ =/ view-def=def i.views
13368+ ?> ?=(%value -.view-def)
13369+ =/ written-view=(unit sample) (direct-gate-sample view-def)
13370+ ?~ written-view ~
13371+ =/ view-body=expr
13372+ ?- -.val.view-def
13373+ %gate body.val.view-def
13374+ %gate-wide body.val.view-def
13375+ * !!
13376+ ==
13377+ =/ sites=(unit (list iview-site)) (program-view-sites view-body ~)
13378+ ?~ sites ~
13379+ ?. ?=([* ~] u.sites) ~
13380+ =/ site=iview-site i.u.sites
13381+ =/ component-names=(list term) ~[init.parts update.parts view.parts subs.parts]
13382+ ?: (lien component-names |=(n=term =(n mapper.site))) ~
13383+ ?^ (ienv-lookup mapper.site env) ~
13384+ =/ mappers=(list def)
13385+ (skim ds |=(d=def &(?=(%value -.d) =(mapper.site name.d))))
13386+ ?. ?=([* ~] mappers) ~
13387+ =/ mapper-def=def i.mappers
13388+ ?> ?=(%value -.mapper-def)
13389+ =/ written-mapper=(unit sample) (direct-gate-sample mapper-def)
13390+ ?~ written-mapper ~
13391+ ?~ prelude.initial ~
13392+ =/ program=(unit ischeme) (ienv-lookup %program values.u.prelude.initial)
13393+ =/ each-scheme=(unit ischeme) (ienv-lookup %each values.u.prelude.initial)
13394+ =/ turn-scheme=(unit ischeme) (ienv-lookup %turn values.u.prelude.initial)
13395+ =/ element=(unit ischeme) (find-jibb-mold %element u.prelude.initial)
13396+ =/ list-template=(unit ischeme) (find-jibb-mold %list u.prelude.initial)
13397+ ?~ program ~
13398+ ?~ each-scheme ~
13399+ ?~ turn-scheme ~
13400+ ?~ element ~
13401+ ?~ list-template ~
13402+ =/ heads=(unit igate-prelude-evidence) (direct-prelude-evidence ds prelude.initial)
13403+ ?~ heads ~
13404+ =/ written-program=(unit def) (~(get by gates.u.heads) %program)
13405+ =/ written-each=(unit def) (~(get by gates.u.heads) %each)
13406+ =/ written-turn=(unit def) (~(get by gates.u.heads) %turn)
13407+ ?~ written-program ~
13408+ ?~ written-each ~
13409+ ?~ written-turn ~
13410+ =/ program-sample=(unit sample) (direct-gate-sample u.written-program)
13411+ =/ each-sample=(unit sample) (direct-gate-sample u.written-each)
13412+ =/ turn-sample=(unit sample) (direct-gate-sample u.written-turn)
13413+ ?~ program-sample ~
13414+ ?~ each-sample ~
13415+ ?~ turn-sample ~
13416+ ?. ?=(%cell -.u.program-sample) ~
13417+ ?. ?=([* * * * ~] items.u.program-sample) ~
13418+ =/ turn-names=(unit [first=(unit term) second=(unit term)])
13419+ (program-two-slot-names u.turn-sample)
13420+ ?~ turn-names ~
13421+ =/ checked=(map term def) (direct-checked-gates ds env)
13422+ =/ templates=ienv
13423+ (turn molds.u.prelude.initial |=(x=[name=term template=ischeme] [name.x template.x]))
13424+ =/ scanned=(unit dgscan)
13425+ (dg-all-env-ids (weld env (weld values.u.prelude.initial templates)) 32.768 ~)
13426+ ?~ scanned ~
13427+ =. next.initial (dg-next-id ids.u.scanned 0)
13428+ =/ view-state=istate (reserve-def-caps val.view-def initial)
13429+ =/ sam=isample-result (infer-sample u.written-view env view-state)
13430+ ?: ?=(%| -.sam) ~
13431+ =/ actual-model=itype (program-inferred-sample typ.p.sam u.written-view)
13432+ =/ model-fit=ifit
13433+ (direct-invariant actual-model model.u.relation sub.state.p.sam next.state.p.sam)
13434+ ?. ?=(%ok -.model-fit) ~
13435+ =/ xs-result=iresult
13436+ (infer-fragment xs.site env.p.sam state.p.sam(sub sub.model-fit, next next.model-fit))
13437+ ?: ?=(%| -.xs-result) ~
13438+ =/ element-var=itype [%var next.state.p.xs-result]
13439+ =/ list-a=(unit itype) (template-apply u.list-template ~[element-var])
13440+ ?~ list-a ~
13441+ =/ xs-fit=ifit
13442+ (itype-fit typ.p.xs-result u.list-a sub.state.p.xs-result +(next.state.p.xs-result))
13443+ ?. ?=(%ok -.xs-fit) ~
13444+ =/ closed-xs=itype (itype-normalize u.list-a sub.xs-fit)
13445+ ?^ (itype-vars closed-xs) ~
13446+ ?: (itype-has-tag closed-xs) ~
13447+ =/ each-instance=[typ=itype state=istate]
13448+ (instantiate-scheme u.each-scheme state.p.xs-result(sub sub.xs-fit, next next.xs-fit))
13449+ ?. ?=(%fn -.typ.each-instance) ~
13450+ =/ turn-instance=[typ=itype state=istate]
13451+ (instantiate-scheme u.turn-scheme state.each-instance)
13452+ ?. ?=(%fn -.typ.turn-instance) ~
13453+ ?. ?=(%cell -.sample.typ.turn-instance) ~
13454+ =/ element-message=(unit itype)
13455+ (template-apply u.element ~[message.u.relation])
13456+ ?~ element-message ~
13457+ =/ each-fit=ifit
13458+ (itype-fit product.typ.each-instance u.element-message sub.state.turn-instance next.state.turn-instance)
13459+ ?. ?=(%ok -.each-fit) ~
13460+ =/ each-input=itype
13461+ (program-inferred-sample sample.typ.each-instance u.each-sample)
13462+ =/ turn-fit=ifit
13463+ (itype-fit product.typ.turn-instance each-input sub.each-fit next.each-fit)
13464+ ?. ?=(%ok -.turn-fit) ~
13465+ =/ turn-list=itype
13466+ (program-inferred-slot hed.sample.typ.turn-instance first.u.turn-names)
13467+ =/ list-fit=ifit
13468+ (itype-fit closed-xs turn-list sub.turn-fit next.turn-fit)
13469+ ?. ?=(%ok -.list-fit) ~
13470+ =/ mapper-type=itype
13471+ (program-inferred-slot tal.sample.typ.turn-instance second.u.turn-names)
13472+ =/ expected-mapper=itype (itype-normalize mapper-type sub.list-fit)
13473+ ?. ?=(%fn -.expected-mapper) ~
13474+ ?^ (itype-vars sample.expected-mapper) ~
13475+ ?: (itype-has-tag sample.expected-mapper) ~
13476+ :: These faces come from the source-backed each sample. Keeping them in
13477+ :: the expected mapper product lets ordinary tuple inference supply key/el.
13478+ ?. ?=(%cell -.product.expected-mapper) ~
13479+ ?. ?=(%face -.hed.product.expected-mapper) ~
13480+ ?. =(%key name.hed.product.expected-mapper) ~
13481+ ?. ?=(%face -.tal.product.expected-mapper) ~
13482+ ?. =(%el name.tal.product.expected-mapper) ~
13483+ =/ mapper-state=istate
13484+ (reserve-def-caps val.mapper-def initial(next next.list-fit))
13485+ =/ mapper-sam=isample-result (infer-sample u.written-mapper env mapper-state)
13486+ ?: ?=(%| -.mapper-sam) ~
13487+ =/ mapper-input=itype (program-inferred-sample typ.p.mapper-sam u.written-mapper)
13488+ =/ mapper-sample-fit=ifit
13489+ (direct-invariant mapper-input sample.expected-mapper sub.state.p.mapper-sam next.state.p.mapper-sam)
13490+ ?. ?=(%ok -.mapper-sample-fit) ~
13491+ =/ mapper-product=itype
13492+ (itype-normalize product.expected-mapper sub.mapper-sample-fit)
13493+ =/ mapper-body=expr
13494+ ?- -.val.mapper-def
13495+ %gate body.val.mapper-def
13496+ %gate-wide body.val.mapper-def
13497+ * !!
13498+ ==
13499+ =/ mapper-inferred=iresult
13500+ (infer-call-context-arg mapper-body mapper-product env.p.mapper-sam state.p.mapper-sam(sub sub.mapper-sample-fit, next next.mapper-sample-fit) (span-of mapper-body))
13501+ ?: ?=(%| -.mapper-inferred) ~
13502+ =/ ordinary-product-fit=ifit
13503+ (itype-fit typ.p.mapper-inferred mapper-product sub.state.p.mapper-inferred next.state.p.mapper-inferred)
13504+ =/ mapper-product-fit=ifit
13505+ ?: ?=(%ok -.ordinary-product-fit) ordinary-product-fit
13506+ (program-keyed-product-fit typ.p.mapper-inferred mapper-product u.element sub.state.p.mapper-inferred next.state.p.mapper-inferred)
13507+ ?. ?=(%ok -.mapper-product-fit) ~
13508+ =/ closed-mapper-product=itype
13509+ (itype-normalize mapper-product sub.mapper-product-fit)
13510+ ?^ (itype-vars closed-mapper-product) ~
13511+ ?: (itype-has-tag closed-mapper-product) ~
13512+ =/ merged-mapper-product=itype
13513+ (itype-merge-faces typ.p.mapper-inferred closed-mapper-product sub.mapper-product-fit)
13514+ =/ mapper-cast=itype [%fn typ.p.mapper-sam merged-mapper-product]
13515+ =/ closed-mapper=itype [%fn typ.p.mapper-sam closed-mapper-product]
13516+ =/ mapper-cast-fit=ifit
13517+ (itype-fit mapper-cast closed-mapper sub.mapper-product-fit next.mapper-product-fit)
13518+ ?. ?=(%ok -.mapper-cast-fit) ~
13519+ =/ merged-mapper=itype
13520+ (itype-merge-faces mapper-cast closed-mapper sub.mapper-cast-fit)
13521+ =/ mapper-adjusted=iresult
13522+ [%& merged-mapper state.p.mapper-inferred(sub sub.mapper-cast-fit, next next.mapper-cast-fit)]
13523+ =/ mapper-added=(unit iadded-definition)
13524+ (add-supported-result mapper-def mapper-adjusted mapper-state env checked artifacts.resolution)
13525+ ?~ mapper-added ~
13526+ =/ mapper-scheme=(unit ischeme) (ienv-lookup mapper.site env.u.mapper-added)
13527+ ?~ mapper-scheme ~
13528+ ?. ?=(~ vars.u.mapper-scheme) ~
13529+ ?. ?=(~ (itype-vars typ.u.mapper-scheme)) ~
13530+ =/ program-instance=[typ=itype state=istate]
13531+ (instantiate-scheme u.program state.p.sam(next next.mapper-cast-fit))
13532+ ?. ?=(%fn -.typ.program-instance) ~
13533+ ?. ?=(%cell -.sample.typ.program-instance) ~
13534+ ?. ?=(%cell -.tal.sample.typ.program-instance) ~
13535+ ?. ?=(%cell -.tal.tal.sample.typ.program-instance) ~
13536+ =/ expected-view=(unit itype)
13537+ (direct-slot-body hed.tal.tal.sample.typ.program-instance (direct-sample-name i.t.t.items.u.program-sample))
13538+ ?~ expected-view ~
13539+ ?. ?=(%fn -.u.expected-view) ~
13540+ =/ canonical-view=itype [%fn model.u.relation u.element-message]
13541+ =/ view-fit=ifit
13542+ (direct-invariant canonical-view u.expected-view sub.state.program-instance next.state.program-instance)
13543+ ?. ?=(%ok -.view-fit) ~
13544+ =/ closed-view=itype
13545+ (itype-normalize [%fn typ.p.sam u.element-message] sub.view-fit)
13546+ ?. ?=(%fn -.closed-view) ~
13547+ =/ view-env=ienv [[mapper.site u.mapper-scheme] env.p.sam]
13548+ =/ final-view-state=istate
13549+ (reserve-def-caps val.view-def state.p.sam(next next.view-fit, gate-defs checked.u.mapper-added, head-evidence heads))
13550+ =/ inferred=iresult
13551+ (infer-call-context-arg view-body product.closed-view view-env final-view-state (span-of view-body))
13552+ ?: ?=(%| -.inferred) ~
13553+ =/ product-fit=ifit
13554+ (itype-fit typ.p.inferred product.closed-view sub.state.p.inferred next.state.p.inferred)
13555+ ?. ?=(%ok -.product-fit) ~
13556+ =/ merged-product=itype
13557+ (itype-merge-faces typ.p.inferred product.closed-view sub.product-fit)
13558+ =/ actual-cast=itype [%fn typ.p.sam merged-product]
13559+ =/ cast=ifit
13560+ (itype-fit actual-cast closed-view sub.product-fit next.product-fit)
13561+ ?. ?=(%ok -.cast) ~
13562+ =/ merged=itype (itype-merge-faces actual-cast closed-view sub.cast)
13563+ =/ adjusted=iresult
13564+ [%& merged state.p.inferred(sub sub.cast, next next.cast)]
13565+ =/ added=(unit iadded-definition)
13566+ (add-supported-result view-def adjusted final-view-state env.u.mapper-added checked.u.mapper-added artifacts.u.mapper-added)
13567+ ?~ added ~
13568+ =/ recovered=(unit ischeme) (ienv-lookup view.parts env.u.added)
13569+ ?~ recovered ~
13570+ ?. ?=(~ vars.u.recovered) ~
13571+ ?. ?=(~ (itype-vars typ.u.recovered)) ~
13572+ `[env.u.added grouped.resolution artifacts.u.added]
13573+::
13574+++ program-init-null-sample
13575+ |= d=def
13576+ ^- ?
13577+ =/ written=(unit sample) (direct-gate-sample d)
13578+ ?~ written |
13579+ ?. ?=(%bare -.u.written) |
13580+ =/ sh=shape shape.u.written
13581+ ?. ?=(%const -.sh) |
13582+ =(%null form.lit.sh)
13583+::
13584+:: The tuple-ending-null initializer retry above intentionally keeps its own
13585+:: boundary. A direct null-sample initializer can instead receive the closed
13586+:: model already established by update, view and subscriptions.
13587+++ program-plain-init-context
13588+ |= [parts=[init=term update=term view=term subs=term] ds=(list def) resolution=iresolved initial=istate]
13589+ ^- (unit iresolved)
13590+ =/ env=ienv env.resolution
13591+ ?^ (ienv-lookup %main env) ~
13592+ ?^ (ienv-lookup init.parts env) ~
13593+ ?~ (ienv-lookup update.parts env) ~
13594+ ?~ (ienv-lookup view.parts env) ~
13595+ ?~ (ienv-lookup subs.parts env) ~
13596+ =/ relation=(unit [message=itype model=itype])
13597+ (program-update-relation update.parts ds env)
13598+ ?~ relation ~
13599+ =/ inits=(list def)
13600+ (skim ds |=(d=def &(?=(%value -.d) =(init.parts name.d))))
13601+ ?. ?=([* ~] inits) ~
13602+ =/ init-def=def i.inits
13603+ ?> ?=(%value -.init-def)
13604+ ?. (program-init-null-sample init-def) ~
13605+ =/ written=(unit sample) (direct-gate-sample init-def)
13606+ ?~ written ~
13607+ =/ body=expr
13608+ ?- -.val.init-def
13609+ %gate body.val.init-def
13610+ %gate-wide body.val.init-def
13611+ * !!
13612+ ==
13613+ ?~ prelude.initial ~
13614+ ?~ (ienv-lookup %program values.u.prelude.initial) ~
13615+ =/ heads=(unit igate-prelude-evidence) (direct-prelude-evidence ds prelude.initial)
13616+ ?~ heads ~
13617+ ?~ (~(get by gates.u.heads) %program) ~
13618+ =/ checked=(map term def) (direct-checked-gates ds env)
13619+ =/ templates=ienv
13620+ (turn molds.u.prelude.initial |=(x=[name=term template=ischeme] [name.x template.x]))
13621+ =/ scanned=(unit dgscan)
13622+ (dg-all-env-ids (weld env (weld values.u.prelude.initial templates)) 32.768 ~)
13623+ ?~ scanned ~
13624+ =. next.initial (dg-next-id ids.u.scanned 0)
13625+ =/ init-state=istate (reserve-def-caps val.init-def initial)
13626+ =/ sam=isample-result (infer-sample u.written env init-state)
13627+ ?: ?=(%| -.sam) ~
13628+ ?. ?=(~ (itype-vars typ.p.sam)) ~
13629+ ?: (itype-has-tag typ.p.sam) ~
13630+ =/ st=istate state.p.sam(gate-defs checked, head-evidence heads)
13631+ =/ inferred=iresult
13632+ (infer-call-context-arg body model.u.relation env.p.sam st (span-of body))
13633+ ?: ?=(%| -.inferred) ~
13634+ =/ product-fit=ifit
13635+ (itype-fit typ.p.inferred model.u.relation sub.state.p.inferred next.state.p.inferred)
13636+ ?. ?=(%ok -.product-fit) ~
13637+ =/ merged-product=itype
13638+ (itype-merge-faces typ.p.inferred model.u.relation sub.product-fit)
13639+ =/ actual-cast=itype [%fn typ.p.sam merged-product]
13640+ =/ closed=itype [%fn typ.p.sam model.u.relation]
13641+ =/ cast=ifit
13642+ (itype-fit actual-cast closed sub.product-fit next.product-fit)
13643+ ?. ?=(%ok -.cast) ~
13644+ =/ merged=itype (itype-merge-faces actual-cast closed sub.cast)
13645+ =/ adjusted=iresult
13646+ [%& merged state.p.inferred(sub sub.cast, next next.cast)]
13647+ =/ added=(unit iadded-definition)
13648+ (add-supported-result init-def adjusted init-state env checked artifacts.resolution)
13649+ ?~ added ~
13650+ =/ recovered=(unit ischeme) (ienv-lookup init.parts env.u.added)
13651+ ?~ recovered ~
13652+ ?. ?=(~ vars.u.recovered) ~
13653+ ?. ?=(~ (itype-vars typ.u.recovered)) ~
13654+ `[env.u.added grouped.resolution artifacts.u.added]
13655+::
13656+:: Recover only the initializer of an already recognized direct program main.
13657+:: The derived call is evidence for an ordinary init/main retry, never an
13658+:: interface to publish on its own. Any failure returns the original resolution.
13659+++ program-init-context
13660+ |= [main=def parts=[init=term update=term view=term subs=term] ds=(list def) resolution=iresolved initial=istate]
13661+ ^- (unit iresolved)
13662+ =/ env=ienv env.resolution
13663+ ?^ (ienv-lookup %main env) ~
13664+ ?^ (ienv-lookup init.parts env) ~
13665+ =/ update=(unit ischeme) (ienv-lookup update.parts env)
13666+ =/ view=(unit ischeme) (ienv-lookup view.parts env)
13667+ =/ subs=(unit ischeme) (ienv-lookup subs.parts env)
13668+ ?~ update ~
13669+ ?~ view ~
13670+ ?~ subs ~
13671+ =/ inits=(list def)
13672+ (skim ds |=(d=def &(?=(%value -.d) =(init.parts name.d))))
13673+ ?. ?=([* ~] inits) ~
13674+ =/ init-def=def i.inits
13675+ ?> ?=(%value -.init-def)
13676+ ?. (program-init-tuple-null init-def) ~
13677+ =/ args=(unit (list expr)) (program-main-args main)
13678+ ?~ args ~
13679+ ?~ prelude.initial ~
13680+ =/ program=(unit ischeme) (ienv-lookup %program values.u.prelude.initial)
13681+ ?~ program ~
13682+ =/ heads=(unit igate-prelude-evidence) (direct-prelude-evidence ds prelude.initial)
13683+ ?~ heads ~
13684+ =/ written=(unit def) (~(get by gates.u.heads) %program)
13685+ ?~ written ~
13686+ =/ written-sample=(unit sample) (direct-gate-sample u.written)
13687+ ?~ written-sample ~
13688+ ?. ?=(%cell -.u.written-sample) ~
13689+ ?~ items.u.written-sample ~
13690+ =/ checked=(map term def) (direct-checked-gates ds env)
13691+ =/ templates=ienv
13692+ (turn molds.u.prelude.initial |=(x=[name=term template=ischeme] [name.x template.x]))
13693+ =/ scanned=(unit dgscan)
13694+ (dg-all-env-ids (weld env (weld values.u.prelude.initial templates)) 32.768 ~)
13695+ ?~ scanned ~
13696+ =. next.initial (dg-next-id ids.u.scanned 0)
13697+ =/ instance=[typ=itype state=istate] (instantiate-scheme u.program initial)
13698+ ?. ?=(%fn -.typ.instance) ~
13699+ ?. ?=(%cell -.sample.typ.instance) ~
13700+ =/ expected-init=(unit itype)
13701+ (direct-slot-body hed.sample.typ.instance (direct-sample-name i.items.u.written-sample))
13702+ ?~ expected-init ~
13703+ ?. ?=(%fn -.u.expected-init) ~
13704+ ?. ?=(%var -.sample.u.expected-init) ~
13705+ =/ data=@ud id.sample.u.expected-init
13706+ =/ init-var=itype [%var next.state.instance]
13707+ =/ st=istate state.instance(next +(next.state.instance))
13708+ =/ up=[typ=itype state=istate] (instantiate-scheme u.update st)
13709+ =/ vw=[typ=itype state=istate] (instantiate-scheme u.view state.up)
13710+ =/ sb=[typ=itype state=istate] (instantiate-scheme u.subs state.vw)
13711+ =. st state.sb(gate-defs checked, head-evidence heads)
13712+ =/ actual=itype [%cell init-var [%cell typ.up [%cell typ.vw typ.sb]]]
13713+ =/ fit=ifit
13714+ (direct-positional-fit u.args items.u.written-sample actual sample.typ.instance env st sub.st next.st)
13715+ ?. ?=(%ok -.fit) ~
13716+ =/ actual-final=itype (itype-normalize actual sub.fit)
13717+ =/ expected-final=itype (itype-normalize sample.typ.instance sub.fit)
13718+ =/ open=(list @ud)
13719+ (unique-type-vars (weld (itype-vars actual-final) (itype-vars expected-final)))
13720+ ?. (levy open |=(n=@ud =(data n))) ~
13721+ ?: |((itype-has-tag actual-final) (itype-has-tag expected-final)) ~
13722+ =/ replay=ifit
13723+ (direct-positional-fit u.args items.u.written-sample actual sample.typ.instance env st sub.fit next.fit)
13724+ ?. ?=(%ok -.replay) ~
13725+ ?. &(=(sub.fit sub.replay) =(next.fit next.replay)) ~
13726+ =/ expected=itype (itype-normalize u.expected-init sub.fit)
13727+ ?. ?=(%fn -.expected) ~
13728+ =. st st(sub sub.fit, next next.fit)
13729+ =/ init-state=istate (reserve-def-caps val.init-def st)
13730+ =/ inferred=iresult (infer-fragment val.init-def env init-state)
13731+ =? inferred ?=(%| -.inferred) (infer-recursive-gate init-def env init-state)
13732+ ?: ?=(%| -.inferred) ~
13733+ ?. ?=(%fn -.typ.p.inferred) ~
13734+ ?^ (itype-vars sample.typ.p.inferred) ~
13735+ =/ data-fit=ifit
13736+ (itype-fit sample.typ.p.inferred sample.expected sub.state.p.inferred next.state.p.inferred)
13737+ ?. ?=(%ok -.data-fit) ~
13738+ =/ closed=itype (itype-normalize expected sub.data-fit)
13739+ ?. ?=(%fn -.closed) ~
13740+ :: Resolve the ordinary tuple cast first, then check the complete gate.
13741+ :: General function fit remains unchanged; only this recovered candidate
13742+ :: receives the derived result context before its whole-type cast fit.
13743+ =/ product-fit=ifit
13744+ (itype-fit product.typ.p.inferred product.closed sub.data-fit next.data-fit)
13745+ ?. ?=(%ok -.product-fit) ~
13746+ =/ product=itype
13747+ (itype-merge-faces product.typ.p.inferred product.closed sub.product-fit)
13748+ =/ actual-cast=itype [%fn sample.typ.p.inferred product]
13749+ =/ cast=ifit
13750+ (itype-fit actual-cast closed sub.product-fit next.product-fit)
13751+ ?. ?=(%ok -.cast) ~
13752+ =/ merged=itype (itype-merge-faces actual-cast closed sub.cast)
13753+ =/ adjusted=iresult
13754+ [%& merged state.p.inferred(sub sub.cast, next next.cast)]
13755+ =/ added=(unit iadded-definition)
13756+ (add-supported-result init-def adjusted init-state env checked artifacts.resolution)
13757+ ?~ added ~
13758+ =/ recovered=(unit ischeme) (ienv-lookup init.parts env.u.added)
13759+ ?~ recovered ~
13760+ ?. ?=(~ vars.u.recovered) ~
13761+ ?. ?=(~ (itype-vars typ.u.recovered)) ~
13762+ `[env.u.added grouped.resolution artifacts.u.added]
13763+::
13764+++ derived-poke-command-scheme
13765+ |= [prelude=ifile action=itype]
13766+ ^- (unit ischeme)
13767+ =/ prep=iprelude [prelude ~ ~]
13768+ =/ raw=(unit ischeme) (compatible-raw-poke prep)
13769+ ?~ raw ~
13770+ =/ command=(unit ischeme) (find-jibb-mold %cmd prelude)
13771+ =/ unit-template=(unit ischeme) (find-jibb-mold %unit prelude)
13772+ ?~ command ~
13773+ ?~ unit-template ~
13774+ ?. (standard-unit-template u.unit-template /lib/jibb/prelude/jibb) ~
13775+ ?. ?=([@ ~] vars.u.command) ~
13776+ ?. ?=(%union -.typ.u.command) ~
13777+ ?. =(origin.typ.u.command `[/lib/jibb/prelude/jibb %cmd]) ~
13778+ ?. (identity-union-parameters vars.u.command args.typ.u.command) ~
13779+ =/ m=@ud i.vars.u.command
13780+ ?: (itype-var-is-atom m typ.u.command) ~
13781+ ?. (levy (itype-vars typ.u.command) |=(n=@ud =(n m))) ~
13782+ ?: (itype-has-tag typ.u.command) ~
13783+ =/ error=(unit itype) (template-apply u.unit-template ~[[%atom %t]])
13784+ ?~ error ~
13785+ ?. ?=(%union -.typ.u.raw) ~
13786+ =/ poke-case=itype
13787+ [%cell [%const [%term %tas %poke '%poke']] [%cell [%face %p typ.u.raw(label `'raw-poke.internal')] [%face %reply [%fn u.error [%var m]]]]]
13788+ =/ go-case=itype
13789+ [%cell [%const [%term %tas %go '%go']] [%face %url [%atom %t]]]
13790+ =/ wait-case=itype
13791+ [%cell [%const [%term %tas %wait '%wait']] [%cell [%face %gap [%atom %dr]] [%face %msg [%var m]]]]
13792+ =/ now-case=itype
13793+ [%cell [%const [%term %tas %now '%now']] [%face %reply [%fn [%atom %da] [%var m]]]]
13794+ =/ who-case=itype
13795+ [%cell [%const [%term %tas %who '%who']] [%face %reply [%fn [%atom %p] [%var m]]]]
13796+ ?. =(cases.typ.u.command ~[poke-case go-case wait-case now-case who-case]) ~
13797+ =/ command-result=(unit itype) (template-apply u.command ~[[%var 0]])
13798+ ?~ command-result ~
13799+ `[[%fn [%cell action [%fn u.error [%var 0]]] u.command-result] ~[0]]
13800+::
13801+++ store-derived-schemes
13802+ |= [prelude=ifile values=(list term) molds=(list term) state=itype action=itype]
13803+ ^- (unit [state=ischeme action=ischeme])
13804+ =/ prep=iprelude [prelude values molds]
13805+ =/ ask=(unit ischeme) (request-compatible-ask prep)
13806+ ?~ ask ~
13807+ ?^ (itype-vars state) ~
13808+ ?^ (itype-vars action) ~
13809+ ?: |((itype-has-tag state) (itype-has-tag action)) ~
13810+ =/ result=(unit itype) (template-apply u.ask ~[[%var 0]])
13811+ ?~ result ~
13812+ =/ request=ischeme [[%fn [%fn state [%var 0]] u.result] ~[0]]
13813+ =/ constructor=(unit ischeme) (derived-poke-command-scheme prelude action)
13814+ ?~ constructor ~
13815+ `[request u.constructor]
13816+::
13817+++ program-subs-watch
13818+ |= [d=def imports=ijimports graph=irequest-graph prelude=ifile]
13819+ ^- ?
13820+ ?. ?=(%value -.d) |
13821+ ?. |(?=(%gate -.val.d) ?=(%gate-wide -.val.d)) |
13822+ =/ body=expr
13823+ ?- -.val.d
13824+ %gate body.val.d
13825+ %gate-wide body.val.d
13826+ * val.d
13827+ ==
13828+ =. body (program-transparent body)
13829+ ?. ?=(%list -.body) |
13830+ ?. ?=([* ~] items.body) |
13831+ =/ watch=expr (program-transparent i.items.body)
13832+ ?. ?=(%tuple -.watch) |
13833+ ?. ?=([* * ~] items.watch) |
13834+ =/ tag=item i.items.watch
13835+ =/ payload=item i.t.items.watch
13836+ ?. &(?=(~ face.tag) ?=(~ face.payload)) |
13837+ =/ tag-expr=expr (program-transparent val.tag)
13838+ ?. ?=(%lit -.tag-expr) |
13839+ ?. &(?=(%term form.lit.tag-expr) =(%watch val.lit.tag-expr)) |
13840+ =/ request=expr (program-transparent val.payload)
13841+ ?. ?=(%call -.request) |
13842+ ?. ?=([* ~] args.request) |
13843+ =/ head=expr (program-transparent head.request)
13844+ ?. ?=(%wing -.head) |
13845+ ?. ?=([@ @ ~] names.head) |
13846+ =/ case=term i.names.head
13847+ =/ face=term i.t.names.head
13848+ =/ callback=expr (program-transparent i.args.request)
13849+ ?. ?=(%ctor -.callback) |
13850+ ?. ?=(%term form.tag.callback) |
13851+ ?| ?=(^ (derived-request-member case face imports graph prelude))
13852+ ?=(^ (derived-store-request-member case face imports graph prelude))
13853+ ==
13854+::
13855+:: Exact derived-member and request-evidence identity, shared by direct
13856+:: program watches and direct data-page loads. Only a plain request in the
13857+:: selected interface's own source-backed graph can establish this shape.
13858+++ derived-request-member
13859+ |= [case=term face=term imports=ijimports graph=irequest-graph prelude=ifile]
13860+ ^- (unit ischeme)
13861+ =/ selected=(list [face=term interface=ifile])
13862+ (skim imports |=(j=[face=term interface=ifile] =(face face.j)))
13863+ ?. ?=([* ~] selected) ~
13864+ =/ iface=ifile interface.i.selected
13865+ =/ member=(unit ischeme) (ienv-lookup case values.iface)
13866+ ?~ member ~
13867+ ?~ source.iface ~
13868+ =/ evidence=(list irequest-evidence)
13869+ (skim requests.graph |=(r=irequest-evidence &(=(api-at.r at.iface) =(name.r case))))
13870+ ?. ?=([* ~] evidence) ~
13871+ =/ request-evidence=irequest-evidence i.evidence
13872+ ?. =(u.source.iface api-source.request-evidence) ~
13873+ ?. =(name.path.path.request-evidence case) ~
13874+ ?~ graph.iface ~
13875+ ?. (lien requests.u.graph.iface |=(r=irequest-evidence =(r request-evidence))) ~
13876+ ?. ?=(~ scry.path.path.request-evidence) ~
13877+ ?. &(?=(~ diffs.path.request-evidence) ?=(~ diffs.path.path.request-evidence)) ~
13878+ ?: (lien segments.path.path.request-evidence |=(p=pseg !?=(%knot -.p))) ~
13879+ ?. ?=([@ ~] vars.u.member) ~
13880+ =/ message=@ud i.vars.u.member
13881+ ?. ?=(%fn -.typ.u.member) ~
13882+ ?. ?=(%fn -.sample.typ.u.member) ~
13883+ ?. =(sample.sample.typ.u.member full.path.request-evidence) ~
13884+ ?. =(product.sample.typ.u.member [%var message]) ~
13885+ =/ prep=iprelude [prelude prelude-values.graph prelude-molds.graph]
13886+ =/ ask=(unit ischeme) (request-compatible-ask prep)
13887+ ?~ ask ~
13888+ =/ result=(unit itype) (template-apply u.ask ~[[%var message]])
13889+ ?~ result ~
13890+ ?. =(product.typ.u.member u.result) ~
13891+ member
13892+::
13893+:: Store state is watchable by definition, but only the actual derived member
13894+:: of the uniquely selected source-bound store interface proves that fact.
13895+++ derived-store-request-member
13896+ |= [case=term face=term imports=ijimports graph=irequest-graph prelude=ifile]
13897+ ^- (unit ischeme)
13898+ ?. =(%state case) ~
13899+ =/ selected=(list [face=term interface=ifile])
13900+ (skim imports |=(j=[face=term interface=ifile] =(face face.j)))
13901+ ?. ?=([* ~] selected) ~
13902+ =/ iface=ifile interface.i.selected
13903+ =/ member=(unit ischeme) (ienv-lookup %state values.iface)
13904+ ?~ member ~
13905+ ?~ source.iface ~
13906+ =/ evidence=(list istore-request-evidence)
13907+ (skim stores.graph |=(r=istore-request-evidence =(store-at.r at.iface)))
13908+ ?. ?=([* ~] evidence) ~
13909+ =/ request=istore-request-evidence i.evidence
13910+ ?. =(u.source.iface source.request) ~
13911+ ?~ graph.iface ~
13912+ ?. (lien stores.u.graph.iface |=(r=istore-request-evidence =(r request))) ~
13913+ =/ derived=(unit [state=ischeme action=ischeme])
13914+ (store-derived-schemes prelude prelude-values.graph prelude-molds.graph state.request action.request)
13915+ ?~ derived ~
13916+ ?. =(u.member state.u.derived) ~
13917+ =/ constructor=(unit ischeme) (ienv-lookup action-name.request values.iface)
13918+ ?~ constructor ~
13919+ ?. =(u.constructor action.u.derived) ~
13920+ member
13921+::
13922+++ program-main-context
13923+ |= [main=def ds=(list def) resolution=iresolved initial=istate]
13924+ ^- iresolved
13925+ ?^ (ienv-lookup %main env.resolution) resolution
13926+ =/ heads=(unit igate-prelude-evidence)
13927+ (direct-prelude-evidence ds prelude.initial)
13928+ ?~ heads resolution
13929+ =/ checked=(map term def) (direct-checked-gates ds env.resolution)
13930+ =/ completed=[env=ienv artifacts=(list iwidth-definition)]
13931+ (add-supported-defs-core ~[main] ds checked heads env.resolution molds.initial globals.initial externals.initial surs.initial mark-externals.initial marks.initial jimports.initial reserved-molds.initial at.initial prelude.initial artifacts.resolution grec-index.initial)
13932+ [env.completed grouped.resolution artifacts.completed]
13933+::
13934+:: A static main may retain a generic element message in its ordinary
13935+:: scheme. Instantiate that scheme, specialize it to canonical element !!,
13936+:: and publish only the resulting closed scheme.
13937+++ static-main-specialized
13938+ |= [env=ienv prelude=(unit ifile)]
13939+ ^- (unit ischeme)
13940+ ?~ prelude ~
13941+ =/ element=(unit ischeme) (find-jibb-mold %element u.prelude)
13942+ ?~ element ~
13943+ =/ main=(unit ischeme) (ienv-lookup %main env)
13944+ ?~ main ~
13945+ =/ canonical=(unit itype) (template-apply u.element ~[[%empty ~]])
13946+ ?~ canonical ~
13947+ =/ instance=[typ=itype state=istate] (instantiate-scheme u.main *istate)
13948+ =/ fit=ifit (itype-fit typ.instance u.canonical ~ next.state.instance)
13949+ ?. ?=(%ok -.fit) ~
13950+ =/ closed=itype (itype-normalize typ.instance sub.fit)
13951+ ?^ (itype-vars closed) ~
13952+ ?: (itype-has-tag closed) ~
13953+ ?. ?=(%union -.closed) ~
13954+ ?. ?=(%union -.u.canonical) ~
13955+ ?. &(=(origin.closed origin.u.canonical) =(args.closed args.u.canonical)) ~
13956+ =/ exact=ifit (direct-invariant closed u.canonical ~ next.fit)
13957+ ?. ?=(%ok -.exact) ~
13958+ `[u.canonical ~]
13959+::
13960+:: The load of a direct data page must itself be a direct gate whose
13961+:: transparent body is one plain derived request with a wing or ctor reply.
13962+++ page-load-derived
13963+ |= [name=term ds=(list def) imports=ijimports graph=irequest-graph prelude=ifile]
13964+ ^- ?
13965+ =/ loads=(list def)
13966+ (skim ds |=(d=def &(?=(%value -.d) =(name name.d))))
13967+ ?. ?=([* ~] loads) |
13968+ =/ load=def i.loads
13969+ ?> ?=(%value -.load)
13970+ ?. |(?=(%gate -.val.load) ?=(%gate-wide -.val.load)) |
13971+ =/ body=expr
13972+ ?- -.val.load
13973+ %gate body.val.load
13974+ %gate-wide body.val.load
13975+ * !!
13976+ ==
13977+ =. body (program-transparent body)
13978+ ?. ?=(%call -.body) |
13979+ ?. ?=([* ~] args.body) |
13980+ =/ head=expr (program-transparent head.body)
13981+ ?. ?=(%wing -.head) |
13982+ ?. ?=([@ @ ~] names.head) |
13983+ =/ reply=expr (program-transparent i.args.body)
13984+ ?. ?| &(?=(%wing -.reply) ?=([@ ~] names.reply))
13985+ &(?=(%ctor -.reply) ?=(%term form.tag.reply))
13986+ ==
13987+ |
13988+ ?=(^ (derived-request-member i.names.head i.t.names.head imports graph prelude))
13989+::
13990+++ page-main-closed
13991+ |= [parts=[load=term view=term] ds=(list def) env=ienv prelude=(unit ifile) imports=ijimports graph=irequest-graph]
13992+ ^- ?
13993+ ?~ prelude |
13994+ =/ page=(unit ischeme) (find-jibb-mold %page u.prelude)
13995+ ?~ page |
13996+ =/ main=(unit ischeme) (ienv-lookup %main env)
13997+ ?~ main |
13998+ ?. ?=(~ vars.u.main) |
13999+ ?. ?=(~ (itype-vars typ.u.main)) |
14000+ =/ instance=[typ=itype state=istate] (instantiate-scheme u.page *istate)
14001+ =/ main-fit=ifit (direct-invariant typ.u.main typ.instance ~ next.state.instance)
14002+ ?. ?=(%ok -.main-fit) |
14003+ (page-load-derived load.parts ds imports graph u.prelude)
14004+::
14005+++ program-main-closed
14006+ |= [parts=[init=term update=term view=term subs=term] ds=(list def) env=ienv prelude=(unit ifile) imports=ijimports graph=irequest-graph]
14007+ ^- ?
14008+ ?~ prelude |
14009+ ?~ (ienv-lookup %program values.u.prelude) |
14010+ =/ program=(unit ischeme) (find-jibb-mold %program u.prelude)
14011+ ?~ program |
14012+ =/ main=(unit ischeme) (ienv-lookup %main env)
14013+ ?~ main |
14014+ ?. ?=(~ vars.u.main) |
14015+ ?. ?=(~ (itype-vars typ.u.main)) |
14016+ =/ instance=[typ=itype state=istate] (instantiate-scheme u.program *istate)
14017+ =/ main-fit=ifit (direct-invariant typ.u.main typ.instance ~ next.state.instance)
14018+ ?. ?=(%ok -.main-fit) |
14019+ =/ init=(unit ischeme) (ienv-lookup init.parts env)
14020+ ?~ init |
14021+ ?. ?=(~ vars.u.init) |
14022+ ?. ?=(%fn -.typ.u.init) |
14023+ ?. ?=(~ (itype-vars sample.typ.u.init)) |
14024+ ?. ?=(~ (itype-vars product.typ.u.init)) |
14025+ =/ data=igate-free (gate-free-type sample.typ.u.init 256 ~)
14026+ ?. =(%yes verdict.data) |
14027+ =/ model=igate-free (gate-free-type product.typ.u.init left.data ~)
14028+ ?. =(%yes verdict.model) |
14029+ =/ subs=(list def)
14030+ (skim ds |=(d=def &(?=(%value -.d) =(subs.parts name.d))))
14031+ ?. ?=([* ~] subs) |
14032+ |((program-subs-empty i.subs) (program-subs-watch i.subs imports graph u.prelude))
14033+::
14034+:: The two outer sample faces are binder names, not part of the action/state
14035+:: relation. Leave every face inside either component untouched.
14036+++ store-update-unfaced
14037+ |= typ=itype
14038+ ^- itype
14039+ ?. ?=(%fn -.typ) typ
14040+ ?. ?=(%cell -.sample.typ) typ
14041+ =/ head=itype hed.sample.typ
14042+ =/ tail=itype tal.sample.typ
14043+ =? head ?=(%face -.head) body.head
14044+ =? tail ?=(%face -.tail) body.tail
14045+ typ(sample [%cell head tail])
14046+::
14047+:: The builder erases the action from main. Recover it only from the local
14048+:: poke mold and check both ordinary components invariantly.
14049+++ store-main-closed
14050+ |= [parts=[init=term update=term] action=term env=ienv molds=imold-types prelude=(unit ifile)]
14051+ ^- (unit ischeme)
14052+ ?~ prelude ~
14053+ =/ builder=(unit ischeme) (ienv-lookup %store values.u.prelude)
14054+ ?~ builder ~
14055+ ?. ?=([@ @ ~] vars.u.builder) ~
14056+ =/ state-var=@ud i.vars.u.builder
14057+ =/ action-var=@ud i.t.vars.u.builder
14058+ ?: =(state-var action-var) ~
14059+ =/ builder-sample=itype
14060+ [%cell [%face %init [%var state-var]] [%face %update [%fn [%cell [%var action-var] [%var state-var]] [%var state-var]]]]
14061+ =/ builder-product=itype [%cell [%face %init [%var state-var]] [%face %update [%noun ~]]]
14062+ ?. =(typ.u.builder [%fn builder-sample builder-product]) ~
14063+ =/ store=(unit ischeme) (find-jibb-mold %store u.prelude)
14064+ ?~ store ~
14065+ ?. ?=([@ ~] vars.u.store) ~
14066+ ?. =(typ.u.store [%cell [%face %init [%var i.vars.u.store]] [%face %update [%noun ~]]]) ~
14067+ =/ state=(unit ischeme) (find-jibb-mold %state [~ molds /tmp ~ ~ ~ ~ ~])
14068+ ?~ state ~
14069+ =/ action-mold=(unit ischeme) (find-jibb-mold action [~ molds /tmp ~ ~ ~ ~ ~])
14070+ ?~ action-mold ~
14071+ ?. &(?=(~ vars.u.state) ?=(~ (itype-vars typ.u.state))) ~
14072+ ?. &(?=(~ vars.u.action-mold) ?=(~ (itype-vars typ.u.action-mold))) ~
14073+ =/ canonical=(unit itype) (template-apply u.store ~[typ.u.state])
14074+ ?~ canonical ~
14075+ =/ main=(unit ischeme) (ienv-lookup %main env)
14076+ =/ main-fit=(unit ifit)
14077+ ?~(main ~ `(direct-invariant typ.u.main u.canonical ~ 0))
14078+ =/ main-ok=?
14079+ ?~ main &
14080+ ?. ?=(~ vars.u.main) |
14081+ ?. ?=(~ (itype-vars typ.u.main)) |
14082+ ?~ main-fit |
14083+ ?=(%ok -.u.main-fit)
14084+ ?. main-ok ~
14085+ =/ init=(unit ischeme) (ienv-lookup init.parts env)
14086+ ?~ init ~
14087+ ?. ?=(~ vars.u.init) ~
14088+ ?. ?=(~ (itype-vars typ.u.init)) ~
14089+ =/ init-fit=ifit (direct-invariant typ.u.init typ.u.state ~ 0)
14090+ ?. ?=(%ok -.init-fit) ~
14091+ =/ update=(unit ischeme) (ienv-lookup update.parts env)
14092+ ?~ update ~
14093+ ?. ?=(~ vars.u.update) ~
14094+ ?. ?=(~ (itype-vars typ.u.update)) ~
14095+ =/ expected=itype [%fn [%cell typ.u.action-mold typ.u.state] typ.u.state]
14096+ =/ update-fit=ifit (direct-invariant (store-update-unfaced typ.u.update) expected ~ 0)
14097+ ?. ?=(%ok -.update-fit) ~
14098+ `[u.canonical ~]
14099+::
1244614100++ infer-jibb-file
1244714101 |= [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)]
1244814102 ^- jfile-result
@@ -12459,10 +14113,12 @@
1245914113 =/ mod=module p.parsed
1246014114 =/ duplicate=(unit idiag) (duplicate-defs defs.mod)
1246114115 ?^ duplicate [%| [(show-duplicate-fields at src u.duplicate) ~]]
14116+ ?: &(?=([%ui %api *] at) ?=(^ (program-main-def defs.mod)))
14117+ [%| [(crip "module kind needs unsupported inference: {(spud at)}") ~]]
1246214118 ?: ?=([%ui %api *] at)
1246314119 =/ iface=(unit ifile) (api-poke-interface at mod mark-externals prelude-values prelude-molds prelude)
1246414120 ?^ iface
12465− =/ checked=ifile u.iface(source `src, graph `[(silt `(list path)`~[at]) ~ modules prelude prelude-values prelude-molds externals mark-externals])
14121+ =/ checked=ifile u.iface(source `src, graph `[(silt `(list path)`~[at]) ~ ~ modules prelude prelude-values prelude-molds externals mark-externals])
1246614122 [%& [checked [[at checked] cache]]]
1246714123 ?~ prelude [%| [(crip "API module needs unsupported inference: {(spud at)}") ~]]
1246814124 =/ prepared=iprelude [u.prelude prelude-values prelude-molds]
@@ -12481,18 +14137,29 @@
1248114137 (multi-request-interface-graph at src externals mark-externals modules active cache `prepared)
1248214138 ?: ?=(%| -.multi) [%| [(crip "API module needs unsupported inference: {(spud at)}") ~]]
1248314139 [%& [iface.p.multi [[at iface.p.multi] cache.p.multi]]]
12484− ?. (module-scope-valid mod prelude-values prelude-molds)
12485− ?: (pending-declared-poke at mod prelude-values prelude-molds)
12486− [%| [(crip "module kind or scope needs unsupported inference: {(spud at)}") ~]]
12487− [%| [(crip "module has conflicting names: {(spud at)}") ~]]
12488− =/ vals=(list term) (global-value-names defs.mod)
12489− ?: (lien vals |=(n=term =(n %main)))
14140+ =/ main=(unit def) (program-main-def defs.mod)
14141+ =/ main-parts=(unit [init=term update=term view=term subs=term])
14142+ ?~(main ~ (program-main-parts u.main))
14143+ =/ page-parts=(unit [load=term view=term])
14144+ ?~(main ~ (page-main-parts u.main))
14145+ =/ store-parts=(unit [init=term update=term])
14146+ ?~(main ~ (store-main-parts u.main))
14147+ =/ declared=(unit istore-declaration)
14148+ ?~(store-parts ~ (store-declaration mod prelude-values prelude-molds))
14149+ ?: &(?=(^ store-parts) ?=(~ declared))
14150+ [%| [(crip "module kind or scope needs unsupported inference: {(spud at)}") ~]]
14151+ ?: &(?=([%ui %stores *] at) ?=(^ main) ?=(~ store-parts))
1249014152 [%| [(crip "module kind needs unsupported inference: {(spud at)}") ~]]
14153+ =/ ds=(list def) ?~(declared defs.mod defs.u.declared)
14154+ =/ checking=module mod(defs ds)
14155+ ?. (module-scope-valid checking prelude-values prelude-molds)
14156+ [%| [(crip "module has conflicting names: {(spud at)}") ~]]
14157+ =/ vals=(list term) (global-value-names ds)
1249114158 =/ js=jimports-detailed-result (resolve-jibb-imports-detailed imports.mod externals mark-externals modules active prelude-values prelude-molds cache prelude)
1249214159 ?: ?=(%| -.js) [%| p.js]
1249314160 =/ collected=grec-collected
12494− ?^ imports.mod [(collect-simple-molds defs.mod) *(map term shape)]
12495− (grec-collect-molds defs.mod)
14161+ ?^ imports.mod [(collect-simple-molds ds) *(map term shape)]
14162+ (grec-collect-molds ds)
1249614163 =/ molds=imolds molds.collected
1249714164 =/ globals=(list term) (weld prelude-values (weld (import-binding-names imports.mod) vals))
1249814165 =/ surs=(list term) (collect-sur-imports imports.mod)
@@ -12523,24 +14190,96 @@
1252314190 [%| [msg `[at src name.witness cases.witness]]]
1252414191 =/ resolution=iresolved
1252514192 ?~ index
12526− (resolve-groups defs.mod molds globals externals surs mark-externals marks resolved.p.js reserved at prelude)
12527− (resolve-groups-core defs.mod molds globals externals surs mark-externals marks resolved.p.js reserved at prelude index)
14193+ (resolve-groups ds molds globals externals surs mark-externals marks resolved.p.js reserved at prelude)
14194+ (resolve-groups-core ds molds globals externals surs mark-externals marks resolved.p.js reserved at prelude index)
1252814195 =/ env=ienv env.resolution
14196+ =/ recovered=iresolved
14197+ ?~ main resolution
14198+ ?~ main-parts resolution
14199+ =/ updated=(unit iresolved)
14200+ (program-update-context u.main u.main-parts ds resolution state)
14201+ =/ with-update=iresolved ?~(updated resolution u.updated)
14202+ =/ subscribed=(unit iresolved)
14203+ (program-subs-context u.main-parts ds with-update state)
14204+ =/ with-subs=iresolved ?~(subscribed with-update u.subscribed)
14205+ =/ viewed=(unit iresolved)
14206+ (program-view-context u.main-parts ds with-subs state)
14207+ =/ with-keyed-view=iresolved ?~(viewed with-subs u.viewed)
14208+ =/ plain-view=(unit iresolved)
14209+ ?^(viewed ~ (program-plain-view-context u.main-parts ds with-keyed-view state))
14210+ =/ with-view=iresolved ?~(plain-view with-keyed-view u.plain-view)
14211+ =/ initialized=(unit iresolved)
14212+ (program-init-context u.main u.main-parts ds with-view state)
14213+ =/ with-initialized=iresolved ?~(initialized with-view u.initialized)
14214+ =/ plain-init=(unit iresolved)
14215+ ?^(initialized ~ (program-plain-init-context u.main-parts ds with-initialized state))
14216+ =/ components=iresolved ?~(plain-init with-initialized u.plain-init)
14217+ (program-main-context u.main ds components state)
14218+ =. env env.recovered
14219+ =. artifacts.resolution artifacts.recovered
1252914220 =. env
12530− ?: (module-values-complete defs.mod env) env
14221+ ?: (module-values-complete ds env) env
1253114222 ?: |(?=([%ui %stores *] at) ?=(^ imports.mod) ?=(^ prelude) ?=(^ prelude-values) ?=(^ prelude-molds)) env
1253214223 ?: (gth (met 3 src) 65.536) env
12533− ?: (gth (lent defs.mod) 64) env
12534− ?. (dg-source-candidate defs.mod 64) env
14224+ ?: (gth (lent ds) 64) env
14225+ ?. (dg-source-candidate ds 64) env
1253514226 =/ transaction=(unit dgcommit) (dg-root-source at src)
1253614227 ?~ transaction env
1253714228 ?: (dg-interface-safe env.u.transaction) env.u.transaction
1253814229 env
12539− ?. (module-values-complete defs.mod env)
14230+ =/ required=(list def)
14231+ ?~ store-parts ds
14232+ (skim ds |=(d=def !&(?=(%value -.d) =(%main name.d))))
14233+ ?. (module-values-complete required env)
14234+ =/ pending=(unit [at=span msg=tape]) (module-pending-tag required env state 64)
14235+ ?^ pending
14236+ [%| [(show-error src [at line.beg.at.u.pending col.beg.at.u.pending msg.u.pending]) ~]]
1254014237 [%| [(crip "module definitions need unsupported inference: {(spud at)}") ~]]
12541− =/ initial=irequest-graph [(silt `(list path)`~[at]) ~ modules prelude prelude-values prelude-molds externals mark-externals]
14238+ =/ initial=irequest-graph [(silt `(list path)`~[at]) ~ ~ modules prelude prelude-values prelude-molds externals mark-externals]
1254214239 =/ graph=(unit irequest-graph) (request-graph-merge resolved.p.js initial (add 1 (lent resolved.p.js)))
1254314240 ?~ graph [%| ['module request evidence needs unsupported inference' ~]]
14241+ =/ static-main=(unit ischeme)
14242+ ?~ main ~
14243+ ?^ main-parts ~
14244+ ?^ page-parts ~
14245+ ?^ store-parts ~
14246+ (static-main-specialized env prelude)
14247+ =? env ?=(^ static-main)
14248+ [[%main u.static-main] (skim env |=(entry=[name=term scheme=ischeme] !=(%main name.entry)))]
14249+ =/ store-main=(unit ischeme)
14250+ ?~ store-parts ~
14251+ ?~ declared ~
14252+ (store-main-closed u.store-parts action.u.declared env p.mts prelude)
14253+ =? env ?=(^ store-main)
14254+ [[%main u.store-main] (skim env |=(entry=[name=term scheme=ischeme] !=(%main name.entry)))]
14255+ =/ kind-ok=?
14256+ ?~ main &
14257+ ?^ main-parts (program-main-closed u.main-parts ds env prelude resolved.p.js u.graph)
14258+ ?^ page-parts (page-main-closed u.page-parts ds env prelude resolved.p.js u.graph)
14259+ ?^ store-parts ?=(^ store-main)
14260+ ?=(^ static-main)
14261+ ?. kind-ok
14262+ [%| [(crip "module kind needs unsupported inference: {(spud at)}") ~]]
14263+ =/ store-derived=(unit [values=ienv evidence=istore-request-evidence])
14264+ ?~ declared ~
14265+ ?~ prelude ~
14266+ =/ state=(unit ischeme) (find-jibb-mold %state [~ p.mts at ~ ~ ~ ~ ~])
14267+ ?~ state ~
14268+ =/ action-mold=(unit ischeme) (find-jibb-mold action.u.declared [~ p.mts at ~ ~ ~ ~ ~])
14269+ ?~ action-mold ~
14270+ =/ schemes=(unit [state=ischeme action=ischeme])
14271+ (store-derived-schemes u.prelude prelude-values prelude-molds typ.u.state typ.u.action-mold)
14272+ ?~ schemes ~
14273+ =/ evidence=istore-request-evidence
14274+ [at src typ.u.state action.u.declared typ.u.action-mold]
14275+ `[~[[%state state.u.schemes] [action.u.declared action.u.schemes]] evidence]
14276+ ?: &(?=(^ declared) ?=(~ store-derived))
14277+ [%| [(crip "store derived gates need unsupported inference: {(spud at)}") ~]]
14278+ =? env ?=(^ store-derived) (weld values.u.store-derived env)
14279+ =? graph ?=(^ store-derived)
14280+ `u.graph(stores [evidence.u.store-derived stores.u.graph])
14281+ ?. (request-graph-bounded u.graph)
14282+ [%| ['module request evidence needs unsupported inference' ~]]
1254414283 =/ iface=ifile [env p.mts at ~ artifacts.resolution ~ `src graph]
1254514284 [%& [iface [[at iface] cache.p.js]]]
1254614285::
@@ -12650,15 +14389,13 @@
1265014389 =/ prelude-molds=(list term) molds.u.prepared
1265114390 =/ iface=(unit ifile) `iface.u.prepared
1265214391 ?. (module-scope-valid p.parsed prelude-values prelude-molds)
12653− ?: (pending-declared-poke file p.parsed prelude-values prelude-molds)
12654− 'partial inference; module not checked\0amodule kind or scope needs unsupported inference'
1265514392 'partial inference; module not checked\0amodule has conflicting names'
1265614393 =/ js=jimports-result
1265714394 (resolve-jibb-imports imports.p.parsed externals mark-externals modules ~[file] prelude-values prelude-molds ~ iface)
1265814395 ?: ?=(%| -.js) (of-wain:format ~['partial inference; module not checked' p.js])
1265914396 =/ scope-values=(list term)
1266014397 (weld prelude-values (weld (collect-sur-imports imports.p.parsed) (collect-mark-imports imports.p.parsed)))
12661− (golden-types-in-context file src externals mark-externals resolved.p.js scope-values prelude-molds iface)
14398+ (golden-types-in-context-core file src externals mark-externals resolved.p.js scope-values prelude-molds iface prepared)
1266214399::
1266314400:: +golden-types-with-marks: supply declared mark types separately from /sur
1266414401:: entries, as [mark result] with the result from +read-mark:jibb-import.
@@ -12689,6 +14426,10 @@
1268914426++ golden-types-in-context
1269014427 |= [file=path src=@t externals=iexternals mark-externals=imark-externals jimports=ijimports prelude-values=(list term) reserved-molds=(list term) prelude=(unit ifile)]
1269114428 ^- @t
14429+ (golden-types-in-context-core file src externals mark-externals jimports prelude-values reserved-molds prelude ~)
14430+++ golden-types-in-context-core
14431+ |= [file=path src=@t externals=iexternals mark-externals=imark-externals jimports=ijimports prelude-values=(list term) reserved-molds=(list term) prelude=(unit ifile) prepared=(unit iprelude)]
14432+ ^- @t
1269214433 =. reserved-molds (weld reserved-molds (turn jimports |=(j=[face=term interface=ifile] face.j)))
1269314434 =/ parsed (parse file src)
1269414435 ?: ?=(%| -.parsed) (show-error src p.parsed)
@@ -12708,19 +14449,27 @@
1270814449 =/ eligible=?
1270914450 ?& ?=(~ imports.p.parsed)
1271014451 ?=(~ jimports)
12711− ?=(~ prelude)
12712− ?=(~ prelude-values)
12713− ?=(~ reserved-molds)
1271414452 !?=([%ui %api *] file)
1271514453 !?=([%ui %stores *] file)
1271614454 !(lien (global-value-names ds) |=(n=term =(n %main)))
12717− (module-scope-valid p.parsed ~ ~)
1271814455 !(module-values-complete ds env)
1271914456 (lte (met 3 src) 65.536)
1272014457 (lte (lent ds) 64)
12721− (dg-source-candidate ds 64)
14458+ ?| &(?=(~ prepared) ?=(~ prelude) ?=(~ prelude-values) ?=(~ reserved-molds) (module-scope-valid p.parsed ~ ~) (dg-source-candidate ds 64))
14459+ ?& ?=(^ prepared)
14460+ ?=(^ prelude)
14461+ =(u.prelude iface.u.prepared)
14462+ =(prelude-values values.u.prepared)
14463+ =(reserved-molds molds.u.prepared)
14464+ (module-scope-valid p.parsed values.u.prepared molds.u.prepared)
14465+ (dg-prepared-candidate ds 64)
14466+ ==
14467+ ==
1272214468 ==
12723− =/ transaction=(unit dgcommit) ?:(eligible (dg-root-source file src) ~)
14469+ =/ transaction=(unit dgcommit)
14470+ ?. eligible ~
14471+ ?~ prepared (dg-root-source file src)
14472+ (dg-root-prepared file src u.prepared)
1272414473 =. recovered
1272514474 ?~ transaction ~
1272614475 ?. &((module-values-complete ds env.u.transaction) (dg-interface-safe env.u.transaction)) ~
@@ -13006,6 +14755,31 @@
1300614755 [%& result st(next +(next.st), obligations [ex ey obligations.st])]
1300714756 [%& typ.p.left state.p.right]
1300814757::
14758+:: A direct tuple literal may wait for a later exact result context.
14759+:: Each pending literal retains its source tag and its own fit obligation.
14760+++ dg-infer-tuple-items
14761+ |= [items=(list item) env=ienv state=istate]
14762+ ^- iresult
14763+ ?~ items [%| ["empty cell is not supported by partial inference" ~]]
14764+ =/ head=iresult (infer-fragment val.i.items env state)
14765+ ?: ?=(%| -.head) head
14766+ =/ typ=itype typ.p.head
14767+ =/ st=istate state.p.head
14768+ =/ adjusted=(unit [typ=itype state=istate])
14769+ ?. (dg-owned-arm-literal val.i.items typ tags.st sub.st next.state) `[typ st]
14770+ ?: (gth (lent obligations.st) 63) ~
14771+ =/ pending=itype [%var next.st]
14772+ =/ edge=dgo [typ pending (span-of val.i.items) at.i.items]
14773+ `[pending st(next +(next.st), obligations [edge obligations.st])]
14774+ ?~ adjusted [%| ["deferred tuple context needs unsupported inference" ~]]
14775+ =. typ typ.u.adjusted
14776+ =. st state.u.adjusted
14777+ =. typ ?~(face.i.items typ [%face u.face.i.items typ])
14778+ ?~ t.items [%& typ st]
14779+ =/ tail=iresult $(items t.items, state st)
14780+ ?: ?=(%| -.tail) tail
14781+ [%& [%cell typ typ.p.tail] state.p.tail]
14782+::
1300914783:: Deferred inference uses only source forms whose successful fit sites are
1301014784:: guarded below; a shared source-node budget bounds this screen.
1301114785++ dg-safe-expressions
@@ -13015,6 +14789,13 @@
1301514789 =/ first=(unit @ud) (dg-safe-expression i.todo fuel)
1301614790 ?~ first ~
1301714791 $(todo t.todo, fuel u.first)
14792+++ dg-safe-items
14793+ |= [items=(list item) fuel=@ud]
14794+ ^- (unit @ud)
14795+ ?~ items `fuel
14796+ =/ first=(unit @ud) (dg-safe-expression val.i.items fuel)
14797+ ?~ first ~
14798+ $(items t.items, fuel u.first)
1301814799++ dg-safe-expression
1301914800 |= [e=expr fuel=@ud]
1302014801 ^- (unit @ud)
@@ -13032,6 +14813,7 @@
1303214813 $(e final.e, fuel fuel)
1303314814 %gate $(e body.e, fuel fuel)
1303414815 %gate-wide $(e body.e, fuel fuel)
14816+ %tuple (dg-safe-items items.e fuel)
1303514817 %branch
1303614818 ?. (dg-boolean-patterns e) ~
1303714819 ?> ?=(^ arms.e)
@@ -13171,6 +14953,28 @@
1317114953 ?: (dg-direct-source val.i.ds 64) &
1317214954 $(ds t.ds, fuel (dec fuel))
1317314955::
14956+++ dg-prepared-source
14957+ |= [e=expr fuel=@ud]
14958+ ^- ?
14959+ ?: (dg-direct-source e fuel) &
14960+ ?: =(0 fuel) |
14961+ ?+ -.e |
14962+ %group $(e inner.e, fuel (dec fuel))
14963+ %gate $(e body.e, fuel (dec fuel))
14964+ %gate-wide $(e body.e, fuel (dec fuel))
14965+ %cast $(e val.e, fuel (dec fuel))
14966+ %body ?~(defs.e $(e final.e, fuel (dec fuel)) |)
14967+ %tuple &
14968+ ==
14969+++ dg-prepared-candidate
14970+ |= [ds=(list def) fuel=@ud]
14971+ ^- ?
14972+ ?~ ds |
14973+ ?: =(0 fuel) |
14974+ ?. ?=(%value -.i.ds) $(ds t.ds, fuel (dec fuel))
14975+ ?: (dg-prepared-source val.i.ds 64) &
14976+ $(ds t.ds, fuel (dec fuel))
14977+::
1317414978++ dg-interface-safe
1317514979 |= [env=ienv]
1317614980 ^- ?
@@ -13216,6 +15020,47 @@
1321615020 (dg-stage defs base base st ~ 64)
1321715021 ::
1321815022 [& (transact)]
15023+:: The caller supplies the trusted prepared prelude. This transaction is
15024+:: only report evidence; the ordinary module resolver does not publish it.
15025+++ dg-root-prepared
15026+ |= [at=path src=@t prepared=iprelude]
15027+ ^- (unit dgcommit)
15028+ ?: ?=([%ui %api *] at) ~
15029+ ?: ?=([%ui %stores *] at) ~
15030+ ?: (gth (met 3 src) 65.536) ~
15031+ =/ parsed (parse at src)
15032+ ?: ?=(%| -.parsed) ~
15033+ ?^ imports.p.parsed ~
15034+ ?. (module-scope-valid p.parsed values.prepared molds.prepared) ~
15035+ ?^ (duplicate-defs defs.p.parsed) ~
15036+ =/ defs=(list def) defs.p.parsed
15037+ ?: (gth (lent defs) 64) ~
15038+ ?: (lien (global-value-names defs) |=(n=term =(n %main))) ~
15039+ ?. (dg-prepared-candidate defs 64) ~
15040+ =/ local-molds=imolds (collect-simple-molds defs)
15041+ =/ globals=(list term) (weld values.prepared (global-value-names defs))
15042+ =/ iface=ifile iface.prepared
15043+ =/ prelude=(unit ifile) `iface
15044+ =/ resolution=iresolved
15045+ (resolve-groups defs local-molds globals ~ ~ ~ ~ ~ molds.prepared at prelude)
15046+ ?^ grouped.resolution ~
15047+ ?^ artifacts.resolution ~
15048+ =/ base=ienv env.resolution
15049+ =/ templates=ienv
15050+ (turn molds.iface |=(x=[name=term template=ischeme] [name.x template.x]))
15051+ =/ all-env=ienv (weld base (weld values.iface templates))
15052+ =/ free=(unit dgscan) (dg-env all-env ~ 32.768 ~)
15053+ ?~ free ~
15054+ ?^ ids.u.free ~
15055+ =/ all=(unit dgscan) (dg-all-env-ids all-env 32.768 ~)
15056+ ?~ all ~
15057+ =/ fresh=@ud (dg-next-id ids.u.all 0)
15058+ =/ st=istate *istate
15059+ =. st st(next fresh, defer `~, molds local-molds, globals globals, at at, reserved-molds molds.prepared, prelude prelude, top-molds (turn local-molds |=(m=[name=term body=shape] name.m)), in-mold |, jrec-fuel 256)
15060+ =/ checked-molds=(each imold-types @t) (module-mold-types local-molds st)
15061+ ?: ?=(%| -.checked-molds) ~
15062+ (dg-stage defs base base st ~ 64)
15063+::
1321915064++ dg-all-env-ids
1322015065 |= [env=ienv fuel=@ud ids=(list @ud)]
1322115066 ^- (unit dgscan)
jibb-dev/lib/jibb/internal.jibb+1−1
@@ -3,7 +3,7 @@
33:: Representation for agent and in-process store pokes.
44:: The prelude re-exports this mold; effect lowering and the runtime must
55:: agree on these cells when effect execution is implemented.
6−+$ poke
6++$ raw-poke
77 [%agent agent=@tas mark=@tas payload=*]
88 [%store module=@t action=@tas payload=*]
99
jibb-dev/lib/jibb/prelude.jibb+158−2
@@ -1,5 +1,5 @@
11/= internal /lib/jibb/internal
2−+$ poke poke.internal
2++$ raw-poke raw-poke.internal
33+$ qath qath.internal
44
55:: Initial prelude functions. The rest of the inventory is still to come.
@@ -198,6 +198,19 @@
198198 ~ first
199199 [~ b] `(combine a b)
200200
201+++ hunt |= args=[$-([A A] ?) (unit A) (unit A)]
202+ ?- args
203+ [choose first second] ^- (unit A)
204+ ?- first
205+ ~ second
206+ [~ a]
207+ ?- second
208+ ~ first
209+ [~ b]
210+ ?- (choose a b)
211+ %.y first
212+ %.n second
213+
201214++ clef |= args=[(unit A) (unit B) $-([A B] (unit C))]
202215 ?- args
203216 [first second combine] ^- (unit C)
@@ -325,7 +338,7 @@
325338 [f b] |= a=A (f a b)
326339
327340+$ cmd |$ [M]
328− [%poke p=poke reply=$-((unit @t) M)]
341+ [%poke p=raw-poke reply=$-((unit @t) M)]
329342 [%go url=@t]
330343 [%wait gap=@dr msg=M]
331344 [%now reply=$-(@da M)]
@@ -376,3 +389,146 @@
376389
377390++ trip |= value=@t (trip-text.internal value)
378391++ tuba |= values=(list @tD) (tuba-text.internal values)
392+
393+:: UI values are source-level descriptions only. Nested element payloads are
394+:: erased in the nonrecursive union; the public constructors below retain the
395+:: typed composition boundaries. Raw-constructor encapsulation, rendering and
396+:: execution are not established by this slice.
397++$ length
398+ [%chars n=@ud]
399+ [%fill n=@ud]
400+ %shrink
401+
402++$ align
403+ %start
404+ %center
405+ %end
406+
407++$ role
408+ %body
409+ %caption
410+ %label
411+
412++$ tone
413+ %normal
414+ %muted
415+ %accent
416+ %danger
417+
418++$ attr
419+ [%pad %s0]
420+ [%pad %s1]
421+ [%pad %s2]
422+ [%pad %s3]
423+ [%gap %s0]
424+ [%gap %s1]
425+ [%gap %s2]
426+ [%gap %s3]
427+ [%width width=length]
428+ [%align align=align]
429+ [%role role=role]
430+ [%tone tone=tone]
431+
432++$ element |$ [M]
433+ [%row attrs=(list attr) kids=*]
434+ [%column attrs=(list attr) kids=*]
435+ [%wrap attrs=(list attr) kids=*]
436+ [%stack attrs=(list attr) kids=*]
437+ [%el attrs=(list attr) kid=*]
438+ [%para kids=*]
439+ [%text words=@t]
440+ [%heading level=@ud words=@t]
441+ [%each items=*]
442+ [%table columns=* rows=*]
443+ [%image source=qath description=@t]
444+ [%image-unsafe source=[url=@t width=@ud height=@ud] description=@t]
445+ [%link target=qath label=@t]
446+ [%link-unsafe target=@t label=@t]
447+ [%button label=@t message=M]
448+ [%toggle on=? label=@t message=M]
449+ [%field label=@t value=@t reply=$-(@t M)]
450+ [%form message=M kids=*]
451+ [%island payload=*]
452+
453+++ row |= [attrs=(list attr) kids=(list (element M))]
454+ ^- (element M) [%row attrs kids]
455+
456+++ column |= [attrs=(list attr) kids=(list (element M))]
457+ ^- (element M) [%column attrs kids]
458+
459+++ wrap |= [attrs=(list attr) kids=(list (element M))]
460+ ^- (element M) [%wrap attrs kids]
461+
462+++ stack |= [attrs=(list attr) kids=(list (element M))]
463+ ^- (element M) [%stack attrs kids]
464+
465+++ el |= [attrs=(list attr) kid=(element M)]
466+ ^- (element M) [%el attrs kid]
467+
468+++ para |= kids=(list (element M))
469+ ^- (element M) [%para kids]
470+
471+++ text |= words=@t
472+ ^- (element M) [%text words]
473+
474+++ heading |= [level=@ud words=@t]
475+ ^- (element M) [%heading level words]
476+
477+++ each |= items=(list [key=K el=(element M)])
478+ ^- (element M) [%each items]
479+
480+++ table |= [columns=(list [header=@t width=length align=align]) rows=(list [key=K cells=(list (element M))])]
481+ ^- (element M) [%table columns rows]
482+
483+++ image |= [source=qath description=@t]
484+ ^- (element M) [%image source description]
485+
486+++ image-unsafe |= [source=[url=@t width=@ud height=@ud] description=@t]
487+ ^- (element M) [%image-unsafe source description]
488+
489+++ link |= [target=qath label=@t]
490+ ^- (element M) [%link target label]
491+
492+++ link-unsafe |= [target=@t label=@t]
493+ ^- (element M) [%link-unsafe target label]
494+
495+++ button |= [label=@t message=M]
496+ ^- (element M) [%button label message]
497+
498+++ toggle |= [on=? label=@t message=M]
499+ ^- (element M) [%toggle on label message]
500+
501+++ field |= [label=@t value=@t reply=$-(@t M)]
502+ ^- (element M) [%field label value reply]
503+
504+++ form |= [message=M kids=(list (element M))]
505+ ^- (element M) [%form message kids]
506+
507++$ theme
508+ [ space=[s1=@t s2=@t s3=@t]
509+ tones=[normal=@t background=@t accent=@t danger=@t muted=@t]
510+ wide=@t
511+ lang=@t
512+ zone=@t
513+ font=(unit qath)
514+ dark=(unit [tones=[normal=@t background=@t accent=@t danger=@t muted=@t]])
515+
516++$ program |$ [D X M]
517+ [init=$-(D X) update=$-([M X] [X (list (cmd M))]) view=$-(X (element M)) subs=$-(X (list (sub M)))]
518+
519+++ program |= [init=$-(D X) update=$-([M X] [X (list (cmd M))]) view=$-(X (element M)) subs=$-(X (list (sub M)))]
520+ ^- (program D X M) [init update view subs]
521+
522+++ island |= [p=(program D X M) data=D]
523+ ^- (element !!) [%island [p data]]
524+
525++$ page |$ [R D]
526+ [load=$-(R (ask D)) view=$-(D (element !!))]
527+
528+++ page |= [load=$-(R (ask D)) view=$-(D (element !!))]
529+ ^- (page R D) [load view]
530+
531++$ store |$ [S] [init=S update=*]
532+
533+++ store |= [init=S update=$-([A S] S)]
534+ ^- (store S) [init update]
my-app/ui/basket.jibb+2−2
@@ -17,8 +17,8 @@
1717++ update |= [=msg m=model]
1818 ?- msg
1919 [%noted t] [m(note=t) ~]
20− %add [m(note="") ~[[%poke (cart-action.cart [%add note.m]) |=%acked]]]
21− %toggle [m ~[[%poke (cart-action.cart %toggle) |=%acked]]]
20+ %add [m(note="") ~[(poke.cart [%add note.m] |=%acked)]]
21+ %toggle [m ~[(poke.cart %toggle |=%acked)]]
2222 [%got c] [m(cart=c) ~]
2323 [%acked err] [m ~]
2424
my-app/ui/stores/cart.jibb+2−3
@@ -1,13 +1,12 @@
11:: /ui/stores/cart.jibb
22+$ state [items=(list @t) open=?]
3−+$ cart-action
3++$ poke
44 [%add item=@t]
55 %toggle
6−+$ poke cart-action
76
87++ main (store init update)
98++ init ^- state [~ %.n]
10−++ update |= [a=cart-action s=state]
9+++ update |= [a=poke s=state]
1110 ?- a
1211 [%add item] s(items=[item items.s])
1312 %toggle s(open=(not open.s))
my-app/ui/theme.jibb+1−1
@@ -5,4 +5,4 @@
55 lang="en"
66 zone="UTC"
77 font=`%/static/fonts/inter.woff2
8− dark=[tones=[normal="#eee" background="#111" accent="#4c9" danger="#f28b82" muted="#aaa"]]
8+ dark=`[tones=[normal="#eee" background="#111" accent="#4c9" danger="#f28b82" muted="#aaa"]]
my-app/ui/todo-list.jibb+2−2
@@ -19,8 +19,8 @@
1919 ?- (gth (lent (tuba (trip t))) 80)
2020 %.y [m(draft=t error=`"Too long") ~]
2121 %.n [m(draft=t error=~) ~]
22− %submit [m(draft="") ~[[%poke (todo-action.todo [%add draft.m]) |=%acked]]]
23− [%toggled id] [m ~[[%poke (todo-action.todo [%toggle id]) |=%acked]]]
22+ %submit [m(draft="") ~[(poke.todo [%add draft.m] |=%acked)]]
23+ [%toggled id] [m ~[(poke.todo [%toggle id] |=%acked)]]
2424 [%got ts] [m(todos=ts) ~]
2525 [%acked err] [m(error=err) ~]
2626
tests/golden/doc-core-02-update/source.jibb+2−2
@@ -4,7 +4,7 @@
44 ?- (gth (lent (tuba (trip t))) 80)
55 %.y [m(draft=t error=`"Too long") ~]
66 %.n [m(draft=t error=~) ~]
7− %submit [m(draft="") ~[[%poke (todo-action.todo [%add draft.m]) |=%acked]]]
8− [%toggled id] [m ~[[%poke (todo-action.todo [%toggle id]) |=%acked]]]
7+ %submit [m(draft="") ~[(poke.todo [%add draft.m] |=%acked)]]
8+ [%toggled id] [m ~[(poke.todo [%toggle id] |=%acked)]]
99 [%got ts] [m(todos=ts) ~]
1010 [%acked err] [m(error=err) ~]
tests/golden/doc-core-02-update/tokens.txt+22−28
@@ -73,20 +73,17 @@
73737:29 tight str ""
74747:31 tight glyph )
75757:33 glyph ~[
76−7:35 tight glyph [
77−7:36 tight lit %poke
78−7:42 glyph (
79−7:43 tight wing todo-action.todo
80−7:60 glyph [
81−7:61 tight lit %add
82−7:66 wing draft.m
83−7:73 tight glyph ]
84−7:74 tight glyph )
85−7:76 glyph |=
86−7:78 tight lit %acked
87−7:84 tight glyph ]
88−7:85 tight glyph ]
89−7:86 tight glyph ]
76+7:35 tight glyph (
77+7:36 tight wing poke.todo
78+7:46 glyph [
79+7:47 tight lit %add
80+7:52 wing draft.m
81+7:59 tight glyph ]
82+7:61 glyph |=
83+7:63 tight lit %acked
84+7:69 tight glyph )
85+7:70 tight glyph ]
86+7:71 tight glyph ]
90878:5 NEWLINE
91888:5 glyph [
92898:6 tight lit %toggled
@@ -95,20 +92,17 @@
95928:20 glyph [
96938:21 tight name m
97948:23 glyph ~[
98−8:25 tight glyph [
99−8:26 tight lit %poke
100−8:32 glyph (
101−8:33 tight wing todo-action.todo
102−8:50 glyph [
103−8:51 tight lit %toggle
104−8:59 name id
105−8:61 tight glyph ]
106−8:62 tight glyph )
107−8:64 glyph |=
108−8:66 tight lit %acked
109−8:72 tight glyph ]
110−8:73 tight glyph ]
111−8:74 tight glyph ]
95+8:25 tight glyph (
96+8:26 tight wing poke.todo
97+8:36 glyph [
98+8:37 tight lit %toggle
99+8:45 name id
100+8:47 tight glyph ]
101+8:49 glyph |=
102+8:51 tight lit %acked
103+8:57 tight glyph )
104+8:58 tight glyph ]
105+8:59 tight glyph ]
1121069:5 NEWLINE
1131079:5 glyph [
1141089:6 tight lit %got
tests/golden/doc-core-02-update/tree.txt+10−14
@@ -44,25 +44,21 @@
4444 (change 7:21 m
4545 (edit 7:23 draft (str 7:29 "")))
4646 (list 7:33
47− (tuple 7:35
48− (lit 7:36 %poke)
49− (group 7:42
50− (call 7:43
51− (wing 7:43 todo-action.todo)
52− (tuple 7:60 (lit 7:61 %add) (wing 7:66 draft.m))))
53− (ctor 7:76 %acked)))))
47+ (group 7:35
48+ (call 7:36
49+ (wing 7:36 poke.todo)
50+ (tuple 7:46 (lit 7:47 %add) (wing 7:52 draft.m))
51+ (ctor 7:61 %acked))))))
5452 (arm 8:5
5553 (cell 8:5 (lit 8:6 %toggled) (bind 8:15 id))
5654 (tuple 8:20
5755 (wing 8:21 m)
5856 (list 8:23
59− (tuple 8:25
60− (lit 8:26 %poke)
61− (group 8:32
62− (call 8:33
63− (wing 8:33 todo-action.todo)
64− (tuple 8:50 (lit 8:51 %toggle) (wing 8:59 id))))
65− (ctor 8:64 %acked)))))
57+ (group 8:25
58+ (call 8:26
59+ (wing 8:26 poke.todo)
60+ (tuple 8:36 (lit 8:37 %toggle) (wing 8:45 id))
61+ (ctor 8:49 %acked))))))
6662 (arm 9:5
6763 (cell 9:5 (lit 9:6 %got) (bind 9:11 ts))
6864 (tuple 9:20
tests/golden/doc-grammar-02-buttons/modules.txtnew file+1
@@ -0,0 +1 @@
1+# Use the prepared prelude; this library has no Jibb module imports.
tests/golden/doc-grammar-02-buttons/types.txtnew file+4
@@ -0,0 +1,4 @@
1+partial inference; module not checked
2+++ add-button: tag needs context in partial inference
3+++ labelled: $-([label=@t msg=A] (element A))
4+++ wide: (list attr)
tests/golden/doc-grammar-06-cart-store/source.jibb+2−3
@@ -1,13 +1,12 @@
11:: /ui/stores/cart.jibb
22+$ state [items=(list @t) open=?]
3−+$ cart-action
3++$ poke
44 [%add item=@t]
55 %toggle
6−+$ poke cart-action
76
87++ main (store init update)
98++ init ^- state [~ %.n]
10−++ update |= [a=cart-action s=state]
9+++ update |= [a=poke s=state]
1110 ?- a
1211 [%add item] s(items=[item items.s])
1312 %toggle s(open=(not open.s))
tests/golden/doc-grammar-06-cart-store/tokens.txt+56−60
@@ -13,7 +13,7 @@
13132:33 tight glyph ]
14143:1 NEWLINE
15153:1 glyph +$
16−3:4 name cart-action
16+3:4 name poke
17174:3 INDENT
18184:3 glyph [
19194:4 tight lit %add
@@ -23,68 +23,64 @@
23234:16 tight glyph ]
24245:3 NEWLINE
25255:3 lit %toggle
26−6:1 DEDENT
27−6:1 NEWLINE
28−6:1 glyph +$
29−6:4 name poke
30−6:9 name cart-action
26+7:1 DEDENT
27+7:1 NEWLINE
28+7:1 glyph ++
29+7:4 name main
30+7:9 glyph (
31+7:10 tight name store
32+7:16 name init
33+7:21 name update
34+7:27 tight glyph )
31358:1 NEWLINE
32368:1 glyph ++
33−8:4 name main
34−8:9 glyph (
35−8:10 tight name store
36−8:16 name init
37−8:21 name update
38−8:27 tight glyph )
37+8:4 name init
38+8:9 glyph ^-
39+8:12 name state
40+8:18 glyph [
41+8:19 tight lit ~
42+8:21 lit %.n
43+8:24 tight glyph ]
39449:1 NEWLINE
40459:1 glyph ++
41−9:4 name init
42−9:9 glyph ^-
43−9:12 name state
44−9:18 glyph [
45−9:19 tight lit ~
46−9:21 lit %.n
47−9:24 tight glyph ]
48−10:1 NEWLINE
49−10:1 glyph ++
50−10:4 name update
51−10:11 glyph |=
52−10:14 glyph [
53−10:15 tight name a
54−10:16 tight glyph =
55−10:17 tight name cart-action
56−10:29 name s
57−10:30 tight glyph =
58−10:31 tight name state
59−10:36 tight glyph ]
60−11:3 INDENT
61−11:3 glyph ?-
62−11:6 name a
63−12:5 INDENT
64−12:5 glyph [
65−12:6 tight lit %add
66−12:11 name item
67−12:15 tight glyph ]
46+9:4 name update
47+9:11 glyph |=
48+9:14 glyph [
49+9:15 tight name a
50+9:16 tight glyph =
51+9:17 tight name poke
52+9:22 name s
53+9:23 tight glyph =
54+9:24 tight name state
55+9:29 tight glyph ]
56+10:3 INDENT
57+10:3 glyph ?-
58+10:6 name a
59+11:5 INDENT
60+11:5 glyph [
61+11:6 tight lit %add
62+11:11 name item
63+11:15 tight glyph ]
64+11:18 name s
65+11:19 tight glyph (
66+11:20 tight name items
67+11:25 tight glyph =
68+11:26 tight glyph [
69+11:27 tight name item
70+11:32 wing items.s
71+11:39 tight glyph ]
72+11:40 tight glyph )
73+12:5 NEWLINE
74+12:5 lit %toggle
687512:18 name s
697612:19 tight glyph (
70−12:20 tight name items
71−12:25 tight glyph =
72−12:26 tight glyph [
73−12:27 tight name item
74−12:32 wing items.s
75−12:39 tight glyph ]
76−12:40 tight glyph )
77−13:5 NEWLINE
78−13:5 lit %toggle
79−13:18 name s
80−13:19 tight glyph (
81−13:20 tight name open
82−13:24 tight glyph =
83−13:25 tight glyph (
84−13:26 tight name not
85−13:30 wing open.s
86−13:36 tight glyph )
87−13:37 tight glyph )
88−13:38 DEDENT
89−13:38 DEDENT
90−13:38 NEWLINE
77+12:20 tight name open
78+12:24 tight glyph =
79+12:25 tight glyph (
80+12:26 tight name not
81+12:30 wing open.s
82+12:36 tight glyph )
83+12:37 tight glyph )
84+12:38 DEDENT
85+12:38 DEDENT
86+12:38 NEWLINE
tests/golden/doc-grammar-06-cart-store/tree.txt+25−26
@@ -4,36 +4,35 @@
44 (face 2:11 items
55 (apply 2:17 list (aura 2:23 @t)))
66 (face 2:27 open (flag 2:32))))
7− (mold 3:1 cart-action
7+ (mold 3:1 poke
88 (union 4:3
99 (cell 4:3
1010 (const 4:4 %add)
1111 (face 4:9 item (aura 4:14 @t)))
1212 (const 5:3 %toggle)))
13− (mold 6:1 poke (ref 6:9 cart-action))
14− (value 8:1 main
15− (group 8:9
16− (call 8:10 (wing 8:10 store) (wing 8:16 init) (wing 8:21 update))))
17− (value 9:1 init
18− (cast 9:9
19− (ref 9:12 state)
20− (tuple 9:18 (lit 9:19 ~) (lit 9:21 %.n))))
21− (value 10:1 update
22− (gate 10:11
23− (cell 10:14
24− (face 10:15 a (ref 10:17 cart-action))
25− (face 10:29 s (ref 10:31 state)))
26− (body 11:3
27− (branch 11:3
28− (wing 11:6 a)
13+ (value 7:1 main
14+ (group 7:9
15+ (call 7:10 (wing 7:10 store) (wing 7:16 init) (wing 7:21 update))))
16+ (value 8:1 init
17+ (cast 8:9
18+ (ref 8:12 state)
19+ (tuple 8:18 (lit 8:19 ~) (lit 8:21 %.n))))
20+ (value 9:1 update
21+ (gate 9:11
22+ (cell 9:14
23+ (face 9:15 a (ref 9:17 poke))
24+ (face 9:22 s (ref 9:24 state)))
25+ (body 10:3
26+ (branch 10:3
27+ (wing 10:6 a)
28+ (arm 11:5
29+ (cell 11:5 (lit 11:6 %add) (bind 11:11 item))
30+ (change 11:18 s
31+ (edit 11:20 items
32+ (tuple 11:26 (wing 11:27 item) (wing 11:32 items.s)))))
2933 (arm 12:5
30− (cell 12:5 (lit 12:6 %add) (bind 12:11 item))
34+ (lit 12:5 %toggle)
3135 (change 12:18 s
32− (edit 12:20 items
33− (tuple 12:26 (wing 12:27 item) (wing 12:32 items.s)))))
34− (arm 13:5
35− (lit 13:5 %toggle)
36− (change 13:18 s
37− (edit 13:20 open
38− (group 13:25
39− (call 13:26 (wing 13:26 not) (wing 13:30 open.s)))))))))))
36+ (edit 12:20 open
37+ (group 12:25
38+ (call 12:26 (wing 12:26 not) (wing 12:30 open.s)))))))))))
tests/golden/doc-grammar-06-cart-store/types.txt+5−1
@@ -1,2 +1,6 @@
11partial inference; module not checked
2−module kind or scope needs unsupported inference
2++$ state: not checked
3++$ poke: cases proven disjoint; mold not checked
4+++ main: [init=[items=(list @t) open=?] update=*]
5+++ init: [items=(list @t) open=?]
6+++ update: $-([a=poke s=[items=(list @t) open=?]] [items=(list @t) open=?])
tests/golden/doc-grammar-07-basket/source.jibb+2−2
@@ -17,8 +17,8 @@
1717++ update |= [=msg m=model]
1818 ?- msg
1919 [%noted t] [m(note=t) ~]
20− %add [m(note="") ~[[%poke (cart-action.cart [%add note.m]) |=%acked]]]
21− %toggle [m ~[[%poke (cart-action.cart %toggle) |=%acked]]]
20+ %add [m(note="") ~[(poke.cart [%add note.m] |=%acked)]]
21+ %toggle [m ~[(poke.cart %toggle |=%acked)]]
2222 [%got c] [m(cart=c) ~]
2323 [%acked err] [m ~]
2424
tests/golden/doc-grammar-07-basket/tokens.txt+19−25
@@ -111,36 +111,30 @@
11111120:28 tight str ""
11211220:30 tight glyph )
11311320:32 glyph ~[
114−20:34 tight glyph [
115−20:35 tight lit %poke
116−20:41 glyph (
117−20:42 tight wing cart-action.cart
118−20:59 glyph [
119−20:60 tight lit %add
120−20:65 wing note.m
121−20:71 tight glyph ]
122−20:72 tight glyph )
123−20:74 glyph |=
124−20:76 tight lit %acked
125−20:82 tight glyph ]
126−20:83 tight glyph ]
127−20:84 tight glyph ]
114+20:34 tight glyph (
115+20:35 tight wing poke.cart
116+20:45 glyph [
117+20:46 tight lit %add
118+20:51 wing note.m
119+20:57 tight glyph ]
120+20:59 glyph |=
121+20:61 tight lit %acked
122+20:67 tight glyph )
123+20:68 tight glyph ]
124+20:69 tight glyph ]
12812521:5 NEWLINE
12912621:5 lit %toggle
13012721:20 glyph [
13112821:21 tight name m
13212921:23 glyph ~[
133−21:25 tight glyph [
134−21:26 tight lit %poke
135−21:32 glyph (
136−21:33 tight wing cart-action.cart
137−21:50 lit %toggle
138−21:57 tight glyph )
139−21:59 glyph |=
140−21:61 tight lit %acked
141−21:67 tight glyph ]
142−21:68 tight glyph ]
143−21:69 tight glyph ]
130+21:25 tight glyph (
131+21:26 tight wing poke.cart
132+21:36 lit %toggle
133+21:44 glyph |=
134+21:46 tight lit %acked
135+21:52 tight glyph )
136+21:53 tight glyph ]
137+21:54 tight glyph ]
14413822:5 NEWLINE
14513922:5 glyph [
14614022:6 tight lit %got
tests/golden/doc-grammar-07-basket/tree.txt+7−12
@@ -48,23 +48,18 @@
4848 (change 20:21 m
4949 (edit 20:23 note (str 20:28 "")))
5050 (list 20:32
51− (tuple 20:34
52− (lit 20:35 %poke)
53− (group 20:41
54− (call 20:42
55− (wing 20:42 cart-action.cart)
56− (tuple 20:59 (lit 20:60 %add) (wing 20:65 note.m))))
57− (ctor 20:74 %acked)))))
51+ (group 20:34
52+ (call 20:35
53+ (wing 20:35 poke.cart)
54+ (tuple 20:45 (lit 20:46 %add) (wing 20:51 note.m))
55+ (ctor 20:59 %acked))))))
5856 (arm 21:5
5957 (lit 21:5 %toggle)
6058 (tuple 21:20
6159 (wing 21:21 m)
6260 (list 21:23
63− (tuple 21:25
64− (lit 21:26 %poke)
65− (group 21:32
66− (call 21:33 (wing 21:33 cart-action.cart) (lit 21:50 %toggle)))
67− (ctor 21:59 %acked)))))
61+ (group 21:25
62+ (call 21:26 (wing 21:26 poke.cart) (lit 21:36 %toggle) (ctor 21:44 %acked))))))
6863 (arm 22:5
6964 (cell 22:5 (lit 22:6 %got) (bind 22:11 c))
7065 (tuple 22:20
tests/golden/doc-overview-01-cmd-sub/source.jibb+1−1
@@ -1,5 +1,5 @@
11+$ cmd |$ [M]
2− [%poke p=poke reply=$-((unit @t) M)]
2+ [%poke p=raw-poke reply=$-((unit @t) M)]
33 [%go url=@t]
44 [%wait gap=@dr msg=M]
55 [%now reply=$-(@da M)]
tests/golden/doc-overview-01-cmd-sub/tokens.txt+11−11
@@ -9,17 +9,17 @@
992:4 tight lit %poke
10102:10 name p
11112:11 tight glyph =
12−2:12 tight name poke
13−2:17 name reply
14−2:22 tight glyph =
15−2:23 tight glyph $-(
16−2:26 tight glyph (
17−2:27 tight name unit
18−2:32 aura @t
19−2:34 tight glyph )
20−2:36 tvar M
21−2:37 tight glyph )
22−2:38 tight glyph ]
12+2:12 tight name raw-poke
13+2:21 name reply
14+2:26 tight glyph =
15+2:27 tight glyph $-(
16+2:30 tight glyph (
17+2:31 tight name unit
18+2:36 aura @t
19+2:38 tight glyph )
20+2:40 tvar M
21+2:41 tight glyph )
22+2:42 tight glyph ]
23233:3 NEWLINE
24243:3 glyph [
25253:4 tight lit %go
tests/golden/doc-overview-01-cmd-sub/tree.txt+5−5
@@ -4,11 +4,11 @@
44 (union 2:3
55 (cell 2:3
66 (const 2:4 %poke)
7− (face 2:10 p (ref 2:12 poke))
8− (face 2:17 reply
9− (fn 2:23
10− (apply 2:26 unit (aura 2:32 @t))
11− (tvar 2:36 M))))
7+ (face 2:10 p (ref 2:12 raw-poke))
8+ (face 2:21 reply
9+ (fn 2:27
10+ (apply 2:30 unit (aura 2:36 @t))
11+ (tvar 2:40 M))))
1212 (cell 3:3
1313 (const 3:4 %go)
1414 (face 3:8 url (aura 3:12 @t)))
tests/golden/doc-overview-02-theme/source.jibb+1−1
@@ -5,4 +5,4 @@
55 lang="en"
66 zone="UTC"
77 font=`%/static/fonts/inter.woff2
8− dark=[tones=[normal="#eee" background="#111" accent="#4c9" danger="#f28b82" muted="#aaa"]]
8+ dark=`[tones=[normal="#eee" background="#111" accent="#4c9" danger="#f28b82" muted="#aaa"]]
tests/golden/doc-overview-02-theme/tokens.txt+24−23
@@ -62,27 +62,28 @@
62628:5 NEWLINE
63638:5 name dark
64648:9 tight glyph =
65−8:10 tight glyph [
66−8:11 tight name tones
67−8:16 tight glyph =
68−8:17 tight glyph [
69−8:18 tight name normal
70−8:24 tight glyph =
71−8:25 tight str "#eee"
72−8:32 name background
73−8:42 tight glyph =
74−8:43 tight str "#111"
75−8:50 name accent
76−8:56 tight glyph =
77−8:57 tight str "#4c9"
78−8:64 name danger
79−8:70 tight glyph =
80−8:71 tight str "#f28b82"
81−8:81 name muted
82−8:86 tight glyph =
83−8:87 tight str "#aaa"
84−8:93 tight glyph ]
65+8:10 tight glyph `
66+8:11 tight glyph [
67+8:12 tight name tones
68+8:17 tight glyph =
69+8:18 tight glyph [
70+8:19 tight name normal
71+8:25 tight glyph =
72+8:26 tight str "#eee"
73+8:33 name background
74+8:43 tight glyph =
75+8:44 tight str "#111"
76+8:51 name accent
77+8:57 tight glyph =
78+8:58 tight str "#4c9"
79+8:65 name danger
80+8:71 tight glyph =
81+8:72 tight str "#f28b82"
82+8:82 name muted
83+8:87 tight glyph =
84+8:88 tight str "#aaa"
85858:94 tight glyph ]
86−8:95 DEDENT
87−8:95 DEDENT
88−8:95 NEWLINE
86+8:95 tight glyph ]
87+8:96 DEDENT
88+8:96 DEDENT
89+8:96 NEWLINE
tests/golden/doc-overview-02-theme/tree.txt+9−8
@@ -22,11 +22,12 @@
2222 (face 7:5 font
2323 (unit 7:10 (qath 7:11 static fonts inter.woff2)))
2424 (face 8:5 dark
25− (tuple 8:10
26− (face 8:11 tones
27− (tuple 8:17
28− (face 8:18 normal (str 8:25 "#eee"))
29− (face 8:32 background (str 8:43 "#111"))
30− (face 8:50 accent (str 8:57 "#4c9"))
31− (face 8:64 danger (str 8:71 "#f28b82"))
32− (face 8:81 muted (str 8:87 "#aaa")))))))))))
25+ (unit 8:10
26+ (tuple 8:11
27+ (face 8:12 tones
28+ (tuple 8:18
29+ (face 8:19 normal (str 8:26 "#eee"))
30+ (face 8:33 background (str 8:44 "#111"))
31+ (face 8:51 accent (str 8:58 "#4c9"))
32+ (face 8:65 danger (str 8:72 "#f28b82"))
33+ (face 8:82 muted (str 8:88 "#aaa"))))))))))))
tests/golden/doc-overview-10-todo-list/source.jibb+2−2
@@ -19,8 +19,8 @@
1919 ?- (gth (lent (tuba (trip t))) 80)
2020 %.y [m(draft=t error=`"Too long") ~]
2121 %.n [m(draft=t error=~) ~]
22− %submit [m(draft="") ~[[%poke (todo-action.todo [%add draft.m]) |=%acked]]]
23− [%toggled id] [m ~[[%poke (todo-action.todo [%toggle id]) |=%acked]]]
22+ %submit [m(draft="") ~[(poke.todo [%add draft.m] |=%acked)]]
23+ [%toggled id] [m ~[(poke.todo [%toggle id] |=%acked)]]
2424 [%got ts] [m(todos=ts) ~]
2525 [%acked err] [m(error=err) ~]
2626
tests/golden/doc-overview-10-todo-list/tokens.txt+22−28
@@ -169,20 +169,17 @@
16916922:29 tight str ""
17017022:31 tight glyph )
17117122:33 glyph ~[
172−22:35 tight glyph [
173−22:36 tight lit %poke
174−22:42 glyph (
175−22:43 tight wing todo-action.todo
176−22:60 glyph [
177−22:61 tight lit %add
178−22:66 wing draft.m
179−22:73 tight glyph ]
180−22:74 tight glyph )
181−22:76 glyph |=
182−22:78 tight lit %acked
183−22:84 tight glyph ]
184−22:85 tight glyph ]
185−22:86 tight glyph ]
172+22:35 tight glyph (
173+22:36 tight wing poke.todo
174+22:46 glyph [
175+22:47 tight lit %add
176+22:52 wing draft.m
177+22:59 tight glyph ]
178+22:61 glyph |=
179+22:63 tight lit %acked
180+22:69 tight glyph )
181+22:70 tight glyph ]
182+22:71 tight glyph ]
18618323:5 NEWLINE
18718423:5 glyph [
18818523:6 tight lit %toggled
@@ -191,20 +188,17 @@
19118823:20 glyph [
19218923:21 tight name m
19319023:23 glyph ~[
194−23:25 tight glyph [
195−23:26 tight lit %poke
196−23:32 glyph (
197−23:33 tight wing todo-action.todo
198−23:50 glyph [
199−23:51 tight lit %toggle
200−23:59 name id
201−23:61 tight glyph ]
202−23:62 tight glyph )
203−23:64 glyph |=
204−23:66 tight lit %acked
205−23:72 tight glyph ]
206−23:73 tight glyph ]
207−23:74 tight glyph ]
191+23:25 tight glyph (
192+23:26 tight wing poke.todo
193+23:36 glyph [
194+23:37 tight lit %toggle
195+23:45 name id
196+23:47 tight glyph ]
197+23:49 glyph |=
198+23:51 tight lit %acked
199+23:57 tight glyph )
200+23:58 tight glyph ]
201+23:59 tight glyph ]
20820224:5 NEWLINE
20920324:5 glyph [
21020424:6 tight lit %got
tests/golden/doc-overview-10-todo-list/tree.txt+10−14
@@ -78,25 +78,21 @@
7878 (change 22:21 m
7979 (edit 22:23 draft (str 22:29 "")))
8080 (list 22:33
81− (tuple 22:35
82− (lit 22:36 %poke)
83− (group 22:42
84− (call 22:43
85− (wing 22:43 todo-action.todo)
86− (tuple 22:60 (lit 22:61 %add) (wing 22:66 draft.m))))
87− (ctor 22:76 %acked)))))
81+ (group 22:35
82+ (call 22:36
83+ (wing 22:36 poke.todo)
84+ (tuple 22:46 (lit 22:47 %add) (wing 22:52 draft.m))
85+ (ctor 22:61 %acked))))))
8886 (arm 23:5
8987 (cell 23:5 (lit 23:6 %toggled) (bind 23:15 id))
9088 (tuple 23:20
9189 (wing 23:21 m)
9290 (list 23:23
93− (tuple 23:25
94− (lit 23:26 %poke)
95− (group 23:32
96− (call 23:33
97− (wing 23:33 todo-action.todo)
98− (tuple 23:50 (lit 23:51 %toggle) (wing 23:59 id))))
99− (ctor 23:64 %acked)))))
91+ (group 23:25
92+ (call 23:26
93+ (wing 23:26 poke.todo)
94+ (tuple 23:36 (lit 23:37 %toggle) (wing 23:45 id))
95+ (ctor 23:49 %acked))))))
10096 (arm 24:5
10197 (cell 24:5 (lit 24:6 %got) (bind 24:11 ts))
10298 (tuple 24:20
tests/golden/inline-mold-opaque/about.txt+1−1
@@ -1,3 +1,3 @@
1−source: Grammar tab, Molds: "`poke`, `ask` and `qath` are transparent types, defined in the internal prelude and re-exported normally; callers can construct and inspect their values."
1+source: Grammar tab, Molds: "`raw-poke`, `ask` and `qath` are transparent types, defined in the internal prelude and re-exported normally; callers can construct and inspect their values."
22tests: the effect and application-path types by name
33expect: parses
tests/golden/inline-mold-opaque/source.jibb+1−1
@@ -1,3 +1,3 @@
1−+$ a poke
1++$ a raw-poke
22+$ b ask
33+$ c qath
tests/golden/inline-mold-opaque/tokens.txt+1−1
@@ -1,6 +1,6 @@
111:1 glyph +$
221:4 name a
3−1:6 name poke
3+1:6 name raw-poke
442:1 NEWLINE
552:1 glyph +$
662:4 name b
tests/golden/inline-mold-opaque/tree.txt+1−1
@@ -1,4 +1,4 @@
11(module
2− (mold 1:1 a (ref 1:6 poke))
2+ (mold 1:1 a (ref 1:6 raw-poke))
33 (mold 2:1 b (ref 2:6 ask))
44 (mold 3:1 c (ref 3:6 qath)))
tests/golden/inline-namespaces/about.txt+1−1
@@ -1,3 +1,3 @@
1−source: Grammar tab, Modules: "Molds and values have separate namespaces, told apart by position: `todo-action.todo` is a mold and its constructor, `todos.todo` a mold and a request."
1+source: Grammar tab, Modules: "Molds and values have separate namespaces, told apart by position: `todo-action.todo` is a mold, `poke.todo` its command helper, and `todos.todo` a mold and a request."
22tests: the same wings in mold and in value position
33expect: parses
tests/golden/inline-namespaces/source.jibb+1−1
@@ -1,4 +1,4 @@
11+$ a todo-action.todo
2−++ b todo-action.todo
2+++ b poke.todo
33+$ c todos.todo
44++ d todos.todo
tests/golden/inline-namespaces/tokens.txt+1−1
@@ -4,7 +4,7 @@
442:1 NEWLINE
552:1 glyph ++
662:4 name b
7−2:6 wing todo-action.todo
7+2:6 wing poke.todo
883:1 NEWLINE
993:1 glyph +$
10103:4 name c
tests/golden/inline-namespaces/tree.txt+1−1
@@ -1,5 +1,5 @@
11(module
22 (mold 1:1 a (ref 1:6 todo-action.todo))
3− (value 2:1 b (wing 2:6 todo-action.todo))
3+ (value 2:1 b (wing 2:6 poke.todo))
44 (mold 3:1 c (ref 3:6 todos.todo))
55 (value 4:1 d (wing 4:6 todos.todo)))
tests/golden/inline-requests/about.txt+2−2
@@ -1,3 +1,3 @@
1−source: the first tab ("Jibb — an Elm-architecture UI language for Urbit"), The Elm architecture on Urbit, Effects: "A constructor such as `(todo-action.todo [%add draft.m])` checks its value", "A request such as `(todos.todo |=%got)`", and "A path with diffs also takes a fold, `(changes.todo |=%got apply)`"
2−tests: derived gates called with a cell, a constructor, and a constructor followed by a name
1+source: the first tab ("Jibb — an Elm-architecture UI language for Urbit"), The Elm architecture on Urbit, Effects: "A derived poke helper such as `(poke.todo [%add draft.m] |=%acked)` checks its value and supplies the agent and mark", "A request such as `(todos.todo |=%got)`", and "A path with diffs also takes a fold, `(changes.todo |=%got apply)`"
2+tests: derived gates called with an action and reply, a request, and a request followed by a fold
33expect: parses
tests/golden/inline-requests/source.jibb+1−1
@@ -1,3 +1,3 @@
1−++ a (todo-action.todo [%add draft.m])
1+++ a (poke.todo [%add draft.m] same)
22++ b (todos.todo |=%got)
33++ c (changes.todo |=%got apply)
tests/golden/inline-requests/tokens.txt+7−6
@@ -1,12 +1,13 @@
111:1 glyph ++
221:4 name a
331:6 glyph (
4−1:7 tight wing todo-action.todo
5−1:24 glyph [
6−1:25 tight lit %add
7−1:30 wing draft.m
8−1:37 tight glyph ]
9−1:38 tight glyph )
4+1:7 tight wing poke.todo
5+1:17 glyph [
6+1:18 tight lit %add
7+1:23 wing draft.m
8+1:30 tight glyph ]
9+1:32 name same
10+1:36 tight glyph )
10112:1 NEWLINE
11122:1 glyph ++
12132:4 name b
tests/golden/inline-requests/tree.txt+3−2
@@ -2,8 +2,9 @@
22 (value 1:1 a
33 (group 1:6
44 (call 1:7
5− (wing 1:7 todo-action.todo)
6− (tuple 1:24 (lit 1:25 %add) (wing 1:30 draft.m)))))
5+ (wing 1:7 poke.todo)
6+ (tuple 1:17 (lit 1:18 %add) (wing 1:23 draft.m))
7+ (wing 1:32 same))))
78 (value 2:1 b
89 (group 2:6
910 (call 2:7 (wing 2:7 todos.todo) (ctor 2:18 %got))))
tests/golden/module-import-cycle/source.jibb+1−1
@@ -1,2 +1,2 @@
11/= a /ui/a
2−++ text (identity.a "hi")
2+++ text-value (identity.a "hi")
tests/golden/module-import-cycle/tokens.txt+6−6
@@ -6,9 +6,9 @@
661:11 tight knot a
772:1 NEWLINE
882:1 glyph ++
9−2:4 name text
10−2:9 glyph (
11−2:10 tight wing identity.a
12−2:21 str "hi"
13−2:25 tight glyph )
14−2:26 NEWLINE
9+2:4 name text-value
10+2:15 glyph (
11+2:16 tight wing identity.a
12+2:27 str "hi"
13+2:31 tight glyph )
14+2:32 NEWLINE
tests/golden/module-import-cycle/tree.txt+3−3
@@ -1,5 +1,5 @@
11(module
22 (jibb 1:1 a /ui/a)
3− (value 2:1 text
4− (group 2:9
5− (call 2:10 (wing 2:10 identity.a) (str 2:21 "hi")))))
3+ (value 2:1 text-value
4+ (group 2:15
5+ (call 2:16 (wing 2:16 identity.a) (str 2:27 "hi")))))
tests/golden/module-import-identity/source.jibb+1−1
@@ -1,3 +1,3 @@
11/= lib /ui/lib
2−++ text (identity.lib "hi")
2+++ text-value (identity.lib "hi")
33++ ship (identity.lib ~zod)
tests/golden/module-import-identity/tokens.txt+5−5
@@ -6,11 +6,11 @@
661:13 tight knot lib
772:1 NEWLINE
882:1 glyph ++
9−2:4 name text
10−2:9 glyph (
11−2:10 tight wing identity.lib
12−2:23 str "hi"
13−2:27 tight glyph )
9+2:4 name text-value
10+2:15 glyph (
11+2:16 tight wing identity.lib
12+2:29 str "hi"
13+2:33 tight glyph )
14143:1 NEWLINE
15153:1 glyph ++
16163:4 name ship
tests/golden/module-import-identity/tree.txt+3−3
@@ -1,8 +1,8 @@
11(module
22 (jibb 1:1 lib /ui/lib)
3− (value 2:1 text
4− (group 2:9
5− (call 2:10 (wing 2:10 identity.lib) (str 2:23 "hi"))))
3+ (value 2:1 text-value
4+ (group 2:15
5+ (call 2:16 (wing 2:16 identity.lib) (str 2:29 "hi"))))
66 (value 3:1 ship
77 (group 3:9
88 (call 3:10 (wing 3:10 identity.lib) (lit 3:23 ~zod)))))
tests/golden/module-import-identity/types.txt+1−1
@@ -1,3 +1,3 @@
11partial inference; module not checked
2−++ text: @t
2+++ text-value: @t
33++ ship: @p
tests/golden/module-import-transitive/source.jibb+1−1
@@ -1,2 +1,2 @@
11/= a /ui/a
2−++ text (identity.a "hi")
2+++ text-value (identity.a "hi")
tests/golden/module-import-transitive/tokens.txt+6−6
@@ -6,9 +6,9 @@
661:11 tight knot a
772:1 NEWLINE
882:1 glyph ++
9−2:4 name text
10−2:9 glyph (
11−2:10 tight wing identity.a
12−2:21 str "hi"
13−2:25 tight glyph )
14−2:26 NEWLINE
9+2:4 name text-value
10+2:15 glyph (
11+2:16 tight wing identity.a
12+2:27 str "hi"
13+2:31 tight glyph )
14+2:32 NEWLINE
tests/golden/module-import-transitive/tree.txt+3−3
@@ -1,5 +1,5 @@
11(module
22 (jibb 1:1 a /ui/a)
3− (value 2:1 text
4− (group 2:9
5− (call 2:10 (wing 2:10 identity.a) (str 2:21 "hi")))))
3+ (value 2:1 text-value
4+ (group 2:15
5+ (call 2:16 (wing 2:16 identity.a) (str 2:27 "hi")))))
tests/golden/module-import-transitive/types.txt+1−1
@@ -1,2 +1,2 @@
11partial inference; module not checked
2−++ text: @t
2+++ text-value: @t
tests/golden/module-import-unused-invalid/source.jibb+1−1
@@ -1,2 +1,2 @@
11/= good /ui/good
2−++ text (identity.good "hi")
2+++ text-value (identity.good "hi")
tests/golden/module-import-unused-invalid/tokens.txt+6−6
@@ -6,9 +6,9 @@
661:14 tight knot good
772:1 NEWLINE
882:1 glyph ++
9−2:4 name text
10−2:9 glyph (
11−2:10 tight wing identity.good
12−2:24 str "hi"
13−2:28 tight glyph )
14−2:29 NEWLINE
9+2:4 name text-value
10+2:15 glyph (
11+2:16 tight wing identity.good
12+2:30 str "hi"
13+2:34 tight glyph )
14+2:35 NEWLINE
tests/golden/module-import-unused-invalid/tree.txt+3−3
@@ -1,5 +1,5 @@
11(module
22 (jibb 1:1 good /ui/good)
3− (value 2:1 text
4− (group 2:9
5− (call 2:10 (wing 2:10 identity.good) (str 2:24 "hi")))))
3+ (value 2:1 text-value
4+ (group 2:15
5+ (call 2:16 (wing 2:16 identity.good) (str 2:30 "hi")))))
tests/golden/module-import-unused-invalid/types.txt+1−1
@@ -1,2 +1,2 @@
11partial inference; module not checked
2−++ text: @t
2+++ text-value: @t
tests/golden/prelude-unit-list-transforms/about.txt+2−2
@@ -1,4 +1,4 @@
1−source: Overview, Prelude: "The exported inventory includes all names from the Hoon library sections listed below, excluding the groups explicitly left out"; Hoon 2a includes `drop`, `bind`, `biff`, `flit`, `both`, `clap` and `clef`, and 2b includes `join`, `murn`, `rear`, `snip`, `skim`, `skip`, `levy`, `lien`, `roll` and `reel`. Folds take an explicit start.
2−tests: The complete current prelude parses, including unit-to-list conversion, unit mapping and flat mapping, a curried unit-producing filter, three ways to combine units, including `clap` with one shared value type, complementary list filters, present-product mapping, joining, last-item operations, all/any predicates, and left and right folds. The filters retain the order of their selected items. It also includes the source-backed `ask` re-export and `pure` gate.
1+source: Overview, Prelude: "The exported inventory includes all names from the Hoon library sections listed below, excluding the groups explicitly left out"; Hoon 2a includes `drop`, `bind`, `biff`, `flit`, `both`, `clap`, `clef` and `hunt`, and 2b includes `join`, `murn`, `rear`, `snip`, `skim`, `skip`, `levy`, `lien`, `roll` and `reel`. Folds take an explicit start.
2+tests: The complete current prelude parses, including unit-to-list conversion, unit mapping and flat mapping, a curried unit-producing filter, three ways to combine units, including `clap` with one shared value type, and `hunt` with its ordering gate first, complementary list filters, present-product mapping, joining, last-item operations, all/any predicates, and left and right folds. The filters retain the order of their selected items. It also includes the source-backed `ask` re-export and `pure` gate.
33expect: parses
44expect-types: a partial inference report, not a checked module; unit and list gate typing is not complete
tests/golden/prelude-unit-list-transforms/source.jibb+15−2
@@ -1,5 +1,5 @@
11/= internal /lib/jibb/internal
2−+$ poke poke.internal
2++$ raw-poke raw-poke.internal
33+$ qath qath.internal
44
55:: Initial prelude functions. The rest of the inventory is still to come.
@@ -198,6 +198,19 @@
198198 ~ first
199199 [~ b] `(combine a b)
200200
201+++ hunt |= args=[$-([A A] ?) (unit A) (unit A)]
202+ ?- args
203+ [choose first second] ^- (unit A)
204+ ?- first
205+ ~ second
206+ [~ a]
207+ ?- second
208+ ~ first
209+ [~ b]
210+ ?- (choose a b)
211+ %.y first
212+ %.n second
213+
201214++ clef |= args=[(unit A) (unit B) $-([A B] (unit C))]
202215 ?- args
203216 [first second combine] ^- (unit C)
@@ -325,7 +338,7 @@
325338 [f b] |= a=A (f a b)
326339
327340+$ cmd |$ [M]
328− [%poke p=poke reply=$-((unit @t) M)]
341+ [%poke p=raw-poke reply=$-((unit @t) M)]
329342 [%go url=@t]
330343 [%wait gap=@dr msg=M]
331344 [%now reply=$-(@da M)]
tests/golden/prelude-unit-list-transforms/tokens.txt+1030−950
@@ -8,8 +8,8 @@
881:23 tight knot internal
992:1 NEWLINE
10102:1 glyph +$
11−2:4 name poke
12−2:9 wing poke.internal
11+2:4 name raw-poke
12+2:13 wing raw-poke.internal
13133:1 NEWLINE
14143:1 glyph +$
15153:4 name qath
@@ -1250,50 +1250,47 @@
12501250201:1 DEDENT
12511251201:1 NEWLINE
12521252201:1 glyph ++
1253−201:4 name clef
1253+201:4 name hunt
12541254201:9 glyph |=
12551255201:12 name args
12561256201:16 tight glyph =
12571257201:17 tight glyph [
1258−201:18 tight glyph (
1259−201:19 tight name unit
1258+201:18 tight glyph $-(
1259+201:21 tight glyph [
1260+201:22 tight tvar A
12601261201:24 tvar A
1261−201:25 tight glyph )
1262−201:27 glyph (
1263−201:28 tight name unit
1264−201:33 tvar B
1265−201:34 tight glyph )
1266−201:36 glyph $-(
1267−201:39 tight glyph [
1268−201:40 tight tvar A
1269−201:42 tvar B
1270−201:43 tight glyph ]
1271−201:45 glyph (
1272−201:46 tight name unit
1273−201:51 tvar C
1274−201:52 tight glyph )
1275−201:53 tight glyph )
1276−201:54 tight glyph ]
1262+201:25 tight glyph ]
1263+201:27 glyph ?
1264+201:28 tight glyph )
1265+201:30 glyph (
1266+201:31 tight name unit
1267+201:36 tvar A
1268+201:37 tight glyph )
1269+201:39 glyph (
1270+201:40 tight name unit
1271+201:45 tvar A
1272+201:46 tight glyph )
1273+201:47 tight glyph ]
12771274202:3 INDENT
12781275202:3 glyph ?-
12791276202:6 name args
12801277203:5 INDENT
12811278203:5 glyph [
1282−203:6 tight name first
1283−203:12 name second
1284−203:19 name combine
1285−203:26 tight glyph ]
1286−203:28 glyph ^-
1287−203:31 glyph (
1288−203:32 tight name unit
1289−203:37 tvar C
1290−203:38 tight glyph )
1279+203:6 tight name choose
1280+203:13 name first
1281+203:19 name second
1282+203:25 tight glyph ]
1283+203:27 glyph ^-
1284+203:30 glyph (
1285+203:31 tight name unit
1286+203:36 tvar A
1287+203:37 tight glyph )
12911288204:7 INDENT
12921289204:7 glyph ?-
12931290204:10 name first
12941291205:9 INDENT
12951292205:9 lit ~
1296−205:11 lit ~
1293+205:11 name second
12971294206:9 NEWLINE
12981295206:9 glyph [
12991296206:10 tight lit ~
@@ -1304,931 +1301,1014 @@
13041301207:14 name second
13051302208:13 INDENT
13061303208:13 lit ~
1307−208:15 lit ~
1304+208:15 name first
13081305209:13 NEWLINE
13091306209:13 glyph [
13101307209:14 tight lit ~
13111308209:16 name b
13121309209:17 tight glyph ]
1313−209:19 glyph (
1314−209:20 tight name combine
1315−209:28 name a
1316−209:30 name b
1317−209:31 tight glyph )
1318−211:1 DEDENT
1319−211:1 DEDENT
1320−211:1 DEDENT
1321−211:1 DEDENT
1322−211:1 DEDENT
1323−211:1 DEDENT
1324−211:1 NEWLINE
1325−211:1 glyph ++
1326−211:4 name skim
1327−211:9 glyph |=
1328−211:12 name args
1329−211:16 tight glyph =
1330−211:17 tight glyph [
1331−211:18 tight glyph (
1332−211:19 tight name list
1333−211:24 tvar A
1334−211:25 tight glyph )
1335−211:27 glyph $-(
1336−211:30 tight tvar A
1337−211:32 glyph ?
1338−211:33 tight glyph )
1339−211:34 tight glyph ]
1340−212:3 INDENT
1341−212:3 glyph ?-
1342−212:6 name args
1343−213:5 INDENT
1344−213:5 glyph [
1345−213:6 tight name xs
1346−213:9 name predicate
1347−213:18 tight glyph ]
1348−213:20 glyph ^-
1349−213:23 glyph (
1350−213:24 tight name list
1351−213:29 tvar A
1352−213:30 tight glyph )
1353−214:9 INDENT
1354−214:9 glyph ?-
1355−214:12 name xs
1356−215:11 INDENT
1357−215:11 lit ~
1358−215:13 lit ~
1359−216:11 NEWLINE
1360−216:11 glyph [
1361−216:12 tight name item
1362−216:17 name rest
1363−216:21 tight glyph ]
1364−217:13 INDENT
1365−217:13 glyph ?-
1366−217:16 glyph (
1367−217:17 tight name predicate
1368−217:27 name item
1369−217:31 tight glyph )
1370−218:15 INDENT
1371−218:15 lit %.y
1372−218:19 glyph [
1373−218:20 tight name item
1374−218:25 glyph (
1375−218:26 tight name skim
1376−218:31 name rest
1377−218:36 name predicate
1378−218:45 tight glyph )
1379−218:46 tight glyph ]
1380−219:15 NEWLINE
1381−219:15 lit %.n
1382−219:19 glyph (
1383−219:20 tight name skim
1384−219:25 name rest
1385−219:30 name predicate
1386−219:39 tight glyph )
1387−221:1 DEDENT
1388−221:1 DEDENT
1389−221:1 DEDENT
1390−221:1 DEDENT
1391−221:1 DEDENT
1392−221:1 DEDENT
1393−221:1 NEWLINE
1394−221:1 glyph ++
1395−221:4 name skip
1396−221:9 glyph |=
1397−221:12 name args
1398−221:16 tight glyph =
1399−221:17 tight glyph [
1400−221:18 tight glyph (
1401−221:19 tight name list
1402−221:24 tvar A
1403−221:25 tight glyph )
1404−221:27 glyph $-(
1405−221:30 tight tvar A
1406−221:32 glyph ?
1407−221:33 tight glyph )
1408−221:34 tight glyph ]
1409−222:3 INDENT
1410−222:3 glyph ?-
1411−222:6 name args
1412−223:5 INDENT
1413−223:5 glyph [
1414−223:6 tight name xs
1415−223:9 name predicate
1416−223:18 tight glyph ]
1417−223:20 glyph ^-
1418−223:23 glyph (
1419−223:24 tight name list
1420−223:29 tvar A
1421−223:30 tight glyph )
1422−224:9 INDENT
1423−224:9 glyph ?-
1424−224:12 name xs
1425−225:11 INDENT
1426−225:11 lit ~
1427−225:13 lit ~
1428−226:11 NEWLINE
1429−226:11 glyph [
1430−226:12 tight name item
1431−226:17 name rest
1432−226:21 tight glyph ]
1433−227:13 INDENT
1434−227:13 glyph ?-
1435−227:16 glyph (
1436−227:17 tight name predicate
1437−227:27 name item
1438−227:31 tight glyph )
1439−228:15 INDENT
1440−228:15 lit %.y
1441−228:19 glyph (
1442−228:20 tight name skip
1443−228:25 name rest
1444−228:30 name predicate
1445−228:39 tight glyph )
1446−229:15 NEWLINE
1447−229:15 lit %.n
1448−229:19 glyph [
1449−229:20 tight name item
1450−229:25 glyph (
1451−229:26 tight name skip
1452−229:31 name rest
1453−229:36 name predicate
1454−229:45 tight glyph )
1455−229:46 tight glyph ]
1456−231:1 DEDENT
1457−231:1 DEDENT
1458−231:1 DEDENT
1459−231:1 DEDENT
1460−231:1 DEDENT
1461−231:1 DEDENT
1462−231:1 NEWLINE
1463−231:1 glyph ++
1464−231:4 name levy
1465−231:9 glyph |=
1466−231:12 name args
1467−231:16 tight glyph =
1468−231:17 tight glyph [
1469−231:18 tight glyph (
1470−231:19 tight name list
1471−231:24 tvar A
1472−231:25 tight glyph )
1473−231:27 glyph $-(
1474−231:30 tight tvar A
1475−231:32 glyph ?
1476−231:33 tight glyph )
1477−231:34 tight glyph ]
1478−232:3 INDENT
1479−232:3 glyph ^-
1480−232:6 glyph ?
1481−233:5 INDENT
1482−233:5 glyph ?-
1483−233:8 name args
1484−234:7 INDENT
1485−234:7 glyph [
1486−234:8 tight name xs
1487−234:11 name predicate
1488−234:20 tight glyph ]
1489−235:9 INDENT
1490−235:9 glyph ?-
1491−235:12 name xs
1492−236:11 INDENT
1493−236:11 lit ~
1494−236:13 lit %.y
1495−237:11 NEWLINE
1496−237:11 glyph [
1497−237:12 tight name item
1498−237:17 name rest
1499−237:21 tight glyph ]
1500−238:13 INDENT
1501−238:13 glyph ?-
1502−238:16 glyph (
1503−238:17 tight name predicate
1504−238:27 name item
1505−238:31 tight glyph )
1506−239:15 INDENT
1507−239:15 lit %.y
1508−239:19 glyph (
1509−239:20 tight name levy
1510−239:25 name rest
1511−239:30 name predicate
1512−239:39 tight glyph )
1513−240:15 NEWLINE
1514−240:15 lit %.n
1515−240:19 lit %.n
1516−242:1 DEDENT
1517−242:1 DEDENT
1518−242:1 DEDENT
1519−242:1 DEDENT
1520−242:1 DEDENT
1521−242:1 DEDENT
1522−242:1 DEDENT
1523−242:1 NEWLINE
1524−242:1 glyph ++
1525−242:4 name lien
1526−242:9 glyph |=
1527−242:12 name args
1528−242:16 tight glyph =
1529−242:17 tight glyph [
1530−242:18 tight glyph (
1531−242:19 tight name list
1532−242:24 tvar A
1533−242:25 tight glyph )
1534−242:27 glyph $-(
1535−242:30 tight tvar A
1536−242:32 glyph ?
1537−242:33 tight glyph )
1538−242:34 tight glyph ]
1539−243:3 INDENT
1540−243:3 glyph ^-
1541−243:6 glyph ?
1542−244:5 INDENT
1543−244:5 glyph ?-
1544−244:8 name args
1545−245:7 INDENT
1546−245:7 glyph [
1547−245:8 tight name xs
1548−245:11 name predicate
1549−245:20 tight glyph ]
1550−246:9 INDENT
1551−246:9 glyph ?-
1552−246:12 name xs
1553−247:11 INDENT
1554−247:11 lit ~
1555−247:13 lit %.n
1556−248:11 NEWLINE
1557−248:11 glyph [
1558−248:12 tight name item
1559−248:17 name rest
1560−248:21 tight glyph ]
1561−249:13 INDENT
1562−249:13 glyph ?-
1563−249:16 glyph (
1564−249:17 tight name predicate
1565−249:27 name item
1566−249:31 tight glyph )
1567−250:15 INDENT
1568−250:15 lit %.y
1569−250:19 lit %.y
1570−251:15 NEWLINE
1571−251:15 lit %.n
1572−251:19 glyph (
1573−251:20 tight name lien
1574−251:25 name rest
1575−251:30 name predicate
1576−251:39 tight glyph )
1577−253:1 DEDENT
1578−253:1 DEDENT
1579−253:1 DEDENT
1580−253:1 DEDENT
1581−253:1 DEDENT
1582−253:1 DEDENT
1583−253:1 DEDENT
1584−253:1 NEWLINE
1585−253:1 glyph ++
1586−253:4 name roll
1587−253:9 glyph |=
1588−253:12 name args
1589−253:16 tight glyph =
1590−253:17 tight glyph [
1591−253:18 tight glyph (
1592−253:19 tight name list
1593−253:24 tvar A
1594−253:25 tight glyph )
1595−253:27 tvar B
1596−253:29 glyph $-(
1597−253:32 tight glyph [
1598−253:33 tight tvar A
1599−253:35 tvar B
1600−253:36 tight glyph ]
1601−253:38 tvar B
1602−253:39 tight glyph )
1603−253:40 tight glyph ]
1604−254:3 INDENT
1605−254:3 glyph ?-
1606−254:6 name args
1607−255:5 INDENT
1608−255:5 glyph [
1609−255:6 tight name xs
1610−255:9 name start
1611−255:15 name combine
1612−255:22 tight glyph ]
1613−256:7 INDENT
1614−256:7 glyph ?-
1615−256:10 name xs
1616−257:9 INDENT
1617−257:9 lit ~
1618−257:11 name start
1619−258:9 NEWLINE
1620−258:9 glyph [
1621−258:10 tight name item
1622−258:15 name rest
1623−258:19 tight glyph ]
1624−258:21 glyph (
1625−258:22 tight name roll
1626−258:27 name rest
1627−258:32 glyph (
1628−258:33 tight name combine
1629−258:41 name item
1630−258:46 name start
1631−258:51 tight glyph )
1632−258:53 name combine
1633−258:60 tight glyph )
1634−260:1 DEDENT
1635−260:1 DEDENT
1636−260:1 DEDENT
1637−260:1 DEDENT
1638−260:1 NEWLINE
1639−260:1 glyph ++
1640−260:4 name reel
1641−260:9 glyph |=
1642−260:12 name args
1643−260:16 tight glyph =
1644−260:17 tight glyph [
1645−260:18 tight glyph (
1646−260:19 tight name list
1647−260:24 tvar A
1648−260:25 tight glyph )
1649−260:27 tvar B
1650−260:29 glyph $-(
1651−260:32 tight glyph [
1652−260:33 tight tvar A
1653−260:35 tvar B
1654−260:36 tight glyph ]
1655−260:38 tvar B
1656−260:39 tight glyph )
1657−260:40 tight glyph ]
1658−261:3 INDENT
1659−261:3 glyph ?-
1660−261:6 name args
1661−262:5 INDENT
1662−262:5 glyph [
1663−262:6 tight name xs
1664−262:9 name start
1665−262:15 name combine
1666−262:22 tight glyph ]
1667−263:7 INDENT
1668−263:7 glyph ?-
1669−263:10 name xs
1670−264:9 INDENT
1671−264:9 lit ~
1672−264:11 name start
1673−265:9 NEWLINE
1674−265:9 glyph [
1675−265:10 tight name item
1676−265:15 name rest
1677−265:19 tight glyph ]
1678−265:21 glyph (
1679−265:22 tight name combine
1680−265:30 name item
1681−265:35 glyph (
1682−265:36 tight name reel
1683−265:41 name rest
1684−265:46 name start
1685−265:52 name combine
1686−265:59 tight glyph )
1687−265:60 tight glyph )
1688−267:1 DEDENT
1689−267:1 DEDENT
1690−267:1 DEDENT
1691−267:1 DEDENT
1692−267:1 NEWLINE
1693−267:1 glyph ++
1694−267:4 name flit
1695−267:9 glyph |=
1696−267:12 name predicate
1697−267:21 tight glyph =
1698−267:22 tight glyph $-(
1699−267:25 tight tvar A
1700−267:27 glyph ?
1701−267:28 tight glyph )
1702−268:3 INDENT
1703−268:3 glyph |=
1704−268:6 name value
1705−268:11 tight glyph =
1706−268:12 tight tvar A
1707−269:5 INDENT
1708−269:5 glyph ^-
1709−269:8 glyph (
1710−269:9 tight name unit
1711−269:14 tvar A
1712−269:15 tight glyph )
1713−270:7 INDENT
1714−270:7 glyph ?-
1715−270:10 glyph (
1716−270:11 tight name predicate
1717−270:21 name value
1718−270:26 tight glyph )
1719−271:9 INDENT
1720−271:9 lit %.y
1721−271:13 glyph `
1722−271:14 tight name value
1723−272:9 NEWLINE
1724−272:9 lit %.n
1725−272:13 lit ~
1726−274:1 DEDENT
1727−274:1 DEDENT
1728−274:1 DEDENT
1729−274:1 DEDENT
1730−274:1 NEWLINE
1731−274:1 glyph ++
1732−274:4 name murn
1733−274:9 glyph |=
1734−274:12 name args
1735−274:16 tight glyph =
1736−274:17 tight glyph [
1737−274:18 tight glyph (
1738−274:19 tight name list
1739−274:24 tvar A
1740−274:25 tight glyph )
1741−274:27 glyph $-(
1742−274:30 tight tvar A
1743−274:32 glyph (
1744−274:33 tight name unit
1745−274:38 tvar B
1746−274:39 tight glyph )
1747−274:40 tight glyph )
1748−274:41 tight glyph ]
1749−275:3 INDENT
1750−275:3 glyph ?-
1751−275:6 name args
1752−276:5 INDENT
1753−276:5 glyph [
1754−276:6 tight name xs
1755−276:9 name f
1756−276:10 tight glyph ]
1757−276:12 glyph ^-
1758−276:15 glyph (
1759−276:16 tight name list
1760−276:21 tvar B
1761−276:22 tight glyph )
1310+210:15 INDENT
1311+210:15 glyph ?-
1312+210:18 glyph (
1313+210:19 tight name choose
1314+210:26 name a
1315+210:28 name b
1316+210:29 tight glyph )
1317+211:17 INDENT
1318+211:17 lit %.y
1319+211:21 name first
1320+212:17 NEWLINE
1321+212:17 lit %.n
1322+212:21 name second
1323+214:1 DEDENT
1324+214:1 DEDENT
1325+214:1 DEDENT
1326+214:1 DEDENT
1327+214:1 DEDENT
1328+214:1 DEDENT
1329+214:1 DEDENT
1330+214:1 DEDENT
1331+214:1 NEWLINE
1332+214:1 glyph ++
1333+214:4 name clef
1334+214:9 glyph |=
1335+214:12 name args
1336+214:16 tight glyph =
1337+214:17 tight glyph [
1338+214:18 tight glyph (
1339+214:19 tight name unit
1340+214:24 tvar A
1341+214:25 tight glyph )
1342+214:27 glyph (
1343+214:28 tight name unit
1344+214:33 tvar B
1345+214:34 tight glyph )
1346+214:36 glyph $-(
1347+214:39 tight glyph [
1348+214:40 tight tvar A
1349+214:42 tvar B
1350+214:43 tight glyph ]
1351+214:45 glyph (
1352+214:46 tight name unit
1353+214:51 tvar C
1354+214:52 tight glyph )
1355+214:53 tight glyph )
1356+214:54 tight glyph ]
1357+215:3 INDENT
1358+215:3 glyph ?-
1359+215:6 name args
1360+216:5 INDENT
1361+216:5 glyph [
1362+216:6 tight name first
1363+216:12 name second
1364+216:19 name combine
1365+216:26 tight glyph ]
1366+216:28 glyph ^-
1367+216:31 glyph (
1368+216:32 tight name unit
1369+216:37 tvar C
1370+216:38 tight glyph )
1371+217:7 INDENT
1372+217:7 glyph ?-
1373+217:10 name first
1374+218:9 INDENT
1375+218:9 lit ~
1376+218:11 lit ~
1377+219:9 NEWLINE
1378+219:9 glyph [
1379+219:10 tight lit ~
1380+219:12 name a
1381+219:13 tight glyph ]
1382+220:11 INDENT
1383+220:11 glyph ?-
1384+220:14 name second
1385+221:13 INDENT
1386+221:13 lit ~
1387+221:15 lit ~
1388+222:13 NEWLINE
1389+222:13 glyph [
1390+222:14 tight lit ~
1391+222:16 name b
1392+222:17 tight glyph ]
1393+222:19 glyph (
1394+222:20 tight name combine
1395+222:28 name a
1396+222:30 name b
1397+222:31 tight glyph )
1398+224:1 DEDENT
1399+224:1 DEDENT
1400+224:1 DEDENT
1401+224:1 DEDENT
1402+224:1 DEDENT
1403+224:1 DEDENT
1404+224:1 NEWLINE
1405+224:1 glyph ++
1406+224:4 name skim
1407+224:9 glyph |=
1408+224:12 name args
1409+224:16 tight glyph =
1410+224:17 tight glyph [
1411+224:18 tight glyph (
1412+224:19 tight name list
1413+224:24 tvar A
1414+224:25 tight glyph )
1415+224:27 glyph $-(
1416+224:30 tight tvar A
1417+224:32 glyph ?
1418+224:33 tight glyph )
1419+224:34 tight glyph ]
1420+225:3 INDENT
1421+225:3 glyph ?-
1422+225:6 name args
1423+226:5 INDENT
1424+226:5 glyph [
1425+226:6 tight name xs
1426+226:9 name predicate
1427+226:18 tight glyph ]
1428+226:20 glyph ^-
1429+226:23 glyph (
1430+226:24 tight name list
1431+226:29 tvar A
1432+226:30 tight glyph )
1433+227:9 INDENT
1434+227:9 glyph ?-
1435+227:12 name xs
1436+228:11 INDENT
1437+228:11 lit ~
1438+228:13 lit ~
1439+229:11 NEWLINE
1440+229:11 glyph [
1441+229:12 tight name item
1442+229:17 name rest
1443+229:21 tight glyph ]
1444+230:13 INDENT
1445+230:13 glyph ?-
1446+230:16 glyph (
1447+230:17 tight name predicate
1448+230:27 name item
1449+230:31 tight glyph )
1450+231:15 INDENT
1451+231:15 lit %.y
1452+231:19 glyph [
1453+231:20 tight name item
1454+231:25 glyph (
1455+231:26 tight name skim
1456+231:31 name rest
1457+231:36 name predicate
1458+231:45 tight glyph )
1459+231:46 tight glyph ]
1460+232:15 NEWLINE
1461+232:15 lit %.n
1462+232:19 glyph (
1463+232:20 tight name skim
1464+232:25 name rest
1465+232:30 name predicate
1466+232:39 tight glyph )
1467+234:1 DEDENT
1468+234:1 DEDENT
1469+234:1 DEDENT
1470+234:1 DEDENT
1471+234:1 DEDENT
1472+234:1 DEDENT
1473+234:1 NEWLINE
1474+234:1 glyph ++
1475+234:4 name skip
1476+234:9 glyph |=
1477+234:12 name args
1478+234:16 tight glyph =
1479+234:17 tight glyph [
1480+234:18 tight glyph (
1481+234:19 tight name list
1482+234:24 tvar A
1483+234:25 tight glyph )
1484+234:27 glyph $-(
1485+234:30 tight tvar A
1486+234:32 glyph ?
1487+234:33 tight glyph )
1488+234:34 tight glyph ]
1489+235:3 INDENT
1490+235:3 glyph ?-
1491+235:6 name args
1492+236:5 INDENT
1493+236:5 glyph [
1494+236:6 tight name xs
1495+236:9 name predicate
1496+236:18 tight glyph ]
1497+236:20 glyph ^-
1498+236:23 glyph (
1499+236:24 tight name list
1500+236:29 tvar A
1501+236:30 tight glyph )
1502+237:9 INDENT
1503+237:9 glyph ?-
1504+237:12 name xs
1505+238:11 INDENT
1506+238:11 lit ~
1507+238:13 lit ~
1508+239:11 NEWLINE
1509+239:11 glyph [
1510+239:12 tight name item
1511+239:17 name rest
1512+239:21 tight glyph ]
1513+240:13 INDENT
1514+240:13 glyph ?-
1515+240:16 glyph (
1516+240:17 tight name predicate
1517+240:27 name item
1518+240:31 tight glyph )
1519+241:15 INDENT
1520+241:15 lit %.y
1521+241:19 glyph (
1522+241:20 tight name skip
1523+241:25 name rest
1524+241:30 name predicate
1525+241:39 tight glyph )
1526+242:15 NEWLINE
1527+242:15 lit %.n
1528+242:19 glyph [
1529+242:20 tight name item
1530+242:25 glyph (
1531+242:26 tight name skip
1532+242:31 name rest
1533+242:36 name predicate
1534+242:45 tight glyph )
1535+242:46 tight glyph ]
1536+244:1 DEDENT
1537+244:1 DEDENT
1538+244:1 DEDENT
1539+244:1 DEDENT
1540+244:1 DEDENT
1541+244:1 DEDENT
1542+244:1 NEWLINE
1543+244:1 glyph ++
1544+244:4 name levy
1545+244:9 glyph |=
1546+244:12 name args
1547+244:16 tight glyph =
1548+244:17 tight glyph [
1549+244:18 tight glyph (
1550+244:19 tight name list
1551+244:24 tvar A
1552+244:25 tight glyph )
1553+244:27 glyph $-(
1554+244:30 tight tvar A
1555+244:32 glyph ?
1556+244:33 tight glyph )
1557+244:34 tight glyph ]
1558+245:3 INDENT
1559+245:3 glyph ^-
1560+245:6 glyph ?
1561+246:5 INDENT
1562+246:5 glyph ?-
1563+246:8 name args
1564+247:7 INDENT
1565+247:7 glyph [
1566+247:8 tight name xs
1567+247:11 name predicate
1568+247:20 tight glyph ]
1569+248:9 INDENT
1570+248:9 glyph ?-
1571+248:12 name xs
1572+249:11 INDENT
1573+249:11 lit ~
1574+249:13 lit %.y
1575+250:11 NEWLINE
1576+250:11 glyph [
1577+250:12 tight name item
1578+250:17 name rest
1579+250:21 tight glyph ]
1580+251:13 INDENT
1581+251:13 glyph ?-
1582+251:16 glyph (
1583+251:17 tight name predicate
1584+251:27 name item
1585+251:31 tight glyph )
1586+252:15 INDENT
1587+252:15 lit %.y
1588+252:19 glyph (
1589+252:20 tight name levy
1590+252:25 name rest
1591+252:30 name predicate
1592+252:39 tight glyph )
1593+253:15 NEWLINE
1594+253:15 lit %.n
1595+253:19 lit %.n
1596+255:1 DEDENT
1597+255:1 DEDENT
1598+255:1 DEDENT
1599+255:1 DEDENT
1600+255:1 DEDENT
1601+255:1 DEDENT
1602+255:1 DEDENT
1603+255:1 NEWLINE
1604+255:1 glyph ++
1605+255:4 name lien
1606+255:9 glyph |=
1607+255:12 name args
1608+255:16 tight glyph =
1609+255:17 tight glyph [
1610+255:18 tight glyph (
1611+255:19 tight name list
1612+255:24 tvar A
1613+255:25 tight glyph )
1614+255:27 glyph $-(
1615+255:30 tight tvar A
1616+255:32 glyph ?
1617+255:33 tight glyph )
1618+255:34 tight glyph ]
1619+256:3 INDENT
1620+256:3 glyph ^-
1621+256:6 glyph ?
1622+257:5 INDENT
1623+257:5 glyph ?-
1624+257:8 name args
1625+258:7 INDENT
1626+258:7 glyph [
1627+258:8 tight name xs
1628+258:11 name predicate
1629+258:20 tight glyph ]
1630+259:9 INDENT
1631+259:9 glyph ?-
1632+259:12 name xs
1633+260:11 INDENT
1634+260:11 lit ~
1635+260:13 lit %.n
1636+261:11 NEWLINE
1637+261:11 glyph [
1638+261:12 tight name item
1639+261:17 name rest
1640+261:21 tight glyph ]
1641+262:13 INDENT
1642+262:13 glyph ?-
1643+262:16 glyph (
1644+262:17 tight name predicate
1645+262:27 name item
1646+262:31 tight glyph )
1647+263:15 INDENT
1648+263:15 lit %.y
1649+263:19 lit %.y
1650+264:15 NEWLINE
1651+264:15 lit %.n
1652+264:19 glyph (
1653+264:20 tight name lien
1654+264:25 name rest
1655+264:30 name predicate
1656+264:39 tight glyph )
1657+266:1 DEDENT
1658+266:1 DEDENT
1659+266:1 DEDENT
1660+266:1 DEDENT
1661+266:1 DEDENT
1662+266:1 DEDENT
1663+266:1 DEDENT
1664+266:1 NEWLINE
1665+266:1 glyph ++
1666+266:4 name roll
1667+266:9 glyph |=
1668+266:12 name args
1669+266:16 tight glyph =
1670+266:17 tight glyph [
1671+266:18 tight glyph (
1672+266:19 tight name list
1673+266:24 tvar A
1674+266:25 tight glyph )
1675+266:27 tvar B
1676+266:29 glyph $-(
1677+266:32 tight glyph [
1678+266:33 tight tvar A
1679+266:35 tvar B
1680+266:36 tight glyph ]
1681+266:38 tvar B
1682+266:39 tight glyph )
1683+266:40 tight glyph ]
1684+267:3 INDENT
1685+267:3 glyph ?-
1686+267:6 name args
1687+268:5 INDENT
1688+268:5 glyph [
1689+268:6 tight name xs
1690+268:9 name start
1691+268:15 name combine
1692+268:22 tight glyph ]
1693+269:7 INDENT
1694+269:7 glyph ?-
1695+269:10 name xs
1696+270:9 INDENT
1697+270:9 lit ~
1698+270:11 name start
1699+271:9 NEWLINE
1700+271:9 glyph [
1701+271:10 tight name item
1702+271:15 name rest
1703+271:19 tight glyph ]
1704+271:21 glyph (
1705+271:22 tight name roll
1706+271:27 name rest
1707+271:32 glyph (
1708+271:33 tight name combine
1709+271:41 name item
1710+271:46 name start
1711+271:51 tight glyph )
1712+271:53 name combine
1713+271:60 tight glyph )
1714+273:1 DEDENT
1715+273:1 DEDENT
1716+273:1 DEDENT
1717+273:1 DEDENT
1718+273:1 NEWLINE
1719+273:1 glyph ++
1720+273:4 name reel
1721+273:9 glyph |=
1722+273:12 name args
1723+273:16 tight glyph =
1724+273:17 tight glyph [
1725+273:18 tight glyph (
1726+273:19 tight name list
1727+273:24 tvar A
1728+273:25 tight glyph )
1729+273:27 tvar B
1730+273:29 glyph $-(
1731+273:32 tight glyph [
1732+273:33 tight tvar A
1733+273:35 tvar B
1734+273:36 tight glyph ]
1735+273:38 tvar B
1736+273:39 tight glyph )
1737+273:40 tight glyph ]
1738+274:3 INDENT
1739+274:3 glyph ?-
1740+274:6 name args
1741+275:5 INDENT
1742+275:5 glyph [
1743+275:6 tight name xs
1744+275:9 name start
1745+275:15 name combine
1746+275:22 tight glyph ]
1747+276:7 INDENT
1748+276:7 glyph ?-
1749+276:10 name xs
17621750277:9 INDENT
1763−277:9 glyph ?-
1764−277:12 name xs
1765−278:11 INDENT
1766−278:11 lit ~
1767−278:13 lit ~
1768−279:11 NEWLINE
1769−279:11 glyph [
1770−279:12 tight name item
1771−279:17 name rest
1772−279:21 tight glyph ]
1773−280:13 INDENT
1774−280:13 glyph ?-
1775−280:16 glyph (
1776−280:17 tight name f
1777−280:19 name item
1778−280:23 tight glyph )
1779−281:15 INDENT
1780−281:15 lit ~
1781−281:17 glyph (
1782−281:18 tight name murn
1783−281:23 name rest
1784−281:28 name f
1785−281:29 tight glyph )
1786−282:15 NEWLINE
1787−282:15 glyph [
1788−282:16 tight lit ~
1789−282:18 name value
1790−282:23 tight glyph ]
1791−282:25 glyph [
1792−282:26 tight name value
1793−282:32 glyph (
1794−282:33 tight name murn
1795−282:38 name rest
1796−282:43 name f
1797−282:44 tight glyph )
1798−282:45 tight glyph ]
1799−284:1 DEDENT
1800−284:1 DEDENT
1801−284:1 DEDENT
1802−284:1 DEDENT
1803−284:1 DEDENT
1804−284:1 DEDENT
1805−284:1 NEWLINE
1806−284:1 glyph ++
1807−284:4 name join
1808−284:9 glyph |=
1809−284:12 name args
1810−284:16 tight glyph =
1811−284:17 tight glyph [
1812−284:18 tight tvar A
1813−284:20 glyph (
1814−284:21 tight name list
1815−284:26 tvar A
1816−284:27 tight glyph )
1817−284:28 tight glyph ]
1818−285:3 INDENT
1819−285:3 glyph ?-
1820−285:6 name args
1821−286:5 INDENT
1822−286:5 glyph [
1823−286:6 tight name separator
1824−286:16 name xs
1825−286:18 tight glyph ]
1826−286:20 glyph ^-
1827−286:23 glyph (
1828−286:24 tight name list
1829−286:29 tvar A
1830−286:30 tight glyph )
1831−287:9 INDENT
1832−287:9 glyph ?-
1833−287:12 name xs
1834−288:11 INDENT
1835−288:11 lit ~
1836−288:13 lit ~
1837−289:11 NEWLINE
1838−289:11 glyph [
1839−289:12 tight name item
1840−289:17 name rest
1841−289:21 tight glyph ]
1842−290:13 INDENT
1843−290:13 glyph ?-
1844−290:16 name rest
1845−291:15 INDENT
1846−291:15 lit ~
1847−291:17 glyph [
1848−291:18 tight name item
1849−291:23 lit ~
1850−291:24 tight glyph ]
1851−292:15 NEWLINE
1852−292:15 glyph [
1853−292:16 tight name next
1854−292:21 name more
1855−292:25 tight glyph ]
1856−292:27 glyph [
1857−292:28 tight name item
1858−292:33 glyph [
1859−292:34 tight name separator
1860−292:44 glyph (
1861−292:45 tight name join
1862−292:50 name separator
1863−292:60 name rest
1864−292:64 tight glyph )
1865−292:65 tight glyph ]
1866−292:66 tight glyph ]
1867−294:1 DEDENT
1868−294:1 DEDENT
1869−294:1 DEDENT
1870−294:1 DEDENT
1871−294:1 DEDENT
1872−294:1 DEDENT
1873−294:1 NEWLINE
1874−294:1 glyph ++
1875−294:4 name snip
1876−294:9 glyph |=
1877−294:12 name xs
1878−294:14 tight glyph =
1879−294:15 tight glyph (
1880−294:16 tight name list
1881−294:21 tvar A
1882−294:22 tight glyph )
1883−295:3 INDENT
1884−295:3 glyph ^-
1885−295:6 glyph (
1886−295:7 tight name list
1887−295:12 tvar A
1888−295:13 tight glyph )
1889−296:5 INDENT
1890−296:5 glyph ?-
1891−296:8 name xs
1892−297:7 INDENT
1893−297:7 lit ~
1894−297:9 lit ~
1895−298:7 NEWLINE
1896−298:7 glyph [
1897−298:8 tight name item
1898−298:13 name rest
1899−298:17 tight glyph ]
1900−299:9 INDENT
1901−299:9 glyph ?-
1902−299:12 name rest
1903−300:11 INDENT
1904−300:11 lit ~
1905−300:13 lit ~
1906−301:11 NEWLINE
1907−301:11 glyph [
1908−301:12 tight name next
1909−301:17 name more
1910−301:21 tight glyph ]
1911−301:23 glyph [
1912−301:24 tight name item
1913−301:29 glyph (
1914−301:30 tight name snip
1915−301:35 name rest
1916−301:39 tight glyph )
1917−301:40 tight glyph ]
1918−303:1 DEDENT
1919−303:1 DEDENT
1920−303:1 DEDENT
1921−303:1 DEDENT
1922−303:1 DEDENT
1923−303:1 NEWLINE
1924−303:1 glyph ++
1925−303:4 name rear
1926−303:9 glyph |=
1927−303:12 name xs
1928−303:14 tight glyph =
1929−303:15 tight glyph (
1930−303:16 tight name list
1931−303:21 tvar A
1932−303:22 tight glyph )
1933−304:3 INDENT
1934−304:3 glyph ?-
1935−304:6 name xs
1936−305:5 INDENT
1937−305:5 lit ~
1938−305:7 glyph !!
1939−306:5 NEWLINE
1940−306:5 glyph [
1941−306:6 tight name item
1942−306:11 name rest
1943−306:15 tight glyph ]
1944−307:7 INDENT
1945−307:7 glyph ?-
1946−307:10 name rest
1947−308:9 INDENT
1948−308:9 lit ~
1949−308:11 name item
1950−309:9 NEWLINE
1951−309:9 glyph [
1952−309:10 tight name next
1953−309:15 name more
1954−309:19 tight glyph ]
1955−309:21 glyph (
1956−309:22 tight name rear
1957−309:27 name rest
1958−309:31 tight glyph )
1959−311:1 DEDENT
1960−311:1 DEDENT
1961−311:1 DEDENT
1962−311:1 DEDENT
1963−311:1 NEWLINE
1964−311:1 glyph ++
1965−311:4 name cork
1966−311:9 glyph |=
1967−311:12 name gates
1968−311:17 tight glyph =
1969−311:18 tight glyph [
1970−311:19 tight glyph $-(
1971−311:22 tight tvar A
1972−311:24 tvar B
1973−311:25 tight glyph )
1974−311:27 glyph $-(
1975−311:30 tight tvar B
1976−311:32 tvar C
1977−311:33 tight glyph )
1978−311:34 tight glyph ]
1979−312:3 INDENT
1980−312:3 glyph ?-
1981−312:6 name gates
1982−313:5 INDENT
1983−313:5 glyph [
1984−313:6 tight name f
1985−313:8 name g
1986−313:9 tight glyph ]
1987−313:11 glyph |=
1988−313:14 name x
1989−313:15 tight glyph =
1990−313:16 tight tvar A
1991−313:18 glyph (
1992−313:19 tight name g
1993−313:21 glyph (
1994−313:22 tight name f
1995−313:24 name x
1996−313:25 tight glyph )
1997−313:26 tight glyph )
1998−315:1 DEDENT
1999−315:1 DEDENT
2000−315:1 NEWLINE
2001−315:1 glyph ++
2002−315:4 name corl
2003−315:9 glyph |=
2004−315:12 name gates
2005−315:17 tight glyph =
2006−315:18 tight glyph [
2007−315:19 tight glyph $-(
2008−315:22 tight tvar B
2009−315:24 tvar C
2010−315:25 tight glyph )
2011−315:27 glyph $-(
2012−315:30 tight tvar A
2013−315:32 tvar B
2014−315:33 tight glyph )
2015−315:34 tight glyph ]
2016−316:3 INDENT
2017−316:3 glyph ?-
2018−316:6 name gates
2019−317:5 INDENT
2020−317:5 glyph [
2021−317:6 tight name f
2022−317:8 name g
2023−317:9 tight glyph ]
2024−317:11 glyph |=
2025−317:14 name x
2026−317:15 tight glyph =
2027−317:16 tight tvar A
2028−317:18 glyph (
2029−317:19 tight name f
2030−317:21 glyph (
2031−317:22 tight name g
2032−317:24 name x
2033−317:25 tight glyph )
2034−317:26 tight glyph )
2035−319:1 DEDENT
2036−319:1 DEDENT
2037−319:1 NEWLINE
2038−319:1 glyph ++
2039−319:4 name cury
2040−319:9 glyph |=
2041−319:12 name args
2042−319:16 tight glyph =
2043−319:17 tight glyph [
2044−319:18 tight glyph $-(
2045−319:21 tight glyph [
2046−319:22 tight tvar A
2047−319:24 tvar B
2048−319:25 tight glyph ]
2049−319:27 tvar C
2050−319:28 tight glyph )
2051−319:30 tvar A
2052−319:31 tight glyph ]
2053−320:3 INDENT
2054−320:3 glyph ?-
2055−320:6 name args
2056−321:5 INDENT
2057−321:5 glyph [
2058−321:6 tight name f
2059−321:8 name a
2060−321:9 tight glyph ]
2061−321:11 glyph |=
2062−321:14 name b
2063−321:15 tight glyph =
2064−321:16 tight tvar B
2065−321:18 glyph (
2066−321:19 tight name f
2067−321:21 name a
2068−321:23 name b
2069−321:24 tight glyph )
2070−323:1 DEDENT
2071−323:1 DEDENT
2072−323:1 NEWLINE
2073−323:1 glyph ++
2074−323:4 name curr
2075−323:9 glyph |=
2076−323:12 name args
2077−323:16 tight glyph =
2078−323:17 tight glyph [
2079−323:18 tight glyph $-(
2080−323:21 tight glyph [
2081−323:22 tight tvar A
2082−323:24 tvar B
2083−323:25 tight glyph ]
2084−323:27 tvar C
2085−323:28 tight glyph )
2086−323:30 tvar B
2087−323:31 tight glyph ]
2088−324:3 INDENT
2089−324:3 glyph ?-
2090−324:6 name args
2091−325:5 INDENT
2092−325:5 glyph [
2093−325:6 tight name f
2094−325:8 name b
2095−325:9 tight glyph ]
2096−325:11 glyph |=
2097−325:14 name a
2098−325:15 tight glyph =
2099−325:16 tight tvar A
2100−325:18 glyph (
2101−325:19 tight name f
2102−325:21 name a
2103−325:23 name b
2104−325:24 tight glyph )
2105−327:1 DEDENT
2106−327:1 DEDENT
2107−327:1 NEWLINE
2108−327:1 glyph +$
2109−327:4 name cmd
2110−327:8 glyph |$
2111−327:11 glyph [
2112−327:12 tight tvar M
2113−327:13 tight glyph ]
2114−328:3 INDENT
2115−328:3 glyph [
2116−328:4 tight lit %poke
2117−328:10 name p
2118−328:11 tight glyph =
2119−328:12 tight name poke
2120−328:17 name reply
2121−328:22 tight glyph =
2122−328:23 tight glyph $-(
2123−328:26 tight glyph (
2124−328:27 tight name unit
2125−328:32 aura @t
2126−328:34 tight glyph )
2127−328:36 tvar M
2128−328:37 tight glyph )
2129−328:38 tight glyph ]
2130−329:3 NEWLINE
2131−329:3 glyph [
2132−329:4 tight lit %go
2133−329:8 name url
2134−329:11 tight glyph =
2135−329:12 tight aura @t
2136−329:14 tight glyph ]
2137−330:3 NEWLINE
2138−330:3 glyph [
2139−330:4 tight lit %wait
2140−330:10 name gap
2141−330:13 tight glyph =
2142−330:14 tight aura @dr
2143−330:18 name msg
2144−330:21 tight glyph =
2145−330:22 tight tvar M
2146−330:23 tight glyph ]
2147−331:3 NEWLINE
2148−331:3 glyph [
2149−331:4 tight lit %now
2150−331:9 name reply
2151−331:14 tight glyph =
2152−331:15 tight glyph $-(
2153−331:18 tight aura @da
2154−331:22 tvar M
2155−331:23 tight glyph )
2156−331:24 tight glyph ]
2157−332:3 NEWLINE
2158−332:3 glyph [
2159−332:4 tight lit %who
2160−332:9 name reply
2161−332:14 tight glyph =
2162−332:15 tight glyph $-(
2163−332:18 tight aura @p
2164−332:21 tvar M
2165−332:22 tight glyph )
2166−332:23 tight glyph ]
2167−334:1 DEDENT
2168−334:1 NEWLINE
2169−334:1 glyph ++
2170−334:4 name gth
2171−334:8 glyph |=
2172−334:11 name args
1751+277:9 lit ~
1752+277:11 name start
1753+278:9 NEWLINE
1754+278:9 glyph [
1755+278:10 tight name item
1756+278:15 name rest
1757+278:19 tight glyph ]
1758+278:21 glyph (
1759+278:22 tight name combine
1760+278:30 name item
1761+278:35 glyph (
1762+278:36 tight name reel
1763+278:41 name rest
1764+278:46 name start
1765+278:52 name combine
1766+278:59 tight glyph )
1767+278:60 tight glyph )
1768+280:1 DEDENT
1769+280:1 DEDENT
1770+280:1 DEDENT
1771+280:1 DEDENT
1772+280:1 NEWLINE
1773+280:1 glyph ++
1774+280:4 name flit
1775+280:9 glyph |=
1776+280:12 name predicate
1777+280:21 tight glyph =
1778+280:22 tight glyph $-(
1779+280:25 tight tvar A
1780+280:27 glyph ?
1781+280:28 tight glyph )
1782+281:3 INDENT
1783+281:3 glyph |=
1784+281:6 name value
1785+281:11 tight glyph =
1786+281:12 tight tvar A
1787+282:5 INDENT
1788+282:5 glyph ^-
1789+282:8 glyph (
1790+282:9 tight name unit
1791+282:14 tvar A
1792+282:15 tight glyph )
1793+283:7 INDENT
1794+283:7 glyph ?-
1795+283:10 glyph (
1796+283:11 tight name predicate
1797+283:21 name value
1798+283:26 tight glyph )
1799+284:9 INDENT
1800+284:9 lit %.y
1801+284:13 glyph `
1802+284:14 tight name value
1803+285:9 NEWLINE
1804+285:9 lit %.n
1805+285:13 lit ~
1806+287:1 DEDENT
1807+287:1 DEDENT
1808+287:1 DEDENT
1809+287:1 DEDENT
1810+287:1 NEWLINE
1811+287:1 glyph ++
1812+287:4 name murn
1813+287:9 glyph |=
1814+287:12 name args
1815+287:16 tight glyph =
1816+287:17 tight glyph [
1817+287:18 tight glyph (
1818+287:19 tight name list
1819+287:24 tvar A
1820+287:25 tight glyph )
1821+287:27 glyph $-(
1822+287:30 tight tvar A
1823+287:32 glyph (
1824+287:33 tight name unit
1825+287:38 tvar B
1826+287:39 tight glyph )
1827+287:40 tight glyph )
1828+287:41 tight glyph ]
1829+288:3 INDENT
1830+288:3 glyph ?-
1831+288:6 name args
1832+289:5 INDENT
1833+289:5 glyph [
1834+289:6 tight name xs
1835+289:9 name f
1836+289:10 tight glyph ]
1837+289:12 glyph ^-
1838+289:15 glyph (
1839+289:16 tight name list
1840+289:21 tvar B
1841+289:22 tight glyph )
1842+290:9 INDENT
1843+290:9 glyph ?-
1844+290:12 name xs
1845+291:11 INDENT
1846+291:11 lit ~
1847+291:13 lit ~
1848+292:11 NEWLINE
1849+292:11 glyph [
1850+292:12 tight name item
1851+292:17 name rest
1852+292:21 tight glyph ]
1853+293:13 INDENT
1854+293:13 glyph ?-
1855+293:16 glyph (
1856+293:17 tight name f
1857+293:19 name item
1858+293:23 tight glyph )
1859+294:15 INDENT
1860+294:15 lit ~
1861+294:17 glyph (
1862+294:18 tight name murn
1863+294:23 name rest
1864+294:28 name f
1865+294:29 tight glyph )
1866+295:15 NEWLINE
1867+295:15 glyph [
1868+295:16 tight lit ~
1869+295:18 name value
1870+295:23 tight glyph ]
1871+295:25 glyph [
1872+295:26 tight name value
1873+295:32 glyph (
1874+295:33 tight name murn
1875+295:38 name rest
1876+295:43 name f
1877+295:44 tight glyph )
1878+295:45 tight glyph ]
1879+297:1 DEDENT
1880+297:1 DEDENT
1881+297:1 DEDENT
1882+297:1 DEDENT
1883+297:1 DEDENT
1884+297:1 DEDENT
1885+297:1 NEWLINE
1886+297:1 glyph ++
1887+297:4 name join
1888+297:9 glyph |=
1889+297:12 name args
1890+297:16 tight glyph =
1891+297:17 tight glyph [
1892+297:18 tight tvar A
1893+297:20 glyph (
1894+297:21 tight name list
1895+297:26 tvar A
1896+297:27 tight glyph )
1897+297:28 tight glyph ]
1898+298:3 INDENT
1899+298:3 glyph ?-
1900+298:6 name args
1901+299:5 INDENT
1902+299:5 glyph [
1903+299:6 tight name separator
1904+299:16 name xs
1905+299:18 tight glyph ]
1906+299:20 glyph ^-
1907+299:23 glyph (
1908+299:24 tight name list
1909+299:29 tvar A
1910+299:30 tight glyph )
1911+300:9 INDENT
1912+300:9 glyph ?-
1913+300:12 name xs
1914+301:11 INDENT
1915+301:11 lit ~
1916+301:13 lit ~
1917+302:11 NEWLINE
1918+302:11 glyph [
1919+302:12 tight name item
1920+302:17 name rest
1921+302:21 tight glyph ]
1922+303:13 INDENT
1923+303:13 glyph ?-
1924+303:16 name rest
1925+304:15 INDENT
1926+304:15 lit ~
1927+304:17 glyph [
1928+304:18 tight name item
1929+304:23 lit ~
1930+304:24 tight glyph ]
1931+305:15 NEWLINE
1932+305:15 glyph [
1933+305:16 tight name next
1934+305:21 name more
1935+305:25 tight glyph ]
1936+305:27 glyph [
1937+305:28 tight name item
1938+305:33 glyph [
1939+305:34 tight name separator
1940+305:44 glyph (
1941+305:45 tight name join
1942+305:50 name separator
1943+305:60 name rest
1944+305:64 tight glyph )
1945+305:65 tight glyph ]
1946+305:66 tight glyph ]
1947+307:1 DEDENT
1948+307:1 DEDENT
1949+307:1 DEDENT
1950+307:1 DEDENT
1951+307:1 DEDENT
1952+307:1 DEDENT
1953+307:1 NEWLINE
1954+307:1 glyph ++
1955+307:4 name snip
1956+307:9 glyph |=
1957+307:12 name xs
1958+307:14 tight glyph =
1959+307:15 tight glyph (
1960+307:16 tight name list
1961+307:21 tvar A
1962+307:22 tight glyph )
1963+308:3 INDENT
1964+308:3 glyph ^-
1965+308:6 glyph (
1966+308:7 tight name list
1967+308:12 tvar A
1968+308:13 tight glyph )
1969+309:5 INDENT
1970+309:5 glyph ?-
1971+309:8 name xs
1972+310:7 INDENT
1973+310:7 lit ~
1974+310:9 lit ~
1975+311:7 NEWLINE
1976+311:7 glyph [
1977+311:8 tight name item
1978+311:13 name rest
1979+311:17 tight glyph ]
1980+312:9 INDENT
1981+312:9 glyph ?-
1982+312:12 name rest
1983+313:11 INDENT
1984+313:11 lit ~
1985+313:13 lit ~
1986+314:11 NEWLINE
1987+314:11 glyph [
1988+314:12 tight name next
1989+314:17 name more
1990+314:21 tight glyph ]
1991+314:23 glyph [
1992+314:24 tight name item
1993+314:29 glyph (
1994+314:30 tight name snip
1995+314:35 name rest
1996+314:39 tight glyph )
1997+314:40 tight glyph ]
1998+316:1 DEDENT
1999+316:1 DEDENT
2000+316:1 DEDENT
2001+316:1 DEDENT
2002+316:1 DEDENT
2003+316:1 NEWLINE
2004+316:1 glyph ++
2005+316:4 name rear
2006+316:9 glyph |=
2007+316:12 name xs
2008+316:14 tight glyph =
2009+316:15 tight glyph (
2010+316:16 tight name list
2011+316:21 tvar A
2012+316:22 tight glyph )
2013+317:3 INDENT
2014+317:3 glyph ?-
2015+317:6 name xs
2016+318:5 INDENT
2017+318:5 lit ~
2018+318:7 glyph !!
2019+319:5 NEWLINE
2020+319:5 glyph [
2021+319:6 tight name item
2022+319:11 name rest
2023+319:15 tight glyph ]
2024+320:7 INDENT
2025+320:7 glyph ?-
2026+320:10 name rest
2027+321:9 INDENT
2028+321:9 lit ~
2029+321:11 name item
2030+322:9 NEWLINE
2031+322:9 glyph [
2032+322:10 tight name next
2033+322:15 name more
2034+322:19 tight glyph ]
2035+322:21 glyph (
2036+322:22 tight name rear
2037+322:27 name rest
2038+322:31 tight glyph )
2039+324:1 DEDENT
2040+324:1 DEDENT
2041+324:1 DEDENT
2042+324:1 DEDENT
2043+324:1 NEWLINE
2044+324:1 glyph ++
2045+324:4 name cork
2046+324:9 glyph |=
2047+324:12 name gates
2048+324:17 tight glyph =
2049+324:18 tight glyph [
2050+324:19 tight glyph $-(
2051+324:22 tight tvar A
2052+324:24 tvar B
2053+324:25 tight glyph )
2054+324:27 glyph $-(
2055+324:30 tight tvar B
2056+324:32 tvar C
2057+324:33 tight glyph )
2058+324:34 tight glyph ]
2059+325:3 INDENT
2060+325:3 glyph ?-
2061+325:6 name gates
2062+326:5 INDENT
2063+326:5 glyph [
2064+326:6 tight name f
2065+326:8 name g
2066+326:9 tight glyph ]
2067+326:11 glyph |=
2068+326:14 name x
2069+326:15 tight glyph =
2070+326:16 tight tvar A
2071+326:18 glyph (
2072+326:19 tight name g
2073+326:21 glyph (
2074+326:22 tight name f
2075+326:24 name x
2076+326:25 tight glyph )
2077+326:26 tight glyph )
2078+328:1 DEDENT
2079+328:1 DEDENT
2080+328:1 NEWLINE
2081+328:1 glyph ++
2082+328:4 name corl
2083+328:9 glyph |=
2084+328:12 name gates
2085+328:17 tight glyph =
2086+328:18 tight glyph [
2087+328:19 tight glyph $-(
2088+328:22 tight tvar B
2089+328:24 tvar C
2090+328:25 tight glyph )
2091+328:27 glyph $-(
2092+328:30 tight tvar A
2093+328:32 tvar B
2094+328:33 tight glyph )
2095+328:34 tight glyph ]
2096+329:3 INDENT
2097+329:3 glyph ?-
2098+329:6 name gates
2099+330:5 INDENT
2100+330:5 glyph [
2101+330:6 tight name f
2102+330:8 name g
2103+330:9 tight glyph ]
2104+330:11 glyph |=
2105+330:14 name x
2106+330:15 tight glyph =
2107+330:16 tight tvar A
2108+330:18 glyph (
2109+330:19 tight name f
2110+330:21 glyph (
2111+330:22 tight name g
2112+330:24 name x
2113+330:25 tight glyph )
2114+330:26 tight glyph )
2115+332:1 DEDENT
2116+332:1 DEDENT
2117+332:1 NEWLINE
2118+332:1 glyph ++
2119+332:4 name cury
2120+332:9 glyph |=
2121+332:12 name args
2122+332:16 tight glyph =
2123+332:17 tight glyph [
2124+332:18 tight glyph $-(
2125+332:21 tight glyph [
2126+332:22 tight tvar A
2127+332:24 tvar B
2128+332:25 tight glyph ]
2129+332:27 tvar C
2130+332:28 tight glyph )
2131+332:30 tvar A
2132+332:31 tight glyph ]
2133+333:3 INDENT
2134+333:3 glyph ?-
2135+333:6 name args
2136+334:5 INDENT
2137+334:5 glyph [
2138+334:6 tight name f
2139+334:8 name a
2140+334:9 tight glyph ]
2141+334:11 glyph |=
2142+334:14 name b
21732143334:15 tight glyph =
2174−334:16 tight glyph [
2175−334:17 tight tvar A
2176−334:19 tvar A
2177−334:20 tight glyph ]
2178−334:22 glyph (
2179−334:23 tight wing gth-atom.internal
2180−334:41 name args
2181−334:45 tight glyph )
2182−335:1 NEWLINE
2183−335:1 glyph ++
2184−335:4 name add
2185−335:8 glyph |=
2186−335:11 name args
2187−335:15 tight glyph =
2188−335:16 tight glyph [
2189−335:17 tight tvar A
2190−335:19 tvar A
2191−335:20 tight glyph ]
2192−335:22 glyph (
2193−335:23 tight wing add-atom.internal
2194−335:41 name args
2195−335:45 tight glyph )
2144+334:16 tight tvar B
2145+334:18 glyph (
2146+334:19 tight name f
2147+334:21 name a
2148+334:23 name b
2149+334:24 tight glyph )
2150+336:1 DEDENT
2151+336:1 DEDENT
21962152336:1 NEWLINE
21972153336:1 glyph ++
2198−336:4 name dec
2199−336:8 glyph |=
2200−336:11 name atom
2201−336:15 tight glyph =
2202−336:16 tight tvar A
2203−336:18 glyph (
2204−336:19 tight wing dec-atom.internal
2205−336:37 name atom
2206−336:41 tight glyph )
2207−338:1 NEWLINE
2208−338:1 glyph +$
2209−338:4 name ask
2210−338:8 glyph |$
2211−338:11 glyph [
2212−338:12 tight tvar M
2213−338:13 tight glyph ]
2214−338:15 glyph (
2215−338:16 tight wing ask.internal
2216−338:29 tvar M
2217−338:30 tight glyph )
2218−339:1 NEWLINE
2219−339:1 glyph ++
2220−339:4 name pure
2221−339:9 glyph |=
2222−339:12 name x
2223−339:13 tight glyph =
2224−339:14 tight tvar M
2225−339:16 glyph ^-
2226−339:19 glyph (
2227−339:20 tight name ask
2228−339:24 tvar M
2229−339:25 tight glyph )
2230−339:27 glyph [
2231−339:28 tight lit %pure
2232−339:34 name x
2233−339:35 tight glyph ]
2234−339:36 NEWLINE
2154+336:4 name curr
2155+336:9 glyph |=
2156+336:12 name args
2157+336:16 tight glyph =
2158+336:17 tight glyph [
2159+336:18 tight glyph $-(
2160+336:21 tight glyph [
2161+336:22 tight tvar A
2162+336:24 tvar B
2163+336:25 tight glyph ]
2164+336:27 tvar C
2165+336:28 tight glyph )
2166+336:30 tvar B
2167+336:31 tight glyph ]
2168+337:3 INDENT
2169+337:3 glyph ?-
2170+337:6 name args
2171+338:5 INDENT
2172+338:5 glyph [
2173+338:6 tight name f
2174+338:8 name b
2175+338:9 tight glyph ]
2176+338:11 glyph |=
2177+338:14 name a
2178+338:15 tight glyph =
2179+338:16 tight tvar A
2180+338:18 glyph (
2181+338:19 tight name f
2182+338:21 name a
2183+338:23 name b
2184+338:24 tight glyph )
2185+340:1 DEDENT
2186+340:1 DEDENT
2187+340:1 NEWLINE
2188+340:1 glyph +$
2189+340:4 name cmd
2190+340:8 glyph |$
2191+340:11 glyph [
2192+340:12 tight tvar M
2193+340:13 tight glyph ]
2194+341:3 INDENT
2195+341:3 glyph [
2196+341:4 tight lit %poke
2197+341:10 name p
2198+341:11 tight glyph =
2199+341:12 tight name raw-poke
2200+341:21 name reply
2201+341:26 tight glyph =
2202+341:27 tight glyph $-(
2203+341:30 tight glyph (
2204+341:31 tight name unit
2205+341:36 aura @t
2206+341:38 tight glyph )
2207+341:40 tvar M
2208+341:41 tight glyph )
2209+341:42 tight glyph ]
2210+342:3 NEWLINE
2211+342:3 glyph [
2212+342:4 tight lit %go
2213+342:8 name url
2214+342:11 tight glyph =
2215+342:12 tight aura @t
2216+342:14 tight glyph ]
2217+343:3 NEWLINE
2218+343:3 glyph [
2219+343:4 tight lit %wait
2220+343:10 name gap
2221+343:13 tight glyph =
2222+343:14 tight aura @dr
2223+343:18 name msg
2224+343:21 tight glyph =
2225+343:22 tight tvar M
2226+343:23 tight glyph ]
2227+344:3 NEWLINE
2228+344:3 glyph [
2229+344:4 tight lit %now
2230+344:9 name reply
2231+344:14 tight glyph =
2232+344:15 tight glyph $-(
2233+344:18 tight aura @da
2234+344:22 tvar M
2235+344:23 tight glyph )
2236+344:24 tight glyph ]
2237+345:3 NEWLINE
2238+345:3 glyph [
2239+345:4 tight lit %who
2240+345:9 name reply
2241+345:14 tight glyph =
2242+345:15 tight glyph $-(
2243+345:18 tight aura @p
2244+345:21 tvar M
2245+345:22 tight glyph )
2246+345:23 tight glyph ]
2247+347:1 DEDENT
2248+347:1 NEWLINE
2249+347:1 glyph ++
2250+347:4 name gth
2251+347:8 glyph |=
2252+347:11 name args
2253+347:15 tight glyph =
2254+347:16 tight glyph [
2255+347:17 tight tvar A
2256+347:19 tvar A
2257+347:20 tight glyph ]
2258+347:22 glyph (
2259+347:23 tight wing gth-atom.internal
2260+347:41 name args
2261+347:45 tight glyph )
2262+348:1 NEWLINE
2263+348:1 glyph ++
2264+348:4 name add
2265+348:8 glyph |=
2266+348:11 name args
2267+348:15 tight glyph =
2268+348:16 tight glyph [
2269+348:17 tight tvar A
2270+348:19 tvar A
2271+348:20 tight glyph ]
2272+348:22 glyph (
2273+348:23 tight wing add-atom.internal
2274+348:41 name args
2275+348:45 tight glyph )
2276+349:1 NEWLINE
2277+349:1 glyph ++
2278+349:4 name dec
2279+349:8 glyph |=
2280+349:11 name atom
2281+349:15 tight glyph =
2282+349:16 tight tvar A
2283+349:18 glyph (
2284+349:19 tight wing dec-atom.internal
2285+349:37 name atom
2286+349:41 tight glyph )
2287+351:1 NEWLINE
2288+351:1 glyph +$
2289+351:4 name ask
2290+351:8 glyph |$
2291+351:11 glyph [
2292+351:12 tight tvar M
2293+351:13 tight glyph ]
2294+351:15 glyph (
2295+351:16 tight wing ask.internal
2296+351:29 tvar M
2297+351:30 tight glyph )
2298+352:1 NEWLINE
2299+352:1 glyph ++
2300+352:4 name pure
2301+352:9 glyph |=
2302+352:12 name x
2303+352:13 tight glyph =
2304+352:14 tight tvar M
2305+352:16 glyph ^-
2306+352:19 glyph (
2307+352:20 tight name ask
2308+352:24 tvar M
2309+352:25 tight glyph )
2310+352:27 glyph [
2311+352:28 tight lit %pure
2312+352:34 name x
2313+352:35 tight glyph ]
2314+352:36 NEWLINE
tests/golden/prelude-unit-list-transforms/tree.txt+473−439
@@ -1,6 +1,6 @@
11(module
22 (jibb 1:1 internal /lib/jibb/internal)
3− (mold 2:1 poke (ref 2:9 poke.internal))
3+ (mold 2:1 raw-poke (ref 2:13 raw-poke.internal))
44 (mold 3:1 qath (ref 3:9 qath.internal))
55 (value 7:1 same
66 (gate 7:9
@@ -515,458 +515,492 @@
515515 (unit 199:19
516516 (group 199:20
517517 (call 199:21 (wing 199:21 combine) (wing 199:29 a) (wing 199:31 b))))))))))))))))
518− (value 201:1 clef
518+ (value 201:1 hunt
519519 (gate 201:9
520520 (face 201:12 args
521521 (cell 201:17
522− (apply 201:18 unit (tvar 201:24 A))
523− (apply 201:27 unit (tvar 201:33 B))
524− (fn 201:36
525− (cell 201:39 (tvar 201:40 A) (tvar 201:42 B))
526− (apply 201:45 unit (tvar 201:51 C)))))
522+ (fn 201:18
523+ (cell 201:21 (tvar 201:22 A) (tvar 201:24 A))
524+ (flag 201:27))
525+ (apply 201:30 unit (tvar 201:36 A))
526+ (apply 201:39 unit (tvar 201:45 A))))
527527 (body 202:3
528528 (branch 202:3
529529 (wing 202:6 args)
530530 (arm 203:5
531− (cell 203:5 (bind 203:6 first) (bind 203:12 second) (bind 203:19 combine))
532− (cast 203:28
533− (apply 203:31 unit (tvar 203:37 C))
531+ (cell 203:5 (bind 203:6 choose) (bind 203:13 first) (bind 203:19 second))
532+ (cast 203:27
533+ (apply 203:30 unit (tvar 203:36 A))
534534 (body 204:7
535535 (branch 204:7
536536 (wing 204:10 first)
537− (arm 205:9 (lit 205:9 ~) (lit 205:11 ~))
537+ (arm 205:9 (lit 205:9 ~) (wing 205:11 second))
538538 (arm 206:9
539539 (cell 206:9 (lit 206:10 ~) (bind 206:12 a))
540540 (body 207:11
541541 (branch 207:11
542542 (wing 207:14 second)
543− (arm 208:13 (lit 208:13 ~) (lit 208:15 ~))
543+ (arm 208:13 (lit 208:13 ~) (wing 208:15 first))
544544 (arm 209:13
545545 (cell 209:13 (lit 209:14 ~) (bind 209:16 b))
546− (group 209:19
547− (call 209:20 (wing 209:20 combine) (wing 209:28 a) (wing 209:30 b)))))))))))))))
548− (value 211:1 skim
549− (gate 211:9
550− (face 211:12 args
551− (cell 211:17
552− (apply 211:18 list (tvar 211:24 A))
553− (fn 211:27 (tvar 211:30 A) (flag 211:32))))
554− (body 212:3
555− (branch 212:3
556− (wing 212:6 args)
557− (arm 213:5
558− (cell 213:5 (bind 213:6 xs) (bind 213:9 predicate))
559− (cast 213:20
560− (apply 213:23 list (tvar 213:29 A))
561− (body 214:9
562− (branch 214:9
563− (wing 214:12 xs)
564− (arm 215:11 (lit 215:11 ~) (lit 215:13 ~))
565− (arm 216:11
566− (cell 216:11 (bind 216:12 item) (bind 216:17 rest))
567− (body 217:13
568− (branch 217:13
569− (group 217:16
570− (call 217:17 (wing 217:17 predicate) (wing 217:27 item)))
571− (arm 218:15
572− (lit 218:15 %.y)
573− (tuple 218:19
574− (wing 218:20 item)
575− (group 218:25
576− (call 218:26 (wing 218:26 skim) (wing 218:31 rest) (wing 218:36 predicate)))))
577− (arm 219:15
578− (lit 219:15 %.n)
579− (group 219:19
580− (call 219:20 (wing 219:20 skim) (wing 219:25 rest) (wing 219:30 predicate)))))))))))))))
581− (value 221:1 skip
582− (gate 221:9
583− (face 221:12 args
584− (cell 221:17
585− (apply 221:18 list (tvar 221:24 A))
586− (fn 221:27 (tvar 221:30 A) (flag 221:32))))
587− (body 222:3
588− (branch 222:3
589− (wing 222:6 args)
590− (arm 223:5
591− (cell 223:5 (bind 223:6 xs) (bind 223:9 predicate))
592− (cast 223:20
593− (apply 223:23 list (tvar 223:29 A))
594− (body 224:9
595− (branch 224:9
596− (wing 224:12 xs)
597− (arm 225:11 (lit 225:11 ~) (lit 225:13 ~))
598− (arm 226:11
599− (cell 226:11 (bind 226:12 item) (bind 226:17 rest))
600− (body 227:13
601− (branch 227:13
602− (group 227:16
603− (call 227:17 (wing 227:17 predicate) (wing 227:27 item)))
604− (arm 228:15
605− (lit 228:15 %.y)
606− (group 228:19
607− (call 228:20 (wing 228:20 skip) (wing 228:25 rest) (wing 228:30 predicate))))
608− (arm 229:15
609− (lit 229:15 %.n)
610− (tuple 229:19
611− (wing 229:20 item)
612− (group 229:25
613− (call 229:26 (wing 229:26 skip) (wing 229:31 rest) (wing 229:36 predicate))))))))))))))))
614− (value 231:1 levy
615− (gate 231:9
616− (face 231:12 args
617− (cell 231:17
618− (apply 231:18 list (tvar 231:24 A))
619− (fn 231:27 (tvar 231:30 A) (flag 231:32))))
620− (body 232:3
621− (cast 232:3
622− (flag 232:6)
623− (body 233:5
624− (branch 233:5
625− (wing 233:8 args)
626− (arm 234:7
627− (cell 234:7 (bind 234:8 xs) (bind 234:11 predicate))
628− (body 235:9
629− (branch 235:9
630− (wing 235:12 xs)
631− (arm 236:11 (lit 236:11 ~) (lit 236:13 %.y))
632− (arm 237:11
633− (cell 237:11 (bind 237:12 item) (bind 237:17 rest))
634− (body 238:13
635− (branch 238:13
636− (group 238:16
637− (call 238:17 (wing 238:17 predicate) (wing 238:27 item)))
638− (arm 239:15
639− (lit 239:15 %.y)
640− (group 239:19
641− (call 239:20 (wing 239:20 levy) (wing 239:25 rest) (wing 239:30 predicate))))
642− (arm 240:15 (lit 240:15 %.n) (lit 240:19 %.n))))))))))))))
643− (value 242:1 lien
644− (gate 242:9
645− (face 242:12 args
646− (cell 242:17
647− (apply 242:18 list (tvar 242:24 A))
648− (fn 242:27 (tvar 242:30 A) (flag 242:32))))
649− (body 243:3
650− (cast 243:3
651− (flag 243:6)
652− (body 244:5
653− (branch 244:5
654− (wing 244:8 args)
655− (arm 245:7
656− (cell 245:7 (bind 245:8 xs) (bind 245:11 predicate))
657− (body 246:9
658− (branch 246:9
659− (wing 246:12 xs)
660− (arm 247:11 (lit 247:11 ~) (lit 247:13 %.n))
661− (arm 248:11
662− (cell 248:11 (bind 248:12 item) (bind 248:17 rest))
663− (body 249:13
664− (branch 249:13
665− (group 249:16
666− (call 249:17 (wing 249:17 predicate) (wing 249:27 item)))
667− (arm 250:15 (lit 250:15 %.y) (lit 250:19 %.y))
668− (arm 251:15
669− (lit 251:15 %.n)
670− (group 251:19
671− (call 251:20 (wing 251:20 lien) (wing 251:25 rest) (wing 251:30 predicate))))))))))))))))
672− (value 253:1 roll
673− (gate 253:9
674− (face 253:12 args
675− (cell 253:17
676− (apply 253:18 list (tvar 253:24 A))
677− (tvar 253:27 B)
678− (fn 253:29
679− (cell 253:32 (tvar 253:33 A) (tvar 253:35 B))
680− (tvar 253:38 B))))
681− (body 254:3
682− (branch 254:3
683− (wing 254:6 args)
684− (arm 255:5
685− (cell 255:5 (bind 255:6 xs) (bind 255:9 start) (bind 255:15 combine))
686− (body 256:7
687− (branch 256:7
688− (wing 256:10 xs)
689− (arm 257:9 (lit 257:9 ~) (wing 257:11 start))
690− (arm 258:9
691− (cell 258:9 (bind 258:10 item) (bind 258:15 rest))
692− (group 258:21
693− (call 258:22
694− (wing 258:22 roll)
695− (wing 258:27 rest)
696− (group 258:32
697− (call 258:33 (wing 258:33 combine) (wing 258:41 item) (wing 258:46 start)))
698− (wing 258:53 combine)))))))))))
699− (value 260:1 reel
700− (gate 260:9
701− (face 260:12 args
702− (cell 260:17
703− (apply 260:18 list (tvar 260:24 A))
704− (tvar 260:27 B)
705− (fn 260:29
706− (cell 260:32 (tvar 260:33 A) (tvar 260:35 B))
707− (tvar 260:38 B))))
708− (body 261:3
709− (branch 261:3
710− (wing 261:6 args)
711− (arm 262:5
712− (cell 262:5 (bind 262:6 xs) (bind 262:9 start) (bind 262:15 combine))
713− (body 263:7
714− (branch 263:7
715− (wing 263:10 xs)
716− (arm 264:9 (lit 264:9 ~) (wing 264:11 start))
717− (arm 265:9
718− (cell 265:9 (bind 265:10 item) (bind 265:15 rest))
719− (group 265:21
720− (call 265:22
721− (wing 265:22 combine)
722− (wing 265:30 item)
723− (group 265:35
724− (call 265:36 (wing 265:36 reel) (wing 265:41 rest) (wing 265:46 start) (wing 265:52 combine)))))))))))))
725− (value 267:1 flit
726− (gate 267:9
727− (face 267:12 predicate
728− (fn 267:22 (tvar 267:25 A) (flag 267:27)))
729− (body 268:3
730− (gate 268:3
731− (face 268:6 value (tvar 268:12 A))
732− (body 269:5
733− (cast 269:5
734− (apply 269:8 unit (tvar 269:14 A))
735− (body 270:7
736− (branch 270:7
737− (group 270:10
738− (call 270:11 (wing 270:11 predicate) (wing 270:21 value)))
739− (arm 271:9
740− (lit 271:9 %.y)
741− (unit 271:13 (wing 271:14 value)))
742− (arm 272:9 (lit 272:9 %.n) (lit 272:13 ~))))))))))
743− (value 274:1 murn
744− (gate 274:9
745− (face 274:12 args
746− (cell 274:17
747− (apply 274:18 list (tvar 274:24 A))
748− (fn 274:27
749− (tvar 274:30 A)
750− (apply 274:32 unit (tvar 274:38 B)))))
751− (body 275:3
752− (branch 275:3
753− (wing 275:6 args)
754− (arm 276:5
755− (cell 276:5 (bind 276:6 xs) (bind 276:9 f))
756− (cast 276:12
757− (apply 276:15 list (tvar 276:21 B))
758− (body 277:9
759− (branch 277:9
760− (wing 277:12 xs)
761− (arm 278:11 (lit 278:11 ~) (lit 278:13 ~))
762− (arm 279:11
763− (cell 279:11 (bind 279:12 item) (bind 279:17 rest))
764− (body 280:13
765− (branch 280:13
766− (group 280:16
767− (call 280:17 (wing 280:17 f) (wing 280:19 item)))
768− (arm 281:15
769− (lit 281:15 ~)
770− (group 281:17
771− (call 281:18 (wing 281:18 murn) (wing 281:23 rest) (wing 281:28 f))))
772− (arm 282:15
773− (cell 282:15 (lit 282:16 ~) (bind 282:18 value))
774− (tuple 282:25
775− (wing 282:26 value)
776− (group 282:32
777− (call 282:33 (wing 282:33 murn) (wing 282:38 rest) (wing 282:43 f))))))))))))))))
778− (value 284:1 join
779− (gate 284:9
780− (face 284:12 args
781− (cell 284:17
782− (tvar 284:18 A)
783− (apply 284:20 list (tvar 284:26 A))))
784− (body 285:3
785− (branch 285:3
786− (wing 285:6 args)
787− (arm 286:5
788− (cell 286:5 (bind 286:6 separator) (bind 286:16 xs))
789− (cast 286:20
790− (apply 286:23 list (tvar 286:29 A))
791− (body 287:9
792− (branch 287:9
793− (wing 287:12 xs)
794− (arm 288:11 (lit 288:11 ~) (lit 288:13 ~))
795− (arm 289:11
796− (cell 289:11 (bind 289:12 item) (bind 289:17 rest))
797− (body 290:13
798− (branch 290:13
799− (wing 290:16 rest)
800− (arm 291:15
801− (lit 291:15 ~)
802− (tuple 291:17 (wing 291:18 item) (lit 291:23 ~)))
803− (arm 292:15
804− (cell 292:15 (bind 292:16 next) (bind 292:21 more))
805− (tuple 292:27
806− (wing 292:28 item)
807− (tuple 292:33
808− (wing 292:34 separator)
809− (group 292:44
810− (call 292:45 (wing 292:45 join) (wing 292:50 separator) (wing 292:60 rest)))))))))))))))))
811− (value 294:1 snip
812− (gate 294:9
813− (face 294:12 xs
814− (apply 294:15 list (tvar 294:21 A)))
815− (body 295:3
816− (cast 295:3
817− (apply 295:6 list (tvar 295:12 A))
818− (body 296:5
819− (branch 296:5
820− (wing 296:8 xs)
821− (arm 297:7 (lit 297:7 ~) (lit 297:9 ~))
822− (arm 298:7
823− (cell 298:7 (bind 298:8 item) (bind 298:13 rest))
824− (body 299:9
825− (branch 299:9
826− (wing 299:12 rest)
827− (arm 300:11 (lit 300:11 ~) (lit 300:13 ~))
828− (arm 301:11
829− (cell 301:11 (bind 301:12 next) (bind 301:17 more))
830− (tuple 301:23
831− (wing 301:24 item)
832− (group 301:29
833− (call 301:30 (wing 301:30 snip) (wing 301:35 rest))))))))))))))
834− (value 303:1 rear
835− (gate 303:9
836− (face 303:12 xs
837− (apply 303:15 list (tvar 303:21 A)))
838− (body 304:3
839− (branch 304:3
840− (wing 304:6 xs)
841− (arm 305:5 (lit 305:5 ~) (crash 305:7))
842− (arm 306:5
843− (cell 306:5 (bind 306:6 item) (bind 306:11 rest))
844− (body 307:7
845− (branch 307:7
846− (wing 307:10 rest)
847− (arm 308:9 (lit 308:9 ~) (wing 308:11 item))
848− (arm 309:9
849− (cell 309:9 (bind 309:10 next) (bind 309:15 more))
850− (group 309:21
851− (call 309:22 (wing 309:22 rear) (wing 309:27 rest)))))))))))
852− (value 311:1 cork
853− (gate 311:9
854− (face 311:12 gates
855− (cell 311:18
856− (fn 311:19 (tvar 311:22 A) (tvar 311:24 B))
857− (fn 311:27 (tvar 311:30 B) (tvar 311:32 C))))
858− (body 312:3
859− (branch 312:3
860− (wing 312:6 gates)
861− (arm 313:5
862− (cell 313:5 (bind 313:6 f) (bind 313:8 g))
863− (gate 313:11
864− (face 313:14 x (tvar 313:16 A))
865− (group 313:18
866− (call 313:19
867− (wing 313:19 g)
868− (group 313:21
869− (call 313:22 (wing 313:22 f) (wing 313:24 x)))))))))))
870− (value 315:1 corl
871− (gate 315:9
872− (face 315:12 gates
873− (cell 315:18
874− (fn 315:19 (tvar 315:22 B) (tvar 315:24 C))
875− (fn 315:27 (tvar 315:30 A) (tvar 315:32 B))))
876− (body 316:3
877− (branch 316:3
878− (wing 316:6 gates)
879− (arm 317:5
880− (cell 317:5 (bind 317:6 f) (bind 317:8 g))
881− (gate 317:11
882− (face 317:14 x (tvar 317:16 A))
883− (group 317:18
884− (call 317:19
885− (wing 317:19 f)
886− (group 317:21
887− (call 317:22 (wing 317:22 g) (wing 317:24 x)))))))))))
888− (value 319:1 cury
889− (gate 319:9
890− (face 319:12 args
891− (cell 319:17
892− (fn 319:18
893− (cell 319:21 (tvar 319:22 A) (tvar 319:24 B))
894− (tvar 319:27 C))
895− (tvar 319:30 A)))
896− (body 320:3
897− (branch 320:3
898− (wing 320:6 args)
899− (arm 321:5
900− (cell 321:5 (bind 321:6 f) (bind 321:8 a))
901− (gate 321:11
902− (face 321:14 b (tvar 321:16 B))
903− (group 321:18
904− (call 321:19 (wing 321:19 f) (wing 321:21 a) (wing 321:23 b)))))))))
905− (value 323:1 curr
906− (gate 323:9
907− (face 323:12 args
908− (cell 323:17
909− (fn 323:18
910− (cell 323:21 (tvar 323:22 A) (tvar 323:24 B))
911− (tvar 323:27 C))
912− (tvar 323:30 B)))
913− (body 324:3
914− (branch 324:3
915− (wing 324:6 args)
916− (arm 325:5
917− (cell 325:5 (bind 325:6 f) (bind 325:8 b))
918− (gate 325:11
919− (face 325:14 a (tvar 325:16 A))
920− (group 325:18
921− (call 325:19 (wing 325:19 f) (wing 325:21 a) (wing 325:23 b)))))))))
922− (mold 327:1 cmd
923− (generic 327:8 M
924− (union 328:3
925− (cell 328:3
926− (const 328:4 %poke)
927− (face 328:10 p (ref 328:12 poke))
928− (face 328:17 reply
929− (fn 328:23
930− (apply 328:26 unit (aura 328:32 @t))
931− (tvar 328:36 M))))
932− (cell 329:3
933− (const 329:4 %go)
934− (face 329:8 url (aura 329:12 @t)))
935− (cell 330:3
936− (const 330:4 %wait)
937− (face 330:10 gap (aura 330:14 @dr))
938− (face 330:18 msg (tvar 330:22 M)))
939− (cell 331:3
940− (const 331:4 %now)
941− (face 331:9 reply
942− (fn 331:15 (aura 331:18 @da) (tvar 331:22 M))))
943− (cell 332:3
944− (const 332:4 %who)
945− (face 332:9 reply
946− (fn 332:15 (aura 332:18 @p) (tvar 332:21 M)))))))
947− (value 334:1 gth
948− (gate 334:8
949− (face 334:11 args
950− (cell 334:16 (tvar 334:17 A) (tvar 334:19 A)))
951− (group 334:22
952− (call 334:23 (wing 334:23 gth-atom.internal) (wing 334:41 args)))))
953− (value 335:1 add
954− (gate 335:8
955− (face 335:11 args
956− (cell 335:16 (tvar 335:17 A) (tvar 335:19 A)))
957− (group 335:22
958− (call 335:23 (wing 335:23 add-atom.internal) (wing 335:41 args)))))
959− (value 336:1 dec
960− (gate 336:8
961− (face 336:11 atom (tvar 336:16 A))
962− (group 336:18
963− (call 336:19 (wing 336:19 dec-atom.internal) (wing 336:37 atom)))))
964− (mold 338:1 ask
965− (generic 338:8 M
966− (apply 338:15 ask.internal (tvar 338:29 M))))
967− (value 339:1 pure
968− (gate 339:9
969− (face 339:12 x (tvar 339:14 M))
970− (cast 339:16
971− (apply 339:19 ask (tvar 339:24 M))
972− (tuple 339:27 (lit 339:28 %pure) (wing 339:34 x))))))
546+ (body 210:15
547+ (branch 210:15
548+ (group 210:18
549+ (call 210:19 (wing 210:19 choose) (wing 210:26 a) (wing 210:28 b)))
550+ (arm 211:17 (lit 211:17 %.y) (wing 211:21 first))
551+ (arm 212:17 (lit 212:17 %.n) (wing 212:21 second))))))))))))))))
552+ (value 214:1 clef
553+ (gate 214:9
554+ (face 214:12 args
555+ (cell 214:17
556+ (apply 214:18 unit (tvar 214:24 A))
557+ (apply 214:27 unit (tvar 214:33 B))
558+ (fn 214:36
559+ (cell 214:39 (tvar 214:40 A) (tvar 214:42 B))
560+ (apply 214:45 unit (tvar 214:51 C)))))
561+ (body 215:3
562+ (branch 215:3
563+ (wing 215:6 args)
564+ (arm 216:5
565+ (cell 216:5 (bind 216:6 first) (bind 216:12 second) (bind 216:19 combine))
566+ (cast 216:28
567+ (apply 216:31 unit (tvar 216:37 C))
568+ (body 217:7
569+ (branch 217:7
570+ (wing 217:10 first)
571+ (arm 218:9 (lit 218:9 ~) (lit 218:11 ~))
572+ (arm 219:9
573+ (cell 219:9 (lit 219:10 ~) (bind 219:12 a))
574+ (body 220:11
575+ (branch 220:11
576+ (wing 220:14 second)
577+ (arm 221:13 (lit 221:13 ~) (lit 221:15 ~))
578+ (arm 222:13
579+ (cell 222:13 (lit 222:14 ~) (bind 222:16 b))
580+ (group 222:19
581+ (call 222:20 (wing 222:20 combine) (wing 222:28 a) (wing 222:30 b)))))))))))))))
582+ (value 224:1 skim
583+ (gate 224:9
584+ (face 224:12 args
585+ (cell 224:17
586+ (apply 224:18 list (tvar 224:24 A))
587+ (fn 224:27 (tvar 224:30 A) (flag 224:32))))
588+ (body 225:3
589+ (branch 225:3
590+ (wing 225:6 args)
591+ (arm 226:5
592+ (cell 226:5 (bind 226:6 xs) (bind 226:9 predicate))
593+ (cast 226:20
594+ (apply 226:23 list (tvar 226:29 A))
595+ (body 227:9
596+ (branch 227:9
597+ (wing 227:12 xs)
598+ (arm 228:11 (lit 228:11 ~) (lit 228:13 ~))
599+ (arm 229:11
600+ (cell 229:11 (bind 229:12 item) (bind 229:17 rest))
601+ (body 230:13
602+ (branch 230:13
603+ (group 230:16
604+ (call 230:17 (wing 230:17 predicate) (wing 230:27 item)))
605+ (arm 231:15
606+ (lit 231:15 %.y)
607+ (tuple 231:19
608+ (wing 231:20 item)
609+ (group 231:25
610+ (call 231:26 (wing 231:26 skim) (wing 231:31 rest) (wing 231:36 predicate)))))
611+ (arm 232:15
612+ (lit 232:15 %.n)
613+ (group 232:19
614+ (call 232:20 (wing 232:20 skim) (wing 232:25 rest) (wing 232:30 predicate)))))))))))))))
615+ (value 234:1 skip
616+ (gate 234:9
617+ (face 234:12 args
618+ (cell 234:17
619+ (apply 234:18 list (tvar 234:24 A))
620+ (fn 234:27 (tvar 234:30 A) (flag 234:32))))
621+ (body 235:3
622+ (branch 235:3
623+ (wing 235:6 args)
624+ (arm 236:5
625+ (cell 236:5 (bind 236:6 xs) (bind 236:9 predicate))
626+ (cast 236:20
627+ (apply 236:23 list (tvar 236:29 A))
628+ (body 237:9
629+ (branch 237:9
630+ (wing 237:12 xs)
631+ (arm 238:11 (lit 238:11 ~) (lit 238:13 ~))
632+ (arm 239:11
633+ (cell 239:11 (bind 239:12 item) (bind 239:17 rest))
634+ (body 240:13
635+ (branch 240:13
636+ (group 240:16
637+ (call 240:17 (wing 240:17 predicate) (wing 240:27 item)))
638+ (arm 241:15
639+ (lit 241:15 %.y)
640+ (group 241:19
641+ (call 241:20 (wing 241:20 skip) (wing 241:25 rest) (wing 241:30 predicate))))
642+ (arm 242:15
643+ (lit 242:15 %.n)
644+ (tuple 242:19
645+ (wing 242:20 item)
646+ (group 242:25
647+ (call 242:26 (wing 242:26 skip) (wing 242:31 rest) (wing 242:36 predicate))))))))))))))))
648+ (value 244:1 levy
649+ (gate 244:9
650+ (face 244:12 args
651+ (cell 244:17
652+ (apply 244:18 list (tvar 244:24 A))
653+ (fn 244:27 (tvar 244:30 A) (flag 244:32))))
654+ (body 245:3
655+ (cast 245:3
656+ (flag 245:6)
657+ (body 246:5
658+ (branch 246:5
659+ (wing 246:8 args)
660+ (arm 247:7
661+ (cell 247:7 (bind 247:8 xs) (bind 247:11 predicate))
662+ (body 248:9
663+ (branch 248:9
664+ (wing 248:12 xs)
665+ (arm 249:11 (lit 249:11 ~) (lit 249:13 %.y))
666+ (arm 250:11
667+ (cell 250:11 (bind 250:12 item) (bind 250:17 rest))
668+ (body 251:13
669+ (branch 251:13
670+ (group 251:16
671+ (call 251:17 (wing 251:17 predicate) (wing 251:27 item)))
672+ (arm 252:15
673+ (lit 252:15 %.y)
674+ (group 252:19
675+ (call 252:20 (wing 252:20 levy) (wing 252:25 rest) (wing 252:30 predicate))))
676+ (arm 253:15 (lit 253:15 %.n) (lit 253:19 %.n))))))))))))))
677+ (value 255:1 lien
678+ (gate 255:9
679+ (face 255:12 args
680+ (cell 255:17
681+ (apply 255:18 list (tvar 255:24 A))
682+ (fn 255:27 (tvar 255:30 A) (flag 255:32))))
683+ (body 256:3
684+ (cast 256:3
685+ (flag 256:6)
686+ (body 257:5
687+ (branch 257:5
688+ (wing 257:8 args)
689+ (arm 258:7
690+ (cell 258:7 (bind 258:8 xs) (bind 258:11 predicate))
691+ (body 259:9
692+ (branch 259:9
693+ (wing 259:12 xs)
694+ (arm 260:11 (lit 260:11 ~) (lit 260:13 %.n))
695+ (arm 261:11
696+ (cell 261:11 (bind 261:12 item) (bind 261:17 rest))
697+ (body 262:13
698+ (branch 262:13
699+ (group 262:16
700+ (call 262:17 (wing 262:17 predicate) (wing 262:27 item)))
701+ (arm 263:15 (lit 263:15 %.y) (lit 263:19 %.y))
702+ (arm 264:15
703+ (lit 264:15 %.n)
704+ (group 264:19
705+ (call 264:20 (wing 264:20 lien) (wing 264:25 rest) (wing 264:30 predicate))))))))))))))))
706+ (value 266:1 roll
707+ (gate 266:9
708+ (face 266:12 args
709+ (cell 266:17
710+ (apply 266:18 list (tvar 266:24 A))
711+ (tvar 266:27 B)
712+ (fn 266:29
713+ (cell 266:32 (tvar 266:33 A) (tvar 266:35 B))
714+ (tvar 266:38 B))))
715+ (body 267:3
716+ (branch 267:3
717+ (wing 267:6 args)
718+ (arm 268:5
719+ (cell 268:5 (bind 268:6 xs) (bind 268:9 start) (bind 268:15 combine))
720+ (body 269:7
721+ (branch 269:7
722+ (wing 269:10 xs)
723+ (arm 270:9 (lit 270:9 ~) (wing 270:11 start))
724+ (arm 271:9
725+ (cell 271:9 (bind 271:10 item) (bind 271:15 rest))
726+ (group 271:21
727+ (call 271:22
728+ (wing 271:22 roll)
729+ (wing 271:27 rest)
730+ (group 271:32
731+ (call 271:33 (wing 271:33 combine) (wing 271:41 item) (wing 271:46 start)))
732+ (wing 271:53 combine)))))))))))
733+ (value 273:1 reel
734+ (gate 273:9
735+ (face 273:12 args
736+ (cell 273:17
737+ (apply 273:18 list (tvar 273:24 A))
738+ (tvar 273:27 B)
739+ (fn 273:29
740+ (cell 273:32 (tvar 273:33 A) (tvar 273:35 B))
741+ (tvar 273:38 B))))
742+ (body 274:3
743+ (branch 274:3
744+ (wing 274:6 args)
745+ (arm 275:5
746+ (cell 275:5 (bind 275:6 xs) (bind 275:9 start) (bind 275:15 combine))
747+ (body 276:7
748+ (branch 276:7
749+ (wing 276:10 xs)
750+ (arm 277:9 (lit 277:9 ~) (wing 277:11 start))
751+ (arm 278:9
752+ (cell 278:9 (bind 278:10 item) (bind 278:15 rest))
753+ (group 278:21
754+ (call 278:22
755+ (wing 278:22 combine)
756+ (wing 278:30 item)
757+ (group 278:35
758+ (call 278:36 (wing 278:36 reel) (wing 278:41 rest) (wing 278:46 start) (wing 278:52 combine)))))))))))))
759+ (value 280:1 flit
760+ (gate 280:9
761+ (face 280:12 predicate
762+ (fn 280:22 (tvar 280:25 A) (flag 280:27)))
763+ (body 281:3
764+ (gate 281:3
765+ (face 281:6 value (tvar 281:12 A))
766+ (body 282:5
767+ (cast 282:5
768+ (apply 282:8 unit (tvar 282:14 A))
769+ (body 283:7
770+ (branch 283:7
771+ (group 283:10
772+ (call 283:11 (wing 283:11 predicate) (wing 283:21 value)))
773+ (arm 284:9
774+ (lit 284:9 %.y)
775+ (unit 284:13 (wing 284:14 value)))
776+ (arm 285:9 (lit 285:9 %.n) (lit 285:13 ~))))))))))
777+ (value 287:1 murn
778+ (gate 287:9
779+ (face 287:12 args
780+ (cell 287:17
781+ (apply 287:18 list (tvar 287:24 A))
782+ (fn 287:27
783+ (tvar 287:30 A)
784+ (apply 287:32 unit (tvar 287:38 B)))))
785+ (body 288:3
786+ (branch 288:3
787+ (wing 288:6 args)
788+ (arm 289:5
789+ (cell 289:5 (bind 289:6 xs) (bind 289:9 f))
790+ (cast 289:12
791+ (apply 289:15 list (tvar 289:21 B))
792+ (body 290:9
793+ (branch 290:9
794+ (wing 290:12 xs)
795+ (arm 291:11 (lit 291:11 ~) (lit 291:13 ~))
796+ (arm 292:11
797+ (cell 292:11 (bind 292:12 item) (bind 292:17 rest))
798+ (body 293:13
799+ (branch 293:13
800+ (group 293:16
801+ (call 293:17 (wing 293:17 f) (wing 293:19 item)))
802+ (arm 294:15
803+ (lit 294:15 ~)
804+ (group 294:17
805+ (call 294:18 (wing 294:18 murn) (wing 294:23 rest) (wing 294:28 f))))
806+ (arm 295:15
807+ (cell 295:15 (lit 295:16 ~) (bind 295:18 value))
808+ (tuple 295:25
809+ (wing 295:26 value)
810+ (group 295:32
811+ (call 295:33 (wing 295:33 murn) (wing 295:38 rest) (wing 295:43 f))))))))))))))))
812+ (value 297:1 join
813+ (gate 297:9
814+ (face 297:12 args
815+ (cell 297:17
816+ (tvar 297:18 A)
817+ (apply 297:20 list (tvar 297:26 A))))
818+ (body 298:3
819+ (branch 298:3
820+ (wing 298:6 args)
821+ (arm 299:5
822+ (cell 299:5 (bind 299:6 separator) (bind 299:16 xs))
823+ (cast 299:20
824+ (apply 299:23 list (tvar 299:29 A))
825+ (body 300:9
826+ (branch 300:9
827+ (wing 300:12 xs)
828+ (arm 301:11 (lit 301:11 ~) (lit 301:13 ~))
829+ (arm 302:11
830+ (cell 302:11 (bind 302:12 item) (bind 302:17 rest))
831+ (body 303:13
832+ (branch 303:13
833+ (wing 303:16 rest)
834+ (arm 304:15
835+ (lit 304:15 ~)
836+ (tuple 304:17 (wing 304:18 item) (lit 304:23 ~)))
837+ (arm 305:15
838+ (cell 305:15 (bind 305:16 next) (bind 305:21 more))
839+ (tuple 305:27
840+ (wing 305:28 item)
841+ (tuple 305:33
842+ (wing 305:34 separator)
843+ (group 305:44
844+ (call 305:45 (wing 305:45 join) (wing 305:50 separator) (wing 305:60 rest)))))))))))))))))
845+ (value 307:1 snip
846+ (gate 307:9
847+ (face 307:12 xs
848+ (apply 307:15 list (tvar 307:21 A)))
849+ (body 308:3
850+ (cast 308:3
851+ (apply 308:6 list (tvar 308:12 A))
852+ (body 309:5
853+ (branch 309:5
854+ (wing 309:8 xs)
855+ (arm 310:7 (lit 310:7 ~) (lit 310:9 ~))
856+ (arm 311:7
857+ (cell 311:7 (bind 311:8 item) (bind 311:13 rest))
858+ (body 312:9
859+ (branch 312:9
860+ (wing 312:12 rest)
861+ (arm 313:11 (lit 313:11 ~) (lit 313:13 ~))
862+ (arm 314:11
863+ (cell 314:11 (bind 314:12 next) (bind 314:17 more))
864+ (tuple 314:23
865+ (wing 314:24 item)
866+ (group 314:29
867+ (call 314:30 (wing 314:30 snip) (wing 314:35 rest))))))))))))))
868+ (value 316:1 rear
869+ (gate 316:9
870+ (face 316:12 xs
871+ (apply 316:15 list (tvar 316:21 A)))
872+ (body 317:3
873+ (branch 317:3
874+ (wing 317:6 xs)
875+ (arm 318:5 (lit 318:5 ~) (crash 318:7))
876+ (arm 319:5
877+ (cell 319:5 (bind 319:6 item) (bind 319:11 rest))
878+ (body 320:7
879+ (branch 320:7
880+ (wing 320:10 rest)
881+ (arm 321:9 (lit 321:9 ~) (wing 321:11 item))
882+ (arm 322:9
883+ (cell 322:9 (bind 322:10 next) (bind 322:15 more))
884+ (group 322:21
885+ (call 322:22 (wing 322:22 rear) (wing 322:27 rest)))))))))))
886+ (value 324:1 cork
887+ (gate 324:9
888+ (face 324:12 gates
889+ (cell 324:18
890+ (fn 324:19 (tvar 324:22 A) (tvar 324:24 B))
891+ (fn 324:27 (tvar 324:30 B) (tvar 324:32 C))))
892+ (body 325:3
893+ (branch 325:3
894+ (wing 325:6 gates)
895+ (arm 326:5
896+ (cell 326:5 (bind 326:6 f) (bind 326:8 g))
897+ (gate 326:11
898+ (face 326:14 x (tvar 326:16 A))
899+ (group 326:18
900+ (call 326:19
901+ (wing 326:19 g)
902+ (group 326:21
903+ (call 326:22 (wing 326:22 f) (wing 326:24 x)))))))))))
904+ (value 328:1 corl
905+ (gate 328:9
906+ (face 328:12 gates
907+ (cell 328:18
908+ (fn 328:19 (tvar 328:22 B) (tvar 328:24 C))
909+ (fn 328:27 (tvar 328:30 A) (tvar 328:32 B))))
910+ (body 329:3
911+ (branch 329:3
912+ (wing 329:6 gates)
913+ (arm 330:5
914+ (cell 330:5 (bind 330:6 f) (bind 330:8 g))
915+ (gate 330:11
916+ (face 330:14 x (tvar 330:16 A))
917+ (group 330:18
918+ (call 330:19
919+ (wing 330:19 f)
920+ (group 330:21
921+ (call 330:22 (wing 330:22 g) (wing 330:24 x)))))))))))
922+ (value 332:1 cury
923+ (gate 332:9
924+ (face 332:12 args
925+ (cell 332:17
926+ (fn 332:18
927+ (cell 332:21 (tvar 332:22 A) (tvar 332:24 B))
928+ (tvar 332:27 C))
929+ (tvar 332:30 A)))
930+ (body 333:3
931+ (branch 333:3
932+ (wing 333:6 args)
933+ (arm 334:5
934+ (cell 334:5 (bind 334:6 f) (bind 334:8 a))
935+ (gate 334:11
936+ (face 334:14 b (tvar 334:16 B))
937+ (group 334:18
938+ (call 334:19 (wing 334:19 f) (wing 334:21 a) (wing 334:23 b)))))))))
939+ (value 336:1 curr
940+ (gate 336:9
941+ (face 336:12 args
942+ (cell 336:17
943+ (fn 336:18
944+ (cell 336:21 (tvar 336:22 A) (tvar 336:24 B))
945+ (tvar 336:27 C))
946+ (tvar 336:30 B)))
947+ (body 337:3
948+ (branch 337:3
949+ (wing 337:6 args)
950+ (arm 338:5
951+ (cell 338:5 (bind 338:6 f) (bind 338:8 b))
952+ (gate 338:11
953+ (face 338:14 a (tvar 338:16 A))
954+ (group 338:18
955+ (call 338:19 (wing 338:19 f) (wing 338:21 a) (wing 338:23 b)))))))))
956+ (mold 340:1 cmd
957+ (generic 340:8 M
958+ (union 341:3
959+ (cell 341:3
960+ (const 341:4 %poke)
961+ (face 341:10 p (ref 341:12 raw-poke))
962+ (face 341:21 reply
963+ (fn 341:27
964+ (apply 341:30 unit (aura 341:36 @t))
965+ (tvar 341:40 M))))
966+ (cell 342:3
967+ (const 342:4 %go)
968+ (face 342:8 url (aura 342:12 @t)))
969+ (cell 343:3
970+ (const 343:4 %wait)
971+ (face 343:10 gap (aura 343:14 @dr))
972+ (face 343:18 msg (tvar 343:22 M)))
973+ (cell 344:3
974+ (const 344:4 %now)
975+ (face 344:9 reply
976+ (fn 344:15 (aura 344:18 @da) (tvar 344:22 M))))
977+ (cell 345:3
978+ (const 345:4 %who)
979+ (face 345:9 reply
980+ (fn 345:15 (aura 345:18 @p) (tvar 345:21 M)))))))
981+ (value 347:1 gth
982+ (gate 347:8
983+ (face 347:11 args
984+ (cell 347:16 (tvar 347:17 A) (tvar 347:19 A)))
985+ (group 347:22
986+ (call 347:23 (wing 347:23 gth-atom.internal) (wing 347:41 args)))))
987+ (value 348:1 add
988+ (gate 348:8
989+ (face 348:11 args
990+ (cell 348:16 (tvar 348:17 A) (tvar 348:19 A)))
991+ (group 348:22
992+ (call 348:23 (wing 348:23 add-atom.internal) (wing 348:41 args)))))
993+ (value 349:1 dec
994+ (gate 349:8
995+ (face 349:11 atom (tvar 349:16 A))
996+ (group 349:18
997+ (call 349:19 (wing 349:19 dec-atom.internal) (wing 349:37 atom)))))
998+ (mold 351:1 ask
999+ (generic 351:8 M
1000+ (apply 351:15 ask.internal (tvar 351:29 M))))
1001+ (value 352:1 pure
1002+ (gate 352:9
1003+ (face 352:12 x (tvar 352:14 M))
1004+ (cast 352:16
1005+ (apply 352:19 ask (tvar 352:24 M))
1006+ (tuple 352:27 (lit 352:28 %pure) (wing 352:34 x))))))
tests/golden/prelude-unit-list-transforms/types.txt+2−1
@@ -1,5 +1,5 @@
11partial inference; module not checked
2−+$ poke: not checked
2++$ raw-poke: not checked
33+$ qath: not checked
44++ same: $-(A A)
55++ head: $-([A B] A)
@@ -48,6 +48,7 @@ partial inference; module not checked
4848++ biff: $-([(unit A) $-(A (unit B))] (unit B))
4949++ both: unit construction needs the standard prelude in partial inference
5050++ clap: unit construction needs the standard prelude in partial inference
51+++ hunt: $-([$-([A A] ?) [(unit A) (unit A)]] (unit A))
5152++ clef: $-([(unit A) [(unit B) $-([A B] (unit C))]] (unit C))
5253++ skim: sample mold is not supported by partial inference
5354++ skip: sample mold is not supported by partial inference
tests/golden/types-arithmetic-module/source.jibb+1−1
@@ -1,7 +1,7 @@
11/= math /ui/math
22++ decimal ^- @ud (sum.math 1 2)
33++ hex ^- @ux (sum.math 0x1 0x2)
4−++ text ^- @t (alias.math "a" "b")
4+++ text-value ^- @t (alias.math "a" "b")
55++ ship ^- @p (down.math ~zod)
66++ reject-bool (sum.math %.y %.n)
77++ reject-down (down.math %.y)
tests/golden/types-arithmetic-module/tokens.txt+8−8
@@ -26,14 +26,14 @@
26263:32 tight glyph )
27274:1 NEWLINE
28284:1 glyph ++
29−4:4 name text
30−4:9 glyph ^-
31−4:12 aura @t
32−4:15 glyph (
33−4:16 tight wing alias.math
34−4:27 str "a"
35−4:31 str "b"
36−4:34 tight glyph )
29+4:4 name text-value
30+4:15 glyph ^-
31+4:18 aura @t
32+4:21 glyph (
33+4:22 tight wing alias.math
34+4:33 str "a"
35+4:37 str "b"
36+4:40 tight glyph )
37375:1 NEWLINE
38385:1 glyph ++
39395:4 name ship
tests/golden/types-arithmetic-module/tree.txt+5−5
@@ -10,11 +10,11 @@
1010 (aura 3:11 @ux)
1111 (group 3:15
1212 (call 3:16 (wing 3:16 sum.math) (lit 3:25 0x1) (lit 3:29 0x2)))))
13− (value 4:1 text
14− (cast 4:9
15− (aura 4:12 @t)
16− (group 4:15
17− (call 4:16 (wing 4:16 alias.math) (str 4:27 "a") (str 4:31 "b")))))
13+ (value 4:1 text-value
14+ (cast 4:15
15+ (aura 4:18 @t)
16+ (group 4:21
17+ (call 4:22 (wing 4:22 alias.math) (str 4:33 "a") (str 4:37 "b")))))
1818 (value 5:1 ship
1919 (cast 5:9
2020 (aura 5:12 @p)
tests/golden/types-arithmetic-module/types.txt+2−2
@@ -1,7 +1,7 @@
11partial inference; module not checked
22++ decimal: @ud
33++ hex: @ux
4−++ text: @t
4+++ text-value: @t
55++ ship: @p
66++ reject-bool: call's sample and argument types do not unify
77/tests/golden/types-arithmetic-module/source.jibb:6:17: called gate has type $-([a=A b=A] A) where A is an atom other than ?
@@ -25,7 +25,7 @@ partial inference; module not checked
2525++ reject-alias (alias.math %.n %.y)
2626 ^
2727++ reject-any: call constraint is not supported by partial inference
28−++ nested: local definitions need unsupported inference
28+++ nested: $-(A A) where A is an atom other than ?
2929++ inc-decimal: @ud
3030++ inc-hex: @ux
3131++ inc-bool: call's sample and argument types do not unify
tests/golden/types-cell-pattern-schemes/source.jibb+1−1
@@ -10,7 +10,7 @@
1010++ identity |= x
1111 ?- x
1212 [a b c] [a b c]
13−++ text (identity "hi" ~zod %.y)
13+++ text-value (identity "hi" ~zod %.y)
1414++ ship (identity ~zod "hi" %.n)
1515++ shared |= x=[A A A]
1616 ?- x
tests/golden/types-cell-pattern-schemes/tokens.txt+7−7
@@ -73,13 +73,13 @@
737313:1 DEDENT
747413:1 NEWLINE
757513:1 glyph ++
76−13:4 name text
77−13:9 glyph (
78−13:10 tight name identity
79−13:19 str "hi"
80−13:24 lit ~zod
81−13:29 lit %.y
82−13:32 tight glyph )
76+13:4 name text-value
77+13:15 glyph (
78+13:16 tight name identity
79+13:25 str "hi"
80+13:30 lit ~zod
81+13:35 lit %.y
82+13:38 tight glyph )
838314:1 NEWLINE
848414:1 glyph ++
858514:4 name ship
tests/golden/types-cell-pattern-schemes/tree.txt+3−3
@@ -31,9 +31,9 @@
3131 (arm 12:5
3232 (cell 12:5 (bind 12:6 a) (bind 12:8 b) (bind 12:10 c))
3333 (tuple 12:13 (wing 12:14 a) (wing 12:16 b) (wing 12:18 c)))))))
34− (value 13:1 text
35− (group 13:9
36− (call 13:10 (wing 13:10 identity) (str 13:19 "hi") (lit 13:24 ~zod) (lit 13:29 %.y))))
34+ (value 13:1 text-value
35+ (group 13:15
36+ (call 13:16 (wing 13:16 identity) (str 13:25 "hi") (lit 13:30 ~zod) (lit 13:35 %.y))))
3737 (value 14:1 ship
3838 (group 14:9
3939 (call 14:10 (wing 14:10 identity) (lit 14:19 ~zod) (str 14:24 "hi") (lit 14:29 %.n))))
tests/golden/types-cell-pattern-schemes/types.txt+1−1
@@ -3,7 +3,7 @@ partial inference; module not checked
33++ maybe-union: cell pattern subject is not supported by partial inference
44++ maybe-list: cell pattern subject is not supported by partial inference
55++ identity: $-([A [B C]] [A [B C]])
6−++ text: [@t [@p ?]]
6+++ text-value: [@t [@p ?]]
77++ ship: [@p [@t ?]]
88++ shared: $-([A [A A]] [A [A A]])
99++ wrong: call's sample and argument types do not unify
tests/golden/types-generic-face-inference/types.txt+7−1
@@ -10,4 +10,10 @@ partial inference; module not checked
1010/tests/golden/types-generic-face-inference/source.jibb:7:60: expression has type [left=@t rest=@ud]
1111++ mismatch |= x=[left=@t rest=@ud] ^- [right=@t rest=@ud] x
1212 ^
13−++ uncertain: cast constraint is not supported by partial inference
13+++ uncertain: distinct type variables `A` and `B` must not be forced equal; use the same capital for a shared type
14+/tests/golden/types-generic-face-inference/source.jibb:8:19: first type variable
15+++ uncertain |= x=A ^- [first=B rest=@t] [x "hi"]
16+ ^
17+/tests/golden/types-generic-face-inference/source.jibb:8:31: second type variable
18+++ uncertain |= x=A ^- [first=B rest=@t] [x "hi"]
19+ ^
tests/golden/types-generic-result-context/source.jibb+9−9
@@ -10,15 +10,15 @@
1010+$ swap |$ [A B] (choice B A)
1111+$ repeated |$ [A] (choice A A)
1212+$ phantom |$ [A B] (choice A @p)
13−++ wrap |= x=A ^- (choice A @p) [%one x]
14−++ wrap-repeat |= x=A ^- (repeated A) [%one x]
15−++ use-msg ^- (choice msg @p) (wrap %idle)
16−++ use-alias ^- (swap @p msg) (wrap %idle)
17−++ use-repeated ^- (repeated msg) (wrap-repeat %idle)
18−++ use-distinct ^- (choice other @p) (wrap %idle)
13+++ wrap-value |= x=A ^- (choice A @p) [%one x]
14+++ wrap-value-repeat |= x=A ^- (repeated A) [%one x]
15+++ use-msg ^- (choice msg @p) (wrap-value %idle)
16+++ use-alias ^- (swap @p msg) (wrap-value %idle)
17+++ use-repeated ^- (repeated msg) (wrap-value-repeat %idle)
18+++ use-distinct ^- (choice other @p) (wrap-value %idle)
1919++ independent |= [m=msg n=other]
20− [(^- (choice msg @p) (wrap m)) (^- (choice other @p) (wrap n))]
20+ [(^- (choice msg @p) (wrap-value m)) (^- (choice other @p) (wrap-value n))]
2121++ pending
2222 ~& %orphan
23− ^- (choice msg @p) (wrap %idle)
24−++ wrong-case ^- (choice msg @p) (wrap %absent)
23+ ^- (choice msg @p) (wrap-value %idle)
24+++ wrong-case ^- (choice msg @p) (wrap-value %absent)
tests/golden/types-generic-result-context/tokens.txt+65−65
@@ -76,37 +76,37 @@
767612:33 tight glyph )
777713:1 NEWLINE
787813:1 glyph ++
79−13:4 name wrap
80−13:9 glyph |=
81−13:12 name x
82−13:13 tight glyph =
83−13:14 tight tvar A
84−13:16 glyph ^-
85−13:19 glyph (
86−13:20 tight name choice
87−13:27 tvar A
88−13:29 aura @p
89−13:31 tight glyph )
90−13:33 glyph [
91−13:34 tight lit %one
92−13:39 name x
93−13:40 tight glyph ]
79+13:4 name wrap-value
80+13:15 glyph |=
81+13:18 name x
82+13:19 tight glyph =
83+13:20 tight tvar A
84+13:22 glyph ^-
85+13:25 glyph (
86+13:26 tight name choice
87+13:33 tvar A
88+13:35 aura @p
89+13:37 tight glyph )
90+13:39 glyph [
91+13:40 tight lit %one
92+13:45 name x
93+13:46 tight glyph ]
949414:1 NEWLINE
959514:1 glyph ++
96−14:4 name wrap-repeat
97−14:16 glyph |=
98−14:19 name x
99−14:20 tight glyph =
100−14:21 tight tvar A
101−14:23 glyph ^-
102−14:26 glyph (
103−14:27 tight name repeated
104−14:36 tvar A
105−14:37 tight glyph )
106−14:39 glyph [
107−14:40 tight lit %one
108−14:45 name x
109−14:46 tight glyph ]
96+14:4 name wrap-value-repeat
97+14:22 glyph |=
98+14:25 name x
99+14:26 tight glyph =
100+14:27 tight tvar A
101+14:29 glyph ^-
102+14:32 glyph (
103+14:33 tight name repeated
104+14:42 tvar A
105+14:43 tight glyph )
106+14:45 glyph [
107+14:46 tight lit %one
108+14:51 name x
109+14:52 tight glyph ]
11011015:1 NEWLINE
11111115:1 glyph ++
11211215:4 name use-msg
@@ -117,9 +117,9 @@
11711715:27 aura @p
11811815:29 tight glyph )
11911915:31 glyph (
120−15:32 tight name wrap
121−15:37 lit %idle
122−15:42 tight glyph )
120+15:32 tight name wrap-value
121+15:43 lit %idle
122+15:48 tight glyph )
12312316:1 NEWLINE
12412416:1 glyph ++
12512516:4 name use-alias
@@ -130,9 +130,9 @@
13013016:26 name msg
13113116:29 tight glyph )
13213216:31 glyph (
133−16:32 tight name wrap
134−16:37 lit %idle
135−16:42 tight glyph )
133+16:32 tight name wrap-value
134+16:43 lit %idle
135+16:48 tight glyph )
13613617:1 NEWLINE
13713717:1 glyph ++
13813817:4 name use-repeated
@@ -142,9 +142,9 @@
14214217:30 name msg
14314317:33 tight glyph )
14414417:35 glyph (
145−17:36 tight name wrap-repeat
146−17:48 lit %idle
147−17:53 tight glyph )
145+17:36 tight name wrap-value-repeat
146+17:54 lit %idle
147+17:59 tight glyph )
14814818:1 NEWLINE
14914918:1 glyph ++
15015018:4 name use-distinct
@@ -155,9 +155,9 @@
15515518:34 aura @p
15615618:36 tight glyph )
15715718:38 glyph (
158−18:39 tight name wrap
159−18:44 lit %idle
160−18:49 tight glyph )
158+18:39 tight name wrap-value
159+18:50 lit %idle
160+18:55 tight glyph )
16116119:1 NEWLINE
16216219:1 glyph ++
16316319:4 name independent
@@ -180,23 +180,23 @@
18018020:20 aura @p
18118120:22 tight glyph )
18218220:24 glyph (
183−20:25 tight name wrap
184−20:30 name m
185−20:31 tight glyph )
186−20:32 tight glyph )
187−20:34 glyph (
188−20:35 tight glyph ^-
189−20:38 glyph (
190−20:39 tight name choice
191−20:46 name other
192−20:52 aura @p
193−20:54 tight glyph )
194−20:56 glyph (
195−20:57 tight name wrap
196−20:62 name n
197−20:63 tight glyph )
198−20:64 tight glyph )
199−20:65 tight glyph ]
183+20:25 tight name wrap-value
184+20:36 name m
185+20:37 tight glyph )
186+20:38 tight glyph )
187+20:40 glyph (
188+20:41 tight glyph ^-
189+20:44 glyph (
190+20:45 tight name choice
191+20:52 name other
192+20:58 aura @p
193+20:60 tight glyph )
194+20:62 glyph (
195+20:63 tight name wrap-value
196+20:74 name n
197+20:75 tight glyph )
198+20:76 tight glyph )
199+20:77 tight glyph ]
20020021:1 DEDENT
20120121:1 NEWLINE
20220221:1 glyph ++
@@ -212,9 +212,9 @@
21221223:20 aura @p
21321323:22 tight glyph )
21421423:24 glyph (
215−23:25 tight name wrap
216−23:30 lit %idle
217−23:35 tight glyph )
215+23:25 tight name wrap-value
216+23:36 lit %idle
217+23:41 tight glyph )
21821824:1 DEDENT
21921924:1 DEDENT
22022024:1 NEWLINE
@@ -227,7 +227,7 @@
22722724:30 aura @p
22822824:32 tight glyph )
22922924:34 glyph (
230−24:35 tight name wrap
231−24:40 lit %absent
232−24:47 tight glyph )
233−24:48 NEWLINE
230+24:35 tight name wrap-value
231+24:46 lit %absent
232+24:53 tight glyph )
233+24:54 NEWLINE
tests/golden/types-generic-result-context/tree.txt+24−24
@@ -21,38 +21,38 @@
2121 (mold 12:1 phantom
2222 (generic 12:12 A B
2323 (apply 12:21 choice (tvar 12:29 A) (aura 12:31 @p))))
24− (value 13:1 wrap
25− (gate 13:9
26− (face 13:12 x (tvar 13:14 A))
27− (cast 13:16
28− (apply 13:19 choice (tvar 13:27 A) (aura 13:29 @p))
29− (tuple 13:33 (lit 13:34 %one) (wing 13:39 x)))))
30− (value 14:1 wrap-repeat
31− (gate 14:16
32− (face 14:19 x (tvar 14:21 A))
33− (cast 14:23
34− (apply 14:26 repeated (tvar 14:36 A))
35− (tuple 14:39 (lit 14:40 %one) (wing 14:45 x)))))
24+ (value 13:1 wrap-value
25+ (gate 13:15
26+ (face 13:18 x (tvar 13:20 A))
27+ (cast 13:22
28+ (apply 13:25 choice (tvar 13:33 A) (aura 13:35 @p))
29+ (tuple 13:39 (lit 13:40 %one) (wing 13:45 x)))))
30+ (value 14:1 wrap-value-repeat
31+ (gate 14:22
32+ (face 14:25 x (tvar 14:27 A))
33+ (cast 14:29
34+ (apply 14:32 repeated (tvar 14:42 A))
35+ (tuple 14:45 (lit 14:46 %one) (wing 14:51 x)))))
3636 (value 15:1 use-msg
3737 (cast 15:12
3838 (apply 15:15 choice (ref 15:23 msg) (aura 15:27 @p))
3939 (group 15:31
40− (call 15:32 (wing 15:32 wrap) (lit 15:37 %idle)))))
40+ (call 15:32 (wing 15:32 wrap-value) (lit 15:43 %idle)))))
4141 (value 16:1 use-alias
4242 (cast 16:14
4343 (apply 16:17 swap (aura 16:23 @p) (ref 16:26 msg))
4444 (group 16:31
45− (call 16:32 (wing 16:32 wrap) (lit 16:37 %idle)))))
45+ (call 16:32 (wing 16:32 wrap-value) (lit 16:43 %idle)))))
4646 (value 17:1 use-repeated
4747 (cast 17:17
4848 (apply 17:20 repeated (ref 17:30 msg))
4949 (group 17:35
50− (call 17:36 (wing 17:36 wrap-repeat) (lit 17:48 %idle)))))
50+ (call 17:36 (wing 17:36 wrap-value-repeat) (lit 17:54 %idle)))))
5151 (value 18:1 use-distinct
5252 (cast 18:17
5353 (apply 18:20 choice (ref 18:28 other) (aura 18:34 @p))
5454 (group 18:38
55− (call 18:39 (wing 18:39 wrap) (lit 18:44 %idle)))))
55+ (call 18:39 (wing 18:39 wrap-value) (lit 18:50 %idle)))))
5656 (value 19:1 independent
5757 (gate 19:16
5858 (cell 19:19
@@ -64,12 +64,12 @@
6464 (cast 20:5
6565 (apply 20:8 choice (ref 20:16 msg) (aura 20:20 @p))
6666 (group 20:24
67− (call 20:25 (wing 20:25 wrap) (wing 20:30 m)))))
68− (group 20:34
69− (cast 20:35
70− (apply 20:38 choice (ref 20:46 other) (aura 20:52 @p))
71− (group 20:56
72− (call 20:57 (wing 20:57 wrap) (wing 20:62 n)))))))))
67+ (call 20:25 (wing 20:25 wrap-value) (wing 20:36 m)))))
68+ (group 20:40
69+ (cast 20:41
70+ (apply 20:44 choice (ref 20:52 other) (aura 20:58 @p))
71+ (group 20:62
72+ (call 20:63 (wing 20:63 wrap-value) (wing 20:74 n)))))))))
7373 (value 21:1 pending
7474 (body 22:3
7575 (trace 22:3
@@ -78,9 +78,9 @@
7878 (cast 23:5
7979 (apply 23:8 choice (ref 23:16 msg) (aura 23:20 @p))
8080 (group 23:24
81− (call 23:25 (wing 23:25 wrap) (lit 23:30 %idle))))))))
81+ (call 23:25 (wing 23:25 wrap-value) (lit 23:36 %idle))))))))
8282 (value 24:1 wrong-case
8383 (cast 24:15
8484 (apply 24:18 choice (ref 24:26 msg) (aura 24:30 @p))
8585 (group 24:34
86− (call 24:35 (wing 24:35 wrap) (lit 24:40 %absent))))))
86+ (call 24:35 (wing 24:35 wrap-value) (lit 24:46 %absent))))))
tests/golden/types-generic-result-context/types.txt+6−6
@@ -5,8 +5,8 @@ partial inference; module not checked
55+$ swap: not checked
66+$ repeated: not checked
77+$ phantom: not checked
8−++ wrap: $-(A (choice A @p))
9−++ wrap-repeat: $-(A (choice A A))
8+++ wrap-value: $-(A (choice A @p))
9+++ wrap-value-repeat: $-(A (choice A A))
1010++ use-msg: (choice msg @p)
1111++ use-alias: (choice msg @p)
1212++ use-repeated: (choice msg msg)
@@ -15,8 +15,8 @@ partial inference; module not checked
1515++ pending: tag needs context in partial inference
1616++ wrong-case: msg has no case `%absent`
1717/tests/golden/types-generic-result-context/source.jibb:24:35: expected union
18−++ wrong-case ^- (choice msg @p) (wrap %absent)
18+++ wrong-case ^- (choice msg @p) (wrap-value %absent)
1919 ^
20−/tests/golden/types-generic-result-context/source.jibb:24:40: tag
21−++ wrong-case ^- (choice msg @p) (wrap %absent)
22− ^
20+/tests/golden/types-generic-result-context/source.jibb:24:46: tag
21+++ wrong-case ^- (choice msg @p) (wrap-value %absent)
22+ ^
tests/golden/types-generic-union-escaping/module-trees.txt+4−4
@@ -6,10 +6,10 @@
66/ui/mid.jibb
77(module
88 (jibb 1:1 base /ui/base)
9− (value 2:1 text
10− (cast 2:9
11− (apply 2:12 phantom.base (aura 2:26 @t))
12− (lit 2:30 %yes)))
9+ (value 2:1 text-value
10+ (cast 2:15
11+ (apply 2:18 phantom.base (aura 2:32 @t))
12+ (lit 2:36 %yes)))
1313 (value 3:1 ship
1414 (cast 3:9
1515 (apply 3:12 phantom.base (aura 3:26 @p))
tests/golden/types-generic-union-escaping/modules/ui/mid.jibb+1−1
@@ -1,3 +1,3 @@
11/= base /ui/base
2−++ text ^- (phantom.base @t) %yes
2+++ text-value ^- (phantom.base @t) %yes
33++ ship ^- (phantom.base @p) %yes
tests/golden/types-generic-union-escaping/source.jibb+1−1
@@ -1,3 +1,3 @@
11/= mid /ui/mid
2−++ text-value text.mid
2+++ text-value text-value.mid
33++ ship-value ship.mid
tests/golden/types-generic-union-escaping/tokens.txt+1−1
@@ -7,7 +7,7 @@
772:1 NEWLINE
882:1 glyph ++
992:4 name text-value
10−2:15 wing text.mid
10+2:15 wing text-value.mid
11113:1 NEWLINE
12123:1 glyph ++
13133:4 name ship-value
tests/golden/types-generic-union-escaping/tree.txt+1−1
@@ -1,4 +1,4 @@
11(module
22 (jibb 1:1 mid /ui/mid)
3− (value 2:1 text-value (wing 2:15 text.mid))
3+ (value 2:1 text-value (wing 2:15 text-value.mid))
44 (value 3:1 ship-value (wing 3:15 ship.mid)))
tests/golden/types-hole-numeric-capture/types.txt+10−4
@@ -1,10 +1,16 @@
11partial inference; module not checked
22++ same: $-([a=A b=A] A)
33++ independent: @ud
4−++ first: call constraint is not supported by partial inference
5−++ second: call constraint is not supported by partial inference
6−++ capture: local definitions need unsupported inference
4+++ first: explicit capital constraints are not supported by partial inference
5+++ second: explicit capital constraints are not supported by partial inference
6+++ capture: type hole needs unsupported inference
7+/tests/golden/types-hole-numeric-capture/source.jibb:6:15: type hole
8+ ++ local ^- _ (same x 1)
9+ ^
710++ local-independent: $-(@t @t)
811++ unresolved-tag: tag needs context in partial inference
912++ discarded-number: @t
10−++ captured-second: local definitions need unsupported inference
13+++ captured-second: type hole needs unsupported inference
14+/tests/golden/types-hole-numeric-capture/source.jibb:18:15: type hole
15+ ++ local ^- _ (same 1 x)
16+ ^
tests/golden/types-nested-shallow-preserve/source.jibb+15−15
@@ -1,25 +1,25 @@
1−+$ length
1++$ extent
22 [%fill n=@ud]
33 %shrink
4−+$ attr
5− [%width length]
4++$ attribute
5+ [%width extent]
66 [%gap @tas]
77++ number-id |= x=@ud x
8−++ plain ^- attr width+[%fill 1]
9−++ direct ^- attr [%width [%fill 1]]
10−++ list ^- (list attr) ~[width+[%fill 1]]
11−++ accept |= value=attr value
8+++ plain ^- attribute width+[%fill 1]
9+++ direct ^- attribute [%width [%fill 1]]
10+++ list ^- (list attribute) ~[width+[%fill 1]]
11+++ accept |= value=attribute value
1212++ call (accept width+[%fill 1])
13−++ simple-call ^- attr width+[%fill (number-id 1)]
14−++ grouped-call ^- attr width+[%fill ((number-id 1))]
15−++ cast-call ^- attr width+[%fill (^- @ud (number-id 1))]
16−++ nested-call ^- attr width+[%fill (number-id (number-id 1))]
17−++ bad-tag ^- attr width+[%missing 1]
18−++ bad-number ^- attr width+[%fill "bad"]
13+++ simple-call ^- attribute width+[%fill (number-id 1)]
14+++ grouped-call ^- attribute width+[%fill ((number-id 1))]
15+++ cast-call ^- attribute width+[%fill (^- @ud (number-id 1))]
16+++ nested-call ^- attribute width+[%fill (number-id (number-id 1))]
17+++ bad-tag ^- attribute width+[%missing 1]
18+++ bad-number ^- attribute width+[%fill "bad"]
1919++ pending
2020 ~& %unrelated
21− ^- attr width+[%fill (number-id 1)]
22−++ singleton ^- attr width+%shrink
21+ ^- attribute width+[%fill (number-id 1)]
22+++ singleton ^- attribute width+%shrink
2323+$ event
2424 [%got value=@t]
2525 %idle
tests/golden/types-nested-shallow-preserve/tokens.txt+107−107
@@ -1,5 +1,5 @@
111:1 glyph +$
2−1:4 name length
2+1:4 name extent
332:3 INDENT
442:3 glyph [
552:4 tight lit %fill
@@ -12,11 +12,11 @@
12124:1 DEDENT
13134:1 NEWLINE
14144:1 glyph +$
15−4:4 name attr
15+4:4 name attribute
16165:3 INDENT
17175:3 glyph [
18185:4 tight lit %width
19−5:11 name length
19+5:11 name extent
20205:17 tight glyph ]
21216:3 NEWLINE
22226:3 glyph [
@@ -36,49 +36,49 @@
36368:1 glyph ++
37378:4 name plain
38388:10 glyph ^-
39−8:13 name attr
40−8:18 name width
41−8:23 tight glyph +
42−8:24 tight glyph [
43−8:25 tight lit %fill
44−8:31 lit 1
45−8:32 tight glyph ]
39+8:13 name attribute
40+8:23 name width
41+8:28 tight glyph +
42+8:29 tight glyph [
43+8:30 tight lit %fill
44+8:36 lit 1
45+8:37 tight glyph ]
46469:1 NEWLINE
47479:1 glyph ++
48489:4 name direct
49499:11 glyph ^-
50−9:14 name attr
51−9:19 glyph [
52−9:20 tight lit %width
53−9:27 glyph [
54−9:28 tight lit %fill
55−9:34 lit 1
56−9:35 tight glyph ]
57−9:36 tight glyph ]
50+9:14 name attribute
51+9:24 glyph [
52+9:25 tight lit %width
53+9:32 glyph [
54+9:33 tight lit %fill
55+9:39 lit 1
56+9:40 tight glyph ]
57+9:41 tight glyph ]
585810:1 NEWLINE
595910:1 glyph ++
606010:4 name list
616110:9 glyph ^-
626210:12 glyph (
636310:13 tight name list
64−10:18 name attr
65−10:22 tight glyph )
66−10:24 glyph ~[
67−10:26 tight name width
68−10:31 tight glyph +
69−10:32 tight glyph [
70−10:33 tight lit %fill
71−10:39 lit 1
72−10:40 tight glyph ]
73−10:41 tight glyph ]
64+10:18 name attribute
65+10:27 tight glyph )
66+10:29 glyph ~[
67+10:31 tight name width
68+10:36 tight glyph +
69+10:37 tight glyph [
70+10:38 tight lit %fill
71+10:44 lit 1
72+10:45 tight glyph ]
73+10:46 tight glyph ]
747411:1 NEWLINE
757511:1 glyph ++
767611:4 name accept
777711:11 glyph |=
787811:14 name value
797911:19 tight glyph =
80−11:20 tight name attr
81−11:25 name value
80+11:20 tight name attribute
81+11:30 name value
828212:1 NEWLINE
838312:1 glyph ++
848412:4 name call
@@ -95,89 +95,89 @@
959513:1 glyph ++
969613:4 name simple-call
979713:16 glyph ^-
98−13:19 name attr
99−13:24 name width
100−13:29 tight glyph +
101−13:30 tight glyph [
102−13:31 tight lit %fill
103−13:37 glyph (
104−13:38 tight name number-id
105−13:48 lit 1
106−13:49 tight glyph )
107−13:50 tight glyph ]
98+13:19 name attribute
99+13:29 name width
100+13:34 tight glyph +
101+13:35 tight glyph [
102+13:36 tight lit %fill
103+13:42 glyph (
104+13:43 tight name number-id
105+13:53 lit 1
106+13:54 tight glyph )
107+13:55 tight glyph ]
10810814:1 NEWLINE
10910914:1 glyph ++
11011014:4 name grouped-call
11111114:17 glyph ^-
112−14:20 name attr
113−14:25 name width
114−14:30 tight glyph +
115−14:31 tight glyph [
116−14:32 tight lit %fill
117−14:38 glyph (
118−14:39 tight glyph (
119−14:40 tight name number-id
120−14:50 lit 1
121−14:51 tight glyph )
122−14:52 tight glyph )
123−14:53 tight glyph ]
112+14:20 name attribute
113+14:30 name width
114+14:35 tight glyph +
115+14:36 tight glyph [
116+14:37 tight lit %fill
117+14:43 glyph (
118+14:44 tight glyph (
119+14:45 tight name number-id
120+14:55 lit 1
121+14:56 tight glyph )
122+14:57 tight glyph )
123+14:58 tight glyph ]
12412415:1 NEWLINE
12512515:1 glyph ++
12612615:4 name cast-call
12712715:14 glyph ^-
128−15:17 name attr
129−15:22 name width
130−15:27 tight glyph +
131−15:28 tight glyph [
132−15:29 tight lit %fill
133−15:35 glyph (
134−15:36 tight glyph ^-
135−15:39 aura @ud
136−15:43 glyph (
137−15:44 tight name number-id
138−15:54 lit 1
139−15:55 tight glyph )
140−15:56 tight glyph )
141−15:57 tight glyph ]
128+15:17 name attribute
129+15:27 name width
130+15:32 tight glyph +
131+15:33 tight glyph [
132+15:34 tight lit %fill
133+15:40 glyph (
134+15:41 tight glyph ^-
135+15:44 aura @ud
136+15:48 glyph (
137+15:49 tight name number-id
138+15:59 lit 1
139+15:60 tight glyph )
140+15:61 tight glyph )
141+15:62 tight glyph ]
14214216:1 NEWLINE
14314316:1 glyph ++
14414416:4 name nested-call
14514516:16 glyph ^-
146−16:19 name attr
147−16:24 name width
148−16:29 tight glyph +
149−16:30 tight glyph [
150−16:31 tight lit %fill
151−16:37 glyph (
152−16:38 tight name number-id
153−16:48 glyph (
154−16:49 tight name number-id
155−16:59 lit 1
156−16:60 tight glyph )
157−16:61 tight glyph )
158−16:62 tight glyph ]
146+16:19 name attribute
147+16:29 name width
148+16:34 tight glyph +
149+16:35 tight glyph [
150+16:36 tight lit %fill
151+16:42 glyph (
152+16:43 tight name number-id
153+16:53 glyph (
154+16:54 tight name number-id
155+16:64 lit 1
156+16:65 tight glyph )
157+16:66 tight glyph )
158+16:67 tight glyph ]
15915917:1 NEWLINE
16016017:1 glyph ++
16116117:4 name bad-tag
16216217:12 glyph ^-
163−17:15 name attr
164−17:20 name width
165−17:25 tight glyph +
166−17:26 tight glyph [
167−17:27 tight lit %missing
168−17:36 lit 1
169−17:37 tight glyph ]
163+17:15 name attribute
164+17:25 name width
165+17:30 tight glyph +
166+17:31 tight glyph [
167+17:32 tight lit %missing
168+17:41 lit 1
169+17:42 tight glyph ]
17017018:1 NEWLINE
17117118:1 glyph ++
17217218:4 name bad-number
17317318:15 glyph ^-
174−18:18 name attr
175−18:23 name width
176−18:28 tight glyph +
177−18:29 tight glyph [
178−18:30 tight lit %fill
179−18:36 str "bad"
180−18:41 tight glyph ]
174+18:18 name attribute
175+18:28 name width
176+18:33 tight glyph +
177+18:34 tight glyph [
178+18:35 tight lit %fill
179+18:41 str "bad"
180+18:46 tight glyph ]
18118119:1 NEWLINE
18218219:1 glyph ++
18318319:4 name pending
@@ -186,26 +186,26 @@
18618620:6 lit %unrelated
18718721:5 INDENT
18818821:5 glyph ^-
189−21:8 name attr
190−21:13 name width
191−21:18 tight glyph +
192−21:19 tight glyph [
193−21:20 tight lit %fill
194−21:26 glyph (
195−21:27 tight name number-id
196−21:37 lit 1
197−21:38 tight glyph )
198−21:39 tight glyph ]
189+21:8 name attribute
190+21:18 name width
191+21:23 tight glyph +
192+21:24 tight glyph [
193+21:25 tight lit %fill
194+21:31 glyph (
195+21:32 tight name number-id
196+21:42 lit 1
197+21:43 tight glyph )
198+21:44 tight glyph ]
19919922:1 DEDENT
20020022:1 DEDENT
20120122:1 NEWLINE
20220222:1 glyph ++
20320322:4 name singleton
20420422:14 glyph ^-
205−22:17 name attr
206−22:22 name width
207−22:27 tight glyph +
208−22:28 tight lit %shrink
205+22:17 name attribute
206+22:27 name width
207+22:32 tight glyph +
208+22:33 tight lit %shrink
20920923:1 NEWLINE
21021023:1 glyph +$
21121123:4 name event
tests/golden/types-nested-shallow-preserve/tree.txt+61−61
@@ -1,13 +1,13 @@
11(module
2− (mold 1:1 length
2+ (mold 1:1 extent
33 (union 2:3
44 (cell 2:3
55 (const 2:4 %fill)
66 (face 2:10 n (aura 2:12 @ud)))
77 (const 3:3 %shrink)))
8− (mold 4:1 attr
8+ (mold 4:1 attribute
99 (union 5:3
10− (cell 5:3 (const 5:4 %width) (ref 5:11 length))
10+ (cell 5:3 (const 5:4 %width) (ref 5:11 extent))
1111 (cell 6:3 (const 6:4 %gap) (aura 6:9 @tas))))
1212 (value 7:1 number-id
1313 (gate 7:14
@@ -15,25 +15,25 @@
1515 (wing 7:23 x)))
1616 (value 8:1 plain
1717 (cast 8:10
18− (ref 8:13 attr)
19− (pair 8:18 width
20− (tuple 8:24 (lit 8:25 %fill) (lit 8:31 1)))))
18+ (ref 8:13 attribute)
19+ (pair 8:23 width
20+ (tuple 8:29 (lit 8:30 %fill) (lit 8:36 1)))))
2121 (value 9:1 direct
2222 (cast 9:11
23− (ref 9:14 attr)
24− (tuple 9:19
25− (lit 9:20 %width)
26− (tuple 9:27 (lit 9:28 %fill) (lit 9:34 1)))))
23+ (ref 9:14 attribute)
24+ (tuple 9:24
25+ (lit 9:25 %width)
26+ (tuple 9:32 (lit 9:33 %fill) (lit 9:39 1)))))
2727 (value 10:1 list
2828 (cast 10:9
29− (apply 10:12 list (ref 10:18 attr))
30− (list 10:24
31− (pair 10:26 width
32− (tuple 10:32 (lit 10:33 %fill) (lit 10:39 1))))))
29+ (apply 10:12 list (ref 10:18 attribute))
30+ (list 10:29
31+ (pair 10:31 width
32+ (tuple 10:37 (lit 10:38 %fill) (lit 10:44 1))))))
3333 (value 11:1 accept
3434 (gate 11:11
35− (face 11:14 value (ref 11:20 attr))
36− (wing 11:25 value)))
35+ (face 11:14 value (ref 11:20 attribute))
36+ (wing 11:30 value)))
3737 (value 12:1 call
3838 (group 12:9
3939 (call 12:10
@@ -42,69 +42,69 @@
4242 (tuple 12:23 (lit 12:24 %fill) (lit 12:30 1))))))
4343 (value 13:1 simple-call
4444 (cast 13:16
45− (ref 13:19 attr)
46− (pair 13:24 width
47− (tuple 13:30
48− (lit 13:31 %fill)
49− (group 13:37
50− (call 13:38 (wing 13:38 number-id) (lit 13:48 1)))))))
45+ (ref 13:19 attribute)
46+ (pair 13:29 width
47+ (tuple 13:35
48+ (lit 13:36 %fill)
49+ (group 13:42
50+ (call 13:43 (wing 13:43 number-id) (lit 13:53 1)))))))
5151 (value 14:1 grouped-call
5252 (cast 14:17
53− (ref 14:20 attr)
54− (pair 14:25 width
55− (tuple 14:31
56− (lit 14:32 %fill)
57− (group 14:38
58− (group 14:39
59− (call 14:40 (wing 14:40 number-id) (lit 14:50 1))))))))
53+ (ref 14:20 attribute)
54+ (pair 14:30 width
55+ (tuple 14:36
56+ (lit 14:37 %fill)
57+ (group 14:43
58+ (group 14:44
59+ (call 14:45 (wing 14:45 number-id) (lit 14:55 1))))))))
6060 (value 15:1 cast-call
6161 (cast 15:14
62− (ref 15:17 attr)
63− (pair 15:22 width
64− (tuple 15:28
65− (lit 15:29 %fill)
66− (group 15:35
67− (cast 15:36
68− (aura 15:39 @ud)
69− (group 15:43
70− (call 15:44 (wing 15:44 number-id) (lit 15:54 1)))))))))
62+ (ref 15:17 attribute)
63+ (pair 15:27 width
64+ (tuple 15:33
65+ (lit 15:34 %fill)
66+ (group 15:40
67+ (cast 15:41
68+ (aura 15:44 @ud)
69+ (group 15:48
70+ (call 15:49 (wing 15:49 number-id) (lit 15:59 1)))))))))
7171 (value 16:1 nested-call
7272 (cast 16:16
73− (ref 16:19 attr)
74− (pair 16:24 width
75− (tuple 16:30
76− (lit 16:31 %fill)
77− (group 16:37
78− (call 16:38
79− (wing 16:38 number-id)
80− (group 16:48
81− (call 16:49 (wing 16:49 number-id) (lit 16:59 1)))))))))
73+ (ref 16:19 attribute)
74+ (pair 16:29 width
75+ (tuple 16:35
76+ (lit 16:36 %fill)
77+ (group 16:42
78+ (call 16:43
79+ (wing 16:43 number-id)
80+ (group 16:53
81+ (call 16:54 (wing 16:54 number-id) (lit 16:64 1)))))))))
8282 (value 17:1 bad-tag
8383 (cast 17:12
84− (ref 17:15 attr)
85− (pair 17:20 width
86− (tuple 17:26 (lit 17:27 %missing) (lit 17:36 1)))))
84+ (ref 17:15 attribute)
85+ (pair 17:25 width
86+ (tuple 17:31 (lit 17:32 %missing) (lit 17:41 1)))))
8787 (value 18:1 bad-number
8888 (cast 18:15
89− (ref 18:18 attr)
90− (pair 18:23 width
91− (tuple 18:29 (lit 18:30 %fill) (str 18:36 "bad")))))
89+ (ref 18:18 attribute)
90+ (pair 18:28 width
91+ (tuple 18:34 (lit 18:35 %fill) (str 18:41 "bad")))))
9292 (value 19:1 pending
9393 (body 20:3
9494 (trace 20:3
9595 (lit 20:6 %unrelated)
9696 (body 21:5
9797 (cast 21:5
98− (ref 21:8 attr)
99− (pair 21:13 width
100− (tuple 21:19
101− (lit 21:20 %fill)
102− (group 21:26
103− (call 21:27 (wing 21:27 number-id) (lit 21:37 1))))))))))
98+ (ref 21:8 attribute)
99+ (pair 21:18 width
100+ (tuple 21:24
101+ (lit 21:25 %fill)
102+ (group 21:31
103+ (call 21:32 (wing 21:32 number-id) (lit 21:42 1))))))))))
104104 (value 22:1 singleton
105105 (cast 22:14
106− (ref 22:17 attr)
107− (pair 22:22 width (lit 22:28 %shrink))))
106+ (ref 22:17 attribute)
107+ (pair 22:27 width (lit 22:33 %shrink))))
108108 (mold 23:1 event
109109 (union 24:3
110110 (cell 24:3
tests/golden/types-nested-shallow-preserve/types.txt+20−20
@@ -1,32 +1,32 @@
11partial inference; module not checked
2−+$ length: cases proven disjoint; mold not checked
3−+$ attr: cases proven disjoint; mold not checked
2++$ extent: cases proven disjoint; mold not checked
3++$ attribute: cases proven disjoint; mold not checked
44++ number-id: $-(@ud @ud)
5−++ plain: attr
6−++ direct: attr
7−++ list: (list attr)
8−++ accept: $-(attr attr)
9−++ call: attr
10−++ simple-call: attr
11−++ grouped-call: attr
12−++ cast-call: attr
13−++ nested-call: attr
5+++ plain: attribute
6+++ direct: attribute
7+++ list: (list attribute)
8+++ accept: $-(attribute attribute)
9+++ call: attribute
10+++ simple-call: attribute
11+++ grouped-call: attribute
12+++ cast-call: attribute
13+++ nested-call: attribute
1414++ bad-tag: cast mold and expression type do not unify
1515/tests/golden/types-nested-shallow-preserve/source.jibb:17:15: cast mold
16−++ bad-tag ^- attr width+[%missing 1]
16+++ bad-tag ^- attribute width+[%missing 1]
1717 ^
18−/tests/golden/types-nested-shallow-preserve/source.jibb:17:20: expression
19−++ bad-tag ^- attr width+[%missing 1]
20− ^
18+/tests/golden/types-nested-shallow-preserve/source.jibb:17:25: expression
19+++ bad-tag ^- attribute width+[%missing 1]
20+ ^
2121++ bad-number: cast mold and expression type do not unify
2222/tests/golden/types-nested-shallow-preserve/source.jibb:18:18: cast mold
23−++ bad-number ^- attr width+[%fill "bad"]
23+++ bad-number ^- attribute width+[%fill "bad"]
2424 ^
25−/tests/golden/types-nested-shallow-preserve/source.jibb:18:23: expression
26−++ bad-number ^- attr width+[%fill "bad"]
27− ^
25+/tests/golden/types-nested-shallow-preserve/source.jibb:18:28: expression
26+++ bad-number ^- attribute width+[%fill "bad"]
27+ ^
2828++ pending: tag needs context in partial inference
29−++ singleton: attr
29+++ singleton: attribute
3030+$ event: cases proven disjoint; mold not checked
3131+$ envelope: cases proven disjoint; mold not checked
3232++ constructor: envelope
tests/golden/types-pair-context/source.jibb+14−14
@@ -3,30 +3,30 @@
33 %s1
44 %s2
55 %s3
6−+$ length
6++$ extent
77 [%fill n=@ud]
88 %shrink
9−+$ attr
9++$ attribute
1010 [%gap spacing]
1111 [%pad spacing]
12− [%width length]
13−+$ other-attr
12+ [%width extent]
13++$ other-attribute
1414 [%gap spacing]
1515 [%pad spacing]
16− [%width length]
17−++ one ^- attr gap+%s2
18−++ equiv ^- attr [%gap %s2]
19−++ attrs ^- (list attr) ~[gap+%s2 pad+%s3 width+[%fill 1]]
16+ [%width extent]
17+++ one ^- attribute gap+%s2
18+++ equiv ^- attribute [%gap %s2]
19+++ attributes ^- (list attribute) ~[gap+%s2 pad+%s3 width+[%fill 1]]
2020++ gap-structural ^- [@tas @tas] gap+%s2
21−++ nested ^- attr width+[%fill 1]
22−++ mismatch ^- attr gap+%shrink
23−++ missing ^- attr width+[%oops 1]
21+++ nested ^- attribute width+[%fill 1]
22+++ mismatch ^- attribute gap+%shrink
23+++ missing ^- attribute width+[%oops 1]
2424++ pending gap+%s2
25−++ cross-origin ^- attr ^- other-attr gap+%s2
25+++ cross-origin ^- attribute ^- other-attribute gap+%s2
2626++ noun-pair ^- [* *] gap+%s2
2727++ atom-pair ^- [@ta @tas] gap+%s2
2828++ wrong-head ^- [@ud @tas] gap+%s2
29−++ wrong-number ^- attr width+[%fill "hi"]
29+++ wrong-number ^- attribute width+[%fill "hi"]
3030++ unrelated
3131 ~& %dangling
32− ^- attr gap+%s2
32+ ^- attribute gap+%s2
tests/golden/types-pair-context/tokens.txt+71−71
@@ -11,7 +11,7 @@
11116:1 DEDENT
12126:1 NEWLINE
13136:1 glyph +$
14−6:4 name length
14+6:4 name extent
15157:3 INDENT
16167:3 glyph [
17177:4 tight lit %fill
@@ -24,7 +24,7 @@
24249:1 DEDENT
25259:1 NEWLINE
26269:1 glyph +$
27−9:4 name attr
27+9:4 name attribute
282810:3 INDENT
292910:3 glyph [
303010:4 tight lit %gap
@@ -38,12 +38,12 @@
383812:3 NEWLINE
393912:3 glyph [
404012:4 tight lit %width
41−12:11 name length
41+12:11 name extent
424212:17 tight glyph ]
434313:1 DEDENT
444413:1 NEWLINE
454513:1 glyph +$
46−13:4 name other-attr
46+13:4 name other-attribute
474714:3 INDENT
484814:3 glyph [
494914:4 tight lit %gap
@@ -57,48 +57,48 @@
575716:3 NEWLINE
585816:3 glyph [
595916:4 tight lit %width
60−16:11 name length
60+16:11 name extent
616116:17 tight glyph ]
626217:1 DEDENT
636317:1 NEWLINE
646417:1 glyph ++
656517:4 name one
666617:8 glyph ^-
67−17:11 name attr
68−17:16 name gap
69−17:19 tight glyph +
70−17:20 tight lit %s2
67+17:11 name attribute
68+17:21 name gap
69+17:24 tight glyph +
70+17:25 tight lit %s2
717118:1 NEWLINE
727218:1 glyph ++
737318:4 name equiv
747418:10 glyph ^-
75−18:13 name attr
76−18:18 glyph [
77−18:19 tight lit %gap
78−18:24 lit %s2
79−18:27 tight glyph ]
75+18:13 name attribute
76+18:23 glyph [
77+18:24 tight lit %gap
78+18:29 lit %s2
79+18:32 tight glyph ]
808019:1 NEWLINE
818119:1 glyph ++
82−19:4 name attrs
83−19:10 glyph ^-
84−19:13 glyph (
85−19:14 tight name list
86−19:19 name attr
87−19:23 tight glyph )
88−19:25 glyph ~[
89−19:27 tight name gap
90−19:30 tight glyph +
91−19:31 tight lit %s2
92−19:35 name pad
93−19:38 tight glyph +
94−19:39 tight lit %s3
95−19:43 name width
82+19:4 name attributes
83+19:15 glyph ^-
84+19:18 glyph (
85+19:19 tight name list
86+19:24 name attribute
87+19:33 tight glyph )
88+19:35 glyph ~[
89+19:37 tight name gap
90+19:40 tight glyph +
91+19:41 tight lit %s2
92+19:45 name pad
969319:48 tight glyph +
97−19:49 tight glyph [
98−19:50 tight lit %fill
99−19:56 lit 1
100−19:57 tight glyph ]
101−19:58 tight glyph ]
94+19:49 tight lit %s3
95+19:53 name width
96+19:58 tight glyph +
97+19:59 tight glyph [
98+19:60 tight lit %fill
99+19:66 lit 1
100+19:67 tight glyph ]
101+19:68 tight glyph ]
10210220:1 NEWLINE
10310320:1 glyph ++
10410420:4 name gap-structural
@@ -114,32 +114,32 @@
11411421:1 glyph ++
11511521:4 name nested
11611621:11 glyph ^-
117−21:14 name attr
118−21:19 name width
119−21:24 tight glyph +
120−21:25 tight glyph [
121−21:26 tight lit %fill
122−21:32 lit 1
123−21:33 tight glyph ]
117+21:14 name attribute
118+21:24 name width
119+21:29 tight glyph +
120+21:30 tight glyph [
121+21:31 tight lit %fill
122+21:37 lit 1
123+21:38 tight glyph ]
12412422:1 NEWLINE
12512522:1 glyph ++
12612622:4 name mismatch
12712722:13 glyph ^-
128−22:16 name attr
129−22:21 name gap
130−22:24 tight glyph +
131−22:25 tight lit %shrink
128+22:16 name attribute
129+22:26 name gap
130+22:29 tight glyph +
131+22:30 tight lit %shrink
13213223:1 NEWLINE
13313323:1 glyph ++
13413423:4 name missing
13513523:12 glyph ^-
136−23:15 name attr
137−23:20 name width
138−23:25 tight glyph +
139−23:26 tight glyph [
140−23:27 tight lit %oops
141−23:33 lit 1
142−23:34 tight glyph ]
136+23:15 name attribute
137+23:25 name width
138+23:30 tight glyph +
139+23:31 tight glyph [
140+23:32 tight lit %oops
141+23:38 lit 1
142+23:39 tight glyph ]
14314324:1 NEWLINE
14414424:1 glyph ++
14514524:4 name pending
@@ -150,12 +150,12 @@
15015025:1 glyph ++
15115125:4 name cross-origin
15215225:17 glyph ^-
153−25:20 name attr
154−25:25 glyph ^-
155−25:28 name other-attr
156−25:39 name gap
157−25:42 tight glyph +
158−25:43 tight lit %s2
153+25:20 name attribute
154+25:30 glyph ^-
155+25:33 name other-attribute
156+25:49 name gap
157+25:52 tight glyph +
158+25:53 tight lit %s2
15915926:1 NEWLINE
16016026:1 glyph ++
16116126:4 name noun-pair
@@ -193,13 +193,13 @@
19319329:1 glyph ++
19419429:4 name wrong-number
19519529:17 glyph ^-
196−29:20 name attr
197−29:25 name width
198−29:30 tight glyph +
199−29:31 tight glyph [
200−29:32 tight lit %fill
201−29:38 str "hi"
202−29:42 tight glyph ]
196+29:20 name attribute
197+29:30 name width
198+29:35 tight glyph +
199+29:36 tight glyph [
200+29:37 tight lit %fill
201+29:43 str "hi"
202+29:47 tight glyph ]
20320330:1 NEWLINE
20420430:1 glyph ++
20520530:4 name unrelated
@@ -208,10 +208,10 @@
20820831:6 lit %dangling
20920932:5 INDENT
21021032:5 glyph ^-
211−32:8 name attr
212−32:13 name gap
213−32:16 tight glyph +
214−32:17 tight lit %s2
215−32:20 DEDENT
216−32:20 DEDENT
217−32:20 NEWLINE
211+32:8 name attribute
212+32:18 name gap
213+32:21 tight glyph +
214+32:22 tight lit %s2
215+32:25 DEDENT
216+32:25 DEDENT
217+32:25 NEWLINE
tests/golden/types-pair-context/tree.txt+34−34
@@ -1,64 +1,64 @@
11(module
22 (mold 1:1 spacing
33 (union 2:3 (const 2:3 %s0) (const 3:3 %s1) (const 4:3 %s2) (const 5:3 %s3)))
4− (mold 6:1 length
4+ (mold 6:1 extent
55 (union 7:3
66 (cell 7:3
77 (const 7:4 %fill)
88 (face 7:10 n (aura 7:12 @ud)))
99 (const 8:3 %shrink)))
10− (mold 9:1 attr
10+ (mold 9:1 attribute
1111 (union 10:3
1212 (cell 10:3 (const 10:4 %gap) (ref 10:9 spacing))
1313 (cell 11:3 (const 11:4 %pad) (ref 11:9 spacing))
14− (cell 12:3 (const 12:4 %width) (ref 12:11 length))))
15− (mold 13:1 other-attr
14+ (cell 12:3 (const 12:4 %width) (ref 12:11 extent))))
15+ (mold 13:1 other-attribute
1616 (union 14:3
1717 (cell 14:3 (const 14:4 %gap) (ref 14:9 spacing))
1818 (cell 15:3 (const 15:4 %pad) (ref 15:9 spacing))
19− (cell 16:3 (const 16:4 %width) (ref 16:11 length))))
19+ (cell 16:3 (const 16:4 %width) (ref 16:11 extent))))
2020 (value 17:1 one
2121 (cast 17:8
22− (ref 17:11 attr)
23− (pair 17:16 gap (lit 17:20 %s2))))
22+ (ref 17:11 attribute)
23+ (pair 17:21 gap (lit 17:25 %s2))))
2424 (value 18:1 equiv
2525 (cast 18:10
26− (ref 18:13 attr)
27− (tuple 18:18 (lit 18:19 %gap) (lit 18:24 %s2))))
28− (value 19:1 attrs
29− (cast 19:10
30− (apply 19:13 list (ref 19:19 attr))
31− (list 19:25
32− (pair 19:27 gap (lit 19:31 %s2))
33− (pair 19:35 pad (lit 19:39 %s3))
34− (pair 19:43 width
35− (tuple 19:49 (lit 19:50 %fill) (lit 19:56 1))))))
26+ (ref 18:13 attribute)
27+ (tuple 18:23 (lit 18:24 %gap) (lit 18:29 %s2))))
28+ (value 19:1 attributes
29+ (cast 19:15
30+ (apply 19:18 list (ref 19:24 attribute))
31+ (list 19:35
32+ (pair 19:37 gap (lit 19:41 %s2))
33+ (pair 19:45 pad (lit 19:49 %s3))
34+ (pair 19:53 width
35+ (tuple 19:59 (lit 19:60 %fill) (lit 19:66 1))))))
3636 (value 20:1 gap-structural
3737 (cast 20:19
3838 (cell 20:22 (aura 20:23 @tas) (aura 20:28 @tas))
3939 (pair 20:34 gap (lit 20:38 %s2))))
4040 (value 21:1 nested
4141 (cast 21:11
42− (ref 21:14 attr)
43− (pair 21:19 width
44− (tuple 21:25 (lit 21:26 %fill) (lit 21:32 1)))))
42+ (ref 21:14 attribute)
43+ (pair 21:24 width
44+ (tuple 21:30 (lit 21:31 %fill) (lit 21:37 1)))))
4545 (value 22:1 mismatch
4646 (cast 22:13
47− (ref 22:16 attr)
48− (pair 22:21 gap (lit 22:25 %shrink))))
47+ (ref 22:16 attribute)
48+ (pair 22:26 gap (lit 22:30 %shrink))))
4949 (value 23:1 missing
5050 (cast 23:12
51− (ref 23:15 attr)
52− (pair 23:20 width
53− (tuple 23:26 (lit 23:27 %oops) (lit 23:33 1)))))
51+ (ref 23:15 attribute)
52+ (pair 23:25 width
53+ (tuple 23:31 (lit 23:32 %oops) (lit 23:38 1)))))
5454 (value 24:1 pending
5555 (pair 24:12 gap (lit 24:16 %s2)))
5656 (value 25:1 cross-origin
5757 (cast 25:17
58− (ref 25:20 attr)
59− (cast 25:25
60− (ref 25:28 other-attr)
61− (pair 25:39 gap (lit 25:43 %s2)))))
58+ (ref 25:20 attribute)
59+ (cast 25:30
60+ (ref 25:33 other-attribute)
61+ (pair 25:49 gap (lit 25:53 %s2)))))
6262 (value 26:1 noun-pair
6363 (cast 26:14
6464 (cell 26:17 (noun 26:18) (noun 26:20))
@@ -73,14 +73,14 @@
7373 (pair 28:29 gap (lit 28:33 %s2))))
7474 (value 29:1 wrong-number
7575 (cast 29:17
76− (ref 29:20 attr)
77− (pair 29:25 width
78− (tuple 29:31 (lit 29:32 %fill) (str 29:38 "hi")))))
76+ (ref 29:20 attribute)
77+ (pair 29:30 width
78+ (tuple 29:36 (lit 29:37 %fill) (str 29:43 "hi")))))
7979 (value 30:1 unrelated
8080 (body 31:3
8181 (trace 31:3
8282 (lit 31:6 %dangling)
8383 (body 32:5
8484 (cast 32:5
85− (ref 32:8 attr)
86− (pair 32:13 gap (lit 32:17 %s2))))))))
85+ (ref 32:8 attribute)
86+ (pair 32:18 gap (lit 32:22 %s2))))))))
tests/golden/types-pair-context/types.txt+19−19
@@ -1,27 +1,27 @@
11partial inference; module not checked
22+$ spacing: cases proven disjoint; mold not checked
3−+$ length: cases proven disjoint; mold not checked
4−+$ attr: cases proven disjoint; mold not checked
5−+$ other-attr: cases proven disjoint; mold not checked
6−++ one: attr
7−++ equiv: attr
8−++ attrs: (list attr)
3++$ extent: cases proven disjoint; mold not checked
4++$ attribute: cases proven disjoint; mold not checked
5++$ other-attribute: cases proven disjoint; mold not checked
6+++ one: attribute
7+++ equiv: attribute
8+++ attributes: (list attribute)
99++ gap-structural: [@tas @tas]
10−++ nested: attr
10+++ nested: attribute
1111++ mismatch: cast mold and expression type do not unify
1212/tests/golden/types-pair-context/source.jibb:22:16: cast mold
13−++ mismatch ^- attr gap+%shrink
13+++ mismatch ^- attribute gap+%shrink
1414 ^
15−/tests/golden/types-pair-context/source.jibb:22:21: expression
16−++ mismatch ^- attr gap+%shrink
17− ^
15+/tests/golden/types-pair-context/source.jibb:22:26: expression
16+++ mismatch ^- attribute gap+%shrink
17+ ^
1818++ missing: cast mold and expression type do not unify
1919/tests/golden/types-pair-context/source.jibb:23:15: cast mold
20−++ missing ^- attr width+[%oops 1]
20+++ missing ^- attribute width+[%oops 1]
2121 ^
22−/tests/golden/types-pair-context/source.jibb:23:20: expression
23−++ missing ^- attr width+[%oops 1]
24− ^
22+/tests/golden/types-pair-context/source.jibb:23:25: expression
23+++ missing ^- attribute width+[%oops 1]
24+ ^
2525++ pending: tag needs context in partial inference
2626++ cross-origin: cast constraint is not supported by partial inference
2727++ noun-pair: [* *]
@@ -35,9 +35,9 @@ partial inference; module not checked
3535 ^
3636++ wrong-number: cast mold and expression type do not unify
3737/tests/golden/types-pair-context/source.jibb:29:20: cast mold
38−++ wrong-number ^- attr width+[%fill "hi"]
38+++ wrong-number ^- attribute width+[%fill "hi"]
3939 ^
40−/tests/golden/types-pair-context/source.jibb:29:25: expression
41−++ wrong-number ^- attr width+[%fill "hi"]
42− ^
40+/tests/golden/types-pair-context/source.jibb:29:30: expression
41+++ wrong-number ^- attribute width+[%fill "hi"]
42+ ^
4343++ unrelated: tag needs context in partial inference
tests/golden/types-partial-aura-family/source.jibb+1−1
@@ -1,7 +1,7 @@
11++ decimal |= x=@ud ^- @u x
22++ hex ^- @u 0x1f
33++ base32 |= x=@uv ^- @u x
4−++ text |= x=@tD ^- @t x
4+++ text-value |= x=@tD ^- @t x
55++ narrow |= x=@t ^- @tD x
66++ siblings |= x=@ux ^- @ud x
77++ dup |= p=[A A] p
tests/golden/types-partial-aura-family/tokens.txt+8−8
@@ -25,14 +25,14 @@
25253:26 name x
26264:1 NEWLINE
27274:1 glyph ++
28−4:4 name text
29−4:9 glyph |=
30−4:12 name x
31−4:13 tight glyph =
32−4:14 tight aura @tD
33−4:18 glyph ^-
34−4:21 aura @t
35−4:24 name x
28+4:4 name text-value
29+4:15 glyph |=
30+4:18 name x
31+4:19 tight glyph =
32+4:20 tight aura @tD
33+4:24 glyph ^-
34+4:27 aura @t
35+4:30 name x
36365:1 NEWLINE
37375:1 glyph ++
38385:4 name narrow
tests/golden/types-partial-aura-family/tree.txt+4−4
@@ -9,10 +9,10 @@
99 (gate 3:11
1010 (face 3:14 x (aura 3:16 @uv))
1111 (cast 3:20 (aura 3:23 @u) (wing 3:26 x))))
12− (value 4:1 text
13− (gate 4:9
14− (face 4:12 x (aura 4:14 @tD))
15− (cast 4:18 (aura 4:21 @t) (wing 4:24 x))))
12+ (value 4:1 text-value
13+ (gate 4:15
14+ (face 4:18 x (aura 4:20 @tD))
15+ (cast 4:24 (aura 4:27 @t) (wing 4:30 x))))
1616 (value 5:1 narrow
1717 (gate 5:11
1818 (face 5:14 x (aura 5:16 @t))
tests/golden/types-partial-aura-family/types.txt+1−1
@@ -2,7 +2,7 @@ partial inference; module not checked
22++ decimal: $-(@ud @u)
33++ hex: @u
44++ base32: $-(@uv @u)
5−++ text: $-(@tD @t)
5+++ text-value: $-(@tD @t)
66++ narrow: cast mold and expression type do not unify
77/tests/golden/types-partial-aura-family/source.jibb:5:22: cast mold has type @tD
88++ narrow |= x=@t ^- @tD x
tests/golden/types-partial-locals/source.jibb+2−2
@@ -32,9 +32,9 @@
3232++ local-mold |= x
3333 +$ item @t
3434 x
35−++ wrap |= y |=(z y)
35+++ wrap-value |= y |=(z y)
3636++ through-global |= x
37− ++ local (wrap x)
37+ ++ local (wrap-value x)
3838 ~& ^- @t (local ~zod)
3939 ^- @p (local "hi")
4040++ nested-shadow |= x
tests/golden/types-partial-locals/tokens.txt+10−10
@@ -180,13 +180,13 @@
18018035:1 DEDENT
18118135:1 NEWLINE
18218235:1 glyph ++
183−35:4 name wrap
184−35:9 glyph |=
185−35:12 name y
186−35:14 glyph |=(
187−35:17 tight name z
188−35:19 name y
189−35:20 tight glyph )
183+35:4 name wrap-value
184+35:15 glyph |=
185+35:18 name y
186+35:20 glyph |=(
187+35:23 tight name z
188+35:25 name y
189+35:26 tight glyph )
19019036:1 NEWLINE
19119136:1 glyph ++
19219236:4 name through-global
@@ -196,9 +196,9 @@
19619637:3 glyph ++
19719737:6 name local
19819837:12 glyph (
199−37:13 tight name wrap
200−37:18 name x
201−37:19 tight glyph )
199+37:13 tight name wrap-value
200+37:24 name x
201+37:25 tight glyph )
20220238:3 NEWLINE
20320338:3 glyph ~&
20420438:6 glyph ^-
tests/golden/types-partial-locals/tree.txt+5−5
@@ -88,17 +88,17 @@
8888 (body 33:3
8989 (mold 33:3 item (aura 33:11 @t))
9090 (wing 34:3 x))))
91− (value 35:1 wrap
92− (gate 35:9
93− (bind 35:12 y)
94− (gate-wide 35:14 (bind 35:17 z) (wing 35:19 y))))
91+ (value 35:1 wrap-value
92+ (gate 35:15
93+ (bind 35:18 y)
94+ (gate-wide 35:20 (bind 35:23 z) (wing 35:25 y))))
9595 (value 36:1 through-global
9696 (gate 36:19
9797 (bind 36:22 x)
9898 (body 37:3
9999 (value 37:3 local
100100 (group 37:12
101− (call 37:13 (wing 37:13 wrap) (wing 37:18 x))))
101+ (call 37:13 (wing 37:13 wrap-value) (wing 37:24 x))))
102102 (trace 38:3
103103 (cast 38:6
104104 (aura 38:9 @t)
tests/golden/types-partial-locals/types.txt+1−1
@@ -21,7 +21,7 @@ partial inference; module not checked
2121 ^
2222++ unused-bad: local definitions need unsupported inference
2323++ local-mold: $-(A A)
24−++ wrap: $-(A $-(B A))
24+++ wrap-value: $-(A $-(B A))
2525++ through-global: cast mold and expression type do not unify
2626/tests/golden/types-partial-locals/source.jibb:39:8: cast mold has type @p
2727 ^- @p (local "hi")
tests/golden/types-prelude-ask/about.txt+1−1
@@ -1,4 +1,4 @@
1−source: docs/spec/overview.md, Effects: "`poke`, `ask` and `qath` are transparent types defined in the internal prelude and re-exported normally. Derived gates and `pure` also construct requests."
1+source: docs/spec/overview.md, Effects: "`raw-poke`, `ask` and `qath` are transparent types defined in the internal prelude and re-exported normally. Derived gates and `pure` also construct requests."
22tests: Source-backed pure values at independent and generic types, agent and store constructors, missing and exhaustive union branches, prior unit state, path identity, numeric defaulting and pending constraints. Receiver mismatches and unimplemented contexts remain unsupported; no runtime or watch validation is claimed.
33expect: parses
44expect-types: a partial inference report
tests/golden/types-prelude-ask/source.jibb+1−1
@@ -40,7 +40,7 @@
4040++ ordinary-path ^- path ~[~.items]
4141++ ask-from-ordinary (agent ordinary-path |=(v=[mark=@tas state=(unit *) fact=*] [state=0 message="ok"]))
4242++ ask-from-qath (agent %/items |=(v=[mark=@tas state=(unit *) fact=*] [state=0 message="ok"]))
43−++ store |= rec=$-([state=(unit *) fact=*] [state=* message=@t])
43+++ store-ask |= rec=$-([state=(unit *) fact=*] [state=* message=@t])
4444 ^- (ask @t) [%store module="/ui/store/cart" name=%state receive=rec]
4545++ wrong-store |= rec=$-([state=(unit *) fact=*] [state=* message=@p])
4646 ^- (ask @t) [%store module="/ui/store/cart" name=%state receive=rec]
tests/golden/types-prelude-ask/tokens.txt+25−25
@@ -639,31 +639,31 @@
63963942:95 tight glyph )
64064043:1 NEWLINE
64164143:1 glyph ++
642−43:4 name store
643−43:10 glyph |=
644−43:13 name rec
645−43:16 tight glyph =
646−43:17 tight glyph $-(
647−43:20 tight glyph [
648−43:21 tight name state
649−43:26 tight glyph =
650−43:27 tight glyph (
651−43:28 tight name unit
652−43:33 glyph *
653−43:34 tight glyph )
654−43:36 name fact
655−43:40 tight glyph =
656−43:41 tight glyph *
657−43:42 tight glyph ]
658−43:44 glyph [
659−43:45 tight name state
660−43:50 tight glyph =
661−43:51 tight glyph *
662−43:53 name message
663−43:60 tight glyph =
664−43:61 tight aura @t
665−43:63 tight glyph ]
666−43:64 tight glyph )
642+43:4 name store-ask
643+43:14 glyph |=
644+43:17 name rec
645+43:20 tight glyph =
646+43:21 tight glyph $-(
647+43:24 tight glyph [
648+43:25 tight name state
649+43:30 tight glyph =
650+43:31 tight glyph (
651+43:32 tight name unit
652+43:37 glyph *
653+43:38 tight glyph )
654+43:40 name fact
655+43:44 tight glyph =
656+43:45 tight glyph *
657+43:46 tight glyph ]
658+43:48 glyph [
659+43:49 tight name state
660+43:54 tight glyph =
661+43:55 tight glyph *
662+43:57 name message
663+43:64 tight glyph =
664+43:65 tight aura @t
665+43:67 tight glyph ]
666+43:68 tight glyph )
66766744:3 INDENT
66866844:3 glyph ^-
66966944:6 glyph (
tests/golden/types-prelude-ask/tree.txt+11−11
@@ -266,17 +266,17 @@
266266 (tuple 42:72
267267 (face 42:73 state (lit 42:79 0))
268268 (face 42:81 message (str 42:89 "ok")))))))
269− (value 43:1 store
270− (gate 43:10
271− (face 43:13 rec
272− (fn 43:17
273− (cell 43:20
274− (face 43:21 state
275− (apply 43:27 unit (noun 43:33)))
276− (face 43:36 fact (noun 43:41)))
277− (cell 43:44
278− (face 43:45 state (noun 43:51))
279− (face 43:53 message (aura 43:61 @t)))))
269+ (value 43:1 store-ask
270+ (gate 43:14
271+ (face 43:17 rec
272+ (fn 43:21
273+ (cell 43:24
274+ (face 43:25 state
275+ (apply 43:31 unit (noun 43:37)))
276+ (face 43:40 fact (noun 43:45)))
277+ (cell 43:48
278+ (face 43:49 state (noun 43:55))
279+ (face 43:57 message (aura 43:65 @t)))))
280280 (body 44:3
281281 (cast 44:3
282282 (apply 44:6 ask (aura 44:11 @t))
tests/golden/types-prelude-ask/types.txt+1−1
@@ -35,7 +35,7 @@ partial inference; module not checked
3535++ ordinary-path: (list @ta)
3636++ ask-from-ordinary: call constraint is not supported by partial inference
3737++ ask-from-qath: call constraint is not supported by partial inference
38−++ store: $-($-([state=(unit *) fact=*] [state=* message=@t]) (ask @t))
38+++ store-ask: $-($-([state=(unit *) fact=*] [state=* message=@t]) (ask @t))
3939++ wrong-store: cast constraint is not supported by partial inference
4040++ incomplete: missing union case [%store [module=@t [name=@tas receive=$-([state=(unit *) fact=*] [state=* message=@t])]]]
4141++ complete: $-((ask @t) @t)
tests/golden/types-prelude-bond/source.jibb+1−1
@@ -1,6 +1,6 @@
11++ choose (bond |=(~ "default"))
22++ missing (choose ~)
33++ present (choose `"found")
4−++ wrap |= fallback=$-(~ A) (bond fallback)
4+++ wrap-value |= fallback=$-(~ A) (bond fallback)
55++ choose-ship (bond |=(~ ~zod))
66++ present-ship (choose-ship `~zod)
tests/golden/types-prelude-bond/tokens.txt+12−12
@@ -24,18 +24,18 @@
24243:28 tight glyph )
25254:1 NEWLINE
26264:1 glyph ++
27−4:4 name wrap
28−4:9 glyph |=
29−4:12 name fallback
30−4:20 tight glyph =
31−4:21 tight glyph $-(
32−4:24 tight lit ~
33−4:26 tvar A
34−4:27 tight glyph )
35−4:29 glyph (
36−4:30 tight name bond
37−4:35 name fallback
38−4:43 tight glyph )
27+4:4 name wrap-value
28+4:15 glyph |=
29+4:18 name fallback
30+4:26 tight glyph =
31+4:27 tight glyph $-(
32+4:30 tight lit ~
33+4:32 tvar A
34+4:33 tight glyph )
35+4:35 glyph (
36+4:36 tight name bond
37+4:41 name fallback
38+4:49 tight glyph )
39395:1 NEWLINE
40405:1 glyph ++
41415:4 name choose-ship
tests/golden/types-prelude-bond/tree.txt+6−6
@@ -12,12 +12,12 @@
1212 (call 3:13
1313 (wing 3:13 choose)
1414 (unit 3:20 (str 3:21 "found")))))
15− (value 4:1 wrap
16− (gate 4:9
17− (face 4:12 fallback
18− (fn 4:21 (const 4:24 ~) (tvar 4:26 A)))
19− (group 4:29
20− (call 4:30 (wing 4:30 bond) (wing 4:35 fallback)))))
15+ (value 4:1 wrap-value
16+ (gate 4:15
17+ (face 4:18 fallback
18+ (fn 4:27 (const 4:30 ~) (tvar 4:32 A)))
19+ (group 4:35
20+ (call 4:36 (wing 4:36 bond) (wing 4:41 fallback)))))
2121 (value 5:1 choose-ship
2222 (group 5:16
2323 (call 5:17
tests/golden/types-prelude-bond/types.txt+1−1
@@ -2,6 +2,6 @@ partial inference; module not checked
22++ choose: $-((unit @t) @t)
33++ missing: @t
44++ present: @t
5−++ wrap: $-($-(~ A) $-((unit A) A))
5+++ wrap-value: $-($-(~ A) $-((unit A) A))
66++ choose-ship: $-((unit @p) @p)
77++ present-ship: @p
tests/golden/types-prelude-cmd/source.jibb+6−6
@@ -3,19 +3,19 @@
33++ nav ^- (cmd @t) [%go url="/home"]
44++ time ^- (cmd @t) [%now reply=|=(d=@da "done")]
55++ bad ^- (cmd @t) [%go url=~zod]
6−++ send |= p=poke
6+++ send |= p=raw-poke
77 ^- (cmd @t) [%poke p |=(r=(unit @t) "done")]
88++ wait ^- (cmd @t) [%wait ~s30 "done"]
99++ who ^- (cmd @t) [%who |=(p=@p "done")]
1010++ wrong-message ^- (cmd @t) [%wait ~s30 ~zod]
11−++ wrap |= x=A ^- (cmd A) [%wait ~s30 x]
12−++ wrap-text (wrap "hello")
13−++ wrap-ship (wrap ~zod)
11+++ wrap-value |= x=A ^- (cmd A) [%wait ~s30 x]
12+++ wrap-value-text (wrap-value "hello")
13+++ wrap-value-ship (wrap-value ~zod)
1414++ wrong-reply ^- (cmd @t) [%who |=(p=@p ~zod)]
1515++ commands ^- (list (cmd @t)) ~[[%go "/home"] [%wait ~s30 "done"]]
1616++ commands-bad ^- (list (cmd @t)) ~[[%go "/home"] [%wait ~s30 ~zod]]
17−++ wrong-poke |= p=poke
17+++ wrong-poke |= p=raw-poke
1818 ^- (cmd @t) [%poke p |=(r=@p "done")]
1919++ wrong-case ^- (cmd @t) %oops
2020++ use-text |= x=(cmd @t) x
21−++ cross (use-text (wrap ~zod))
21+++ cross (use-text (wrap-value ~zod))
tests/golden/types-prelude-cmd/tokens.txt+32−32
@@ -72,7 +72,7 @@
72726:9 glyph |=
73736:12 name p
74746:13 tight glyph =
75−6:14 tight name poke
75+6:14 tight name raw-poke
76767:3 INDENT
77777:3 glyph ^-
78787:6 glyph (
@@ -138,35 +138,35 @@
13813810:46 tight glyph ]
13913911:1 NEWLINE
14014011:1 glyph ++
141−11:4 name wrap
142−11:9 glyph |=
143−11:12 name x
144−11:13 tight glyph =
145−11:14 tight tvar A
146−11:16 glyph ^-
147−11:19 glyph (
148−11:20 tight name cmd
149−11:24 tvar A
150−11:25 tight glyph )
151−11:27 glyph [
152−11:28 tight lit %wait
153−11:34 lit ~s30
154−11:39 name x
155−11:40 tight glyph ]
141+11:4 name wrap-value
142+11:15 glyph |=
143+11:18 name x
144+11:19 tight glyph =
145+11:20 tight tvar A
146+11:22 glyph ^-
147+11:25 glyph (
148+11:26 tight name cmd
149+11:30 tvar A
150+11:31 tight glyph )
151+11:33 glyph [
152+11:34 tight lit %wait
153+11:40 lit ~s30
154+11:45 name x
155+11:46 tight glyph ]
15615612:1 NEWLINE
15715712:1 glyph ++
158−12:4 name wrap-text
159−12:14 glyph (
160−12:15 tight name wrap
161−12:20 str "hello"
162−12:27 tight glyph )
158+12:4 name wrap-value-text
159+12:20 glyph (
160+12:21 tight name wrap-value
161+12:32 str "hello"
162+12:39 tight glyph )
16316313:1 NEWLINE
16416413:1 glyph ++
165−13:4 name wrap-ship
166−13:14 glyph (
167−13:15 tight name wrap
168−13:20 lit ~zod
169−13:24 tight glyph )
165+13:4 name wrap-value-ship
166+13:20 glyph (
167+13:21 tight name wrap-value
168+13:32 lit ~zod
169+13:36 tight glyph )
17017014:1 NEWLINE
17117114:1 glyph ++
17217214:4 name wrong-reply
@@ -234,7 +234,7 @@
23423417:15 glyph |=
23523517:18 name p
23623617:19 tight glyph =
237−17:20 tight name poke
237+17:20 tight name raw-poke
23823818:3 INDENT
23923918:3 glyph ^-
24024018:6 glyph (
@@ -278,8 +278,8 @@
27827821:10 glyph (
27927921:11 tight name use-text
28028021:20 glyph (
281−21:21 tight name wrap
282−21:26 lit ~zod
283−21:30 tight glyph )
284−21:31 tight glyph )
285−21:32 NEWLINE
281+21:21 tight name wrap-value
282+21:32 lit ~zod
283+21:36 tight glyph )
284+21:37 tight glyph )
285+21:38 NEWLINE
tests/golden/types-prelude-cmd/tree.txt+15−15
@@ -32,7 +32,7 @@
3232 (face 5:25 url (lit 5:29 ~zod)))))
3333 (value 6:1 send
3434 (gate 6:9
35− (face 6:12 p (ref 6:14 poke))
35+ (face 6:12 p (ref 6:14 raw-poke))
3636 (body 7:3
3737 (cast 7:3
3838 (apply 7:6 cmd (aura 7:11 @t))
@@ -59,18 +59,18 @@
5959 (cast 10:18
6060 (apply 10:21 cmd (aura 10:26 @t))
6161 (tuple 10:30 (lit 10:31 %wait) (lit 10:37 ~s30) (lit 10:42 ~zod))))
62− (value 11:1 wrap
63− (gate 11:9
64− (face 11:12 x (tvar 11:14 A))
65− (cast 11:16
66− (apply 11:19 cmd (tvar 11:24 A))
67− (tuple 11:27 (lit 11:28 %wait) (lit 11:34 ~s30) (wing 11:39 x)))))
68− (value 12:1 wrap-text
69− (group 12:14
70− (call 12:15 (wing 12:15 wrap) (str 12:20 "hello"))))
71− (value 13:1 wrap-ship
72− (group 13:14
73− (call 13:15 (wing 13:15 wrap) (lit 13:20 ~zod))))
62+ (value 11:1 wrap-value
63+ (gate 11:15
64+ (face 11:18 x (tvar 11:20 A))
65+ (cast 11:22
66+ (apply 11:25 cmd (tvar 11:30 A))
67+ (tuple 11:33 (lit 11:34 %wait) (lit 11:40 ~s30) (wing 11:45 x)))))
68+ (value 12:1 wrap-value-text
69+ (group 12:20
70+ (call 12:21 (wing 12:21 wrap-value) (str 12:32 "hello"))))
71+ (value 13:1 wrap-value-ship
72+ (group 13:20
73+ (call 13:21 (wing 13:21 wrap-value) (lit 13:32 ~zod))))
7474 (value 14:1 wrong-reply
7575 (cast 14:16
7676 (apply 14:19 cmd (aura 14:24 @t))
@@ -95,7 +95,7 @@
9595 (tuple 16:52 (lit 16:53 %wait) (lit 16:59 ~s30) (lit 16:64 ~zod)))))
9696 (value 17:1 wrong-poke
9797 (gate 17:15
98− (face 17:18 p (ref 17:20 poke))
98+ (face 17:18 p (ref 17:20 raw-poke))
9999 (body 18:3
100100 (cast 18:3
101101 (apply 18:6 cmd (aura 18:11 @t))
@@ -119,4 +119,4 @@
119119 (call 21:11
120120 (wing 21:11 use-text)
121121 (group 21:20
122− (call 21:21 (wing 21:21 wrap) (lit 21:26 ~zod)))))))
122+ (call 21:21 (wing 21:21 wrap-value) (lit 21:32 ~zod)))))))
tests/golden/types-prelude-cmd/types.txt+8−8
@@ -10,7 +10,7 @@ partial inference; module not checked
1010/tests/golden/types-prelude-cmd/source.jibb:5:20: expression
1111++ bad ^- (cmd @t) [%go url=~zod]
1212 ^
13−++ send: $-(poke (cmd @t))
13+++ send: $-(raw-poke (cmd @t))
1414++ wait: (cmd @t)
1515++ who: (cmd @t)
1616++ wrong-message: cast mold and expression type do not unify
@@ -20,9 +20,9 @@ partial inference; module not checked
2020/tests/golden/types-prelude-cmd/source.jibb:10:30: expression
2121++ wrong-message ^- (cmd @t) [%wait ~s30 ~zod]
2222 ^
23−++ wrap: $-(A (cmd A))
24−++ wrap-text: (cmd @t)
25−++ wrap-ship: (cmd @p)
23+++ wrap-value: $-(A (cmd A))
24+++ wrap-value-text: (cmd @t)
25+++ wrap-value-ship: (cmd @p)
2626++ wrong-reply: cast mold and expression type do not unify
2727/tests/golden/types-prelude-cmd/source.jibb:14:19: cast mold
2828++ wrong-reply ^- (cmd @t) [%who |=(p=@p ~zod)]
@@ -49,8 +49,8 @@ partial inference; module not checked
4949++ use-text: $-((cmd @t) (cmd @t))
5050++ cross: call's sample and argument types do not unify
5151/tests/golden/types-prelude-cmd/source.jibb:21:21: called gate
52−++ cross (use-text (wrap ~zod))
52+++ cross (use-text (wrap-value ~zod))
5353 ^
54−/tests/golden/types-prelude-cmd/source.jibb:21:26: argument has type @p
55−++ cross (use-text (wrap ~zod))
56− ^
54+/tests/golden/types-prelude-cmd/source.jibb:21:32: argument has type @p
55+++ cross (use-text (wrap-value ~zod))
56+ ^
tests/golden/types-prelude-list-alias/source.jibb+1−1
@@ -2,6 +2,6 @@
22++ path-id |= x=path x
33++ tape-id |= x=tape x
44++ spot-id |= x=spot x
5−++ text |= x=(bag @t) x
5+++ text-value |= x=(bag @t) x
66++ ship |= x=(bag @p) x
77++ wrong ^- (bag @t) ~[~zod]
tests/golden/types-prelude-list-alias/tokens.txt+9−9
@@ -34,15 +34,15 @@
34344:22 name x
35355:1 NEWLINE
36365:1 glyph ++
37−5:4 name text
38−5:9 glyph |=
39−5:12 name x
40−5:13 tight glyph =
41−5:14 tight glyph (
42−5:15 tight name bag
43−5:19 aura @t
44−5:21 tight glyph )
45−5:23 name x
37+5:4 name text-value
38+5:15 glyph |=
39+5:18 name x
40+5:19 tight glyph =
41+5:20 tight glyph (
42+5:21 tight name bag
43+5:25 aura @t
44+5:27 tight glyph )
45+5:29 name x
46466:1 NEWLINE
47476:1 glyph ++
48486:4 name ship
tests/golden/types-prelude-list-alias/tree.txt+5−5
@@ -14,11 +14,11 @@
1414 (gate 4:12
1515 (face 4:15 x (ref 4:17 spot))
1616 (wing 4:22 x)))
17− (value 5:1 text
18− (gate 5:9
19− (face 5:12 x
20− (apply 5:14 bag (aura 5:19 @t)))
21− (wing 5:23 x)))
17+ (value 5:1 text-value
18+ (gate 5:15
19+ (face 5:18 x
20+ (apply 5:20 bag (aura 5:25 @t)))
21+ (wing 5:29 x)))
2222 (value 6:1 ship
2323 (gate 6:9
2424 (face 6:12 x
tests/golden/types-prelude-list-alias/types.txt+1−1
@@ -3,7 +3,7 @@ partial inference; module not checked
33++ path-id: $-((list @ta) (list @ta))
44++ tape-id: $-((list @tD) (list @tD))
55++ spot-id: $-([p=(list @ta) q=[p=[p=@ q=@] q=[p=@ q=@]]] [p=(list @ta) q=[p=[p=@ q=@] q=[p=@ q=@]]])
6−++ text: $-((list @t) (list @t))
6+++ text-value: $-((list @t) (list @t))
77++ ship: $-((list @p) (list @p))
88++ wrong: list item does not fit its expected type
99/tests/golden/types-prelude-list-alias/source.jibb:7:13: expected item has type @t
tests/golden/types-prelude-ui/about.txtnew file+4
@@ -0,0 +1,4 @@
1+source: docs/spec/overview.md, Prelude, The Elm architecture on Urbit, and Layout and styling.
2+tests: Exact source-backed UI/program/page constructor schemes; static and message-bearing composition; concrete islands and pages; invalid attributes, malformed keyed/table inputs, child-message mismatch, mismatched island data, and ordinary inference of a concrete raw element constructor. Nested element payloads are erased only in the nonrecursive runtime mold, not in public constructor signatures.
3+expect: parses
4+expect-types: supported declarations infer exact types and invalid compositions report errors; the child-message mismatch fails closed as an unsupported constraint. No raw-constructor encapsulation, duplicate-attribute check, rendering, navigation, storage, or execution is claimed.
tests/golden/types-prelude-ui/modules.txtnew file+1
@@ -0,0 +1 @@
1+# no module fixtures
tests/golden/types-prelude-ui/source.jibbnew file+78
@@ -0,0 +1,78 @@
1++$ msg
2+ %save
3+ %toggle
4+ [%edited value=@t]
5++$ model [count=@ud]
6+
7+++ row-scheme row
8+++ column-scheme column
9+++ wrap-scheme wrap
10+++ stack-scheme stack
11+++ el-scheme el
12+++ para-scheme para
13+++ text-scheme text
14+++ heading-scheme heading
15+++ each-scheme each
16+++ table-scheme table
17+++ image-scheme image
18+++ image-unsafe-scheme image-unsafe
19+++ link-scheme link
20+++ link-unsafe-scheme link-unsafe
21+++ button-scheme button
22+++ toggle-scheme toggle
23+++ field-scheme field
24+++ form-scheme form
25+++ island-scheme island
26+++ program-scheme program
27+++ page-scheme page
28+
29+++ static-text ^- (element !!) (text "hello")
30+++ raw-text ^- (element !!) (row ~ ~[[%text "raw"]])
31+++ static-ui ^- (element !!)
32+ column ~[pad+%s1 gap+%s2 width+[%fill 1] align+%center role+%body tone+%muted] ~[
33+ text "one"
34+ para ~[(text "two")]
35+ heading 2 "heading"
36+++ static-media ^- (element !!)
37+ stack ~[width+[%chars 20]] ~[
38+ image %/images/logo.png "Logo"
39+ link %/home "Home"
40+++ unsafe-media ^- (element !!)
41+ wrap ~[width+%shrink role+%caption tone+%accent] ~[
42+ image-unsafe [url="https://example.com/a.png" width=20 height=10] "Remote"
43+ link-unsafe "/elsewhere" "Elsewhere"
44+++ save-message ^- msg %save
45+++ toggle-message ^- msg %toggle
46+++ save-button ^- (element msg) (button "Save" save-message)
47+++ enabled-toggle ^- (element msg) (toggle %.y "Enabled" toggle-message)
48+++ edit-message |= value=@t ^- msg [%edited value]
49+++ name-field ^- (element msg) (field "Name" "value" edit-message)
50+++ controls ^- (element msg)
51+ (form save-message ~[save-button enabled-toggle name-field])
52+++ keyed |= items=(list [key=@t el=(element msg)])
53+ ^- (element msg) (each items)
54+++ tabular |= rows=(list [key=@ud cells=(list (element msg))])
55+ ^- (element msg)
56+ (table ~[[header="Name" width=[%fill 1] align=%start]] rows)
57+
58+++ bad-pad ^- (element !!) (row ~[pad+%s4] ~)
59+++ bad-width ^- (element !!) (row ~[width+[%chars "wide"]] ~)
60+++ malformed-each ^- (element msg) (each ~[[key="row" kid=(text "child")]])
61+++ malformed-table ^- (element msg)
62+ (table ~[[header="Name" width=%shrink]] ~)
63+++ ship-control ^- (element @p) (button "Ship" ~zod)
64+++ text-row |= kids=(list (element @t)) ^- (element @t) (row ~ kids)
65+++ bad-child (text-row ~[ship-control])
66+
67+++ init |= input=@t ^- model [count=0]
68+++ update |= [message=msg state=model]
69+ ^- [model (list (cmd msg))] [state ~]
70+++ view |= state=model ^- (element msg) (controls)
71+++ subs |= state=model ^- (list (sub msg)) ~
72+++ concrete-program ^- (program @t model msg) (program init update view subs)
73+++ embedded ^- (element !!) (island concrete-program "seed")
74+++ mismatched-island-data ^- (element !!) (island concrete-program ~zod)
75+
76+++ load |= route=@t ^- (ask model) (pure [count=0])
77+++ page-view |= data=model ^- (element !!) (text "page")
78+++ static-page ^- (page @t model) (page load page-view)
tests/golden/types-prelude-ui/tokens.txtnew file+728
@@ -0,0 +1,728 @@
1+1:1 glyph +$
2+1:4 name msg
3+2:3 INDENT
4+2:3 lit %save
5+3:3 NEWLINE
6+3:3 lit %toggle
7+4:3 NEWLINE
8+4:3 glyph [
9+4:4 tight lit %edited
10+4:12 name value
11+4:17 tight glyph =
12+4:18 tight aura @t
13+4:20 tight glyph ]
14+5:1 DEDENT
15+5:1 NEWLINE
16+5:1 glyph +$
17+5:4 name model
18+5:10 glyph [
19+5:11 tight name count
20+5:16 tight glyph =
21+5:17 tight aura @ud
22+5:20 tight glyph ]
23+7:1 NEWLINE
24+7:1 glyph ++
25+7:4 name row-scheme
26+7:15 name row
27+8:1 NEWLINE
28+8:1 glyph ++
29+8:4 name column-scheme
30+8:18 name column
31+9:1 NEWLINE
32+9:1 glyph ++
33+9:4 name wrap-scheme
34+9:16 name wrap
35+10:1 NEWLINE
36+10:1 glyph ++
37+10:4 name stack-scheme
38+10:17 name stack
39+11:1 NEWLINE
40+11:1 glyph ++
41+11:4 name el-scheme
42+11:14 name el
43+12:1 NEWLINE
44+12:1 glyph ++
45+12:4 name para-scheme
46+12:16 name para
47+13:1 NEWLINE
48+13:1 glyph ++
49+13:4 name text-scheme
50+13:16 name text
51+14:1 NEWLINE
52+14:1 glyph ++
53+14:4 name heading-scheme
54+14:19 name heading
55+15:1 NEWLINE
56+15:1 glyph ++
57+15:4 name each-scheme
58+15:16 name each
59+16:1 NEWLINE
60+16:1 glyph ++
61+16:4 name table-scheme
62+16:17 name table
63+17:1 NEWLINE
64+17:1 glyph ++
65+17:4 name image-scheme
66+17:17 name image
67+18:1 NEWLINE
68+18:1 glyph ++
69+18:4 name image-unsafe-scheme
70+18:24 name image-unsafe
71+19:1 NEWLINE
72+19:1 glyph ++
73+19:4 name link-scheme
74+19:16 name link
75+20:1 NEWLINE
76+20:1 glyph ++
77+20:4 name link-unsafe-scheme
78+20:23 name link-unsafe
79+21:1 NEWLINE
80+21:1 glyph ++
81+21:4 name button-scheme
82+21:18 name button
83+22:1 NEWLINE
84+22:1 glyph ++
85+22:4 name toggle-scheme
86+22:18 name toggle
87+23:1 NEWLINE
88+23:1 glyph ++
89+23:4 name field-scheme
90+23:17 name field
91+24:1 NEWLINE
92+24:1 glyph ++
93+24:4 name form-scheme
94+24:16 name form
95+25:1 NEWLINE
96+25:1 glyph ++
97+25:4 name island-scheme
98+25:18 name island
99+26:1 NEWLINE
100+26:1 glyph ++
101+26:4 name program-scheme
102+26:19 name program
103+27:1 NEWLINE
104+27:1 glyph ++
105+27:4 name page-scheme
106+27:16 name page
107+29:1 NEWLINE
108+29:1 glyph ++
109+29:4 name static-text
110+29:16 glyph ^-
111+29:19 glyph (
112+29:20 tight name element
113+29:28 glyph !!
114+29:30 tight glyph )
115+29:32 glyph (
116+29:33 tight name text
117+29:38 str "hello"
118+29:45 tight glyph )
119+30:1 NEWLINE
120+30:1 glyph ++
121+30:4 name raw-text
122+30:13 glyph ^-
123+30:16 glyph (
124+30:17 tight name element
125+30:25 glyph !!
126+30:27 tight glyph )
127+30:29 glyph (
128+30:30 tight name row
129+30:34 lit ~
130+30:36 glyph ~[
131+30:38 tight glyph [
132+30:39 tight lit %text
133+30:45 str "raw"
134+30:50 tight glyph ]
135+30:51 tight glyph ]
136+30:52 tight glyph )
137+31:1 NEWLINE
138+31:1 glyph ++
139+31:4 name static-ui
140+31:14 glyph ^-
141+31:17 glyph (
142+31:18 tight name element
143+31:26 glyph !!
144+31:28 tight glyph )
145+32:3 INDENT
146+32:3 name column
147+32:10 glyph ~[
148+32:12 tight name pad
149+32:15 tight glyph +
150+32:16 tight lit %s1
151+32:20 name gap
152+32:23 tight glyph +
153+32:24 tight lit %s2
154+32:28 name width
155+32:33 tight glyph +
156+32:34 tight glyph [
157+32:35 tight lit %fill
158+32:41 lit 1
159+32:42 tight glyph ]
160+32:44 name align
161+32:49 tight glyph +
162+32:50 tight lit %center
163+32:58 name role
164+32:62 tight glyph +
165+32:63 tight lit %body
166+32:69 name tone
167+32:73 tight glyph +
168+32:74 tight lit %muted
169+32:80 tight glyph ]
170+32:82 glyph ~[
171+33:5 INDENT
172+33:5 name text
173+33:10 str "one"
174+34:5 NEWLINE
175+34:5 name para
176+34:10 glyph ~[
177+34:12 tight glyph (
178+34:13 tight name text
179+34:18 str "two"
180+34:23 tight glyph )
181+34:24 tight glyph ]
182+35:5 NEWLINE
183+35:5 name heading
184+35:13 lit 2
185+35:15 str "heading"
186+36:1 DEDENT
187+36:1 DEDENT
188+36:1 NEWLINE
189+36:1 glyph ++
190+36:4 name static-media
191+36:17 glyph ^-
192+36:20 glyph (
193+36:21 tight name element
194+36:29 glyph !!
195+36:31 tight glyph )
196+37:3 INDENT
197+37:3 name stack
198+37:9 glyph ~[
199+37:11 tight name width
200+37:16 tight glyph +
201+37:17 tight glyph [
202+37:18 tight lit %chars
203+37:25 lit 20
204+37:27 tight glyph ]
205+37:28 tight glyph ]
206+37:30 glyph ~[
207+38:5 INDENT
208+38:5 name image
209+38:11 glyph %/
210+38:13 tight knot images
211+38:19 tight glyph /
212+38:20 tight knot logo.png
213+38:29 str "Logo"
214+39:5 NEWLINE
215+39:5 name link
216+39:10 glyph %/
217+39:12 tight knot home
218+39:17 str "Home"
219+40:1 DEDENT
220+40:1 DEDENT
221+40:1 NEWLINE
222+40:1 glyph ++
223+40:4 name unsafe-media
224+40:17 glyph ^-
225+40:20 glyph (
226+40:21 tight name element
227+40:29 glyph !!
228+40:31 tight glyph )
229+41:3 INDENT
230+41:3 name wrap
231+41:8 glyph ~[
232+41:10 tight name width
233+41:15 tight glyph +
234+41:16 tight lit %shrink
235+41:24 name role
236+41:28 tight glyph +
237+41:29 tight lit %caption
238+41:38 name tone
239+41:42 tight glyph +
240+41:43 tight lit %accent
241+41:50 tight glyph ]
242+41:52 glyph ~[
243+42:5 INDENT
244+42:5 name image-unsafe
245+42:18 glyph [
246+42:19 tight name url
247+42:22 tight glyph =
248+42:23 tight str "https://example.com/a.png"
249+42:51 name width
250+42:56 tight glyph =
251+42:57 tight lit 20
252+42:60 name height
253+42:66 tight glyph =
254+42:67 tight lit 10
255+42:69 tight glyph ]
256+42:71 str "Remote"
257+43:5 NEWLINE
258+43:5 name link-unsafe
259+43:17 str "/elsewhere"
260+43:30 str "Elsewhere"
261+44:1 DEDENT
262+44:1 DEDENT
263+44:1 NEWLINE
264+44:1 glyph ++
265+44:4 name save-message
266+44:17 glyph ^-
267+44:20 name msg
268+44:24 lit %save
269+45:1 NEWLINE
270+45:1 glyph ++
271+45:4 name toggle-message
272+45:19 glyph ^-
273+45:22 name msg
274+45:26 lit %toggle
275+46:1 NEWLINE
276+46:1 glyph ++
277+46:4 name save-button
278+46:16 glyph ^-
279+46:19 glyph (
280+46:20 tight name element
281+46:28 name msg
282+46:31 tight glyph )
283+46:33 glyph (
284+46:34 tight name button
285+46:41 str "Save"
286+46:48 name save-message
287+46:60 tight glyph )
288+47:1 NEWLINE
289+47:1 glyph ++
290+47:4 name enabled-toggle
291+47:19 glyph ^-
292+47:22 glyph (
293+47:23 tight name element
294+47:31 name msg
295+47:34 tight glyph )
296+47:36 glyph (
297+47:37 tight name toggle
298+47:44 lit %.y
299+47:48 str "Enabled"
300+47:58 name toggle-message
301+47:72 tight glyph )
302+48:1 NEWLINE
303+48:1 glyph ++
304+48:4 name edit-message
305+48:17 glyph |=
306+48:20 name value
307+48:25 tight glyph =
308+48:26 tight aura @t
309+48:29 glyph ^-
310+48:32 name msg
311+48:36 glyph [
312+48:37 tight lit %edited
313+48:45 name value
314+48:50 tight glyph ]
315+49:1 NEWLINE
316+49:1 glyph ++
317+49:4 name name-field
318+49:15 glyph ^-
319+49:18 glyph (
320+49:19 tight name element
321+49:27 name msg
322+49:30 tight glyph )
323+49:32 glyph (
324+49:33 tight name field
325+49:39 str "Name"
326+49:46 str "value"
327+49:54 name edit-message
328+49:66 tight glyph )
329+50:1 NEWLINE
330+50:1 glyph ++
331+50:4 name controls
332+50:13 glyph ^-
333+50:16 glyph (
334+50:17 tight name element
335+50:25 name msg
336+50:28 tight glyph )
337+51:3 INDENT
338+51:3 glyph (
339+51:4 tight name form
340+51:9 name save-message
341+51:22 glyph ~[
342+51:24 tight name save-button
343+51:36 name enabled-toggle
344+51:51 name name-field
345+51:61 tight glyph ]
346+51:62 tight glyph )
347+52:1 DEDENT
348+52:1 NEWLINE
349+52:1 glyph ++
350+52:4 name keyed
351+52:10 glyph |=
352+52:13 name items
353+52:18 tight glyph =
354+52:19 tight glyph (
355+52:20 tight name list
356+52:25 glyph [
357+52:26 tight name key
358+52:29 tight glyph =
359+52:30 tight aura @t
360+52:33 name el
361+52:35 tight glyph =
362+52:36 tight glyph (
363+52:37 tight name element
364+52:45 name msg
365+52:48 tight glyph )
366+52:49 tight glyph ]
367+52:50 tight glyph )
368+53:3 INDENT
369+53:3 glyph ^-
370+53:6 glyph (
371+53:7 tight name element
372+53:15 name msg
373+53:18 tight glyph )
374+53:20 glyph (
375+53:21 tight name each
376+53:26 name items
377+53:31 tight glyph )
378+54:1 DEDENT
379+54:1 NEWLINE
380+54:1 glyph ++
381+54:4 name tabular
382+54:12 glyph |=
383+54:15 name rows
384+54:19 tight glyph =
385+54:20 tight glyph (
386+54:21 tight name list
387+54:26 glyph [
388+54:27 tight name key
389+54:30 tight glyph =
390+54:31 tight aura @ud
391+54:35 name cells
392+54:40 tight glyph =
393+54:41 tight glyph (
394+54:42 tight name list
395+54:47 glyph (
396+54:48 tight name element
397+54:56 name msg
398+54:59 tight glyph )
399+54:60 tight glyph )
400+54:61 tight glyph ]
401+54:62 tight glyph )
402+55:3 INDENT
403+55:3 glyph ^-
404+55:6 glyph (
405+55:7 tight name element
406+55:15 name msg
407+55:18 tight glyph )
408+56:5 INDENT
409+56:5 glyph (
410+56:6 tight name table
411+56:12 glyph ~[
412+56:14 tight glyph [
413+56:15 tight name header
414+56:21 tight glyph =
415+56:22 tight str "Name"
416+56:29 name width
417+56:34 tight glyph =
418+56:35 tight glyph [
419+56:36 tight lit %fill
420+56:42 lit 1
421+56:43 tight glyph ]
422+56:45 name align
423+56:50 tight glyph =
424+56:51 tight lit %start
425+56:57 tight glyph ]
426+56:58 tight glyph ]
427+56:60 name rows
428+56:64 tight glyph )
429+58:1 DEDENT
430+58:1 DEDENT
431+58:1 NEWLINE
432+58:1 glyph ++
433+58:4 name bad-pad
434+58:12 glyph ^-
435+58:15 glyph (
436+58:16 tight name element
437+58:24 glyph !!
438+58:26 tight glyph )
439+58:28 glyph (
440+58:29 tight name row
441+58:33 glyph ~[
442+58:35 tight name pad
443+58:38 tight glyph +
444+58:39 tight lit %s4
445+58:42 tight glyph ]
446+58:44 lit ~
447+58:45 tight glyph )
448+59:1 NEWLINE
449+59:1 glyph ++
450+59:4 name bad-width
451+59:14 glyph ^-
452+59:17 glyph (
453+59:18 tight name element
454+59:26 glyph !!
455+59:28 tight glyph )
456+59:30 glyph (
457+59:31 tight name row
458+59:35 glyph ~[
459+59:37 tight name width
460+59:42 tight glyph +
461+59:43 tight glyph [
462+59:44 tight lit %chars
463+59:51 str "wide"
464+59:57 tight glyph ]
465+59:58 tight glyph ]
466+59:60 lit ~
467+59:61 tight glyph )
468+60:1 NEWLINE
469+60:1 glyph ++
470+60:4 name malformed-each
471+60:19 glyph ^-
472+60:22 glyph (
473+60:23 tight name element
474+60:31 name msg
475+60:34 tight glyph )
476+60:36 glyph (
477+60:37 tight name each
478+60:42 glyph ~[
479+60:44 tight glyph [
480+60:45 tight name key
481+60:48 tight glyph =
482+60:49 tight str "row"
483+60:55 name kid
484+60:58 tight glyph =
485+60:59 tight glyph (
486+60:60 tight name text
487+60:65 str "child"
488+60:72 tight glyph )
489+60:73 tight glyph ]
490+60:74 tight glyph ]
491+60:75 tight glyph )
492+61:1 NEWLINE
493+61:1 glyph ++
494+61:4 name malformed-table
495+61:20 glyph ^-
496+61:23 glyph (
497+61:24 tight name element
498+61:32 name msg
499+61:35 tight glyph )
500+62:3 INDENT
501+62:3 glyph (
502+62:4 tight name table
503+62:10 glyph ~[
504+62:12 tight glyph [
505+62:13 tight name header
506+62:19 tight glyph =
507+62:20 tight str "Name"
508+62:27 name width
509+62:32 tight glyph =
510+62:33 tight lit %shrink
511+62:40 tight glyph ]
512+62:41 tight glyph ]
513+62:43 lit ~
514+62:44 tight glyph )
515+63:1 DEDENT
516+63:1 NEWLINE
517+63:1 glyph ++
518+63:4 name ship-control
519+63:17 glyph ^-
520+63:20 glyph (
521+63:21 tight name element
522+63:29 aura @p
523+63:31 tight glyph )
524+63:33 glyph (
525+63:34 tight name button
526+63:41 str "Ship"
527+63:48 lit ~zod
528+63:52 tight glyph )
529+64:1 NEWLINE
530+64:1 glyph ++
531+64:4 name text-row
532+64:13 glyph |=
533+64:16 name kids
534+64:20 tight glyph =
535+64:21 tight glyph (
536+64:22 tight name list
537+64:27 glyph (
538+64:28 tight name element
539+64:36 aura @t
540+64:38 tight glyph )
541+64:39 tight glyph )
542+64:41 glyph ^-
543+64:44 glyph (
544+64:45 tight name element
545+64:53 aura @t
546+64:55 tight glyph )
547+64:57 glyph (
548+64:58 tight name row
549+64:62 lit ~
550+64:64 name kids
551+64:68 tight glyph )
552+65:1 NEWLINE
553+65:1 glyph ++
554+65:4 name bad-child
555+65:14 glyph (
556+65:15 tight name text-row
557+65:24 glyph ~[
558+65:26 tight name ship-control
559+65:38 tight glyph ]
560+65:39 tight glyph )
561+67:1 NEWLINE
562+67:1 glyph ++
563+67:4 name init
564+67:9 glyph |=
565+67:12 name input
566+67:17 tight glyph =
567+67:18 tight aura @t
568+67:21 glyph ^-
569+67:24 name model
570+67:30 glyph [
571+67:31 tight name count
572+67:36 tight glyph =
573+67:37 tight lit 0
574+67:38 tight glyph ]
575+68:1 NEWLINE
576+68:1 glyph ++
577+68:4 name update
578+68:11 glyph |=
579+68:14 glyph [
580+68:15 tight name message
581+68:22 tight glyph =
582+68:23 tight name msg
583+68:27 name state
584+68:32 tight glyph =
585+68:33 tight name model
586+68:38 tight glyph ]
587+69:3 INDENT
588+69:3 glyph ^-
589+69:6 glyph [
590+69:7 tight name model
591+69:13 glyph (
592+69:14 tight name list
593+69:19 glyph (
594+69:20 tight name cmd
595+69:24 name msg
596+69:27 tight glyph )
597+69:28 tight glyph )
598+69:29 tight glyph ]
599+69:31 glyph [
600+69:32 tight name state
601+69:38 lit ~
602+69:39 tight glyph ]
603+70:1 DEDENT
604+70:1 NEWLINE
605+70:1 glyph ++
606+70:4 name view
607+70:9 glyph |=
608+70:12 name state
609+70:17 tight glyph =
610+70:18 tight name model
611+70:24 glyph ^-
612+70:27 glyph (
613+70:28 tight name element
614+70:36 name msg
615+70:39 tight glyph )
616+70:41 glyph (
617+70:42 tight name controls
618+70:50 tight glyph )
619+71:1 NEWLINE
620+71:1 glyph ++
621+71:4 name subs
622+71:9 glyph |=
623+71:12 name state
624+71:17 tight glyph =
625+71:18 tight name model
626+71:24 glyph ^-
627+71:27 glyph (
628+71:28 tight name list
629+71:33 glyph (
630+71:34 tight name sub
631+71:38 name msg
632+71:41 tight glyph )
633+71:42 tight glyph )
634+71:44 lit ~
635+72:1 NEWLINE
636+72:1 glyph ++
637+72:4 name concrete-program
638+72:21 glyph ^-
639+72:24 glyph (
640+72:25 tight name program
641+72:33 aura @t
642+72:36 name model
643+72:42 name msg
644+72:45 tight glyph )
645+72:47 glyph (
646+72:48 tight name program
647+72:56 name init
648+72:61 name update
649+72:68 name view
650+72:73 name subs
651+72:77 tight glyph )
652+73:1 NEWLINE
653+73:1 glyph ++
654+73:4 name embedded
655+73:13 glyph ^-
656+73:16 glyph (
657+73:17 tight name element
658+73:25 glyph !!
659+73:27 tight glyph )
660+73:29 glyph (
661+73:30 tight name island
662+73:37 name concrete-program
663+73:54 str "seed"
664+73:60 tight glyph )
665+74:1 NEWLINE
666+74:1 glyph ++
667+74:4 name mismatched-island-data
668+74:27 glyph ^-
669+74:30 glyph (
670+74:31 tight name element
671+74:39 glyph !!
672+74:41 tight glyph )
673+74:43 glyph (
674+74:44 tight name island
675+74:51 name concrete-program
676+74:68 lit ~zod
677+74:72 tight glyph )
678+76:1 NEWLINE
679+76:1 glyph ++
680+76:4 name load
681+76:9 glyph |=
682+76:12 name route
683+76:17 tight glyph =
684+76:18 tight aura @t
685+76:21 glyph ^-
686+76:24 glyph (
687+76:25 tight name ask
688+76:29 name model
689+76:34 tight glyph )
690+76:36 glyph (
691+76:37 tight name pure
692+76:42 glyph [
693+76:43 tight name count
694+76:48 tight glyph =
695+76:49 tight lit 0
696+76:50 tight glyph ]
697+76:51 tight glyph )
698+77:1 NEWLINE
699+77:1 glyph ++
700+77:4 name page-view
701+77:14 glyph |=
702+77:17 name data
703+77:21 tight glyph =
704+77:22 tight name model
705+77:28 glyph ^-
706+77:31 glyph (
707+77:32 tight name element
708+77:40 glyph !!
709+77:42 tight glyph )
710+77:44 glyph (
711+77:45 tight name text
712+77:50 str "page"
713+77:56 tight glyph )
714+78:1 NEWLINE
715+78:1 glyph ++
716+78:4 name static-page
717+78:16 glyph ^-
718+78:19 glyph (
719+78:20 tight name page
720+78:25 aura @t
721+78:28 name model
722+78:33 tight glyph )
723+78:35 glyph (
724+78:36 tight name page
725+78:41 name load
726+78:46 name page-view
727+78:55 tight glyph )
728+78:56 NEWLINE
tests/golden/types-prelude-ui/tree.txtnew file+300
@@ -0,0 +1,300 @@
1+(module
2+ (mold 1:1 msg
3+ (union 2:3
4+ (const 2:3 %save)
5+ (const 3:3 %toggle)
6+ (cell 4:3
7+ (const 4:4 %edited)
8+ (face 4:12 value (aura 4:18 @t)))))
9+ (mold 5:1 model
10+ (cell 5:10
11+ (face 5:11 count (aura 5:17 @ud))))
12+ (value 7:1 row-scheme (wing 7:15 row))
13+ (value 8:1 column-scheme (wing 8:18 column))
14+ (value 9:1 wrap-scheme (wing 9:16 wrap))
15+ (value 10:1 stack-scheme (wing 10:17 stack))
16+ (value 11:1 el-scheme (wing 11:14 el))
17+ (value 12:1 para-scheme (wing 12:16 para))
18+ (value 13:1 text-scheme (wing 13:16 text))
19+ (value 14:1 heading-scheme (wing 14:19 heading))
20+ (value 15:1 each-scheme (wing 15:16 each))
21+ (value 16:1 table-scheme (wing 16:17 table))
22+ (value 17:1 image-scheme (wing 17:17 image))
23+ (value 18:1 image-unsafe-scheme (wing 18:24 image-unsafe))
24+ (value 19:1 link-scheme (wing 19:16 link))
25+ (value 20:1 link-unsafe-scheme (wing 20:23 link-unsafe))
26+ (value 21:1 button-scheme (wing 21:18 button))
27+ (value 22:1 toggle-scheme (wing 22:18 toggle))
28+ (value 23:1 field-scheme (wing 23:17 field))
29+ (value 24:1 form-scheme (wing 24:16 form))
30+ (value 25:1 island-scheme (wing 25:18 island))
31+ (value 26:1 program-scheme (wing 26:19 program))
32+ (value 27:1 page-scheme (wing 27:16 page))
33+ (value 29:1 static-text
34+ (cast 29:16
35+ (apply 29:19 element (void 29:28))
36+ (group 29:32
37+ (call 29:33 (wing 29:33 text) (str 29:38 "hello")))))
38+ (value 30:1 raw-text
39+ (cast 30:13
40+ (apply 30:16 element (void 30:25))
41+ (group 30:29
42+ (call 30:30
43+ (wing 30:30 row)
44+ (lit 30:34 ~)
45+ (list 30:36
46+ (tuple 30:38 (lit 30:39 %text) (str 30:45 "raw")))))))
47+ (value 31:1 static-ui
48+ (cast 31:14
49+ (apply 31:17 element (void 31:26))
50+ (body 32:3
51+ (call 32:3
52+ (wing 32:3 column)
53+ (list 32:10
54+ (pair 32:12 pad (lit 32:16 %s1))
55+ (pair 32:20 gap (lit 32:24 %s2))
56+ (pair 32:28 width
57+ (tuple 32:34 (lit 32:35 %fill) (lit 32:41 1)))
58+ (pair 32:44 align (lit 32:50 %center))
59+ (pair 32:58 role (lit 32:63 %body))
60+ (pair 32:69 tone (lit 32:74 %muted)))
61+ (list 32:82
62+ (call 33:5 (wing 33:5 text) (str 33:10 "one"))
63+ (call 34:5
64+ (wing 34:5 para)
65+ (list 34:10
66+ (group 34:12
67+ (call 34:13 (wing 34:13 text) (str 34:18 "two")))))
68+ (call 35:5 (wing 35:5 heading) (lit 35:13 2) (str 35:15 "heading")))))))
69+ (value 36:1 static-media
70+ (cast 36:17
71+ (apply 36:20 element (void 36:29))
72+ (body 37:3
73+ (call 37:3
74+ (wing 37:3 stack)
75+ (list 37:9
76+ (pair 37:11 width
77+ (tuple 37:17 (lit 37:18 %chars) (lit 37:25 20))))
78+ (list 37:30
79+ (call 38:5 (wing 38:5 image) (qath 38:11 images logo.png) (str 38:29 "Logo"))
80+ (call 39:5 (wing 39:5 link) (qath 39:10 home) (str 39:17 "Home")))))))
81+ (value 40:1 unsafe-media
82+ (cast 40:17
83+ (apply 40:20 element (void 40:29))
84+ (body 41:3
85+ (call 41:3
86+ (wing 41:3 wrap)
87+ (list 41:8
88+ (pair 41:10 width (lit 41:16 %shrink))
89+ (pair 41:24 role (lit 41:29 %caption))
90+ (pair 41:38 tone (lit 41:43 %accent)))
91+ (list 41:52
92+ (call 42:5
93+ (wing 42:5 image-unsafe)
94+ (tuple 42:18
95+ (face 42:19 url (str 42:23 "https://example.com/a.png"))
96+ (face 42:51 width (lit 42:57 20))
97+ (face 42:60 height (lit 42:67 10)))
98+ (str 42:71 "Remote"))
99+ (call 43:5 (wing 43:5 link-unsafe) (str 43:17 "/elsewhere") (str 43:30 "Elsewhere")))))))
100+ (value 44:1 save-message
101+ (cast 44:17 (ref 44:20 msg) (lit 44:24 %save)))
102+ (value 45:1 toggle-message
103+ (cast 45:19 (ref 45:22 msg) (lit 45:26 %toggle)))
104+ (value 46:1 save-button
105+ (cast 46:16
106+ (apply 46:19 element (ref 46:28 msg))
107+ (group 46:33
108+ (call 46:34 (wing 46:34 button) (str 46:41 "Save") (wing 46:48 save-message)))))
109+ (value 47:1 enabled-toggle
110+ (cast 47:19
111+ (apply 47:22 element (ref 47:31 msg))
112+ (group 47:36
113+ (call 47:37 (wing 47:37 toggle) (lit 47:44 %.y) (str 47:48 "Enabled") (wing 47:58 toggle-message)))))
114+ (value 48:1 edit-message
115+ (gate 48:17
116+ (face 48:20 value (aura 48:26 @t))
117+ (cast 48:29
118+ (ref 48:32 msg)
119+ (tuple 48:36 (lit 48:37 %edited) (wing 48:45 value)))))
120+ (value 49:1 name-field
121+ (cast 49:15
122+ (apply 49:18 element (ref 49:27 msg))
123+ (group 49:32
124+ (call 49:33 (wing 49:33 field) (str 49:39 "Name") (str 49:46 "value") (wing 49:54 edit-message)))))
125+ (value 50:1 controls
126+ (cast 50:13
127+ (apply 50:16 element (ref 50:25 msg))
128+ (body 51:3
129+ (group 51:3
130+ (call 51:4
131+ (wing 51:4 form)
132+ (wing 51:9 save-message)
133+ (list 51:22 (wing 51:24 save-button) (wing 51:36 enabled-toggle) (wing 51:51 name-field)))))))
134+ (value 52:1 keyed
135+ (gate 52:10
136+ (face 52:13 items
137+ (apply 52:19 list
138+ (cell 52:25
139+ (face 52:26 key (aura 52:30 @t))
140+ (face 52:33 el
141+ (apply 52:36 element (ref 52:45 msg))))))
142+ (body 53:3
143+ (cast 53:3
144+ (apply 53:6 element (ref 53:15 msg))
145+ (group 53:20
146+ (call 53:21 (wing 53:21 each) (wing 53:26 items)))))))
147+ (value 54:1 tabular
148+ (gate 54:12
149+ (face 54:15 rows
150+ (apply 54:20 list
151+ (cell 54:26
152+ (face 54:27 key (aura 54:31 @ud))
153+ (face 54:35 cells
154+ (apply 54:41 list
155+ (apply 54:47 element (ref 54:56 msg)))))))
156+ (body 55:3
157+ (cast 55:3
158+ (apply 55:6 element (ref 55:15 msg))
159+ (body 56:5
160+ (group 56:5
161+ (call 56:6
162+ (wing 56:6 table)
163+ (list 56:12
164+ (tuple 56:14
165+ (face 56:15 header (str 56:22 "Name"))
166+ (face 56:29 width
167+ (tuple 56:35 (lit 56:36 %fill) (lit 56:42 1)))
168+ (face 56:45 align (lit 56:51 %start))))
169+ (wing 56:60 rows))))))))
170+ (value 58:1 bad-pad
171+ (cast 58:12
172+ (apply 58:15 element (void 58:24))
173+ (group 58:28
174+ (call 58:29
175+ (wing 58:29 row)
176+ (list 58:33
177+ (pair 58:35 pad (lit 58:39 %s4)))
178+ (lit 58:44 ~)))))
179+ (value 59:1 bad-width
180+ (cast 59:14
181+ (apply 59:17 element (void 59:26))
182+ (group 59:30
183+ (call 59:31
184+ (wing 59:31 row)
185+ (list 59:35
186+ (pair 59:37 width
187+ (tuple 59:43 (lit 59:44 %chars) (str 59:51 "wide"))))
188+ (lit 59:60 ~)))))
189+ (value 60:1 malformed-each
190+ (cast 60:19
191+ (apply 60:22 element (ref 60:31 msg))
192+ (group 60:36
193+ (call 60:37
194+ (wing 60:37 each)
195+ (list 60:42
196+ (tuple 60:44
197+ (face 60:45 key (str 60:49 "row"))
198+ (face 60:55 kid
199+ (group 60:59
200+ (call 60:60 (wing 60:60 text) (str 60:65 "child"))))))))))
201+ (value 61:1 malformed-table
202+ (cast 61:20
203+ (apply 61:23 element (ref 61:32 msg))
204+ (body 62:3
205+ (group 62:3
206+ (call 62:4
207+ (wing 62:4 table)
208+ (list 62:10
209+ (tuple 62:12
210+ (face 62:13 header (str 62:20 "Name"))
211+ (face 62:27 width (lit 62:33 %shrink))))
212+ (lit 62:43 ~))))))
213+ (value 63:1 ship-control
214+ (cast 63:17
215+ (apply 63:20 element (aura 63:29 @p))
216+ (group 63:33
217+ (call 63:34 (wing 63:34 button) (str 63:41 "Ship") (lit 63:48 ~zod)))))
218+ (value 64:1 text-row
219+ (gate 64:13
220+ (face 64:16 kids
221+ (apply 64:21 list
222+ (apply 64:27 element (aura 64:36 @t))))
223+ (cast 64:41
224+ (apply 64:44 element (aura 64:53 @t))
225+ (group 64:57
226+ (call 64:58 (wing 64:58 row) (lit 64:62 ~) (wing 64:64 kids))))))
227+ (value 65:1 bad-child
228+ (group 65:14
229+ (call 65:15
230+ (wing 65:15 text-row)
231+ (list 65:24 (wing 65:26 ship-control)))))
232+ (value 67:1 init
233+ (gate 67:9
234+ (face 67:12 input (aura 67:18 @t))
235+ (cast 67:21
236+ (ref 67:24 model)
237+ (tuple 67:30
238+ (face 67:31 count (lit 67:37 0))))))
239+ (value 68:1 update
240+ (gate 68:11
241+ (cell 68:14
242+ (face 68:15 message (ref 68:23 msg))
243+ (face 68:27 state (ref 68:33 model)))
244+ (body 69:3
245+ (cast 69:3
246+ (cell 69:6
247+ (ref 69:7 model)
248+ (apply 69:13 list
249+ (apply 69:19 cmd (ref 69:24 msg))))
250+ (tuple 69:31 (wing 69:32 state) (lit 69:38 ~))))))
251+ (value 70:1 view
252+ (gate 70:9
253+ (face 70:12 state (ref 70:18 model))
254+ (cast 70:24
255+ (apply 70:27 element (ref 70:36 msg))
256+ (group 70:41 (wing 70:42 controls)))))
257+ (value 71:1 subs
258+ (gate 71:9
259+ (face 71:12 state (ref 71:18 model))
260+ (cast 71:24
261+ (apply 71:27 list
262+ (apply 71:33 sub (ref 71:38 msg)))
263+ (lit 71:44 ~))))
264+ (value 72:1 concrete-program
265+ (cast 72:21
266+ (apply 72:24 program (aura 72:33 @t) (ref 72:36 model) (ref 72:42 msg))
267+ (group 72:47
268+ (call 72:48 (wing 72:48 program) (wing 72:56 init) (wing 72:61 update) (wing 72:68 view) (wing 72:73 subs)))))
269+ (value 73:1 embedded
270+ (cast 73:13
271+ (apply 73:16 element (void 73:25))
272+ (group 73:29
273+ (call 73:30 (wing 73:30 island) (wing 73:37 concrete-program) (str 73:54 "seed")))))
274+ (value 74:1 mismatched-island-data
275+ (cast 74:27
276+ (apply 74:30 element (void 74:39))
277+ (group 74:43
278+ (call 74:44 (wing 74:44 island) (wing 74:51 concrete-program) (lit 74:68 ~zod)))))
279+ (value 76:1 load
280+ (gate 76:9
281+ (face 76:12 route (aura 76:18 @t))
282+ (cast 76:21
283+ (apply 76:24 ask (ref 76:29 model))
284+ (group 76:36
285+ (call 76:37
286+ (wing 76:37 pure)
287+ (tuple 76:42
288+ (face 76:43 count (lit 76:49 0))))))))
289+ (value 77:1 page-view
290+ (gate 77:14
291+ (face 77:17 data (ref 77:22 model))
292+ (cast 77:28
293+ (apply 77:31 element (void 77:40))
294+ (group 77:44
295+ (call 77:45 (wing 77:45 text) (str 77:50 "page"))))))
296+ (value 78:1 static-page
297+ (cast 78:16
298+ (apply 78:19 page (aura 78:25 @t) (ref 78:28 model))
299+ (group 78:35
300+ (call 78:36 (wing 78:36 page) (wing 78:41 load) (wing 78:46 page-view))))))
tests/golden/types-prelude-ui/types.txtnew file+85
@@ -0,0 +1,85 @@
1+partial inference; module not checked
2++$ msg: cases proven disjoint; mold not checked
3++$ model: not checked
4+++ row-scheme: $-([attrs=(list attr) kids=(list (element A))] (element A))
5+++ column-scheme: $-([attrs=(list attr) kids=(list (element A))] (element A))
6+++ wrap-scheme: $-([attrs=(list attr) kids=(list (element A))] (element A))
7+++ stack-scheme: $-([attrs=(list attr) kids=(list (element A))] (element A))
8+++ el-scheme: $-([attrs=(list attr) kid=(element A)] (element A))
9+++ para-scheme: $-((list (element A)) (element A))
10+++ text-scheme: $-(@t (element A))
11+++ heading-scheme: $-([level=@ud words=@t] (element A))
12+++ each-scheme: $-((list [key=A el=(element B)]) (element B))
13+++ table-scheme: $-([columns=(list [header=@t [width=length align=align]]) rows=(list [key=A cells=(list (element B))])] (element B))
14+++ image-scheme: $-([source=qath description=@t] (element A))
15+++ image-unsafe-scheme: $-([source=[url=@t [width=@ud height=@ud]] description=@t] (element A))
16+++ link-scheme: $-([target=qath label=@t] (element A))
17+++ link-unsafe-scheme: $-([target=@t label=@t] (element A))
18+++ button-scheme: $-([label=@t message=A] (element A))
19+++ toggle-scheme: $-([on=? [label=@t message=A]] (element A))
20+++ field-scheme: $-([label=@t [value=@t reply=$-(@t A)]] (element A))
21+++ form-scheme: $-([message=A kids=(list (element A))] (element A))
22+++ island-scheme: $-([p=[init=$-(A B) [update=$-([C B] [B (list (cmd C))]) [view=$-(B (element C)) subs=$-(B (list (sub C)))]]] data=A] (element !!))
23+++ program-scheme: $-([init=$-(A B) [update=$-([C B] [B (list (cmd C))]) [view=$-(B (element C)) subs=$-(B (list (sub C)))]]] [init=$-(A B) [update=$-([C B] [B (list (cmd C))]) [view=$-(B (element C)) subs=$-(B (list (sub C)))]]])
24+++ page-scheme: $-([load=$-(A (ask B)) view=$-(B (element !!))] [load=$-(A (ask B)) view=$-(B (element !!))])
25+++ static-text: (element !!)
26+++ raw-text: (element !!)
27+++ static-ui: (element !!)
28+++ static-media: (element !!)
29+++ unsafe-media: (element !!)
30+++ save-message: msg
31+++ toggle-message: msg
32+++ save-button: (element msg)
33+++ enabled-toggle: (element msg)
34+++ edit-message: $-(@t msg)
35+++ name-field: (element msg)
36+++ controls: (element msg)
37+++ keyed: $-((list [key=@t el=(element msg)]) (element msg))
38+++ tabular: $-((list [key=@ud cells=(list (element msg))]) (element msg))
39+++ bad-pad: list item does not fit its expected type
40+/tests/golden/types-prelude-ui/source.jibb:58:29: expected item
41+++ bad-pad ^- (element !!) (row ~[pad+%s4] ~)
42+ ^
43+/tests/golden/types-prelude-ui/source.jibb:58:35: list item
44+++ bad-pad ^- (element !!) (row ~[pad+%s4] ~)
45+ ^
46+++ bad-width: list item does not fit its expected type
47+/tests/golden/types-prelude-ui/source.jibb:59:31: expected item
48+++ bad-width ^- (element !!) (row ~[width+[%chars "wide"]] ~)
49+ ^
50+/tests/golden/types-prelude-ui/source.jibb:59:37: list item
51+++ bad-width ^- (element !!) (row ~[width+[%chars "wide"]] ~)
52+ ^
53+++ malformed-each: list item does not fit its expected type
54+/tests/golden/types-prelude-ui/source.jibb:60:37: expected item
55+++ malformed-each ^- (element msg) (each ~[[key="row" kid=(text "child")]])
56+ ^
57+/tests/golden/types-prelude-ui/source.jibb:60:44: list item
58+++ malformed-each ^- (element msg) (each ~[[key="row" kid=(text "child")]])
59+ ^
60+++ malformed-table: list item does not fit its expected type
61+/tests/golden/types-prelude-ui/source.jibb:62:4: expected item
62+ (table ~[[header="Name" width=%shrink]] ~)
63+ ^
64+/tests/golden/types-prelude-ui/source.jibb:62:12: list item
65+ (table ~[[header="Name" width=%shrink]] ~)
66+ ^
67+++ ship-control: (element @p)
68+++ text-row: $-((list (element @t)) (element @t))
69+++ bad-child: list item constraint is not supported by partial inference
70+++ init: $-(@t [count=@ud])
71+++ update: $-([message=msg state=[count=@ud]] [count=@ud (list (cmd msg))])
72+++ view: $-([count=@ud] (element msg))
73+++ subs: $-([count=@ud] (list (sub msg)))
74+++ concrete-program: [init=$-(@t [count=@ud]) [update=$-([msg count=@ud] [count=@ud (list (cmd msg))]) [view=$-([count=@ud] (element msg)) subs=$-([count=@ud] (list (sub msg)))]]]
75+++ embedded: (element !!)
76+++ mismatched-island-data: call's sample and argument types do not unify
77+/tests/golden/types-prelude-ui/source.jibb:74:44: called gate
78+++ mismatched-island-data ^- (element !!) (island concrete-program ~zod)
79+ ^
80+/tests/golden/types-prelude-ui/source.jibb:74:51: argument
81+++ mismatched-island-data ^- (element !!) (island concrete-program ~zod)
82+ ^
83+++ load: $-(@t (ask [count=@ud]))
84+++ page-view: $-([count=@ud] (element !!))
85+++ static-page: [load=$-(@t (ask.internal [count=@ud])) view=$-([count=@ud] (element !!))]
tests/golden/types-prelude-unit-helpers/about.txt+1−1
@@ -1,4 +1,4 @@
11source: Overview, Prelude: Hoon standard-library gates are regrouped into the prelude, with Jibb implementations.
2−tests: The actual prelude exposes bind, biff, both, clap, clef and flit with independently instantiated unit payloads. A mismatched gate argument reports both sites, an incompatible clef gate stays unsupported, and an unrelated tag stays pending.
2+tests: The actual prelude exposes bind, biff, both, clap, clef, flit and hunt with independently instantiated unit payloads. Hunt covers both ordering outcomes and absent units, with its ordering gate first as in Hoon. A mismatched gate argument reports both sites, an incompatible clef gate stays unsupported, and an unrelated tag stays pending.
33expect: parses
44expect-types: a partial inference report
tests/golden/types-prelude-unit-helpers/source.jibb+6
@@ -13,3 +13,9 @@
1313++ clef-ship (clef `"hi" `~zod |=(p=[@t @p] `~zod))
1414++ clap-bad (clap `"hi" `~zod |=(p=[@t @t] "yes"))
1515++ clef-bad (clef `"hi" `~zod |=(p=[@p @t] `"ok"))
16+++ hunt-first (hunt |=(p=[@t @t] %.y) `"a" `"b")
17+++ hunt-second (hunt |=(p=[@t @t] %.n) `"a" `"b")
18+++ hunt-left (hunt |=(p=[@t @t] %.y) ~ `"b")
19+++ hunt-right (hunt |=(p=[@t @t] %.n) `"a" ~)
20+++ hunt-bad (hunt |=(p=[@t @t] %.y) `"a" `~zod)
21+++ hunt-gate-bad (hunt |=(p=[@t @p] %.y) `"a" `"b")
tests/golden/types-prelude-unit-helpers/tokens.txt+113−1
@@ -206,4 +206,116 @@
20620615:45 tight str "ok"
20720715:49 tight glyph )
20820815:50 tight glyph )
209−15:51 NEWLINE
209+16:1 NEWLINE
210+16:1 glyph ++
211+16:4 name hunt-first
212+16:15 glyph (
213+16:16 tight name hunt
214+16:21 glyph |=(
215+16:24 tight name p
216+16:25 tight glyph =
217+16:26 tight glyph [
218+16:27 tight aura @t
219+16:30 aura @t
220+16:32 tight glyph ]
221+16:34 lit %.y
222+16:37 tight glyph )
223+16:39 glyph `
224+16:40 tight str "a"
225+16:44 glyph `
226+16:45 tight str "b"
227+16:48 tight glyph )
228+17:1 NEWLINE
229+17:1 glyph ++
230+17:4 name hunt-second
231+17:16 glyph (
232+17:17 tight name hunt
233+17:22 glyph |=(
234+17:25 tight name p
235+17:26 tight glyph =
236+17:27 tight glyph [
237+17:28 tight aura @t
238+17:31 aura @t
239+17:33 tight glyph ]
240+17:35 lit %.n
241+17:38 tight glyph )
242+17:40 glyph `
243+17:41 tight str "a"
244+17:45 glyph `
245+17:46 tight str "b"
246+17:49 tight glyph )
247+18:1 NEWLINE
248+18:1 glyph ++
249+18:4 name hunt-left
250+18:14 glyph (
251+18:15 tight name hunt
252+18:20 glyph |=(
253+18:23 tight name p
254+18:24 tight glyph =
255+18:25 tight glyph [
256+18:26 tight aura @t
257+18:29 aura @t
258+18:31 tight glyph ]
259+18:33 lit %.y
260+18:36 tight glyph )
261+18:38 lit ~
262+18:40 glyph `
263+18:41 tight str "b"
264+18:44 tight glyph )
265+19:1 NEWLINE
266+19:1 glyph ++
267+19:4 name hunt-right
268+19:15 glyph (
269+19:16 tight name hunt
270+19:21 glyph |=(
271+19:24 tight name p
272+19:25 tight glyph =
273+19:26 tight glyph [
274+19:27 tight aura @t
275+19:30 aura @t
276+19:32 tight glyph ]
277+19:34 lit %.n
278+19:37 tight glyph )
279+19:39 glyph `
280+19:40 tight str "a"
281+19:44 lit ~
282+19:45 tight glyph )
283+20:1 NEWLINE
284+20:1 glyph ++
285+20:4 name hunt-bad
286+20:13 glyph (
287+20:14 tight name hunt
288+20:19 glyph |=(
289+20:22 tight name p
290+20:23 tight glyph =
291+20:24 tight glyph [
292+20:25 tight aura @t
293+20:28 aura @t
294+20:30 tight glyph ]
295+20:32 lit %.y
296+20:35 tight glyph )
297+20:37 glyph `
298+20:38 tight str "a"
299+20:42 glyph `
300+20:43 tight lit ~zod
301+20:47 tight glyph )
302+21:1 NEWLINE
303+21:1 glyph ++
304+21:4 name hunt-gate-bad
305+21:18 glyph (
306+21:19 tight name hunt
307+21:24 glyph |=(
308+21:27 tight name p
309+21:28 tight glyph =
310+21:29 tight glyph [
311+21:30 tight aura @t
312+21:33 aura @p
313+21:35 tight glyph ]
314+21:37 lit %.y
315+21:40 tight glyph )
316+21:42 glyph `
317+21:43 tight str "a"
318+21:47 glyph `
319+21:48 tight str "b"
320+21:51 tight glyph )
321+21:52 NEWLINE
tests/golden/types-prelude-unit-helpers/tree.txt+61−1
@@ -112,4 +112,64 @@
112112 (gate-wide 15:31
113113 (face 15:34 p
114114 (cell 15:36 (aura 15:37 @p) (aura 15:40 @t)))
115− (unit 15:44 (str 15:45 "ok")))))))
115+ (unit 15:44 (str 15:45 "ok"))))))
116+ (value 16:1 hunt-first
117+ (group 16:15
118+ (call 16:16
119+ (wing 16:16 hunt)
120+ (gate-wide 16:21
121+ (face 16:24 p
122+ (cell 16:26 (aura 16:27 @t) (aura 16:30 @t)))
123+ (lit 16:34 %.y))
124+ (unit 16:39 (str 16:40 "a"))
125+ (unit 16:44 (str 16:45 "b")))))
126+ (value 17:1 hunt-second
127+ (group 17:16
128+ (call 17:17
129+ (wing 17:17 hunt)
130+ (gate-wide 17:22
131+ (face 17:25 p
132+ (cell 17:27 (aura 17:28 @t) (aura 17:31 @t)))
133+ (lit 17:35 %.n))
134+ (unit 17:40 (str 17:41 "a"))
135+ (unit 17:45 (str 17:46 "b")))))
136+ (value 18:1 hunt-left
137+ (group 18:14
138+ (call 18:15
139+ (wing 18:15 hunt)
140+ (gate-wide 18:20
141+ (face 18:23 p
142+ (cell 18:25 (aura 18:26 @t) (aura 18:29 @t)))
143+ (lit 18:33 %.y))
144+ (lit 18:38 ~)
145+ (unit 18:40 (str 18:41 "b")))))
146+ (value 19:1 hunt-right
147+ (group 19:15
148+ (call 19:16
149+ (wing 19:16 hunt)
150+ (gate-wide 19:21
151+ (face 19:24 p
152+ (cell 19:26 (aura 19:27 @t) (aura 19:30 @t)))
153+ (lit 19:34 %.n))
154+ (unit 19:39 (str 19:40 "a"))
155+ (lit 19:44 ~))))
156+ (value 20:1 hunt-bad
157+ (group 20:13
158+ (call 20:14
159+ (wing 20:14 hunt)
160+ (gate-wide 20:19
161+ (face 20:22 p
162+ (cell 20:24 (aura 20:25 @t) (aura 20:28 @t)))
163+ (lit 20:32 %.y))
164+ (unit 20:37 (str 20:38 "a"))
165+ (unit 20:42 (lit 20:43 ~zod)))))
166+ (value 21:1 hunt-gate-bad
167+ (group 21:18
168+ (call 21:19
169+ (wing 21:19 hunt)
170+ (gate-wide 21:24
171+ (face 21:27 p
172+ (cell 21:29 (aura 21:30 @t) (aura 21:33 @p)))
173+ (lit 21:37 %.y))
174+ (unit 21:42 (str 21:43 "a"))
175+ (unit 21:47 (str 21:48 "b"))))))
tests/golden/types-prelude-unit-helpers/types.txt+18
@@ -24,3 +24,21 @@ partial inference; module not checked
2424++ clap-bad (clap `"hi" `~zod |=(p=[@t @t] "yes"))
2525 ^
2626++ clef-bad: call constraint is not supported by partial inference
27+++ hunt-first: (unit @t)
28+++ hunt-second: (unit @t)
29+++ hunt-left: (unit @t)
30+++ hunt-right: (unit @t)
31+++ hunt-bad: unit payload does not fit its expected type
32+/tests/golden/types-prelude-unit-helpers/source.jibb:20:14: expected unit payload has type @t
33+++ hunt-bad (hunt |=(p=[@t @t] %.y) `"a" `~zod)
34+ ^
35+/tests/golden/types-prelude-unit-helpers/source.jibb:20:43: payload has type @p
36+++ hunt-bad (hunt |=(p=[@t @t] %.y) `"a" `~zod)
37+ ^
38+++ hunt-gate-bad: call's sample and argument types do not unify
39+/tests/golden/types-prelude-unit-helpers/source.jibb:21:19: called gate
40+++ hunt-gate-bad (hunt |=(p=[@t @p] %.y) `"a" `"b")
41+ ^
42+/tests/golden/types-prelude-unit-helpers/source.jibb:21:24: argument has type $-([@t @p] ?)
43+++ hunt-gate-bad (hunt |=(p=[@t @p] %.y) `"a" `"b")
44+ ^
tests/golden/types-record-cast-context/types.txt+1−1
@@ -46,4 +46,4 @@ partial inference; module not checked
4646++ forced: explicit capital constraints are not supported by partial inference
4747++ pending-tag: tag needs context in partial inference
4848++ pending-null: `~` needs context in partial inference
49−++ unknown: cast constraint is not supported by partial inference
49+++ unknown: $-(A [left=A right=A])
tests/golden/types-recursion-scc-import/source.jibb+1−1
@@ -1,3 +1,3 @@
11/= lib /ui/lib
2−++ text ^- @t (left.lib "hello")
2+++ text-value ^- @t (left.lib "hello")
33++ ship ^- @p (right.lib "hello")
tests/golden/types-recursion-scc-import/tokens.txt+7−7
@@ -6,13 +6,13 @@
661:12 tight knot lib
772:1 NEWLINE
882:1 glyph ++
9−2:4 name text
10−2:9 glyph ^-
11−2:12 aura @t
12−2:15 glyph (
13−2:16 tight wing left.lib
14−2:25 str "hello"
15−2:32 tight glyph )
9+2:4 name text-value
10+2:15 glyph ^-
11+2:18 aura @t
12+2:21 glyph (
13+2:22 tight wing left.lib
14+2:31 str "hello"
15+2:38 tight glyph )
16163:1 NEWLINE
17173:1 glyph ++
18183:4 name ship
tests/golden/types-recursion-scc-import/tree.txt+5−5
@@ -1,10 +1,10 @@
11(module
22 (jibb 1:1 lib /ui/lib)
3− (value 2:1 text
4− (cast 2:9
5− (aura 2:12 @t)
6− (group 2:15
7− (call 2:16 (wing 2:16 left.lib) (str 2:25 "hello")))))
3+ (value 2:1 text-value
4+ (cast 2:15
5+ (aura 2:18 @t)
6+ (group 2:21
7+ (call 2:22 (wing 2:22 left.lib) (str 2:31 "hello")))))
88 (value 3:1 ship
99 (cast 3:9
1010 (aura 3:12 @p)
tests/golden/types-recursion-scc-import/types.txt+1−1
@@ -1,3 +1,3 @@
11partial inference; module not checked
2−++ text: @t
2+++ text-value: @t
33++ ship: @p
tests/golden/types-scope-library-poke/types.txt+2−1
@@ -1,2 +1,3 @@
11partial inference; module not checked
2−module has conflicting names
2++$ poke: not checked
3+++ value: @t
tests/golden/types-scope-root-api/types.txt+1−1
@@ -1,2 +1,2 @@
11partial inference; module not checked
2−module kind or scope needs unsupported inference
2++$ poke: not checked
tests/golden/types-union-finite-context/source.jibb+1−1
@@ -35,7 +35,7 @@
3535 * %stay
3636++ binder |= x=input ^- ?
3737 ?- x
38− [%p flag text] flag
38+ [%p flag words] flag
3939 %other %.n
4040++ unresolved |= x=input ^- (list @t)
4141 ~& %pending
tests/golden/types-union-finite-context/tokens.txt+3−3
@@ -244,9 +244,9 @@
24424438:5 glyph [
24524538:6 tight lit %p
24624638:9 name flag
247−38:14 name text
248−38:18 tight glyph ]
249−38:20 name flag
247+38:14 name words
248+38:19 tight glyph ]
249+38:21 name flag
25025039:5 NEWLINE
25125139:5 lit %other
25225239:12 lit %.n
tests/golden/types-union-finite-context/tree.txt+2−2
@@ -111,8 +111,8 @@
111111 (branch 37:3
112112 (wing 37:6 x)
113113 (arm 38:5
114− (cell 38:5 (lit 38:6 %p) (bind 38:9 flag) (bind 38:14 text))
115− (wing 38:20 flag))
114+ (cell 38:5 (lit 38:6 %p) (bind 38:9 flag) (bind 38:14 words))
115+ (wing 38:21 flag))
116116 (arm 39:5 (lit 39:5 %other) (lit 39:12 %.n)))))))
117117 (value 40:1 unresolved
118118 (gate 40:15
tests/golden/types-union-nonwing-subject/source.jibb+13−13
@@ -8,24 +8,24 @@
88++ passthrough |= x=input x
99++ grouped |= x=input ^- (list @t)
1010 ?- (x)
11− [%item flag text] ~[text]
11+ [%item flag words] ~[words]
1212 %none ~
1313++ call |= x=input ^- (list @t)
1414 ?- (local-id x)
15− [%item flag text] ~[text]
15+ [%item flag words] ~[words]
1616 %none ~
1717++ nested |= x=input ^- result
1818 ?- (local-id (passthrough x))
19− [%item flag text] %good
19+ [%item flag words] %good
2020 %none %empty
2121++ finite |= x=input ^- (list @t)
2222 ?- (local-id x)
23− [%item %.y text] ~[text]
24− [%item %.n text] ~[]
23+ [%item %.y words] ~[words]
24+ [%item %.n words] ~[]
2525 %none ~
2626++ wrong |= x=input ^- result
2727 ?- (local-id x)
28− [%item flag text] %missing
28+ [%item flag words] %missing
2929 %none %empty
3030++ missing |= x=input ^- (list @t)
3131 ?- (local-id x)
@@ -34,7 +34,7 @@
3434 ?- (local-id x)
3535 %none ~
3636 %none ~
37− [%item flag text] ~[text]
37+ [%item flag words] ~[words]
3838++ shadow |= x=input ^- result
3939 ?- (local-id x)
4040 [%item flag same] %good
@@ -42,19 +42,19 @@
4242++ pending |= x=input ^- result
4343 ~& %dangling
4444 ?- (local-id x)
45− [%item flag text] %good
45+ [%item flag words] %good
4646 %none %empty
4747++ unknown |= x ^- (list @t)
4848 ?- (local-id x)
49− [%item flag text] ~[text]
49+ [%item flag words] ~[words]
5050 %none ~
5151++ nonunion |= x=@t ^- (list @t)
5252 ?- (local-id x)
53− [%item flag text] ~[text]
53+ [%item flag words] ~[words]
5454 %none ~
5555++ explicit |= [x=input y=A] ^- (list A)
5656 ?- (local-id x)
57− [%item flag text] ~["text"]
57+ [%item flag words] ~["text"]
5858 %none ~
5959+$ payload |$ [A]
6060 [%present value=A]
@@ -65,12 +65,12 @@
6565 %none ~
6666++ bad-subject |= x=input ^- result
6767 ?- (passthrough "wrong")
68− [%item flag text] %missing
68+ [%item flag words] %missing
6969 %none %empty
7070++ first-of |= [a b] a
7171++ pending-subject |= x=input ^- result
7272 ?- (first-of x %dangling)
73− [%item flag text] %good
73+ [%item flag words] %good
7474 %none %empty
7575++ duplicate-flag-subject |= x=@t ^- (list @t)
7676 ?- (passthrough x)
tests/golden/types-union-nonwing-subject/tokens.txt+54−54
@@ -56,11 +56,11 @@
565611:5 glyph [
575711:6 tight lit %item
585811:12 name flag
59−11:17 name text
60−11:21 tight glyph ]
61−11:23 glyph ~[
62−11:25 tight name text
63−11:29 tight glyph ]
59+11:17 name words
60+11:22 tight glyph ]
61+11:24 glyph ~[
62+11:26 tight name words
63+11:31 tight glyph ]
646412:5 NEWLINE
656512:5 lit %none
666612:11 lit ~
@@ -88,11 +88,11 @@
888815:5 glyph [
898915:6 tight lit %item
909015:12 name flag
91−15:17 name text
92−15:21 tight glyph ]
93−15:23 glyph ~[
94−15:25 tight name text
95−15:29 tight glyph ]
91+15:17 name words
92+15:22 tight glyph ]
93+15:24 glyph ~[
94+15:26 tight name words
95+15:31 tight glyph ]
969616:5 NEWLINE
979716:5 lit %none
989816:11 lit ~
@@ -120,9 +120,9 @@
12012019:5 glyph [
12112119:6 tight lit %item
12212219:12 name flag
123−19:17 name text
124−19:21 tight glyph ]
125−19:23 lit %good
123+19:17 name words
124+19:22 tight glyph ]
125+19:24 lit %good
12612620:5 NEWLINE
12712720:5 lit %none
12812820:11 lit %empty
@@ -150,19 +150,19 @@
15015023:5 glyph [
15115123:6 tight lit %item
15215223:12 lit %.y
153−23:16 name text
154−23:20 tight glyph ]
155−23:22 glyph ~[
156−23:24 tight name text
157−23:28 tight glyph ]
153+23:16 name words
154+23:21 tight glyph ]
155+23:23 glyph ~[
156+23:25 tight name words
157+23:30 tight glyph ]
15815824:5 NEWLINE
15915924:5 glyph [
16016024:6 tight lit %item
16116124:12 lit %.n
162−24:16 name text
163−24:20 tight glyph ]
164−24:22 glyph ~[
165−24:24 tight glyph ]
162+24:16 name words
163+24:21 tight glyph ]
164+24:23 glyph ~[
165+24:25 tight glyph ]
16616625:5 NEWLINE
16716725:5 lit %none
16816825:11 lit ~
@@ -187,9 +187,9 @@
18718728:5 glyph [
18818828:6 tight lit %item
18918928:12 name flag
190−28:17 name text
191−28:21 tight glyph ]
192−28:23 lit %missing
190+28:17 name words
191+28:22 tight glyph ]
192+28:24 lit %missing
19319329:5 NEWLINE
19419429:5 lit %none
19519529:11 lit %empty
@@ -246,11 +246,11 @@
24624637:5 glyph [
24724737:6 tight lit %item
24824837:12 name flag
249−37:17 name text
250−37:21 tight glyph ]
251−37:23 glyph ~[
252−37:25 tight name text
253−37:29 tight glyph ]
249+37:17 name words
250+37:22 tight glyph ]
251+37:24 glyph ~[
252+37:26 tight name words
253+37:31 tight glyph ]
25425438:1 DEDENT
25525538:1 DEDENT
25625638:1 NEWLINE
@@ -302,9 +302,9 @@
30230245:7 glyph [
30330345:8 tight lit %item
30430445:14 name flag
305−45:19 name text
306−45:23 tight glyph ]
307−45:25 lit %good
305+45:19 name words
306+45:24 tight glyph ]
307+45:26 lit %good
30830846:7 NEWLINE
30930946:7 lit %none
31031046:13 lit %empty
@@ -331,11 +331,11 @@
33133149:5 glyph [
33233249:6 tight lit %item
33333349:12 name flag
334−49:17 name text
335−49:21 tight glyph ]
336−49:23 glyph ~[
337−49:25 tight name text
338−49:29 tight glyph ]
334+49:17 name words
335+49:22 tight glyph ]
336+49:24 glyph ~[
337+49:26 tight name words
338+49:31 tight glyph ]
33933950:5 NEWLINE
34034050:5 lit %none
34134150:11 lit ~
@@ -363,11 +363,11 @@
36336353:5 glyph [
36436453:6 tight lit %item
36536553:12 name flag
366−53:17 name text
367−53:21 tight glyph ]
368−53:23 glyph ~[
369−53:25 tight name text
370−53:29 tight glyph ]
366+53:17 name words
367+53:22 tight glyph ]
368+53:24 glyph ~[
369+53:26 tight name words
370+53:31 tight glyph ]
37137154:5 NEWLINE
37237254:5 lit %none
37337354:11 lit ~
@@ -400,11 +400,11 @@
40040057:5 glyph [
40140157:6 tight lit %item
40240257:12 name flag
403−57:17 name text
404−57:21 tight glyph ]
405−57:23 glyph ~[
406−57:25 tight str "text"
407−57:31 tight glyph ]
403+57:17 name words
404+57:22 tight glyph ]
405+57:24 glyph ~[
406+57:26 tight str "text"
407+57:32 tight glyph ]
40840858:5 NEWLINE
40940958:5 lit %none
41041058:11 lit ~
@@ -486,9 +486,9 @@
48648668:5 glyph [
48748768:6 tight lit %item
48848868:12 name flag
489−68:17 name text
490−68:21 tight glyph ]
491−68:23 lit %missing
489+68:17 name words
490+68:22 tight glyph ]
491+68:24 lit %missing
49249269:5 NEWLINE
49349369:5 lit %none
49449469:11 lit %empty
@@ -523,9 +523,9 @@
52352373:5 glyph [
52452473:6 tight lit %item
52552573:12 name flag
526−73:17 name text
527−73:21 tight glyph ]
528−73:23 lit %good
526+73:17 name words
527+73:22 tight glyph ]
528+73:24 lit %good
52952974:5 NEWLINE
53053074:5 lit %none
53153174:11 lit %empty
tests/golden/types-union-nonwing-subject/tree.txt+26−26
@@ -23,8 +23,8 @@
2323 (branch 10:3
2424 (group 10:6 (wing 10:7 x))
2525 (arm 11:5
26− (cell 11:5 (lit 11:6 %item) (bind 11:12 flag) (bind 11:17 text))
27− (list 11:23 (wing 11:25 text)))
26+ (cell 11:5 (lit 11:6 %item) (bind 11:12 flag) (bind 11:17 words))
27+ (list 11:24 (wing 11:26 words)))
2828 (arm 12:5 (lit 12:5 %none) (lit 12:11 ~)))))))
2929 (value 13:1 call
3030 (gate 13:9
@@ -36,8 +36,8 @@
3636 (group 14:6
3737 (call 14:7 (wing 14:7 local-id) (wing 14:16 x)))
3838 (arm 15:5
39− (cell 15:5 (lit 15:6 %item) (bind 15:12 flag) (bind 15:17 text))
40− (list 15:23 (wing 15:25 text)))
39+ (cell 15:5 (lit 15:6 %item) (bind 15:12 flag) (bind 15:17 words))
40+ (list 15:24 (wing 15:26 words)))
4141 (arm 16:5 (lit 16:5 %none) (lit 16:11 ~)))))))
4242 (value 17:1 nested
4343 (gate 17:11
@@ -52,8 +52,8 @@
5252 (group 18:16
5353 (call 18:17 (wing 18:17 passthrough) (wing 18:29 x)))))
5454 (arm 19:5
55− (cell 19:5 (lit 19:6 %item) (bind 19:12 flag) (bind 19:17 text))
56− (lit 19:23 %good))
55+ (cell 19:5 (lit 19:6 %item) (bind 19:12 flag) (bind 19:17 words))
56+ (lit 19:24 %good))
5757 (arm 20:5 (lit 20:5 %none) (lit 20:11 %empty)))))))
5858 (value 21:1 finite
5959 (gate 21:11
@@ -65,11 +65,11 @@
6565 (group 22:6
6666 (call 22:7 (wing 22:7 local-id) (wing 22:16 x)))
6767 (arm 23:5
68− (cell 23:5 (lit 23:6 %item) (lit 23:12 %.y) (bind 23:16 text))
69− (list 23:22 (wing 23:24 text)))
68+ (cell 23:5 (lit 23:6 %item) (lit 23:12 %.y) (bind 23:16 words))
69+ (list 23:23 (wing 23:25 words)))
7070 (arm 24:5
71− (cell 24:5 (lit 24:6 %item) (lit 24:12 %.n) (bind 24:16 text))
72− (list 24:22))
71+ (cell 24:5 (lit 24:6 %item) (lit 24:12 %.n) (bind 24:16 words))
72+ (list 24:23))
7373 (arm 25:5 (lit 25:5 %none) (lit 25:11 ~)))))))
7474 (value 26:1 wrong
7575 (gate 26:10
@@ -81,8 +81,8 @@
8181 (group 27:6
8282 (call 27:7 (wing 27:7 local-id) (wing 27:16 x)))
8383 (arm 28:5
84− (cell 28:5 (lit 28:6 %item) (bind 28:12 flag) (bind 28:17 text))
85− (lit 28:23 %missing))
84+ (cell 28:5 (lit 28:6 %item) (bind 28:12 flag) (bind 28:17 words))
85+ (lit 28:24 %missing))
8686 (arm 29:5 (lit 29:5 %none) (lit 29:11 %empty)))))))
8787 (value 30:1 missing
8888 (gate 30:12
@@ -106,8 +106,8 @@
106106 (arm 35:5 (lit 35:5 %none) (lit 35:11 ~))
107107 (arm 36:5 (lit 36:5 %none) (lit 36:11 ~))
108108 (arm 37:5
109− (cell 37:5 (lit 37:6 %item) (bind 37:12 flag) (bind 37:17 text))
110− (list 37:23 (wing 37:25 text))))))))
109+ (cell 37:5 (lit 37:6 %item) (bind 37:12 flag) (bind 37:17 words))
110+ (list 37:24 (wing 37:26 words))))))))
111111 (value 38:1 shadow
112112 (gate 38:11
113113 (face 38:14 x (ref 38:16 input))
@@ -134,8 +134,8 @@
134134 (group 44:8
135135 (call 44:9 (wing 44:9 local-id) (wing 44:18 x)))
136136 (arm 45:7
137− (cell 45:7 (lit 45:8 %item) (bind 45:14 flag) (bind 45:19 text))
138− (lit 45:25 %good))
137+ (cell 45:7 (lit 45:8 %item) (bind 45:14 flag) (bind 45:19 words))
138+ (lit 45:26 %good))
139139 (arm 46:7 (lit 46:7 %none) (lit 46:13 %empty)))))))))
140140 (value 47:1 unknown
141141 (gate 47:12
@@ -147,8 +147,8 @@
147147 (group 48:6
148148 (call 48:7 (wing 48:7 local-id) (wing 48:16 x)))
149149 (arm 49:5
150− (cell 49:5 (lit 49:6 %item) (bind 49:12 flag) (bind 49:17 text))
151− (list 49:23 (wing 49:25 text)))
150+ (cell 49:5 (lit 49:6 %item) (bind 49:12 flag) (bind 49:17 words))
151+ (list 49:24 (wing 49:26 words)))
152152 (arm 50:5 (lit 50:5 %none) (lit 50:11 ~)))))))
153153 (value 51:1 nonunion
154154 (gate 51:13
@@ -160,8 +160,8 @@
160160 (group 52:6
161161 (call 52:7 (wing 52:7 local-id) (wing 52:16 x)))
162162 (arm 53:5
163− (cell 53:5 (lit 53:6 %item) (bind 53:12 flag) (bind 53:17 text))
164− (list 53:23 (wing 53:25 text)))
163+ (cell 53:5 (lit 53:6 %item) (bind 53:12 flag) (bind 53:17 words))
164+ (list 53:24 (wing 53:26 words)))
165165 (arm 54:5 (lit 54:5 %none) (lit 54:11 ~)))))))
166166 (value 55:1 explicit
167167 (gate 55:13
@@ -175,8 +175,8 @@
175175 (group 56:6
176176 (call 56:7 (wing 56:7 local-id) (wing 56:16 x)))
177177 (arm 57:5
178− (cell 57:5 (lit 57:6 %item) (bind 57:12 flag) (bind 57:17 text))
179− (list 57:23 (str 57:25 "text")))
178+ (cell 57:5 (lit 57:6 %item) (bind 57:12 flag) (bind 57:17 words))
179+ (list 57:24 (str 57:26 "text")))
180180 (arm 58:5 (lit 58:5 %none) (lit 58:11 ~)))))))
181181 (mold 59:1 payload
182182 (generic 59:12 A
@@ -211,8 +211,8 @@
211211 (group 67:6
212212 (call 67:7 (wing 67:7 passthrough) (str 67:19 "wrong")))
213213 (arm 68:5
214− (cell 68:5 (lit 68:6 %item) (bind 68:12 flag) (bind 68:17 text))
215− (lit 68:23 %missing))
214+ (cell 68:5 (lit 68:6 %item) (bind 68:12 flag) (bind 68:17 words))
215+ (lit 68:24 %missing))
216216 (arm 69:5 (lit 69:5 %none) (lit 69:11 %empty)))))))
217217 (value 70:1 first-of
218218 (gate 70:13
@@ -228,8 +228,8 @@
228228 (group 72:6
229229 (call 72:7 (wing 72:7 first-of) (wing 72:16 x) (lit 72:18 %dangling)))
230230 (arm 73:5
231− (cell 73:5 (lit 73:6 %item) (bind 73:12 flag) (bind 73:17 text))
232− (lit 73:23 %good))
231+ (cell 73:5 (lit 73:6 %item) (bind 73:12 flag) (bind 73:17 words))
232+ (lit 73:24 %good))
233233 (arm 74:5 (lit 74:5 %none) (lit 74:11 %empty)))))))
234234 (value 75:1 duplicate-flag-subject
235235 (gate 75:27
tests/golden/types-union-nonwing-subject/types.txt+3−3
@@ -11,9 +11,9 @@ partial inference; module not checked
1111/tests/golden/types-union-nonwing-subject/source.jibb:26:24: expected union
1212++ wrong |= x=input ^- result
1313 ^
14−/tests/golden/types-union-nonwing-subject/source.jibb:28:23: tag
15− [%item flag text] %missing
16− ^
14+/tests/golden/types-union-nonwing-subject/source.jibb:28:24: tag
15+ [%item flag words] %missing
16+ ^
1717++ missing: missing union case [%item [flag=? text=@t]]
1818++ dead: branch arm is covered by earlier arms
1919/tests/golden/types-union-nonwing-subject/source.jibb:36:5: covered arm
tests/golden/types-union-polymorphic-identity/types.txt+1−1
@@ -15,7 +15,7 @@ partial inference; module not checked
1515++ repeated: $-([a=(choice A) b=(choice A)] (choice A))
1616++ mismatch: call constraint is not supported by partial inference
1717++ face-result: $-(local-msg [field=local-msg flag=?])
18−++ explicit: call constraint is not supported by partial inference
18+++ explicit: explicit capital constraints are not supported by partial inference
1919++ pending: tag needs context in partial inference
2020++ unresolved: tag needs context in partial inference
2121++ same-choice: $-([a=(choice A) b=(choice A)] (choice A))
tests/golden/types-unit-context/source.jibb+3−3
@@ -16,8 +16,8 @@
1616++ accept |= x=(unit msg) x
1717++ call (accept `%stay)
1818++ bad-call (accept `%bad)
19−++ field ^- record [`%go ~[`"hi"]]
20−++ field-bad ^- record [`%bad ~[`"hi"]]
19+++ field-value ^- record [`%go ~[`"hi"]]
20+++ field-value-bad ^- record [`%bad ~[`"hi"]]
2121++ mimic-mismatch ^- (mimic @t) `"hi"
2222++ without-context `%go
2323++ pending
@@ -31,7 +31,7 @@
3131+$ alt
3232 %go
3333 %stay
34−++ field-wrong-payload ^- record [`%go ~[`~zod]]
34+++ field-value-wrong-payload ^- record [`%go ~[`~zod]]
3535++ wrong-name ^- record [wrong=`%go xs=~[`"hi"]]
3636++ wrong-union |= x=alt ^- record [`x ~[`"hi"]]
3737++ no-field-context |= x=A ^- [a=A] [wrong=x]
tests/golden/types-unit-context/tokens.txt+33−33
@@ -169,30 +169,30 @@
16916918:26 tight glyph )
17017019:1 NEWLINE
17117119:1 glyph ++
172−19:4 name field
173−19:10 glyph ^-
174−19:13 name record
175−19:20 glyph [
176−19:21 tight glyph `
177−19:22 tight lit %go
178−19:26 glyph ~[
179−19:28 tight glyph `
180−19:29 tight str "hi"
181−19:33 tight glyph ]
182−19:34 tight glyph ]
172+19:4 name field-value
173+19:16 glyph ^-
174+19:19 name record
175+19:26 glyph [
176+19:27 tight glyph `
177+19:28 tight lit %go
178+19:32 glyph ~[
179+19:34 tight glyph `
180+19:35 tight str "hi"
181+19:39 tight glyph ]
182+19:40 tight glyph ]
18318320:1 NEWLINE
18418420:1 glyph ++
185−20:4 name field-bad
186−20:14 glyph ^-
187−20:17 name record
188−20:24 glyph [
189−20:25 tight glyph `
190−20:26 tight lit %bad
191−20:31 glyph ~[
192−20:33 tight glyph `
193−20:34 tight str "hi"
194−20:38 tight glyph ]
195−20:39 tight glyph ]
185+20:4 name field-value-bad
186+20:20 glyph ^-
187+20:23 name record
188+20:30 glyph [
189+20:31 tight glyph `
190+20:32 tight lit %bad
191+20:37 glyph ~[
192+20:39 tight glyph `
193+20:40 tight str "hi"
194+20:44 tight glyph ]
195+20:45 tight glyph ]
19619621:1 NEWLINE
19719721:1 glyph ++
19819821:4 name mimic-mismatch
@@ -278,17 +278,17 @@
27827834:1 DEDENT
27927934:1 NEWLINE
28028034:1 glyph ++
281−34:4 name field-wrong-payload
282−34:24 glyph ^-
283−34:27 name record
284−34:34 glyph [
285−34:35 tight glyph `
286−34:36 tight lit %go
287−34:40 glyph ~[
288−34:42 tight glyph `
289−34:43 tight lit ~zod
290−34:47 tight glyph ]
291−34:48 tight glyph ]
281+34:4 name field-value-wrong-payload
282+34:30 glyph ^-
283+34:33 name record
284+34:40 glyph [
285+34:41 tight glyph `
286+34:42 tight lit %go
287+34:46 glyph ~[
288+34:48 tight glyph `
289+34:49 tight lit ~zod
290+34:53 tight glyph ]
291+34:54 tight glyph ]
29229235:1 NEWLINE
29329335:1 glyph ++
29429435:4 name wrong-name
tests/golden/types-unit-context/tree.txt+21−21
@@ -70,20 +70,20 @@
7070 (call 18:14
7171 (wing 18:14 accept)
7272 (unit 18:21 (lit 18:22 %bad)))))
73− (value 19:1 field
74− (cast 19:10
75− (ref 19:13 record)
76− (tuple 19:20
77− (unit 19:21 (lit 19:22 %go))
78− (list 19:26
79− (unit 19:28 (str 19:29 "hi"))))))
80− (value 20:1 field-bad
81− (cast 20:14
82− (ref 20:17 record)
83− (tuple 20:24
84− (unit 20:25 (lit 20:26 %bad))
85− (list 20:31
86− (unit 20:33 (str 20:34 "hi"))))))
73+ (value 19:1 field-value
74+ (cast 19:16
75+ (ref 19:19 record)
76+ (tuple 19:26
77+ (unit 19:27 (lit 19:28 %go))
78+ (list 19:32
79+ (unit 19:34 (str 19:35 "hi"))))))
80+ (value 20:1 field-value-bad
81+ (cast 20:20
82+ (ref 20:23 record)
83+ (tuple 20:30
84+ (unit 20:31 (lit 20:32 %bad))
85+ (list 20:37
86+ (unit 20:39 (str 20:40 "hi"))))))
8787 (value 21:1 mimic-mismatch
8888 (cast 21:19
8989 (apply 21:22 mimic (aura 21:29 @t))
@@ -120,13 +120,13 @@
120120 (unit 30:29 (str 30:30 "hi")))))
121121 (mold 31:1 alt
122122 (union 32:3 (const 32:3 %go) (const 33:3 %stay)))
123− (value 34:1 field-wrong-payload
124− (cast 34:24
125− (ref 34:27 record)
126− (tuple 34:34
127− (unit 34:35 (lit 34:36 %go))
128− (list 34:40
129− (unit 34:42 (lit 34:43 ~zod))))))
123+ (value 34:1 field-value-wrong-payload
124+ (cast 34:30
125+ (ref 34:33 record)
126+ (tuple 34:40
127+ (unit 34:41 (lit 34:42 %go))
128+ (list 34:46
129+ (unit 34:48 (lit 34:49 ~zod))))))
130130 (value 35:1 wrong-name
131131 (cast 35:15
132132 (ref 35:18 record)
tests/golden/types-unit-context/types.txt+15−15
@@ -43,14 +43,14 @@ partial inference; module not checked
4343/tests/golden/types-unit-context/source.jibb:18:22: tag
4444++ bad-call (accept `%bad)
4545 ^
46−++ field: [u=(unit msg) xs=(list (unit @t))]
47−++ field-bad: msg has no case `%bad`
48−/tests/golden/types-unit-context/source.jibb:20:17: expected union
49−++ field-bad ^- record [`%bad ~[`"hi"]]
50− ^
51−/tests/golden/types-unit-context/source.jibb:20:26: tag
52−++ field-bad ^- record [`%bad ~[`"hi"]]
53− ^
46+++ field-value: [u=(unit msg) xs=(list (unit @t))]
47+++ field-value-bad: msg has no case `%bad`
48+/tests/golden/types-unit-context/source.jibb:20:23: expected union
49+++ field-value-bad ^- record [`%bad ~[`"hi"]]
50+ ^
51+/tests/golden/types-unit-context/source.jibb:20:32: tag
52+++ field-value-bad ^- record [`%bad ~[`"hi"]]
53+ ^
5454++ mimic-mismatch: cast constraint is not supported by partial inference
5555++ without-context: tag needs context in partial inference
5656++ pending: tag needs context in partial inference
@@ -58,13 +58,13 @@ partial inference; module not checked
5858++ preserve: $-(A (unit A))
5959++ force: explicit capital constraints are not supported by partial inference
6060+$ alt: cases proven disjoint; mold not checked
61−++ field-wrong-payload: unit payload does not fit its expected type
62−/tests/golden/types-unit-context/source.jibb:34:27: expected unit payload has type @t
63−++ field-wrong-payload ^- record [`%go ~[`~zod]]
64− ^
65−/tests/golden/types-unit-context/source.jibb:34:43: payload has type @p
66−++ field-wrong-payload ^- record [`%go ~[`~zod]]
67− ^
61+++ field-value-wrong-payload: unit payload does not fit its expected type
62+/tests/golden/types-unit-context/source.jibb:34:33: expected unit payload has type @t
63+++ field-value-wrong-payload ^- record [`%go ~[`~zod]]
64+ ^
65+/tests/golden/types-unit-context/source.jibb:34:49: payload has type @p
66+++ field-value-wrong-payload ^- record [`%go ~[`~zod]]
67+ ^
6868++ wrong-name: cast mold and expression type do not unify
6969/tests/golden/types-unit-context/source.jibb:35:18: cast mold
7070++ wrong-name ^- record [wrong=`%go xs=~[`"hi"]]
tests/lib/jibb-buttons.hoonnew file+81
@@ -0,0 +1,81 @@
1+:: Full checking for the Grammar's documented buttons library only.
2+/+ jibb
3+/* prelude %jibb /lib/jibb/prelude/jibb
4+/* internal %jibb /lib/jibb/internal/jibb
5+/* source %jibb /tests/golden/doc-grammar-02-buttons/source/jibb
6+/* valid %txt /tests/type-buttons/valid/txt
7+/* expected %txt /tests/type-buttons/expected/txt
8+/* error %txt /tests/type-buttons/error/txt
9+|%
10+++ text
11+ |= lines=wain
12+ ^- @t
13+ (rap 3 (turn lines |=(line=@t (cat 3 line '\0a'))))
14+::
15+++ buttons-detailed
16+ |= [src=@t prepared=iprelude:jibb]
17+ ^- jfile-detailed-result:jibb
18+ =/ at=path /ui/components/buttons/jibb
19+ (infer-jibb-file-detailed:jibb at src ~ ~ ~ ~[at] values.prepared molds.prepared ~ `iface.prepared)
20+::
21+++ buttons-legacy
22+ |= [src=@t prepared=iprelude:jibb]
23+ ^- jfile-result:jibb
24+ =/ at=path /ui/components/buttons/jibb
25+ (infer-jibb-file:jibb at src ~ ~ ~ ~[at] values.prepared molds.prepared ~ `iface.prepared)
26+::
27+++ buttons-interface-errors
28+ |= [label=tape checked=ifile:jibb]
29+ ^- (list tape)
30+ =/ labelled=(unit ischeme:jibb) (ienv-lookup:jibb %labelled values.checked)
31+ ?~ labelled ~[(weld label ": labelled is missing")]
32+ =/ wide=(unit ischeme:jibb) (ienv-lookup:jibb %wide values.checked)
33+ ?~ wide ~[(weld label ": wide is missing")]
34+ =/ lt=itype:jibb (canonical-itype:jibb typ.u.labelled vars.u.labelled)
35+ =/ wt=itype:jibb (canonical-itype:jibb typ.u.wide vars.u.wide)
36+ =/ actual=@t
37+ (of-wain:format ~[(crip "labelled: {(show-itype:jibb lt ~)}") (crip "wide: {(show-itype:jibb wt ~)}")])
38+ ?. =((to-wain:format (cat 3 actual '\0a')) expected)
39+ ~[(weld label ": valid definition types differ")]
40+ ~
41+::
42+++ buttons-error-matches
43+ |= actual=@t
44+ ^- ?
45+ =((to-wain:format (cat 3 actual '\0a')) error)
46+::
47+++ buttons-errors
48+ |= [public=@t private=@t full=@t valid-source=@t]
49+ ^- (list tape)
50+ =/ prepared=(unit iprelude:jibb)
51+ (prepare-prelude-with-internal:jibb public private)
52+ ?~ prepared ~["buttons prelude did not prepare"]
53+ =/ detailed=jfile-detailed-result:jibb (buttons-detailed valid-source u.prepared)
54+ =/ legacy=jfile-result:jibb (buttons-legacy valid-source u.prepared)
55+ =/ failures=(list tape)
56+ ?: ?=(%| -.detailed)
57+ ~[(weld "detailed valid buttons rejected: " (trip message.p.detailed))]
58+ (buttons-interface-errors "detailed" iface.p.detailed)
59+ =? failures ?=(%| -.legacy)
60+ [(weld "legacy valid buttons rejected: " (trip p.legacy)) failures]
61+ =? failures ?=(%& -.legacy)
62+ (weld (buttons-interface-errors "legacy" iface.p.legacy) failures)
63+ =/ detailed-full=jfile-detailed-result:jibb (buttons-detailed full u.prepared)
64+ =? failures ?=(%& -.detailed-full)
65+ ["detailed full buttons accepted" failures]
66+ =? failures ?=(%| -.detailed-full)
67+ ?: (buttons-error-matches message.p.detailed-full) failures
68+ ["detailed full buttons error or location differs" failures]
69+ =/ legacy-full=jfile-result:jibb (buttons-legacy full u.prepared)
70+ =? failures ?=(%& -.legacy-full)
71+ ["legacy full buttons accepted" failures]
72+ =? failures ?=(%| -.legacy-full)
73+ ?: (buttons-error-matches p.legacy-full) failures
74+ ["legacy full buttons error or location differs" failures]
75+ failures
76+::
77+++ test-buttons
78+ ^- tang
79+ =/ failures=(list tape) (buttons-errors prelude internal source (text valid))
80+ (turn failures |=(reason=tape leaf+reason))
81+--
tests/lib/jibb-deferred-prepared.hoonnew file+114
@@ -0,0 +1,114 @@
1+:: Prepared-prelude initializer recovery remains a partial report only.
2+/+ jibb
3+/* prelude %jibb /lib/jibb/prelude/jibb
4+/* internal %jibb /lib/jibb/internal/jibb
5+/* good %txt /tests/type-deferred-prepared/good/txt
6+/* tuple-only %txt /tests/type-deferred-prepared/tuple-only/txt
7+/* wrong-unit %txt /tests/type-deferred-prepared/wrong-unit/txt
8+/* wrong-draft %txt /tests/type-deferred-prepared/wrong-draft/txt
9+/* unrelated-tag %txt /tests/type-deferred-prepared/unrelated-tag/txt
10+/* mold-collision %txt /tests/type-deferred-prepared/mold-collision/txt
11+/* no-final-cast %txt /tests/type-deferred-prepared/no-final-cast/txt
12+/* no-prelude %txt /tests/type-deferred-prepared/no-prelude/txt
13+/* main-source %txt /tests/type-deferred-prepared/main/txt
14+/* imported %txt /tests/type-deferred-prepared/imported/txt
15+/* expected %txt /tests/type-deferred-prepared/expected/txt
16+/* expected-control %txt /tests/type-deferred-prepared/expected-control/txt
17+/* expected-tuple-only %txt /tests/type-deferred-prepared/expected-tuple-only/txt
18+|%
19+++ text
20+ |= lines=wain
21+ ^- @t
22+ (rap 3 (turn lines |=(line=@t (cat 3 line '\0a'))))
23+++ check-prepared
24+ |= [where=path source=wain valid=?]
25+ ^- tang
26+ ?~ source ~[leaf+"source fixture missing"]
27+ =/ src=@t (text source)
28+ =/ parsed (parse:jibb where src)
29+ ?: ?=(%| -.parsed) ~[leaf+"source does not parse"]
30+ =/ prepared=(unit iprelude:jibb) (prepare-prelude-with-internal:jibb prelude internal)
31+ ?~ prepared ~[leaf+"prelude unavailable"]
32+ =/ recovered=? ?=(^ (dg-root-prepared:jibb where src u.prepared))
33+ ?. =(valid recovered) ~[leaf+"prepared initializer transaction result changed"]
34+ ~
35+++ check-no-prelude
36+ ^- tang
37+ =/ at=path /ui/prepared/jibb
38+ =/ src=@t (text no-prelude)
39+ ?: ?=(^ (dg-root-source:jibb at src))
40+ ~[leaf+"no-prelude source transaction recovered tuple initializer"]
41+ =/ legacy=jfile-result:jibb
42+ (infer-jibb-file:jibb at src ~ ~ ~ ~[at] ~ ~ ~ ~)
43+ ?: ?=(%& -.legacy) ~[leaf+"no-prelude resolver published recovered tuple initializer"]
44+ ~
45+++ check-ordinary
46+ ^- tang
47+ =/ prepared=(unit iprelude:jibb) (prepare-prelude-with-internal:jibb prelude internal)
48+ ?~ prepared ~[leaf+"prelude unavailable"]
49+ =/ at=path /ui/prepared/jibb
50+ =/ ordinary=jfile-result:jibb
51+ (infer-jibb-file:jibb at (text good) ~ ~ ~ ~[at] values.u.prepared molds.u.prepared ~ `iface.u.prepared)
52+ ?: ?=(%& -.ordinary) ~[leaf+"ordinary full-module path published recovered initializer"]
53+ ~
54+++ check-report
55+ |= [source=wain wanted=wain]
56+ ^- tang
57+ ?~ source ~[leaf+"report source fixture missing"]
58+ ?~ wanted ~[leaf+"expected report fixture missing"]
59+ =/ prepared=(unit iprelude:jibb) (prepare-prelude-with-internal:jibb prelude internal)
60+ ?~ prepared ~[leaf+"prelude unavailable"]
61+ =/ report=@t (golden-types-with-prepared-prelude:jibb /ui/prepared/jibb (text source) ~ ~ ~ prepared)
62+ =/ report-lines=wain (to-wain:format (cat 3 report '\0a'))
63+ ?~ report-lines ~[leaf+"prepared report is empty"]
64+ ?. =('partial inference; module not checked' i.report-lines)
65+ ~[leaf+"partial disclaimer changed"]
66+ ?. =(report-lines wanted) ~[leaf+"prepared report differs from exact recovered types"]
67+ ~
68+++ check-prepared-binding
69+ ^- tang
70+ =/ prepared=(unit iprelude:jibb) (prepare-prelude-with-internal:jibb prelude internal)
71+ ?~ prepared ~[leaf+"prelude unavailable"]
72+ =/ at=path /ui/prepared/jibb
73+ =/ src=@t (text good)
74+ =/ pre=(unit ifile:jibb) `iface.u.prepared
75+ =/ report
76+ |= [vals=(list term) ms=(list term) p=(unit ifile:jibb) prep=(unit iprelude:jibb)]
77+ ^- @t
78+ (golden-types-in-context-core:jibb at src ~ ~ ~ vals ms p prep)
79+ =/ vals=(list term) values.u.prepared
80+ =/ ms=(list term) molds.u.prepared
81+ ?: =((report vals ms pre prepared) (report vals ms pre ~))
82+ ~[leaf+"exact prepared binding did not recover the initializer"]
83+ ?. =((report ~ ms pre prepared) (report ~ ms pre ~))
84+ ~[leaf+"mismatched value inventory reached prepared recovery"]
85+ ?. =((report vals ~ pre prepared) (report vals ~ pre ~))
86+ ~[leaf+"mismatched mold inventory reached prepared recovery"]
87+ ?. =((report vals ms ~ prepared) (report vals ms ~ ~))
88+ ~[leaf+"mismatched prelude interface reached prepared recovery"]
89+ ~
90+++ test-prepared
91+ ^- tang
92+ =/ at=path /ui/prepared/jibb
93+ =/ checks=(list tang)
94+ :~ (check-prepared at good &)
95+ (check-prepared at tuple-only &)
96+ (check-prepared at no-prelude &)
97+ (check-prepared at wrong-unit |)
98+ (check-prepared at wrong-draft |)
99+ (check-prepared at unrelated-tag |)
100+ (check-prepared at mold-collision |)
101+ (check-prepared at no-final-cast |)
102+ (check-prepared at main-source |)
103+ (check-prepared at imported |)
104+ (check-prepared /ui/api/prepared/jibb good |)
105+ (check-prepared /ui/stores/prepared/jibb good |)
106+ check-no-prelude
107+ check-ordinary
108+ check-prepared-binding
109+ (check-report good expected)
110+ (check-report tuple-only expected-tuple-only)
111+ (check-report no-final-cast expected-control)
112+ ==
113+ (zing checks)
114+--
tests/lib/jibb-deferred.hoon+1−1
@@ -111,7 +111,7 @@
111111 ?~ explicit-capture ~['BAD-explicit-capture-scan']
112112 =/ tag-lit=lit:jibb [%term %tas %watch '%watch']
113113 =/ bound-tag-state=istate:jibb st(sub ~[[720 [%var 721]]])
114− =/ tag-check=(unit ischeme:jibb) (dg-generalize:jibb [%fn [%var 721] [%var 722]] ~ ~ ~[[720 tag-lit]] ~ bound-tag-state 300)
114+ =/ tag-check=(unit ischeme:jibb) (dg-generalize:jibb [%fn [%var 721] [%var 722]] ~ ~ ~[[720 tag-lit *span:jibb]] ~ bound-tag-state 300)
115115 ?~ tag-check ~['BAD-tag-scan']
116116 =/ cycle=(list dgo:jibb) ~[[[%var 710] [%var 711] *span:jibb *span:jibb] [[%var 711] [%var 712] *span:jibb *span:jibb] [[%var 712] [%var 710] *span:jibb *span:jibb]]
117117 =/ cyc=(unit ischeme:jibb) (dg-generalize:jibb [%fn [%var 710] [%fn [%var 712] [%var 713]]] ~ cycle ~ ~ st 300)
tests/lib/jibb-direct-gate-source.hoon+3−3
@@ -12,8 +12,8 @@
1212++ direct-gate-prepared
1313 |= [prelude=@t internal=@t]
1414 ^- (unit iprelude:jibb)
15− :: This element is test-only; it does not prescribe a runtime shape.
16− =/ extra=@t '\0a+$ element |$ [M] [%node item=M]\0a+$ program |$ [D X M]\0a [init=$-(D X) update=$-([M X] [X (list (cmd M))]) view=$-(X (element M)) subs=$-(X (list (sub M)))]\0a++ program |= [init=$-(D X) update=$-([M X] [X (list (cmd M))]) view=$-(X (element M)) subs=$-(X (list (sub M)))]\0a ^- (program D X M) [init update view subs]\0a++ choose-layout |= [f=$-([A B] C) value=[A B]] (f value)\0a++ higher |= [f=$-([@t [x=@t y=@p]] @t) marker=?] f\0a++ higher-generic |= [f=$-([@t X] X) state=X] state\0a'
15+ :: Program and element come from the real prelude; only layout helpers are synthetic.
16+ =/ extra=@t '\0a++ choose-layout |= [f=$-([A B] C) value=[A B]] (f value)\0a++ higher |= [f=$-([@t [x=@t y=@p]] @t) marker=?] f\0a++ higher-generic |= [f=$-([@t X] X) state=X] state\0a'
1717 (prepare-prelude-with-internal:jibb (cat 3 prelude extra) internal)
1818++ direct-gate-source-output
1919 |= [src=@t prepared=(unit iprelude:jibb)]
@@ -23,7 +23,7 @@
2323 |= prepared=(unit iprelude:jibb)
2424 ^- (list tape)
2525 ?~ prepared ~["synthetic prelude did not prepare"]
26− =/ src=@t '+$ message\0a %start\0a %stop\0a+$ record [count=@ud label=@t]\0a++ init-record |= input=@t ^- record [count=0 label=input]\0a++ view-record |= state=record ^- (element message) [%node %start]\0a++ subs-record |= state=record ^- (list (sub message)) ~\0a++ update-proj-good |= [msg=message state=record]\0a ^- [record (list (cmd message))]\0a [(proj [count=0 label="projected" extra=%.y]) ~]\0a++ program-projection (program init-record update-proj-good view-record subs-record)\0a'
26+ =/ src=@t '+$ message\0a %start\0a %stop\0a+$ record [count=@ud label=@t]\0a++ init-record |= input=@t ^- record [count=0 label=input]\0a++ view-record |= state=record ^- (element message) (text "view")\0a++ subs-record |= state=record ^- (list (sub message)) ~\0a++ update-proj-good |= [msg=message state=record]\0a ^- [record (list (cmd message))]\0a [(proj [count=0 label="projected" extra=%.y]) ~]\0a++ program-projection (program init-record update-proj-good view-record subs-record)\0a'
2727 =/ out=jfile-result:jibb (infer-jibb-file:jibb /tests/direct/client/jibb src ~ ~ ~ ~[/tests/direct/client/jibb] values.u.prepared molds.u.prepared ~ `iface.u.prepared)
2828 ?: ?=(%| -.out) ~["projection-bearing module did not infer"]
2929 =/ defs=(list iwidth-definition:jibb) (skim elaborations.iface.p.out |=(d=iwidth-definition:jibb =(%update-proj-good name.d)))
tests/lib/jibb-doc-examples.hoonnew file+166
@@ -0,0 +1,166 @@
1+:: Full checking for doc fragments in their intended module/prelude contexts.
2+/+ jibb, jibb-import
3+/* prelude %jibb /lib/jibb/prelude/jibb
4+/* internal %jibb /lib/jibb/internal/jibb
5+/* imports %jibb /tests/golden/doc-grammar-01-imports/source/jibb
6+/* view-day %jibb /tests/golden/doc-grammar-03-view-day/source/jibb
7+/* step %jibb /tests/golden/doc-grammar-04-step/source/jibb
8+/* cmd-sub %jibb /tests/golden/doc-overview-01-cmd-sub/source/jibb
9+/* todo-sur %txt /tests/type-api-paths/todo-sur/txt
10+/* todo-action %txt /tests/type-api-paths/todo-action/txt
11+/* blog-sur %txt /tests/type-page-main/blog-sur/txt
12+/* card %txt /tests/type-page-main/card/txt
13+|%
14+++ text
15+ |= lines=wain
16+ ^- @t
17+ (rap 3 (turn lines |=(line=@t (cat 3 line '\0a'))))
18+::
19+++ doc-detailed
20+ |= [at=path src=@t externals=iexternals:jibb marks=imark-externals:jibb modules=jbundle:jibb prepared=iprelude:jibb]
21+ ^- jfile-detailed-result:jibb
22+ (infer-jibb-file-detailed:jibb at src externals marks modules ~[at] values.prepared molds.prepared ~ `iface.prepared)
23+::
24+++ doc-legacy
25+ |= [at=path src=@t externals=iexternals:jibb marks=imark-externals:jibb modules=jbundle:jibb prepared=iprelude:jibb]
26+ ^- jfile-result:jibb
27+ (infer-jibb-file:jibb at src externals marks modules ~[at] values.prepared molds.prepared ~ `iface.prepared)
28+::
29+++ doc-reader-inputs
30+ |= [sur=@t action=@t blog=@t]
31+ ^- [marks=imark-externals:jibb externals=iexternals:jibb]
32+ =/ todo=type -:(ride -:!>(..zuse) sur)
33+ =/ todo-subject=type [%cell [%face %todo todo] -:!>(..zuse)]
34+ =/ action-result=* (read-mark:jibb-import %todo-action -:(ride todo-subject action))
35+ =/ item-input=* (read-named:jibb-import %todo %item todo)
36+ =/ posts=type -:(ride -:!>(..zuse) blog)
37+ =/ post-input=* (read-named:jibb-import %blog %post posts)
38+ :_ ~[[%todo %item item-input] [%blog %post post-input]]
39+ ~[[%todo-action action-result]]
40+::
41+++ doc-value-errors
42+ |= [label=tape name=term expected=@t checked=ifile:jibb]
43+ ^- (list tape)
44+ =/ value=(unit ischeme:jibb) (ienv-lookup:jibb name values.checked)
45+ ?~ value ~[(weld label ": value is missing")]
46+ =/ printed=itype:jibb (canonical-itype:jibb typ.u.value vars.u.value)
47+ =/ actual=@t (crip (show-itype:jibb printed ~))
48+ ?. =(actual expected) ~[(weld label (weld ": type was " (trip actual)))]
49+ ~
50+::
51+++ doc-positive
52+ |= [label=tape at=path src=@t name=term expected=@t prepared=iprelude:jibb]
53+ ^- (list tape)
54+ =/ detailed=jfile-detailed-result:jibb (doc-detailed at src ~ ~ ~ prepared)
55+ ?: ?=(%| -.detailed) ~[(weld label (weld ": detailed rejected: " (trip message.p.detailed)))]
56+ =/ legacy=jfile-result:jibb (doc-legacy at src ~ ~ ~ prepared)
57+ ?: ?=(%| -.legacy) ~[(weld label (weld ": legacy rejected: " (trip p.legacy)))]
58+ =/ failures=(list tape)
59+ (doc-value-errors (weld label ": detailed") name expected iface.p.detailed)
60+ =? failures !=(values.iface.p.detailed values.iface.p.legacy)
61+ [(weld label ": detailed and legacy values differ") failures]
62+ =? failures !=(molds.iface.p.detailed molds.iface.p.legacy)
63+ [(weld label ": detailed and legacy molds differ") failures]
64+ (weld failures (doc-value-errors (weld label ": legacy") name expected iface.p.legacy))
65+::
66+++ doc-cmd-prelude
67+ |= prepared=iprelude:jibb
68+ ^- iprelude:jibb
69+ =/ excluded=(list term) ~[%cmd %sub]
70+ =/ kept=imold-types:jibb
71+ (skim molds.iface.prepared |=(m=[name=term template=ischeme:jibb] !(lien excluded |=(n=term =(n name.m)))))
72+ =/ names=(list term)
73+ (skim molds.prepared |=(n=term !(lien excluded |=(x=term =(x n)))))
74+ [iface.prepared(molds kept) values.prepared names]
75+::
76+++ doc-cmd-interface-errors
77+ |= [label=tape checked=ifile:jibb original=ifile:jibb]
78+ ^- (list tape)
79+ =/ failures=(list tape) ~
80+ =/ names=(list term) ~[%cmd %sub]
81+ |-
82+ ?~ names failures
83+ =/ actual=(unit ischeme:jibb) (find-jibb-mold:jibb i.names checked)
84+ =/ expected=(unit ischeme:jibb) (find-jibb-mold:jibb i.names original)
85+ ?~ actual $(names t.names, failures [(weld label ": mold is missing") failures])
86+ ?~ expected $(names t.names, failures [(weld label ": canonical mold is missing") failures])
87+ =/ actual-type=itype:jibb (canonical-itype:jibb typ.u.actual vars.u.actual)
88+ =/ expected-type=itype:jibb (canonical-itype:jibb typ.u.expected vars.u.expected)
89+ =/ shown=@t (crip (show-itype:jibb actual-type ~))
90+ =/ expected-shown=@t (crip (show-itype:jibb expected-type ~))
91+ ?. =(shown expected-shown)
92+ $(names t.names, failures [(weld label (weld ": mold scheme was " (trip shown))) failures])
93+ $(names t.names)
94+::
95+++ doc-cmd-errors
96+ |= [src=@t prepared=iprelude:jibb]
97+ ^- (list tape)
98+ =/ at=path /lib/jibb/prelude/jibb
99+ =/ reduced=iprelude:jibb (doc-cmd-prelude prepared)
100+ =/ detailed=jfile-detailed-result:jibb (doc-detailed at src ~ ~ ~ reduced)
101+ ?: ?=(%| -.detailed) ~[(weld "cmd/sub detailed rejected: " (trip message.p.detailed))]
102+ =/ legacy=jfile-result:jibb (doc-legacy at src ~ ~ ~ reduced)
103+ ?: ?=(%| -.legacy) ~[(weld "cmd/sub legacy rejected: " (trip p.legacy))]
104+ =/ failures=(list tape)
105+ (doc-cmd-interface-errors "cmd/sub detailed" iface.p.detailed iface.prepared)
106+ =? failures !=(molds.iface.p.detailed molds.iface.p.legacy)
107+ ["cmd/sub detailed and legacy molds differ" failures]
108+ (weld failures (doc-cmd-interface-errors "cmd/sub legacy" iface.p.legacy iface.prepared))
109+::
110+++ doc-import-errors
111+ |= [src=@t sur=@t action=@t blog=@t card-source=@t prepared=iprelude:jibb]
112+ ^- (list tape)
113+ =/ at=path /ui/imports/jibb
114+ =/ inputs=[marks=imark-externals:jibb externals=iexternals:jibb]
115+ (doc-reader-inputs sur action blog)
116+ =/ modules=jbundle:jibb ~[[/ui/components/card/jibb card-source]]
117+ =/ detailed=jfile-detailed-result:jibb
118+ (doc-detailed at src externals.inputs marks.inputs modules prepared)
119+ ?: ?=(%| -.detailed) ~[(weld "imports detailed rejected: " (trip message.p.detailed))]
120+ =/ legacy=jfile-result:jibb
121+ (doc-legacy at src externals.inputs marks.inputs modules prepared)
122+ ?: ?=(%| -.legacy) ~[(weld "imports legacy rejected: " (trip p.legacy))]
123+ =/ use-source=@t
124+ %+ rap 3
125+ :~ src
126+ '++ use-item |= i=item.todo i\0a'
127+ '++ use-action |= a=todo-action a\0a'
128+ '++ use-card card.card\0a'
129+ ==
130+ =/ used=jfile-detailed-result:jibb
131+ (doc-detailed at use-source externals.inputs marks.inputs modules prepared)
132+ ?: ?=(%| -.used) ~[(weld "import consumers rejected: " (trip message.p.used))]
133+ =/ used-legacy=jfile-result:jibb
134+ (doc-legacy at use-source externals.inputs marks.inputs modules prepared)
135+ ?: ?=(%| -.used-legacy) ~[(weld "legacy import consumers rejected: " (trip p.used-legacy))]
136+ =/ failures=(list tape) ~
137+ =/ missing-module=jfile-detailed-result:jibb
138+ (doc-detailed at use-source externals.inputs marks.inputs ~ prepared)
139+ =? failures ?=(%& -.missing-module) ["imports accepted a missing Jibb module" failures]
140+ =/ missing-mark=jfile-detailed-result:jibb
141+ (doc-detailed at use-source externals.inputs ~ modules prepared)
142+ =? failures ?=(%& -.missing-mark) ["imports accepted a missing mark" failures]
143+ =/ missing-sur=jfile-detailed-result:jibb
144+ (doc-detailed at use-source ~ marks.inputs modules prepared)
145+ =? failures ?=(%& -.missing-sur) ["imports accepted missing /sur molds" failures]
146+ failures
147+::
148+++ doc-examples-errors
149+ |= [public=@t private=@t import-source=@t view-source=@t step-source=@t cmd-source=@t sur=@t action=@t blog=@t card-source=@t]
150+ ^- (list tape)
151+ =/ prepared=(unit iprelude:jibb)
152+ (prepare-prelude-with-internal:jibb public private)
153+ ?~ prepared ~["doc-example prelude did not prepare"]
154+ ;: weld
155+ (doc-positive "view-day" /ui/view-day/jibb view-source %view '$-([day=@da n=@ud] (element A))' u.prepared)
156+ (doc-positive "step" /ui/step/jibb step-source %describe '$-(step @t)' u.prepared)
157+ (doc-cmd-errors cmd-source u.prepared)
158+ (doc-import-errors import-source sur action blog card-source u.prepared)
159+ ==
160+::
161+++ test-doc-examples
162+ ^- tang
163+ =/ failures=(list tape)
164+ (doc-examples-errors prelude internal imports view-day step cmd-sub (text todo-sur) (text todo-action) (text blog-sur) (text card))
165+ (turn failures |=(reason=tape leaf+reason))
166+--
tests/lib/jibb-generic-construction.hoon+2−2
@@ -33,7 +33,7 @@
3333 =/ bad-owner=jfile-result:jibb
3434 (infer-jibb-file:jibb /ui/tree/jibb owner-negative ~ ~ ~ ~[/ui/tree/jibb] values.u.prep molds.u.prep ~ `iface.u.prep)
3535 =/ bad-parse=(each module:jibb error:jibb) (parse:jibb /ui/tree/jibb owner-negative)
36− =/ mold=(unit ischeme:jibb) (find-jibb-mold:jibb %element iface.p.owner)
36+ =/ mold=(unit ischeme:jibb) (find-jibb-mold:jibb %node-tree iface.p.owner)
3737 ?~ mold 'BAD owner mold'
3838 ?. ?=(%grec -.typ.u.mold) 'BAD nominal owner'
3939 =/ generic=itype:jibb typ.u.mold(args ~[[%var 42]])
@@ -64,7 +64,7 @@
6464 =/ d=def:jibb i.t.t.t.ds
6565 ?. &(?=(%value -.a) ?=(%value -.b) ?=(%value -.c) ?=(%value -.d)) 'BAD value declarations'
6666 =/ env=ienv:jibb ~[[%text-event [[%fn [%atom %t] [%atom %t]] ~]]]
67− =/ tag=ipending:jibb [100 [%term %tas %unrelated '%unrelated']]
67+ =/ tag=ipending:jibb [100 [%term %tas %unrelated '%unrelated'] *span:jibb]
6868 =/ projection=iwprojection:jibb *iwprojection:jibb
6969 =/ st=istate:jibb *istate:jibb
7070 =. st st(next 201, prelude `iface.u.prep, tags ~[tag], holes ~[[99 (span-of:jibb val.a)]], projections ~[projection])
tests/lib/jibb-generic-pattern.hoon+2−2
@@ -32,7 +32,7 @@
3232 =/ bad-parse=(each module:jibb error:jibb) (parse:jibb /ui/tree/jibb owner-bad)
3333 =/ bad=jfile-result:jibb
3434 (infer-jibb-file:jibb /ui/tree/jibb owner-bad ~ ~ ~ ~[/ui/tree/jibb] values.u.prep molds.u.prep ~ `iface.u.prep)
35− =/ mold=(unit ischeme:jibb) (find-jibb-mold:jibb %element iface.p.checked)
35+ =/ mold=(unit ischeme:jibb) (find-jibb-mold:jibb %node-tree iface.p.checked)
3636 ?~ mold 'BAD owner mold'
3737 ?. ?=(%grec -.typ.u.mold) 'BAD nominal owner'
3838 =/ target=itype:jibb typ.u.mold(args ~[[%atom %t]])
@@ -77,7 +77,7 @@
7777 ?. ?=(%branch -.val.p) 'BAD polymorphic branch'
7878 =/ env=ienv:jibb ~[[%x [target ~]]]
7979 =/ poly=ienv:jibb ~[[%x [generic ~[42]]]]
80− =/ tag=ipending:jibb [100 [%term %tas %unrelated '%unrelated']]
80+ =/ tag=ipending:jibb [100 [%term %tas %unrelated '%unrelated'] *span:jibb]
8181 =/ projection=iwprojection:jibb *iwprojection:jibb
8282 =/ st=istate:jibb *istate:jibb
8383 =. st st(next 201, prelude `iface.u.prep, tags ~[tag], holes ~[[99 (span-of:jibb val.a)]], projections ~[projection])
tests/lib/jibb-generic-recursion.hoon+4−4
@@ -1,4 +1,4 @@
1−:: Source-backed recursive identities; this is not a runtime element model.
1+:: Source-backed recursive identities; this is not the runtime UI element model.
22/+ jibb
33/* real-prelude %jibb /lib/jibb/prelude/jibb
44/* real-internal %jibb /lib/jibb/internal/jibb
@@ -42,7 +42,7 @@
4242 =/ module=jfile-result:jibb
4343 (infer-jibb-file:jibb /ui/tree/jibb tree ~ ~ ~ ~[/ui/tree/jibb] values.u.prep molds.u.prep ~ `iface.u.prep)
4444 ?: ?=(%| -.module) (cat 3 'BAD recursive module: ' p.module)
45− =/ scheme=(unit ischeme:jibb) (find-jibb-mold:jibb %element iface.p.module)
45+ =/ scheme=(unit ischeme:jibb) (find-jibb-mold:jibb %node-tree iface.p.module)
4646 ?~ scheme 'BAD missing recursive mold'
4747 ?. ?=(%grec -.typ.u.scheme) 'BAD missing recursive identity'
4848 =/ typ=itype:jibb typ.u.scheme
@@ -116,8 +116,8 @@
116116 =/ shape-changed=?
117117 ?~ old |
118118 ?~ new |
119− =/ a=(unit ischeme:jibb) (find-jibb-mold:jibb %element u.old)
120− =/ b=(unit ischeme:jibb) (find-jibb-mold:jibb %element u.new)
119+ =/ a=(unit ischeme:jibb) (find-jibb-mold:jibb %node-tree u.old)
120+ =/ b=(unit ischeme:jibb) (find-jibb-mold:jibb %node-tree u.new)
121121 ?~ a |
122122 ?~ b |
123123 ?. &(?=(%grec -.typ.u.a) ?=(%grec -.typ.u.b)) |
tests/lib/jibb-list-alias-guards.hoon+1−1
@@ -4,7 +4,7 @@
44|%
55++ list-alias-output
66 ^- @t
7− =/ src=@t (crip "++ text |= x=(alias @t) x\0a++ ship |= x=(alias @p) x\0a++ wrong ^- (alias @t) ~[~zod]\0a++ shadow |= x=(list @t)\0a +$ list @t\0a x\0a")
7+ =/ src=@t (crip "++ text-value |= x=(alias @t) x\0a++ ship |= x=(alias @p) x\0a++ wrong ^- (alias @t) ~[~zod]\0a++ shadow |= x=(list @t)\0a +$ list @t\0a x\0a")
88 =/ canonical=@t (crip "+$ list |$ [A]\0a ~\0a [i=A t=(list A)]\0a+$ bag |$ [A] (list A)\0a+$ alias |$ [A] (bag A)\0a")
99 =/ altered=@t (crip "+$ list |$ [A] [A A]\0a+$ bag |$ [A] (list A)\0a+$ alias |$ [A] (bag A)\0a")
1010 =/ omitted=@t (crip "+$ bag |$ [A] (list A)\0a+$ alias |$ [A] (bag A)\0a")
tests/lib/jibb-page-main.hoonnew file+168
@@ -0,0 +1,168 @@
1+:: Static and direct data-page kind checks, without rendering or execution.
2+/+ jibb, jibb-import
3+/* prelude %jibb /lib/jibb/prelude/jibb
4+/* internal %jibb /lib/jibb/internal/jibb
5+/* sur %txt /tests/type-api-paths/todo-sur/txt
6+/* action %txt /tests/type-api-paths/todo-action/txt
7+/* todos %txt /tests/type-api-paths/todos/txt
8+/* update %txt /tests/type-api-paths/todo-update/txt
9+/* item %txt /tests/type-api-paths/todo-item/txt
10+/* todo-api %txt /tests/type-page-main/todo-api/txt
11+/* todo-island %txt /tests/type-page-main/todo-island/txt
12+/* blog-sur %txt /tests/type-page-main/blog-sur/txt
13+/* posts %txt /tests/type-page-main/posts-mark/txt
14+/* blog-api %txt /tests/type-page-main/blog-api/txt
15+/* card %txt /tests/type-page-main/card/txt
16+/* about %txt /tests/type-page-main/static/txt
17+/* blog-index %txt /tests/type-page-main/blog-index/txt
18+/* index %txt /tests/type-page-main/index/txt
19+/* ctor-page %txt /tests/type-page-main/ctor-page/txt
20+/* wrong-static %txt /tests/type-page-main/wrong-static/txt
21+/* arbitrary-main %txt /tests/type-page-main/arbitrary-main/txt
22+/* page-alias %txt /tests/type-page-main/page-alias/txt
23+/* indirect-load %txt /tests/type-page-main/indirect-load/txt
24+/* pure-load %txt /tests/type-page-main/pure-load/txt
25+/* hand-built-load %txt /tests/type-page-main/hand-built-load/txt
26+/* typed-load %txt /tests/type-page-main/typed-load/txt
27+/* diff-load %txt /tests/type-page-main/diff-load/txt
28+|%
29+++ text
30+ |= lines=wain
31+ ^- @t
32+ (rap 3 (turn lines |=(line=@t (cat 3 line '\0a'))))
33+::
34+++ page-main-detailed
35+ |= [at=path src=@t externals=iexternals:jibb marks=imark-externals:jibb modules=jbundle:jibb prepared=iprelude:jibb]
36+ ^- jfile-detailed-result:jibb
37+ (infer-jibb-file-detailed:jibb at src externals marks modules ~[at] values.prepared molds.prepared ~ `iface.prepared)
38+::
39+++ page-main-reader-inputs
40+ |= [sur=@t action=@t todos=@t update=@t item=@t blog-sur=@t posts=@t]
41+ ^- [marks=imark-externals:jibb externals=iexternals:jibb]
42+ =/ todo=type -:(ride -:!>(..zuse) sur)
43+ =/ todo-subject=type [%cell [%face %todo todo] -:!>(..zuse)]
44+ =/ ma=* (read-mark:jibb-import %todo-action -:(ride todo-subject action))
45+ =/ mt=* (read-mark:jibb-import %todos -:(ride todo-subject todos))
46+ =/ mu=* (read-mark:jibb-import %todo-update -:(ride todo-subject update))
47+ =/ mi=* (read-mark:jibb-import %todo-item -:(ride todo-subject item))
48+ =/ blog=type -:(ride -:!>(..zuse) blog-sur)
49+ =/ blog-subject=type [%cell [%face %blog blog] -:!>(..zuse)]
50+ =/ mp=* (read-mark:jibb-import %posts -:(ride blog-subject posts))
51+ =/ item-input=* (read-named:jibb-import %todo %item todo)
52+ =/ post-input=* (read-named:jibb-import %blog %post blog)
53+ :_ ~[[%todo %item item-input] [%blog %post post-input]]
54+ ~[[%todo-action ma] [%todos mt] [%todo-update mu] [%todo-item mi] [%posts mp]]
55+::
56+++ page-main-positive
57+ |= [label=tape at=path src=@t expected=@t consumer-at=path consumer=@t face=term externals=iexternals:jibb marks=imark-externals:jibb modules=jbundle:jibb prepared=iprelude:jibb]
58+ ^- (list tape)
59+ =/ detailed=jfile-detailed-result:jibb
60+ (page-main-detailed at src externals marks modules prepared)
61+ ?: ?=(%| -.detailed)
62+ ~[(weld label (weld ": rejected: " (trip message.p.detailed)))]
63+ =/ checked=ifile:jibb iface.p.detailed
64+ ?~ graph.checked ~[(weld label ": request graph is missing")]
65+ =/ main=(unit ischeme:jibb) (ienv-lookup:jibb %main values.checked)
66+ ?~ main ~[(weld label ": main is missing")]
67+ ?. &(?=(~ vars.u.main) ?=(~ (itype-vars:jibb typ.u.main)))
68+ ~[(weld label ": main is not closed")]
69+ =/ actual=@t (crip (show-itype:jibb typ.u.main ~))
70+ ?. =(actual expected)
71+ ~[(weld label (weld ": main type was " (trip actual)))]
72+ =/ imported=jfile-detailed-result:jibb
73+ (page-main-detailed consumer-at consumer externals marks modules prepared)
74+ ?: ?=(%| -.imported)
75+ ~[(weld label (weld ": downstream import rejected: " (trip message.p.imported)))]
76+ =/ use=(unit ischeme:jibb) (ienv-lookup:jibb %imported values.iface.p.imported)
77+ ?~ use ~[(weld label ": downstream main is missing")]
78+ =/ expected-import=itype:jibb
79+ (itype-in-import:jibb typ.u.main checked face `iface.prepared)
80+ ?. &(?=(~ vars.u.use) =(typ.u.use expected-import))
81+ ~[(weld label ": downstream main type differs")]
82+ ~
83+::
84+++ page-main-negative
85+ |= [label=@t at=path src=@t externals=iexternals:jibb marks=imark-externals:jibb modules=jbundle:jibb prepared=iprelude:jibb]
86+ ^- (list tape)
87+ =/ bad=jfile-detailed-result:jibb
88+ (page-main-detailed at src externals marks modules prepared)
89+ ?: ?=(%& -.bad) ~[(weld (trip label) ": accepted")]
90+ ~
91+::
92+++ page-main-errors
93+ |= [public=@t private=@t sur=@t action=@t todos=@t update=@t item=@t todo-api=@t todo-island=@t blog-sur=@t posts=@t blog-api=@t card=@t about=@t blog-index=@t index=@t ctor-page=@t negatives=(list [label=@t src=@t])]
94+ ^- (list tape)
95+ =/ prepared=(unit iprelude:jibb)
96+ (prepare-prelude-with-internal:jibb public private)
97+ ?~ prepared ~["page prelude did not prepare"]
98+ =/ inputs=[marks=imark-externals:jibb externals=iexternals:jibb]
99+ (page-main-reader-inputs sur action todos update item blog-sur posts)
100+ =/ modules=jbundle:jibb
101+ :~ [/ui/api/todo/jibb todo-api]
102+ [/ui/todo-list/jibb todo-island]
103+ [/ui/api/blog/jibb blog-api]
104+ [/ui/components/card/jibb card]
105+ [/ui/about/jibb about]
106+ [/ui/blog/index/jibb blog-index]
107+ [/ui/index/jibb index]
108+ [/tests/page-main/ctor/jibb ctor-page]
109+ ==
110+ =/ about-consumer=@t '/= about-page /ui/about\0a++ imported main.about-page\0a'
111+ =/ blog-consumer=@t '/= blog-page /ui/blog/index\0a++ imported main.blog-page\0a'
112+ =/ index-consumer=@t '/= index-page /ui/index\0a++ imported main.index-page\0a'
113+ =/ ctor-consumer=@t '/= ctor-page /tests/page-main/ctor\0a++ imported main.ctor-page\0a'
114+ =/ positives=(list (list tape))
115+ :~ (page-main-positive "about" /ui/about/jibb about '(element !!)' /tests/page-main/about-consumer/jibb about-consumer %about-page externals.inputs marks.inputs modules u.prepared)
116+ (page-main-positive "blog index" /ui/blog/index/jibb blog-index '[load=$-(~ (ask (list [title=@t slug=@ta]))) view=$-((list [title=@t slug=@ta]) (element !!))]' /tests/page-main/blog-consumer/jibb blog-consumer %blog-page externals.inputs marks.inputs modules u.prepared)
117+ (page-main-positive "index" /ui/index/jibb index '[load=$-(~ (ask (list [id=@ud [done=? text=@t]]))) view=$-((list [id=@ud [done=? text=@t]]) (element !!))]' /tests/page-main/index-consumer/jibb index-consumer %index-page externals.inputs marks.inputs modules u.prepared)
118+ (page-main-positive "constructor reply" /tests/page-main/ctor/jibb ctor-page '[load=$-(~ (ask [%got todos=(list [id=@ud [done=? text=@t]])])) view=$-([%got todos=(list [id=@ud [done=? text=@t]])] (element !!))]' /tests/page-main/ctor-consumer/jibb ctor-consumer %ctor-page externals.inputs marks.inputs modules u.prepared)
119+ ==
120+ =/ failures=(list tape) (zing positives)
121+ ?^ failures failures
122+ =/ at=path /ui/index/jibb
123+ =/ checked-result=jfile-detailed-result:jibb
124+ (page-main-detailed at index externals.inputs marks.inputs modules u.prepared)
125+ ?: ?=(%| -.checked-result) ~["index disappeared before evidence controls"]
126+ =/ checked=ifile:jibb iface.p.checked-result
127+ ?~ graph.checked ~["index graph disappeared before evidence controls"]
128+ =/ parsed (parse:jibb at index)
129+ ?: ?=(%| -.parsed) ~["index source no longer parses"]
130+ =/ main=(unit def:jibb) (program-main-def:jibb defs.p.parsed)
131+ ?~ main ~["index main definition is missing"]
132+ =/ parts=(unit [load=term view=term]) (page-main-parts:jibb u.main)
133+ ?~ parts ~["index page parts are missing"]
134+ =/ others=(list irequest-evidence:jibb)
135+ (skim requests.u.graph.checked |=(r=irequest-evidence:jibb !&(=(api-at.r /ui/api/todo/jibb) =(%todos name.r))))
136+ =/ missing=irequest-graph:jibb u.graph.checked(requests others)
137+ =/ resolved=ijimports:jibb
138+ =/ found=(unit ifile:jibb)
139+ =/ api=jfile-detailed-result:jibb
140+ (page-main-detailed /ui/api/todo/jibb todo-api externals.inputs marks.inputs modules u.prepared)
141+ ?: ?=(%| -.api) ~
142+ `iface.p.api
143+ ?~ found ~
144+ ~[[%todo u.found]]
145+ ?. ?=([* ~] resolved) ~["todo API evidence control did not check"]
146+ ?: (page-main-closed:jibb u.parts defs.p.parsed values.checked `iface.u.prepared resolved missing)
147+ ~["unknown request evidence passed data-page checking"]
148+ =/ store=(list tape)
149+ (page-main-negative 'store path' /ui/stores/about/jibb about externals.inputs marks.inputs modules u.prepared)
150+ ?^ store store
151+ (zing (turn negatives |=(c=[label=@t src=@t] (page-main-negative label.c /ui/index/jibb src.c externals.inputs marks.inputs modules u.prepared))))
152+::
153+++ test-page-main
154+ ^- tang
155+ =/ negatives=(list [label=@t src=@t])
156+ :~ ['wrong static message' (text wrong-static)]
157+ ['arbitrary main' (text arbitrary-main)]
158+ ['page alias' (text page-alias)]
159+ ['indirect load' (text indirect-load)]
160+ ['pure load' (text pure-load)]
161+ ['hand-built load' (text hand-built-load)]
162+ ['typed load' (text typed-load)]
163+ ['diff load' (text diff-load)]
164+ ==
165+ =/ failures=(list tape)
166+ (page-main-errors prelude internal (text sur) (text action) (text todos) (text update) (text item) (text todo-api) (text todo-island) (text blog-sur) (text posts) (text blog-api) (text card) (text about) (text blog-index) (text index) (text ctor-page) negatives)
167+ (turn failures |=(reason=tape leaf+reason))
168+--
tests/lib/jibb-poke-bridge.hoon+2−2
@@ -78,10 +78,10 @@
7878 =/ no-declaration=@t (crip "+$ poke todo-action\0a")
7979 =/ no-declaration-modules=(list [at=path source=@t]) ~[[/ui/api/todo/jibb no-declaration]]
8080 =/ j (golden-types-with-prepared-prelude:jibb /ui/test/jibb client ~ marks no-declaration-modules prepared)
81− =/ collision=@t (crip "/% %todo-action\0a+$ poke todo-action\0a++ todo-action \"bad\"\0a")
81+ =/ collision=@t (crip "/% %todo-action\0a+$ poke todo-action\0a++ poke \"bad\"\0a")
8282 =/ collision-modules=(list [at=path source=@t]) ~[[/ui/api/todo/jibb collision]]
8383 =/ k (golden-types-with-prepared-prelude:jibb /ui/test/jibb client ~ marks collision-modules prepared)
84− =/ wrong-path-source=@t (crip "/= todo /ui/wrong/todo\0a++ test (todo-action.todo \"ok\")\0a")
84+ =/ wrong-path-source=@t (crip "/= todo /ui/wrong/todo\0a++ test (poke.todo \"ok\" same)\0a")
8585 =/ wrong-path-modules=(list [at=path source=@t]) ~[[/ui/wrong/todo/jibb api]]
8686 =/ l (golden-types-with-prepared-prelude:jibb /ui/test/jibb wrong-path-source ~ marks wrong-path-modules prepared)
8787 (of-wain:format ~[(preparation-controls prelude internal) a b c d e f g h i j k l])
tests/lib/jibb-program-init.hoonnew file+140
@@ -0,0 +1,140 @@
1+:: Transactional direct-program initializer context, without UI execution.
2+/+ jibb
3+/* prelude %jibb /lib/jibb/prelude/jibb
4+/* internal %jibb /lib/jibb/internal/jibb
5+/* initializer %txt /tests/type-program-main/initializer/txt
6+/* initializer-consumer %txt /tests/type-program-main/initializer-consumer/txt
7+/* initializer-unfaced %txt /tests/type-program-main/initializer-unfaced/txt
8+/* initializer-error %txt /tests/type-program-main/initializer-error/txt
9+/* initializer-earlier %txt /tests/type-program-main/initializer-earlier/txt
10+/* initializer-model %txt /tests/type-program-main/initializer-model/txt
11+/* initializer-message %txt /tests/type-program-main/initializer-message/txt
12+/* initializer-generic %txt /tests/type-program-main/initializer-generic/txt
13+/* initializer-missing %txt /tests/type-program-main/initializer-missing/txt
14+/* initializer-tag %txt /tests/type-program-main/initializer-tag/txt
15+/* initializer-no-main %txt /tests/type-program-main/initializer-no-main/txt
16+/* initializer-subs %txt /tests/type-program-main/initializer-subs/txt
17+|%
18+++ text
19+ |= lines=wain
20+ ^- @t
21+ (rap 3 (turn lines |=(line=@t (cat 3 line '\0a'))))
22+::
23+++ program-init-prepared
24+ |= [public=@t private=@t]
25+ ^- (unit iprelude:jibb)
26+ (prepare-prelude-with-internal:jibb public private)
27+::
28+++ program-init-detailed
29+ |= [at=path src=@t modules=jbundle:jibb prepared=iprelude:jibb]
30+ ^- jfile-detailed-result:jibb
31+ (infer-jibb-file-detailed:jibb at src ~ ~ modules ~[at] values.prepared molds.prepared ~ `iface.prepared)
32+::
33+++ program-init-legacy
34+ |= [at=path src=@t modules=jbundle:jibb prepared=iprelude:jibb]
35+ ^- jfile-result:jibb
36+ (infer-jibb-file:jibb at src ~ ~ modules ~[at] values.prepared molds.prepared ~ `iface.prepared)
37+::
38+++ program-init-positive
39+ |= [at=path src=@t downstream=(unit @t) prepared=iprelude:jibb]
40+ ^- (list tape)
41+ =/ detailed=jfile-detailed-result:jibb (program-init-detailed at src ~ prepared)
42+ ?: ?=(%| -.detailed) ~["contextual direct program init was rejected"]
43+ =/ checked=ifile:jibb iface.p.detailed
44+ =/ legacy=jfile-result:jibb (program-init-legacy at src ~ prepared)
45+ ?: ?=(%| -.legacy) ~["legacy adapter rejected contextual init"]
46+ ?. =(values.checked values.iface.p.legacy) ~["contextual structured and legacy values differ"]
47+ =/ init=(unit ischeme:jibb) (ienv-lookup:jibb %init values.checked)
48+ =/ main=(unit ischeme:jibb) (ienv-lookup:jibb %main values.checked)
49+ ?~ init ~["contextual init interface is missing"]
50+ ?~ main ~["contextual main interface is missing"]
51+ ?. ?=(~ vars.u.init) ~["contextual init interface is not closed"]
52+ =/ expected=tape "$-((list @t) [xs=(list @t) [draft=@t error=(unit @t)]])"
53+ ?. =((show-itype:jibb typ.u.init ~) expected) ~["contextual init interface type differs"]
54+ ?. ?=(~ vars.u.main) ~["contextual main interface is not closed"]
55+ =/ fields=(list itype:jibb) (record-fields-named:jibb %init typ.u.main ~)
56+ ?. =(fields ~[typ.u.init]) ~["contextual main initializer field differs"]
57+ ?~ source.checked ~["contextual program source evidence is missing"]
58+ ?. =(u.source.checked src) ~["contextual program source evidence differs"]
59+ ?~ graph.checked ~["contextual program request graph is missing"]
60+ ?~ downstream ~
61+ =/ consumer-at=path /tests/program-main/initializer-consumer/jibb
62+ =/ imported=jfile-detailed-result:jibb
63+ (program-init-detailed consumer-at u.downstream ~[[at src]] prepared)
64+ ?: ?=(%| -.imported) ~[(weld "downstream contextual initializer import was rejected: " (trip message.p.imported))]
65+ =/ use=(unit ischeme:jibb) (ienv-lookup:jibb %imported values.iface.p.imported)
66+ ?~ use ~["downstream contextual initializer is missing"]
67+ ?. =((show-itype:jibb typ.u.use ~) expected) ~["downstream contextual initializer type differs"]
68+ ?. =(u.use u.init) ~["downstream contextual initializer scheme differs"]
69+ ~
70+::
71+++ program-init-negative
72+ |= [label=@t at=path src=@t boundary=@t prepared=iprelude:jibb]
73+ ^- (list tape)
74+ =/ detailed=jfile-detailed-result:jibb (program-init-detailed at src ~ prepared)
75+ ?: ?=(%& -.detailed) ~[(weld (trip label) ": structured check accepted")]
76+ ?. ?=(~ overlap.p.detailed) ~[(weld (trip label) ": unexpected overlap evidence")]
77+ ?. =(message.p.detailed boundary)
78+ ~[(weld (weld (trip label) ": rejected at the wrong boundary: ") (trip message.p.detailed))]
79+ =/ legacy=jfile-result:jibb (program-init-legacy at src ~ prepared)
80+ ?: ?=(%& -.legacy) ~[(weld (trip label) ": legacy check accepted")]
81+ ?. =(p.legacy boundary) ~[(weld (trip label) ": legacy boundary differs")]
82+ ~
83+::
84+++ program-init-negative-cases
85+ |= [cases=(list [label=@t at=path src=@t boundary=@t]) prepared=iprelude:jibb]
86+ ^- (list tape)
87+ ?~ cases ~
88+ %+ weld
89+ (program-init-negative label.i.cases at.i.cases src.i.cases boundary.i.cases prepared)
90+ $(cases t.cases)
91+::
92+++ program-init-pending
93+ |= [at=path src=@t line=@ud col=@ud literal=tape]
94+ ^- @t
95+ (show-error:jibb src [at line col (weld "nothing fixes the union of " literal)])
96+::
97+++ program-init-errors
98+ |= [public=@t private=@t island=@t downstream=@t unfaced=@t negatives=(list @t)]
99+ ^- (list tape)
100+ =/ prepared=(unit iprelude:jibb) (program-init-prepared public private)
101+ ?~ prepared ~["synthetic program prelude did not prepare for contextual init"]
102+ =/ at=path /tests/program-main/initializer/jibb
103+ =/ positives=(list tape)
104+ %+ weld
105+ (program-init-positive at island `downstream u.prepared)
106+ (program-init-positive /tests/program-main/initializer-unfaced/jibb unfaced ~ u.prepared)
107+ ?. =(9 (lent negatives)) ~["contextual negative fixture count differs"]
108+ =/ definitions=@t (crip "module definitions need unsupported inference: {(spud at)}")
109+ =/ cases=(list [label=@t at=path src=@t boundary=@t])
110+ :~ ['incompatible error field' at (snag 0 negatives) (program-init-pending at (snag 0 negatives) 6 32 "~")]
111+ ['earlier tuple mismatch' at (snag 1 negatives) (program-init-pending at (snag 1 negatives) 6 34 "~")]
112+ ['inconsistent model' at (snag 2 negatives) (program-init-pending at (snag 2 negatives) 7 32 "~")]
113+ ['inconsistent message' at (snag 3 negatives) (program-init-pending at (snag 3 negatives) 9 32 "~")]
114+ ['missing/generic data sample' at (snag 4 negatives) (program-init-pending at (snag 4 negatives) 6 22 "~")]
115+ ['missing initializer' at (snag 5 negatives) definitions]
116+ ['unrelated pending tag' at (snag 6 negatives) (program-init-pending at (snag 6 negatives) 12 6 "%unrelated")]
117+ ['non-main same source' at (snag 7 negatives) (program-init-pending at (snag 7 negatives) 6 32 "~")]
118+ ['init and subs unresolved' at (snag 8 negatives) (program-init-pending at (snag 8 negatives) 6 32 "~")]
119+ :- 'API path'
120+ [/ui/api/program-main/jibb island 'module kind needs unsupported inference: /ui/api/program-main/jibb']
121+ :- 'store path'
122+ [/ui/stores/program-main/jibb island 'module kind needs unsupported inference: /ui/stores/program-main/jibb']
123+ ==
124+ (weld positives (program-init-negative-cases cases u.prepared))
125+::
126+++ test-program-init
127+ ^- tang
128+ =/ negatives=(list @t)
129+ :~ (text initializer-error)
130+ (text initializer-earlier)
131+ (text initializer-model)
132+ (text initializer-message)
133+ (text initializer-generic)
134+ (text initializer-missing)
135+ (text initializer-tag)
136+ (text initializer-no-main)
137+ (text initializer-subs)
138+ ==
139+ (turn (program-init-errors prelude internal (text initializer) (text initializer-consumer) (text initializer-unfaced) negatives) |=(reason=tape leaf+reason))
140+--
tests/lib/jibb-program-main.hoonnew file+141
@@ -0,0 +1,141 @@
1+:: Narrow closed program-main checking, without execution or watchability claims.
2+/+ jibb
3+/* prelude %jibb /lib/jibb/prelude/jibb
4+/* internal %jibb /lib/jibb/internal/jibb
5+/* source %txt /tests/type-program-main/source/txt
6+/* consumer %txt /tests/type-program-main/consumer/txt
7+/* gate-model %txt /tests/type-program-main/gate-model/txt
8+/* gate-data %txt /tests/type-program-main/gate-data/txt
9+/* nonempty-subs %txt /tests/type-program-main/nonempty-subs/txt
10+/* mismatched-model %txt /tests/type-program-main/mismatched-model/txt
11+/* arbitrary-main %txt /tests/type-program-main/arbitrary-main/txt
12+/* alias-main %txt /tests/type-program-main/alias-main/txt
13+/* open-message %txt /tests/type-program-main/open-message/txt
14+|%
15+++ text
16+ |= lines=wain
17+ ^- @t
18+ (rap 3 (turn lines |=(line=@t (cat 3 line '\0a'))))
19+::
20+++ program-prepared
21+ |= [public=@t private=@t]
22+ ^- (unit iprelude:jibb)
23+ (prepare-prelude-with-internal:jibb public private)
24+::
25+++ program-main-detailed
26+ |= [at=path src=@t modules=jbundle:jibb prepared=iprelude:jibb]
27+ ^- jfile-detailed-result:jibb
28+ (infer-jibb-file-detailed:jibb at src ~ ~ modules ~[at] values.prepared molds.prepared ~ `iface.prepared)
29+::
30+++ program-main-legacy
31+ |= [at=path src=@t modules=jbundle:jibb prepared=iprelude:jibb]
32+ ^- jfile-result:jibb
33+ (infer-jibb-file:jibb at src ~ ~ modules ~[at] values.prepared molds.prepared ~ `iface.prepared)
34+::
35+++ program-main-negative-errors
36+ |= [label=@t at=path src=@t prepared=iprelude:jibb]
37+ ^- (list tape)
38+ =/ detailed=jfile-detailed-result:jibb (program-main-detailed at src ~ prepared)
39+ ?: ?=(%& -.detailed) ~[(weld (trip label) ": structured check accepted")]
40+ ?. ?=(~ overlap.p.detailed) ~[(weld (trip label) ": unexpected overlap evidence")]
41+ =/ legacy=jfile-result:jibb (program-main-legacy at src ~ prepared)
42+ ?: ?=(%& -.legacy) ~[(weld (trip label) ": legacy check accepted")]
43+ ?. =(p.legacy message.p.detailed) ~[(weld (trip label) ": adapter messages differ")]
44+ ~
45+::
46+++ program-main-errors
47+ |= [public=@t private=@t island=@t downstream=@t negatives=(list @t)]
48+ ^- (list tape)
49+ =/ prepared=(unit iprelude:jibb)
50+ (program-prepared public private)
51+ ?~ prepared ~["synthetic program prelude did not prepare"]
52+ =/ at=path /tests/program-main/island/jibb
53+ =/ detailed=jfile-detailed-result:jibb (program-main-detailed at island ~ u.prepared)
54+ ?: ?=(%| -.detailed) ~["direct closed program main was rejected"]
55+ =/ checked=ifile:jibb iface.p.detailed
56+ ?~ graph.checked ~["program request graph evidence is missing"]
57+ =/ legacy=jfile-result:jibb (program-main-legacy at island ~ u.prepared)
58+ ?: ?=(%| -.legacy) ~["legacy adapter rejected a closed program main"]
59+ ?. =(values.checked values.iface.p.legacy) ~["structured and legacy interface values differ"]
60+ =/ init=(unit ischeme:jibb) (ienv-lookup:jibb %init values.checked)
61+ =/ update=(unit ischeme:jibb) (ienv-lookup:jibb %update values.checked)
62+ =/ view=(unit ischeme:jibb) (ienv-lookup:jibb %view values.checked)
63+ =/ subs=(unit ischeme:jibb) (ienv-lookup:jibb %subs values.checked)
64+ =/ main=(unit ischeme:jibb) (ienv-lookup:jibb %main values.checked)
65+ ?~ init ~["init interface is missing"]
66+ ?~ update ~["update interface is missing"]
67+ ?~ view ~["view interface is missing"]
68+ ?~ subs ~["subs interface is missing"]
69+ ?~ main ~["main interface is missing"]
70+ =/ parsed (parse:jibb at island)
71+ ?: ?=(%| -.parsed) ~["program source no longer parses"]
72+ =/ main-def=(unit def:jibb) (program-main-def:jibb defs.p.parsed)
73+ ?~ main-def ~["program main definition is missing"]
74+ =/ parts (program-main-parts:jibb u.main-def)
75+ ?~ parts ~["program main parts are missing"]
76+ ?: (program-main-closed:jibb u.parts defs.p.parsed values.checked ~ ~ u.graph.checked)
77+ ~["program kind was accepted without its source-backed prelude"]
78+ =/ program-scheme=(unit ischeme:jibb) (ienv-lookup:jibb %program values.iface.u.prepared)
79+ ?~ program-scheme ~["synthetic program scheme is missing"]
80+ ?. ?=(%fn -.typ.u.program-scheme) ~["synthetic program value is not a gate"]
81+ =/ broken-values=ienv:jibb
82+ (skim values.iface.u.prepared |=(entry=[name=term scheme=ischeme:jibb] !=(%program name.entry)))
83+ =/ broken=ifile:jibb
84+ iface.u.prepared(values [[%program [[%fn sample.typ.u.program-scheme [%atom %ud]] vars.u.program-scheme]] broken-values])
85+ =/ malformed=jfile-detailed-result:jibb
86+ (infer-jibb-file-detailed:jibb at island ~ ~ ~ ~[at] values.u.prepared molds.u.prepared ~ `broken)
87+ ?: ?=(%& -.malformed) ~["program result was not checked against the program mold"]
88+ =/ kind-error=@t (crip "module kind needs unsupported inference: {(spud at)}")
89+ ?. =(message.p.malformed kind-error) ~["malformed program failed before the kind check"]
90+ =/ open=jfile-detailed-result:jibb
91+ (program-main-detailed at (snag 6 negatives) ~ u.prepared)
92+ ?: ?=(%& -.open) ~["open program message was accepted"]
93+ =/ other-values=ienv:jibb
94+ (skim values.checked |=(entry=[name=term scheme=ischeme:jibb] !=(%main name.entry)))
95+ =/ open-values=ienv:jibb [[%main u.main(vars ~[0])] other-values]
96+ ?: (program-main-closed:jibb u.parts defs.p.parsed open-values `iface.u.prepared ~ u.graph.checked)
97+ ~["generic main scheme passed the closure check"]
98+ =/ model=itype:jibb [%face %count [%atom %ud]]
99+ ?. =(u.init [[%fn [%atom %t] model] ~]) ~["init interface type differs"]
100+ ?. ?=(~ vars.u.main) ~["main interface is not closed"]
101+ =/ init-fields=(list itype:jibb) (record-fields-named:jibb %init typ.u.main ~)
102+ =/ update-fields=(list itype:jibb) (record-fields-named:jibb %update typ.u.main ~)
103+ =/ view-fields=(list itype:jibb) (record-fields-named:jibb %view typ.u.main ~)
104+ =/ subs-fields=(list itype:jibb) (record-fields-named:jibb %subs typ.u.main ~)
105+ ?. =(init-fields ~[typ.u.init]) ~["main initializer field differs"]
106+ ?. &(=(1 (lent update-fields)) =(1 (lent view-fields)) =(1 (lent subs-fields)))
107+ ~["main component fields differ"]
108+ ?~ source.checked ~["program source evidence is missing"]
109+ ?. =(u.source.checked island) ~["program source evidence differs"]
110+ =/ consumer-at=path /tests/program-main/consumer/jibb
111+ =/ imported=jfile-detailed-result:jibb
112+ (program-main-detailed consumer-at downstream ~[[at island]] u.prepared)
113+ ?: ?=(%| -.imported) ~[(weld "ordinary downstream program import was rejected: " (trip message.p.imported))]
114+ =/ use=(unit ischeme:jibb) (ienv-lookup:jibb %imported values.iface.p.imported)
115+ ?~ use ~["downstream imported initializer is missing"]
116+ ?. =(u.use u.init) ~["downstream imported initializer type differs"]
117+ ?. =(7 (lent negatives)) ~["focused negative fixture count differs"]
118+ =/ cases=(list [label=@t at=path src=@t])
119+ :~ ['gate in model' at (snag 0 negatives)]
120+ ['gate in data' at (snag 1 negatives)]
121+ ['nonempty subs' at (snag 2 negatives)]
122+ ['mismatched model' at (snag 3 negatives)]
123+ ['arbitrary main' at (snag 4 negatives)]
124+ ['store path' /ui/stores/program-main/jibb island]
125+ ['program alias' at (snag 5 negatives)]
126+ ==
127+ (zing (turn cases |=(c=[label=@t at=path src=@t] (program-main-negative-errors label.c at.c src.c u.prepared))))
128+::
129+++ test-program-main
130+ ^- tang
131+ =/ negatives=(list @t)
132+ :~ (text gate-model)
133+ (text gate-data)
134+ (text nonempty-subs)
135+ (text mismatched-model)
136+ (text arbitrary-main)
137+ (text alias-main)
138+ (text open-message)
139+ ==
140+ (turn (program-main-errors prelude internal (text source) (text consumer) negatives) |=(reason=tape leaf+reason))
141+--
tests/lib/jibb-program-update.hoonnew file+140
@@ -0,0 +1,140 @@
1+:: Transactional direct-program update result context, without UI execution.
2+/+ jibb
3+/* prelude %jibb /lib/jibb/prelude/jibb
4+/* internal %jibb /lib/jibb/internal/jibb
5+/* source %txt /tests/type-program-update/source/txt
6+/* consumer %txt /tests/type-program-update/consumer/txt
7+/* wrong-result %txt /tests/type-program-update/wrong-result/txt
8+/* wrong-model %txt /tests/type-program-update/wrong-model/txt
9+/* wrong-message %txt /tests/type-program-update/wrong-message/txt
10+/* malformed-sample %txt /tests/type-program-update/malformed-sample/txt
11+/* three-slot-sample %txt /tests/type-program-update/three-slot-sample/txt
12+/* non-main %txt /tests/type-program-update/non-main/txt
13+/* unrelated-tag %txt /tests/type-program-update/unrelated-tag/txt
14+/* missing-list %txt /tests/type-program-update/missing-list/txt
15+|%
16+++ text
17+ |= lines=wain
18+ ^- @t
19+ (rap 3 (turn lines |=(line=@t (cat 3 line '\0a'))))
20+::
21+++ program-update-prepared
22+ |= [public=@t private=@t]
23+ ^- (unit iprelude:jibb)
24+ (prepare-prelude-with-internal:jibb public private)
25+::
26+++ program-update-detailed
27+ |= [at=path src=@t modules=jbundle:jibb prepared=iprelude:jibb]
28+ ^- jfile-detailed-result:jibb
29+ (infer-jibb-file-detailed:jibb at src ~ ~ modules ~[at] values.prepared molds.prepared ~ `iface.prepared)
30+::
31+++ program-update-legacy
32+ |= [at=path src=@t modules=jbundle:jibb prepared=iprelude:jibb]
33+ ^- jfile-result:jibb
34+ (infer-jibb-file:jibb at src ~ ~ modules ~[at] values.prepared molds.prepared ~ `iface.prepared)
35+::
36+++ program-update-positive
37+ |= [at=path src=@t downstream=@t prepared=iprelude:jibb]
38+ ^- (list tape)
39+ =/ detailed=jfile-detailed-result:jibb (program-update-detailed at src ~ prepared)
40+ ?: ?=(%| -.detailed) ~["contextual direct program update was rejected"]
41+ =/ checked=ifile:jibb iface.p.detailed
42+ =/ legacy=jfile-result:jibb (program-update-legacy at src ~ prepared)
43+ ?: ?=(%| -.legacy) ~["legacy adapter rejected contextual update"]
44+ ?. =(values.checked values.iface.p.legacy) ~["contextual structured and legacy values differ"]
45+ =/ update=(unit ischeme:jibb) (ienv-lookup:jibb %update values.checked)
46+ =/ main=(unit ischeme:jibb) (ienv-lookup:jibb %main values.checked)
47+ ?~ update ~["contextual update interface is missing"]
48+ ?~ main ~["contextual main interface is missing"]
49+ ?. ?=(~ vars.u.update) ~["contextual update interface is not closed"]
50+ =/ expected=tape "$-([event=message current=[count=@ud]] [count=@ud (list (cmd message))])"
51+ ?. =((show-itype:jibb typ.u.update ~) expected) ~["contextual update interface type differs"]
52+ ?. ?=(~ vars.u.main) ~["contextual main interface is not closed"]
53+ =/ fields=(list itype:jibb) (record-fields-named:jibb %update typ.u.main ~)
54+ ?. ?=([* ~] fields) ~["contextual main update field is missing"]
55+ =/ main-expected=tape "$-([message count=@ud] [count=@ud (list (cmd message))])"
56+ ?. =((show-itype:jibb i.fields ~) main-expected) ~["contextual main update field differs"]
57+ ?~ source.checked ~["contextual program source evidence is missing"]
58+ ?. =(u.source.checked src) ~["contextual program source evidence differs"]
59+ ?~ graph.checked ~["contextual program request graph is missing"]
60+ =/ consumer-at=path /tests/program-update/consumer/jibb
61+ =/ imported=jfile-detailed-result:jibb
62+ (program-update-detailed consumer-at downstream ~[[at src]] prepared)
63+ ?: ?=(%| -.imported) ~[(weld "downstream contextual update import was rejected: " (trip message.p.imported))]
64+ =/ use=(unit ischeme:jibb) (ienv-lookup:jibb %imported values.iface.p.imported)
65+ ?~ use ~["downstream contextual update is missing"]
66+ =/ imported-expected=tape "$-([message.island-prog count=@ud] [count=@ud (list (cmd message.island-prog))])"
67+ ?. =((show-itype:jibb typ.u.use ~) imported-expected) ~["downstream contextual update type differs"]
68+ ?. ?=(~ vars.u.use) ~["downstream contextual update is not closed"]
69+ ~
70+::
71+++ program-update-negative
72+ |= [label=@t at=path src=@t boundary=@t prepared=iprelude:jibb]
73+ ^- (list tape)
74+ =/ detailed=jfile-detailed-result:jibb (program-update-detailed at src ~ prepared)
75+ ?: ?=(%& -.detailed) ~[(weld (trip label) ": structured check accepted")]
76+ ?. ?=(~ overlap.p.detailed) ~[(weld (trip label) ": unexpected overlap evidence")]
77+ ?. =(message.p.detailed boundary)
78+ ~[(weld (weld (trip label) ": rejected at the wrong boundary: ") (trip message.p.detailed))]
79+ =/ legacy=jfile-result:jibb (program-update-legacy at src ~ prepared)
80+ ?: ?=(%& -.legacy) ~[(weld (trip label) ": legacy check accepted")]
81+ ?. =(p.legacy boundary) ~[(weld (trip label) ": legacy boundary differs")]
82+ ~
83+::
84+++ program-update-negative-cases
85+ |= [cases=(list [label=@t at=path src=@t boundary=@t prepared=iprelude:jibb])]
86+ ^- (list tape)
87+ ?~ cases ~
88+ %+ weld
89+ (program-update-negative label.i.cases at.i.cases src.i.cases boundary.i.cases prepared.i.cases)
90+ $(cases t.cases)
91+::
92+++ program-update-errors
93+ |= [public=@t private=@t island=@t downstream=@t negatives=(list @t)]
94+ ^- (list tape)
95+ =/ prepared=(unit iprelude:jibb) (program-update-prepared public private)
96+ ?~ prepared ~["synthetic program prelude did not prepare for contextual update"]
97+ ?. =(8 (lent negatives)) ~["contextual update negative fixture count differs"]
98+ =/ at=path /tests/program-update/island/jibb
99+ =/ definitions=@t (crip "module definitions need unsupported inference: {(spud at)}")
100+ =/ without-cmd=iprelude:jibb
101+ =/ kept=imold-types:jibb
102+ (skim molds.iface.u.prepared |=(m=[name=term template=ischeme:jibb] !=(%cmd name.m)))
103+ [iface.u.prepared(molds kept) values.u.prepared molds.u.prepared]
104+ =/ without-list=iprelude:jibb
105+ =/ kept=imold-types:jibb
106+ (skim molds.iface.u.prepared |=(m=[name=term template=ischeme:jibb] !=(%list name.m)))
107+ [iface.u.prepared(molds kept) values.u.prepared molds.u.prepared]
108+ =/ cases=(list [label=@t at=path src=@t boundary=@t prepared=iprelude:jibb])
109+ :~ ['wrong result constructor' at (snag 0 negatives) definitions u.prepared]
110+ ['inconsistent model' at (snag 1 negatives) definitions u.prepared]
111+ ['inconsistent message' at (snag 2 negatives) definitions u.prepared]
112+ ['malformed sample' at (snag 3 negatives) definitions u.prepared]
113+ ['non-two-slot sample' at (snag 4 negatives) definitions u.prepared]
114+ ['non-main same source' at (snag 5 negatives) definitions u.prepared]
115+ ['unrelated pending tag' at (snag 6 negatives) (show-error:jibb (snag 6 negatives) [at 16 13 "nothing fixes the union of %unrelated"]) u.prepared]
116+ ['missing canonical cmd' at island definitions without-cmd]
117+ ['missing canonical list' at (snag 7 negatives) definitions without-list]
118+ :- 'API path'
119+ [/ui/api/program-update/jibb island 'module kind needs unsupported inference: /ui/api/program-update/jibb' u.prepared]
120+ :- 'store path'
121+ [/ui/stores/program-update/jibb island 'module kind needs unsupported inference: /ui/stores/program-update/jibb' u.prepared]
122+ ==
123+ %+ weld
124+ (program-update-positive at island downstream u.prepared)
125+ (program-update-negative-cases cases)
126+::
127+++ test-program-update
128+ ^- tang
129+ =/ negatives=(list @t)
130+ :~ (text wrong-result)
131+ (text wrong-model)
132+ (text wrong-message)
133+ (text malformed-sample)
134+ (text three-slot-sample)
135+ (text non-main)
136+ (text unrelated-tag)
137+ (text missing-list)
138+ ==
139+ (turn (program-update-errors prelude internal (text source) (text consumer) negatives) |=(reason=tape leaf+reason))
140+--
tests/lib/jibb-program-watch.hoonnew file+209
@@ -0,0 +1,209 @@
1+:: Direct request-value watchability for a synthetic program over the real todo API.
2+/+ jibb, jibb-import
3+/* prelude %jibb /lib/jibb/prelude/jibb
4+/* internal %jibb /lib/jibb/internal/jibb
5+/* sur %txt /tests/type-api-paths/todo-sur/txt
6+/* action %txt /tests/type-api-paths/todo-action/txt
7+/* todos %txt /tests/type-api-paths/todos/txt
8+/* update %txt /tests/type-api-paths/todo-update/txt
9+/* item %txt /tests/type-api-paths/todo-item/txt
10+/* api %txt /tests/type-api-paths/api/txt
11+|%
12+++ text
13+ |= lines=wain
14+ ^- @t
15+ (rap 3 (turn lines |=(line=@t (cat 3 line '\0a'))))
16+::
17+++ program-watch-prepared
18+ |= [public=@t private=@t]
19+ ^- (unit iprelude:jibb)
20+ (prepare-prelude-with-internal:jibb public private)
21+::
22+++ program-watch-detailed
23+ |= [at=path src=@t externals=iexternals:jibb marks=imark-externals:jibb modules=jbundle:jibb prepared=iprelude:jibb]
24+ ^- jfile-detailed-result:jibb
25+ (infer-jibb-file-detailed:jibb at src externals marks modules ~[at] values.prepared molds.prepared ~ `iface.prepared)
26+::
27+++ program-watch-source
28+ |= [extra=@t subscriptions=@t]
29+ ^- @t
30+ %+ rap 3
31+ :~ '/= api /ui/api/todo\0a'
32+ '+$ model [count=@ud]\0a'
33+ '+$ msg\0a [%got todos=(list item.api)]\0a [%one item=todo-item.api]\0a %other\0a'
34+ extra
35+ '++ main (program init update view subs)\0a'
36+ '++ init |= input=@t ^- model [count=0]\0a'
37+ '++ update |= [m=msg state=model]\0a ^- [model (list (cmd msg))] [state ~]\0a'
38+ '++ view |= state=model ^- (element msg) (text "view")\0a'
39+ subscriptions
40+ ==
41+::
42+++ program-watch-agent-source
43+ ^- @t
44+ %+ rap 3
45+ :~ '/= api /ui/api/todo\0a'
46+ '+$ model [count=@ud]\0a'
47+ '++ receive |= input=[mark=@tas state=(unit *) fact=*]\0a ^- [state=* message=@t] [state=0 message="ok"]\0a'
48+ '++ request-path ^- path ~[%todos]\0a'
49+ '++ request ^- (ask @t)\0a [%agent api="/ui/api/todo" case=%todos agent=%todo path=request-path scry=~ receive=receive]\0a'
50+ '++ main (program init update view subs)\0a'
51+ '++ init |= input=@t ^- model [count=0]\0a'
52+ '++ update |= [m=@t state=model]\0a ^- [model (list (cmd @t))] [state ~]\0a'
53+ '++ view |= state=model ^- (element @t) (text "ok")\0a'
54+ '++ subs |= state=model\0a ^- (list (sub @t))\0a ~[[%watch request]]\0a'
55+ ==
56+::
57+++ program-watch-errors
58+ |= [public=@t private=@t sur=@t action=@t todos=@t update=@t item=@t api=@t]
59+ ^- (list tape)
60+ =/ prepared=(unit iprelude:jibb) (program-watch-prepared public private)
61+ ?~ prepared ~["synthetic program prelude did not prepare"]
62+ =/ todo=type -:(ride -:!>(..zuse) sur)
63+ =/ subject=type [%cell [%face %todo todo] -:!>(..zuse)]
64+ =/ ma=* (read-mark:jibb-import %todo-action -:(ride subject action))
65+ =/ mt=* (read-mark:jibb-import %todos -:(ride subject todos))
66+ =/ mu=* (read-mark:jibb-import %todo-update -:(ride subject update))
67+ =/ mi=* (read-mark:jibb-import %todo-item -:(ride subject item))
68+ =/ marks=imark-externals:jibb ~[[%todo-action ma] [%todos mt] [%todo-update mu] [%todo-item mi]]
69+ =/ item-input=* (read-named:jibb-import %todo %item todo)
70+ =/ externals=iexternals:jibb ~[[%todo %item item-input]]
71+ =/ api-at=path /ui/api/todo/jibb
72+ =/ api-result=jfile-detailed-result:jibb
73+ (program-watch-detailed api-at api externals marks ~ u.prepared)
74+ ?: ?=(%| -.api-result) ~["real todo API did not check"]
75+ =/ api-iface=ifile:jibb iface.p.api-result
76+ ?~ graph.api-iface ~["real todo API evidence is missing"]
77+ =/ direct-subs=@t '++ subs |= state=model\0a ^- (list (sub msg))\0a ~[[%watch (todos.api |=%got)]]\0a'
78+ =/ island=@t (program-watch-source '' direct-subs)
79+ =/ at=path /tests/program-watch/island/jibb
80+ =/ modules=jbundle:jibb ~[[api-at api]]
81+ =/ detailed=jfile-detailed-result:jibb
82+ (program-watch-detailed at island externals marks modules u.prepared)
83+ ?: ?=(%| -.detailed) ~[(weld "direct request watch was rejected: " (trip message.p.detailed))]
84+ =/ checked=ifile:jibb iface.p.detailed
85+ ?~ graph.checked ~["program request graph evidence is missing"]
86+ =/ legacy=jfile-result:jibb
87+ (infer-jibb-file:jibb at island externals marks modules ~[at] values.u.prepared molds.u.prepared ~ `iface.u.prepared)
88+ ?: ?=(%| -.legacy) ~["legacy adapter rejected a direct request watch"]
89+ ?. =(values.checked values.iface.p.legacy) ~["structured and legacy interface values differ"]
90+ =/ subs=(unit ischeme:jibb) (ienv-lookup:jibb %subs values.checked)
91+ =/ main=(unit ischeme:jibb) (ienv-lookup:jibb %main values.checked)
92+ ?~ subs ~["subs interface is missing"]
93+ ?~ main ~["main interface is missing"]
94+ ?. &(?=(~ vars.u.subs) ?=(~ (itype-vars:jibb typ.u.subs))) ~["subs interface is not closed"]
95+ =/ subs-fields=(list itype:jibb) (record-fields-named:jibb %subs typ.u.main ~)
96+ ?. ?=([* ~] subs-fields) ~["closed program does not have one subs field"]
97+ =/ model=(unit ischeme:jibb) (find-jibb-mold:jibb %model checked)
98+ =/ msg=(unit ischeme:jibb) (find-jibb-mold:jibb %msg checked)
99+ =/ list-template=(unit ischeme:jibb) (find-jibb-mold:jibb %list iface.u.prepared)
100+ =/ sub=(unit ischeme:jibb) (find-jibb-mold:jibb %sub iface.u.prepared)
101+ ?~ model ~["model mold is missing"]
102+ ?~ msg ~["message mold is missing"]
103+ ?~ list-template ~["list mold is missing"]
104+ ?~ sub ~["sub mold is missing"]
105+ =/ message-sub=(unit itype:jibb) (template-apply:jibb u.sub ~[typ.u.msg])
106+ ?~ message-sub ~["message subscription type did not instantiate"]
107+ =/ subs-result=(unit itype:jibb) (template-apply:jibb u.list-template ~[u.message-sub])
108+ ?~ subs-result ~["subscription list type did not instantiate"]
109+ =/ expected-subs=itype:jibb [%fn typ.u.model u.subs-result]
110+ ?. =(typ.u.subs expected-subs) ~["subs interface has the wrong exact type"]
111+ ?. =((lent requests.u.graph.checked) (lent requests.u.graph.api-iface)) ~["merged API evidence count differs"]
112+ ?. (levy requests.u.graph.checked |=(r=irequest-evidence:jibb (lien requests.u.graph.api-iface |=(a=irequest-evidence:jibb =(r a))))) ~["merged API evidence differs"]
113+ =/ matching=(list irequest-evidence:jibb)
114+ (skim requests.u.graph.checked |=(r=irequest-evidence:jibb &(=(api-at.r api-at) =(%todos name.r))))
115+ ?. ?=([* ~] matching) ~["direct todos evidence is not unique"]
116+ =/ evidence=irequest-evidence:jibb i.matching
117+ ?. =(api-source.evidence api) ~["request evidence does not retain the exact API source"]
118+ ?. &(?=(~ scry.path.path.evidence) ?=(~ diffs.path.evidence) ?=(~ diffs.path.path.evidence))
119+ ~["plain todos evidence acquired scry or diffs"]
120+ ?: (lien segments.path.path.evidence |=(p=pseg:jibb !?=(%knot -.p))) ~["plain todos evidence acquired parameters"]
121+ =/ consumer-at=path /tests/program-watch/consumer/jibb
122+ =/ consumer=@t '/= island-prog /tests/program-watch/island\0a++ imported subs.island-prog\0a'
123+ =/ imported=jfile-detailed-result:jibb
124+ (program-watch-detailed consumer-at consumer externals marks [[at island] modules] u.prepared)
125+ ?: ?=(%| -.imported) ~["downstream program import was rejected"]
126+ =/ imported-subs=(unit ischeme:jibb) (ienv-lookup:jibb %imported values.iface.p.imported)
127+ ?~ imported-subs ~["downstream imported subs is missing"]
128+ =/ expected-import=itype:jibb (itype-in-import:jibb typ.u.subs checked %island-prog `iface.u.prepared)
129+ ?. &(?=(~ vars.u.imported-subs) =(typ.u.imported-subs expected-import)) ~["downstream imported subs type differs"]
130+ =/ parsed (parse:jibb at island)
131+ ?: ?=(%| -.parsed) ~["program source no longer parses"]
132+ =/ main-def=(unit def:jibb) (program-main-def:jibb defs.p.parsed)
133+ ?~ main-def ~["program main definition is missing"]
134+ =/ parts (program-main-parts:jibb u.main-def)
135+ ?~ parts ~["program main parts are missing"]
136+ =/ resolved=ijimports:jibb ~[[%api api-iface]]
137+ =/ others=(list irequest-evidence:jibb)
138+ (skim requests.u.graph.checked |=(r=irequest-evidence:jibb !&(=(api-at.r api-at) =(%todos name.r))))
139+ =/ missing=irequest-graph:jibb u.graph.checked(requests others)
140+ =/ mismatch=irequest-graph:jibb u.graph.checked(requests [evidence(api-source 'mismatched') others])
141+ =/ scry=irequest-graph:jibb u.graph.checked(requests [evidence(scry.path.path `~[[%knot ~.peek]]) others])
142+ =/ ambiguous=irequest-graph:jibb u.graph.checked(requests [evidence requests.u.graph.checked])
143+ =/ evidence-cases=(list [label=tape graph=irequest-graph:jibb])
144+ :~ ["missing evidence" missing]
145+ ["API-source mismatch" mismatch]
146+ ["scry declaration evidence" scry]
147+ ["ambiguous evidence" ambiguous]
148+ ==
149+ =/ evidence-failures=(list tape)
150+ %+ murn evidence-cases
151+ |= c=[label=tape graph=irequest-graph:jibb]
152+ ?: (program-main-closed:jibb u.parts defs.p.parsed values.checked `iface.u.prepared resolved graph.c)
153+ `label.c
154+ ~
155+ ?^ evidence-failures ~[(weld "bad evidence passed watchability: " i.evidence-failures)]
156+ =/ ordinary-values=ienv:jibb
157+ (skim values.api-iface |=(entry=[name=term scheme=ischeme:jibb] !=(%todos name.entry)))
158+ =/ forged=ifile:jibb
159+ api-iface(values [[%todos [[%fn [%atom %t] [%atom %t]] ~]] ordinary-values])
160+ ?: (program-main-closed:jibb u.parts defs.p.parsed values.checked `iface.u.prepared ~[[%api forged]] u.graph.checked)
161+ ~["same-named non-derived member passed watchability"]
162+ =/ detached=ifile:jibb api-iface(graph `u.graph.api-iface(requests ~))
163+ ?: (program-main-closed:jibb u.parts defs.p.parsed values.checked `iface.u.prepared ~[[%api detached]] u.graph.checked)
164+ ~["evidence outside the selected interface passed watchability"]
165+ =/ incoherent=irequest-evidence:jibb evidence(name.path.path %other)
166+ =/ api-others=(list irequest-evidence:jibb)
167+ (skim requests.u.graph.api-iface |=(r=irequest-evidence:jibb !&(=(api-at.r api-at) =(%todos name.r))))
168+ =/ incoherent-api=ifile:jibb api-iface(graph `u.graph.api-iface(requests [incoherent api-others]))
169+ =/ incoherent-graph=irequest-graph:jibb u.graph.checked(requests [incoherent others])
170+ ?: (program-main-closed:jibb u.parts defs.p.parsed values.checked `iface.u.prepared ~[[%api incoherent-api]] incoherent-graph)
171+ ~["inconsistent request case names passed watchability"]
172+ =/ kind-error=@t (crip "module kind needs unsupported inference: {(spud at)}")
173+ =/ negatives=(list [label=tape src=@t])
174+ :~ :- "pure watch"
175+ (program-watch-source '' '++ subs |= state=model\0a ^- (list (sub msg))\0a ~[[%watch (pure %other)]]\0a')
176+ :- "correctly typed hand-built agent"
177+ program-watch-agent-source
178+ :- "request helper"
179+ (program-watch-source '++ request ^- (ask msg) (todos.api |=%got)\0a' '++ subs |= state=model\0a ^- (list (sub msg))\0a ~[[%watch request]]\0a')
180+ :- "request alias"
181+ (program-watch-source '++ request todos.api\0a' '++ subs |= state=model\0a ^- (list (sub msg))\0a ~[[%watch (request |=%got)]]\0a')
182+ :- "parameterized todo-by-id"
183+ (program-watch-source '' '++ subs |= state=model\0a ^- (list (sub msg))\0a ~[[%watch (todo-by-id.api 1 |=%one)]]\0a')
184+ :- "diff changes"
185+ (program-watch-source '++ fold |= [d=[%todo-update todo-update.api] s=todos.api] s\0a' '++ subs |= state=model\0a ^- (list (sub msg))\0a ~[[%watch (changes.api |=%got fold)]]\0a')
186+ :- "multi-item subscriptions"
187+ (program-watch-source '++ first ^- (sub msg) [%watch (todos.api |=%got)]\0a++ second ^- (sub msg) [%watch (pure %other)]\0a' '++ subs |= state=model\0a ^- (list (sub msg))\0a ~[first second]\0a')
188+ ==
189+ %+ weld (turn evidence-failures |=(reason=tape reason))
190+ %+ murn negatives
191+ |= c=[label=tape src=@t]
192+ =/ bad=jfile-detailed-result:jibb
193+ (program-watch-detailed at src.c externals marks modules u.prepared)
194+ ?: ?=(%& -.bad) `[(weld label.c ": accepted")]
195+ ?. =(message.p.bad kind-error) `[(weld label.c ": did not reach watchability")]
196+ ~
197+::
198+++ test-program-watch
199+ ^- tang
200+ ?~ sur ~[leaf+"program-watch fixture sur is missing"]
201+ ?~ action ~[leaf+"program-watch fixture action is missing"]
202+ ?~ todos ~[leaf+"program-watch fixture todos is missing"]
203+ ?~ update ~[leaf+"program-watch fixture update is missing"]
204+ ?~ item ~[leaf+"program-watch fixture item is missing"]
205+ ?~ api ~[leaf+"program-watch fixture api is missing"]
206+ =/ failures=(list tape)
207+ (program-watch-errors prelude internal (text sur) (text action) (text todos) (text update) (text item) (text api))
208+ (turn failures |=(reason=tape leaf+reason))
209+--
tests/lib/jibb-request-guards.hoon+2−2
@@ -127,8 +127,8 @@
127127 =/ bad-cache=jcache:jibb ~[[helper-at mismatched]]
128128 =/ wrong (infer-jibb-file:jibb client transitive ~ marks bundle ~[client] values.u.prep molds.u.prep bad-cache pre)
129129 ?: ?=(%& -.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'
130+ =/ old-client=@t '++ text-value "safe"\0a'
131+ =/ dep=@t '/= c /lib/client\0a++ value text-value.c\0a'
132132 =/ root=@t '/= h /lib/helper\0a++ x value.h\0a'
133133 =/ cycle-bundle=jbundle:jibb ~[[client old-client] [helper-at dep]]
134134 =/ cycle-legacy=ifile:jibb legacy(source `dep)
tests/lib/jibb-store.hoonnew file+285
@@ -0,0 +1,285 @@
1+:: Unchanged cart store and basket, derived requests, and rejection guards.
2+/+ jibb
3+/* prelude %jibb /lib/jibb/prelude/jibb
4+/* internal %jibb /lib/jibb/internal/jibb
5+/* cart %txt /tests/type-store/cart/txt
6+/* basket %txt /tests/type-store/basket/txt
7+|%
8+++ text
9+ |= lines=wain
10+ ^- @t
11+ (rap 3 (turn lines |=(line=@t (cat 3 line '\0a'))))
12+::
13+++ store-detailed
14+ |= [at=path src=@t modules=jbundle:jibb prepared=iprelude:jibb]
15+ ^- jfile-detailed-result:jibb
16+ (infer-jibb-file-detailed:jibb at src ~ ~ modules ~[at] values.prepared molds.prepared ~ `iface.prepared)
17+::
18+++ store-legacy
19+ |= [at=path src=@t modules=jbundle:jibb prepared=iprelude:jibb]
20+ ^- jfile-result:jibb
21+ (infer-jibb-file:jibb at src ~ ~ modules ~[at] values.prepared molds.prepared ~ `iface.prepared)
22+::
23+++ store-cart-source
24+ |= [poke=@t main=@t init=@t update=@t extra=@t]
25+ ^- @t
26+ %+ rap 3
27+ :~ '+$ state [items=(list @t) open=?]\0a'
28+ poke main init update extra
29+ ==
30+::
31+++ store-basket-source
32+ |= [update=@t subs=@t extra=@t]
33+ ^- @t
34+ %+ rap 3
35+ :~ '/= cart /ui/stores/cart\0a'
36+ '++ main (program init update view subs)\0a'
37+ '+$ model [cart=state.cart note=@t]\0a'
38+ '+$ msg\0a [%noted text=@t]\0a %add\0a %toggle\0a [%got cart=state.cart]\0a [%acked err=(unit @t)]\0a'
39+ '++ init |= ~\0a [[~ %.n] ""]\0a'
40+ update subs
41+ '++ view |= m=model\0a column ~[gap+%s1] ~[\0a (text "{(lent items.cart.m)} items")\0a field "Item" note.m |=%noted\0a button "Add" %add\0a'
42+ extra
43+ ==
44+::
45+++ store-consumer-source
46+ ^- @t
47+ %+ rap 3
48+ :~ '/= cart /ui/stores/cart\0a'
49+ '+$ local-state state.cart\0a'
50+ '+$ local-action poke.cart\0a'
51+ '++ imported-main main.cart\0a'
52+ '++ imported-request |= reply=$-(local-state M) (state.cart reply)\0a'
53+ '++ imported-poke |= action=local-action (poke.cart action same)\0a'
54+ ==
55+::
56+++ store-rejections
57+ |= [cases=(list [label=tape at=path src=@t modules=jbundle:jibb]) prepared=iprelude:jibb]
58+ ^- (list tape)
59+ %+ murn cases
60+ |= c=[label=tape at=path src=@t modules=jbundle:jibb]
61+ =/ result=jfile-detailed-result:jibb
62+ (store-detailed at.c src.c modules.c prepared)
63+ ?: ?=(%| -.result) ~
64+ `(weld label.c ": accepted")
65+::
66+++ store-evidence-failures
67+ |= [cart=ifile:jibb basket=ifile:jibb src=@t prelude=ifile:jibb]
68+ ^- (list tape)
69+ ?~ graph.cart ~["cart evidence is missing"]
70+ ?~ graph.basket ~["basket evidence is missing"]
71+ =/ parsed (parse:jibb /ui/basket/jibb src)
72+ ?: ?=(%| -.parsed) ~["basket evidence source does not parse"]
73+ =/ main=(unit def:jibb) (program-main-def:jibb defs.p.parsed)
74+ ?~ main ~["basket evidence main is missing"]
75+ =/ parts=(unit [init=term update=term view=term subs=term])
76+ (program-main-parts:jibb u.main)
77+ ?~ parts ~["basket evidence main parts are missing"]
78+ ?. ?=([* ~] stores.u.graph.cart) ~["cart store evidence is not unique"]
79+ =/ evidence=istore-request-evidence:jibb i.stores.u.graph.cart
80+ =/ imports=ijimports:jibb ~[[%cart cart]]
81+ =/ missing=irequest-graph:jibb u.graph.basket(stores ~)
82+ =/ mismatch=irequest-graph:jibb
83+ u.graph.basket(stores ~[evidence(source 'mismatched')])
84+ =/ ambiguous=irequest-graph:jibb
85+ u.graph.basket(stores ~[evidence evidence])
86+ =/ many=(list istore-request-evidence:jibb)
87+ %+ turn (gulf 0 255)
88+ |= n=@ud
89+ evidence(store-at (stab (crip "/ui/stores/{(a-co:co n)}/jibb")))
90+ =/ oversized=irequest-graph:jibb u.graph.basket(stores [evidence many])
91+ ?: (request-graph-bounded:jibb oversized) ~["oversized request graph was accepted"]
92+ =/ detached=ifile:jibb cart(graph `u.graph.cart(stores ~))
93+ =/ ordinary=ienv:jibb
94+ (skim values.cart |=(entry=[name=term scheme=ischeme:jibb] !=(%state name.entry)))
95+ =/ forged=ifile:jibb
96+ cart(values [[%state [[%fn [%atom %t] [%atom %t]] ~]] ordinary])
97+ =/ without-action=ienv:jibb
98+ (skim values.cart |=(entry=[name=term scheme=ischeme:jibb] !=(%poke name.entry)))
99+ =/ forged-action=ifile:jibb
100+ cart(values [[%poke [[%fn [%atom %t] [%atom %t]] ~]] without-action])
101+ =/ graphs=(list [label=tape graph=irequest-graph:jibb])
102+ :~ ["missing store evidence" missing]
103+ ["store source mismatch" mismatch]
104+ ["ambiguous store evidence" ambiguous]
105+ ==
106+ =/ failures=(list tape)
107+ %+ murn graphs
108+ |= c=[label=tape graph=irequest-graph:jibb]
109+ ?: (program-main-closed:jibb u.parts defs.p.parsed values.basket `prelude imports graph.c)
110+ `label.c
111+ ~
112+ =? failures (program-main-closed:jibb u.parts defs.p.parsed values.basket `prelude ~[[%cart detached]] u.graph.basket)
113+ ["evidence outside the store interface" failures]
114+ =? failures (program-main-closed:jibb u.parts defs.p.parsed values.basket `prelude ~[[%cart forged]] u.graph.basket)
115+ ["forged state member" failures]
116+ =? failures (program-main-closed:jibb u.parts defs.p.parsed values.basket `prelude ~[[%cart forged-action]] u.graph.basket)
117+ ["forged action constructor" failures]
118+ failures
119+::
120+++ store-errors
121+ |= [public=@t private=@t cart-source=@t basket-source=@t]
122+ ^- (list tape)
123+ =/ prepared=(unit iprelude:jibb)
124+ (prepare-prelude-with-internal:jibb public private)
125+ ?~ prepared ~["store prelude did not prepare"]
126+ =/ store-value=(unit ischeme:jibb) (ienv-lookup:jibb %store values.iface.u.prepared)
127+ =/ store-mold=(unit ischeme:jibb) (find-jibb-mold:jibb %store iface.u.prepared)
128+ ?~ store-value ~["store builder is missing"]
129+ ?~ store-mold ~["store mold is missing"]
130+ =/ expected-builder=itype:jibb
131+ [%fn [%cell [%face %init [%var 0]] [%face %update [%fn [%cell [%var 1] [%var 0]] [%var 0]]]] [%cell [%face %init [%var 0]] [%face %update [%noun ~]]]]
132+ ?. &(?=([@ @ ~] vars.u.store-value) =(typ.u.store-value expected-builder)) ~["store builder scheme differs"]
133+ =/ expected-mold=itype:jibb [%cell [%face %init [%var 0]] [%face %update [%noun ~]]]
134+ ?. &(?=([@ ~] vars.u.store-mold) =(typ.u.store-mold expected-mold)) ~["store mold scheme differs"]
135+ =/ cart-at=path /ui/stores/cart/jibb
136+ =/ modules=jbundle:jibb ~[[cart-at cart-source]]
137+ =/ detailed=jfile-detailed-result:jibb
138+ (store-detailed cart-at cart-source ~ u.prepared)
139+ ?: ?=(%| -.detailed) ~[(weld "cart was rejected: " (trip message.p.detailed))]
140+ =/ cart=ifile:jibb iface.p.detailed
141+ =/ legacy=jfile-result:jibb (store-legacy cart-at cart-source ~ u.prepared)
142+ ?: ?=(%| -.legacy) ~["legacy cart was rejected"]
143+ ?. =(values.cart values.iface.p.legacy) ~["detailed and legacy cart values differ"]
144+ ?. =(molds.cart molds.iface.p.legacy) ~["detailed and legacy cart molds differ"]
145+ =/ cart-main=(unit ischeme:jibb) (ienv-lookup:jibb %main values.cart)
146+ ?~ cart-main ~["cart main is missing"]
147+ =/ actual-main=@t (crip (show-itype:jibb typ.u.cart-main ~))
148+ ?. =(actual-main '[init=[items=(list @t) open=?] update=*]') ~["cart main type differs"]
149+ ?. &(?=(~ vars.u.cart-main) ?=(~ (itype-vars:jibb typ.u.cart-main))) ~["cart main is open"]
150+ =/ state=(unit ischeme:jibb) (find-jibb-mold:jibb %state cart)
151+ =/ action=(unit ischeme:jibb) (find-jibb-mold:jibb %poke cart)
152+ ?~ state ~["state mold is missing"]
153+ ?~ action ~["local poke action mold is missing"]
154+ =/ ask=(unit ischeme:jibb) (request-compatible-ask:jibb u.prepared)
155+ =/ poke=(unit ischeme:jibb) (compatible-raw-poke:jibb u.prepared)
156+ ?~ ask ~["canonical ask is unavailable"]
157+ ?~ poke ~["canonical poke is unavailable"]
158+ =/ ask-result=(unit itype:jibb) (template-apply:jibb u.ask ~[[%var 0]])
159+ ?~ ask-result ~["canonical ask did not instantiate"]
160+ =/ expected-state=ischeme:jibb [[%fn [%fn typ.u.state [%var 0]] u.ask-result] ~[0]]
161+ =/ expected-action=(unit ischeme:jibb) (derived-poke-command-scheme:jibb iface.u.prepared typ.u.action)
162+ ?~ expected-action ~["derived action scheme did not instantiate"]
163+ =/ command=(unit ischeme:jibb) (find-jibb-mold:jibb %cmd iface.u.prepared)
164+ =/ unit-template=(unit ischeme:jibb) (find-jibb-mold:jibb %unit iface.u.prepared)
165+ ?~ command ~["canonical cmd mold is missing"]
166+ ?~ unit-template ~["canonical unit mold is missing"]
167+ ?. ?=(%union -.typ.u.command) ~["canonical cmd is not a union"]
168+ =/ wrong-command=ischeme:jibb u.command(typ typ.u.command(cases ~))
169+ =/ wrong-command-prelude=ifile:jibb
170+ iface.u.prepared(molds (turn molds.iface.u.prepared |=(m=[name=term template=ischeme:jibb] ?:(=(%cmd name.m) [%cmd wrong-command] m))))
171+ ?. ?=(~ (derived-poke-command-scheme:jibb wrong-command-prelude typ.u.action))
172+ ~["derived poke accepted a noncanonical cmd"]
173+ =/ wrong-unit-prelude=ifile:jibb
174+ iface.u.prepared(molds (turn molds.iface.u.prepared |=(m=[name=term template=ischeme:jibb] ?:(=(%unit name.m) [%unit u.command] m))))
175+ ?. ?=(~ (derived-poke-command-scheme:jibb wrong-unit-prelude typ.u.action))
176+ ~["derived poke accepted a noncanonical unit"]
177+ =/ wrong-raw=ischeme:jibb u.poke(vars ~[0])
178+ =/ wrong-raw-prelude=ifile:jibb
179+ iface.u.prepared(molds (turn molds.iface.u.prepared |=(m=[name=term template=ischeme:jibb] ?:(=(%raw-poke name.m) [%raw-poke wrong-raw] m))))
180+ ?. ?=(~ (derived-poke-command-scheme:jibb wrong-raw-prelude typ.u.action))
181+ ~["derived poke accepted a generic raw-poke"]
182+ ?. ?=(%union -.typ.u.poke) ~["canonical raw-poke is not a union"]
183+ =/ wrong-raw-args=ischeme:jibb u.poke(typ typ.u.poke(args ~[[%atom %t]]))
184+ =/ wrong-raw-args-prelude=ifile:jibb
185+ iface.u.prepared(molds (turn molds.iface.u.prepared |=(m=[name=term template=ischeme:jibb] ?:(=(%raw-poke name.m) [%raw-poke wrong-raw-args] m))))
186+ ?. ?=(~ (derived-poke-command-scheme:jibb wrong-raw-args-prelude typ.u.action))
187+ ~["derived poke accepted raw-poke union arguments"]
188+ =/ state-values=(list [name=term scheme=ischeme:jibb])
189+ (skim values.cart |=(entry=[name=term scheme=ischeme:jibb] =(%state name.entry)))
190+ =/ action-values=(list [name=term scheme=ischeme:jibb])
191+ (skim values.cart |=(entry=[name=term scheme=ischeme:jibb] =(%poke name.entry)))
192+ ?. ?=([* ~] state-values) ~["derived state member is not unique"]
193+ ?. =(scheme.i.state-values expected-state) ~["derived state scheme differs"]
194+ ?. ?=([* ~] action-values) ~["derived poke member is not unique"]
195+ ?. =(scheme.i.action-values u.expected-action) ~["derived poke command scheme differs"]
196+ ?~ graph.cart ~["cart request graph is missing"]
197+ ?. ?=([* ~] stores.u.graph.cart) ~["cart store evidence is not unique"]
198+ =/ evidence=istore-request-evidence:jibb i.stores.u.graph.cart
199+ ?. &(=(store-at.evidence cart-at) =(source.evidence cart-source)) ~["store evidence does not retain exact path/source"]
200+ ?. &(=(state.evidence typ.u.state) =(action.evidence typ.u.action) =(%poke action-name.evidence)) ~["store evidence types differ"]
201+ =/ basket-result=jfile-detailed-result:jibb
202+ (store-detailed /ui/basket/jibb basket-source modules u.prepared)
203+ ?: ?=(%| -.basket-result) ~[(weld "basket was rejected: " (trip message.p.basket-result))]
204+ =/ basket=ifile:jibb iface.p.basket-result
205+ =/ basket-legacy=jfile-result:jibb
206+ (store-legacy /ui/basket/jibb basket-source modules u.prepared)
207+ ?: ?=(%| -.basket-legacy) ~["legacy basket was rejected"]
208+ ?. =(values.basket values.iface.p.basket-legacy) ~["detailed and legacy basket values differ"]
209+ =/ basket-main=(unit ischeme:jibb) (ienv-lookup:jibb %main values.basket)
210+ ?~ basket-main ~["basket main is missing"]
211+ =/ expected-basket=@t '[init=$-(~ [cart=[items=(list @t) open=?] note=@t]) [update=$-([msg [cart=[items=(list @t) open=?] note=@t]] [[cart=[items=(list @t) open=?] note=@t] (list (cmd msg))]) [view=$-([cart=[items=(list @t) open=?] note=@t] (element msg)) subs=$-([cart=[items=(list @t) open=?] note=@t] (list (sub msg)))]]]'
212+ =/ actual-basket=@t (crip (show-itype:jibb typ.u.basket-main ~))
213+ ?. =(actual-basket expected-basket) ~["basket main type differs"]
214+ ?~ graph.basket ~["basket request graph is missing"]
215+ ?. (lien stores.u.graph.basket |=(r=istore-request-evidence:jibb =(r evidence))) ~["basket did not merge exact store evidence"]
216+ =/ consumer-result=jfile-detailed-result:jibb
217+ (store-detailed /tests/store/consumer/jibb store-consumer-source modules u.prepared)
218+ ?: ?=(%| -.consumer-result) ~["downstream store import was rejected"]
219+ =/ consumer=ifile:jibb iface.p.consumer-result
220+ =/ imported-main=(unit ischeme:jibb) (ienv-lookup:jibb %imported-main values.consumer)
221+ ?~ imported-main ~["downstream main is missing"]
222+ =/ expected-import=itype:jibb (itype-in-import:jibb typ.u.cart-main cart %cart `iface.u.prepared)
223+ ?. =(typ.u.imported-main expected-import) ~["downstream main type differs"]
224+ =/ local-state=(unit ischeme:jibb) (find-jibb-mold:jibb %local-state consumer)
225+ =/ local-action=(unit ischeme:jibb) (find-jibb-mold:jibb %local-action consumer)
226+ ?~ local-state ~["downstream state mold is missing"]
227+ ?~ local-action ~["downstream action mold is missing"]
228+ =/ imported-state=itype:jibb (itype-in-import:jibb typ.u.state cart %cart `iface.u.prepared)
229+ =/ imported-action=itype:jibb (itype-in-import:jibb typ.u.action cart %cart `iface.u.prepared)
230+ ?. &(=(typ.u.local-state imported-state) =(typ.u.local-action imported-action)) ~["downstream molds differ"]
231+ ?~ (ienv-lookup:jibb %imported-request values.consumer) ~["downstream state request is missing"]
232+ ?~ (ienv-lookup:jibb %imported-poke values.consumer) ~["downstream action constructor is missing"]
233+ =/ direct=jfile-detailed-result:jibb
234+ (store-detailed /tests/direct/cart/jibb cart-source ~ u.prepared)
235+ ?: ?=(%| -.direct) ~["direct store outside /ui/stores was rejected"]
236+ =/ grouped=@t (store-cart-source '+$ poke\0a [%add item=@t]\0a %toggle\0a' '++ main (store (init) (update))\0a' '++ init ^- state [~ %.n]\0a' '++ update |= [a=poke s=state]\0a ?- a\0a [%add item] s(items=[item items.s])\0a %toggle s(open=(not open.s))\0a' '')
237+ =/ grouped-result=jfile-detailed-result:jibb
238+ (store-detailed /tests/direct/grouped/jibb grouped ~ u.prepared)
239+ ?: ?=(%| -.grouped-result) ~[(weld "grouped direct store main was rejected: " (trip message.p.grouped-result))]
240+ =/ gate-state=@t '+$ state [callback=$-(@t @t)]\0a+$ poke %set\0a++ main (store init update)\0a++ init ^- state [callback=same]\0a++ update |= [a=poke s=state] s\0a'
241+ =/ gate-result=jfile-detailed-result:jibb
242+ (store-detailed /tests/direct/gate-state/jibb gate-state ~ u.prepared)
243+ ?: ?=(%| -.gate-result) ~["gate-bearing store state was rejected"]
244+ =/ evidence-failures=(list tape) (store-evidence-failures cart basket basket-source iface.u.prepared)
245+ ?^ evidence-failures evidence-failures
246+ =/ normal-poke=@t '+$ poke\0a [%add item=@t]\0a %toggle\0a'
247+ =/ normal-main=@t '++ main (store init update)\0a'
248+ =/ normal-init=@t '++ init ^- state [~ %.n]\0a'
249+ =/ normal-update=@t '++ update |= [a=poke s=state]\0a ?- a\0a [%add item] s(items=[item items.s])\0a %toggle s(open=(not open.s))\0a'
250+ =/ cart-cases=(list [label=tape at=path src=@t modules=jbundle:jibb])
251+ :~ ["wrong init" /tests/store/wrong-init/jibb (store-cart-source normal-poke normal-main '++ init ^- state [~ "bad"]\0a' normal-update '') ~]
252+ ["wrong action" /tests/store/wrong-action/jibb (store-cart-source normal-poke normal-main normal-init '++ update |= [a=@t s=state] s\0a' '') ~]
253+ ["wrong result" /tests/store/wrong-result/jibb (store-cart-source normal-poke normal-main normal-init '++ update |= [a=poke s=state] "bad"\0a' '') ~]
254+ ["unknown poke" /tests/store/unknown-poke/jibb (store-cart-source '+$ poke missing\0a' normal-main normal-init normal-update '') ~]
255+ ["qualified poke" /tests/store/qualified-poke/jibb (store-cart-source '+$ poke poke.cart\0a' normal-main normal-init normal-update '') ~]
256+ ["duplicate poke" /tests/store/duplicate-poke/jibb (store-cart-source '+$ poke %one\0a+$ poke %two\0a' normal-main normal-init normal-update '') ~]
257+ ["duplicate state" /tests/store/duplicate-state/jibb (store-cart-source normal-poke normal-main normal-init normal-update '+$ state @t\0a') ~]
258+ ["state derived collision" /tests/store/state-collision/jibb (store-cart-source normal-poke normal-main normal-init normal-update '++ state 0\0a') ~]
259+ ["action derived collision" /tests/store/action-collision/jibb (store-cart-source normal-poke normal-main normal-init normal-update '++ poke 0\0a') ~]
260+ ["import derived collision" /tests/store/import-collision/jibb (cat 3 '/= state /ui/stores/other\0a' (store-cart-source normal-poke normal-main normal-init normal-update '')) ~]
261+ ["alias main" /tests/store/alias-main/jibb (store-cart-source normal-poke '++ main (build init update)\0a' normal-init normal-update '++ build store\0a') ~]
262+ ["hand-built main" /tests/store/hand-main/jibb (store-cart-source normal-poke '++ main [init update]\0a' normal-init normal-update '') ~]
263+ ==
264+ =/ normal-basket-update=@t '++ update |= [=msg m=model]\0a ?- msg\0a [%noted t] [m(note=t) ~]\0a %add [m(note="") ~[(poke.cart [%add note.m] |=%acked)]]\0a %toggle [m ~[(poke.cart %toggle |=%acked)]]\0a [%got c] [m(cart=c) ~]\0a [%acked err] [m ~]\0a'
265+ =/ normal-subs=@t '++ subs |= m=model\0a ~[[%watch (state.cart |=%got)]]\0a'
266+ =/ wrong-payload=@t '++ update |= [=msg m=model]\0a ?- msg\0a [%noted t] [m(note=t) ~]\0a %add [m(note="") ~[(poke.cart [%add ~zod] |=%acked)]]\0a %toggle [m ~[(poke.cart %toggle |=%acked)]]\0a [%got c] [m(cart=c) ~]\0a [%acked err] [m ~]\0a'
267+ =/ basket-cases=(list [label=tape at=path src=@t modules=jbundle:jibb])
268+ :~ ["wrong poke payload" /ui/basket/jibb (store-basket-source wrong-payload normal-subs '') modules]
269+ ["wrong state reply" /ui/basket/jibb (store-basket-source normal-basket-update '++ subs |= m=model\0a ~[[%watch (state.cart |=%acked)]]\0a' '') modules]
270+ ["helper state request" /ui/basket/jibb (store-basket-source normal-basket-update '++ subs |= m=model\0a ~[[%watch request]]\0a' '++ request ^- (ask msg) (state.cart |=%got)\0a') modules]
271+ ["program under store path" /ui/stores/basket/jibb basket-source modules]
272+ ==
273+ =/ page=@t '/= cart /ui/stores/cart\0a++ main (page load view)\0a++ load |= ~ (state.cart same)\0a++ view |= s=state.cart ^- (element !!) (text "page")\0a'
274+ =/ page-case=[label=tape at=path src=@t modules=jbundle:jibb]
275+ ["store state as page load" /tests/store/page/jibb page modules]
276+ =/ failures=(list tape) (store-rejections (weld cart-cases (weld basket-cases ~[page-case])) u.prepared)
277+ ?^ failures failures
278+ ~
279+::
280+++ test-store
281+ ^- tang
282+ =/ failures=(list tape)
283+ (store-errors prelude internal (text cart) (text basket))
284+ (turn failures |=(reason=tape leaf+reason))
285+--
tests/lib/jibb-theme.hoonnew file+86
@@ -0,0 +1,86 @@
1+:: Full checking for the documented theme mold and real app theme only.
2+/+ jibb
3+/* prelude %jibb /lib/jibb/prelude/jibb
4+/* internal %jibb /lib/jibb/internal/jibb
5+/* source %txt /tests/type-theme/source/txt
6+/* dark-absent %txt /tests/type-theme/dark-absent/txt
7+/* wrong-nested-aura %txt /tests/type-theme/wrong-nested-aura/txt
8+/* missing-field %txt /tests/type-theme/missing-field/txt
9+/* wrong-font %txt /tests/type-theme/wrong-font/txt
10+/* wrong-dark %txt /tests/type-theme/wrong-dark/txt
11+|%
12+++ text
13+ |= lines=wain
14+ ^- @t
15+ (rap 3 (turn lines |=(line=@t (cat 3 line '\0a'))))
16+::
17+++ theme-detailed
18+ |= [at=path src=@t modules=jbundle:jibb prepared=iprelude:jibb]
19+ ^- jfile-detailed-result:jibb
20+ (infer-jibb-file-detailed:jibb at src ~ ~ modules ~[at] values.prepared molds.prepared ~ `iface.prepared)
21+::
22+++ theme-positive
23+ |= [label=tape src=@t expected=tape prepared=iprelude:jibb]
24+ ^- (list tape)
25+ =/ at=path /ui/theme/jibb
26+ =/ detailed=jfile-detailed-result:jibb
27+ (theme-detailed at src ~ prepared)
28+ ?: ?=(%| -.detailed)
29+ ~[(weld label (weld ": rejected: " (trip message.p.detailed)))]
30+ =/ checked=ifile:jibb iface.p.detailed
31+ =/ theme=(unit ischeme:jibb) (ienv-lookup:jibb %theme values.checked)
32+ ?~ theme ~[(weld label ": theme is missing")]
33+ ?. &(?=(~ vars.u.theme) ?=(~ (itype-vars:jibb typ.u.theme)))
34+ ~[(weld label ": theme is not closed")]
35+ =/ actual=tape (show-itype:jibb typ.u.theme ~)
36+ ?. =(actual expected)
37+ ~[(weld label (weld ": theme type was " actual))]
38+ =/ consumer-at=path /tests/theme/consumer/jibb
39+ =/ consumer=@t '/= app-theme /ui/theme\0a++ imported theme.app-theme\0a'
40+ =/ imported=jfile-detailed-result:jibb
41+ (theme-detailed consumer-at consumer ~[[at src]] prepared)
42+ ?: ?=(%| -.imported)
43+ ~[(weld label (weld ": downstream import rejected: " (trip message.p.imported)))]
44+ =/ use=(unit ischeme:jibb) (ienv-lookup:jibb %imported values.iface.p.imported)
45+ ?~ use ~[(weld label ": downstream theme is missing")]
46+ =/ expected-import=itype:jibb
47+ (itype-in-import:jibb typ.u.theme checked %app-theme `iface.prepared)
48+ ?. &(?=(~ vars.u.use) =(typ.u.use expected-import))
49+ ~[(weld label ": downstream theme type differs")]
50+ ~
51+::
52+++ theme-negative
53+ |= [label=tape src=@t prepared=iprelude:jibb]
54+ ^- (list tape)
55+ =/ bad=jfile-detailed-result:jibb
56+ (theme-detailed /ui/theme/jibb src ~ prepared)
57+ ?: ?=(%& -.bad) ~[(weld label ": accepted")]
58+ ~
59+::
60+++ theme-errors
61+ |= [public=@t private=@t source=@t dark-absent=@t wrong-nested-aura=@t missing-field=@t wrong-font=@t wrong-dark=@t]
62+ ^- (list tape)
63+ =/ prepared=(unit iprelude:jibb)
64+ (prepare-prelude-with-internal:jibb public private)
65+ ?~ prepared ~["theme prelude did not prepare"]
66+ =/ expected=tape "[space=[s1=@t [s2=@t s3=@t]] [tones=[normal=@t [background=@t [accent=@t [danger=@t muted=@t]]]] [wide=@t [lang=@t [zone=@t [font=(unit qath.internal) dark=(unit [tones=[normal=@t [background=@t [accent=@t [danger=@t muted=@t]]]]])]]]]]]"
67+ =/ negatives=(list [label=tape src=@t])
68+ :~ ["wrong nested aura" wrong-nested-aura]
69+ ["missing required field" missing-field]
70+ ["wrong font type" wrong-font]
71+ ["wrong dark type" wrong-dark]
72+ ==
73+ =/ positives=(list (list tape))
74+ :~ (theme-positive "dark present" source expected u.prepared)
75+ (theme-positive "dark absent" dark-absent expected u.prepared)
76+ ==
77+ =/ failures=(list tape) (zing positives)
78+ ?^ failures failures
79+ (zing (turn negatives |=(c=[label=tape src=@t] (theme-negative label.c src.c u.prepared))))
80+::
81+++ test-theme
82+ ^- tang
83+ =/ failures=(list tape)
84+ (theme-errors prelude internal (text source) (text dark-absent) (text wrong-nested-aura) (text missing-field) (text wrong-font) (text wrong-dark))
85+ (turn failures |=(reason=tape leaf+reason))
86+--
tests/lib/jibb-todo-api.hoon+1−1
@@ -41,7 +41,7 @@
4141 =/ iface=ifile:jibb iface.p.out
4242 ?. =(source.iface `api) 'actual API source changed'
4343 =/ names=(list term) (turn values.iface |=(x=[name=term scheme=ischeme:jibb] name.x))
44− =/ required-values=(list term) ~[%todo-action %todos %changes %todo-by-id]
44+ =/ required-values=(list term) ~[%poke %todos %changes %todo-by-id]
4545 ?. (levy required-values |=(x=term (lien names |=(y=term =(x y))))) 'derived value missing'
4646 =/ mnames=(list term) (turn molds.iface |=(x=[name=term template=ischeme:jibb] name.x))
4747 =/ required-molds=(list term) ~[%item %todo-action %todos %todo-update %todo-item]
tests/lib/jibb-todo-full.hoonnew file+157
@@ -0,0 +1,157 @@
1+:: Full unchanged todo island through real readers, without UI execution.
2+/+ jibb, jibb-import
3+/* prelude %jibb /lib/jibb/prelude/jibb
4+/* internal %jibb /lib/jibb/internal/jibb
5+/* sur %txt /tests/type-api-paths/todo-sur/txt
6+/* action %txt /tests/type-api-paths/todo-action/txt
7+/* todos %txt /tests/type-api-paths/todos/txt
8+/* update %txt /tests/type-api-paths/todo-update/txt
9+/* item %txt /tests/type-api-paths/todo-item/txt
10+/* api %txt /tests/type-api-paths/api/txt
11+/* source %txt /tests/type-gate-free/todo/txt
12+/* wrong-model %txt /tests/type-todo-full/wrong-model/txt
13+/* wrong-message %txt /tests/type-todo-full/wrong-message/txt
14+/* wrong-result %txt /tests/type-todo-full/wrong-result/txt
15+/* ambiguous-mapper %txt /tests/type-todo-full/ambiguous-mapper/txt
16+/* open-key %txt /tests/type-todo-full/open-key/txt
17+/* alias %txt /tests/type-todo-full/alias/txt
18+/* wrong-watch %txt /tests/type-todo-full/wrong-watch/txt
19+/* non-gate-view %txt /tests/type-todo-full/non-gate-view/txt
20+/* expected %txt /tests/type-todo-full/expected/txt
21+|%
22+++ text
23+ |= lines=wain
24+ ^- @t
25+ (rap 3 (turn lines |=(line=@t (cat 3 line '\0a'))))
26+::
27+++ todo-full-detailed
28+ |= [at=path src=@t externals=iexternals:jibb marks=imark-externals:jibb modules=jbundle:jibb prepared=iprelude:jibb]
29+ ^- jfile-detailed-result:jibb
30+ (infer-jibb-file-detailed:jibb at src externals marks modules ~[at] values.prepared molds.prepared ~ `iface.prepared)
31+::
32+++ todo-full-reader-inputs
33+ |= [sur=@t action=@t todos=@t update=@t item=@t]
34+ ^- [marks=imark-externals:jibb externals=iexternals:jibb]
35+ =/ todo=type -:(ride -:!>(..zuse) sur)
36+ =/ subject=type [%cell [%face %todo todo] -:!>(..zuse)]
37+ =/ ma=* (read-mark:jibb-import %todo-action -:(ride subject action))
38+ =/ mt=* (read-mark:jibb-import %todos -:(ride subject todos))
39+ =/ mu=* (read-mark:jibb-import %todo-update -:(ride subject update))
40+ =/ mi=* (read-mark:jibb-import %todo-item -:(ride subject item))
41+ =/ marks=imark-externals:jibb ~[[%todo-action ma] [%todos mt] [%todo-update mu] [%todo-item mi]]
42+ =/ item-input=* (read-named:jibb-import %todo %item todo)
43+ [marks ~[[%todo %item item-input]]]
44+::
45+++ todo-full-report
46+ |= [public=@t private=@t sur=@t action=@t todos=@t update=@t item=@t api=@t src=@t]
47+ ^- @t
48+ =/ prepared=(unit iprelude:jibb) (prepare-prelude-with-internal:jibb public private)
49+ ?~ prepared 'prelude unavailable'
50+ =/ inputs=[marks=imark-externals:jibb externals=iexternals:jibb]
51+ (todo-full-reader-inputs sur action todos update item)
52+ =/ marks=imark-externals:jibb marks.inputs
53+ =/ externals=iexternals:jibb externals.inputs
54+ =/ api-at=path /ui/api/todo/jibb
55+ =/ at=path /ui/todo-list/jibb
56+ =/ modules=jbundle:jibb ~[[api-at api]]
57+ =/ detailed=jfile-detailed-result:jibb
58+ (todo-full-detailed at src externals marks modules u.prepared)
59+ ?: ?=(%| -.detailed) (cat 3 'full todo rejected: ' message.p.detailed)
60+ =/ checked=ifile:jibb iface.p.detailed
61+ =/ main=(unit ischeme:jibb) (ienv-lookup:jibb %main values.checked)
62+ ?~ main 'full todo main missing'
63+ (cat 3 'full todo accepted\0a' (crip (show-itype:jibb typ.u.main ~)))
64+::
65+++ todo-full-legacy-report
66+ |= [public=@t private=@t sur=@t action=@t todos=@t update=@t item=@t api=@t src=@t]
67+ ^- @t
68+ =/ prepared=(unit iprelude:jibb) (prepare-prelude-with-internal:jibb public private)
69+ ?~ prepared 'prelude unavailable'
70+ =/ inputs=[marks=imark-externals:jibb externals=iexternals:jibb]
71+ (todo-full-reader-inputs sur action todos update item)
72+ =/ marks=imark-externals:jibb marks.inputs
73+ =/ externals=iexternals:jibb externals.inputs
74+ =/ api-at=path /ui/api/todo/jibb
75+ =/ at=path /ui/todo-list/jibb
76+ =/ modules=jbundle:jibb ~[[api-at api]]
77+ =/ legacy=jfile-result:jibb
78+ (infer-jibb-file:jibb at src externals marks modules ~[at] values.u.prepared molds.u.prepared ~ `iface.u.prepared)
79+ ?: ?=(%| -.legacy) (cat 3 'legacy full todo rejected: ' p.legacy)
80+ =/ checked=ifile:jibb iface.p.legacy
81+ =/ main=(unit ischeme:jibb) (ienv-lookup:jibb %main values.checked)
82+ ?~ main 'legacy full todo main missing'
83+ (cat 3 'full todo accepted\0a' (crip (show-itype:jibb typ.u.main ~)))
84+::
85+++ todo-full-import-report
86+ |= [public=@t private=@t sur=@t action=@t todos=@t update=@t item=@t api=@t src=@t]
87+ ^- @t
88+ =/ prepared=(unit iprelude:jibb) (prepare-prelude-with-internal:jibb public private)
89+ ?~ prepared 'prelude unavailable'
90+ =/ inputs=[marks=imark-externals:jibb externals=iexternals:jibb]
91+ (todo-full-reader-inputs sur action todos update item)
92+ =/ at=path /ui/todo-list/jibb
93+ =/ root=jfile-detailed-result:jibb
94+ (todo-full-detailed at src externals.inputs marks.inputs ~[[/ui/api/todo/jibb api]] u.prepared)
95+ ?: ?=(%| -.root) (cat 3 'full todo root rejected: ' message.p.root)
96+ =/ main=(unit ischeme:jibb) (ienv-lookup:jibb %main values.iface.p.root)
97+ ?~ main 'full todo root main missing'
98+ =/ consumer-at=path /tests/todo-full/consumer/jibb
99+ =/ consumer=@t '/= island-prog /ui/todo-list\0a++ imported main.island-prog\0a'
100+ =/ imported=jfile-detailed-result:jibb
101+ (todo-full-detailed consumer-at consumer externals.inputs marks.inputs ~[[at src] [/ui/api/todo/jibb api]] u.prepared)
102+ ?: ?=(%| -.imported) (cat 3 'downstream full todo import rejected: ' message.p.imported)
103+ =/ use=(unit ischeme:jibb) (ienv-lookup:jibb %imported values.iface.p.imported)
104+ ?~ use 'downstream imported main missing'
105+ =/ expected-import=itype:jibb
106+ (itype-in-import:jibb typ.u.main iface.p.root %island-prog `iface.u.prepared)
107+ ?. &(?=(~ vars.u.use) =(typ.u.use expected-import)) 'downstream main type differs'
108+ 'downstream import accepted'
109+::
110+++ todo-full-negative-report
111+ |= [public=@t private=@t sur=@t action=@t todos=@t update=@t item=@t api=@t label=@t src=@t]
112+ ^- @t
113+ =/ prepared=(unit iprelude:jibb) (prepare-prelude-with-internal:jibb public private)
114+ ?~ prepared 'prelude unavailable'
115+ =/ inputs=[marks=imark-externals:jibb externals=iexternals:jibb]
116+ (todo-full-reader-inputs sur action todos update item)
117+ =/ at=path /ui/todo-list/jibb
118+ =/ structured=jfile-detailed-result:jibb
119+ (todo-full-detailed at src externals.inputs marks.inputs ~[[/ui/api/todo/jibb api]] u.prepared)
120+ ?: ?=(%& -.structured) (cat 3 label ': BAD accepted')
121+ (cat 3 label ': rejected')
122+::
123+++ test-todo-full
124+ ^- tang
125+ =/ report=@t
126+ (todo-full-report prelude internal (text sur) (text action) (text todos) (text update) (text item) (text api) (text source))
127+ ?. =((to-wain:format (cat 3 report '\0a')) expected)
128+ ~[leaf+"full todo report differs"]
129+ =/ legacy=@t
130+ (todo-full-legacy-report prelude internal (text sur) (text action) (text todos) (text update) (text item) (text api) (text source))
131+ ?. =((to-wain:format (cat 3 legacy '\0a')) expected)
132+ ~[leaf+"legacy full todo report differs"]
133+ =/ imported=@t
134+ (todo-full-import-report prelude internal (text sur) (text action) (text todos) (text update) (text item) (text api) (text source))
135+ ?. =(imported 'downstream import accepted')
136+ ~[leaf+"downstream full todo import differs"]
137+ =/ negatives=(list [label=@t src=@t])
138+ :~ ['wrong model' (text wrong-model)]
139+ ['wrong message' (text wrong-message)]
140+ ['wrong result' (text wrong-result)]
141+ ['ambiguous mapper' (text ambiguous-mapper)]
142+ ['open key' (text open-key)]
143+ ['mapper alias' (text alias)]
144+ ['wrong watch' (text wrong-watch)]
145+ ['non-gate view' (text non-gate-view)]
146+ ==
147+ =/ bad=(list @t)
148+ %+ murn negatives
149+ |= c=[label=@t src=@t]
150+ =/ expected=@t (cat 3 label.c ': rejected')
151+ =/ actual=@t
152+ (todo-full-negative-report prelude internal (text sur) (text action) (text todos) (text update) (text item) (text api) label.c src.c)
153+ ?. =(expected actual) `actual
154+ ~
155+ ?^ bad (turn bad |=(reason=@t leaf+(trip reason)))
156+ ~
157+--
tests/lib/jibb-union-source.hoon+2−2
@@ -66,7 +66,7 @@
6666 =/ mixed-parsed=(each module:jibb error:jibb) (parse:jibb /tests/empty/jibb mixed-source)
6767 ?: ?=(%| -.mixed-parsed) ~[['BAD mixed parse' |]]
6868 =/ mixed-collected=grec-collected:jibb (grec-collect-molds:jibb defs.p.mixed-parsed)
69− =/ mixed-tree=(unit shape:jibb) (~(get by proofs.mixed-collected) %element)
69+ =/ mixed-tree=(unit shape:jibb) (~(get by proofs.mixed-collected) %node-tree)
7070 =/ prep=(unit iprelude:jibb) (prepare-prelude-with-internal:jibb public internal)
7171 ?~ prep ~[['BAD prepared prelude' |]]
7272 =/ mixed-result=jfile-result:jibb
@@ -90,7 +90,7 @@
9090 =/ cap256=icaps:jibb (turn (gulf 0 255) |=(n=@ud ['A' n *span:jibb]))
9191 =/ cap257=icaps:jibb (turn (gulf 0 256) |=(n=@ud ['A' n *span:jibb]))
9292 =/ initial=istate:jibb
93− state(molds molds.u.g, at /tests/empty/jibb, active ~[%outer], caps ~[['Q' 17 *span:jibb]], tags ~[[42 [%term %tas %pending '%pending']]], sub ~[[71 [%atom %t]]], next 100)
93+ state(molds molds.u.g, at /tests/empty/jibb, active ~[%outer], caps ~[['Q' 17 *span:jibb]], tags ~[[42 [%term %tas %pending '%pending'] *span:jibb]], sub ~[[71 [%atom %t]]], next 100)
9494 =/ preserved=(unit [typ=itype:jibb state=istate:jibb]) (infer-simple-shape:jibb u.chosen initial)
9595 =/ structured=istate:jibb initial(params ~[['A' [%cell [%atom %t] [%atom %t]]]])
9696 =/ rejected=(unit [typ=itype:jibb state=istate:jibb]) (infer-simple-shape:jibb u.chosen structured)
tests/lib/jibb.hoon+573−566
@@ -31,6 +31,7 @@
3131/* src-3 %jibb /tests/golden/doc-grammar-02-buttons/source/jibb
3232/* tok-3 %txt /tests/golden/doc-grammar-02-buttons/tokens/txt
3333/* tre-3 %txt /tests/golden/doc-grammar-02-buttons/tree/txt
34+/* typ-3 %txt /tests/golden/doc-grammar-02-buttons/types/txt
3435/* src-4 %jibb /tests/golden/doc-grammar-03-view-day/source/jibb
3536/* tok-4 %txt /tests/golden/doc-grammar-03-view-day/tokens/txt
3637/* tre-4 %txt /tests/golden/doc-grammar-03-view-day/tree/txt
@@ -1994,466 +1995,470 @@
19941995/* tok-554 %txt /tests/golden/types-prelude-text/tokens/txt
19951996/* tre-554 %txt /tests/golden/types-prelude-text/tree/txt
19961997/* typ-554 %txt /tests/golden/types-prelude-text/types/txt
1997−/* src-555 %jibb /tests/golden/types-prelude-unit-helpers/source/jibb
1998−/* tok-555 %txt /tests/golden/types-prelude-unit-helpers/tokens/txt
1999−/* tre-555 %txt /tests/golden/types-prelude-unit-helpers/tree/txt
2000−/* typ-555 %txt /tests/golden/types-prelude-unit-helpers/types/txt
2001−/* src-556 %jibb /tests/golden/types-prelude-zing/source/jibb
2002−/* tok-556 %txt /tests/golden/types-prelude-zing/tokens/txt
2003−/* tre-556 %txt /tests/golden/types-prelude-zing/tree/txt
2004−/* typ-556 %txt /tests/golden/types-prelude-zing/types/txt
2005−/* src-557 %jibb /tests/golden/types-proj-explicit-context/source/jibb
2006−/* tok-557 %txt /tests/golden/types-proj-explicit-context/tokens/txt
2007−/* tre-557 %txt /tests/golden/types-proj-explicit-context/tree/txt
2008−/* typ-557 %txt /tests/golden/types-proj-explicit-context/types/txt
2009−/* src-558 %jibb /tests/golden/types-proj-nested-no-implicit/source/jibb
2010−/* tok-558 %txt /tests/golden/types-proj-nested-no-implicit/tokens/txt
2011−/* tre-558 %txt /tests/golden/types-proj-nested-no-implicit/tree/txt
2012−/* typ-558 %txt /tests/golden/types-proj-nested-no-implicit/types/txt
2013−/* src-559 %jibb /tests/golden/types-proj-reserved-imported-definition/source/jibb
2014−/* tok-559 %txt /tests/golden/types-proj-reserved-imported-definition/tokens/txt
2015−/* tre-559 %txt /tests/golden/types-proj-reserved-imported-definition/tree/txt
2016−/* mod-559-1 %jibb /tests/golden/types-proj-reserved-imported-definition/modules/ui/lib/jibb
2017−/* typ-559 %txt /tests/golden/types-proj-reserved-imported-definition/types/txt
2018−/* mtre-559 %txt /tests/golden/types-proj-reserved-imported-definition/module-trees/txt
2019−/* src-560 %jibb /tests/golden/types-proj-reserved-jibb-import/source/jibb
2020−/* tok-560 %txt /tests/golden/types-proj-reserved-jibb-import/tokens/txt
2021−/* tre-560 %txt /tests/golden/types-proj-reserved-jibb-import/tree/txt
2022−/* mod-560-1 %jibb /tests/golden/types-proj-reserved-jibb-import/modules/ui/lib/jibb
2023−/* typ-560 %txt /tests/golden/types-proj-reserved-jibb-import/types/txt
2024−/* mtre-560 %txt /tests/golden/types-proj-reserved-jibb-import/module-trees/txt
2025−/* src-561 %jibb /tests/golden/types-proj-reserved-local/source/jibb
2026−/* tok-561 %txt /tests/golden/types-proj-reserved-local/tokens/txt
2027−/* tre-561 %txt /tests/golden/types-proj-reserved-local/tree/txt
2028−/* typ-561 %txt /tests/golden/types-proj-reserved-local/types/txt
2029−/* src-562 %jibb /tests/golden/types-proj-reserved-local-mold/source/jibb
2030−/* tok-562 %txt /tests/golden/types-proj-reserved-local-mold/tokens/txt
2031−/* tre-562 %txt /tests/golden/types-proj-reserved-local-mold/tree/txt
2032−/* typ-562 %txt /tests/golden/types-proj-reserved-local-mold/types/txt
2033−/* src-563 %jibb /tests/golden/types-proj-reserved-mark-import/source/jibb
2034−/* tok-563 %txt /tests/golden/types-proj-reserved-mark-import/tokens/txt
2035−/* tre-563 %txt /tests/golden/types-proj-reserved-mark-import/tree/txt
2036−/* typ-563 %txt /tests/golden/types-proj-reserved-mark-import/types/txt
2037−/* src-564 %jibb /tests/golden/types-proj-reserved-mold/source/jibb
2038−/* tok-564 %txt /tests/golden/types-proj-reserved-mold/tokens/txt
2039−/* tre-564 %txt /tests/golden/types-proj-reserved-mold/tree/txt
2040−/* typ-564 %txt /tests/golden/types-proj-reserved-mold/types/txt
2041−/* src-565 %jibb /tests/golden/types-proj-reserved-pattern/source/jibb
2042−/* tok-565 %txt /tests/golden/types-proj-reserved-pattern/tokens/txt
2043−/* tre-565 %txt /tests/golden/types-proj-reserved-pattern/tree/txt
2044−/* typ-565 %txt /tests/golden/types-proj-reserved-pattern/types/txt
2045−/* src-566 %jibb /tests/golden/types-proj-reserved-positive/source/jibb
2046−/* tok-566 %txt /tests/golden/types-proj-reserved-positive/tokens/txt
2047−/* tre-566 %txt /tests/golden/types-proj-reserved-positive/tree/txt
2048−/* typ-566 %txt /tests/golden/types-proj-reserved-positive/types/txt
2049−/* src-567 %jibb /tests/golden/types-proj-reserved-sample/source/jibb
2050−/* tok-567 %txt /tests/golden/types-proj-reserved-sample/tokens/txt
2051−/* tre-567 %txt /tests/golden/types-proj-reserved-sample/tree/txt
2052−/* typ-567 %txt /tests/golden/types-proj-reserved-sample/types/txt
2053−/* src-568 %jibb /tests/golden/types-proj-reserved-sur-import/source/jibb
2054−/* tok-568 %txt /tests/golden/types-proj-reserved-sur-import/tokens/txt
2055−/* tre-568 %txt /tests/golden/types-proj-reserved-sur-import/tree/txt
2056−/* typ-568 %txt /tests/golden/types-proj-reserved-sur-import/types/txt
2057−/* src-569 %jibb /tests/golden/types-proj-reserved-unused-pattern/source/jibb
2058−/* tok-569 %txt /tests/golden/types-proj-reserved-unused-pattern/tokens/txt
2059−/* tre-569 %txt /tests/golden/types-proj-reserved-unused-pattern/tree/txt
2060−/* typ-569 %txt /tests/golden/types-proj-reserved-unused-pattern/types/txt
2061−/* src-570 %jibb /tests/golden/types-proj-reserved-unused-sample/source/jibb
2062−/* tok-570 %txt /tests/golden/types-proj-reserved-unused-sample/tokens/txt
2063−/* tre-570 %txt /tests/golden/types-proj-reserved-unused-sample/tree/txt
2064−/* typ-570 %txt /tests/golden/types-proj-reserved-unused-sample/types/txt
2065−/* src-571 %jibb /tests/golden/types-proj-reserved-unused-value/source/jibb
2066−/* tok-571 %txt /tests/golden/types-proj-reserved-unused-value/tokens/txt
2067−/* tre-571 %txt /tests/golden/types-proj-reserved-unused-value/tree/txt
2068−/* typ-571 %txt /tests/golden/types-proj-reserved-unused-value/types/txt
2069−/* src-572 %jibb /tests/golden/types-proj-reserved-value/source/jibb
2070−/* tok-572 %txt /tests/golden/types-proj-reserved-value/tokens/txt
2071−/* tre-572 %txt /tests/golden/types-proj-reserved-value/tree/txt
2072−/* typ-572 %txt /tests/golden/types-proj-reserved-value/types/txt
2073−/* src-573 %jibb /tests/golden/types-proj-single-duplicate/source/jibb
2074−/* tok-573 %txt /tests/golden/types-proj-single-duplicate/tokens/txt
2075−/* tre-573 %txt /tests/golden/types-proj-single-duplicate/tree/txt
2076−/* typ-573 %txt /tests/golden/types-proj-single-duplicate/types/txt
2077−/* src-574 %jibb /tests/golden/types-proj-single-field/source/jibb
2078−/* tok-574 %txt /tests/golden/types-proj-single-field/tokens/txt
2079−/* tre-574 %txt /tests/golden/types-proj-single-field/tree/txt
2080−/* typ-574 %txt /tests/golden/types-proj-single-field/types/txt
2081−/* src-575 %jibb /tests/golden/types-proj-single-sample-face/source/jibb
2082−/* tok-575 %txt /tests/golden/types-proj-single-sample-face/tokens/txt
2083−/* tre-575 %txt /tests/golden/types-proj-single-sample-face/tree/txt
2084−/* typ-575 %txt /tests/golden/types-proj-single-sample-face/types/txt
2085−/* src-576 %jibb /tests/golden/types-proj-single-wrapped/source/jibb
2086−/* tok-576 %txt /tests/golden/types-proj-single-wrapped/tokens/txt
2087−/* tre-576 %txt /tests/golden/types-proj-single-wrapped/tree/txt
2088−/* typ-576 %txt /tests/golden/types-proj-single-wrapped/types/txt
2089−/* src-577 %jibb /tests/golden/types-qath-faces/source/jibb
2090−/* tok-577 %txt /tests/golden/types-qath-faces/tokens/txt
2091−/* tre-577 %txt /tests/golden/types-qath-faces/tree/txt
2092−/* typ-577 %txt /tests/golden/types-qath-faces/types/txt
2093−/* src-578 %jibb /tests/golden/types-qath-holes/source/jibb
2094−/* tok-578 %txt /tests/golden/types-qath-holes/tokens/txt
2095−/* tre-578 %txt /tests/golden/types-qath-holes/tree/txt
2096−/* typ-578 %txt /tests/golden/types-qath-holes/types/txt
2097−/* src-579 %jibb /tests/golden/types-qath-module-identity/source/jibb
2098−/* tok-579 %txt /tests/golden/types-qath-module-identity/tokens/txt
2099−/* tre-579 %txt /tests/golden/types-qath-module-identity/tree/txt
2100−/* mod-579-1 %jibb /tests/golden/types-qath-module-identity/modules/ui/one/jibb
2101−/* mod-579-2 %jibb /tests/golden/types-qath-module-identity/modules/ui/two/jibb
2102−/* mod-579-3 %jibb /tests/golden/types-qath-module-identity/modules/ui/mid/jibb
2103−/* typ-579 %txt /tests/golden/types-qath-module-identity/types/txt
2104−/* mtre-579 %txt /tests/golden/types-qath-module-identity/module-trees/txt
2105−/* src-580 %jibb /tests/golden/types-qath-recursive/source/jibb
2106−/* tok-580 %txt /tests/golden/types-qath-recursive/tokens/txt
2107−/* tre-580 %txt /tests/golden/types-qath-recursive/tree/txt
2108−/* typ-580 %txt /tests/golden/types-qath-recursive/types/txt
2109−/* src-581 %jibb /tests/golden/types-record-bound-variable/source/jibb
2110−/* tok-581 %txt /tests/golden/types-record-bound-variable/tokens/txt
2111−/* tre-581 %txt /tests/golden/types-record-bound-variable/tree/txt
2112−/* typ-581 %txt /tests/golden/types-record-bound-variable/types/txt
2113−/* src-582 %jibb /tests/golden/types-record-cast-context/source/jibb
2114−/* tok-582 %txt /tests/golden/types-record-cast-context/tokens/txt
2115−/* tre-582 %txt /tests/golden/types-record-cast-context/tree/txt
2116−/* typ-582 %txt /tests/golden/types-record-cast-context/types/txt
2117−/* src-583 %jibb /tests/golden/types-record-change/source/jibb
2118−/* tok-583 %txt /tests/golden/types-record-change/tokens/txt
2119−/* tre-583 %txt /tests/golden/types-record-change/tree/txt
2120−/* typ-583 %txt /tests/golden/types-record-change/types/txt
2121−/* src-584 %jibb /tests/golden/types-record-change-generic/source/jibb
2122−/* tok-584 %txt /tests/golden/types-record-change-generic/tokens/txt
2123−/* tre-584 %txt /tests/golden/types-record-change-generic/tree/txt
2124−/* typ-584 %txt /tests/golden/types-record-change-generic/types/txt
2125−/* src-585 %jibb /tests/golden/types-record-faces/source/jibb
2126−/* tok-585 %txt /tests/golden/types-record-faces/tokens/txt
2127−/* tre-585 %txt /tests/golden/types-record-faces/tree/txt
2128−/* typ-585 %txt /tests/golden/types-record-faces/types/txt
2129−/* src-586 %jibb /tests/golden/types-record-field-edit-separate/source/jibb
2130−/* tok-586 %txt /tests/golden/types-record-field-edit-separate/tokens/txt
2131−/* tre-586 %txt /tests/golden/types-record-field-edit-separate/tree/txt
2132−/* typ-586 %txt /tests/golden/types-record-field-edit-separate/types/txt
2133−/* src-587 %jibb /tests/golden/types-record-field-expr-duplicate/source/jibb
2134−/* tok-587 %txt /tests/golden/types-record-field-expr-duplicate/tokens/txt
2135−/* tre-587 %txt /tests/golden/types-record-field-expr-duplicate/tree/txt
2136−/* typ-587 %txt /tests/golden/types-record-field-expr-duplicate/types/txt
2137−/* src-588 %jibb /tests/golden/types-record-field-expr-separate/source/jibb
2138−/* tok-588 %txt /tests/golden/types-record-field-expr-separate/tokens/txt
2139−/* tre-588 %txt /tests/golden/types-record-field-expr-separate/tree/txt
2140−/* typ-588 %txt /tests/golden/types-record-field-expr-separate/types/txt
2141−/* src-589 %jibb /tests/golden/types-record-field-module-reachable/source/jibb
2142−/* tok-589 %txt /tests/golden/types-record-field-module-reachable/tokens/txt
2143−/* tre-589 %txt /tests/golden/types-record-field-module-reachable/tree/txt
2144−/* mod-589-1 %jibb /tests/golden/types-record-field-module-reachable/modules/ui/lib/jibb
2145−/* typ-589 %txt /tests/golden/types-record-field-module-reachable/types/txt
2146−/* mtre-589 %txt /tests/golden/types-record-field-module-reachable/module-trees/txt
2147−/* src-590 %jibb /tests/golden/types-record-field-module-unused/source/jibb
2148−/* tok-590 %txt /tests/golden/types-record-field-module-unused/tokens/txt
2149−/* tre-590 %txt /tests/golden/types-record-field-module-unused/tree/txt
2150−/* mod-590-1 %jibb /tests/golden/types-record-field-module-unused/modules/ui/good/jibb
2151−/* mod-590-2 %jibb /tests/golden/types-record-field-module-unused/modules/ui/unused/jibb
2152−/* typ-590 %txt /tests/golden/types-record-field-module-unused/types/txt
2153−/* mtre-590 %txt /tests/golden/types-record-field-module-unused/module-trees/txt
2154−/* src-591 %jibb /tests/golden/types-record-field-nested-mold/source/jibb
2155−/* tok-591 %txt /tests/golden/types-record-field-nested-mold/tokens/txt
2156−/* tre-591 %txt /tests/golden/types-record-field-nested-mold/tree/txt
2157−/* typ-591 %txt /tests/golden/types-record-field-nested-mold/types/txt
2158−/* src-592 %jibb /tests/golden/types-record-field-outer-inner/source/jibb
2159−/* tok-592 %txt /tests/golden/types-record-field-outer-inner/tokens/txt
2160−/* tre-592 %txt /tests/golden/types-record-field-outer-inner/tree/txt
2161−/* typ-592 %txt /tests/golden/types-record-field-outer-inner/types/txt
2162−/* src-593 %jibb /tests/golden/types-record-field-sample-duplicate/source/jibb
2163−/* tok-593 %txt /tests/golden/types-record-field-sample-duplicate/tokens/txt
2164−/* tre-593 %txt /tests/golden/types-record-field-sample-duplicate/tree/txt
2165−/* typ-593 %txt /tests/golden/types-record-field-sample-duplicate/types/txt
2166−/* src-594 %jibb /tests/golden/types-record-field-separate-molds/source/jibb
2167−/* tok-594 %txt /tests/golden/types-record-field-separate-molds/tokens/txt
2168−/* tre-594 %txt /tests/golden/types-record-field-separate-molds/tree/txt
2169−/* typ-594 %txt /tests/golden/types-record-field-separate-molds/types/txt
2170−/* src-595 %jibb /tests/golden/types-record-field-unused-mold/source/jibb
2171−/* tok-595 %txt /tests/golden/types-record-field-unused-mold/tokens/txt
2172−/* tre-595 %txt /tests/golden/types-record-field-unused-mold/tree/txt
2173−/* typ-595 %txt /tests/golden/types-record-field-unused-mold/types/txt
2174−/* src-596 %jibb /tests/golden/types-record-import/source/jibb
2175−/* tok-596 %txt /tests/golden/types-record-import/tokens/txt
2176−/* tre-596 %txt /tests/golden/types-record-import/tree/txt
2177−/* mod-596-1 %jibb /tests/golden/types-record-import/modules/ui/lib/jibb
2178−/* typ-596 %txt /tests/golden/types-record-import/types/txt
2179−/* mtre-596 %txt /tests/golden/types-record-import/module-trees/txt
2180−/* src-597 %jibb /tests/golden/types-record-local-scheme/source/jibb
2181−/* tok-597 %txt /tests/golden/types-record-local-scheme/tokens/txt
2182−/* tre-597 %txt /tests/golden/types-record-local-scheme/tree/txt
2183−/* typ-597 %txt /tests/golden/types-record-local-scheme/types/txt
2184−/* src-598 %jibb /tests/golden/types-record-nested/source/jibb
2185−/* tok-598 %txt /tests/golden/types-record-nested/tokens/txt
2186−/* tre-598 %txt /tests/golden/types-record-nested/tree/txt
2187−/* typ-598 %txt /tests/golden/types-record-nested/types/txt
2188−/* src-599 %jibb /tests/golden/types-record-to-tuple/source/jibb
2189−/* tok-599 %txt /tests/golden/types-record-to-tuple/tokens/txt
2190−/* tre-599 %txt /tests/golden/types-record-to-tuple/tree/txt
2191−/* typ-599 %txt /tests/golden/types-record-to-tuple/types/txt
2192−/* src-600 %jibb /tests/golden/types-recursion-scc-failures/source/jibb
2193−/* tok-600 %txt /tests/golden/types-recursion-scc-failures/tokens/txt
2194−/* tre-600 %txt /tests/golden/types-recursion-scc-failures/tree/txt
2195−/* typ-600 %txt /tests/golden/types-recursion-scc-failures/types/txt
2196−/* src-601 %jibb /tests/golden/types-recursion-scc-groups/source/jibb
2197−/* tok-601 %txt /tests/golden/types-recursion-scc-groups/tokens/txt
2198−/* tre-601 %txt /tests/golden/types-recursion-scc-groups/tree/txt
2199−/* typ-601 %txt /tests/golden/types-recursion-scc-groups/types/txt
2200−/* src-602 %jibb /tests/golden/types-recursion-scc-import/source/jibb
2201−/* tok-602 %txt /tests/golden/types-recursion-scc-import/tokens/txt
2202−/* tre-602 %txt /tests/golden/types-recursion-scc-import/tree/txt
2203−/* mod-602-1 %jibb /tests/golden/types-recursion-scc-import/modules/ui/lib/jibb
2204−/* typ-602 %txt /tests/golden/types-recursion-scc-import/types/txt
2205−/* mtre-602 %txt /tests/golden/types-recursion-scc-import/module-trees/txt
2206−/* src-603 %jibb /tests/golden/types-recursion-scc-import-bad/source/jibb
2207−/* tok-603 %txt /tests/golden/types-recursion-scc-import-bad/tokens/txt
2208−/* tre-603 %txt /tests/golden/types-recursion-scc-import-bad/tree/txt
2209−/* mod-603-1 %jibb /tests/golden/types-recursion-scc-import-bad/modules/ui/lib/jibb
2210−/* typ-603 %txt /tests/golden/types-recursion-scc-import-bad/types/txt
2211−/* mtre-603 %txt /tests/golden/types-recursion-scc-import-bad/module-trees/txt
2212−/* src-604 %jibb /tests/golden/types-recursion-scc-local/source/jibb
2213−/* tok-604 %txt /tests/golden/types-recursion-scc-local/tokens/txt
2214−/* tre-604 %txt /tests/golden/types-recursion-scc-local/tree/txt
2215−/* typ-604 %txt /tests/golden/types-recursion-scc-local/types/txt
2216−/* src-605 %jibb /tests/golden/types-recursion-scc-order/source/jibb
2217−/* tok-605 %txt /tests/golden/types-recursion-scc-order/tokens/txt
2218−/* tre-605 %txt /tests/golden/types-recursion-scc-order/tree/txt
2219−/* typ-605 %txt /tests/golden/types-recursion-scc-order/types/txt
2220−/* src-606 %jibb /tests/golden/types-recursion-scc-shadow/source/jibb
2221−/* tok-606 %txt /tests/golden/types-recursion-scc-shadow/tokens/txt
2222−/* tre-606 %txt /tests/golden/types-recursion-scc-shadow/tree/txt
2223−/* typ-606 %txt /tests/golden/types-recursion-scc-shadow/types/txt
2224−/* src-607 %jibb /tests/golden/types-recursive-branch/source/jibb
2225−/* tok-607 %txt /tests/golden/types-recursive-branch/tokens/txt
2226−/* tre-607 %txt /tests/golden/types-recursive-branch/tree/txt
2227−/* typ-607 %txt /tests/golden/types-recursive-branch/types/txt
2228−/* src-608 %jibb /tests/golden/types-recursive-gate/source/jibb
2229−/* tok-608 %txt /tests/golden/types-recursive-gate/tokens/txt
2230−/* tre-608 %txt /tests/golden/types-recursive-gate/tree/txt
2231−/* typ-608 %txt /tests/golden/types-recursive-gate/types/txt
2232−/* src-609 %jibb /tests/golden/types-recursive-sample/source/jibb
2233−/* tok-609 %txt /tests/golden/types-recursive-sample/tokens/txt
2234−/* tre-609 %txt /tests/golden/types-recursive-sample/tree/txt
2235−/* typ-609 %txt /tests/golden/types-recursive-sample/types/txt
2236−/* src-610 %jibb /tests/golden/types-request-normal/source/jibb
2237−/* tok-610 %txt /tests/golden/types-request-normal/tokens/txt
2238−/* tre-610 %txt /tests/golden/types-request-normal/tree/txt
2239−/* mod-610-1 %jibb /tests/golden/types-request-normal/modules/ui/api/demo/jibb
2240−/* typ-610 %txt /tests/golden/types-request-normal/types/txt
2241−/* mark-610-1 %txt /tests/golden/types-request-normal/mar/full/txt
2242−/* mtre-610 %txt /tests/golden/types-request-normal/module-trees/txt
2243−/* src-611 %jibb /tests/golden/types-scope-library-poke/source/jibb
2244−/* tok-611 %txt /tests/golden/types-scope-library-poke/tokens/txt
2245−/* tre-611 %txt /tests/golden/types-scope-library-poke/tree/txt
2246−/* typ-611 %txt /tests/golden/types-scope-library-poke/types/txt
2247−/* src-612 %jibb /tests/golden/types-scope-root-api/source/jibb
2248−/* tok-612 %txt /tests/golden/types-scope-root-api/tokens/txt
2249−/* tre-612 %txt /tests/golden/types-scope-root-api/tree/txt
2250−/* typ-612 %txt /tests/golden/types-scope-root-api/types/txt
2251−/* src-613 %jibb /tests/golden/types-scope-store-duplicate/source/jibb
2252−/* tok-613 %txt /tests/golden/types-scope-store-duplicate/tokens/txt
2253−/* tre-613 %txt /tests/golden/types-scope-store-duplicate/tree/txt
2254−/* typ-613 %txt /tests/golden/types-scope-store-duplicate/types/txt
2255−/* src-614 %jibb /tests/golden/types-scope-store-shadow/source/jibb
2256−/* tok-614 %txt /tests/golden/types-scope-store-shadow/tokens/txt
2257−/* tre-614 %txt /tests/golden/types-scope-store-shadow/tree/txt
2258−/* typ-614 %txt /tests/golden/types-scope-store-shadow/types/txt
2259−/* src-615 %jibb /tests/golden/types-single-case-pattern/source/jibb
2260−/* tok-615 %txt /tests/golden/types-single-case-pattern/tokens/txt
2261−/* tre-615 %txt /tests/golden/types-single-case-pattern/tree/txt
2262−/* typ-615 %txt /tests/golden/types-single-case-pattern/types/txt
2263−/* src-616 %jibb /tests/golden/types-string-interpolation/source/jibb
2264−/* tok-616 %txt /tests/golden/types-string-interpolation/tokens/txt
2265−/* tre-616 %txt /tests/golden/types-string-interpolation/tree/txt
2266−/* typ-616 %txt /tests/golden/types-string-interpolation/types/txt
2267−/* src-617 %jibb /tests/golden/types-tuple-context/source/jibb
2268−/* tok-617 %txt /tests/golden/types-tuple-context/tokens/txt
2269−/* tre-617 %txt /tests/golden/types-tuple-context/tree/txt
2270−/* typ-617 %txt /tests/golden/types-tuple-context/types/txt
2271−/* src-618 %jibb /tests/golden/types-tuple-context-nested/source/jibb
2272−/* tok-618 %txt /tests/golden/types-tuple-context-nested/tokens/txt
2273−/* tre-618 %txt /tests/golden/types-tuple-context-nested/tree/txt
2274−/* typ-618 %txt /tests/golden/types-tuple-context-nested/types/txt
2275−/* src-619 %jibb /tests/golden/types-union-alias/source/jibb
2276−/* tok-619 %txt /tests/golden/types-union-alias/tokens/txt
2277−/* tre-619 %txt /tests/golden/types-union-alias/tree/txt
2278−/* typ-619 %txt /tests/golden/types-union-alias/types/txt
2279−/* src-620 %jibb /tests/golden/types-union-branch-context/source/jibb
2280−/* tok-620 %txt /tests/golden/types-union-branch-context/tokens/txt
2281−/* tre-620 %txt /tests/golden/types-union-branch-context/tree/txt
2282−/* typ-620 %txt /tests/golden/types-union-branch-context/types/txt
2283−/* src-621 %jibb /tests/golden/types-union-branch-pending/source/jibb
2284−/* tok-621 %txt /tests/golden/types-union-branch-pending/tokens/txt
2285−/* tre-621 %txt /tests/golden/types-union-branch-pending/tree/txt
2286−/* typ-621 %txt /tests/golden/types-union-branch-pending/types/txt
2287−/* src-622 %jibb /tests/golden/types-union-constructor-shape/source/jibb
2288−/* tok-622 %txt /tests/golden/types-union-constructor-shape/tokens/txt
2289−/* tre-622 %txt /tests/golden/types-union-constructor-shape/tree/txt
2290−/* typ-622 %txt /tests/golden/types-union-constructor-shape/types/txt
2291−/* src-623 %jibb /tests/golden/types-union-context-flow/source/jibb
2292−/* tok-623 %txt /tests/golden/types-union-context-flow/tokens/txt
2293−/* tre-623 %txt /tests/golden/types-union-context-flow/tree/txt
2294−/* typ-623 %txt /tests/golden/types-union-context-flow/types/txt
2295−/* src-624 %jibb /tests/golden/types-union-finite/source/jibb
2296−/* tok-624 %txt /tests/golden/types-union-finite/tokens/txt
2297−/* tre-624 %txt /tests/golden/types-union-finite/tree/txt
2298−/* typ-624 %txt /tests/golden/types-union-finite/types/txt
2299−/* src-625 %jibb /tests/golden/types-union-finite-context/source/jibb
2300−/* tok-625 %txt /tests/golden/types-union-finite-context/tokens/txt
2301−/* tre-625 %txt /tests/golden/types-union-finite-context/tree/txt
2302−/* typ-625 %txt /tests/golden/types-union-finite-context/types/txt
2303−/* src-626 %jibb /tests/golden/types-union-finite-generic/source/jibb
2304−/* tok-626 %txt /tests/golden/types-union-finite-generic/tokens/txt
2305−/* tre-626 %txt /tests/golden/types-union-finite-generic/tree/txt
2306−/* typ-626 %txt /tests/golden/types-union-finite-generic/types/txt
2307−/* src-627 %jibb /tests/golden/types-union-finite-limit/source/jibb
2308−/* tok-627 %txt /tests/golden/types-union-finite-limit/tokens/txt
2309−/* tre-627 %txt /tests/golden/types-union-finite-limit/tree/txt
2310−/* typ-627 %txt /tests/golden/types-union-finite-limit/types/txt
2311−/* src-628 %jibb /tests/golden/types-union-import/source/jibb
2312−/* tok-628 %txt /tests/golden/types-union-import/tokens/txt
2313−/* tre-628 %txt /tests/golden/types-union-import/tree/txt
2314−/* mod-628-1 %jibb /tests/golden/types-union-import/modules/ui/lib/jibb
2315−/* typ-628 %txt /tests/golden/types-union-import/types/txt
2316−/* mtre-628 %txt /tests/golden/types-union-import/module-trees/txt
2317−/* src-629 %jibb /tests/golden/types-union-local-pending/source/jibb
2318−/* tok-629 %txt /tests/golden/types-union-local-pending/tokens/txt
2319−/* tre-629 %txt /tests/golden/types-union-local-pending/tree/txt
2320−/* typ-629 %txt /tests/golden/types-union-local-pending/types/txt
2321−/* src-630 %jibb /tests/golden/types-union-nonwing-subject/source/jibb
2322−/* tok-630 %txt /tests/golden/types-union-nonwing-subject/tokens/txt
2323−/* tre-630 %txt /tests/golden/types-union-nonwing-subject/tree/txt
2324−/* typ-630 %txt /tests/golden/types-union-nonwing-subject/types/txt
2325−/* src-631 %jibb /tests/golden/types-union-overlap/source/jibb
2326−/* tok-631 %txt /tests/golden/types-union-overlap/tokens/txt
2327−/* tre-631 %txt /tests/golden/types-union-overlap/tree/txt
2328−/* typ-631 %txt /tests/golden/types-union-overlap/types/txt
2329−/* src-632 %jibb /tests/golden/types-union-overlap-nested/source/jibb
2330−/* tok-632 %txt /tests/golden/types-union-overlap-nested/tokens/txt
2331−/* tre-632 %txt /tests/golden/types-union-overlap-nested/tree/txt
2332−/* typ-632 %txt /tests/golden/types-union-overlap-nested/types/txt
2333−/* src-633 %jibb /tests/golden/types-union-pattern-result-context/source/jibb
2334−/* tok-633 %txt /tests/golden/types-union-pattern-result-context/tokens/txt
2335−/* tre-633 %txt /tests/golden/types-union-pattern-result-context/tree/txt
2336−/* typ-633 %txt /tests/golden/types-union-pattern-result-context/types/txt
2337−/* src-634 %jibb /tests/golden/types-union-pattern-result-controls/source/jibb
2338−/* tok-634 %txt /tests/golden/types-union-pattern-result-controls/tokens/txt
2339−/* tre-634 %txt /tests/golden/types-union-pattern-result-controls/tree/txt
2340−/* typ-634 %txt /tests/golden/types-union-pattern-result-controls/types/txt
2341−/* src-635 %jibb /tests/golden/types-union-patterns/source/jibb
2342−/* tok-635 %txt /tests/golden/types-union-patterns/tokens/txt
2343−/* tre-635 %txt /tests/golden/types-union-patterns/tree/txt
2344−/* typ-635 %txt /tests/golden/types-union-patterns/types/txt
2345−/* src-636 %jibb /tests/golden/types-union-patterns-generic/source/jibb
2346−/* tok-636 %txt /tests/golden/types-union-patterns-generic/tokens/txt
2347−/* tre-636 %txt /tests/golden/types-union-patterns-generic/tree/txt
2348−/* typ-636 %txt /tests/golden/types-union-patterns-generic/types/txt
2349−/* src-637 %jibb /tests/golden/types-union-patterns-import/source/jibb
2350−/* tok-637 %txt /tests/golden/types-union-patterns-import/tokens/txt
2351−/* tre-637 %txt /tests/golden/types-union-patterns-import/tree/txt
2352−/* mod-637-1 %jibb /tests/golden/types-union-patterns-import/modules/ui/lib/jibb
2353−/* typ-637 %txt /tests/golden/types-union-patterns-import/types/txt
2354−/* mtre-637 %txt /tests/golden/types-union-patterns-import/module-trees/txt
2355−/* src-638 %jibb /tests/golden/types-union-phantom-generic/source/jibb
2356−/* tok-638 %txt /tests/golden/types-union-phantom-generic/tokens/txt
2357−/* tre-638 %txt /tests/golden/types-union-phantom-generic/tree/txt
2358−/* typ-638 %txt /tests/golden/types-union-phantom-generic/types/txt
2359−/* src-639 %jibb /tests/golden/types-union-polymorphic-identity/source/jibb
2360−/* tok-639 %txt /tests/golden/types-union-polymorphic-identity/tokens/txt
2361−/* tre-639 %txt /tests/golden/types-union-polymorphic-identity/tree/txt
2362−/* mod-639-1 %jibb /tests/golden/types-union-polymorphic-identity/modules/ui/one/jibb
2363−/* mod-639-2 %jibb /tests/golden/types-union-polymorphic-identity/modules/ui/two/jibb
2364−/* typ-639 %txt /tests/golden/types-union-polymorphic-identity/types/txt
2365−/* mtre-639 %txt /tests/golden/types-union-polymorphic-identity/module-trees/txt
2366−/* src-640 %jibb /tests/golden/types-union-print-cross-namespace/source/jibb
2367−/* tok-640 %txt /tests/golden/types-union-print-cross-namespace/tokens/txt
2368−/* tre-640 %txt /tests/golden/types-union-print-cross-namespace/tree/txt
2369−/* mod-640-1 %jibb /tests/golden/types-union-print-cross-namespace/modules/ui/lib/jibb
2370−/* typ-640 %txt /tests/golden/types-union-print-cross-namespace/types/txt
2371−/* mtre-640 %txt /tests/golden/types-union-print-cross-namespace/module-trees/txt
2372−/* src-641 %jibb /tests/golden/types-union-print-distinct/source/jibb
2373−/* tok-641 %txt /tests/golden/types-union-print-distinct/tokens/txt
2374−/* tre-641 %txt /tests/golden/types-union-print-distinct/tree/txt
2375−/* mod-641-1 %jibb /tests/golden/types-union-print-distinct/modules/ui/left/jibb
2376−/* mod-641-2 %jibb /tests/golden/types-union-print-distinct/modules/ui/right/jibb
2377−/* mod-641-3 %jibb /tests/golden/types-union-print-distinct/modules/ui/twin/jibb
2378−/* typ-641 %txt /tests/golden/types-union-print-distinct/types/txt
2379−/* mtre-641 %txt /tests/golden/types-union-print-distinct/module-trees/txt
2380−/* src-642 %jibb /tests/golden/types-union-print-escape/source/jibb
2381−/* tok-642 %txt /tests/golden/types-union-print-escape/tokens/txt
2382−/* tre-642 %txt /tests/golden/types-union-print-escape/tree/txt
2383−/* typ-642 %txt /tests/golden/types-union-print-escape/types/txt
2384−/* src-643 %jibb /tests/golden/types-union-print-local/source/jibb
2385−/* tok-643 %txt /tests/golden/types-union-print-local/tokens/txt
2386−/* tre-643 %txt /tests/golden/types-union-print-local/tree/txt
2387−/* typ-643 %txt /tests/golden/types-union-print-local/types/txt
2388−/* src-644 %jibb /tests/golden/types-union-print-nested/source/jibb
2389−/* tok-644 %txt /tests/golden/types-union-print-nested/tokens/txt
2390−/* tre-644 %txt /tests/golden/types-union-print-nested/tree/txt
2391−/* typ-644 %txt /tests/golden/types-union-print-nested/types/txt
2392−/* src-645 %jibb /tests/golden/types-union-print-same-origin/source/jibb
2393−/* tok-645 %txt /tests/golden/types-union-print-same-origin/tokens/txt
2394−/* tre-645 %txt /tests/golden/types-union-print-same-origin/tree/txt
2395−/* mod-645-1 %jibb /tests/golden/types-union-print-same-origin/modules/ui/shared/jibb
2396−/* typ-645 %txt /tests/golden/types-union-print-same-origin/types/txt
2397−/* mtre-645 %txt /tests/golden/types-union-print-same-origin/module-trees/txt
2398−/* src-646 %jibb /tests/golden/types-union-print-transitive/source/jibb
2399−/* tok-646 %txt /tests/golden/types-union-print-transitive/tokens/txt
2400−/* tre-646 %txt /tests/golden/types-union-print-transitive/tree/txt
2401−/* mod-646-1 %jibb /tests/golden/types-union-print-transitive/modules/ui/mid/jibb
2402−/* mod-646-2 %jibb /tests/golden/types-union-print-transitive/modules/ui/base/jibb
2403−/* typ-646 %txt /tests/golden/types-union-print-transitive/types/txt
2404−/* mtre-646 %txt /tests/golden/types-union-print-transitive/module-trees/txt
2405−/* src-647 %jibb /tests/golden/types-union-runtime-equality/source/jibb
2406−/* tok-647 %txt /tests/golden/types-union-runtime-equality/tokens/txt
2407−/* tre-647 %txt /tests/golden/types-union-runtime-equality/tree/txt
2408−/* typ-647 %txt /tests/golden/types-union-runtime-equality/types/txt
2409−/* src-648 %jibb /tests/golden/types-union-singleton/source/jibb
2410−/* tok-648 %txt /tests/golden/types-union-singleton/tokens/txt
2411−/* tre-648 %txt /tests/golden/types-union-singleton/tree/txt
2412−/* typ-648 %txt /tests/golden/types-union-singleton/types/txt
2413−/* src-649 %jibb /tests/golden/types-union-source-alias/source/jibb
2414−/* tok-649 %txt /tests/golden/types-union-source-alias/tokens/txt
2415−/* tre-649 %txt /tests/golden/types-union-source-alias/tree/txt
2416−/* typ-649 %txt /tests/golden/types-union-source-alias/types/txt
2417−/* src-650 %jibb /tests/golden/types-union-tag-atoms/source/jibb
2418−/* tok-650 %txt /tests/golden/types-union-tag-atoms/tokens/txt
2419−/* tre-650 %txt /tests/golden/types-union-tag-atoms/tree/txt
2420−/* typ-650 %txt /tests/golden/types-union-tag-atoms/types/txt
2421−/* src-651 %jibb /tests/golden/types-union-tags/source/jibb
2422−/* tok-651 %txt /tests/golden/types-union-tags/tokens/txt
2423−/* tre-651 %txt /tests/golden/types-union-tags/tree/txt
2424−/* typ-651 %txt /tests/golden/types-union-tags/types/txt
2425−/* src-652 %jibb /tests/golden/types-union-unresolved/source/jibb
2426−/* tok-652 %txt /tests/golden/types-union-unresolved/tokens/txt
2427−/* tre-652 %txt /tests/golden/types-union-unresolved/tree/txt
2428−/* typ-652 %txt /tests/golden/types-union-unresolved/types/txt
2429−/* src-653 %jibb /tests/golden/types-union-unresolved-flow/source/jibb
2430−/* tok-653 %txt /tests/golden/types-union-unresolved-flow/tokens/txt
2431−/* tre-653 %txt /tests/golden/types-union-unresolved-flow/tree/txt
2432−/* typ-653 %txt /tests/golden/types-union-unresolved-flow/types/txt
2433−/* src-654 %jibb /tests/golden/types-unit-construction/source/jibb
2434−/* tok-654 %txt /tests/golden/types-unit-construction/tokens/txt
2435−/* tre-654 %txt /tests/golden/types-unit-construction/tree/txt
2436−/* typ-654 %txt /tests/golden/types-unit-construction/types/txt
2437−/* src-655 %jibb /tests/golden/types-unit-context/source/jibb
2438−/* tok-655 %txt /tests/golden/types-unit-context/tokens/txt
2439−/* tre-655 %txt /tests/golden/types-unit-context/tree/txt
2440−/* typ-655 %txt /tests/golden/types-unit-context/types/txt
2441−/* src-656 %jibb /tests/golden/types-unit-patterns/source/jibb
2442−/* tok-656 %txt /tests/golden/types-unit-patterns/tokens/txt
2443−/* tre-656 %txt /tests/golden/types-unit-patterns/tree/txt
2444−/* typ-656 %txt /tests/golden/types-unit-patterns/types/txt
2445−/* src-657 %jibb /tests/golden/types-value-cycle-shadow/source/jibb
2446−/* tok-657 %txt /tests/golden/types-value-cycle-shadow/tokens/txt
2447−/* tre-657 %txt /tests/golden/types-value-cycle-shadow/tree/txt
2448−/* typ-657 %txt /tests/golden/types-value-cycle-shadow/types/txt
2449−/* src-658 %jibb /tests/golden/types-value-cycle-unsupported/source/jibb
2450−/* tok-658 %txt /tests/golden/types-value-cycle-unsupported/tokens/txt
2451−/* tre-658 %txt /tests/golden/types-value-cycle-unsupported/tree/txt
2452−/* typ-658 %txt /tests/golden/types-value-cycle-unsupported/types/txt
2453−/* src-659 %jibb /tests/golden/types-value-cycles/source/jibb
2454−/* tok-659 %txt /tests/golden/types-value-cycles/tokens/txt
2455−/* tre-659 %txt /tests/golden/types-value-cycles/tree/txt
2456−/* typ-659 %txt /tests/golden/types-value-cycles/types/txt
1998+/* src-555 %jibb /tests/golden/types-prelude-ui/source/jibb
1999+/* tok-555 %txt /tests/golden/types-prelude-ui/tokens/txt
2000+/* tre-555 %txt /tests/golden/types-prelude-ui/tree/txt
2001+/* typ-555 %txt /tests/golden/types-prelude-ui/types/txt
2002+/* src-556 %jibb /tests/golden/types-prelude-unit-helpers/source/jibb
2003+/* tok-556 %txt /tests/golden/types-prelude-unit-helpers/tokens/txt
2004+/* tre-556 %txt /tests/golden/types-prelude-unit-helpers/tree/txt
2005+/* typ-556 %txt /tests/golden/types-prelude-unit-helpers/types/txt
2006+/* src-557 %jibb /tests/golden/types-prelude-zing/source/jibb
2007+/* tok-557 %txt /tests/golden/types-prelude-zing/tokens/txt
2008+/* tre-557 %txt /tests/golden/types-prelude-zing/tree/txt
2009+/* typ-557 %txt /tests/golden/types-prelude-zing/types/txt
2010+/* src-558 %jibb /tests/golden/types-proj-explicit-context/source/jibb
2011+/* tok-558 %txt /tests/golden/types-proj-explicit-context/tokens/txt
2012+/* tre-558 %txt /tests/golden/types-proj-explicit-context/tree/txt
2013+/* typ-558 %txt /tests/golden/types-proj-explicit-context/types/txt
2014+/* src-559 %jibb /tests/golden/types-proj-nested-no-implicit/source/jibb
2015+/* tok-559 %txt /tests/golden/types-proj-nested-no-implicit/tokens/txt
2016+/* tre-559 %txt /tests/golden/types-proj-nested-no-implicit/tree/txt
2017+/* typ-559 %txt /tests/golden/types-proj-nested-no-implicit/types/txt
2018+/* src-560 %jibb /tests/golden/types-proj-reserved-imported-definition/source/jibb
2019+/* tok-560 %txt /tests/golden/types-proj-reserved-imported-definition/tokens/txt
2020+/* tre-560 %txt /tests/golden/types-proj-reserved-imported-definition/tree/txt
2021+/* mod-560-1 %jibb /tests/golden/types-proj-reserved-imported-definition/modules/ui/lib/jibb
2022+/* typ-560 %txt /tests/golden/types-proj-reserved-imported-definition/types/txt
2023+/* mtre-560 %txt /tests/golden/types-proj-reserved-imported-definition/module-trees/txt
2024+/* src-561 %jibb /tests/golden/types-proj-reserved-jibb-import/source/jibb
2025+/* tok-561 %txt /tests/golden/types-proj-reserved-jibb-import/tokens/txt
2026+/* tre-561 %txt /tests/golden/types-proj-reserved-jibb-import/tree/txt
2027+/* mod-561-1 %jibb /tests/golden/types-proj-reserved-jibb-import/modules/ui/lib/jibb
2028+/* typ-561 %txt /tests/golden/types-proj-reserved-jibb-import/types/txt
2029+/* mtre-561 %txt /tests/golden/types-proj-reserved-jibb-import/module-trees/txt
2030+/* src-562 %jibb /tests/golden/types-proj-reserved-local/source/jibb
2031+/* tok-562 %txt /tests/golden/types-proj-reserved-local/tokens/txt
2032+/* tre-562 %txt /tests/golden/types-proj-reserved-local/tree/txt
2033+/* typ-562 %txt /tests/golden/types-proj-reserved-local/types/txt
2034+/* src-563 %jibb /tests/golden/types-proj-reserved-local-mold/source/jibb
2035+/* tok-563 %txt /tests/golden/types-proj-reserved-local-mold/tokens/txt
2036+/* tre-563 %txt /tests/golden/types-proj-reserved-local-mold/tree/txt
2037+/* typ-563 %txt /tests/golden/types-proj-reserved-local-mold/types/txt
2038+/* src-564 %jibb /tests/golden/types-proj-reserved-mark-import/source/jibb
2039+/* tok-564 %txt /tests/golden/types-proj-reserved-mark-import/tokens/txt
2040+/* tre-564 %txt /tests/golden/types-proj-reserved-mark-import/tree/txt
2041+/* typ-564 %txt /tests/golden/types-proj-reserved-mark-import/types/txt
2042+/* src-565 %jibb /tests/golden/types-proj-reserved-mold/source/jibb
2043+/* tok-565 %txt /tests/golden/types-proj-reserved-mold/tokens/txt
2044+/* tre-565 %txt /tests/golden/types-proj-reserved-mold/tree/txt
2045+/* typ-565 %txt /tests/golden/types-proj-reserved-mold/types/txt
2046+/* src-566 %jibb /tests/golden/types-proj-reserved-pattern/source/jibb
2047+/* tok-566 %txt /tests/golden/types-proj-reserved-pattern/tokens/txt
2048+/* tre-566 %txt /tests/golden/types-proj-reserved-pattern/tree/txt
2049+/* typ-566 %txt /tests/golden/types-proj-reserved-pattern/types/txt
2050+/* src-567 %jibb /tests/golden/types-proj-reserved-positive/source/jibb
2051+/* tok-567 %txt /tests/golden/types-proj-reserved-positive/tokens/txt
2052+/* tre-567 %txt /tests/golden/types-proj-reserved-positive/tree/txt
2053+/* typ-567 %txt /tests/golden/types-proj-reserved-positive/types/txt
2054+/* src-568 %jibb /tests/golden/types-proj-reserved-sample/source/jibb
2055+/* tok-568 %txt /tests/golden/types-proj-reserved-sample/tokens/txt
2056+/* tre-568 %txt /tests/golden/types-proj-reserved-sample/tree/txt
2057+/* typ-568 %txt /tests/golden/types-proj-reserved-sample/types/txt
2058+/* src-569 %jibb /tests/golden/types-proj-reserved-sur-import/source/jibb
2059+/* tok-569 %txt /tests/golden/types-proj-reserved-sur-import/tokens/txt
2060+/* tre-569 %txt /tests/golden/types-proj-reserved-sur-import/tree/txt
2061+/* typ-569 %txt /tests/golden/types-proj-reserved-sur-import/types/txt
2062+/* src-570 %jibb /tests/golden/types-proj-reserved-unused-pattern/source/jibb
2063+/* tok-570 %txt /tests/golden/types-proj-reserved-unused-pattern/tokens/txt
2064+/* tre-570 %txt /tests/golden/types-proj-reserved-unused-pattern/tree/txt
2065+/* typ-570 %txt /tests/golden/types-proj-reserved-unused-pattern/types/txt
2066+/* src-571 %jibb /tests/golden/types-proj-reserved-unused-sample/source/jibb
2067+/* tok-571 %txt /tests/golden/types-proj-reserved-unused-sample/tokens/txt
2068+/* tre-571 %txt /tests/golden/types-proj-reserved-unused-sample/tree/txt
2069+/* typ-571 %txt /tests/golden/types-proj-reserved-unused-sample/types/txt
2070+/* src-572 %jibb /tests/golden/types-proj-reserved-unused-value/source/jibb
2071+/* tok-572 %txt /tests/golden/types-proj-reserved-unused-value/tokens/txt
2072+/* tre-572 %txt /tests/golden/types-proj-reserved-unused-value/tree/txt
2073+/* typ-572 %txt /tests/golden/types-proj-reserved-unused-value/types/txt
2074+/* src-573 %jibb /tests/golden/types-proj-reserved-value/source/jibb
2075+/* tok-573 %txt /tests/golden/types-proj-reserved-value/tokens/txt
2076+/* tre-573 %txt /tests/golden/types-proj-reserved-value/tree/txt
2077+/* typ-573 %txt /tests/golden/types-proj-reserved-value/types/txt
2078+/* src-574 %jibb /tests/golden/types-proj-single-duplicate/source/jibb
2079+/* tok-574 %txt /tests/golden/types-proj-single-duplicate/tokens/txt
2080+/* tre-574 %txt /tests/golden/types-proj-single-duplicate/tree/txt
2081+/* typ-574 %txt /tests/golden/types-proj-single-duplicate/types/txt
2082+/* src-575 %jibb /tests/golden/types-proj-single-field/source/jibb
2083+/* tok-575 %txt /tests/golden/types-proj-single-field/tokens/txt
2084+/* tre-575 %txt /tests/golden/types-proj-single-field/tree/txt
2085+/* typ-575 %txt /tests/golden/types-proj-single-field/types/txt
2086+/* src-576 %jibb /tests/golden/types-proj-single-sample-face/source/jibb
2087+/* tok-576 %txt /tests/golden/types-proj-single-sample-face/tokens/txt
2088+/* tre-576 %txt /tests/golden/types-proj-single-sample-face/tree/txt
2089+/* typ-576 %txt /tests/golden/types-proj-single-sample-face/types/txt
2090+/* src-577 %jibb /tests/golden/types-proj-single-wrapped/source/jibb
2091+/* tok-577 %txt /tests/golden/types-proj-single-wrapped/tokens/txt
2092+/* tre-577 %txt /tests/golden/types-proj-single-wrapped/tree/txt
2093+/* typ-577 %txt /tests/golden/types-proj-single-wrapped/types/txt
2094+/* src-578 %jibb /tests/golden/types-qath-faces/source/jibb
2095+/* tok-578 %txt /tests/golden/types-qath-faces/tokens/txt
2096+/* tre-578 %txt /tests/golden/types-qath-faces/tree/txt
2097+/* typ-578 %txt /tests/golden/types-qath-faces/types/txt
2098+/* src-579 %jibb /tests/golden/types-qath-holes/source/jibb
2099+/* tok-579 %txt /tests/golden/types-qath-holes/tokens/txt
2100+/* tre-579 %txt /tests/golden/types-qath-holes/tree/txt
2101+/* typ-579 %txt /tests/golden/types-qath-holes/types/txt
2102+/* src-580 %jibb /tests/golden/types-qath-module-identity/source/jibb
2103+/* tok-580 %txt /tests/golden/types-qath-module-identity/tokens/txt
2104+/* tre-580 %txt /tests/golden/types-qath-module-identity/tree/txt
2105+/* mod-580-1 %jibb /tests/golden/types-qath-module-identity/modules/ui/one/jibb
2106+/* mod-580-2 %jibb /tests/golden/types-qath-module-identity/modules/ui/two/jibb
2107+/* mod-580-3 %jibb /tests/golden/types-qath-module-identity/modules/ui/mid/jibb
2108+/* typ-580 %txt /tests/golden/types-qath-module-identity/types/txt
2109+/* mtre-580 %txt /tests/golden/types-qath-module-identity/module-trees/txt
2110+/* src-581 %jibb /tests/golden/types-qath-recursive/source/jibb
2111+/* tok-581 %txt /tests/golden/types-qath-recursive/tokens/txt
2112+/* tre-581 %txt /tests/golden/types-qath-recursive/tree/txt
2113+/* typ-581 %txt /tests/golden/types-qath-recursive/types/txt
2114+/* src-582 %jibb /tests/golden/types-record-bound-variable/source/jibb
2115+/* tok-582 %txt /tests/golden/types-record-bound-variable/tokens/txt
2116+/* tre-582 %txt /tests/golden/types-record-bound-variable/tree/txt
2117+/* typ-582 %txt /tests/golden/types-record-bound-variable/types/txt
2118+/* src-583 %jibb /tests/golden/types-record-cast-context/source/jibb
2119+/* tok-583 %txt /tests/golden/types-record-cast-context/tokens/txt
2120+/* tre-583 %txt /tests/golden/types-record-cast-context/tree/txt
2121+/* typ-583 %txt /tests/golden/types-record-cast-context/types/txt
2122+/* src-584 %jibb /tests/golden/types-record-change/source/jibb
2123+/* tok-584 %txt /tests/golden/types-record-change/tokens/txt
2124+/* tre-584 %txt /tests/golden/types-record-change/tree/txt
2125+/* typ-584 %txt /tests/golden/types-record-change/types/txt
2126+/* src-585 %jibb /tests/golden/types-record-change-generic/source/jibb
2127+/* tok-585 %txt /tests/golden/types-record-change-generic/tokens/txt
2128+/* tre-585 %txt /tests/golden/types-record-change-generic/tree/txt
2129+/* typ-585 %txt /tests/golden/types-record-change-generic/types/txt
2130+/* src-586 %jibb /tests/golden/types-record-faces/source/jibb
2131+/* tok-586 %txt /tests/golden/types-record-faces/tokens/txt
2132+/* tre-586 %txt /tests/golden/types-record-faces/tree/txt
2133+/* typ-586 %txt /tests/golden/types-record-faces/types/txt
2134+/* src-587 %jibb /tests/golden/types-record-field-edit-separate/source/jibb
2135+/* tok-587 %txt /tests/golden/types-record-field-edit-separate/tokens/txt
2136+/* tre-587 %txt /tests/golden/types-record-field-edit-separate/tree/txt
2137+/* typ-587 %txt /tests/golden/types-record-field-edit-separate/types/txt
2138+/* src-588 %jibb /tests/golden/types-record-field-expr-duplicate/source/jibb
2139+/* tok-588 %txt /tests/golden/types-record-field-expr-duplicate/tokens/txt
2140+/* tre-588 %txt /tests/golden/types-record-field-expr-duplicate/tree/txt
2141+/* typ-588 %txt /tests/golden/types-record-field-expr-duplicate/types/txt
2142+/* src-589 %jibb /tests/golden/types-record-field-expr-separate/source/jibb
2143+/* tok-589 %txt /tests/golden/types-record-field-expr-separate/tokens/txt
2144+/* tre-589 %txt /tests/golden/types-record-field-expr-separate/tree/txt
2145+/* typ-589 %txt /tests/golden/types-record-field-expr-separate/types/txt
2146+/* src-590 %jibb /tests/golden/types-record-field-module-reachable/source/jibb
2147+/* tok-590 %txt /tests/golden/types-record-field-module-reachable/tokens/txt
2148+/* tre-590 %txt /tests/golden/types-record-field-module-reachable/tree/txt
2149+/* mod-590-1 %jibb /tests/golden/types-record-field-module-reachable/modules/ui/lib/jibb
2150+/* typ-590 %txt /tests/golden/types-record-field-module-reachable/types/txt
2151+/* mtre-590 %txt /tests/golden/types-record-field-module-reachable/module-trees/txt
2152+/* src-591 %jibb /tests/golden/types-record-field-module-unused/source/jibb
2153+/* tok-591 %txt /tests/golden/types-record-field-module-unused/tokens/txt
2154+/* tre-591 %txt /tests/golden/types-record-field-module-unused/tree/txt
2155+/* mod-591-1 %jibb /tests/golden/types-record-field-module-unused/modules/ui/good/jibb
2156+/* mod-591-2 %jibb /tests/golden/types-record-field-module-unused/modules/ui/unused/jibb
2157+/* typ-591 %txt /tests/golden/types-record-field-module-unused/types/txt
2158+/* mtre-591 %txt /tests/golden/types-record-field-module-unused/module-trees/txt
2159+/* src-592 %jibb /tests/golden/types-record-field-nested-mold/source/jibb
2160+/* tok-592 %txt /tests/golden/types-record-field-nested-mold/tokens/txt
2161+/* tre-592 %txt /tests/golden/types-record-field-nested-mold/tree/txt
2162+/* typ-592 %txt /tests/golden/types-record-field-nested-mold/types/txt
2163+/* src-593 %jibb /tests/golden/types-record-field-outer-inner/source/jibb
2164+/* tok-593 %txt /tests/golden/types-record-field-outer-inner/tokens/txt
2165+/* tre-593 %txt /tests/golden/types-record-field-outer-inner/tree/txt
2166+/* typ-593 %txt /tests/golden/types-record-field-outer-inner/types/txt
2167+/* src-594 %jibb /tests/golden/types-record-field-sample-duplicate/source/jibb
2168+/* tok-594 %txt /tests/golden/types-record-field-sample-duplicate/tokens/txt
2169+/* tre-594 %txt /tests/golden/types-record-field-sample-duplicate/tree/txt
2170+/* typ-594 %txt /tests/golden/types-record-field-sample-duplicate/types/txt
2171+/* src-595 %jibb /tests/golden/types-record-field-separate-molds/source/jibb
2172+/* tok-595 %txt /tests/golden/types-record-field-separate-molds/tokens/txt
2173+/* tre-595 %txt /tests/golden/types-record-field-separate-molds/tree/txt
2174+/* typ-595 %txt /tests/golden/types-record-field-separate-molds/types/txt
2175+/* src-596 %jibb /tests/golden/types-record-field-unused-mold/source/jibb
2176+/* tok-596 %txt /tests/golden/types-record-field-unused-mold/tokens/txt
2177+/* tre-596 %txt /tests/golden/types-record-field-unused-mold/tree/txt
2178+/* typ-596 %txt /tests/golden/types-record-field-unused-mold/types/txt
2179+/* src-597 %jibb /tests/golden/types-record-import/source/jibb
2180+/* tok-597 %txt /tests/golden/types-record-import/tokens/txt
2181+/* tre-597 %txt /tests/golden/types-record-import/tree/txt
2182+/* mod-597-1 %jibb /tests/golden/types-record-import/modules/ui/lib/jibb
2183+/* typ-597 %txt /tests/golden/types-record-import/types/txt
2184+/* mtre-597 %txt /tests/golden/types-record-import/module-trees/txt
2185+/* src-598 %jibb /tests/golden/types-record-local-scheme/source/jibb
2186+/* tok-598 %txt /tests/golden/types-record-local-scheme/tokens/txt
2187+/* tre-598 %txt /tests/golden/types-record-local-scheme/tree/txt
2188+/* typ-598 %txt /tests/golden/types-record-local-scheme/types/txt
2189+/* src-599 %jibb /tests/golden/types-record-nested/source/jibb
2190+/* tok-599 %txt /tests/golden/types-record-nested/tokens/txt
2191+/* tre-599 %txt /tests/golden/types-record-nested/tree/txt
2192+/* typ-599 %txt /tests/golden/types-record-nested/types/txt
2193+/* src-600 %jibb /tests/golden/types-record-to-tuple/source/jibb
2194+/* tok-600 %txt /tests/golden/types-record-to-tuple/tokens/txt
2195+/* tre-600 %txt /tests/golden/types-record-to-tuple/tree/txt
2196+/* typ-600 %txt /tests/golden/types-record-to-tuple/types/txt
2197+/* src-601 %jibb /tests/golden/types-recursion-scc-failures/source/jibb
2198+/* tok-601 %txt /tests/golden/types-recursion-scc-failures/tokens/txt
2199+/* tre-601 %txt /tests/golden/types-recursion-scc-failures/tree/txt
2200+/* typ-601 %txt /tests/golden/types-recursion-scc-failures/types/txt
2201+/* src-602 %jibb /tests/golden/types-recursion-scc-groups/source/jibb
2202+/* tok-602 %txt /tests/golden/types-recursion-scc-groups/tokens/txt
2203+/* tre-602 %txt /tests/golden/types-recursion-scc-groups/tree/txt
2204+/* typ-602 %txt /tests/golden/types-recursion-scc-groups/types/txt
2205+/* src-603 %jibb /tests/golden/types-recursion-scc-import/source/jibb
2206+/* tok-603 %txt /tests/golden/types-recursion-scc-import/tokens/txt
2207+/* tre-603 %txt /tests/golden/types-recursion-scc-import/tree/txt
2208+/* mod-603-1 %jibb /tests/golden/types-recursion-scc-import/modules/ui/lib/jibb
2209+/* typ-603 %txt /tests/golden/types-recursion-scc-import/types/txt
2210+/* mtre-603 %txt /tests/golden/types-recursion-scc-import/module-trees/txt
2211+/* src-604 %jibb /tests/golden/types-recursion-scc-import-bad/source/jibb
2212+/* tok-604 %txt /tests/golden/types-recursion-scc-import-bad/tokens/txt
2213+/* tre-604 %txt /tests/golden/types-recursion-scc-import-bad/tree/txt
2214+/* mod-604-1 %jibb /tests/golden/types-recursion-scc-import-bad/modules/ui/lib/jibb
2215+/* typ-604 %txt /tests/golden/types-recursion-scc-import-bad/types/txt
2216+/* mtre-604 %txt /tests/golden/types-recursion-scc-import-bad/module-trees/txt
2217+/* src-605 %jibb /tests/golden/types-recursion-scc-local/source/jibb
2218+/* tok-605 %txt /tests/golden/types-recursion-scc-local/tokens/txt
2219+/* tre-605 %txt /tests/golden/types-recursion-scc-local/tree/txt
2220+/* typ-605 %txt /tests/golden/types-recursion-scc-local/types/txt
2221+/* src-606 %jibb /tests/golden/types-recursion-scc-order/source/jibb
2222+/* tok-606 %txt /tests/golden/types-recursion-scc-order/tokens/txt
2223+/* tre-606 %txt /tests/golden/types-recursion-scc-order/tree/txt
2224+/* typ-606 %txt /tests/golden/types-recursion-scc-order/types/txt
2225+/* src-607 %jibb /tests/golden/types-recursion-scc-shadow/source/jibb
2226+/* tok-607 %txt /tests/golden/types-recursion-scc-shadow/tokens/txt
2227+/* tre-607 %txt /tests/golden/types-recursion-scc-shadow/tree/txt
2228+/* typ-607 %txt /tests/golden/types-recursion-scc-shadow/types/txt
2229+/* src-608 %jibb /tests/golden/types-recursive-branch/source/jibb
2230+/* tok-608 %txt /tests/golden/types-recursive-branch/tokens/txt
2231+/* tre-608 %txt /tests/golden/types-recursive-branch/tree/txt
2232+/* typ-608 %txt /tests/golden/types-recursive-branch/types/txt
2233+/* src-609 %jibb /tests/golden/types-recursive-gate/source/jibb
2234+/* tok-609 %txt /tests/golden/types-recursive-gate/tokens/txt
2235+/* tre-609 %txt /tests/golden/types-recursive-gate/tree/txt
2236+/* typ-609 %txt /tests/golden/types-recursive-gate/types/txt
2237+/* src-610 %jibb /tests/golden/types-recursive-sample/source/jibb
2238+/* tok-610 %txt /tests/golden/types-recursive-sample/tokens/txt
2239+/* tre-610 %txt /tests/golden/types-recursive-sample/tree/txt
2240+/* typ-610 %txt /tests/golden/types-recursive-sample/types/txt
2241+/* src-611 %jibb /tests/golden/types-request-normal/source/jibb
2242+/* tok-611 %txt /tests/golden/types-request-normal/tokens/txt
2243+/* tre-611 %txt /tests/golden/types-request-normal/tree/txt
2244+/* mod-611-1 %jibb /tests/golden/types-request-normal/modules/ui/api/demo/jibb
2245+/* typ-611 %txt /tests/golden/types-request-normal/types/txt
2246+/* mark-611-1 %txt /tests/golden/types-request-normal/mar/full/txt
2247+/* mtre-611 %txt /tests/golden/types-request-normal/module-trees/txt
2248+/* src-612 %jibb /tests/golden/types-scope-library-poke/source/jibb
2249+/* tok-612 %txt /tests/golden/types-scope-library-poke/tokens/txt
2250+/* tre-612 %txt /tests/golden/types-scope-library-poke/tree/txt
2251+/* typ-612 %txt /tests/golden/types-scope-library-poke/types/txt
2252+/* src-613 %jibb /tests/golden/types-scope-root-api/source/jibb
2253+/* tok-613 %txt /tests/golden/types-scope-root-api/tokens/txt
2254+/* tre-613 %txt /tests/golden/types-scope-root-api/tree/txt
2255+/* typ-613 %txt /tests/golden/types-scope-root-api/types/txt
2256+/* src-614 %jibb /tests/golden/types-scope-store-duplicate/source/jibb
2257+/* tok-614 %txt /tests/golden/types-scope-store-duplicate/tokens/txt
2258+/* tre-614 %txt /tests/golden/types-scope-store-duplicate/tree/txt
2259+/* typ-614 %txt /tests/golden/types-scope-store-duplicate/types/txt
2260+/* src-615 %jibb /tests/golden/types-scope-store-shadow/source/jibb
2261+/* tok-615 %txt /tests/golden/types-scope-store-shadow/tokens/txt
2262+/* tre-615 %txt /tests/golden/types-scope-store-shadow/tree/txt
2263+/* typ-615 %txt /tests/golden/types-scope-store-shadow/types/txt
2264+/* src-616 %jibb /tests/golden/types-single-case-pattern/source/jibb
2265+/* tok-616 %txt /tests/golden/types-single-case-pattern/tokens/txt
2266+/* tre-616 %txt /tests/golden/types-single-case-pattern/tree/txt
2267+/* typ-616 %txt /tests/golden/types-single-case-pattern/types/txt
2268+/* src-617 %jibb /tests/golden/types-string-interpolation/source/jibb
2269+/* tok-617 %txt /tests/golden/types-string-interpolation/tokens/txt
2270+/* tre-617 %txt /tests/golden/types-string-interpolation/tree/txt
2271+/* typ-617 %txt /tests/golden/types-string-interpolation/types/txt
2272+/* src-618 %jibb /tests/golden/types-tuple-context/source/jibb
2273+/* tok-618 %txt /tests/golden/types-tuple-context/tokens/txt
2274+/* tre-618 %txt /tests/golden/types-tuple-context/tree/txt
2275+/* typ-618 %txt /tests/golden/types-tuple-context/types/txt
2276+/* src-619 %jibb /tests/golden/types-tuple-context-nested/source/jibb
2277+/* tok-619 %txt /tests/golden/types-tuple-context-nested/tokens/txt
2278+/* tre-619 %txt /tests/golden/types-tuple-context-nested/tree/txt
2279+/* typ-619 %txt /tests/golden/types-tuple-context-nested/types/txt
2280+/* src-620 %jibb /tests/golden/types-union-alias/source/jibb
2281+/* tok-620 %txt /tests/golden/types-union-alias/tokens/txt
2282+/* tre-620 %txt /tests/golden/types-union-alias/tree/txt
2283+/* typ-620 %txt /tests/golden/types-union-alias/types/txt
2284+/* src-621 %jibb /tests/golden/types-union-branch-context/source/jibb
2285+/* tok-621 %txt /tests/golden/types-union-branch-context/tokens/txt
2286+/* tre-621 %txt /tests/golden/types-union-branch-context/tree/txt
2287+/* typ-621 %txt /tests/golden/types-union-branch-context/types/txt
2288+/* src-622 %jibb /tests/golden/types-union-branch-pending/source/jibb
2289+/* tok-622 %txt /tests/golden/types-union-branch-pending/tokens/txt
2290+/* tre-622 %txt /tests/golden/types-union-branch-pending/tree/txt
2291+/* typ-622 %txt /tests/golden/types-union-branch-pending/types/txt
2292+/* src-623 %jibb /tests/golden/types-union-constructor-shape/source/jibb
2293+/* tok-623 %txt /tests/golden/types-union-constructor-shape/tokens/txt
2294+/* tre-623 %txt /tests/golden/types-union-constructor-shape/tree/txt
2295+/* typ-623 %txt /tests/golden/types-union-constructor-shape/types/txt
2296+/* src-624 %jibb /tests/golden/types-union-context-flow/source/jibb
2297+/* tok-624 %txt /tests/golden/types-union-context-flow/tokens/txt
2298+/* tre-624 %txt /tests/golden/types-union-context-flow/tree/txt
2299+/* typ-624 %txt /tests/golden/types-union-context-flow/types/txt
2300+/* src-625 %jibb /tests/golden/types-union-finite/source/jibb
2301+/* tok-625 %txt /tests/golden/types-union-finite/tokens/txt
2302+/* tre-625 %txt /tests/golden/types-union-finite/tree/txt
2303+/* typ-625 %txt /tests/golden/types-union-finite/types/txt
2304+/* src-626 %jibb /tests/golden/types-union-finite-context/source/jibb
2305+/* tok-626 %txt /tests/golden/types-union-finite-context/tokens/txt
2306+/* tre-626 %txt /tests/golden/types-union-finite-context/tree/txt
2307+/* typ-626 %txt /tests/golden/types-union-finite-context/types/txt
2308+/* src-627 %jibb /tests/golden/types-union-finite-generic/source/jibb
2309+/* tok-627 %txt /tests/golden/types-union-finite-generic/tokens/txt
2310+/* tre-627 %txt /tests/golden/types-union-finite-generic/tree/txt
2311+/* typ-627 %txt /tests/golden/types-union-finite-generic/types/txt
2312+/* src-628 %jibb /tests/golden/types-union-finite-limit/source/jibb
2313+/* tok-628 %txt /tests/golden/types-union-finite-limit/tokens/txt
2314+/* tre-628 %txt /tests/golden/types-union-finite-limit/tree/txt
2315+/* typ-628 %txt /tests/golden/types-union-finite-limit/types/txt
2316+/* src-629 %jibb /tests/golden/types-union-import/source/jibb
2317+/* tok-629 %txt /tests/golden/types-union-import/tokens/txt
2318+/* tre-629 %txt /tests/golden/types-union-import/tree/txt
2319+/* mod-629-1 %jibb /tests/golden/types-union-import/modules/ui/lib/jibb
2320+/* typ-629 %txt /tests/golden/types-union-import/types/txt
2321+/* mtre-629 %txt /tests/golden/types-union-import/module-trees/txt
2322+/* src-630 %jibb /tests/golden/types-union-local-pending/source/jibb
2323+/* tok-630 %txt /tests/golden/types-union-local-pending/tokens/txt
2324+/* tre-630 %txt /tests/golden/types-union-local-pending/tree/txt
2325+/* typ-630 %txt /tests/golden/types-union-local-pending/types/txt
2326+/* src-631 %jibb /tests/golden/types-union-nonwing-subject/source/jibb
2327+/* tok-631 %txt /tests/golden/types-union-nonwing-subject/tokens/txt
2328+/* tre-631 %txt /tests/golden/types-union-nonwing-subject/tree/txt
2329+/* typ-631 %txt /tests/golden/types-union-nonwing-subject/types/txt
2330+/* src-632 %jibb /tests/golden/types-union-overlap/source/jibb
2331+/* tok-632 %txt /tests/golden/types-union-overlap/tokens/txt
2332+/* tre-632 %txt /tests/golden/types-union-overlap/tree/txt
2333+/* typ-632 %txt /tests/golden/types-union-overlap/types/txt
2334+/* src-633 %jibb /tests/golden/types-union-overlap-nested/source/jibb
2335+/* tok-633 %txt /tests/golden/types-union-overlap-nested/tokens/txt
2336+/* tre-633 %txt /tests/golden/types-union-overlap-nested/tree/txt
2337+/* typ-633 %txt /tests/golden/types-union-overlap-nested/types/txt
2338+/* src-634 %jibb /tests/golden/types-union-pattern-result-context/source/jibb
2339+/* tok-634 %txt /tests/golden/types-union-pattern-result-context/tokens/txt
2340+/* tre-634 %txt /tests/golden/types-union-pattern-result-context/tree/txt
2341+/* typ-634 %txt /tests/golden/types-union-pattern-result-context/types/txt
2342+/* src-635 %jibb /tests/golden/types-union-pattern-result-controls/source/jibb
2343+/* tok-635 %txt /tests/golden/types-union-pattern-result-controls/tokens/txt
2344+/* tre-635 %txt /tests/golden/types-union-pattern-result-controls/tree/txt
2345+/* typ-635 %txt /tests/golden/types-union-pattern-result-controls/types/txt
2346+/* src-636 %jibb /tests/golden/types-union-patterns/source/jibb
2347+/* tok-636 %txt /tests/golden/types-union-patterns/tokens/txt
2348+/* tre-636 %txt /tests/golden/types-union-patterns/tree/txt
2349+/* typ-636 %txt /tests/golden/types-union-patterns/types/txt
2350+/* src-637 %jibb /tests/golden/types-union-patterns-generic/source/jibb
2351+/* tok-637 %txt /tests/golden/types-union-patterns-generic/tokens/txt
2352+/* tre-637 %txt /tests/golden/types-union-patterns-generic/tree/txt
2353+/* typ-637 %txt /tests/golden/types-union-patterns-generic/types/txt
2354+/* src-638 %jibb /tests/golden/types-union-patterns-import/source/jibb
2355+/* tok-638 %txt /tests/golden/types-union-patterns-import/tokens/txt
2356+/* tre-638 %txt /tests/golden/types-union-patterns-import/tree/txt
2357+/* mod-638-1 %jibb /tests/golden/types-union-patterns-import/modules/ui/lib/jibb
2358+/* typ-638 %txt /tests/golden/types-union-patterns-import/types/txt
2359+/* mtre-638 %txt /tests/golden/types-union-patterns-import/module-trees/txt
2360+/* src-639 %jibb /tests/golden/types-union-phantom-generic/source/jibb
2361+/* tok-639 %txt /tests/golden/types-union-phantom-generic/tokens/txt
2362+/* tre-639 %txt /tests/golden/types-union-phantom-generic/tree/txt
2363+/* typ-639 %txt /tests/golden/types-union-phantom-generic/types/txt
2364+/* src-640 %jibb /tests/golden/types-union-polymorphic-identity/source/jibb
2365+/* tok-640 %txt /tests/golden/types-union-polymorphic-identity/tokens/txt
2366+/* tre-640 %txt /tests/golden/types-union-polymorphic-identity/tree/txt
2367+/* mod-640-1 %jibb /tests/golden/types-union-polymorphic-identity/modules/ui/one/jibb
2368+/* mod-640-2 %jibb /tests/golden/types-union-polymorphic-identity/modules/ui/two/jibb
2369+/* typ-640 %txt /tests/golden/types-union-polymorphic-identity/types/txt
2370+/* mtre-640 %txt /tests/golden/types-union-polymorphic-identity/module-trees/txt
2371+/* src-641 %jibb /tests/golden/types-union-print-cross-namespace/source/jibb
2372+/* tok-641 %txt /tests/golden/types-union-print-cross-namespace/tokens/txt
2373+/* tre-641 %txt /tests/golden/types-union-print-cross-namespace/tree/txt
2374+/* mod-641-1 %jibb /tests/golden/types-union-print-cross-namespace/modules/ui/lib/jibb
2375+/* typ-641 %txt /tests/golden/types-union-print-cross-namespace/types/txt
2376+/* mtre-641 %txt /tests/golden/types-union-print-cross-namespace/module-trees/txt
2377+/* src-642 %jibb /tests/golden/types-union-print-distinct/source/jibb
2378+/* tok-642 %txt /tests/golden/types-union-print-distinct/tokens/txt
2379+/* tre-642 %txt /tests/golden/types-union-print-distinct/tree/txt
2380+/* mod-642-1 %jibb /tests/golden/types-union-print-distinct/modules/ui/left/jibb
2381+/* mod-642-2 %jibb /tests/golden/types-union-print-distinct/modules/ui/right/jibb
2382+/* mod-642-3 %jibb /tests/golden/types-union-print-distinct/modules/ui/twin/jibb
2383+/* typ-642 %txt /tests/golden/types-union-print-distinct/types/txt
2384+/* mtre-642 %txt /tests/golden/types-union-print-distinct/module-trees/txt
2385+/* src-643 %jibb /tests/golden/types-union-print-escape/source/jibb
2386+/* tok-643 %txt /tests/golden/types-union-print-escape/tokens/txt
2387+/* tre-643 %txt /tests/golden/types-union-print-escape/tree/txt
2388+/* typ-643 %txt /tests/golden/types-union-print-escape/types/txt
2389+/* src-644 %jibb /tests/golden/types-union-print-local/source/jibb
2390+/* tok-644 %txt /tests/golden/types-union-print-local/tokens/txt
2391+/* tre-644 %txt /tests/golden/types-union-print-local/tree/txt
2392+/* typ-644 %txt /tests/golden/types-union-print-local/types/txt
2393+/* src-645 %jibb /tests/golden/types-union-print-nested/source/jibb
2394+/* tok-645 %txt /tests/golden/types-union-print-nested/tokens/txt
2395+/* tre-645 %txt /tests/golden/types-union-print-nested/tree/txt
2396+/* typ-645 %txt /tests/golden/types-union-print-nested/types/txt
2397+/* src-646 %jibb /tests/golden/types-union-print-same-origin/source/jibb
2398+/* tok-646 %txt /tests/golden/types-union-print-same-origin/tokens/txt
2399+/* tre-646 %txt /tests/golden/types-union-print-same-origin/tree/txt
2400+/* mod-646-1 %jibb /tests/golden/types-union-print-same-origin/modules/ui/shared/jibb
2401+/* typ-646 %txt /tests/golden/types-union-print-same-origin/types/txt
2402+/* mtre-646 %txt /tests/golden/types-union-print-same-origin/module-trees/txt
2403+/* src-647 %jibb /tests/golden/types-union-print-transitive/source/jibb
2404+/* tok-647 %txt /tests/golden/types-union-print-transitive/tokens/txt
2405+/* tre-647 %txt /tests/golden/types-union-print-transitive/tree/txt
2406+/* mod-647-1 %jibb /tests/golden/types-union-print-transitive/modules/ui/mid/jibb
2407+/* mod-647-2 %jibb /tests/golden/types-union-print-transitive/modules/ui/base/jibb
2408+/* typ-647 %txt /tests/golden/types-union-print-transitive/types/txt
2409+/* mtre-647 %txt /tests/golden/types-union-print-transitive/module-trees/txt
2410+/* src-648 %jibb /tests/golden/types-union-runtime-equality/source/jibb
2411+/* tok-648 %txt /tests/golden/types-union-runtime-equality/tokens/txt
2412+/* tre-648 %txt /tests/golden/types-union-runtime-equality/tree/txt
2413+/* typ-648 %txt /tests/golden/types-union-runtime-equality/types/txt
2414+/* src-649 %jibb /tests/golden/types-union-singleton/source/jibb
2415+/* tok-649 %txt /tests/golden/types-union-singleton/tokens/txt
2416+/* tre-649 %txt /tests/golden/types-union-singleton/tree/txt
2417+/* typ-649 %txt /tests/golden/types-union-singleton/types/txt
2418+/* src-650 %jibb /tests/golden/types-union-source-alias/source/jibb
2419+/* tok-650 %txt /tests/golden/types-union-source-alias/tokens/txt
2420+/* tre-650 %txt /tests/golden/types-union-source-alias/tree/txt
2421+/* typ-650 %txt /tests/golden/types-union-source-alias/types/txt
2422+/* src-651 %jibb /tests/golden/types-union-tag-atoms/source/jibb
2423+/* tok-651 %txt /tests/golden/types-union-tag-atoms/tokens/txt
2424+/* tre-651 %txt /tests/golden/types-union-tag-atoms/tree/txt
2425+/* typ-651 %txt /tests/golden/types-union-tag-atoms/types/txt
2426+/* src-652 %jibb /tests/golden/types-union-tags/source/jibb
2427+/* tok-652 %txt /tests/golden/types-union-tags/tokens/txt
2428+/* tre-652 %txt /tests/golden/types-union-tags/tree/txt
2429+/* typ-652 %txt /tests/golden/types-union-tags/types/txt
2430+/* src-653 %jibb /tests/golden/types-union-unresolved/source/jibb
2431+/* tok-653 %txt /tests/golden/types-union-unresolved/tokens/txt
2432+/* tre-653 %txt /tests/golden/types-union-unresolved/tree/txt
2433+/* typ-653 %txt /tests/golden/types-union-unresolved/types/txt
2434+/* src-654 %jibb /tests/golden/types-union-unresolved-flow/source/jibb
2435+/* tok-654 %txt /tests/golden/types-union-unresolved-flow/tokens/txt
2436+/* tre-654 %txt /tests/golden/types-union-unresolved-flow/tree/txt
2437+/* typ-654 %txt /tests/golden/types-union-unresolved-flow/types/txt
2438+/* src-655 %jibb /tests/golden/types-unit-construction/source/jibb
2439+/* tok-655 %txt /tests/golden/types-unit-construction/tokens/txt
2440+/* tre-655 %txt /tests/golden/types-unit-construction/tree/txt
2441+/* typ-655 %txt /tests/golden/types-unit-construction/types/txt
2442+/* src-656 %jibb /tests/golden/types-unit-context/source/jibb
2443+/* tok-656 %txt /tests/golden/types-unit-context/tokens/txt
2444+/* tre-656 %txt /tests/golden/types-unit-context/tree/txt
2445+/* typ-656 %txt /tests/golden/types-unit-context/types/txt
2446+/* src-657 %jibb /tests/golden/types-unit-patterns/source/jibb
2447+/* tok-657 %txt /tests/golden/types-unit-patterns/tokens/txt
2448+/* tre-657 %txt /tests/golden/types-unit-patterns/tree/txt
2449+/* typ-657 %txt /tests/golden/types-unit-patterns/types/txt
2450+/* src-658 %jibb /tests/golden/types-value-cycle-shadow/source/jibb
2451+/* tok-658 %txt /tests/golden/types-value-cycle-shadow/tokens/txt
2452+/* tre-658 %txt /tests/golden/types-value-cycle-shadow/tree/txt
2453+/* typ-658 %txt /tests/golden/types-value-cycle-shadow/types/txt
2454+/* src-659 %jibb /tests/golden/types-value-cycle-unsupported/source/jibb
2455+/* tok-659 %txt /tests/golden/types-value-cycle-unsupported/tokens/txt
2456+/* tre-659 %txt /tests/golden/types-value-cycle-unsupported/tree/txt
2457+/* typ-659 %txt /tests/golden/types-value-cycle-unsupported/types/txt
2458+/* src-660 %jibb /tests/golden/types-value-cycles/source/jibb
2459+/* tok-660 %txt /tests/golden/types-value-cycles/tokens/txt
2460+/* tre-660 %txt /tests/golden/types-value-cycles/tree/txt
2461+/* typ-660 %txt /tests/golden/types-value-cycles/types/txt
24572462=/ prepared-prelude (prepare-prelude-with-internal:jibb prelude-source internal-source)
24582463|%
24592464:: one arm per case
@@ -2463,7 +2468,7 @@
24632468++ test-doc-grammar-01-imports
24642469 (check ~.doc-grammar-01-imports src-2 `tok-2 `tre-2)
24652470++ test-doc-grammar-02-buttons
2466− (check ~.doc-grammar-02-buttons src-3 `tok-3 `tre-3)
2471+ (weld (check ~.doc-grammar-02-buttons src-3 `tok-3 `tre-3) (check-module-types ~.doc-grammar-02-buttons ~[%tests %golden ~.doc-grammar-02-buttons %source %jibb] src-3 `typ-3 ~ ~ ~))
24672472++ test-doc-grammar-03-view-day
24682473 (check ~.doc-grammar-03-view-day src-4 `tok-4 `tre-4)
24692474++ test-doc-grammar-04-step
@@ -3566,216 +3571,218 @@
35663571 (weld (check ~.types-prelude-succ src-553 `tok-553 `tre-553) (check-module-types ~.types-prelude-succ ~[%tests %golden ~.types-prelude-succ %source %jibb] src-553 `typ-553 ~ ~ ~))
35673572++ test-types-prelude-text
35683573 (weld (check ~.types-prelude-text src-554 `tok-554 `tre-554) (check-module-types ~.types-prelude-text ~[%tests %golden ~.types-prelude-text %source %jibb] src-554 `typ-554 ~ ~ ~))
3574+++ test-types-prelude-ui
3575+ (weld (check ~.types-prelude-ui src-555 `tok-555 `tre-555) (check-module-types ~.types-prelude-ui ~[%tests %golden ~.types-prelude-ui %source %jibb] src-555 `typ-555 ~ ~ ~))
35693576++ test-types-prelude-unit-helpers
3570− (weld (check ~.types-prelude-unit-helpers src-555 `tok-555 `tre-555) (check-module-types ~.types-prelude-unit-helpers ~[%tests %golden ~.types-prelude-unit-helpers %source %jibb] src-555 `typ-555 ~ ~ ~))
3577+ (weld (check ~.types-prelude-unit-helpers src-556 `tok-556 `tre-556) (check-module-types ~.types-prelude-unit-helpers ~[%tests %golden ~.types-prelude-unit-helpers %source %jibb] src-556 `typ-556 ~ ~ ~))
35713578++ test-types-prelude-zing
3572− (weld (check ~.types-prelude-zing src-556 `tok-556 `tre-556) (check-module-types ~.types-prelude-zing ~[%tests %golden ~.types-prelude-zing %source %jibb] src-556 `typ-556 ~ ~ ~))
3579+ (weld (check ~.types-prelude-zing src-557 `tok-557 `tre-557) (check-module-types ~.types-prelude-zing ~[%tests %golden ~.types-prelude-zing %source %jibb] src-557 `typ-557 ~ ~ ~))
35733580++ test-types-proj-explicit-context
3574− (weld (check ~.types-proj-explicit-context src-557 `tok-557 `tre-557) (check-module-types ~.types-proj-explicit-context ~[%tests %golden ~.types-proj-explicit-context %source %jibb] src-557 `typ-557 ~ ~ ~))
3581+ (weld (check ~.types-proj-explicit-context src-558 `tok-558 `tre-558) (check-module-types ~.types-proj-explicit-context ~[%tests %golden ~.types-proj-explicit-context %source %jibb] src-558 `typ-558 ~ ~ ~))
35753582++ test-types-proj-nested-no-implicit
3576− (weld (check ~.types-proj-nested-no-implicit src-558 `tok-558 `tre-558) (check-module-types ~.types-proj-nested-no-implicit ~[%tests %golden ~.types-proj-nested-no-implicit %source %jibb] src-558 `typ-558 ~ ~ ~))
3583+ (weld (check ~.types-proj-nested-no-implicit src-559 `tok-559 `tre-559) (check-module-types ~.types-proj-nested-no-implicit ~[%tests %golden ~.types-proj-nested-no-implicit %source %jibb] src-559 `typ-559 ~ ~ ~))
35773584++ test-types-proj-reserved-imported-definition
3578− (weld (weld (check ~.types-proj-reserved-imported-definition src-559 `tok-559 `tre-559) (check-module-types ~.types-proj-reserved-imported-definition ~[%tests %golden ~.types-proj-reserved-imported-definition %source %jibb] src-559 `typ-559 ~ ~ ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-559-1]])) (check-module-trees ~.types-proj-reserved-imported-definition `mtre-559 ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-559-1]]))
3585+ (weld (weld (check ~.types-proj-reserved-imported-definition src-560 `tok-560 `tre-560) (check-module-types ~.types-proj-reserved-imported-definition ~[%tests %golden ~.types-proj-reserved-imported-definition %source %jibb] src-560 `typ-560 ~ ~ ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-560-1]])) (check-module-trees ~.types-proj-reserved-imported-definition `mtre-560 ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-560-1]]))
35793586++ test-types-proj-reserved-jibb-import
3580− (weld (weld (check ~.types-proj-reserved-jibb-import src-560 `tok-560 `tre-560) (check-module-types ~.types-proj-reserved-jibb-import ~[%tests %golden ~.types-proj-reserved-jibb-import %source %jibb] src-560 `typ-560 ~ ~ ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-560-1]])) (check-module-trees ~.types-proj-reserved-jibb-import `mtre-560 ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-560-1]]))
3587+ (weld (weld (check ~.types-proj-reserved-jibb-import src-561 `tok-561 `tre-561) (check-module-types ~.types-proj-reserved-jibb-import ~[%tests %golden ~.types-proj-reserved-jibb-import %source %jibb] src-561 `typ-561 ~ ~ ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-561-1]])) (check-module-trees ~.types-proj-reserved-jibb-import `mtre-561 ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-561-1]]))
35813588++ test-types-proj-reserved-local
3582− (weld (check ~.types-proj-reserved-local src-561 `tok-561 `tre-561) (check-module-types ~.types-proj-reserved-local ~[%tests %golden ~.types-proj-reserved-local %source %jibb] src-561 `typ-561 ~ ~ ~))
3589+ (weld (check ~.types-proj-reserved-local src-562 `tok-562 `tre-562) (check-module-types ~.types-proj-reserved-local ~[%tests %golden ~.types-proj-reserved-local %source %jibb] src-562 `typ-562 ~ ~ ~))
35833590++ test-types-proj-reserved-local-mold
3584− (weld (check ~.types-proj-reserved-local-mold src-562 `tok-562 `tre-562) (check-module-types ~.types-proj-reserved-local-mold ~[%tests %golden ~.types-proj-reserved-local-mold %source %jibb] src-562 `typ-562 ~ ~ ~))
3591+ (weld (check ~.types-proj-reserved-local-mold src-563 `tok-563 `tre-563) (check-module-types ~.types-proj-reserved-local-mold ~[%tests %golden ~.types-proj-reserved-local-mold %source %jibb] src-563 `typ-563 ~ ~ ~))
35853592++ test-types-proj-reserved-mark-import
3586− (weld (check ~.types-proj-reserved-mark-import src-563 `tok-563 `tre-563) (check-module-types ~.types-proj-reserved-mark-import ~[%tests %golden ~.types-proj-reserved-mark-import %source %jibb] src-563 `typ-563 ~ ~ ~))
3593+ (weld (check ~.types-proj-reserved-mark-import src-564 `tok-564 `tre-564) (check-module-types ~.types-proj-reserved-mark-import ~[%tests %golden ~.types-proj-reserved-mark-import %source %jibb] src-564 `typ-564 ~ ~ ~))
35873594++ test-types-proj-reserved-mold
3588− (weld (check ~.types-proj-reserved-mold src-564 `tok-564 `tre-564) (check-module-types ~.types-proj-reserved-mold ~[%tests %golden ~.types-proj-reserved-mold %source %jibb] src-564 `typ-564 ~ ~ ~))
3595+ (weld (check ~.types-proj-reserved-mold src-565 `tok-565 `tre-565) (check-module-types ~.types-proj-reserved-mold ~[%tests %golden ~.types-proj-reserved-mold %source %jibb] src-565 `typ-565 ~ ~ ~))
35893596++ test-types-proj-reserved-pattern
3590− (weld (check ~.types-proj-reserved-pattern src-565 `tok-565 `tre-565) (check-module-types ~.types-proj-reserved-pattern ~[%tests %golden ~.types-proj-reserved-pattern %source %jibb] src-565 `typ-565 ~ ~ ~))
3597+ (weld (check ~.types-proj-reserved-pattern src-566 `tok-566 `tre-566) (check-module-types ~.types-proj-reserved-pattern ~[%tests %golden ~.types-proj-reserved-pattern %source %jibb] src-566 `typ-566 ~ ~ ~))
35913598++ test-types-proj-reserved-positive
3592− (weld (check ~.types-proj-reserved-positive src-566 `tok-566 `tre-566) (check-module-types ~.types-proj-reserved-positive ~[%tests %golden ~.types-proj-reserved-positive %source %jibb] src-566 `typ-566 ~ ~ ~))
3599+ (weld (check ~.types-proj-reserved-positive src-567 `tok-567 `tre-567) (check-module-types ~.types-proj-reserved-positive ~[%tests %golden ~.types-proj-reserved-positive %source %jibb] src-567 `typ-567 ~ ~ ~))
35933600++ test-types-proj-reserved-sample
3594− (weld (check ~.types-proj-reserved-sample src-567 `tok-567 `tre-567) (check-module-types ~.types-proj-reserved-sample ~[%tests %golden ~.types-proj-reserved-sample %source %jibb] src-567 `typ-567 ~ ~ ~))
3601+ (weld (check ~.types-proj-reserved-sample src-568 `tok-568 `tre-568) (check-module-types ~.types-proj-reserved-sample ~[%tests %golden ~.types-proj-reserved-sample %source %jibb] src-568 `typ-568 ~ ~ ~))
35953602++ test-types-proj-reserved-sur-import
3596− (weld (check ~.types-proj-reserved-sur-import src-568 `tok-568 `tre-568) (check-module-types ~.types-proj-reserved-sur-import ~[%tests %golden ~.types-proj-reserved-sur-import %source %jibb] src-568 `typ-568 ~ ~ ~))
3603+ (weld (check ~.types-proj-reserved-sur-import src-569 `tok-569 `tre-569) (check-module-types ~.types-proj-reserved-sur-import ~[%tests %golden ~.types-proj-reserved-sur-import %source %jibb] src-569 `typ-569 ~ ~ ~))
35973604++ test-types-proj-reserved-unused-pattern
3598− (weld (check ~.types-proj-reserved-unused-pattern src-569 `tok-569 `tre-569) (check-module-types ~.types-proj-reserved-unused-pattern ~[%tests %golden ~.types-proj-reserved-unused-pattern %source %jibb] src-569 `typ-569 ~ ~ ~))
3605+ (weld (check ~.types-proj-reserved-unused-pattern src-570 `tok-570 `tre-570) (check-module-types ~.types-proj-reserved-unused-pattern ~[%tests %golden ~.types-proj-reserved-unused-pattern %source %jibb] src-570 `typ-570 ~ ~ ~))
35993606++ test-types-proj-reserved-unused-sample
3600− (weld (check ~.types-proj-reserved-unused-sample src-570 `tok-570 `tre-570) (check-module-types ~.types-proj-reserved-unused-sample ~[%tests %golden ~.types-proj-reserved-unused-sample %source %jibb] src-570 `typ-570 ~ ~ ~))
3607+ (weld (check ~.types-proj-reserved-unused-sample src-571 `tok-571 `tre-571) (check-module-types ~.types-proj-reserved-unused-sample ~[%tests %golden ~.types-proj-reserved-unused-sample %source %jibb] src-571 `typ-571 ~ ~ ~))
36013608++ test-types-proj-reserved-unused-value
3602− (weld (check ~.types-proj-reserved-unused-value src-571 `tok-571 `tre-571) (check-module-types ~.types-proj-reserved-unused-value ~[%tests %golden ~.types-proj-reserved-unused-value %source %jibb] src-571 `typ-571 ~ ~ ~))
3609+ (weld (check ~.types-proj-reserved-unused-value src-572 `tok-572 `tre-572) (check-module-types ~.types-proj-reserved-unused-value ~[%tests %golden ~.types-proj-reserved-unused-value %source %jibb] src-572 `typ-572 ~ ~ ~))
36033610++ test-types-proj-reserved-value
3604− (weld (check ~.types-proj-reserved-value src-572 `tok-572 `tre-572) (check-module-types ~.types-proj-reserved-value ~[%tests %golden ~.types-proj-reserved-value %source %jibb] src-572 `typ-572 ~ ~ ~))
3611+ (weld (check ~.types-proj-reserved-value src-573 `tok-573 `tre-573) (check-module-types ~.types-proj-reserved-value ~[%tests %golden ~.types-proj-reserved-value %source %jibb] src-573 `typ-573 ~ ~ ~))
36053612++ test-types-proj-single-duplicate
3606− (weld (check ~.types-proj-single-duplicate src-573 `tok-573 `tre-573) (check-module-types ~.types-proj-single-duplicate ~[%tests %golden ~.types-proj-single-duplicate %source %jibb] src-573 `typ-573 ~ ~ ~))
3613+ (weld (check ~.types-proj-single-duplicate src-574 `tok-574 `tre-574) (check-module-types ~.types-proj-single-duplicate ~[%tests %golden ~.types-proj-single-duplicate %source %jibb] src-574 `typ-574 ~ ~ ~))
36073614++ test-types-proj-single-field
3608− (weld (check ~.types-proj-single-field src-574 `tok-574 `tre-574) (check-module-types ~.types-proj-single-field ~[%tests %golden ~.types-proj-single-field %source %jibb] src-574 `typ-574 ~ ~ ~))
3615+ (weld (check ~.types-proj-single-field src-575 `tok-575 `tre-575) (check-module-types ~.types-proj-single-field ~[%tests %golden ~.types-proj-single-field %source %jibb] src-575 `typ-575 ~ ~ ~))
36093616++ test-types-proj-single-sample-face
3610− (weld (check ~.types-proj-single-sample-face src-575 `tok-575 `tre-575) (check-module-types ~.types-proj-single-sample-face ~[%tests %golden ~.types-proj-single-sample-face %source %jibb] src-575 `typ-575 ~ ~ ~))
3617+ (weld (check ~.types-proj-single-sample-face src-576 `tok-576 `tre-576) (check-module-types ~.types-proj-single-sample-face ~[%tests %golden ~.types-proj-single-sample-face %source %jibb] src-576 `typ-576 ~ ~ ~))
36113618++ test-types-proj-single-wrapped
3612− (weld (check ~.types-proj-single-wrapped src-576 `tok-576 `tre-576) (check-module-types ~.types-proj-single-wrapped ~[%tests %golden ~.types-proj-single-wrapped %source %jibb] src-576 `typ-576 ~ ~ ~))
3619+ (weld (check ~.types-proj-single-wrapped src-577 `tok-577 `tre-577) (check-module-types ~.types-proj-single-wrapped ~[%tests %golden ~.types-proj-single-wrapped %source %jibb] src-577 `typ-577 ~ ~ ~))
36133620++ test-types-qath-faces
3614− (weld (check ~.types-qath-faces src-577 `tok-577 `tre-577) (check-module-types ~.types-qath-faces ~[%tests %golden ~.types-qath-faces %source %jibb] src-577 `typ-577 ~ ~ ~))
3621+ (weld (check ~.types-qath-faces src-578 `tok-578 `tre-578) (check-module-types ~.types-qath-faces ~[%tests %golden ~.types-qath-faces %source %jibb] src-578 `typ-578 ~ ~ ~))
36153622++ test-types-qath-holes
3616− (weld (check ~.types-qath-holes src-578 `tok-578 `tre-578) (check-module-types ~.types-qath-holes ~[%tests %golden ~.types-qath-holes %source %jibb] src-578 `typ-578 ~ ~ ~))
3623+ (weld (check ~.types-qath-holes src-579 `tok-579 `tre-579) (check-module-types ~.types-qath-holes ~[%tests %golden ~.types-qath-holes %source %jibb] src-579 `typ-579 ~ ~ ~))
36173624++ test-types-qath-module-identity
3618− (weld (weld (check ~.types-qath-module-identity src-579 `tok-579 `tre-579) (check-module-types ~.types-qath-module-identity ~[%tests %golden ~.types-qath-module-identity %source %jibb] src-579 `typ-579 ~ ~ ~[['/ui/one.jibb' ~[~.ui ~.one ~.jibb] mod-579-1] ['/ui/two.jibb' ~[~.ui ~.two ~.jibb] mod-579-2] ['/ui/mid.jibb' ~[~.ui ~.mid ~.jibb] mod-579-3]])) (check-module-trees ~.types-qath-module-identity `mtre-579 ~[['/ui/one.jibb' ~[~.ui ~.one ~.jibb] mod-579-1] ['/ui/two.jibb' ~[~.ui ~.two ~.jibb] mod-579-2] ['/ui/mid.jibb' ~[~.ui ~.mid ~.jibb] mod-579-3]]))
3625+ (weld (weld (check ~.types-qath-module-identity src-580 `tok-580 `tre-580) (check-module-types ~.types-qath-module-identity ~[%tests %golden ~.types-qath-module-identity %source %jibb] src-580 `typ-580 ~ ~ ~[['/ui/one.jibb' ~[~.ui ~.one ~.jibb] mod-580-1] ['/ui/two.jibb' ~[~.ui ~.two ~.jibb] mod-580-2] ['/ui/mid.jibb' ~[~.ui ~.mid ~.jibb] mod-580-3]])) (check-module-trees ~.types-qath-module-identity `mtre-580 ~[['/ui/one.jibb' ~[~.ui ~.one ~.jibb] mod-580-1] ['/ui/two.jibb' ~[~.ui ~.two ~.jibb] mod-580-2] ['/ui/mid.jibb' ~[~.ui ~.mid ~.jibb] mod-580-3]]))
36193626++ test-types-qath-recursive
3620− (weld (check ~.types-qath-recursive src-580 `tok-580 `tre-580) (check-module-types ~.types-qath-recursive ~[%tests %golden ~.types-qath-recursive %source %jibb] src-580 `typ-580 ~ ~ ~))
3627+ (weld (check ~.types-qath-recursive src-581 `tok-581 `tre-581) (check-module-types ~.types-qath-recursive ~[%tests %golden ~.types-qath-recursive %source %jibb] src-581 `typ-581 ~ ~ ~))
36213628++ test-types-record-bound-variable
3622− (weld (check ~.types-record-bound-variable src-581 `tok-581 `tre-581) (check-types ~.types-record-bound-variable ~[%tests %golden ~.types-record-bound-variable %source %jibb] src-581 `typ-581))
3629+ (weld (check ~.types-record-bound-variable src-582 `tok-582 `tre-582) (check-types ~.types-record-bound-variable ~[%tests %golden ~.types-record-bound-variable %source %jibb] src-582 `typ-582))
36233630++ test-types-record-cast-context
3624− (weld (check ~.types-record-cast-context src-582 `tok-582 `tre-582) (check-module-types ~.types-record-cast-context ~[%tests %golden ~.types-record-cast-context %source %jibb] src-582 `typ-582 ~ ~ ~))
3631+ (weld (check ~.types-record-cast-context src-583 `tok-583 `tre-583) (check-module-types ~.types-record-cast-context ~[%tests %golden ~.types-record-cast-context %source %jibb] src-583 `typ-583 ~ ~ ~))
36253632++ test-types-record-change
3626− (weld (check ~.types-record-change src-583 `tok-583 `tre-583) (check-module-types ~.types-record-change ~[%tests %golden ~.types-record-change %source %jibb] src-583 `typ-583 ~ ~ ~))
3633+ (weld (check ~.types-record-change src-584 `tok-584 `tre-584) (check-module-types ~.types-record-change ~[%tests %golden ~.types-record-change %source %jibb] src-584 `typ-584 ~ ~ ~))
36273634++ test-types-record-change-generic
3628− (weld (check ~.types-record-change-generic src-584 `tok-584 `tre-584) (check-module-types ~.types-record-change-generic ~[%tests %golden ~.types-record-change-generic %source %jibb] src-584 `typ-584 ~ ~ ~))
3635+ (weld (check ~.types-record-change-generic src-585 `tok-585 `tre-585) (check-module-types ~.types-record-change-generic ~[%tests %golden ~.types-record-change-generic %source %jibb] src-585 `typ-585 ~ ~ ~))
36293636++ test-types-record-faces
3630− (weld (check ~.types-record-faces src-585 `tok-585 `tre-585) (check-types ~.types-record-faces ~[%tests %golden ~.types-record-faces %source %jibb] src-585 `typ-585))
3637+ (weld (check ~.types-record-faces src-586 `tok-586 `tre-586) (check-types ~.types-record-faces ~[%tests %golden ~.types-record-faces %source %jibb] src-586 `typ-586))
36313638++ test-types-record-field-edit-separate
3632− (weld (check ~.types-record-field-edit-separate src-586 `tok-586 `tre-586) (check-types ~.types-record-field-edit-separate ~[%tests %golden ~.types-record-field-edit-separate %source %jibb] src-586 `typ-586))
3639+ (weld (check ~.types-record-field-edit-separate src-587 `tok-587 `tre-587) (check-types ~.types-record-field-edit-separate ~[%tests %golden ~.types-record-field-edit-separate %source %jibb] src-587 `typ-587))
36333640++ test-types-record-field-expr-duplicate
3634− (weld (check ~.types-record-field-expr-duplicate src-587 `tok-587 `tre-587) (check-types ~.types-record-field-expr-duplicate ~[%tests %golden ~.types-record-field-expr-duplicate %source %jibb] src-587 `typ-587))
3641+ (weld (check ~.types-record-field-expr-duplicate src-588 `tok-588 `tre-588) (check-types ~.types-record-field-expr-duplicate ~[%tests %golden ~.types-record-field-expr-duplicate %source %jibb] src-588 `typ-588))
36353642++ test-types-record-field-expr-separate
3636− (weld (check ~.types-record-field-expr-separate src-588 `tok-588 `tre-588) (check-types ~.types-record-field-expr-separate ~[%tests %golden ~.types-record-field-expr-separate %source %jibb] src-588 `typ-588))
3643+ (weld (check ~.types-record-field-expr-separate src-589 `tok-589 `tre-589) (check-types ~.types-record-field-expr-separate ~[%tests %golden ~.types-record-field-expr-separate %source %jibb] src-589 `typ-589))
36373644++ test-types-record-field-module-reachable
3638− (weld (weld (check ~.types-record-field-module-reachable src-589 `tok-589 `tre-589) (check-module-types ~.types-record-field-module-reachable ~[%tests %golden ~.types-record-field-module-reachable %source %jibb] src-589 `typ-589 ~ ~ ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-589-1]])) (check-module-trees ~.types-record-field-module-reachable `mtre-589 ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-589-1]]))
3645+ (weld (weld (check ~.types-record-field-module-reachable src-590 `tok-590 `tre-590) (check-module-types ~.types-record-field-module-reachable ~[%tests %golden ~.types-record-field-module-reachable %source %jibb] src-590 `typ-590 ~ ~ ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-590-1]])) (check-module-trees ~.types-record-field-module-reachable `mtre-590 ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-590-1]]))
36393646++ test-types-record-field-module-unused
3640− (weld (weld (check ~.types-record-field-module-unused src-590 `tok-590 `tre-590) (check-module-types ~.types-record-field-module-unused ~[%tests %golden ~.types-record-field-module-unused %source %jibb] src-590 `typ-590 ~ ~ ~[['/ui/good.jibb' ~[~.ui ~.good ~.jibb] mod-590-1] ['/ui/unused.jibb' ~[~.ui ~.unused ~.jibb] mod-590-2]])) (check-module-trees ~.types-record-field-module-unused `mtre-590 ~[['/ui/good.jibb' ~[~.ui ~.good ~.jibb] mod-590-1] ['/ui/unused.jibb' ~[~.ui ~.unused ~.jibb] mod-590-2]]))
3647+ (weld (weld (check ~.types-record-field-module-unused src-591 `tok-591 `tre-591) (check-module-types ~.types-record-field-module-unused ~[%tests %golden ~.types-record-field-module-unused %source %jibb] src-591 `typ-591 ~ ~ ~[['/ui/good.jibb' ~[~.ui ~.good ~.jibb] mod-591-1] ['/ui/unused.jibb' ~[~.ui ~.unused ~.jibb] mod-591-2]])) (check-module-trees ~.types-record-field-module-unused `mtre-591 ~[['/ui/good.jibb' ~[~.ui ~.good ~.jibb] mod-591-1] ['/ui/unused.jibb' ~[~.ui ~.unused ~.jibb] mod-591-2]]))
36413648++ test-types-record-field-nested-mold
3642− (weld (check ~.types-record-field-nested-mold src-591 `tok-591 `tre-591) (check-types ~.types-record-field-nested-mold ~[%tests %golden ~.types-record-field-nested-mold %source %jibb] src-591 `typ-591))
3649+ (weld (check ~.types-record-field-nested-mold src-592 `tok-592 `tre-592) (check-types ~.types-record-field-nested-mold ~[%tests %golden ~.types-record-field-nested-mold %source %jibb] src-592 `typ-592))
36433650++ test-types-record-field-outer-inner
3644− (weld (check ~.types-record-field-outer-inner src-592 `tok-592 `tre-592) (check-types ~.types-record-field-outer-inner ~[%tests %golden ~.types-record-field-outer-inner %source %jibb] src-592 `typ-592))
3651+ (weld (check ~.types-record-field-outer-inner src-593 `tok-593 `tre-593) (check-types ~.types-record-field-outer-inner ~[%tests %golden ~.types-record-field-outer-inner %source %jibb] src-593 `typ-593))
36453652++ test-types-record-field-sample-duplicate
3646− (weld (check ~.types-record-field-sample-duplicate src-593 `tok-593 `tre-593) (check-types ~.types-record-field-sample-duplicate ~[%tests %golden ~.types-record-field-sample-duplicate %source %jibb] src-593 `typ-593))
3653+ (weld (check ~.types-record-field-sample-duplicate src-594 `tok-594 `tre-594) (check-types ~.types-record-field-sample-duplicate ~[%tests %golden ~.types-record-field-sample-duplicate %source %jibb] src-594 `typ-594))
36473654++ test-types-record-field-separate-molds
3648− (weld (check ~.types-record-field-separate-molds src-594 `tok-594 `tre-594) (check-types ~.types-record-field-separate-molds ~[%tests %golden ~.types-record-field-separate-molds %source %jibb] src-594 `typ-594))
3655+ (weld (check ~.types-record-field-separate-molds src-595 `tok-595 `tre-595) (check-types ~.types-record-field-separate-molds ~[%tests %golden ~.types-record-field-separate-molds %source %jibb] src-595 `typ-595))
36493656++ test-types-record-field-unused-mold
3650− (weld (check ~.types-record-field-unused-mold src-595 `tok-595 `tre-595) (check-types ~.types-record-field-unused-mold ~[%tests %golden ~.types-record-field-unused-mold %source %jibb] src-595 `typ-595))
3657+ (weld (check ~.types-record-field-unused-mold src-596 `tok-596 `tre-596) (check-types ~.types-record-field-unused-mold ~[%tests %golden ~.types-record-field-unused-mold %source %jibb] src-596 `typ-596))
36513658++ test-types-record-import
3652− (weld (weld (check ~.types-record-import src-596 `tok-596 `tre-596) (check-module-types ~.types-record-import ~[%tests %golden ~.types-record-import %source %jibb] src-596 `typ-596 ~ ~ ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-596-1]])) (check-module-trees ~.types-record-import `mtre-596 ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-596-1]]))
3659+ (weld (weld (check ~.types-record-import src-597 `tok-597 `tre-597) (check-module-types ~.types-record-import ~[%tests %golden ~.types-record-import %source %jibb] src-597 `typ-597 ~ ~ ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-597-1]])) (check-module-trees ~.types-record-import `mtre-597 ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-597-1]]))
36533660++ test-types-record-local-scheme
3654− (weld (check ~.types-record-local-scheme src-597 `tok-597 `tre-597) (check-types ~.types-record-local-scheme ~[%tests %golden ~.types-record-local-scheme %source %jibb] src-597 `typ-597))
3661+ (weld (check ~.types-record-local-scheme src-598 `tok-598 `tre-598) (check-types ~.types-record-local-scheme ~[%tests %golden ~.types-record-local-scheme %source %jibb] src-598 `typ-598))
36553662++ test-types-record-nested
3656− (weld (check ~.types-record-nested src-598 `tok-598 `tre-598) (check-types ~.types-record-nested ~[%tests %golden ~.types-record-nested %source %jibb] src-598 `typ-598))
3663+ (weld (check ~.types-record-nested src-599 `tok-599 `tre-599) (check-types ~.types-record-nested ~[%tests %golden ~.types-record-nested %source %jibb] src-599 `typ-599))
36573664++ test-types-record-to-tuple
3658− (weld (check ~.types-record-to-tuple src-599 `tok-599 `tre-599) (check-types ~.types-record-to-tuple ~[%tests %golden ~.types-record-to-tuple %source %jibb] src-599 `typ-599))
3665+ (weld (check ~.types-record-to-tuple src-600 `tok-600 `tre-600) (check-types ~.types-record-to-tuple ~[%tests %golden ~.types-record-to-tuple %source %jibb] src-600 `typ-600))
36593666++ test-types-recursion-scc-failures
3660− (weld (check ~.types-recursion-scc-failures src-600 `tok-600 `tre-600) (check-module-types ~.types-recursion-scc-failures ~[%tests %golden ~.types-recursion-scc-failures %source %jibb] src-600 `typ-600 ~ ~ ~))
3667+ (weld (check ~.types-recursion-scc-failures src-601 `tok-601 `tre-601) (check-module-types ~.types-recursion-scc-failures ~[%tests %golden ~.types-recursion-scc-failures %source %jibb] src-601 `typ-601 ~ ~ ~))
36613668++ test-types-recursion-scc-groups
3662− (weld (check ~.types-recursion-scc-groups src-601 `tok-601 `tre-601) (check-module-types ~.types-recursion-scc-groups ~[%tests %golden ~.types-recursion-scc-groups %source %jibb] src-601 `typ-601 ~ ~ ~))
3669+ (weld (check ~.types-recursion-scc-groups src-602 `tok-602 `tre-602) (check-module-types ~.types-recursion-scc-groups ~[%tests %golden ~.types-recursion-scc-groups %source %jibb] src-602 `typ-602 ~ ~ ~))
36633670++ test-types-recursion-scc-import
3664− (weld (weld (check ~.types-recursion-scc-import src-602 `tok-602 `tre-602) (check-module-types ~.types-recursion-scc-import ~[%tests %golden ~.types-recursion-scc-import %source %jibb] src-602 `typ-602 ~ ~ ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-602-1]])) (check-module-trees ~.types-recursion-scc-import `mtre-602 ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-602-1]]))
3671+ (weld (weld (check ~.types-recursion-scc-import src-603 `tok-603 `tre-603) (check-module-types ~.types-recursion-scc-import ~[%tests %golden ~.types-recursion-scc-import %source %jibb] src-603 `typ-603 ~ ~ ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-603-1]])) (check-module-trees ~.types-recursion-scc-import `mtre-603 ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-603-1]]))
36653672++ test-types-recursion-scc-import-bad
3666− (weld (weld (check ~.types-recursion-scc-import-bad src-603 `tok-603 `tre-603) (check-module-types ~.types-recursion-scc-import-bad ~[%tests %golden ~.types-recursion-scc-import-bad %source %jibb] src-603 `typ-603 ~ ~ ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-603-1]])) (check-module-trees ~.types-recursion-scc-import-bad `mtre-603 ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-603-1]]))
3673+ (weld (weld (check ~.types-recursion-scc-import-bad src-604 `tok-604 `tre-604) (check-module-types ~.types-recursion-scc-import-bad ~[%tests %golden ~.types-recursion-scc-import-bad %source %jibb] src-604 `typ-604 ~ ~ ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-604-1]])) (check-module-trees ~.types-recursion-scc-import-bad `mtre-604 ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-604-1]]))
36673674++ test-types-recursion-scc-local
3668− (weld (check ~.types-recursion-scc-local src-604 `tok-604 `tre-604) (check-module-types ~.types-recursion-scc-local ~[%tests %golden ~.types-recursion-scc-local %source %jibb] src-604 `typ-604 ~ ~ ~))
3675+ (weld (check ~.types-recursion-scc-local src-605 `tok-605 `tre-605) (check-module-types ~.types-recursion-scc-local ~[%tests %golden ~.types-recursion-scc-local %source %jibb] src-605 `typ-605 ~ ~ ~))
36693676++ test-types-recursion-scc-order
3670− (weld (check ~.types-recursion-scc-order src-605 `tok-605 `tre-605) (check-module-types ~.types-recursion-scc-order ~[%tests %golden ~.types-recursion-scc-order %source %jibb] src-605 `typ-605 ~ ~ ~))
3677+ (weld (check ~.types-recursion-scc-order src-606 `tok-606 `tre-606) (check-module-types ~.types-recursion-scc-order ~[%tests %golden ~.types-recursion-scc-order %source %jibb] src-606 `typ-606 ~ ~ ~))
36713678++ test-types-recursion-scc-shadow
3672− (weld (check ~.types-recursion-scc-shadow src-606 `tok-606 `tre-606) (check-module-types ~.types-recursion-scc-shadow ~[%tests %golden ~.types-recursion-scc-shadow %source %jibb] src-606 `typ-606 ~ ~ ~))
3679+ (weld (check ~.types-recursion-scc-shadow src-607 `tok-607 `tre-607) (check-module-types ~.types-recursion-scc-shadow ~[%tests %golden ~.types-recursion-scc-shadow %source %jibb] src-607 `typ-607 ~ ~ ~))
36733680++ test-types-recursive-branch
3674− (weld (check ~.types-recursive-branch src-607 `tok-607 `tre-607) (check-module-types ~.types-recursive-branch ~[%tests %golden ~.types-recursive-branch %source %jibb] src-607 `typ-607 ~ ~ ~))
3681+ (weld (check ~.types-recursive-branch src-608 `tok-608 `tre-608) (check-module-types ~.types-recursive-branch ~[%tests %golden ~.types-recursive-branch %source %jibb] src-608 `typ-608 ~ ~ ~))
36753682++ test-types-recursive-gate
3676− (weld (check ~.types-recursive-gate src-608 `tok-608 `tre-608) (check-types ~.types-recursive-gate ~[%tests %golden ~.types-recursive-gate %source %jibb] src-608 `typ-608))
3683+ (weld (check ~.types-recursive-gate src-609 `tok-609 `tre-609) (check-types ~.types-recursive-gate ~[%tests %golden ~.types-recursive-gate %source %jibb] src-609 `typ-609))
36773684++ test-types-recursive-sample
3678− (weld (check ~.types-recursive-sample src-609 `tok-609 `tre-609) (check-types ~.types-recursive-sample ~[%tests %golden ~.types-recursive-sample %source %jibb] src-609 `typ-609))
3685+ (weld (check ~.types-recursive-sample src-610 `tok-610 `tre-610) (check-types ~.types-recursive-sample ~[%tests %golden ~.types-recursive-sample %source %jibb] src-610 `typ-610))
36793686++ test-types-request-normal
3680− (weld (weld (check ~.types-request-normal src-610 `tok-610 `tre-610) (check-module-types ~.types-request-normal ~[%tests %golden ~.types-request-normal %source %jibb] src-610 `typ-610 ~ ~[[%full mark-610-1]] ~[['/ui/api/demo.jibb' ~[~.ui ~.api ~.demo ~.jibb] mod-610-1]])) (check-module-trees ~.types-request-normal `mtre-610 ~[['/ui/api/demo.jibb' ~[~.ui ~.api ~.demo ~.jibb] mod-610-1]]))
3687+ (weld (weld (check ~.types-request-normal src-611 `tok-611 `tre-611) (check-module-types ~.types-request-normal ~[%tests %golden ~.types-request-normal %source %jibb] src-611 `typ-611 ~ ~[[%full mark-611-1]] ~[['/ui/api/demo.jibb' ~[~.ui ~.api ~.demo ~.jibb] mod-611-1]])) (check-module-trees ~.types-request-normal `mtre-611 ~[['/ui/api/demo.jibb' ~[~.ui ~.api ~.demo ~.jibb] mod-611-1]]))
36813688++ test-types-scope-library-poke
3682− (weld (check-at ~.types-scope-library-poke ~[~.ui ~.lib ~.library ~.jibb] src-611 `tok-611 `tre-611) (check-module-types ~.types-scope-library-poke ~[~.ui ~.lib ~.library ~.jibb] src-611 `typ-611 ~ ~ ~))
3689+ (weld (check-at ~.types-scope-library-poke ~[~.ui ~.lib ~.library ~.jibb] src-612 `tok-612 `tre-612) (check-module-types ~.types-scope-library-poke ~[~.ui ~.lib ~.library ~.jibb] src-612 `typ-612 ~ ~ ~))
36833690++ test-types-scope-root-api
3684− (weld (check-at ~.types-scope-root-api ~[~.ui ~.api ~.todo ~.jibb] src-612 `tok-612 `tre-612) (check-module-types ~.types-scope-root-api ~[~.ui ~.api ~.todo ~.jibb] src-612 `typ-612 ~ ~ ~))
3691+ (weld (check-at ~.types-scope-root-api ~[~.ui ~.api ~.todo ~.jibb] src-613 `tok-613 `tre-613) (check-module-types ~.types-scope-root-api ~[~.ui ~.api ~.todo ~.jibb] src-613 `typ-613 ~ ~ ~))
36853692++ test-types-scope-store-duplicate
3686− (weld (check-at ~.types-scope-store-duplicate ~[~.ui ~.stores ~.cart ~.jibb] src-613 `tok-613 `tre-613) (check-module-types ~.types-scope-store-duplicate ~[~.ui ~.stores ~.cart ~.jibb] src-613 `typ-613 ~ ~ ~))
3693+ (weld (check-at ~.types-scope-store-duplicate ~[~.ui ~.stores ~.cart ~.jibb] src-614 `tok-614 `tre-614) (check-module-types ~.types-scope-store-duplicate ~[~.ui ~.stores ~.cart ~.jibb] src-614 `typ-614 ~ ~ ~))
36873694++ test-types-scope-store-shadow
3688− (weld (check-at ~.types-scope-store-shadow ~[~.ui ~.stores ~.cart ~.jibb] src-614 `tok-614 `tre-614) (check-module-types ~.types-scope-store-shadow ~[~.ui ~.stores ~.cart ~.jibb] src-614 `typ-614 ~ ~ ~))
3695+ (weld (check-at ~.types-scope-store-shadow ~[~.ui ~.stores ~.cart ~.jibb] src-615 `tok-615 `tre-615) (check-module-types ~.types-scope-store-shadow ~[~.ui ~.stores ~.cart ~.jibb] src-615 `typ-615 ~ ~ ~))
36893696++ test-types-single-case-pattern
3690− (weld (check ~.types-single-case-pattern src-615 `tok-615 `tre-615) (check-module-types ~.types-single-case-pattern ~[%tests %golden ~.types-single-case-pattern %source %jibb] src-615 `typ-615 ~ ~ ~))
3697+ (weld (check ~.types-single-case-pattern src-616 `tok-616 `tre-616) (check-module-types ~.types-single-case-pattern ~[%tests %golden ~.types-single-case-pattern %source %jibb] src-616 `typ-616 ~ ~ ~))
36913698++ test-types-string-interpolation
3692− (weld (check ~.types-string-interpolation src-616 `tok-616 `tre-616) (check-module-types ~.types-string-interpolation ~[%tests %golden ~.types-string-interpolation %source %jibb] src-616 `typ-616 ~ ~ ~))
3699+ (weld (check ~.types-string-interpolation src-617 `tok-617 `tre-617) (check-module-types ~.types-string-interpolation ~[%tests %golden ~.types-string-interpolation %source %jibb] src-617 `typ-617 ~ ~ ~))
36933700++ test-types-tuple-context
3694− (weld (check ~.types-tuple-context src-617 `tok-617 `tre-617) (check-module-types ~.types-tuple-context ~[%tests %golden ~.types-tuple-context %source %jibb] src-617 `typ-617 ~ ~ ~))
3701+ (weld (check ~.types-tuple-context src-618 `tok-618 `tre-618) (check-module-types ~.types-tuple-context ~[%tests %golden ~.types-tuple-context %source %jibb] src-618 `typ-618 ~ ~ ~))
36953702++ test-types-tuple-context-nested
3696− (weld (check ~.types-tuple-context-nested src-618 `tok-618 `tre-618) (check-module-types ~.types-tuple-context-nested ~[%tests %golden ~.types-tuple-context-nested %source %jibb] src-618 `typ-618 ~ ~ ~))
3703+ (weld (check ~.types-tuple-context-nested src-619 `tok-619 `tre-619) (check-module-types ~.types-tuple-context-nested ~[%tests %golden ~.types-tuple-context-nested %source %jibb] src-619 `typ-619 ~ ~ ~))
36973704++ test-types-union-alias
3698− (weld (check ~.types-union-alias src-619 `tok-619 `tre-619) (check-types ~.types-union-alias ~[%tests %golden ~.types-union-alias %source %jibb] src-619 `typ-619))
3705+ (weld (check ~.types-union-alias src-620 `tok-620 `tre-620) (check-types ~.types-union-alias ~[%tests %golden ~.types-union-alias %source %jibb] src-620 `typ-620))
36993706++ test-types-union-branch-context
3700− (weld (check ~.types-union-branch-context src-620 `tok-620 `tre-620) (check-types ~.types-union-branch-context ~[%tests %golden ~.types-union-branch-context %source %jibb] src-620 `typ-620))
3707+ (weld (check ~.types-union-branch-context src-621 `tok-621 `tre-621) (check-types ~.types-union-branch-context ~[%tests %golden ~.types-union-branch-context %source %jibb] src-621 `typ-621))
37013708++ test-types-union-branch-pending
3702− (weld (check ~.types-union-branch-pending src-621 `tok-621 `tre-621) (check-types ~.types-union-branch-pending ~[%tests %golden ~.types-union-branch-pending %source %jibb] src-621 `typ-621))
3709+ (weld (check ~.types-union-branch-pending src-622 `tok-622 `tre-622) (check-types ~.types-union-branch-pending ~[%tests %golden ~.types-union-branch-pending %source %jibb] src-622 `typ-622))
37033710++ test-types-union-constructor-shape
3704− (weld (check ~.types-union-constructor-shape src-622 `tok-622 `tre-622) (check-types ~.types-union-constructor-shape ~[%tests %golden ~.types-union-constructor-shape %source %jibb] src-622 `typ-622))
3711+ (weld (check ~.types-union-constructor-shape src-623 `tok-623 `tre-623) (check-types ~.types-union-constructor-shape ~[%tests %golden ~.types-union-constructor-shape %source %jibb] src-623 `typ-623))
37053712++ test-types-union-context-flow
3706− (weld (check ~.types-union-context-flow src-623 `tok-623 `tre-623) (check-types ~.types-union-context-flow ~[%tests %golden ~.types-union-context-flow %source %jibb] src-623 `typ-623))
3713+ (weld (check ~.types-union-context-flow src-624 `tok-624 `tre-624) (check-types ~.types-union-context-flow ~[%tests %golden ~.types-union-context-flow %source %jibb] src-624 `typ-624))
37073714++ test-types-union-finite
3708− (weld (check ~.types-union-finite src-624 `tok-624 `tre-624) (check-module-types ~.types-union-finite ~[%tests %golden ~.types-union-finite %source %jibb] src-624 `typ-624 ~ ~ ~))
3715+ (weld (check ~.types-union-finite src-625 `tok-625 `tre-625) (check-module-types ~.types-union-finite ~[%tests %golden ~.types-union-finite %source %jibb] src-625 `typ-625 ~ ~ ~))
37093716++ test-types-union-finite-context
3710− (weld (check ~.types-union-finite-context src-625 `tok-625 `tre-625) (check-module-types ~.types-union-finite-context ~[%tests %golden ~.types-union-finite-context %source %jibb] src-625 `typ-625 ~ ~ ~))
3717+ (weld (check ~.types-union-finite-context src-626 `tok-626 `tre-626) (check-module-types ~.types-union-finite-context ~[%tests %golden ~.types-union-finite-context %source %jibb] src-626 `typ-626 ~ ~ ~))
37113718++ test-types-union-finite-generic
3712− (weld (check ~.types-union-finite-generic src-626 `tok-626 `tre-626) (check-module-types ~.types-union-finite-generic ~[%tests %golden ~.types-union-finite-generic %source %jibb] src-626 `typ-626 ~ ~ ~))
3719+ (weld (check ~.types-union-finite-generic src-627 `tok-627 `tre-627) (check-module-types ~.types-union-finite-generic ~[%tests %golden ~.types-union-finite-generic %source %jibb] src-627 `typ-627 ~ ~ ~))
37133720++ test-types-union-finite-limit
3714− (weld (check ~.types-union-finite-limit src-627 `tok-627 `tre-627) (check-module-types ~.types-union-finite-limit ~[%tests %golden ~.types-union-finite-limit %source %jibb] src-627 `typ-627 ~ ~ ~))
3721+ (weld (check ~.types-union-finite-limit src-628 `tok-628 `tre-628) (check-module-types ~.types-union-finite-limit ~[%tests %golden ~.types-union-finite-limit %source %jibb] src-628 `typ-628 ~ ~ ~))
37153722++ test-types-union-import
3716− (weld (weld (check ~.types-union-import src-628 `tok-628 `tre-628) (check-module-types ~.types-union-import ~[%tests %golden ~.types-union-import %source %jibb] src-628 `typ-628 ~ ~ ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-628-1]])) (check-module-trees ~.types-union-import `mtre-628 ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-628-1]]))
3723+ (weld (weld (check ~.types-union-import src-629 `tok-629 `tre-629) (check-module-types ~.types-union-import ~[%tests %golden ~.types-union-import %source %jibb] src-629 `typ-629 ~ ~ ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-629-1]])) (check-module-trees ~.types-union-import `mtre-629 ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-629-1]]))
37173724++ test-types-union-local-pending
3718− (weld (check ~.types-union-local-pending src-629 `tok-629 `tre-629) (check-types ~.types-union-local-pending ~[%tests %golden ~.types-union-local-pending %source %jibb] src-629 `typ-629))
3725+ (weld (check ~.types-union-local-pending src-630 `tok-630 `tre-630) (check-types ~.types-union-local-pending ~[%tests %golden ~.types-union-local-pending %source %jibb] src-630 `typ-630))
37193726++ test-types-union-nonwing-subject
3720− (weld (check ~.types-union-nonwing-subject src-630 `tok-630 `tre-630) (check-module-types ~.types-union-nonwing-subject ~[%tests %golden ~.types-union-nonwing-subject %source %jibb] src-630 `typ-630 ~ ~ ~))
3727+ (weld (check ~.types-union-nonwing-subject src-631 `tok-631 `tre-631) (check-module-types ~.types-union-nonwing-subject ~[%tests %golden ~.types-union-nonwing-subject %source %jibb] src-631 `typ-631 ~ ~ ~))
37213728++ test-types-union-overlap
3722− (weld (check ~.types-union-overlap src-631 `tok-631 `tre-631) (check-types ~.types-union-overlap ~[%tests %golden ~.types-union-overlap %source %jibb] src-631 `typ-631))
3729+ (weld (check ~.types-union-overlap src-632 `tok-632 `tre-632) (check-types ~.types-union-overlap ~[%tests %golden ~.types-union-overlap %source %jibb] src-632 `typ-632))
37233730++ test-types-union-overlap-nested
3724− (weld (check ~.types-union-overlap-nested src-632 `tok-632 `tre-632) (check-types ~.types-union-overlap-nested ~[%tests %golden ~.types-union-overlap-nested %source %jibb] src-632 `typ-632))
3731+ (weld (check ~.types-union-overlap-nested src-633 `tok-633 `tre-633) (check-types ~.types-union-overlap-nested ~[%tests %golden ~.types-union-overlap-nested %source %jibb] src-633 `typ-633))
37253732++ test-types-union-pattern-result-context
3726− (weld (check ~.types-union-pattern-result-context src-633 `tok-633 `tre-633) (check-module-types ~.types-union-pattern-result-context ~[%tests %golden ~.types-union-pattern-result-context %source %jibb] src-633 `typ-633 ~ ~ ~))
3733+ (weld (check ~.types-union-pattern-result-context src-634 `tok-634 `tre-634) (check-module-types ~.types-union-pattern-result-context ~[%tests %golden ~.types-union-pattern-result-context %source %jibb] src-634 `typ-634 ~ ~ ~))
37273734++ test-types-union-pattern-result-controls
3728− (weld (check ~.types-union-pattern-result-controls src-634 `tok-634 `tre-634) (check-module-types ~.types-union-pattern-result-controls ~[%tests %golden ~.types-union-pattern-result-controls %source %jibb] src-634 `typ-634 ~ ~ ~))
3735+ (weld (check ~.types-union-pattern-result-controls src-635 `tok-635 `tre-635) (check-module-types ~.types-union-pattern-result-controls ~[%tests %golden ~.types-union-pattern-result-controls %source %jibb] src-635 `typ-635 ~ ~ ~))
37293736++ test-types-union-patterns
3730− (weld (check ~.types-union-patterns src-635 `tok-635 `tre-635) (check-module-types ~.types-union-patterns ~[%tests %golden ~.types-union-patterns %source %jibb] src-635 `typ-635 ~ ~ ~))
3737+ (weld (check ~.types-union-patterns src-636 `tok-636 `tre-636) (check-module-types ~.types-union-patterns ~[%tests %golden ~.types-union-patterns %source %jibb] src-636 `typ-636 ~ ~ ~))
37313738++ test-types-union-patterns-generic
3732− (weld (check ~.types-union-patterns-generic src-636 `tok-636 `tre-636) (check-module-types ~.types-union-patterns-generic ~[%tests %golden ~.types-union-patterns-generic %source %jibb] src-636 `typ-636 ~ ~ ~))
3739+ (weld (check ~.types-union-patterns-generic src-637 `tok-637 `tre-637) (check-module-types ~.types-union-patterns-generic ~[%tests %golden ~.types-union-patterns-generic %source %jibb] src-637 `typ-637 ~ ~ ~))
37333740++ test-types-union-patterns-import
3734− (weld (weld (check ~.types-union-patterns-import src-637 `tok-637 `tre-637) (check-module-types ~.types-union-patterns-import ~[%tests %golden ~.types-union-patterns-import %source %jibb] src-637 `typ-637 ~ ~ ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-637-1]])) (check-module-trees ~.types-union-patterns-import `mtre-637 ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-637-1]]))
3741+ (weld (weld (check ~.types-union-patterns-import src-638 `tok-638 `tre-638) (check-module-types ~.types-union-patterns-import ~[%tests %golden ~.types-union-patterns-import %source %jibb] src-638 `typ-638 ~ ~ ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-638-1]])) (check-module-trees ~.types-union-patterns-import `mtre-638 ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-638-1]]))
37353742++ test-types-union-phantom-generic
3736− (weld (check ~.types-union-phantom-generic src-638 `tok-638 `tre-638) (check-types ~.types-union-phantom-generic ~[%tests %golden ~.types-union-phantom-generic %source %jibb] src-638 `typ-638))
3743+ (weld (check ~.types-union-phantom-generic src-639 `tok-639 `tre-639) (check-types ~.types-union-phantom-generic ~[%tests %golden ~.types-union-phantom-generic %source %jibb] src-639 `typ-639))
37373744++ test-types-union-polymorphic-identity
3738− (weld (weld (check ~.types-union-polymorphic-identity src-639 `tok-639 `tre-639) (check-module-types ~.types-union-polymorphic-identity ~[%tests %golden ~.types-union-polymorphic-identity %source %jibb] src-639 `typ-639 ~ ~ ~[['/ui/one.jibb' ~[~.ui ~.one ~.jibb] mod-639-1] ['/ui/two.jibb' ~[~.ui ~.two ~.jibb] mod-639-2]])) (check-module-trees ~.types-union-polymorphic-identity `mtre-639 ~[['/ui/one.jibb' ~[~.ui ~.one ~.jibb] mod-639-1] ['/ui/two.jibb' ~[~.ui ~.two ~.jibb] mod-639-2]]))
3745+ (weld (weld (check ~.types-union-polymorphic-identity src-640 `tok-640 `tre-640) (check-module-types ~.types-union-polymorphic-identity ~[%tests %golden ~.types-union-polymorphic-identity %source %jibb] src-640 `typ-640 ~ ~ ~[['/ui/one.jibb' ~[~.ui ~.one ~.jibb] mod-640-1] ['/ui/two.jibb' ~[~.ui ~.two ~.jibb] mod-640-2]])) (check-module-trees ~.types-union-polymorphic-identity `mtre-640 ~[['/ui/one.jibb' ~[~.ui ~.one ~.jibb] mod-640-1] ['/ui/two.jibb' ~[~.ui ~.two ~.jibb] mod-640-2]]))
37393746++ test-types-union-print-cross-namespace
3740− (weld (weld (check ~.types-union-print-cross-namespace src-640 `tok-640 `tre-640) (check-module-types ~.types-union-print-cross-namespace ~[%tests %golden ~.types-union-print-cross-namespace %source %jibb] src-640 `typ-640 ~ ~ ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-640-1]])) (check-module-trees ~.types-union-print-cross-namespace `mtre-640 ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-640-1]]))
3747+ (weld (weld (check ~.types-union-print-cross-namespace src-641 `tok-641 `tre-641) (check-module-types ~.types-union-print-cross-namespace ~[%tests %golden ~.types-union-print-cross-namespace %source %jibb] src-641 `typ-641 ~ ~ ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-641-1]])) (check-module-trees ~.types-union-print-cross-namespace `mtre-641 ~[['/ui/lib.jibb' ~[~.ui ~.lib ~.jibb] mod-641-1]]))
37413748++ test-types-union-print-distinct
3742− (weld (weld (check ~.types-union-print-distinct src-641 `tok-641 `tre-641) (check-module-types ~.types-union-print-distinct ~[%tests %golden ~.types-union-print-distinct %source %jibb] src-641 `typ-641 ~ ~ ~[['/ui/left.jibb' ~[~.ui ~.left ~.jibb] mod-641-1] ['/ui/right.jibb' ~[~.ui ~.right ~.jibb] mod-641-2] ['/ui/twin.jibb' ~[~.ui ~.twin ~.jibb] mod-641-3]])) (check-module-trees ~.types-union-print-distinct `mtre-641 ~[['/ui/left.jibb' ~[~.ui ~.left ~.jibb] mod-641-1] ['/ui/right.jibb' ~[~.ui ~.right ~.jibb] mod-641-2] ['/ui/twin.jibb' ~[~.ui ~.twin ~.jibb] mod-641-3]]))
3749+ (weld (weld (check ~.types-union-print-distinct src-642 `tok-642 `tre-642) (check-module-types ~.types-union-print-distinct ~[%tests %golden ~.types-union-print-distinct %source %jibb] src-642 `typ-642 ~ ~ ~[['/ui/left.jibb' ~[~.ui ~.left ~.jibb] mod-642-1] ['/ui/right.jibb' ~[~.ui ~.right ~.jibb] mod-642-2] ['/ui/twin.jibb' ~[~.ui ~.twin ~.jibb] mod-642-3]])) (check-module-trees ~.types-union-print-distinct `mtre-642 ~[['/ui/left.jibb' ~[~.ui ~.left ~.jibb] mod-642-1] ['/ui/right.jibb' ~[~.ui ~.right ~.jibb] mod-642-2] ['/ui/twin.jibb' ~[~.ui ~.twin ~.jibb] mod-642-3]]))
37433750++ test-types-union-print-escape
3744− (weld (check ~.types-union-print-escape src-642 `tok-642 `tre-642) (check-types ~.types-union-print-escape ~[%tests %golden ~.types-union-print-escape %source %jibb] src-642 `typ-642))
3751+ (weld (check ~.types-union-print-escape src-643 `tok-643 `tre-643) (check-types ~.types-union-print-escape ~[%tests %golden ~.types-union-print-escape %source %jibb] src-643 `typ-643))
37453752++ test-types-union-print-local
3746− (weld (check ~.types-union-print-local src-643 `tok-643 `tre-643) (check-types ~.types-union-print-local ~[%tests %golden ~.types-union-print-local %source %jibb] src-643 `typ-643))
3753+ (weld (check ~.types-union-print-local src-644 `tok-644 `tre-644) (check-types ~.types-union-print-local ~[%tests %golden ~.types-union-print-local %source %jibb] src-644 `typ-644))
37473754++ test-types-union-print-nested
3748− (weld (check ~.types-union-print-nested src-644 `tok-644 `tre-644) (check-types ~.types-union-print-nested ~[%tests %golden ~.types-union-print-nested %source %jibb] src-644 `typ-644))
3755+ (weld (check ~.types-union-print-nested src-645 `tok-645 `tre-645) (check-types ~.types-union-print-nested ~[%tests %golden ~.types-union-print-nested %source %jibb] src-645 `typ-645))
37493756++ test-types-union-print-same-origin
3750− (weld (weld (check ~.types-union-print-same-origin src-645 `tok-645 `tre-645) (check-module-types ~.types-union-print-same-origin ~[%tests %golden ~.types-union-print-same-origin %source %jibb] src-645 `typ-645 ~ ~ ~[['/ui/shared.jibb' ~[~.ui ~.shared ~.jibb] mod-645-1]])) (check-module-trees ~.types-union-print-same-origin `mtre-645 ~[['/ui/shared.jibb' ~[~.ui ~.shared ~.jibb] mod-645-1]]))
3757+ (weld (weld (check ~.types-union-print-same-origin src-646 `tok-646 `tre-646) (check-module-types ~.types-union-print-same-origin ~[%tests %golden ~.types-union-print-same-origin %source %jibb] src-646 `typ-646 ~ ~ ~[['/ui/shared.jibb' ~[~.ui ~.shared ~.jibb] mod-646-1]])) (check-module-trees ~.types-union-print-same-origin `mtre-646 ~[['/ui/shared.jibb' ~[~.ui ~.shared ~.jibb] mod-646-1]]))
37513758++ test-types-union-print-transitive
3752− (weld (weld (check ~.types-union-print-transitive src-646 `tok-646 `tre-646) (check-module-types ~.types-union-print-transitive ~[%tests %golden ~.types-union-print-transitive %source %jibb] src-646 `typ-646 ~ ~ ~[['/ui/mid.jibb' ~[~.ui ~.mid ~.jibb] mod-646-1] ['/ui/base.jibb' ~[~.ui ~.base ~.jibb] mod-646-2]])) (check-module-trees ~.types-union-print-transitive `mtre-646 ~[['/ui/mid.jibb' ~[~.ui ~.mid ~.jibb] mod-646-1] ['/ui/base.jibb' ~[~.ui ~.base ~.jibb] mod-646-2]]))
3759+ (weld (weld (check ~.types-union-print-transitive src-647 `tok-647 `tre-647) (check-module-types ~.types-union-print-transitive ~[%tests %golden ~.types-union-print-transitive %source %jibb] src-647 `typ-647 ~ ~ ~[['/ui/mid.jibb' ~[~.ui ~.mid ~.jibb] mod-647-1] ['/ui/base.jibb' ~[~.ui ~.base ~.jibb] mod-647-2]])) (check-module-trees ~.types-union-print-transitive `mtre-647 ~[['/ui/mid.jibb' ~[~.ui ~.mid ~.jibb] mod-647-1] ['/ui/base.jibb' ~[~.ui ~.base ~.jibb] mod-647-2]]))
37533760++ test-types-union-runtime-equality
3754− (weld (check ~.types-union-runtime-equality src-647 `tok-647 `tre-647) (check-types ~.types-union-runtime-equality ~[%tests %golden ~.types-union-runtime-equality %source %jibb] src-647 `typ-647))
3761+ (weld (check ~.types-union-runtime-equality src-648 `tok-648 `tre-648) (check-types ~.types-union-runtime-equality ~[%tests %golden ~.types-union-runtime-equality %source %jibb] src-648 `typ-648))
37553762++ test-types-union-singleton
3756− (weld (check ~.types-union-singleton src-648 `tok-648 `tre-648) (check-types ~.types-union-singleton ~[%tests %golden ~.types-union-singleton %source %jibb] src-648 `typ-648))
3763+ (weld (check ~.types-union-singleton src-649 `tok-649 `tre-649) (check-types ~.types-union-singleton ~[%tests %golden ~.types-union-singleton %source %jibb] src-649 `typ-649))
37573764++ test-types-union-source-alias
3758− (weld (check ~.types-union-source-alias src-649 `tok-649 `tre-649) (check-types ~.types-union-source-alias ~[%tests %golden ~.types-union-source-alias %source %jibb] src-649 `typ-649))
3765+ (weld (check ~.types-union-source-alias src-650 `tok-650 `tre-650) (check-types ~.types-union-source-alias ~[%tests %golden ~.types-union-source-alias %source %jibb] src-650 `typ-650))
37593766++ test-types-union-tag-atoms
3760− (weld (check ~.types-union-tag-atoms src-650 `tok-650 `tre-650) (check-types ~.types-union-tag-atoms ~[%tests %golden ~.types-union-tag-atoms %source %jibb] src-650 `typ-650))
3767+ (weld (check ~.types-union-tag-atoms src-651 `tok-651 `tre-651) (check-types ~.types-union-tag-atoms ~[%tests %golden ~.types-union-tag-atoms %source %jibb] src-651 `typ-651))
37613768++ test-types-union-tags
3762− (weld (check ~.types-union-tags src-651 `tok-651 `tre-651) (check-types ~.types-union-tags ~[%tests %golden ~.types-union-tags %source %jibb] src-651 `typ-651))
3769+ (weld (check ~.types-union-tags src-652 `tok-652 `tre-652) (check-types ~.types-union-tags ~[%tests %golden ~.types-union-tags %source %jibb] src-652 `typ-652))
37633770++ test-types-union-unresolved
3764− (weld (check ~.types-union-unresolved src-652 `tok-652 `tre-652) (check-types ~.types-union-unresolved ~[%tests %golden ~.types-union-unresolved %source %jibb] src-652 `typ-652))
3771+ (weld (check ~.types-union-unresolved src-653 `tok-653 `tre-653) (check-types ~.types-union-unresolved ~[%tests %golden ~.types-union-unresolved %source %jibb] src-653 `typ-653))
37653772++ test-types-union-unresolved-flow
3766− (weld (check ~.types-union-unresolved-flow src-653 `tok-653 `tre-653) (check-types ~.types-union-unresolved-flow ~[%tests %golden ~.types-union-unresolved-flow %source %jibb] src-653 `typ-653))
3773+ (weld (check ~.types-union-unresolved-flow src-654 `tok-654 `tre-654) (check-types ~.types-union-unresolved-flow ~[%tests %golden ~.types-union-unresolved-flow %source %jibb] src-654 `typ-654))
37673774++ test-types-unit-construction
3768− (weld (check ~.types-unit-construction src-654 `tok-654 `tre-654) (check-module-types ~.types-unit-construction ~[%tests %golden ~.types-unit-construction %source %jibb] src-654 `typ-654 ~ ~ ~))
3775+ (weld (check ~.types-unit-construction src-655 `tok-655 `tre-655) (check-module-types ~.types-unit-construction ~[%tests %golden ~.types-unit-construction %source %jibb] src-655 `typ-655 ~ ~ ~))
37693776++ test-types-unit-context
3770− (weld (check ~.types-unit-context src-655 `tok-655 `tre-655) (check-module-types ~.types-unit-context ~[%tests %golden ~.types-unit-context %source %jibb] src-655 `typ-655 ~ ~ ~))
3777+ (weld (check ~.types-unit-context src-656 `tok-656 `tre-656) (check-module-types ~.types-unit-context ~[%tests %golden ~.types-unit-context %source %jibb] src-656 `typ-656 ~ ~ ~))
37713778++ test-types-unit-patterns
3772− (weld (check ~.types-unit-patterns src-656 `tok-656 `tre-656) (check-types ~.types-unit-patterns ~[%tests %golden ~.types-unit-patterns %source %jibb] src-656 `typ-656))
3779+ (weld (check ~.types-unit-patterns src-657 `tok-657 `tre-657) (check-types ~.types-unit-patterns ~[%tests %golden ~.types-unit-patterns %source %jibb] src-657 `typ-657))
37733780++ test-types-value-cycle-shadow
3774− (weld (check ~.types-value-cycle-shadow src-657 `tok-657 `tre-657) (check-module-types ~.types-value-cycle-shadow ~[%tests %golden ~.types-value-cycle-shadow %source %jibb] src-657 `typ-657 ~ ~ ~))
3781+ (weld (check ~.types-value-cycle-shadow src-658 `tok-658 `tre-658) (check-module-types ~.types-value-cycle-shadow ~[%tests %golden ~.types-value-cycle-shadow %source %jibb] src-658 `typ-658 ~ ~ ~))
37753782++ test-types-value-cycle-unsupported
3776− (weld (check ~.types-value-cycle-unsupported src-658 `tok-658 `tre-658) (check-module-types ~.types-value-cycle-unsupported ~[%tests %golden ~.types-value-cycle-unsupported %source %jibb] src-658 `typ-658 ~ ~ ~))
3783+ (weld (check ~.types-value-cycle-unsupported src-659 `tok-659 `tre-659) (check-module-types ~.types-value-cycle-unsupported ~[%tests %golden ~.types-value-cycle-unsupported %source %jibb] src-659 `typ-659 ~ ~ ~))
37773784++ test-types-value-cycles
3778− (weld (check ~.types-value-cycles src-659 `tok-659 `tre-659) (check-module-types ~.types-value-cycles ~[%tests %golden ~.types-value-cycles %source %jibb] src-659 `typ-659 ~ ~ ~))
3785+ (weld (check ~.types-value-cycles src-660 `tok-660 `tre-660) (check-module-types ~.types-value-cycles ~[%tests %golden ~.types-value-cycles %source %jibb] src-660 `typ-660 ~ ~ ~))
37793786::
37803787:: +check: run golden:jibb on a case and compare both outputs
37813788::
tests/type-api-paths/poke-clash.txt+2
@@ -10,3 +10,5 @@
1010+$ paths
1111 [%todo-action /todos todos]
1212 [%todo-by-id /todo/[id=@ud] todo-item]
13+
14+++ poke "collision"
tests/type-buttons/error.txtnew file+3
@@ -0,0 +1,3 @@
1+/ui/components/buttons.jibb:3:16: nothing fixes the union of %add
2+ button label %add :: error: nothing fixes the union of %add
3+ ^
tests/type-buttons/expected.txtnew file+2
@@ -0,0 +1,2 @@
1+labelled: $-([label=@t msg=A] (element A))
2+wide: (list attr)
tests/type-buttons/valid.txtnew file+4
@@ -0,0 +1,4 @@
1+++ labelled |= [label=@t msg=M]
2+ button label msg :: fine: the caller's union
3+++ wide ^- (list attr)
4+ ~[width+[%fill 1] pad+%s2] :: fine: the cast fixes the tags
tests/type-deferred-prepared/expected-control.txtnew file+7
@@ -0,0 +1,7 @@
1+partial inference; module not checked
2++$ model: not checked
3++$ message: cases proven disjoint; mold not checked
4+++ initial: `~` needs context in partial inference
5+++ send: $-($-(@t A) $-(@t A))
6+++ first: call constraint is not supported by partial inference
7+++ fixed: name is not available to partial inference
tests/type-deferred-prepared/expected-tuple-only.txtnew file+4
@@ -0,0 +1,4 @@
1+partial inference; module not checked
2++$ model: not checked
3+++ final: $-((list @t) [(list @t) [@t (unit @t)]])
4+++ initial: $-((list @t) [(list @t) [@t (unit @t)]])
tests/type-deferred-prepared/expected.txtnew file+8
@@ -0,0 +1,8 @@
1+partial inference; module not checked
2++$ model: not checked
3++$ message: cases proven disjoint; mold not checked
4+++ final: $-((list @t) [(list @t) [@t (unit @t)]])
5+++ initial: $-((list @t) [(list @t) [@t (unit @t)]])
6+++ send: $-($-(@t A) $-(@t A))
7+++ first: $-(@t message)
8+++ fixed: $-(@t message)
tests/type-deferred-prepared/good.txtnew file+9
@@ -0,0 +1,9 @@
1++$ model [xs=(list @t) draft=@t error=(unit @t)]
2++$ message
3+ [%got value=@t]
4+ [%other value=@p]
5+++ final ^- $-((list @t) [(list @t) @t (unit @t)]) initial
6+++ initial |= xs=(list @t) [xs "" ~]
7+++ send |= f=$-(@t A) f
8+++ first (send |=%got)
9+++ fixed ^- $-(@t message) first
tests/type-deferred-prepared/imported.txtnew file+11
@@ -0,0 +1,11 @@
1+/= other /ui/other
2+
3++$ model [xs=(list @t) draft=@t error=(unit @t)]
4++$ message
5+ [%got value=@t]
6+ [%other value=@p]
7+++ final ^- $-((list @t) [(list @t) @t (unit @t)]) initial
8+++ initial |= xs=(list @t) [xs "" ~]
9+++ send |= f=$-(@t A) f
10+++ first (send |=%got)
11+++ fixed ^- $-(@t message) first
tests/type-deferred-prepared/main.txtnew file+10
@@ -0,0 +1,10 @@
1++$ model [xs=(list @t) draft=@t error=(unit @t)]
2++$ message
3+ [%got value=@t]
4+ [%other value=@p]
5+++ final ^- $-((list @t) [(list @t) @t (unit @t)]) initial
6+++ initial |= xs=(list @t) [xs "" ~]
7+++ send |= f=$-(@t A) f
8+++ first (send |=%got)
9+++ fixed ^- $-(@t message) first
10+++ main initial
tests/type-deferred-prepared/mold-collision.txtnew file+9
@@ -0,0 +1,9 @@
1++$ list [xs=(list @t) draft=@t error=(unit @t)]
2++$ message
3+ [%got value=@t]
4+ [%other value=@p]
5+++ final ^- $-((list @t) [(list @t) @t (unit @t)]) initial
6+++ initial |= xs=(list @t) [xs "" ~]
7+++ send |= f=$-(@t A) f
8+++ first (send |=%got)
9+++ fixed ^- $-(@t message) first
tests/type-deferred-prepared/no-final-cast.txtnew file+8
@@ -0,0 +1,8 @@
1++$ model [xs=(list @t) draft=@t error=(unit @t)]
2++$ message
3+ [%got value=@t]
4+ [%other value=@p]
5+++ initial |= xs=(list @t) [xs "" ~]
6+++ send |= f=$-(@t A) f
7+++ first (send |=%got)
8+++ fixed ^- $-(@t message) first
tests/type-deferred-prepared/no-prelude.txtnew file+9
@@ -0,0 +1,9 @@
1++$ maybe
2+ %none
3+ [%some value=@t]
4++$ model [draft=@t error=maybe]
5+++ final ^- $-(@t [@t maybe]) initial
6+++ initial |= draft=@t [draft %none]
7+++ send |= f=$-(@t A) f
8+++ first (send |=%some)
9+++ fixed ^- $-(@t maybe) first
tests/type-deferred-prepared/tuple-only.txtnew file+3
@@ -0,0 +1,3 @@
1++$ model [xs=(list @t) draft=@t error=(unit @t)]
2+++ final ^- $-((list @t) [(list @t) @t (unit @t)]) initial
3+++ initial |= xs=(list @t) [xs "" ~]
tests/type-deferred-prepared/unrelated-tag.txtnew file+11
@@ -0,0 +1,11 @@
1++$ model [xs=(list @t) draft=@t error=(unit @t)]
2++$ message
3+ [%got value=@t]
4+ [%other value=@p]
5+++ final ^- $-((list @t) [(list @t) @t (unit @t)]) initial
6+++ initial |= xs=(list @t) [xs "" ~]
7+++ send |= f=$-(@t A) f
8+++ first (send |=%got)
9+++ fixed ^- $-(@t message) first
10+
11+++ unresolved |= x=@t %dangling
tests/type-deferred-prepared/wrong-draft.txtnew file+9
@@ -0,0 +1,9 @@
1++$ model [xs=(list @t) draft=@t error=(unit @t)]
2++$ message
3+ [%got value=@t]
4+ [%other value=@p]
5+++ final ^- $-((list @t) [(list @t) @t (unit @t)]) initial
6+++ initial |= xs=(list @t) [xs ~zod ~]
7+++ send |= f=$-(@t A) f
8+++ first (send |=%got)
9+++ fixed ^- $-(@t message) first
tests/type-deferred-prepared/wrong-unit.txtnew file+9
@@ -0,0 +1,9 @@
1++$ model [xs=(list @t) draft=@t error=(unit @t)]
2++$ message
3+ [%got value=@t]
4+ [%other value=@p]
5+++ final ^- $-((list @t) [(list @t) @t (unit @t)]) initial
6+++ initial |= xs=(list @t) [xs "" %absent]
7+++ send |= f=$-(@t A) f
8+++ first (send |=%got)
9+++ fixed ^- $-(@t message) first
tests/type-direct-gate/expected.txt+11−11
@@ -2,14 +2,14 @@ partial inference; module not checked
22+$ message: cases proven disjoint; mold not checked
33++ init: $-(@t @ud)
44++ update: $-([msg=message state=@ud] [@ud (list (cmd message))])
5−++ view: $-(@ud [%node item=message])
5+++ view: $-(@ud (element message))
66++ subs: $-(@ud (list (sub message)))
7−++ direct: [init=$-(@t @ud) [update=$-([message @ud] [@ud (list (cmd message))]) [view=$-(@ud [%node item=message]) subs=$-(@ud (list (sub message)))]]]
7+++ direct: [init=$-(@t @ud) [update=$-([message @ud] [@ud (list (cmd message))]) [view=$-(@ud (element message)) subs=$-(@ud (list (sub message)))]]]
88++ wrong-init: $-(@p @ud)
9−++ different-data: [init=$-(@p @ud) [update=$-([message @ud] [@ud (list (cmd message))]) [view=$-(@ud [%node item=message]) subs=$-(@ud (list (sub message)))]]]
9+++ different-data: [init=$-(@p @ud) [update=$-([message @ud] [@ud (list (cmd message))]) [view=$-(@ud (element message)) subs=$-(@ud (list (sub message)))]]]
1010++ wrong-update: $-([msg=message state=@p] [@p (list (cmd message))])
1111++ mismatched-model: call constraint is not supported by partial inference
12−++ wrong-view: $-(@p [%node item=message])
12+++ wrong-view: $-(@p (element message))
1313++ mismatched-view: call constraint is not supported by partial inference
1414++ wrong-subs: $-(@p (list (sub message)))
1515++ mismatched-subs: call constraint is not supported by partial inference
@@ -17,17 +17,17 @@ partial inference; module not checked
1717++ wrong-msg-update: $-([msg=other state=@ud] [@ud (list (cmd other))])
1818++ mismatched-message: call constraint is not supported by partial inference
1919++ pending: tag needs context in partial inference
20−++ program-value: $-([init=$-(A B) [update=$-([C B] [B (list (cmd C))]) [view=$-(B [%node item=C]) subs=$-(B (list (sub C)))]]] [init=$-(A B) [update=$-([C B] [B (list (cmd C))]) [view=$-(B [%node item=C]) subs=$-(B (list (sub C)))]]])
20+++ program-value: $-([init=$-(A B) [update=$-([C B] [B (list (cmd C))]) [view=$-(B (element C)) subs=$-(B (list (sub C)))]]] [init=$-(A B) [update=$-([C B] [B (list (cmd C))]) [view=$-(B (element C)) subs=$-(B (list (sub C)))]]])
2121++ update-unfaced: $-([message @ud] [@ud (list (cmd message))])
22−++ direct-unfaced: [init=$-(@t @ud) [update=$-([message @ud] [@ud (list (cmd message))]) [view=$-(@ud [%node item=message]) subs=$-(@ud (list (sub message)))]]]
22+++ direct-unfaced: [init=$-(@t @ud) [update=$-([message @ud] [@ud (list (cmd message))]) [view=$-(@ud (element message)) subs=$-(@ud (list (sub message)))]]]
2323+$ record: not checked
2424++ init-record: $-(@t [count=@ud label=@t])
2525++ update-record: $-([msg=message state=[count=@ud label=@t]] [[count=@ud label=@t] (list (cmd message))])
2626++ update-record-unfaced: $-([message [count=@ud label=@t]] [[count=@ud label=@t] (list (cmd message))])
27−++ view-record: $-([count=@ud label=@t] [%node item=message])
27+++ view-record: $-([count=@ud label=@t] (element message))
2828++ subs-record: $-([count=@ud label=@t] (list (sub message)))
29−++ program-record: [init=$-(@t [count=@ud label=@t]) [update=$-([message [count=@ud label=@t]] [[count=@ud label=@t] (list (cmd message))]) [view=$-([count=@ud label=@t] [%node item=message]) subs=$-([count=@ud label=@t] (list (sub message)))]]]
30−++ program-record-unfaced: [init=$-(@t [count=@ud label=@t]) [update=$-([message [count=@ud label=@t]] [[count=@ud label=@t] (list (cmd message))]) [view=$-([count=@ud label=@t] [%node item=message]) subs=$-([count=@ud label=@t] (list (sub message)))]]]
29+++ program-record: [init=$-(@t [count=@ud label=@t]) [update=$-([message [count=@ud label=@t]] [[count=@ud label=@t] (list (cmd message))]) [view=$-([count=@ud label=@t] (element message)) subs=$-([count=@ud label=@t] (list (sub message)))]]]
30+++ program-record-unfaced: [init=$-(@t [count=@ud label=@t]) [update=$-([message [count=@ud label=@t]] [[count=@ud label=@t] (list (cmd message))]) [view=$-([count=@ud label=@t] (element message)) subs=$-([count=@ud label=@t] (list (sub message)))]]]
3131++ bad-update-record: $-([msg=message state=[other=@ud label=@t]] [[count=@ud label=@t] (list (cmd message))])
3232++ program-wrong-nested-face: call constraint is not supported by partial inference
3333++ update-pending: tag needs context in partial inference
@@ -57,8 +57,8 @@ partial inference; module not checked
5757 ^
5858++ unknown-call: $-($-([A B] C) $-([A B] C))
5959++ update-proj-good: $-([msg=message state=[count=@ud label=@t]] [[count=@ud label=@t] (list (cmd message))])
60−++ program-projection: [init=$-(@t [count=@ud label=@t]) [update=$-([message [count=@ud label=@t]] [[count=@ud label=@t] (list (cmd message))]) [view=$-([count=@ud label=@t] [%node item=message]) subs=$-([count=@ud label=@t] (list (sub message)))]]]
61−++ program-alias: $-([init=$-(A B) [update=$-([C B] [B (list (cmd C))]) [view=$-(B [%node item=C]) subs=$-(B (list (sub C)))]]] [init=$-(A B) [update=$-([C B] [B (list (cmd C))]) [view=$-(B [%node item=C]) subs=$-(B (list (sub C)))]]])
60+++ program-projection: [init=$-(@t [count=@ud label=@t]) [update=$-([message [count=@ud label=@t]] [[count=@ud label=@t] (list (cmd message))]) [view=$-([count=@ud label=@t] (element message)) subs=$-([count=@ud label=@t] (list (sub message)))]]]
61+++ program-alias: $-([init=$-(A B) [update=$-([C B] [B (list (cmd C))]) [view=$-(B (element C)) subs=$-(B (list (sub C)))]]] [init=$-(A B) [update=$-([C B] [B (list (cmd C))]) [view=$-(B (element C)) subs=$-(B (list (sub C)))]]])
6262++ through-head-alias: call constraint is not supported by partial inference
6363++ update-alias: $-([msg=message state=@ud] [@ud (list (cmd message))])
6464++ through-arg-alias: call constraint is not supported by partial inference
tests/type-direct-gate/source.txt+3−3
@@ -4,7 +4,7 @@
44++ init |= input=@t ^- @ud 1
55++ update |= [msg=message state=@ud]
66 ^- [@ud (list (cmd message))] [state ~]
7−++ view |= state=@ud ^- (element message) [%node %start]
7+++ view |= state=@ud ^- (element message) (text "view")
88++ subs |= state=@ud ^- (list (sub message)) ~
99++ direct (program init update view subs)
1010++ wrong-init |= input=@p ^- @ud 1
@@ -12,7 +12,7 @@
1212++ wrong-update |= [msg=message state=@p]
1313 ^- [@p (list (cmd message))] [state ~]
1414++ mismatched-model (program init wrong-update view subs)
15−++ wrong-view |= state=@p ^- (element message) [%node %start]
15+++ wrong-view |= state=@p ^- (element message) (text "view")
1616++ mismatched-view (program init update wrong-view subs)
1717++ wrong-subs |= state=@p ^- (list (sub message)) ~
1818++ mismatched-subs (program init update view wrong-subs)
@@ -35,7 +35,7 @@
3535 ^- [record (list (cmd message))] [state ~]
3636++ update-record-unfaced |= args=[message record]
3737 ^- [record (list (cmd message))] [[count=0 label=""] ~]
38−++ view-record |= state=record ^- (element message) [%node %start]
38+++ view-record |= state=record ^- (element message) (text "view")
3939++ subs-record |= state=record ^- (list (sub message)) ~
4040++ program-record (program init-record update-record view-record subs-record)
4141++ program-record-unfaced (program init-record update-record-unfaced view-record subs-record)
tests/type-gate-free/todo-gate.txt+2−2
@@ -19,8 +19,8 @@
1919 ?- (gth (lent (tuba (trip t))) 80)
2020 %.y [m(draft=t error=`"Too long") ~]
2121 %.n [m(draft=t error=~) ~]
22− %submit [m(draft="") ~[[%poke (todo-action.todo [%add draft.m]) |=%acked]]]
23− [%toggled id] [m ~[[%poke (todo-action.todo [%toggle id]) |=%acked]]]
22+ %submit [m(draft="") ~[(poke.todo [%add draft.m] |=%acked)]]
23+ [%toggled id] [m ~[(poke.todo [%toggle id] |=%acked)]]
2424 [%got ts] [m(todos=ts) ~]
2525 [%acked err] [m(error=err) ~]
2626
tests/type-gate-free/todo-noun.txt+2−2
@@ -19,8 +19,8 @@
1919 ?- (gth (lent (tuba (trip t))) 80)
2020 %.y [m(draft=t error=`"Too long") ~]
2121 %.n [m(draft=t error=~) ~]
22− %submit [m(draft="") ~[[%poke (todo-action.todo [%add draft.m]) |=%acked]]]
23− [%toggled id] [m ~[[%poke (todo-action.todo [%toggle id]) |=%acked]]]
22+ %submit [m(draft="") ~[(poke.todo [%add draft.m] |=%acked)]]
23+ [%toggled id] [m ~[(poke.todo [%toggle id] |=%acked)]]
2424 [%got ts] [m(todos=ts) ~]
2525 [%acked err] [m(error=err) ~]
2626
tests/type-gate-free/todo.txt+2−2
@@ -19,8 +19,8 @@
1919 ?- (gth (lent (tuba (trip t))) 80)
2020 %.y [m(draft=t error=`"Too long") ~]
2121 %.n [m(draft=t error=~) ~]
22− %submit [m(draft="") ~[[%poke (todo-action.todo [%add draft.m]) |=%acked]]]
23− [%toggled id] [m ~[[%poke (todo-action.todo [%toggle id]) |=%acked]]]
22+ %submit [m(draft="") ~[(poke.todo [%add draft.m] |=%acked)]]
23+ [%toggled id] [m ~[(poke.todo [%toggle id] |=%acked)]]
2424 [%got ts] [m(todos=ts) ~]
2525 [%acked err] [m(error=err) ~]
2626
tests/type-generic-construction/alias-client.txt+4−4
@@ -6,7 +6,7 @@
66++ ship-event |= x=@t ~zod
77++ via-leaf ^- (alias.via @t) [%text value="x"]
88++ via-node ^- (alias.via @p) [%node event=ship-event children=~]
9−++ cross-alias |= x=(alias.via @t) ^- (element.first @t) [%node event=text-event children=~[x]]
10−++ cross-owner |= x=(element.again @t) ^- (alias.via @t) [%node event=text-event children=~[x]]
11−++ wrong-owner |= x=(element.second @t) ^- (alias.via @t) [%node event=text-event children=~[x]]
12−++ wrong-arg |= x=(alias.via @p) ^- (element.first @t) [%node event=text-event children=~[x]]
9+++ cross-alias |= x=(alias.via @t) ^- (node-tree.first @t) [%node event=text-event children=~[x]]
10+++ cross-owner |= x=(node-tree.again @t) ^- (alias.via @t) [%node event=text-event children=~[x]]
11+++ wrong-owner |= x=(node-tree.second @t) ^- (alias.via @t) [%node event=text-event children=~[x]]
12+++ wrong-arg |= x=(alias.via @p) ^- (node-tree.first @t) [%node event=text-event children=~[x]]
tests/type-generic-construction/alias.txt+1−1
@@ -1,3 +1,3 @@
11/= source /ui/tree
2−+$ alias |$ [A] (element.source A)
2++$ alias |$ [A] (node-tree.source A)
33++ identity |= x=(alias A) x
tests/type-generic-construction/client.txt+20−20
@@ -2,23 +2,23 @@
22/= second /ui/tree-two
33++ text-event |= value=@t value
44++ ship-event |= value=@t ~zod
5−++ leaf ^- (element.first @t) [%text value="hi"]
6−++ ship-leaf ^- (element.first @p) [%text value="hi"]
7−++ node ^- (element.first @t) [%node event=text-event children=~]
8−++ ship-node ^- (element.first @p) [%node event=ship-event children=~]
9−++ nested ^- (element.first @t) [%node event=text-event children=~[[%text value="x"]]]
10−++ wrong-event ^- (element.first @p) [%node event=text-event children=~]
11−++ wrong-leaf ^- (element.first @t) [%text value=~zod]
12−++ wrong-label ^- (element.first @t) [%text other="hi"]
13−++ bad-tag ^- (element.first @t) [%missing value="hi"]
14−++ foreign |= x=(element.second @t) ^- (element.first @t) [%node event=text-event children=~[x]]
15−++ generic |= event=$-(@t A) ^- (element.first A) [%node event=event children=~]
16−++ pending |= x=(element.first @t) [%missing x]
17−++ extra ^- (element.first @t) [%text value="hi" extra="bad"]
18−++ misplaced ^- (element.first @t) [%text value=~zod]
19−++ bad-child ^- (element.first @t) [%node event=text-event children=~["bad"]]
20−++ bad-children ^- (element.first @t) [%node event=text-event children="bad"]
21−++ label-swap ^- (element.first @t) [%node children=~ event=text-event]
22−++ wrong-nominal |= child=(element.second @p) ^- (element.first @t) [%node event=text-event children=~[child]]
23−++ wrong-argument |= child=(element.first @p) ^- (element.first @t) [%node event=text-event children=~[child]]
24−++ keep-generic |= f=$-(@t A) ^- (element.first A) [%node event=f children=~[[%text value="x"]]]
5+++ leaf ^- (node-tree.first @t) [%text value="hi"]
6+++ ship-leaf ^- (node-tree.first @p) [%text value="hi"]
7+++ node ^- (node-tree.first @t) [%node event=text-event children=~]
8+++ ship-node ^- (node-tree.first @p) [%node event=ship-event children=~]
9+++ nested ^- (node-tree.first @t) [%node event=text-event children=~[[%text value="x"]]]
10+++ wrong-event ^- (node-tree.first @p) [%node event=text-event children=~]
11+++ wrong-leaf ^- (node-tree.first @t) [%text value=~zod]
12+++ wrong-label ^- (node-tree.first @t) [%text other="hi"]
13+++ bad-tag ^- (node-tree.first @t) [%missing value="hi"]
14+++ foreign |= x=(node-tree.second @t) ^- (node-tree.first @t) [%node event=text-event children=~[x]]
15+++ generic |= event=$-(@t A) ^- (node-tree.first A) [%node event=event children=~]
16+++ pending |= x=(node-tree.first @t) [%missing x]
17+++ extra ^- (node-tree.first @t) [%text value="hi" extra="bad"]
18+++ misplaced ^- (node-tree.first @t) [%text value=~zod]
19+++ bad-child ^- (node-tree.first @t) [%node event=text-event children=~["bad"]]
20+++ bad-children ^- (node-tree.first @t) [%node event=text-event children="bad"]
21+++ label-swap ^- (node-tree.first @t) [%node children=~ event=text-event]
22+++ wrong-nominal |= child=(node-tree.second @p) ^- (node-tree.first @t) [%node event=text-event children=~[child]]
23+++ wrong-argument |= child=(node-tree.first @p) ^- (node-tree.first @t) [%node event=text-event children=~[child]]
24+++ keep-generic |= f=$-(@t A) ^- (node-tree.first A) [%node event=f children=~[[%text value="x"]]]
tests/type-generic-construction/expected.txt+13−13
@@ -27,17 +27,17 @@ structural substitution declined: ok
2727partial inference; module not checked
2828++ text-event: $-(@t @t)
2929++ ship-event: $-(@t @p)
30−++ leaf: (element.first @t)
31−++ ship-leaf: (element.first @p)
32−++ node: (element.first @t)
33−++ ship-node: (element.first @p)
34−++ nested: (element.first @t)
30+++ leaf: (node-tree.first @t)
31+++ ship-leaf: (node-tree.first @p)
32+++ node: (node-tree.first @t)
33+++ ship-node: (node-tree.first @p)
34+++ nested: (node-tree.first @t)
3535++ wrong-event: recursive mold case does not fit its source shape
3636++ wrong-leaf: recursive mold case does not fit its source shape
3737++ wrong-label: recursive mold case does not fit its source shape
3838++ bad-tag: recursive mold constructor has no matching case
3939++ foreign: list item constraint is not supported by partial inference
40−++ generic: $-($-(@t A) (element.first A))
40+++ generic: $-($-(@t A) (node-tree.first A))
4141++ pending: tag needs context in partial inference
4242++ extra: recursive mold case does not fit its source shape
4343++ misplaced: recursive mold case does not fit its source shape
@@ -46,20 +46,20 @@ partial inference; module not checked
4646++ label-swap: recursive mold case does not fit its source shape
4747++ wrong-nominal: list item constraint is not supported by partial inference
4848++ wrong-argument: list item constraint is not supported by partial inference
49−++ keep-generic: $-($-(@t A) (element.first A))
49+++ keep-generic: $-($-(@t A) (node-tree.first A))
5050partial inference; module not checked
5151++ text-event: $-(@t @t)
5252++ ship-event: $-(@t @p)
5353++ via-leaf: (alias.via @t)
5454++ via-node: (alias.via @p)
55−++ cross-alias: $-((alias.via @t) (element.first @t))
56−++ cross-owner: $-((element.again @t) (alias.via @t))
55+++ cross-alias: $-((alias.via @t) (node-tree.first @t))
56+++ cross-owner: $-((node-tree.again @t) (alias.via @t))
5757++ wrong-owner: list item constraint is not supported by partial inference
5858++ wrong-arg: list item constraint is not supported by partial inference
5959partial inference; module not checked
60−++ leaf: (element.first @t)
61−++ node: (element.first @p)
62−++ nested: (element.first @t)
63−++ generic: $-(A (element.first A))
60+++ leaf: (node-tree.first @t)
61+++ node: (node-tree.first @p)
62+++ nested: (node-tree.first @t)
63+++ generic: $-(A (node-tree.first A))
6464++ wrong-owner: list item constraint is not supported by partial inference
6565++ wrong-field: recursive mold case needs unsupported inference
tests/type-generic-construction/no-event-client.txt+6−6
@@ -1,8 +1,8 @@
11/= first /ui/tree
22/= second /ui/tree-two
3−++ leaf ^- (element.first @t) [%text value="x"]
4−++ node ^- (element.first @p) [%node children=~]
5−++ nested ^- (element.first @t) [%node children=~[[%text value="x"]]]
6−++ generic |= x=A ^- (element.first A) [%node children=~]
7−++ wrong-owner |= x=(element.second @t) ^- (element.first @t) [%node children=~[x]]
8−++ wrong-field ^- (element.first @t) [%node children="x"]
3+++ leaf ^- (node-tree.first @t) [%text value="x"]
4+++ node ^- (node-tree.first @p) [%node children=~]
5+++ nested ^- (node-tree.first @t) [%node children=~[[%text value="x"]]]
6+++ generic |= x=A ^- (node-tree.first A) [%node children=~]
7+++ wrong-owner |= x=(node-tree.second @t) ^- (node-tree.first @t) [%node children=~[x]]
8+++ wrong-field ^- (node-tree.first @t) [%node children="x"]
tests/type-generic-construction/owner-negative.txt+8−8
@@ -1,10 +1,10 @@
1−+$ element |$ [M]
1++$ node-tree |$ [M]
22 [%text value=@t]
3− [%node event=$-(@t M) children=(list (element M))]
4−++ text-id |= x=(element @t) x
5−++ ship-id |= x=(element @p) x
6−++ generic-id |= x=(element A) x
3+ [%node event=$-(@t M) children=(list (node-tree M))]
4+++ text-id |= x=(node-tree @t) x
5+++ ship-id |= x=(node-tree @p) x
6+++ generic-id |= x=(node-tree A) x
77++ text-event |= x=@t x
8−++ made-leaf ^- (element @t) [%text value="x"]
9−++ made-node ^- (element @t) [%node event=text-event children=~[[%text value="x"]]]
10−++ invalid ^- (element @t) [%text value=~zod]
8+++ made-leaf ^- (node-tree @t) [%text value="x"]
9+++ made-node ^- (node-tree @t) [%node event=text-event children=~[[%text value="x"]]]
10+++ invalid ^- (node-tree @t) [%text value=~zod]
tests/type-generic-construction/owner-positive.txt+7−7
@@ -1,9 +1,9 @@
1−+$ element |$ [M]
1++$ node-tree |$ [M]
22 [%text value=@t]
3− [%node event=$-(@t M) children=(list (element M))]
4−++ text-id |= x=(element @t) x
5−++ ship-id |= x=(element @p) x
6−++ generic-id |= x=(element A) x
3+ [%node event=$-(@t M) children=(list (node-tree M))]
4+++ text-id |= x=(node-tree @t) x
5+++ ship-id |= x=(node-tree @p) x
6+++ generic-id |= x=(node-tree A) x
77++ text-event |= x=@t x
8−++ made-leaf ^- (element @t) [%text value="x"]
9−++ made-node ^- (element @t) [%node event=text-event children=~[[%text value="x"]]]
8+++ made-leaf ^- (node-tree @t) [%text value="x"]
9+++ made-node ^- (node-tree @t) [%node event=text-event children=~[[%text value="x"]]]
tests/type-generic-construction/tree-no-event.txt+3−3
@@ -1,4 +1,4 @@
1−+$ element |$ [M]
1++$ node-tree |$ [M]
22 [%text value=@t]
3− [%node children=(list (element M))]
4−++ generic-id |= x=(element A) x
3+ [%node children=(list (node-tree M))]
4+++ generic-id |= x=(node-tree A) x
tests/type-generic-construction/tree.txt+5−5
@@ -1,6 +1,6 @@
1−+$ element |$ [M]
1++$ node-tree |$ [M]
22 [%text value=@t]
3− [%node event=$-(@t M) children=(list (element M))]
4−++ text-id |= x=(element @t) x
5−++ ship-id |= x=(element @p) x
6−++ generic-id |= x=(element A) x
3+ [%node event=$-(@t M) children=(list (node-tree M))]
4+++ text-id |= x=(node-tree @t) x
5+++ ship-id |= x=(node-tree @p) x
6+++ generic-id |= x=(node-tree A) x
tests/type-generic-pattern/client.txt+48−48
@@ -1,46 +1,46 @@
11/= first /ui/tree
22/= second /ui/tree-two
33/= via /ui/tree-alias
4−++ describe |= x=(element.first @t)
4+++ describe |= x=(node-tree.first @t)
55 ?- x
66 [%text value] value
77 [%node event children] (event "click")
8−++ reverse |= x=(element.first @p)
8+++ reverse |= x=(node-tree.first @p)
99 ?- x
1010 [%node event children] (event "click")
1111 [%text value] ~zod
12−++ generic-children |= x=(element.first A)
13− ^- (list (element.first A)) ?- x
12+++ generic-children |= x=(node-tree.first A)
13+ ^- (list (node-tree.first A)) ?- x
1414 [%text value] ~
1515 [%node event kids] kids
1616++ alias-children |= x=(alias.via @p)
17− ^- (list (element.first @p)) ?- x
17+ ^- (list (node-tree.first @p)) ?- x
1818 [%text value] ~
1919 [%node event kids] kids
20−++ rebuild |= x=(element.first @t)
21− ^- (element.first @t) ?- x
20+++ rebuild |= x=(node-tree.first @t)
21+ ^- (node-tree.first @t) ?- x
2222 [%text value] [%text value=value]
2323 [%node event children] [%node event=event children=children]
24−++ wrong-return |= x=(element.first @t)
24+++ wrong-return |= x=(node-tree.first @t)
2525 ?- x
2626 [%text value] value
2727 [%node event kids] ~zod
28−++ duplicate |= x=(element.first @t)
28+++ duplicate |= x=(node-tree.first @t)
2929 ?- x
3030 [%text a] a
3131 [%text b] b
32−++ missing |= x=(element.first @t)
32+++ missing |= x=(node-tree.first @t)
3333 ?- x
3434 [%text a] a
35−++ shadow |= x=(element.first @t)
35+++ shadow |= x=(node-tree.first @t)
3636 ?- x
3737 [%text x] x
3838 [%node event kids] "node"
39−++ bad-tag |= x=(element.first @t)
39+++ bad-tag |= x=(node-tree.first @t)
4040 ?- x
4141 [%text value] value
4242 [%other event kids] "node"
43−++ whole-tail |= x=(element.first @t)
43+++ whole-tail |= x=(node-tree.first @t)
4444 ?- x
4545 [%text value] value
4646 [%node payload] payload
@@ -48,32 +48,32 @@
4848 ?- x
4949 [%text value] value
5050 [%node event kids] "node"
51−++ pending |= x=(element.first @t)
51+++ pending |= x=(node-tree.first @t)
5252 ?- x
5353 [%text value] [%unrelated value]
5454 [%node event kids] [%unrelated "node"]
55−++ dead |= x=(element.first @t)
55+++ dead |= x=(node-tree.first @t)
5656 ?- x
5757 [%text a] a
5858 [%node event kids] (event "ok")
5959 [%text b] b
60−++ wild |= x=(element.first @t)
60+++ wild |= x=(node-tree.first @t)
6161 ?- x
6262 [%text *] "text"
6363 [%node * *] "node"
64−++ whole-wild |= x=(element.first @t)
64+++ whole-wild |= x=(node-tree.first @t)
6565 ?- x
6666 [%text value] value
6767 * "other"
68−++ foreign-children |= x=(element.first @t)
69− ^- (list (element.second @t)) ?- x
68+++ foreign-children |= x=(node-tree.first @t)
69+ ^- (list (node-tree.second @t)) ?- x
7070 [%text value] ~
7171 [%node event kids] kids
72−++ wrong-argument |= x=(element.first @t)
73− ^- (list (element.first @p)) ?- x
72+++ wrong-argument |= x=(node-tree.first @t)
73+ ^- (list (node-tree.first @p)) ?- x
7474 [%text value] ~
7575 [%node event kids] kids
76−++ nested-child |= x=(element.first @t)
76+++ nested-child |= x=(node-tree.first @t)
7777 ?- x
7878 [%text value] value
7979 [%node event kids] ?- kids
@@ -81,86 +81,86 @@
8181 [item remainder] ?- item
8282 [%text value] value
8383 [%node action rest] (action "click")
84−++ duplicate-binder |= x=(element.first @t)
84+++ duplicate-binder |= x=(node-tree.first @t)
8585 ?- x
8686 [%text value] value
8787 [%node event event] "node"
88−++ target-shadow |= x=(element.first @t)
88+++ target-shadow |= x=(node-tree.first @t)
8989 ?- x
9090 [%text value] value
9191 [%node event x] "node"
92−++ grouped |= x=(element.first @t)
92+++ grouped |= x=(node-tree.first @t)
9393 ?- (x)
9494 [%text value] value
9595 [%node event kids] (event "click")
96−++ called |= x=(element.first @t)
96+++ called |= x=(node-tree.first @t)
9797 ?- (generic-id.first x)
9898 [%text value] value
9999 [%node event kids] (event "click")
100−++ missing-context |= x=(element.first @t)
100+++ missing-context |= x=(node-tree.first @t)
101101 ^- @t ?- x
102102 [%text item] item
103−++ missing-node |= x=(element.first @t)
103+++ missing-node |= x=(node-tree.first @t)
104104 ?- x
105105 [%node action kids] (action "click")
106−++ single-wild |= x=(element.first @t)
106+++ single-wild |= x=(node-tree.first @t)
107107 ?- x
108108 * "all"
109−++ single-bind |= x=(element.first @t)
109+++ single-bind |= x=(node-tree.first @t)
110110 ?- x
111111 all all
112−++ polymorphic-source ^- (element.first A) [%text value="source"]
112+++ polymorphic-source ^- (node-tree.first A) [%text value="source"]
113113++ polymorphic-match ?- polymorphic-source
114− [%text text] text
115−++ all |= x=(element.first @t)
114+ [%text words] words
115+++ all |= x=(node-tree.first @t)
116116 ?- x
117117 * "all"
118−++ catch-tail |= x=(element.first @t)
118+++ catch-tail |= x=(node-tree.first @t)
119119 ?- x
120120 [%text value] value
121121 * "node"
122−++ catch-first-dead |= x=(element.first @t)
122+++ catch-first-dead |= x=(node-tree.first @t)
123123 ?- x
124124 * "all"
125125 [%text value] value
126−++ late-dead |= x=(element.first @t)
126+++ late-dead |= x=(node-tree.first @t)
127127 ?- x
128128 [%text value] value
129129 [%node event kids] (event "click")
130130 * "dead"
131−++ duplicate-third |= x=(element.first @t)
131+++ duplicate-third |= x=(node-tree.first @t)
132132 ?- x
133133 [%text value] value
134134 [%node event kids] (event "click")
135135 [%text other] other
136−++ nominal-result |= x=(element.first A)
136+++ nominal-result |= x=(node-tree.first A)
137137 ?- x
138138 [%text value] x
139139 * x
140−++ nominal-context |= x=(element.first A)
141− ^- (element.first A) ?- x
140+++ nominal-context |= x=(node-tree.first A)
141+ ^- (node-tree.first A) ?- x
142142 [%text value] x
143143 * x
144−++ forbidden-bind |= x=(element.first @t)
144+++ forbidden-bind |= x=(node-tree.first @t)
145145 ?- x
146146 [%text value] value
147147 rest rest
148−++ missing-again |= x=(element.first @t)
148+++ missing-again |= x=(node-tree.first @t)
149149 ?- x
150150 [%text value] value
151−++ catch-pending |= x=(element.first @t)
151+++ catch-pending |= x=(node-tree.first @t)
152152 ?- x
153153 [%text value] [%unrelated value]
154154 * [%unrelated "node"]
155−++ called-all |= x=(element.first @t)
155+++ called-all |= x=(node-tree.first @t)
156156 ?- (generic-id.first x)
157157 * "all"
158−++ called-context |= x=(element.first @t)
158+++ called-context |= x=(node-tree.first @t)
159159 ^- @t ?- (generic-id.first x)
160160 * "all"
161−++ called-nominal |= x=(element.first A)
162− ^- (element.first A) ?- (generic-id.first x)
161+++ called-nominal |= x=(node-tree.first A)
162+ ^- (node-tree.first A) ?- (generic-id.first x)
163163 * x
164−++ called-missing |= x=(element.first @t)
164+++ called-missing |= x=(node-tree.first @t)
165165 ?- (generic-id.first x)
166166 [%text value] value
tests/type-generic-pattern/expected.txt+24−24
@@ -23,17 +23,17 @@ zero arm budget declined: ok
2323hidden view stays nominally unknown: ok
2424catch-all keeps fuel and pending state: ok
2525partial inference; module not checked
26−++ describe: $-((element.first @t) @t)
27−++ reverse: $-((element.first @p) @p)
28−++ generic-children: $-((element.first A) (list (element.first A)))
29−++ alias-children: $-((alias.via @p) (list (element.first @p)))
30−++ rebuild: $-((element.first @t) (element.first @t))
26+++ describe: $-((node-tree.first @t) @t)
27+++ reverse: $-((node-tree.first @p) @p)
28+++ generic-children: $-((node-tree.first A) (list (node-tree.first A)))
29+++ alias-children: $-((alias.via @p) (list (node-tree.first @p)))
30+++ rebuild: $-((node-tree.first @t) (node-tree.first @t))
3131++ wrong-return: union branch result matching needs unsupported inference
3232++ duplicate: branch arm is covered by earlier arms
3333/tests/tree/client.jibb:31:5: covered arm
3434 [%text b] b
3535 ^
36−++ missing: missing union case [%node [event=$-(@t @t) children=(list (element.first @t))]]
36+++ missing: missing union case [%node [event=$-(@t @t) children=(list (node-tree.first @t))]]
3737++ shadow: pattern binder shadows a name
3838++ bad-tag: branch is not supported by partial inference
3939++ whole-tail: branch is not supported by partial inference
@@ -43,23 +43,23 @@ partial inference; module not checked
4343/tests/tree/client.jibb:59:5: covered arm
4444 [%text b] b
4545 ^
46−++ wild: $-((element.first @t) @t)
47−++ whole-wild: $-((element.first @t) @t)
46+++ wild: $-((node-tree.first @t) @t)
47+++ whole-wild: $-((node-tree.first @t) @t)
4848++ foreign-children: union branch result constraint is not supported by partial inference
4949++ wrong-argument: union branch result constraint is not supported by partial inference
50−++ nested-child: $-((element.first @t) @t)
50+++ nested-child: $-((node-tree.first @t) @t)
5151++ duplicate-binder: pattern binder shadows a name
5252++ target-shadow: pattern binder shadows a name
53−++ grouped: $-((element.first @t) @t)
54−++ called: $-((element.first @t) @t)
55−++ missing-context: missing union case [%node [event=$-(@t @t) children=(list (element.first @t))]]
53+++ grouped: $-((node-tree.first @t) @t)
54+++ called: $-((node-tree.first @t) @t)
55+++ missing-context: missing union case [%node [event=$-(@t @t) children=(list (node-tree.first @t))]]
5656++ missing-node: missing union case [%text value=@t]
57−++ single-wild: $-((element.first @t) @t)
57+++ single-wild: $-((node-tree.first @t) @t)
5858++ single-bind: branch is not supported by partial inference
59−++ polymorphic-source: (element.first A)
60−++ polymorphic-match: missing union case [%node [event=$-(@t A) children=(list (element.first A))]]
61−++ all: $-((element.first @t) @t)
62−++ catch-tail: $-((element.first @t) @t)
59+++ polymorphic-source: (node-tree.first A)
60+++ polymorphic-match: missing union case [%node [event=$-(@t A) children=(list (node-tree.first A))]]
61+++ all: $-((node-tree.first @t) @t)
62+++ catch-tail: $-((node-tree.first @t) @t)
6363++ catch-first-dead: branch arm is covered by earlier arms
6464/tests/tree/client.jibb:125:5: covered arm
6565 [%text value] value
@@ -72,18 +72,18 @@ partial inference; module not checked
7272/tests/tree/client.jibb:135:5: covered arm
7373 [%text other] other
7474 ^
75−++ nominal-result: $-((element.first A) (element.first A))
76−++ nominal-context: $-((element.first A) (element.first A))
75+++ nominal-result: $-((node-tree.first A) (node-tree.first A))
76+++ nominal-context: $-((node-tree.first A) (node-tree.first A))
7777++ forbidden-bind: branch is not supported by partial inference
78−++ missing-again: missing union case [%node [event=$-(@t @t) children=(list (element.first @t))]]
78+++ missing-again: missing union case [%node [event=$-(@t @t) children=(list (node-tree.first @t))]]
7979++ catch-pending: union branch result matching needs unsupported inference
8080++ called-all: branch pattern is not supported by partial inference
81−++ called-context: $-((element.first @t) @t)
82−++ called-nominal: $-((element.first A) (element.first A))
81+++ called-context: $-((node-tree.first @t) @t)
82+++ called-nominal: $-((node-tree.first A) (node-tree.first A))
8383++ called-missing: single-case pattern needs unsupported inference
8484partial inference; module not checked
85−++ words: $-((element.first @t) @t)
86−++ children: $-((element.first A) (list (element.first A)))
85+++ words: $-((node-tree.first @t) @t)
86+++ children: $-((node-tree.first A) (list (node-tree.first A)))
8787++ duplicate: branch arm is covered by earlier arms
8888/tests/tree/no-event.jibb:13:5: covered arm
8989 [%text b] b
tests/type-generic-pattern/no-event.txt+5−5
@@ -1,17 +1,17 @@
11/= first /ui/tree
2−++ words |= x=(element.first @t)
2+++ words |= x=(node-tree.first @t)
33 ?- x
44 [%text value] value
55 [%node kids] "node"
6−++ children |= x=(element.first A)
7− ^- (list (element.first A)) ?- x
6+++ children |= x=(node-tree.first A)
7+ ^- (list (node-tree.first A)) ?- x
88 [%text value] ~
99 [%node kids] kids
10−++ duplicate |= x=(element.first @t)
10+++ duplicate |= x=(node-tree.first @t)
1111 ?- x
1212 [%text a] a
1313 [%text b] b
14−++ nested-pattern |= x=(element.first @t)
14+++ nested-pattern |= x=(node-tree.first @t)
1515 ?- x
1616 [%text value] value
1717 [%node [first rest]] "node"
tests/type-generic-pattern/owner-bad.txt+11−11
@@ -1,22 +1,22 @@
1−+$ element |$ [M]
1++$ node-tree |$ [M]
22 [%text value=@t]
3− [%node event=$-(@t M) children=(list (element M))]
4−++ text-id |= x=(element @t) x
5−++ ship-id |= x=(element @p) x
6−++ generic-id |= x=(element A) x
7−++ describe |= x=(element @t)
3+ [%node event=$-(@t M) children=(list (node-tree M))]
4+++ text-id |= x=(node-tree @t) x
5+++ ship-id |= x=(node-tree @p) x
6+++ generic-id |= x=(node-tree A) x
7+++ describe |= x=(node-tree @t)
88 ?- x
99 [%text value] value
1010 [%node event kids] (event "click")
11−++ children |= x=(element A)
12− ^- (list (element A)) ?- x
11+++ children |= x=(node-tree A)
12+ ^- (list (node-tree A)) ?- x
1313 [%text value] ~
1414 [%node event kids] kids
15−++ rebuild |= x=(element @t)
16− ^- (element @t) ?- x
15+++ rebuild |= x=(node-tree @t)
16+ ^- (node-tree @t) ?- x
1717 [%text value] [%text value=value]
1818 [%node event kids] [%node event=event children=kids]
19−++ wrong |= x=(element @t)
19+++ wrong |= x=(node-tree @t)
2020 ?- x
2121 [%text value] value
2222 [%node event event] "bad"
tests/type-generic-pattern/owner.txt+10−10
@@ -1,18 +1,18 @@
1−+$ element |$ [M]
1++$ node-tree |$ [M]
22 [%text value=@t]
3− [%node event=$-(@t M) children=(list (element M))]
4−++ text-id |= x=(element @t) x
5−++ ship-id |= x=(element @p) x
6−++ generic-id |= x=(element A) x
7−++ describe |= x=(element @t)
3+ [%node event=$-(@t M) children=(list (node-tree M))]
4+++ text-id |= x=(node-tree @t) x
5+++ ship-id |= x=(node-tree @p) x
6+++ generic-id |= x=(node-tree A) x
7+++ describe |= x=(node-tree @t)
88 ?- x
99 [%text value] value
1010 [%node event kids] (event "click")
11−++ children |= x=(element A)
12− ^- (list (element A)) ?- x
11+++ children |= x=(node-tree A)
12+ ^- (list (node-tree A)) ?- x
1313 [%text value] ~
1414 [%node event kids] kids
15−++ rebuild |= x=(element @t)
16− ^- (element @t) ?- x
15+++ rebuild |= x=(node-tree @t)
16+ ^- (node-tree @t) ?- x
1717 [%text value] [%text value=value]
1818 [%node event kids] [%node event=event children=kids]
tests/type-generic-recursion/about.txt+1−1
@@ -3,7 +3,7 @@ source: docs/spec/grammar.md:57,135,162 — “Molds may be recursive”; “rec
33This shared eval and ship fixture checks a deliberately narrow source-backed
44recursive identity: two distinct tagged cases, a text leaf and a node with a
55message-producing gate and a list of recursive children. The test-only tree is
6−not a chosen element representation. A complete import-free owner module must
6+not the UI `element` representation. A complete import-free owner module must
77check before its interface is published. Same-origin aliases retain identity,
88while different origins, unproved casts and broader matching remain unsupported.
99A wrong-aura constructor fails the complete owner check. An opaque recursive type prevents premature numeric defaulting;
tests/type-generic-recursion/alias.txt+1−1
@@ -1,3 +1,3 @@
11/= source /ui/tree
2−+$ alias |$ [A] (element.source A)
2++$ alias |$ [A] (node-tree.source A)
33++ identity |= x=(alias A) x
tests/type-generic-recursion/bad-constructor.txt+6−6
@@ -1,8 +1,8 @@
1−+$ element |$ [M]
1++$ node-tree |$ [M]
22 [%text value=@t]
3− [%node event=$-(@t M) children=(list (element M))]
4−++ text-id |= x=(element @t) x
5−++ ship-id |= x=(element @p) x
6−++ generic-id |= x=(element A) x
3+ [%node event=$-(@t M) children=(list (node-tree M))]
4+++ text-id |= x=(node-tree @t) x
5+++ ship-id |= x=(node-tree @p) x
6+++ generic-id |= x=(node-tree A) x
77
8−++ construct ^- (element @t) [%text value=~zod]
8+++ construct ^- (node-tree @t) [%text value=~zod]
tests/type-generic-recursion/bad-match.txt+6−6
@@ -1,10 +1,10 @@
1−+$ element |$ [M]
1++$ node-tree |$ [M]
22 [%text value=@t]
3− [%node event=$-(@t M) children=(list (element M))]
4−++ text-id |= x=(element @t) x
5−++ ship-id |= x=(element @p) x
6−++ generic-id |= x=(element A) x
7−++ match |= x=(element @t)
3+ [%node event=$-(@t M) children=(list (node-tree M))]
4+++ text-id |= x=(node-tree @t) x
5+++ ship-id |= x=(node-tree @p) x
6+++ generic-id |= x=(node-tree A) x
7+++ match |= x=(node-tree @t)
88 ?- x
99 [%text value] value
1010 [%node event event] "node"
tests/type-generic-recursion/bad-mold.txt+5−5
@@ -1,8 +1,8 @@
1−+$ element |$ [M]
1++$ node-tree |$ [M]
22 [%text value=@t]
3− [%node event=$-(@t M) children=(list (element M))]
4−++ text-id |= x=(element @t) x
5−++ ship-id |= x=(element @p) x
6−++ generic-id |= x=(element A) x
3+ [%node event=$-(@t M) children=(list (node-tree M))]
4+++ text-id |= x=(node-tree @t) x
5+++ ship-id |= x=(node-tree @p) x
6+++ generic-id |= x=(node-tree A) x
77
88+$ unused _
tests/type-generic-recursion/bad-parameter.txt+5−5
@@ -1,6 +1,6 @@
1−+$ element |$ [M]
1++$ node-tree |$ [M]
22 [%text value=@t]
3− [%node event=$-(@t M) children=(list (element @t))]
4−++ text-id |= x=(element @t) x
5−++ ship-id |= x=(element @p) x
6−++ generic-id |= x=(element A) x
3+ [%node event=$-(@t M) children=(list (node-tree @t))]
4+++ text-id |= x=(node-tree @t) x
5+++ ship-id |= x=(node-tree @p) x
6+++ generic-id |= x=(node-tree A) x
tests/type-generic-recursion/client.txt+6−6
@@ -2,10 +2,10 @@
22/= again /ui/tree
33/= second /ui/tree-two
44/= via /ui/tree-alias
5−++ from-first |= x=(element.first @t) x
6−++ from-again |= x=(element.again @p) x
7−++ same-origin |= x=(element.first @t) ^- (element.again @t) x
5+++ from-first |= x=(node-tree.first @t) x
6+++ from-again |= x=(node-tree.again @p) x
7+++ same-origin |= x=(node-tree.first @t) ^- (node-tree.again @t) x
88++ from-alias |= x=(alias.via @t) x
9−++ through-alias |= x=(element.first @t) ^- (alias.via @t) x
10−++ different-origin |= x=(element.first @t) ^- (element.second @t) x
11−++ independent |= [a=(element.first @t) b=(element.first @p)] [(generic-id.first a) (generic-id.first b)]
9+++ through-alias |= x=(node-tree.first @t) ^- (alias.via @t) x
10+++ different-origin |= x=(node-tree.first @t) ^- (node-tree.second @t) x
11+++ independent |= [a=(node-tree.first @t) b=(node-tree.first @p)] [(generic-id.first a) (generic-id.first b)]
tests/type-generic-recursion/expected.txt+5−5
@@ -26,10 +26,10 @@ duplicate source declined: ok
2626active import cycle declined: ok
2727changed prelude invalidates cache: ok
2828partial inference; module not checked
29−++ from-first: $-((element.first @t) (element.first @t))
30−++ from-again: $-((element.again @p) (element.again @p))
31−++ same-origin: $-((element.first @t) (element.again @t))
29+++ from-first: $-((node-tree.first @t) (node-tree.first @t))
30+++ from-again: $-((node-tree.again @p) (node-tree.again @p))
31+++ same-origin: $-((node-tree.first @t) (node-tree.again @t))
3232++ from-alias: $-((alias.via @t) (alias.via @t))
33−++ through-alias: $-((element.first @t) (alias.via @t))
33+++ through-alias: $-((node-tree.first @t) (alias.via @t))
3434++ different-origin: cast constraint is not supported by partial inference
35−++ independent: $-([a=(element.first @t) b=(element.first @p)] [(element.first @t) (element.first @p)])
35+++ independent: $-([a=(node-tree.first @t) b=(node-tree.first @p)] [(node-tree.first @t) (node-tree.first @p)])
tests/type-generic-recursion/list-shadow.txt+2−2
@@ -1,4 +1,4 @@
11+$ list |$ [M] [%fake value=M]
2−+$ element |$ [M]
2++$ node-tree |$ [M]
33 [%text value=@t]
4− [%node children=(list (element M))]
4+ [%node children=(list (node-tree M))]
tests/type-generic-recursion/local-distinct.txt+7−7
@@ -1,11 +1,11 @@
1−+$ element |$ [M]
1++$ node-tree |$ [M]
22 [%text value=@t]
3− [%node event=$-(@t M) children=(list (element M))]
4−++ text-id |= x=(element @t) x
5−++ ship-id |= x=(element @p) x
6−++ generic-id |= x=(element A) x
3+ [%node event=$-(@t M) children=(list (node-tree M))]
4+++ text-id |= x=(node-tree @t) x
5+++ ship-id |= x=(node-tree @p) x
6+++ generic-id |= x=(node-tree A) x
77++ shadow |= x=@t
8− +$ element |$ [M]
8+ +$ node-tree |$ [M]
99 [%different value=@t]
10− [%node event=$-(@t M) children=(list (element M))]
10+ [%node event=$-(@t M) children=(list (node-tree M))]
1111 x
tests/type-generic-recursion/local-only.txt+5−5
@@ -1,9 +1,9 @@
1−+$ element |$ [M]
1++$ node-tree |$ [M]
22 [%text value=@t]
3− [%node event=$-(@t M) children=(list (element M))]
4−++ text-id |= x=(element @t) x
5−++ ship-id |= x=(element @p) x
6−++ generic-id |= x=(element A) x
3+ [%node event=$-(@t M) children=(list (node-tree M))]
4+++ text-id |= x=(node-tree @t) x
5+++ ship-id |= x=(node-tree @p) x
6+++ generic-id |= x=(node-tree A) x
77++ local-only |= x=@t
88 +$ local-tree |$ [M]
99 [%text value=@t]
tests/type-generic-recursion/local-shadow.txt+7−7
@@ -1,11 +1,11 @@
1−+$ element |$ [M]
1++$ node-tree |$ [M]
22 [%text value=@t]
3− [%node event=$-(@t M) children=(list (element M))]
4−++ text-id |= x=(element @t) x
5−++ ship-id |= x=(element @p) x
6−++ generic-id |= x=(element A) x
3+ [%node event=$-(@t M) children=(list (node-tree M))]
4+++ text-id |= x=(node-tree @t) x
5+++ ship-id |= x=(node-tree @p) x
6+++ generic-id |= x=(node-tree A) x
77++ shadow |= x=@t
8− +$ element |$ [M]
8+ +$ node-tree |$ [M]
99 [%text value=@t]
10− [%node event=$-(@t M) children=(list (element M))]
10+ [%node event=$-(@t M) children=(list (node-tree M))]
1111 x
tests/type-generic-recursion/tree-changed.txt+5−5
@@ -1,6 +1,6 @@
1−+$ element |$ [M]
1++$ node-tree |$ [M]
22 [%text value=@t]
3− [%branch event=$-(@t M) children=(list (element M))]
4−++ text-id |= x=(element @t) x
5−++ ship-id |= x=(element @p) x
6−++ generic-id |= x=(element A) x
3+ [%branch event=$-(@t M) children=(list (node-tree M))]
4+++ text-id |= x=(node-tree @t) x
5+++ ship-id |= x=(node-tree @p) x
6+++ generic-id |= x=(node-tree A) x
tests/type-generic-recursion/tree.txt+5−5
@@ -1,6 +1,6 @@
1−+$ element |$ [M]
1++$ node-tree |$ [M]
22 [%text value=@t]
3− [%node event=$-(@t M) children=(list (element M))]
4−++ text-id |= x=(element @t) x
5−++ ship-id |= x=(element @p) x
6−++ generic-id |= x=(element A) x
3+ [%node event=$-(@t M) children=(list (node-tree M))]
4+++ text-id |= x=(node-tree @t) x
5+++ ship-id |= x=(node-tree @p) x
6+++ generic-id |= x=(node-tree A) x
tests/type-list-alias/expected.txt+4−4
@@ -1,6 +1,6 @@
11canonical
22partial inference; module not checked
3−++ text: $-((list @t) (list @t))
3+++ text-value: $-((list @t) (list @t))
44++ ship: $-((list @p) (list @p))
55++ wrong: list item does not fit its expected type
66/ui/test.jibb:3:13: expected item has type @t
@@ -12,13 +12,13 @@ partial inference; module not checked
1212++ shadow: local molds shadow a name
1313altered
1414partial inference; module not checked
15−++ text: sample mold is not supported by partial inference
15+++ text-value: sample mold is not supported by partial inference
1616++ ship: sample mold is not supported by partial inference
1717++ wrong: cast mold is not supported by partial inference
1818++ shadow: sample mold is not supported by partial inference
1919omitted
2020partial inference; module not checked
21−++ text: sample mold is not supported by partial inference
21+++ text-value: sample mold is not supported by partial inference
2222++ ship: sample mold is not supported by partial inference
2323++ wrong: cast mold is not supported by partial inference
2424++ shadow: sample mold is not supported by partial inference
@@ -30,7 +30,7 @@ partial inference; module not checked
3030prelude source does not parse; module import inference unsupported
3131cyclic
3232partial inference; module not checked
33−++ text: sample mold is not supported by partial inference
33+++ text-value: sample mold is not supported by partial inference
3434++ ship: sample mold is not supported by partial inference
3535++ wrong: cast mold is not supported by partial inference
3636++ shadow: local molds shadow a name
tests/type-page-main/about.txtnew file+3
@@ -0,0 +1,3 @@
1+source: my-app/ui/about.jibb, my-app/ui/blog/index.jibb and my-app/ui/index.jibb; their fixtures and real API/UI/reader sources must remain byte-identical.
2+tests: Shared eval and ship full checks for static and direct data pages, exact closed main types, a direct-constructor reply, structural downstream imports, and rejection of wrong/arbitrary mains, page aliases, indirect, pure, hand-built, typed and diff loads, missing evidence and store paths. No rendering or runtime request execution is claimed.
3+expect: shared eval and ship guards
tests/type-page-main/arbitrary-main.txtnew file+1
@@ -0,0 +1 @@
1+++ main 42
tests/type-page-main/blog-api.txtnew file+5
@@ -0,0 +1,5 @@
1+:: Fixture for the documented examples; not supplied by the design doc.
2+/% %posts
3+
4++$ paths
5+ [%posts /posts posts]
tests/type-page-main/blog-index.txtnew file+9
@@ -0,0 +1,9 @@
1+/- blog
2+/= api /ui/api/blog
3+/= card /ui/components/card
4+
5+++ main (page load view)
6+++ load |=(~ (posts.api same))
7+
8+++ view |= ps=(list post.blog)
9+ column ~[gap+%s2] (turn ps card.card)
tests/type-page-main/blog-sur.txtnew file+6
@@ -0,0 +1,6 @@
1+:: Fixture for the documented examples; not supplied by the design doc.
2+|%
3++$ title @t
4++$ post [title=title slug=@ta]
5++$ chain $@(~ [value=@ud next=chain])
6+--
tests/type-page-main/card.txtnew file+5
@@ -0,0 +1,5 @@
1+:: Fixture for the documented examples; not supplied by the design doc.
2+/- blog
3+
4+++ card |= p=post.blog
5+ text title.p
tests/type-page-main/ctor-page.txtnew file+10
@@ -0,0 +1,10 @@
1+/= todo /ui/api/todo
2+
3++$ msg
4+ [%got todos=(list item.todo)]
5+++ main (page load view)
6+++ load |= ~
7+ ^- (ask msg) (todos.todo |=%got)
8+
9+++ view |= m=msg
10+ text "Todos loaded"
tests/type-page-main/diff-load.txtnew file+11
@@ -0,0 +1,11 @@
1+/= todo /ui/api/todo
2+/= todo-list /ui/todo-list
3+
4+++ main (page load view)
5+++ fold |= [d=[%todo-update todo-update.todo] s=todos.todo] s
6+++ load |=(~ (changes.todo same fold))
7+
8+++ view |= ts=(list item.todo)
9+ column ~[pad+%s3] ~[
10+ heading 1 "My ship"
11+ island main.todo-list ts
tests/type-page-main/hand-built-load.txtnew file+14
@@ -0,0 +1,14 @@
1+/= todo /ui/api/todo
2+/= todo-list /ui/todo-list
3+
4+++ main (page load view)
5+++ load |=(~
6+ ^- (ask (list item.todo))
7+ [%agent api="/ui/api/todo" case=%todos agent=%todo path=~[%todos] scry=~ receive=receive])
8+++ receive |= input=[mark=@tas state=(unit *) fact=*]
9+ ^- [state=* message=(list item.todo)] [state=0 message=~]
10+
11+++ view |= ts=(list item.todo)
12+ column ~[pad+%s3] ~[
13+ heading 1 "My ship"
14+ island main.todo-list ts
tests/type-page-main/index.txtnew file+10
@@ -0,0 +1,10 @@
1+/= todo /ui/api/todo
2+/= todo-list /ui/todo-list
3+
4+++ main (page load view)
5+++ load |=(~ (todos.todo same))
6+
7+++ view |= ts=(list item.todo)
8+ column ~[pad+%s3] ~[
9+ heading 1 "My ship"
10+ island main.todo-list ts
tests/type-page-main/indirect-load.txtnew file+11
@@ -0,0 +1,11 @@
1+/= todo /ui/api/todo
2+/= todo-list /ui/todo-list
3+
4+++ main (page load view)
5+++ request |=(~ (todos.todo same))
6+++ load |=(~ (request ~))
7+
8+++ view |= ts=(list item.todo)
9+ column ~[pad+%s3] ~[
10+ heading 1 "My ship"
11+ island main.todo-list ts
tests/type-page-main/page-alias.txtnew file+11
@@ -0,0 +1,11 @@
1+/= todo /ui/api/todo
2+/= todo-list /ui/todo-list
3+
4+++ make-page page
5+++ main (make-page load view)
6+++ load |=(~ (todos.todo same))
7+
8+++ view |= ts=(list item.todo)
9+ column ~[pad+%s3] ~[
10+ heading 1 "My ship"
11+ island main.todo-list ts
tests/type-page-main/posts-mark.txtnew file+6
@@ -0,0 +1,6 @@
1+:: Fixture for the documented examples; not supplied by the design doc.
2+|_ a=(list post:blog)
3+++ grab |% ++ noun (list post:blog) --
4+++ grow |% ++ noun a --
5+++ grad %noun
6+--
tests/type-page-main/pure-load.txtnew file+10
@@ -0,0 +1,10 @@
1+/= todo /ui/api/todo
2+/= todo-list /ui/todo-list
3+
4+++ main (page load view)
5+++ load |=(~ (pure ~))
6+
7+++ view |= ts=(list item.todo)
8+ column ~[pad+%s3] ~[
9+ heading 1 "My ship"
10+ island main.todo-list ts
tests/type-page-main/static.txtnew file+7
@@ -0,0 +1,7 @@
1+++ main view
2+
3+++ view
4+ column ~[width+[%fill 1] pad+%s3 gap+%s2] ~[
5+ heading 1 "About this ship"
6+ para ~[(text "Hosted on Urbit. This page ships no JavaScript.")]
7+ el ~[tone+%accent] (link %/blog "Read the blog")
tests/type-page-main/todo-api.txtnew file+13
@@ -0,0 +1,13 @@
1+:: /ui/api/todo.jibb
2+/- todo
3+/% %todo-action
4+/% %todos
5+/% %todo-update
6+/% %todo-item
7+
8++$ item item.todo
9++$ poke todo-action
10++$ paths
11+ [%todos /todos todos]
12+ [%changes /changes (facts todos todo-update)]
13+ [%todo-by-id /todo/[id=@ud] todo-item]
tests/type-page-main/todo-island.txtnew file+40
@@ -0,0 +1,40 @@
1+/= todo /ui/api/todo
2+
3+++ main (program init update view subs)
4+
5++$ model [todos=(list item.todo) draft=@t error=(unit @t)]
6++$ msg
7+ [%typed text=@t]
8+ %submit
9+ [%toggled id=@ud]
10+ [%got todos=(list item.todo)]
11+ [%acked err=(unit @t)]
12+
13+++ init |= ts=(list item.todo)
14+ [ts "" ~]
15+
16+++ update |= [=msg m=model]
17+ ?- msg
18+ [%typed t]
19+ ?- (gth (lent (tuba (trip t))) 80)
20+ %.y [m(draft=t error=`"Too long") ~]
21+ %.n [m(draft=t error=~) ~]
22+ %submit [m(draft="") ~[(poke.todo [%add draft.m] |=%acked)]]
23+ [%toggled id] [m ~[(poke.todo [%toggle id] |=%acked)]]
24+ [%got ts] [m(todos=ts) ~]
25+ [%acked err] [m(error=err) ~]
26+
27+++ subs |= m=model
28+ ~[[%watch (todos.todo |=%got)]]
29+
30+++ view |= m=model
31+ column ~[gap+%s2] ~[
32+ heading 2 "Todos"
33+ each (turn todos.m row-of)
34+ row ~[gap+%s1] ~[
35+ el ~[width+[%fill 1]] (field "New todo" draft.m |=%typed)
36+ button "Add" %submit
37+ el ~[tone+%danger] (text (fall error.m ""))
38+
39+++ row-of |= t=item.todo
40+ [id.t (toggle done.t text.t [%toggled id.t])]
tests/type-page-main/typed-load.txtnew file+8
@@ -0,0 +1,8 @@
1+/= todo /ui/api/todo
2+/= todo-list /ui/todo-list
3+
4+++ main (page load view)
5+++ load |=(~ (todo-by-id.todo 1 |=%one))
6+
7+++ view |= item=todo-item.todo
8+ text "One todo"
tests/type-page-main/wrong-static.txtnew file+1
@@ -0,0 +1 @@
1+++ main (button "Go" %go)
tests/type-poke/about.txt+2−2
@@ -1,6 +1,6 @@
1−The internal prelude defines poke, while the public prelude re-exports it as an
1+The internal prelude defines raw-poke, while the public prelude re-exports it as an
22ordinary transparent type. A real Hoon mark is compiled and read by the importer
3−before the partial checker builds a poke-only API interface. The reports cover
3+before the partial checker builds a raw-poke-only API interface. The reports cover
44the constructor and mark mismatch, aliases and re-exports, ordinary construction
55and inspection, private import boundaries, unsupported or invalid API declarations,
66and preparation failures. The report remains partial; effect lowering and runtime
tests/type-poke/alias.txt+1−1
@@ -1,2 +1,2 @@
11/= fake /ui/internal
2−++ nope |= x=poke.fake x
2+++ nope |= x=raw-poke.fake x
tests/type-poke/client.txt+13−13
@@ -1,23 +1,23 @@
11/= todo /ui/api/todo
2−+$ copy poke
2++$ copy raw-poke
33+$ double copy
4−++ good (todo-action.todo "ok")
5−++ pass |= x=poke x
4+++ good (poke.todo "ok" same)
5+++ pass |= x=raw-poke x
66++ pass-alias |= x=copy x
7−++ direct ^- poke [%agent %todo %todo-action "x"]
7+++ direct ^- raw-poke [%agent %todo %todo-action "x"]
88++ alias ^- double [%agent %todo %todo-action "x"]
9−++ getter |= x=poke payload.x
10−++ inspect |= x=poke
9+++ getter |= x=raw-poke payload.x
10+++ inspect |= x=raw-poke
1111 ?- x
1212 [%agent a b c] "agent"
1313 [%store a b c] "store"
14−++ change |= x=poke x(payload="new")
15−++ cast-atom ^- poke 0
14+++ change |= x=raw-poke x(payload="new")
15+++ cast-atom ^- raw-poke 0
1616++ leaked |= x=copy ^- @t x
17−++ split |= x=poke
17+++ split |= x=raw-poke
1818 ?- x
1919 [a b] a
20−++ number [(todo-action.todo "write") 1]
21−++ bad-constructor (todo-action.todo ~zod)
22−++ bad-mark ^- poke [%agent %todo 0x1f "x"]
23−++ bad-case ^- poke [%alien %todo %todo-action "x"]
20+++ number ^- [(cmd (unit @t)) @ud] [(poke.todo "write" same) 1]
21+++ bad-constructor (poke.todo ~zod same)
22+++ bad-mark ^- raw-poke [%agent %todo 0x1f "x"]
23+++ bad-case ^- raw-poke [%alien %todo %todo-action "x"]
tests/type-poke/direct.txt+1−1
@@ -1,2 +1,2 @@
11/= leak /lib/jibb/internal
2−++ nope |= x=poke.leak x
2+++ nope |= x=raw-poke.leak x
tests/type-poke/expected.txt+21−21
@@ -6,45 +6,45 @@ partial inference; module not checked
66partial inference; module not checked
77+$ copy: not checked
88+$ double: not checked
9−++ good: poke
10−++ pass: $-(poke poke)
11−++ pass-alias: $-(poke poke)
12−++ direct: poke
13−++ alias: poke
9+++ good: (cmd (unit @t))
10+++ pass: $-(raw-poke raw-poke)
11+++ pass-alias: $-(raw-poke raw-poke)
12+++ direct: raw-poke
13+++ alias: raw-poke
1414++ getter: field is not available to partial inference
15−++ inspect: $-(poke @t)
15+++ inspect: $-(raw-poke @t)
1616++ change: change target needs a known record in partial inference
1717++ cast-atom: cast constraint is not supported by partial inference
1818++ leaked: cast constraint is not supported by partial inference
1919++ split: cell pattern subject is not supported by partial inference
20−++ number: [poke @ud]
20+++ number: [(cmd (unit @t)) @ud]
2121++ bad-constructor: call's sample and argument types do not unify
2222/ui/test.jibb:21:21: called gate
23−++ bad-constructor (todo-action.todo ~zod)
23+++ bad-constructor (poke.todo ~zod same)
2424 ^
25−/ui/test.jibb:21:38: argument has type @p
26−++ bad-constructor (todo-action.todo ~zod)
27− ^
25+/ui/test.jibb:21:31: argument has type @p
26+++ bad-constructor (poke.todo ~zod same)
27+ ^
2828++ bad-mark: cast mold and expression type do not unify
2929/ui/test.jibb:22:16: cast mold
30−++ bad-mark ^- poke [%agent %todo 0x1f "x"]
30+++ bad-mark ^- raw-poke [%agent %todo 0x1f "x"]
3131 ^
32−/ui/test.jibb:22:21: expression
33−++ bad-mark ^- poke [%agent %todo 0x1f "x"]
34− ^
32+/ui/test.jibb:22:25: expression
33+++ bad-mark ^- raw-poke [%agent %todo 0x1f "x"]
34+ ^
3535++ bad-case: cast mold and expression type do not unify
3636/ui/test.jibb:23:16: cast mold
37−++ bad-case ^- poke [%alien %todo %todo-action "x"]
37+++ bad-case ^- raw-poke [%alien %todo %todo-action "x"]
3838 ^
39−/ui/test.jibb:23:21: expression
40−++ bad-case ^- poke [%alien %todo %todo-action "x"]
41− ^
39+/ui/test.jibb:23:25: expression
40+++ bad-case ^- raw-poke [%alien %todo %todo-action "x"]
41+ ^
4242partial inference; module not checked
4343the prelude internal module is private
4444partial inference; module not checked
4545++ nope: sample mold is not supported by partial inference
4646partial inference; module not checked
47−++ pass: $-(poke poke)
47+++ pass: $-(raw-poke raw-poke)
4848++ fake-to-real: cast constraint is not supported by partial inference
4949++ real-to-fake: cast constraint is not supported by partial inference
5050++ match-tag: union pattern is not supported by partial inference
@@ -63,4 +63,4 @@ API module needs unsupported inference: /ui/api/todo/jibb
6363partial inference; module not checked
6464API module needs unsupported inference: /ui/api/todo/jibb
6565partial inference; module not checked
66−module has conflicting names: /ui/wrong/todo/jibb
66+++ test: module member is not available to partial inference
tests/type-poke/exported.txt+4−4
@@ -1,9 +1,9 @@
11/= public /ui/public
22/= fake /ui/internal
3−++ pass |= x=exposed.public ^- poke x
4−++ fake-to-real |= x=faux.fake ^- poke x
5−++ real-to-fake |= x=poke ^- faux.fake x
6−++ match-tag |= x=poke
3+++ pass |= x=exposed.public ^- raw-poke x
4+++ fake-to-real |= x=faux.fake ^- raw-poke x
5+++ real-to-fake |= x=raw-poke ^- faux.fake x
6+++ match-tag |= x=raw-poke
77 ?- x
88 %agent "a"
99 * "b"
tests/type-poke/inner.txt+1−1
@@ -1,2 +1,2 @@
11/= hidden /lib/jibb/internal
2−+$ exported poke.hidden
2++$ exported raw-poke.hidden
tests/type-poke/public.txt+1−1
@@ -1,2 +1,2 @@
1−+$ exposed poke
1++$ exposed raw-poke
22++ carry |= x=exposed x
tests/type-poke/transitive.txt+1−1
@@ -1,2 +1,2 @@
11/= leaked /ui/inner
2−++ nope |= x=poke.leaked x
2+++ nope |= x=raw-poke.leaked x
tests/type-program-main/about.txtnew file+1
@@ -0,0 +1 @@
1+tests: A direct four-wing program main uses the ordinary source-backed program fit. Its init data and model are closed and gate-free within the shared 256-node budget, and subs syntactically returns null through transparent forms. The fixture checks exported and downstream imported types, source evidence, structured and legacy adapters, and fail-closed controls. It does not execute a program or establish runtime watchability.
tests/type-program-main/alias-main.txtnew file+11
@@ -0,0 +1,11 @@
1++$ message
2+ %start
3+ %stop
4++$ model [count=@ud]
5+++ main (program-alias init update view subs)
6+++ init |= input=@t ^- model [count=0]
7+++ update |= [msg=message state=model]
8+ ^- [model (list (cmd message))] [state ~]
9+++ view |= state=model ^- (element message) (text "view")
10+++ subs |= state=model ^- (list (sub message)) ~
11+++ program-alias program
tests/type-program-main/arbitrary-main.txtnew file+10
@@ -0,0 +1,10 @@
1++$ message
2+ %start
3+ %stop
4++$ model [count=@ud]
5+++ main init
6+++ init |= input=@t ^- model [count=0]
7+++ update |= [msg=message state=model]
8+ ^- [model (list (cmd message))] [state ~]
9+++ view |= state=model ^- (element message) (text "view")
10+++ subs |= state=model ^- (list (sub message)) ~
tests/type-program-main/consumer.txtnew file+2
@@ -0,0 +1,2 @@
1+/= island-prog /tests/program-main/island
2+++ imported init.main.island-prog
tests/type-program-main/gate-data.txtnew file+10
@@ -0,0 +1,10 @@
1++$ message
2+ %start
3+ %stop
4++$ model [count=@ud]
5+++ main (program init update view subs)
6+++ init |= input=$-(@t @t) ^- model [count=0]
7+++ update |= [msg=message state=model]
8+ ^- [model (list (cmd message))] [state ~]
9+++ view |= state=model ^- (element message) (text "view")
10+++ subs |= state=model ^- (list (sub message)) ~
tests/type-program-main/gate-model.txtnew file+11
@@ -0,0 +1,11 @@
1++$ message
2+ %start
3+ %stop
4++$ model [count=@ud callback=$-(@t @t)]
5+++ main (program init update view subs)
6+++ init |= input=@t ^- model [count=0 callback=echo]
7+++ update |= [msg=message state=model]
8+ ^- [model (list (cmd message))] [state ~]
9+++ view |= state=model ^- (element message) (text "view")
10+++ subs |= state=model ^- (list (sub message)) ~
11+++ echo |= input=@t input
tests/type-program-main/initializer-consumer.txtnew file+2
@@ -0,0 +1,2 @@
1+/= island-prog /tests/program-main/initializer
2+++ imported init.main.island-prog
tests/type-program-main/initializer-earlier.txtnew file+10
@@ -0,0 +1,10 @@
1++$ model [xs=(list @t) draft=@t error=(unit @t)]
2++$ message
3+ %start
4+ %stop
5+++ main (program init update view subs)
6+++ init |= ts=(list @t) [ts ~zod ~]
7+++ update |= [msg=message state=model]
8+ ^- [model (list (cmd message))] [state ~]
9+++ view |= state=model ^- (element message) (text "view")
10+++ subs |= state=model ^- (list (sub message)) ~
tests/type-program-main/initializer-error.txtnew file+10
@@ -0,0 +1,10 @@
1++$ model [xs=(list @t) draft=@t error=@t]
2++$ message
3+ %start
4+ %stop
5+++ main (program init update view subs)
6+++ init |= ts=(list @t) [ts "" ~]
7+++ update |= [msg=message state=model]
8+ ^- [model (list (cmd message))] [state ~]
9+++ view |= state=model ^- (element message) (text "view")
10+++ subs |= state=model ^- (list (sub message)) ~
tests/type-program-main/initializer-generic.txtnew file+10
@@ -0,0 +1,10 @@
1++$ model [xs=(list @t) draft=@t error=(unit @t)]
2++$ message
3+ %start
4+ %stop
5+++ main (program init update view subs)
6+++ init |= ts [ts "" ~]
7+++ update |= [msg=message state=model]
8+ ^- [model (list (cmd message))] [state ~]
9+++ view |= state=model ^- (element message) (text "view")
10+++ subs |= state=model ^- (list (sub message)) ~
tests/type-program-main/initializer-message.txtnew file+13
@@ -0,0 +1,13 @@
1++$ model [xs=(list @t) draft=@t error=(unit @t)]
2++$ message
3+ %start
4+ %stop
5++$ other
6+ %start
7+ %stop
8+++ main (program init update view subs)
9+++ init |= ts=(list @t) [ts "" ~]
10+++ update |= [msg=other state=model]
11+ ^- [model (list (cmd other))] [state ~]
12+++ view |= state=model ^- (element message) (text "view")
13+++ subs |= state=model ^- (list (sub message)) ~
tests/type-program-main/initializer-missing.txtnew file+9
@@ -0,0 +1,9 @@
1++$ model [xs=(list @t) draft=@t error=(unit @t)]
2++$ message
3+ %start
4+ %stop
5+++ main (program init update view subs)
6+++ update |= [msg=message state=model]
7+ ^- [model (list (cmd message))] [state ~]
8+++ view |= state=model ^- (element message) (text "view")
9+++ subs |= state=model ^- (list (sub message)) ~
tests/type-program-main/initializer-model.txtnew file+11
@@ -0,0 +1,11 @@
1++$ model [xs=(list @t) draft=@t error=(unit @t)]
2++$ other [xs=(list @t) draft=@t error=(unit @t) extra=@ud]
3++$ message
4+ %start
5+ %stop
6+++ main (program init update view subs)
7+++ init |= ts=(list @t) [ts "" ~]
8+++ update |= [msg=message state=other]
9+ ^- [other (list (cmd message))] [state ~]
10+++ view |= state=model ^- (element message) (text "view")
11+++ subs |= state=model ^- (list (sub message)) ~
tests/type-program-main/initializer-no-main.txtnew file+10
@@ -0,0 +1,10 @@
1++$ model [xs=(list @t) draft=@t error=(unit @t)]
2++$ message
3+ %start
4+ %stop
5+++ direct (program init update view subs)
6+++ init |= ts=(list @t) [ts "" ~]
7+++ update |= [msg=message state=model]
8+ ^- [model (list (cmd message))] [state ~]
9+++ view |= state=model ^- (element message) (text "view")
10+++ subs |= state=model ^- (list (sub message)) ~
tests/type-program-main/initializer-subs.txtnew file+10
@@ -0,0 +1,10 @@
1++$ model [xs=(list @t) draft=@t error=(unit @t)]
2++$ message
3+ %start
4+ %stop
5+++ main (program init update view subs)
6+++ init |= ts=(list @t) [ts "" ~]
7+++ update |= [msg=message state=model]
8+ ^- [model (list (cmd message))] [state ~]
9+++ view |= state=model ^- (element message) (text "view")
10+++ subs |= state ~
tests/type-program-main/initializer-tag.txtnew file+13
@@ -0,0 +1,13 @@
1++$ model [xs=(list @t) draft=@t error=(unit @t)]
2++$ message
3+ %start
4+ %stop
5+++ main (program init update view subs)
6+++ init |= ts=(list @t) [ts "" ~]
7+++ update |= [msg=message state=model]
8+ ^- [model (list (cmd message))] [state ~]
9+++ view |= state=model ^- (element message) (text "view")
10+++ subs |= state=model ^- (list (sub message)) ~
11+++ orphan
12+ ~& %unrelated
13+ 0
tests/type-program-main/initializer-unfaced.txtnew file+10
@@ -0,0 +1,10 @@
1++$ model [xs=(list @t) draft=@t error=(unit @t)]
2++$ message
3+ %start
4+ %stop
5+++ main (program init update view subs)
6+++ init |= ts=(list @t) [ts "" ~]
7+++ update |= input=[message model]
8+ ^- [model (list (cmd message))] [[~ "" ~] ~]
9+++ view |= state=model ^- (element message) (text "view")
10+++ subs |= state=model ^- (list (sub message)) ~
tests/type-program-main/initializer.txtnew file+12
@@ -0,0 +1,12 @@
1++$ model [xs=(list @t) draft=@t error=(unit @t)]
2++$ message
3+ %start
4+ %stop
5+++ main (program init update view subs)
6+++ init |= ts=(list @t) [ts "" ~]
7+++ update |= [msg=message state=model]
8+ ^- [model (list (cmd message))] [state ~]
9+++ view |= state=model ^- (element message) (text "view")
10+++ subs |= state=model
11+ ^- (list (sub message))
12+ (~)
tests/type-program-main/mismatched-model.txtnew file+10
@@ -0,0 +1,10 @@
1++$ message
2+ %start
3+ %stop
4++$ model [count=@ud]
5+++ main (program init update view subs)
6+++ init |= input=@t ^- model [count=0]
7+++ update |= [msg=message state=@p]
8+ ^- [@p (list (cmd message))] [state ~]
9+++ view |= state=model ^- (element message) (text "view")
10+++ subs |= state=model ^- (list (sub message)) ~
tests/type-program-main/nonempty-subs.txtnew file+12
@@ -0,0 +1,12 @@
1++$ message
2+ %start
3+ %stop
4++$ model [count=@ud]
5+++ main (program init update view subs)
6+++ init |= input=@t ^- model [count=0]
7+++ update |= [msg=message state=model]
8+ ^- [model (list (cmd message))] [state ~]
9+++ view |= state=model ^- (element message) (text "view")
10+++ subs |= state=model
11+ ^- (list (sub message))
12+ ~[[%watch (pure %start)]]
tests/type-program-main/open-message.txtnew file+7
@@ -0,0 +1,7 @@
1++$ model [count=@ud]
2+++ main (program init update view subs)
3+++ init |= input=@t ^- model [count=0]
4+++ update |= [msg=M state=model]
5+ ^- [model (list (cmd M))] [state ~]
6+++ view |= state=model ^- (element M) (text "view")
7+++ subs |= state=model ^- (list (sub M)) ~
tests/type-program-main/source.txtnew file+12
@@ -0,0 +1,12 @@
1++$ message
2+ %start
3+ %stop
4++$ model [count=@ud]
5+++ main (program (init) update view subs)
6+++ init |= input=@t ^- model [count=0]
7+++ update |= [msg=message state=model]
8+ ^- [model (list (cmd message))] [state ~]
9+++ view |= state=model ^- (element message) (text "view")
10+++ subs |= state=model
11+ ^- (list (sub message))
12+ (~)
tests/type-program-update/consumer.txtnew file+2
@@ -0,0 +1,2 @@
1+/= island-prog /tests/program-update/island
2+++ imported update.main.island-prog
tests/type-program-update/malformed-sample.txtnew file+9
@@ -0,0 +1,9 @@
1++$ model [count=@ud]
2++$ message %noop
3+++ main (program init update view subs)
4+++ init |= input=@t ^- model [count=0]
5+++ update |= event=message
6+ ?- event
7+ %noop [[count=0] ~]
8+++ view |= state=model ^- (element message) (text "view")
9+++ subs |= state=model ^- (list (sub message)) ~
tests/type-program-update/missing-list.txtnew file+15
@@ -0,0 +1,15 @@
1++$ model [count=@ud]
2++$ message
3+ %noop
4+ [%set value=@ud]
5+++ main (program init update view subs)
6+++ init |= input=@t ^- model [count=0]
7+++ update |= [event=message current=model]
8+ ?- event
9+ %noop [current ~]
10+ [%set value]
11+ ?- (gth value 10)
12+ %.y [current(count=value) ~]
13+ %.n [current ~]
14+++ view |= state=model ^- (element message) (text "view")
15+++ subs !!
tests/type-program-update/non-main.txtnew file+14
@@ -0,0 +1,14 @@
1++$ model [count=@ud]
2++$ message
3+ %noop
4+ [%set value=@ud]
5+++ init |= input=@t ^- model [count=0]
6+++ update |= [event=message current=model]
7+ ?- event
8+ %noop [current ~]
9+ [%set value]
10+ ?- (gth value 10)
11+ %.y [current(count=value) ~]
12+ %.n [current ~]
13+++ view |= state=model ^- (element message) (text "view")
14+++ subs |= state=model ^- (list (sub message)) ~
tests/type-program-update/source.txtnew file+15
@@ -0,0 +1,15 @@
1++$ model [count=@ud]
2++$ message
3+ %noop
4+ [%set value=@ud]
5+++ main (program init update view subs)
6+++ init |= input=@t ^- model [count=0]
7+++ update |= [event=message current=model]
8+ ?- event
9+ %noop [current ~]
10+ [%set value]
11+ ?- (gth value 10)
12+ %.y [current(count=value) ~]
13+ %.n [current ~]
14+++ view |= state=model ^- (element message) (text "view")
15+++ subs |= state=model ^- (list (sub message)) ~
tests/type-program-update/three-slot-sample.txtnew file+9
@@ -0,0 +1,9 @@
1++$ model [count=@ud]
2++$ message %noop
3+++ main (program init update view subs)
4+++ init |= input=@t ^- model [count=0]
5+++ update |= [event=message current=model extra=@ud]
6+ ?- event
7+ %noop [current ~]
8+++ view |= state=model ^- (element message) (text "view")
9+++ subs |= state=model ^- (list (sub message)) ~
tests/type-program-update/unrelated-tag.txtnew file+16
@@ -0,0 +1,16 @@
1++$ model [count=@ud]
2++$ message
3+ %noop
4+ [%set value=@ud]
5+++ main (program init update view subs)
6+++ init |= input=@t ^- model [count=0]
7+++ update |= [event=message current=model]
8+ ?- event
9+ %noop [current ~]
10+ [%set value]
11+ ?- (gth value 10)
12+ %.y [current(count=value) ~]
13+ %.n [current ~]
14+++ view |= state=model ^- (element message) (text "view")
15+++ subs |= state=model ^- (list (sub message)) ~
16+++ dangling |=%unrelated
tests/type-program-update/wrong-message.txtnew file+10
@@ -0,0 +1,10 @@
1++$ model [count=@ud]
2++$ message %noop
3++$ other-message %other
4+++ main (program init update view subs)
5+++ init |= input=@t ^- model [count=0]
6+++ update |= [event=other-message current=model]
7+ ?- event
8+ %other [current ~]
9+++ view |= state=model ^- (element message) (text "view")
10+++ subs |= state=model ^- (list (sub message)) ~
tests/type-program-update/wrong-model.txtnew file+12
@@ -0,0 +1,12 @@
1++$ model [count=@ud]
2++$ message
3+ %noop
4+ [%set value=@ud]
5+++ main (program init update view subs)
6+++ init |= input=@t ^- model [count=0]
7+++ update |= [event=message current=model]
8+ ?- event
9+ %noop [current ~]
10+ [%set value] [[count="wrong"] ~]
11+++ view |= state=model ^- (element message) (text "view")
12+++ subs |= state=model ^- (list (sub message)) ~
tests/type-program-update/wrong-result.txtnew file+12
@@ -0,0 +1,12 @@
1++$ model [count=@ud]
2++$ message
3+ %noop
4+ [%set value=@ud]
5+++ main (program init update view subs)
6+++ init |= input=@t ^- model [count=0]
7+++ update |= [event=message current=model]
8+ ?- event
9+ %noop [current ~]
10+ [%set value] [current `%noop]
11+++ view |= state=model ^- (element message) (text "view")
12+++ subs |= state=model ^- (list (sub message)) ~
tests/type-program-watch/about.txtnew file+1
@@ -0,0 +1 @@
1+tests: A synthetic closed program uses the real todo API and Hoon readers with synthetic init, update and view definitions. A singleton direct todos.api watch must match exact merged source-backed request evidence; the fixture checks its closed subs type and downstream import. Pure and hand-built requests, helpers and aliases, scry, missing, mismatched or ambiguous evidence, typed paths, diffs and multiple subscriptions are rejected. It does not execute the todo UI or establish runtime watching.
tests/type-store/basket.txtnew file+32
@@ -0,0 +1,32 @@
1+:: /ui/basket.jibb
2+/= cart /ui/stores/cart
3+
4+++ main (program init update view subs)
5+
6++$ model [cart=state.cart note=@t]
7++$ msg
8+ [%noted text=@t]
9+ %add
10+ %toggle
11+ [%got cart=state.cart]
12+ [%acked err=(unit @t)]
13+
14+++ init |= ~
15+ [[~ %.n] ""]
16+
17+++ update |= [=msg m=model]
18+ ?- msg
19+ [%noted t] [m(note=t) ~]
20+ %add [m(note="") ~[(poke.cart [%add note.m] |=%acked)]]
21+ %toggle [m ~[(poke.cart %toggle |=%acked)]]
22+ [%got c] [m(cart=c) ~]
23+ [%acked err] [m ~]
24+
25+++ subs |= m=model
26+ ~[[%watch (state.cart |=%got)]]
27+
28+++ view |= m=model
29+ column ~[gap+%s1] ~[
30+ (text "{(lent items.cart.m)} items")
31+ field "Item" note.m |=%noted
32+ button "Add" %add
tests/type-store/cart.txtnew file+12
@@ -0,0 +1,12 @@
1+:: /ui/stores/cart.jibb
2++$ state [items=(list @t) open=?]
3++$ poke
4+ [%add item=@t]
5+ %toggle
6+
7+++ main (store init update)
8+++ init ^- state [~ %.n]
9+++ update |= [a=poke s=state]
10+ ?- a
11+ [%add item] s(items=[item items.s])
12+ %toggle s(open=(not open.s))
tests/type-theme/dark-absent.txtnew file+8
@@ -0,0 +1,8 @@
1+++ theme ^- theme
2+ [ space=[s1="4px" s2="8px" s3="16px"]
3+ tones=[normal="#222" background="#fff" accent="#17734f" danger="#b3261e" muted="#5f5f5f"]
4+ wide="60rem"
5+ lang="en"
6+ zone="UTC"
7+ font=`%/static/fonts/inter.woff2
8+ dark=~
tests/type-theme/missing-field.txtnew file+7
@@ -0,0 +1,7 @@
1+++ theme ^- theme
2+ [ space=[s1="4px" s2="8px" s3="16px"]
3+ tones=[normal="#222" background="#fff" accent="#17734f" danger="#b3261e" muted="#5f5f5f"]
4+ wide="60rem"
5+ lang="en"
6+ font=`%/static/fonts/inter.woff2
7+ dark=[tones=[normal="#eee" background="#111" accent="#4c9" danger="#f28b82" muted="#aaa"]]
tests/type-theme/source.txtnew file+8
@@ -0,0 +1,8 @@
1+++ theme ^- theme
2+ [ space=[s1="4px" s2="8px" s3="16px"]
3+ tones=[normal="#222" background="#fff" accent="#17734f" danger="#b3261e" muted="#5f5f5f"]
4+ wide="60rem"
5+ lang="en"
6+ zone="UTC"
7+ font=`%/static/fonts/inter.woff2
8+ dark=`[tones=[normal="#eee" background="#111" accent="#4c9" danger="#f28b82" muted="#aaa"]]
tests/type-theme/wrong-dark.txtnew file+8
@@ -0,0 +1,8 @@
1+++ theme ^- theme
2+ [ space=[s1="4px" s2="8px" s3="16px"]
3+ tones=[normal="#222" background="#fff" accent="#17734f" danger="#b3261e" muted="#5f5f5f"]
4+ wide="60rem"
5+ lang="en"
6+ zone="UTC"
7+ font=`%/static/fonts/inter.woff2
8+ dark="dark"
tests/type-theme/wrong-font.txtnew file+8
@@ -0,0 +1,8 @@
1+++ theme ^- theme
2+ [ space=[s1="4px" s2="8px" s3="16px"]
3+ tones=[normal="#222" background="#fff" accent="#17734f" danger="#b3261e" muted="#5f5f5f"]
4+ wide="60rem"
5+ lang="en"
6+ zone="UTC"
7+ font=`"/static/fonts/inter.woff2"
8+ dark=[tones=[normal="#eee" background="#111" accent="#4c9" danger="#f28b82" muted="#aaa"]]
tests/type-theme/wrong-nested-aura.txtnew file+8
@@ -0,0 +1,8 @@
1+++ theme ^- theme
2+ [ space=[s1="4px" s2="8px" s3="16px"]
3+ tones=[normal=~zod background="#fff" accent="#17734f" danger="#b3261e" muted="#5f5f5f"]
4+ wide="60rem"
5+ lang="en"
6+ zone="UTC"
7+ font=`%/static/fonts/inter.woff2
8+ dark=[tones=[normal="#eee" background="#111" accent="#4c9" danger="#f28b82" muted="#aaa"]]
tests/type-todo-api/expected.txt+1−1
@@ -6,7 +6,7 @@ partial inference; module not checked
66++ by-id-ship: (ask @p)
77++ changes-cord: (ask @t)
88++ changes-ship: (ask @p)
9−++ action: poke
9+++ action: (cmd (unit @t))
1010++ item-id: $-([id=@ud [done=? text=@t]] @ud)
1111++ action-id: $-(([%add text=@t] [%toggle id=@ud]) ([%add text=@t] [%toggle id=@ud]))
1212++ todos-id: $-((list [id=@ud [done=? text=@t]]) (list [id=@ud [done=? text=@t]]))
tests/type-todo-api/negative-expected.txt+4−4
@@ -10,11 +10,11 @@ partial inference; module not checked
1010++ missing-fold: call constraint is not supported by partial inference
1111++ bad-action: call's sample and argument types do not unify
1212/tests/type-todo-api/negative.jibb:5:16: called gate
13−++ bad-action (todo-action.api [%typo text="hello"])
13+++ bad-action (poke.api [%typo text="hello"] same)
1414 ^
15−/tests/type-todo-api/negative.jibb:5:32: argument
16−++ bad-action (todo-action.api [%typo text="hello"])
17− ^
15+/tests/type-todo-api/negative.jibb:5:25: argument
16+++ bad-action (poke.api [%typo text="hello"] same)
17+ ^
1818+$ msg: cases proven disjoint; mold not checked
1919++ missing: call's sample and argument types do not unify
2020/tests/type-todo-api/negative.jibb:9:26: called gate
tests/type-todo-api/negative.txt+1−1
@@ -2,7 +2,7 @@
22++ no-sur-export |= x=todo.api x
33++ bad-param (todo-by-id.api ~zod |=(x=todo-item.api "ok"))
44++ missing-fold (changes.api |=(xs=todos.api "ok"))
5−++ bad-action (todo-action.api [%typo text="hello"])
5+++ bad-action (poke.api [%typo text="hello"] same)
66+$ msg
77 [%got todos=(list item.api)]
88 %other
tests/type-todo-api/source.txt+1−1
@@ -6,7 +6,7 @@
66++ by-id-ship (todo-by-id.api 2 |=(x=todo-item.api ~zod))
77++ changes-cord (changes.api |=(xs=todos.api "ok") fold)
88++ changes-ship (changes.api |=(xs=todos.api ~zod) fold)
9−++ action (todo-action.api [%add text="hello"])
9+++ action (poke.api [%add text="hello"] same)
1010++ item-id |= x=item.api id.x
1111++ action-id |= x=todo-action.api x
1212++ todos-id |= x=todos.api x
tests/type-todo-full/about.txtnew file+3
@@ -0,0 +1,3 @@
1+source: docs/spec/overview.md, worked example 3; my-app/ui/todo-list.jibb must remain byte-identical to tests/type-gate-free/todo.txt.
2+tests: Full detailed and legacy checking of the unchanged todo island through the real Hoon readers and API. Assert the exact closed main type and structural downstream import, plus wrong model/message/result, ambiguous or open mapper, aliased mapper, non-gate view, and wrong watch rejection. The report does not execute Jibb or establish runtime watching.
3+expect: shared eval and ship guards
tests/type-todo-full/alias.txtnew file+42
@@ -0,0 +1,42 @@
1+/= todo /ui/api/todo
2+
3+++ main (program init update view subs)
4+
5++$ model [todos=(list item.todo) draft=@t error=(unit @t)]
6++$ msg
7+ [%typed text=@t]
8+ %submit
9+ [%toggled id=@ud]
10+ [%got todos=(list item.todo)]
11+ [%acked err=(unit @t)]
12+
13+++ init |= ts=(list item.todo)
14+ [ts "" ~]
15+
16+++ update |= [=msg m=model]
17+ ?- msg
18+ [%typed t]
19+ ?- (gth (lent (tuba (trip t))) 80)
20+ %.y [m(draft=t error=`"Too long") ~]
21+ %.n [m(draft=t error=~) ~]
22+ %submit [m(draft="") ~[(poke.todo [%add draft.m] |=%acked)]]
23+ [%toggled id] [m ~[(poke.todo [%toggle id] |=%acked)]]
24+ [%got ts] [m(todos=ts) ~]
25+ [%acked err] [m(error=err) ~]
26+
27+++ subs |= m=model
28+ ~[[%watch (todos.todo |=%got)]]
29+
30+++ view |= m=model
31+ column ~[gap+%s2] ~[
32+ heading 2 "Todos"
33+ each (turn todos.m row-alias)
34+ row ~[gap+%s1] ~[
35+ el ~[width+[%fill 1]] (field "New todo" draft.m |=%typed)
36+ button "Add" %submit
37+ el ~[tone+%danger] (text (fall error.m ""))
38+
39+++ row-of |= t=item.todo
40+ [id.t (toggle done.t text.t [%toggled id.t])]
41+
42+++ row-alias row-of
tests/type-todo-full/ambiguous-mapper.txtnew file+41
@@ -0,0 +1,41 @@
1+/= todo /ui/api/todo
2+
3+++ main (program init update view subs)
4+
5++$ model [todos=(list item.todo) draft=@t error=(unit @t)]
6++$ msg
7+ [%typed text=@t]
8+ %submit
9+ [%toggled id=@ud]
10+ [%got todos=(list item.todo)]
11+ [%acked err=(unit @t)]
12+
13+++ init |= ts=(list item.todo)
14+ [ts "" ~]
15+
16+++ update |= [=msg m=model]
17+ ?- msg
18+ [%typed t]
19+ ?- (gth (lent (tuba (trip t))) 80)
20+ %.y [m(draft=t error=`"Too long") ~]
21+ %.n [m(draft=t error=~) ~]
22+ %submit [m(draft="") ~[(poke.todo [%add draft.m] |=%acked)]]
23+ [%toggled id] [m ~[(poke.todo [%toggle id] |=%acked)]]
24+ [%got ts] [m(todos=ts) ~]
25+ [%acked err] [m(error=err) ~]
26+
27+++ subs |= m=model
28+ ~[[%watch (todos.todo |=%got)]]
29+
30+++ view |= m=model
31+ column ~[gap+%s2] ~[
32+ heading 2 "Todos"
33+ each (turn todos.m row-of)
34+ each (turn todos.m row-of)
35+ row ~[gap+%s1] ~[
36+ el ~[width+[%fill 1]] (field "New todo" draft.m |=%typed)
37+ button "Add" %submit
38+ el ~[tone+%danger] (text (fall error.m ""))
39+
40+++ row-of |= t=item.todo
41+ [id.t (toggle done.t text.t [%toggled id.t])]
tests/type-todo-full/expected.txtnew file+2
@@ -0,0 +1,2 @@
1+full todo accepted
2+[init=$-((list [id=@ud [done=? text=@t]]) [todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]]) [update=$-([msg [todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]]] [[todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]] (list (cmd msg))]) [view=$-([todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]] (element msg)) subs=$-([todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]] (list (sub msg)))]]]
tests/type-todo-full/non-gate-view.txtnew file+33
@@ -0,0 +1,33 @@
1+/= todo /ui/api/todo
2+
3+++ main (program init update view subs)
4+
5++$ model [todos=(list item.todo) draft=@t error=(unit @t)]
6++$ msg
7+ [%typed text=@t]
8+ %submit
9+ [%toggled id=@ud]
10+ [%got todos=(list item.todo)]
11+ [%acked err=(unit @t)]
12+
13+++ init |= ts=(list item.todo)
14+ [ts "" ~]
15+
16+++ update |= [=msg m=model]
17+ ?- msg
18+ [%typed t]
19+ ?- (gth (lent (tuba (trip t))) 80)
20+ %.y [m(draft=t error=`"Too long") ~]
21+ %.n [m(draft=t error=~) ~]
22+ %submit [m(draft="") ~[(poke.todo [%add draft.m] |=%acked)]]
23+ [%toggled id] [m ~[(poke.todo [%toggle id] |=%acked)]]
24+ [%got ts] [m(todos=ts) ~]
25+ [%acked err] [m(error=err) ~]
26+
27+++ subs |= m=model
28+ ~[[%watch (todos.todo |=%got)]]
29+
30+++ view init
31+
32+++ row-of |= t=item.todo
33+ [id.t (toggle done.t text.t [%toggled id.t])]
tests/type-todo-full/open-key.txtnew file+40
@@ -0,0 +1,40 @@
1+/= todo /ui/api/todo
2+
3+++ main (program init update view subs)
4+
5++$ model [todos=(list item.todo) draft=@t error=(unit @t)]
6++$ msg
7+ [%typed text=@t]
8+ %submit
9+ [%toggled id=@ud]
10+ [%got todos=(list item.todo)]
11+ [%acked err=(unit @t)]
12+
13+++ init |= ts=(list item.todo)
14+ [ts "" ~]
15+
16+++ update |= [=msg m=model]
17+ ?- msg
18+ [%typed t]
19+ ?- (gth (lent (tuba (trip t))) 80)
20+ %.y [m(draft=t error=`"Too long") ~]
21+ %.n [m(draft=t error=~) ~]
22+ %submit [m(draft="") ~[(poke.todo [%add draft.m] |=%acked)]]
23+ [%toggled id] [m ~[(poke.todo [%toggle id] |=%acked)]]
24+ [%got ts] [m(todos=ts) ~]
25+ [%acked err] [m(error=err) ~]
26+
27+++ subs |= m=model
28+ ~[[%watch (todos.todo |=%got)]]
29+
30+++ view |= m=model
31+ column ~[gap+%s2] ~[
32+ heading 2 "Todos"
33+ each (turn todos.m row-of)
34+ row ~[gap+%s1] ~[
35+ el ~[width+[%fill 1]] (field "New todo" draft.m |=%typed)
36+ button "Add" %submit
37+ el ~[tone+%danger] (text (fall error.m ""))
38+
39+++ row-of |= t=item.todo
40+ [!! (toggle done.t text.t [%toggled id.t])]
tests/type-todo-full/wrong-message.txtnew file+40
@@ -0,0 +1,40 @@
1+/= todo /ui/api/todo
2+
3+++ main (program init update view subs)
4+
5++$ model [todos=(list item.todo) draft=@t error=(unit @t)]
6++$ msg
7+ [%typed text=@t]
8+ %submit
9+ [%toggled id=@ud]
10+ [%got todos=(list item.todo)]
11+ [%acked err=(unit @t)]
12+
13+++ init |= ts=(list item.todo)
14+ [ts "" ~]
15+
16+++ update |= [=msg m=model]
17+ ?- msg
18+ [%typed t]
19+ ?- (gth (lent (tuba (trip t))) 80)
20+ %.y [m(draft=t error=`"Too long") ~]
21+ %.n [m(draft=t error=~) ~]
22+ %submit [m(draft="") ~[(poke.todo [%add draft.m] |=%acked)]]
23+ [%toggled id] [m ~[(poke.todo [%toggle id] |=%acked)]]
24+ [%got ts] [m(todos=ts) ~]
25+ [%acked err] [m(error=err) ~]
26+
27+++ subs |= m=model
28+ ~[[%watch (todos.todo |=%got)]]
29+
30+++ view |= m=model
31+ column ~[gap+%s2] ~[
32+ heading 2 "Todos"
33+ each (turn todos.m row-of)
34+ row ~[gap+%s1] ~[
35+ el ~[width+[%fill 1]] (field "New todo" draft.m |=%typed)
36+ button "Add" %submit
37+ el ~[tone+%danger] (text (fall error.m ""))
38+
39+++ row-of |= t=item.todo
40+ [id.t (toggle done.t text.t [%other])]
tests/type-todo-full/wrong-model.txtnew file+40
@@ -0,0 +1,40 @@
1+/= todo /ui/api/todo
2+
3+++ main (program init update view subs)
4+
5++$ model [todos=(list item.todo) draft=@t error=(unit @t)]
6++$ msg
7+ [%typed text=@t]
8+ %submit
9+ [%toggled id=@ud]
10+ [%got todos=(list item.todo)]
11+ [%acked err=(unit @t)]
12+
13+++ init |= ts=(list item.todo)
14+ [ts "" ~]
15+
16+++ update |= [=msg m=model]
17+ ?- msg
18+ [%typed t]
19+ ?- (gth (lent (tuba (trip t))) 80)
20+ %.y [m(draft=t error=`"Too long") ~]
21+ %.n [m(draft=t error=~) ~]
22+ %submit [m(draft="") ~[(poke.todo [%add draft.m] |=%acked)]]
23+ [%toggled id] [m ~[(poke.todo [%toggle id] |=%acked)]]
24+ [%got ts] [m(todos=ts) ~]
25+ [%acked err] [m(error=err) ~]
26+
27+++ subs |= m=[count=@ud]
28+ ~[[%watch (todos.todo |=%got)]]
29+
30+++ view |= m=model
31+ column ~[gap+%s2] ~[
32+ heading 2 "Todos"
33+ each (turn todos.m row-of)
34+ row ~[gap+%s1] ~[
35+ el ~[width+[%fill 1]] (field "New todo" draft.m |=%typed)
36+ button "Add" %submit
37+ el ~[tone+%danger] (text (fall error.m ""))
38+
39+++ row-of |= t=item.todo
40+ [id.t (toggle done.t text.t [%toggled id.t])]
tests/type-todo-full/wrong-result.txtnew file+40
@@ -0,0 +1,40 @@
1+/= todo /ui/api/todo
2+
3+++ main (program init update view subs)
4+
5++$ model [todos=(list item.todo) draft=@t error=(unit @t)]
6++$ msg
7+ [%typed text=@t]
8+ %submit
9+ [%toggled id=@ud]
10+ [%got todos=(list item.todo)]
11+ [%acked err=(unit @t)]
12+
13+++ init |= ts=(list item.todo)
14+ [ts "" ~]
15+
16+++ update |= [=msg m=model]
17+ ?- msg
18+ [%typed t]
19+ ?- (gth (lent (tuba (trip t))) 80)
20+ %.y [m(draft=t error=`"Too long") ~]
21+ %.n [m(draft=t error=~) ~]
22+ %submit [m(draft="") ~[(poke.todo [%add draft.m] |=%acked)]]
23+ [%toggled id] [m ~[(poke.todo [%toggle id] |=%acked)]]
24+ [%got ts] [m(todos=ts) ~]
25+ [%acked err] [m(error=err) ~]
26+
27+++ subs |= m=model
28+ ~[[%watch (todos.todo |=%got)]]
29+
30+++ view |= m=model
31+ column ~[gap+%s2] ~[
32+ heading 2 "Todos"
33+ each (turn todos.m row-of)
34+ row ~[gap+%s1] ~[
35+ el ~[width+[%fill 1]] (field "New todo" draft.m |=%typed)
36+ button "Add" %submit
37+ el ~[tone+%danger] (text (fall error.m ""))
38+
39+++ row-of |= t=item.todo
40+ text.t
tests/type-todo-full/wrong-watch.txtnew file+40
@@ -0,0 +1,40 @@
1+/= todo /ui/api/todo
2+
3+++ main (program init update view subs)
4+
5++$ model [todos=(list item.todo) draft=@t error=(unit @t)]
6++$ msg
7+ [%typed text=@t]
8+ %submit
9+ [%toggled id=@ud]
10+ [%got todos=(list item.todo)]
11+ [%acked err=(unit @t)]
12+
13+++ init |= ts=(list item.todo)
14+ [ts "" ~]
15+
16+++ update |= [=msg m=model]
17+ ?- msg
18+ [%typed t]
19+ ?- (gth (lent (tuba (trip t))) 80)
20+ %.y [m(draft=t error=`"Too long") ~]
21+ %.n [m(draft=t error=~) ~]
22+ %submit [m(draft="") ~[(poke.todo [%add draft.m] |=%acked)]]
23+ [%toggled id] [m ~[(poke.todo [%toggle id] |=%acked)]]
24+ [%got ts] [m(todos=ts) ~]
25+ [%acked err] [m(error=err) ~]
26+
27+++ subs |= m=model
28+ ~[[%watch (pure %submit)]]
29+
30+++ view |= m=model
31+ column ~[gap+%s2] ~[
32+ heading 2 "Todos"
33+ each (turn todos.m row-of)
34+ row ~[gap+%s1] ~[
35+ el ~[width+[%fill 1]] (field "New todo" draft.m |=%typed)
36+ button "Add" %submit
37+ el ~[tone+%danger] (text (fall error.m ""))
38+
39+++ row-of |= t=item.todo
40+ [id.t (toggle done.t text.t [%toggled id.t])]
tests/type-todo-partial/expected.txt+1−1
@@ -7,7 +7,7 @@ partial inference; module not checked
77++ update: branch tag or union context is not supported by partial inference
88++ subs: call constraint is not supported by partial inference
99++ view: name is not available to partial inference
10−++ row-of: name is not available to partial inference
10+++ row-of: tag needs context in partial inference
1111negative API imports
1212missing-mark: rejected
1313duplicate-mark: rejected
tests/type-union-source/mixed-source.txt+2−2
@@ -1,6 +1,6 @@
1−+$ element |$ [M]
1++$ node-tree |$ [M]
22 [%text value=@t]
3− [%node event=$-(@t M) children=(list (element M))]
3+ [%node event=$-(@t M) children=(list (node-tree M))]
44+$ tagged |$ [A] [%wrapped A]
55+$ choice
66 (tagged @t)
tools/testdata/ship-selftest+60
@@ -324,6 +324,15 @@ def generator_checks(tmp):
324324 'tests/lib/jibb-closed-gate-guards.hoon',
325325 'tests/lib/jibb-direct-gate-guards.hoon',
326326 'tests/lib/jibb-direct-gate-source.hoon',
327+ 'tests/lib/jibb-page-main.hoon',
328+ 'tests/lib/jibb-program-main.hoon',
329+ 'tests/lib/jibb-program-init.hoon',
330+ 'tests/lib/jibb-program-update.hoon',
331+ 'tests/lib/jibb-program-watch.hoon',
332+ 'tests/lib/jibb-store.hoon',
333+ 'tests/lib/jibb-todo-full.hoon',
334+ 'tests/lib/jibb-buttons.hoon',
335+ 'tests/lib/jibb-theme.hoon',
327336 'tests/lib/jibb-todo-api.hoon',
328337 'tests/lib/jibb-todo-partial.hoon',
329338 'tests/lib/jibb-constructor-fit-guards.hoon',
@@ -334,6 +343,7 @@ def generator_checks(tmp):
334343 'tests/lib/jibb-deferred.hoon',
335344 'tests/lib/jibb-deferred-resolver.hoon',
336345 'tests/lib/jibb-deferred-context.hoon',
346+ 'tests/lib/jibb-deferred-prepared.hoon',
337347 'tests/lib/jibb-cell-branch.hoon'}
338348 <= normal_tests, sorted(normal_tests))
339349 check('generic recursion source and golden are assembled',
@@ -383,12 +393,62 @@ def generator_checks(tmp):
383393 {f'tests/type-deferred-context/{name}.txt' for name in (
384394 'rich', 'plain', 'simple', 'missing', 'wrong', 'duplicate',
385395 'dangling', 'collision-early', 'collision-late', 'report')} <= set(normal.files))
396+ check('prepared initializer sources and exact reports are assembled',
397+ {f'tests/type-deferred-prepared/{name}.txt' for name in (
398+ 'good', 'tuple-only', 'wrong-unit', 'wrong-draft', 'unrelated-tag',
399+ 'mold-collision', 'no-final-cast', 'no-prelude', 'main',
400+ 'imported', 'expected', 'expected-control', 'expected-tuple-only')} <= set(normal.files))
386401 check('cell branch sources are assembled',
387402 {'tests/type-cell-branch/good.txt', 'tests/type-cell-branch/bad.txt'}
388403 <= set(normal.files))
389404 check('direct gate source and golden are assembled',
390405 {'tests/type-direct-gate/source.txt', 'tests/type-direct-gate/expected.txt'}
391406 <= set(normal.files))
407+ check('static and data page sources and shared fixture are assembled',
408+ {'tests/lib/jibb-page-main.hoon', 'tests/type-page-main/about.txt',
409+ *(f'tests/type-page-main/{name}.txt' for name in (
410+ 'static', 'blog-index', 'index', 'ctor-page', 'blog-api', 'card', 'blog-sur',
411+ 'posts-mark', 'todo-api', 'todo-island', 'wrong-static',
412+ 'arbitrary-main', 'page-alias', 'indirect-load', 'pure-load',
413+ 'hand-built-load', 'typed-load', 'diff-load'))}
414+ <= set(normal.files))
415+ check('program main sources and shared fixture are assembled',
416+ {f'tests/type-program-main/{name}.txt' for name in (
417+ 'source', 'consumer', 'gate-model', 'gate-data', 'nonempty-subs',
418+ 'mismatched-model', 'arbitrary-main', 'alias-main', 'open-message',
419+ 'initializer', 'initializer-consumer', 'initializer-unfaced',
420+ 'initializer-error', 'initializer-earlier', 'initializer-model',
421+ 'initializer-message', 'initializer-generic', 'initializer-missing',
422+ 'initializer-tag', 'initializer-no-main', 'initializer-subs')} <= set(normal.files))
423+ check('program update sources and shared fixture are assembled',
424+ {f'tests/type-program-update/{name}.txt' for name in (
425+ 'source', 'consumer', 'wrong-result', 'wrong-model', 'wrong-message',
426+ 'malformed-sample', 'three-slot-sample', 'non-main', 'unrelated-tag', 'missing-list')}
427+ <= set(normal.files))
428+ check('program watch shared fixture is assembled',
429+ {'tests/lib/jibb-program-watch.hoon', 'tests/type-program-watch/about.txt'}
430+ <= set(normal.files))
431+ check('unchanged cart store and basket fixtures are assembled',
432+ {'tests/lib/jibb-store.hoon', 'tests/type-store/cart.txt',
433+ 'tests/type-store/basket.txt'} <= set(normal.files))
434+ check('full todo sources and exact main report are assembled',
435+ {'tests/lib/jibb-todo-full.hoon', 'tests/type-gate-free/todo.txt',
436+ 'tests/type-api-paths/api.txt', 'tests/type-todo-full/expected.txt',
437+ *(f'tests/type-todo-full/{name}.txt' for name in (
438+ 'wrong-model', 'wrong-message', 'wrong-result', 'ambiguous-mapper',
439+ 'open-key', 'alias', 'wrong-watch', 'non-gate-view'))}
440+ <= set(normal.files))
441+ check('buttons sources, schemes and exact error are assembled',
442+ {'tests/lib/jibb-buttons.hoon',
443+ 'tests/golden/doc-grammar-02-buttons/source.jibb',
444+ 'tests/type-buttons/valid.txt', 'tests/type-buttons/expected.txt',
445+ 'tests/type-buttons/error.txt'} <= set(normal.files))
446+ check('theme sources and shared fixture are assembled',
447+ {'tests/lib/jibb-theme.hoon',
448+ *(f'tests/type-theme/{name}.txt' for name in (
449+ 'source', 'dark-absent', 'wrong-nested-aura', 'missing-field',
450+ 'wrong-font', 'wrong-dark'))}
451+ <= set(normal.files))
392452 check('todo partial golden and reused sources are assembled',
393453 {'tests/type-todo-partial/expected.txt', 'tests/type-gate-free/todo.txt',
394454 'tests/type-api-paths/api.txt'} <= set(normal.files))
tools/type-buttons-testnew file+40
@@ -0,0 +1,40 @@
1+#!/usr/bin/env python3
2+"""Check the documented buttons definitions and unresolved-tag error."""
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+parser.add_argument('--timeout', type=float, default=300,
13+ help='seconds allowed for urbit eval (default: 300)')
14+args = parser.parse_args()
15+tests = (root / 'tests/lib/jibb-buttons.hoon').read_text()
16+tests = tests[tests.index('\n|%\n') + 1:]
17+tests = tests[:tests.index('\n++ test-buttons')] + '\n--\n'
18+program = ('=/ jibb .\n=/ expected=wain (to-wain:format expected-text)\n'
19+ '=/ error=wain (to-wain:format error-text)\n=/ suite\n' + tests +
20+ '\n=/ failures=(list tape) (buttons-errors:suite prelude internal source valid)\n'
21+ '^- @t\n?~ failures \'documented buttons passed\'\n'
22+ '(of-wain:format (turn failures crip))\n')
23+with tempfile.TemporaryDirectory(prefix='jibb-buttons-') as tmp:
24+ path = Path(tmp) / 'buttons.hoon'
25+ path.write_text(program)
26+ command = [str(root / 'tools/hoon'), '--lib', args.lib, '--raw', '-f', str(path),
27+ '--timeout', str(args.timeout),
28+ '--cord', 'prelude=' + str(root / 'jibb-dev/lib/jibb/prelude.jibb'),
29+ '--cord', 'internal=' + str(root / 'jibb-dev/lib/jibb/internal.jibb'),
30+ '--cord', 'source=' + str(root / 'tests/golden/doc-grammar-02-buttons/source.jibb'),
31+ '--cord', 'valid=' + str(root / 'tests/type-buttons/valid.txt'),
32+ '--cord', 'expected-text=' + str(root / 'tests/type-buttons/expected.txt'),
33+ '--cord', 'error-text=' + str(root / 'tests/type-buttons/error.txt')]
34+ result = subprocess.run(command, stdout=subprocess.PIPE)
35+if result.returncode:
36+ sys.exit(result.returncode)
37+if result.stdout != b'documented buttons passed\n':
38+ sys.stderr.buffer.write(result.stdout)
39+ sys.exit(1)
40+print('documented buttons detailed/legacy types and exact unresolved-tag diagnostic passed')
tools/type-deferred-prepared-testnew file+49
@@ -0,0 +1,49 @@
1+#!/usr/bin/env python3
2+"""Evaluate prepared-prelude initializer recovery and report guards."""
3+from pathlib import Path
4+import argparse, subprocess, sys, tempfile
5+root = Path(__file__).resolve().parent.parent
6+p = argparse.ArgumentParser(description=__doc__)
7+p.add_argument('--lib', default=str(root/'jibb-dev/lib/jibb.hoon'))
8+p.add_argument('--hoon', default=str(root/'tools/hoon'))
9+a = p.parse_args()
10+core = (root / 'tests/lib/jibb-deferred-prepared.hoon').read_text()
11+core = core[core.index('\n|%\n') + 1:]
12+names = ['good', 'tuple-only', 'wrong-unit', 'wrong-draft', 'unrelated-tag', 'mold-collision',
13+ 'no-final-cast', 'no-prelude', 'main', 'imported', 'expected', 'expected-control',
14+ 'expected-tuple-only']
15+bindings = ''.join('=/ '+('main-source' if n == 'main' else n)+'=wain (to-wain:format '+n+'-text)\n' for n in names)
16+at = '/ui/prepared/jibb'
17+checks = ['(check-prepared:suite %s %s %s)' % (where, source, valid)
18+ for where, source, valid in (
19+ (at, 'good', '&'), (at, 'tuple-only', '&'), (at, 'no-prelude', '&'),
20+ (at, 'wrong-unit', '|'), (at, 'wrong-draft', '|'),
21+ (at, 'unrelated-tag', '|'), (at, 'mold-collision', '|'),
22+ (at, 'no-final-cast', '|'), (at, 'main-source', '|'),
23+ (at, 'imported', '|'),
24+ ('/ui/api/prepared/jibb', 'good', '|'),
25+ ('/ui/stores/prepared/jibb', 'good', '|'))]
26+checks += ['check-no-prelude:suite', 'check-ordinary:suite', 'check-prepared-binding:suite',
27+ '(check-report:suite good expected)', '(check-report:suite tuple-only expected-tuple-only)',
28+ '(check-report:suite no-final-cast expected-control)']
29+with tempfile.TemporaryDirectory(prefix='jibb-deferred-prepared-') as d:
30+ f = Path(d) / 'report.hoon'
31+ for check in checks:
32+ program = ('=/ jibb .\n' + bindings + '=/ suite\n' + core +
33+ "\n^- @t\n=/ checked=tang " + check + "\n?~ checked 'prepared deferred inference guards passed'\n(crip \"{<checked>}\")\n")
34+ f.write_text(program)
35+ cmd = [a.hoon, '--lib', a.lib, '--raw', '-f', str(f),
36+ '--cord', 'prelude='+str(root/'jibb-dev/lib/jibb/prelude.jibb'),
37+ '--cord', 'internal='+str(root/'jibb-dev/lib/jibb/internal.jibb')]
38+ for n in names:
39+ fixture = root/'tests/type-deferred-prepared'/(n+'.txt')
40+ if not fixture.is_file() or fixture.stat().st_size == 0:
41+ sys.exit('missing or empty fixture: '+str(fixture))
42+ cmd.extend(['--cord', n+'-text='+str(fixture)])
43+ got = subprocess.run(cmd, stdout=subprocess.PIPE)
44+ if got.returncode:
45+ sys.exit(got.returncode)
46+ if got.stdout != b'prepared deferred inference guards passed\n':
47+ sys.stderr.write(got.stdout.decode(errors='replace'))
48+ sys.exit(1)
49+print('prepared deferred inference guards passed')
tools/type-doc-examples-testnew file+49
@@ -0,0 +1,49 @@
1+#!/usr/bin/env python3
2+"""Fully check the remaining doc fragments in their intended contexts."""
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+parser.add_argument('--timeout', type=float, default=300,
13+ help='seconds allowed for urbit eval (default: 300)')
14+args = parser.parse_args()
15+tests = (root / 'tests/lib/jibb-doc-examples.hoon').read_text()
16+tests = tests[tests.index('\n|%\n') + 1:]
17+tests = tests[:tests.index('\n++ test-doc-examples')] + '\n--\n'
18+program = ('=/ jibb .\n=/ jibb-import\n' +
19+ (root / 'jibb-dev/lib/jibb-import.hoon').read_text() +
20+ '=/ suite\n' + tests +
21+ '\n=/ failures=(list tape) (doc-examples-errors:suite prelude internal imports view-day step cmd-sub todo-sur todo-action blog-sur card)\n'
22+ '^- @t\n?~ failures \'documented fragments passed\'\n'
23+ '(of-wain:format (turn failures crip))\n')
24+fixtures = {
25+ 'prelude': 'jibb-dev/lib/jibb/prelude.jibb',
26+ 'internal': 'jibb-dev/lib/jibb/internal.jibb',
27+ 'imports': 'tests/golden/doc-grammar-01-imports/source.jibb',
28+ 'view-day': 'tests/golden/doc-grammar-03-view-day/source.jibb',
29+ 'step': 'tests/golden/doc-grammar-04-step/source.jibb',
30+ 'cmd-sub': 'tests/golden/doc-overview-01-cmd-sub/source.jibb',
31+ 'todo-sur': 'tests/type-api-paths/todo-sur.txt',
32+ 'todo-action': 'tests/type-api-paths/todo-action.txt',
33+ 'blog-sur': 'tests/type-page-main/blog-sur.txt',
34+ 'card': 'tests/type-page-main/card.txt',
35+}
36+with tempfile.TemporaryDirectory(prefix='jibb-doc-examples-') as tmp:
37+ path = Path(tmp) / 'doc-examples.hoon'
38+ path.write_text(program)
39+ command = [str(root / 'tools/hoon'), '--lib', args.lib, '--raw', '-f', str(path),
40+ '--timeout', str(args.timeout)]
41+ for name, filename in fixtures.items():
42+ command += ['--cord', name + '=' + str(root / filename)]
43+ result = subprocess.run(command, stdout=subprocess.PIPE)
44+if result.returncode:
45+ sys.exit(result.returncode)
46+if result.stdout != b'documented fragments passed\n':
47+ sys.stderr.buffer.write(result.stdout)
48+ sys.exit(1)
49+print('documented imports, view-day, step and cmd/sub detailed/legacy checks passed')
tools/type-page-main-testnew file+86
@@ -0,0 +1,86 @@
1+#!/usr/bin/env python3
2+"""Check static and direct data pages through real readers 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+parser.add_argument('--timeout', type=float, default=600,
13+ help='seconds allowed for urbit eval (default: 600)')
14+args = parser.parse_args()
15+for fixture, actual in (
16+ ('tests/type-page-main/static.txt', 'my-app/ui/about.jibb'),
17+ ('tests/type-page-main/blog-index.txt', 'my-app/ui/blog/index.jibb'),
18+ ('tests/type-page-main/index.txt', 'my-app/ui/index.jibb'),
19+ ('tests/type-page-main/blog-api.txt', 'my-app/ui/api/blog.jibb'),
20+ ('tests/type-page-main/card.txt', 'my-app/ui/components/card.jibb'),
21+ ('tests/type-page-main/blog-sur.txt', 'my-app/sur/blog.hoon'),
22+ ('tests/type-page-main/todo-api.txt', 'my-app/ui/api/todo.jibb'),
23+ ('tests/type-page-main/todo-island.txt', 'my-app/ui/todo-list.jibb')):
24+ if (root / fixture).read_bytes() != (root / actual).read_bytes():
25+ sys.exit(f'{fixture} differs from {actual}')
26+# As with the todo readers, eval supplies the imported core in the subject;
27+# only the Ford import line is removed from the real mark source.
28+posts = (root / 'my-app/mar/posts.hoon').read_bytes().replace(b'/- blog\n', b'', 1)
29+if (root / 'tests/type-page-main/posts-mark.txt').read_bytes() != posts:
30+ sys.exit('posts reader fixture differs from my-app/mar/posts.hoon without /- blog')
31+reader = (root / 'jibb-dev/lib/jibb-import.hoon').read_text()
32+tests = (root / 'tests/lib/jibb-page-main.hoon').read_text()
33+tests = tests[tests.index('\n|%\n') + 1:]
34+fixtures = {
35+ 'sur': 'tests/type-api-paths/todo-sur.txt',
36+ 'action': 'tests/type-api-paths/todo-action.txt',
37+ 'todos': 'tests/type-api-paths/todos.txt',
38+ 'update': 'tests/type-api-paths/todo-update.txt',
39+ 'item': 'tests/type-api-paths/todo-item.txt',
40+ **{name: f'tests/type-page-main/{name}.txt' for name in (
41+ 'todo-api', 'todo-island', 'blog-sur', 'posts', 'blog-api',
42+ 'card', 'static', 'blog-index', 'index', 'ctor-page', 'wrong-static',
43+ 'arbitrary-main', 'page-alias', 'indirect-load', 'pure-load',
44+ 'hand-built-load', 'typed-load', 'diff-load')},
45+}
46+fixtures['posts'] = 'tests/type-page-main/posts-mark.txt'
47+# The Hoon face for the static source is about; its metadata remains about.txt.
48+cords = dict(fixtures)
49+cords['about'] = cords.pop('static')
50+prefix = ('=/ jibb .\n=/ jibb-import\n' + reader + '\n' +
51+ ''.join('=/ ' + name + '=wain (to-wain:format ' + name + '-text)\n'
52+ for name in cords) + '=/ suite\n' + tests)
53+negative_names = ('wrong-static', 'arbitrary-main', 'page-alias',
54+ 'indirect-load', 'pure-load', 'hand-built-load',
55+ 'typed-load', 'diff-load')
56+negative_labels = ('wrong static message', 'arbitrary main', 'page alias',
57+ 'indirect load', 'pure load', 'hand-built load',
58+ 'typed load', 'diff load')
59+negatives = ''.join(f" ['{label}' (text:suite {name})]\n"
60+ for label, name in zip(negative_labels, negative_names))
61+ordered = ('sur', 'action', 'todos', 'update', 'item', 'todo-api',
62+ 'todo-island', 'blog-sur', 'posts', 'blog-api', 'card',
63+ 'about', 'blog-index', 'index', 'ctor-page')
64+arguments = ' '.join(f'(text:suite {name})' for name in ordered)
65+expression = (prefix + '\n=/ negatives=(list [label=@t src=@t])\n :~\n' +
66+ negatives + ' ==\n' +
67+ '=/ failures=(list tape) (page-main-errors:suite prelude internal ' +
68+ arguments + ' negatives)\n^- @t\n'
69+ "?~ failures 'static and direct data-page checks passed'\n"
70+ '(of-wain:format (turn failures crip))\n')
71+with tempfile.TemporaryDirectory(prefix='jibb-page-main-') as tmp:
72+ path = Path(tmp) / 'page-main.hoon'
73+ path.write_text(expression)
74+ command = [str(root / 'tools/hoon'), '--lib', args.lib, '--raw', '-f', str(path),
75+ '--timeout', str(args.timeout),
76+ '--cord', 'prelude=' + str(root / 'jibb-dev/lib/jibb/prelude.jibb'),
77+ '--cord', 'internal=' + str(root / 'jibb-dev/lib/jibb/internal.jibb')]
78+ for name, filename in cords.items():
79+ command += ['--cord', name + '-text=' + str(root / filename)]
80+ result = subprocess.run(command, stdout=subprocess.PIPE)
81+if result.returncode:
82+ sys.exit(result.returncode)
83+if result.stdout != b'static and direct data-page checks passed\n':
84+ sys.stderr.buffer.write(result.stdout)
85+ sys.exit(1)
86+print('byte-identical static/data pages, exact types, imports and negatives passed')
tools/type-program-init-testnew file+49
@@ -0,0 +1,49 @@
1+#!/usr/bin/env python3
2+"""Run transactional direct-program initializer context checks 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+
14+def body(name):
15+ text = (root / 'tests/lib' / name).read_text()
16+ return text[text.index('\n|%\n') + 1:]
17+
18+names = ('initializer', 'initializer-consumer', 'initializer-unfaced',
19+ 'initializer-error', 'initializer-earlier', 'initializer-model',
20+ 'initializer-message', 'initializer-generic', 'initializer-missing',
21+ 'initializer-tag', 'initializer-no-main', 'initializer-subs')
22+expression = ('=/ jibb .\n=/ prelude=@t prelude-text\n'
23+ '=/ internal=@t internal-text\n' +
24+ ''.join('=/ ' + name + '=wain (to-wain:format ' + name + '-text)\n'
25+ for name in names) +
26+ '=/ suite\n' + body('jibb-program-init.hoon') +
27+ '\n=/ negatives=(list @t)\n :~ (text:suite initializer-error)\n'
28+ ' (text:suite initializer-earlier)\n (text:suite initializer-model)\n'
29+ ' (text:suite initializer-message)\n (text:suite initializer-generic)\n'
30+ ' (text:suite initializer-missing)\n (text:suite initializer-tag)\n'
31+ ' (text:suite initializer-no-main)\n (text:suite initializer-subs)\n ==\n'
32+ '=/ failures=(list tape) (program-init-errors:suite prelude internal (text:suite initializer) (text:suite initializer-consumer) (text:suite initializer-unfaced) negatives)\n'
33+ '^- @t\n?~ failures \'program initializer checks passed\'\n'
34+ '(of-wain:format (turn failures crip))\n')
35+with tempfile.TemporaryDirectory(prefix='jibb-program-init-') as tmp:
36+ program = Path(tmp) / 'program-init.hoon'
37+ program.write_text(expression)
38+ command = [str(root / 'tools/hoon'), '--lib', args.lib, '--raw', '-f', str(program),
39+ '--cord', 'prelude-text=' + str(root / 'jibb-dev/lib/jibb/prelude.jibb'),
40+ '--cord', 'internal-text=' + str(root / 'jibb-dev/lib/jibb/internal.jibb')]
41+ for name in names:
42+ command += ['--cord', name + '-text=' + str(root / 'tests/type-program-main' / (name + '.txt'))]
43+ result = subprocess.run(command, stdout=subprocess.PIPE)
44+if result.returncode:
45+ sys.exit(result.returncode)
46+if result.stdout != b'program initializer checks passed\n':
47+ sys.stderr.buffer.write(result.stdout)
48+ sys.exit(1)
49+print('transactional direct-program initializer context guards passed')
tools/type-program-main-testnew file+46
@@ -0,0 +1,46 @@
1+#!/usr/bin/env python3
2+"""Run the shared closed program-main checks 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+
14+def body(name):
15+ text = (root / 'tests/lib' / name).read_text()
16+ return text[text.index('\n|%\n') + 1:]
17+
18+names = ('source', 'consumer', 'gate-model', 'gate-data', 'nonempty-subs',
19+ 'mismatched-model', 'arbitrary-main', 'alias-main', 'open-message')
20+expression = ('=/ jibb .\n=/ prelude=@t prelude-text\n'
21+ '=/ internal=@t internal-text\n' +
22+ ''.join('=/ ' + name + '=wain (to-wain:format ' + name + '-text)\n'
23+ for name in names) +
24+ '=/ expected=wain ~\n=/ suite\n' + body('jibb-program-main.hoon') +
25+ '\n=/ negatives=(list @t)\n :~ (text:suite gate-model)\n'
26+ ' (text:suite gate-data)\n (text:suite nonempty-subs)\n'
27+ ' (text:suite mismatched-model)\n (text:suite arbitrary-main)\n'
28+ ' (text:suite alias-main)\n (text:suite open-message)\n ==\n'
29+ '=/ failures=(list tape) (program-main-errors:suite prelude internal (text:suite source) (text:suite consumer) negatives)\n'
30+ '^- @t\n?~ failures \'program main checks passed\'\n'
31+ '(of-wain:format (turn failures crip))\n')
32+with tempfile.TemporaryDirectory(prefix='jibb-program-main-') as tmp:
33+ program = Path(tmp) / 'program-main.hoon'
34+ program.write_text(expression)
35+ command = [str(root / 'tools/hoon'), '--lib', args.lib, '--raw', '-f', str(program),
36+ '--cord', 'prelude-text=' + str(root / 'jibb-dev/lib/jibb/prelude.jibb'),
37+ '--cord', 'internal-text=' + str(root / 'jibb-dev/lib/jibb/internal.jibb')]
38+ for name in names:
39+ command += ['--cord', name + '-text=' + str(root / 'tests/type-program-main' / (name + '.txt'))]
40+ result = subprocess.run(command, stdout=subprocess.PIPE)
41+if result.returncode:
42+ sys.exit(result.returncode)
43+if result.stdout != b'program main checks passed\n':
44+ sys.stderr.buffer.write(result.stdout)
45+ sys.exit(1)
46+print('closed program-main interface and rejection guards passed')
tools/type-program-update-testnew file+46
@@ -0,0 +1,46 @@
1+#!/usr/bin/env python3
2+"""Run transactional direct-program update context checks 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+
14+def body(name):
15+ text = (root / 'tests/lib' / name).read_text()
16+ return text[text.index('\n|%\n') + 1:]
17+
18+names = ('source', 'consumer', 'wrong-result', 'wrong-model', 'wrong-message',
19+ 'malformed-sample', 'three-slot-sample', 'non-main', 'unrelated-tag', 'missing-list')
20+expression = ('=/ jibb .\n=/ prelude=@t prelude-text\n'
21+ '=/ internal=@t internal-text\n' +
22+ ''.join('=/ ' + name + '=wain (to-wain:format ' + name + '-text)\n'
23+ for name in names) +
24+ '=/ suite\n' + body('jibb-program-update.hoon') +
25+ '\n=/ negatives=(list @t)\n :~ (text:suite wrong-result)\n'
26+ ' (text:suite wrong-model)\n (text:suite wrong-message)\n'
27+ ' (text:suite malformed-sample)\n (text:suite three-slot-sample)\n'
28+ ' (text:suite non-main)\n (text:suite unrelated-tag)\n (text:suite missing-list)\n ==\n'
29+ '=/ failures=(list tape) (program-update-errors:suite prelude internal (text:suite source) (text:suite consumer) negatives)\n'
30+ '^- @t\n?~ failures \'program update checks passed\'\n'
31+ '(of-wain:format (turn failures crip))\n')
32+with tempfile.TemporaryDirectory(prefix='jibb-program-update-') as tmp:
33+ program = Path(tmp) / 'program-update.hoon'
34+ program.write_text(expression)
35+ command = [str(root / 'tools/hoon'), '--lib', args.lib, '--raw', '-f', str(program),
36+ '--cord', 'prelude-text=' + str(root / 'jibb-dev/lib/jibb/prelude.jibb'),
37+ '--cord', 'internal-text=' + str(root / 'jibb-dev/lib/jibb/internal.jibb')]
38+ for name in names:
39+ command += ['--cord', name + '-text=' + str(root / 'tests/type-program-update' / (name + '.txt'))]
40+ result = subprocess.run(command, stdout=subprocess.PIPE)
41+if result.returncode:
42+ sys.exit(result.returncode)
43+if result.stdout != b'program update checks passed\n':
44+ sys.stderr.buffer.write(result.stdout)
45+ sys.exit(1)
46+print('transactional direct-program update context guards passed')
tools/type-program-watch-testnew file+48
@@ -0,0 +1,48 @@
1+#!/usr/bin/env python3
2+"""Run direct request-value watchability checks 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+fixture = root / 'tests/type-api-paths/api.txt'
14+actual = root / 'my-app/ui/api/todo.jibb'
15+if fixture.read_bytes() != actual.read_bytes():
16+ sys.exit('todo API fixture differs from my-app/ui/api/todo.jibb')
17+reader = (root / 'jibb-dev/lib/jibb-import.hoon').read_text()
18+tests = (root / 'tests/lib/jibb-program-watch.hoon').read_text()
19+tests = tests[tests.index('\n|%\n') + 1:]
20+names = ('sur', 'action', 'todos', 'update', 'item', 'api')
21+program = ('=/ jibb .\n=/ jibb-import\n' + reader + '\n' +
22+ ''.join('=/ ' + name + '=wain (to-wain:format ' + name + '-text)\n'
23+ for name in names) +
24+ '=/ suite\n' + tests +
25+ '\n=/ failures=(list tape) (program-watch-errors:suite prelude internal (text:suite sur) (text:suite action) (text:suite todos) (text:suite update) (text:suite item) (text:suite api))\n'
26+ '^- @t\n?~ failures \'program request-value watchability passed\'\n'
27+ '(of-wain:format (turn failures crip))\n')
28+fixtures = {'sur': 'tests/type-api-paths/todo-sur.txt',
29+ 'action': 'tests/type-api-paths/todo-action.txt',
30+ 'todos': 'tests/type-api-paths/todos.txt',
31+ 'update': 'tests/type-api-paths/todo-update.txt',
32+ 'item': 'tests/type-api-paths/todo-item.txt',
33+ 'api': 'tests/type-api-paths/api.txt'}
34+with tempfile.TemporaryDirectory(prefix='jibb-program-watch-') as tmp:
35+ path = Path(tmp) / 'program-watch.hoon'
36+ path.write_text(program)
37+ command = [str(root / 'tools/hoon'), '--lib', args.lib, '--raw', '-f', str(path),
38+ '--cord', 'prelude=' + str(root / 'jibb-dev/lib/jibb/prelude.jibb'),
39+ '--cord', 'internal=' + str(root / 'jibb-dev/lib/jibb/internal.jibb')]
40+ for name, filename in fixtures.items():
41+ command += ['--cord', name + '-text=' + str(root / filename)]
42+ result = subprocess.run(command, stdout=subprocess.PIPE)
43+if result.returncode:
44+ sys.exit(result.returncode)
45+if result.stdout != b'program request-value watchability passed\n':
46+ sys.stderr.buffer.write(result.stdout)
47+ sys.exit(1)
48+print('direct request-value watchability and rejection guards passed')
tools/type-store-testnew file+41
@@ -0,0 +1,41 @@
1+#!/usr/bin/env python3
2+"""Check the unchanged cart store and basket 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+parser.add_argument('--timeout', type=float, default=300,
13+ help='seconds allowed for urbit eval (default: 300)')
14+args = parser.parse_args()
15+for fixture, actual in (('tests/type-store/cart.txt', 'my-app/ui/stores/cart.jibb'),
16+ ('tests/type-store/basket.txt', 'my-app/ui/basket.jibb')):
17+ if (root / fixture).read_bytes() != (root / actual).read_bytes():
18+ sys.exit(f'{fixture} differs from {actual}')
19+tests = (root / 'tests/lib/jibb-store.hoon').read_text()
20+tests = tests[tests.index('\n|%\n') + 1:]
21+tests = tests[:tests.index('\n++ test-store')] + '\n--\n'
22+program = ('=/ jibb .\n=/ suite\n' + tests +
23+ '\n=/ failures=(list tape) (store-errors:suite prelude internal cart basket)\n'
24+ '^- @t\n?~ failures \'unchanged cart store and basket passed\'\n'
25+ '(of-wain:format (turn failures crip))\n')
26+with tempfile.TemporaryDirectory(prefix='jibb-store-') as tmp:
27+ path = Path(tmp) / 'store.hoon'
28+ path.write_text(program)
29+ command = [str(root / 'tools/hoon'), '--lib', args.lib, '--raw', '-f', str(path),
30+ '--timeout', str(args.timeout),
31+ '--cord', 'prelude=' + str(root / 'jibb-dev/lib/jibb/prelude.jibb'),
32+ '--cord', 'internal=' + str(root / 'jibb-dev/lib/jibb/internal.jibb'),
33+ '--cord', 'cart=' + str(root / 'tests/type-store/cart.txt'),
34+ '--cord', 'basket=' + str(root / 'tests/type-store/basket.txt')]
35+ result = subprocess.run(command, stdout=subprocess.PIPE)
36+if result.returncode:
37+ sys.exit(result.returncode)
38+if result.stdout != b'unchanged cart store and basket passed\n':
39+ sys.stderr.buffer.write(result.stdout)
40+ sys.exit(1)
41+print('unchanged cart/basket detailed/legacy, schemes, imports, watch evidence and negatives passed')
tools/type-theme-testnew file+44
@@ -0,0 +1,44 @@
1+#!/usr/bin/env python3
2+"""Fully check the byte-identical real theme and its mold 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+parser.add_argument('--timeout', type=float, default=300,
13+ help='seconds allowed for urbit eval (default: 300)')
14+args = parser.parse_args()
15+if (root / 'tests/type-theme/source.txt').read_bytes() != (root / 'my-app/ui/theme.jibb').read_bytes():
16+ sys.exit('tests/type-theme/source.txt differs from my-app/ui/theme.jibb')
17+tests = (root / 'tests/lib/jibb-theme.hoon').read_text()
18+tests = tests[tests.index('\n|%\n') + 1:]
19+names = ('source', 'dark-absent', 'wrong-nested-aura', 'missing-field',
20+ 'wrong-font', 'wrong-dark')
21+prefix = ('=/ jibb .\n' +
22+ ''.join('=/ ' + name + '=wain (to-wain:format ' + name + '-text)\n'
23+ for name in names) + '=/ suite\n' + tests)
24+arguments = ' '.join(f'(text:suite {name})' for name in names)
25+expression = (prefix + '\n=/ failures=(list tape) (theme-errors:suite prelude internal ' +
26+ arguments + ')\n^- @t\n' +
27+ "?~ failures 'theme checks passed'\n" +
28+ '(of-wain:format (turn failures crip))\n')
29+with tempfile.TemporaryDirectory(prefix='jibb-theme-') as tmp:
30+ path = Path(tmp) / 'theme.hoon'
31+ path.write_text(expression)
32+ command = [str(root / 'tools/hoon'), '--lib', args.lib, '--raw', '-f', str(path),
33+ '--timeout', str(args.timeout),
34+ '--cord', 'prelude=' + str(root / 'jibb-dev/lib/jibb/prelude.jibb'),
35+ '--cord', 'internal=' + str(root / 'jibb-dev/lib/jibb/internal.jibb')]
36+ for name in names:
37+ command += ['--cord', name + '-text=' + str(root / f'tests/type-theme/{name}.txt')]
38+ result = subprocess.run(command, stdout=subprocess.PIPE)
39+if result.returncode:
40+ sys.exit(result.returncode)
41+if result.stdout != b'theme checks passed\n':
42+ sys.stderr.buffer.write(result.stdout)
43+ sys.exit(1)
44+print('byte-identical theme, exact type, structural import and negatives passed')
tools/type-todo-full-testnew file+98
@@ -0,0 +1,98 @@
1+#!/usr/bin/env python3
2+"""Check the byte-identical full todo island through real readers."""
3+from pathlib import Path
4+import argparse
5+import difflib
6+import subprocess
7+import sys
8+import tempfile
9+
10+root = Path(__file__).resolve().parent.parent
11+parser = argparse.ArgumentParser(description=__doc__)
12+parser.add_argument('--lib', default=str(root / 'jibb-dev/lib/jibb.hoon'))
13+parser.add_argument('--timeout', type=float, default=300,
14+ help='seconds allowed for each urbit eval (default: 300)')
15+args = parser.parse_args()
16+for fixture, actual in (('tests/type-gate-free/todo.txt', 'my-app/ui/todo-list.jibb'),
17+ ('tests/type-api-paths/api.txt', 'my-app/ui/api/todo.jibb')):
18+ if (root / fixture).read_bytes() != (root / actual).read_bytes():
19+ sys.exit(f'{fixture} differs from {actual}')
20+reader = (root / 'jibb-dev/lib/jibb-import.hoon').read_text()
21+tests = (root / 'tests/lib/jibb-todo-full.hoon').read_text()
22+tests = tests[tests.index('\n|%\n') + 1:]
23+report_at = tests.index('\n++ todo-full-report')
24+legacy_at = tests.index('\n++ todo-full-legacy-report')
25+import_at = tests.index('\n++ todo-full-import-report')
26+negative_at = tests.index('\n++ todo-full-negative-report')
27+test_at = tests.index('\n++ test-todo-full')
28+shared = tests[:report_at]
29+suites = {'detailed': shared + tests[report_at:legacy_at] + '\n--\n',
30+ 'legacy': shared + tests[legacy_at:import_at] + '\n--\n',
31+ 'import': shared + tests[import_at:negative_at] + '\n--\n',
32+ 'negative': shared + tests[negative_at:test_at] + '\n--\n'}
33+names = ('sur', 'action', 'todos', 'update', 'item', 'api', 'source',
34+ 'wrong-model', 'wrong-message', 'wrong-result', 'ambiguous-mapper',
35+ 'open-key', 'alias', 'wrong-watch', 'non-gate-view', 'expected')
36+prefix = ('=/ jibb .\n=/ jibb-import\n' + reader + '\n' +
37+ ''.join('=/ ' + name + '=wain (to-wain:format ' + name + '-text)\n'
38+ for name in names) + '=/ suite\n')
39+fixtures = {'sur': 'tests/type-api-paths/todo-sur.txt',
40+ 'action': 'tests/type-api-paths/todo-action.txt',
41+ 'todos': 'tests/type-api-paths/todos.txt',
42+ 'update': 'tests/type-api-paths/todo-update.txt',
43+ 'item': 'tests/type-api-paths/todo-item.txt',
44+ 'api': 'tests/type-api-paths/api.txt',
45+ 'source': 'tests/type-gate-free/todo.txt',
46+ **{name: f'tests/type-todo-full/{name}.txt'
47+ for name in ('wrong-model', 'wrong-message', 'wrong-result',
48+ 'ambiguous-mapper', 'open-key', 'alias', 'wrong-watch', 'non-gate-view')},
49+ 'expected': 'tests/type-todo-full/expected.txt'}
50+
51+def evaluate(expression, kind):
52+ print('running ' + expression.split(':', 1)[0].removeprefix('(todo-full-'), file=sys.stderr, flush=True)
53+ with tempfile.TemporaryDirectory(prefix='jibb-todo-full-') as tmp:
54+ path = Path(tmp) / 'todo.hoon'
55+ path.write_text(prefix + suites[kind] + '\n^- @t\n' + expression + '\n')
56+ command = [str(root / 'tools/hoon'), '--lib', args.lib, '--raw', '-f', str(path),
57+ '--timeout', str(args.timeout),
58+ '--cord', 'prelude=' + str(root / 'jibb-dev/lib/jibb/prelude.jibb'),
59+ '--cord', 'internal=' + str(root / 'jibb-dev/lib/jibb/internal.jibb')]
60+ for name, filename in fixtures.items():
61+ command += ['--cord', name + '-text=' + str(root / filename)]
62+ result = subprocess.run(command, stdout=subprocess.PIPE)
63+ if result.returncode:
64+ sys.exit(result.returncode)
65+ return result.stdout
66+
67+actual = evaluate('(todo-full-report:suite prelude internal sur-text action-text todos-text update-text item-text api-text source-text)', 'detailed')
68+expected = (root / 'tests/type-todo-full/expected.txt').read_bytes()
69+if actual != expected:
70+ sys.stderr.writelines(difflib.unified_diff(
71+ expected.decode().splitlines(keepends=True),
72+ actual.decode().splitlines(keepends=True),
73+ fromfile='expected.txt', tofile='actual'))
74+ sys.exit('full todo report differs')
75+legacy = evaluate('(todo-full-legacy-report:suite prelude internal sur-text action-text todos-text update-text item-text api-text source-text)', 'legacy')
76+if legacy != expected:
77+ sys.stderr.writelines(difflib.unified_diff(
78+ expected.decode().splitlines(keepends=True),
79+ legacy.decode().splitlines(keepends=True),
80+ fromfile='expected.txt', tofile='legacy'))
81+ sys.exit('legacy full todo report differs')
82+imported = evaluate('(todo-full-import-report:suite prelude internal sur-text action-text todos-text update-text item-text api-text source-text)', 'import')
83+if imported != b'downstream import accepted\n':
84+ sys.stderr.buffer.write(imported)
85+ sys.exit('downstream full todo import differs')
86+for name, label in (('wrong-model', 'wrong model'),
87+ ('wrong-message', 'wrong message'),
88+ ('wrong-result', 'wrong result'),
89+ ('ambiguous-mapper', 'ambiguous mapper'),
90+ ('open-key', 'open key'),
91+ ('alias', 'mapper alias'),
92+ ('wrong-watch', 'wrong watch'),
93+ ('non-gate-view', 'non-gate view')):
94+ actual = evaluate(f"(todo-full-negative-report:suite prelude internal sur-text action-text todos-text update-text item-text api-text '{label}' {name}-text)", 'negative')
95+ if actual != f'{label}: rejected\n'.encode():
96+ sys.stderr.buffer.write(actual)
97+ sys.exit(f'{label} was not rejected')
98+print('byte-identical full todo detailed/legacy, types, graph, import and negatives passed')