on 2826c93 help sign in
.github/workflows/check.ymldeleted−22
since splitsnapshots
unifiedsplit
@@ -1,22 +0,0 @@
1−# The eval checks on every push to master and every pull request:
2−# the flake builds the desks and runs `tools/check --group eval` in the
3−# Nix sandbox (see flake.nix). The ship checks need a fake ~zod and run
4−# before pushing, as docs/development.md says.
5−name: check
6−
7−on:
8− push:
9− branches: [master]
10− pull_request:
11− workflow_dispatch:
12−
13−jobs:
14− eval:
15− name: desks and eval checks
16− runs-on: ubuntu-latest
17− timeout-minutes: 120
18− steps:
19− - uses: actions/checkout@v4
20− - uses: cachix/install-nix-action@v31
21− - name: Build the desks and run the eval checks
22− run: nix build --print-build-logs .#checks.x86_64-linux.desks .#checks.x86_64-linux.eval
.gitignore−2
@@ -1,4 +1,2 @@
1__pycache__/
1__pycache__/
2*.pyc
2*.pyc
3−result
4−result-*
LICENSEdeleted−21
@@ -1,21 +0,0 @@
1−MIT License
2−
3−Copyright (c) 2026 the Jibb authors
4−
5−Permission is hereby granted, free of charge, to any person obtaining a copy
6−of this software and associated documentation files (the "Software"), to deal
7−in the Software without restriction, including without limitation the rights
8−to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9−copies of the Software, and to permit persons to whom the Software is
10−furnished to do so, subject to the following conditions:
11−
12−The above copyright notice and this permission notice shall be included in all
13−copies or substantial portions of the Software.
14−
15−THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16−IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17−FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18−AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19−LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20−OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21−SOFTWARE.
README.md+4−37
@@ -1,6 +1,6 @@
1# Jibb
1# Jibb
2
2
3−Jibb is a UI language for Urbit: a Hoon dialect with an indentation layout. Its design doc, [Jibb — an Elm-architecture UI language for Urbit](https://claude.ai/artifact/DMBr48qzi5z8hcwn2ccPBv), is the spec. Its copy in [docs/spec/](docs/spec/) records decisions the doc doesn't have yet, so until the doc is synced, that copy wins where it and the doc differ, and where this code and the spec disagree, the spec wins.
3+Jibb is a UI language for Urbit: a Hoon dialect with an indentation layout. Its design doc, [Jibb — an Elm-architecture UI language for Urbit](https://claude.ai/artifact/DMBr48qzi5z8hcwn2ccPBv), is the spec, and where this code and the doc disagree, the doc wins.
4
4
5Milestone 1 of the doc's eight, the parser and the `%jibb` mark, is done; milestone 2, types and prelude, is in progress. The type checker and Hoon importer are partial. [docs/](docs/) holds a copy of the doc's tabs, the status of each milestone, the open questions, a development guide, a map of the compiler, and the brief for milestone 2.
5Milestone 1 of the doc's eight, the parser and the `%jibb` mark, is done; milestone 2, types and prelude, is in progress. The type checker and Hoon importer are partial. [docs/](docs/) holds a copy of the doc's tabs, the status of each milestone, the open questions, a development guide, a map of the compiler, and the brief for milestone 2.
6
6
@@ -11,26 +11,9 @@ Milestone 1 of the doc's eight, the parser and the `%jibb` mark, is done; milest
11- `my-app/`: an example app desk built from the doc's worked examples.
11- `my-app/`: an example app desk built from the doc's worked examples.
12- `vendor/`: pinned copies of the base-dev and landscape files the desks need.
12- `vendor/`: pinned copies of the base-dev and landscape files the desks need.
13- `tests/`: golden cases in `golden/<case>/`, and on-ship tests for the `-test` thread in `lib/jibb.hoon`.
13- `tests/`: golden cases in `golden/<case>/`, and on-ship tests for the `-test` thread in `lib/jibb.hoon`.
14−- `tools/`: dev tooling: `golden`, `hoon` and `doc-blocks`, with their self-test in `testdata/`, `ship`, and `check`, which runs every check.
14+- `tools/`: dev tooling: `golden`, `hoon` and `doc-blocks`, with their self-test in `testdata/`, and `ship`.
15- `docs/`: the doc's tabs as Markdown in `spec/`, the status, the open questions, the development guide, the compiler's map, and briefs for milestones in `prompts/`.
15- `docs/`: the doc's tabs as Markdown in `spec/`, the status, the open questions, the development guide, the compiler's map, and briefs for milestones in `prompts/`.
16
16
17−## Building and checking with Nix
18−
19−The flake (`flake.nix`, pinned by `flake.lock`) builds the desks and runs every check, with vere 4.6, Python 3, click and the brass pill pinned:
20−
21−```
22−nix build # result/my-app, result/jibb, result/jibb-dev: the desks
23−nix flake check # every check: the eval group and, on Linux, the ship group on a fresh fake ~zod
24−nix develop # a shell with urbit, python3 and click, for running the tools by hand
25−nix build .#fakezod # a freshly booted fake ~zod pier (Linux)
26−```
27−
28−Jibb has no native binary: what it ships is desks, Hoon and Jibb source that a ship builds. So `nix build` writes the three desks exactly as `tools/ship sync` would commit them (it runs `tools/ship assemble`), and compiles `jibb.hoon` and `jibb-import.hoon` under `urbit eval` to check that they build.
29−
30−`nix flake check` builds that too, then runs `tools/check --group eval` and, on Linux, `tools/check --group ship` against a copy of a fake ~zod it boots from the pill. Everything runs in the Nix sandbox without network, so a check can't pass because of something on your machine. Each group is one build; a failure prints the failing checks' output, and a passing build keeps every check's log in its output. On four CPUs it took about 20 minutes, the two groups building side by side: 18 minutes for the eval group, most of it `type-todo-full-test`, and 10 for the ship group. To run a single check, use `nix develop -c tools/check <name>` (see [docs/development.md](docs/development.md#before-pushing)).
31−
32−Limits: the ship checks need Linux, since `tools/ship` finds the ship's processes in `/proc`, so on macOS `nix flake check` runs only the eval group. Only `x86_64-linux` has been tried; the flake also declares `aarch64-linux` and `aarch64-darwin`, the other platforms nixpkgs builds vere for.
33−
34## Golden tests
17## Golden tests
35
18
36Each case, `tests/golden/<case>/`, holds `source.jibb`, `about.txt` (where it comes from, what it tests, the expected outcome), and the expected outputs: `tokens.txt` from the layout pass and `tree.txt` from the parser. A file holds the output plus one trailing newline. A case may also have a `path.txt` specifying its logical `/ui/.../*.jibb` path. An `expect-types:` line in `about.txt` opts it into the provisional `golden-types` checker output in `types.txt`; `--update` creates it. A case can select Hoon molds in `imports.txt` and provide each module in `sur/<module>.txt`, or select marks in `marks.txt` and provide their source in `mar/<name>.txt`. `modules.txt` selects Jibb source fixtures; their trees go in `module-trees.txt`, and the partial checker can resolve a subset of library imports. See [docs/development.md](docs/development.md).
19Each case, `tests/golden/<case>/`, holds `source.jibb`, `about.txt` (where it comes from, what it tests, the expected outcome), and the expected outputs: `tokens.txt` from the layout pass and `tree.txt` from the parser. A file holds the output plus one trailing newline. A case may also have a `path.txt` specifying its logical `/ui/.../*.jibb` path. An `expect-types:` line in `about.txt` opts it into the provisional `golden-types` checker output in `types.txt`; `--update` creates it. A case can select Hoon molds in `imports.txt` and provide each module in `sur/<module>.txt`, or select marks in `marks.txt` and provide their source in `mar/<name>.txt`. `modules.txt` selects Jibb source fixtures; their trees go in `module-trees.txt`, and the partial checker can resolve a subset of library imports. See [docs/development.md](docs/development.md).
@@ -59,19 +42,7 @@ tools/hoon '(golden /a/b/jibb (crip "++ main view"))'
59tools/hoon --raw --cord src=tests/golden/foo/source.jibb 'tree:(golden /a/b/jibb src)'
42tools/hoon --raw --cord src=tests/golden/foo/source.jibb 'tree:(golden /a/b/jibb src)'
60```
43```
61
44
62−`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.
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-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.
63−
64−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.
65−
66−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.
67−
68−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.
69−
70−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.
71−
72−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.
73−
74−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.
75
46
76### The doc's examples
47### The doc's examples
77
48
@@ -84,10 +55,6 @@ tools/doc-blocks Grammar.md Overview.md Core-language.md # fresh exports
84
55
85It matches each labelled block to the case whose `source.jibb` is the block's text plus a newline, and lists the blocks no case holds, each with a diff against the closest unmatched case, and the `doc-*` cases no block holds. Pass every tab with Jibb blocks, or the other tabs' cases count as stale. The exit status is 0 when every block has a case and every case a block, 1 when one doesn't, and 2 when the check can't run, for example because no block is labelled `jibb`.
56It matches each labelled block to the case whose `source.jibb` is the block's text plus a newline, and lists the blocks no case holds, each with a diff against the closest unmatched case, and the `doc-*` cases no block holds. Pass every tab with Jibb blocks, or the other tabs' cases count as stale. The exit status is 0 when every block has a case and every case a block, 1 when one doesn't, and 2 when the check can't run, for example because no block is labelled `jibb`.
86
57
87−## Licence
88−
89−Jibb is under the MIT licence, in [LICENSE](LICENSE). Two kinds of files in it are other people's, under their own MIT licences: the files in `vendor/` are copies from urbit/urbit, whose licence is in [vendor/LICENSE-urbit.txt](vendor/LICENSE-urbit.txt), and the Tlon `/sur` files that `tests/` uses as importer fixtures come from tloncorp/tlon-apps, whose licence is in [tests/importer/tlon-license.txt](tests/importer/tlon-license.txt).
90−
91## Fake ship
58## Fake ship
92
59
93`tools/ship` runs the desks on a fake `~zod` at `/root/urbit/zod` (`--pier` or `$JIBB_PIER`). It needs Python 3 and click (`/root/src/tools/pkg/click/click`, or `--click`). The ship runs in the background, logging to `/root/urbit/zod.log`.
60`tools/ship` runs the desks on a fake `~zod` at `/root/urbit/zod` (`--pier` or `$JIBB_PIER`). It needs Python 3 and click (`/root/src/tools/pkg/click/click`, or `--click`). The ship runs in the background, logging to `/root/urbit/zod.log`.
@@ -99,7 +66,7 @@ tools/ship log # the end of its log
99tools/ship stop
66tools/ship stop
100```
67```
101
68
102−`tools/ship assemble --out <dir> [<desk> ...]` writes the desks' files to `<dir>/<desk>` as sync assembles them, without a ship; `nix build` uses it. `tools/ship sync <desk>` assembles a desk from the repo's folders, creates it if it's missing (as `|new-desk` does), mounts it, deletes from the desk through Clay the files the repo doesn't have, makes the mount hold exactly the repo's files, runs `|commit` and waits until the desk matches the repo, checking every file. If Clay rejects the commit, it prints Clay's error, which the log doesn't show.
69+`tools/ship sync <desk>` assembles a desk from the repo's folders, creates it if it's missing (as `|new-desk` does), mounts it, deletes from the desk through Clay the files the repo doesn't have, makes the mount hold exactly the repo's files, runs `|commit` and waits until the desk matches the repo, checking every file. If Clay rejects the commit, it prints Clay's error, which the log doesn't show.
103
70
104| Desk | Assembled from |
71| Desk | Assembled from |
105| --- | --- |
72| --- | --- |
docs/README.md+3−8
@@ -2,11 +2,9 @@
2
2
3Jibb's spec is a design doc by @iko, [Jibb — an Elm-architecture UI language for Urbit](https://claude.ai/artifact/DMBr48qzi5z8hcwn2ccPBv), and its repository copy in `spec/`. The repository copy records decisions made on 2026-10-30, including dropping `$?`, adding `%$` as a term literal and pattern, making `@` an unrestricted atom, treating `?` as two atoms for union disjointness, and the milestone 2 type and prelude decisions; the Claude document still needs to be synchronized. This folder also holds where the build stands, what is still open, and how to work on the code.
3Jibb's spec is a design doc by @iko, [Jibb — an Elm-architecture UI language for Urbit](https://claude.ai/artifact/DMBr48qzi5z8hcwn2ccPBv), and its repository copy in `spec/`. The repository copy records decisions made on 2026-10-30, including dropping `$?`, adding `%$` as a term literal and pattern, making `@` an unrestricted atom, treating `?` as two atoms for union disjointness, and the milestone 2 type and prelude decisions; the Claude document still needs to be synchronized. This folder also holds where the build stands, what is still open, and how to work on the code.
4
4
5−The current full-module checker also has a narrow static/data-page slice, documented in [compiler.md](compiler.md) and [status.md](status.md). Its shared eval/ship fixture checks the real about, blog index and todo index sources without claiming rendering or request execution. The shared theme fixture likewise full-checks the byte-identical real theme and its exact type without implementing theme behavior.
6−
7| File | What it holds |
5| File | What it holds |
8| --- | --- |
6| --- | --- |
9−| [spec/](spec/) | The doc's tabs, as Markdown, with decisions the doc doesn't have yet; until the doc is synced, this copy is the spec |
7+| [spec/](spec/) | The doc's tabs, as Markdown |
10| [status.md](status.md) | The eight milestones, what milestone 1 built, and how to check it |
8| [status.md](status.md) | The eight milestones, what milestone 1 built, and how to check it |
11| [open-questions.md](open-questions.md) | Questions still open: the plan's, the grammar's, and those milestone 2 raises |
9| [open-questions.md](open-questions.md) | Questions still open: the plan's, the grammar's, and those milestone 2 raises |
12| [development.md](development.md) | Setting up a machine, the ground rules, the checks to run before pushing |
10| [development.md](development.md) | Setting up a machine, the ground rules, the checks to run before pushing |
@@ -14,9 +12,6 @@ The current full-module checker also has a narrow static/data-page slice, docume
14| [prelude-inventory.md](prelude-inventory.md) | Working source audit for the prelude's exported inventory |
12| [prelude-inventory.md](prelude-inventory.md) | Working source audit for the prelude's exported inventory |
15| [prompts/milestone-2.md](prompts/milestone-2.md) | A brief for the developer who builds milestone 2, types and prelude |
13| [prompts/milestone-2.md](prompts/milestone-2.md) | A brief for the developer who builds milestone 2, types and prelude |
16| [prompts/drop-union-rune.md](prompts/drop-union-rune.md) | The completed brief for dropping `$?`, as decided on 2026-10-30, before milestone 2 |
14| [prompts/drop-union-rune.md](prompts/drop-union-rune.md) | The completed brief for dropping `$?`, as decided on 2026-10-30, before milestone 2 |
17−| [reviews/2026-11-02-repo-review.md](reviews/2026-11-02-repo-review.md) | A review of the whole repository on 2026-11-02: bugs, gaps and simplifications, each checked by a second reviewer |
18−| [reviews/2026-11-02-questions.md](reviews/2026-11-02-questions.md) | The 45 decisions that review raises, with options and recommendations |
19−| [reviews/2026-11-02-syntax-review.md](reviews/2026-11-02-syntax-review.md) | A review of Jibb's syntax on 2026-11-02: 15 verified proposals with before and after examples, what to keep, and questions for @iko |
20
15
21## The spec
16## The spec
22
17
@@ -27,14 +22,14 @@ The current full-module checker also has a narrow static/data-page slice, docume
27| [spec/overview.md](spec/overview.md) | Jibb — an Elm-architecture UI language for Urbit: the language, the stages, the mark, the host, worked examples |
22| [spec/overview.md](spec/overview.md) | Jibb — an Elm-architecture UI language for Urbit: the language, the stages, the mark, the host, worked examples |
28| [spec/grammar.md](spec/grammar.md) | Grammar: lexical rules, literals, runes, imports, modules, molds, tag resolution, patterns, the EBNF |
23| [spec/grammar.md](spec/grammar.md) | Grammar: lexical rules, literals, runes, imports, modules, molds, tag resolution, patterns, the EBNF |
29| [spec/core-language.md](spec/core-language.md) | Core language: the untyped language between the checker and both backends |
24| [spec/core-language.md](spec/core-language.md) | Core language: the untyped language between the checker and both backends |
30−| [spec/decisions.md](spec/decisions.md) | Decisions: every choice, with the date it was made and whether the doc has it yet, and the settled milestone 2 questions |
25+| [spec/decisions.md](spec/decisions.md) | Decisions: every choice, with the date it was made |
31| [spec/implementation-plan.md](spec/implementation-plan.md) | Implementation plan: the eight milestones, ground rules, architecture, risks, open questions |
26| [spec/implementation-plan.md](spec/implementation-plan.md) | Implementation plan: the eight milestones, ground rules, architecture, risks, open questions |
32
27
33The doc has a sixth tab, "Loom on Urbit", which is empty, so it has no file.
28The doc has a sixth tab, "Loom on Urbit", which is empty, so it has no file.
34
29
35The overview's pipeline diagram, "Jibb pipeline · source to browser in three stages", is embedded content, so the export holds only a placeholder line for it under Architecture. The doc shows it.
30The overview's pipeline diagram, "Jibb pipeline · source to browser in three stages", is embedded content, so the export holds only a placeholder line for it under Architecture. The doc shows it.
36
31
37−The two copies can diverge, and until they are synced, this copy wins (review question 42). Sync the repository decisions to the Claude document before refreshing this copy: the rows that decisions.md's Synced column marks No or Check, and its settled milestone 2 questions. Then export each tab as Markdown again (in a Claude session, the Claude Docs connector's `export` gives each tab's Markdown), replace the files, and run:
32+The two copies can diverge. Sync the repository decisions to the Claude document before refreshing this copy, then export each tab as Markdown again (in a Claude session, the Claude Docs connector's `export` gives each tab's Markdown), replace the files, and run:
38
33
39```
34```
40git diff docs/spec # what changed in the doc
35git diff docs/spec # what changed in the doc
docs/compiler.md+9−39
@@ -56,7 +56,7 @@ The core is split into chapters, `+| %name`, in this order:
56| `%span-check` | `+check-spans`, which `+golden` runs on every tree, and `+check-spans-test` |
56| `%span-check` | `+check-spans`, which `+golden` runs on every tree, and `+check-spans-test` |
57| `%type-inference` | The initial inference fragment and its unification helpers; not yet a module type checker |
57| `%type-inference` | The initial inference fragment and its unification helpers; not yet a module type checker |
58
58
59−The inference fragment supports fixed auras, unrestricted `@`, one-way widening into it and toward aura-family ancestors, generic variables and gates, faced and unfaced cells, cell sample binders, known record field reads, a cell pattern of two or more binders, a complete two-arm loobean branch, a complete two-arm unit-shaped branch, closed local mold aliases and acyclic forward value references. For a supported single syntactic top-level recursive gate, the checker infers the sample first and uses that exact sample, including its field faces, in a monomorphic self placeholder. The completed body must unify with the placeholder before the gate is generalized; incompatible recursive arguments can report the call and argument sites. Uses of generalized top-level definitions instantiate their schemes independently. For a complete loobean branch with one direct self-call arm, the checker can infer the other arm independently and use its closed, fully resolved type to seed the recursive result; it then checks the whole body. Open or pending base types do not seed the result, and other branch shapes still depend on the existing partial inference. A supported single local recursive gate also uses a monomorphic self reference while its body is checked, then generalizes variables free of its enclosing environment; captured variables remain shared. Acyclic local value definitions can refer forward. When the remaining local definitions stop making progress and no cyclic group applies, the earliest of them whose definite error no order of the siblings could change reports it; otherwise the generic message remains. A definite error names sites, except an uncertain type hole, which names its site but is unsupported. A sibling can change another's result through a type variable the locals share, such as one in an untyped sample of the enclosing gate: a sibling's cast of the sample to `!!` makes every cast of it fit. So the error of a local that names no sibling and nothing whose type has a shared variable always counts. Another local's error counts only if no sibling had bound or refined a shared variable when it was tried and every other waiting definition also failed with sites, since one that waits without them, on a checker limit, a pending tag or its own nested stall, might in another order constrain the shared variable. In that case every definition is inferred against the same state in every order. A definition that infers but is then rejected as unsupported, such as for an uncertain type hole or a capital forced to a concrete type, reports its own message. Errors found while a cyclic group is inferred together are dropped, so a mutual group whose error comes after the call to its partner keeps the generic message. The checker collects written capitals per `++` before inference, excluding nested definitions: a capital used in an enclosing definition is shared with its locals, even when written later, while a capital introduced only in a local definition is generalized there. Sibling locals can introduce independent capitals with the same spelling; generic mold parameters keep their own scope. Top-level groups of syntactic gates are inferred together with monomorphic placeholders and shared substitutions, then generalized only after the whole group checks; downstream uses and library interfaces instantiate those schemes independently. A dependency graph identifies groups with two iterative depth-first passes; its conservative local-reference edges can reject otherwise valid programs. Supported local mutually recursive gate groups also use shared monomorphic placeholders and generalize only after the group checks, preserving captured outer variables. Some proven non-gate value cycles are diagnosed; other mixed gate/value cycles, polymorphic recursion, unresolved literal constraints and unresolved branch joins remain unsupported. Acyclic simple local mold aliases can also refer forward, and are scoped to the body, not its gate's sample. Nonrecursive generic aliases of supported molds can be applied at exact arity, including locally and through library interfaces; their parameters are lexical. Closed, provably disjoint nonrecursive unions and tagged single-case molds support contextual term values, `~` and `|=%tag` constructors. Literal heads compare by their runtime noun, so `|=%$` can construct an explicit null-, loobean-zero- or term-zero-headed case. Equal heads with distinct payloads can be selected when exactly one payload fit is proven; unknown or ambiguous alternatives remain unsupported. Unresolved tags and nulls remain pending, with distinct partial-inference diagnostics. Nonrecursive top-level generic union molds with provably disjoint cases also support contextual tags and constructors at exact arity; their arguments are retained through generalization and supported library interfaces. Nonrecursive generic aliases can reorder, repeat or omit parameters while preserving a supported union’s origin, including through local scopes and library interfaces. Generic unions declared directly inside a body and recursive molds outside the source-proven slices described below remain unsupported. A directly known named union can instantiate an unconstrained generic gate sample while retaining its origin, generic arguments and faces. Unnamed, pending-tag, recursive, unknown-atom and variable-bound union origins remain unsupported. A value with type variable `A` can fit a field whose type is that same `A`, including in generic union payloads and nested or repeated record fields. A differing-variable face constraint remains unsupported. When inference forces two distinct explicitly written capitals equal, it reports both source sites; forcing a capital to a concrete type remains unsupported in this fragment. It can infer and generalize atom constraints arising from explicit capitals or bare sample binders, preserve those constraints through aliases, instantiate them independently, and print multiple constraints. Unresolved decimal variables default to `@ud` for inferred types without gates; defaulting inside gate types and other constraint cases remain incomplete. It does not yet check a module, complete imports, general patterns, general deferred constraints, recursive molds, dependency cycles or most errors with both conflicting excerpts. Definite cast and call mismatches, incompatible branches and overlapping union cases report both sites and excerpts. Concrete branch results can join at an explicitly present parent aura or `@`. Some known tuple and record positions acquire matching faces; other variable-dependent face merges, general branch tag context and ambiguous call-result propagation remain unsupported; function compatibility involving nested `@` and variable-dependent joins remain unsupported except for equal types and the source-bound gate-sample proof below. For a single recursive gate outside a group, the reporting path repeats inference rather than instantiating its generalized interface inside its own body; a group report uses its stored schemes. This adds work, and the current dependency pass can take quadratic time on long forward chains; the milestone's speed target remains unverified. A separate conservative pass reports unions whose cases are provably disjoint or overlapping and leaves other cases unresolved; it does not claim the mold is checked. Unsupported forms are reported as such, and the partial output says the module has not been checked.
59+The inference fragment supports fixed auras, unrestricted `@`, one-way widening into it and toward aura-family ancestors, generic variables and gates, faced and unfaced cells, cell sample binders, known record field reads, a cell pattern of two or more binders, a complete two-arm loobean branch, a complete two-arm unit-shaped branch, closed local mold aliases and acyclic forward value references. For a supported single syntactic top-level recursive gate, the checker infers the sample first and uses that exact sample, including its field faces, in a monomorphic self placeholder. The completed body must unify with the placeholder before the gate is generalized; incompatible recursive arguments can report the call and argument sites. Uses of generalized top-level definitions instantiate their schemes independently. For a complete loobean branch with one direct self-call arm, the checker can infer the other arm independently and use its closed, fully resolved type to seed the recursive result; it then checks the whole body. Open or pending base types do not seed the result, and other branch shapes still depend on the existing partial inference. A supported single local recursive gate also uses a monomorphic self reference while its body is checked, then generalizes variables free of its enclosing environment; captured variables remain shared. Acyclic local value definitions can refer forward. The checker collects written capitals per `++` before inference, excluding nested definitions: a capital used in an enclosing definition is shared with its locals, even when written later, while a capital introduced only in a local definition is generalized there. Sibling locals can introduce independent capitals with the same spelling; generic mold parameters keep their own scope. Top-level groups of syntactic gates are inferred together with monomorphic placeholders and shared substitutions, then generalized only after the whole group checks; downstream uses and library interfaces instantiate those schemes independently. A dependency graph identifies groups with two iterative depth-first passes; its conservative local-reference edges can reject otherwise valid programs. Supported local mutually recursive gate groups also use shared monomorphic placeholders and generalize only after the group checks, preserving captured outer variables. Some proven non-gate value cycles are diagnosed; other mixed gate/value cycles, polymorphic recursion, unresolved literal constraints and unresolved branch joins remain unsupported. Acyclic simple local mold aliases can also refer forward, and are scoped to the body, not its gate's sample. Nonrecursive generic aliases of supported molds can be applied at exact arity, including locally and through library interfaces; their parameters are lexical. Closed, provably disjoint nonrecursive unions and tagged single-case molds support contextual term values, `~` and `|=%tag` constructors. Literal heads compare by their runtime noun, so `|=%$` can construct an explicit null-, loobean-zero- or term-zero-headed case. Equal heads with distinct payloads can be selected when exactly one payload fit is proven; unknown or ambiguous alternatives remain unsupported. Unresolved tags and nulls remain pending, with distinct partial-inference diagnostics. Nonrecursive top-level generic union molds with provably disjoint cases also support contextual tags and constructors at exact arity; their arguments are retained through generalization and supported library interfaces. Nonrecursive generic aliases can reorder, repeat or omit parameters while preserving a supported union’s origin, including through local scopes and library interfaces. Generic unions declared directly inside a body and recursive molds outside the source-proven slices described below remain unsupported. A directly known named union can instantiate an unconstrained generic gate sample while retaining its origin, generic arguments and faces. Unnamed, pending-tag, recursive, unknown-atom and variable-bound union origins remain unsupported. A value with type variable `A` can fit a field whose type is that same `A`, including in generic union payloads and nested or repeated record fields. A differing-variable face constraint remains unsupported. When inference forces two distinct explicitly written capitals equal, it reports both source sites; forcing a capital to a concrete type remains unsupported in this fragment. It can infer and generalize atom constraints arising from explicit capitals or bare sample binders, preserve those constraints through aliases, instantiate them independently, and print multiple constraints. Unresolved decimal variables default to `@ud` for inferred types without gates; defaulting inside gate types and other constraint cases remain incomplete. It does not yet check a module, complete imports, general patterns, general deferred constraints, recursive molds, dependency cycles or most errors with both conflicting excerpts. Definite cast and call mismatches, incompatible branches and overlapping union cases report both sites and excerpts. Concrete branch results can join at an explicitly present parent aura or `@`. Some known tuple and record positions acquire matching faces; other variable-dependent face merges, general branch tag context and ambiguous call-result propagation remain unsupported; function compatibility involving nested `@` and variable-dependent joins remain unsupported except for equal types and the source-bound gate-sample proof below. For a single recursive gate outside a group, the reporting path repeats inference rather than instantiating its generalized interface inside its own body; a group report uses its stored schemes. This adds work, and the current dependency pass can take quadratic time on long forward chains; the milestone's speed target remains unverified. A separate conservative pass reports unions whose cases are provably disjoint or overlapping and leaves other cases unresolved; it does not claim the mold is checked. Unsupported forms are reported as such, and the partial output says the module has not been checked.
60
60
61A direct unshadowed prelude call can use checked source layouts when a positional argument is a directly named, already inferred root gate. For two-slot function samples, the checker can match a named update against an unnamed generic gate sample without confusing a binder face with a nested record face. Both explicitly named slots must agree; source boundaries are evidence for this fit, not a call-arity rule. The source gate and prelude annotation must be available from their checked bindings. Local or dynamic gates, aliases without direct evidence, recursive or SCC placeholder bodies, other sample shapes and unresolved call-sample variables remain unsupported by this proof. Ordinary inference remains the fallback.
61A direct unshadowed prelude call can use checked source layouts when a positional argument is a directly named, already inferred root gate. For two-slot function samples, the checker can match a named update against an unnamed generic gate sample without confusing a binder face with a nested record face. Both explicitly named slots must agree; source boundaries are evidence for this fit, not a call-arity rule. The source gate and prelude annotation must be available from their checked bindings. Local or dynamic gates, aliases without direct evidence, recursive or SCC placeholder bodies, other sample shapes and unresolved call-sample variables remain unsupported by this proof. Ordinary inference remains the fallback.
62
62
@@ -66,22 +66,18 @@ Before the empty-capital optimization below, single sequential eval runs includi
66
66
67Restricted-number promotion only applies to written capital variables. If none are present, it returns immediately instead of traversing the environment. In one startup-inclusive pair of runs on 2,000 independent gates, output was byte-identical and user CPU fell from 71.67 to 38.26 seconds; wall time was 72.80 versus 51.66 seconds while other checks were running. This does not establish a bound for dependent modules or a complete-checker benchmark.
67Restricted-number promotion only applies to written capital variables. If none are present, it returns immediately instead of traversing the environment. In one startup-inclusive pair of runs on 2,000 independent gates, output was byte-identical and user CPU fell from 71.67 to 38.26 seconds; wall time was 72.80 versus 51.66 seconds while other checks were running. This does not establish a bound for dependent modules or a complete-checker benchmark.
68
68
69−A bounded source proof can also establish distinct literal heads when a union case is a one-hop application of a uniquely resolved local generic mold. It compares literal runtime nouns and checks the original mold normally before publishing an interface. The same source proof improves the partial report, which still says the mold is not checked. The new proof declines nested or qualified applications, opaque references, recursive-index states, holes and deferred obligations; other valid unions can remain unsupported. A 256-node source budget and a separate 256-entry inherited-state budget apply per attempt. They do not bound the existing pairwise union pass, parsing, atom or name sizes, or downstream checking. Prepared interfaces and inference state remain trusted inputs. `tools/type-union-source-test` and the shared ship guard exercise source resolution, reporting, rollback and these bounds. A separate positive witness can identify overlap in two-field, literal-headed cases when a unique one-hop local, one-parameter generic alias is applied to a concrete primitive payload. It compares the literal noun values and proves the payloads have a shared noun, so an empty or unknown payload is not a witness. The partial report identifies both original case sites. The partial report and the full module check find overlaps with one helper, `mold-overlap-witness`: it takes the first overlapping pair from the pairwise projection, which covers atoms, `?` and literal constants, and nested literal-headed cells, and tries this source witness only when no pair overlaps and some pair stays unknown. A projected overlap is therefore named even when the source witness would prove an earlier pair. For the same union both paths name the same pair, but the full check attaches evidence only when that union is the first mold whose inference fails and its generic parameters are valid; an earlier failing mold, including one that refers to the union, and a union with duplicate or too many parameters keep the generic error. `infer-jibb-file-detailed` returns structured overlap evidence for the first failed mold, including the originating path, exact source, mold name and both case spans. Ordinary Jibb imports preserve a child’s evidence through source and cache checks; the legacy `infer-jibb-file` API remains a text-result adapter and renders both excerpts. Specialized API and prepared-prelude paths retain their existing generic or text-only error boundaries. This witness uses a shared 256-node source/pair budget per attempt; generic-wrapper parameter validation has a separate 256-entry cap. An unsupported earlier case may hide a later overlap. The pairwise projection has no budget: the full check runs it before inferring a union's cases, and once more, to find the pair, on a failed union mold whose generic parameters are valid. Parsing, atom and name sizes, source-excerpt rendering, and downstream checking also remain outside these budgets. `tools/type-union-alias-overlap-test` checks the source proof and partial report; `tools/type-full-overlap-test` checks the detailed and legacy full-module paths, source attribution and cache behavior.
69+A bounded source proof can also establish distinct literal heads when a union case is a one-hop application of a uniquely resolved local generic mold. It compares literal runtime nouns and checks the original mold normally before publishing an interface. The same source proof improves the partial report, which still says the mold is not checked. The new proof declines nested or qualified applications, opaque references, recursive-index states, holes and deferred obligations; other valid unions can remain unsupported. A 256-node source budget and a separate 256-entry inherited-state budget apply per attempt. They do not bound the existing pairwise union pass, parsing, atom or name sizes, or downstream checking. Prepared interfaces and inference state remain trusted inputs. `tools/type-union-source-test` and the shared ship guard exercise source resolution, reporting, rollback and these bounds. A separate positive witness can identify overlap in two-field, literal-headed cases when a unique one-hop local, one-parameter generic alias is applied to a concrete primitive payload. It compares the literal noun values and proves the payloads have a shared noun, so an empty or unknown payload is not a witness. The partial report identifies both original case sites; full-module inference still rejects these cases with its generic unsupported-mold error. This witness uses a shared 256-node source/pair budget per attempt; an unsupported earlier case may hide a later overlap. Existing pairwise union analysis, parsing, atom and name sizes, and downstream checking remain outside this budget. `tools/type-union-alias-overlap-test` checks the source proof and its two-site report.
70
70
71A single-arm cell pattern can bind two or more positions, with its last binder capturing the remaining tail. Duplicate and shadowed names are rejected. A definite non-cell spine fails; an intermediate union or collection that might contain a cell remains unsupported. For a known non-union cell, a separate one-arm rule also accepts structured patterns, including nested literal and wildcard positions, when the existing coverage proof establishes the whole pattern. It binds payloads with their original types and checks result context; unknown, partially covered, union or recursive spines stay unsupported.
71A single-arm cell pattern can bind two or more positions, with its last binder capturing the remaining tail. Duplicate and shadowed names are rejected. A definite non-cell spine fails; an intermediate union or collection that might contain a cell remains unsupported. For a known non-union cell, a separate one-arm rule also accepts structured patterns, including nested literal and wildcard positions, when the existing coverage proof establishes the whole pattern. It binds payloads with their original types and checks result context; unknown, partially covered, union or recursive spines stay unsupported.
72
72
73String interpolation infers its pieces in order and preserves substitutions and pending constraints. A piece with a known atom aura, unrestricted `@`, or a tape `(list @tD)` is accepted; an isolated decimal literal takes its normal `@ud` default. A known cell reports that it needs a printer, and an explicitly generic atom asks for an aura at its use site. Loobeans, term singletons, non-tape collections, open types and a type fixed only later remain unsupported in this fragment.
73String interpolation infers its pieces in order and preserves substitutions and pending constraints. A piece with a known atom aura, unrestricted `@`, or a tape `(list @tD)` is accepted; an isolated decimal literal takes its normal `@ud` default. A known cell reports that it needs a printer, and an explicitly generic atom asks for an aura at its use site. Loobeans, term singletons, non-tape collections, open types and a type fixed only later remain unsupported in this fragment.
74
74
75−The Hoon bridge translates imported `(unit T)` to the canonical public `unit` union when the prepared template validates as the standard mold. Without that template it retains the older opaque collection behavior. Conversion recurses through imported unions and collection arguments, and API path/diff/poke analysis uses the same prepared reader. The fixtures prove identity, `fall`, `need`, casts, union- and list-nested `need`, canonical unit-typed API full/diff marks, and a canonical direct-poke export while leaving no-prelude output unchanged.
76−
77The Hoon bridge translates imported `*` as the any-noun type, directly or within supported nonrecursive cells. The reader may still decline a disjoint tagged union with a noun payload, and recursive imports containing `*` remain unsupported. It accepts an exact fork of the two loobean singletons as `?`, and each singleton separately as `%.y` or `%.n`, including inside supported faced cells. Contextual loobean literals specialize against a matching singleton by noun, including a proven singleton in a direct union; named loobean singletons do not silently widen to a distinct aura. Open `%f`, other values, and other forks containing loobean singletons remain unsupported; recursive Hoon molds containing flags can also fail closed.
75The Hoon bridge translates imported `*` as the any-noun type, directly or within supported nonrecursive cells. The reader may still decline a disjoint tagged union with a noun payload, and recursive imports containing `*` remain unsupported. It accepts an exact fork of the two loobean singletons as `?`, and each singleton separately as `%.y` or `%.n`, including inside supported faced cells. Contextual loobean literals specialize against a matching singleton by noun, including a proven singleton in a direct union; named loobean singletons do not silently widen to a distinct aura. Open `%f`, other values, and other forks containing loobean singletons remain unsupported; recursive Hoon molds containing flags can also fail closed.
78
76
79A bare tag that provably matches no case of a known union reports the union and tag sites. This covers casts, single-argument calls, contextual unit payloads, list items and supported branch arms, including unnamed imported unions. For syntactic tuples, ordered fit replay can identify a missing tag in a nested position; an earlier mismatch or uncertainty stops the replay instead of guessing. Existing tags whose shape or payload does not fit retain the ordinary mismatch; unresolved tags stay pending.
77A bare tag that provably matches no case of a known union reports the union and tag sites. This covers casts, single-argument calls, contextual unit payloads, list items and supported branch arms, including unnamed imported unions. For syntactic tuples, ordered fit replay can identify a missing tag in a nested position; an earlier mismatch or uncertainty stops the replay instead of guessing. Existing tags whose shape or payload does not fit retain the ordinary mismatch; unresolved tags stay pending.
80
78
81A change can replace uniquely named fields on a fully known, faced record spine, including through a nested wing. Replacements receive the field type as context, substitutions and pending constraints are retained, and the resulting type remains the original record. Missing fields, empty changes and definite replacement mismatches report sites; the expected-type site is the edit, since the original field declaration location is not retained. Unknown or partly unfaced spines, ambiguous fields and repeated edits remain unsupported. A cast to a known record also supplies field context to a tuple or record initializer, including nested list and union fields. The expected-type site is the cast mold; the original field declaration location is not retained. Isolated cart-style `init` and `update` expressions infer in this fragment. The complete cart-store source fails closed because store kind and declaration scope are not yet checked.
79A change can replace uniquely named fields on a fully known, faced record spine, including through a nested wing. Replacements receive the field type as context, substitutions and pending constraints are retained, and the resulting type remains the original record. Missing fields, empty changes and definite replacement mismatches report sites; the expected-type site is the edit, since the original field declaration location is not retained. Unknown or partly unfaced spines, ambiguous fields and repeated edits remain unsupported. A cast to a known record also supplies field context to a tuple or record initializer, including nested list and union fields. The expected-type site is the cast mold; the original field declaration location is not retained. Isolated cart-style `init` and `update` expressions infer in this fragment. The complete cart-store source fails closed because store kind and declaration scope are not yet checked.
82
80
83−Nested labels of the three public re-exports are normalized recursively to `ask`, `qath` and `raw-poke`, so prepared records and instantiated types do not expose their private `.internal` suffixes. Other private names remain private.
84−
85For supported closed unions, the type printer keeps the union’s origin separate from its displayed name. It prints an in-scope name such as `msg` or `msg.lib`, including in records and gates; an accessible imported nongeneric alias may name a transitive union. A nongeneric body-local union that escapes its scope, or an origin without an accessible name, prints its cases separated by spaces, parenthesized when nested. That case-list form is print-only. A supported generic union prints its name and all arguments, including unused arguments; when its name is unavailable, the partial printer reports that limitation instead of dropping its arguments. Two faces for the same imported origin remain compatible; compatibility between distinct union origins, including in gate types, remains unsupported. Some comparisons of generic union arguments also remain unsupported rather than deciding equality or mismatch. The Hoon bridge also translates some imported unnamed unions into this representation; unsupported cases remain errors.
81For supported closed unions, the type printer keeps the union’s origin separate from its displayed name. It prints an in-scope name such as `msg` or `msg.lib`, including in records and gates; an accessible imported nongeneric alias may name a transitive union. A nongeneric body-local union that escapes its scope, or an origin without an accessible name, prints its cases separated by spaces, parenthesized when nested. That case-list form is print-only. A supported generic union prints its name and all arguments, including unused arguments; when its name is unavailable, the partial printer reports that limitation instead of dropping its arguments. Two faces for the same imported origin remain compatible; compatibility between distinct union origins, including in gate types, remains unsupported. Some comparisons of generic union arguments also remain unsupported rather than deciding equality or mismatch. The Hoon bridge also translates some imported unnamed unions into this representation; unsupported cases remain errors.
86
82
87Multi-argument calls form one right-nested sample: `f a b c` supplies `[a [b c]]`, with the last argument able to be a cell itself. The fragment fits the complete sample, preserving known faces and shared variables. Known sample positions can provide list or union context to arguments; unknown sample shapes use ordinary inference and some contextual forms remain unsupported. For a definite mismatch, the diagnostic points to a specific argument when it can establish which one failed; otherwise it reports the combined sample.
83Multi-argument calls form one right-nested sample: `f a b c` supplies `[a [b c]]`, with the last argument able to be a cell itself. The fragment fits the complete sample, preserving known faces and shared variables. Known sample positions can provide list or union context to arguments; unknown sample shapes use ordinary inference and some contextual forms remain unsupported. For a definite mismatch, the diagnostic points to a specific argument when it can establish which one failed; otherwise it reports the combined sample.
@@ -116,7 +112,7 @@ In single startup-inclusive runs of eight Hoon reads, a benign three-case union
116
112
117The partial report can diagnose certain non-gate value dependency cycles, including cycles through gates. It requires an explicit atom or loobean result cast and a syntactically proven dependency group with unshadowed simple samples; it identifies the value and a dependency site. Untyped results, branches, nested definitions, qualified wings and complex samples remain unsupported. The proof constructs an additional dependency graph. One 24-case recursive/generic eval run took 19.7 s with it and 18.6 s before it, including startup; these single runs do not isolate the graph cost.
113The partial report can diagnose certain non-gate value dependency cycles, including cycles through gates. It requires an explicit atom or loobean result cast and a syntactically proven dependency group with unshadowed simple samples; it identifies the value and a dependency site. Untyped results, branches, nested definitions, qualified wings and complex samples remain unsupported. The proof constructs an additional dependency graph. One 24-case recursive/generic eval run took 19.7 s with it and 18.6 s before it, including startup; these single runs do not isolate the graph cost.
118
114
119−The source-backed `+api-path-analysis-source` is a separate partial analysis, not an API check: it resolves reachable Jibb imports and declared mark graphs and returns path and scry segments, full and diff mark identities and their types. It also checks derived-name collisions and reports a clash as a definite error at both sites. Full and diff payloads must be direct declared mark names; typed scry parameters must be a same-name, same-aura subset of the watch parameters, and unknown or duplicate segment binders fail closed. It creates no request gates. The caller must pass a trusted prepared prelude and unchanged source-aware reader results.
115+The source-backed `+api-path-analysis-source` is a separate partial analysis, not an API check: it resolves reachable Jibb imports and declared mark graphs and returns path and scry segments, full and diff mark identities and their types. It also checks derived-name collisions. Full and diff payloads must be direct declared mark names; typed scry parameters must be a same-name, same-aura subset of the watch parameters, and unknown or duplicate segment binders fail closed. It creates no request gates. The caller must pass a trusted prepared prelude and unchanged source-aware reader results.
120
116
121`+api-path-evidence-source` retains that analysis with the API source, complete prepared prelude (including reserved names), supplied reader results and resolved Jibb dependency cache. `+api-path-watchability` classifies a unique declaration as watchable or not watchable, or reports unknown when evidence is absent or ambiguous. The artifact and reader results are trusted host inputs; the host must bind them to the source versions used later. This is declaration evidence, not proof about an arbitrary request value, a checked API module, a runtime validator or an island watch.
117`+api-path-evidence-source` retains that analysis with the API source, complete prepared prelude (including reserved names), supplied reader results and resolved Jibb dependency cache. `+api-path-watchability` classifies a unique declaration as watchable or not watchable, or reports unknown when evidence is absent or ambiguous. The artifact and reader results are trusted host inputs; the host must bind them to the source versions used later. This is declaration evidence, not proof about an arbitrary request value, a checked API module, a runtime validator or an island watch.
122
118
@@ -124,46 +120,22 @@ For a unique supported declaration, `+api-request-parts` retains that evidence w
124
120
125`+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.
121`+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.
126
122
127−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. An API module outside the fragment fails with the reason its check gave: without `+$ paths`, the poke-only check's, such as `API poke mark %todo-action has no reader result`; otherwise its request constructor's, such as `request paths need unsupported inference`. A failing Jibb import reports its own error, as it does for other modules. A derived `poke` or request name that clashes with a definition, an import face, a prelude value or another derived name is a definite error showing where the name is derived and what it clashes with; `+api-path-analysis-source` and the path evidence entries report it the same way. Only names that surely exist are checked: `poke` when the module declares `+$ poke`, and the case names of a `+$ paths` that reads as path cases. Two cases with the same name do not read as path cases, so that clash stays unsupported, as does a case named `proj`, a reserved name. A name conflict among an API's imports and ordinary definitions reports `module has conflicting names`, as in other modules; a `/%` mark names a mold, so it conflicts only with another mark or mold, and a mark beside a value of the same name, such as a request, is not a conflict. 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 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.
128
124
129A 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.
125A 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.
130
126
131A two-item tuple with an explicit term, null or loobean head can receive payload context from a known union when every alternative is a literal-headed cell and its head noun is unique. The payload must be a direct wing-headed call, optionally grouped, with literal, wing or constructor arguments. The checker first retains the original inference if it already fits; otherwise it tries the contextual path once and fits the selected case and enclosing union. It declines this path if any substitution has a structural root, because a caller may have walked away variable provenance. Duplicate heads, opaque competitors and other shapes also stay conservative. The guard scans the substitution for each eligible tuple and may perform one extra shallow inference; it does not guarantee globally linear work. This lets an explicitly typed todo subscription body infer; it does not check an island or prove request watchability.
127A two-item tuple with an explicit term, null or loobean head can receive payload context from a known union when every alternative is a literal-headed cell and its head noun is unique. The payload must be a direct wing-headed call, optionally grouped, with literal, wing or constructor arguments. The checker first retains the original inference if it already fits; otherwise it tries the contextual path once and fits the selected case and enclosing union. It declines this path if any substitution has a structural root, because a caller may have walked away variable provenance. Duplicate heads, opaque competitors and other shapes also stay conservative. The guard scans the substitution for each eligible tuple and may perform one extra shallow inference; it does not guarantee globally linear work. This lets an explicitly typed todo subscription body infer; it does not check an island or prove request watchability.
132
128
133−`+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 is separate from the generalized constraint solver below.
129+`+gate-free-type` is a separate three-way proof over normalized checker types: it reports a gate-free result, a gate-bearing witness with its field path, or unknown. It tracks conservative inhabitance before reporting a gate in a cell, spends one shared node budget, and treats opaque recursion, open variables, unknown collection forms and `*` conservatively. Source-proven `qath` and the recognized list/unit representations have dedicated proofs. `+gate-free-mold-source` parses and resolves one named mold with a fresh active-root graph, retaining the complete prepared prelude, source bundle, trusted reader inputs, dependency cache and inferred mold. It caps classification at 256 nodes; parsing, import resolution and type inference are not covered by that cap. The host must canonicalize paths and bind trusted sources and reader results to their versions. API, store and private roots decline; other definitions and unused imported Hoon bindings are not fully checked. This is mold analysis, not a module, kind, island, watchability or runtime check, and it does not infer general gate-free constraints.
134−
135−A dedicated `%fvar` form retains the `contains no gates` constraint inside schemes. Unification resolves and updates nested substitutions, so existing or later gate injection fails rather than bypassing the constraint; atom-constrained variables remain the stronger form. Constraint propagation covers open cells, faces, collections and unions with a 256-node bound. Canonicalization and instantiation preserve the constraint, template application validates constrained arguments, and an exhausted variable scan never chooses the unconstrained fallback. `set`, `map`, `mop`, `jar` and `jug` apply the same bounded propagation only to their key positions, leaving values independent. Public `eq` uses the private primitive interface, and generic `mate` retains the same constraint.
136−
137−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.
138−
139−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.
140−
141−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.
142−
143−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. Once the store's `state` and `poke` molds are unique and nongeneric and `main`'s `store` is the prelude's builder, such a collision is a definite error, reported before other scope conflicts, showing the mold the name derives from and the clashing definition or import face. 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.
144−
145−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.
146−
147−Ordinary inference runs for every component before recovery, so a keyed view no longer causes an already-valid initializer to be skipped. Recovery is a fallback for unresolved components, not a replacement for definitions that check normally. The regression uses a call-bodied annotated initializer, which is outside the tuple-bodied initializer recovery shape.
148−
149−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. 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.
150−
151−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.
152
130
153Each 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.
131Each 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.
154
132
155`+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.
133`+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.
156
134
157−The supplied prelude is parsed into a **partial interface**: all names actually declared in the source are reserved, while only the molds and values this fragment can infer are available. These include the validated standard `list` mold, `unit`, the doc-exact generic `cmd` union, `same`, `fall`, `need`, `bond`, `lure`, `weld`, `snoc`, `turn`, `lent`, `zing`, `flop`, `rear`, `drop`, `skim`, `skip`, `murn`, `join`, `snip`, `levy`, `lien`, `cork`, `corl`, `cury`, `curr`, `lead`, `late`, `trip` and `tuba`; unsupported entries remain unavailable. The validated `list` is injected while the prelude’s gates are inferred; `weld` and `turn` use ordinary explicit result casts. An absent or altered `list` is not injected, and an altered declaration cannot leak through a direct or transitive mold alias. The same validated template is available when prelude mold aliases are prepared, so supported direct and transitive aliases can use it. A named prelude union keeps the fixed `/lib/jibb/prelude/jibb` origin in every module, and its name remains unqualified when a library exports a type containing it. The prelude inventory is incomplete, so reserving the names in this source does not establish complete shadowing coverage. The source-backed internal prelude defines `poke`, which the public prelude re-exports as an ordinary transparent type. A dedicated trusted internal-prelude preparation path also supplies private comparison, arithmetic and text-conversion schemes for the Jibb-written `gth`, `add`, `dec`, `trip` and `tuba` wrappers. Ordinary module resolution rejects that primitive path even if a caller supplies a spoofed root or bundle. The low-level prepared interface is still trusted host input; the host must select the vendored sources and canonicalize paths. Primitive execution and shape-based jet recognition are not implemented. The Jibb-written `lth`, `gte` and `lte` gates compose the source-backed `gth` and `not` gates; supported calls infer a shared atom constraint and return `?`. Their execution and jet recognition await the backend. The source-backed `add` and `dec` wrappers use private arithmetic interfaces whose shared atom variable excludes loobeans; the partial checker preserves that constraint through supported inference and prints `where A is an atom other than ?`. The partial checker resolves the supported `poke` source shape, preserves its public name, and rejects ordinary imports of the private internal path. The Jibb-written `lent` recursively counts a list using `add`; the partial checker infers its generic list argument and `@ud` result. Its execution and jet recognition remain unverified until the backend exists. The Jibb-written `zing` concatenates homogeneous lists in order using `weld`; the checker infers `(list (list A))` to `(list A)`, including for gate elements. Hoon `zing` also accepts heterogeneous noun lists, which this type does not express. `tools/hoon --raw -f tools/testdata/zing-hoon-reference.hoon` compares an equivalent Hoon recursion with Hoon `zing` on selected finite inputs; it does not execute Jibb or verify lowering or jet recognition. The Jibb-written `lead` and `late` are curried pair constructors: `((lead a) b)` returns `[a b]`, while `((late a) b)` returns `[b a]`. The checker infers independent argument types and accepts gates as ordinary values; neither helper invokes an input gate. A Hoon translation is compared with Hoon’s helpers by `tools/hoon --raw -f tools/testdata/lead-late-hoon-reference.hoon`. This does not execute Jibb or verify lowering or jet recognition. An imported API with one mark and a matching direct `+$ poke` declaration can export a derived constructor and retain agent/mark metadata when the source representation has the supported agent case. Other API shapes, complete private module checking, root API and kind checking, stores, complete `ask` and `pure` checking, lowering and runtime effects remain unfinished. A possible store or root API declaring `+$ poke` reports that kind or scope needs unsupported inference; definite duplicate declarations and unrelated shadowing still report conflicts. Prepared interfaces and caches are trusted caller inputs; the future host and linker must ensure the private source validated during preparation is the same version used to lower derived constructors. A `*` payload may contain gates, so the fragment treats it conservatively; full gate-free checks are unfinished. The shared module-scope fixture compares the prepared and source-taking paths against the real prelude and a two-module golden under eval and on the ship.
135+The supplied prelude is parsed into a **partial interface**: all names actually declared in the source are reserved, while only the molds and values this fragment can infer are available. These include the validated standard `list` mold, `unit`, the doc-exact generic `cmd` union, `same`, `fall`, `need`, `bond`, `lure`, `weld`, `snoc`, `turn`, `lent`, `zing`, `flop`, `rear`, `drop`, `skim`, `skip`, `murn`, `join`, `snip`, `levy`, `lien`, `cork`, `corl`, `cury`, `curr`, `lead` and `late`; unsupported entries remain unavailable. The validated `list` is injected while the prelude’s gates are inferred; `weld` and `turn` use ordinary explicit result casts. An absent or altered `list` is not injected, and an altered declaration cannot leak through a direct or transitive mold alias. The same validated template is available when prelude mold aliases are prepared, so supported direct and transitive aliases can use it. A named prelude union keeps the fixed `/lib/jibb/prelude/jibb` origin in every module, and its name remains unqualified when a library exports a type containing it. The prelude inventory is incomplete, so reserving the names in this source does not establish complete shadowing coverage. The source-backed internal prelude defines `poke`, which the public prelude re-exports as an ordinary transparent type. A dedicated trusted internal-prelude preparation path also supplies private comparison and arithmetic schemes for the Jibb-written `gth`, `add` and `dec` wrappers. Ordinary module resolution rejects that primitive path even if a caller supplies a spoofed root or bundle. The low-level prepared interface is still trusted host input; the host must select the vendored sources and canonicalize paths. Primitive execution and shape-based jet recognition are not implemented. The Jibb-written `lth`, `gte` and `lte` gates compose the source-backed `gth` and `not` gates; supported calls infer a shared atom constraint and return `?`. Their execution and jet recognition await the backend. The source-backed `add` and `dec` wrappers use private arithmetic interfaces whose shared atom variable excludes loobeans; the partial checker preserves that constraint through supported inference and prints `where A is an atom other than ?`. The partial checker resolves the supported `poke` source shape, preserves its public name, and rejects ordinary imports of the private internal path. The Jibb-written `lent` recursively counts a list using `add`; the partial checker infers its generic list argument and `@ud` result. Its execution and jet recognition remain unverified until the backend exists. The Jibb-written `zing` concatenates homogeneous lists in order using `weld`; the checker infers `(list (list A))` to `(list A)`, including for gate elements. Hoon `zing` also accepts heterogeneous noun lists, which this type does not express. `tools/hoon --raw -f tools/testdata/zing-hoon-reference.hoon` compares an equivalent Hoon recursion with Hoon `zing` on selected finite inputs; it does not execute Jibb or verify lowering or jet recognition. The Jibb-written `lead` and `late` are curried pair constructors: `((lead a) b)` returns `[a b]`, while `((late a) b)` returns `[b a]`. The checker infers independent argument types and accepts gates as ordinary values; neither helper invokes an input gate. A Hoon translation is compared with Hoon’s helpers by `tools/hoon --raw -f tools/testdata/lead-late-hoon-reference.hoon`. This does not execute Jibb or verify lowering or jet recognition. An imported API with one mark and a matching direct `+$ poke` declaration can export a derived constructor and retain agent/mark metadata when the source representation has the supported agent case. Other API shapes, complete private module checking, root API and kind checking, stores, complete `ask` and `pure` checking, lowering and runtime effects remain unfinished. A possible store or root API declaring `+$ poke` reports that kind or scope needs unsupported inference; definite duplicate declarations and unrelated shadowing still report conflicts. Prepared interfaces and caches are trusted caller inputs; the future host and linker must ensure the private source validated during preparation is the same version used to lower derived constructors. A `*` payload may contain gates, so the fragment treats it conservatively; full gate-free checks are unfinished. The shared module-scope fixture compares the prepared and source-taking paths against the real prelude and a two-module golden under eval and on the ship.
158
136
159`+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.
137`+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.
160
138
161−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.
162−
163−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. Otherwise, when a missing value is a gate whose own sample has the name of a top-level value, import face or prelude value, the error is that the sample shadows a name, shown at the sample: with `++ user |= x=@t (helper x)` and `++ helper |= user=@t user`, it is `helper`'s sample `user`. Other incomplete modules keep the generic error, which names one missing value: the first whose module dependencies all resolved. When every missing value waits on another, it follows the first value each waits on, from the first missing value, until a value repeats, and names that value. The walk is over the syntactic dependency graph, which ignores binders: a local binder with a top-level value's name, such as a cell-sample item or a nested gate's sample, reads as a dependency on that value. The named value lies on a cycle of that graph but may only call into the value that failed; with `++ helper |= x=@t |= user=@t user` instead, it names `user`, and the shadowing is not reported. Successful modules never run the retry. This checks types only; it does not render or execute buttons.
164−
165−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.
166−
167And the design notes:
139And the design notes:
168
140
169| Note | Says |
141| Note | Says |
@@ -216,9 +188,9 @@ Note 4 has examples of each.
216
188
217## Speed
189## Speed
218
190
219−Starting `urbit eval` and building the library takes about 27 s, or 24 s without `!:` (`tools/hoon --no-debug`), measured on 2026-11-02. Every timing in this document was measured with `!:`, which the dev tools add so errors have positions, and which makes checker work 2.2 to 2.6 times slower than on a ship; the comparisons hold, but the absolute figures overstate a ship's time. 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).
191+Starting `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).
220
192
221−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.
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.
222
194
223An 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.
195An 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.
224
196
@@ -226,8 +198,6 @@ In an isolated diagnostic with the real todo API and reader inputs, this cell co
226
198
227A 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.
199A 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.
228
200
229−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.
230−
231−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.
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.
232
202
233A 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.
203A 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+67−43
@@ -6,31 +6,21 @@ How to work on Jibb: the rules the plan sets, how to set up a machine, and what
6
6
7From the plan's Setup and ground rules, and from @iko:
7From the plan's Setup and ground rules, and from @iko:
8
8
9−- **The spec wins.** Where code and spec disagree, the spec stands until it changes. Until the Claude doc is synced with the repository's decisions, the spec is the copy in [spec/](spec/); the Synced column in [spec/decisions.md](spec/decisions.md) shows which rows the doc has.
9+- **The doc wins.** Where code and doc disagree, the doc stands until it changes. [spec/](spec/) is a snapshot; the doc itself is the authority.
10- **Language changes are agreed first** and recorded in the Decisions tab, before the code changes.
10- **Language changes are agreed first** and recorded in the Decisions tab, before the code changes.
11- **Questions go to @iko**, as comments on the doc, on the words they're about. While one is open, follow the most likely reading, mark it "(doc question)" in the library's notes, and list it in [open-questions.md](open-questions.md). Where an error points is not a doc question: the library's section 2.0 settles it.
11- **Questions go to @iko**, as comments on the doc, on the words they're about. While one is open, follow the most likely reading, mark it "(doc question)" in the library's notes, and list it in [open-questions.md](open-questions.md). Where an error points is not a doc question: the library's section 2.0 settles it.
12- **Every Jibb code block in the doc is a golden test**, and each stage's output is printed and compared. The doc labels its Jibb blocks `jibb`; `tools/doc-blocks` checks that each has its case.
12- **Every Jibb code block in the doc is a golden test**, and each stage's output is printed and compared. The doc labels its Jibb blocks `jibb`; `tools/doc-blocks` checks that each has its case.
13- **Each milestone ends with its checks passing on a fake ship**, not only under `urbit eval`.
13- **Each milestone ends with its checks passing on a fake ship**, not only under `urbit eval`.
14- **Push straight to `master`.** @iko reviews work in the project's chat, not in pull requests, so there are none. Run the checks below first.
14- **Push straight to `master`.** @iko reviews work in the project's chat, not in pull requests, so there are none. Run the checks below first.
15−- **Keep docs/ current**: [status.md](status.md) when a milestone moves, [open-questions.md](open-questions.md) when a question is found, and [spec/decisions.md](spec/decisions.md) when one is settled: it moves there.
15+- **Keep docs/ current**: [status.md](status.md) when a milestone moves, [open-questions.md](open-questions.md) when a question is settled or found.
16
16
17−The source-backed generic-union guard can be run under eval with `tools/type-union-source-test`; its `test-union-source` arm is also assembled for the fake ship. It checks a bounded partial inference slice, not general union completeness. `tools/type-union-alias-overlap-test` exercises the separate positive overlap witness and its shared ship test arm. `tools/type-full-overlap-test` checks structured full-module overlap evidence and the legacy error text under eval; both of its test arms are assembled for the fake ship.
17+The source-backed generic-union guard can be run under eval with `tools/type-union-source-test`; its `test-union-source` arm is also assembled for the fake ship. It checks a bounded partial inference slice, not general union completeness. `tools/type-union-alias-overlap-test` exercises the separate positive overlap witness and its shared ship test arm.
18
18
19## Setting up a machine
19## Setting up a machine
20
20
21The tools need Python 3 and `urbit` (vere) on `PATH`; the ship tools also need a fake `~zod` and click. Everything so far ran with vere 4.6 on Linux.
21The tools need Python 3 and `urbit` (vere) on `PATH`; the ship tools also need a fake `~zod` and click. Everything so far ran with vere 4.6 on Linux.
22
22
23−With Nix (and flakes), `nix develop` gives a shell with vere 4.6, Python 3 and click, as the flake pins them, and sets `$JIBB_CLICK`. `nix build .#fakezod` boots a fake `~zod` from the pinned brass pill in about half a minute; copy it to where `tools/ship` expects it:
24−
25−```
26−mkdir -p /root/urbit
27−cp -r "$(nix build .#fakezod --no-link --print-out-paths)" /root/urbit/zod
28−chmod -R u+w /root/urbit/zod
29−```
30−
31−`nix flake check` needs neither step, since it boots a ship of its own; see the [README](../README.md#building-and-checking-with-nix).
32−
33−Without Nix, on a usual machine:
23+On a usual machine:
34
24
351. Install vere as [docs.urbit.org](https://docs.urbit.org) says, and get a brass pill.
251. Install vere as [docs.urbit.org](https://docs.urbit.org) says, and get a brass pill.
362. Boot a fake ship where `tools/ship` expects it, or point `--pier` or `$JIBB_PIER` elsewhere. Booting takes a few minutes:
262. Boot a fake ship where `tools/ship` expects it, or point `--pier` or `$JIBB_PIER` elsewhere. Booting takes a few minutes:
@@ -41,7 +31,7 @@ Without Nix, on a usual machine:
413. Get click, the command-line client for a ship's `conn.sock`, from [urbit/tools](https://github.com/urbit/tools), at `/root/src/tools/pkg/click/click` or wherever `--click` or `$JIBB_CLICK` says.
313. Get click, the command-line client for a ship's `conn.sock`, from [urbit/tools](https://github.com/urbit/tools), at `/root/src/tools/pkg/click/click` or wherever `--click` or `$JIBB_CLICK` says.
424. Optionally, clone [urbit/urbit](https://github.com/urbit/urbit) to read Arvo's source. `vendor/SOURCES.txt` names the commit the vendored files come from.
324. Optionally, clone [urbit/urbit](https://github.com/urbit/urbit) to read Arvo's source. `vendor/SOURCES.txt` names the commit the vendored files come from.
43
33
44−In a Claude cloud container, the network blocks urbit.org, bootstrap.urbit.org, nixos.org's installer and GitHub's release downloads. When Nix is already installed, as it was on 2026-11-02, the flake does all of the below: it fetches nixpkgs from channels.nixos.org, click with git and the pill from media.githubusercontent.com, which the network allows. Otherwise, this worked on 2026-10-29, and has to be redone in each new container:
34+In a Claude cloud container, the network blocks urbit.org, bootstrap.urbit.org, nixos.org's installer and GitHub's release downloads. This worked on 2026-10-29, and has to be redone in each new container:
45
35
46```
36```
47# Nix, single-user
37# Nix, single-user
@@ -70,7 +60,6 @@ git clone https://github.com/urbit/tools /root/src/tools
70
60
71| Tool | What it does |
61| Tool | What it does |
72| --- | --- |
62| --- | --- |
73−| `tools/check` | Runs every check in this table, or a group (`--group eval` or `ship`), or some by name: see [Before pushing](#before-pushing) |
74| `tools/golden` | Runs the golden cases under `urbit eval`: every case, or those matching `--case`; `--update` rewrites the expected outputs; `--show` prints them |
63| `tools/golden` | Runs the golden cases under `urbit eval`: every case, or those matching `--case`; `--update` rewrites the expected outputs; `--show` prints them |
75| `tools/importer-test` | Compares the partial Hoon importer's diagnostic trees and errors with `tests/importer/tree.txt` under `urbit eval` |
64| `tools/importer-test` | Compares the partial Hoon importer's diagnostic trees and errors with `tests/importer/tree.txt` under `urbit eval` |
76| `tools/type-import-default-test` | Compares default-wrapped union source proofs and adversarial cases under eval; the same golden runs on the ship |
65| `tools/type-import-default-test` | Compares default-wrapped union source proofs and adversarial cases under eval; the same golden runs on the ship |
@@ -79,7 +68,6 @@ git clone https://github.com/urbit/tools /root/src/tools
79| `tools/type-import-structural-test` | Checks multi-case and nested Hoon union overlap witnesses under eval and on the ship |
68| `tools/type-import-structural-test` | Checks multi-case and nested Hoon union overlap witnesses under eval and on the ship |
80| `tools/type-union-source-test` | Checks bounded local generic-alias disjointness and state guards under eval and on the ship |
69| `tools/type-union-source-test` | Checks bounded local generic-alias disjointness and state guards under eval and on the ship |
81| `tools/type-union-alias-overlap-test` | Checks source-backed generic-alias overlap witnesses under eval and on the ship |
70| `tools/type-union-alias-overlap-test` | Checks source-backed generic-alias overlap witnesses under eval and on the ship |
82−| `tools/type-full-overlap-test` | Checks structured full-module overlap evidence and imported-source attribution |
83| `tools/type-tlon-test` | Runs the real Tlon presence source through the importer and partial checker, comparing `tests/type-tlon/expected.txt` under eval |
71| `tools/type-tlon-test` | Runs the real Tlon presence source through the importer and partial checker, comparing `tests/type-tlon/expected.txt` under eval |
84| `tools/type-import-diagnostic-test` | Compares the structured reader diagnostic bridge report under eval |
72| `tools/type-import-diagnostic-test` | Compares the structured reader diagnostic bridge report under eval |
85| `tools/type-mark-test` | Checks the partial checker’s mark import boundary against `tests/type-mark/expected.txt` under eval |
73| `tools/type-mark-test` | Checks the partial checker’s mark import boundary against `tests/type-mark/expected.txt` under eval |
@@ -94,7 +82,6 @@ git clone https://github.com/urbit/tools /root/src/tools
94| `tools/type-deferred-test` | Checks the bounded source-owned deferred inference transaction under eval and on the ship |
82| `tools/type-deferred-test` | Checks the bounded source-owned deferred inference transaction under eval and on the ship |
95| `tools/type-deferred-resolver-test` | Checks deferred resolution, report consistency and atomic failure under eval and on the ship |
83| `tools/type-deferred-resolver-test` | Checks deferred resolution, report consistency and atomic failure under eval and on the ship |
96| `tools/type-deferred-context-test` | Checks deferred source order and literal branch contexts under eval and on the ship |
84| `tools/type-deferred-context-test` | Checks deferred source order and literal branch contexts under eval and on the ship |
97−| `tools/type-deferred-prepared-test` | Checks prepared-prelude tuple initializer recovery, exact partial reports and fail-closed guards under eval and on the ship |
98| `tools/type-cell-branch-test` | Checks closed-cell branch context, rollback and bounded retry screens under eval and on the ship |
85| `tools/type-cell-branch-test` | Checks closed-cell branch context, rollback and bounded retry screens under eval and on the ship |
99| `tools/type-generic-alias-test` | Runs public/private generic union alias and provenance guards under eval and on the ship |
86| `tools/type-generic-alias-test` | Runs public/private generic union alias and provenance guards under eval and on the ship |
100| `tools/type-positional-face-guards-test` | Runs positional-call and nested-face guards under eval and on the ship |
87| `tools/type-positional-face-guards-test` | Runs positional-call and nested-face guards under eval and on the ship |
@@ -102,21 +89,11 @@ git clone https://github.com/urbit/tools /root/src/tools
102| `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 |
89| `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 |
103| `tools/type-todo-api-test` | Exercises the actual todo API through the real Hoon readers and partial checker |
90| `tools/type-todo-api-test` | Exercises the actual todo API through the real Hoon readers and partial checker |
104| `tools/type-direct-gate-test` | Checks a synthetic source-backed program report and direct gate provenance under eval and on the ship |
91| `tools/type-direct-gate-test` | Checks a synthetic source-backed program report and direct gate provenance under eval and on the ship |
105−| `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 |
106−| `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 |
107−| `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 |
108−| `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 |
109−| `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 |
110−| `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 |
111−| `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 |
112−| `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 |
113−| `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 |
114−| `tools/type-todo-full-test` | Fully checks the byte-identical todo island and an ordinary call-bodied annotated-initializer variant through real readers, exact main types, structural downstream import and rejection controls under eval and on the ship |
115| `tools/type-closed-gate-guards-test` | Checks closed gate sample labels and face uncertainty under eval and on the ship |
92| `tools/type-closed-gate-guards-test` | Checks closed gate sample labels and face uncertainty under eval and on the ship |
116| `tools/type-constructor-fit-guards-test` | Checks constructor-case uncertainty and known mismatches under eval and on the ship |
93| `tools/type-constructor-fit-guards-test` | Checks constructor-case uncertainty and known mismatches under eval and on the ship |
117| `tools/type-nested-union-guards-test` | Checks nested tagged-union case selection and uncertainty under eval and on the ship |
94| `tools/type-nested-union-guards-test` | Checks nested tagged-union case selection and uncertainty under eval and on the ship |
118| `tools/type-empty-test` | Checks source-backed empty molds, inhabitedness, coverage and proof budgets under eval and on the ship |
95| `tools/type-empty-test` | Checks source-backed empty molds, inhabitedness, coverage and proof budgets under eval and on the ship |
119−| `tools/type-gate-free-guards-test` | Checks bounded gate-free verdicts, persistent constraints, substitution safeguards, collection keys and witness paths under eval and on the ship |
96+| `tools/type-gate-free-guards-test` | Checks bounded gate-free verdicts, inhabitation and witness paths under eval and on the ship |
120| `tools/type-gate-free-source-test` | Checks source-backed todo mold analysis through the real readers under eval and on the ship |
97| `tools/type-gate-free-source-test` | Checks source-backed todo mold analysis through the real readers under eval and on the ship |
121| `tools/type-sub-guards-test` | Checks source-backed subscription mold dependencies under eval and on the ship |
98| `tools/type-sub-guards-test` | Checks source-backed subscription mold dependencies under eval and on the ship |
122| `tools/type-ask-guards-test` | Runs ask origin and canonical list/unit bootstrap guards under eval and on the ship |
99| `tools/type-ask-guards-test` | Runs ask origin and canonical list/unit bootstrap guards under eval and on the ship |
@@ -125,29 +102,74 @@ git clone https://github.com/urbit/tools /root/src/tools
125| `tools/type-arithmetic-guards-test` | Runs restricted atom-variable, unification and projection guards under eval and on the ship |
102| `tools/type-arithmetic-guards-test` | Runs restricted atom-variable, unification and projection guards under eval and on the ship |
126| `tools/type-module-scope-test` | Checks the partial module checker’s prelude boundary and duplicate-source rejection against `tests/type-module-scope/expected.txt` under eval |
103| `tools/type-module-scope-test` | Checks the partial module checker’s prelude boundary and duplicate-source rejection against `tests/type-module-scope/expected.txt` under eval |
127| `tools/clay-fixtures` | Syncs `my-app`, builds its example `/sur` files and marks through Clay, checks selected mold and mark projections and the partial checker, and records Ford and mark subject shapes on the fake ship |
104| `tools/clay-fixtures` | Syncs `my-app`, builds its example `/sur` files and marks through Clay, checks selected mold and mark projections and the partial checker, and records Ford and mark subject shapes on the fake ship |
128−| `tools/hoon` | Evaluates Hoon with the library in scope, as `tools/hoon '(golden /a/b/jibb (crip "++ main view"))'`; `--cord name=file` binds a file's text, `-f` reads the expression from a file; `--no-debug` leaves out `!:`, which gives errors their positions but makes the checker 2.2 to 2.6 times slower than on a ship, for timings |
105+| `tools/hoon` | Evaluates Hoon with the library in scope, as `tools/hoon '(golden /a/b/jibb (crip "++ main view"))'`; `--cord name=file` binds a file's text, `-f` reads the expression from a file |
129| `tools/doc-blocks` | Checks the doc's `jibb` blocks against the `doc-*` golden cases: `tools/doc-blocks docs/spec` |
106| `tools/doc-blocks` | Checks the doc's `jibb` blocks against the `doc-*` golden cases: `tools/doc-blocks docs/spec` |
130−| `tools/ship` | Runs the fake ship: `start`, `stop`, `status`, `log`, `sync <desk>`, `assemble --out <dir>` (no ship needed), `test`, `gen-tests`, `check-commit`, `scry`, `hoon`, `run`, `poke`, `commit`, `mount`, `unmount` |
107+| `tools/ship` | Runs the fake ship: `start`, `stop`, `status`, `log`, `sync <desk>`, `test`, `gen-tests`, `check-commit`, `scry`, `hoon`, `run`, `poke`, `commit`, `mount`, `unmount` |
131| `tools/testdata/selftest` | Tests `tools/golden` and `tools/hoon` against a stub library, and `tools/doc-blocks` against Markdown it writes |
108| `tools/testdata/selftest` | Tests `tools/golden` and `tools/hoon` against a stub library, and `tools/doc-blocks` against Markdown it writes |
132| `tools/testdata/ship-selftest` | Tests `tools/ship`'s test generator and runner against a stub library on the ship |
109| `tools/testdata/ship-selftest` | Tests `tools/ship`'s test generator and runner against a stub library on the ship |
133| `tools/testdata/clay-fixtures-selftest` | Tests temporary Clay fixture cleanup and signal handling without a ship |
110| `tools/testdata/clay-fixtures-selftest` | Tests temporary Clay fixture cleanup and signal handling without a ship |
134
111
135−`tools/golden` starts `urbit eval` once and builds the library, which takes about 27 s, then runs every case under `mule`, so a crash fails only its own case.
112+`tools/golden` starts `urbit eval` once and builds the library, which takes about 8 s, then runs every case under `mule`, so a crash fails only its own case.
136
113
137## Before pushing
114## Before pushing
138
115
139```
116```
140−tools/check # every check; it exits 0 only when all pass
117+tools/golden # all cases pass
141−tools/check --group eval # only the checks that need no ship, as CI runs them
118+tools/importer-test # Hoon importer fixture projections match
142−nix flake check # the same checks in the Nix sandbox, on a fresh fake ~zod
119+tools/type-import-default-test # default-wrapped source proofs match
120+tools/type-import-test # importer/checker bridge golden report matches
121+tools/type-import-overlap-test # source-aware Hoon overlap and provenance controls
122+tools/type-import-structural-test # nested and multi-case Hoon overlap controls
123+tools/type-union-source-test # local generic-alias union guards
124+tools/type-union-alias-overlap-test # local generic-alias overlap diagnostics
125+tools/type-tlon-test # real Tlon importer/checker report matches
126+tools/type-import-diagnostic-test # direct structured reader diagnostics match
127+tools/type-mark-test # mark/checker bridge golden report matches
128+tools/type-poke-test # source-backed poke/API bridge report matches
129+tools/type-api-paths-test # partial API path analysis report matches
130+tools/type-api-evidence-test # API declaration evidence guards pass
131+tools/type-hole-guards-test # hole defaulting and API guards pass
132+tools/type-list-alias-test # prelude list-alias guards pass
133+tools/type-generic-alias-test # generic union alias guards pass
134+tools/type-positional-face-guards-test # positional sample face guards pass
135+tools/type-qath-guards-test # qath source and unfolding guards pass
136+tools/type-todo-partial-test # unchanged todo partial report and reader failure controls
137+tools/type-todo-api-test # real todo API partial inference and reader guards pass
138+tools/type-direct-gate-test # direct gate source and provenance guards pass
139+tools/type-generic-recursion-test # source-backed recursive identities and provenance
140+tools/type-generic-construction-test # source-backed recursive construction and bounds
141+tools/type-generic-pattern-test # source-backed recursive patterns and bounds
142+tools/type-deferred-test # source-owned deferred inference guards
143+tools/type-deferred-resolver-test # resolver consistency and failure guards
144+tools/type-deferred-context-test # deferred source-order and branch guards
145+tools/type-cell-branch-test # contextual branch rollback and bounds
146+tools/type-closed-gate-guards-test # closed gate fit guards pass
147+tools/type-constructor-fit-guards-test # constructor fit guards pass
148+tools/type-nested-union-guards-test # nested union selector guards pass
149+tools/type-empty-test # empty mold and uninhabited-case guards pass
150+tools/type-gate-free-guards-test # bounded gate-free classifier guards pass
151+tools/type-gate-free-source-test # real todo mold analysis and source guards pass
152+tools/type-sub-guards-test # subscription source guards pass
153+tools/type-ask-guards-test # ask source and bootstrap guards pass
154+tools/type-request-guards-test # request evidence and cache guards pass
155+tools/type-proj-guards-test # projection evidence and scope guards pass
156+tools/type-arithmetic-guards-test # arithmetic constraint guards pass
157+tools/type-module-scope-test # module/prelude scope golden report matches
158+tools/hoon check-spans-test # prints <<>>
159+tools/hoon itype-unify-test # type-unification controls pass
160+tools/hoon -f tools/testdata/zing-hoon-reference.hoon # Hoon translation agrees on four inputs
161+tools/hoon -f tools/testdata/lead-late-hoon-reference.hoon # Hoon translation agrees on selected inputs
162+tools/hoon -f tools/testdata/succ-hoon-reference.hoon # Hoon translation agrees on selected inputs
163+tools/testdata/selftest # 22 checks, 0 failed
164+tools/doc-blocks docs/spec # every jibb block has its case
165+tools/ship gen-tests --check # tests/lib/jibb.hoon is up to date
166+tools/ship test # the cases pass as -test arms on the ship
167+tools/testdata/ship-selftest # when tools/ship changed
168+tools/testdata/clay-fixtures-selftest # scratch fixture cleanup without a ship
169+tools/ship check-commit # when the mark or the desks changed
170+tools/clay-fixtures # builds example fixtures and real Tlon notes through Clay
143```
171```
144
172
145−`tools/check` runs every check the repo has. Their one list is `CHECKS` in the script, so a new check goes there, as well as in the table above; `tools/check --list` prints it with each check's command. The eval group, the 62 checks that need only `urbit` and Python, runs several at a time (`-j`, by default one per CPU), the slowest first. The ship group, `ship-selftest`, `ship-test`, `check-commit` and `clay-fixtures`, then runs one check at a time on the ship `tools/ship` talks to; `tools/check` starts it if it isn't running and stops it again afterwards. Name checks, or globs, to run only those: `tools/check golden 'type-todo-*'`. A failing check's output follows its FAIL line; `-v` prints every check's output, and `--logs DIR` keeps it all.
146−
147−CI, [.github/workflows/check.yml](../.github/workflows/check.yml), builds the desks and runs the eval group through the flake on every push to `master` and every pull request. It doesn't run the ship group, so run that before pushing.
148−
149−`ship-selftest` matters most when `tools/ship` changed, and `check-commit` when the mark or the desks changed, but `tools/check` runs both every time. The self-test leaves fixture files on the `jibb-dev` desk, and `ship-test`, which runs after it, puts the real ones back.
150−
151`tools/ship test` regenerates `tests/lib/jibb.hoon` and syncs the `jibb-dev` desk before it runs, so commit the regenerated file. Sync preflights and splits large deletion lists into bounded click requests, waiting for each Clay revision; a failure stops later batches. The ship self-test exercises this when switching from the full desk to a smaller fixture desk. A run with `--stub`, `--lib`, or a custom `--golden` isolates its generated golden tests from the repository's other test programs; run the default command afterward to restore and test those programs. It also runs the independent `tests/lib/jibb-import.hoon` test against the same importer fixtures and expected diagnostic projection as `tools/importer-test`. The projection is an internal tree, not the Jibb type printer. `tests/lib/jibb-bridge.hoon` also runs the importer/checker bridge fixture on the ship; `tools/type-import-test` runs the same report under eval. `tests/lib/jibb-tlon-bridge.hoon` and `tools/type-tlon-test` run the real Tlon presence reader/checker fixture on both. The structured reader diagnostics have their own `tests/lib/jibb-import-diagnostic.hoon` ship test and `tools/type-import-diagnostic-test` eval test. The mark bridge has its own `tests/lib/jibb-mark-bridge.hoon` ship test and `tools/type-mark-test` eval test; both compare the same fixture report. `tests/lib/jibb-poke-bridge.hoon` and `tools/type-poke-test` share the source-backed prelude and poke-only API fixture. `tests/lib/jibb-api-paths.hoon` and `tools/type-api-paths-test` share partial path analysis over the real todo marks; this does not generate request interfaces. `tests/lib/jibb-module-scope.hoon` and `tools/type-module-scope-test` compare the prelude scope report on the ship and under eval.
173`tools/ship test` regenerates `tests/lib/jibb.hoon` and syncs the `jibb-dev` desk before it runs, so commit the regenerated file. Sync preflights and splits large deletion lists into bounded click requests, waiting for each Clay revision; a failure stops later batches. The ship self-test exercises this when switching from the full desk to a smaller fixture desk. A run with `--stub`, `--lib`, or a custom `--golden` isolates its generated golden tests from the repository's other test programs; run the default command afterward to restore and test those programs. It also runs the independent `tests/lib/jibb-import.hoon` test against the same importer fixtures and expected diagnostic projection as `tools/importer-test`. The projection is an internal tree, not the Jibb type printer. `tests/lib/jibb-bridge.hoon` also runs the importer/checker bridge fixture on the ship; `tools/type-import-test` runs the same report under eval. `tests/lib/jibb-tlon-bridge.hoon` and `tools/type-tlon-test` run the real Tlon presence reader/checker fixture on both. The structured reader diagnostics have their own `tests/lib/jibb-import-diagnostic.hoon` ship test and `tools/type-import-diagnostic-test` eval test. The mark bridge has its own `tests/lib/jibb-mark-bridge.hoon` ship test and `tools/type-mark-test` eval test; both compare the same fixture report. `tests/lib/jibb-poke-bridge.hoon` and `tools/type-poke-test` share the source-backed prelude and poke-only API fixture. `tests/lib/jibb-api-paths.hoon` and `tools/type-api-paths-test` share partial path analysis over the real todo marks; this does not generate request interfaces. `tests/lib/jibb-module-scope.hoon` and `tools/type-module-scope-test` compare the prelude scope report on the ship and under eval.
152
174
153## Golden cases
175## Golden cases
@@ -160,10 +182,12 @@ A case is a folder `tests/golden/<name>/` holding:
160- optionally, `path.txt`, the logical `/ui/.../*.jibb` path to pass to the compiler; the source remains `source.jibb`.
182- optionally, `path.txt`, the logical `/ui/.../*.jibb` path to pass to the compiler; the source remains `source.jibb`.
161- optionally, an `expect-types:` line in `about.txt` opts the case into `+golden-types`; `types.txt` holds its output plus one newline and `--update` creates it. A `types.txt` also opts in when the line is absent. This interface is provisional while the checker is under construction.
183- optionally, an `expect-types:` line in `about.txt` opts the case into `+golden-types`; `types.txt` holds its output plus one newline and `--update` creates it. A `types.txt` also opts in when the line is absent. This interface is provisional while the checker is under construction.
162- optionally, `imports.txt` selects Hoon `/sur` molds, one `module mold` pair per line. Each module's source goes in `sur/<module>.txt` and is compiled against zuse by both runners. `marks.txt` selects marks, one name per line, with source in `mar/<name>.txt`; both kinds may be supplied together. The reader results go to the partial checker, and a type output is required. Both runners reconstruct fixture text from `%txt` lines and identify the fixture if its compilation crashes; a crash fails the case without discarding its successful parse output. These fixtures currently handle only sources without Ford imports.
184- optionally, `imports.txt` selects Hoon `/sur` molds, one `module mold` pair per line. Each module's source goes in `sur/<module>.txt` and is compiled against zuse by both runners. `marks.txt` selects marks, one name per line, with source in `mar/<name>.txt`; both kinds may be supplied together. The reader results go to the partial checker, and a type output is required. Both runners reconstruct fixture text from `%txt` lines and identify the fixture if its compilation crashes; a crash fails the case without discarding its successful parse output. These fixtures currently handle only sources without Ford imports.
163−- optionally, `modules.txt` lists logical `/ui/.../*.jibb` paths, one per line. The corresponding sources live below the case's `modules/ui/` directory. Both runners parse each source at its logical path and compare the combined `module-trees.txt`; `--update` writes that output. A case with type output also supplies these sources and the vendored prelude to the partial module checker. The file opts in even when it lists no sources; use a comment such as `# no module fixtures` for an empty bundle. Blank lines and comment lines are ignored. Cases without `modules.txt` keep their existing no-prelude type interface.
185+- optionally, `modules.txt` lists logical `/ui/.../*.jibb` paths, one per line. The corresponding sources live below the case's `modules/ui/` directory. Both runners parse each source at its logical path and compare the combined `module-trees.txt`; `--update` writes that output. A case with type output also supplies these sources and the vendored prelude to the partial module checker. The file opts in even when it lists no sources; use a comment such as `# no module fixtures` for an empty bundle, since zero-byte `%txt` fixtures do not sync reliably on the ship. Blank lines and comment lines are ignored. Cases without `modules.txt` keep their existing no-prelude type interface.
164
186
165The runners prepare the trusted vendored public and internal prelude sources once for their generated test core and share the partial interface. Preparation reserves all names present in the public source and supplies the molds and values the fragment can infer; an unsupported declaration remains reserved but unavailable. The source and checker are incomplete, so the output still says the module has not been checked and does not claim complete shadowing coverage. `+golden-types-with-prelude-and-internal` accepts both sources directly; callers using `+golden-types-with-prepared-prelude` pass the unchanged result of `+prepare-prelude-with-internal`. The older source-only entry points remain available for preludes without imports. Missing or malformed sources fail closed.
187The runners prepare the trusted vendored public and internal prelude sources once for their generated test core and share the partial interface. Preparation reserves all names present in the public source and supplies the molds and values the fragment can infer; an unsupported declaration remains reserved but unavailable. The source and checker are incomplete, so the output still says the module has not been checked and does not claim complete shadowing coverage. `+golden-types-with-prelude-and-internal` accepts both sources directly; callers using `+golden-types-with-prepared-prelude` pass the unchanged result of `+prepare-prelude-with-internal`. The older source-only entry points remain available for preludes without imports. Missing or malformed sources fail closed.
166
188
189+A zero-byte mark fixture currently fails ship synchronization validation after commit. Use a newline-only fixture to test an empty Hoon source on the ship.
190+
167Names say what a case is for:
191Names say what a case is for:
168
192
169| Name | For |
193| Name | For |
@@ -188,4 +212,4 @@ Write `source.jibb` and `about.txt` by hand, run `tools/golden --update --case <
188
212
189A 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.
213A 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.
190
214
191−`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.
215+`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.
docs/open-questions.md+45−20
@@ -1,6 +1,6 @@
1# Open questions
1# Open questions
2
2
3−Questions the doc doesn't settle yet, as of 2026-11-02. Language questions belong to the doc's author, @iko: the plan says they go "as comments on the doc, on the words they're about", and a change to the language is "agreed first and recorded in Decisions". When one is settled, record it there, change the code if needed, and move it from here to [Decisions](spec/decisions.md), which holds the settled ones.
3+Questions the doc doesn't settle yet, as of 2026-10-30. Language questions belong to the doc's author, @iko: the plan says they go "as comments on the doc, on the words they're about", and a change to the language is "agreed first and recorded in Decisions". When one is settled, record it there, change the code if needed, and remove it here.
4
4
5## The plan's open questions
5## The plan's open questions
6
6
@@ -14,32 +14,57 @@ From [spec/implementation-plan.md](spec/implementation-plan.md), Open questions:
14| Are the proposed loop rules adopted, along with no overlays in v1? | Milestone 6 |
14| Are the proposed loop rules adopted, along with no overlays in v1? | Milestone 6 |
15| What do controls look like by default: buttons, toggles and fields, with their focus and disabled states? | Milestone 6 |
15| What do controls look like by default: buttons, toggles and fields, with their focus and disabled states? | Milestone 6 |
16
16
17+On 2026-10-30, @iko adopted gate-free `eq` arguments and map and set keys, treating gates as opaque when distinguishing union cases, and rejecting a non-gate value that depends on itself even through a gate. The checker infers and generalizes the gate-free constraint. @iko also said jetted prelude functions may take gates.
18+
17## Questions milestone 2 raises
19## Questions milestone 2 raises
18
20
19−Found while writing [prompts/milestone-2.md](prompts/milestone-2.md), checking it against the doc's examples, and building the checker. Question 3 remains open, and the field-order detail in question 32. The others are settled and are in [Decisions](spec/decisions.md#settled-milestone-2-questions), which keeps their numbers, so existing references stay valid.
21+Found while writing [prompts/milestone-2.md](prompts/milestone-2.md), checking it against the doc's examples, and building the checker. The numbering is retained so existing references stay valid. Question 3 remains open; the field-order detail in question 32 is being clarified. The other questions are settled.
22+
23+1. **Settled: how the prelude identifies jetted functions.** On 2026-10-30, @iko said the prelude functions have working Jibb implementations, and the compiler recognizes their shapes and uses the Hoon versions so jets can fire.
24+2. **Settled: how the prelude keeps helpers private.** On 2026-10-30, @iko chose a separate internal prelude module imported by the prelude, without exposing the imported helpers.
25+3. **The prelude's inventory.** On 2026-10-30, @iko chose to include all names from the listed Hoon library sections, excluding groups the spec explicitly leaves out. All of 3g is included; its Hoon `tone` is exposed as `tone.hoon`, distinct from the styling type. Hoon 1c `step` is exposed as `step.hoon`, leaving the Grammar example's `step` name available. On 2026-10-30, @iko also approved `%$` as a term literal and pattern, so Jibb can write the `%$` case of Hoon `coin`. For parsing sections 4j and 4l, only the explicitly listed `slav` and `slaw` are included; other parser helpers are left out. Jibb's `not` negates a loobean, and Hoon's bitwise `not` is exposed as `not.bit`. @iko also agreed to specifying the complete exported inventory in the doc, building its types and gates needed by the examples in milestone 2, and doing native implementations in milestone 3. Prelude unions such as spaces, roles and tones need names that other modules cannot shadow. The actual inventory and signatures still need to be specified.
26+4. **Settled: a capital in a local `++`.** On 2026-10-30, @iko said it shares the enclosing `++`'s variable of that name if the enclosing `++` also uses it; otherwise the local `++` introduces and generalizes its own variable. For example, `++ inner |= y=A y` shares `A` with an enclosing gate whose sample is `x=A`, but generalizes its own `A` if the enclosing `++` does not use `A`. A different type uses a different capital. The Grammar and Decisions record this alongside the earlier aura rules.
27+5. **Settled: cells of no items or one.** On 2026-10-30, @iko said a single-item cell is the value and `[]` is an error. The theme's `dark=[tones=[…]]`, a record of one field, must still check.
28+6. **Settled: a change with no items.** On 2026-10-30, @iko said `m()` is an error. The parser still accepts it; the checker needs to reject it and add a golden case.
29+7. **Settled: the doc's blocks that aren't whole modules.** On 2026-10-30, @iko agreed to check each in its intended context: the `cmd` and `sub` definitions as prelude source, the Core language tab's `update` inside the todo island, and the Grammar's imports example against fixture files.
30+8. **Settled: tuples and records.** On 2026-10-30, @iko agreed that an unnamed position can unify with a faced position and take its face; two different explicit faces still conflict. The Grammar and Decisions record this rule.
31+9. **Settled: values where `*` is expected.** On 2026-10-30, @iko said `*` is the noun type, not a type variable; generic positions use proper type variables. A value already known to be `@ud` can be passed where `*` is expected. The `each` and `table` signatures use `key=K`.
32+10. **Settled: navigation commands.** On 2026-10-30, @iko chose separate declarations for application paths and unchecked cords, with `link-unsafe`, `image-unsafe` and `go-unsafe` for the unchecked forms. `image-unsafe` takes a sized URL record. Both navigation declarations produce `[%go url=@t]`; `go` converts the application path to a cord including the app's base path.
33+11. **Settled: stores and derived gates.** On 2026-10-30, @iko said a store's `+$ poke` is a declaration, like an API file's, not a mold; a derived name clashes with an import face; and an island watching a request whose case has a separate `scry=` path has a type error. The todo API's request is renamed `todo-by-id` so it does not clash with `/- todo`. The checker must account for the fact that a store's kind is determined by the type of `main`.
34+12. **Settled: how to print a union without a name.** On 2026-10-30, @iko said to print its cases separated by spaces, as `%approve %deny`. This is print-only, not Jibb syntax.
35+13. **Settled: how to print type constraints.** On 2026-10-30, @iko chose `$-([A A] A) where A is an atom` for an atom constraint and `$-([A A] ?) where A contains no gates` for a gate-free constraint. Multiple clauses are comma-separated, as `where A is an atom, B contains no gates`.
36+14. **Settled: how the prelude implements foundational operations.** On 2026-10-30, @iko chose private low-level primitives in the internal prelude module, with the public foundational gates implemented in Jibb on top of them.
37+15. **Settled: unrestricted atoms and shared auras.** On 2026-10-30, @iko said `@` means any atom, independently at each occurrence, so Hoon `dime` and `pint` keep their bare-`@` fields. A specific atom such as `@ud` fits where `@` is expected; an `@` value needs a check to fit `@ud`. Shared atom types use one capital, with the atom constraint inferred from its body, as for `add` taking `[A A]` and returning `A`.
38+16. **Settled: loobeans in union disjointness.** On 2026-10-30, @iko said `?` counts as its two atoms, `%.y` and `%.n`: it is disjoint from any cell and overlaps the constants 0 and 1.
39+17. **Settled: empty cases in union disjointness.** On 2026-10-30, @iko said `!!` is disjoint from every case. A cell containing an empty position at any depth is itself empty and is also disjoint from every case.
40+18. **Settled: the value gate `like`.** On 2026-10-31, @iko chose a gate `(like convert result)` that maps the product of an existing `(like A)` result with `convert=$-(A B)`, yielding `(like B)` while preserving its position and remaining input. An absent result stays absent. The `(like A)` mold remains available in the separate mold namespace. Hoon's wet `+like` instead builds a gate that constructs a result from an input noun; the chosen Jibb value gate is an adaptation of that behavior.
41+19. **Settled: Hoon aura families and `step.hoon`.** On 2026-10-30, @iko chose `step.hoon` for Hoon 1c `step`, avoiding a clash with the Grammar example's `step`, and chose one-way widening across Hoon aura families: for example, `@ud` and `@ux` fit `@u`, and `@tD` fits `@t`. The reverse needs a check. The `step.hoon` group representation is not implemented yet.
42+20. **Settled: the type of `clap`.** On 2026-10-30, @iko chose one shared value type for both units and the combining gate. If either unit is absent, `clap` returns the other; if both are present, it applies the gate to their values and wraps the result.
43+21. **Settled: duplicate faces in imported Hoon records.** On 2026-10-30, @iko chose to reject an imported Hoon record with duplicate field names where its type is used. Hoon permits `[a=@ud a=@t]` and picks the first `a`; Jibb rejects it.
44+22. **Settled: overlapping imported `$%` and `$?` cases.** On 2026-10-30, @iko confirmed that the general union disjointness rule rejects imported `$%` and `$?` cases that overlap as nouns where the type is used, as it does for `$^`. The importer rejects recognizable overlaps and fails closed when it cannot verify them.
45+23. **Settled: converging explicit capitals.** On 2026-10-30, @iko chose that a body cannot force two separately written capitals to be equal. For `++ repeated |= x=(choice A A) x`, `++ f |= x=(choice A B) (repeated x)` is an error; use `A` in both positions when the type must be shared. This also applies across local captures and within generic mold applications.
46+
47+24. **Settled: how the internal prelude provides `poke`.** On 2026-10-31, @iko chose to define `poke` in the source-backed private internal prelude module and re-export it through the public prelude as an ordinary transparent type. Ordinary modules can construct and inspect its values. This settles `poke`; it does not decide the representation of `ask` or `qath`.
48+
49+25. **Settled: how the prelude provides `ask` and `qath`.** On 2026-10-31, @iko chose ordinary transparent types defined in the internal prelude and re-exported normally, as for `poke`. Callers may construct and inspect their values.
50+
51+26. **Settled: the `step` example's `at` binder.** On 2026-10-31, @iko chose to rename the `describe` pattern binder to `sent-at`, keeping Hoon's `at` in the prelude and the no-shadowing rule.
52+
53+27. **Settled: duplicate fields in a Jibb-written record.** On 2026-10-31, @iko chose to reject duplicate field names, as for imported Hoon records.
54+
55+28. **Settled: arithmetic on loobeans.** On 2026-10-31, @iko chose to reject loobean operands for arithmetic. Comparison may still accept loobeans and returns `?`. The checker needs to retain this constraint through inference, generalization and instantiation before it exports `add` or `dec`.
56+
57+29. **Settled: printing the arithmetic atom constraint.** On 2026-10-31, @iko chose `where A is an atom other than ?` for a generic arithmetic type whose atom variable excludes loobeans.
20
58
21−**3. The prelude's inventory.** On 2026-10-30, @iko chose to include all names from the listed Hoon library sections, excluding groups the spec explicitly leaves out. All of 3g is included; its Hoon `tone` is exposed as `tone.hoon`, distinct from the styling type. Hoon 1c `step` is exposed as `step.hoon`, leaving the Grammar example's `step` name available. On 2026-10-30, @iko also approved `%$` as a term literal and pattern, so Jibb can write the `%$` case of Hoon `coin`. For parsing sections 4j and 4l, only the explicitly listed `slav` and `slaw` are included; other parser helpers are left out. Jibb's `not` negates a loobean, and Hoon's bitwise `not` is exposed as `not.bit`. @iko also agreed to specifying the complete exported inventory in the doc, building its types and gates needed by the examples in milestone 2, and doing native implementations in milestone 3. Prelude unions such as spaces, roles and tones need names that other modules cannot shadow. The actual inventory and signatures still need to be specified.
59+30. **Settled: a hole inferred as a generic variable.** On 2026-10-31, @iko said a hole resolved to an explicitly written type variable counts as inferred: in `++ id |= x=A ^- _ x`, the result hole is `A`. Named molds must determine their own holes without constraints from later uses; an unconstrained hole is an error.
22
60
23−**32. Partly settled: type-directed record projection.** On 2026-10-31, @iko chose an explicit `(proj record)` whose expected result type selects the fields. There is no automatic projection, and `proj` is reserved against definitions and imports. The result contains exactly the fields of its expected type. Whether the result may reorder fields from the source remains open.
61+31. **Settled: uses of a value with a hole.** On 2026-10-31, @iko said a value definition must determine its own holes; another definition's use cannot fix an otherwise unresolved hole. For example, `++ id |= x=_ x` remains an error even if a later definition calls `id` with a cord.
24
62
25−## Review rulings waiting for @iko
63+32. **Partly settled: type-directed record projection.** On 2026-10-31, @iko chose an explicit `(proj record)` whose expected result type selects the fields. There is no automatic projection, and `proj` is reserved against definitions and imports. The result contains exactly the fields of its expected type. Whether the result may reorder fields from the source remains open.
26
64
27−The [2026-11-02 review](reviews/2026-11-02-repo-review.md) raised these language and spec questions. Montelot answered them on 2026-11-02 as proposals. Each waits for @iko to confirm before it goes in [Decisions](spec/decisions.md) and the code changes.
65+33. **Settled: watching a request with unknown provenance.** On 2026-10-31, @iko said an island may watch a request only if the checker proves it watchable at compile time. An unknown request, including one built or passed through a gate without sufficient evidence, is rejected rather than deferred to a runtime check.
28
66
29−| # | Question | Proposed answer | Refs |
67+34. **Settled: constructors and equal noun literals.** On 2026-10-31, @iko said expressions with the same runtime representation count as equal, and cases that cannot be distinguished at runtime are rejected at compile time. Thus `|=%$` matches a case headed by `%$`, `%.y` or `~`: each is the noun 0. Cases with equal heads and overlapping payloads cannot coexist in a union.
30−| --- | --- | --- | --- |
31−| [16](reviews/2026-11-02-questions.md) | Which auras may a term literal fit? Today `^- @tas %1.000` is accepted and `^- @ud %1.000` is rejected | Follow Hoon: `%1.000` is `@ud` and `%&` is `?` | A20 |
32−| [17](reviews/2026-11-02-questions.md) | May a name term fit `@t`, as `@tas` nests in `@t` in Hoon? | Yes | A20 |
33−| [18](reviews/2026-11-02-questions.md) | May a gate fit `*`? The prelude's `element` erases gates into `*` | Yes, and say in the spec that `*` may hold gates | A23 |
34−| [19](reviews/2026-11-02-questions.md) | Where are `[]` and `m()`, both decided errors, rejected? | In the parser, at the closer, with golden cases | A6, A100 |
35−| [20](reviews/2026-11-02-questions.md) | Is `[a=@ud [a=@t b=?]]` one record or two scopes? | One record: the duplicate `a` is an error | A30 |
36−| [21](reviews/2026-11-02-questions.md) | May `/% %foo` and `++ foo 1` share a name? | Yes: molds and values have separate namespaces | A25 |
37−| [22](reviews/2026-11-02-questions.md) | Is a `?-` arm that matches no remaining case a definite error? | Yes: "arm matches no case" | A15 |
38−| [23](reviews/2026-11-02-questions.md) | Should `(mop K V)` carry its comparator? | No, match Hoon | A55 |
39−| [24](reviews/2026-11-02-questions.md) | Should Hoon's `each` mold be renamed, since the prelude has the element gate `each`? | No, keep both | A64 |
40−| [26](reviews/2026-11-02-questions.md) | Which Hoon unions should the importer read? | `$%` with `%&`, `%\|` and `%0` tags now, then `each` and `json` as catalog entries | A50 |
41−| [27](reviews/2026-11-02-questions.md) | Should the `%jibb` mark keep dropping the final newline on a `%txt` round trip? | Keep it, like `%hoon` | A61 |
42−| [28](reviews/2026-11-02-questions.md) | Should the printer flatten `[a [b c]]` and print named molds by name, such as `theme`? | Yes | A136 |
43
68
44## Grammar questions never put to the doc's author
69## Grammar questions never put to the doc's author
45
70
docs/prelude-inventory.md+6−14
@@ -4,15 +4,9 @@ This is a working inventory, not a completed prelude interface. It lists top-lev
4
4
5The 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.
5The 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.
6
6
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.
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.
8
8
9−The prelude also declares the generic `cmd` mold exactly as in Overview, Effects. The partial checker infers its five cases and independent message types in the supported examples; 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.
9+The prelude also declares the generic `cmd` mold exactly as in Overview, Effects. The partial checker infers its five cases and independent message types in the supported examples; complete module checking and backend validation remain outstanding. The public prelude also declares `sub`; the partial checker infers supported constructions, while request watchability and execution remain outstanding.
10−
11−The public prelude now defines the UI `length`, `align`, `role`, `tone` and `attr` molds, a nonrecursive generic `element` union with one case per UI node, and the exact `program` and `page` records with their builders. Nested child, keyed-item and table payloads in the runtime union are erased to `*`; the public constructors retain typed children and independent key types, and `island` stores `[program data]` in its erased payload. The focused `types-prelude-ui` golden infers the complete union and constructor schemes, including static and message-bearing composition. Raw-constructor encapsulation, duplicate-attribute rejection, rendering, storage, navigation and execution are not established by this slice.
12−
13−The public prelude 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.
16
10
17Hoon `+$` 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.
11Hoon `+$` arms are marked **mold** below; `++` arms can be gates, doors or mold generators, and need individual inspection. Jibb's loobean `not` and Hoon's bitwise `not.bit` are distinct. Parser helpers outside 3g are excluded from the intended prelude except the specifically listed `slav` and `slaw`; the raw candidates below still need to be classified.
18
12
@@ -32,7 +26,7 @@ The source-backed `gth` gate calls a compiler-supplied private comparison interf
32
26
33`biff`, `bind`, `bond`, `both`, `clap`, `clef`, `drop`, `fall`, `flit`, `hunt`, `lift`, `mate`, `need`, `some`.
27`biff`, `bind`, `bond`, `both`, `clap`, `clef`, `drop`, `fall`, `flit`, `hunt`, `lift`, `mate`, `need`, `some`.
34
28
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`, `hunt` and `mate`; the remaining written implementations have been parsed, but complete checker validation remains outstanding. Backend validation and jet recognition remain outstanding for all of them.
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.
36
30
37| Name | Hoon behavior | Jibb status |
31| Name | Hoon behavior | Jibb status |
38| --- | --- | --- |
32| --- | --- | --- |
@@ -45,9 +39,9 @@ The following is an audit of the Hoon 135 bodies, not a completed Jibb interface
45| `drop` | Converts an absent unit to an empty list and a present unit to a singleton. | Written; inferred by the partial checker |
39| `drop` | Converts an absent unit to an empty list and a present unit to a singleton. | Written; inferred by the partial checker |
46| `fall` | Returns the value of a present unit or the supplied fallback. | Written; inferred by the partial checker |
40| `fall` | Returns the value of a present unit or the supplied fallback. | Written; inferred by the partial checker |
47| `flit` | Returns a gate that wraps a value only if it satisfies the predicate. | Written |
41| `flit` | Returns a gate that wraps a value only if it satisfies the predicate. | Written |
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 |
42+| `hunt` | Returns the only present unit or chooses between two present values with an ordering gate. | Missing |
49| `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 |
43| `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 |
50−| `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. | Written over `eq`; its generic payload retains the gate-free constraint |
44+| `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 |
51| `need` | Extracts a present value and crashes on an absent unit. | Written; inferred by the partial checker |
45| `need` | Extracts a present value and crashes on an absent unit. | Written; inferred by the partial checker |
52| `some` | Wraps a value in a present unit. | Written |
46| `some` | Wraps a value in a present unit. | Written |
53
47
@@ -158,7 +152,7 @@ The following shapes can be written as Jibb declarations once their referenced p
158 [%2 p=(list tank)]
152 [%2 p=(list tank)]
159```
153```
160
154
161−The compiler-result `tone.hoon` has the three cases listed above; the qualified name is a prelude group member, not a `+$` identifier containing a dot. Question 15 in [Decisions](spec/decisions.md#settled-milestone-2-questions) records @iko's decision that `@` is an unrestricted atom, resolving the `dime` and `pint` mismatch. The source-backed value form of `like` maps an existing result's product. Supported calls infer in the partial checker; complete checking and backend validation for `like` and `wonk` remain outstanding.
155+The compiler-result `tone.hoon` has the three cases listed above; the qualified name is a prelude group member, not a `+$` identifier containing a dot. Question 15 in [open-questions.md](open-questions.md) records @iko's decision that `@` is an unrestricted atom, resolving the `dime` and `pint` mismatch. The source-backed value form of `like` maps an existing result's product. Supported calls infer in the partial checker; complete checking and backend validation for `like` and `wonk` remain outstanding.
162
156
163## 4a
157## 4a
164
158
@@ -168,8 +162,6 @@ The compiler-result `tone.hoon` has the three cases listed above; the qualified
168
162
169`at`, `cass`, `cuss`, `crip`, `mesc`, `runt`, `sand`, `sane`, `ruth`, `trim`, `trip`, `teff`, `taft`, `tuba`, `tufa`, `tuft`, `wack`, `wick`, `woad`, `wood`.
163`at`, `cass`, `cuss`, `crip`, `mesc`, `runt`, `sand`, `sane`, `ruth`, `trim`, `trip`, `teff`, `taft`, `tuba`, `tufa`, `tuft`, `wack`, `wick`, `woad`, `wood`.
170
164
171−The prelude writes `trip` and `tuba` over private primitives. Their inferred types are `$-(@t (list @tD))` and `$-((list @tD) (list @c))`, matching the target ship's Hoon 135 definitions. Composition with `lent` and invalid argument controls pass in the partial checker; primitive lowering, execution and jet recognition remain unfinished.
172−
173## 4k
165## 4k
174
166
175`co`.
167`co`.
docs/prompts/milestone-2.md+5−5
@@ -49,7 +49,7 @@ And from the plan's Risks:
49
49
50## First steps
50## First steps
51
51
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`.
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`.
53
53
54 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.
54 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.
552. **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.
552. **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
70- 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]`.
70- 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]`.
71- `!!` 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.
71- `!!` 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.
72- `_` 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.
72- `_` 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−- `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.
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`.
74- 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`.
74- 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`.
75
75
76**Tags, `~`, numbers and cells wait for their context** (Grammar: Tag resolution, Literals by context)
76**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
93
93
94**Names and modules** (Grammar: Modules, Imports, Runes, Expressions; Core language: Programs and linking)
94**Names and modules** (Grammar: Modules, Imports, Runes, Expressions; Core language: Programs and linking)
95- "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").
95- "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 `poke.todo` is its derived command helper.
96+- Molds and values have separate namespaces, "told apart by position": `todo-action.todo` is a mold and its constructor.
97- Local definitions may start any body, "visible to each other and the final expression".
97- Local definitions may start any body, "visible to each other and the final expression".
98- `/- 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.
98- `/- 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.
99- 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."
99- 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
110
110
111**API files, stores and derived gates** (overview: Agent APIs, Effects; Grammar: Modules)
111**API files, stores and derived gates** (overview: Agent APIs, Effects; Grammar: Modules)
112- `/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.
112- `/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 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)`.
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 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.
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.
115
115
116**The prelude** (overview: Prelude, Layout and styling, Links and URLs, Effects)
116**The prelude** (overview: Prelude, Layout and styling, Links and URLs, Effects)
117- 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.
117- 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/reviews/2026-11-02-questions.mddeleted−344
@@ -1,344 +0,0 @@
1−# Questions from the 2026-11-02 review
2−
3−Every decision that [the review](2026-11-02-repo-review.md) raises, with options. Each **Answer** was prefilled with the recommended option. An answer marked *(chosen)* is the one Montelot picked; the rest are still the recommendation. A-numbers point into the review's appendix.
4−
5−Questions 16 to 28 are language or spec rulings. Under the ground rules they are @iko's to make and are recorded in decisions.md before the code changes.
6−
7−## Scope and process
8−
9−**1. Where should the review land?** It is on `claude/project-thread-7prdcx` now.
10−
11−- a) Push it to `master`, as development.md's "push straight to master" rule says.
12−- b) Open a pull request.
13−- c) Leave it on the branch.
14−
15−**Answer:** a *(chosen)*
16−
17−**2. What should be done first?**
18−
19−- a) The eight "fix first" bugs.
20−- b) The simplifications, starting with the test runner.
21−- c) The docs cleanup.
22−- d) Nothing more for now.
23−
24−**Answer:** a *(chosen)*
25−
26−**3. How should fixes land?**
27−
28−- a) Commits straight to `master` once every check passes, as development.md says.
29−- b) One pull request per theme.
30−- c) A branch you merge yourself.
31−
32−**Answer:** a *(chosen)*
33−
34−**4. Should a fake ship be set up in the cloud container**, so the ship checks run too? That needs the brass pill from GitHub LFS and a few minutes to boot.
35−
36−- a) Yes, before any fix that touches tools/ship, the desks or the mark.
37−- b) No, eval checks are enough.
38−
39−**Answer:** a *(chosen)*
40−
41−## Direction
42−
43−**5. How should the checker grow from here?** (A121)
44−
45−- a) Build the general core first: union-find bindings with levels, a deferred-constraint queue and Maranget's usefulness check, with `main = (program …)` checked as an ordinary application.
46−- b) Keep adding recovery paths until milestone 2's examples pass, and refactor after.
47−- c) Both: make today's recovery fall back to ordinary inference now, and plan the core as the next milestone-2 task.
48−
49−**Answer:** a *(chosen)*
50−
51−**6. Should the partial `golden-types` report be rendered from the full checker's per-definition results**, so there is one pipeline? (A122) About 283 `types.txt` outputs would change once.
52−
53−- a) Yes.
54−- b) No, keep the two pipelines.
55−
56−**Answer:** a *(chosen)*
57−
58−## Checker fixes
59−
60−**7. How should the keyed-view screen be fixed?** (A119, A38)
61−
62−- a) Run ordinary inference first, and recovery only for components it leaves unresolved. Some todo diagnostics may change.
63−- b) Keep recovery first, and fall back to ordinary inference when it declines.
64−
65−**Answer:** a *(chosen)*
66−
67−**8. Should the narrow initializer recovery go?** Deleting the null-sample gate and `program-init-context` (about 140 lines) lets the general path handle reordered models, and the seven negative init fixtures still fail. (A39)
68−
69−- a) Yes, once the todo, store and program tests pass.
70−- b) No.
71−
72−**Answer:** a *(chosen)*
73−
74−**9. How should an imported Hoon `(unit T)` be handled?** (A10)
75−
76−- a) Translate it to the prelude's `unit` union, passing the prelude template into the import bridge.
77−- b) For now, make it fit as unknown, so it fails closed instead of giving a false error.
78−
79−**Answer:** a *(chosen)*
80−
81−**10. Should printed types say `ask` and `qath` instead of `ask.internal` and `qath.internal`?** Two expected outputs change. (A134)
82−
83−- a) Yes.
84−- b) No.
85−
86−**Answer:** a *(chosen)*
87−
88−**11. Should every `?-` branch kind join its arm results by one rule:** unify, and if that fails, widen to an explicitly present parent aura or `@`? Then `?- b %.y n %.n 0` with `n=@ud` checks. (A133)
89−
90−- a) Yes.
91−- b) No, keep the per-kind rules.
92−
93−**Answer:** a *(chosen)*
94−
95−**12. Should top-level resolution make one pass in dependency order**, keeping the fixpoint as a fallback, with a 400-definition timing check added to the suite? (A135)
96−
97−- a) Yes.
98−- b) Only the fix.
99−- c) No.
100−
101−**Answer:** b *(chosen)*
102−
103−**13. Should the checker keep the errors it already finds?** That means the real error inside a local `++`, the name of the failing definition, the API reasons, and a definite error for a derived-name clash. Boundary strings that tests lock in would change. (A12, A40, A24)
104−
105−- a) Yes.
106−- b) No.
107−
108−**Answer:** a *(chosen)*
109−
110−**14. Should the 26-variable printer limit stop gating which modules check?** The printer would print `T27` and on, as it already can. (A124)
111−
112−- a) Yes.
113−- b) No.
114−
115−**Answer:** a *(chosen)*
116−
117−**15. Should the 32,768-node freshness scan be replaced** by a fresh-ID high-water mark computed once, with `%recursive` treated as a leaf? (A37)
118−
119−- a) Yes.
120−- b) Keep the scan and document its budget.
121−
122−**Answer:** a *(chosen)*
123−
124−## Language and spec rulings
125−
126−Montelot's answers to 16 to 28 are proposals. They are listed in [open-questions.md](../open-questions.md) until @iko confirms them; the code changes wait until then.
127−
128−**16. Which auras may a term literal fit?** Today `^- @tas %1.000` and `^- @tas %&` are accepted and `^- @ud %1.000` is rejected, the opposite of Hoon. grammar.md:141 supports the code; grammar.md:29 and "Literals: exactly Hoon's" don't. (A20)
129−
130−- a) Follow Hoon: a term literal fits its own aura family, so `%1.000` is `@ud` and `%&` is `?`.
131−- b) Keep grammar.md:141 as written.
132−
133−**Answer:** a *(chosen)*
134−
135−**17. May a name term fit `@t`, as `@tas` nests in `@t` in Hoon?** grammar.md:141 lists only `@tas`, `@ta`, `@` and `*`. (A20)
136−
137−- a) Yes.
138−- b) No.
139−
140−**Answer:** a *(chosen)*
141−
142−**18. May a gate fit `*`?** core-language.md says a function isn't a noun, but the prelude's `element` erases gates into `*`. (A23)
143−
144−- a) Yes: say in the spec that `*` may hold gates.
145−- b) No: design a typed erasure first.
146−
147−**Answer:** a *(chosen)*
148−
149−**19. Where should `[]` and `m()` be rejected?** Both are decided errors. Today the parser accepts them, and the checker calls `[]` "not supported". (A6, A100)
150−
151−- a) In the parser, at the closer, with new golden cases.
152−- b) In the checker, as definite errors.
153−
154−**Answer:** a *(chosen)*
155−
156−**20. Is `[a=@ud [a=@t b=?]]` one record or two scopes?** Hoon treats it as flat, and field access already does. Today the duplicate `a` is accepted and `a.x` is "ambiguous". (A30)
157−
158−- a) One record: the duplicate is an error.
159−- b) Two scopes, as compiler.md says now.
160−
161−**Answer:** a *(chosen)*
162−
163−**21. Should `/% %foo` together with `++ foo 1` be allowed?** `/%` binds only a mold, and molds and values have separate namespaces (grammar.md:94 and :102), but the scope check rejects it. (A25)
164−
165−- a) Yes.
166−- b) No.
167−
168−**Answer:** a *(chosen)*
169−
170−**22. Should a `?-` arm that matches no remaining case be a definite error** ("arm matches no case"), as grammar.md:184 implies, instead of "not supported"? (A15)
171−
172−- a) Yes.
173−- b) No.
174−
175−**Answer:** a *(chosen)*
176−
177−**23. Should `(mop K V)` carry its comparator,** so that `get.on gth` on an `lte` mop is an error? Neither Hoon nor decisions.md:39 does this. (A55)
178−
179−- a) No, match Hoon.
180−- b) Yes.
181−
182−**Answer:** a *(chosen)*
183−
184−**24. Should Hoon's `each` mold be renamed to `each.hoon`**, since the prelude also has the element gate `each`? They live in separate namespaces. (A64)
185−
186−- a) No, keep both.
187−- b) Yes.
188−
189−**Answer:** a *(chosen)*
190−
191−**25. When should `eq` and the gate-free type-variable constraint be built?** Both are decided, neither exists, and no doc tracks them. (A98)
192−
193−- a) In milestone 2.
194−- b) Later, and list them as outstanding.
195−
196−**Answer:** a *(chosen)*
197−
198−**26. Which Hoon unions should the importer learn?** Today `$%` with `%&`, `%|` or `%0` tags, `(each a b)` and `json` all fail, though the spec's import table lists them. (A50)
199−
200−- a) The non-`%tas` tags now, then `each` and `json` as catalog entries.
201−- b) Only the tags.
202−- c) Later.
203−
204−**Answer:** a *(chosen)*
205−
206−**27. Should the `%jibb` mark keep dropping the final newline on a `%txt` round trip**, as `%hoon` does? (A61)
207−
208−- a) Keep it, like `%hoon`.
209−- b) Preserve the newline, and change tools/ship's assertion.
210−
211−**Answer:** a *(chosen)*
212−
213−**28. Should the printer flatten `[a [b c]]` to `[a b c]` and print named molds by name**, such as `theme` and `item.todo`? (A136)
214−
215−- a) Yes.
216−- b) No.
217−
218−**Answer:** a *(chosen)*
219−
220−## Tests and tooling
221−
222−**29. Should one runner over the `tests/lib` test arms replace the 49 `tools/type-*-test` scripts and `importer-test`?** A prototype ran them in 681 s instead of 2,591 s. The `my-app` byte guards would move to a manifest. (A82, A120)
223−
224−- a) Yes.
225−- b) No.
226−
227−**Answer:** a *(chosen)*
228−
229−**30. Should there be one `tools/check` command, and CI?** (A92, A96)
230−
231−- a) `tools/check` now, and a CI job for the eval checks now.
232−- b) `tools/check` now, CI at milestone 7 as planned.
233−- c) Neither.
234−
235−**Answer:** a *(chosen)*
236−
237−**31. How should the 28 copies of `my-app` files under `tests/` be handled?** (A108, A109)
238−
239−- a) Map `my-app` into the `jibb-dev` desk outside `/tests` and read it directly, removing the copies.
240−- b) Keep the copies, and guard them all from one manifest.
241−
242−**Answer:** a *(chosen)*
243−
244−**32. Should the generated `tests/lib/jibb.hoon` (3,949 lines) stop being committed?** Assembly drops it and regenerates it anyway. (A83)
245−
246−- a) Yes, and add it to .gitignore.
247−- b) No.
248−
249−**Answer:** a *(chosen)*
250−
251−**33. Should the importer's test fixtures (about 550 lines) move out of `jibb-import.hoon`**, which app desks vendor, into `tests/lib/jibb-import.hoon`? (A52)
252−
253−- a) Yes.
254−- b) No.
255−
256−**Answer:** a *(chosen)*
257−
258−**34. Should the import-only fixtures move off `my-app`** (`sur/import-fixture.hoon`, `mar/label.hoon`, the Tlon probe) to a fixtures desk? (A113)
259−
260−- a) Yes.
261−- b) No.
262−
263−**Answer:** a *(chosen)*
264−
265−**35. Should the five `tools/hoon` checks that exit 0 whatever they print become test arms?** (A91)
266−
267−- a) Yes.
268−- b) No.
269−
270−**Answer:** a *(chosen)*
271−
272−**36. Should type-checker golden cases keep their full token and tree outputs?** They are 73% of all parser golden lines. (A94)
273−
274−- a) Keep them: each stage's output is compared.
275−- b) Let type cases opt out.
276−
277−**Answer:** a *(chosen)*
278−
279−**37. Should the tests keep calling internal library arms (137 of them)?** (A126)
280−
281−- a) Keep them for now, and revisit after the checker core changes.
282−- b) Move them behind a small public facade.
283−
284−**Answer:** a *(chosen)*
285−
286−**38. Should `my-app` keep the failing buttons example and the doc theme's static font?** Milestone 4 will treat both as errors. (A112)
287−
288−- a) Keep them through milestone 2, and list it as a milestone-4 open question.
289−- b) Move the error example out now.
290−
291−**Answer:** a *(chosen)*
292−
293−**39. Should every vendored package keep going into every desk?** (A117)
294−
295−- a) Yes, as designed.
296−- b) Make it per desk.
297−
298−**Answer:** a *(chosen)*
299−
300−**40. Should `tools/hoon` get a `--no-debug` mode** for timings, with the docs' figures re-measured? Every eval runs with `!:`, which makes checker work 2.2 to 2.6 times slower. (A137)
301−
302−- a) Yes.
303−- b) No.
304−
305−**Answer:** a *(chosen)*
306−
307−## Docs and repository
308−
309−**41. Should status.md become a capability table** (area, status, the test that proves it) plus a short list of gaps, with the history table replaced by `git log`? (A97, A95)
310−
311−- a) Yes.
312−- b) Only fix the contradictions.
313−
314−**Answer:** a *(chosen)*
315−
316−**42. Until the Claude design doc is synced, which spec wins?** (A104)
317−
318−- a) The repository copy, with a "synced" column in decisions.md.
319−- b) The Claude doc, as development.md says now.
320−
321−**Answer:** a *(chosen)*
322−
323−**43. Who syncs the Claude design doc with the repository's decisions?**
324−
325−- a) Me, if you give me edit access to it.
326−- b) @iko.
327−- c) Leave it for now.
328−
329−**Answer:** c *(chosen)*
330−
331−**44. Should open-questions.md hold only open questions**, with settled ones moved to decisions.md? (A103)
332−
333−- a) Yes.
334−- b) No.
335−
336−**Answer:** a *(chosen)*
337−
338−**45. Which licence should the repository have?** It has none, and doesn't state the licences of `vendor/` or the Tlon fixtures. (A107)
339−
340−- a) MIT, like urbit/urbit.
341−- b) Another licence.
342−- c) None: keep it private.
343−
344−**Answer:** a *(chosen)*
docs/reviews/2026-11-02-repo-review.mddeleted−294
@@ -1,294 +0,0 @@
1−# Repository review, 2026-11-02
2−
3−A review of the whole repository at [`4bf477e`](https://github.com/iko-soy/jibb/commit/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36), asked for in the project chat: look for issues and gaps, and for what could be simpler or more elegant.
4−
5−How it was done: ten reviewers each took one area (the lexer and parser, three slices of the checker, the importer with the mark and prelude, the Python tooling, the test harness, the docs, the example desks, and the architecture as a whole). A second reviewer then tried to refute every finding, by reading the code and by reproducing it with `tools/hoon` where that was cheap. A final pass looked for what the ten had missed. Every eval-based check in [development.md](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/docs/development.md#L124-L194) was also run, with vere 4.6 built from nixpkgs.
6−
7−Four commits reached `master` while the review ran (`2d74861` to `5ccd150`). The fix-first items 1 to 3 were rechecked at `5ccd150` and still hold there. Line numbers below are links into `4bf477e`. Findings are numbered A1 to A137 in the [appendix](#appendix-every-finding).
8−
9−## Summary
10−
11−- **Everything that can run without a ship passes.** All 60 eval checks pass, including 660 of 660 golden cases. The ship checks were not run, because this container has no fake ship.
12−- **137 findings survived verification: 2 high, 31 medium and 104 low.** 75 held exactly as reported and 62 held with corrections to scope, numbers or severity. None was refuted outright. Most of the low ones are polish.
13−- **The real bugs are in the full checker, and they reject valid code.** A program that is one step away from the todo island's exact shape is rejected, an imported Hoon `(unit T)` doesn't fit the prelude's `unit`, and private prelude names leak into printed types. None of them accepts a wrong program.
14−- **The test and docs scaffolding is heavier than it needs to be.** The push checklist is about 65 commands and 49 minutes. 49 copy-paste test scripts rebuild the library 81 times. `my-app` files are copied 28 times under `tests/`, several with no guard. `status.md` is a 59 KB log that contradicts itself on whether the cart store checks.
15−- **The checker grows one example at a time.** Each new example gets a narrow recovery path, a script, a fixture folder and a paragraph of docs, where a few shared mechanisms would remove code. That trend is the main thing worth deciding on (see [Direction](#direction)).
16−
17−## Check run
18−
19−| Check | Result | Time |
20−| --- | --- | --- |
21−| `tools/golden` | 660 of 660 pass | 74 s |
22−| 49 `tools/type-*-test` scripts and `tools/importer-test` | All pass | 2,591 s together. The slowest are `type-todo-full-test` (581 s) and `type-deferred-prepared-test` (411 s) |
23−| `tools/testdata/selftest` | 22 checks, 0 failed | 141 s |
24−| `tools/doc-blocks docs/spec` | 14 `jibb` blocks, 14 `doc-*` cases, none missing | under 1 s |
25−| `tools/ship gen-tests --check` | Up to date, 660 cases | under 1 s |
26−| The 5 `tools/hoon` checks (`check-spans-test`, `itype-unify-test`, three reference files) | Print the expected values. They exit 0 whatever they print (A91) | about 23 s each |
27−| `tools/testdata/clay-fixtures-selftest` | Pass | 4 s |
28−| `tools/ship test`, `check-commit`, `clay-fixtures`, `ship-selftest` | Not run: they need a fake ship | |
29−
30−The checks ran three at a time on four CPUs and took 2,924 s of check time in all. Every eval rebuilds the 15,172-line library, which now takes about 22 s, not the 8 s the docs quote (A102).
31−
32−## Fix first
33−
34−These are the bugs and gaps with the most effect on users of the checker or the tools. Each was reproduced by the second reviewer.
35−
36−| # | Problem | Evidence | Fix | Refs |
37−| --- | --- | --- | --- | --- |
38−| 1 | **Valid programs are rejected when their view has one keyed `each (turn …)` site.** The screen that skips "doomed" ordinary inference also skips attempts that would succeed | A program whose `init` is ``^- model [0 input `"x"]`` is rejected with "module definitions need unsupported inference". Listing the same `each` site twice turns the screen off, and the same program then passes. [`add-supported-defs-core`](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L10293) skips every name from [`program-recovery-names`](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L12997-L13038). Only the [recovery chain](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L14152-L14173) can add them back, and its init recoveries accept only a tuple ending in `~` or a `~` sample ([13667](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L13667), [13595](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L13595)) | Run ordinary inference first, then recover only the components it left unresolved. Separately, deleting the null-sample gate at 13595 makes reordered models pass and keeps all seven negative init fixtures failing, which removes about 140 lines | A119, A38, A39 |
39−| 2 | **An imported Hoon `(unit T)` does not fit the prelude's `unit`.** `fall`, `need` and `^- (unit @t)` on an imported unit give definite "do not unify" errors | [`import-to-itype`](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L6339-L6350) builds `[%collection %unit …]`, while the prelude's unit is an origin-tagged union ([8245-8255](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L8245-L8255)). [`itype-fit-inner`](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L5437-L5439) answers `%bad`. No fixture passes an imported unit to `fall` or `need` | Translate Hoon `unit` to the prelude's union, as `list` already shares its representation. At the least, make a collection against a prelude-origin union fit as `%unknown`. Add a golden case | A10 |
40−| 3 | **Printed types name the private prelude module**, as `(ask.internal @ud)` and `(unit qath.internal)` inside every `page` and `theme` type | [`prelude-label`](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L11423-L11436) relabels only a mold's top level. Two expected outputs lock the leak in: [types-prelude-ui/types.txt:85](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tests/golden/types-prelude-ui/types.txt#L85) and [jibb-theme.hoon:66](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tests/lib/jibb-theme.hoon#L66). [grammar.md:104](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/docs/spec/grammar.md#L104) says the prelude does not expose its internal module | Relabel internal origins with the public re-export name while preparing the prelude | A134 |
41−| 4 | **`?-` branches join their results by three different rules.** `?- b %.y n %.n 0` with `n=@ud` fails with "branch widening is not supported", even under `^- @ud`. A unit branch can't widen, and a union branch compares types with `!=` | Loobean pre-check at [8518](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L8518), plain unify for unit and list at [7671](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L7671), syntactic inequality for unions at [7841](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L7841) and [7943](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L7943) | One join helper for every branch kind: unify, then widen to an explicitly present parent aura or `@` | A133 |
42−| 5 | **Diagnostics the checker already has are thrown away** | An error inside a local `++` becomes the site-less "local definitions need unsupported inference" ([7236-7258](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L7236-L7258)). Full-check failures don't name the definition, and the API branch drops reasons it computed ([14087](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L14087), [14092](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L14092)). A derived-name clash, an error in the spec, is reported as "unsupported". The full module check reports a plain `@t`/`@ud` overlap as "unsupported" while the partial report proves it ([11340-11351](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L11340-L11351)) | Thread a reason, or the failing definition's name, through the resolver and recoveries. Use one overlap witness for both paths | A12, A40, A24 |
43−| 6 | **Forward references cost near-cubic time.** A 400-definition chain written top-down takes about 26 s of checker work, against about 1 s written bottom-up. The brief asks for "a 2,000-line module in seconds" | [`resolve-groups-core`](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L10309-L10328) is a fixpoint that resolves one link per pass and re-infers every unresolved definition each time. The dependency-ordered SCCs at [10318](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L10318) are used only for cycles | Resolve in one pass over the components already computed, keeping the fixpoint as a fallback. Compute `program-recovery-names` once per module, not per definition per pass | A135, A33 |
44−| 7 | **`tools/ship` and `tools/golden` bugs** | `tools/ship --pier /abs/path stop` can SIGTERM itself, because [`processes()`](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tools/ship#L285-L305) takes any process naming the pier for the king. The zero-byte `.txt` sync failure that [development.md:206](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/docs/development.md#L206) blames on the ship is a `MANIFEST` and `verify()` bug in `tools/ship` ([693](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tools/ship#L693), [1438](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tools/ship#L1438)). When a batch dies, `tools/golden` reruns all 660 cases one by one, each rebuilding the library, and Ctrl-C doesn't stop the queue ([363-396](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tools/golden#L363-L396)) | Identify the king from `.vere.lock`. Test `%txt` before `?@` in `MANIFEST`. Bisect failing batches and cancel queued futures | A65, A66, A67 |
45−| 8 | **A trailing `\` in a string says "a control character"**, and the lexer's character rules have no tests | [`+bad-char`](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L1637-L1643) treats the line feed as a control character. No golden source holds a CR, a control byte or any byte at or above 0x80, so UTF-8 column counting and about 20 hints are untested | Make `+bad-char` return `~` for 10 (verified to give the end-of-file messages). Add `lex-char-*` and `lex-utf8-*` cases | A1, A3 |
46−
47−Medium gaps that fail closed, so nothing wrong is accepted, but common code is refused:
48−
49−| Gap | Refs |
50−| --- | --- |
51−| A union reached through two import faces stops matching once one of its cases holds another named union, because cases are compared with their display labels ([4859](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L4859)) | A11 |
52−| Union matches on cases holding an imported `map`, `set`, `qeu`, `mop`, `jar` or `jug` fail, because inhabitation and gate-free proofs know only `list` and `unit` ([4793](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L4793), [5785](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L5785)) | A13 |
53−| An imported bare `@`, and auras such as `@uw`, are rejected, and the aura whitelist is written twice ([6326](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L6326-L6329), [6198-6209](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L6198-L6209)) | A14 |
54−| An undocumented 32,768-node freshness scan, run in up to six recovery arms, turns recovery off silently. The prelude alone uses 57% of it, and any imported recursive type makes it decline ([dg-scan](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L14512-L14539)) | A37 |
55−| The importer accepts only `%tas` head tags and knows no standard unions, so `$%` with `%&`, `%\|` or `%0` tags, `(each a b)` and `json` fail, although the spec's import table lists them ([jibb-import.hoon:104-110](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb-import.hoon#L104-L110)) | A50 |
56−| The full todo, page and API checks read five copies of the todo `/sur` and marks that nothing compares with `my-app`. Changing `my-app/sur/todo.hoon` leaves `type-todo-partial-test` passing | A109, A81 |
57−| `eq` is decided but missing from the prelude, the checker has no gate-free type-variable constraint, and no doc tracks either | A98 |
58−
59−## Simplify
60−
61−Each row was checked to be behaviour-preserving, or the table says what it would change.
62−
63−| Opportunity | Today | Proposed | Payoff | Refs |
64−| --- | --- | --- | --- | --- |
65−| One test runner | 49 `tools/type-*-test` scripts and `importer-test`, 2,154 lines. Each one slices a `tests/lib` file at `'\n\|%\n'` or at arm names, rebinds its fixtures under new names, and starts its own eval. Several keep Python copies of the check lists in the ship arms, so eval and ship run different wrappers | One runner that reads each `tests/lib/jibb-*.hoon` header, binds `/+` and `/*` as Ford would, and runs every `test-` arm under `mule`. Keep the `my-app` byte guards, diffs and `--update` somewhere else | A 90-line prototype ran all 55 ship test arms under eval in 681 s, against 2,591 s for the scripts, and removes the eval/ship drift | A82, A120, A80, A84 |
66−| One check command | About 65 commands, kept in four lists that disagree. `status.md` misses 18 and the README names 27 of the 49 type tools | `tools/check`, with `--ship` for the ship steps. Point every doc at it | One list, and a base for the CI that milestone 7 plans | A96, A92 |
67−| One source of `my-app` | 28 byte copies of 13 `my-app` files, plus 5 marks with the `/-` line removed. Eight tools hard-code their own guard pairs, and several copies have no guard | Map `my-app` into the `jibb-dev` desk outside `/tests` and read it directly, or keep one manifest checked by one tool | Removes the copies, and the drift they allow | A108, A128, A81, A109 |
68−| One checker pipeline | The partial report ([`golden-types-in-context-core`](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L14385-L14510)) repeats the finalization of [`add-supported-result`](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L10266-L10286) and runs none of the kind checks. The todo island gets a partial report but passes the full check | Have `infer-jibb-file-detailed` return a scheme or an error per definition, and render the report from that | Finalization in one place, and typed goldens that test the real checker | A122, A46, A42 |
69−| Program recovery | Six recovery arms repeat a preamble and a 25-35 line tail, and the copies have drifted. Four copies of the `main` walk | A `recover-def` helper and one `main-call-args` walk | A few hundred lines | A48, A39 |
70−| AST and type walkers | 56 arms, about 650 lines, in the `scope-*`, `dependency-*`, `duplicate-*`, `reserved-proj-*`, `*-has-hole` and `program-view-sites-*` families | One `node-kids` enumeration and a fold. The printers and `infer-fragment` still need their own dispatch | Fewer places to edit per new node kind | A129, A32, A21 |
71−| `%gate` and `%gate-wide` | Identical fields. 40 uses in the checker, 10 `\|(?=(%gate …) ?=(%gate-wide …))` tests and two duplicated 9-line branches | `?=(?(%gate %gate-wide) -.x)`, or one node with a `wide` flag | Noise removed without changing goldens | A123, A34 |
72−| Dead code | Five unreferenced arms and a type (A26). `one-request-interface-source`, and the narrow API branch, which gives an identical interface for `blog.jibb` (A44). `golden-types-with-modules`. The importer's `+fixture-test`. The committed, generated `tests/lib/jibb.hoon` (3,949 lines), which assembly drops and regenerates. `my-app` assembly skipping a `jibb-dev/tests` that doesn't exist | Delete them, and drop `gen-tests --check` from the checklist | Less to read and keep current | A26, A31, A44, A42, A51, A83, A111 |
73−| Test code in shipped libraries | About 550 lines, nearly a quarter of `jibb-import.hoon`, are fixtures used only by tests, and app desks vendor the file | Move them into `tests/lib/jibb-import.hoon`, as `jibb-api-paths.hoon` already does | A smaller vendored library | A52, A127 |
74−| Named state and limits | `istate`'s 27 fields are built positionally at 10 sites, `add-supported-defs-core` takes 19 positional arguments, and budgets are literals (256 ×32, 64 ×18, 32,768 ×13). The printer's 26-variable cap also rejects modules with 27 type variables | An `icontext` record with a `fresh-state` constructor, a `limits` core, and one `deferred-eligible` arm in place of three copies | Safer edits, and no printer limit on what checks | A28, A125, A124 |
75−| Parser helpers | The `?(` check is a backward token walk at 12 call sites. `+in` and `+fail` shadow the standard library, which costs 16 `in:..zuse` workarounds | One lexer branch for `?(` (verified to keep every error column). Rename `+in` and move the `+fail*` helpers into `+parser` | Smaller parser, no shadowing | A7, A8 |
76−
77−## Direction
78−
79−The checker is growing as narrow recovery paths fitted to the example files: the todo island, the cart store, the theme. In the 50 commits this clone holds, `jibb.hoon` grew by 6,199 lines, and the seven commits that add a kind of module added 1,816 of them. There are now three representations of recursive types (`%recursive`, `%jrec`, `%grec`), about 50 branch and pattern arms, and 257 strings that report something as "unsupported" or "not supported". Each slice also brings a test script, a fixture folder and a paragraph in `compiler.md`, which is now 75 KB. Fix-first item 1 shows the cost: a program one edit away from the todo's shape is rejected.
80−
81−The milestone-2 brief suggests, without requiring it, a different core: union-find bindings with levels, a queue of deferred constraints, and Maranget's usefulness check for matches ([milestone-2.md:130-142](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/docs/prompts/milestone-2.md#L130-L142)). With it, `main = (program init update view subs)` would be an ordinary application whose sample unifies with its components, and much of the 1,180 lines of program recovery could go. Whether to build that core before adding the next slice is the main decision this review raises. (A121)
82−
83−## Docs
84−
85−| Doc | Problem | Fix | Refs |
86−| --- | --- | --- | --- |
87−| [status.md](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/docs/status.md) | 59 KB, with a 16,412-character paragraph at line 68 and a 115-row table that repeats `git log`. It says the cart store passes ([54](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/docs/status.md#L54)) and that it fails closed ([68](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/docs/status.md#L68)). Both are true, for different entry points, and the doc says neither | A capability table (area, status, the test that proves it), a short list of known gaps, and milestone commits instead of the history table | A97, A95 |
88−| Check lists in README, development.md and status.md | They disagree. [development.md:3](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/docs/development.md#L3) says the README describes each tool in full, but only development.md's table is complete | One `tools/check`, and one list | A96 |
89−| [compiler.md](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/docs/compiler.md) and the [`jibb.hoon` header](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L1-L36) | Both still say milestone 1, and the chapter map leaves out `%union-analysis`, about 4,700 lines. The program-recovery chain is described inaccurately: the "doomed attempts" the screen skips can succeed | Update the header, the chapter map and the recovery paragraph | A60, A101, A131, A41 |
90−| The library's design notes | Sections 2.6, 3 and 4.2 don't mention the `_` type hole or the `?(` hint | Add both | A2 |
91−| [open-questions.md](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/docs/open-questions.md) | Mostly settled questions, against its own rule. Question 6 is stale. `eq` reads as implemented | Move settled ones to decisions; mark `eq` as decided, not built | A103, A100, A98 |
92−| decisions.md, prelude-inventory.md | The core-language row still says "proposed". The inventory lists shapes as future work that now exist | Update | A99, A54, A105 |
93−| Timings | "About 8 s" to build the library is now about 22 s. Every figure is measured with `!:`, which makes checker work 2.2 to 2.6 times slower than on a ship, and no doc says so | Update the figure, and say which mode each figure uses | A102, A137 |
94−| Licence | No LICENSE, and the licences of `vendor/` and the Tlon fixtures are unstated | Add a LICENSE and a line in the README | A107 |
95−
96−## Not covered
97−
98−The ship checks weren't run, so ship-only behaviour, such as `tools/ship test`, `check-commit` and `clay-fixtures`, is reviewed from the code only. The spec in `docs/spec/` was checked for internal consistency and against the code, not as language design. The findings come from targeted reading and probes, not a line-by-line audit of all 15,172 lines.
99−
100−## Appendix: every finding
101−
102−"Confirmed" means the second reviewer reproduced the finding as stated. "Partly" means the core holds but the scope, numbers or severity were corrected; the title shown is the corrected one. Severity is the second reviewer's, judged for a project in the middle of milestone 2. Some problems were found independently by two reviewers and appear in both areas, for example A38 and A119, A82 and A120, A108 and A128.
103−
104−### Lexer, parser and printers (`jibb.hoon` 1–4597)
105−
106−| # | Finding | Severity | Verdict | Kind | Where |
107−| --- | --- | --- | --- | --- | --- |
108−| A1 | A `\` or `\X` escape cut off by the end of the line reports "a control character", which contradicts 2.2 and differs from the same text at the end of the file | Medium | Confirmed | bug | [jibb.hoon:1609-1625](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L1609-L1625), [jibb.hoon:1637-1643](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L1637-L1643), [jibb.hoon:105-110](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L105-L110) and 1 more |
109−| A2 | Design notes 2.6, 3 and 4.2 never mention the `_` type hole or the `?(` union hint; the header still says milestone 1 | Medium | Confirmed | inconsistency | [jibb.hoon:1](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L1), [jibb.hoon:162-231](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L162-L231), [jibb.hoon:489-505](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L489-L505) and 7 more |
110−| A3 | Section 2.2's CR/control/non-ASCII errors, UTF-8 column counting and about 20 lexer and parser hints have no golden case | Medium | Confirmed | test-gap | [jibb.hoon:1637-1645](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L1637-L1645), [jibb.hoon:1630](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L1630), [jibb.hoon:1709-1712](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L1709-L1712) and 3 more |
111−| A4 | +read-string's +doomed call, and the notes' "or the } of an interpolation" case, can never trigger | Low | Confirmed | dead-code | [jibb.hoon:3426-3431](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L3426-L3431), [jibb.hoon:2953-2975](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L2953-L2975), [jibb.hoon:651-657](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L651-L657) and 2 more |
112−| A5 | Left-out Hoon runes get the doc's reason only sometimes, and second-character messages override 2.2's character errors | Low | Confirmed | inconsistency | [jibb.hoon:238-240](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L238-L240), [jibb.hoon:270-274](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L270-L274), [jibb.hoon:1317-1324](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L1317-L1324) and 3 more |
113−| A6 | `[]` in an expression reaches the checker as "not supported", not the decided error, and open question 6 is stale; the parser's acceptance of `[]`/`m()` is a documented milestone-1 choice | Low | Partly | gap | [jibb.hoon:3492-3493](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L3492-L3493), [jibb.hoon:9400](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L9400), [jibb.hoon:9440](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L9440) and 4 more |
114−| A7 | The `?(` check is a backward token walk repeated at 12 parser call sites, where one lexer branch would do (verified to keep every column) | Low | Partly | simplification | [jibb.hoon:3144-3153](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L3144-L3153), [jibb.hoon:1337-1345](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L1337-L1345), [jibb.hoon:3164](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L3164) and 2 more |
115−| A8 | Renaming +in and moving the +fail* helpers into +parser would remove both standard-library shadowings, the 16 `in:..zuse` workarounds and the `file` forwarders | Low | Partly | simplification | [jibb.hoon:2368-2572](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L2368-L2572), [jibb.hoon:2727-2759](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L2727-L2759), [jibb.hoon:2892-2902](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L2892-L2902) and 3 more |
116−| A9 | Path-segment loops, open-mold-line loops and item/line name branches are near copies; some proposed merges are not clearly simpler | Low | Partly | duplication | [jibb.hoon:3087-3105](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L3087-L3105), [jibb.hoon:3375-3391](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L3375-L3391), [jibb.hoon:4048-4064](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L4048-L4064) and 6 more |
117−
118−### Checker core (`jibb.hoon` 4597–8364)
119−
120−| # | Finding | Severity | Verdict | Kind | Where |
121−| --- | --- | --- | --- | --- | --- |
122−| A10 | An imported Hoon (unit T) is a %collection, but the prelude unit is an origin-tagged union, so fall, need and (unit T) casts give false definite errors | High | Confirmed | bug | [jibb.hoon:6339-6350](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L6339-L6350), [jibb.hoon:5437-5439](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L5437-L5439), [jibb.hoon:8245-8255](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L8245-L8255) and 3 more |
123−| A11 | Same-origin, non-generic unions are compared by raw case equality, so a union reached through two import faces fails once a case contains a relabelled nested union | Medium | Confirmed | bug | [jibb.hoon:4857-4860](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L4857-L4860), [jibb.hoon:5415-5418](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L5415-L5418), [jibb.hoon:6553-6582](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L6553-L6582) and 1 more |
124−| A12 | Definite errors inside local `++` definitions are deferred and then replaced by the site-less 'local definitions need unsupported inference' | Medium | Confirmed | gap | [jibb.hoon:7236-7258](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L7236-L7258), [jibb.hoon:7284-7300](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L7284-L7300) |
125−| A13 | Union inhabitation and gate-free proofs only recognize list/unit collections, so union matches on cases holding imported map/set/qeu/mop/jar/jug fail closed | Medium | Confirmed | gap | [jibb.hoon:4792-4794](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L4792-L4794), [jibb.hoon:5784-5788](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L5784-L5788), [jibb.hoon:6342-6350](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L6342-L6350) |
126−| A14 | The import bridge rejects bare `@` and other unsigned auras, and recursive molds with `?` or `*` fields; the aura whitelist is duplicated | Medium | Confirmed | gap | [jibb.hoon:6326-6329](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L6326-L6329), [jibb.hoon:6198-6209](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L6198-L6209), [jibb-import.hoon:1522-1526](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb-import.hoon#L1522-L1526) |
127−| A15 | A ?- arm that matches no remaining case is reported as 'union pattern is not supported' instead of a definite unreachable-arm error | Low | Confirmed | gap | [jibb.hoon:7830-7833](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L7830-L7833), [jibb.hoon:7869-7872](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L7869-L7872), [jibb.hoon:7918-7921](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L7918-L7921) and 1 more |
128−| A16 | Variable-kind refinement relies on self-bindings that itype-walk special-cases in six copied arms (plus a seventh copy at 14523) | Low | Confirmed | robustness | [jibb.hoon:4693-4727](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L4693-L4727), [jibb.hoon:4873-4876](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L4873-L4876), [jibb.hoon:5939](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L5939) and 1 more |
129−| A17 | Union-branch coverage loop exists in three copies; list/unit branch, list-item, standard-list and fit-and-diagnose code is also duplicated, and one copy has drifted | Low | Confirmed | duplication | [jibb.hoon:7806-7945](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L7806-L7945), [jibb.hoon:7583-7673](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L7583-L7673), [jibb.hoon:7477-7519](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L7477-L7519) and 1 more |
130−| A18 | Dead fuel and sub parameters, an always-true unify, and two dead find-imported-mold lines | Low | Confirmed | dead-code | [jibb.hoon:5089-5111](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L5089-L5111), [jibb.hoon:5656-5730](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L5656-L5730), [jibb.hoon:6439-6440](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L6439-L6440) |
131−| A19 | The record-width guard counts faced spine entries, so a flat faced tuple cast to a record with a faced nested tail is refused as unsupported | Low | Confirmed | gap | [jibb.hoon:5373-5377](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L5373-L5377), [jibb.hoon:5656-5675](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L5656-L5675) |
132−| A20 | Term-literal fit into an atom ignores the literal's aura: `%1.000`, `%&` and `%1` fit @tas or ?, and `%1.000` never fits @ud, unlike Hoon; the spec is ambiguous | Low | Partly | bug | [jibb.hoon:5459-5465](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L5459-L5465), [jibb.hoon:5477-5486](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L5477-L5486), [jibb.hoon:8279](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L8279) and 2 more |
133−| A21 | Many hand-written itype 'contains X' traversals and a repeated variable-kind disjunction could share one children/fold helper | Low | Partly | simplification | [jibb.hoon:5064-5075](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L5064-L5075), [jibb.hoon:5216-5290](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L5216-L5290), [jibb.hoon:5846-5870](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L5846-L5870) and 1 more |
134−| A22 | The noun-fit comment says a bare tag is 'fixed as a constant', but the tag is bound to `*` or to the expected aura | Low | Partly | inconsistency | [jibb.hoon:5390-5396](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L5390-L5396), [jibb.hoon:5460-5463](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L5460-L5463) |
135−| A23 | Gates fit `*`, in tension with core-language.md ('a function isn't a noun'), but the prelude relies on it | Low | Partly | inconsistency | [jibb.hoon:5390-5396](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L5390-L5396), [docs/spec/core-language.md:33](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/docs/spec/core-language.md#L33), [docs/compiler.md:149](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/docs/compiler.md#L149) and 1 more |
136−
137−### Expression inference, unions, API analysis (`jibb.hoon` 8364–12535)
138−
139−| # | Finding | Severity | Verdict | Kind | Where |
140−| --- | --- | --- | --- | --- | --- |
141−| A24 | Full module check reports overlaps that the partial report proves (atoms, ? vs a loobean, nested tags) as 'unsupported', with no overlap evidence | Medium | Confirmed | inconsistency | [jibb.hoon:11340-11351](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L11340-L11351), [jibb.hoon:11352-11365](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L11352-L11365), [jibb.hoon:10965-10993](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L10965-L10993) and 3 more |
142−| A25 | module-scope-valid checks /% mark names against the value namespace, though /% binds only a mold | Low | Confirmed | inconsistency | [jibb.hoon:11232-11242](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L11232-L11242), [jibb.hoon:11298-11311](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L11298-L11311), [jibb.hoon:11893-11903](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L11893-L11903) and 2 more |
143−| A26 | Five unreferenced arms (plus the iwidth-elaboration type) and header comments sitting above unrelated arms | Low | Confirmed | dead-code | [jibb.hoon:8585-8603](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L8585-L8603), [jibb.hoon:8919-8920](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L8919-L8920), [jibb.hoon:9099-9104](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L9099-L9104) and 4 more |
144−| A27 | request-graph-merge re-inlines input matching and the bound check; its fuel arguments never limit; the unconditional bound contradicts 'request-bearing graphs alone have a size limit' | Low | Confirmed | inconsistency | [jibb.hoon:11656-11728](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L11656-L11728), [jibb.hoon:14192](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L14192), [jibb.hoon:14234-14235](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L14234-L14235) and 1 more |
145−| A28 | istate (27 fields) is built as a positional tuple at 10 sites | Low | Confirmed | robustness | [jibb.hoon:5807](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L5807), [jibb.hoon:10297](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L10297), [jibb.hoon:10324](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L10324) and 8 more |
146−| A29 | prepare-prelude*, module-mold-types*, union-state budgets and several small predicates are near-copies | Low | Confirmed | duplication | [jibb.hoon:11614-11634](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L11614-L11634), [jibb.hoon:11352-11377](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L11352-L11377), [jibb.hoon:10704-10721](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L10704-L10721) and 5 more |
147−| A30 | Nested unfaced tail brackets get their own duplicate-field scope (documented), while field reads treat the whole spine as one record, so [a=@ud [a=@t b=?]] is accepted but a.x is 'ambiguous' | Low | Partly | bug | [jibb.hoon:11058](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L11058), [jibb.hoon:11098](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L11098), [jibb.hoon:11141-11150](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L11141-L11150) and 4 more |
148−| A31 | API analysis duplicates its -source/-graph gates, keeps a dead one-request-interface-source and a narrow branch that multi-request nearly subsumes | Low | Partly | duplication | [jibb.hoon:12006-12043](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L12006-L12043), [jibb.hoon:12112-12178](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L12112-L12178), [jibb.hoon:12253-12359](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L12253-L12359) and 3 more |
149−| A32 | Expression and itype walkers repeat the same per-kind dispatch and per-container helpers | Low | Partly | duplication | [jibb.hoon:9917-10018](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L9917-L10018), [jibb.hoon:10936-10955](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L10936-L10955), [jibb.hoon:11134-11231](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L11134-L11231) and 5 more |
150−| A33 | infer-recursive-gate is retried for every failed definition, including non-self-referencing gates, and a failed single self-loop is retried again via infer-gate-group | Low | Partly | performance | [jibb.hoon:10287-10307](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L10287-L10307), [jibb.hoon:10234-10256](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L10234-L10256), [jibb.hoon:10309-10328](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L10309-L10328) and 3 more |
151−| A34 | %gate and %gate-wide get separate ?- arms with identical bodies in the inference chapter | Low | Partly | simplification | [jibb.hoon:8559-8576](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L8559-L8576), [jibb.hoon:9850-9910](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L9850-L9910), [jibb.hoon:10031-10047](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L10031-L10047) and 2 more |
152−| A35 | Four capital helpers repeat the same resolve-to-ident block; show-itype has five identical variable arms; 'is a variable' tests are inlined in several places | Low | Partly | simplification | [jibb.hoon:9640-9699](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L9640-L9699), [jibb.hoon:9537-9552](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L9537-L9552), [jibb.hoon:8904](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L8904) and 4 more |
153−| A36 | infer-call-context-args and infer-fragment's two-name %wing branch duplicate existing gates; raw-expected use at the 'direct' context sites is deliberate but uncommented | Low | Partly | simplification | [jibb.hoon:9419-9433](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L9419-L9433), [jibb.hoon:8840-8844](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L8840-L8844), [jibb.hoon:8423-8431](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L8423-L8431) and 2 more |
154−
155−### Program, page and store mains; entry points; deferred inference (`jibb.hoon` 12535–15172)
156−
157−| # | Finding | Severity | Verdict | Kind | Where |
158−| --- | --- | --- | --- | --- | --- |
159−| A37 | An undocumented 32,768-node freshness scan, repeated in up to six recovery arms, silently turns off program recovery when it runs out or meets a %recursive type | Medium | Confirmed | robustness | [jibb.hoon:12747](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L12747), [jibb.hoon:12909](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L12909), [jibb.hoon:13302](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L13302) and 6 more |
160−| A38 | The keyed-view screen also skips ordinary inference of init, so an init that would check ordinarily is rejected unless it matches the tuple-ending-null or null-sample recovery shape | Medium | Partly | bug | [jibb.hoon:10293](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L10293), [jibb.hoon:12997-13037](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L12997-L13037), [jibb.hoon:14152-14173](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L14152-L14173) and 4 more |
161−| A39 | Unannotated init recovery is limited to a tuple ending in `~` or a `~` sample; dropping the null-sample gate in program-plain-init-context covers reordered models and keeps the init guards | Medium | Partly | gap | [jibb.hoon:13595](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L13595), [jibb.hoon:13650-13752](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L13650-L13752), [jibb.hoon:12692-12706](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L12692-L12706) and 4 more |
162−| A40 | Full-check failures collapse to generic boundary messages: no definition named, API reasons discarded, and a derived-name clash (a spec error) reported as unsupported | Medium | Partly | gap | [jibb.hoon:14189-14190](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L14189-L14190), [jibb.hoon:14087](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L14087), [jibb.hoon:14092](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L14092) and 4 more |
163−| A41 | compiler.md and status.md describe the program-recovery chain inaccurately (nonempty subscriptions, 'doomed' screen, missing null-sample and plain-view recoveries), and a comment points the wrong way | Low | Confirmed | docs | [docs/compiler.md:139](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/docs/compiler.md#L139), [docs/compiler.md:141](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/docs/compiler.md#L141), [docs/status.md:50](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/docs/status.md#L50) and 2 more |
164−| A42 | The golden-types entry chain parses and duplicate-checks the source up to three times, the deferred paths parse and resolve again, eligibility guards are repeated, and golden-types-with-modules has no callers | Low | Confirmed | simplification | [jibb.hoon:14297-14392](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L14297-L14392), [jibb.hoon:14943-15017](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L14943-L15017), [jibb.hoon:14176-14185](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L14176-L14185) and 3 more |
165−| A43 | The no-prelude report prints a bare 'module has reserved proj name' without the partial-inference header, the prepared path reports 'module has conflicting names', and the no-prelude branch is untested | Low | Confirmed | inconsistency | [jibb.hoon:14393-14394](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L14393-L14394), [jibb.hoon:14344-14347](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L14344-L14347), [jibb.hoon:11305](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L11305) |
166−| A44 | The 'narrow' API branch with one-request-interface-graph is redundant for blog.jibb: multi-request-interface-graph produces the identical interface and cache | Low | Confirmed | simplification | [jibb.hoon:14078-14093](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L14078-L14093), [jibb.hoon:12307-12362](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L12307-L12362), [jibb.hoon:12488-12531](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L12488-L12531) and 1 more |
167−| A45 | Unused parameters, no-op scans and defensive or unreachable checks in the recovery and dg arms | Low | Confirmed | dead-code | [jibb.hoon:12713](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L12713), [jibb.hoon:14585-14591](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L14585-L14591), [jibb.hoon:14842](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L14842) and 6 more |
168−| A46 | The partial golden-types report uses its own resolver, with no program recovery and no grec index, so it disagrees with the full checker; this is deliberate, labelled and tested | Low | Partly | inconsistency | [jibb.hoon:14385-14508](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L14385-L14508), [jibb.hoon:14400](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L14400), [jibb.hoon:14152-14173](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L14152-L14173) and 1 more |
169−| A47 | The experimental deferred (dg-*) transaction cannot affect a prelude-backed full check; this is already documented, and the cost is maintenance | Low | Partly | gap | [jibb.hoon:14176-14185](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L14176-L14185), [jibb.hoon:14972](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L14972), [jibb.hoon:15014](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L15014) and 4 more |
170−| A48 | Program recovery arms repeat the same preamble and a 25-35 line tail, which has drifted slightly; a shared helper would remove a few hundred lines, not most of 1,000 | Low | Partly | duplication | [jibb.hoon:12712-12816](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L12712-L12816), [jibb.hoon:12874-12972](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L12874-L12972), [jibb.hoon:13266-13341](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L13266-L13341) and 4 more |
171−| A49 | grec proves one fixed recursive-tree layout on purpose; unfolding re-proves it and re-asserts its shape with 16 ?> checks instead of reusing the parts the proof found | Low | Partly | simplification | [jibb.hoon:15085-15115](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L15085-L15115), [jibb.hoon:15118-15157](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L15118-L15157), [tests/type-generic-recursion/about.txt:1-12](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tests/type-generic-recursion/about.txt#L1-L12) and 1 more |
172−
173−### Hoon importer, `%jibb` mark and prelude
174−
175−| # | Finding | Severity | Verdict | Kind | Where |
176−| --- | --- | --- | --- | --- | --- |
177−| A50 | The source fallback accepts only %tas head tags, and the catalog has no hoon.hoon or zuse unions, so $% or $? with %&, %\| or %0 tags, (each a b) and json all fail closed, although the spec's import table lists them | Medium | Partly | gap | [jibb-import.hoon:104-110](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb-import.hoon#L104-L110), [jibb-import.hoon:383](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb-import.hoon#L383), [jibb-import.hoon:413](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb-import.hoon#L413) and 5 more |
178−| A51 | +fixture-test is never called, but tests/importer/about.txt says it checks the structured values | Low | Confirmed | dead-code | [jibb-import.hoon:1720](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb-import.hoon#L1720), [jibb-import.hoon:1727-1839](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb-import.hoon#L1727-L1839), [tests/importer/about.txt:57-58](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tests/importer/about.txt#L57-L58) |
179−| A52 | About 540 lines (about 23%) of test-only fixture arms live in the importer library that app desks vendor | Low | Confirmed | simplification | [jibb-import.hoon:1720-1839](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb-import.hoon#L1720-L1839), [jibb-import.hoon:1887-2306](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb-import.hoon#L1887-L2306), [tests/lib/jibb-import.hoon:42](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tests/lib/jibb-import.hoon#L42) and 1 more |
180−| A53 | The importer header and two jibb.hoon comments name +read-mold, which no caller uses and which cannot import collections, instead of +read-named or +read-mark | Low | Confirmed | inconsistency | [jibb-import.hoon:1-31](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb-import.hoon#L1-L31), [jibb.hoon:5640](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L5640), [jibb.hoon:11032](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L11032) |
181−| A54 | prelude-inventory.md still lists the 3g shapes as future work and contradicts itself on the 2a inference status | Low | Confirmed | docs | [docs/prelude-inventory.md:141-157](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/docs/prelude-inventory.md#L141-L157), [docs/prelude-inventory.md:35](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/docs/prelude-inventory.md#L35), [docs/prelude-inventory.md:39-52](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/docs/prelude-inventory.md#L39-L52) and 1 more |
182−| A55 | The importer drops a mop's comparator, as the spec's (mop K V) decision implies, so lte and gth mops import identically; whether the order should be checked is a design question, not an importer bug | Low | Partly | gap | [jibb-import.hoon:1242-1266](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb-import.hoon#L1242-L1266), [jibb-import.hoon:1578-1581](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb-import.hoon#L1578-L1581), [docs/spec/decisions.md:39](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/docs/spec/decisions.md#L39) and 2 more |
183−| A56 | The definite-overlap witness covers only a top-level $? of tagged cells, as documented; duplicate $% tags, ?(%a %a) and nested overlaps report 'could not be verified' | Low | Partly | inconsistency | [jibb-import.hoon:416-441](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb-import.hoon#L416-L441), [jibb-import.hoon:390-401](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb-import.hoon#L390-L401), [tests/importer/tree.txt:76-78](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tests/importer/tree.txt#L76-L78) and 1 more |
184−| A57 | The provenance preamble, the local-chapter scan and the standard-collection name list are copied in many places | Low | Partly | duplication | [jibb-import.hoon:527-532](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb-import.hoon#L527-L532), [jibb-import.hoon:552-557](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb-import.hoon#L552-L557), [jibb-import.hoon:629-634](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb-import.hoon#L629-L634) and 12 more |
185−| A58 | Several helpers are near-copies; the $% and $? case scans differ only in a budget that was deliberately added to the $? path alone | Low | Partly | simplification | [jibb-import.hoon:88-102](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb-import.hoon#L88-L102), [jibb-import.hoon:168-181](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb-import.hoon#L168-L181), [jibb-import.hoon:124-163](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb-import.hoon#L124-L163) and 8 more |
186−| A59 | The opt-in diagnostic readers re-run provenance, the overlap witness and the walk after a failure; this is documented | Low | Partly | performance | [jibb-import.hoon:624-660](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb-import.hoon#L624-L660), [jibb-import.hoon:535-536](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb-import.hoon#L535-L536), [docs/compiler.md:107](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/docs/compiler.md#L107) and 1 more |
187−| A60 | jibb.hoon's header still says milestone 1 and lists a partial API; compiler.md's 'From the header' table and its %api chapter row do not match the file | Low | Partly | docs | [jibb.hoon:1-36](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L1-L36), [docs/compiler.md:25-38](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/docs/compiler.md#L25-L38), [docs/compiler.md:51](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/docs/compiler.md#L51) and 3 more |
188−| A61 | The %jibb mark's %txt round trip drops the final newline, deliberately mirroring %hoon; changing grab txt would also require changing tools/ship's assertion | Low | Partly | robustness | [mar/jibb.hoon:6](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/mar/jibb.hoon#L6), [mar/jibb.hoon:11](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/mar/jibb.hoon#L11), [mar/jibb.hoon:14](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/mar/jibb.hoon#L14) and 2 more |
189−| A62 | +$ attr spells pad and gap as eight constant cases where a spacing mold and two cases would match the other attributes | Low | Partly | simplification | [prelude.jibb:405-417](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb/prelude.jibb#L405-L417), [docs/spec/overview.md:198](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/docs/spec/overview.md#L198), [docs/spec/overview.md:204](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/docs/spec/overview.md#L204) |
190−| A63 | internal.jibb has no comment saying that list.core and unit.core are the public prelude's validated molds, which the compiler injects; tuba-text has no sample mold | Low | Partly | docs | [internal.jibb:1](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb/internal.jibb#L1), [internal.jibb:22](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb/internal.jibb#L22), [internal.jibb:29-33](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb/internal.jibb#L29-L33) and 2 more |
191−| A64 | The prelude's mold each (Hoon 1c) and the element gate each are unrelated, as the spec requires; whether to rename is a spec question | Low | Partly | inconsistency | [prelude.jibb:131-133](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb/prelude.jibb#L131-L133), [prelude.jibb:464-465](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb/prelude.jibb#L464-L465), [docs/spec/overview.md:184](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/docs/spec/overview.md#L184) and 2 more |
192−
193−### Python tooling
194−
195−| # | Finding | Severity | Verdict | Kind | Where |
196−| --- | --- | --- | --- | --- | --- |
197−| A65 | Ship.processes() treats any process whose argv names the absolute pier path as the king, tools/ship itself included, so `tools/ship --pier /abs/pier stop` can SIGTERM itself and `start` reports 'already running' with no ship | Medium | Confirmed | bug | [tools/ship:285-305](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tools/ship#L285-L305), [tools/ship:340-344](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tools/ship#L340-L344), [tools/ship:388-409](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tools/ship#L388-L409) and 2 more |
198−| A66 | sync's verify reports a zero-byte .txt file as different: %txt stores ~ (an atom) for it, MANIFEST classifies any atom as %cord before checking for %txt, and verify() requires 'wain' for .txt; docs blame the ship | Medium | Confirmed | bug | [tools/ship:693-696](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tools/ship#L693-L696), [tools/ship:1437-1439](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tools/ship#L1437-L1439), [docs/development.md:206](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/docs/development.md#L206) and 1 more |
199−| A67 | When the batched eval dies, tools/golden reruns every case alone, each compiling the whole library (no bisection), under the same 600 s timeout, and Ctrl-C does not stop the queued reruns | Medium | Confirmed | robustness | [tools/golden:363-396](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tools/golden#L363-L396), [tools/golden:285-286](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tools/golden#L285-L286), [tools/golden:522-526](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tools/golden#L522-L526) |
200−| A68 | jibb-import.hoon is spliced into the '(harness)' segment, so its compile errors get the 'golden harness doesn't compile / golden arm must be' headline with harness line numbers, and crash frames inside the reader are dropped | Low | Confirmed | bug | [tools/golden:243-247](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tools/golden#L243-L247), [tools/golden:287-294](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tools/golden#L287-L294), [tools/golden:311-316](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tools/golden#L311-L316) and 1 more |
201−| A69 | tools/ship test/sync/gen-tests accept a nonexistent --golden folder: zero cases are generated, the other tests/lib programs are dropped as 'isolated', and -test passes with 0 tests | Low | Confirmed | gap | [tools/ship:1018-1021](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tools/ship#L1018-L1021), [tools/ship:877-898](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tools/ship#L877-L898), [tools/ship:1754-1778](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tools/ship#L1754-L1778) and 1 more |
202−| A70 | ship-selftest hard-codes 44 tests/lib program names (11 of the 55 are missing) and dozens of fixture names that assemble() copies generically | Low | Confirmed | test-gap | [tools/testdata/ship-selftest:301-345](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tools/testdata/ship-selftest#L301-L345), [tools/testdata/ship-selftest:346-448](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tools/testdata/ship-selftest#L346-L448) |
203−| A71 | check_fixture_crash_isolated in tools/testdata/selftest runs the real 15k-line compiler and asserts on checker output, contradicting the 'about half a minute' docstring | Low | Confirmed | inconsistency | [tools/testdata/selftest:373-410](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tools/testdata/selftest#L373-L410), [tools/testdata/selftest:5](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tools/testdata/selftest#L5) |
204−| A72 | tools/golden embeds the prelude and internal prelude twice per module-types program (as arms and inline in prepare-prelude) and repeats the read-to-rap-literal code several times | Low | Confirmed | simplification | [tools/golden:201-222](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tools/golden#L201-L222), [tools/golden:263-286](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tools/golden#L263-L286) |
205−| A73 | delete_batches keeps an empty-list special case (`batches or partition([])`) that only a selftest relies on; sync never calls it with no paths | Low | Confirmed | simplification | [tools/ship:1512-1538](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tools/ship#L1512-L1538), [tools/testdata/ship-selftest:550-554](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tools/testdata/ship-selftest#L550-L554) |
206−| A74 | A non-UTF-8 about.txt makes tools/golden and tools/ship gen-tests die with a UnicodeDecodeError traceback and exit 1 instead of a report and exit 2 | Low | Confirmed | robustness | [tools/golden_case.py:34-41](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tools/golden_case.py#L34-L41), [tools/golden:160-168](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tools/golden#L160-L168), [tools/ship:1114](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tools/ship#L1114) and 1 more |
207−| A75 | tools/golden substitutes harness placeholders after splicing in case sources, so a Jibb source that interpolates {types-expr}, {import-helper}, {modules-expr}, {module-helper} or {prelude-helper} is silently rewritten or breaks the harness (latent: nothing in the corpus triggers it) | Low | Partly | bug | [tools/golden:287-294](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tools/golden#L287-L294), [tools/golden:243-247](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tools/golden#L243-L247), [tools/golden:285-286](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tools/golden#L285-L286) and 1 more |
208−| A76 | The eval and ship runners duplicate per-case metadata handling and the fixture-compiling Hoon helpers, and crash isolation has drifted (the ship's plain check-types is not under mule); the per-batch/per-case entry-point choice is equivalent and keeps stub libraries minimal | Low | Partly | duplication | [tools/golden:103-143](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tools/golden#L103-L143), [tools/golden:248-262](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tools/golden#L248-L262), [tools/ship:1058-1168](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tools/ship#L1058-L1168) and 5 more |
209−| A77 | tools/ship keeps its own copies of noun decoding, cord-literal escaping, display paths and KNOT/TERM; some are not drop-in replaceable (tuple vs Cell nouns, pier-first urbit lookup) | Low | Partly | duplication | [tools/ship:121-228](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tools/ship#L121-L228), [tools/ship:83-84](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tools/ship#L83-L84), [tools/ship:266-273](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tools/ship#L266-L273) and 6 more |
210−| A78 | tools/clay-fixtures repeats one run/compare/print block for 11 fixtures (plus build, import and Tlon variants), and the Tlon step clones tools/ship into a scratch repo just to add one /sur file; the restore has no timeout | Low | Partly | simplification | [tools/clay-fixtures:54-145](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tools/clay-fixtures#L54-L145), [tools/clay-fixtures:188-238](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tools/clay-fixtures#L188-L238), [tools/clay-fixtures:147-186](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tools/clay-fixtures#L147-L186) and 1 more |
211−| A79 | tools/ship defaults to /root/urbit/zod and /root/src/tools/pkg/click/click (documented and overridable), and its find_urbit ignores $URBIT | Low | Partly | tooling | [tools/ship:53-54](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tools/ship#L53-L54), [tools/ship:18-24](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tools/ship#L18-L24), [tools/noun.py:5-6](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tools/noun.py#L5-L6) and 2 more |
212−
213−### Test harness
214−
215−| # | Finding | Severity | Verdict | Kind | Where |
216−| --- | --- | --- | --- | --- | --- |
217−| A80 | Eval scripts cut or bypass the ship's test- arms and keep their own copies of the check lists, so eval and ship run different wrapper code | Medium | Confirmed | inconsistency | [tools/type-store-test:19-34](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tools/type-store-test#L19-L34), [tests/lib/jibb-store.hoon:256-260](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tests/lib/jibb-store.hoon#L256-L260), [tools/type-todo-full-test:21-32](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tools/type-todo-full-test#L21-L32) and 6 more |
218−| A81 | Test copies of my-app files are guarded inconsistently: the todo /sur and mark copies and all 14 golden copies are unchecked, and no check parses my-app's own .jibb files | Medium | Confirmed | gap | [tests/type-api-paths/about.txt:2](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tests/type-api-paths/about.txt#L2), [tests/type-api-paths/todo-sur.txt](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tests/type-api-paths/todo-sur.txt), [tests/type-api-paths/todo-action.txt](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tests/type-api-paths/todo-action.txt) and 3 more |
219−| A82 | The 49 tools/type-*-test scripts and importer-test rebuild by hand the bindings each ship test file already declares; a generic runner over tests/lib could replace most of them and run several times faster | Medium | Partly | simplification | [tools/type-deferred-prepared-test:10-48](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tools/type-deferred-prepared-test#L10-L48), [tools/type-todo-full-test:16-97](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tools/type-todo-full-test#L16-L97), [tools/type-arithmetic-guards-test:13-28](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tools/type-arithmetic-guards-test#L13-L28) and 1 more |
220−| A83 | The committed, generated tests/lib/jibb.hoon (3,949 lines) is never used: assembly drops it and regenerates it | Low | Confirmed | simplification | [tools/ship:887-898](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tools/ship#L887-L898), [tools/ship:1754-1778](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tools/ship#L1754-L1778), [docs/development.md:186](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/docs/development.md#L186) and 1 more |
221−| A84 | Each new test is registered by hand in several places, and some of those lists are incomplete | Low | Confirmed | duplication | [tools/testdata/ship-selftest:304-346](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tools/testdata/ship-selftest#L304-L346), [tools/testdata/ship-selftest:348-446](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tools/testdata/ship-selftest#L348-L446), [docs/development.md:3](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/docs/development.md#L3) and 2 more |
222−| A85 | Some checks test little: a one-line pass/fail golden file for unification, and three Hoon-versus-Hoon reference files that build the full library for nothing | Low | Confirmed | simplification | [tests/checker/unification.txt:1](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tests/checker/unification.txt#L1), [tests/lib/jibb-typecheck.hoon:5-13](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tests/lib/jibb-typecheck.hoon#L5-L13), [tools/testdata/succ-hoon-reference.hoon:1-9](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tools/testdata/succ-hoon-reference.hoon#L1-L9) and 3 more |
223−| A86 | 36 tests/lib files repeat the same lines-to-cord helper, and many suites build Jibb sources inline from '\0a' cords | Low | Confirmed | duplication | [tests/lib/jibb-store.hoon:8-45](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tests/lib/jibb-store.hoon#L8-L45), [tests/lib/jibb-program-watch.hoon:12-55](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tests/lib/jibb-program-watch.hoon#L12-L55) |
224−| A87 | The golden naming table documents only lex-, inline- and doc- prefixes, and 10 about.txt files miss required lines; nothing lints them | Low | Confirmed | docs | [docs/development.md:212-218](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/docs/development.md#L212-L218), [tests/golden/types-constructor-context/about.txt:1](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tests/golden/types-constructor-context/about.txt#L1), [tests/golden/types-partial-locals/about.txt:1](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tests/golden/types-partial-locals/about.txt#L1) and 1 more |
225−| A88 | Fixture folders, script names, arm names and flags follow no consistent mapping | Low | Confirmed | inconsistency | [tests/type-program-watch/about.txt:1](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tests/type-program-watch/about.txt#L1), [tools/type-gate-free-source-test:13](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tools/type-gate-free-source-test#L13), [tools/type-program-init-test:27-32](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tools/type-program-init-test#L27-L32) and 3 more |
226−| A89 | tools/clay-fixtures repeats one run-and-compare block per fixture, and the importer fixture list is spread over several places with a hand-kept count | Low | Confirmed | duplication | [tools/clay-fixtures:15-238](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tools/clay-fixtures#L15-L238), [tools/importer-test:10-37](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tools/importer-test#L10-L37), [tests/lib/jibb-import.hoon:3-42](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tests/lib/jibb-import.hoon#L3-L42) and 1 more |
227−| A90 | The docs' claims about 2,000-line modules and 100,000 nested brackets have no automated test | Low | Confirmed | test-gap | [docs/compiler.md:209](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/docs/compiler.md#L209), [docs/development.md:230](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/docs/development.md#L230) |
228−| A91 | Five 'Before pushing' checks run through tools/hoon are eyeball checks: they exit 0 whatever value they print | Low | Partly | bug | [docs/development.md:179-183](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/docs/development.md#L179-L183), [tools/hoon:149-171](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tools/hoon#L149-L171) |
229−| A92 | No single command runs the ~65-command push checklist (about 49 minutes serially); CI is planned only for milestone 7 | Low | Partly | gap | [docs/development.md:124-192](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/docs/development.md#L124-L192), [docs/development.md:234](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/docs/development.md#L234), [docs/spec/implementation-plan.md:31](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/docs/spec/implementation-plan.md#L31) |
230−| A93 | The importer's +fixture-test is never run although tests/importer/about.txt says it checks structured values; test-support arms live in the shipped libraries | Low | Partly | dead-code | [jibb-import.hoon:1720-1842](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb-import.hoon#L1720-L1842), [tests/importer/about.txt:58](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tests/importer/about.txt#L58), [jibb.hoon:4505-4595](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L4505-L4595) and 2 more |
231−| A94 | Type-checker golden cases also carry full token and tree outputs (about 73% of all parser golden lines), a deliberate trade-off that adds churn when sources or printers change | Low | Partly | simplification | [docs/spec/implementation-plan.md:40](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/docs/spec/implementation-plan.md#L40), [docs/development.md:12](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/docs/development.md#L12), [tools/ship:947](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tools/ship#L947) |
232−
233−### Documentation
234−
235−| # | Finding | Severity | Verdict | Kind | Where |
236−| --- | --- | --- | --- | --- | --- |
237−| A95 | status.md says the cart store fully checks (line 54) and also that it fails closed (line 68), because the golden-types path and the full-module path disagree and status.md never says which it means | Medium | Confirmed | inconsistency | [docs/status.md:54](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/docs/status.md#L54), [docs/status.md:68](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/docs/status.md#L68), [tests/golden/doc-grammar-06-cart-store/types.txt:2](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tests/golden/doc-grammar-06-cart-store/types.txt#L2) and 2 more |
238−| A96 | The hand-maintained check lists have drifted: status.md's 'Checking it' misses 18 checks, the README names 27 of the 49 type-* tools, and development.md:3 points to the README as the full reference | Medium | Confirmed | tooling | [docs/status.md:234-286](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/docs/status.md#L234-L286), [docs/development.md:3](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/docs/development.md#L3), [docs/development.md:124-194](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/docs/development.md#L124-L194) and 3 more |
239−| A97 | status.md is a 59 KB append-only log: a 16,412-character paragraph, a 115-row history table that repeats git log, and stale dates | Medium | Confirmed | docs | [docs/status.md:3](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/docs/status.md#L3), [docs/status.md:68](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/docs/status.md#L68), [docs/status.md:90](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/docs/status.md#L90) and 2 more |
240−| A98 | `eq` is absent from the prelude and the checker has no gate-free type-variable constraint, and no doc lists either as outstanding | Medium | Partly | gap | [docs/open-questions.md:17](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/docs/open-questions.md#L17), [docs/spec/decisions.md:31](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/docs/spec/decisions.md#L31), [docs/spec/grammar.md:137](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/docs/spec/grammar.md#L137) and 4 more |
241−| A99 | decisions.md's Core language row still says three rules are proposed, but core-language.md marks none and the decisions rows record them as adopted | Low | Confirmed | inconsistency | [docs/spec/decisions.md:63](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/docs/spec/decisions.md#L63), [docs/spec/core-language.md:5](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/docs/spec/core-language.md#L5), [docs/spec/decisions.md:21](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/docs/spec/decisions.md#L21) and 2 more |
242−| A100 | The EBNF admits `[]` but not `m()`, the checker reports `[]` as unsupported rather than as the decided error, nothing tests `[]`, and open-questions Q6 is stale | Low | Confirmed | inconsistency | [docs/spec/grammar.md:245](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/docs/spec/grammar.md#L245), [docs/spec/grammar.md:250](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/docs/spec/grammar.md#L250), [docs/spec/decisions.md:13](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/docs/spec/decisions.md#L13) and 6 more |
243−| A101 | compiler.md's chapter table omits `%union-analysis`, which holds the golden-types and module-checking entry points; the page and the file header still say milestone 1 | Low | Confirmed | docs | [docs/compiler.md:3](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/docs/compiler.md#L3), [docs/compiler.md:23-38](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/docs/compiler.md#L23-L38), [docs/compiler.md:44-57](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/docs/compiler.md#L44-L57) and 4 more |
244−| A102 | Three docs say starting urbit eval and building the library takes about 8 s; it takes about 23 s now | Low | Confirmed | docs | [docs/development.md:122](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/docs/development.md#L122), [docs/compiler.md:209](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/docs/compiler.md#L209), [docs/status.md:112](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/docs/status.md#L112) |
245−| A103 | open-questions.md mostly holds settled questions, against its own stated rule, its 'as of' date is stale, and status.md cites a nonexistent 'corpus question 3' | Low | Confirmed | docs | [docs/open-questions.md:3](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/docs/open-questions.md#L3), [docs/open-questions.md:21](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/docs/open-questions.md#L21), [docs/status.md:108](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/docs/status.md#L108) and 1 more |
246−| A104 | 'The doc itself is the authority' conflicts with the repo spec, which records decisions the Claude doc does not yet have | Low | Confirmed | inconsistency | [docs/development.md:9](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/docs/development.md#L9), [README.md:3](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/README.md#L3), [docs/README.md:3](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/docs/README.md#L3) and 2 more |
247−| A105 | prelude-inventory.md says nine molds already in the prelude 'can be written once present', and its 2a table disagrees with its own paragraph | Low | Confirmed | docs | [docs/prelude-inventory.md:141-159](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/docs/prelude-inventory.md#L141-L159), [docs/prelude-inventory.md:35-52](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/docs/prelude-inventory.md#L35-L52), [prelude.jibb:58-97](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb/prelude.jibb#L58-L97) |
248−| A106 | Tool narratives have been appended under Ground rules and Commits in development.md, and status content sits in the docs/README.md index | Low | Confirmed | docs | [docs/development.md:17](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/docs/development.md#L17), [docs/development.md:236](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/docs/development.md#L236), [docs/README.md:5](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/docs/README.md#L5) |
249−| A107 | The repo has no licence and does not state the licences of its vendored code; CI is deliberately deferred to milestone 7 | Low | Partly | gap | [README.md:1](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/README.md#L1), [vendor/SOURCES.txt:1](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/vendor/SOURCES.txt#L1), [tests/importer/tlon-license.txt:1](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tests/importer/tlon-license.txt#L1) and 1 more |
250−
251−### Example desk, host desk and vendored files
252−
253−| # | Finding | Severity | Verdict | Kind | Where |
254−| --- | --- | --- | --- | --- | --- |
255−| A108 | my-app files are copied 28 times under tests/, with sync pairs hand-coded in 8 tools and several copies never checked | Medium | Confirmed | duplication | [tools/type-page-main-test:15-30](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tools/type-page-main-test#L15-L30), [tools/type-todo-full-test:16-19](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tools/type-todo-full-test#L16-L19), [tools/type-todo-partial-test:18-21](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tools/type-todo-partial-test#L18-L21) and 9 more |
256−| A109 | Nothing compares the five todo reader copies (todo-sur.txt and four mark copies) with my-app. Clay checks cover only item, action and the todo-action mark | Medium | Partly | test-gap | [tools/type-todo-partial-test:18-34](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tools/type-todo-partial-test#L18-L34), [tools/type-todo-full-test:16-43](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tools/type-todo-full-test#L16-L43), [tools/type-page-main-test:15-40](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tools/type-page-main-test#L15-L40) and 5 more |
257−| A110 | The example marks are built only as Hoon cores (%ca); no test builds them as marks (%cb) or checks their vale | Low | Confirmed | test-gap | [tests/clay-fixtures/build.txt:6-11](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tests/clay-fixtures/build.txt#L6-L11), [tests/clay-fixtures/mark-shape.txt:4](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tests/clay-fixtures/mark-shape.txt#L4), [tools/ship:685](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tools/ship#L685) |
258−| A111 | The my-app assembly skips jibb-dev/tests, which does not exist | Low | Confirmed | dead-code | [tools/ship:63](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tools/ship#L63), [README.md:81](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/README.md#L81), [tools/ship:2261](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tools/ship#L2261) |
259−| A112 | Milestone-4 tension: my-app deliberately holds the failing buttons example, and its doc-identical theme names a static font that milestone 4 will treat as missing | Low | Partly | gap | [my-app/ui/components/buttons.jibb:3](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/my-app/ui/components/buttons.jibb#L3), [my-app/ui/theme.jibb:7](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/my-app/ui/theme.jibb#L7), [docs/prompts/milestone-2.md:154](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/docs/prompts/milestone-2.md#L154) and 4 more |
260−| A113 | Importer-only fixtures (sur/import-fixture.hoon, mar/label.hoon) sit on the example desk, and the Tlon probe needs a temp-copy, sync and restore of my-app | Low | Partly | simplification | [my-app/sur/import-fixture.hoon:1-7](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/my-app/sur/import-fixture.hoon#L1-L7), [my-app/mar/label.hoon:1](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/my-app/mar/label.hoon#L1), [tools/clay-fixtures:144-187](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tools/clay-fixtures#L144-L187) and 2 more |
261−| A114 | The importer fixture's $^(@ud [a=@ud b=@t]) is a malformed $^ whose mold accepts only atom-headed cells, though its type (and the import) admits atoms | Low | Partly | bug | [my-app/sur/import-fixture.hoon:6](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/my-app/sur/import-fixture.hoon#L6), [tests/clay-fixtures/ford-nested-union-expected.txt:1](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tests/clay-fixtures/ford-nested-union-expected.txt#L1), [tests/clay-fixtures/ford-nested-union-bridge-expected.txt:1](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tests/clay-fixtures/ford-nested-union-bridge-expected.txt#L1) and 1 more |
262−| A115 | my-app/mar/todo-action.hoon claims it is 'not supplied by the design doc', but apart from that comment line it is the overview's block | Low | Partly | inconsistency | [my-app/mar/todo-action.hoon:1](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/my-app/mar/todo-action.hoon#L1), [docs/spec/overview.md:310-316](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/docs/spec/overview.md#L310-L316), [tests/type-api-paths/todo-action.txt:1](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tests/type-api-paths/todo-action.txt#L1) and 1 more |
263−| A116 | No %todo/%blog fixture agents and no page embedding basket exist yet for milestones 5-6, and my-app's agentless desk.bill `~` is undocumented | Low | Partly | gap | [my-app/desk.bill:1](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/my-app/desk.bill#L1), [docs/spec/overview.md:350](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/docs/spec/overview.md#L350), [docs/spec/overview.md:358](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/docs/spec/overview.md#L358) and 4 more |
264−| A117 | Every desk gets all vendor packages by documented design (so app desks carry lib/test.hoon), and the zuse kelvin is hand-copied in two desks | Low | Partly | simplification | [tools/ship:59-69](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tools/ship#L59-L69), [tools/ship:881-884](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tools/ship#L881-L884), [vendor/SOURCES.txt:9-10](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/vendor/SOURCES.txt#L9-L10) and 3 more |
265−| A118 | SOURCES.txt credits the docket files to urbit/urbit's legacy pkg/landscape and records a machine-local path; the files themselves are current | Low | Partly | docs | [vendor/SOURCES.txt:1-15](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/vendor/SOURCES.txt#L1-L15) |
266−
267−### Architecture (cross-cutting)
268−
269−| # | Finding | Severity | Verdict | Kind | Where |
270−| --- | --- | --- | --- | --- | --- |
271−| A119 | The one-site keyed-view screen skips ordinary inference for all five program components, so a fully annotated, valid program is rejected | High | Confirmed | bug | [jibb.hoon:10293](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L10293), [jibb.hoon:12975-13038](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L12975-L13038), [jibb.hoon:13595](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L13595) and 3 more |
272−| A120 | 49 near-identical type-*-test scripts each start an eval and rebuild the library | Medium | Confirmed | tooling | [tools/type-closed-gate-guards-test:1-29](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tools/type-closed-gate-guards-test#L1-L29), [tools/type-todo-full-test:19-98](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tools/type-todo-full-test#L19-L98), [tools/golden:61](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tools/golden#L61) |
273−| A121 | The checker grows by example-fitted recovery slices rather than a module-wide deferred-constraint core; the brief suggests that core but does not prescribe it | Medium | Partly | gap | [docs/prompts/milestone-2.md:130-142](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/docs/prompts/milestone-2.md#L130-L142), [docs/spec/implementation-plan.md:15](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/docs/spec/implementation-plan.md#L15), [jibb.hoon:4674-4691](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L4674-L4691) and 2 more |
274−| A122 | The partial golden report and the full-module interface are separate pipelines with duplicated finalization, and the typed goldens exercise only the report | Medium | Partly | inconsistency | [jibb.hoon:14385-14510](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L14385-L14510), [jibb.hoon:10266-10286](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L10266-L10286), [jibb.hoon:14176-14184](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L14176-L14184) and 1 more |
275−| A123 | %gate and %gate-wide carry identical fields and the checker handles both identically | Low | Confirmed | simplification | [jibb.hoon:945-948](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L945-L948), [jibb.hoon:8559-8575](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L8559-L8575), [jibb.hoon:9848-9862](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L9848-L9862) |
276−| A124 | Hard-coded budgets are scattered, and the printer's 26-variable cap also gates interface acceptance | Low | Confirmed | robustness | [jibb.hoon:10279](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L10279), [jibb.hoon:10095](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L10095), [jibb.hoon:14939](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L14939) and 3 more |
277−| A125 | The 27-field istate is built from positional literals in 10 places, and resolver arms take up to 19 positional arguments | Low | Confirmed | robustness | [jibb.hoon:5807](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L5807), [jibb.hoon:10287-10297](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L10287-L10297), [jibb.hoon:10309-10324](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L10309-L10324) |
278−| A126 | Tests call 137 internal library arms directly, coupling guards to the current code shape | Low | Confirmed | test-gap | [tests/lib/jibb-deferred.hoon:1](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tests/lib/jibb-deferred.hoon#L1), [tests/lib/jibb-cell-branch.hoon:1](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tests/lib/jibb-cell-branch.hoon#L1), [tests/lib/jibb-generic-pattern.hoon:1](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tests/lib/jibb-generic-pattern.hoon#L1) |
279−| A127 | About 586 lines of jibb-import.hoon, which app desks vendor, are test fixtures and printers | Low | Confirmed | simplification | [jibb-import.hoon:1720-2308](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb-import.hoon#L1720-L2308), [jibb.hoon:5555-5615](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L5555-L5615), [README.md:11](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/README.md#L11) |
280−| A128 | my-app sources are copied 28 times under tests, with 9 hand-written byte checks in 8 tools | Low | Confirmed | duplication | [tools/type-page-main-test:14-31](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tools/type-page-main-test#L14-L31), [tests/golden/types-module-fixtures/modules/ui/api/blog.jibb:1](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tests/golden/types-module-fixtures/modules/ui/api/blog.jibb#L1) |
281−| A129 | Several AST walker families and itype predicates repeat the same recursion skeleton | Low | Partly | simplification | [jibb.hoon:7097-7223](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L7097-L7223), [jibb.hoon:9917-10022](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L9917-L10022), [jibb.hoon:11059-11297](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L11059-L11297) and 2 more |
282−| A130 | Dead arms, copy-pasted -source/-graph twins and many golden-types wrappers | Low | Partly | duplication | [jibb.hoon:8591-8603](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L8591-L8603), [jibb.hoon:8661-8666](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L8661-L8666), [jibb.hoon:10142-10145](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L10142-L10145) and 6 more |
283−| A131 | The library header and compiler.md chapter map are stale (milestone 1, no %union-analysis), and %union-analysis mislabels about 4,700 lines | Low | Partly | inconsistency | [jibb.hoon:1-36](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L1-L36), [jibb.hoon:10452](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L10452), [docs/compiler.md:3](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/docs/compiler.md#L3) and 2 more |
284−| A132 | The prelude source is reparsed on each direct-prelude-evidence call, and program-recovery-names is recomputed for every definition | Low | Partly | performance | [jibb.hoon:8633-8647](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L8633-L8647), [jibb.hoon:10293](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L10293), [jibb.hoon:11488-11492](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L11488-L11492) and 2 more |
285−
286−### Found by the completeness pass
287−
288−| # | Finding | Severity | Verdict | Kind | Where |
289−| --- | --- | --- | --- | --- | --- |
290−| A133 | Loobean, unit/list and union ?- branches join arm results by three different rules: a loobean branch rejects a decimal literal against @ud even under ^- @ud, a unit/list branch unifies them but cannot widen, and a union branch requires syntactically equal normalized types | Medium | Confirmed | inconsistency | [jibb.hoon:8518-8519](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L8518-L8519), [jibb.hoon:7671-7672](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L7671-L7672), [jibb.hoon:7841-7842](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L7841-L7842) and 2 more |
291−| A134 | Printed types name the private prelude module: `(ask.internal @ud)` and `(unit qath.internal)` appear when ask or qath is reached through page or theme, and a golden and a ship test lock this in | Medium | Confirmed | bug | [jibb.hoon:11423-11436](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L11423-L11436), [prelude.jibb:3](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb/prelude.jibb#L3), [prelude.jibb:338](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb/prelude.jibb#L338) and 6 more |
292−| A135 | Top-level resolution is a whole-module fixpoint that resolves one link of a forward chain per pass. It re-infers every unresolved definition and rescans the module on each pass, giving roughly cubic cost, and the SCC order it already computes is used only for cycles. | Medium | Partly | performance | [jibb.hoon:10309-10328](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L10309-L10328), [jibb.hoon:10293](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L10293), [jibb.hoon:10303](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L10303) and 6 more |
293−| A136 | The type printer leaves right-nested tuples unflattened and does not name non-recursive records or imported non-recursive Hoon molds; the missing-tag error for a named imported union lists its cases instead of naming it | Low | Partly | inconsistency | [jibb.hoon:9570](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L9570), [jibb.hoon:9562-9565](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L9562-L9565), [tests/golden/types-missing-tag-imported/types.txt:2-3](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tests/golden/types-missing-tag-imported/types.txt#L2-L3) and 5 more |
294−| A137 | Every eval tool compiles with `!:`, which makes checker work about 2.2-2.6x slower and library build about 20% slower than a ship build; docs/ never says so, though the published figures are caveated A/B comparisons and status.md's 8 s startup figure is stale | Low | Partly | docs | [tools/urbit_eval.py:176-185](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tools/urbit_eval.py#L176-L185), [docs/compiler.md:65](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/docs/compiler.md#L65), [docs/compiler.md:67](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/docs/compiler.md#L67) and 5 more |
docs/reviews/2026-11-02-syntax-review.mddeleted−488
@@ -1,488 +0,0 @@
1−# Syntax review, 2026-11-02
2−
3−A review of Jibb's syntax at [`0858191`](https://github.com/iko-soy/jibb/commit/0858191ab08738c4da5c6d84f00492e629564e73), asked for in the project chat: how can the syntax be improved for readability, consistency, ambiguity and ergonomics? Every proposal here is a proposal. Under the ground rules, a language change is agreed by @iko and recorded in [decisions.md](../spec/decisions.md) before the code changes, and the spec text is @iko's too. Nothing in the implementation was changed.
4−
5−How it was done: five reviewers each read the spec, the prelude, the example desk and the parser's design notes through one lens (readability, consistency, ambiguity, ergonomics for Hoon and Elm programmers, and growth). Their 28 proposals, and 11 of my own, were merged into 22. Three verifiers then tried to refute each one, mostly by running the snippet through the real parser and partial checker (`tools/golden --dir <folder> --show` under urbit eval, vere 4.6), and by checking Hoon's behaviour with `urbit eval`. 15 survived, most of them revised; 7 were dropped. [How to rerun a probe](#how-to-rerun-a-probe) is at the end.
6−
7−This review does not restate the language rulings that [the repository review](2026-11-02-questions.md) raised (questions 16 to 28, now listed in [open-questions.md](../open-questions.md) under "Review rulings waiting for @iko"). Where a proposal extends one of them, it says so. Proposals here are numbered S1 to S15 so they don't collide with those numbers. "Review question N" means a question in that file, and "open question N" means item N of [open-questions.md](../open-questions.md).
8−
9−## Summary
10−
11−- **The syntax is in good shape.** Open brackets without closers, tightness as the one disambiguator, one exhaustive `?-`, named unions, `|=%tag` constructors and named changes all read well, and nearly every slip the reviewers tried gets an error at the right character. The [keep list](#what-to-keep) says what not to change.
12−- **Three changes would help most, and each needs @iko.** Gates whose parameters are named differently can't fit each other today, which is why the prelude writes 27 gates as `|= args=[…]` followed by a one-arm `?-` ([S1](#s1-let-gates-with-differently-named-parameters-fit-each-other)). A cast or trace can't be followed by its expression at the same depth, as Hoon's tall form does, so every one adds an indentation level ([S2](#s2-let-a-bodys-last---or--take-the-rest-of-the-body-at-the-same-depth)). And no binder may reuse a prelude name, so `text`, `head`, `row`, `max` and soon about 110 more everyday words can't name a local ([S3](#s3-let-local-binders-reuse-prelude-value-names)).
13−- **Two literal and pattern rules accept code that is almost certainly wrong.** A bare decimal fits any aura, so `[%every 1 |=%tick]` is a timer of 1/2^64 s and `(text 5)` renders a control byte ([S4](#s4-let-a-bare-decimal-fit-only-ud-and-its-ancestors)). A tag written without its `%` in the last arm silently becomes a catch-all ([S5](#s5-reject-a-pattern-name-that-spells-one-of-the-subjects-tags)).
14−- **Much can be done without changing the language.** Better messages for Hoon and Elm habits ([S9](#s9-name-the-hoon-or-elm-habit-behind-each-likely-slip)), an EBNF that says what the parser accepts ([S10](#s10-make-the-ebnf-say-what-the-parser-accepts)), and a canonical layout for casts ([S13](#s13-put-a-cast-whose-expression-takes-deeper-lines-at-the-end-of-its-line)).
15−
16−## The proposals at a glance
17−
18−Links in the "Today" column go to the code at `0858191`.
19−
20−| # | Proposal | Today | Proposed | Language change? | Touches | Benefit |
21−| --- | --- | --- | --- | --- | --- | --- |
22−| [S1](#s1-let-gates-with-differently-named-parameters-fit-each-other) | Gates with differently named parameters fit each other | `~[lth2 lte2]` and `(turn pairs \|=([k v] k))` are type errors; the prelude uses unfaced `args=` ([prelude.jibb:52](https://github.com/iko-soy/jibb/blob/0858191ab08738c4da5c6d84f00492e629564e73/jibb-dev/lib/jibb/prelude.jibb#L52-L58)) | Sample names label a gate but are ignored when two gate types unify | Yes, a typing rule | [decisions.md:33](https://github.com/iko-soy/jibb/blob/0858191ab08738c4da5c6d84f00492e629564e73/docs/spec/decisions.md?plain=1#L33), [open question 8](https://github.com/iko-soy/jibb/blob/0858191ab08738c4da5c6d84f00492e629564e73/docs/open-questions.md?plain=1#L30) | High |
23−| [S2](#s2-let-a-bodys-last---or--take-the-rest-of-the-body-at-the-same-depth) | Hoon's backstep for a body's last `^-`, `~&` or `\|=` | `^- @ud` above `n` at the same depth is an error ([grammar.md:54](https://github.com/iko-soy/jibb/blob/0858191ab08738c4da5c6d84f00492e629564e73/docs/spec/grammar.md?plain=1#L54)) | The rest of the body at the same depth is the rune's last child | Yes, layout | [grammar.md:54, :61](https://github.com/iko-soy/jibb/blob/0858191ab08738c4da5c6d84f00492e629564e73/docs/spec/grammar.md?plain=1#L54-L61) | High |
24−| [S3](#s3-let-local-binders-reuse-prelude-value-names) | Local binders may reuse prelude value names | `[%typed text]` is "pattern binder shadows a name" ([todo-list.jibb:18](https://github.com/iko-soy/jibb/blob/0858191ab08738c4da5c6d84f00492e629564e73/my-app/ui/todo-list.jibb#L18)) | Samples, pattern binders and local `++` may hide a prelude value | Yes, scope | [decisions.md:11](https://github.com/iko-soy/jibb/blob/0858191ab08738c4da5c6d84f00492e629564e73/docs/spec/decisions.md?plain=1#L11), [open question 26](https://github.com/iko-soy/jibb/blob/0858191ab08738c4da5c6d84f00492e629564e73/docs/open-questions.md?plain=1#L51) | High |
25−| [S4](#s4-let-a-bare-decimal-fit-only-ud-and-its-ancestors) | A bare decimal fits only `@ud`, `@u`, `@` and `*` | `^- @dr 30`, `^- @p 0`, `(text 5)` check ([grammar.md:167](https://github.com/iko-soy/jibb/blob/0858191ab08738c4da5c6d84f00492e629564e73/docs/spec/grammar.md?plain=1#L167)) | Other auras take their own literals: `~s30`, `~zod`, `"5"` | Yes, literals | [grammar.md:21](https://github.com/iko-soy/jibb/blob/0858191ab08738c4da5c6d84f00492e629564e73/docs/spec/grammar.md?plain=1#L21); extends review question 16 | Medium |
26−| [S5](#s5-reject-a-pattern-name-that-spells-one-of-the-subjects-tags) | A pattern name that spells a case's tag is an error | `stop` for `%stop` in the last arm checks as a catch-all | "`stop` binds a name, but s can be the case %stop here" | Yes, a checker rule | [grammar.md:184](https://github.com/iko-soy/jibb/blob/0858191ab08738c4da5c6d84f00492e629564e73/docs/spec/grammar.md?plain=1#L184) | Medium |
27−| [S6](#s6-let-a-changes-item-name-a-wing) | A change's item may name a wing | `m(open.cart=x)` is "expected a named item" | `m(open.cart=x)`, as Hoon's `m(open.cart x)` | Yes, small | [decisions.md:11](https://github.com/iko-soy/jibb/blob/0858191ab08738c4da5c6d84f00492e629564e73/docs/spec/decisions.md?plain=1#L11) | Low |
28−| [S7](#s7-allow-type-variables-longer-than-one-letter) | Type variables longer than one letter | `(program D X M)`; `Msg` is a lexer error ([grammar.md:286](https://github.com/iko-soy/jibb/blob/0858191ab08738c4da5c6d84f00492e629564e73/docs/spec/grammar.md?plain=1#L286)) | `(program Data Model Msg)`, printed as written | Yes, lexer and printer | [parser reading 11](https://github.com/iko-soy/jibb/blob/0858191ab08738c4da5c6d84f00492e629564e73/docs/open-questions.md?plain=1#L85) | Low |
29−| [S8](#s8-catch-a-route-segment-that-should-have-been-a-value) | Catch a route segment that should have been a value | `%/blog/slug.p` is the literal text "slug.p" | An error at milestone 4's route check, for two narrow cases | Yes, milestone 4 | [decisions.md:83](https://github.com/iko-soy/jibb/blob/0858191ab08738c4da5c6d84f00492e629564e73/docs/spec/decisions.md?plain=1#L83) | Low |
30−| [S9](#s9-name-the-hoon-or-elm-habit-behind-each-likely-slip) | Messages that name the Hoon or Elm habit | `(a == b)` is blamed on the closer `==`; `True` is "found `T`" | "Jibb has no operators: write (eq a b)" and so on | No, messages | [grammar.md:68](https://github.com/iko-soy/jibb/blob/0858191ab08738c4da5c6d84f00492e629564e73/docs/spec/grammar.md?plain=1#L68-L82) | High |
31−| [S10](#s10-make-the-ebnf-say-what-the-parser-accepts) | The EBNF says what the parser accepts | No `sample` rule; `change` allows unnamed items; `knot` may be empty ([grammar.md:221](https://github.com/iko-soy/jibb/blob/0858191ab08738c4da5c6d84f00492e629564e73/docs/spec/grammar.md?plain=1#L221-L289)) | Productions for samples, edits, line kinds, knots and imports | No, spec text | [parser readings 1-5](https://github.com/iko-soy/jibb/blob/0858191ab08738c4da5c6d84f00492e629564e73/docs/open-questions.md?plain=1#L75-L79) | High |
32−| [S11](#s11-say-which-deeper-lines-are-allowed) | Say which deeper lines are allowed | "a deeper line continues the line above" ([grammar.md:9](https://github.com/iko-soy/jibb/blob/0858191ab08738c4da5c6d84f00492e629564e73/docs/spec/grammar.md?plain=1#L9)), though a call never continues | List what takes deeper lines; say an opener's line splits on spaces | No, spec text | [decisions.md:42](https://github.com/iko-soy/jibb/blob/0858191ab08738c4da5c6d84f00492e629564e73/docs/spec/decisions.md?plain=1#L42) | Medium |
33−| [S12](#s12-say-that-cell-patterns-nest-and-flatten-the-prelude-later) | Say that cell patterns nest; flatten the prelude later | "not lists or pairs" reads as "no nesting"; `hunt` uses four `?-`s ([prelude.jibb:203](https://github.com/iko-soy/jibb/blob/0858191ab08738c4da5c6d84f00492e629564e73/jibb-dev/lib/jibb/prelude.jibb#L203-L214)) | Pattern rows such as `[[~ a] [~ b]]`; one `?-` once the checker can | No | [grammar.md:184](https://github.com/iko-soy/jibb/blob/0858191ab08738c4da5c6d84f00492e629564e73/docs/spec/grammar.md?plain=1#L184) | Medium |
34−| [S13](#s13-put-a-cast-whose-expression-takes-deeper-lines-at-the-end-of-its-line) | Canonical place for a cast | `^- @ud` alone below `\|=` pushes the body right ([prelude.jibb:376](https://github.com/iko-soy/jibb/blob/0858191ab08738c4da5c6d84f00492e629564e73/jibb-dev/lib/jibb/prelude.jibb#L376-L380)) | `++ lent \|= xs=(list A) ^- @ud`, body below | No, layout convention | [decisions.md:97](https://github.com/iko-soy/jibb/blob/0858191ab08738c4da5c6d84f00492e629564e73/docs/spec/decisions.md?plain=1#L97) | Medium |
35−| [S14](#s14-pin-down-the-spellings-the-formatter-writes) | Spellings the formatter writes | `(text …)` beside `field …` on open-list lines; `align=align` beside `=msg` | One spelling each; alignment stays the writer's | No, layout convention | [decisions.md:16, :97](https://github.com/iko-soy/jibb/blob/0858191ab08738c4da5c6d84f00492e629564e73/docs/spec/decisions.md?plain=1#L16) | Low |
36−| [S15](#s15-name-the-fields-when-the-examples-build-a-model) | Name the fields when the examples build a model | `[[~ %.n] ""]` ([basket.jibb:15](https://github.com/iko-soy/jibb/blob/0858191ab08738c4da5c6d84f00492e629564e73/my-app/ui/basket.jibb#L15)) | `[cart=[items=~ open=%.n] note=""]` | No, examples | none | Low |
37−
38−Seven proposals were dropped after verification; [the dropped table](#considered-and-dropped) gives each reason.
39−
40−## Language changes
41−
42−Each of these needs @iko's agreement before any code changes.
43−
44−### S1. Let gates with differently named parameters fit each other
45−
46−**Problem.** A cell sample's names become faces of the gate's type: `|= [a=A b=B]` and `|= [a b]` both give `$-([a=A b=B] …)`. Faces are part of record types, and two different faces don't unify ([decisions.md:33](https://github.com/iko-soy/jibb/blob/0858191ab08738c4da5c6d84f00492e629564e73/docs/spec/decisions.md?plain=1#L33), [settled open question 8](https://github.com/iko-soy/jibb/blob/0858191ab08738c4da5c6d84f00492e629564e73/docs/open-questions.md?plain=1#L30)). So a gate's parameter names are part of its interface. Two comparators named differently can't share a list, a lambda over Hoon's `[p= q=]` pairs can't be passed to `turn`, and renaming a parameter is a breaking type change. Hoon ignores faces when it nests types, so Hoon programmers don't expect this.
47−
48−The prelude works around it. 30 of its gates take an unfaced `args=[…]` or `gates=[…]` sample, and 27 then open a one-arm `?-` whose only job is to name the parts ([prelude.jibb:33, 45, 53 and 24 more](https://github.com/iko-soy/jibb/blob/0858191ab08738c4da5c6d84f00492e629564e73/jibb-dev/lib/jibb/prelude.jibb#L52-L58)). That costs two lines and two indentation levels per gate, and reads as a branch where nothing branches. Meanwhile the element constructors and the spec's examples face their samples (`|= [=msg m=model]`), so the prelude and the spec teach two styles, and about 110 inventory gates are still to be written.
49−
50−There are two separate causes, and they need separate fixes:
51−
52−1. A capital takes a face. `(hunt lth2 `1 `2)` fails because `lth2`'s type `$-([x=A y=A] ?)` meets `hunt`'s slot `$-([A A] ?)`, and the capital `A` takes `x=` from one position and `y=` from the other. [Open question 8](https://github.com/iko-soy/jibb/blob/0858191ab08738c4da5c6d84f00492e629564e73/docs/open-questions.md?plain=1#L30) says only that an unnamed position takes a face; it doesn't say whether a capital does.
53−2. The decided rule itself. `~[lth2 lte2]` and `(turn pairs |=([k v] k))` fail because two explicit faces meet.
54−
55−**Evidence** (probes with the prelude loaded):
56−
57−```
58−++ lth2 |= [x=A y=A] (gth y x)
59−++ lte2 |= [a=A b=A] (not (gth a b))
60−++ pickers ~[lth2 lte2] :: list items do not have compatible types
61−++ use-hunt (hunt lth2 `1 `2) :: argument has type $-([x=A y=A] ?)
62−++ c2 ^- $-([A A] ?) lth2 :: cast mold and expression type do not unify
63−++ pairs ^- (list [p=@t q=@ud]) ~[["a" 1]]
64−++ keys (turn pairs |=([k v] k)) :: argument has type $-([k=A v=B] A)
65−```
66−
67−In Hoon, `^- $-([x=@ y=@] @) |=([a=@ b=@] a)` and `(turn ~(tap by m) |=([k=@t v=@ud] k))` both compile. A faced gate already fits a concrete unfaced slot in Jibb, as `^- $-([@ud @ud] @ud) sum` does, so the failures are confined to the two causes above.
68−
69−**Before**, [prelude.jibb:52-58](https://github.com/iko-soy/jibb/blob/0858191ab08738c4da5c6d84f00492e629564e73/jibb-dev/lib/jibb/prelude.jibb#L52-L58):
70−
71−```
72−++ turn |= args=[(list A) $-(A B)]
73− ?- args
74− [xs f]
75− ^- (list B)
76− ?- xs
77− ~ ~
78− [item rest] [(f item) (turn rest f)]
79−```
80−
81−**After.** Step 1 settles a reading and reopens nothing: a face belongs to its position, and a capital binds only the type under it, so `[A A]` fits `[x=@ y=@]`. Step 2 is the ruling: the names a cell sample binds, faced or bare, are the gate's labels. They bind in the body, print in its type, check a direct call's argument and feed `proj` and route binding, which reads `load`'s own labels. They are ignored when the gate's type unifies with another type and never flow into a capital, and labels that differ where two gate types meet are dropped.
82−
83−```
84−++ pickers ~[lth2 lte2] :: (list $-([A A] ?))
85−++ use-hunt (hunt lth2 `1 `2) :: (unit @ud), step 1
86−++ keys (turn pairs |=([k v] k)) :: (list @t), step 2
87−(sum [p=1 q=2]) :: still an error: a direct call checks labels
88−
89−:: after step 2, the prelude can name its parameters (with S13's cast placement):
90−++ turn |= [xs=(list A) f=$-(A B)] ^- (list B)
91− ?- xs
92− ~ ~
93− [item rest] [(f item) (turn rest f)]
94−```
95−
96−**Compatibility.** Only errors become meaning, except that step 1 changes some printed types: `(diff-slot lth2)` prints `$-([A A] ?)` where it printed `$-([x=A y=A] ?)`. Data records keep today's rule: `[hi=10 lo=0]` where `[lo=@ud hi=@ud]` is expected stays an error. A scratch rewrite of the whole prelude with S1, S12 and S13, in syntax that parses today, went from 431 to 347 code lines and from a deepest indent of 16 to 8; S1 accounts for about 54 of the 84 lines.
97−
98−**Parser.** None. `+read-sample` already tells binders, faces and molds apart ([jibb.hoon:3772](https://github.com/iko-soy/jibb/blob/0858191ab08738c4da5c6d84f00492e629564e73/jibb-dev/lib/jibb.hoon#L3772-L3800)). The checker records faces per position (step 1) and keeps a gate's labels apart from its sample type (step 2).
99−
100−**Touches.** Step 2 reopens [decisions.md:33](https://github.com/iko-soy/jibb/blob/0858191ab08738c4da5c6d84f00492e629564e73/docs/spec/decisions.md?plain=1#L33) and settled open question 8 (both 2026-10-30) for gate samples only. It stays consistent with Sample names (:19), `proj` (:41) and Routing (:92).
101−
102−**Alternatives.** (b) Make a cell sample's names pure binders, out of the type altogether, as `n` in `|= n=@ud` already is. It is simpler, but it breaks `(f (proj wider))` into a faced sample, which checks today, and loses parameter names in printed types such as `button`'s. (c) Keep the rule and the `args=` idiom, and only make the error say that just the faces differ.
103−
104−### S2. Let a body's last `^-`, `~&` or `|=` take the rest of the body at the same depth
105−
106−**Problem.** A tall rune's last child sits on its line or deeper ([grammar.md:54](https://github.com/iko-soy/jibb/blob/0858191ab08738c4da5c6d84f00492e629564e73/docs/spec/grammar.md?plain=1#L54), and `~&` "runs the body below", [:61](https://github.com/iko-soy/jibb/blob/0858191ab08738c4da5c6d84f00492e629564e73/docs/spec/grammar.md?plain=1#L61)). So every cast or trace whose expression goes below adds an indentation level. Adding one `~& msg` while debugging, with the one debugging rune Jibb keeps, re-indents every line below it, and removing it re-indents them again. Hoon programmers write `|= a=@`, `^- @ud` and `~& x` each on its own line with what follows at the same column. In Jibb that is an error.
107−
108−**Evidence.** `++ f |= n=@ud` above `^- @ud` and `n` at the same depth gives "expected an expression, or a body on deeper lines, found a line at the same depth"; the `~&` version gives "expected `~&`'s body on deeper lines". Ten of the prelude's casts sit alone on their line ([prelude.jibb:47, 55, 108, 158, 260, 271, 297, 323, 377, 395](https://github.com/iko-soy/jibb/blob/0858191ab08738c4da5c6d84f00492e629564e73/jibb-dev/lib/jibb/prelude.jibb#L157-L161)). Eleven more sit on a `?-` arm's line, where the next same-depth line must stay the next arm, so this rule doesn't change them.
109−
110−**Before**, [todo-list.jibb:16-25](https://github.com/iko-soy/jibb/blob/0858191ab08738c4da5c6d84f00492e629564e73/my-app/ui/todo-list.jibb#L16-L25) with a trace added, and [prelude.jibb:163-167](https://github.com/iko-soy/jibb/blob/0858191ab08738c4da5c6d84f00492e629564e73/jibb-dev/lib/jibb/prelude.jibb#L163-L167):
111−
112−```
113−++ update |= [=msg m=model]
114− ~& msg
115− ?- msg
116− [%typed t]
117− …
118−
119−++ bond |= fallback=$-(~ A)
120− |= maybe=(unit A)
121− ?- maybe
122− ~ (fallback ~)
123− [~ value] value
124−```
125−
126−**After:**
127−
128−```
129−++ update |= [=msg m=model]
130− ~& msg :: insert or delete this one line; nothing else moves
131− ?- msg
132− [%typed t]
133− …
134−
135−++ bond |= fallback=$-(~ A)
136− |= maybe=(unit A)
137− ?- maybe
138− ~ (fallback ~)
139− [~ value] value
140−```
141−
142−The rule, for grammar.md's Runes: a body's final line may be a tall `^-`, `~&` or `|=`, or a chain of them such as `^- @ud ~& x`. When that line ends where the innermost rune's last child goes, the rest of the body at the same depth is that child: first its local `++` and `+$`, then its expression. It does not apply on a `?-` arm's line, on a line of an open bracket, after a bracket opened earlier on the line, at the top level, or to a definition's own expression: `++ inner |= y=@ud` above `(inner x)` stays an error.
143−
144−**Compatibility.** Only errors become meaning: a NEWLINE right after a body's final expression is always an error today. Of the golden corpus, only `lex-rune-layout-bad-3` flips, and its about.txt already calls the form "as Hoon's tall form would put it". The other cases that fail on "a line at the same depth" are at the top level, on arms, on definitions or in brackets, and keep their errors.
145−
146−**Parser.** Small, with no backtracking. The body loop already knows it has reached the final expression when the next token isn't `++` or `+$`. After a rune's head the next token is an expression start, INDENT (today's body) or NEWLINE (the new case). A "final line of a body, nothing open before" flag passes down the chain of runes on that line.
147−
148−**Touches.** grammar.md:54 and :61 and the EBNF's `rune`, for a body's final line only. No decisions row requires a deeper body. The formatter's one canonical layout ([decisions.md:97](https://github.com/iko-soy/jibb/blob/0858191ab08738c4da5c6d84f00492e629564e73/docs/spec/decisions.md?plain=1#L97)) has to make this flat form canonical, or the "nothing else moves" benefit is lost.
149−
150−**Alternatives.** `^-` and `~&` only, leaving `|=`. Or no language change at all: [S13](#s13-put-a-cast-whose-expression-takes-deeper-lines-at-the-end-of-its-line) puts a cast on its `|=` line, which removes most of the cast drift today but does nothing for `~&`.
151−
152−### S3. Let local binders reuse prelude value names
153−
154−**Problem.** No name may shadow one in scope, "imports and the prelude included" ([grammar.md:101](https://github.com/iko-soy/jibb/blob/0858191ab08738c4da5c6d84f00492e629564e73/docs/spec/grammar.md?plain=1#L101)). The prelude has 75 top-level values, and the inventory decision adds about 110 more, many of them everyday words: `at`, `end`, `cut`, `min`, `max`, `find`, `sort`, `trim`, `test`, `year`, `head`, `tail`, `in`, `by`, `to`. The element gates take `text`, `row`, `field`, `link`, `form` and `table`. So the natural name for a binder is often forbidden: the field `text=@t` is bound as `t` ([todo-list.jibb:18](https://github.com/iko-soy/jibb/blob/0858191ab08738c4da5c6d84f00492e629564e73/my-app/ui/todo-list.jibb#L18)), 13 golden sources name a value `text-value`, and [settled open question 26](https://github.com/iko-soy/jibb/blob/0858191ab08738c4da5c6d84f00492e629564e73/docs/open-questions.md?plain=1#L51) renamed the grammar example's `at` to `sent-at`. Every name the prelude adds later can break code that bound it. The messages don't say which name clashed with what.
155−
156−**Evidence** (prelude loaded): `[%typed text] text` gives "pattern binder shadows a name"; `|= row=@ud row` gives "sample shadows a name"; a local `++ head 1` gives "local definitions shadow a name"; golden case [module-import-prelude-sample-shadow](https://github.com/iko-soy/jibb/blob/0858191ab08738c4da5c6d84f00492e629564e73/tests/golden/module-import-prelude-sample-shadow/source.jibb) rejects `|=(same same)`.
157−
158−**Before** and **after**:
159−
160−```
161−:: today
162− ?- msg
163− [%typed t]
164− ?- (gth (lent (tuba (trip t))) 80)
165− %.y [m(draft=t error=`"Too long") ~]
166−
167−:: proposed
168− ?- msg
169− [%typed text]
170− ?- (gth (lent (tuba (trip text))) 80)
171− %.y [m(draft=text error=`"Too long") ~]
172−
173−++ text "hi" :: still an error, now naming both sides:
174− :: "`text` is the prelude gate text; a top-level name can't reuse it"
175−```
176−
177−The rule, for grammar.md:101: "No name may shadow one already in scope, with one exception: a sample, a pattern binder or a local `++` may reuse the name of a prelude value, which that scope then can't name. Top-level names, import faces and molds never shadow the prelude, and nothing shadows an import face or a name the module defines. `proj` stays reserved."
178−
179−**Compatibility.** Only errors become meaning; no valid program binds a prelude name today. Inside a scope that hides a prelude gate, using that gate is an error, and the message should name the hidden gate.
180−
181−**Parser.** None. The lowering renames such binders, since [core-language.md](../spec/core-language.md) assumes prelude names are never hidden; it already generates `_` names.
182−
183−**Touches.** The Syntax row ([decisions.md:11](https://github.com/iko-soy/jibb/blob/0858191ab08738c4da5c6d84f00492e629564e73/docs/spec/decisions.md?plain=1#L11)) for local binders, and settled open question 26, which @iko decided on 2026-10-31 with the inventory decision already made. The new evidence is the size of that inventory. Decide it together with [S5](#s5-reject-a-pattern-name-that-spells-one-of-the-subjects-tags): today `add` written for `%add` happens to be caught as a shadowing error, and under S3 it would need S5 to be caught.
184−
185−**Not affected by S3.** The prelude's own `toggle |= [on=? …]` ([prelude.jibb:513](https://github.com/iko-soy/jibb/blob/0858191ab08738c4da5c6d84f00492e629564e73/jibb-dev/lib/jibb/prelude.jibb#L513)) will collide if `on` is ever defined in the prelude, because a module can't shadow its own names; rename the face then.
186−
187−**Alternatives.** Let a module's top-level names shadow the prelude too: rejected, since a top-level `++ text` would hide the element gate in the whole module and Jibb has no qualifier to reach it. Or keep the rule and only improve the message.
188−
189−### S4. Let a bare decimal fit only `@ud` and its ancestors
190−
191−**Problem.** A bare decimal takes "any aura by context" ([grammar.md:21](https://github.com/iko-soy/jibb/blob/0858191ab08738c4da5c6d84f00492e629564e73/docs/spec/grammar.md?plain=1#L21), [:167](https://github.com/iko-soy/jibb/blob/0858191ab08738c4da5c6d84f00492e629564e73/docs/spec/grammar.md?plain=1#L167)). So a number written where a duration, date, ship or cord is expected compiles with a meaning nobody intends: `[%every 1 |=%tick]` fires every 1/2^64 s, `[%wait 30 %done]` waits about nothing, `(text 5)` renders the byte 0x05 and `^- @p 0` is `~zod`. Hoon rejects all of these (`mint-nice -need.@dr -have.@ud`), and "Literals: exactly Hoon's" ([decisions.md:12](https://github.com/iko-soy/jibb/blob/0858191ab08738c4da5c6d84f00492e629564e73/docs/spec/decisions.md?plain=1#L12)) points the same way. Once review question 16 lands, `%1.000` fits only its own aura family, and `1.000` would be the looser of the two.
192−
193−**Evidence.** `^- @dr 30`, `^- @p 0`, `^- @t 5` and `^- (element !!) (text 5)` all check today. No source in my-app, jibb-dev or the docs relies on it.
194−
195−**After:**
196−
197−```
198−++ subs |= m=model
199− ~[[%every ~s1 |=%tick]] :: [%every 1 |=%tick]: "1 is a @ud; a duration is written ~s1"
200−++ note (text "5") :: (text 5): "5 is a @ud; text is written \"5\""
201−++ bump |= x=A (add x 1) :: unchanged: generic over its aura, so (bump ~s1) checks
202−```
203−
204−The rule, for grammar.md:21 and :167: a decimal is `@ud`, and also fits `@u`, `@` and `*`, as in Hoon. Where its `++` is generic over its aura it stays generic, as decisions.md:33 already says. Other auras take their own literals: `~s30`, `~2026.1.1`, `~zod`, `"5"`, `0x1`.
205−
206−**Compatibility.** Some programs that check today become errors. In the corpus only [types-partial-aura](https://github.com/iko-soy/jibb/blob/0858191ab08738c4da5c6d84f00492e629564e73/tests/golden/types-partial-aura/source.jibb#L2) flips: `^- @ux 1`, which Hoon also rejects, becomes `0x1`. If @iko would rather keep `^- @ux 1`, allowing `@ux` and `@uv` is a stated deviation from Hoon.
207−
208−**Parser.** None. In the checker, the decimal constraint against a concrete atom ([jibb.hoon:4909-4914](https://github.com/iko-soy/jibb/blob/0858191ab08738c4da5c6d84f00492e629564e73/jibb-dev/lib/jibb.hoon#L4909-L4914)) accepts only `ud`, `u` and the empty aura.
209−
210−**Touches.** grammar.md:21, :162 and :167. It extends review question 16 (a) to bare decimals without restating it.
211−
212−### S5. Reject a pattern name that spells one of the subject's tags
213−
214−**Problem.** A bare name in a pattern always binds ([grammar.md:184](https://github.com/iko-soy/jibb/blob/0858191ab08738c4da5c6d84f00492e629564e73/docs/spec/grammar.md?plain=1#L184)), so a tag written without its `%` becomes a catch-all. In any arm but the last, review question 22's dead-arm error catches it. In the last arm it checks, and from then on it silently takes every case later added to the union, which switches off the exhaustiveness check that [decisions.md:30](https://github.com/iko-soy/jibb/blob/0858191ab08738c4da5c6d84f00492e629564e73/docs/spec/decisions.md?plain=1#L30) relies on. In Hoon a bare `stop` in a `?-` arm is not a binder, so Hoon programmers expect an error.
215−
216−**Evidence.** grammar.md's own `step` example with `stop` for `%stop` as its last arm checks as `$-(step @t)`. `[typed t]` for `[%typed t]` checks too.
217−
218−**Before** and **after**, [grammar.md:210-216](https://github.com/iko-soy/jibb/blob/0858191ab08738c4da5c6d84f00492e629564e73/docs/spec/grammar.md?plain=1#L210-L216) with one `%` dropped:
219−
220−```
221−++ describe |= s=step
222− ?- s
223− [%move %left n] "left {n}"
224− [%move %right n] "right {n}"
225− [t %draft] t
226− [t %sent sent-at] t
227− stop "stop"
228−:: today: accepted; binds stop and catches everything left
229−:: proposed: "`stop` binds a name, but s can be the case %stop here; write %stop, or * for a catch-all"
230−```
231−
232−The rule, a new sentence in Patterns: "A bare name in a pattern is an error where the subject's type at that position is a union, or a one-case mold, with a case whose constant there is the term that name spells. Positions typed by an aura, `*`, a type variable or a container's element are unaffected, so `[t %draft] t` still binds `t`, and `x` is still a catch-all on a `@tas` subject." The limit to union positions matters: under review questions 16 and 17 every name spells a constant that a `@tas` or `@t` position can hold.
233−
234−**Compatibility.** Only adds errors, and no golden, prelude, my-app or doc arm is affected. **Parser.** None; the exhaustiveness check already computes the remaining cases' constants. **Touches.** A type-directed rule, which [decisions.md:32](https://github.com/iko-soy/jibb/blob/0858191ab08738c4da5c6d84f00492e629564e73/docs/spec/decisions.md?plain=1#L32) welcomes if the Grammar tab lists it.
235−
236−### S6. Let a change's item name a wing
237−
238−**Problem.** A change's items are single names, so updating a field of a nested record repeats the path, and a Hoon programmer's `m(open.cart x)` gets "expected a named item, found `open.cart`", which is wrong in spirit since the item is named. Hoon's `%=` takes wings: `=/ m [a=[b=1 c=2] d=3] m(b.a 5)` gives `[a=[b=5 c=2] d=3]`.
239−
240−```
241−:: today, synthetic: nothing in the repository writes a nested change yet
242−++ toggle-open |= m=model
243− m(cart=cart.m(open=(not open.cart.m)))
244−
245−:: proposed
246−++ toggle-open |= m=model
247− m(open.cart=(not open.cart.m))
248−```
249−
250−The rule: a change's item, inline or on a line of an open change, is `name=value` or `wing=value`, read through record fields only. Every value is computed from the original record, and two items that name the same field, or one inside the other, are an error. Tuples, samples and patterns keep plain names.
251−
252−**Compatibility.** Only errors become meaning: a wing followed tight by `=` parses nowhere today. [lex-tight-change-bad-5](https://github.com/iko-soy/jibb/blob/0858191ab08738c4da5c6d84f00492e629564e73/tests/golden/lex-tight-change-bad-5/source.jibb) flips. **Parser.** Still LL(2); the lexer already emits the wing token. **Touches.** The Syntax row ("changes take one or more record items") and parser reading 4. The benefit is low: Elm has no nested update either, and no code here needs one yet. Whatever is decided, the message for `m(a.b 1)` should say "expected `=` right after `a.b`" (part of [S9](#s9-name-the-hoon-or-elm-habit-behind-each-likely-slip)).
253−
254−### S7. Allow type variables longer than one letter
255−
256−**Problem.** A type variable is one capital ([grammar.md:286](https://github.com/iko-soy/jibb/blob/0858191ab08738c4da5c6d84f00492e629564e73/docs/spec/grammar.md?plain=1#L286)), so the architecture's molds read `(program D X M)`, with `X` for the model because `M` is taken, and the prose has to decode them. Hoon names `|$` parameters with words. The one-letter rule is the parser's own [reading 11](https://github.com/iko-soy/jibb/blob/0858191ab08738c4da5c6d84f00492e629564e73/docs/open-questions.md?plain=1#L85), never put to @iko.
257−
258−```
259−:: today, prelude.jibb:531-532; ++ id |= x=Msg x is "a type variable is one capital letter"
260−+$ program |$ [D X M]
261− [init=$-(D X) update=$-([M X] [X (list (cmd M))]) view=$-(X (element M)) subs=$-(X (list (sub M)))]
262−
263−:: proposed
264−+$ program |$ [Data Model Msg]
265− [ init=$-(Data Model)
266− update=$-([Msg Model] [Model (list (cmd Msg))])
267− view=$-(Model (element Msg))
268− subs=$-(Model (list (sub Msg)))
269−```
270−
271−`typevar = upper { lower | digit }`, so `Msg` and `T2` are variables and `AB` stays an error. Only a lexer error becomes meaning ([jibb.hoon:1357-1361](https://github.com/iko-soy/jibb/blob/0858191ab08738c4da5c6d84f00492e629564e73/jibb-dev/lib/jibb.hoon#L1357-L1361)), and single capitals stay valid.
272−
273−Two conditions. The printer must print written names: today `program`'s `D X M` print as `A B C` ([types-prelude-ui/types.txt:22](https://github.com/iko-soy/jibb/blob/0858191ab08738c4da5c6d84f00492e629564e73/tests/golden/types-prelude-ui/types.txt#L22)), so without that the names never reach an error message. And the spec should say plainly that capitalized names are variables and lowercase names are molds, the reverse of Elm, where `Msg` is a concrete type. The benefit is low: my-app writes one type variable in all.
274−
275−### S8. Catch a route segment that should have been a value
276−
277−**Problem.** A value goes into an application path in parentheses, `%/blog/(slug.p)`. A bare segment is a knot, and knots may hold dots, so `%/blog/slug.p` is the literal text "slug.p" and types as `qath` with no complaint. With `/ui/blog/_slug.jibb` present, milestone 4's route check as designed would accept it, and every card would link to one post. `%/blog/{slug}` is caught, but the message doesn't say how to put a value in a path.
278−
279−**After**, at milestone 4's route check and for a `@ta` or `@tas` parameter only: `%/blog/slug.p` is an error when it reads as a wing of a local binding ("write (slug.p) for its value, or (~.slug.p) for the text"), and `%/blog/slug` when it is the parameter's own name. Ordinary words stay literal links, since the prelude makes nearly every word a name in scope. The `{` message can improve now: "a segment's value goes in parentheses, as %/blog/(slug)".
280−
281−**Touches.** Refines [decisions.md:83](https://github.com/iko-soy/jibb/blob/0858191ab08738c4da5c6d84f00492e629564e73/docs/spec/decisions.md?plain=1#L83) and :92. Low value until milestone 4.
282−
283−## No language change
284−
285−These change messages, spec text, examples or the formatter's choices. The spec text is still @iko's, but none of them changes what a program means.
286−
287−### S9. Name the Hoon or Elm habit behind each likely slip
288−
289−**Problem.** Jibb's messages for the Hoon forms grammar.md names as left out are good. The next most likely slips get messages that blame another construct, or say nothing useful. Each new message is chosen where the parser or lexer already fails, using tokens it already holds, so LL(2) and the no-backtracking rule are untouched.
290−
291−| Written | Today | Proposed message |
292−| --- | --- | --- |
293−| `(a == b)` | "the closer `==` is left out: indentation covers it" | "Jibb has no operators: write (eq a b)"; likewise `+`, `-`, `<`, `>`, `\|>`, `&&` |
294−| `?- -.a` | "a name starts with a letter, and Jibb has no operators" | "`-.a` is left out: write (head a), or switch on a itself with arms such as [%add n]"; `+.a` gets `(tail a)` |
295−| `(~(get by m) "a")` | "expected a space between items, found `(`" | "`~(arm door …)` is left out: call the group's gate, as (get.by m \"a\")" |
296−| `True` | "expected an expression, found `T`" | "names are lowercase: the loobeans are %.y and %.n, null is ~" |
297−| `[x :: xs]` | an error two lines later about a shallower line | "the `::` at 2:6 begins a comment: a list's head and tail are [x xs]" |
298−| `b=2 c=3` on a line of an open `[` | "`name=value` goes in a cell", though it is in one | "a bracket open at the end of its line takes one item per line" |
299−| `-- note` | "the closer `--` is left out" | "comments start with `::`" |
300−| `+(n)`, `$:`, `$@`, `$~`, `=\|`, `^+`, `` `@ud`x `` | generic messages | `(succ n)`; a record; a `+$` with cases; no defaults; `^-` with a mold or `_`; `^- @ud x` |
301−| `\x -> …`, `{ m \| … }`, `f(x)`, `_` in a pattern | generic messages | `\|=(x …)`; `m(note="x")`; `(f x)`; `*` |
302−| `(lent "abc")`; a shadowing binder | a type mismatch; "pattern binder shadows a name" | "a string is a cord; (trip \"abc\") is its tape"; "binder `text` shadows the prelude's `text`" |
303−
304−**Compatibility.** Error text only, plus a one-bit layout flag on a token followed by a comment, used only for the `[x :: xs]` message. The golden `tree.txt` files of the affected `lex-*`, `inline-leftout-*` and types cases change.
305−
306−### S10. Make the EBNF say what the parser accepts
307−
308−**Problem.** The tree-sitter grammar and the formatter ([decisions.md:96-97](https://github.com/iko-soy/jibb/blob/0858191ab08738c4da5c6d84f00492e629564e73/docs/spec/decisions.md?plain=1#L96-L97)) will be written from the EBNF, and grammar.md calls itself "the syntax the compiler accepts". In several places the EBNF and the parser disagree, and every mismatch below was reproduced:
309−
310−- Samples: `rune = "|=" field …` reuses `field`, so a bare name in a sample reads as a mold reference, but it binds ([decisions.md:19](https://github.com/iko-soy/jibb/blob/0858191ab08738c4da5c6d84f00492e629564e73/docs/spec/decisions.md?plain=1#L19)), at any depth, while inside a faced mold such as `p=[a b]` the same names are molds. A cell sample's `[` closes on its line.
311−- `change` uses `item`, whose name is optional, though every item and every line of an open change must be named.
312−- `group` and `list` share `line = [ name "=" ] expr`, but their lines take no `name=`.
313−- `knot` may be empty, so the EBNF admits `//` and a trailing `/`; `/` alone is the empty path, which `pathlit` doesn't admit.
314−- `/%` takes any `term`, but only `%name` works; a `/=` path needs a segment.
315−
316−**After** ([grammar.md:221-289](https://github.com/iko-soy/jibb/blob/0858191ab08738c4da5c6d84f00492e629564e73/docs/spec/grammar.md?plain=1#L221-L289)):
317−
318−```
319−import = "/-" name | "/%" "%" name | "/=" name "/" knot { "/" knot } ;
320−change = wing "(" edit { edit } ")" | wing "(" { edit } elines ; (* "(" tight after the wing; m() is an error, review question 19 *)
321−edit = name "=" operand ;
322−elines = INDENT name "=" expr { NEWLINE name "=" expr } DEDENT ;
323−group = "(" expr ")" | "(" { operand } xlines ;
324−list = "~[" { operand } "]" | "~[" { operand } xlines ;
325−tuple = "[" item { item } "]" | "[" { item } ilines ; (* [] is an error, review question 19 *)
326−item = [ name "=" ] operand ;
327−xlines = INDENT expr { NEWLINE expr } DEDENT ; (* lines take no name= *)
328−ilines = INDENT [ name "=" ] expr { NEWLINE [ name "=" ] expr } DEDENT ;
329−sample = name (* one name, no ".": binds, at any depth *)
330− | name "=" mold | "=" name (* a name inside the mold is a mold *)
331− | "[" sample { sample } "]" (* a cell of samples; closes on its line *)
332− | mold ; (* any other mold, never a lone name or "[":
333− binds nothing, as |= ~ or |= post.blog *)
334−gate = "|=(" sample operand ")" ;
335−rune = "|=" sample ( expr | body ) | … ;
336−pathlit = "/" | "/" knot { "/" knot } ;
337−pathmold = "/" | "/" segment { "/" segment } ;
338−knot = kchar { kchar } ;
339−kchar = lower | digit | "-" | "." | "~" | "_" ;
340−```
341−
342−The prose changes with it: grammar.md:58 adds that a sample may be a bare name, which binds, or another mold, which binds nothing, as `|= ~`; :66 says `|=(sample operand)`. `[]` and `m()` follow review question 19's answer; the parser still accepts both until that lands. `~[]` stays valid (see [the dropped table](#considered-and-dropped)).
343−
344−**Touches.** No decided row. It writes [parser readings 1 to 5](https://github.com/iko-soy/jibb/blob/0858191ab08738c4da5c6d84f00492e629564e73/docs/open-questions.md?plain=1#L75-L79) into the spec, which @iko should confirm. If S6 lands, `edit` becomes `( name | wing ) "=" operand`.
345−
346−### S11. Say which deeper lines are allowed
347−
348−**Problem.** [grammar.md:9](https://github.com/iko-soy/jibb/blob/0858191ab08738c4da5c6d84f00492e629564e73/docs/spec/grammar.md?plain=1#L9) says "a deeper line continues the line above", which suggests a call can continue onto a deeper line. It can't: `f a` above a deeper `b` is "expected the end of the line, found a deeper line". Separately, the same text reads differently on an opener's line and on a deeper line. `~[heading 2 "Todos"` holds three items, while `text "a"` on a deeper line is one call; `[label=trim " x " n=1]` has three items, while `label=trim " x "` on a deeper line means `label=(trim " x ")`. grammar.md:44 explains this for lists only.
349−
350−**After**, grammar.md:9: "**Indentation is structure**: a block of deeper lines belongs to the line above it: to the last bracket that line leaves open at its end, to the body of the last rune or `++` on it, to `?-`'s arms, to an arm's body, or to a `+$`'s cases. A deeper line that nothing on the line above takes is an error, so a call never continues onto a deeper line. Returning to an earlier indentation closes every block since."
351−
352−And to Open brackets (grammar.md:11): "On the opener's line, spaces separate items, so `~[text "a"` holds two items. In an expression's open bracket each deeper line is one whole item: `text "a"` there is `(text "a")`, `label=trim " x "` is `label=(trim " x ")`, and under a `(` alone the first deeper line is the head. A mold's open bracket takes exactly one field or mold per deeper line." Also rename [lex-call-open-bad-1](https://github.com/iko-soy/jibb/blob/0858191ab08738c4da5c6d84f00492e629564e73/tests/golden/lex-call-open-bad-1/about.txt), which parses, as its about.txt says.
353−
354−### S12. Say that cell patterns nest, and flatten the prelude later
355−
356−**Problem.** Eight prelude gates nest a `?-` inside another `?-`'s arm, to look at two values or one list cell ahead: `both`, `clap`, `hunt`, `mate`, `clef`, `join`, `snip` and `rear`. `hunt` needs four `?-`s for one decision. The EBNF already allows nested cell patterns, but the spec shows none, and "not lists or pairs" ([grammar.md:184](https://github.com/iko-soy/jibb/blob/0858191ab08738c4da5c6d84f00492e629564e73/docs/spec/grammar.md?plain=1#L184)) reads as if cells don't nest. The partial checker doesn't support nested or list-refining patterns yet, which is why the prelude was written this way.
357−
358−**Now**, in grammar.md's Patterns: "… ships, loobeans and `~`, and cells of patterns, which nest; not `~[…]` lists or `a+b` pairs." Add the rows `[[~ a] [~ b]]` (a pair of present units) and `[x ~]` (a list of one item), and a note: over `[(unit A) (unit A)]`, `[~ b]` means "the first is null", not "a present unit", so keep every position visible, as `[* ~ b]`.
359−
360−**Later**, once the checker supports nested patterns along with review questions 5 and 22 ([prelude.jibb:203-214](https://github.com/iko-soy/jibb/blob/0858191ab08738c4da5c6d84f00492e629564e73/jibb-dev/lib/jibb/prelude.jibb#L203-L214) and [:331-337](https://github.com/iko-soy/jibb/blob/0858191ab08738c4da5c6d84f00492e629564e73/jibb-dev/lib/jibb/prelude.jibb#L331-L337)):
361−
362−```
363−:: today
364−++ hunt |= args=[$-([A A] ?) (unit A) (unit A)]
365− ?- args
366− [choose first second] ^- (unit A)
367− ?- first
368− ~ second
369− [~ a]
370− ?- second
371− ~ first
372− [~ b]
373− ?- (choose a b)
374− %.y first
375− %.n second
376−
377−:: later
378−++ hunt |= args=[$-([A A] ?) (unit A) (unit A)] ^- (unit A)
379− ?- args
380− [* ~ second] second
381− [* first ~] first
382− [choose [~ a] [~ b]]
383− ?- (choose a b)
384− %.y `a
385− %.n `b
386−```
387−
388−Both versions parse today; the flat one gets "branch is not supported by partial inference", so the prelude must wait or it stops checking.
389−
390−### S13. Put a cast whose expression takes deeper lines at the end of its line
391−
392−**Problem.** Eight prelude gates put `^- T` alone on the line below `|=`, and two arms do the same, so each pushes its body one level right. The spec's examples already write casts on the line they belong to (`++ theme ^- theme`, `++ id |= x=A ^- _ x`), and Hoon programmers read `|= a=@ ^- @` as one header. The formatter's "one canonical layout" doesn't say where a cast goes.
393−
394−```
395−:: today, prelude.jibb:376-380
396−++ lent |= xs=(list A)
397− ^- @ud
398− ?- xs
399− ~ 0
400− [item rest] (add 1 (lent rest))
401−
402−:: proposed
403−++ lent |= xs=(list A) ^- @ud
404− ?- xs
405− ~ 0
406− [item rest] (add 1 (lent rest))
407−
408−:: unchanged: a cast and its expression that fit on one line stay below the |=
409−++ row |= [attrs=(list attr) kids=(list (element M))]
410− ^- (element M) [%row attrs kids]
411−```
412−
413−For grammar.md:60: "A cast whose expression takes the deeper lines goes at the end of the line it belongs to, the `|=`, `++` or arm line; a cast whose expression fits on its own line goes on the line below with it." Both layouts parse to the same meaning today. If [S2](#s2-let-a-bodys-last---or--take-the-rest-of-the-body-at-the-same-depth) lands, the formatter must pick between this and the flat form; S13 can be adopted in the prelude now.
414−
415−### S14. Pin down the spellings the formatter writes
416−
417−**Problem.** The spec's code mixes equivalent spellings side by side, which suggests they differ: `(text …)` lines beside unparenthesized `field …` lines in one open list ([basket.jibb:29-32](https://github.com/iko-soy/jibb/blob/0858191ab08738c4da5c6d84f00492e629564e73/my-app/ui/basket.jibb#L29-L32)); `align=align` ([prelude.jibb:443-445](https://github.com/iko-soy/jibb/blob/0858191ab08738c4da5c6d84f00492e629564e73/jibb-dev/lib/jibb/prelude.jibb#L443-L445)) where the spec teaches `=msg`; a cast's body indented 2 deeper in some places and 4 in others. Each pair parses to the same thing.
418−
419−**After**, for grammar.md's Spacing: "The formatter writes one layout, except for runs of spaces. It drops parentheses around an unfaced whole line of an open list or group, writes `name=name` as `=name` in molds and samples, and indents a body two spaces deeper than the line it continues. Spaces for alignment and import gaps stay as written." Dropping alignment was considered and not proposed: it would reopen [decisions.md:16](https://github.com/iko-soy/jibb/blob/0858191ab08738c4da5c6d84f00492e629564e73/docs/spec/decisions.md?plain=1#L16) on diff-noise grounds alone. Whether a null-sample `load` is written wide, `|=(~ …)`, or tall is left to @iko; the spec uses both.
420−
421−### S15. Name the fields when the examples build a model
422−
423−**Problem.** The examples build models and state as bare tuples that take their faces from the expected type: `[[~ %.n] ""]` ([basket.jibb:15](https://github.com/iko-soy/jibb/blob/0858191ab08738c4da5c6d84f00492e629564e73/my-app/ui/basket.jibb#L15)), `[~ %.n]` ([cart.jibb:8](https://github.com/iko-soy/jibb/blob/0858191ab08738c4da5c6d84f00492e629564e73/my-app/ui/stores/cart.jibb#L8)), `[ts "" ~]` ([todo-list.jibb:14](https://github.com/iko-soy/jibb/blob/0858191ab08738c4da5c6d84f00492e629564e73/my-app/ui/todo-list.jibb#L14)). A reader of basket.jibb needs stores/cart.jibb open to learn what `[~ %.n]` means.
424−
425−```
426−++ init |= ~
427− [cart=[items=~ open=%.n] note=""]
428−++ init ^- state [items=~ open=%.n]
429−++ init |= ts=(list item.todo)
430− [todos=ts draft="" error=~]
431−```
432−
433−The faced form checks to the same type, and a misnamed field (`opened=`) becomes a definite error. These are the spec's teaching examples, so the matching doc blocks and `doc-*` golden sources change with them.
434−
435−## Considered and dropped
436−
437−| Proposal | Why it was dropped |
438−| --- | --- |
439−| Reject a bare sample name that also names a mold in scope (`\|= [n=@ud item]` binds a value named `item`) | It rejects natural code that checks today, such as `\|=(item item)` beside `+$ item` and `\|=(path …)` with the prelude's `path`, and every new prelude mold would break more. The typed spellings `=item` and `it=item` already exist. |
440−| Name the fields in patterns, `[%acked err=e]` | Opt-in, so it doesn't protect the positional arms that have the hazard; the probed real arms fail at the next use rather than silently; and it reopens Binding patterns ([decisions.md:55](https://github.com/iko-soy/jibb/blob/0858191ab08738c4da5c6d84f00492e629564e73/docs/spec/decisions.md?plain=1#L55)). Hoon-style narrowing conflicts with Refinement types: none. A checker message naming the rest a binder took is enough if the hazard shows up. |
441−| Let a cell sample's `[` be left open | Only two prelude lines need it, `++ program` can take `p=(program D X M)` instead, and in an open `(turn xs` the same layout would read two ways. |
442−| Let a call continue its arguments onto deeper lines | A call followed by deeper lines already means a `~&` body or `?-` arms; mis-indented list items would become calls instead of layout errors; and the decided form `(field "New todo"` with deeper arguments costs only one `(`. S11 fixes the prose that suggested it. |
443−| Let patterns take `` `x `` and `gap+s` | A second spelling for every unit and pair pattern, and the existing hints already name the one accepted spelling. |
444−| Puns in tuples and changes, `[=draft]`, `m(=draft)` | The corpus has no expression `name=name` outside two test sources, and Hoon has no expression pun either (`[=a =b]` fails under urbit eval). |
445−| Reject `~[]`, as `[]` is rejected | `~[]` is the only empty list that types without context, `(list A)`, while a bare `~` asks for a `^-`; 38 golden uses rely on it. Instead, grammar.md's Literals table could say so. |
446−
447−Five of these seven were my own candidates; the verification refuted them.
448−
449−## What to keep
450−
451−The reviewers agreed on these strengths, and the proposals above are built not to disturb them.
452−
453−- **Open brackets with no closers**, plus the several-open-brackets rule: `column ~[gap+%s2] ~[` with one item per line reads like elm-ui without commas or closers, adding an item is a one-line diff, and every mis-nesting the reviewers tried failed to parse or failed to type.
454−- **Tightness as the one disambiguator, with an error for every slip**: `m(note=t)` is a change and `m (note t)` a call, `|=%got` a constructor and `|= %got` a gate, and `gap+%s2` binds tighter than a call, so attribute lists need no parentheses.
455−- **`|=%tag` constructors**: Elm's constructor-as-function with nothing to write, and a bare tag is always a value, so a tag never silently becomes a reply gate.
456−- **Named changes**, `m(draft="" error=~)`: Elm's record update in Hoon's shape, untouched when the model grows.
457−- **One exhaustive `?-`**, loobeans included, with no operators and so no precedence or dangling else. When a union gains a case, every `?-` that must handle it is flagged.
458−- **`+$` with cases below as the only union syntax**, so every union has a name and `+$ msg` reads like an Elm type declaration.
459−- **Left-out Hoon runes fail at the exact character** with the reason and the Jibb form to write ([inline-leftout-* cases](https://github.com/iko-soy/jibb/tree/0858191ab08738c4da5c6d84f00492e629564e73/tests/golden)).
460−- **Separate mold and value namespaces**, with one `.` for fields, imports and prelude groups, so `todos.todo` can be a mold and a request, and an imported module's growth never collides with the importer's names.
461−- **Hoon's literals exactly**, strings only `"…"` and always cords, and `{…}` holding a whole expression, so `"{lent xs} items"` needs no parentheses.
462−- **Rune bodies must be deeper, and a deeper line nothing takes is an error**, so structure never drifts silently. S2 is a narrow exception where no other parse is possible.
463−- **The LL(2) parser over layout tokens** never backtracks and puts each error at the first character that can't continue ([jibb.hoon:405-415](https://github.com/iko-soy/jibb/blob/0858191ab08738c4da5c6d84f00492e629564e73/jibb-dev/lib/jibb.hoon#L405-L415)); the layout pass works by column alone, so a tree-sitter scanner needs only an indent stack.
464−
465−## Questions for @iko
466−
467−In priority order. Each would be recorded in decisions.md before any code changes.
468−
469−1. **S1**: (a) Does a capital bind only the type under a face, so `[A A]` fits `[x=@ y=@]`? (b) Are a gate's sample names ignored when two gate types unify, reopening decisions.md:33 and open question 8 for gate samples only?
470−2. **S2**: May a body's last `^-`, `~&` or `|=` take the rest of the body at the same depth, with the flat form canonical?
471−3. **S3**: May samples, pattern binders and local `++` reuse prelude value names, reopening settled open question 26? Decide with S5.
472−4. **S4**: Does a bare decimal fit only `@ud`, `@u`, `@` and `*`, as in Hoon?
473−5. **S5**: Is a pattern name that spells a case's tag at a union position an error?
474−6. **S7**: May type variables be words such as `Msg`, with the printer keeping written names?
475−7. **S6**: May a change's item name a wing?
476−8. **S10 and S11**: Do the EBNF and the indentation prose take the wording above, confirming the parser's readings 1 to 5?
477−9. **S12, S13 and S14**: May the spec show nested patterns, and does the canonical layout put casts and spellings as proposed?
478−10. **S8**, at milestone 4: should the route check catch the two narrow segment slips?
479−
480−## How to rerun a probe
481−
482−Every claim above came from a probe like this, run at `0858191`:
483−
484−1. Make a folder with one subfolder per case, holding `source.jibb` and an `about.txt` of the four lines `source: probe`, `tests: x`, `expect: unclear`, `expect-types: probe`.
485−2. For prelude-aware type reports, start the source with `/= lib /ui/lib`, add a `modules.txt` holding `/ui/lib.jibb`, and a `modules/ui/lib.jibb` holding `++ identity |=(x x)`. Without an import, the partial checker doesn't load the prelude.
486−3. Run `tools/golden --dir <folder> --show`. It prints each case's tokens, its tree or parse error, and the partial type report.
487−
488−"Not supported by partial inference" in a report is a checker gap, not a verdict on the syntax.
docs/spec/core-language.md+2−2
@@ -108,8 +108,8 @@ The todo island's `update`, from worked example 3:
108 ?- (gth (lent (tuba (trip t))) 80)
108 ?- (gth (lent (tuba (trip t))) 80)
109 %.y [m(draft=t error=`"Too long") ~]
109 %.y [m(draft=t error=`"Too long") ~]
110 %.n [m(draft=t error=~) ~]
110 %.n [m(draft=t error=~) ~]
111− %submit [m(draft="") ~[(poke.todo [%add draft.m] |=%acked)]]
111+ %submit [m(draft="") ~[[%poke (todo-action.todo [%add draft.m]) |=%acked]]]
112− [%toggled id] [m ~[(poke.todo [%toggle id] |=%acked)]]
112+ [%toggled id] [m ~[[%poke (todo-action.todo [%toggle id]) |=%acked]]]
113 [%got ts] [m(todos=ts) ~]
113 [%got ts] [m(todos=ts) ~]
114 [%acked err] [m(error=err) ~]
114 [%acked err] [m(error=err) ~]
115```
115```
docs/spec/decisions.md+89−164
@@ -6,170 +6,95 @@ The choices behind the Language tab, made on 2026-10-23; a later date marks a re
6
6
7## Decisions
7## Decisions
8
8
9−Until the Claude doc is synced with this copy, this copy is the spec (review question 42). Synced says whether the doc's Decisions tab has the row as written here. A row decided by 2026-10-29 or undated was in the doc when `spec/` was copied from it on 2026-10-30, and is unchanged. A row decided on or after 2026-10-31 is only here. A row of 2026-10-30 says Check: the copy had that day's answers to the 12 grammar questions, but other rows of that day were added or edited here afterwards ([docs/README.md](../README.md#the-spec)), and nobody has compared them with the doc yet.
9+| Decision | Choice | Status |
10−
10+| --- | --- | --- |
11−| Decision | Choice | Status | Synced |
11+| Syntax | Hoon's runes as keywords, and its literals; wide forms only for `\|=` and `$-`; changes take one or more record items, as `m(draft="x")`, so `m()` is an error; `.` reads fields, imports and prelude groups; no name may shadow another | Decided 2026-10-30 |
12−| --- | --- | --- | --- |
12+| Literals | Exactly Hoon's, including `%$` as a term literal and pattern: `1000` is an error, `~2026.2.31` is `~2026.3.3`, and years BC and sub-second groups are dates; `print-date`'s minute form is not a literal | Decided 2026-10-30 |
13−| Syntax | Hoon's runes as keywords, and its literals; wide forms only for `\|=` and `$-`; changes take one or more record items, as `m(draft="x")`, so `m()` is an error; `.` reads fields, imports and prelude groups; no name may shadow another | Decided 2026-10-30 | Check |
13+| Cells | A single-item cell `[a]` is `a`; an empty `[]` is an error, in expressions and molds | Decided 2026-10-30 |
14−| Literals | Exactly Hoon's, including `%$` as a term literal and pattern: `1000` is an error, `~2026.2.31` is `~2026.3.3`, and years BC and sub-second groups are dates; `print-date`'s minute form is not a literal | Decided 2026-10-30 | Check |
14+| Numeric terms | `%` and a decimal as Hoon writes it: `%1.000`; `%1000` and `%007` are errors | Decided 2026-10-30 |
15−| Cells | A single-item cell `[a]` is `a`; an empty `[]` is an error, in expressions and molds | Decided 2026-10-30 | Check |
15+| Strings | Hoon's escapes: `\\`, `\"`, `\{`, and `\` with two lowercase hex digits; a string and each `{…}` close on the line they open; `::` in a string is text | Decided 2026-10-30 |
16−| Numeric terms | `%` and a decimal as Hoon writes it: `%1.000`; `%1000` and `%007` are errors | Decided 2026-10-30 | Check |
16+| Spacing | Style, kept by the formatter: one or more spaces between items, and spaces allowed after an opener, before a closer and at the end of a line; faces, puns and typed path segments take no spaces; a rune is followed by one | Decided 2026-10-30 |
17−| Strings | Hoon's escapes: `\\`, `\"`, `\{`, and `\` with two lowercase hex digits; a string and each `{…}` close on the line they open; `::` in a string is text | Decided 2026-10-30 | Check |
17+| Path literals | `/posts/~zod` is an expression: `pathlit` is an operand | Decided 2026-10-30 |
18−| Spacing | Style, kept by the formatter: one or more spaces between items, and spaces allowed after an opener, before a closer and at the end of a line; faces, puns and typed path segments take no spaces; a rune is followed by one | Decided 2026-10-30 | Check |
18+| Crash | `!!` is an operand, so `f !!` and `~[!!]` need no parentheses | Decided 2026-10-30 |
19−| Path literals | `/posts/~zod` is an expression: `pathlit` is an operand | Decided 2026-10-30 | Check |
19+| Sample names | Every bare name in a sample binds, at any depth: `\|= [a=@ b]` binds `a` and `b` | Decided 2026-10-30 |
20−| Crash | `!!` is an operand, so `f !!` and `~[!!]` need no parentheses | Decided 2026-10-30 | Check |
20+| Local definitions | At the start of any body: a gate's, an arm's, a `^-`'s, a `~&`'s or a `++`'s | Decided 2026-10-30 |
21−| Sample names | Every bare name in a sample binds, at any depth: `\|= [a=@ b]` binds `a` and `b` | Decided 2026-10-30 | Check |
21+| Value cycles | A non-gate value that depends on itself, even through a gate, is an error; mutually recursive gates are allowed | Decided 2026-10-30 |
22−| Local definitions | At the start of any body: a gate's, an arm's, a `^-`'s, a `~&`'s or a `++`'s | Decided 2026-10-30 | Check |
22+| Open molds | A mold's `[` and `(` may be left open at line end, one field or mold per deeper line; a `(` keeps the mold's name on its first line | Decided 2026-10-30 |
23−| Value cycles | A non-gate value that depends on itself, even through a gate, is an error; mutually recursive gates are allowed | Decided 2026-10-30 | Check |
23+| Open groups | A `(` alone at line end puts the call's head on the first deeper line | Decided 2026-10-30 |
24−| Open molds | A mold's `[` and `(` may be left open at line end, one field or mold per deeper line; a `(` keeps the mold's name on its first line | Decided 2026-10-30 | Check |
24+| Several open brackets | The deeper lines go to the last bracket, or the last rune's body, left open on a line, and the brackets before it close with it: `(column ~ ~[` needs no `)` | Decided 2026-10-30 |
25−| Open groups | A `(` alone at line end puts the call's head on the first deeper line | Decided 2026-10-30 | Check |
25+| Jibb code blocks | Labelled `jibb` in this doc; each is a golden test | Decided 2026-10-30 |
26−| Several open brackets | The deeper lines go to the last bracket, or the last rune's body, left open on a line, and the brackets before it close with it: `(column ~ ~[` needs no `)` | Decided 2026-10-30 | Check |
26+| Definitions | `++` for values, `+$` for molds; no `=/` | Decided |
27−| Jibb code blocks | Labelled `jibb` in this doc; each is a golden test | Decided 2026-10-30 | Check |
27+| Unions | No `$?`: a `+$` with its cases on the lines below is a union, so every union written in Jibb has a name; one case is just that mold; a mold that isn't a union counts as a union of one case for tags and `\|=%tag`; a generic's `\|$` comes right after the `+$`'s name; tags anywhere; constructor heads and case disjointness compare literal noun values regardless of spelling, so `%$`, `%.y` and `~` are equal and overlapping cases are errors; cases differ as nouns, with `?` treated as the two atoms `%.y` and `%.n`, disjoint from cells and overlapping constants 0 and 1, and `!!` or any cell with an empty position disjoint from every case; a tag literal or `~` waits for its union, and an unresolved one is an error | Decided 2026-10-31 |
28−| Definitions | `++` for values, `+$` for molds; no `=/` | Decided | Yes |
28+| Printed unnamed unions | Print the cases separated by spaces, as `%approve %deny`; this is print-only, not Jibb syntax | Decided 2026-10-30 |
29−| Unions | No `$?`: a `+$` with its cases on the lines below is a union, so every union written in Jibb has a name; one case is just that mold; a mold that isn't a union counts as a union of one case for tags and `\|=%tag`; a generic's `\|$` comes right after the `+$`'s name; tags anywhere; constructor heads and case disjointness compare literal noun values regardless of spelling, so `%$`, `%.y` and `~` are equal and overlapping cases are errors; cases differ as nouns, with `?` treated as the two atoms `%.y` and `%.n`, disjoint from cells and overlapping constants 0 and 1, and `!!` or any cell with an empty position disjoint from every case; a tag literal or `~` waits for its union, and an unresolved one is an error | Decided 2026-10-31 | No |
29+| Printed type constraints | Print an atom constraint as `$-([A A] A) where A is an atom`, an arithmetic atom constraint as `where A is an atom other than ?`, and a gate-free constraint as `$-([A A] ?) where A contains no gates`; separate multiple clauses with commas, as `where A is an atom, B contains no gates` | Decided 2026-10-31 |
30−| Printed unnamed unions | Print the cases separated by spaces, as `%approve %deny`; this is print-only, not Jibb syntax | Decided 2026-10-30 | Check |
30+| Branching | `?-` only, loobeans included; exhaustive, with explicit catch-alls; covered arms are errors; failures say `!!` | Decided 2026-10-29 |
31−| Printed type constraints | Print an atom constraint as `$-([A A] A) where A is an atom`, an arithmetic atom constraint as `where A is an atom other than ?`, and a gate-free constraint as `$-([A A] ?) where A contains no gates`; separate multiple clauses with commas, as `where A is an atom, B contains no gates` | Decided 2026-10-31 | No |
31+| 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 |
32−| Branching | `?-` only, loobeans included; exhaustive, with explicit catch-alls; covered arms are errors; failures say `!!` | Decided 2026-10-29 | Yes |
32+| Special rules | No built-ins; type-directed rules are welcome, each listed in the Grammar tab | Decided 2026-10-29 |
33−| 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 | Check |
33+| 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−| Special rules | No built-ins; type-directed rules are welcome, each listed in the Grammar tab | Decided 2026-10-29 | Yes |
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−| 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 | Check |
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 |
36−| 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 | No |
36+| 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 |
37−| 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 | No |
37+| Mark names | Any name: `/%` names types after marks, and constructors poke with their type's mark; no alias marks | Decided 2026-10-26 |
38−| 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 | No |
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 |
39−| Mark names | Any name: `/%` names types after marks, and constructors poke with their type's mark; no alias marks | Decided 2026-10-26 | Yes |
39+| 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 |
40−| 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 | No |
40+| Record fields | Duplicate field names in a Jibb-written record are an error, as they are in an imported Hoon record | Decided 2026-10-31 |
41−| 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 | Check |
41+| Record projection | The explicit type-directed operation `proj` takes a record and uses its expected result type to select its fields; no projection is inserted automatically. `proj` is reserved and cannot be defined or imported under that name. The result has exactly the fields declared by its type | Decided 2026-10-31 |
42−| 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 | No |
42+| Layout | Indentation; juxtaposed calls; a bracket open at line end takes one item per line, with no closer | Decided |
43−| 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 | No |
43+| Elements | Ordinary gates; containers take attribute lists; `stack` switches at `wide`; `el` adds attributes and wins; headings 1 to 6; `form` sends on Enter, the innermost when nested; `image` from an application path, sized from the file, or a sized URL; no focus control for now | Decided 2026-10-29 |
44−| Layout | Indentation; juxtaposed calls; a bracket open at line end takes one item per line, with no closer | Decided | Yes |
44+| Long calls | One argument per line inside parentheses | Decided |
45−| Elements | Ordinary gates; containers take attribute lists; `stack` switches at `wide`; `el` adds attributes and wins; headings 1 to 6; `form` sends on Enter, the innermost when nested; `image` from an application path, sized from the file, or a sized URL; no focus control for now | Decided 2026-10-29 | Yes |
45+| Inline gates | Hoon's wide form; the mold may be inferred; a bare sample name binds; `\|=%got` is a case's constructor, typed by the gate expected; a bare tag is always a value | Decided 2026-10-29 |
46−| Long calls | One argument per line inside parentheses | Decided | Yes |
46+| Empty mold | `!!`, with no values; the expression has any type; pages are `(element !!)`, which keeps islands out of islands | Decided 2026-10-29 |
47−| Inline gates | Hoon's wide form; the mold may be inferred; a bare sample name binds; `\|=%got` is a case's constructor, typed by the gate expected; a bare tag is always a value | Decided 2026-10-29 | Yes |
47+| Noun mold | `*` is the noun type, not a type variable; use a capital for a generic type; a value of a more specific noun type can be used where `*` is expected | Decided 2026-10-30 |
48−| Empty mold | `!!`, with no values; the expression has any type; pages are `(element !!)`, which keeps islands out of islands | Decided 2026-10-29 | Yes |
48+| Type variables | Capitals, generalized per `++`; a capital in a local `++` shares the enclosing `++`'s variable of that name if the enclosing `++` also uses it; otherwise it is introduced and generalized locally; a different type takes a different capital; a body cannot force distinct capitals to be equal, so a shared type uses the same capital; one used where an atom is required gains an inferred atom constraint, and cannot be fixed to a more specific type in its body | Decided 2026-10-30 |
49−| Noun mold | `*` is the noun type, not a type variable; use a capital for a generic type; a value of a more specific noun type can be used where `*` is expected | Decided 2026-10-30 | Check |
49+| Partial type annotations | `_` may appear wherever a mold may appear and marks that part of the type for inference; a hole inferred as a named type variable is resolved; an unconstrained hole is an error, and a named mold or value definition must determine its own holes without constraints from later uses | Decided 2026-10-31 |
50−| Type variables | Capitals, generalized per `++`; a capital in a local `++` shares the enclosing `++`'s variable of that name if the enclosing `++` also uses it; otherwise it is introduced and generalized locally; a different type takes a different capital; a body cannot force distinct capitals to be equal, so a shared type uses the same capital; one used where an atom is required gains an inferred atom constraint, and cannot be fixed to a more specific type in its body | Decided 2026-10-30 | Check |
50+| Loobean mold | `?`, switched with `?-` | Decided 2026-10-26 |
51−| Partial type annotations | `_` may appear wherever a mold may appear and marks that part of the type for inference; a hole inferred as a named type variable is resolved; an unconstrained hole is an error, and a named mold or value definition must determine its own holes without constraints from later uses | Decided 2026-10-31 | No |
51+| Defaults | None | Decided |
52−| Loobean mold | `?`, switched with `?-` | Decided 2026-10-26 | Yes |
52+| Modules | Records, not cores | Decided |
53−| Defaults | None | Decided | Yes |
53+| Kinds | The type of `main`: `(element !!)`, `(page R D)`, `(program D X M)` or `(store S)`; other names by file kind, in the Grammar tab | Decided 2026-10-29 |
54−| Modules | Records, not cores | Decided | Yes |
54+| Type identity | Recursive molds by name and module | Decided 2026-10-29 |
55−| Kinds | The type of `main`: `(element !!)`, `(page R D)`, `(program D X M)` or `(store S)`; other names by file kind, in the Grammar tab | Decided 2026-10-29 | Yes |
55+| Binding patterns | In `?-` arms; the last position binds the rest | Decided 2026-10-29 |
56−| Type identity | Recursive molds by name and module | Decided 2026-10-29 | Yes |
56+| Text | Strings are written only as `"…"` and are always cords; tapes come from `trip`; `{…}` prints by aura, a bare `@` as `@ud`, and an atom whose aura its `++` is generic over is an error; `print-date` prints Urbit-style to the minute in the theme's zone, from jibb-dev's zone table; numbers keep Hoon's form | Decided 2026-10-30 |
57−| Binding patterns | In `?-` arms; the last position binds the rest | Decided 2026-10-29 | Yes |
57+| Auras | Specific auras stay distinct; `@` is any atom, a more specific aura fits an ancestor in its Hoon aura family one way, with the reverse requiring a check, and shared atom-constrained type variables preserve the same aura | Decided 2026-10-30 |
58−| Text | Strings are written only as `"…"` and are always cords; tapes come from `trip`; `{…}` prints by aura, a bare `@` as `@ud`, and an atom whose aura its `++` is generic over is an error; `print-date` prints Urbit-style to the minute in the theme's zone, from jibb-dev's zone table; numbers keep Hoon's form | Decided 2026-10-30 | Check |
58+| Loobean arithmetic | Arithmetic rejects loobean operands; comparison may accept them and returns `?` | Decided 2026-10-31 |
59−| Auras | Specific auras stay distinct; `@` is any atom, a more specific aura fits an ancestor in its Hoon aura family one way, with the reverse requiring a check, and shared atom-constrained type variables preserve the same aura | Decided 2026-10-30 | Check |
59+| Crashes | As in Hoon; an island keeps its model and shows the standard notice; a failing page, or one rendering a control outside an island, gets Jibb's error page; no render limit, so an endless render stalls the ship | Decided 2026-10-29 |
60−| Loobean arithmetic | Arithmetic rejects loobean operands; comparison may accept them and returns `?` | Decided 2026-10-31 | No |
60+| Refinement types | None | Decided |
61−| Crashes | As in Hoon; an island keeps its model and shows the standard notice; a failing page, or one rendering a control outside an island, gets Jibb's error page; no render limit, so an endless render stalls the ship | Decided 2026-10-29 | Yes |
61+| Imports | `/-`, `/%` (a mark's type, with no face) and `/=`; no `/+`; cycles are errors | Decided 2026-10-29 |
62−| Refinement types | None | Decided | Yes |
62+| Hoon marks for Jibb types | None: wire types are the agent's marks, and Jibb's own types never cross | Decided 2026-10-26 |
63−| Imports | `/-`, `/%` (a mark's type, with no face) and `/=`; no `/+`; cycles are errors | Decided 2026-10-29 | Yes |
63+| Core language | A small untyped core language between the checker and both backends: Nock's operations on nouns plus a lambda calculus with names; one sample per call; s-expressions as its text form; a reference interpreter in Hoon; three rules in its tab still proposed | Decided |
64−| Hoon marks for Jibb types | None: wire types are the agent's marks, and Jibb's own types never cross | Decided 2026-10-26 | Yes |
64+| Stages | By kind: pages without data at commit, with data in the host, islands and stores in the browser; never inferred | Decided 2026-10-29 |
65−| Core language | A small untyped core language between the checker and both backends: Nock's operations on nouns plus a lambda calculus with names; one sample per call; s-expressions as its text form; a reference interpreter in Hoon; three rules in its tab still proposed | Decided | Yes |
65+| 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 |
66−| Stages | By kind: pages without data at commit, with data in the host, islands and stores in the browser; never inferred | Decided 2026-10-29 | Yes |
66+| Compile targets | Nock on the ship, JavaScript in the browser | Decided |
67−| 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 | Yes |
67+| Optimizer | Basic lowering; holes later | Decided 2026-10-29 |
68−| Compile targets | Nock on the ship, JavaScript in the browser | Decided | Yes |
68+| Island `update` | In the browser | Decided |
69−| Optimizer | Basic lowering; holes later | Decided 2026-10-29 | Yes |
69+| Island `init` | Takes the page's data, returns the model | Decided 2026-10-29 |
70−| 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 | No |
70+| Island rendering | `view` re-runs on model changes; a keyed diff patches the DOM; holes later | Decided 2026-10-29 |
71−| Island `init` | Takes the page's data, returns the model | Decided 2026-10-29 | Yes |
71+| Data crossing to the browser | No gates in island data or models | Decided 2026-10-29 |
72−| Island rendering | `view` re-runs on model changes; a keyed diff patches the DOM; holes later | Decided 2026-10-29 | Yes |
72+| 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 |
73−| Data crossing to the browser | No gates in island data or models | Decided 2026-10-29 | Yes |
73+| Transactions | None; one poke per command | Decided |
74−| 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 | Yes |
74+| Reloads | Restart from the model the page is served with | Decided 2026-10-29 |
75−| Transactions | None; one poke per command | Decided | Yes |
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 |
76−| Reloads | Restart from the model the page is served with | Decided 2026-10-29 | Yes |
76+| 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 |
77−| 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 | No |
77+| Apps | One island under a catch-all route, given the path by `pure`; `%url` delivers the path on every change; in-section links act as `go`; focus moves to the first heading | Decided 2026-10-29 |
78−| 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 | No |
78+| Layout vocabulary | Jibb's elements and theme tokens; the stylesheet comes from the theme alone; chars and fill are inline; `[%fill n]` below 1 counts as 1 | Decided 2026-10-29 |
79−| 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 | Yes |
79+| Responsive layout | `stack` switches at the theme's `wide` | Decided 2026-10-29 |
80−| 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 | Yes |
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−| 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 | Yes |
81+| Dark mode | Hand-written dark tones under `dark`, used when the reader prefers dark | Decided 2026-10-27 |
82−| Responsive layout | `stack` switches at the theme's `wide` | Decided 2026-10-29 | Yes |
82+| Links | All text escaped; in-app links are application paths, as `%/blog/(slug)`, with no query or fragment, checked at compile time against routes and static files; paths and unchecked `https`, `mailto` and `tel` URLs and root-relative cords such as `"/apps/groups"` have separate declarations; `link-unsafe`, `image-unsafe` and `go-unsafe` are the unchecked forms; both navigation declarations produce `[%go url=@t]`, with `go` converting the path to a cord including the app's base path; other cords render as text; a CSP on every page | Decided 2026-10-30 |
83−| 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 | No |
83+| Data layer | Hoon's nouns: units, treaps, loobeans | Decided |
84−| Dark mode | Hand-written dark tones under `dark`, used when the reader prefers dark | Decided 2026-10-27 | Yes |
84+| Prelude | Hoon's standard library regrouped: all names from the listed sections except explicitly excluded groups, including all of 3g, with Hoon's `tone` exposed as `tone.hoon` and Hoon's 1c `step` as `step.hoon`; arithmetic over aura variables, units, lists, maps, sets, queues, ordered maps, function helpers, text, atom printing, a zoned date printer, time and data molds; folds take a start; jetted functions have working Jibb implementations, whose shapes the compiler recognizes to use the Hoon versions, and may take gates; private helpers and low-level primitives live in a separate internal module imported without exposing them, with public foundational gates implemented in Jibb on those primitives; `clap` takes two units of the same type and a combining gate over that type; no signed or float gates, or parser gates outside 3g except `slav` and `slaw`; signed or float auras are errors | Decided 2026-10-30 |
85−| 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 | Check |
85+| `like` | The `(like A)` mold remains available; the value gate `like` maps the product of an existing `(like A)` with a gate `$-(A B)`, preserving the position and remaining input, and returns `(like B)` | Decided 2026-10-31 |
86−| Data layer | Hoon's nouns: units, treaps, loobeans | Decided | Yes |
86+| Wire format | Noun channels; Jibb's own noun codec in the browser | Decided 2026-10-29 |
87−| Prelude | Hoon's standard library regrouped: all names from the listed sections except explicitly excluded groups, including all of 3g, with Hoon's `tone` exposed as `tone.hoon` and Hoon's 1c `step` as `step.hoon`; arithmetic over aura variables, units, lists, maps, sets, queues, ordered maps, function helpers, text, atom printing, a zoned date printer, time and data molds; folds take a start; jetted functions have working Jibb implementations, whose shapes the compiler recognizes to use the Hoon versions, and may take gates; private helpers and low-level primitives live in a separate internal module imported without exposing them, with public foundational gates implemented in Jibb on those primitives; `clap` takes two units of the same type and a combining gate over that type; no signed or float gates, or parser gates outside 3g except `slav` and `slaw`; signed or float auras are errors | Decided 2026-10-30 | Check |
87+| Hosting | One thin host agent on `%jibb` binds, caches and serves every Jibb desk; each desk vendors jibb-dev, names its base path in docket's `site+`, and builds and renders with its own copy through fixed entry points; install `%jibb` first; app agents stay plain Hoon; pokes only from the ship | Decided 2026-10-29 |
88−| `like` | The `(like A)` mold remains available; the value gate `like` maps the product of an existing `(like A)` with a gate `$-(A B)`, preserving the position and remaining input, and returns `(like B)` | Decided 2026-10-31 | No |
88+| Private pages | Served by the host per request and never cached; non-owners go to the login page | Decided 2026-10-29 |
89−| Wire format | Noun channels; Jibb's own noun codec in the browser | Decided 2026-10-29 | Yes |
89+| Cache | Eyre holds only the hashed assets, all public; the host serves every page; a desk's entries are cleared on suspend or uninstall, and all by `-jibb!clear` | Decided 2026-10-29 |
90−| Hosting | One thin host agent on `%jibb` binds, caches and serves every Jibb desk; each desk vendors jibb-dev, names its base path in docket's `site+`, and builds and renders with its own copy through fixed entry points; install `%jibb` first; app agents stay plain Hoon; pokes only from the ship | Decided 2026-10-29 | Yes |
90+| Static files | Under `/ui/static/`, committed, at hashed immutable URLs; referenced by application path, so a missing file fails to compile, and images are sized from the file; no large media, since Clay keeps every version and the cache ignores `Range` | Decided 2026-10-29 |
91−| Private pages | Served by the host per request and never cached; non-owners go to the login page | Decided 2026-10-29 | Yes |
91+| Routing | A literal beats a parameter, which beats a catch-all; parameters bind to `load`'s sample by name; `@ta` and `@tas` raw, other auras as Hoon prints them | Decided 2026-10-29 |
92−| Cache | Eyre holds only the hashed assets, all public; the host serves every page; a desk's entries are cleared on suspend or uninstall, and all by `-jibb!clear` | Decided 2026-10-29 | Yes |
92+| Linking | Folder convention; the mark stores text; the host runs each desk's own compiler; modules cached by their own and their imports' hashes | Decided 2026-10-29 |
93−| Static files | Under `/ui/static/`, committed, at hashed immutable URLs; referenced by application path, so a missing file fails to compile, and images are sized from the file; no large media, since Clay keeps every version and the cache ignores `Range` | Decided 2026-10-29 | Yes |
93+| Access | Every page is private to the owner; public pages come in a later version | Decided 2026-10-29 |
94−| Routing | A literal beats a parameter, which beats a catch-all; parameters bind to `load`'s sample by name; `@ta` and `@tas` raw, other auras as Hoon prints them | Decided 2026-10-29 | Yes |
94+| Tests | `test-…` arms under `/ui/tests`, run by `-jibb!test`; the JavaScript side and differential tests under Node from jibb-dev | Decided 2026-10-29 |
95−| Linking | Folder convention; the mark stores text; the host runs each desk's own compiler; modules cached by their own and their imports' hashes | Decided 2026-10-29 | Yes |
95+| Editor support | Tree-sitter grammar | Decided |
96−| Access | Every page is private to the owner; public pages come in a later version | Decided 2026-10-29 | Yes |
96+| Formatter | One canonical layout | Decided |
97−| Tests | `test-…` arms under `/ui/tests`, run by `-jibb!test`; the JavaScript side and differential tests under Node from jibb-dev | Decided 2026-10-29 | Yes |
97+| Name | Jibb | Decided |
98−| Editor support | Tree-sitter grammar | Decided | Yes |
99−| Formatter | One canonical layout | Decided | Yes |
100−| Name | Jibb | Decided | Yes |
101−
102−## Settled milestone 2 questions
103−
104−Kept only in this copy. These were open questions in [open-questions.md](../open-questions.md) until @iko settled them; the rows above record each choice, and the questions keep their numbers there, so references to them stay valid. Questions 3 and 32 are still open there.
105−
106−On 2026-10-30, @iko adopted gate-free `eq` arguments and map and set keys, treating gates as opaque when distinguishing union cases, and rejecting a non-gate value that depends on itself even through a gate. The checker infers and generalizes the gate-free constraint. @iko also said jetted prelude functions may take gates.
107−
108−**1. Settled: how the prelude identifies jetted functions.** On 2026-10-30, @iko said the prelude functions have working Jibb implementations, and the compiler recognizes their shapes and uses the Hoon versions so jets can fire.
109−
110−**2. Settled: how the prelude keeps helpers private.** On 2026-10-30, @iko chose a separate internal prelude module imported by the prelude, without exposing the imported helpers.
111−
112−**4. Settled: a capital in a local `++`.** On 2026-10-30, @iko said it shares the enclosing `++`'s variable of that name if the enclosing `++` also uses it; otherwise the local `++` introduces and generalizes its own variable. For example, `++ inner |= y=A y` shares `A` with an enclosing gate whose sample is `x=A`, but generalizes its own `A` if the enclosing `++` does not use `A`. A different type uses a different capital. The Grammar and Decisions record this alongside the earlier aura rules.
113−
114−**5. Settled: cells of no items or one.** On 2026-10-30, @iko said a single-item cell is the value and `[]` is an error. The theme's `dark=[tones=[…]]`, a record of one field, must still check.
115−
116−**6. Settled: a change with no items.** On 2026-10-30, @iko said `m()` is an error. The parser still accepts it; the checker needs to reject it and add a golden case.
117−
118−**7. Settled: the doc's blocks that aren't whole modules.** On 2026-10-30, @iko agreed to check each in its intended context: the `cmd` and `sub` definitions as prelude source, the Core language tab's `update` inside the todo island, and the Grammar's imports example against fixture files.
119−
120−**8. Settled: tuples and records.** On 2026-10-30, @iko agreed that an unnamed position can unify with a faced position and take its face; two different explicit faces still conflict. The Grammar and Decisions record this rule.
121−
122−**9. Settled: values where `*` is expected.** On 2026-10-30, @iko said `*` is the noun type, not a type variable; generic positions use proper type variables. A value already known to be `@ud` can be passed where `*` is expected. The `each` and `table` signatures use `key=K`.
123−
124−**10. Settled: navigation commands.** On 2026-10-30, @iko chose separate declarations for application paths and unchecked cords, with `link-unsafe`, `image-unsafe` and `go-unsafe` for the unchecked forms. `image-unsafe` takes a sized URL record. Both navigation declarations produce `[%go url=@t]`; `go` converts the application path to a cord including the app's base path.
125−
126−**11. Settled: stores and derived gates.** On 2026-11-01, @iko said a store's local `+$ poke` is an ordinary action mold and the runtime envelope is `raw-poke`; a derived name clashes with an import face; and an island watching a request whose case has a separate `scry=` path has a type error. The todo API's request is renamed `todo-by-id` so it does not clash with `/- todo`. The checker must account for the fact that a store's kind is determined by the type of `main`.
127−
128−**12. Settled: how to print a union without a name.** On 2026-10-30, @iko said to print its cases separated by spaces, as `%approve %deny`. This is print-only, not Jibb syntax.
129−
130−**13. Settled: how to print type constraints.** On 2026-10-30, @iko chose `$-([A A] A) where A is an atom` for an atom constraint and `$-([A A] ?) where A contains no gates` for a gate-free constraint. Multiple clauses are comma-separated, as `where A is an atom, B contains no gates`.
131−
132−**14. Settled: how the prelude implements foundational operations.** On 2026-10-30, @iko chose private low-level primitives in the internal prelude module, with the public foundational gates implemented in Jibb on top of them.
133−
134−**15. Settled: unrestricted atoms and shared auras.** On 2026-10-30, @iko said `@` means any atom, independently at each occurrence, so Hoon `dime` and `pint` keep their bare-`@` fields. A specific atom such as `@ud` fits where `@` is expected; an `@` value needs a check to fit `@ud`. Shared atom types use one capital, with the atom constraint inferred from its body, as for `add` taking `[A A]` and returning `A`.
135−
136−**16. Settled: loobeans in union disjointness.** On 2026-10-30, @iko said `?` counts as its two atoms, `%.y` and `%.n`: it is disjoint from any cell and overlaps the constants 0 and 1.
137−
138−**17. Settled: empty cases in union disjointness.** On 2026-10-30, @iko said `!!` is disjoint from every case. A cell containing an empty position at any depth is itself empty and is also disjoint from every case.
139−
140−**18. Settled: the value gate `like`.** On 2026-10-31, @iko chose a gate `(like convert result)` that maps the product of an existing `(like A)` result with `convert=$-(A B)`, yielding `(like B)` while preserving its position and remaining input. An absent result stays absent. The `(like A)` mold remains available in the separate mold namespace. Hoon's wet `+like` instead builds a gate that constructs a result from an input noun; the chosen Jibb value gate is an adaptation of that behavior.
141−
142−**19. Settled: Hoon aura families and `step.hoon`.** On 2026-10-30, @iko chose `step.hoon` for Hoon 1c `step`, avoiding a clash with the Grammar example's `step`, and chose one-way widening across Hoon aura families: for example, `@ud` and `@ux` fit `@u`, and `@tD` fits `@t`. The reverse needs a check. The `step.hoon` group representation is not implemented yet.
143−
144−**20. Settled: the type of `clap`.** On 2026-10-30, @iko chose one shared value type for both units and the combining gate. If either unit is absent, `clap` returns the other; if both are present, it applies the gate to their values and wraps the result.
145−
146−**21. Settled: duplicate faces in imported Hoon records.** On 2026-10-30, @iko chose to reject an imported Hoon record with duplicate field names where its type is used. Hoon permits `[a=@ud a=@t]` and picks the first `a`; Jibb rejects it.
147−
148−**22. Settled: overlapping imported `$%` and `$?` cases.** On 2026-10-30, @iko confirmed that the general union disjointness rule rejects imported `$%` and `$?` cases that overlap as nouns where the type is used, as it does for `$^`. The importer rejects recognizable overlaps and fails closed when it cannot verify them.
149−
150−**23. Settled: converging explicit capitals.** On 2026-10-30, @iko chose that a body cannot force two separately written capitals to be equal. For `++ repeated |= x=(choice A A) x`, `++ f |= x=(choice A B) (repeated x)` is an error; use `A` in both positions when the type must be shared. This also applies across local captures and within generic mold applications.
151−
152−**24. Settled: how the internal prelude provides `raw-poke`.** On 2026-11-01, @iko chose to define `raw-poke` in the source-backed private internal prelude module and re-export it through the public prelude as an ordinary transparent type. Ordinary modules can construct and inspect its values, while derived API/store `poke` helpers return commands. This settles `raw-poke`; it does not decide the representation of `ask` or `qath`.
153−
154−**25. Settled: how the prelude provides `ask` and `qath`.** On 2026-10-31, @iko chose ordinary transparent types defined in the internal prelude and re-exported normally, as for `raw-poke`. Callers may construct and inspect their values.
155−
156−**26. Settled: the `step` example's `at` binder.** On 2026-10-31, @iko chose to rename the `describe` pattern binder to `sent-at`, keeping Hoon's `at` in the prelude and the no-shadowing rule.
157−
158−**27. Settled: duplicate fields in a Jibb-written record.** On 2026-10-31, @iko chose to reject duplicate field names, as for imported Hoon records.
159−
160−**28. Settled: arithmetic on loobeans.** On 2026-10-31, @iko chose to reject loobean operands for arithmetic. Comparison may still accept loobeans and returns `?`. The checker needs to retain this constraint through inference, generalization and instantiation before it exports `add` or `dec`.
161−
162−**29. Settled: printing the arithmetic atom constraint.** On 2026-10-31, @iko chose `where A is an atom other than ?` for a generic arithmetic type whose atom variable excludes loobeans.
163−
164−**30. Settled: a hole inferred as a generic variable.** On 2026-10-31, @iko said a hole resolved to an explicitly written type variable counts as inferred: in `++ id |= x=A ^- _ x`, the result hole is `A`. Named molds must determine their own holes without constraints from later uses; an unconstrained hole is an error.
165−
166−**31. Settled: uses of a value with a hole.** On 2026-10-31, @iko said a value definition must determine its own holes; another definition's use cannot fix an otherwise unresolved hole. For example, `++ id |= x=_ x` remains an error even if a later definition calls `id` with a cord.
167−
168−**33. Settled: watching a request with unknown provenance.** On 2026-10-31, @iko said an island may watch a request only if the checker proves it watchable at compile time. An unknown request, including one built or passed through a gate without sufficient evidence, is rejected rather than deferred to a runtime check.
169−
170−**34. Settled: constructors and equal noun literals.** On 2026-10-31, @iko said expressions with the same runtime representation count as equal, and cases that cannot be distinguished at runtime are rejected at compile time. Thus `|=%$` matches a case headed by `%$`, `%.y` or `~`: each is the noun 0. Cases with equal heads and overlapping payloads cannot coexist in a union.
171−
172−Review question 25, when to build `eq` and the gate-free constraint, is settled: @iko's commit 0858191 adds `eq` and infers the constraint.
173
98
174## Checked against the kernel
99## Checked against the kernel
175
100
docs/spec/grammar.md+10−9
@@ -91,7 +91,7 @@ Imports come first:
91/= card /ui/components/card :: a Jibb module
91/= card /ui/components/card :: a Jibb module
92```
92```
93
93
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.
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.
95
95
96## Modules
96## Modules
97
97
@@ -99,10 +99,10 @@ A file is a module: imports, then definitions.
99
99
100- `+$ name mold` defines a mold; `++ name expr` a value.
100- `+$ name mold` defines a mold; `++ name expr` a value.
101- Names may refer to each other in any order, and no name may shadow one already in scope, imports and the prelude included.
101- 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, `poke.todo` its command helper, and `todos.todo` a mold and a request.
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.
103- `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.
103- `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.
104- 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.
104- 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 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.
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.
106
106
107Names the host reads, by file:
107Names the host reads, by file:
108
108
@@ -130,8 +130,8 @@ A mold is only a type: never called on a noun, and with no default. Types are in
130- **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.
130- **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.
131- **Generic molds**: `+$ result |$ [V E]` with cases below; `|$` goes only right after a `+$`'s name.
131- **Generic molds**: `+$ result |$ [V E]` with cases below; `|$` goes only right after a `+$`'s name.
132- **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**: `!!`.
132- **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**: `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.
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**: `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`.
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`.
135- **Identity**: recursive molds go by name and module.
135- **Identity**: recursive molds go by name and module.
136
136
137`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.
137`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,13 +293,14 @@ knot = { lower | digit | "-" | "." | "~" | "_" } ;
293```jibb
293```jibb
294:: /ui/stores/cart.jibb
294:: /ui/stores/cart.jibb
295+$ state [items=(list @t) open=?]
295+$ state [items=(list @t) open=?]
296−+$ poke
296++$ cart-action
297 [%add item=@t]
297 [%add item=@t]
298 %toggle
298 %toggle
299++$ poke cart-action
299
300
300++ main (store init update)
301++ main (store init update)
301++ init ^- state [~ %.n]
302++ init ^- state [~ %.n]
302−++ update |= [a=poke s=state]
303+++ update |= [a=cart-action s=state]
303 ?- a
304 ?- a
304 [%add item] s(items=[item items.s])
305 [%add item] s(items=[item items.s])
305 %toggle s(open=(not open.s))
306 %toggle s(open=(not open.s))
@@ -325,8 +326,8 @@ knot = { lower | digit | "-" | "." | "~" | "_" } ;
325++ update |= [=msg m=model]
326++ update |= [=msg m=model]
326 ?- msg
327 ?- msg
327 [%noted t] [m(note=t) ~]
328 [%noted t] [m(note=t) ~]
328− %add [m(note="") ~[(poke.cart [%add note.m] |=%acked)]]
329+ %add [m(note="") ~[[%poke (cart-action.cart [%add note.m]) |=%acked]]]
329− %toggle [m ~[(poke.cart %toggle |=%acked)]]
330+ %toggle [m ~[[%poke (cart-action.cart %toggle) |=%acked]]]
330 [%got c] [m(cart=c) ~]
331 [%got c] [m(cart=c) ~]
331 [%acked err] [m ~]
332 [%acked err] [m ~]
332
333
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, `
73- **Messages** come from controls, command replies, facts, timers and `%url`. *Proposed*: an island handles them one at a time, in arrival order.
73- **Messages** come from controls, command replies, facts, timers and `%url`. *Proposed*: an island handles them one at a time, in arrival order.
74- **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.
74- **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.
75- **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.
75- **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**: 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.
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.
77
77
78| Control | Sends | When |
78| Control | Sends | When |
79| --- | --- | --- |
79| --- | --- | --- |
docs/spec/overview.md+7−9
@@ -141,7 +141,7 @@ Loads and renders run in Nock.
141
141
142```jibb
142```jibb
143+$ cmd |$ [M]
143+$ cmd |$ [M]
144− [%poke p=raw-poke reply=$-((unit @t) M)]
144+ [%poke p=poke reply=$-((unit @t) M)]
145 [%go url=@t]
145 [%go url=@t]
146 [%wait gap=@dr msg=M]
146 [%wait gap=@dr msg=M]
147 [%now reply=$-(@da M)]
147 [%now reply=$-(@da M)]
@@ -152,9 +152,7 @@ Loads and renders run in Nock.
152 [%url reply=$-(path M)]
152 [%url reply=$-(path M)]
153```
153```
154
154
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.
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.
158- 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`.
156- 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`.
159- 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.
157- 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.
160- 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.
158- 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.
@@ -165,7 +163,7 @@ Inputs send a message per `input` event, and one per IME composition, so validat
165
163
166- `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.
164- `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.
167- A crash in `update` drops the message, keeps the model and shows the standard notice.
165- A crash in `update` drops the message, keeps the model and shows the standard notice.
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.
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.
169- 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.
167- 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.
170- 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.
168- 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.
171
169
@@ -218,7 +216,7 @@ The theme, `++ theme` in `/ui/theme.jibb`, uses the prelude's `theme` mold, with
218 lang="en"
216 lang="en"
219 zone="UTC"
217 zone="UTC"
220 font=`%/static/fonts/inter.woff2
218 font=`%/static/fonts/inter.woff2
221− dark=`[tones=[normal="#eee" background="#111" accent="#4c9" danger="#f28b82" muted="#aaa"]]
219+ dark=[tones=[normal="#eee" background="#111" accent="#4c9" danger="#f28b82" muted="#aaa"]]
222```
220```
223
221
224Style attributes compile to atomic classes in one stylesheet built from the theme, so islands can't compute a missing class. `[%chars n]` and `[%fill n]` become inline styles.
222Style attributes compile to atomic classes in one stylesheet built from the theme, so islands can't compute a missing class. `[%chars n]` and `[%fill n]` become inline styles.
@@ -282,7 +280,7 @@ The host is one Gall agent on the `%jibb` desk, serving every Jibb desk, so app
282
280
283### Agent APIs
281### Agent APIs
284
282
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.
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.
286
284
287```jibb
285```jibb
288:: /ui/api/todo.jibb
286:: /ui/api/todo.jibb
@@ -473,8 +471,8 @@ A `page`: each request scries `%blog` and renders in Nock.
473 ?- (gth (lent (tuba (trip t))) 80)
471 ?- (gth (lent (tuba (trip t))) 80)
474 %.y [m(draft=t error=`"Too long") ~]
472 %.y [m(draft=t error=`"Too long") ~]
475 %.n [m(draft=t error=~) ~]
473 %.n [m(draft=t error=~) ~]
476− %submit [m(draft="") ~[(poke.todo [%add draft.m] |=%acked)]]
474+ %submit [m(draft="") ~[[%poke (todo-action.todo [%add draft.m]) |=%acked]]]
477− [%toggled id] [m ~[(poke.todo [%toggle id] |=%acked)]]
475+ [%toggled id] [m ~[[%poke (todo-action.todo [%toggle id]) |=%acked]]]
478 [%got ts] [m(todos=ts) ~]
476 [%got ts] [m(todos=ts) ~]
479 [%acked err] [m(error=err) ~]
477 [%acked err] [m(error=err) ~]
480
478
docs/status.md+13−62
@@ -1,6 +1,6 @@
1# Status
1# Status
2
2
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.
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.
4
4
5| # | Milestone | Status |
5| # | Milestone | Status |
6| --- | --- | --- |
6| --- | --- | --- |
@@ -27,23 +27,13 @@ The internal prelude also defines `qath` as a transparent recursive knot sequenc
27
27
28The checker also recognizes a limited source-proven generic recursive tree in an import-free defining module. Its nominal identity retains the defining path, mold name and type arguments, including across supported imports and aliases. With a known expected type it can construct supported tagged cases by checking one source-proven layer at a time. Flat matches with explicit tags or nonbinding catch-alls also work for these source-proven trees, as does a missing-case diagnostic for a supported single-arm match. At most 128 arms are screened per attempt; whole-case binders and nested patterns remain unsupported. Broader pattern matching, general structural fits and gate-free proof remain unsupported; this is not yet the prelude's `element` implementation or island checking. The source index uses fixed-shape checks during mold collection. Each construction or supported pattern attempt has 256 unfolding steps and at most 4,096 face and substitution visits per scan; pattern subject recognition and view validation can each scan separately. Parsing, other inference and retries remain outside those limits. A single startup-inclusive comparison of 1,000 ordinary gates produced identical reports and used 29.12 seconds of user CPU before the shared-resolver refactor and 28.55 seconds after it, with other work running; it is not a general performance bound.
28The checker also recognizes a limited source-proven generic recursive tree in an import-free defining module. Its nominal identity retains the defining path, mold name and type arguments, including across supported imports and aliases. With a known expected type it can construct supported tagged cases by checking one source-proven layer at a time. Flat matches with explicit tags or nonbinding catch-alls also work for these source-proven trees, as does a missing-case diagnostic for a supported single-arm match. At most 128 arms are screened per attempt; whole-case binders and nested patterns remain unsupported. Broader pattern matching, general structural fits and gate-free proof remain unsupported; this is not yet the prelude's `element` implementation or island checking. The source index uses fixed-shape checks during mold collection. Each construction or supported pattern attempt has 256 unfolding steps and at most 4,096 face and substitution visits per scan; pattern subject recognition and view validation can each scan separately. Parsing, other inference and retries remain outside those limits. A single startup-inclusive comparison of 1,000 ordinary gates produced identical reports and used 29.12 seconds of user CPU before the shared-resolver refactor and 28.55 seconds after it, with other work running; it is not a general performance bound.
29
29
30−A bounded local source proof recognizes a narrow class of generic-alias union cases with different literal heads, then applies the ordinary mold checks. Nested or qualified aliases and several open states remain unsupported, including a valid alias used during the deferred transaction; the partial report states that the mold itself has not been checked. `tools/type-union-source-test` exercises the source and state bounds and failure paths under eval and on the ship. A separate bounded witness now reports proven collisions between supported literal-headed aliases, with both original case sites; unknown payload intersections still decline. The detailed full-module result now carries the first failed mold’s source-bound overlap evidence, including through ordinary Jibb imports; the legacy text result renders both case excerpts. Specialized API and prelude paths remain limited. The shared guards pass under eval and on the ship.
30+A bounded local source proof recognizes a narrow class of generic-alias union cases with different literal heads, then applies the ordinary mold checks. Nested or qualified aliases and several open states remain unsupported, including a valid alias used during the deferred transaction; the partial report states that the mold itself has not been checked. `tools/type-union-source-test` exercises the source and state bounds and failure paths under eval and on the ship. A separate bounded witness now reports proven collisions between supported literal-headed aliases, with both original case sites; unknown payload intersections still decline. Full module failure remains generic, and the ship replay for this witness is pending.
31
31
32The 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.
32The checker can experimentally discharge a narrowly scoped direct-constructor constraint while resolving an import-free library without a prepared prelude. It preserves independent generalized schemes and publishes only after all source molds, values, and recorded constraints close. API/store paths, `main`, imports, prepared preludes, recursive groups, open constraints, projection actions, and `%grec` in the constraint graph remain unsupported by this route. The fallback also declines source shapes outside its bounded direct-call screen. It does not yet typecheck the unchanged todo island or establish watchability.
33
33
34−A prepared-prelude partial report can recover a narrow import-free, non-main ordinary library initializer by deferring source-owned literals in a direct tuple until a later exact result cast. The prepared interface and declared-name inventories must agree exactly. API/store paths, `main` and imports remain excluded, and the ordinary full-module resolver does not publish the recovered interface. Wrong field types, unrelated tags and mold collisions fail closed; a no-final-cast control remains unchecked. `tools/type-deferred-prepared-test` checks the exact recovered types and unchanged `partial inference; module not checked` disclaimer under eval and on the ship. List-literal deferral and import-aware recovery remain unsupported.
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.
35
35
36−Closed cell context can now flow through a bounded loobean branch while preserving the inferred value faces and original failed-inference behavior. Open or structurally uncertain substitutions and nested retry shapes remain unsupported. This does not by itself provide the remaining cross-definition context or complete island-kind and watchability checks needed by the unchanged todo island.
37−
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.
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.
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.
47
37
48Known 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.
38Known 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.
49
39
@@ -51,34 +41,18 @@ A separate source-backed analysis can prove one named mold gate-free, report a d
51
41
52The 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.
42The 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.
53
43
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−Keyed programs no longer skip ordinary component inference: an annotated initializer that checks normally is accepted, with recovery reserved for definitions that still need it. The todo fixture checks a call-bodied annotated initializer outside the tuple recovery shape through detailed and legacy inference, including on the ship.
61−
62−Imported Hoon `(unit T)` now converts to the validated canonical prelude `unit` when that template is supplied, instead of remaining an incompatible collection. Conversion recurses through imported unions and collections, and API path/diff/poke analysis uses the same prepared reader. The fixtures prove identity, `fall`, `need`, `(unit @t)` casts, union- and list-nested matching, canonical unit-typed API full/diff marks and a canonical direct-poke export while preserving the no-prelude compatibility report and wrong-collection rejection. Nested public re-export labels also remain `ask`, `qath` and `raw-poke` instead of leaking their private `.internal` suffixes into printed types.
63−
64−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; 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.
65−
66−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.
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.
67
45
68For 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.
46For 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.
69
47
70A 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.
48A 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.
71
49
72−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.
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.
73
51
74The 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.
52The 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.
75
53
76The 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.
54The 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.
77
55
78−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.
79−
80−The prelude now also writes `eq` and `mate`. A dedicated constrained variable retains `A contains no gates` through nested unification, canonicalization, instantiation and imports; atom constraints remain stronger. Direct and nested gate arguments fail, while open cell, face, collection and union members receive the constraint with bounded traversal and substitution updates. `set`, `map`, `mop`, `jar` and `jug` constrain only their key positions, leaving map values independent. The shared solver guards cover existing and later gate injection, exact traversal budgets and conservative budget fallback; backend equality and crash behavior remain unverified.
81−
82The 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.
56The 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.
83
57
84The 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.
58The 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.
@@ -87,7 +61,7 @@ The prelude has Jibb-written curried `lead` and `late` pair constructors, inferr
87
61
88The 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.
62The 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.
89
63
90−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.
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.
91
65
92The 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.
66The 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.
93
67
@@ -95,8 +69,6 @@ An eval and ship fixture now reports partial inference for the unchanged todo is
95
69
96The prelude now writes `lth`, `gte` and `lte` in Jibb using `gth` and `not`. Supported generic and concrete calls infer, including loobeans; mismatched explicit auras fail. Execution, jet recognition and complete import checking remain unfinished.
70The prelude now writes `lth`, `gte` and `lte` in Jibb using `gth` and `not`. Supported generic and concrete calls infer, including loobeans; mismatched explicit auras fail. Execution, jet recognition and complete import checking remain unfinished.
97
71
98−The prelude also writes `trip` and `tuba` over private primitives, with inferred cord, tape and UTF-32 list types matching the target ship's Hoon 135 definitions. Their composition with `lent` and invalid argument controls pass under eval and on the ship; primitive lowering, execution and jet recognition remain unfinished. In the unchanged todo report, `update` now reaches its remaining branch-context limitation instead of failing on missing text names.
99−
100The Hoon reader can prove overlaps among supported original `$?` source cases, including nested cells and unions with more than two cases, and report them at a Jibb use site. It evaluates each case independently and compares runtime noun values. Other overlaps, Hoon case locations and mark-reader overlap diagnostics remain unfinished. The source screen allows at most 128 cases and 4,096 source noun nodes; dependency checking and pairwise witness analysis each have a separate 4,096-node budget. These budgets do not bound chapter lookup, Hoon evaluation or graph walks.
72The Hoon reader can prove overlaps among supported original `$?` source cases, including nested cells and unions with more than two cases, and report them at a Jibb use site. It evaluates each case independently and compares runtime noun values. Other overlaps, Hoon case locations and mark-reader overlap diagnostics remain unfinished. The source screen allows at most 128 cases and 4,096 source noun nodes; dependency checking and pairwise witness analysis each have a separate 4,096-node budget. These budgets do not bound chapter lookup, Hoon evaluation or graph walks.
101
73
102Restricted-number promotion now skips an environment scan when a definition has no written capitals. In a single startup-inclusive pair on 2,000 independent gates, output was identical and user CPU fell from 71.67 to 38.26 seconds; wall time was 72.80 versus 51.66 seconds with other checks running. This is a partial-inference measurement, not a complete checker or a bound on dependent modules.
74Restricted-number promotion now skips an environment scan when a definition has no written capitals. In a single startup-inclusive pair on 2,000 independent gates, output was identical and user CPU fell from 71.67 to 38.26 seconds; wall time was 72.80 versus 51.66 seconds with other checks running. This is a partial-inference measurement, not a complete checker or a bound on dependent modules.
@@ -117,11 +89,11 @@ What the plan asks for, and where it is:
117
89
118Besides the plan's list:
90Besides the plan's list:
119
91
120−- 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.
92+- 658 golden cases: 438 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.
121−- The 660-case corpus passed under `urbit eval` in 108.0 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 111.2 s and the ship's `-test` run took 316.7 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.
93+- The 658-case corpus passed under `urbit eval` in 106.8 s while other checks were running. The fake ship passed all 702 tests, including the source-overlap, structural-overlap, generic-union source and alias-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 107.6 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.
122- `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.
94- `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.
123- 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.
95- 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.
124−- Speed: starting `urbit eval` and building the library takes about 27 s with the dev tools' `!:`, and 24 s without it (`tools/hoon --no-debug`). 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).
96+- 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).
125
97
126### History
98### History
127
99
@@ -229,26 +201,14 @@ Besides the plan's list:
229| 22f3788 | 2026-10-31 | Check empty molds and propagate closed cell context into branches |
201| 22f3788 | 2026-10-31 | Check empty molds and propagate closed cell context into branches |
230| 341bcb4 | 2026-10-31 | Keep deferred fits stable under later substitutions |
202| 341bcb4 | 2026-10-31 | Keep deferred fits stable under later substitutions |
231| b93a94b | 2026-10-31 | Prove local generic-alias union tags and add successor |
203| b93a94b | 2026-10-31 | Prove local generic-alias union tags and add successor |
232−| 2826c93 | 2026-10-31 | Report generic-alias overlaps and retain deferred branch contexts |
204+| This change | 2026-10-31 | Report generic-alias overlaps and retain deferred branch contexts |
233−| b5cdc80 | 2026-10-31 | Preserve full-module overlap source evidence |
234−| ab6fdc1 | 2026-10-31 | Add source-backed text conversion wrappers |
235−| aa277c9 | 2026-10-31 | Recover prepared tuple initializers in partial reports |
236−| b4703e7 | 2026-11-01 | Check narrow closed subscription-free program mains |
237−| 26bf7a7 | 2026-11-01 | Recover narrow direct-program initializer contexts |
238−| 642d2c0 | 2026-11-01 | Prove direct request-value watchability for program subscriptions |
239−| 2e4d582 | 2026-11-01 | Add the source-backed UI, program and page prelude slice |
240−| a163965 | 2026-11-01 | Recover direct-program update result contexts |
241−| 46748b0 | 2026-11-01 | Check the unchanged todo island through component recovery |
242−| 1e17d5f | 2026-11-01 | Check static and direct data-page mains |
243−| 0517053 | 2026-11-01 | Add the theme mold and require explicit unit syntax |
244−| This change | 2026-11-01 | Check the unchanged cart store and basket |
245
205
246## Checking it
206## Checking it
247
207
248On a machine set up as [development.md](development.md) says:
208On a machine set up as [development.md](development.md) says:
249
209
250```
210```
251−tools/golden # 660 cases under urbit eval
211+tools/golden # 658 cases under urbit eval
252tools/importer-test # the Hoon importer fixture projection
212tools/importer-test # the Hoon importer fixture projection
253tools/type-import-default-test # default-wrapped source proof golden
213tools/type-import-default-test # default-wrapped source proof golden
254tools/type-import-test # the importer/checker bridge fixture
214tools/type-import-test # the importer/checker bridge fixture
@@ -256,7 +216,6 @@ tools/type-import-overlap-test # source-aware Hoon overlap and provenance fix
256tools/type-import-structural-test # structural overlap and multi-case source fixture
216tools/type-import-structural-test # structural overlap and multi-case source fixture
257tools/type-union-source-test # local generic-alias union guards
217tools/type-union-source-test # local generic-alias union guards
258tools/type-union-alias-overlap-test # local generic-alias overlap diagnostics
218tools/type-union-alias-overlap-test # local generic-alias overlap diagnostics
259−tools/type-full-overlap-test # full-module overlap evidence
260tools/type-tlon-test # the real Tlon reader/checker fixture
219tools/type-tlon-test # the real Tlon reader/checker fixture
261tools/type-mark-test # the mark/checker bridge fixture
220tools/type-mark-test # the mark/checker bridge fixture
262tools/type-poke-test # the source-backed poke/API fixture
221tools/type-poke-test # the source-backed poke/API fixture
@@ -271,27 +230,19 @@ tools/type-generic-pattern-test # source-proven recursive pattern guards
271tools/type-deferred-test # source-owned deferred inference guards
230tools/type-deferred-test # source-owned deferred inference guards
272tools/type-deferred-resolver-test # resolver consistency and failure guards
231tools/type-deferred-resolver-test # resolver consistency and failure guards
273tools/type-deferred-context-test # deferred source-order and branch guards
232tools/type-deferred-context-test # deferred source-order and branch guards
274−tools/type-deferred-prepared-test # prepared initializer reports and failure guards
275tools/type-empty-test # empty molds and coverage guards
233tools/type-empty-test # empty molds and coverage guards
276tools/type-cell-branch-test # branch context and rollback guards
234tools/type-cell-branch-test # branch context and rollback guards
277tools/type-positional-face-guards-test # positional sample face guards
235tools/type-positional-face-guards-test # positional sample face guards
278tools/type-qath-guards-test # qath source and unfolding guards
236tools/type-qath-guards-test # qath source and unfolding guards
279tools/type-ask-guards-test # ask source and bootstrap guards
237tools/type-ask-guards-test # ask source and bootstrap guards
280tools/type-proj-guards-test # projection evidence and scope guards
238tools/type-proj-guards-test # projection evidence and scope guards
281−tools/type-buttons-test # documented buttons schemes and exact pending-tag error
282−tools/type-theme-test # byte-identical real theme, exact type and rejection guards
283tools/type-module-scope-test # module and prelude scope fixture
239tools/type-module-scope-test # module and prelude scope fixture
284−tools/type-program-main-test # closed program-main interface and rejection guards
285−tools/type-program-init-test # transactional direct-program initializer context guards
286−tools/type-program-update-test # transactional direct-program update context guards
287−tools/type-program-watch-test # direct request-value watchability guards
288−tools/type-todo-full-test # byte-identical full todo and rejection guards
289tools/hoon check-spans-test # prints <<>> when the span checker works
240tools/hoon check-spans-test # prints <<>> when the span checker works
290tools/testdata/selftest # the tools themselves
241tools/testdata/selftest # the tools themselves
291tools/doc-blocks docs/spec # the doc's examples are golden cases
242tools/doc-blocks docs/spec # the doc's examples are golden cases
292tools/ship start
243tools/ship start
293tools/ship gen-tests --check # tests/lib/jibb.hoon is up to date
244tools/ship gen-tests --check # tests/lib/jibb.hoon is up to date
294−tools/ship test # the same 660 cases as -test arms on the ship
245+tools/ship test # the same 658 cases as -test arms on the ship
295tools/testdata/ship-selftest
246tools/testdata/ship-selftest
296tools/testdata/clay-fixtures-selftest # scratch fixture cleanup without a ship
247tools/testdata/clay-fixtures-selftest # scratch fixture cleanup without a ship
297tools/ship check-commit # |commit stores .jibb files
248tools/ship check-commit # |commit stores .jibb files
flake.lockdeleted−41
@@ -1,41 +0,0 @@
1−{
2− "nodes": {
3− "nixpkgs": {
4− "locked": {
5− "lastModified": 1793540411,
6− "narHash": "sha256-us2GRWGXbOQpN1blyJGvmdx+g4bv9GoFYq5iiOHRiZ8=",
7− "rev": "0bb2eedc20e4739f29e8045034f2828ad7054f8f",
8− "type": "tarball",
9− "url": "https://releases.nixos.org/nixos/unstable/nixos-26.11pre1106360.0bb2eedc20e4/nixexprs.tar.xz"
10− },
11− "original": {
12− "type": "tarball",
13− "url": "https://channels.nixos.org/nixos-unstable/nixexprs.tar.xz"
14− }
15− },
16− "root": {
17− "inputs": {
18− "nixpkgs": "nixpkgs",
19− "urbit-tools": "urbit-tools"
20− }
21− },
22− "urbit-tools": {
23− "flake": false,
24− "locked": {
25− "lastModified": 1750452841,
26− "narHash": "sha256-2IoU8tGR92g8SaoDZdMxbzh2VLr/63XUCbrPS3nestg=",
27− "ref": "refs/heads/master",
28− "rev": "c9c91ce142cfe85edbed320138f21c7213aceaab",
29− "revCount": 19,
30− "type": "git",
31− "url": "https://github.com/urbit/tools"
32− },
33− "original": {
34− "type": "git",
35− "url": "https://github.com/urbit/tools"
36− }
37− }
38− },
39− "root": "root",
40− "version": 7
41−}
flake.nixdeleted−192
@@ -1,192 +0,0 @@
1−{
2− description = "Jibb, a UI language for Urbit: its desks, and the repo's checks";
3−
4− inputs = {
5− # A channel tarball rather than github:NixOS/nixpkgs, so the flake
6− # also fetches where GitHub's archive downloads are blocked, as in a
7− # Claude cloud container. flake.lock pins the exact release.
8− # nixos-unstable has vere 4.6, which the tools were written against.
9− nixpkgs.url = "https://channels.nixos.org/nixos-unstable/nixexprs.tar.xz";
10− # click, which tools/ship formats its requests to the ship with.
11− urbit-tools = {
12− url = "git+https://github.com/urbit/tools";
13− flake = false;
14− };
15− };
16−
17− outputs = { self, nixpkgs, urbit-tools }:
18− let
19− # The platforms nixpkgs builds vere for.
20− systems = [ "x86_64-linux" "aarch64-linux" "aarch64-darwin" ];
21− forSystems = f: nixpkgs.lib.genAttrs systems
22− (system: f nixpkgs.legacyPackages.${system});
23− inherit (nixpkgs) lib;
24− fs = lib.fileset;
25−
26− # What the desks are assembled from, and the tools that assemble
27− # them and compile their libraries.
28− deskFiles = fs.unions [
29− ./jibb
30− ./jibb-dev
31− ./my-app
32− ./vendor
33− ./tests
34− ./tools/ship
35− ./tools/golden_case.py
36− ./tools/hoon
37− ./tools/urbit_eval.py
38− ./tools/noun.py
39− ];
40− # What the checks read: the desks' files, the tools and the doc's
41− # tabs, but not the other docs, so editing those reruns nothing.
42− checkFiles = fs.unions [ deskFiles ./tools ./docs/spec ];
43− source = fileset: fs.toSource { root = ./.; inherit fileset; };
44−
45− perSystem = pkgs:
46− let
47− inherit (pkgs) python3 urbit;
48− isLinux = pkgs.stdenv.hostPlatform.isLinux;
49−
50− click = pkgs.stdenvNoCC.mkDerivation {
51− pname = "click";
52− version = "0-unstable-${builtins.substring 0 8 urbit-tools.lastModifiedDate}";
53− src = urbit-tools;
54− nativeBuildInputs = [ pkgs.makeWrapper ];
55− buildInputs = [ pkgs.bash ];
56− installPhase = ''
57− runHook preInstall
58− # click runs click-format from its own folder.
59− install -Dm755 -t $out/libexec/click \
60− pkg/click/click pkg/click/click-format
61− makeWrapper $out/libexec/click/click $out/bin/click \
62− --prefix PATH : ${lib.makeBinPath [ pkgs.coreutils pkgs.gnused ]} \
63− --prefix PATH : ${pkgs.netcat}/bin
64− runHook postInstall
65− '';
66− meta = {
67− description = "Thin client for a running Urbit ship's conn.sock";
68− homepage = "https://github.com/urbit/tools";
69− license = lib.licenses.mit;
70− mainProgram = "click";
71− };
72− };
73−
74− # The brass pill from the urbit/urbit commit vendor/ is copied
75− # from (vendor/SOURCES.txt). GitHub serves it from Git LFS.
76− pill = pkgs.fetchurl {
77− name = "brass.pill";
78− url = "https://media.githubusercontent.com/media/urbit/urbit/50c7f5239610fc72263df7aa99b4d171cfe9d408/bin/brass.pill";
79− hash = "sha256-tLq9FOnxrL20IbPDHCFe5jetZpG344K5nG/YmR5iNwg=";
80− };
81−
82− # A freshly booted fake ~zod: the pier itself. Booting takes
83− # about half a minute; the ship checks start a copy of it.
84− fakezod = pkgs.runCommand "fakezod" {
85− nativeBuildInputs = [ urbit ];
86− } ''
87− urbit -F zod -B ${pill} -t -x -c zod
88− test -d zod/.urb/log
89− mv zod $out
90− '';
91−
92− # The desks, as tools/ship assembles them for the ship:
93− # $out/my-app, $out/jibb and $out/jibb-dev, the test desk. The
94− # check phase compiles the two libraries under urbit eval.
95− desks = pkgs.stdenvNoCC.mkDerivation {
96− # No version in the name, so a commit that changes no desk
97− # file reuses the last build.
98− name = "jibb-desks";
99− src = source deskFiles;
100− nativeBuildInputs = [ python3 ];
101− nativeCheckInputs = [ urbit ];
102− dontConfigure = true;
103− buildPhase = ''
104− runHook preBuild
105− patchShebangs tools > /dev/null
106− tools/ship assemble --out desks
107− runHook postBuild
108− '';
109− doCheck = true;
110− checkPhase = ''
111− runHook preCheck
112− for lib in jibb jibb-import; do
113− echo "compiling $lib.hoon"
114− tools/hoon --lib desks/jibb-dev/lib/$lib.hoon '~'
115− done
116− runHook postCheck
117− '';
118− installPhase = ''
119− runHook preInstall
120− mv desks $out
121− runHook postInstall
122− '';
123− # The files are the desks' as they are: nothing to patch.
124− dontFixup = true;
125− meta = {
126− description = "The Jibb desks: my-app, jibb and jibb-dev";
127− platforms = systems;
128− };
129− };
130−
131− # A check: tools/check run on the repo with the given arguments.
132− check = name: args: extra: pkgs.stdenvNoCC.mkDerivation ({
133− name = "jibb-check-${name}";
134− src = source checkFiles;
135− nativeBuildInputs = [ python3 urbit ];
136− dontConfigure = true;
137− dontInstall = true;
138− dontFixup = true;
139− buildPhase = ''
140− runHook preBuild
141− patchShebangs tools > /dev/null
142− mkdir $out
143− tools/check ${args} --logs $out
144− runHook postBuild
145− '';
146− } // extra);
147−
148− # Every check that needs only urbit and Python, at once.
149− evalChecks = check "eval" "--group eval -j $NIX_BUILD_CORES" { };
150−
151− # The checks that need a ship, on a writable copy of fakezod.
152− shipChecks = check "ship" "--group ship" {
153− preBuild = ''
154− cp -r ${fakezod} $TMPDIR/zod
155− chmod -R u+w $TMPDIR/zod
156− export JIBB_PIER=$TMPDIR/zod
157− export JIBB_CLICK=${lib.getExe click}
158− '';
159− # A failed run shows the end of the ship's log too.
160− failureHook = ''
161− echo "the end of the ship's log, $TMPDIR/zod.log:"
162− tail -n 100 $TMPDIR/zod.log || true
163− '';
164− };
165− in
166− {
167− packages = {
168− inherit desks click;
169− default = desks;
170− } // lib.optionalAttrs isLinux { inherit fakezod; };
171−
172− checks = {
173− inherit desks;
174− eval = evalChecks;
175− } // lib.optionalAttrs isLinux { ship = shipChecks; };
176−
177− devShells.default = pkgs.mkShell {
178− packages = [ python3 urbit click ];
179− # tools/ship looks for click here; the pier stays
180− # /root/urbit/zod unless $JIBB_PIER says otherwise.
181− JIBB_CLICK = lib.getExe click;
182− };
183− };
184−
185− all = forSystems perSystem;
186− in
187− {
188− packages = lib.mapAttrs (_: s: s.packages) all;
189− checks = lib.mapAttrs (_: s: s.checks) all;
190− devShells = lib.mapAttrs (_: s: s.devShells) all;
191− };
192−}
jibb-dev/lib/jibb.hoon+249−2720
@@ -774,38 +774,39 @@
774:: (face 2:11 items
774:: (face 2:11 items
775:: (apply 2:17 list (aura 2:23 @t)))
775:: (apply 2:17 list (aura 2:23 @t)))
776:: (face 2:27 open (flag 2:32))))
776:: (face 2:27 open (flag 2:32))))
777−:: (mold 3:1 poke
777+:: (mold 3:1 cart-action
778:: (union 4:3
778:: (union 4:3
779:: (cell 4:3
779:: (cell 4:3
780:: (const 4:4 %add)
780:: (const 4:4 %add)
781:: (face 4:9 item (aura 4:14 @t)))
781:: (face 4:9 item (aura 4:14 @t)))
782:: (const 5:3 %toggle)))
782:: (const 5:3 %toggle)))
783+:: (mold 6:1 poke (ref 6:9 cart-action))
783−:: (value 7:1 main
784+:: (value 8:1 main
784−:: (group 7:9
785+:: (group 8:9
785−:: (call 7:10 (wing 7:10 store) (wing 7:16 init) (wing 7:21 update))))
786+:: (call 8:10 (wing 8:10 store) (wing 8:16 init) (wing 8:21 update))))
786−:: (value 8:1 init
787+:: (value 9:1 init
787−:: (cast 8:9
788+:: (cast 9:9
788−:: (ref 8:12 state)
789+:: (ref 9:12 state)
789−:: (tuple 8:18 (lit 8:19 ~) (lit 8:21 %.n))))
790+:: (tuple 9:18 (lit 9:19 ~) (lit 9:21 %.n))))
790−:: (value 9:1 update
791+:: (value 10:1 update
791−:: (gate 9:11
792+:: (gate 10:11
792−:: (cell 9:14
793+:: (cell 10:14
793−:: (face 9:15 a (ref 9:17 poke))
794+:: (face 10:15 a (ref 10:17 cart-action))
794−:: (face 9:22 s (ref 9:24 state)))
795+:: (face 10:29 s (ref 10:31 state)))
795−:: (body 10:3
796+:: (body 11:3
796−:: (branch 10:3
797+:: (branch 11:3
797−:: (wing 10:6 a)
798+:: (wing 11: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)))))
803:: (arm 12:5
799:: (arm 12:5
804−:: (lit 12:5 %toggle)
800+:: (cell 12:5 (lit 12:6 %add) (bind 12:11 item))
805:: (change 12:18 s
801:: (change 12:18 s
806−:: (edit 12:20 open
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
807−:: (group 12:25
808+:: (group 13:25
808−:: (call 12:26 (wing 12:26 not) (wing 12:30 open.s)))))))))))
809+:: (call 13:26 (wing 13:26 not) (wing 13:30 open.s)))))))))))
809::
810::
810:: 4.3 Errors (+show-error): "<file>:<line>:<col>: <message>", then the
811:: 4.3 Errors (+show-error): "<file>:<line>:<col>: <message>", then the
811:: source line, then a caret under the column (col - 1 spaces, then ^).
812:: source line, then a caret under the column (col - 1 spaces, then ^).
@@ -1633,14 +1634,9 @@
1633::
1634::
1634:: +bad-char: the error for a character that no text may hold (2.2)
1635:: +bad-char: the error for a character that no text may hold (2.2)
1635::
1636::
1636−:: The line feed ends a line and is no such character, so an escape
1637−:: cut off by the end of its line gets the same error as one cut off
1638−:: by the end of the text.
1639−::
1640++ bad-char
1637++ bad-char
1641 |= c=@
1638 |= c=@
1642 ^- (unit tape)
1639 ^- (unit tape)
1643− ?: =(10 c) ~
1644 ?: =(9 c) `"a tab: Jibb uses spaces only"
1640 ?: =(9 c) `"a tab: Jibb uses spaces only"
1645 ?: =(13 c) `"a carriage return: Jibb lines end with a line feed alone"
1641 ?: =(13 c) `"a carriage return: Jibb lines end with a line feed alone"
1646 ?: |((lth c 32) =(127 c)) `"a control character"
1642 ?: |((lth c 32) =(127 c)) `"a control character"
@@ -4662,8 +4658,7 @@
4662::
4658::
4663+$ itype
4659+$ itype
4664 $~ [%var 0]
4660 $~ [%var 0]
4665− $% [%var id=@ud]
4661+ $% [%var id=@ud]
4666− [%fvar id=@ud]
4667 [%avar id=@ud]
4662 [%avar id=@ud]
4668 [%rvar id=@ud]
4663 [%rvar id=@ud]
4669 [%nvar id=@ud]
4664 [%nvar id=@ud]
@@ -4686,7 +4681,7 @@
4686 ==
4681 ==
4687+$ ibinding [id=@ud val=itype]
4682+$ ibinding [id=@ud val=itype]
4688+$ isub (list ibinding)
4683+$ isub (list ibinding)
4689−+$ ipending [id=@ud literal=lit at=span]
4684++$ ipending [id=@ud literal=lit]
4690::
4685::
4691++ itype-lookup
4686++ itype-lookup
4692 |= [n=@ud sub=isub]
4687 |= [n=@ud sub=isub]
@@ -4699,35 +4694,35 @@
4699 |= [t=itype sub=isub]
4694 |= [t=itype sub=isub]
4700 ^- itype
4695 ^- itype
4701 ?+ -.t t
4696 ?+ -.t t
4702− ?(%var %fvar)
4697+ %var
4703 =/ found=(unit itype) (itype-lookup id.t sub)
4698 =/ found=(unit itype) (itype-lookup id.t sub)
4704 ?~ found t
4699 ?~ found t
4705− ?: &(|(?=(%fvar -.u.found) ?=(%rvar -.u.found) ?=(%rnvar -.u.found)) =(id.t +.u.found)) u.found
4700+ ?: &(|(?=(%rvar -.u.found) ?=(%rnvar -.u.found)) =(id.t +.u.found)) u.found
4706 $(t u.found)
4701 $(t u.found)
4707 %avar
4702 %avar
4708 =/ found=(unit itype) (itype-lookup id.t sub)
4703 =/ found=(unit itype) (itype-lookup id.t sub)
4709 ?~ found t
4704 ?~ found t
4710− ?: &(|(?=(%fvar -.u.found) ?=(%rvar -.u.found) ?=(%rnvar -.u.found)) =(id.t +.u.found)) u.found
4705+ ?: &(|(?=(%rvar -.u.found) ?=(%rnvar -.u.found)) =(id.t +.u.found)) u.found
4711 $(t u.found)
4706 $(t u.found)
4712 %rvar
4707 %rvar
4713 =/ found=(unit itype) (itype-lookup id.t sub)
4708 =/ found=(unit itype) (itype-lookup id.t sub)
4714 ?~ found t
4709 ?~ found t
4715− ?: &(|(?=(%fvar -.u.found) ?=(%rvar -.u.found) ?=(%rnvar -.u.found)) =(id.t +.u.found)) u.found
4710+ ?: &(|(?=(%rvar -.u.found) ?=(%rnvar -.u.found)) =(id.t +.u.found)) u.found
4716 $(t u.found)
4711 $(t u.found)
4717 %nvar
4712 %nvar
4718 =/ found=(unit itype) (itype-lookup id.t sub)
4713 =/ found=(unit itype) (itype-lookup id.t sub)
4719 ?~ found t
4714 ?~ found t
4720− ?: &(|(?=(%fvar -.u.found) ?=(%rvar -.u.found) ?=(%rnvar -.u.found)) =(id.t +.u.found)) u.found
4715+ ?: &(|(?=(%rvar -.u.found) ?=(%rnvar -.u.found)) =(id.t +.u.found)) u.found
4721 $(t u.found)
4716 $(t u.found)
4722 %rnvar
4717 %rnvar
4723 =/ found=(unit itype) (itype-lookup id.t sub)
4718 =/ found=(unit itype) (itype-lookup id.t sub)
4724 ?~ found t
4719 ?~ found t
4725− ?: &(|(?=(%fvar -.u.found) ?=(%rvar -.u.found) ?=(%rnvar -.u.found)) =(id.t +.u.found)) u.found
4720+ ?: &(|(?=(%rvar -.u.found) ?=(%rnvar -.u.found)) =(id.t +.u.found)) u.found
4726 $(t u.found)
4721 $(t u.found)
4727 %tag
4722 %tag
4728 =/ found=(unit itype) (itype-lookup id.t sub)
4723 =/ found=(unit itype) (itype-lookup id.t sub)
4729 ?~ found t
4724 ?~ found t
4730− ?: &(|(?=(%fvar -.u.found) ?=(%rvar -.u.found) ?=(%rnvar -.u.found)) =(id.t +.u.found)) u.found
4725+ ?: &(|(?=(%rvar -.u.found) ?=(%rnvar -.u.found)) =(id.t +.u.found)) u.found
4731 $(t u.found)
4726 $(t u.found)
4732 ==
4727 ==
4733::
4728::
@@ -4780,7 +4775,6 @@
4780 ?- -.typ
4775 ?- -.typ
4781 %empty `[%no fuel]
4776 %empty `[%no fuel]
4782 ?(%atom %any-atom %flag %const %noun %avar %rvar %nvar %rnvar %fn %jrec) `[%yes fuel]
4777 ?(%atom %any-atom %flag %const %noun %avar %rvar %nvar %rnvar %fn %jrec) `[%yes fuel]
4783− %fvar `[%unknown fuel]
4784 %var
4778 %var
4785 ?: (lien caps |=(c=icap (hole-same-variable typ (itype-walk [%var id.c] sub)))) `[%yes fuel]
4779 ?: (lien caps |=(c=icap (hole-same-variable typ (itype-walk [%var id.c] sub)))) `[%yes fuel]
4786 `[%unknown fuel]
4780 `[%unknown fuel]
@@ -4820,7 +4814,6 @@
4820 =. t (itype-walk t sub)
4814 =. t (itype-walk t sub)
4821 ?- -.t
4815 ?- -.t
4822 %var =(n id.t)
4816 %var =(n id.t)
4823− %fvar =(n id.t)
4824 %avar =(n id.t)
4817 %avar =(n id.t)
4825 %rvar =(n id.t)
4818 %rvar =(n id.t)
4826 %nvar =(n id.t)
4819 %nvar =(n id.t)
@@ -4875,12 +4868,6 @@
4875 ?: ?=(%var -.b)
4868 ?: ?=(%var -.b)
4876 ?: (itype-occurs id.b a sub) ~
4869 ?: (itype-occurs id.b a sub) ~
4877 `[[id.b a] sub]
4870 `[[id.b a] sub]
4878− ?: ?=(%fvar -.a)
4879− ?: (itype-occurs id.a b sub) ~
4880− (itype-bind-gate-free id.a b sub)
4881− ?: ?=(%fvar -.b)
4882− ?: (itype-occurs id.b a sub) ~
4883− (itype-bind-gate-free id.b a sub)
4884 :: Arithmetic's aura variable excludes loobeans; decimal literals
4871 :: Arithmetic's aura variable excludes loobeans; decimal literals
4885 :: remain defaultable until a later constraint makes them concrete.
4872 :: remain defaultable until a later constraint makes them concrete.
4886 ?: &(?=(%nvar -.a) ?=(%rvar -.b))
4873 ?: &(?=(%nvar -.a) ?=(%rvar -.b))
@@ -4939,69 +4926,6 @@
4939 $(a tal.a, b tal.b, sub u.first)
4926 $(a tal.a, b tal.b, sub u.first)
4940 ~
4927 ~
4941::
4928::
4942−+$ igf-form [typ=itype sub=isub left=@ud]
4943−+$ igf-forms [types=(list itype) sub=isub left=@ud]
4944−++ itype-gate-free-forms
4945− |= [xs=(list itype) sub=isub fuel=@ud]
4946− ^- (unit igf-forms)
4947− ?~ xs `[~ sub fuel]
4948− =/ head=(unit igf-form) (itype-gate-free-form i.xs sub fuel)
4949− ?~ head ~
4950− =/ tail=(unit igf-forms) $(xs t.xs, sub sub.u.head, fuel left.u.head)
4951− ?~ tail ~
4952− `[[typ.u.head types.u.tail] sub.u.tail left.u.tail]
4953−::
4954−++ itype-gate-free-form
4955− |= [t=itype sub=isub fuel=@ud]
4956− ^- (unit igf-form)
4957− ?: =(0 fuel) ~
4958− =. fuel (dec fuel)
4959− =. t (itype-walk t sub)
4960− ?- -.t
4961− %var
4962− =/ free=itype [%fvar id.t]
4963− `[free [[id.t free] sub] fuel]
4964− %fvar `[t sub fuel]
4965− ?(%atom %any-atom %flag %const %empty %avar %rvar %nvar %rnvar %jrec) `[t sub fuel]
4966− %face
4967− =/ body=(unit igf-form) $(t body.t, sub sub, fuel fuel)
4968− ?~ body ~
4969− `[[%face name.t typ.u.body] sub.u.body left.u.body]
4970− %cell
4971− =/ head=(unit igf-form) $(t hed.t, sub sub, fuel fuel)
4972− ?~ head ~
4973− =/ tail=(unit igf-form) $(t tal.t, sub sub.u.head, fuel left.u.head)
4974− ?~ tail ~
4975− `[[%cell typ.u.head typ.u.tail] sub.u.tail left.u.tail]
4976− %collection
4977− =/ args=(unit igf-forms) (itype-gate-free-forms args.t sub fuel)
4978− ?~ args ~
4979− `[[%collection name.t types.u.args] sub.u.args left.u.args]
4980− %union
4981− =/ cases=(unit igf-forms) (itype-gate-free-forms cases.t sub fuel)
4982− ?~ cases ~
4983− =/ args=(unit igf-forms) (itype-gate-free-forms args.t sub.u.cases left.u.cases)
4984− ?~ args ~
4985− `[[%union types.u.cases origin.t label.t types.u.args] sub.u.args left.u.args]
4986− * ~
4987− ==
4988−::
4989−++ itype-collection-keys
4990− |= [name=term args=(list itype) sub=isub]
4991− ^- (unit [types=(list itype) sub=isub])
4992− ?~ args `[~ sub]
4993− ?. |(?=(?(%set %map %mop %jar %jug) name)) `[args sub]
4994− =/ key=(unit igf-form) (itype-gate-free-form i.args sub 256)
4995− ?~ key ~
4996− `[[typ.u.key t.args] sub.u.key]
4997−::
4998−++ itype-bind-gate-free
4999− |= [n=@ud t=itype sub=isub]
5000− ^- (unit isub)
5001− =/ constrained=(unit igf-form) (itype-gate-free-form t sub 256)
5002− ?~ constrained ~
5003− `[[n typ.u.constrained] sub.u.constrained]
5004−::
5005++ itype-unify-args
4929++ itype-unify-args
5006 |= [as=(list itype) bs=(list itype) sub=isub]
4930 |= [as=(list itype) bs=(list itype) sub=isub]
5007 ^- (unit isub)
4931 ^- (unit isub)
@@ -5023,11 +4947,10 @@
5023 =. t (itype-walk t sub)
4947 =. t (itype-walk t sub)
5024 ?- -.t
4948 ?- -.t
5025 %var |
4949 %var |
5026− %fvar |
5027 %avar |
4950 %avar |
5028 %rvar |
4951 %rvar |
5029 %nvar |
4952 %nvar |
5030− %rnvar |
4953+ %rnvar |
5031 %atom |
4954 %atom |
5032 %any-atom &
4955 %any-atom &
5033 %flag |
4956 %flag |
@@ -5100,7 +5023,6 @@
5100 ^- ?
5023 ^- ?
5101 ?- -.typ
5024 ?- -.typ
5102 %var |
5025 %var |
5103− %fvar |
5104 %avar |
5026 %avar |
5105 %rvar |
5027 %rvar |
5106 %nvar |
5028 %nvar |
@@ -5208,8 +5130,8 @@
5208 ?. =(name.a name.b) |
5130 ?. =(name.a name.b) |
5209 (itype-face-asym-collection-args args.a args.b sub)
5131 (itype-face-asym-collection-args args.a args.b sub)
5210 ?: &(?=(%face -.a) ?=(%face -.b)) $(a body.a, b body.b)
5132 ?: &(?=(%face -.a) ?=(%face -.b)) $(a body.a, b body.b)
5211− ?: ?=(%face -.a) !|(?=(%var -.b) ?=(%fvar -.b) ?=(%avar -.b) ?=(%rvar -.b) |(?=(%nvar -.b) ?=(%rnvar -.b)))
5133+ ?: ?=(%face -.a) !|(?=(%var -.b) ?=(%avar -.b) ?=(%rvar -.b) |(?=(%nvar -.b) ?=(%rnvar -.b)))
5212− ?: ?=(%face -.b) !|(?=(%var -.a) ?=(%fvar -.a) ?=(%avar -.a) ?=(%rvar -.a) |(?=(%nvar -.a) ?=(%rnvar -.a)))
5134+ ?: ?=(%face -.b) !|(?=(%var -.a) ?=(%avar -.a) ?=(%rvar -.a) |(?=(%nvar -.a) ?=(%rnvar -.a)))
5213 ?: &(?=(%cell -.a) ?=(%cell -.b)) |($(a hed.a, b hed.b) $(a tal.a, b tal.b))
5135 ?: &(?=(%cell -.a) ?=(%cell -.b)) |($(a hed.a, b hed.b) $(a tal.a, b tal.b))
5214 ?: &(?=(%fn -.a) ?=(%fn -.b)) |($(a sample.a, b sample.b) $(a product.a, b product.b))
5136 ?: &(?=(%fn -.a) ?=(%fn -.b)) |($(a sample.a, b sample.b) $(a product.a, b product.b))
5215 |
5137 |
@@ -5281,13 +5203,6 @@
5281 ?~ (itype-lookup id.i.tags sub) &
5203 ?~ (itype-lookup id.i.tags sub) &
5282 $(tags t.tags)
5204 $(tags t.tags)
5283::
5205::
5284−++ pending-tag-diagnostic
5285− |= [tags=(list ipending) sub=isub]
5286− ^- (unit [at=span msg=tape])
5287− ?~ tags ~
5288− ?^ (itype-lookup id.i.tags sub) $(tags t.tags)
5289− `[at.i.tags (weld "nothing fixes the union of " (show-lit literal.i.tags))]
5290−::
5291++ pending-null
5206++ pending-null
5292 |= [tags=(list ipending) sub=isub]
5207 |= [tags=(list ipending) sub=isub]
5293 ^- ?
5208 ^- ?
@@ -5462,9 +5377,9 @@
5462 ?: too-wide [%unknown ~]
5377 ?: too-wide [%unknown ~]
5463 =/ spine-checked=? |(spine-proof ?=(^ known))
5378 =/ spine-checked=? |(spine-proof ?=(^ known))
5464 =/ uncertain=?
5379 =/ uncertain=?
5465− |(?=(%var -.actual) ?=(%fvar -.actual) ?=(%avar -.actual) ?=(%rvar -.actual) |(?=(%nvar -.actual) ?=(%rnvar -.actual)) ?=(%var -.expected) ?=(%fvar -.expected) ?=(%avar -.expected) ?=(%rvar -.expected) |(?=(%nvar -.expected) ?=(%rnvar -.expected)))
5380+ |(?=(%var -.actual) ?=(%avar -.actual) ?=(%rvar -.actual) |(?=(%nvar -.actual) ?=(%rnvar -.actual)) ?=(%var -.expected) ?=(%avar -.expected) ?=(%rvar -.expected) |(?=(%nvar -.expected) ?=(%rnvar -.expected)))
5466 =/ actual-open=?
5381 =/ actual-open=?
5467− |(?=(%var -.actual) ?=(%fvar -.actual) ?=(%avar -.actual) ?=(%rvar -.actual) |(?=(%nvar -.actual) ?=(%rnvar -.actual)))
5382+ |(?=(%var -.actual) ?=(%avar -.actual) ?=(%rvar -.actual) |(?=(%nvar -.actual) ?=(%rnvar -.actual)))
5468 =. actual (itype-walk actual sub)
5383 =. actual (itype-walk actual sub)
5469 =. expected (itype-walk expected sub)
5384 =. expected (itype-walk expected sub)
5470 ?: =(actual expected) [%ok sub next]
5385 ?: =(actual expected) [%ok sub next]
@@ -5519,7 +5434,7 @@
5519 ?: &(!uncertain ?=(%union -.actual) ?=(%face -.expected))
5434 ?: &(!uncertain ?=(%union -.actual) ?=(%face -.expected))
5520 $(expected body.expected)
5435 $(expected body.expected)
5521 ?: ?=(%union -.actual) [%unknown ~]
5436 ?: ?=(%union -.actual) [%unknown ~]
5522− ?: &(?=(%union -.expected) |(?=(%fvar -.actual) ?=(%avar -.actual) ?=(%rvar -.actual) |(?=(%nvar -.actual) ?=(%rnvar -.actual)))) [%unknown ~]
5437+ ?: &(?=(%union -.expected) |(?=(%avar -.actual) ?=(%rvar -.actual) |(?=(%nvar -.actual) ?=(%rnvar -.actual)))) [%unknown ~]
5523 ?: &(?=(%union -.expected) !?=(%var -.actual))
5438 ?: &(?=(%union -.expected) !?=(%var -.actual))
5524 (itype-fit-cases actual cases.expected sub next)
5439 (itype-fit-cases actual cases.expected sub next)
5525 ?: ?=(%tag -.actual)
5440 ?: ?=(%tag -.actual)
@@ -5527,7 +5442,7 @@
5527 =/ u=(unit isub) (itype-unify actual expected sub)
5442 =/ u=(unit isub) (itype-unify actual expected sub)
5528 ?~ u [%bad ~]
5443 ?~ u [%bad ~]
5529 [%ok u.u next]
5444 [%ok u.u next]
5530− ?: |(?=(%fvar -.expected) ?=(%avar -.expected) ?=(%rvar -.expected) |(?=(%nvar -.expected) ?=(%rnvar -.expected))) [%unknown ~]
5445+ ?: |(?=(%avar -.expected) ?=(%rvar -.expected) |(?=(%nvar -.expected) ?=(%rnvar -.expected))) [%unknown ~]
5531 ?: ?=(%face -.expected) $(expected body.expected)
5446 ?: ?=(%face -.expected) $(expected body.expected)
5532 ?: constructor.actual
5447 ?: constructor.actual
5533 ?. ?=(%fn -.expected) [%bad ~]
5448 ?. ?=(%fn -.expected) [%bad ~]
@@ -5555,7 +5470,7 @@
5555 =/ u=(unit isub) (itype-unify actual expected sub)
5470 =/ u=(unit isub) (itype-unify actual expected sub)
5556 ?~ u [%bad ~]
5471 ?~ u [%bad ~]
5557 [%ok u.u next]
5472 [%ok u.u next]
5558− ?: |(?=(%fvar -.expected) ?=(%avar -.expected) ?=(%rvar -.expected) |(?=(%nvar -.expected) ?=(%rnvar -.expected))) [%unknown ~]
5473+ ?: |(?=(%avar -.expected) ?=(%rvar -.expected) |(?=(%nvar -.expected) ?=(%rnvar -.expected))) [%unknown ~]
5559 ?: ?=(%face -.expected) $(expected body.expected)
5474 ?: ?=(%face -.expected) $(expected body.expected)
5560 ?: &(?=(%collection -.expected) =(%list name.expected) =(0 val.literal.actual))
5475 ?: &(?=(%collection -.expected) =(%list name.expected) =(0 val.literal.actual))
5561 [%unknown ~]
5476 [%unknown ~]
@@ -5572,13 +5487,6 @@
5572 ?:(|(=(0 val.literal.actual) =(1 val.literal.actual)) [%ok sub next] [%bad ~])
5487 ?:(|(=(0 val.literal.actual) =(1 val.literal.actual)) [%ok sub next] [%bad ~])
5573 ?: ?=(%any-atom -.expected) [%ok sub next]
5488 ?: ?=(%any-atom -.expected) [%ok sub next]
5574 [%bad ~]
5489 [%bad ~]
5575− :: A field on an expected sample slot labels the value's type; it does
5576− :: not become a face on the actual argument. Unify with the slot body
5577− :: rather than binding either variable to the face around the other.
5578− ?: &(?=(%var -.actual) ?=(%face -.expected))
5579− =/ unified=(unit isub) (itype-unify actual body.expected sub)
5580− ?~ unified [%unknown ~]
5581− [%ok u.unified next]
5582 ?: &(uncertain (itype-face-asym actual expected sub)) [%unknown ~]
5490 ?: &(uncertain (itype-face-asym actual expected sub)) [%unknown ~]
5583 :: A known face labels the same noun. Peel it before applying the
5491 :: A known face labels the same noun. Peel it before applying the
5584 :: directional unrestricted-atom rule, preserving raw-variable guards.
5492 :: directional unrestricted-atom rule, preserving raw-variable guards.
@@ -5598,7 +5506,7 @@
5598 =/ unified=(unit isub) (itype-unify actual expected sub)
5506 =/ unified=(unit isub) (itype-unify actual expected sub)
5599 ?~ unified [%bad ~]
5507 ?~ unified [%bad ~]
5600 [%ok u.unified next]
5508 [%ok u.unified next]
5601− ?: |(?=(%fvar -.expected) ?=(%avar -.expected) ?=(%rvar -.expected) |(?=(%nvar -.expected) ?=(%rnvar -.expected))) [%unknown ~]
5509+ ?: |(?=(%avar -.expected) ?=(%rvar -.expected) |(?=(%nvar -.expected) ?=(%rnvar -.expected))) [%unknown ~]
5602 [%bad ~]
5510 [%bad ~]
5603 ?: &(?=(%atom -.actual) ?=(%atom -.expected))
5511 ?: &(?=(%atom -.actual) ?=(%atom -.expected))
5604 ?: (aura-prefix aura.expected aura.actual) [%ok sub next]
5512 ?: (aura-prefix aura.expected aura.actual) [%ok sub next]
@@ -5608,10 +5516,18 @@
5608 =/ first=ifit $(actual hed.actual, expected hed.expected, skip-width |, spine-proof |)
5516 =/ first=ifit $(actual hed.actual, expected hed.expected, skip-width |, spine-proof |)
5609 ?. ?=(%ok -.first) first
5517 ?. ?=(%ok -.first) first
5610 $(actual tal.actual, expected tal.expected, sub sub.first, next next.first, skip-width spine-checked, spine-proof spine-checked)
5518 $(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 ~]
5611 ?: &(?=(%face -.actual) ?=(%var -.expected)) [%unknown ~]
5527 ?: &(?=(%face -.actual) ?=(%var -.expected)) [%unknown ~]
5612 ?: &(?=(%var -.actual) (itype-has-any-atom expected sub))
5528 ?: &(?=(%var -.actual) (itype-has-any-atom expected sub))
5613 [%unknown ~]
5529 [%unknown ~]
5614− ?: |(?=(%var -.actual) ?=(%var -.expected) ?=(%fvar -.expected))
5530+ ?: |(?=(%var -.actual) ?=(%var -.expected))
5615 =/ unified=(unit isub) (itype-unify actual expected sub)
5531 =/ unified=(unit isub) (itype-unify actual expected sub)
5616 ?~ unified
5532 ?~ unified
5617 ?: |(?=(%face -.actual) ?=(%face -.expected)) [%unknown ~]
5533 ?: |(?=(%face -.actual) ?=(%face -.expected)) [%unknown ~]
@@ -5691,36 +5607,6 @@
5691 (itype-fit [%collection %list ~[a]] list-t ~[[0 recursive]] 1)
5607 (itype-fit [%collection %list ~[a]] list-t ~[[0 recursive]] 1)
5692 =? problems !?=(%unknown -.nested-fit)
5608 =? problems !?=(%unknown -.nested-fit)
5693 ["recursive types behind substitutions should remain uncertain" problems]
5609 ["recursive types behind substitutions should remain uncertain" problems]
5694− =/ free=itype [%fvar 40]
5695− =/ open-cell=itype [%cell [%var 41] [%face %x [%var 42]]]
5696− =/ constrained=(unit isub) (itype-unify free open-cell ~)
5697− =/ expected-cell=itype [%cell [%fvar 41] [%face %x [%fvar 42]]]
5698− =? problems !=(constrained [~ [[40 expected-cell] [[42 [%fvar 42]] [[41 [%fvar 41]] ~]]]])
5699− ["gate-free constraints should propagate through cells and faces" problems]
5700− =? problems ?=(^ (itype-unify free open-cell ~[[41 [%fn txt txt]]]))
5701− ["an existing nested gate substitution should be rejected" problems]
5702− =/ shared-sub=isub [[42 [%fvar 42]] [[41 [%fvar 41]] ~]]
5703− =? problems ?=(^ (itype-unify [%var 41] [%fn txt txt] shared-sub))
5704− ["a later nested gate substitution should be rejected" problems]
5705− =? problems ?=(^ (itype-unify free [%fn txt txt] ~))
5706− ["a gate-free variable should reject a gate" problems]
5707− =? problems ?=(^ (itype-unify free [%noun ~] ~))
5708− ["a gate-free variable should reject an opaque noun" problems]
5709− =/ atom-strong=(unit isub) (itype-unify [%avar 43] free ~)
5710− =? problems !=(atom-strong [~ [[40 [%avar 43]] ~]])
5711− ["the atom constraint should be stronger than gate-free" problems]
5712− =/ free-fit=ifit (itype-fit txt free ~ 44)
5713− =? problems !?=(%ok -.free-fit)
5714− ["a concrete atom should fit a gate-free variable" problems]
5715− =/ gate-fit=ifit (itype-fit [%fn txt txt] free ~ 44)
5716− =? problems !?=(%bad -.gate-fit)
5717− ["a gate should not fit a gate-free variable" problems]
5718− =/ free-scheme=ischeme [[%fn free free] ~[40]]
5719− =/ canonical-free=itype (canonical-itype typ.free-scheme vars.free-scheme)
5720− =? problems !=(canonical-free [%fn [%fvar 0] [%fvar 0]])
5721− ["canonicalization should retain gate-free variables" problems]
5722− =? problems !=((show-atom-constraint canonical-free) " where A contains no gates")
5723− ["the printer should show gate-free constraints" problems]
5724 problems
5610 problems
5725::
5611::
5726:: The expression inference below is deliberately a fragment: bindings,
5612:: The expression inference below is deliberately a fragment: bindings,
@@ -5737,14 +5623,10 @@
5737:: of an arbitrary ask value. Reader graphs and source inputs are trusted.
5623:: of an arbitrary ask value. Reader graphs and source inputs are trusted.
5738+$ irequest-evidence
5624+$ irequest-evidence
5739 [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]
5625 [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]
5740−:: Store requests have their own source-bound evidence. In particular, an
5741−:: API path certificate cannot make a store state member watchable, or vice versa.
5742−+$ istore-request-evidence
5743− [store-at=path source=@t state=itype action-name=term action=itype]
5744:: A unit distinguishes a verified empty closure from a detached legacy file.
5626:: A unit distinguishes a verified empty closure from a detached legacy file.
5745:: The opaque prelude is an exact trusted input, not a recursive interface mold.
5627:: The opaque prelude is an exact trusted input, not a recursive interface mold.
5746+$ irequest-graph
5628+$ irequest-graph
5747− [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]
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]
5748+$ 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)]
5630+$ 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)]
5749+$ ijimports (list [face=term interface=ifile])
5631+$ ijimports (list [face=term interface=ifile])
5750+$ icap [name=@t id=@ud at=span]
5632+$ icap [name=@t id=@ud at=span]
@@ -5906,7 +5788,6 @@
5906 %noun [%unknown & fuel ~]
5788 %noun [%unknown & fuel ~]
5907 %empty [%yes | fuel ~]
5789 %empty [%yes | fuel ~]
5908 %var [%unknown | fuel ~]
5790 %var [%unknown | fuel ~]
5909− %fvar [%yes & fuel ~]
5910 %avar [%yes & fuel ~]
5791 %avar [%yes & fuel ~]
5911 %rvar [%yes & fuel ~]
5792 %rvar [%yes & fuel ~]
5912 %nvar [%yes & fuel ~]
5793 %nvar [%yes & fuel ~]
@@ -5973,11 +5854,10 @@
5973 %tag |
5854 %tag |
5974 %const |
5855 %const |
5975 %var |
5856 %var |
5976− %fvar |
5977 %avar |
5857 %avar |
5978 %rvar |
5858 %rvar |
5979 %nvar |
5859 %nvar |
5980− %rnvar |
5860+ %rnvar |
5981 %atom |
5861 %atom |
5982 %any-atom |
5862 %any-atom |
5983 %flag |
5863 %flag |
@@ -6008,7 +5888,6 @@
6008 ^- (unit @ud)
5888 ^- (unit @ud)
6009 ?- -.t
5889 ?- -.t
6010 %var `id.t
5890 %var `id.t
6011− %fvar `id.t
6012 %avar `id.t
5891 %avar `id.t
6013 %rvar `id.t
5892 %rvar `id.t
6014 %nvar `id.t
5893 %nvar `id.t
@@ -6029,7 +5908,7 @@
6029 ^- ?
5908 ^- ?
6030 =. t (itype-walk t sub.state)
5909 =. t (itype-walk t sub.state)
6031 ?- -.t
5910 ?- -.t
6032− ?(%var %fvar %avar %rvar %nvar %rnvar)
5911+ ?(%var %avar %rvar %nvar %rnvar)
6033 ?: (lien caps.state |=(c=icap (hole-same-variable t (itype-walk [%var id.c] sub.state)))) &
5912 ?: (lien caps.state |=(c=icap (hole-same-variable t (itype-walk [%var id.c] sub.state)))) &
6034 (lien params.state |=(p=[name=@t typ=itype] (hole-same-variable t (itype-walk typ.p sub.state))))
5913 (lien params.state |=(p=[name=@t typ=itype] (hole-same-variable t (itype-walk typ.p sub.state))))
6035 %tag |
5914 %tag |
@@ -6081,7 +5960,7 @@
6081 ^- ?
5960 ^- ?
6082 =. t (itype-walk t sub.state)
5961 =. t (itype-walk t sub.state)
6083 ?- -.t
5962 ?- -.t
6084− ?(%tag %nvar %rnvar %fvar %avar %rvar) !(hole-known t state)
5963+ ?(%tag %nvar %rnvar %avar %rvar) !(hole-known t state)
6085 %union |((lien cases.t |=(c=itype (hole-uncertain c state))) (lien args.t |=(c=itype (hole-uncertain c state))))
5964 %union |((lien cases.t |=(c=itype (hole-uncertain c state))) (lien args.t |=(c=itype (hole-uncertain c state))))
6086 %grec (lien args.t |=(c=itype (hole-uncertain c state)))
5965 %grec (lien args.t |=(c=itype (hole-uncertain c state)))
6087 %collection (lien args.t |=(c=itype (hole-uncertain c state)))
5966 %collection (lien args.t |=(c=itype (hole-uncertain c state)))
@@ -6099,19 +5978,14 @@
6099 ?~ work ~
5978 ?~ work ~
6100 ?: (hole-known [%var id.i.work] state) $(work t.work)
5979 ?: (hole-known [%var id.i.work] state) $(work t.work)
6101 ?: (hole-uncertain [%var id.i.work] state)
5980 ?: (hole-uncertain [%var id.i.work] state)
6102− `[uncertain-hole-msg ~[[at.i.work "type hole"]]]
5981+ `["type hole needs unsupported inference" ~[[at.i.work "type hole"]]]
6103 `["type hole needs a determined type" ~[[at.i.work "unresolved type hole"]]]
5982 `["type hole needs a determined type" ~[[at.i.work "unresolved type hole"]]]
6104::
5983::
6105−:: +uncertain-hole-msg: unsupported, though it names the hole's site
6106−::
6107−++ uncertain-hole-msg "type hole needs unsupported inference"
6108−::
6109++ itype-vars
5984++ itype-vars
6110 |= t=itype
5985 |= t=itype
6111 ^- (list @ud)
5986 ^- (list @ud)
6112 ?- -.t
5987 ?- -.t
6113 %var ~[id.t]
5988 %var ~[id.t]
6114− %fvar ~[id.t]
6115 %avar ~[id.t]
5989 %avar ~[id.t]
6116 %rvar ~[id.t]
5990 %rvar ~[id.t]
6117 %nvar ~[id.t]
5991 %nvar ~[id.t]
@@ -6150,10 +6024,6 @@
6150 =/ found=(unit itype) (itype-lookup id.t ren)
6024 =/ found=(unit itype) (itype-lookup id.t ren)
6151 ?~ found t
6025 ?~ found t
6152 u.found
6026 u.found
6153− %fvar
6154− =/ found=(unit itype) (itype-lookup id.t ren)
6155− ?~ found t
6156− u.found
6157 %avar
6027 %avar
6158 =/ found=(unit itype) (itype-lookup id.t ren)
6028 =/ found=(unit itype) (itype-lookup id.t ren)
6159 ?~ found t
6029 ?~ found t
@@ -6195,7 +6065,6 @@
6195 ^- ?
6065 ^- ?
6196 ?- -.t
6066 ?- -.t
6197 %var |
6067 %var |
6198− %fvar |
6199 %avar =(n id.t)
6068 %avar =(n id.t)
6200 %rvar =(n id.t)
6069 %rvar =(n id.t)
6201 %nvar =(n id.t)
6070 %nvar =(n id.t)
@@ -6221,7 +6090,6 @@
6221 ^- ?
6090 ^- ?
6222 ?- -.t
6091 ?- -.t
6223 %var |
6092 %var |
6224− %fvar |
6225 %avar |
6093 %avar |
6226 %rvar =(n id.t)
6094 %rvar =(n id.t)
6227 %nvar |
6095 %nvar |
@@ -6246,28 +6114,6 @@
6246:: Canonical numbering makes printed variables independent of the order
6114:: Canonical numbering makes printed variables independent of the order
6247:: the unifier happened to allocate intermediates.
6115:: the unifier happened to allocate intermediates.
6248::
6116::
6249−++ itype-var-is-gate-free-fuel
6250− |= [n=@ud t=itype fuel=@ud]
6251− ^- ?
6252− ?: =(0 fuel) &
6253− =. fuel (dec fuel)
6254− ?- -.t
6255− %var |
6256− %fvar =(n id.t)
6257− %union |((lien cases.t |=(c=itype (itype-var-is-gate-free-fuel n c fuel))) (lien args.t |=(c=itype (itype-var-is-gate-free-fuel n c fuel))))
6258− %grec (lien args.t |=(c=itype (itype-var-is-gate-free-fuel n c fuel)))
6259− %collection (lien args.t |=(c=itype (itype-var-is-gate-free-fuel n c fuel)))
6260− %face $(t body.t, fuel fuel)
6261− %fn |($(t sample.t, fuel fuel) $(t product.t, fuel fuel))
6262− %cell |($(t hed.t, fuel fuel) $(t tal.t, fuel fuel))
6263− * |
6264− ==
6265−::
6266−++ itype-var-is-gate-free
6267− |= [n=@ud t=itype]
6268− ^- ?
6269− (itype-var-is-gate-free-fuel n t 256)
6270−::
6271++ canonical-itype
6117++ canonical-itype
6272 |= [t=itype vars=(list @ud)]
6118 |= [t=itype vars=(list @ud)]
6273 ^- itype
6119 ^- itype
@@ -6275,7 +6121,7 @@
6275 =/ n=@ud 0
6121 =/ n=@ud 0
6276 |-
6122 |-
6277 ?~ vars (itype-rename t ren)
6123 ?~ vars (itype-rename t ren)
6278− =/ replacement=itype ?:((itype-var-is-restricted i.vars t) [%rvar n] ?:((itype-var-is-atom i.vars t) [%avar n] ?:((itype-var-is-gate-free i.vars t) [%fvar n] [%var n])))
6124+ =/ replacement=itype ?:((itype-var-is-restricted i.vars t) [%rvar n] ?:((itype-var-is-atom i.vars t) [%avar n] [%var n]))
6279 $(vars t.vars, ren [[i.vars replacement] ren], n +(n))
6125 $(vars t.vars, ren [[i.vars replacement] ren], n +(n))
6280::
6126::
6281++ instantiate-scheme
6127++ instantiate-scheme
@@ -6286,11 +6132,11 @@
6286 |-
6132 |-
6287 ?~ vars [(itype-rename typ.scheme ren) state]
6133 ?~ vars [(itype-rename typ.scheme ren) state]
6288 =/ replacement=itype
6134 =/ replacement=itype
6289− ?:((itype-var-is-restricted i.vars typ.scheme) [%rvar next.state] ?:((itype-var-is-atom i.vars typ.scheme) [%avar next.state] ?:((itype-var-is-gate-free i.vars typ.scheme) [%fvar next.state] [%var next.state])))
6135+ ?:((itype-var-is-restricted i.vars typ.scheme) [%rvar next.state] ?:((itype-var-is-atom i.vars typ.scheme) [%avar next.state] [%var next.state]))
6290 :: A generalized atom variable is a valid origin for re-generalizing
6136 :: A generalized atom variable is a valid origin for re-generalizing
6291 :: an alias, just as a sample binder is.
6137 :: an alias, just as a sample binder is.
6292 =/ st=istate state(next +(next.state))
6138 =/ st=istate state(next +(next.state))
6293− =? binders.st |(?=(%fvar -.replacement) ?=(%avar -.replacement) ?=(%rvar -.replacement)) [next.state binders.state]
6139+ =? binders.st |(?=(%avar -.replacement) ?=(%rvar -.replacement)) [next.state binders.state]
6294 $(vars t.vars, ren [[i.vars replacement] ren], state st)
6140 $(vars t.vars, ren [[i.vars replacement] ren], state st)
6295::
6141::
6296++ icap-lookup
6142++ icap-lookup
@@ -6453,11 +6299,6 @@
6453++ import-to-itype
6299++ import-to-itype
6454 |= node=*
6300 |= node=*
6455 ^- (unit itype)
6301 ^- (unit itype)
6456− (import-to-itype-standard node ~)
6457−::
6458−++ import-to-itype-standard
6459− |= [node=* standard=(unit ischeme)]
6460− ^- (unit itype)
6461 ?@ node ~
6302 ?@ node ~
6462 ?+ -.node ~
6303 ?+ -.node ~
6463 %noun ?:(=(node [%noun ~]) `[%noun ~] ~)
6304 %noun ?:(=(node [%noun ~]) `[%noun ~] ~)
@@ -6499,24 +6340,16 @@
6499 ?: |(=(%map name) =(%mop name) =(%jar name) =(%jug name)) 2
6340 ?: |(=(%map name) =(%mop name) =(%jar name) =(%jug name)) 2
6500 0
6341 0
6501 ?: =(arity 0) ~
6342 ?: =(arity 0) ~
6502− =/ args=(unit (list itype)) (import-to-itypes-standard +>.node standard)
6343+ =/ args=(unit (list itype)) (import-to-itypes +>.node)
6503 ?~ args ~
6344 ?~ args ~
6504 ?. =(arity (lent u.args)) ~
6345 ?. =(arity (lent u.args)) ~
6505− =/ keyed=(unit [types=(list itype) sub=isub]) (itype-collection-keys name u.args ~)
6346+ `[%collection name u.args]
6506− ?~ keyed ~
6507− ?: =(%unit name)
6508− ?. ?=([* ~] types.u.keyed) ~
6509− ?~ standard `[%collection name types.u.keyed]
6510− ?. (standard-unit-template u.standard /lib/jibb/prelude/jibb) ~
6511− =/ nil=itype [%const [%null %n 0 '~']]
6512− `[%union ~[nil [%cell nil [%face %u i.types.u.keyed]]] `[/lib/jibb/prelude/jibb %unit] `%unit types.u.keyed]
6513− `[%collection name types.u.keyed]
6514 %fork
6347 %fork
6515 :: Hoon's ordinary ? mold is the fork of its two %f singletons.
6348 :: Hoon's ordinary ? mold is the fork of its two %f singletons.
6516 =/ raw=* +.node
6349 =/ raw=* +.node
6517 ?: |(=(raw ~[[%atom %f `0] [%atom %f `1]]) =(raw ~[[%atom %f `1] [%atom %f `0]]))
6350 ?: |(=(raw ~[[%atom %f `0] [%atom %f `1]]) =(raw ~[[%atom %f `1] [%atom %f `0]]))
6518 `[%flag ~]
6351 `[%flag ~]
6519− =/ cases=(unit (list itype)) (import-to-itypes-standard raw standard)
6352+ =/ cases=(unit (list itype)) (import-to-itypes raw)
6520 ?~ cases ~
6353 ?~ cases ~
6521 ?~ u.cases ~
6354 ?~ u.cases ~
6522 ?~ t.u.cases ~
6355 ?~ t.u.cases ~
@@ -6556,15 +6389,10 @@
6556++ import-to-itypes
6389++ import-to-itypes
6557 |= nodes=*
6390 |= nodes=*
6558 ^- (unit (list itype))
6391 ^- (unit (list itype))
6559− (import-to-itypes-standard nodes ~)
6560−::
6561−++ import-to-itypes-standard
6562− |= [nodes=* standard=(unit ischeme)]
6563− ^- (unit (list itype))
6564 ?@ nodes ?:(=(nodes 0) `~ ~)
6392 ?@ nodes ?:(=(nodes 0) `~ ~)
6565− =/ first (import-to-itype-standard -.nodes standard)
6393+ =/ first (import-to-itype -.nodes)
6566 ?~ first ~
6394 ?~ first ~
6567− =/ rest $(nodes +.nodes, standard standard)
6395+ =/ rest $(nodes +.nodes)
6568 ?~ rest ~
6396 ?~ rest ~
6569 `[u.first u.rest]
6397 `[u.first u.rest]
6570::
6398::
@@ -6591,10 +6419,9 @@
6591 ?. (levy t.cases |=(t=itype =(%disjoint (union-relate first (import-type-pattern t))))) |
6419 ?. (levy t.cases |=(t=itype =(%disjoint (union-relate first (import-type-pattern t))))) |
6592 $(cases t.cases)
6420 $(cases t.cases)
6593::
6421::
6594−++ find-imported-mold-prelude
6422+++ find-imported-mold
6595− |= [module=term name=term externals=iexternals surs=(list term) prelude=ifile]
6423+ |= [module=term name=term externals=iexternals surs=(list term)]
6596 ^- (unit itype)
6424 ^- (unit itype)
6597− =/ standard=(unit ischeme) (find-jibb-mold %unit prelude)
6598 ?. (lien surs |=(n=term =(n module))) ~
6425 ?. (lien surs |=(n=term =(n module))) ~
6599 =/ found=iexternals
6426 =/ found=iexternals
6600 (skim externals |=(e=[module=term name=term result=*] &(=(module module.e) =(name name.e))))
6427 (skim externals |=(e=[module=term name=term result=*] &(=(module module.e) =(name name.e))))
@@ -6605,17 +6432,13 @@
6605 ?. ?=(%& -.result) ~
6432 ?. ?=(%& -.result) ~
6606 =/ node=* +.result
6433 =/ node=* +.result
6607 ?. (imported-faces-valid node) ~
6434 ?. (imported-faces-valid node) ~
6608− ?@ node (import-to-itype-standard node standard)
6435+ ?@ node (import-to-itype node)
6609− ?: ?=(%ref -.node) (import-to-itype-standard node standard)
6436+ ?: ?=(%ref -.node) (import-to-itype node)
6610 =/ pattern=(unit irec-pattern) (rec-pattern node module name)
6437 =/ pattern=(unit irec-pattern) (rec-pattern node module name)
6611− ?~ pattern (import-to-itype-standard node standard)
6438+ ?~ pattern (import-to-itype node)
6612− ?. has.u.pattern (import-to-itype-standard node standard)
6439+ ?. has.u.pattern (import-to-itype node)
6613 `[%recursive module name `(crip "{(trip name)}.{(trip module)}")]
6440 `[%recursive module name `(crip "{(trip name)}.{(trip module)}")]
6614−::
6441+
6615−++ find-imported-mold
6616− |= [module=term name=term externals=iexternals surs=(list term)]
6617− ^- (unit itype)
6618− (find-imported-mold-prelude module name externals surs *ifile)
6619::
6442::
6620++ collect-sur-imports
6443++ collect-sur-imports
6621 |= imports=(list import)
6444 |= imports=(list import)
@@ -6633,10 +6456,9 @@
6633 [mark.i.imports $(imports t.imports)]
6456 [mark.i.imports $(imports t.imports)]
6634 $(imports t.imports)
6457 $(imports t.imports)
6635::
6458::
6636−++ find-imported-mark-prelude
6459+++ find-imported-mark
6637− |= [name=term externals=imark-externals marks=(list term) prelude=ifile]
6460+ |= [name=term externals=imark-externals marks=(list term)]
6638 ^- (unit itype)
6461 ^- (unit itype)
6639− =/ standard=(unit ischeme) (find-jibb-mold %unit prelude)
6640 ?. (unique-value-name name marks) ~
6462 ?. (unique-value-name name marks) ~
6641 =/ found=imark-externals
6463 =/ found=imark-externals
6642 (skim externals |=(e=[mark=term result=*] =(name mark.e)))
6464 (skim externals |=(e=[mark=term result=*] =(name mark.e)))
@@ -6646,12 +6468,7 @@
6646 ?@ result ~
6468 ?@ result ~
6647 ?. ?=(%& -.result) ~
6469 ?. ?=(%& -.result) ~
6648 ?. (imported-faces-valid +.result) ~
6470 ?. (imported-faces-valid +.result) ~
6649− (import-to-itype-standard +.result standard)
6471+ (import-to-itype +.result)
6650−::
6651−++ find-imported-mark
6652− |= [name=term externals=imark-externals marks=(list term)]
6653− ^- (unit itype)
6654− (find-imported-mark-prelude name externals marks *ifile)
6655::
6472::
6656++ find-jibb-interface
6473++ find-jibb-interface
6657 |= [face=term imports=ijimports]
6474 |= [face=term imports=ijimports]
@@ -6805,27 +6622,15 @@
6805 ?~ rest ~
6622 ?~ rest ~
6806 `[[i.names i.args] u.rest]
6623 `[[i.names i.args] u.rest]
6807::
6624::
6808−++ template-apply-sub
6625+++ template-apply
6809− |= [template=ischeme args=(list itype) sub=isub]
6626+ |= [template=ischeme args=(list itype)]
6810− ^- (unit [typ=itype sub=isub])
6627+ ^- (unit itype)
6811 =/ vars=(list @ud) vars.template
6628 =/ vars=(list @ud) vars.template
6812 =/ ren=isub ~
6629 =/ ren=isub ~
6813 |-
6630 |-
6814− ?~ vars ?~(args `[(itype-rename typ.template ren) sub] ~)
6631+ ?~ vars ?~(args `(itype-rename typ.template ren) ~)
6815 ?~ args ~
6632 ?~ args ~
6816− =/ replacement=(unit igf-form)
6817− ?: (itype-var-is-gate-free i.vars typ.template)
6818− (itype-gate-free-form i.args sub 256)
6819− `[i.args sub 256]
6820− ?~ replacement ~
6821− $(vars t.vars, args t.args, ren [[i.vars typ.u.replacement] ren], sub sub.u.replacement)
6633+ $(vars t.vars, args t.args, ren [[i.vars i.args] ren])
6822−::
6823−++ template-apply
6824− |= [template=ischeme args=(list itype)]
6825− ^- (unit itype)
6826− =/ applied=(unit [typ=itype sub=isub]) (template-apply-sub template args ~)
6827− ?~ applied ~
6828− `typ.u.applied
6829::
6634::
6830++ infer-shape-args
6635++ infer-shape-args
6831 |= [args=(list shape) state=istate]
6636 |= [args=(list shape) state=istate]
@@ -7066,12 +6871,12 @@
7066 ?^ vars.u.found ~
6871 ?^ vars.u.found ~
7067 `[(itype-in-import typ.u.found u.iface i.t.names.sh prelude.state) state]
6872 `[(itype-in-import typ.u.found u.iface i.t.names.sh prelude.state) state]
7068 =/ found=(unit itype)
6873 =/ found=(unit itype)
7069− (find-imported-mold-prelude i.t.names.sh n externals.state surs.state ?~(prelude.state *ifile u.prelude.state))
6874+ (find-imported-mold i.t.names.sh n externals.state surs.state)
7070 ?~ found ~
6875 ?~ found ~
7071 `[u.found state]
6876 `[u.found state]
7072 ?: (lien marks.state |=(x=term =(x n)))
6877 ?: (lien marks.state |=(x=term =(x n)))
7073 ?^ (find-simple-mold n molds.state) ~
6878 ?^ (find-simple-mold n molds.state) ~
7074− =/ imported=(unit itype) (find-imported-mark-prelude n mark-externals.state marks.state ?~(prelude.state *ifile u.prelude.state))
6879+ =/ imported=(unit itype) (find-imported-mark n mark-externals.state marks.state)
7075 ?~ imported ~
6880 ?~ imported ~
7076 `[u.imported state]
6881 `[u.imported state]
7077 ?: (lien active.state |=(x=term =(x n))) ~
6882 ?: (lien active.state |=(x=term =(x n))) ~
@@ -7095,17 +6900,6 @@
7095 =/ args=(unit [types=(list itype) state=istate]) (infer-shape-args args.sh state)
6900 =/ args=(unit [types=(list itype) state=istate]) (infer-shape-args args.sh state)
7096 ?~ args ~
6901 ?~ args ~
7097 =/ n=term i.ref.sh
6902 =/ n=term i.ref.sh
7098− =/ keyed=(unit [types=(list itype) sub=isub])
7099− ?: ?=(^ (find-simple-mold n molds.state.u.args))
7100− `[types.u.args sub.state.u.args]
7101− ?~ prelude.state.u.args
7102− (itype-collection-keys n types.u.args sub.state.u.args)
7103− ?: ?=(^ (find-jibb-mold n u.prelude.state.u.args))
7104− `[types.u.args sub.state.u.args]
7105− (itype-collection-keys n types.u.args sub.state.u.args)
7106− ?~ keyed ~
7107− =. types.u.args types.u.keyed
7108− =. sub.state.u.args sub.u.keyed
7109 ?^ t.ref.sh
6903 ?^ t.ref.sh
7110 ?^ t.t.ref.sh ~
6904 ?^ t.t.ref.sh ~
7111 =/ iface=(unit ifile) (find-jibb-interface i.t.ref.sh jimports.state.u.args)
6905 =/ iface=(unit ifile) (find-jibb-interface i.t.ref.sh jimports.state.u.args)
@@ -7113,10 +6907,9 @@
7113 =/ template=(unit ischeme) (find-jibb-mold n u.iface)
6907 =/ template=(unit ischeme) (find-jibb-mold n u.iface)
7114 ?~ template ~
6908 ?~ template ~
7115 ?~ vars.u.template ~
6909 ?~ vars.u.template ~
7116− =/ applied=(unit [typ=itype sub=isub]) (template-apply-sub u.template types.u.args sub.state.u.args)
6910+ =/ applied=(unit itype) (template-apply u.template types.u.args)
7117 ?~ applied ~
6911 ?~ applied ~
7118− =. sub.state.u.args sub.u.applied
7119− `[(itype-in-import typ.u.applied u.iface i.t.ref.sh prelude.state.u.args) state.u.args]
6912+ `[(itype-in-import u.applied u.iface i.t.ref.sh prelude.state.u.args) state.u.args]
7120 ?: (lien active.state.u.args |=(x=term =(x n))) ~
6913 ?: (lien active.state.u.args |=(x=term =(x n))) ~
7121 =/ found=(unit shape) (find-simple-mold n molds.state.u.args)
6914 =/ found=(unit shape) (find-simple-mold n molds.state.u.args)
7122 ?~ found
6915 ?~ found
@@ -7125,10 +6918,9 @@
7125 =/ prelude-entry=(unit ischeme) (find-jibb-mold n u.prelude.state.u.args)
6918 =/ prelude-entry=(unit ischeme) (find-jibb-mold n u.prelude.state.u.args)
7126 ?~ prelude-entry ~
6919 ?~ prelude-entry ~
7127 ?~ vars.u.prelude-entry ~
6920 ?~ vars.u.prelude-entry ~
7128− =/ applied=(unit [typ=itype sub=isub]) (template-apply-sub u.prelude-entry types.u.args sub.state.u.args)
6921+ =/ applied=(unit itype) (template-apply u.prelude-entry types.u.args)
7129 ?~ applied ~
6922 ?~ applied ~
7130− =. sub.state.u.args sub.u.applied
7131− `[typ.u.applied state.u.args]
6923+ `[u.applied state.u.args]
7132 ?. ?=(%generic -.u.found) ~
6924 ?. ?=(%generic -.u.found) ~
7133 =/ grec=(unit itype) (simple-source-generic-recursive n u.found types.u.args state.u.args)
6925 =/ grec=(unit itype) (simple-source-generic-recursive n u.found types.u.args state.u.args)
7134 ?^ grec `[u.grec state.u.args]
6926 ?^ grec `[u.grec state.u.args]
@@ -7437,115 +7229,10 @@
7437 ^- istate
7229 ^- istate
7438 (reserve-cap-sites (scope-expr e) state)
7230 (reserve-cap-sites (scope-expr e) state)
7439::
7231::
7440−:: +definite-diag: whether a failure is an error in the program itself
7441−::
7442−:: A definite error names the sites that conflict. A form partial
7443−:: inference does not support names none, and neither does a name
7444−:: that is not inferred yet, such as a sibling that waits for a later
7445−:: pass. An uncertain hole is the one unsupported result with a site.
7446−::
7447−++ definite-diag
7448− |= diag=idiag
7449− ^- ?
7450− ?~ sites.diag |
7451− !=(msg.diag uncertain-hole-msg)
7452−::
7453−:: +shared-types: what a body's shared variables resolve to
7454−::
7455−:: The variables free in env or in the enclosing capitals, such as an
7456−:: enclosing gate's untyped sample, are shared by all of the body's
7457−:: locals. A local keeps monomorphic only the variables that these
7458−:: resolve to; it generalizes the rest, which each use renames.
7459−::
7460−++ shared-types
7461− |= [env=ienv caps=icaps sub=isub]
7462− ^- (list [id=@ud typ=itype])
7463− %+ turn
7464− (unique-type-vars (weld (free-env-vars env sub) (free-cap-vars caps sub)))
7465− |=(id=@ud [id (itype-normalize [%var id] sub)])
7466−::
7467−:: +shared-moved: whether a sibling bound or refined a shared variable
7468−::
7469−:: A sibling that infers can constrain a shared variable and so turn
7470−:: another local's failure into a success: +itype-fit accepts any type
7471−:: it can prove empty, so after `^- !! x` every cast of x fits. Such a
7472−:: failure can depend on the order siblings are tried in. A variable
7473−:: that a sibling keeps monomorphic occurs in what a shared variable
7474−:: resolves to, so constraining it moves a shared variable too. A
7475−:: substitution only grows, so when none moved, every sibling inferred
7476−:: so far, and the local, ran against the entry state and generalized
7477−:: schemes alone.
7478−::
7479−++ shared-moved
7480− |= [shared=(list [id=@ud typ=itype]) sub=isub]
7481− ^- ?
7482− (lien shared |=([id=@ud typ=itype] !=(typ (itype-normalize [%var id] sub))))
7483−::
7484−:: +closed-local: whether a local cannot see any shared variable
7485−::
7486−:: A local that names no sibling, itself included, no name whose type
7487−:: had a free variable when the body was entered, and no enclosing
7488−:: capital that did, is inferred from generalized schemes and known
7489−:: types alone. What its siblings do cannot change its result, so its
7490−:: error is its own in any order. +sub is the substitution on entry,
7491−:: since a sibling may since have bound such a variable. The names are
7492−:: syntactic and ignore binders, so this errs closed.
7493−::
7494−++ closed-local
7495− |= [d=def siblings=(list term) env=ienv caps=icaps sub=isub]
7496− ^- ?
7497− ?. ?=(%value -.d) |
7498− =/ deps=(list term) (dependency-expr val.d)
7499− ?: (lien deps |=(n=term |(=(n name.d) (lien siblings |=(s=term =(s n)))))) |
7500− ?: %+ lien deps
7501− |= n=term
7502− =/ sc=(unit ischeme) (ienv-lookup n env)
7503− ?~ sc |
7504− ?=(^ (free-env-vars ~[[n u.sc]] sub))
7505− |
7506− %+ levy (scope-expr val.d)
7507− |= site=icap-site
7508− =/ id=(unit @ud) (icap-lookup name.site caps)
7509− ?~ id &
7510− ?=(~ (itype-vars (itype-normalize [%var u.id] sub)))
7511−::
7512−:: +infer-local-defs: infer a body's local values in dependency order
7513−::
7514−:: A definition that fails, or whose type is still pending, waits for
7515−:: the next pass, since it may refer to a sibling inferred later. When
7516−:: a pass makes no progress and no cyclic group applies, report the
7517−:: definite error of the earliest waiting definition, if no order of
7518−:: the siblings could change it; otherwise the message stays generic.
7519−::
7520−:: A failure counts only if it names its sites. The failure of a
7521−:: local that sees no shared variable (+closed-local) is its own. Any
7522−:: other failure counts only if no shared variable had moved when it
7523−:: was tried, and, when the body has shared variables, every other
7524−:: waiting definition also failed with sites: one that waits without
7525−:: them, on a checker limit, a pending tag or its own nested stall,
7526−:: might in another order, or once supported, constrain a shared
7527−:: variable and so let the failing local pass. When all of them failed
7528−:: with sites and none moved a shared variable, the state is the same
7529−:: in every order. With no shared variables, each local is inferred
7530−:: from generalized schemes alone.
7531−::
7532−:: A cyclic group's own errors are not kept. A definition that infers
7533−:: but is then unsupported reports that at once: a failure recorded
7534−:: earlier in the pass may still pass on a retry, once a sibling has
7535−:: constrained a shared variable.
7536−::
7537++ infer-local-defs
7232++ infer-local-defs
7538 |= [ds=(list def) env=ienv state=istate]
7233 |= [ds=(list def) env=ienv state=istate]
7539 ^- ilocal-result
7234 ^- ilocal-result
7540− =/ shared=(list [id=@ud typ=itype]) (shared-types env caps.state sub.state)
7541 =/ remaining=(list def) ~
7235 =/ remaining=(list def) ~
7542− =/ siblings=(list term) (global-value-names ds)
7543− =/ entry=isub sub.state
7544− :: this pass's failures with sites that are closed or were tried before
7545− :: any shared variable moved, newest first; and whether a definition
7546− :: waits without sites
7547− =/ failures=(list [diag=idiag closed=?]) ~
7548− =/ blocked=? |
7549 =/ progressed=? |
7236 =/ progressed=? |
7550 |-
7237 |-
7551 ?~ ds
7238 ?~ ds
@@ -7555,35 +7242,16 @@
7555 =/ groups=icomponents (graph-components pending (global-value-names pending))
7242 =/ groups=icomponents (graph-components pending (global-value-names pending))
7556 =/ grouped=(unit [rest=(list def) env=ienv state=istate])
7243 =/ grouped=(unit [rest=(list def) env=ienv state=istate])
7557 (try-local-group pending groups env state)
7244 (try-local-group pending groups env state)
7558− ?~ grouped
7559− =/ sure=(list [diag=idiag closed=?])
7560− ?: |(?=(~ shared) !blocked) failures
7561− (skim failures |=([diag=idiag closed=?] closed))
7562− ?^ sure [%| diag:(rear sure)]
7563− [%| ["local definitions need unsupported inference" ~]]
7245+ ?~ grouped [%| ["local definitions need unsupported inference" ~]]
7564− $(ds rest.u.grouped, remaining ~, failures ~, blocked |, env env.u.grouped, state state.u.grouped, progressed |)
7246+ $(ds rest.u.grouped, remaining ~, env env.u.grouped, state state.u.grouped, progressed |)
7565− $(ds (flop remaining), remaining ~, failures ~, blocked |, progressed |)
7247+ $(ds (flop remaining), remaining ~, progressed |)
7566 =/ d=def i.ds
7248 =/ d=def i.ds
7567 ?> ?=(%value -.d)
7249 ?> ?=(%value -.d)
7568 =/ local-state=istate (reserve-def-caps val.d state)
7250 =/ local-state=istate (reserve-def-caps val.d state)
7569− =/ plain=iresult (infer-fragment val.d env local-state)
7251+ =/ inferred=iresult (infer-fragment val.d env local-state)
7570− =/ inferred=iresult
7252+ =/ retried=? ?=(%| -.inferred)
7571− ?: ?=(%& -.plain) plain
7572− (infer-recursive-gate d env local-state)
7253+ =? inferred retried (infer-recursive-gate d env local-state)
7573− ?: ?=(%| -.inferred)
7574− :: For a value that is not a gate the retry only says so; keep the
7575− :: first failure unless the retry found a definite error.
7576− =/ failure=idiag
7577− ?: ?=(%& -.plain) p.inferred
7578− ?: (definite-diag p.inferred) p.inferred
7579− p.plain
7580− ?. (definite-diag failure) $(ds t.ds, remaining [d remaining], blocked &)
7581− =/ closed=? (closed-local d siblings env caps.state entry)
7582− =? failures |(closed !(shared-moved shared sub.state))
7583− [[failure closed] failures]
7584− $(ds t.ds, remaining [d remaining])
7254+ ?: ?=(%| -.inferred) $(ds t.ds, remaining [d remaining])
7585− :: Only the deferred transaction adds obligations, and it keeps no
7586− :: failure reason. Obligations from a local are a checker limit.
7587 ?: !=(obligations.state.p.inferred obligations.state) [%| ["deferred local definition needs unsupported inference" ~]]
7255 ?: !=(obligations.state.p.inferred obligations.state) [%| ["deferred local definition needs unsupported inference" ~]]
7588 =. state.p.inferred (promote-restricted-numbers state.p.inferred env)
7256 =. state.p.inferred (promote-restricted-numbers state.p.inferred env)
7589 =. state.p.inferred (default-hole-numbers holes.state.p.inferred holes.state state.p.inferred env !(itype-has-gate (itype-normalize typ.p.inferred sub.state.p.inferred)))
7257 =. state.p.inferred (default-hole-numbers holes.state.p.inferred holes.state state.p.inferred env !(itype-has-gate (itype-normalize typ.p.inferred sub.state.p.inferred)))
@@ -7597,9 +7265,9 @@
7597 [%| ["explicit capital constraints are not supported by partial inference" ~]]
7265 [%| ["explicit capital constraints are not supported by partial inference" ~]]
7598 =/ typ=itype (itype-normalize typ.p.inferred sub.state.p.inferred)
7266 =/ typ=itype (itype-normalize typ.p.inferred sub.state.p.inferred)
7599 ?: |((pending-tags tags.state.p.inferred sub.state.p.inferred) (itype-has-tag typ))
7267 ?: |((pending-tags tags.state.p.inferred sub.state.p.inferred) (itype-has-tag typ))
7600− $(ds t.ds, remaining [d remaining], blocked &)
7268+ $(ds t.ds, remaining [d remaining])
7601 ?: (unsupported-atom-vars typ caps.state.p.inferred binders.state.p.inferred sub.state.p.inferred)
7269 ?: (unsupported-atom-vars typ caps.state.p.inferred binders.state.p.inferred sub.state.p.inferred)
7602− $(ds t.ds, remaining [d remaining], blocked &)
7270+ $(ds t.ds, remaining [d remaining])
7603 =/ free=(list @ud)
7271 =/ free=(list @ud)
7604 (weld (free-env-vars env sub.state.p.inferred) (free-cap-vars caps.state sub.state.p.inferred))
7272 (weld (free-env-vars env sub.state.p.inferred) (free-cap-vars caps.state sub.state.p.inferred))
7605 =/ vars=(list @ud) (unique-type-vars (itype-vars typ))
7273 =/ vars=(list @ud) (unique-type-vars (itype-vars typ))
@@ -7809,12 +7477,7 @@
7809 =/ target=itype (itype-walk expected sub.state)
7477 =/ target=itype (itype-walk expected sub.state)
7810 =/ value=iresult (infer-call-context-arg i.items target env state context)
7478 =/ value=iresult (infer-call-context-arg i.items target env state context)
7811 ?: ?=(%| -.value) value
7479 ?: ?=(%| -.value) value
7812− =/ ordinary-fit=ifit (itype-fit typ.p.value target sub.state.p.value next.state.p.value)
7480+ =/ fit=ifit (itype-fit typ.p.value target sub.state.p.value next.state.p.value)
7813− =/ fit=ifit
7814− ?: ?=(%ok -.ordinary-fit) ordinary-fit
7815− ?: ?&(?=(%union -.target) ?=(^ prelude.state) =(origin.target `[at.u.prelude.state %element]))
7816− (program-single-generic-fit typ.p.value target sub.state.p.value next.state.p.value)
7817− ordinary-fit
7818 ?: ?=(%unknown -.fit) [%| ["list item constraint is not supported by partial inference" ~]]
7481 ?: ?=(%unknown -.fit) [%| ["list item constraint is not supported by partial inference" ~]]
7819 ?: ?=(%bad -.fit)
7482 ?: ?=(%bad -.fit)
7820 ?: |((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))
7483 ?: |((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))
@@ -7831,12 +7494,7 @@
7831 =/ target=itype (itype-walk expected sub.state)
7494 =/ target=itype (itype-walk expected sub.state)
7832 =/ value=iresult (infer-call-context-arg i.items target env state context)
7495 =/ value=iresult (infer-call-context-arg i.items target env state context)
7833 ?: ?=(%| -.value) value
7496 ?: ?=(%| -.value) value
7834− =/ ordinary-fit=ifit (itype-fit typ.p.value target sub.state.p.value next.state.p.value)
7497+ =/ fit=ifit (itype-fit typ.p.value target sub.state.p.value next.state.p.value)
7835− =/ fit=ifit
7836− ?: ?=(%ok -.ordinary-fit) ordinary-fit
7837− ?: ?&(?=(%union -.target) ?=(^ prelude.state) =(origin.target `[at.u.prelude.state %element]))
7838− (program-single-generic-fit typ.p.value target sub.state.p.value next.state.p.value)
7839− ordinary-fit
7840 ?: ?=(%unknown -.fit) [%| ["list item constraint is not supported by partial inference" ~]]
7498 ?: ?=(%unknown -.fit) [%| ["list item constraint is not supported by partial inference" ~]]
7841 ?: ?=(%bad -.fit)
7499 ?: ?=(%bad -.fit)
7842 =/ missing=(unit idiag) (missing-union-tag i.items target sub.state.p.value context)
7500 =/ missing=(unit idiag) (missing-union-tag i.items target sub.state.p.value context)
@@ -8704,8 +8362,8 @@
8704 %duration [%& [%atom %dr] state]
8362 %duration [%& [%atom %dr] state]
8705 %knot [%& [%atom %ta] state]
8363 %knot [%& [%atom %ta] state]
8706 %loobean [%& [%flag ~] state]
8364 %loobean [%& [%flag ~] state]
8707− %term [%& [%tag next.state lit.e |] state(next +(next.state), tags [[next.state lit.e at.e] tags.state])]
8365+ %term [%& [%tag next.state lit.e |] state(next +(next.state), tags [[next.state lit.e] tags.state])]
8708− %null [%& [%tag next.state lit.e |] state(next +(next.state), tags [[next.state lit.e at.e] tags.state])]
8366+ %null [%& [%tag next.state lit.e |] state(next +(next.state), tags [[next.state lit.e] tags.state])]
8709 ==
8367 ==
8710 %unit
8368 %unit
8711 ?~ prelude.state [%| ["unit construction needs the standard prelude in partial inference" ~]]
8369 ?~ prelude.state [%| ["unit construction needs the standard prelude in partial inference" ~]]
@@ -8772,15 +8430,12 @@
8772 =/ target=iresult $(e [%wing at.e target.e])
8430 =/ target=iresult $(e [%wing at.e target.e])
8773 ?: ?=(%| -.target) target
8431 ?: ?=(%| -.target) target
8774 (infer-change-edits edits.e typ.p.target env state.p.target ~)
8432 (infer-change-edits edits.e typ.p.target env state.p.target ~)
8775− %ctor [%& [%tag next.state tag.e &] state(next +(next.state), tags [[next.state tag.e at.e] tags.state])]
8433+ %ctor [%& [%tag next.state tag.e &] state(next +(next.state), tags [[next.state tag.e] tags.state])]
8776 %trace
8434 %trace
8777 =/ traced=iresult $(e val.e)
8435 =/ traced=iresult $(e val.e)
8778 ?: ?=(%| -.traced) traced
8436 ?: ?=(%| -.traced) traced
8779 $(e then.e, state state.p.traced)
8437 $(e then.e, state state.p.traced)
8780− %tuple
8781− ?: &(?=(^ defer.state) ?=(^ prelude.state))
8782− (dg-infer-tuple-items items.e env state)
8783− (infer-simple-items items.e env state)
8438+ %tuple (infer-simple-items items.e env state)
8784 %body
8439 %body
8785 ?~ defs.e $(e final.e)
8440 ?~ defs.e $(e final.e)
8786 =/ local-names=(list term) (global-value-names defs.e)
8441 =/ local-names=(list term) (global-value-names defs.e)
@@ -9304,17 +8959,7 @@
9304 ?~ args.result |
8959 ?~ args.result |
9305 ?. =((lent args.result) (lent args.expected)) |
8960 ?. =((lent args.result) (lent args.expected)) |
9306 ?: |((itype-has-tag (itype-normalize result sub.state.p.head)) (itype-has-tag (itype-normalize expected sub.state.p.head))) |
8961 ?: |((itype-has-tag (itype-normalize result sub.state.p.head)) (itype-has-tag (itype-normalize expected sub.state.p.head))) |
9307− =/ result-recursive=? (itype-has-recursive (itype-normalize result sub.state.p.head))
9308− =/ expected-recursive=? (itype-has-recursive (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))) |
9309− =/ result-ok=?
9310− ?. result-recursive &
9311− ?~ prelude.state |
9312− &(=(at.u.prelude.state /lib/jibb/prelude/jibb) =(origin.result `[at.u.prelude.state %element]))
9313− =/ expected-ok=?
9314− ?. expected-recursive &
9315− ?~ prelude.state |
9316− &(=(at.u.prelude.state /lib/jibb/prelude/jibb) =(origin.expected `[at.u.prelude.state %element]))
9317− ?. &(result-ok expected-ok) |
9318 ?: |((itype-has-any-atom result sub.state.p.head) (itype-has-any-atom expected sub.state.p.head)) |
8963 ?: |((itype-has-any-atom result sub.state.p.head) (itype-has-any-atom expected sub.state.p.head)) |
9319 &
8964 &
9320 ?. eligible (infer-call-with-head e env state head)
8965 ?. eligible (infer-call-with-head e env state head)
@@ -9596,8 +9241,6 @@
9596 |= [e=expr expected=itype env=ienv state=istate context=span]
9241 |= [e=expr expected=itype env=ienv state=istate context=span]
9597 ^- iresult
9242 ^- iresult
9598 ?: &(?=(^ defer.state) ?=(%branch -.e)) (infer-fragment e env state)
9243 ?: &(?=(^ defer.state) ?=(%branch -.e)) (infer-fragment e env state)
9599− ?: &(?=(^ defer.state) ?=(^ prelude.state) ?=(%tuple -.e))
9600− (infer-fragment e env state)
9601 ?: ?=(%pair -.e) $(e (pair-as-cell e))
9244 ?: ?=(%pair -.e) $(e (pair-as-cell e))
9602 ?: ?=(%group -.e) $(e inner.e)
9245 ?: ?=(%group -.e) $(e inner.e)
9603 ?: &(?=(%body -.e) ?=(~ defs.e)) $(e final.e)
9246 ?: &(?=(%body -.e) ?=(~ defs.e)) $(e final.e)
@@ -9866,9 +9509,6 @@
9866 %var
9509 %var
9867 ?: (lth id.t 26) [(add 65 id.t) ~]
9510 ?: (lth id.t 26) [(add 65 id.t) ~]
9868 "T{<id.t>}"
9511 "T{<id.t>}"
9869− %fvar
9870− ?: (lth id.t 26) [(add 65 id.t) ~]
9871− "T{<id.t>}"
9872 %avar
9512 %avar
9873 ?: (lth id.t 26) [(add 65 id.t) ~]
9513 ?: (lth id.t 26) [(add 65 id.t) ~]
9874 "T{<id.t>}"
9514 "T{<id.t>}"
@@ -9932,7 +9572,6 @@
9932 %nvar &
9572 %nvar &
9933 %rnvar &
9573 %rnvar &
9934 %var |
9574 %var |
9935− %fvar |
9936 %avar |
9575 %avar |
9937 %rvar |
9576 %rvar |
9938 %atom |
9577 %atom |
@@ -9956,7 +9595,7 @@
9956 |= [label=tape typ=itype sub=isub]
9595 |= [label=tape typ=itype sub=isub]
9957 ^- tape
9596 ^- tape
9958 =/ normalized=itype (itype-normalize typ sub)
9597 =/ normalized=itype (itype-normalize typ sub)
9959− ?: |(?=(%var -.normalized) ?=(%fvar -.normalized) ?=(%avar -.normalized) ?=(%rvar -.normalized) (itype-has-nvar normalized) (itype-has-tag normalized) (itype-has-union normalized)) label
9598+ ?: |(?=(%var -.normalized) ?=(%avar -.normalized) ?=(%rvar -.normalized) (itype-has-nvar normalized) (itype-has-tag normalized) (itype-has-union normalized)) label
9960 ?: (itype-has-hidden-recursive normalized) label
9599 ?: (itype-has-hidden-recursive normalized) label
9961 =/ vars=(list @ud) (unique-type-vars (itype-vars normalized))
9600 =/ vars=(list @ud) (unique-type-vars (itype-vars normalized))
9962 ?: (gth (lent vars) 26) label
9601 ?: (gth (lent vars) 26) label
@@ -9977,7 +9616,6 @@
9977 =/ ident=(unit @ud)
9616 =/ ident=(unit @ud)
9978 ?+ -.resolved ~
9617 ?+ -.resolved ~
9979 %var `id.resolved
9618 %var `id.resolved
9980− %fvar `id.resolved
9981 %avar `id.resolved
9619 %avar `id.resolved
9982 %rvar `id.resolved
9620 %rvar `id.resolved
9983 ==
9621 ==
@@ -9993,7 +9631,6 @@
9993 =/ ident=(unit @ud)
9631 =/ ident=(unit @ud)
9994 ?+ -.resolved ~
9632 ?+ -.resolved ~
9995 %var `id.resolved
9633 %var `id.resolved
9996− %fvar `id.resolved
9997 %avar `id.resolved
9634 %avar `id.resolved
9998 %rvar `id.resolved
9635 %rvar `id.resolved
9999 ==
9636 ==
@@ -10009,7 +9646,6 @@
10009 =/ ident=(unit @ud)
9646 =/ ident=(unit @ud)
10010 ?+ -.resolved ~
9647 ?+ -.resolved ~
10011 %var `id.resolved
9648 %var `id.resolved
10012− %fvar `id.resolved
10013 %avar `id.resolved
9649 %avar `id.resolved
10014 %rvar `id.resolved
9650 %rvar `id.resolved
10015 ==
9651 ==
@@ -10026,7 +9662,6 @@
10026 =/ ident=(unit @ud)
9662 =/ ident=(unit @ud)
10027 ?+ -.resolved ~
9663 ?+ -.resolved ~
10028 %var `id.resolved
9664 %var `id.resolved
10029− %fvar `id.resolved
10030 %avar `id.resolved
9665 %avar `id.resolved
10031 %rvar `id.resolved
9666 %rvar `id.resolved
10032 ==
9667 ==
@@ -10053,7 +9688,6 @@
10053 ^- ?
9688 ^- ?
10054 ?- -.t
9689 ?- -.t
10055 %var |
9690 %var |
10056− %fvar |
10057 %avar =(n id.t)
9691 %avar =(n id.t)
10058 %rvar =(n id.t)
9692 %rvar =(n id.t)
10059 %nvar |
9693 %nvar |
@@ -10116,10 +9750,6 @@
10116 =/ sep=tape ?:(printed ", " " where ")
9750 =/ sep=tape ?:(printed ", " " where ")
10117 =/ clause=tape "{sep}{(show-itype [%avar i.vars] ~)} is an atom"
9751 =/ clause=tape "{sep}{(show-itype [%avar i.vars] ~)} is an atom"
10118 $(vars t.vars, printed &, out (weld out clause))
9752 $(vars t.vars, printed &, out (weld out clause))
10119− ?: (itype-var-is-gate-free i.vars t)
10120− =/ sep=tape ?:(printed ", " " where ")
10121− =/ clause=tape "{sep}{(show-itype [%fvar i.vars] ~)} contains no gates"
10122− $(vars t.vars, printed &, out (weld out clause))
10123 $(vars t.vars)
9753 $(vars t.vars)
10124::
9754::
10125:: Build the supported part of the value environment in dependency order.
9755:: Build the supported part of the value environment in dependency order.
@@ -10480,6 +10110,11 @@
10480 =. entry entry(source src, target dst)
10110 =. entry entry(source src, target dst)
10481 `[entry u.rest]
10111 `[entry u.rest]
10482::
10112::
10113+++ add-supported-defs
10114+ |= [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)]
10115+ ^- [env=ienv artifacts=(list iwidth-definition)]
10116+ (add-supported-defs-core ds all-defs checked heads env molds globals externals surs mark-externals marks jimports reserved-molds at prelude artifacts ~)
10117+::
10483
10118
10484+$ iresolved [env=ienv grouped=(list term) artifacts=(list iwidth-definition)]
10119+$ iresolved [env=ienv grouped=(list term) artifacts=(list iwidth-definition)]
10485+$ iadj (map term (list term))
10120+$ iadj (map term (list term))
@@ -10597,31 +10232,8 @@
10597 (resolve-groups-core ds molds globals externals surs mark-externals marks jimports reserved-molds at prelude ~)
10232 (resolve-groups-core ds molds globals externals surs mark-externals marks jimports reserved-molds at prelude ~)
10598::
10233::
10599
10234
10600−+$ iadded-definition
10601− [env=ienv checked=(map term def) artifacts=(list iwidth-definition)]
10602−++ add-supported-result
10603− |= [d=def result=iresult initial=istate env=ienv checked=(map term def) artifacts=(list iwidth-definition)]
10604− ^- (unit iadded-definition)
10605− ?> ?=(%value -.d)
10606− ?: ?=(%| -.result) ~
10607− =. state.p.result (promote-restricted-numbers state.p.result env)
10608− =. 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)))
10609− ?^ (unresolved-hole holes.state.p.result holes.initial state.p.result) ~
10610− ?: (constrained-capitals caps.state.p.result sub.state.p.result) ~
10611− =/ typ=itype (default-decimals (itype-normalize typ.p.result sub.state.p.result))
10612− ?: |((pending-tags tags.state.p.result sub.state.p.result) (itype-has-tag typ)) ~
10613− ?: (unsupported-atom-vars typ caps.state.p.result binders.state.p.result sub.state.p.result) ~
10614− =/ vars=(list @ud) (unique-type-vars (itype-vars typ))
10615− ?: (gth (lent vars) 26) ~
10616− =/ finalized=(unit (list iwprojection))
10617− (width-finalize projections.state.p.result sub.state.p.result vars)
10618− ?~ finalized ~
10619− =? artifacts ?=(^ u.finalized)
10620− [[name.d val.d typ sub.state.p.result (flop u.finalized)] artifacts]
10621− =? checked |(?=(%gate -.val.d) ?=(%gate-wide -.val.d)) (~(put by checked) name.d d)
10622− `[[[name.d [typ vars]] env] checked artifacts]
10623++ add-supported-defs-core
10235++ add-supported-defs-core
10624− |= [ds=(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)])]
10236+ |= [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)])]
10625 ^- [env=ienv artifacts=(list iwidth-definition)]
10237 ^- [env=ienv artifacts=(list iwidth-definition)]
10626 ?~ ds [env artifacts]
10238 ?~ ds [env artifacts]
10627 =/ d=def i.ds
10239 =/ d=def i.ds
@@ -10636,35 +10248,23 @@
10636 =. initial (reserve-def-caps val.d initial)
10248 =. initial (reserve-def-caps val.d initial)
10637 =/ result=iresult (infer-fragment val.d env initial)
10249 =/ result=iresult (infer-fragment val.d env initial)
10638 =? result ?=(%| -.result) (infer-recursive-gate d env initial)
10250 =? result ?=(%| -.result) (infer-recursive-gate d env initial)
10639− =/ added=(unit iadded-definition)
10251+ ?: ?=(%| -.result) $(ds t.ds)
10640− (add-supported-result d result initial env checked artifacts)
10252+ =. state.p.result (promote-restricted-numbers state.p.result env)
10641− ?~ added $(ds t.ds)
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)))
10642− $(ds t.ds, env env.u.added, checked checked.u.added, artifacts artifacts.u.added)
10254+ ?^ (unresolved-hole holes.state.p.result holes.initial state.p.result) $(ds t.ds)
10643−::
10255+ ?: (constrained-capitals caps.state.p.result sub.state.p.result) $(ds t.ds)
10644−:: Full checking discards unsupported definitions. On that failure path only,
10256+ =/ typ=itype (default-decimals (itype-normalize typ.p.result sub.state.p.result))
10645−:: retry a bounded number of missing definitions to explain a pending tag
10257+ ?: |((pending-tags tags.state.p.result sub.state.p.result) (itype-has-tag typ)) $(ds t.ds)
10646−:: from the same ordinary inference state instead of hiding it behind the
10258+ ?: (unsupported-atom-vars typ caps.state.p.result binders.state.p.result sub.state.p.result) $(ds t.ds)
10647−:: generic completeness error. No successful definition takes this path.
10259+ =/ vars=(list @ud) (unique-type-vars (itype-vars typ))
10648−++ module-pending-tag
10260+ ?: (gth (lent vars) 26) $(ds t.ds)
10649− |= [ds=(list def) env=ienv base=istate fuel=@ud]
10261+ =/ finalized=(unit (list iwprojection))
10650− ^- (unit [at=span msg=tape])
10262+ (width-finalize projections.state.p.result sub.state.p.result vars)
10651− =/ checked=(map term def) (direct-checked-gates ds env)
10263+ ?~ finalized $(ds t.ds)
10652− =/ heads=(unit igate-prelude-evidence) (direct-prelude-evidence ds prelude.base)
10264+ =? artifacts ?=(^ u.finalized)
10653− |-
10265+ [[name.d val.d typ sub.state.p.result (flop u.finalized)] artifacts]
10654− ?~ ds ~
10266+ =? checked |(?=(%gate -.val.d) ?=(%gate-wide -.val.d)) (~(put by checked) name.d d)
10655− ?: =(0 fuel) ~
10267+ $(ds t.ds, env [[name.d [typ vars]] env], checked checked)
10656− =/ d=def i.ds
10657− ?: ?=(%mold -.d) $(ds t.ds, fuel (dec fuel))
10658− ?^ (ienv-lookup name.d env) $(ds t.ds, fuel (dec fuel))
10659− =/ initial=istate base(gate-defs checked, head-evidence heads)
10660− =. initial (reserve-def-caps val.d initial)
10661− =/ result=iresult (infer-fragment val.d env initial)
10662− =? result ?=(%| -.result) (infer-recursive-gate d env initial)
10663− ?: ?=(%| -.result) $(ds t.ds, fuel (dec fuel))
10664− =/ pending=(unit [at=span msg=tape])
10665− (pending-tag-diagnostic tags.state.p.result sub.state.p.result)
10666− ?^ pending pending
10667− $(ds t.ds, fuel (dec fuel))
10668::
10268::
10669++ resolve-groups-core
10269++ resolve-groups-core
10670 |= [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)])]
10270 |= [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)])]
@@ -10680,7 +10280,7 @@
10680 =/ heads=(unit igate-prelude-evidence) (direct-prelude-evidence ds prelude)
10280 =/ heads=(unit igate-prelude-evidence) (direct-prelude-evidence ds prelude)
10681 |-
10281 |-
10682 =/ next=[env=ienv artifacts=(list iwidth-definition)]
10282 =/ next=[env=ienv artifacts=(list iwidth-definition)]
10683− (add-supported-defs-core ds (direct-checked-gates ds env) heads env molds globals externals surs mark-externals marks jimports reserved-molds at prelude artifacts index)
10283+ (add-supported-defs-core ds ds (direct-checked-gates ds env) heads env molds globals externals surs mark-externals marks jimports reserved-molds at prelude artifacts index)
10684 =/ initial=istate [0 ~ ~ ~ molds globals externals surs mark-externals marks jimports reserved-molds ~ ~ ~ | at top prelude ~ 256 ~ ~ ~ ~ ~ ~]
10284 =/ initial=istate [0 ~ ~ ~ molds globals externals surs mark-externals marks jimports reserved-molds ~ ~ ~ | at top prelude ~ 256 ~ ~ ~ ~ ~ ~]
10685 =. grec-index.initial index
10285 =. grec-index.initial index
10686 =/ out=iresolved (add-groups ds components graph env.next grouped artifacts.next initial)
10286 =/ out=iresolved (add-groups ds components graph env.next grouped artifacts.next initial)
@@ -11046,7 +10646,7 @@
11046++ union-state-leaf
10646++ union-state-leaf
11047 |= t=itype
10647 |= t=itype
11048 ^- ?
10648 ^- ?
11049− ?=(?(%var %fvar %avar %rvar %nvar %rnvar %atom %any-atom %flag %noun %empty %const) -.t)
10649+ ?=(?(%var %avar %rvar %nvar %rnvar %atom %any-atom %flag %noun %empty %const) -.t)
11050++ union-state-params-budget
10650++ union-state-params-budget
11051 |= [params=iparams fuel=@ud]
10651 |= [params=iparams fuel=@ud]
11052 ^- (unit @ud)
10652 ^- (unit @ud)
@@ -11195,22 +10795,6 @@
11195 [at.first at.second (union-relate a (project-union-mold second molds ~))]
10795 [at.first at.second (union-relate a (project-union-mold second molds ~))]
11196 (weld pairs $(cases t.cases))
10796 (weld pairs $(cases t.cases))
11197::
10797::
11198−:: The partial report and the full module check share one overlap proof,
11199−:: so for the same union both name the same pair. The caller passes the
11200−:: projected .pairs, which the partial report reads again. The projection
11201−:: proves atoms, flags and nested literal cells, and its first overlap is
11202−:: named even when the source slice would prove an earlier pair. The
11203−:: source slice is tried only when some pair is unknown, for its one-hop
11204−:: generic applications. A missing witness does not mean the cases are
11205−:: disjoint.
11206−++ mold-overlap-witness
11207− |= [cases=(list shape) pairs=(list upair) molds=imolds]
11208− ^- (unit upair)
11209− =/ overlapping=(list upair) (skim pairs |=(p=upair =(%overlap relation.p)))
11210− ?^ overlapping `i.overlapping
11211− ?. (lien pairs |=(p=upair =(%unknown relation.p))) ~
11212− (union-source-overlap cases molds 256)
11213−::
11214:: A closed structural mold supplies no equation to determine a hole.
10798:: A closed structural mold supplies no equation to determine a hole.
11215:: Applications, references, unbound capitals and unions are unproved.
10799:: Applications, references, unbound capitals and unions are unproved.
11216++ simple-mold-hole
10800++ simple-mold-hole
@@ -11350,9 +10934,14 @@
11350 =? sh ?=(%generic -.sh) body.sh
10934 =? sh ?=(%generic -.sh) body.sh
11351 ?. ?=(%union -.sh) (crip "+$ {(trip name.d)}: not checked")
10935 ?. ?=(%union -.sh) (crip "+$ {(trip name.d)}: not checked")
11352 =/ pairs=(list upair) (union-pairs cases.sh molds)
10936 =/ pairs=(list upair) (union-pairs cases.sh molds)
10937+ =/ overlapping=(list upair) (skim pairs |=(p=upair =(%overlap relation.p)))
10938+ =. overlapping
10939+ ?^ overlapping overlapping
10940+ ?. (lien pairs |=(p=upair =(%unknown relation.p))) ~
11353− =/ witness=(unit upair) (mold-overlap-witness cases.sh pairs molds)
10941+ =/ witness=(unit upair) (union-source-overlap cases.sh molds 256)
11354− ?^ witness
11355− =/ p=upair u.witness
10942+ ?~(witness ~ ~[u.witness])
10943+ ?^ overlapping
10944+ =/ p=upair i.overlapping
11356 =/ summary=@t (crip "+$ {(trip name.d)}: overlapping cases; mold not checked")
10945 =/ summary=@t (crip "+$ {(trip name.d)}: overlapping cases; mold not checked")
11357 =/ first=@t (show-error src [file line.beg.first.p col.beg.first.p "first union case"])
10946 =/ first=@t (show-error src [file line.beg.first.p col.beg.first.p "first union case"])
11358 =/ second=@t (show-error src [file line.beg.second.p col.beg.second.p "overlapping case"])
10947 =/ second=@t (show-error src [file line.beg.second.p col.beg.second.p "overlapping case"])
@@ -11376,7 +10965,6 @@
11376 (of-wain:format [summary excerpts])
10965 (of-wain:format [summary excerpts])
11377::
10966::
11378:: Both written field sites are shown in the source that declares them.
10967:: Both written field sites are shown in the source that declares them.
11379−:: A store's derived-name clash shows its two sites the same way.
11380++ show-duplicate-fields
10968++ show-duplicate-fields
11381 |= [file=path src=@t diagnostic=idiag]
10969 |= [file=path src=@t diagnostic=idiag]
11382 ^- @t
10970 ^- @t
@@ -11418,14 +11006,7 @@
11418+$ jbundle (list jsource)
11006+$ jbundle (list jsource)
11419+$ jcache (list [at=path iface=ifile])
11007+$ jcache (list [at=path iface=ifile])
11420+$ jfile-result (each [iface=ifile cache=jcache] @t)
11008+$ jfile-result (each [iface=ifile cache=jcache] @t)
11421−:: Overlap evidence retains the exact source that supplied its spans.
11422−:: Ordinary Jibb imports preserve this evidence through the resolver.
11423−+$ jfile-overlap [file=path source=@t name=term cases=upair]
11424−+$ jfile-failure [message=@t overlap=(unit jfile-overlap)]
11425−+$ jfile-detailed-result (each [iface=ifile cache=jcache] jfile-failure)
11426+$ jimports-result (each [resolved=ijimports cache=jcache] @t)
11009+$ jimports-result (each [resolved=ijimports cache=jcache] @t)
11427−:: Preserve an imported overlap's original file and source across the graph.
11428−+$ jimports-detailed-result (each [resolved=ijimports cache=jcache] jfile-failure)
11429::
11010::
11430:: Written record fields each have their own lexical record scope.
11011:: Written record fields each have their own lexical record scope.
11431+$ written-fields (map term span)
11012+$ written-fields (map term span)
@@ -11682,44 +11263,22 @@
11682 ?. (levy vals |=(n=term &((unique-value-name n vals) !(lien prelude-values |=(v=term =(n v)))))) |
11263 ?. (levy vals |=(n=term &((unique-value-name n vals) !(lien prelude-values |=(v=term =(n v)))))) |
11683 (levy mold-names |=(n=term &((unique-value-name n mold-names) !(lien prelude-molds |=(m=term =(n m))))))
11264 (levy mold-names |=(n=term &((unique-value-name n mold-names) !(lien prelude-molds |=(m=term =(n m))))))
11684::
11265::
11685−:: A detailed failure is attached only to the first mold that actually
11266+:: In an API file or before main's kind is known, a lone `+$ poke`
11686−:: failed in this check, using that module's checked source mold table.
11267+:: may be a declaration rather than a mold that shadows the prelude. Do not call
11687−+$ imold-failure [message=@t overlap=(unit [name=term cases=upair])]
11268+:: that one collision definite, and do not hide unrelated scope errors.
11688−:: Validate a generic wrapper without an unbounded duplicate-name pass.
11269+++ pending-declared-poke
11689−++ module-mold-params-valid
11270+ |= [at=path mod=module prelude-values=(list term) prelude-molds=(list term)]
11690− |= [vars=(list @t) seen=(set @t) fuel=@ud]
11691 ^- ?
11271 ^- ?
11692− ?~ vars &
11272+ ?. (lien prelude-molds |=(n=term =(%poke n))) |
11693− ?: =(0 fuel) |
11273+ ?. |(?=([%ui %api @ %jibb ~] at) (lien defs.mod |=(d=def &(?=(%value -.d) =(%main name.d))))) |
11694− ?: (~(has in:..zuse seen) i.vars) |
11274+ =/ pokes=(list def)
11695− $(vars t.vars, seen (~(put in:..zuse seen) i.vars), fuel (dec fuel))
11275+ (skim defs.mod |=(d=def &(?=(%mold -.d) =(%poke name.d))))
11696−++ module-mold-overlap
11276+ ?~ pokes |
11697− |= [m=[name=term body=shape] molds=imolds]
11277+ ?^ t.pokes |
11698− ^- (unit upair)
11278+ =/ remaining=(list def)
11699− =/ sh=shape body.m
11279+ (skim defs.mod |=(d=def !&(?=(%mold -.d) =(%poke name.d))))
11700− =/ valid=?
11280+ (module-scope-valid mod(defs remaining) prelude-values prelude-molds)
11701− ?. ?=(%generic -.sh) &
11281+::
11702− ?~ vars.sh |
11703− (module-mold-params-valid vars.sh *(set @t) 256)
11704− ?. valid ~
11705− =? sh ?=(%generic -.sh) body.sh
11706− ?. ?=(%union -.sh) ~
11707− :: A failed inference keeps no projection, so it is computed once more.
11708− (mold-overlap-witness cases.sh (union-pairs cases.sh molds) molds)
11709−++ module-mold-types-detail
11710− |= [molds=imolds state=istate]
11711− ^- (each imold-types imold-failure)
11712− ?~ molds [%& ~]
11713− =/ m=[name=term body=shape] i.molds
11714− =/ t=(unit [template=ischeme state=istate])
11715− (infer-mold-template body.m state(active [name.m active.state], in-mold &))
11716− ?~ t
11717− =/ overlap=(unit upair) (module-mold-overlap m molds.state)
11718− [%| ['module mold needs unsupported inference' ?~(overlap ~ `[name.m u.overlap])]]
11719− =. typ.template.u.t (label-direct-union typ.template.u.t body.m name.m state)
11720− =/ rest=(each imold-types imold-failure) $(molds t.molds)
11721− ?: ?=(%| -.rest) rest
11722− [%& [[name.m template.u.t] p.rest]]
11723++ module-mold-types
11282++ module-mold-types
11724 |= [molds=imolds state=istate]
11283 |= [molds=imolds state=istate]
11725 ^- (each imold-types @t)
11284 ^- (each imold-types @t)
@@ -11777,38 +11336,9 @@
11777 ?. ?=(%tvar -.i.args.tail) |
11336 ?. ?=(%tvar -.i.args.tail) |
11778 =(var name.i.args.tail)
11337 =(var name.i.args.tail)
11779::
11338::
11780−++ prelude-public-label
11781− |= label=@t
11782− ^- (unit @t)
11783− ?: =(label 'ask.internal') `'ask'
11784− ?: =(label 'qath.internal') `'qath'
11785− ?: =(label 'raw-poke.internal') `'raw-poke'
11786− `label
11787−::
11788−++ prelude-label-nested
11789− |= typ=itype
11790− ^- itype
11791− ?- -.typ
11792− %union
11793− =/ label=(unit @t) ?~(label.typ ~ (prelude-public-label u.label.typ))
11794− [%union (turn cases.typ |=(c=itype (prelude-label-nested c))) origin.typ label (turn args.typ |=(c=itype (prelude-label-nested c)))]
11795− %grec
11796− =/ label=(unit @t) ?~(label.typ ~ (prelude-public-label u.label.typ))
11797− typ(label label, args (turn args.typ |=(c=itype (prelude-label-nested c))))
11798− %jrec
11799− =/ label=(unit @t) ?~(label.typ ~ (prelude-public-label u.label.typ))
11800− typ(label label)
11801− %collection [%collection name.typ (turn args.typ |=(c=itype (prelude-label-nested c)))]
11802− %face [%face name.typ $(typ body.typ)]
11803− %fn [%fn $(typ sample.typ) $(typ product.typ)]
11804− %cell [%cell $(typ hed.typ) $(typ tal.typ)]
11805− * typ
11806− ==
11807−::
11808++ prelude-label
11339++ prelude-label
11809 |= [typ=itype name=term vars=(list @ud)]
11340 |= [typ=itype name=term vars=(list @ud)]
11810 ^- itype
11341 ^- itype
11811− =. typ (prelude-label-nested typ)
11812 ?: ?=(%jrec -.typ) typ(label `name)
11342 ?: ?=(%jrec -.typ) typ(label `name)
11813 ?: ?=(%grec -.typ)
11343 ?: ?=(%grec -.typ)
11814 ?. (identity-union-parameters vars args.typ) typ(label ~)
11344 ?. (identity-union-parameters vars args.typ) typ(label ~)
@@ -11845,14 +11375,7 @@
11845 =/ plus=ischeme [[%fn [%cell b b] b] ~[0]]
11375 =/ plus=ischeme [[%fn [%cell b b] b] ~[0]]
11846 =/ minus=ischeme [[%fn b b] ~[0]]
11376 =/ minus=ischeme [[%fn b b] ~[0]]
11847 =/ greater=ischeme [[%fn pair [%flag ~]] ~[0]]
11377 =/ greater=ischeme [[%fn pair [%flag ~]] ~[0]]
11848− =/ free=itype [%fvar 0]
11849− =/ equal=ischeme [[%fn [%cell free free] [%flag ~]] ~[0]]
11850− =/ utf8=itype [%atom 'tD']
11851− =/ tape=itype [%collection %list ~[utf8]]
11852− =/ codepoints=itype [%collection %list ~[[%atom %c]]]
11853− =/ text-trip=ischeme [[%fn [%atom %t] tape] ~]
11854− =/ text-tuba=ischeme [[%fn tape codepoints] ~]
11855− [~[[%raw-add plus] [%raw-dec minus] [%raw-gth greater] [%raw-eq equal] [%raw-trip text-trip] [%raw-tuba text-tuba]] ~ /lib/jibb/primitives/jibb ~ ~ ~ ~ ~]
11378+ [~[[%raw-add plus] [%raw-dec minus] [%raw-gth greater]] ~ /lib/jibb/primitives/jibb ~ ~ ~ ~ ~]
11856::
11379::
11857++ infer-private-internal
11380++ infer-private-internal
11858 |= [src=@t public-source=@t]
11381 |= [src=@t public-source=@t]
@@ -12029,74 +11552,6 @@
12029 ?~ (ienv-lookup name.i.ds env) |
11552 ?~ (ienv-lookup name.i.ds env) |
12030 $(ds t.ds)
11553 $(ds t.ds)
12031::
11554::
12032−:: Names the value a failed full check stops at, for its message only. A
12033−:: value whose module dependencies all resolved failed on its own, so the
12034−:: first such missing value is named. Otherwise every missing value waits
12035−:: on another, so following the first one each waits on, from the first
12036−:: missing value, reaches a value twice, which is named. The walk is over
12037−:: the syntactic dependency graph: dependency-expr ignores binders, so a
12038−:: sample or other local binder with a top-level value's name reads as a
12039−:: dependency on it. The named value is on a cycle of that graph, but may
12040−:: only call into the value that failed, as when a binder in that value
12041−:: shadows the named one. It claims no error in the named value.
12042−++ module-missing-value
12043− |= [ds=(list def) env=ienv]
12044− ^- (unit term)
12045− =/ missing=(list term)
12046− %+ murn ds
12047− |= d=def
12048− ?. ?=(%value -.d) ~
12049− ?^ (ienv-lookup name.d env) ~
12050− `name.d
12051− ?~ missing ~
12052− =/ pending=ivisited (graph-nameset missing ~)
12053− =/ roots=(list term)
12054− %+ murn ds
12055− |= d=def
12056− ?. ?=(%value -.d) ~
12057− ?~ (~(get by pending) name.d) ~
12058− =/ deps=(list term) (dependency-expr val.d)
12059− ?. (levy deps |=(n=term |(=(n name.d) ?=(~ (~(get by pending) n))))) ~
12060− `name.d
12061− ?^ roots `i.roots
12062− =/ seen=ivisited ~
12063− =/ here=term i.missing
12064− |-
12065− ?^ (~(get by seen) here) `here
12066− =/ next=(list term)
12067− %- zing
12068− %+ turn ds
12069− |= d=def
12070− ?. ?=(%value -.d) ~
12071− ?. =(here name.d) ~
12072− (skim (dependency-expr val.d) |=(n=term &(!=(n here) ?=(^ (~(get by pending) n)))))
12073− ?~ next `here
12074− $(seen (~(put by seen) here &), here i.next)
12075−::
12076−:: Finds the first missing value that is a gate whose own sample has the
12077−:: name of a value in scope. Partial inference rejects that sample ("sample
12078−:: shadows a name"), and it is an error (grammar, Modules). Mark names name
12079−:: molds and are left out, as are cell samples and binders deeper in the
12080−:: value.
12081−++ module-sample-shadow
12082− |= [ds=(list def) env=ienv values=(list term)]
12083− ^- (unit [name=term at=span])
12084− ?~ ds ~
12085− ?. ?=(%value -.i.ds) $(ds t.ds)
12086− ?^ (ienv-lookup name.i.ds env) $(ds t.ds)
12087− =/ e=expr val.i.ds
12088− ?. ?=(?(%gate %gate-wide) -.e) $(ds t.ds)
12089− =/ s=sample sample.e
12090− =/ name=(unit term)
12091− ?+ -.s ~
12092− %bind `name.s
12093− %face `name.s
12094− %pun `name.s
12095− ==
12096− ?~ name $(ds t.ds)
12097− ?. (lien values |=(n=term =(n u.name))) $(ds t.ds)
12098− `[u.name at.s]
12099−::
12100:: Cache only completed interfaces for this invocation. The source bundle,
11555:: Cache only completed interfaces for this invocation. The source bundle,
12101:: imported Hoon types and prelude are fixed for the whole graph. Check the
11556:: imported Hoon types and prelude are fixed for the whole graph. Check the
12102:: active path and duplicate sources before consulting it, so a cache hit
11557:: active path and duplicate sources before consulting it, so a cache hit
@@ -12136,25 +11591,6 @@
12136 =(externals.g externals)
11591 =(externals.g externals)
12137 =(marks.g marks)
11592 =(marks.g marks)
12138 ==
11593 ==
12139−++ request-graph-bounded
12140− |= g=irequest-graph
12141− ^- ?
12142− =/ total=@ud (add (lent requests.g) (lent stores.g))
12143− &((lte (lent ~(tap in:..zuse paths.g)) 256) (lte total 256))
12144−::
12145−++ store-graph-requests-add
12146− |= [pending=(list istore-request-evidence) acc=(list istore-request-evidence) fuel=@ud]
12147− ^- (unit (list istore-request-evidence))
12148− ?~ pending `acc
12149− ?: =(0 fuel) ~
12150− =/ hit=(list istore-request-evidence)
12151− (skim acc |=(x=istore-request-evidence =(store-at.x store-at.i.pending)))
12152− ?^ hit
12153− ?. ?=([* ~] hit) ~
12154− ?. =(i.hit i.pending) ~
12155− $(pending t.pending, fuel (dec fuel))
12156− $(pending t.pending, acc [i.pending acc], fuel (dec fuel))
12157−::
12158++ request-graph-merge
11594++ request-graph-merge
12159 |= [imports=ijimports g=irequest-graph fuel=@ud]
11595 |= [imports=ijimports g=irequest-graph fuel=@ud]
12160 ^- (unit irequest-graph)
11596 ^- (unit irequest-graph)
@@ -12175,13 +11611,8 @@
12175 =/ rs=(unit (list irequest-evidence))
11611 =/ rs=(unit (list irequest-evidence))
12176 (request-graph-requests-add requests.cg requests.g (add 1 (lent requests.cg)))
11612 (request-graph-requests-add requests.cg requests.g (add 1 (lent requests.cg)))
12177 ?~ rs ~
11613 ?~ rs ~
12178− =/ ss=(unit (list istore-request-evidence))
12179− (store-graph-requests-add stores.cg stores.g (add 1 (lent stores.cg)))
12180− ?~ ss ~
12181− =/ total=@ud (add (lent u.rs) (lent u.ss))
12182− ?: &(?=(^ u.rs) |((gth (lent ~(tap in:..zuse merged)) 256) (gth total 256))) ~
11614+ ?: &(?=(^ u.rs) |((gth (lent ~(tap in:..zuse merged)) 256) (gth (lent u.rs) 256))) ~
12183− ?: &(?=(^ u.ss) |((gth (lent ~(tap in:..zuse merged)) 256) (gth total 256))) ~
12184− $(imports t.imports, g g(paths merged, requests u.rs, stores u.ss), fuel (dec fuel))
11615+ $(imports t.imports, g g(paths merged, requests u.rs), fuel (dec fuel))
12185++ request-graph-reusable
11616++ request-graph-reusable
12186 |= [f=ifile src=@t externals=iexternals marks=imark-externals modules=jbundle active=(list path) values=(list term) molds=(list term) prelude=(unit ifile)]
11617 |= [f=ifile src=@t externals=iexternals marks=imark-externals modules=jbundle active=(list path) values=(list term) molds=(list term) prelude=(unit ifile)]
12187 ^- ?
11618 ^- ?
@@ -12196,40 +11627,33 @@
12196++ resolve-jibb-imports
11627++ resolve-jibb-imports
12197 |= [imports=(list import) externals=iexternals mark-externals=imark-externals modules=jbundle active=(list path) prelude-values=(list term) prelude-molds=(list term) cache=jcache prelude=(unit ifile)]
11628 |= [imports=(list import) externals=iexternals mark-externals=imark-externals modules=jbundle active=(list path) prelude-values=(list term) prelude-molds=(list term) cache=jcache prelude=(unit ifile)]
12198 ^- jimports-result
11629 ^- jimports-result
12199− =/ result=jimports-detailed-result
12200− (resolve-jibb-imports-detailed imports externals mark-externals modules active prelude-values prelude-molds cache prelude)
12201− ?: ?=(%| -.result) [%| message.p.result]
12202− [%& p.result]
12203−++ resolve-jibb-imports-detailed
12204− |= [imports=(list import) externals=iexternals mark-externals=imark-externals modules=jbundle active=(list path) prelude-values=(list term) prelude-molds=(list term) cache=jcache prelude=(unit ifile)]
12205− ^- jimports-detailed-result
12206 ?~ imports [%& [~ cache]]
11630 ?~ imports [%& [~ cache]]
12207 ?. ?=(%jibb -.i.imports) $(imports t.imports)
11631 ?. ?=(%jibb -.i.imports) $(imports t.imports)
12208 =/ at=path (weld path.i.imports `path`~[%jibb])
11632 =/ at=path (weld path.i.imports `path`~[%jibb])
12209 ?: =(at /lib/jibb/internal/jibb)
11633 ?: =(at /lib/jibb/internal/jibb)
12210− [%| ['the prelude internal module is private' ~]]
11634+ [%| 'the prelude internal module is private']
12211 ?: =(at /lib/jibb/primitives/jibb)
11635 ?: =(at /lib/jibb/primitives/jibb)
12212− [%| ['the prelude primitive interface is private' ~]]
11636+ [%| 'the prelude primitive interface is private']
12213 ?: (lien active |=(p=path =(p at)))
11637 ?: (lien active |=(p=path =(p at)))
12214− [%| [(crip "import cycle at {(spud at)}") ~]]
11638+ [%| (crip "import cycle at {(spud at)}")]
12215 =/ found=jbundle (skim modules |=(m=jsource =(at at.m)))
11639 =/ found=jbundle (skim modules |=(m=jsource =(at at.m)))
12216− ?~ found [%| [(crip "module source missing: {(spud at)}") ~]]
11640+ ?~ found [%| (crip "module source missing: {(spud at)}")]
12217− ?^ t.found [%| [(crip "duplicate module sources: {(spud at)}") ~]]
11641+ ?^ t.found [%| (crip "duplicate module sources: {(spud at)}")]
12218 =/ cached=(unit ifile) (find-jibb-cache at cache)
11642 =/ cached=(unit ifile) (find-jibb-cache at cache)
12219− =/ iface=jfile-detailed-result
11643+ =/ iface=jfile-result
12220 ?^ cached
11644 ?^ cached
12221− ?. =(at.u.cached at) [%| ['cached module identity needs unsupported inference' ~]]
11645+ ?. =(at.u.cached at) [%| 'cached module identity needs unsupported inference']
12222 ?~ graph.u.cached
11646 ?~ graph.u.cached
12223 :: A detached legacy interface has unknown evidence. Rebuild it
11647 :: A detached legacy interface has unknown evidence. Rebuild it
12224 :: against the current graph, without retaining any stale entry.
11648 :: against the current graph, without retaining any stale entry.
12225 =/ clean=jcache (skim cache |=(x=[at=path iface=ifile] !=(at.x at)))
11649 =/ clean=jcache (skim cache |=(x=[at=path iface=ifile] !=(at.x at)))
12226− (infer-jibb-file-detailed at source.i.found externals mark-externals modules [at active] prelude-values prelude-molds clean prelude)
11650+ (infer-jibb-file at source.i.found externals mark-externals modules [at active] prelude-values prelude-molds clean prelude)
12227 ?. (request-graph-reusable u.cached source.i.found externals mark-externals modules active prelude-values prelude-molds prelude)
11651 ?. (request-graph-reusable u.cached source.i.found externals mark-externals modules active prelude-values prelude-molds prelude)
12228− [%| ['cached module evidence needs unsupported inference' ~]]
11652+ [%| 'cached module evidence needs unsupported inference']
12229 [%& [u.cached cache]]
11653 [%& [u.cached cache]]
12230− (infer-jibb-file-detailed at source.i.found externals mark-externals modules [at active] prelude-values prelude-molds cache prelude)
11654+ (infer-jibb-file at source.i.found externals mark-externals modules [at active] prelude-values prelude-molds cache prelude)
12231 ?: ?=(%| -.iface) [%| p.iface]
11655 ?: ?=(%| -.iface) [%| p.iface]
12232− =/ rest=jimports-detailed-result $(imports t.imports, cache cache.p.iface)
11656+ =/ rest=jimports-result $(imports t.imports, cache cache.p.iface)
12233 ?: ?=(%| -.rest) rest
11657 ?: ?=(%| -.rest) rest
12234 [%& [[[face.i.imports iface.p.iface] resolved.p.rest] cache.p.rest]]
11658 [%& [[[face.i.imports iface.p.iface] resolved.p.rest] cache.p.rest]]
12235::
11659::
@@ -12367,66 +11791,27 @@
12367 =/ outer=(list term) (weld prelude-values (weld (global-value-names defs.mod) (api-import-faces imports.mod)))
11791 =/ outer=(list term) (weld prelude-values (weld (global-value-names defs.mod) (api-import-faces imports.mod)))
12368 (levy derived |=(n=term &((unique-value-name n derived) !(lien outer |=(x=term =(n x))))))
11792 (levy derived |=(n=term &((unique-value-name n derived) !(lien outer |=(x=term =(n x))))))
12369::
11793::
12370−:: The definite error behind some failures of the check above. An API
12371−:: exports `poke` when it declares `+$ poke`, and a request per case of a
12372−:: `+$ paths` that reads as path cases; these names surely exist, so a clash
12373−:: among them or with the module's scope is an error (grammar, Modules). A
12374−:: reserved `proj` stays unsupported, as in the check above.
12375−++ api-derived-clash
12376− |= [mod=module prelude-values=(list term)]
12377− ^- (unit idiag)
12378− =/ declared=(list term) (collect-mark-imports imports.mod)
12379− =/ declarations=(list def)
12380− (skim defs.mod |=(d=def &(?=(%mold -.d) =(%paths name.d))))
12381− =/ cases=(list [name=term at=span note=tape])
12382− ?. ?=([* ~] declarations) ~
12383− =/ decl=def i.declarations
12384− ?> ?=(%mold -.decl)
12385− =/ paths=(unit (list iapi-path)) (api-path-declaration shape.decl declared)
12386− ?~ paths ~
12387− (turn u.paths |=(p=iapi-path [name.p at.p "`{(trip name.p)}` is derived from this path case"]))
12388− =/ pokes=(list def)
12389− (skim defs.mod |=(d=def &(?=(%mold -.d) =(%poke name.d))))
12390− =/ derived=(list [name=term at=span note=tape])
12391− ?. ?=([* ~] pokes) cases
12392− (snoc cases [%poke at.i.pokes "`poke` is derived from this mold"])
12393− =/ names=(list term) (turn derived |=(x=[name=term at=span note=tape] name.x))
12394− =/ outer=(list term) (weld prelude-values (weld (global-value-names defs.mod) (api-import-faces imports.mod)))
12395− =/ clashes=(list term)
12396− %+ skip names
12397− |= n=term
12398− ?| =(n %proj)
12399− &((unique-value-name n names) !(lien outer |=(x=term =(n x))))
12400− ==
12401− ?~ clashes ~
12402− =/ sites=(list [at=span note=tape])
12403− %+ murn derived
12404− |= x=[name=term at=span note=tape]
12405− ?. =(i.clashes name.x) ~
12406− `[at.x note.x]
12407− `(derived-name-clash "API" i.clashes sites mod)
12408−::
12409:: Analysis only. Successful external entries must be unchanged results
11794:: Analysis only. Successful external entries must be unchanged results
12410:: produced for the declared marks; no request interface is produced.
11795:: produced for the declared marks; no request interface is produced.
12411+$ iapi-mark-type [name=term typ=itype]
11796+$ iapi-mark-type [name=term typ=itype]
12412+$ iapi-path-typed [path=iapi-path full=itype diffs=(list iapi-mark-type)]
11797+$ iapi-path-typed [path=iapi-path full=itype diffs=(list iapi-mark-type)]
12413++ api-diff-types
11798++ api-diff-types
12414− |= [names=(list term) externals=imark-externals declared=(list term) prelude=ifile]
11799+ |= [names=(list term) externals=imark-externals declared=(list term)]
12415 ^- (unit (list iapi-mark-type))
11800 ^- (unit (list iapi-mark-type))
12416 ?~ names `~
11801 ?~ names `~
12417− =/ typ=(unit itype) (find-imported-mark-prelude i.names externals declared prelude)
11802+ =/ typ=(unit itype) (find-imported-mark i.names externals declared)
12418 ?~ typ ~
11803 ?~ typ ~
12419 =/ tail=(unit (list iapi-mark-type)) $(names t.names)
11804 =/ tail=(unit (list iapi-mark-type)) $(names t.names)
12420 ?~ tail ~
11805 ?~ tail ~
12421 `[[i.names u.typ] u.tail]
11806 `[[i.names u.typ] u.tail]
12422::
11807::
12423++ api-path-types
11808++ api-path-types
12424− |= [paths=(list iapi-path) externals=imark-externals declared=(list term) prelude=ifile]
11809+ |= [paths=(list iapi-path) externals=imark-externals declared=(list term)]
12425 ^- (unit (list iapi-path-typed))
11810 ^- (unit (list iapi-path-typed))
12426 ?~ paths `~
11811 ?~ paths `~
12427− =/ full=(unit itype) (find-imported-mark-prelude full.i.paths externals declared prelude)
11812+ =/ full=(unit itype) (find-imported-mark full.i.paths externals declared)
12428 ?~ full ~
11813 ?~ full ~
12429− =/ diffs=(unit (list iapi-mark-type)) (api-diff-types diffs.i.paths externals declared prelude)
11814+ =/ diffs=(unit (list iapi-mark-type)) (api-diff-types diffs.i.paths externals declared)
12430 ?~ diffs ~
11815 ?~ diffs ~
12431 =/ tail=(unit (list iapi-path-typed)) $(paths t.paths)
11816 =/ tail=(unit (list iapi-path-typed)) $(paths t.paths)
12432 ?~ tail ~
11817 ?~ tail ~
@@ -12446,7 +11831,7 @@
12446 `~[u.name]
11831 `~[u.name]
12447::
11832::
12448++ api-path-analysis
11833++ api-path-analysis
12449− |= [mod=module externals=imark-externals prelude-values=(list term) prelude-molds=(list term) prelude=ifile]
11834+ |= [mod=module externals=imark-externals prelude-values=(list term) prelude-molds=(list term)]
12450 ^- (unit (list iapi-path-typed))
11835 ^- (unit (list iapi-path-typed))
12451 ?: (lien defs.mod def-has-hole) ~
11836 ?: (lien defs.mod def-has-hole) ~
12452 ?^ (duplicate-defs defs.mod) ~
11837 ?^ (duplicate-defs defs.mod) ~
@@ -12467,9 +11852,8 @@
12467 ?> ?=(%mold -.decl)
11852 ?> ?=(%mold -.decl)
12468 =/ paths=(unit (list iapi-path)) (api-path-declaration shape.decl declared)
11853 =/ paths=(unit (list iapi-path)) (api-path-declaration shape.decl declared)
12469 ?~ paths ~
11854 ?~ paths ~
12470− =/ derived-pokes=(list term) ?~(pokes ~ ~[%poke])
12471− ?. (api-derived-names-valid u.paths derived-pokes mod prelude-values) ~
11855+ ?. (api-derived-names-valid u.paths u.poke-names mod prelude-values) ~
12472− (api-path-types u.paths externals declared prelude)
11856+ (api-path-types u.paths externals declared)
12473::
11857::
12474:: Source/graph entry for path analysis only. The returned paths retain
11858:: Source/graph entry for path analysis only. The returned paths retain
12475:: reader-derived mark types and import resolution has checked reachable
11859:: reader-derived mark types and import resolution has checked reachable
@@ -12483,16 +11867,12 @@
12483 =/ duplicate=(unit idiag) (duplicate-defs defs.p.parsed)
11867 =/ duplicate=(unit idiag) (duplicate-defs defs.p.parsed)
12484 ?^ duplicate [%| (show-duplicate-fields file src u.duplicate)]
11868 ?^ duplicate [%| (show-duplicate-fields file src u.duplicate)]
12485 ?~ prepared [%| 'API path analysis needs the prepared prelude']
11869 ?~ prepared [%| 'API path analysis needs the prepared prelude']
12486− =/ public=ifile iface.u.prepared
12487− :: The analysis below would call a derived-name clash unsupported.
12488− =/ clash=(unit idiag) (api-derived-clash p.parsed values.u.prepared)
12489− ?^ clash [%| (show-duplicate-fields file src u.clash)]
12490 =/ prelude=(unit ifile) `iface.u.prepared
11870 =/ prelude=(unit ifile) `iface.u.prepared
12491 =/ deps=jimports-result
11871 =/ deps=jimports-result
12492 (resolve-jibb-imports imports.p.parsed externals marks modules ~[file] values.u.prepared molds.u.prepared ~ prelude)
11872 (resolve-jibb-imports imports.p.parsed externals marks modules ~[file] values.u.prepared molds.u.prepared ~ prelude)
12493 ?: ?=(%| -.deps) [%| p.deps]
11873 ?: ?=(%| -.deps) [%| p.deps]
12494 =/ paths=(unit (list iapi-path-typed))
11874 =/ paths=(unit (list iapi-path-typed))
12495− (api-path-analysis p.parsed marks values.u.prepared molds.u.prepared public)
11875+ (api-path-analysis p.parsed marks values.u.prepared molds.u.prepared)
12496 ?~ paths [%| 'API path declaration needs unsupported analysis']
11876 ?~ paths [%| 'API path declaration needs unsupported analysis']
12497 [%& u.paths]
11877 [%& u.paths]
12498::
11878::
@@ -12512,15 +11892,12 @@
12512 =/ duplicate=(unit idiag) (duplicate-defs defs.p.parsed)
11892 =/ duplicate=(unit idiag) (duplicate-defs defs.p.parsed)
12513 ?^ duplicate [%| (show-duplicate-fields file src u.duplicate)]
11893 ?^ duplicate [%| (show-duplicate-fields file src u.duplicate)]
12514 ?~ prepared [%| 'API path evidence needs the prepared prelude']
11894 ?~ prepared [%| 'API path evidence needs the prepared prelude']
12515− :: The analysis below would call a derived-name clash unsupported.
12516− =/ clash=(unit idiag) (api-derived-clash p.parsed values.u.prepared)
12517− ?^ clash [%| (show-duplicate-fields file src u.clash)]
12518 =/ public=ifile iface.u.prepared
11895 =/ public=ifile iface.u.prepared
12519 =/ deps=jimports-result
11896 =/ deps=jimports-result
12520 (resolve-jibb-imports imports.p.parsed externals marks modules ~[file] values.u.prepared molds.u.prepared ~ `public)
11897 (resolve-jibb-imports imports.p.parsed externals marks modules ~[file] values.u.prepared molds.u.prepared ~ `public)
12521 ?: ?=(%| -.deps) [%| p.deps]
11898 ?: ?=(%| -.deps) [%| p.deps]
12522 =/ paths=(unit (list iapi-path-typed))
11899 =/ paths=(unit (list iapi-path-typed))
12523− (api-path-analysis p.parsed marks values.u.prepared molds.u.prepared public)
11900+ (api-path-analysis p.parsed marks values.u.prepared molds.u.prepared)
12524 ?~ paths [%| 'API path declaration needs unsupported analysis']
11901 ?~ paths [%| 'API path declaration needs unsupported analysis']
12525 [%& [file src u.prepared externals marks cache.p.deps u.paths]]
11902 [%& [file src u.prepared externals marks cache.p.deps u.paths]]
12526:: Graph-aware variant preserves the caller active stack and cache.
11903:: Graph-aware variant preserves the caller active stack and cache.
@@ -12536,15 +11913,12 @@
12536 =/ duplicate=(unit idiag) (duplicate-defs defs.p.parsed)
11913 =/ duplicate=(unit idiag) (duplicate-defs defs.p.parsed)
12537 ?^ duplicate [%| (show-duplicate-fields file src u.duplicate)]
11914 ?^ duplicate [%| (show-duplicate-fields file src u.duplicate)]
12538 ?~ prepared [%| 'API path evidence needs the prepared prelude']
11915 ?~ prepared [%| 'API path evidence needs the prepared prelude']
12539− :: The analysis below would call a derived-name clash unsupported.
12540− =/ clash=(unit idiag) (api-derived-clash p.parsed values.u.prepared)
12541− ?^ clash [%| (show-duplicate-fields file src u.clash)]
12542 =/ public=ifile iface.u.prepared
11916 =/ public=ifile iface.u.prepared
12543 =/ deps=jimports-result
11917 =/ deps=jimports-result
12544 (resolve-jibb-imports imports.p.parsed externals marks modules active values.u.prepared molds.u.prepared cache `public)
11918 (resolve-jibb-imports imports.p.parsed externals marks modules active values.u.prepared molds.u.prepared cache `public)
12545 ?: ?=(%| -.deps) [%| p.deps]
11919 ?: ?=(%| -.deps) [%| p.deps]
12546 =/ paths=(unit (list iapi-path-typed))
11920 =/ paths=(unit (list iapi-path-typed))
12547− (api-path-analysis p.parsed marks values.u.prepared molds.u.prepared public)
11921+ (api-path-analysis p.parsed marks values.u.prepared molds.u.prepared)
12548 ?~ paths [%| 'API path declaration needs unsupported analysis']
11922 ?~ paths [%| 'API path declaration needs unsupported analysis']
12549 [%& [file src u.prepared externals marks cache.p.deps u.paths]]
11923 [%& [file src u.prepared externals marks cache.p.deps u.paths]]
12550::
11924::
@@ -12631,7 +12005,7 @@
12631 =/ vals=(list term) (global-value-names ordinary)
12005 =/ vals=(list term) (global-value-names ordinary)
12632 ?: (lien vals |=(n=term =(n %main))) [%| 'API module kind needs unsupported inference']
12006 ?: (lien vals |=(n=term =(n %main))) [%| 'API module kind needs unsupported inference']
12633 =/ declared=(list term) (collect-mark-imports imports.mod)
12007 =/ declared=(list term) (collect-mark-imports imports.mod)
12634− =/ mark-types=(unit (list iapi-mark-type)) (api-diff-types declared marks declared iface.prep)
12008+ =/ mark-types=(unit (list iapi-mark-type)) (api-diff-types declared marks declared)
12635 ?~ mark-types [%| 'API declared marks need unsupported inference']
12009 ?~ mark-types [%| 'API declared marks need unsupported inference']
12636 =/ prelude=(unit ifile) `iface.prep
12010 =/ prelude=(unit ifile) `iface.prep
12637 =/ deps=jimports-result
12011 =/ deps=jimports-result
@@ -12665,7 +12039,7 @@
12665 =/ vals=(list term) (global-value-names ordinary)
12039 =/ vals=(list term) (global-value-names ordinary)
12666 ?: (lien vals |=(n=term =(n %main))) [%| 'API module kind needs unsupported inference']
12040 ?: (lien vals |=(n=term =(n %main))) [%| 'API module kind needs unsupported inference']
12667 =/ declared=(list term) (collect-mark-imports imports.mod)
12041 =/ declared=(list term) (collect-mark-imports imports.mod)
12668− =/ mark-types=(unit (list iapi-mark-type)) (api-diff-types declared marks declared iface.prep)
12042+ =/ mark-types=(unit (list iapi-mark-type)) (api-diff-types declared marks declared)
12669 ?~ mark-types [%| 'API declared marks need unsupported inference']
12043 ?~ mark-types [%| 'API declared marks need unsupported inference']
12670 =/ prelude=(unit ifile) `iface.prep
12044 =/ prelude=(unit ifile) `iface.prep
12671 =/ deps=jimports-result
12045 =/ deps=jimports-result
@@ -12689,29 +12063,6 @@
12689:: Value watchability remains unproved even for a watchable declaration.
12063:: Value watchability remains unproved even for a watchable declaration.
12690+$ ione-request-interface
12064+$ ione-request-interface
12691 [support=iapi-support-evidence parts=iapi-request-parts iface=ifile]
12065 [support=iapi-support-evidence parts=iapi-request-parts iface=ifile]
12692−++ compatible-raw-poke
12693− |= prelude=iprelude
12694− ^- (unit ischeme)
12695− =/ public=ifile iface.prelude
12696− ?. =(at.public /lib/jibb/prelude/jibb) ~
12697− =/ poke=(unit ischeme) (find-jibb-mold %raw-poke public)
12698− ?~ poke ~
12699− ?^ vars.u.poke ~
12700− ?. ?=(%union -.typ.u.poke) ~
12701− ?^ args.typ.u.poke ~
12702− ?. =(origin.typ.u.poke `[/lib/jibb/internal/jibb %raw-poke]) ~
12703− ?: (itype-has-tag typ.u.poke) ~
12704− =/ private=(list iwidth-dependency)
12705− (skim dependencies.public |=(d=iwidth-dependency =(at.d /lib/jibb/internal/jibb)))
12706− ?. ?=([* ~] private) ~
12707− ?~ source.i.private ~
12708− =/ agent-case=itype
12709− [%cell [%const [%term %tas %agent '%agent']] [%cell [%face %agent [%atom %tas]] [%cell [%face %mark [%atom %tas]] [%face %payload [%noun ~]]]]]
12710− =/ store-case=itype
12711− [%cell [%const [%term %tas %store '%store']] [%cell [%face %module [%atom %t]] [%cell [%face %action [%atom %tas]] [%face %payload [%noun ~]]]]]
12712− ?. =(cases.typ.u.poke ~[agent-case store-case]) ~
12713− poke
12714−::
12715++ request-compatible-ask
12066++ request-compatible-ask
12716 |= prelude=iprelude
12067 |= prelude=iprelude
12717 ^- (unit ischeme)
12068 ^- (unit ischeme)
@@ -12808,7 +12159,7 @@
12808 ?~ source.i.private [%| 'request internal source needs unsupported inference']
12159 ?~ source.i.private [%| 'request internal source needs unsupported inference']
12809 =/ req=irequest-evidence
12160 =/ req=irequest-evidence
12810 [file name.path.p p src u.source.public u.source.i.private values.prelude molds.prelude externals marks]
12161 [file name.path.p p src u.source.public u.source.i.private values.prelude molds.prelude externals marks]
12811− =/ interface=ifile [~[[name.path.p scheme]] exports file ~ ~ ~ `src `[(silt `(list path)`~[file]) ~[req] ~ modules `public values.prelude molds.prelude externals marks]]
12162+ =/ interface=ifile [~[[name.path.p scheme]] exports file ~ ~ ~ `src `[(silt `(list path)`~[file]) ~[req] modules `public values.prelude molds.prelude externals marks]]
12812 [%& [support u.parts interface]]
12163 [%& [support u.parts interface]]
12813:: Graph-aware request artifact; resolver use remains type-only.
12164:: Graph-aware request artifact; resolver use remains type-only.
12814++ one-request-interface-graph
12165++ one-request-interface-graph
@@ -12862,14 +12213,14 @@
12862 ?~ source.i.private [%| 'request internal source needs unsupported inference']
12213 ?~ source.i.private [%| 'request internal source needs unsupported inference']
12863 =/ req=irequest-evidence
12214 =/ req=irequest-evidence
12864 [file name.path.p p src u.source.public u.source.i.private values.prelude molds.prelude externals marks]
12215 [file name.path.p p src u.source.public u.source.i.private values.prelude molds.prelude externals marks]
12865− =/ interface=ifile [~[[name.path.p scheme]] exports file ~ ~ ~ `src `[(silt `(list path)`~[file]) ~[req] ~ modules `public values.prelude molds.prelude externals marks]]
12216+ =/ interface=ifile [~[[name.path.p scheme]] exports file ~ ~ ~ `src `[(silt `(list path)`~[file]) ~[req] modules `public values.prelude molds.prelude externals marks]]
12866 [%& [support u.parts interface]]
12217 [%& [support u.parts interface]]
12867::
12218::
12868++ api-mark-exports
12219++ api-mark-exports
12869− |= [marks=(list term) all=(list term) externals=imark-externals prelude=ifile]
12220+ |= [marks=(list term) all=(list term) externals=imark-externals]
12870 ^- imold-types
12221 ^- imold-types
12871 ?~ marks ~
12222 ?~ marks ~
12872− =/ t=(unit itype) (find-imported-mark-prelude i.marks externals all prelude)
12223+ =/ t=(unit itype) (find-imported-mark i.marks externals all)
12873 ?~ t $(marks t.marks)
12224 ?~ t $(marks t.marks)
12874 [[i.marks [u.t ~]] $(marks t.marks)]
12225 [[i.marks [u.t ~]] $(marks t.marks)]
12875::
12226::
@@ -12878,54 +12229,37 @@
12878++ api-poke-interface
12229++ api-poke-interface
12879 |= [at=path mod=module mark-externals=imark-externals prelude-values=(list term) prelude-molds=(list term) prelude=(unit ifile)]
12230 |= [at=path mod=module mark-externals=imark-externals prelude-values=(list term) prelude-molds=(list term) prelude=(unit ifile)]
12880 ^- (unit ifile)
12231 ^- (unit ifile)
12881− =/ out=(each ifile @t)
12882− (api-poke-interface-result at mod mark-externals prelude-values prelude-molds prelude)
12883− ?:(?=(%& -.out) `p.out ~)
12884−::
12885−:: The same check, naming the part that stopped it. Each reason says which
12886−:: part is outside this fragment and claims no error in the module, except
12887−:: duplicate definitions, an error the full check reports first, as for
12888−:: other modules.
12889−++ api-poke-interface-result
12890− |= [at=path mod=module mark-externals=imark-externals prelude-values=(list term) prelude-molds=(list term) prelude=(unit ifile)]
12891− ^- (each ifile @t)
12892− ?: (lien defs.mod def-has-hole) [%| 'API holes need unsupported inference']
12232+ ?: (lien defs.mod def-has-hole) ~
12893− ?. ?=([%ui %api @ %jibb ~] at) [%| 'API path evidence requires /ui/api/<agent>.jibb']
12233+ ?. ?=([%ui %api @ %jibb ~] at) ~
12894− ?^ (duplicate-defs defs.mod) [%| 'API has duplicate definitions']
12234+ ?^ (duplicate-defs defs.mod) ~
12895− ?~ prelude [%| 'API poke prelude needs unsupported inference']
12235+ ?~ prelude ~
12896− ?. =(at.u.prelude /lib/jibb/prelude/jibb) [%| 'API poke prelude needs unsupported inference']
12236+ ?. =(at.u.prelude /lib/jibb/prelude/jibb) ~
12897− =/ poke=(unit ischeme) (find-jibb-mold %raw-poke u.prelude)
12237+ =/ poke=(unit ischeme) (find-jibb-mold %poke u.prelude)
12898− ?~ poke [%| 'API poke prelude needs unsupported inference']
12238+ ?~ poke ~
12899− ?. ?=(%union -.typ.u.poke) [%| 'API poke prelude needs unsupported inference']
12239+ ?. ?=(%union -.typ.u.poke) ~
12900− ?^ vars.u.poke [%| 'API poke prelude needs unsupported inference']
12240+ ?^ vars.u.poke ~
12901 =/ compatible=?
12241 =/ compatible=?
12902 %+ lien cases.typ.u.poke
12242 %+ lien cases.typ.u.poke
12903 |= c=itype
12243 |= c=itype
12904 ?=([%cell [%const [%term %tas %agent *]] [%cell [%face %agent [%atom %tas]] [%cell [%face %mark [%atom %tas]] [%face %payload [%noun ~]]]]] c)
12244 ?=([%cell [%const [%term %tas %agent *]] [%cell [%face %agent [%atom %tas]] [%cell [%face %mark [%atom %tas]] [%face %payload [%noun ~]]]]] c)
12905− ?. compatible [%| 'API poke prelude needs unsupported inference']
12245+ ?. compatible ~
12906− :: Definitions come before imports so that a module with more than a
12907− :: `+$ poke` is not described by its imports.
12908− =/ ds=(list def) defs.mod
12909− ?. ?=([[%mold *] ~] ds) [%| 'poke-only API definitions need unsupported inference']
12910− ?. =(%poke name.i.ds) [%| 'poke-only API definitions need unsupported inference']
12911− ?. (module-scope-valid mod(defs ~) prelude-values prelude-molds) [%| 'API import scope needs unsupported inference']
12246+ ?. (module-scope-valid mod(defs ~) prelude-values prelude-molds) ~
12912− ?. (levy imports.mod |=(i=import ?=(%mark -.i))) [%| 'poke-only API imports need unsupported inference']
12247+ ?. (levy imports.mod |=(i=import ?=(%mark -.i))) ~
12913 =/ marks=(list term) (collect-mark-imports imports.mod)
12248 =/ marks=(list term) (collect-mark-imports imports.mod)
12914− ?. ?=([@ ~] marks) [%| 'poke-only API mark imports need unsupported inference']
12249+ ?. ?=([@ ~] marks) ~
12250+ =/ ds=(list def) defs.mod
12251+ ?. ?=([[%mold *] ~] ds) ~
12252+ ?. =(%poke name.i.ds) ~
12915 =/ sh=shape shape.i.ds
12253 =/ sh=shape shape.i.ds
12916− ?. ?=([%ref *] sh) [%| 'API poke mold needs unsupported inference']
12254+ ?. ?=([%ref *] sh) ~
12917− ?. ?=([@ ~] names.sh) [%| 'API poke mold needs unsupported inference']
12255+ ?. ?=([@ ~] names.sh) ~
12918 =/ n=term i.names.sh
12256 =/ n=term i.names.sh
12919− ?. (unique-value-name n marks) [%| 'API poke mold needs unsupported inference']
12257+ ?. (unique-value-name n marks) ~
12920− ?: |((lien prelude-values |=(x=term =(n x))) (lien prelude-molds |=(x=term =(n x)))) [%| 'API poke mold needs unsupported inference']
12258+ ?: |((lien prelude-values |=(x=term =(n x))) (lien prelude-molds |=(x=term =(n x)))) ~
12921− =/ results=@ud (lent (skim mark-externals |=(e=[mark=term result=*] =(n mark.e))))
12922− ?: =(0 results) [%| (crip "API poke mark %{(trip n)} has no reader result")]
12923− ?. =(1 results) [%| (crip "API poke mark %{(trip n)} has duplicate reader results")]
12924− =/ mark=(unit itype) (find-imported-mark-prelude n mark-externals marks u.prelude)
12259+ =/ mark=(unit itype) (find-imported-mark n mark-externals marks)
12925− ?~ mark [%| 'API poke mark reader result needs unsupported inference']
12260+ ?~ mark ~
12926− =/ sc=(unit ischeme) (derived-poke-command-scheme u.prelude u.mark)
12261+ =/ sc=ischeme [[%fn u.mark typ.u.poke] ~]
12927− ?~ sc [%| 'API poke command needs unsupported inference']
12928− [%& [~[[%poke u.sc]] (api-mark-exports marks marks mark-externals u.prelude) at ~[[n i.t.t.at n]] ~ ~ ~ ~]]
12262+ `[~[[n sc]] (api-mark-exports marks marks mark-externals) at ~[[n i.t.t.at n]] ~ ~ ~ ~]
12929::
12263::
12930:: Source-proven ordinary helpers validate each selected /sur dependency.
12264:: Source-proven ordinary helpers validate each selected /sur dependency.
12931:: Unused or less direct cores remain unsupported by this first interface.
12265:: Unused or less direct cores remain unsupported by this first interface.
@@ -13048,1624 +12382,26 @@
13048 [%| 'API exported molds need unsupported inference']
12382 [%| 'API exported molds need unsupported inference']
13049 =/ env=ienv (weld values.u.gates (weld values.u.poke values.support))
12383 =/ env=ienv (weld values.u.gates (weld values.u.poke values.support))
13050 =/ graph=irequest-graph
12384 =/ graph=irequest-graph
13051− [(silt `(list path)`~[file]) requests.u.gates ~ modules `public values.prep molds.prep externals marks]
12385+ [(silt `(list path)`~[file]) requests.u.gates modules `public values.prep molds.prep externals marks]
13052 =/ iface=ifile
12386 =/ iface=ifile
13053 [env exports file derived.u.poke elaborations.support ~ `src `graph]
12387 [env exports file derived.u.poke elaborations.support ~ `src `graph]
13054 [%& [iface dependencies.ev]]
12388 [%& [iface dependencies.ev]]
13055::
12389::
13056−:: A checked program main is only the direct four-component source call.
13057−:: Grouping is transparent, but aliases, qualified wings and other module
13058−:: kinds remain outside this slice.
13059−++ program-main-def
13060− |= ds=(list def)
13061− ^- (unit def)
13062− ?~ ds ~
13063− ?: &(?=(%value -.i.ds) =(%main name.i.ds)) `i.ds
13064− $(ds t.ds)
13065−::
13066−++ program-main-wing
13067− |= e=expr
13068− ^- (unit term)
13069− ?: ?=(%group -.e) $(e inner.e)
13070− ?. ?=(%wing -.e) ~
13071− ?. ?=([@ ~] names.e) ~
13072− `i.names.e
13073−::
13074−++ program-main-args
13075− |= d=def
13076− ^- (unit (list expr))
13077− ?. ?=(%value -.d) ~
13078− |-
13079− ?: ?=(%group -.val.d) $(val.d inner.val.d)
13080− ?. ?=(%call -.val.d) ~
13081− =/ head=(unit term) (program-main-wing head.val.d)
13082− ?~ head ~
13083− ?. =(%program u.head) ~
13084− ?. ?=([* * * * ~] args.val.d) ~
13085− `args.val.d
13086−::
13087−++ program-main-parts
13088− |= d=def
13089− ^- (unit [init=term update=term view=term subs=term])
13090− ?. ?=(%value -.d) ~
13091− |-
13092− ?: ?=(%group -.val.d) $(val.d inner.val.d)
13093− ?. ?=(%call -.val.d) ~
13094− =/ head=(unit term) (program-main-wing head.val.d)
13095− ?~ head ~
13096− ?. =(%program u.head) ~
13097− ?. ?=([* * * * ~] args.val.d) ~
13098− =/ args=(list expr) args.val.d
13099− ?> ?=([* * * * ~] args)
13100− =/ init=(unit term) (program-main-wing i.args)
13101− =/ update=(unit term) (program-main-wing i.t.args)
13102− =/ view=(unit term) (program-main-wing i.t.t.args)
13103− =/ subs=(unit term) (program-main-wing i.t.t.t.args)
13104− ?~ init ~
13105− ?~ update ~
13106− ?~ view ~
13107− ?~ subs ~
13108− `[u.init u.update u.view u.subs]
13109−::
13110−:: A data page is only the direct two-component source call. Grouping is
13111−:: transparent, but page aliases, qualified wings and other kinds are not.
13112−++ page-main-parts
13113− |= d=def
13114− ^- (unit [load=term view=term])
13115− ?. ?=(%value -.d) ~
13116− |-
13117− ?: ?=(%group -.val.d) $(val.d inner.val.d)
13118− ?. ?=(%call -.val.d) ~
13119− =/ head=(unit term) (program-main-wing head.val.d)
13120− ?~ head ~
13121− ?. =(%page u.head) ~
13122− ?. ?=([* * ~] args.val.d) ~
13123− =/ args=(list expr) args.val.d
13124− ?> ?=([* * ~] args)
13125− =/ load=(unit term) (program-main-wing i.args)
13126− =/ view=(unit term) (program-main-wing i.t.args)
13127− ?~ load ~
13128− ?~ view ~
13129− `[u.load u.view]
13130−::
13131−:: A store main is only the direct two-wing source call. Its local poke mold
13132−:: is checked here and remains in ordinary mold/value inference.
13133−++ store-main-parts
13134− |= d=def
13135− ^- (unit [init=term update=term])
13136− ?. ?=(%value -.d) ~
13137− |-
13138− ?: ?=(%group -.val.d) $(val.d inner.val.d)
13139− ?. ?=(%call -.val.d) ~
13140− =/ head=(unit term) (program-main-wing head.val.d)
13141− ?~ head ~
13142− ?. =(%store u.head) ~
13143− ?. ?=([* * ~] args.val.d) ~
13144− =/ args=(list expr) args.val.d
13145− ?> ?=([* * ~] args)
13146− =/ init=(unit term) (program-main-wing i.args)
13147− =/ update=(unit term) (program-main-wing i.t.args)
13148− ?~ init ~
13149− ?~ update ~
13150− `[u.init u.update]
13151−::
13152−+$ istore-declaration [action=term defs=(list def)]
13153−:: A failure carries a diagnostic only when it is a definite error of the
13154−:: source; every other failure is unsupported and carries none.
13155−++ store-declaration
13156− |= [mod=module prelude-values=(list term) prelude-molds=(list term)]
13157− ^- (each istore-declaration (unit idiag))
13158− =/ ds=(list def) defs.mod
13159− =/ pokes=(list def)
13160− (skim ds |=(d=def &(?=(%mold -.d) =(%poke name.d))))
13161− ?. ?=([* ~] pokes) [%| ~]
13162− =/ states=(list def)
13163− (skim ds |=(d=def &(?=(%mold -.d) =(%state name.d))))
13164− ?. ?=([* ~] states) [%| ~]
13165− =/ poke=def i.pokes
13166− =/ state=def i.states
13167− ?> &(?=(%mold -.poke) ?=(%mold -.state))
13168− ?: ?=(%generic -.shape.state) [%| ~]
13169− ?: ?=(%generic -.shape.poke) [%| ~]
13170− =/ action=term %poke
13171− =/ ordinary=(list def) ds
13172− =/ derived=(list term) ~[%state action]
13173− ?: (lien derived |=(n=term =(n %proj))) [%| ~]
13174− =/ outer=(list term)
13175− (weld prelude-values (weld (global-value-names ordinary) (api-import-faces imports.mod)))
13176− =/ clashes=(list term)
13177− (skip derived |=(n=term &((unique-value-name n derived) !(lien outer |=(x=term =(n x))))))
13178− :: main's `store` is the prelude's builder when the prelude declares it and
13179− :: nothing local takes the name. Only then do the derived names surely
13180− :: exist, and then a clash is an error even where the scope also fails, as
13181− :: for an import face that clashes with both a derived name and its mold.
13182− =/ builder=?
13183− ?& (lien prelude-values |=(x=term =(x %store)))
13184− !(lien (global-value-names ds) |=(x=term =(x %store)))
13185− !(lien (import-binding-names imports.mod) |=(x=term =(x %store)))
13186− ==
13187− ?: &(?=(^ clashes) builder (lien outer |=(x=term =(x i.clashes))))
13188− =/ from=span ?:(=(%state i.clashes) at.state at.poke)
13189− =/ derived=[at=span note=tape] [from "`{(trip i.clashes)}` is derived from this mold"]
13190− [%| `(derived-name-clash "store" i.clashes ~[derived] mod)]
13191− ?. (module-scope-valid mod prelude-values prelude-molds) [%| ~]
13192− ?^ clashes [%| ~]
13193− [%& [action ordinary]]
13194−::
13195−:: A store or API exports names derived from its declarations, and a
13196−:: clashing derived name is an error (grammar, Modules). Show where the name
13197−:: is derived and the definition, import face or other derived name it
13198−:: clashes with; a prelude name has no site in the module.
13199−++ derived-name-clash
13200− |= [kind=tape n=term derived=(list [at=span note=tape]) mod=module]
13201− ^- idiag
13202− =/ values=(list span)
13203− (murn defs.mod |=(d=def ?.(&(?=(%value -.d) =(n name.d)) ~ `at.d)))
13204− =/ faces=(list span)
13205− %+ murn imports.mod
13206− |= i=import
13207− ?- -.i
13208− %mark ~
13209− %sur ?.(=(n name.i) ~ `at.i)
13210− %jibb ?.(=(n face.i) ~ `at.i)
13211− ==
13212− =/ head=tape "{kind} derived name `{(trip n)}` clashes with"
13213− ?^ values
13214− ["{head} a definition" (weld derived ~[[i.values "clashing definition"]])]
13215− ?^ faces
13216− ["{head} an import face" (weld derived ~[[i.faces "clashing import face"]])]
13217− ?: ?=([* * *] derived)
13218− ["{head} another derived name" derived]
13219− ["{head} a prelude name" derived]
13220−::
13221−++ program-empty-null
13222− |= e=expr
13223− ^- ?
13224− ?- -.e
13225− %lit =(%null form.lit.e)
13226− %cast $(e val.e)
13227− %group $(e inner.e)
13228− %body ?~(defs.e $(e final.e) |)
13229− * |
13230− ==
13231−::
13232−++ program-subs-empty
13233− |= d=def
13234− ^- ?
13235− ?. ?=(%value -.d) |
13236− ?- -.val.d
13237− %gate (program-empty-null body.val.d)
13238− %gate-wide (program-empty-null body.val.d)
13239− * |
13240− ==
13241−::
13242−++ program-transparent
13243− |= e=expr
13244− ^- expr
13245− ?- -.e
13246− %group $(e inner.e)
13247− %cast $(e val.e)
13248− %body ?~(defs.e $(e final.e) e)
13249− * e
13250− ==
13251−++ program-init-tuple-null
13252− |= d=def
13253− ^- ?
13254− ?. ?=(%value -.d) |
13255− ?. |(?=(%gate -.val.d) ?=(%gate-wide -.val.d)) |
13256− =/ body=expr
13257− ?- -.val.d
13258− %gate body.val.d
13259− %gate-wide body.val.d
13260− * !!
13261− ==
13262− =. body (program-transparent body)
13263− ?. ?=(%tuple -.body) |
13264− ?~ items.body |
13265− (program-empty-null val:(rear items.body))
13266−::
13267−:: Recover only the update of an already recognized direct program main.
13268−:: Its written sample determines the message/model relationship; the canonical
13269−:: cmd, unit and update slot determine the result context. Publication is
13270−:: component-local so later subscription/view/initializer retries can accumulate.
13271−++ program-update-context
13272− |= [main=def parts=[init=term update=term view=term subs=term] ds=(list def) resolution=iresolved initial=istate]
13273− ^- (unit iresolved)
13274− =/ env=ienv env.resolution
13275− ?^ (ienv-lookup %main env) ~
13276− ?^ (ienv-lookup update.parts env) ~
13277− =/ updates=(list def)
13278− (skim ds |=(d=def &(?=(%value -.d) =(update.parts name.d))))
13279− ?. ?=([* ~] updates) ~
13280− =/ update-def=def i.updates
13281− ?> ?=(%value -.update-def)
13282− =/ written-update=(unit sample) (direct-gate-sample update-def)
13283− ?~ written-update ~
13284− ?. ?=(%cell -.u.written-update) ~
13285− ?. ?=([* * ~] items.u.written-update) ~
13286− ?~ prelude.initial ~
13287− =/ program=(unit ischeme) (ienv-lookup %program values.u.prelude.initial)
13288− ?~ program ~
13289− =/ command=(unit ischeme) (find-jibb-mold %cmd u.prelude.initial)
13290− =/ list-template=(unit ischeme) (find-jibb-mold %list u.prelude.initial)
13291− ?~ command ~
13292− ?~ list-template ~
13293− =/ heads=(unit igate-prelude-evidence) (direct-prelude-evidence ds prelude.initial)
13294− ?~ heads ~
13295− =/ written=(unit def) (~(get by gates.u.heads) %program)
13296− ?~ written ~
13297− =/ written-sample=(unit sample) (direct-gate-sample u.written)
13298− ?~ written-sample ~
13299− ?. ?=(%cell -.u.written-sample) ~
13300− ?. ?=([* * * * ~] items.u.written-sample) ~
13301− =/ checked=(map term def)
13302− (~(put by (direct-checked-gates ds env)) update.parts update-def)
13303− =/ templates=ienv
13304− (turn molds.u.prelude.initial |=(x=[name=term template=ischeme] [name.x template.x]))
13305− =/ scanned=(unit dgscan)
13306− (dg-all-env-ids (weld env (weld values.u.prelude.initial templates)) 32.768 ~)
13307− ?~ scanned ~
13308− =. next.initial (dg-next-id ids.u.scanned 0)
13309− =/ update-state=istate (reserve-def-caps val.update-def initial)
13310− =/ sam=isample-result (infer-sample u.written-update env update-state)
13311− ?: ?=(%| -.sam) ~
13312− =/ actual-sample=itype (itype-normalize typ.p.sam sub.state.p.sam)
13313− ?. ?=(%cell -.actual-sample) ~
13314− =/ message=(unit itype)
13315− (direct-slot-body hed.actual-sample (direct-sample-name i.items.u.written-update))
13316− =/ model=(unit itype)
13317− (direct-slot-body tal.actual-sample (direct-sample-name i.t.items.u.written-update))
13318− ?~ message ~
13319− ?~ model ~
13320− =/ cmd=(unit itype) (template-apply u.command ~[u.message])
13321− ?~ cmd ~
13322− =/ command-result=(unit itype) (template-apply u.list-template ~[u.cmd])
13323− ?~ command-result ~
13324− =/ product=itype [%cell u.model u.command-result]
13325− =/ instance=[typ=itype state=istate] (instantiate-scheme u.program state.p.sam)
13326− ?. ?=(%fn -.typ.instance) ~
13327− ?. ?=(%cell -.sample.typ.instance) ~
13328− ?. ?=(%cell -.tal.sample.typ.instance) ~
13329− =/ expected-update=(unit itype)
13330− (direct-slot-body hed.tal.sample.typ.instance (direct-sample-name i.t.items.u.written-sample))
13331− ?~ expected-update ~
13332− ?. ?=(%fn -.u.expected-update) ~
13333− :: Sample binders are not value faces. Strip only those two slot faces
13334− :: for the invariant canonical-gate proof; the source-faced gate is still
13335− :: used by the complete positional call and final ordinary result cast.
13336− =/ canonical-candidate=itype [%fn [%cell u.message u.model] product]
13337− =/ gate-fit=ifit
13338− (direct-invariant canonical-candidate u.expected-update sub.state.instance next.state.instance)
13339− ?. ?=(%ok -.gate-fit) ~
13340− =/ closed=itype
13341− (itype-normalize [%fn typ.p.sam product] sub.gate-fit)
13342− ?. ?=(%fn -.closed) ~
13343− :: The closed product no longer needs the canonical slot substitutions.
13344− :: Start the body at its ordinary sample state so existing branch retries
13345− :: keep their substitution guards, but retain the shared fresh-ID high water.
13346− =/ st=istate state.p.sam(next next.gate-fit, gate-defs checked, head-evidence heads)
13347− =/ body=expr
13348− ?- -.val.update-def
13349− %gate body.val.update-def
13350− %gate-wide body.val.update-def
13351− * !!
13352− ==
13353− =/ inferred=iresult
13354− (infer-call-context-arg body product.closed env.p.sam st (span-of body))
13355− ?: ?=(%| -.inferred) ~
13356− =/ product-fit=ifit
13357− (itype-fit typ.p.inferred product.closed sub.state.p.inferred next.state.p.inferred)
13358− ?. ?=(%ok -.product-fit) ~
13359− =/ merged-product=itype
13360− (itype-merge-faces typ.p.inferred product.closed sub.product-fit)
13361− =/ actual-cast=itype [%fn typ.p.sam merged-product]
13362− =/ cast=ifit
13363− (itype-fit actual-cast closed sub.product-fit next.product-fit)
13364− ?. ?=(%ok -.cast) ~
13365− =/ merged=itype (itype-merge-faces actual-cast closed sub.cast)
13366− =/ adjusted=iresult
13367− [%& merged state.p.inferred(sub sub.cast, next next.cast)]
13368− =/ added=(unit iadded-definition)
13369− (add-supported-result update-def adjusted update-state env checked artifacts.resolution)
13370− ?~ added ~
13371− =/ recovered=(unit ischeme) (ienv-lookup update.parts env.u.added)
13372− ?~ recovered ~
13373− ?. ?=(~ vars.u.recovered) ~
13374− ?. ?=(~ (itype-vars typ.u.recovered)) ~
13375− `[env.u.added grouped.resolution artifacts.u.added]
13376−::
13377−++ program-inferred-slot
13378− |= [typ=itype name=(unit term)]
13379− ^- itype
13380− ?~ name typ
13381− ?: &(?=(%face -.typ) =(name.typ u.name)) body.typ
13382− typ
13383−::
13384−++ program-inferred-sample
13385− |= [typ=itype sam=sample]
13386− ^- itype
13387− (program-inferred-slot typ (direct-sample-name sam))
13388−::
13389−++ program-two-slot-names
13390− |= sam=sample
13391− ^- (unit [first=(unit term) second=(unit term)])
13392− ?- -.sam
13393− %cell
13394− ?. ?=([* * ~] items.sam) ~
13395− `[(direct-sample-name i.items.sam) (direct-sample-name i.t.items.sam)]
13396− %face
13397− ?. ?=(%cell -.shape.sam) ~
13398− ?. ?=([* * ~] fields.shape.sam) ~
13399− `[(direct-field-name i.fields.shape.sam) (direct-field-name i.t.fields.shape.sam)]
13400− * ~
13401− ==
13402−::
13403−:: Read message/model from the checked update and its written source layout.
13404−:: The source names strip only top-level sample binder faces; nested value
13405−:: faces remain part of the canonical message and model.
13406−++ program-update-relation
13407− |= [name=term ds=(list def) env=ienv]
13408− ^- (unit [message=itype model=itype])
13409− =/ update=(unit ischeme) (ienv-lookup name env)
13410− ?~ update ~
13411− ?. ?=(~ vars.u.update) ~
13412− ?. ?=(~ (itype-vars typ.u.update)) ~
13413− ?. ?=(%fn -.typ.u.update) ~
13414− ?. ?=(%cell -.sample.typ.u.update) ~
13415− =/ defs=(list def)
13416− (skim ds |=(d=def &(?=(%value -.d) =(name name.d))))
13417− ?. ?=([* ~] defs) ~
13418− =/ written=(unit sample) (direct-gate-sample i.defs)
13419− ?~ written ~
13420− ?. ?=(%cell -.u.written) ~
13421− ?. ?=([* * ~] items.u.written) ~
13422− =/ message=(unit itype)
13423− (direct-slot-body hed.sample.typ.u.update (direct-sample-name i.items.u.written))
13424− =/ model=(unit itype)
13425− (direct-slot-body tal.sample.typ.u.update (direct-sample-name i.t.items.u.written))
13426− ?~ message ~
13427− ?~ model ~
13428− `[u.message u.model]
13429−::
13430−:: Recover an unannotated direct subscription component from the checked
13431−:: update relation and canonical fourth program slot. This establishes only
13432−:: the value type; the final program watch proof remains separate.
13433−++ program-subs-context
13434− |= [parts=[init=term update=term view=term subs=term] ds=(list def) resolution=iresolved initial=istate]
13435− ^- (unit iresolved)
13436− =/ env=ienv env.resolution
13437− ?^ (ienv-lookup %main env) ~
13438− ?^ (ienv-lookup subs.parts env) ~
13439− =/ relation=(unit [message=itype model=itype])
13440− (program-update-relation update.parts ds env)
13441− ?~ relation ~
13442− =/ subs=(list def)
13443− (skim ds |=(d=def &(?=(%value -.d) =(subs.parts name.d))))
13444− ?. ?=([* ~] subs) ~
13445− =/ subs-def=def i.subs
13446− ?> ?=(%value -.subs-def)
13447− =/ written-subs=(unit sample) (direct-gate-sample subs-def)
13448− ?~ written-subs ~
13449− ?~ prelude.initial ~
13450− =/ program=(unit ischeme) (ienv-lookup %program values.u.prelude.initial)
13451− =/ sub=(unit ischeme) (find-jibb-mold %sub u.prelude.initial)
13452− =/ list-template=(unit ischeme) (find-jibb-mold %list u.prelude.initial)
13453− ?~ program ~
13454− ?~ sub ~
13455− ?~ list-template ~
13456− =/ heads=(unit igate-prelude-evidence) (direct-prelude-evidence ds prelude.initial)
13457− ?~ heads ~
13458− =/ written=(unit def) (~(get by gates.u.heads) %program)
13459− ?~ written ~
13460− =/ written-sample=(unit sample) (direct-gate-sample u.written)
13461− ?~ written-sample ~
13462− ?. ?=(%cell -.u.written-sample) ~
13463− ?. ?=([* * * * ~] items.u.written-sample) ~
13464− =/ checked=(map term def) (direct-checked-gates ds env)
13465− =/ templates=ienv
13466− (turn molds.u.prelude.initial |=(x=[name=term template=ischeme] [name.x template.x]))
13467− =/ scanned=(unit dgscan)
13468− (dg-all-env-ids (weld env (weld values.u.prelude.initial templates)) 32.768 ~)
13469− ?~ scanned ~
13470− =. next.initial (dg-next-id ids.u.scanned 0)
13471− =/ subs-state=istate (reserve-def-caps val.subs-def initial)
13472− =/ sam=isample-result (infer-sample u.written-subs env subs-state)
13473− ?: ?=(%| -.sam) ~
13474− =/ actual-model=itype (program-inferred-sample typ.p.sam u.written-subs)
13475− ?. ?=(~ (itype-vars actual-model)) ~
13476− ?: (itype-has-tag actual-model) ~
13477− =/ model-fit=ifit
13478− (direct-invariant actual-model model.u.relation sub.state.p.sam next.state.p.sam)
13479− ?. ?=(%ok -.model-fit) ~
13480− =/ message-sub=(unit itype) (template-apply u.sub ~[message.u.relation])
13481− ?~ message-sub ~
13482− =/ product=(unit itype) (template-apply u.list-template ~[u.message-sub])
13483− ?~ product ~
13484− =/ instance=[typ=itype state=istate]
13485− (instantiate-scheme u.program state.p.sam(sub sub.model-fit, next next.model-fit))
13486− ?. ?=(%fn -.typ.instance) ~
13487− ?. ?=(%cell -.sample.typ.instance) ~
13488− ?. ?=(%cell -.tal.sample.typ.instance) ~
13489− ?. ?=(%cell -.tal.tal.sample.typ.instance) ~
13490− =/ expected-subs=(unit itype)
13491− (direct-slot-body tal.tal.tal.sample.typ.instance (direct-sample-name i.t.t.t.items.u.written-sample))
13492− ?~ expected-subs ~
13493− ?. ?=(%fn -.u.expected-subs) ~
13494− =/ canonical=itype [%fn model.u.relation u.product]
13495− =/ gate-fit=ifit
13496− (direct-invariant canonical u.expected-subs sub.state.instance next.state.instance)
13497− ?. ?=(%ok -.gate-fit) ~
13498− =/ closed=itype
13499− (itype-normalize [%fn typ.p.sam u.product] sub.gate-fit)
13500− ?. ?=(%fn -.closed) ~
13501− =/ body=expr
13502− ?- -.val.subs-def
13503− %gate body.val.subs-def
13504− %gate-wide body.val.subs-def
13505− * !!
13506− ==
13507− =/ st=istate
13508− state.p.sam(next next.gate-fit, gate-defs checked, head-evidence heads)
13509− =/ inferred=iresult
13510− (infer-call-context-arg body product.closed env.p.sam st (span-of body))
13511− ?: ?=(%| -.inferred) ~
13512− =/ product-fit=ifit
13513− (itype-fit typ.p.inferred product.closed sub.state.p.inferred next.state.p.inferred)
13514− ?. ?=(%ok -.product-fit) ~
13515− =/ merged-product=itype
13516− (itype-merge-faces typ.p.inferred product.closed sub.product-fit)
13517− =/ actual-cast=itype [%fn typ.p.sam merged-product]
13518− =/ cast=ifit
13519− (itype-fit actual-cast closed sub.product-fit next.product-fit)
13520− ?. ?=(%ok -.cast) ~
13521− =/ merged=itype (itype-merge-faces actual-cast closed sub.cast)
13522− =/ adjusted=iresult
13523− [%& merged state.p.inferred(sub sub.cast, next next.cast)]
13524− =/ added=(unit iadded-definition)
13525− (add-supported-result subs-def adjusted subs-state env checked artifacts.resolution)
13526− ?~ added ~
13527− =/ recovered=(unit ischeme) (ienv-lookup subs.parts env.u.added)
13528− ?~ recovered ~
13529− ?. ?=(~ vars.u.recovered) ~
13530− ?. ?=(~ (itype-vars typ.u.recovered)) ~
13531− `[env.u.added grouped.resolution artifacts.u.added]
13532−::
13533−+$ iview-site [xs=expr mapper=term]
13534−++ program-view-site
13535− |= e=expr
13536− ^- (unit iview-site)
13537− =. e (program-transparent e)
13538− ?. ?=(%call -.e) ~
13539− ?. ?=([* ~] args.e) ~
13540− =/ each=expr (program-transparent head.e)
13541− ?. ?=(%wing -.each) ~
13542− ?. ?=([%each ~] names.each) ~
13543− =/ turned=expr (program-transparent i.args.e)
13544− ?. ?=(%call -.turned) ~
13545− ?. ?=([* * ~] args.turned) ~
13546− =/ turn=expr (program-transparent head.turned)
13547− ?. ?=(%wing -.turn) ~
13548− ?. ?=([%turn ~] names.turn) ~
13549− =/ xs=expr (program-transparent i.args.turned)
13550− ?. ?=(%wing -.xs) ~
13551− ?~ names.xs ~
13552− =/ mapper=(unit term) (program-main-wing i.t.args.turned)
13553− ?~ mapper ~
13554− `[xs u.mapper]
13555−::
13556−++ program-sample-binders
13557− |= sam=sample
13558− ^- (list term)
13559− ?- -.sam
13560− %bind ~[name.sam]
13561− %face ~[name.sam]
13562− %pun ~[name.sam]
13563− %cell (zing (turn items.sam |=(s=sample (program-sample-binders s))))
13564− * ~
13565− ==
13566−::
13567−++ program-pattern-binders
13568− |= pat=pattern
13569− ^- (list term)
13570− ?- -.pat
13571− %bind ~[name.pat]
13572− %cell (zing (turn items.pat |=(p=pattern (program-pattern-binders p))))
13573− * ~
13574− ==
13575−::
13576−++ program-view-sites-merge
13577− |= [a=(unit (list iview-site)) b=(unit (list iview-site))]
13578− ^- (unit (list iview-site))
13579− ?~ a ~
13580− ?~ b ~
13581− `(weld u.a u.b)
13582−::
13583−++ program-view-sites-exprs
13584− |= [xs=(list expr) locals=(list term)]
13585− ^- (unit (list iview-site))
13586− ?~ xs `~
13587− (program-view-sites-merge (program-view-sites i.xs locals) $(xs t.xs))
13588−::
13589−++ program-view-sites-items
13590− |= [xs=(list item) locals=(list term)]
13591− ^- (unit (list iview-site))
13592− ?~ xs `~
13593− (program-view-sites-merge (program-view-sites val.i.xs locals) $(xs t.xs))
13594−::
13595−++ program-view-sites-pieces
13596− |= [xs=(list piece) locals=(list term)]
13597− ^- (unit (list iview-site))
13598− ?~ xs `~
13599− =/ here=(unit (list iview-site))
13600− ?- -.i.xs
13601− %expr (program-view-sites p.i.xs locals)
13602− %text `~
13603− ==
13604− (program-view-sites-merge here $(xs t.xs))
13605−::
13606−++ program-view-sites-qsegs
13607− |= [xs=(list qseg) locals=(list term)]
13608− ^- (unit (list iview-site))
13609− ?~ xs `~
13610− =/ here=(unit (list iview-site))
13611− ?- -.i.xs
13612− %expr (program-view-sites p.i.xs locals)
13613− %knot `~
13614− ==
13615− (program-view-sites-merge here $(xs t.xs))
13616−::
13617−++ program-view-sites-edits
13618− |= [xs=(list edit) locals=(list term)]
13619− ^- (unit (list iview-site))
13620− ?~ xs `~
13621− (program-view-sites-merge (program-view-sites val.i.xs locals) $(xs t.xs))
13622−::
13623−++ program-view-sites-defs
13624− |= [xs=(list def) locals=(list term)]
13625− ^- (unit (list iview-site))
13626− ?~ xs `~
13627− =/ here=(unit (list iview-site))
13628− ?: ?=(%mold -.i.xs) `~
13629− (program-view-sites val.i.xs locals)
13630− (program-view-sites-merge here $(xs t.xs))
13631−::
13632−++ program-view-sites-arms
13633− |= [xs=(list arm) locals=(list term)]
13634− ^- (unit (list iview-site))
13635− ?~ xs `~
13636− =/ nested=(list term) (weld (program-pattern-binders pat.i.xs) locals)
13637− (program-view-sites-merge (program-view-sites val.i.xs nested) $(xs t.xs))
13638−::
13639−++ program-view-sites
13640− |= [e=expr locals=(list term)]
13641− ^- (unit (list iview-site))
13642− =/ site=(unit iview-site) (program-view-site e)
13643− ?^ site
13644− =/ names=(list term) ~[%each %turn mapper.u.site]
13645− ?> ?=(%wing -.xs.u.site)
13646− =/ root=term (rear names.xs.u.site)
13647− ?: |((lien names |=(n=term (lien locals |=(x=term =(n x))))) (lien locals |=(x=term =(root x))))
13648− ~
13649− `~[u.site]
13650− ?- -.e
13651− %str (program-view-sites-pieces pieces.e locals)
13652− %qath (program-view-sites-qsegs segs.e locals)
13653− %change (program-view-sites-edits edits.e locals)
13654− %pair (program-view-sites val.e locals)
13655− %unit (program-view-sites val.e locals)
13656− %group (program-view-sites inner.e locals)
13657− %list (program-view-sites-exprs items.e locals)
13658− %tuple (program-view-sites-items items.e locals)
13659− %gate
13660− (program-view-sites body.e (weld (program-sample-binders sample.e) locals))
13661− %gate-wide
13662− (program-view-sites body.e (weld (program-sample-binders sample.e) locals))
13663− %call
13664− (program-view-sites-merge (program-view-sites head.e locals) (program-view-sites-exprs args.e locals))
13665− %cast (program-view-sites val.e locals)
13666− %trace
13667− (program-view-sites-merge (program-view-sites val.e locals) (program-view-sites then.e locals))
13668− %branch
13669− (program-view-sites-merge (program-view-sites subject.e locals) (program-view-sites-arms arms.e locals))
13670− %body
13671− =/ nested=(list term) (weld (global-value-names defs.e) locals)
13672− (program-view-sites-merge (program-view-sites-defs defs.e nested) (program-view-sites final.e nested))
13673− * `~
13674− ==
13675−::
13676−++ program-union-tag-case
13677− |= [expected=itype tag=@]
13678− ^- (unit itype)
13679− ?. ?=(%union -.expected) ~
13680− =/ remaining=(list itype) cases.expected
13681− =/ found=(unit itype) ~
13682− =/ seen=(set @) *(set @)
13683− |-
13684− ?~ remaining found
13685− =/ case=itype i.remaining
13686− =/ head=(unit @)
13687− ?: ?=(%const -.case) `val.literal.case
13688− ?. ?=(%cell -.case) ~
13689− ?. ?=(%const -.hed.case) ~
13690− `val.literal.hed.case
13691− ?~ head ~
13692− ?: (~(has in:..zuse seen) u.head) ~
13693− =. seen (~(put in:..zuse seen) u.head)
13694− =? found =(tag u.head)
13695− ?^(found ~ `case)
13696− $(remaining t.remaining)
13697−::
13698−++ program-single-case-fit
13699− |= [actual=itype expected=itype sub=isub next=@ud]
13700− ^- ifit
13701− =. actual (itype-normalize actual sub)
13702− =. expected (itype-normalize expected sub)
13703− ?. ?=(%union -.expected) [%unknown ~]
13704− =/ found=(unit itype)
13705− ?: ?=(%const -.actual) `actual
13706− ?: ?=(%tag -.actual) `actual
13707− ?: ?=(%cell -.actual) `actual
13708− ?. ?=(%union -.actual) ~
13709− ?. ?=([* ~] cases.actual) ~
13710− `i.cases.actual
13711− ?~ found [%unknown ~]
13712− =/ case=itype u.found
13713− =/ tag=(unit lit)
13714− ?: ?=(%const -.case) `literal.case
13715− ?: ?=(%tag -.case) `literal.case
13716− ?. ?=(%cell -.case) ~
13717− =/ head=itype (projection-field-target hed.case)
13718− ?: ?=(%const -.head) `literal.head
13719− ?: ?=(%tag -.head) `literal.head
13720− ~
13721− ?~ tag [%unknown ~]
13722− =/ chosen=(unit itype) (program-union-tag-case expected val.u.tag)
13723− ?~ chosen [%unknown ~]
13724− ?: |(?=(%const -.case) ?=(%tag -.case))
13725− ?. ?=(%const -.u.chosen) [%unknown ~]
13726− (itype-fit case u.chosen sub next)
13727− ?. ?=(%cell -.case) [%unknown ~]
13728− ?. ?=(%cell -.u.chosen) [%unknown ~]
13729− =/ head-fit=ifit (itype-fit hed.case hed.u.chosen sub next)
13730− ?. ?=(%ok -.head-fit) head-fit
13731− (itype-fit tal.case tal.u.chosen sub.head-fit next.head-fit)
13732−::
13733−++ program-single-generic-fit
13734− |= [actual=itype expected=itype sub=isub next=@ud]
13735− ^- ifit
13736− =. actual (itype-normalize actual sub)
13737− =. expected (itype-normalize expected sub)
13738− ?. &(?=(%union -.actual) ?=(%union -.expected)) [%unknown ~]
13739− ?~ origin.actual [%unknown ~]
13740− ?. =(origin.actual origin.expected) [%unknown ~]
13741− ?. ?=([* ~] args.actual) [%unknown ~]
13742− ?. ?=([* ~] args.expected) [%unknown ~]
13743− =/ argument-fit=ifit (direct-invariant i.args.actual i.args.expected sub next)
13744− ?: ?=(%ok -.argument-fit) argument-fit
13745− (program-single-case-fit i.args.actual i.args.expected sub next)
13746−::
13747−++ program-keyed-product-fit
13748− |= [actual=itype expected=itype element=ischeme sub=isub next=@ud]
13749− ^- ifit
13750− =. actual (itype-normalize actual sub)
13751− =. expected (itype-normalize expected sub)
13752− ?. &(?=(%cell -.actual) ?=(%cell -.expected)) [%unknown ~]
13753− =/ key-fit=ifit
13754− (itype-fit (projection-field-target hed.actual) (projection-field-target hed.expected) sub next)
13755− ?. ?=(%ok -.key-fit) key-fit
13756− =/ actual-el=itype
13757− (itype-normalize (projection-field-target tal.actual) sub.key-fit)
13758− =/ expected-el=itype
13759− (itype-normalize (projection-field-target tal.expected) sub.key-fit)
13760− ?. &(?=(%union -.actual-el) ?=(%union -.expected-el)) [%unknown ~]
13761− ?. =(origin.actual-el origin.expected-el) [%unknown ~]
13762− ?. ?=([* ~] args.actual-el) [%unknown ~]
13763− ?. ?=([* ~] args.expected-el) [%unknown ~]
13764− =/ canonical-actual=(unit itype)
13765− (template-apply element ~[i.args.actual-el])
13766− =/ canonical-expected=(unit itype)
13767− (template-apply element ~[i.args.expected-el])
13768− ?~ canonical-actual [%unknown ~]
13769− ?~ canonical-expected [%unknown ~]
13770− =/ actual-check=ifit
13771− (direct-invariant actual-el u.canonical-actual sub.key-fit next.key-fit)
13772− ?. ?=(%ok -.actual-check) actual-check
13773− =/ expected-check=ifit
13774− (direct-invariant expected-el u.canonical-expected sub.actual-check next.actual-check)
13775− ?. ?=(%ok -.expected-check) expected-check
13776− =/ case-fit=ifit
13777− (program-single-case-fit i.args.actual-el i.args.expected-el sub.expected-check next.expected-check)
13778− case-fit
13779−::
13780−:: A direct view without a keyed each/turn site still needs the message type
13781−:: from the checked update. Recover only that closed component; final main
13782−:: checking remains the canonical program-kind boundary.
13783−++ program-plain-view-context
13784− |= [parts=[init=term update=term view=term subs=term] ds=(list def) resolution=iresolved initial=istate]
13785− ^- (unit iresolved)
13786− =/ env=ienv env.resolution
13787− ?^ (ienv-lookup %main env) ~
13788− ?^ (ienv-lookup view.parts env) ~
13789− =/ relation=(unit [message=itype model=itype])
13790− (program-update-relation update.parts ds env)
13791− ?~ relation ~
13792− =/ views=(list def)
13793− (skim ds |=(d=def &(?=(%value -.d) =(view.parts name.d))))
13794− ?. ?=([* ~] views) ~
13795− =/ view-def=def i.views
13796− ?> ?=(%value -.view-def)
13797− =/ written-view=(unit sample) (direct-gate-sample view-def)
13798− ?~ written-view ~
13799− =/ body=expr
13800− ?- -.val.view-def
13801− %gate body.val.view-def
13802− %gate-wide body.val.view-def
13803− * !!
13804− ==
13805− =/ sites=(unit (list iview-site)) (program-view-sites body ~)
13806− ?~ sites ~
13807− ?^ u.sites ~
13808− ?~ prelude.initial ~
13809− ?~ (ienv-lookup %program values.u.prelude.initial) ~
13810− =/ element=(unit ischeme) (find-jibb-mold %element u.prelude.initial)
13811− ?~ element ~
13812− =/ heads=(unit igate-prelude-evidence) (direct-prelude-evidence ds prelude.initial)
13813− ?~ heads ~
13814− ?~ (~(get by gates.u.heads) %program) ~
13815− =/ checked=(map term def) (direct-checked-gates ds env)
13816− =/ templates=ienv
13817− (turn molds.u.prelude.initial |=(x=[name=term template=ischeme] [name.x template.x]))
13818− =/ scanned=(unit dgscan)
13819− (dg-all-env-ids (weld env (weld values.u.prelude.initial templates)) 32.768 ~)
13820− ?~ scanned ~
13821− =. next.initial (dg-next-id ids.u.scanned 0)
13822− =/ view-state=istate (reserve-def-caps val.view-def initial)
13823− =/ sam=isample-result (infer-sample u.written-view env view-state)
13824− ?: ?=(%| -.sam) ~
13825− =/ actual-model=itype (program-inferred-sample typ.p.sam u.written-view)
13826− ?. ?=(~ (itype-vars actual-model)) ~
13827− ?: (itype-has-tag actual-model) ~
13828− =/ model-fit=ifit
13829− (direct-invariant actual-model model.u.relation sub.state.p.sam next.state.p.sam)
13830− ?. ?=(%ok -.model-fit) ~
13831− =/ product=(unit itype) (template-apply u.element ~[message.u.relation])
13832− ?~ product ~
13833− =/ st=istate
13834− state.p.sam(sub sub.model-fit, next next.model-fit, gate-defs checked, head-evidence heads)
13835− =/ inferred=iresult
13836− (infer-call-context-arg body u.product env.p.sam st (span-of body))
13837− ?: ?=(%| -.inferred) ~
13838− =/ product-fit=ifit
13839− (itype-fit typ.p.inferred u.product sub.state.p.inferred next.state.p.inferred)
13840− ?. ?=(%ok -.product-fit) ~
13841− =/ merged-product=itype
13842− (itype-merge-faces typ.p.inferred u.product sub.product-fit)
13843− =/ actual-cast=itype [%fn typ.p.sam merged-product]
13844− =/ closed=itype [%fn typ.p.sam u.product]
13845− =/ cast=ifit
13846− (itype-fit actual-cast closed sub.product-fit next.product-fit)
13847− ?. ?=(%ok -.cast) ~
13848− =/ merged=itype (itype-merge-faces actual-cast closed sub.cast)
13849− =/ adjusted=iresult
13850− [%& merged state.p.inferred(sub sub.cast, next next.cast)]
13851− =/ added=(unit iadded-definition)
13852− (add-supported-result view-def adjusted view-state env checked artifacts.resolution)
13853− ?~ added ~
13854− =/ recovered=(unit ischeme) (ienv-lookup view.parts env.u.added)
13855− ?~ recovered ~
13856− ?. ?=(~ vars.u.recovered) ~
13857− ?. ?=(~ (itype-vars typ.u.recovered)) ~
13858− `[env.u.added grouped.resolution artifacts.u.added]
13859−::
13860−:: Recover exactly one direct keyed each/turn row mapper, then its view.
13861−:: The prelude's own each and turn schemes determine the mapper gate: the
13862−:: key is inferred from the mapper body, never selected by this recovery.
13863−++ program-view-context
13864− |= [parts=[init=term update=term view=term subs=term] ds=(list def) resolution=iresolved initial=istate]
13865− ^- (unit iresolved)
13866− =/ env=ienv env.resolution
13867− ?^ (ienv-lookup %main env) ~
13868− ?^ (ienv-lookup view.parts env) ~
13869− =/ relation=(unit [message=itype model=itype])
13870− (program-update-relation update.parts ds env)
13871− ?~ relation ~
13872− =/ views=(list def)
13873− (skim ds |=(d=def &(?=(%value -.d) =(view.parts name.d))))
13874− ?. ?=([* ~] views) ~
13875− =/ view-def=def i.views
13876− ?> ?=(%value -.view-def)
13877− =/ written-view=(unit sample) (direct-gate-sample view-def)
13878− ?~ written-view ~
13879− =/ view-body=expr
13880− ?- -.val.view-def
13881− %gate body.val.view-def
13882− %gate-wide body.val.view-def
13883− * !!
13884− ==
13885− =/ sites=(unit (list iview-site)) (program-view-sites view-body ~)
13886− ?~ sites ~
13887− ?. ?=([* ~] u.sites) ~
13888− =/ site=iview-site i.u.sites
13889− =/ component-names=(list term) ~[init.parts update.parts view.parts subs.parts]
13890− ?: (lien component-names |=(n=term =(n mapper.site))) ~
13891− ?^ (ienv-lookup mapper.site env) ~
13892− =/ mappers=(list def)
13893− (skim ds |=(d=def &(?=(%value -.d) =(mapper.site name.d))))
13894− ?. ?=([* ~] mappers) ~
13895− =/ mapper-def=def i.mappers
13896− ?> ?=(%value -.mapper-def)
13897− =/ written-mapper=(unit sample) (direct-gate-sample mapper-def)
13898− ?~ written-mapper ~
13899− ?~ prelude.initial ~
13900− =/ program=(unit ischeme) (ienv-lookup %program values.u.prelude.initial)
13901− =/ each-scheme=(unit ischeme) (ienv-lookup %each values.u.prelude.initial)
13902− =/ turn-scheme=(unit ischeme) (ienv-lookup %turn values.u.prelude.initial)
13903− =/ element=(unit ischeme) (find-jibb-mold %element u.prelude.initial)
13904− =/ list-template=(unit ischeme) (find-jibb-mold %list u.prelude.initial)
13905− ?~ program ~
13906− ?~ each-scheme ~
13907− ?~ turn-scheme ~
13908− ?~ element ~
13909− ?~ list-template ~
13910− =/ heads=(unit igate-prelude-evidence) (direct-prelude-evidence ds prelude.initial)
13911− ?~ heads ~
13912− =/ written-program=(unit def) (~(get by gates.u.heads) %program)
13913− =/ written-each=(unit def) (~(get by gates.u.heads) %each)
13914− =/ written-turn=(unit def) (~(get by gates.u.heads) %turn)
13915− ?~ written-program ~
13916− ?~ written-each ~
13917− ?~ written-turn ~
13918− =/ program-sample=(unit sample) (direct-gate-sample u.written-program)
13919− =/ each-sample=(unit sample) (direct-gate-sample u.written-each)
13920− =/ turn-sample=(unit sample) (direct-gate-sample u.written-turn)
13921− ?~ program-sample ~
13922− ?~ each-sample ~
13923− ?~ turn-sample ~
13924− ?. ?=(%cell -.u.program-sample) ~
13925− ?. ?=([* * * * ~] items.u.program-sample) ~
13926− =/ turn-names=(unit [first=(unit term) second=(unit term)])
13927− (program-two-slot-names u.turn-sample)
13928− ?~ turn-names ~
13929− =/ checked=(map term def) (direct-checked-gates ds env)
13930− =/ templates=ienv
13931− (turn molds.u.prelude.initial |=(x=[name=term template=ischeme] [name.x template.x]))
13932− =/ scanned=(unit dgscan)
13933− (dg-all-env-ids (weld env (weld values.u.prelude.initial templates)) 32.768 ~)
13934− ?~ scanned ~
13935− =. next.initial (dg-next-id ids.u.scanned 0)
13936− =/ view-state=istate (reserve-def-caps val.view-def initial)
13937− =/ sam=isample-result (infer-sample u.written-view env view-state)
13938− ?: ?=(%| -.sam) ~
13939− =/ actual-model=itype (program-inferred-sample typ.p.sam u.written-view)
13940− =/ model-fit=ifit
13941− (direct-invariant actual-model model.u.relation sub.state.p.sam next.state.p.sam)
13942− ?. ?=(%ok -.model-fit) ~
13943− =/ xs-result=iresult
13944− (infer-fragment xs.site env.p.sam state.p.sam(sub sub.model-fit, next next.model-fit))
13945− ?: ?=(%| -.xs-result) ~
13946− =/ element-var=itype [%var next.state.p.xs-result]
13947− =/ list-a=(unit itype) (template-apply u.list-template ~[element-var])
13948− ?~ list-a ~
13949− =/ xs-fit=ifit
13950− (itype-fit typ.p.xs-result u.list-a sub.state.p.xs-result +(next.state.p.xs-result))
13951− ?. ?=(%ok -.xs-fit) ~
13952− =/ closed-xs=itype (itype-normalize u.list-a sub.xs-fit)
13953− ?^ (itype-vars closed-xs) ~
13954− ?: (itype-has-tag closed-xs) ~
13955− =/ each-instance=[typ=itype state=istate]
13956− (instantiate-scheme u.each-scheme state.p.xs-result(sub sub.xs-fit, next next.xs-fit))
13957− ?. ?=(%fn -.typ.each-instance) ~
13958− =/ turn-instance=[typ=itype state=istate]
13959− (instantiate-scheme u.turn-scheme state.each-instance)
13960− ?. ?=(%fn -.typ.turn-instance) ~
13961− ?. ?=(%cell -.sample.typ.turn-instance) ~
13962− =/ element-message=(unit itype)
13963− (template-apply u.element ~[message.u.relation])
13964− ?~ element-message ~
13965− =/ each-fit=ifit
13966− (itype-fit product.typ.each-instance u.element-message sub.state.turn-instance next.state.turn-instance)
13967− ?. ?=(%ok -.each-fit) ~
13968− =/ each-input=itype
13969− (program-inferred-sample sample.typ.each-instance u.each-sample)
13970− =/ turn-fit=ifit
13971− (itype-fit product.typ.turn-instance each-input sub.each-fit next.each-fit)
13972− ?. ?=(%ok -.turn-fit) ~
13973− =/ turn-list=itype
13974− (program-inferred-slot hed.sample.typ.turn-instance first.u.turn-names)
13975− =/ list-fit=ifit
13976− (itype-fit closed-xs turn-list sub.turn-fit next.turn-fit)
13977− ?. ?=(%ok -.list-fit) ~
13978− =/ mapper-type=itype
13979− (program-inferred-slot tal.sample.typ.turn-instance second.u.turn-names)
13980− =/ expected-mapper=itype (itype-normalize mapper-type sub.list-fit)
13981− ?. ?=(%fn -.expected-mapper) ~
13982− ?^ (itype-vars sample.expected-mapper) ~
13983− ?: (itype-has-tag sample.expected-mapper) ~
13984− :: These faces come from the source-backed each sample. Keeping them in
13985− :: the expected mapper product lets ordinary tuple inference supply key/el.
13986− ?. ?=(%cell -.product.expected-mapper) ~
13987− ?. ?=(%face -.hed.product.expected-mapper) ~
13988− ?. =(%key name.hed.product.expected-mapper) ~
13989− ?. ?=(%face -.tal.product.expected-mapper) ~
13990− ?. =(%el name.tal.product.expected-mapper) ~
13991− =/ mapper-state=istate
13992− (reserve-def-caps val.mapper-def initial(next next.list-fit))
13993− =/ mapper-sam=isample-result (infer-sample u.written-mapper env mapper-state)
13994− ?: ?=(%| -.mapper-sam) ~
13995− =/ mapper-input=itype (program-inferred-sample typ.p.mapper-sam u.written-mapper)
13996− =/ mapper-sample-fit=ifit
13997− (direct-invariant mapper-input sample.expected-mapper sub.state.p.mapper-sam next.state.p.mapper-sam)
13998− ?. ?=(%ok -.mapper-sample-fit) ~
13999− =/ mapper-product=itype
14000− (itype-normalize product.expected-mapper sub.mapper-sample-fit)
14001− =/ mapper-body=expr
14002− ?- -.val.mapper-def
14003− %gate body.val.mapper-def
14004− %gate-wide body.val.mapper-def
14005− * !!
14006− ==
14007− =/ mapper-inferred=iresult
14008− (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))
14009− ?: ?=(%| -.mapper-inferred) ~
14010− =/ ordinary-product-fit=ifit
14011− (itype-fit typ.p.mapper-inferred mapper-product sub.state.p.mapper-inferred next.state.p.mapper-inferred)
14012− =/ mapper-product-fit=ifit
14013− ?: ?=(%ok -.ordinary-product-fit) ordinary-product-fit
14014− (program-keyed-product-fit typ.p.mapper-inferred mapper-product u.element sub.state.p.mapper-inferred next.state.p.mapper-inferred)
14015− ?. ?=(%ok -.mapper-product-fit) ~
14016− =/ closed-mapper-product=itype
14017− (itype-normalize mapper-product sub.mapper-product-fit)
14018− ?^ (itype-vars closed-mapper-product) ~
14019− ?: (itype-has-tag closed-mapper-product) ~
14020− =/ merged-mapper-product=itype
14021− (itype-merge-faces typ.p.mapper-inferred closed-mapper-product sub.mapper-product-fit)
14022− =/ mapper-cast=itype [%fn typ.p.mapper-sam merged-mapper-product]
14023− =/ closed-mapper=itype [%fn typ.p.mapper-sam closed-mapper-product]
14024− =/ mapper-cast-fit=ifit
14025− (itype-fit mapper-cast closed-mapper sub.mapper-product-fit next.mapper-product-fit)
14026− ?. ?=(%ok -.mapper-cast-fit) ~
14027− =/ merged-mapper=itype
14028− (itype-merge-faces mapper-cast closed-mapper sub.mapper-cast-fit)
14029− =/ mapper-adjusted=iresult
14030− [%& merged-mapper state.p.mapper-inferred(sub sub.mapper-cast-fit, next next.mapper-cast-fit)]
14031− =/ mapper-added=(unit iadded-definition)
14032− (add-supported-result mapper-def mapper-adjusted mapper-state env checked artifacts.resolution)
14033− ?~ mapper-added ~
14034− =/ mapper-scheme=(unit ischeme) (ienv-lookup mapper.site env.u.mapper-added)
14035− ?~ mapper-scheme ~
14036− ?. ?=(~ vars.u.mapper-scheme) ~
14037− ?. ?=(~ (itype-vars typ.u.mapper-scheme)) ~
14038− =/ program-instance=[typ=itype state=istate]
14039− (instantiate-scheme u.program state.p.sam(next next.mapper-cast-fit))
14040− ?. ?=(%fn -.typ.program-instance) ~
14041− ?. ?=(%cell -.sample.typ.program-instance) ~
14042− ?. ?=(%cell -.tal.sample.typ.program-instance) ~
14043− ?. ?=(%cell -.tal.tal.sample.typ.program-instance) ~
14044− =/ expected-view=(unit itype)
14045− (direct-slot-body hed.tal.tal.sample.typ.program-instance (direct-sample-name i.t.t.items.u.program-sample))
14046− ?~ expected-view ~
14047− ?. ?=(%fn -.u.expected-view) ~
14048− =/ canonical-view=itype [%fn model.u.relation u.element-message]
14049− =/ view-fit=ifit
14050− (direct-invariant canonical-view u.expected-view sub.state.program-instance next.state.program-instance)
14051− ?. ?=(%ok -.view-fit) ~
14052− =/ closed-view=itype
14053− (itype-normalize [%fn typ.p.sam u.element-message] sub.view-fit)
14054− ?. ?=(%fn -.closed-view) ~
14055− =/ view-env=ienv [[mapper.site u.mapper-scheme] env.p.sam]
14056− =/ final-view-state=istate
14057− (reserve-def-caps val.view-def state.p.sam(next next.view-fit, gate-defs checked.u.mapper-added, head-evidence heads))
14058− =/ inferred=iresult
14059− (infer-call-context-arg view-body product.closed-view view-env final-view-state (span-of view-body))
14060− ?: ?=(%| -.inferred) ~
14061− =/ product-fit=ifit
14062− (itype-fit typ.p.inferred product.closed-view sub.state.p.inferred next.state.p.inferred)
14063− ?. ?=(%ok -.product-fit) ~
14064− =/ merged-product=itype
14065− (itype-merge-faces typ.p.inferred product.closed-view sub.product-fit)
14066− =/ actual-cast=itype [%fn typ.p.sam merged-product]
14067− =/ cast=ifit
14068− (itype-fit actual-cast closed-view sub.product-fit next.product-fit)
14069− ?. ?=(%ok -.cast) ~
14070− =/ merged=itype (itype-merge-faces actual-cast closed-view sub.cast)
14071− =/ adjusted=iresult
14072− [%& merged state.p.inferred(sub sub.cast, next next.cast)]
14073− =/ added=(unit iadded-definition)
14074− (add-supported-result view-def adjusted final-view-state env.u.mapper-added checked.u.mapper-added artifacts.u.mapper-added)
14075− ?~ added ~
14076− =/ recovered=(unit ischeme) (ienv-lookup view.parts env.u.added)
14077− ?~ recovered ~
14078− ?. ?=(~ vars.u.recovered) ~
14079− ?. ?=(~ (itype-vars typ.u.recovered)) ~
14080− `[env.u.added grouped.resolution artifacts.u.added]
14081−::
14082−++ program-init-null-sample
14083− |= d=def
14084− ^- ?
14085− =/ written=(unit sample) (direct-gate-sample d)
14086− ?~ written |
14087− ?. ?=(%bare -.u.written) |
14088− =/ sh=shape shape.u.written
14089− ?. ?=(%const -.sh) |
14090− =(%null form.lit.sh)
14091−::
14092−:: The tuple-ending-null initializer retry above intentionally keeps its own
14093−:: boundary. A direct null-sample initializer can instead receive the closed
14094−:: model already established by update, view and subscriptions.
14095−++ program-plain-init-context
14096− |= [parts=[init=term update=term view=term subs=term] ds=(list def) resolution=iresolved initial=istate]
14097− ^- (unit iresolved)
14098− =/ env=ienv env.resolution
14099− ?^ (ienv-lookup %main env) ~
14100− ?^ (ienv-lookup init.parts env) ~
14101− ?~ (ienv-lookup update.parts env) ~
14102− ?~ (ienv-lookup view.parts env) ~
14103− ?~ (ienv-lookup subs.parts env) ~
14104− =/ relation=(unit [message=itype model=itype])
14105− (program-update-relation update.parts ds env)
14106− ?~ relation ~
14107− =/ inits=(list def)
14108− (skim ds |=(d=def &(?=(%value -.d) =(init.parts name.d))))
14109− ?. ?=([* ~] inits) ~
14110− =/ init-def=def i.inits
14111− ?> ?=(%value -.init-def)
14112− ?. (program-init-null-sample init-def) ~
14113− =/ written=(unit sample) (direct-gate-sample init-def)
14114− ?~ written ~
14115− =/ body=expr
14116− ?- -.val.init-def
14117− %gate body.val.init-def
14118− %gate-wide body.val.init-def
14119− * !!
14120− ==
14121− ?~ prelude.initial ~
14122− ?~ (ienv-lookup %program values.u.prelude.initial) ~
14123− =/ heads=(unit igate-prelude-evidence) (direct-prelude-evidence ds prelude.initial)
14124− ?~ heads ~
14125− ?~ (~(get by gates.u.heads) %program) ~
14126− =/ checked=(map term def) (direct-checked-gates ds env)
14127− =/ templates=ienv
14128− (turn molds.u.prelude.initial |=(x=[name=term template=ischeme] [name.x template.x]))
14129− =/ scanned=(unit dgscan)
14130− (dg-all-env-ids (weld env (weld values.u.prelude.initial templates)) 32.768 ~)
14131− ?~ scanned ~
14132− =. next.initial (dg-next-id ids.u.scanned 0)
14133− =/ init-state=istate (reserve-def-caps val.init-def initial)
14134− =/ sam=isample-result (infer-sample u.written env init-state)
14135− ?: ?=(%| -.sam) ~
14136− ?. ?=(~ (itype-vars typ.p.sam)) ~
14137− ?: (itype-has-tag typ.p.sam) ~
14138− =/ st=istate state.p.sam(gate-defs checked, head-evidence heads)
14139− =/ inferred=iresult
14140− (infer-call-context-arg body model.u.relation env.p.sam st (span-of body))
14141− ?: ?=(%| -.inferred) ~
14142− =/ product-fit=ifit
14143− (itype-fit typ.p.inferred model.u.relation sub.state.p.inferred next.state.p.inferred)
14144− ?. ?=(%ok -.product-fit) ~
14145− =/ merged-product=itype
14146− (itype-merge-faces typ.p.inferred model.u.relation sub.product-fit)
14147− =/ actual-cast=itype [%fn typ.p.sam merged-product]
14148− =/ closed=itype [%fn typ.p.sam model.u.relation]
14149− =/ cast=ifit
14150− (itype-fit actual-cast closed sub.product-fit next.product-fit)
14151− ?. ?=(%ok -.cast) ~
14152− =/ merged=itype (itype-merge-faces actual-cast closed sub.cast)
14153− =/ adjusted=iresult
14154− [%& merged state.p.inferred(sub sub.cast, next next.cast)]
14155− =/ added=(unit iadded-definition)
14156− (add-supported-result init-def adjusted init-state env checked artifacts.resolution)
14157− ?~ added ~
14158− =/ recovered=(unit ischeme) (ienv-lookup init.parts env.u.added)
14159− ?~ recovered ~
14160− ?. ?=(~ vars.u.recovered) ~
14161− ?. ?=(~ (itype-vars typ.u.recovered)) ~
14162− `[env.u.added grouped.resolution artifacts.u.added]
14163−::
14164−:: Recover only the initializer of an already recognized direct program main.
14165−:: The derived call is evidence for an ordinary init/main retry, never an
14166−:: interface to publish on its own. Any failure returns the original resolution.
14167−++ program-init-context
14168− |= [main=def parts=[init=term update=term view=term subs=term] ds=(list def) resolution=iresolved initial=istate]
14169− ^- (unit iresolved)
14170− =/ env=ienv env.resolution
14171− ?^ (ienv-lookup %main env) ~
14172− ?^ (ienv-lookup init.parts env) ~
14173− =/ update=(unit ischeme) (ienv-lookup update.parts env)
14174− =/ view=(unit ischeme) (ienv-lookup view.parts env)
14175− =/ subs=(unit ischeme) (ienv-lookup subs.parts env)
14176− ?~ update ~
14177− ?~ view ~
14178− ?~ subs ~
14179− =/ inits=(list def)
14180− (skim ds |=(d=def &(?=(%value -.d) =(init.parts name.d))))
14181− ?. ?=([* ~] inits) ~
14182− =/ init-def=def i.inits
14183− ?> ?=(%value -.init-def)
14184− ?. (program-init-tuple-null init-def) ~
14185− =/ args=(unit (list expr)) (program-main-args main)
14186− ?~ args ~
14187− ?~ prelude.initial ~
14188− =/ program=(unit ischeme) (ienv-lookup %program values.u.prelude.initial)
14189− ?~ program ~
14190− =/ heads=(unit igate-prelude-evidence) (direct-prelude-evidence ds prelude.initial)
14191− ?~ heads ~
14192− =/ written=(unit def) (~(get by gates.u.heads) %program)
14193− ?~ written ~
14194− =/ written-sample=(unit sample) (direct-gate-sample u.written)
14195− ?~ written-sample ~
14196− ?. ?=(%cell -.u.written-sample) ~
14197− ?~ items.u.written-sample ~
14198− =/ checked=(map term def) (direct-checked-gates ds env)
14199− =/ templates=ienv
14200− (turn molds.u.prelude.initial |=(x=[name=term template=ischeme] [name.x template.x]))
14201− =/ scanned=(unit dgscan)
14202− (dg-all-env-ids (weld env (weld values.u.prelude.initial templates)) 32.768 ~)
14203− ?~ scanned ~
14204− =. next.initial (dg-next-id ids.u.scanned 0)
14205− =/ instance=[typ=itype state=istate] (instantiate-scheme u.program initial)
14206− ?. ?=(%fn -.typ.instance) ~
14207− ?. ?=(%cell -.sample.typ.instance) ~
14208− =/ expected-init=(unit itype)
14209− (direct-slot-body hed.sample.typ.instance (direct-sample-name i.items.u.written-sample))
14210− ?~ expected-init ~
14211− ?. ?=(%fn -.u.expected-init) ~
14212− ?. ?=(%var -.sample.u.expected-init) ~
14213− =/ data=@ud id.sample.u.expected-init
14214− =/ init-var=itype [%var next.state.instance]
14215− =/ st=istate state.instance(next +(next.state.instance))
14216− =/ up=[typ=itype state=istate] (instantiate-scheme u.update st)
14217− =/ vw=[typ=itype state=istate] (instantiate-scheme u.view state.up)
14218− =/ sb=[typ=itype state=istate] (instantiate-scheme u.subs state.vw)
14219− =. st state.sb(gate-defs checked, head-evidence heads)
14220− =/ actual=itype [%cell init-var [%cell typ.up [%cell typ.vw typ.sb]]]
14221− =/ fit=ifit
14222− (direct-positional-fit u.args items.u.written-sample actual sample.typ.instance env st sub.st next.st)
14223− ?. ?=(%ok -.fit) ~
14224− =/ actual-final=itype (itype-normalize actual sub.fit)
14225− =/ expected-final=itype (itype-normalize sample.typ.instance sub.fit)
14226− =/ open=(list @ud)
14227− (unique-type-vars (weld (itype-vars actual-final) (itype-vars expected-final)))
14228− ?. (levy open |=(n=@ud =(data n))) ~
14229− ?: |((itype-has-tag actual-final) (itype-has-tag expected-final)) ~
14230− =/ replay=ifit
14231− (direct-positional-fit u.args items.u.written-sample actual sample.typ.instance env st sub.fit next.fit)
14232− ?. ?=(%ok -.replay) ~
14233− ?. &(=(sub.fit sub.replay) =(next.fit next.replay)) ~
14234− =/ expected=itype (itype-normalize u.expected-init sub.fit)
14235− ?. ?=(%fn -.expected) ~
14236− =. st st(sub sub.fit, next next.fit)
14237− =/ init-state=istate (reserve-def-caps val.init-def st)
14238− =/ inferred=iresult (infer-fragment val.init-def env init-state)
14239− =? inferred ?=(%| -.inferred) (infer-recursive-gate init-def env init-state)
14240− ?: ?=(%| -.inferred) ~
14241− ?. ?=(%fn -.typ.p.inferred) ~
14242− ?^ (itype-vars sample.typ.p.inferred) ~
14243− =/ data-fit=ifit
14244− (itype-fit sample.typ.p.inferred sample.expected sub.state.p.inferred next.state.p.inferred)
14245− ?. ?=(%ok -.data-fit) ~
14246− =/ closed=itype (itype-normalize expected sub.data-fit)
14247− ?. ?=(%fn -.closed) ~
14248− :: Resolve the ordinary tuple cast first, then check the complete gate.
14249− :: General function fit remains unchanged; only this recovered candidate
14250− :: receives the derived result context before its whole-type cast fit.
14251− =/ product-fit=ifit
14252− (itype-fit product.typ.p.inferred product.closed sub.data-fit next.data-fit)
14253− ?. ?=(%ok -.product-fit) ~
14254− =/ product=itype
14255− (itype-merge-faces product.typ.p.inferred product.closed sub.product-fit)
14256− =/ actual-cast=itype [%fn sample.typ.p.inferred product]
14257− =/ cast=ifit
14258− (itype-fit actual-cast closed sub.product-fit next.product-fit)
14259− ?. ?=(%ok -.cast) ~
14260− =/ merged=itype (itype-merge-faces actual-cast closed sub.cast)
14261− =/ adjusted=iresult
14262− [%& merged state.p.inferred(sub sub.cast, next next.cast)]
14263− =/ added=(unit iadded-definition)
14264− (add-supported-result init-def adjusted init-state env checked artifacts.resolution)
14265− ?~ added ~
14266− =/ recovered=(unit ischeme) (ienv-lookup init.parts env.u.added)
14267− ?~ recovered ~
14268− ?. ?=(~ vars.u.recovered) ~
14269− ?. ?=(~ (itype-vars typ.u.recovered)) ~
14270− `[env.u.added grouped.resolution artifacts.u.added]
14271−::
14272−++ derived-poke-command-scheme
14273− |= [prelude=ifile action=itype]
14274− ^- (unit ischeme)
14275− =/ prep=iprelude [prelude ~ ~]
14276− =/ raw=(unit ischeme) (compatible-raw-poke prep)
14277− ?~ raw ~
14278− =/ command=(unit ischeme) (find-jibb-mold %cmd prelude)
14279− =/ unit-template=(unit ischeme) (find-jibb-mold %unit prelude)
14280− ?~ command ~
14281− ?~ unit-template ~
14282− ?. (standard-unit-template u.unit-template /lib/jibb/prelude/jibb) ~
14283− ?. ?=([@ ~] vars.u.command) ~
14284− ?. ?=(%union -.typ.u.command) ~
14285− ?. =(origin.typ.u.command `[/lib/jibb/prelude/jibb %cmd]) ~
14286− ?. (identity-union-parameters vars.u.command args.typ.u.command) ~
14287− =/ m=@ud i.vars.u.command
14288− ?: (itype-var-is-atom m typ.u.command) ~
14289− ?. (levy (itype-vars typ.u.command) |=(n=@ud =(n m))) ~
14290− ?: (itype-has-tag typ.u.command) ~
14291− =/ error=(unit itype) (template-apply u.unit-template ~[[%atom %t]])
14292− ?~ error ~
14293− ?. ?=(%union -.typ.u.raw) ~
14294− =/ poke-case=itype
14295− [%cell [%const [%term %tas %poke '%poke']] [%cell [%face %p typ.u.raw(label `'raw-poke')] [%face %reply [%fn u.error [%var m]]]]]
14296− =/ go-case=itype
14297− [%cell [%const [%term %tas %go '%go']] [%face %url [%atom %t]]]
14298− =/ wait-case=itype
14299− [%cell [%const [%term %tas %wait '%wait']] [%cell [%face %gap [%atom %dr]] [%face %msg [%var m]]]]
14300− =/ now-case=itype
14301− [%cell [%const [%term %tas %now '%now']] [%face %reply [%fn [%atom %da] [%var m]]]]
14302− =/ who-case=itype
14303− [%cell [%const [%term %tas %who '%who']] [%face %reply [%fn [%atom %p] [%var m]]]]
14304− ?. =(cases.typ.u.command ~[poke-case go-case wait-case now-case who-case]) ~
14305− =/ command-result=(unit itype) (template-apply u.command ~[[%var 0]])
14306− ?~ command-result ~
14307− `[[%fn [%cell action [%fn u.error [%var 0]]] u.command-result] ~[0]]
14308−::
14309−++ store-derived-schemes
14310− |= [prelude=ifile values=(list term) molds=(list term) state=itype action=itype]
14311− ^- (unit [state=ischeme action=ischeme])
14312− =/ prep=iprelude [prelude values molds]
14313− =/ ask=(unit ischeme) (request-compatible-ask prep)
14314− ?~ ask ~
14315− ?^ (itype-vars state) ~
14316− ?^ (itype-vars action) ~
14317− ?: |((itype-has-tag state) (itype-has-tag action)) ~
14318− =/ result=(unit itype) (template-apply u.ask ~[[%var 0]])
14319− ?~ result ~
14320− =/ request=ischeme [[%fn [%fn state [%var 0]] u.result] ~[0]]
14321− =/ constructor=(unit ischeme) (derived-poke-command-scheme prelude action)
14322− ?~ constructor ~
14323− `[request u.constructor]
14324−::
14325−++ program-subs-watch
14326− |= [d=def imports=ijimports graph=irequest-graph prelude=ifile]
14327− ^- ?
14328− ?. ?=(%value -.d) |
14329− ?. |(?=(%gate -.val.d) ?=(%gate-wide -.val.d)) |
14330− =/ body=expr
14331− ?- -.val.d
14332− %gate body.val.d
14333− %gate-wide body.val.d
14334− * val.d
14335− ==
14336− =. body (program-transparent body)
14337− ?. ?=(%list -.body) |
14338− ?. ?=([* ~] items.body) |
14339− =/ watch=expr (program-transparent i.items.body)
14340− ?. ?=(%tuple -.watch) |
14341− ?. ?=([* * ~] items.watch) |
14342− =/ tag=item i.items.watch
14343− =/ payload=item i.t.items.watch
14344− ?. &(?=(~ face.tag) ?=(~ face.payload)) |
14345− =/ tag-expr=expr (program-transparent val.tag)
14346− ?. ?=(%lit -.tag-expr) |
14347− ?. &(?=(%term form.lit.tag-expr) =(%watch val.lit.tag-expr)) |
14348− =/ request=expr (program-transparent val.payload)
14349− ?. ?=(%call -.request) |
14350− ?. ?=([* ~] args.request) |
14351− =/ head=expr (program-transparent head.request)
14352− ?. ?=(%wing -.head) |
14353− ?. ?=([@ @ ~] names.head) |
14354− =/ case=term i.names.head
14355− =/ face=term i.t.names.head
14356− =/ callback=expr (program-transparent i.args.request)
14357− ?. ?=(%ctor -.callback) |
14358− ?. ?=(%term form.tag.callback) |
14359− ?| ?=(^ (derived-request-member case face imports graph prelude))
14360− ?=(^ (derived-store-request-member case face imports graph prelude))
14361− ==
14362−::
14363−:: Exact derived-member and request-evidence identity, shared by direct
14364−:: program watches and direct data-page loads. Only a plain request in the
14365−:: selected interface's own source-backed graph can establish this shape.
14366−++ derived-request-member
14367− |= [case=term face=term imports=ijimports graph=irequest-graph prelude=ifile]
14368− ^- (unit ischeme)
14369− =/ selected=(list [face=term interface=ifile])
14370− (skim imports |=(j=[face=term interface=ifile] =(face face.j)))
14371− ?. ?=([* ~] selected) ~
14372− =/ iface=ifile interface.i.selected
14373− =/ member=(unit ischeme) (ienv-lookup case values.iface)
14374− ?~ member ~
14375− ?~ source.iface ~
14376− =/ evidence=(list irequest-evidence)
14377− (skim requests.graph |=(r=irequest-evidence &(=(api-at.r at.iface) =(name.r case))))
14378− ?. ?=([* ~] evidence) ~
14379− =/ request-evidence=irequest-evidence i.evidence
14380− ?. =(u.source.iface api-source.request-evidence) ~
14381− ?. =(name.path.path.request-evidence case) ~
14382− ?~ graph.iface ~
14383− ?. (lien requests.u.graph.iface |=(r=irequest-evidence =(r request-evidence))) ~
14384− ?. ?=(~ scry.path.path.request-evidence) ~
14385− ?. &(?=(~ diffs.path.request-evidence) ?=(~ diffs.path.path.request-evidence)) ~
14386− ?: (lien segments.path.path.request-evidence |=(p=pseg !?=(%knot -.p))) ~
14387− ?. ?=([@ ~] vars.u.member) ~
14388− =/ message=@ud i.vars.u.member
14389− ?. ?=(%fn -.typ.u.member) ~
14390− ?. ?=(%fn -.sample.typ.u.member) ~
14391− ?. =(sample.sample.typ.u.member full.path.request-evidence) ~
14392− ?. =(product.sample.typ.u.member [%var message]) ~
14393− =/ prep=iprelude [prelude prelude-values.graph prelude-molds.graph]
14394− =/ ask=(unit ischeme) (request-compatible-ask prep)
14395− ?~ ask ~
14396− =/ result=(unit itype) (template-apply u.ask ~[[%var message]])
14397− ?~ result ~
14398− ?. =(product.typ.u.member u.result) ~
14399− member
14400−::
14401−:: Store state is watchable by definition, but only the actual derived member
14402−:: of the uniquely selected source-bound store interface proves that fact.
14403−++ derived-store-request-member
14404− |= [case=term face=term imports=ijimports graph=irequest-graph prelude=ifile]
14405− ^- (unit ischeme)
14406− ?. =(%state case) ~
14407− =/ selected=(list [face=term interface=ifile])
14408− (skim imports |=(j=[face=term interface=ifile] =(face face.j)))
14409− ?. ?=([* ~] selected) ~
14410− =/ iface=ifile interface.i.selected
14411− =/ member=(unit ischeme) (ienv-lookup %state values.iface)
14412− ?~ member ~
14413− ?~ source.iface ~
14414− =/ evidence=(list istore-request-evidence)
14415− (skim stores.graph |=(r=istore-request-evidence =(store-at.r at.iface)))
14416− ?. ?=([* ~] evidence) ~
14417− =/ request=istore-request-evidence i.evidence
14418− ?. =(u.source.iface source.request) ~
14419− ?~ graph.iface ~
14420− ?. (lien stores.u.graph.iface |=(r=istore-request-evidence =(r request))) ~
14421− =/ derived=(unit [state=ischeme action=ischeme])
14422− (store-derived-schemes prelude prelude-values.graph prelude-molds.graph state.request action.request)
14423− ?~ derived ~
14424− ?. =(u.member state.u.derived) ~
14425− =/ constructor=(unit ischeme) (ienv-lookup action-name.request values.iface)
14426− ?~ constructor ~
14427− ?. =(u.constructor action.u.derived) ~
14428− member
14429−::
14430−++ program-main-context
14431− |= [main=def ds=(list def) resolution=iresolved initial=istate]
14432− ^- iresolved
14433− ?^ (ienv-lookup %main env.resolution) resolution
14434− =/ heads=(unit igate-prelude-evidence)
14435− (direct-prelude-evidence ds prelude.initial)
14436− ?~ heads resolution
14437− =/ checked=(map term def) (direct-checked-gates ds env.resolution)
14438− =/ completed=[env=ienv artifacts=(list iwidth-definition)]
14439− (add-supported-defs-core ~[main] 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)
14440− [env.completed grouped.resolution artifacts.completed]
14441−::
14442−:: A static main may retain a generic element message in its ordinary
14443−:: scheme. Instantiate that scheme, specialize it to canonical element !!,
14444−:: and publish only the resulting closed scheme.
14445−++ static-main-specialized
14446− |= [env=ienv prelude=(unit ifile)]
14447− ^- (unit ischeme)
14448− ?~ prelude ~
14449− =/ element=(unit ischeme) (find-jibb-mold %element u.prelude)
14450− ?~ element ~
14451− =/ main=(unit ischeme) (ienv-lookup %main env)
14452− ?~ main ~
14453− =/ canonical=(unit itype) (template-apply u.element ~[[%empty ~]])
14454− ?~ canonical ~
14455− =/ instance=[typ=itype state=istate] (instantiate-scheme u.main *istate)
14456− =/ fit=ifit (itype-fit typ.instance u.canonical ~ next.state.instance)
14457− ?. ?=(%ok -.fit) ~
14458− =/ closed=itype (itype-normalize typ.instance sub.fit)
14459− ?^ (itype-vars closed) ~
14460− ?: (itype-has-tag closed) ~
14461− ?. ?=(%union -.closed) ~
14462− ?. ?=(%union -.u.canonical) ~
14463− ?. &(=(origin.closed origin.u.canonical) =(args.closed args.u.canonical)) ~
14464− =/ exact=ifit (direct-invariant closed u.canonical ~ next.fit)
14465− ?. ?=(%ok -.exact) ~
14466− `[u.canonical ~]
14467−::
14468−:: The load of a direct data page must itself be a direct gate whose
14469−:: transparent body is one plain derived request with a wing or ctor reply.
14470−++ page-load-derived
14471− |= [name=term ds=(list def) imports=ijimports graph=irequest-graph prelude=ifile]
14472− ^- ?
14473− =/ loads=(list def)
14474− (skim ds |=(d=def &(?=(%value -.d) =(name name.d))))
14475− ?. ?=([* ~] loads) |
14476− =/ load=def i.loads
14477− ?> ?=(%value -.load)
14478− ?. |(?=(%gate -.val.load) ?=(%gate-wide -.val.load)) |
14479− =/ body=expr
14480− ?- -.val.load
14481− %gate body.val.load
14482− %gate-wide body.val.load
14483− * !!
14484− ==
14485− =. body (program-transparent body)
14486− ?. ?=(%call -.body) |
14487− ?. ?=([* ~] args.body) |
14488− =/ head=expr (program-transparent head.body)
14489− ?. ?=(%wing -.head) |
14490− ?. ?=([@ @ ~] names.head) |
14491− =/ reply=expr (program-transparent i.args.body)
14492− ?. ?| &(?=(%wing -.reply) ?=([@ ~] names.reply))
14493− &(?=(%ctor -.reply) ?=(%term form.tag.reply))
14494− ==
14495− |
14496− ?=(^ (derived-request-member i.names.head i.t.names.head imports graph prelude))
14497−::
14498−++ page-main-closed
14499− |= [parts=[load=term view=term] ds=(list def) env=ienv prelude=(unit ifile) imports=ijimports graph=irequest-graph]
14500− ^- ?
14501− ?~ prelude |
14502− =/ page=(unit ischeme) (find-jibb-mold %page u.prelude)
14503− ?~ page |
14504− =/ main=(unit ischeme) (ienv-lookup %main env)
14505− ?~ main |
14506− ?. ?=(~ vars.u.main) |
14507− ?. ?=(~ (itype-vars typ.u.main)) |
14508− =/ instance=[typ=itype state=istate] (instantiate-scheme u.page *istate)
14509− =/ main-fit=ifit (direct-invariant typ.u.main typ.instance ~ next.state.instance)
14510− ?. ?=(%ok -.main-fit) |
14511− (page-load-derived load.parts ds imports graph u.prelude)
14512−::
14513−++ program-main-closed
14514− |= [parts=[init=term update=term view=term subs=term] ds=(list def) env=ienv prelude=(unit ifile) imports=ijimports graph=irequest-graph]
14515− ^- ?
14516− ?~ prelude |
14517− ?~ (ienv-lookup %program values.u.prelude) |
14518− =/ program=(unit ischeme) (find-jibb-mold %program u.prelude)
14519− ?~ program |
14520− =/ main=(unit ischeme) (ienv-lookup %main env)
14521− ?~ main |
14522− ?. ?=(~ vars.u.main) |
14523− ?. ?=(~ (itype-vars typ.u.main)) |
14524− =/ instance=[typ=itype state=istate] (instantiate-scheme u.program *istate)
14525− =/ main-fit=ifit (direct-invariant typ.u.main typ.instance ~ next.state.instance)
14526− ?. ?=(%ok -.main-fit) |
14527− =/ init=(unit ischeme) (ienv-lookup init.parts env)
14528− ?~ init |
14529− ?. ?=(~ vars.u.init) |
14530− ?. ?=(%fn -.typ.u.init) |
14531− ?. ?=(~ (itype-vars sample.typ.u.init)) |
14532− ?. ?=(~ (itype-vars product.typ.u.init)) |
14533− =/ data=igate-free (gate-free-type sample.typ.u.init 256 ~)
14534− ?. =(%yes verdict.data) |
14535− =/ model=igate-free (gate-free-type product.typ.u.init left.data ~)
14536− ?. =(%yes verdict.model) |
14537− =/ subs=(list def)
14538− (skim ds |=(d=def &(?=(%value -.d) =(subs.parts name.d))))
14539− ?. ?=([* ~] subs) |
14540− |((program-subs-empty i.subs) (program-subs-watch i.subs imports graph u.prelude))
14541−::
14542−:: The two outer sample faces are binder names, not part of the action/state
14543−:: relation. Leave every face inside either component untouched.
14544−++ store-update-unfaced
14545− |= typ=itype
14546− ^- itype
14547− ?. ?=(%fn -.typ) typ
14548− ?. ?=(%cell -.sample.typ) typ
14549− =/ head=itype hed.sample.typ
14550− =/ tail=itype tal.sample.typ
14551− =? head ?=(%face -.head) body.head
14552− =? tail ?=(%face -.tail) body.tail
14553− typ(sample [%cell head tail])
14554−::
14555−:: The builder erases the action from main. Recover it only from the local
14556−:: poke mold and check both ordinary components invariantly.
14557−++ store-main-closed
14558− |= [parts=[init=term update=term] action=term env=ienv molds=imold-types prelude=(unit ifile)]
14559− ^- (unit ischeme)
14560− ?~ prelude ~
14561− =/ builder=(unit ischeme) (ienv-lookup %store values.u.prelude)
14562− ?~ builder ~
14563− ?. ?=([@ @ ~] vars.u.builder) ~
14564− =/ state-var=@ud i.vars.u.builder
14565− =/ action-var=@ud i.t.vars.u.builder
14566− ?: =(state-var action-var) ~
14567− =/ builder-sample=itype
14568− [%cell [%face %init [%var state-var]] [%face %update [%fn [%cell [%var action-var] [%var state-var]] [%var state-var]]]]
14569− =/ builder-product=itype [%cell [%face %init [%var state-var]] [%face %update [%noun ~]]]
14570− ?. =(typ.u.builder [%fn builder-sample builder-product]) ~
14571− =/ store=(unit ischeme) (find-jibb-mold %store u.prelude)
14572− ?~ store ~
14573− ?. ?=([@ ~] vars.u.store) ~
14574− ?. =(typ.u.store [%cell [%face %init [%var i.vars.u.store]] [%face %update [%noun ~]]]) ~
14575− =/ state=(unit ischeme) (find-jibb-mold %state [~ molds /tmp ~ ~ ~ ~ ~])
14576− ?~ state ~
14577− =/ action-mold=(unit ischeme) (find-jibb-mold action [~ molds /tmp ~ ~ ~ ~ ~])
14578− ?~ action-mold ~
14579− ?. &(?=(~ vars.u.state) ?=(~ (itype-vars typ.u.state))) ~
14580− ?. &(?=(~ vars.u.action-mold) ?=(~ (itype-vars typ.u.action-mold))) ~
14581− =/ canonical=(unit itype) (template-apply u.store ~[typ.u.state])
14582− ?~ canonical ~
14583− =/ main=(unit ischeme) (ienv-lookup %main env)
14584− =/ main-fit=(unit ifit)
14585− ?~(main ~ `(direct-invariant typ.u.main u.canonical ~ 0))
14586− =/ main-ok=?
14587− ?~ main &
14588− ?. ?=(~ vars.u.main) |
14589− ?. ?=(~ (itype-vars typ.u.main)) |
14590− ?~ main-fit |
14591− ?=(%ok -.u.main-fit)
14592− ?. main-ok ~
14593− =/ init=(unit ischeme) (ienv-lookup init.parts env)
14594− ?~ init ~
14595− ?. ?=(~ vars.u.init) ~
14596− ?. ?=(~ (itype-vars typ.u.init)) ~
14597− =/ init-fit=ifit (direct-invariant typ.u.init typ.u.state ~ 0)
14598− ?. ?=(%ok -.init-fit) ~
14599− =/ update=(unit ischeme) (ienv-lookup update.parts env)
14600− ?~ update ~
14601− ?. ?=(~ vars.u.update) ~
14602− ?. ?=(~ (itype-vars typ.u.update)) ~
14603− =/ expected=itype [%fn [%cell typ.u.action-mold typ.u.state] typ.u.state]
14604− =/ update-fit=ifit (direct-invariant (store-update-unfaced typ.u.update) expected ~ 0)
14605− ?. ?=(%ok -.update-fit) ~
14606− `[u.canonical ~]
14607−::
14608++ infer-jibb-file
12390++ infer-jibb-file
14609 |= [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)]
12391 |= [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)]
14610 ^- jfile-result
12392 ^- jfile-result
14611− =/ out=jfile-detailed-result
14612− (infer-jibb-file-detailed at src externals mark-externals modules active prelude-values prelude-molds cache prelude)
14613− ?: ?=(%| -.out) [%| message.p.out]
14614− [%& p.out]
14615−:: Returns structured root-source overlap evidence after the same full check.
14616−++ infer-jibb-file-detailed
14617− |= [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)]
14618− ^- jfile-detailed-result
14619 =/ parsed (parse at src)
12393 =/ parsed (parse at src)
14620− ?: ?=(%| -.parsed) [%| [(crip "module source does not parse: {(spud at)}") ~]]
12394+ ?: ?=(%| -.parsed) [%| (crip "module source does not parse: {(spud at)}")]
14621 =/ mod=module p.parsed
12395 =/ mod=module p.parsed
14622 =/ duplicate=(unit idiag) (duplicate-defs defs.mod)
12396 =/ duplicate=(unit idiag) (duplicate-defs defs.mod)
14623− ?^ duplicate [%| [(show-duplicate-fields at src u.duplicate) ~]]
12397+ ?^ duplicate [%| (show-duplicate-fields at src u.duplicate)]
14624− ?: &(?=([%ui %api *] at) ?=(^ (program-main-def defs.mod)))
14625− [%| [(crip "module kind needs unsupported inference: {(spud at)}") ~]]
14626 ?: ?=([%ui %api *] at)
12398 ?: ?=([%ui %api *] at)
14627− =/ poke=(each ifile @t)
14628− (api-poke-interface-result at mod mark-externals prelude-values prelude-molds prelude)
12399+ =/ iface=(unit ifile) (api-poke-interface at mod mark-externals prelude-values prelude-molds prelude)
14629− ?: ?=(%& -.poke)
14630− =/ iface=ifile p.poke
12400+ ?^ iface
14631− =/ checked=ifile iface(source `src, graph `[(silt `(list path)`~[at]) ~ ~ modules prelude prelude-values prelude-molds externals mark-externals])
12401+ =/ checked=ifile u.iface(source `src, graph `[(silt `(list path)`~[at]) ~ modules prelude prelude-values prelude-molds externals mark-externals])
14632 [%& [checked [[at checked] cache]]]
12402 [%& [checked [[at checked] cache]]]
14633− :: A clashing derived name is an error wherever the checks below stop.
14634− =/ clash=(unit idiag)
14635− ?. ?=([%ui %api @ %jibb ~] at) ~
14636− (api-derived-clash mod prelude-values)
14637− ?^ clash [%| [(show-duplicate-fields at src u.clash) ~]]
14638− :: So is a name conflict in its scope, reported as for other modules.
14639− :: `+$ paths` and `+$ poke` are declarations, not molds (overview), and
14640− :: a `/%` mark names a mold, so it conflicts only with another mark or
14641− :: mold: `/% %todos` beside the request `todos` is the usual API.
14642− =/ ordinary=(list def)
14643− (skim defs.mod |=(d=def !&(?=(%mold -.d) |(=(%paths name.d) =(%poke name.d)))))
14644− =/ marks=(list term) (collect-mark-imports imports.mod)
14645− =/ mold-names=(list term)
14646− (turn (collect-simple-molds ordinary) |=(m=[name=term body=shape] name.m))
14647− =/ faces=(list import) (skip imports.mod |=(i=import ?=(%mark -.i)))
14648− ?. ?& (module-scope-valid mod(defs ordinary, imports faces) prelude-values prelude-molds)
14649− %+ levy marks
14650− |= n=term
14651− ?& (unique-value-name n marks)
14652− !(lien mold-names |=(m=term =(m n)))
14653− !(lien prelude-molds |=(m=term =(m n)))
14654− ==
14655− ==
14656− [%| [(crip "module has conflicting names: {(spud at)}") ~]]
14657− ?~ prelude [%| [(crip "API module needs unsupported inference: {(spud at)}") ~]]
12403+ ?~ prelude [%| (crip "API module needs unsupported inference: {(spud at)}")]
14658 =/ prepared=iprelude [u.prelude prelude-values prelude-molds]
12404 =/ prepared=iprelude [u.prelude prelude-values prelude-molds]
14659− :: A failing Jibb import gives its own error, which may be definite, as
14660− :: it does for other modules; the constructors below would only wrap it.
14661− :: They resolve the same imports again, from the interfaces cached here.
14662− =/ js=jimports-detailed-result
14663− (resolve-jibb-imports-detailed imports.mod externals mark-externals modules active prelude-values prelude-molds cache prelude)
14664− ?: ?=(%| -.js) [%| p.js]
14665− :: Without `+$ paths` only the poke-only interface applies; keep its reason.
14666− ?. (lien defs.mod |=(d=def &(?=(%mold -.d) =(%paths name.d))))
14667− [%| [(crip "API module needs unsupported inference: {(spud at)}: {(trip p.poke)}") ~]]
14668− :: Each constructor names the part that stopped it; keep that reason.
14669 =/ narrow=?
12405 =/ narrow=?
14670 ?. ?=([[%mark *] ~] imports.mod) |
12406 ?. ?=([[%mark *] ~] imports.mod) |
14671 ?. ?=([[%mold *] ~] defs.mod) |
12407 ?. ?=([[%mold *] ~] defs.mod) |
@@ -14673,41 +12409,26 @@
14673 !?=(%union -.shape.i.defs.mod)
12409 !?=(%union -.shape.i.defs.mod)
14674 ?: narrow
12410 ?: narrow
14675 =/ request=(each ione-request-interface @t)
12411 =/ request=(each ione-request-interface @t)
14676− (one-request-interface-graph at src externals mark-externals modules active cache.p.js `prepared)
12412+ (one-request-interface-graph at src externals mark-externals modules active cache `prepared)
14677− ?: ?=(%| -.request) [%| [(crip "API module needs unsupported inference: {(spud at)}: {(trip p.request)}") ~]]
12413+ ?: ?=(%| -.request) [%| (crip "API module needs unsupported inference: {(spud at)}")]
14678 =/ checked=ifile iface.p.request
12414 =/ checked=ifile iface.p.request
14679 [%& [checked [[at checked] dependencies.paths.support.p.request]]]
12415 [%& [checked [[at checked] dependencies.paths.support.p.request]]]
14680 =/ multi=(each [iface=ifile cache=jcache] @t)
12416 =/ multi=(each [iface=ifile cache=jcache] @t)
14681− (multi-request-interface-graph at src externals mark-externals modules active cache.p.js `prepared)
12417+ (multi-request-interface-graph at src externals mark-externals modules active cache `prepared)
14682− ?: ?=(%| -.multi) [%| [(crip "API module needs unsupported inference: {(spud at)}: {(trip p.multi)}") ~]]
12418+ ?: ?=(%| -.multi) [%| (crip "API module needs unsupported inference: {(spud at)}")]
14683 [%& [iface.p.multi [[at iface.p.multi] cache.p.multi]]]
12419 [%& [iface.p.multi [[at iface.p.multi] cache.p.multi]]]
14684− =/ main=(unit def) (program-main-def defs.mod)
14685− =/ main-parts=(unit [init=term update=term view=term subs=term])
14686− ?~(main ~ (program-main-parts u.main))
14687− =/ page-parts=(unit [load=term view=term])
14688− ?~(main ~ (page-main-parts u.main))
14689− =/ store-parts=(unit [init=term update=term])
14690− ?~(main ~ (store-main-parts u.main))
14691− =/ declaration=(each istore-declaration (unit idiag))
14692− ?~(store-parts [%| ~] (store-declaration mod prelude-values prelude-molds))
14693− =/ clash=(unit idiag) ?:(?=(%| -.declaration) p.declaration ~)
14694− ?^ clash [%| [(show-duplicate-fields at src u.clash) ~]]
14695− =/ declared=(unit istore-declaration)
14696− ?:(?=(%| -.declaration) ~ `p.declaration)
14697− ?: &(?=(^ store-parts) ?=(~ declared))
14698− [%| [(crip "module kind or scope needs unsupported inference: {(spud at)}") ~]]
14699− ?: &(?=([%ui %stores *] at) ?=(^ main) ?=(~ store-parts))
14700− [%| [(crip "module kind needs unsupported inference: {(spud at)}") ~]]
14701− =/ ds=(list def) ?~(declared defs.mod defs.u.declared)
14702− =/ checking=module mod(defs ds)
14703− ?. (module-scope-valid checking prelude-values prelude-molds)
12420+ ?. (module-scope-valid mod prelude-values prelude-molds)
12421+ ?: (pending-declared-poke at mod prelude-values prelude-molds)
12422+ [%| (crip "module kind or scope needs unsupported inference: {(spud at)}")]
14704− [%| [(crip "module has conflicting names: {(spud at)}") ~]]
12423+ [%| (crip "module has conflicting names: {(spud at)}")]
14705− =/ vals=(list term) (global-value-names ds)
12424+ =/ vals=(list term) (global-value-names defs.mod)
12425+ ?: (lien vals |=(n=term =(n %main)))
12426+ [%| (crip "module kind needs unsupported inference: {(spud at)}")]
14706− =/ js=jimports-detailed-result (resolve-jibb-imports-detailed imports.mod externals mark-externals modules active prelude-values prelude-molds cache prelude)
12427+ =/ js=jimports-result (resolve-jibb-imports imports.mod externals mark-externals modules active prelude-values prelude-molds cache prelude)
14707 ?: ?=(%| -.js) [%| p.js]
12428 ?: ?=(%| -.js) [%| p.js]
14708 =/ collected=grec-collected
12429 =/ collected=grec-collected
14709− ?^ imports.mod [(collect-simple-molds ds) *(map term shape)]
12430+ ?^ imports.mod [(collect-simple-molds defs.mod) *(map term shape)]
14710− (grec-collect-molds ds)
12431+ (grec-collect-molds defs.mod)
14711 =/ molds=imolds molds.collected
12432 =/ molds=imolds molds.collected
14712 =/ globals=(list term) (weld prelude-values (weld (import-binding-names imports.mod) vals))
12433 =/ globals=(list term) (weld prelude-values (weld (import-binding-names imports.mod) vals))
14713 =/ surs=(list term) (collect-sur-imports imports.mod)
12434 =/ surs=(list term) (collect-sur-imports imports.mod)
@@ -14728,114 +12449,28 @@
14728 ?: (lien molds |=(m=[name=term body=shape] =(%list name.m))) ~
12449 ?: (lien molds |=(m=[name=term body=shape] =(%list name.m))) ~
14729 `[at src u.prelude index]
12450 `[at src u.prelude index]
14730 =. grec-index.state index
12451 =. grec-index.state index
14731− =/ mts=(each imold-types imold-failure) (module-mold-types-detail molds state)
12452+ =/ mts=(each imold-types @t) (module-mold-types molds state)
14732− ?: ?=(%| -.mts)
14733− ?~ overlap.p.mts [%| [(crip "{(trip message.p.mts)}: {(spud at)}") ~]]
12453+ ?: ?=(%| -.mts) [%| (crip "{(trip p.mts)}: {(spud at)}")]
14734− =/ witness=[name=term cases=upair] u.overlap.p.mts
14735− =/ first=@t (show-error src [at line.beg.first.cases.witness col.beg.first.cases.witness "first union case"])
14736− =/ second=@t (show-error src [at line.beg.second.cases.witness col.beg.second.cases.witness "overlapping case"])
14737− =/ msg=@t (of-wain:format ~[(crip "module mold {(trip name.witness)} has overlapping cases") first second])
14738− [%| [msg `[at src name.witness cases.witness]]]
14739 =/ resolution=iresolved
12454 =/ resolution=iresolved
14740 ?~ index
12455 ?~ index
14741− (resolve-groups ds molds globals externals surs mark-externals marks resolved.p.js reserved at prelude)
12456+ (resolve-groups defs.mod molds globals externals surs mark-externals marks resolved.p.js reserved at prelude)
14742− (resolve-groups-core ds molds globals externals surs mark-externals marks resolved.p.js reserved at prelude index)
12457+ (resolve-groups-core defs.mod molds globals externals surs mark-externals marks resolved.p.js reserved at prelude index)
14743 =/ env=ienv env.resolution
12458 =/ env=ienv env.resolution
14744− =/ recovered=iresolved
14745− ?~ main resolution
14746− ?~ main-parts resolution
14747− =/ updated=(unit iresolved)
14748− (program-update-context u.main u.main-parts ds resolution state)
14749− =/ with-update=iresolved ?~(updated resolution u.updated)
14750− =/ subscribed=(unit iresolved)
14751− (program-subs-context u.main-parts ds with-update state)
14752− =/ with-subs=iresolved ?~(subscribed with-update u.subscribed)
14753− =/ viewed=(unit iresolved)
14754− (program-view-context u.main-parts ds with-subs state)
14755− =/ with-keyed-view=iresolved ?~(viewed with-subs u.viewed)
14756− =/ plain-view=(unit iresolved)
14757− ?^(viewed ~ (program-plain-view-context u.main-parts ds with-keyed-view state))
14758− =/ with-view=iresolved ?~(plain-view with-keyed-view u.plain-view)
14759− =/ initialized=(unit iresolved)
14760− (program-init-context u.main u.main-parts ds with-view state)
14761− =/ with-initialized=iresolved ?~(initialized with-view u.initialized)
14762− =/ plain-init=(unit iresolved)
14763− ?^(initialized ~ (program-plain-init-context u.main-parts ds with-initialized state))
14764− =/ components=iresolved ?~(plain-init with-initialized u.plain-init)
14765− (program-main-context u.main ds components state)
14766− =. env env.recovered
14767− =. artifacts.resolution artifacts.recovered
14768 =. env
12459 =. env
14769− ?: (module-values-complete ds env) env
12460+ ?: (module-values-complete defs.mod env) env
14770 ?: |(?=([%ui %stores *] at) ?=(^ imports.mod) ?=(^ prelude) ?=(^ prelude-values) ?=(^ prelude-molds)) env
12461 ?: |(?=([%ui %stores *] at) ?=(^ imports.mod) ?=(^ prelude) ?=(^ prelude-values) ?=(^ prelude-molds)) env
14771 ?: (gth (met 3 src) 65.536) env
12462 ?: (gth (met 3 src) 65.536) env
14772− ?: (gth (lent ds) 64) env
12463+ ?: (gth (lent defs.mod) 64) env
14773− ?. (dg-source-candidate ds 64) env
12464+ ?. (dg-source-candidate defs.mod 64) env
14774 =/ transaction=(unit dgcommit) (dg-root-source at src)
12465 =/ transaction=(unit dgcommit) (dg-root-source at src)
14775 ?~ transaction env
12466 ?~ transaction env
14776 ?: (dg-interface-safe env.u.transaction) env.u.transaction
12467 ?: (dg-interface-safe env.u.transaction) env.u.transaction
14777 env
12468 env
14778− =/ required=(list def)
14779− ?~ store-parts ds
14780− (skim ds |=(d=def !&(?=(%value -.d) =(%main name.d))))
14781− ?. (module-values-complete required env)
12469+ ?. (module-values-complete defs.mod env)
14782− =/ pending=(unit [at=span msg=tape]) (module-pending-tag required env state 64)
14783− ?^ pending
14784− [%| [(show-error src [at line.beg.at.u.pending col.beg.at.u.pending msg.u.pending]) ~]]
14785− :: A shadowing sample is an error, so it comes before any named value.
14786− =/ values=(list term) (weld prelude-values (weld (api-import-faces imports.mod) vals))
14787− =/ shadow=(unit [name=term at=span]) (module-sample-shadow required env values)
14788− ?^ shadow
14789− =/ msg=tape "sample `{(trip name.u.shadow)}` shadows a name already in scope"
14790− [%| [(show-error src [at line.beg.at.u.shadow col.beg.at.u.shadow msg]) ~]]
14791− =/ missing=(unit term) (module-missing-value required env)
14792− =/ named=tape ?~(missing "" ": ++ {(trip u.missing)}")
14793− [%| [(crip "module definitions need unsupported inference: {(spud at)}{named}") ~]]
12470+ [%| (crip "module definitions need unsupported inference: {(spud at)}")]
14794− =/ initial=irequest-graph [(silt `(list path)`~[at]) ~ ~ modules prelude prelude-values prelude-molds externals mark-externals]
12471+ =/ initial=irequest-graph [(silt `(list path)`~[at]) ~ modules prelude prelude-values prelude-molds externals mark-externals]
14795 =/ graph=(unit irequest-graph) (request-graph-merge resolved.p.js initial (add 1 (lent resolved.p.js)))
12472 =/ graph=(unit irequest-graph) (request-graph-merge resolved.p.js initial (add 1 (lent resolved.p.js)))
14796− ?~ graph [%| ['module request evidence needs unsupported inference' ~]]
12473+ ?~ graph [%| 'module request evidence needs unsupported inference']
14797− =/ static-main=(unit ischeme)
14798− ?~ main ~
14799− ?^ main-parts ~
14800− ?^ page-parts ~
14801− ?^ store-parts ~
14802− (static-main-specialized env prelude)
14803− =? env ?=(^ static-main)
14804− [[%main u.static-main] (skim env |=(entry=[name=term scheme=ischeme] !=(%main name.entry)))]
14805− =/ store-main=(unit ischeme)
14806− ?~ store-parts ~
14807− ?~ declared ~
14808− (store-main-closed u.store-parts action.u.declared env p.mts prelude)
14809− =? env ?=(^ store-main)
14810− [[%main u.store-main] (skim env |=(entry=[name=term scheme=ischeme] !=(%main name.entry)))]
14811− =/ kind-ok=?
14812− ?~ main &
14813− ?^ main-parts (program-main-closed u.main-parts ds env prelude resolved.p.js u.graph)
14814− ?^ page-parts (page-main-closed u.page-parts ds env prelude resolved.p.js u.graph)
14815− ?^ store-parts ?=(^ store-main)
14816− ?=(^ static-main)
14817− ?. kind-ok
14818− [%| [(crip "module kind needs unsupported inference: {(spud at)}") ~]]
14819− =/ store-derived=(unit [values=ienv evidence=istore-request-evidence])
14820− ?~ declared ~
14821− ?~ prelude ~
14822− =/ state=(unit ischeme) (find-jibb-mold %state [~ p.mts at ~ ~ ~ ~ ~])
14823− ?~ state ~
14824− =/ action-mold=(unit ischeme) (find-jibb-mold action.u.declared [~ p.mts at ~ ~ ~ ~ ~])
14825− ?~ action-mold ~
14826− =/ schemes=(unit [state=ischeme action=ischeme])
14827− (store-derived-schemes u.prelude prelude-values prelude-molds typ.u.state typ.u.action-mold)
14828− ?~ schemes ~
14829− =/ evidence=istore-request-evidence
14830− [at src typ.u.state action.u.declared typ.u.action-mold]
14831− `[~[[%state state.u.schemes] [action.u.declared action.u.schemes]] evidence]
14832− ?: &(?=(^ declared) ?=(~ store-derived))
14833− [%| [(crip "store derived gates need unsupported inference: {(spud at)}") ~]]
14834− =? env ?=(^ store-derived) (weld values.u.store-derived env)
14835− =? graph ?=(^ store-derived)
14836− `u.graph(stores [evidence.u.store-derived stores.u.graph])
14837− ?. (request-graph-bounded u.graph)
14838− [%| ['module request evidence needs unsupported inference' ~]]
14839 =/ iface=ifile [env p.mts at ~ artifacts.resolution ~ `src graph]
12474 =/ iface=ifile [env p.mts at ~ artifacts.resolution ~ `src graph]
14840 [%& [iface [[at iface] cache.p.js]]]
12475 [%& [iface [[at iface] cache.p.js]]]
14841::
12476::
@@ -14945,13 +12580,15 @@
14945 =/ prelude-molds=(list term) molds.u.prepared
12580 =/ prelude-molds=(list term) molds.u.prepared
14946 =/ iface=(unit ifile) `iface.u.prepared
12581 =/ iface=(unit ifile) `iface.u.prepared
14947 ?. (module-scope-valid p.parsed prelude-values prelude-molds)
12582 ?. (module-scope-valid p.parsed prelude-values prelude-molds)
12583+ ?: (pending-declared-poke file p.parsed prelude-values prelude-molds)
12584+ 'partial inference; module not checked\0amodule kind or scope needs unsupported inference'
14948 'partial inference; module not checked\0amodule has conflicting names'
12585 'partial inference; module not checked\0amodule has conflicting names'
14949 =/ js=jimports-result
12586 =/ js=jimports-result
14950 (resolve-jibb-imports imports.p.parsed externals mark-externals modules ~[file] prelude-values prelude-molds ~ iface)
12587 (resolve-jibb-imports imports.p.parsed externals mark-externals modules ~[file] prelude-values prelude-molds ~ iface)
14951 ?: ?=(%| -.js) (of-wain:format ~['partial inference; module not checked' p.js])
12588 ?: ?=(%| -.js) (of-wain:format ~['partial inference; module not checked' p.js])
14952 =/ scope-values=(list term)
12589 =/ scope-values=(list term)
14953 (weld prelude-values (weld (collect-sur-imports imports.p.parsed) (collect-mark-imports imports.p.parsed)))
12590 (weld prelude-values (weld (collect-sur-imports imports.p.parsed) (collect-mark-imports imports.p.parsed)))
14954− (golden-types-in-context-core file src externals mark-externals resolved.p.js scope-values prelude-molds iface prepared)
12591+ (golden-types-in-context file src externals mark-externals resolved.p.js scope-values prelude-molds iface)
14955::
12592::
14956:: +golden-types-with-marks: supply declared mark types separately from /sur
12593:: +golden-types-with-marks: supply declared mark types separately from /sur
14957:: entries, as [mark result] with the result from +read-mark:jibb-import.
12594:: entries, as [mark result] with the result from +read-mark:jibb-import.
@@ -14982,10 +12619,6 @@
14982++ golden-types-in-context
12619++ golden-types-in-context
14983 |= [file=path src=@t externals=iexternals mark-externals=imark-externals jimports=ijimports prelude-values=(list term) reserved-molds=(list term) prelude=(unit ifile)]
12620 |= [file=path src=@t externals=iexternals mark-externals=imark-externals jimports=ijimports prelude-values=(list term) reserved-molds=(list term) prelude=(unit ifile)]
14984 ^- @t
12621 ^- @t
14985− (golden-types-in-context-core file src externals mark-externals jimports prelude-values reserved-molds prelude ~)
14986−++ golden-types-in-context-core
14987− |= [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)]
14988− ^- @t
14989 =. reserved-molds (weld reserved-molds (turn jimports |=(j=[face=term interface=ifile] face.j)))
12622 =. reserved-molds (weld reserved-molds (turn jimports |=(j=[face=term interface=ifile] face.j)))
14990 =/ parsed (parse file src)
12623 =/ parsed (parse file src)
14991 ?: ?=(%| -.parsed) (show-error src p.parsed)
12624 ?: ?=(%| -.parsed) (show-error src p.parsed)
@@ -15005,27 +12638,19 @@
15005 =/ eligible=?
12638 =/ eligible=?
15006 ?& ?=(~ imports.p.parsed)
12639 ?& ?=(~ imports.p.parsed)
15007 ?=(~ jimports)
12640 ?=(~ jimports)
12641+ ?=(~ prelude)
12642+ ?=(~ prelude-values)
12643+ ?=(~ reserved-molds)
15008 !?=([%ui %api *] file)
12644 !?=([%ui %api *] file)
15009 !?=([%ui %stores *] file)
12645 !?=([%ui %stores *] file)
15010 !(lien (global-value-names ds) |=(n=term =(n %main)))
12646 !(lien (global-value-names ds) |=(n=term =(n %main)))
12647+ (module-scope-valid p.parsed ~ ~)
15011 !(module-values-complete ds env)
12648 !(module-values-complete ds env)
15012 (lte (met 3 src) 65.536)
12649 (lte (met 3 src) 65.536)
15013 (lte (lent ds) 64)
12650 (lte (lent ds) 64)
15014− ?| &(?=(~ prepared) ?=(~ prelude) ?=(~ prelude-values) ?=(~ reserved-molds) (module-scope-valid p.parsed ~ ~) (dg-source-candidate ds 64))
12651+ (dg-source-candidate ds 64)
15015− ?& ?=(^ prepared)
15016− ?=(^ prelude)
15017− =(u.prelude iface.u.prepared)
15018− =(prelude-values values.u.prepared)
15019− =(reserved-molds molds.u.prepared)
15020− (module-scope-valid p.parsed values.u.prepared molds.u.prepared)
15021− (dg-prepared-candidate ds 64)
15022− ==
15023− ==
15024 ==
12652 ==
15025− =/ transaction=(unit dgcommit)
12653+ =/ transaction=(unit dgcommit) ?:(eligible (dg-root-source file src) ~)
15026− ?. eligible ~
15027− ?~ prepared (dg-root-source file src)
15028− (dg-root-prepared file src u.prepared)
15029 =. recovered
12654 =. recovered
15030 ?~ transaction ~
12655 ?~ transaction ~
15031 ?. &((module-values-complete ds env.u.transaction) (dg-interface-safe env.u.transaction)) ~
12656 ?. &((module-values-complete ds env.u.transaction) (dg-interface-safe env.u.transaction)) ~
@@ -15117,7 +12742,7 @@
15117 ?: =(0 fuel) ~
12742 ?: =(0 fuel) ~
15118 =. fuel (dec fuel)
12743 =. fuel (dec fuel)
15119 =/ t=itype i.todo
12744 =/ t=itype i.todo
15120− ?: ?=(?(%var %fvar %avar %rvar %nvar %rnvar %tag) -.t)
12745+ ?: ?=(?(%var %avar %rvar %nvar %rnvar %tag) -.t)
15121 =/ node-id=@ud ?:(?=(%tag -.t) id.t +.t)
12746 =/ node-id=@ud ?:(?=(%tag -.t) id.t +.t)
15122 =/ found=(unit itype) (itype-lookup node-id sub)
12747 =/ found=(unit itype) (itype-lookup node-id sub)
15123 ?~ found $(todo t.todo, ids [node-id ids])
12748 ?~ found $(todo t.todo, ids [node-id ids])
@@ -15311,31 +12936,6 @@
15311 [%& result st(next +(next.st), obligations [ex ey obligations.st])]
12936 [%& result st(next +(next.st), obligations [ex ey obligations.st])]
15312 [%& typ.p.left state.p.right]
12937 [%& typ.p.left state.p.right]
15313::
12938::
15314−:: A direct tuple literal may wait for a later exact result context.
15315−:: Each pending literal retains its source tag and its own fit obligation.
15316−++ dg-infer-tuple-items
15317− |= [items=(list item) env=ienv state=istate]
15318− ^- iresult
15319− ?~ items [%| ["empty cell is not supported by partial inference" ~]]
15320− =/ head=iresult (infer-fragment val.i.items env state)
15321− ?: ?=(%| -.head) head
15322− =/ typ=itype typ.p.head
15323− =/ st=istate state.p.head
15324− =/ adjusted=(unit [typ=itype state=istate])
15325− ?. (dg-owned-arm-literal val.i.items typ tags.st sub.st next.state) `[typ st]
15326− ?: (gth (lent obligations.st) 63) ~
15327− =/ pending=itype [%var next.st]
15328− =/ edge=dgo [typ pending (span-of val.i.items) at.i.items]
15329− `[pending st(next +(next.st), obligations [edge obligations.st])]
15330− ?~ adjusted [%| ["deferred tuple context needs unsupported inference" ~]]
15331− =. typ typ.u.adjusted
15332− =. st state.u.adjusted
15333− =. typ ?~(face.i.items typ [%face u.face.i.items typ])
15334− ?~ t.items [%& typ st]
15335− =/ tail=iresult $(items t.items, state st)
15336− ?: ?=(%| -.tail) tail
15337− [%& [%cell typ typ.p.tail] state.p.tail]
15338−::
15339:: Deferred inference uses only source forms whose successful fit sites are
12939:: Deferred inference uses only source forms whose successful fit sites are
15340:: guarded below; a shared source-node budget bounds this screen.
12940:: guarded below; a shared source-node budget bounds this screen.
15341++ dg-safe-expressions
12941++ dg-safe-expressions
@@ -15345,13 +12945,6 @@
15345 =/ first=(unit @ud) (dg-safe-expression i.todo fuel)
12945 =/ first=(unit @ud) (dg-safe-expression i.todo fuel)
15346 ?~ first ~
12946 ?~ first ~
15347 $(todo t.todo, fuel u.first)
12947 $(todo t.todo, fuel u.first)
15348−++ dg-safe-items
15349− |= [items=(list item) fuel=@ud]
15350− ^- (unit @ud)
15351− ?~ items `fuel
15352− =/ first=(unit @ud) (dg-safe-expression val.i.items fuel)
15353− ?~ first ~
15354− $(items t.items, fuel u.first)
15355++ dg-safe-expression
12948++ dg-safe-expression
15356 |= [e=expr fuel=@ud]
12949 |= [e=expr fuel=@ud]
15357 ^- (unit @ud)
12950 ^- (unit @ud)
@@ -15369,7 +12962,6 @@
15369 $(e final.e, fuel fuel)
12962 $(e final.e, fuel fuel)
15370 %gate $(e body.e, fuel fuel)
12963 %gate $(e body.e, fuel fuel)
15371 %gate-wide $(e body.e, fuel fuel)
12964 %gate-wide $(e body.e, fuel fuel)
15372− %tuple (dg-safe-items items.e fuel)
15373 %branch
12965 %branch
15374 ?. (dg-boolean-patterns e) ~
12966 ?. (dg-boolean-patterns e) ~
15375 ?> ?=(^ arms.e)
12967 ?> ?=(^ arms.e)
@@ -15509,28 +13101,6 @@
15509 ?: (dg-direct-source val.i.ds 64) &
13101 ?: (dg-direct-source val.i.ds 64) &
15510 $(ds t.ds, fuel (dec fuel))
13102 $(ds t.ds, fuel (dec fuel))
15511::
13103::
15512−++ dg-prepared-source
15513− |= [e=expr fuel=@ud]
15514− ^- ?
15515− ?: (dg-direct-source e fuel) &
15516− ?: =(0 fuel) |
15517− ?+ -.e |
15518− %group $(e inner.e, fuel (dec fuel))
15519− %gate $(e body.e, fuel (dec fuel))
15520− %gate-wide $(e body.e, fuel (dec fuel))
15521− %cast $(e val.e, fuel (dec fuel))
15522− %body ?~(defs.e $(e final.e, fuel (dec fuel)) |)
15523− %tuple &
15524− ==
15525−++ dg-prepared-candidate
15526− |= [ds=(list def) fuel=@ud]
15527− ^- ?
15528− ?~ ds |
15529− ?: =(0 fuel) |
15530− ?. ?=(%value -.i.ds) $(ds t.ds, fuel (dec fuel))
15531− ?: (dg-prepared-source val.i.ds 64) &
15532− $(ds t.ds, fuel (dec fuel))
15533−::
15534++ dg-interface-safe
13104++ dg-interface-safe
15535 |= [env=ienv]
13105 |= [env=ienv]
15536 ^- ?
13106 ^- ?
@@ -15576,47 +13146,6 @@
15576 (dg-stage defs base base st ~ 64)
13146 (dg-stage defs base base st ~ 64)
15577 ::
13147 ::
15578 [& (transact)]
13148 [& (transact)]
15579−:: The caller supplies the trusted prepared prelude. This transaction is
15580−:: only report evidence; the ordinary module resolver does not publish it.
15581−++ dg-root-prepared
15582− |= [at=path src=@t prepared=iprelude]
15583− ^- (unit dgcommit)
15584− ?: ?=([%ui %api *] at) ~
15585− ?: ?=([%ui %stores *] at) ~
15586− ?: (gth (met 3 src) 65.536) ~
15587− =/ parsed (parse at src)
15588− ?: ?=(%| -.parsed) ~
15589− ?^ imports.p.parsed ~
15590− ?. (module-scope-valid p.parsed values.prepared molds.prepared) ~
15591− ?^ (duplicate-defs defs.p.parsed) ~
15592− =/ defs=(list def) defs.p.parsed
15593− ?: (gth (lent defs) 64) ~
15594− ?: (lien (global-value-names defs) |=(n=term =(n %main))) ~
15595− ?. (dg-prepared-candidate defs 64) ~
15596− =/ local-molds=imolds (collect-simple-molds defs)
15597− =/ globals=(list term) (weld values.prepared (global-value-names defs))
15598− =/ iface=ifile iface.prepared
15599− =/ prelude=(unit ifile) `iface
15600− =/ resolution=iresolved
15601− (resolve-groups defs local-molds globals ~ ~ ~ ~ ~ molds.prepared at prelude)
15602− ?^ grouped.resolution ~
15603− ?^ artifacts.resolution ~
15604− =/ base=ienv env.resolution
15605− =/ templates=ienv
15606− (turn molds.iface |=(x=[name=term template=ischeme] [name.x template.x]))
15607− =/ all-env=ienv (weld base (weld values.iface templates))
15608− =/ free=(unit dgscan) (dg-env all-env ~ 32.768 ~)
15609− ?~ free ~
15610− ?^ ids.u.free ~
15611− =/ all=(unit dgscan) (dg-all-env-ids all-env 32.768 ~)
15612− ?~ all ~
15613− =/ fresh=@ud (dg-next-id ids.u.all 0)
15614− =/ st=istate *istate
15615− =. 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)
15616− =/ checked-molds=(each imold-types @t) (module-mold-types local-molds st)
15617− ?: ?=(%| -.checked-molds) ~
15618− (dg-stage defs base base st ~ 64)
15619−::
15620++ dg-all-env-ids
13149++ dg-all-env-ids
15621 |= [env=ienv fuel=@ud ids=(list @ud)]
13150 |= [env=ienv fuel=@ud ids=(list @ud)]
15622 ^- (unit dgscan)
13151 ^- (unit dgscan)
jibb-dev/lib/jibb/internal.jibb+1−4
@@ -3,13 +3,12 @@
3:: Representation for agent and in-process store pokes.
3:: Representation for agent and in-process store pokes.
4:: The prelude re-exports this mold; effect lowering and the runtime must
4:: The prelude re-exports this mold; effect lowering and the runtime must
5:: agree on these cells when effect execution is implemented.
5:: agree on these cells when effect execution is implemented.
6−+$ raw-poke
6++$ poke
7 [%agent agent=@tas mark=@tas payload=*]
7 [%agent agent=@tas mark=@tas payload=*]
8 [%store module=@t action=@tas payload=*]
8 [%store module=@t action=@tas payload=*]
9
9
10:: The compiler supplies this private interface; execution is not yet implemented.
10:: The compiler supplies this private interface; execution is not yet implemented.
11++ gth-atom |= args=[A A] (raw-gth.core args)
11++ gth-atom |= args=[A A] (raw-gth.core args)
12−++ eq-data |= args=[A A] (raw-eq.core args)
13
12
14:: Application paths are knot sequences.
13:: Application paths are knot sequences.
15+$ qath
14+$ qath
@@ -19,8 +18,6 @@
19:: Private compiler primitive wrappers; execution is a later milestone.
18:: Private compiler primitive wrappers; execution is a later milestone.
20++ add-atom |= args=[A A] (raw-add.core args)
19++ add-atom |= args=[A A] (raw-add.core args)
21++ dec-atom |= atom=A (raw-dec.core atom)
20++ dec-atom |= atom=A (raw-dec.core atom)
22−++ trip-text |= value=@t (raw-trip.core value)
23−++ tuba-text |= values (raw-tuba.core values)
24
21
25:: Transparent request data. Identity and path fields are writable and do not
22:: Transparent request data. Identity and path fields are writable and do not
26:: prove a schema or watchability. A future executor must bind them to checked
23:: prove a schema or watchability. A future executor must bind them to checked
jibb-dev/lib/jibb/prelude.jibb+2−176
@@ -1,5 +1,5 @@
1/= internal /lib/jibb/internal
1/= internal /lib/jibb/internal
2−+$ raw-poke raw-poke.internal
2++$ poke poke.internal
3+$ qath qath.internal
3+$ qath qath.internal
4
4
5:: Initial prelude functions. The rest of the inventory is still to come.
5:: Initial prelude functions. The rest of the inventory is still to come.
@@ -19,8 +19,6 @@
19 %.y %.n
19 %.y %.n
20 %.n %.y
20 %.n %.y
21
21
22−++ eq |= args=[A A] (eq-data.internal args)
23−
24+$ list |$ [A]
22+$ list |$ [A]
25 ~
23 ~
26 [i=A t=(list A)]
24 [i=A t=(list A)]
@@ -200,32 +198,6 @@
200 ~ first
198 ~ first
201 [~ b] `(combine a b)
199 [~ b] `(combine a b)
202
200
203−++ hunt |= args=[$-([A A] ?) (unit A) (unit A)]
204− ?- args
205− [choose first second] ^- (unit A)
206− ?- first
207− ~ second
208− [~ a]
209− ?- second
210− ~ first
211− [~ b]
212− ?- (choose a b)
213− %.y first
214− %.n second
215−
216−++ mate |= args=[(unit A) (unit A)]
217− ?- args
218− [first second] ^- (unit A)
219− ?- second
220− ~ first
221− [~ b]
222− ?- first
223− ~ second
224− [~ a]
225− ?- (eq a b)
226− %.y first
227− %.n !!
228−
229++ clef |= args=[(unit A) (unit B) $-([A B] (unit C))]
201++ clef |= args=[(unit A) (unit B) $-([A B] (unit C))]
230 ?- args
202 ?- args
231 [first second combine] ^- (unit C)
203 [first second combine] ^- (unit C)
@@ -353,7 +325,7 @@
353 [f b] |= a=A (f a b)
325 [f b] |= a=A (f a b)
354
326
355+$ cmd |$ [M]
327+$ cmd |$ [M]
356− [%poke p=raw-poke reply=$-((unit @t) M)]
328+ [%poke p=poke reply=$-((unit @t) M)]
357 [%go url=@t]
329 [%go url=@t]
358 [%wait gap=@dr msg=M]
330 [%wait gap=@dr msg=M]
359 [%now reply=$-(@da M)]
331 [%now reply=$-(@da M)]
@@ -401,149 +373,3 @@
401++ late |= second=B |= first=A [first second]
373++ late |= second=B |= first=A [first second]
402
374
403++ succ |= x=A (add x 1)
375++ succ |= x=A (add x 1)
404−
405−++ trip |= value=@t (trip-text.internal value)
406−++ tuba |= values=(list @tD) (tuba-text.internal values)
407−
408−:: UI values are source-level descriptions only. Nested element payloads are
409−:: erased in the nonrecursive union; the public constructors below retain the
410−:: typed composition boundaries. Raw-constructor encapsulation, rendering and
411−:: execution are not established by this slice.
412−+$ length
413− [%chars n=@ud]
414− [%fill n=@ud]
415− %shrink
416−
417−+$ align
418− %start
419− %center
420− %end
421−
422−+$ role
423− %body
424− %caption
425− %label
426−
427−+$ tone
428− %normal
429− %muted
430− %accent
431− %danger
432−
433−+$ attr
434− [%pad %s0]
435− [%pad %s1]
436− [%pad %s2]
437− [%pad %s3]
438− [%gap %s0]
439− [%gap %s1]
440− [%gap %s2]
441− [%gap %s3]
442− [%width width=length]
443− [%align align=align]
444− [%role role=role]
445− [%tone tone=tone]
446−
447−+$ element |$ [M]
448− [%row attrs=(list attr) kids=*]
449− [%column attrs=(list attr) kids=*]
450− [%wrap attrs=(list attr) kids=*]
451− [%stack attrs=(list attr) kids=*]
452− [%el attrs=(list attr) kid=*]
453− [%para kids=*]
454− [%text words=@t]
455− [%heading level=@ud words=@t]
456− [%each items=*]
457− [%table columns=* rows=*]
458− [%image source=qath description=@t]
459− [%image-unsafe source=[url=@t width=@ud height=@ud] description=@t]
460− [%link target=qath label=@t]
461− [%link-unsafe target=@t label=@t]
462− [%button label=@t message=M]
463− [%toggle on=? label=@t message=M]
464− [%field label=@t value=@t reply=$-(@t M)]
465− [%form message=M kids=*]
466− [%island payload=*]
467−
468−++ row |= [attrs=(list attr) kids=(list (element M))]
469− ^- (element M) [%row attrs kids]
470−
471−++ column |= [attrs=(list attr) kids=(list (element M))]
472− ^- (element M) [%column attrs kids]
473−
474−++ wrap |= [attrs=(list attr) kids=(list (element M))]
475− ^- (element M) [%wrap attrs kids]
476−
477−++ stack |= [attrs=(list attr) kids=(list (element M))]
478− ^- (element M) [%stack attrs kids]
479−
480−++ el |= [attrs=(list attr) kid=(element M)]
481− ^- (element M) [%el attrs kid]
482−
483−++ para |= kids=(list (element M))
484− ^- (element M) [%para kids]
485−
486−++ text |= words=@t
487− ^- (element M) [%text words]
488−
489−++ heading |= [level=@ud words=@t]
490− ^- (element M) [%heading level words]
491−
492−++ each |= items=(list [key=K el=(element M)])
493− ^- (element M) [%each items]
494−
495−++ table |= [columns=(list [header=@t width=length align=align]) rows=(list [key=K cells=(list (element M))])]
496− ^- (element M) [%table columns rows]
497−
498−++ image |= [source=qath description=@t]
499− ^- (element M) [%image source description]
500−
501−++ image-unsafe |= [source=[url=@t width=@ud height=@ud] description=@t]
502− ^- (element M) [%image-unsafe source description]
503−
504−++ link |= [target=qath label=@t]
505− ^- (element M) [%link target label]
506−
507−++ link-unsafe |= [target=@t label=@t]
508− ^- (element M) [%link-unsafe target label]
509−
510−++ button |= [label=@t message=M]
511− ^- (element M) [%button label message]
512−
513−++ toggle |= [on=? label=@t message=M]
514− ^- (element M) [%toggle on label message]
515−
516−++ field |= [label=@t value=@t reply=$-(@t M)]
517− ^- (element M) [%field label value reply]
518−
519−++ form |= [message=M kids=(list (element M))]
520− ^- (element M) [%form message kids]
521−
522−+$ theme
523− [ space=[s1=@t s2=@t s3=@t]
524− tones=[normal=@t background=@t accent=@t danger=@t muted=@t]
525− wide=@t
526− lang=@t
527− zone=@t
528− font=(unit qath)
529− dark=(unit [tones=[normal=@t background=@t accent=@t danger=@t muted=@t]])
530−
531−+$ program |$ [D X M]
532− [init=$-(D X) update=$-([M X] [X (list (cmd M))]) view=$-(X (element M)) subs=$-(X (list (sub M)))]
533−
534−++ program |= [init=$-(D X) update=$-([M X] [X (list (cmd M))]) view=$-(X (element M)) subs=$-(X (list (sub M)))]
535− ^- (program D X M) [init update view subs]
536−
537−++ island |= [p=(program D X M) data=D]
538− ^- (element !!) [%island [p data]]
539−
540−+$ page |$ [R D]
541− [load=$-(R (ask D)) view=$-(D (element !!))]
542−
543−++ page |= [load=$-(R (ask D)) view=$-(D (element !!))]
544− ^- (page R D) [load view]
545−
546−+$ store |$ [S] [init=S update=*]
547−
548−++ store |= [init=S update=$-([A S] S)]
549− ^- (store S) [init update]
my-app/desk.docket-0+1−1
@@ -3,6 +3,6 @@
3 color+0x17.734f
3 color+0x17.734f
4 version+[0 1 0]
4 version+[0 1 0]
5 website+''
5 website+''
6− license+'MIT'
6+ license+''
7 site+/apps/my-app
7 site+/apps/my-app
8==
8==
my-app/ui/basket.jibb+2−2
@@ -17,8 +17,8 @@
17++ update |= [=msg m=model]
17++ update |= [=msg m=model]
18 ?- msg
18 ?- msg
19 [%noted t] [m(note=t) ~]
19 [%noted t] [m(note=t) ~]
20− %add [m(note="") ~[(poke.cart [%add note.m] |=%acked)]]
20+ %add [m(note="") ~[[%poke (cart-action.cart [%add note.m]) |=%acked]]]
21− %toggle [m ~[(poke.cart %toggle |=%acked)]]
21+ %toggle [m ~[[%poke (cart-action.cart %toggle) |=%acked]]]
22 [%got c] [m(cart=c) ~]
22 [%got c] [m(cart=c) ~]
23 [%acked err] [m ~]
23 [%acked err] [m ~]
24
24
my-app/ui/stores/cart.jibb+3−2
@@ -1,12 +1,13 @@
1:: /ui/stores/cart.jibb
1:: /ui/stores/cart.jibb
2+$ state [items=(list @t) open=?]
2+$ state [items=(list @t) open=?]
3−+$ poke
3++$ cart-action
4 [%add item=@t]
4 [%add item=@t]
5 %toggle
5 %toggle
6++$ poke cart-action
6
7
7++ main (store init update)
8++ main (store init update)
8++ init ^- state [~ %.n]
9++ init ^- state [~ %.n]
9−++ update |= [a=poke s=state]
10+++ update |= [a=cart-action s=state]
10 ?- a
11 ?- a
11 [%add item] s(items=[item items.s])
12 [%add item] s(items=[item items.s])
12 %toggle s(open=(not open.s))
13 %toggle s(open=(not open.s))
my-app/ui/theme.jibb+1−1
@@ -5,4 +5,4 @@
5 lang="en"
5 lang="en"
6 zone="UTC"
6 zone="UTC"
7 font=`%/static/fonts/inter.woff2
7 font=`%/static/fonts/inter.woff2
8− dark=`[tones=[normal="#eee" background="#111" accent="#4c9" danger="#f28b82" muted="#aaa"]]
8+ dark=[tones=[normal="#eee" background="#111" accent="#4c9" danger="#f28b82" muted="#aaa"]]
my-app/ui/todo-list.jibb+2−2
@@ -19,8 +19,8 @@
19 ?- (gth (lent (tuba (trip t))) 80)
19 ?- (gth (lent (tuba (trip t))) 80)
20 %.y [m(draft=t error=`"Too long") ~]
20 %.y [m(draft=t error=`"Too long") ~]
21 %.n [m(draft=t error=~) ~]
21 %.n [m(draft=t error=~) ~]
22− %submit [m(draft="") ~[(poke.todo [%add draft.m] |=%acked)]]
22+ %submit [m(draft="") ~[[%poke (todo-action.todo [%add draft.m]) |=%acked]]]
23− [%toggled id] [m ~[(poke.todo [%toggle id] |=%acked)]]
23+ [%toggled id] [m ~[[%poke (todo-action.todo [%toggle id]) |=%acked]]]
24 [%got ts] [m(todos=ts) ~]
24 [%got ts] [m(todos=ts) ~]
25 [%acked err] [m(error=err) ~]
25 [%acked err] [m(error=err) ~]
26
26
tests/golden/doc-core-02-update/source.jibb+2−2
@@ -4,7 +4,7 @@
4 ?- (gth (lent (tuba (trip t))) 80)
4 ?- (gth (lent (tuba (trip t))) 80)
5 %.y [m(draft=t error=`"Too long") ~]
5 %.y [m(draft=t error=`"Too long") ~]
6 %.n [m(draft=t error=~) ~]
6 %.n [m(draft=t error=~) ~]
7− %submit [m(draft="") ~[(poke.todo [%add draft.m] |=%acked)]]
7+ %submit [m(draft="") ~[[%poke (todo-action.todo [%add draft.m]) |=%acked]]]
8− [%toggled id] [m ~[(poke.todo [%toggle id] |=%acked)]]
8+ [%toggled id] [m ~[[%poke (todo-action.todo [%toggle id]) |=%acked]]]
9 [%got ts] [m(todos=ts) ~]
9 [%got ts] [m(todos=ts) ~]
10 [%acked err] [m(error=err) ~]
10 [%acked err] [m(error=err) ~]
tests/golden/doc-core-02-update/tokens.txt+28−22
@@ -73,17 +73,20 @@
737:29 tight str ""
737:29 tight str ""
747:31 tight glyph )
747:31 tight glyph )
757:33 glyph ~[
757:33 glyph ~[
76−7:35 tight glyph (
76+7:35 tight glyph [
77−7:36 tight wing poke.todo
77+7:36 tight lit %poke
78+7:42 glyph (
79+7:43 tight wing todo-action.todo
78−7:46 glyph [
80+7:60 glyph [
79−7:47 tight lit %add
81+7:61 tight lit %add
80−7:52 wing draft.m
82+7:66 wing draft.m
81−7:59 tight glyph ]
83+7:73 tight glyph ]
84+7:74 tight glyph )
82−7:61 glyph |=
85+7:76 glyph |=
83−7:63 tight lit %acked
86+7:78 tight lit %acked
84−7:69 tight glyph )
87+7:84 tight glyph ]
85−7:70 tight glyph ]
88+7:85 tight glyph ]
86−7:71 tight glyph ]
89+7:86 tight glyph ]
878:5 NEWLINE
908:5 NEWLINE
888:5 glyph [
918:5 glyph [
898:6 tight lit %toggled
928:6 tight lit %toggled
@@ -92,17 +95,20 @@
928:20 glyph [
958:20 glyph [
938:21 tight name m
968:21 tight name m
948:23 glyph ~[
978:23 glyph ~[
95−8:25 tight glyph (
98+8:25 tight glyph [
99+8:26 tight lit %poke
100+8:32 glyph (
96−8:26 tight wing poke.todo
101+8:33 tight wing todo-action.todo
97−8:36 glyph [
102+8:50 glyph [
98−8:37 tight lit %toggle
103+8:51 tight lit %toggle
99−8:45 name id
104+8:59 name id
100−8:47 tight glyph ]
105+8:61 tight glyph ]
106+8:62 tight glyph )
101−8:49 glyph |=
107+8:64 glyph |=
102−8:51 tight lit %acked
108+8:66 tight lit %acked
103−8:57 tight glyph )
109+8:72 tight glyph ]
104−8:58 tight glyph ]
110+8:73 tight glyph ]
105−8:59 tight glyph ]
111+8:74 tight glyph ]
1069:5 NEWLINE
1129:5 NEWLINE
1079:5 glyph [
1139:5 glyph [
1089:6 tight lit %got
1149:6 tight lit %got
tests/golden/doc-core-02-update/tree.txt+14−10
@@ -44,21 +44,25 @@
44 (change 7:21 m
44 (change 7:21 m
45 (edit 7:23 draft (str 7:29 "")))
45 (edit 7:23 draft (str 7:29 "")))
46 (list 7:33
46 (list 7:33
47− (group 7:35
47+ (tuple 7:35
48− (call 7:36
49− (wing 7:36 poke.todo)
48+ (lit 7:36 %poke)
49+ (group 7:42
50+ (call 7:43
51+ (wing 7:43 todo-action.todo)
50− (tuple 7:46 (lit 7:47 %add) (wing 7:52 draft.m))
52+ (tuple 7:60 (lit 7:61 %add) (wing 7:66 draft.m))))
51− (ctor 7:61 %acked))))))
53+ (ctor 7:76 %acked)))))
52 (arm 8:5
54 (arm 8:5
53 (cell 8:5 (lit 8:6 %toggled) (bind 8:15 id))
55 (cell 8:5 (lit 8:6 %toggled) (bind 8:15 id))
54 (tuple 8:20
56 (tuple 8:20
55 (wing 8:21 m)
57 (wing 8:21 m)
56 (list 8:23
58 (list 8:23
57− (group 8:25
59+ (tuple 8:25
58− (call 8:26
59− (wing 8:26 poke.todo)
60+ (lit 8:26 %poke)
61+ (group 8:32
62+ (call 8:33
63+ (wing 8:33 todo-action.todo)
60− (tuple 8:36 (lit 8:37 %toggle) (wing 8:45 id))
64+ (tuple 8:50 (lit 8:51 %toggle) (wing 8:59 id))))
61− (ctor 8:49 %acked))))))
65+ (ctor 8:64 %acked)))))
62 (arm 9:5
66 (arm 9:5
63 (cell 9:5 (lit 9:6 %got) (bind 9:11 ts))
67 (cell 9:5 (lit 9:6 %got) (bind 9:11 ts))
64 (tuple 9:20
68 (tuple 9:20
tests/golden/doc-grammar-02-buttons/modules.txtdeleted−1
@@ -1 +0,0 @@
1−# Use the prepared prelude; this library has no Jibb module imports.
tests/golden/doc-grammar-02-buttons/types.txtdeleted−4
@@ -1,4 +0,0 @@
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+3−2
@@ -1,12 +1,13 @@
1:: /ui/stores/cart.jibb
1:: /ui/stores/cart.jibb
2+$ state [items=(list @t) open=?]
2+$ state [items=(list @t) open=?]
3−+$ poke
3++$ cart-action
4 [%add item=@t]
4 [%add item=@t]
5 %toggle
5 %toggle
6++$ poke cart-action
6
7
7++ main (store init update)
8++ main (store init update)
8++ init ^- state [~ %.n]
9++ init ^- state [~ %.n]
9−++ update |= [a=poke s=state]
10+++ update |= [a=cart-action s=state]
10 ?- a
11 ?- a
11 [%add item] s(items=[item items.s])
12 [%add item] s(items=[item items.s])
12 %toggle s(open=(not open.s))
13 %toggle s(open=(not open.s))
tests/golden/doc-grammar-06-cart-store/tokens.txt+60−56
@@ -13,7 +13,7 @@
132:33 tight glyph ]
132:33 tight glyph ]
143:1 NEWLINE
143:1 NEWLINE
153:1 glyph +$
153:1 glyph +$
16−3:4 name poke
16+3:4 name cart-action
174:3 INDENT
174:3 INDENT
184:3 glyph [
184:3 glyph [
194:4 tight lit %add
194:4 tight lit %add
@@ -23,64 +23,68 @@
234:16 tight glyph ]
234:16 tight glyph ]
245:3 NEWLINE
245:3 NEWLINE
255:3 lit %toggle
255:3 lit %toggle
26−7:1 DEDENT
26+6:1 DEDENT
27−7:1 NEWLINE
27+6:1 NEWLINE
28−7:1 glyph ++
28+6:1 glyph +$
29−7:4 name main
29+6:4 name poke
30−7:9 glyph (
30+6:9 name cart-action
31−7:10 tight name store
32−7:16 name init
33−7:21 name update
34−7:27 tight glyph )
358:1 NEWLINE
318:1 NEWLINE
368:1 glyph ++
328:1 glyph ++
37−8:4 name init
33+8:4 name main
38−8:9 glyph ^-
34+8:9 glyph (
39−8:12 name state
35+8:10 tight name store
40−8:18 glyph [
36+8:16 name init
41−8:19 tight lit ~
37+8:21 name update
42−8:21 lit %.n
43−8:24 tight glyph ]
38+8:27 tight glyph )
449:1 NEWLINE
399:1 NEWLINE
459:1 glyph ++
409:1 glyph ++
46−9:4 name update
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
47−9:11 glyph |=
51+10:11 glyph |=
48−9:14 glyph [
52+10:14 glyph [
49−9:15 tight name a
53+10:15 tight name a
50−9:16 tight glyph =
54+10:16 tight glyph =
51−9:17 tight name poke
55+10:17 tight name cart-action
52−9:22 name s
56+10:29 name s
53−9:23 tight glyph =
57+10:30 tight glyph =
54−9:24 tight name state
58+10:31 tight name state
55−9:29 tight glyph ]
59+10:36 tight glyph ]
56−10:3 INDENT
60+11:3 INDENT
57−10:3 glyph ?-
61+11:3 glyph ?-
58−10:6 name a
62+11:6 name a
59−11:5 INDENT
63+12:5 INDENT
60−11:5 glyph [
64+12:5 glyph [
61−11:6 tight lit %add
65+12:6 tight lit %add
62−11:11 name item
66+12:11 name item
63−11:15 tight glyph ]
67+12: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
7512:18 name s
6812:18 name s
7612:19 tight glyph (
6912:19 tight glyph (
77−12:20 tight name open
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
78−12:24 tight glyph =
82+13:24 tight glyph =
79−12:25 tight glyph (
83+13:25 tight glyph (
80−12:26 tight name not
84+13:26 tight name not
81−12:30 wing open.s
85+13:30 wing open.s
82−12:36 tight glyph )
86+13:36 tight glyph )
83−12:37 tight glyph )
87+13:37 tight glyph )
84−12:38 DEDENT
88+13:38 DEDENT
85−12:38 DEDENT
89+13:38 DEDENT
86−12:38 NEWLINE
90+13:38 NEWLINE
tests/golden/doc-grammar-06-cart-store/tree.txt+26−25
@@ -4,35 +4,36 @@
4 (face 2:11 items
4 (face 2:11 items
5 (apply 2:17 list (aura 2:23 @t)))
5 (apply 2:17 list (aura 2:23 @t)))
6 (face 2:27 open (flag 2:32))))
6 (face 2:27 open (flag 2:32))))
7− (mold 3:1 poke
7+ (mold 3:1 cart-action
8 (union 4:3
8 (union 4:3
9 (cell 4:3
9 (cell 4:3
10 (const 4:4 %add)
10 (const 4:4 %add)
11 (face 4:9 item (aura 4:14 @t)))
11 (face 4:9 item (aura 4:14 @t)))
12 (const 5:3 %toggle)))
12 (const 5:3 %toggle)))
13+ (mold 6:1 poke (ref 6:9 cart-action))
13− (value 7:1 main
14+ (value 8:1 main
14− (group 7:9
15+ (group 8:9
15− (call 7:10 (wing 7:10 store) (wing 7:16 init) (wing 7:21 update))))
16+ (call 8:10 (wing 8:10 store) (wing 8:16 init) (wing 8:21 update))))
16− (value 8:1 init
17+ (value 9:1 init
17− (cast 8:9
18+ (cast 9:9
18− (ref 8:12 state)
19+ (ref 9:12 state)
19− (tuple 8:18 (lit 8:19 ~) (lit 8:21 %.n))))
20+ (tuple 9:18 (lit 9:19 ~) (lit 9:21 %.n))))
20− (value 9:1 update
21+ (value 10:1 update
21− (gate 9:11
22+ (gate 10:11
22− (cell 9:14
23+ (cell 10:14
23− (face 9:15 a (ref 9:17 poke))
24+ (face 10:15 a (ref 10:17 cart-action))
24− (face 9:22 s (ref 9:24 state)))
25+ (face 10:29 s (ref 10:31 state)))
25− (body 10:3
26+ (body 11:3
26− (branch 10:3
27+ (branch 11:3
27− (wing 10:6 a)
28+ (wing 11: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)))))
33 (arm 12:5
29 (arm 12:5
34− (lit 12:5 %toggle)
30+ (cell 12:5 (lit 12:6 %add) (bind 12:11 item))
35 (change 12:18 s
31 (change 12:18 s
36− (edit 12:20 open
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
37− (group 12:25
38+ (group 13:25
38− (call 12:26 (wing 12:26 not) (wing 12:30 open.s)))))))))))
39+ (call 13:26 (wing 13:26 not) (wing 13:30 open.s)))))))))))
tests/golden/doc-grammar-06-cart-store/types.txt+1−5
@@ -1,6 +1,2 @@
1partial inference; module not checked
1partial inference; module not checked
2−+$ state: not checked
2+module kind or scope needs unsupported inference
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 @@
17++ update |= [=msg m=model]
17++ update |= [=msg m=model]
18 ?- msg
18 ?- msg
19 [%noted t] [m(note=t) ~]
19 [%noted t] [m(note=t) ~]
20− %add [m(note="") ~[(poke.cart [%add note.m] |=%acked)]]
20+ %add [m(note="") ~[[%poke (cart-action.cart [%add note.m]) |=%acked]]]
21− %toggle [m ~[(poke.cart %toggle |=%acked)]]
21+ %toggle [m ~[[%poke (cart-action.cart %toggle) |=%acked]]]
22 [%got c] [m(cart=c) ~]
22 [%got c] [m(cart=c) ~]
23 [%acked err] [m ~]
23 [%acked err] [m ~]
24
24
tests/golden/doc-grammar-07-basket/tokens.txt+25−19
@@ -111,30 +111,36 @@
11120:28 tight str ""
11120:28 tight str ""
11220:30 tight glyph )
11220:30 tight glyph )
11320:32 glyph ~[
11320:32 glyph ~[
114−20:34 tight glyph (
114+20:34 tight glyph [
115−20:35 tight wing poke.cart
115+20:35 tight lit %poke
116+20:41 glyph (
117+20:42 tight wing cart-action.cart
116−20:45 glyph [
118+20:59 glyph [
117−20:46 tight lit %add
119+20:60 tight lit %add
118−20:51 wing note.m
120+20:65 wing note.m
119−20:57 tight glyph ]
121+20:71 tight glyph ]
122+20:72 tight glyph )
120−20:59 glyph |=
123+20:74 glyph |=
121−20:61 tight lit %acked
124+20:76 tight lit %acked
122−20:67 tight glyph )
125+20:82 tight glyph ]
123−20:68 tight glyph ]
126+20:83 tight glyph ]
124−20:69 tight glyph ]
127+20:84 tight glyph ]
12521:5 NEWLINE
12821:5 NEWLINE
12621:5 lit %toggle
12921:5 lit %toggle
12721:20 glyph [
13021:20 glyph [
12821:21 tight name m
13121:21 tight name m
12921:23 glyph ~[
13221:23 glyph ~[
130−21:25 tight glyph (
133+21:25 tight glyph [
131−21:26 tight wing poke.cart
134+21:26 tight lit %poke
135+21:32 glyph (
136+21:33 tight wing cart-action.cart
132−21:36 lit %toggle
137+21:50 lit %toggle
138+21:57 tight glyph )
133−21:44 glyph |=
139+21:59 glyph |=
134−21:46 tight lit %acked
140+21:61 tight lit %acked
135−21:52 tight glyph )
141+21:67 tight glyph ]
136−21:53 tight glyph ]
142+21:68 tight glyph ]
137−21:54 tight glyph ]
143+21:69 tight glyph ]
13822:5 NEWLINE
14422:5 NEWLINE
13922:5 glyph [
14522:5 glyph [
14022:6 tight lit %got
14622:6 tight lit %got
tests/golden/doc-grammar-07-basket/tree.txt+12−7
@@ -48,18 +48,23 @@
48 (change 20:21 m
48 (change 20:21 m
49 (edit 20:23 note (str 20:28 "")))
49 (edit 20:23 note (str 20:28 "")))
50 (list 20:32
50 (list 20:32
51− (group 20:34
51+ (tuple 20:34
52− (call 20:35
53− (wing 20:35 poke.cart)
52+ (lit 20:35 %poke)
53+ (group 20:41
54+ (call 20:42
55+ (wing 20:42 cart-action.cart)
54− (tuple 20:45 (lit 20:46 %add) (wing 20:51 note.m))
56+ (tuple 20:59 (lit 20:60 %add) (wing 20:65 note.m))))
55− (ctor 20:59 %acked))))))
57+ (ctor 20:74 %acked)))))
56 (arm 21:5
58 (arm 21:5
57 (lit 21:5 %toggle)
59 (lit 21:5 %toggle)
58 (tuple 21:20
60 (tuple 21:20
59 (wing 21:21 m)
61 (wing 21:21 m)
60 (list 21:23
62 (list 21:23
61− (group 21:25
63+ (tuple 21:25
64+ (lit 21:26 %poke)
65+ (group 21:32
62− (call 21:26 (wing 21:26 poke.cart) (lit 21:36 %toggle) (ctor 21:44 %acked))))))
66+ (call 21:33 (wing 21:33 cart-action.cart) (lit 21:50 %toggle)))
67+ (ctor 21:59 %acked)))))
63 (arm 22:5
68 (arm 22:5
64 (cell 22:5 (lit 22:6 %got) (bind 22:11 c))
69 (cell 22:5 (lit 22:6 %got) (bind 22:11 c))
65 (tuple 22:20
70 (tuple 22:20
tests/golden/doc-overview-01-cmd-sub/source.jibb+1−1
@@ -1,5 +1,5 @@
1+$ cmd |$ [M]
1+$ cmd |$ [M]
2− [%poke p=raw-poke reply=$-((unit @t) M)]
2+ [%poke p=poke reply=$-((unit @t) M)]
3 [%go url=@t]
3 [%go url=@t]
4 [%wait gap=@dr msg=M]
4 [%wait gap=@dr msg=M]
5 [%now reply=$-(@da M)]
5 [%now reply=$-(@da M)]
tests/golden/doc-overview-01-cmd-sub/tokens.txt+11−11
@@ -9,17 +9,17 @@
92:4 tight lit %poke
92:4 tight lit %poke
102:10 name p
102:10 name p
112:11 tight glyph =
112:11 tight glyph =
12−2:12 tight name raw-poke
12+2:12 tight name poke
13−2:21 name reply
13+2:17 name reply
14−2:26 tight glyph =
14+2:22 tight glyph =
15−2:27 tight glyph $-(
15+2:23 tight glyph $-(
16−2:30 tight glyph (
16+2:26 tight glyph (
17−2:31 tight name unit
17+2:27 tight name unit
18−2:36 aura @t
18+2:32 aura @t
19−2:38 tight glyph )
19+2:34 tight glyph )
20−2:40 tvar M
20+2:36 tvar M
21−2:41 tight glyph )
21+2:37 tight glyph )
22−2:42 tight glyph ]
22+2:38 tight glyph ]
233:3 NEWLINE
233:3 NEWLINE
243:3 glyph [
243:3 glyph [
253:4 tight lit %go
253:4 tight lit %go
tests/golden/doc-overview-01-cmd-sub/tree.txt+5−5
@@ -4,11 +4,11 @@
4 (union 2:3
4 (union 2:3
5 (cell 2:3
5 (cell 2:3
6 (const 2:4 %poke)
6 (const 2:4 %poke)
7− (face 2:10 p (ref 2:12 raw-poke))
7+ (face 2:10 p (ref 2:12 poke))
8− (face 2:21 reply
8+ (face 2:17 reply
9− (fn 2:27
9+ (fn 2:23
10− (apply 2:30 unit (aura 2:36 @t))
10+ (apply 2:26 unit (aura 2:32 @t))
11− (tvar 2:40 M))))
11+ (tvar 2:36 M))))
12 (cell 3:3
12 (cell 3:3
13 (const 3:4 %go)
13 (const 3:4 %go)
14 (face 3:8 url (aura 3:12 @t)))
14 (face 3:8 url (aura 3:12 @t)))
tests/golden/doc-overview-02-theme/source.jibb+1−1
@@ -5,4 +5,4 @@
5 lang="en"
5 lang="en"
6 zone="UTC"
6 zone="UTC"
7 font=`%/static/fonts/inter.woff2
7 font=`%/static/fonts/inter.woff2
8− dark=`[tones=[normal="#eee" background="#111" accent="#4c9" danger="#f28b82" muted="#aaa"]]
8+ dark=[tones=[normal="#eee" background="#111" accent="#4c9" danger="#f28b82" muted="#aaa"]]
tests/golden/doc-overview-02-theme/tokens.txt+23−24
@@ -62,28 +62,27 @@
628:5 NEWLINE
628:5 NEWLINE
638:5 name dark
638:5 name dark
648:9 tight glyph =
648:9 tight glyph =
65−8:10 tight glyph `
65+8:10 tight glyph [
66−8:11 tight glyph [
66+8:11 tight name tones
67−8:12 tight name tones
67+8:16 tight glyph =
68−8:17 tight glyph =
68+8:17 tight glyph [
69−8:18 tight glyph [
70−8:19 tight name normal
69+8:18 tight name normal
70+8:24 tight glyph =
71−8:25 tight glyph =
71+8:25 tight str "#eee"
72−8:26 tight str "#eee"
73−8:33 name background
72+8:32 name background
73+8:42 tight glyph =
74−8:43 tight glyph =
74+8:43 tight str "#111"
75−8:44 tight str "#111"
76−8:51 name accent
75+8:50 name accent
76+8:56 tight glyph =
77−8:57 tight glyph =
77+8:57 tight str "#4c9"
78−8:58 tight str "#4c9"
79−8:65 name danger
78+8:64 name danger
80−8:71 tight glyph =
79+8:70 tight glyph =
81−8:72 tight str "#f28b82"
80+8:71 tight str "#f28b82"
82−8:82 name muted
81+8:81 name muted
82+8:86 tight glyph =
83−8:87 tight glyph =
83+8:87 tight str "#aaa"
84−8:88 tight str "#aaa"
84+8:93 tight glyph ]
858:94 tight glyph ]
858:94 tight glyph ]
86−8:95 tight glyph ]
87−8:96 DEDENT
86+8:95 DEDENT
88−8:96 DEDENT
87+8:95 DEDENT
89−8:96 NEWLINE
88+8:95 NEWLINE
tests/golden/doc-overview-02-theme/tree.txt+8−9
@@ -22,12 +22,11 @@
22 (face 7:5 font
22 (face 7:5 font
23 (unit 7:10 (qath 7:11 static fonts inter.woff2)))
23 (unit 7:10 (qath 7:11 static fonts inter.woff2)))
24 (face 8:5 dark
24 (face 8:5 dark
25− (unit 8:10
25+ (tuple 8:10
26− (tuple 8:11
27− (face 8:12 tones
26+ (face 8:11 tones
28− (tuple 8:18
27+ (tuple 8:17
29− (face 8:19 normal (str 8:26 "#eee"))
28+ (face 8:18 normal (str 8:25 "#eee"))
30− (face 8:33 background (str 8:44 "#111"))
29+ (face 8:32 background (str 8:43 "#111"))
31− (face 8:51 accent (str 8:58 "#4c9"))
30+ (face 8:50 accent (str 8:57 "#4c9"))
32− (face 8:65 danger (str 8:72 "#f28b82"))
31+ (face 8:64 danger (str 8:71 "#f28b82"))
33− (face 8:82 muted (str 8:88 "#aaa"))))))))))))
32+ (face 8:81 muted (str 8:87 "#aaa")))))))))))
tests/golden/doc-overview-10-todo-list/source.jibb+2−2
@@ -19,8 +19,8 @@
19 ?- (gth (lent (tuba (trip t))) 80)
19 ?- (gth (lent (tuba (trip t))) 80)
20 %.y [m(draft=t error=`"Too long") ~]
20 %.y [m(draft=t error=`"Too long") ~]
21 %.n [m(draft=t error=~) ~]
21 %.n [m(draft=t error=~) ~]
22− %submit [m(draft="") ~[(poke.todo [%add draft.m] |=%acked)]]
22+ %submit [m(draft="") ~[[%poke (todo-action.todo [%add draft.m]) |=%acked]]]
23− [%toggled id] [m ~[(poke.todo [%toggle id] |=%acked)]]
23+ [%toggled id] [m ~[[%poke (todo-action.todo [%toggle id]) |=%acked]]]
24 [%got ts] [m(todos=ts) ~]
24 [%got ts] [m(todos=ts) ~]
25 [%acked err] [m(error=err) ~]
25 [%acked err] [m(error=err) ~]
26
26
tests/golden/doc-overview-10-todo-list/tokens.txt+28−22
@@ -169,17 +169,20 @@
16922:29 tight str ""
16922:29 tight str ""
17022:31 tight glyph )
17022:31 tight glyph )
17122:33 glyph ~[
17122:33 glyph ~[
172−22:35 tight glyph (
172+22:35 tight glyph [
173−22:36 tight wing poke.todo
173+22:36 tight lit %poke
174+22:42 glyph (
175+22:43 tight wing todo-action.todo
174−22:46 glyph [
176+22:60 glyph [
175−22:47 tight lit %add
177+22:61 tight lit %add
176−22:52 wing draft.m
178+22:66 wing draft.m
177−22:59 tight glyph ]
179+22:73 tight glyph ]
180+22:74 tight glyph )
178−22:61 glyph |=
181+22:76 glyph |=
179−22:63 tight lit %acked
182+22:78 tight lit %acked
180−22:69 tight glyph )
183+22:84 tight glyph ]
181−22:70 tight glyph ]
184+22:85 tight glyph ]
182−22:71 tight glyph ]
185+22:86 tight glyph ]
18323:5 NEWLINE
18623:5 NEWLINE
18423:5 glyph [
18723:5 glyph [
18523:6 tight lit %toggled
18823:6 tight lit %toggled
@@ -188,17 +191,20 @@
18823:20 glyph [
19123:20 glyph [
18923:21 tight name m
19223:21 tight name m
19023:23 glyph ~[
19323:23 glyph ~[
191−23:25 tight glyph (
194+23:25 tight glyph [
195+23:26 tight lit %poke
196+23:32 glyph (
192−23:26 tight wing poke.todo
197+23:33 tight wing todo-action.todo
193−23:36 glyph [
198+23:50 glyph [
194−23:37 tight lit %toggle
199+23:51 tight lit %toggle
195−23:45 name id
200+23:59 name id
196−23:47 tight glyph ]
201+23:61 tight glyph ]
202+23:62 tight glyph )
197−23:49 glyph |=
203+23:64 glyph |=
198−23:51 tight lit %acked
204+23:66 tight lit %acked
199−23:57 tight glyph )
205+23:72 tight glyph ]
200−23:58 tight glyph ]
206+23:73 tight glyph ]
201−23:59 tight glyph ]
207+23:74 tight glyph ]
20224:5 NEWLINE
20824:5 NEWLINE
20324:5 glyph [
20924:5 glyph [
20424:6 tight lit %got
21024:6 tight lit %got
tests/golden/doc-overview-10-todo-list/tree.txt+14−10
@@ -78,21 +78,25 @@
78 (change 22:21 m
78 (change 22:21 m
79 (edit 22:23 draft (str 22:29 "")))
79 (edit 22:23 draft (str 22:29 "")))
80 (list 22:33
80 (list 22:33
81− (group 22:35
81+ (tuple 22:35
82− (call 22:36
83− (wing 22:36 poke.todo)
82+ (lit 22:36 %poke)
83+ (group 22:42
84+ (call 22:43
85+ (wing 22:43 todo-action.todo)
84− (tuple 22:46 (lit 22:47 %add) (wing 22:52 draft.m))
86+ (tuple 22:60 (lit 22:61 %add) (wing 22:66 draft.m))))
85− (ctor 22:61 %acked))))))
87+ (ctor 22:76 %acked)))))
86 (arm 23:5
88 (arm 23:5
87 (cell 23:5 (lit 23:6 %toggled) (bind 23:15 id))
89 (cell 23:5 (lit 23:6 %toggled) (bind 23:15 id))
88 (tuple 23:20
90 (tuple 23:20
89 (wing 23:21 m)
91 (wing 23:21 m)
90 (list 23:23
92 (list 23:23
91− (group 23:25
93+ (tuple 23:25
92− (call 23:26
93− (wing 23:26 poke.todo)
94+ (lit 23:26 %poke)
95+ (group 23:32
96+ (call 23:33
97+ (wing 23:33 todo-action.todo)
94− (tuple 23:36 (lit 23:37 %toggle) (wing 23:45 id))
98+ (tuple 23:50 (lit 23:51 %toggle) (wing 23:59 id))))
95− (ctor 23:49 %acked))))))
99+ (ctor 23:64 %acked)))))
96 (arm 24:5
100 (arm 24:5
97 (cell 24:5 (lit 24:6 %got) (bind 24:11 ts))
101 (cell 24:5 (lit 24:6 %got) (bind 24:11 ts))
98 (tuple 24:20
102 (tuple 24:20
tests/golden/inline-mold-opaque/about.txt+1−1
@@ -1,3 +1,3 @@
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."
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."
2tests: the effect and application-path types by name
2tests: the effect and application-path types by name
3expect: parses
3expect: parses
tests/golden/inline-mold-opaque/source.jibb+1−1
@@ -1,3 +1,3 @@
1−+$ a raw-poke
1++$ a poke
2+$ b ask
2+$ b ask
3+$ c qath
3+$ c qath
tests/golden/inline-mold-opaque/tokens.txt+1−1
@@ -1,6 +1,6 @@
11:1 glyph +$
11:1 glyph +$
21:4 name a
21:4 name a
3−1:6 name raw-poke
3+1:6 name poke
42:1 NEWLINE
42:1 NEWLINE
52:1 glyph +$
52:1 glyph +$
62:4 name b
62:4 name b
tests/golden/inline-mold-opaque/tree.txt+1−1
@@ -1,4 +1,4 @@
1(module
1(module
2− (mold 1:1 a (ref 1:6 raw-poke))
2+ (mold 1:1 a (ref 1:6 poke))
3 (mold 2:1 b (ref 2:6 ask))
3 (mold 2:1 b (ref 2:6 ask))
4 (mold 3:1 c (ref 3:6 qath)))
4 (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, `poke.todo` its command helper, and `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 and its constructor, `todos.todo` a mold and a request."
2tests: the same wings in mold and in value position
2tests: the same wings in mold and in value position
3expect: parses
3expect: parses
tests/golden/inline-namespaces/source.jibb+1−1
@@ -1,4 +1,4 @@
1+$ a todo-action.todo
1+$ a todo-action.todo
2−++ b poke.todo
2+++ b todo-action.todo
3+$ c todos.todo
3+$ c todos.todo
4++ d todos.todo
4++ d todos.todo
tests/golden/inline-namespaces/tokens.txt+1−1
@@ -4,7 +4,7 @@
42:1 NEWLINE
42:1 NEWLINE
52:1 glyph ++
52:1 glyph ++
62:4 name b
62:4 name b
7−2:6 wing poke.todo
7+2:6 wing todo-action.todo
83:1 NEWLINE
83:1 NEWLINE
93:1 glyph +$
93:1 glyph +$
103:4 name c
103:4 name c
tests/golden/inline-namespaces/tree.txt+1−1
@@ -1,5 +1,5 @@
1(module
1(module
2 (mold 1:1 a (ref 1:6 todo-action.todo))
2 (mold 1:1 a (ref 1:6 todo-action.todo))
3− (value 2:1 b (wing 2:6 poke.todo))
3+ (value 2:1 b (wing 2:6 todo-action.todo))
4 (mold 3:1 c (ref 3:6 todos.todo))
4 (mold 3:1 c (ref 3:6 todos.todo))
5 (value 4:1 d (wing 4:6 todos.todo)))
5 (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 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)`"
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 an action and reply, a request, and a request followed by a fold
2+tests: derived gates called with a cell, a constructor, and a constructor followed by a name
3expect: parses
3expect: parses
tests/golden/inline-requests/source.jibb+1−1
@@ -1,3 +1,3 @@
1−++ a (poke.todo [%add draft.m] same)
1+++ a (todo-action.todo [%add draft.m])
2++ b (todos.todo |=%got)
2++ b (todos.todo |=%got)
3++ c (changes.todo |=%got apply)
3++ c (changes.todo |=%got apply)
tests/golden/inline-requests/tokens.txt+6−7
@@ -1,13 +1,12 @@
11:1 glyph ++
11:1 glyph ++
21:4 name a
21:4 name a
31:6 glyph (
31:6 glyph (
4−1:7 tight wing poke.todo
4+1:7 tight wing todo-action.todo
5−1:17 glyph [
5+1:24 glyph [
6−1:18 tight lit %add
6+1:25 tight lit %add
7−1:23 wing draft.m
7+1:30 wing draft.m
8−1:30 tight glyph ]
8+1:37 tight glyph ]
9−1:32 name same
10−1:36 tight glyph )
9+1:38 tight glyph )
112:1 NEWLINE
102:1 NEWLINE
122:1 glyph ++
112:1 glyph ++
132:4 name b
122:4 name b
tests/golden/inline-requests/tree.txt+2−3
@@ -2,9 +2,8 @@
2 (value 1:1 a
2 (value 1:1 a
3 (group 1:6
3 (group 1:6
4 (call 1:7
4 (call 1:7
5− (wing 1:7 poke.todo)
5+ (wing 1:7 todo-action.todo)
6− (tuple 1:17 (lit 1:18 %add) (wing 1:23 draft.m))
6+ (tuple 1:24 (lit 1:25 %add) (wing 1:30 draft.m)))))
7− (wing 1:32 same))))
8 (value 2:1 b
7 (value 2:1 b
9 (group 2:6
8 (group 2:6
10 (call 2:7 (wing 2:7 todos.todo) (ctor 2:18 %got))))
9 (call 2:7 (wing 2:7 todos.todo) (ctor 2:18 %got))))
tests/golden/lex-char-bad-1/about.txtdeleted−3
@@ -1,3 +0,0 @@
1−source: Grammar tab, Lexical rules: "Spaces only"; the library's design notes, 2.2 Characters, which decide the rest (characters are not a doc question)
2−tests: a line that ends with a carriage return and a line feed
3−expect: error at 1:7 — a carriage return: Jibb lines end with a line feed alone
tests/golden/lex-char-bad-1/source.jibbdeleted−1
@@ -1 +0,0 @@
1−++ x 1
tests/golden/lex-char-bad-1/tokens.txtdeleted−3
@@ -1,3 +0,0 @@
1−/tests/golden/lex-char-bad-1/source.jibb:1:7: a carriage return: Jibb lines end with a line feed alone
2−++ x 1
3− ^
tests/golden/lex-char-bad-1/tree.txtdeleted−3
@@ -1,3 +0,0 @@
1−/tests/golden/lex-char-bad-1/source.jibb:1:7: a carriage return: Jibb lines end with a line feed alone
2−++ x 1
3− ^
tests/golden/lex-char-bad-2/about.txtdeleted−3
@@ -1,3 +0,0 @@
1−source: Grammar tab, Lexical rules: "Spaces only"; the library's design notes, 2.2 Characters, which decide the rest (characters are not a doc question)
2−tests: a control character inside a string
3−expect: error at 1:8 — a control character, which no text may hold, strings included
tests/golden/lex-char-bad-2/source.jibbdeleted−1
@@ -1 +0,0 @@
1−++ x "ab"
tests/golden/lex-char-bad-2/tokens.txtdeleted−3
@@ -1,3 +0,0 @@
1−/tests/golden/lex-char-bad-2/source.jibb:1:8: a control character
2−++ x "a b"
3− ^
tests/golden/lex-char-bad-2/tree.txtdeleted−3
@@ -1,3 +0,0 @@
1−/tests/golden/lex-char-bad-2/source.jibb:1:8: a control character
2−++ x "a b"
3− ^
tests/golden/lex-char-bad-3/about.txtdeleted−3
@@ -1,3 +0,0 @@
1−source: Grammar tab, Lexical rules: "Spaces only"; the library's design notes, 2.2 Characters, which decide the rest (characters are not a doc question)
2−tests: non-ASCII text outside a string or comment
3−expect: error at 1:6 — non-ASCII text outside a string or comment
tests/golden/lex-char-bad-3/source.jibbdeleted−1
@@ -1 +0,0 @@
1−++ x é
tests/golden/lex-char-bad-3/tokens.txtdeleted−3
@@ -1,3 +0,0 @@
1−/tests/golden/lex-char-bad-3/source.jibb:1:6: non-ASCII text outside a string or comment
2−++ x é
3− ^
tests/golden/lex-char-bad-3/tree.txtdeleted−3
@@ -1,3 +0,0 @@
1−/tests/golden/lex-char-bad-3/source.jibb:1:6: non-ASCII text outside a string or comment
2−++ x é
3− ^
tests/golden/lex-string-bad-3/about.txtdeleted−3
@@ -1,3 +0,0 @@
1−source: Decisions, 2026-10-30: "Strings: Hoon's escapes: `\\`, `\"`, `\{`, and `\` with two lowercase hex digits; a string and each `{…}` close on the line they open; `::` in a string is text"
2−tests: a `\` at the end of a line, with another line after it
3−expect: error at 1:9 — the escape is cut off by the end of its line, so the error is the one it gets at the end of the text: a `\` begins `\\`, `\"`, `\{` or two hex digits (not "a control character": the line feed is none)
tests/golden/lex-string-bad-3/source.jibbdeleted−2
@@ -1,2 +0,0 @@
1−++ x "a\
2−++ y 1
tests/golden/lex-string-bad-3/tokens.txtdeleted−3
@@ -1,3 +0,0 @@
1−/tests/golden/lex-string-bad-3/source.jibb:1:9: a `\` begins `\\`, `\"`, `\{` or two hex digits
2−++ x "a\
3− ^
tests/golden/lex-string-bad-3/tree.txtdeleted−3
@@ -1,3 +0,0 @@
1−/tests/golden/lex-string-bad-3/source.jibb:1:9: a `\` begins `\\`, `\"`, `\{` or two hex digits
2−++ x "a\
3− ^
tests/golden/lex-string-bad-4/about.txtdeleted−3
@@ -1,3 +0,0 @@
1−source: Decisions, 2026-10-30: "Strings: Hoon's escapes: `\\`, `\"`, `\{`, and `\` with two lowercase hex digits; a string and each `{…}` close on the line they open; `::` in a string is text"
2−tests: a hex escape with one digit at the end of a line, with another line after it
3−expect: error at 1:9 — the escape is cut off by the end of its line: a `\` escape takes two lowercase hex digits
tests/golden/lex-string-bad-4/source.jibbdeleted−2
@@ -1,2 +0,0 @@
1−++ x "\0
2−++ y 1
tests/golden/lex-string-bad-4/tokens.txtdeleted−3
@@ -1,3 +0,0 @@
1−/tests/golden/lex-string-bad-4/source.jibb:1:9: a `\` escape takes two lowercase hex digits, as `\0a`
2−++ x "\0
3− ^
tests/golden/lex-string-bad-4/tree.txtdeleted−3
@@ -1,3 +0,0 @@
1−/tests/golden/lex-string-bad-4/source.jibb:1:9: a `\` escape takes two lowercase hex digits, as `\0a`
2−++ x "\0
3− ^
tests/golden/lex-string-bad-5/about.txtdeleted−3
@@ -1,3 +0,0 @@
1−source: Decisions, 2026-10-30: "Strings: Hoon's escapes: `\\`, `\"`, `\{`, and `\` with two lowercase hex digits; a string and each `{…}` close on the line they open; `::` in a string is text"
2−tests: a `\` followed by a character that begins no escape
3−expect: error at 1:9, the `q` — a `\` begins `\\`, `\"`, `\{` or two hex digits
tests/golden/lex-string-bad-5/source.jibbdeleted−1
@@ -1 +0,0 @@
1−++ x "a\q"
tests/golden/lex-string-bad-5/tokens.txtdeleted−3
@@ -1,3 +0,0 @@
1−/tests/golden/lex-string-bad-5/source.jibb:1:9: a `\` begins `\\`, `\"`, `\{` or two hex digits
2−++ x "a\q"
3− ^
tests/golden/lex-string-bad-5/tree.txtdeleted−3
@@ -1,3 +0,0 @@
1−/tests/golden/lex-string-bad-5/source.jibb:1:9: a `\` begins `\\`, `\"`, `\{` or two hex digits
2−++ x "a\q"
3− ^
tests/golden/lex-string-bad-6/about.txtdeleted−3
@@ -1,3 +0,0 @@
1−source: Decisions, 2026-10-30: "Strings: Hoon's escapes: `\\`, `\"`, `\{`, and `\` with two lowercase hex digits; a string and each `{…}` close on the line they open; `::` in a string is text"
2−tests: a hex escape whose second digit is not hex
3−expect: error at 1:9, the `g` — a `\` escape takes two lowercase hex digits
tests/golden/lex-string-bad-6/source.jibbdeleted−1
@@ -1 +0,0 @@
1−++ x "\0g"
tests/golden/lex-string-bad-6/tokens.txtdeleted−3
@@ -1,3 +0,0 @@
1−/tests/golden/lex-string-bad-6/source.jibb:1:9: a `\` escape takes two lowercase hex digits, as `\0a`
2−++ x "\0g"
3− ^
tests/golden/lex-string-bad-6/tree.txtdeleted−3
@@ -1,3 +0,0 @@
1−/tests/golden/lex-string-bad-6/source.jibb:1:9: a `\` escape takes two lowercase hex digits, as `\0a`
2−++ x "\0g"
3− ^
tests/golden/lex-utf8-bad-1/about.txtdeleted−3
@@ -1,3 +0,0 @@
1−source: Grammar tab, Lexical rules: "Spaces only"; the library's design notes, 2.2 Characters, which decide the rest (characters are not a doc question); section 1, Positions: columns count characters, not bytes
2−tests: a tab inside a string, after a two-byte UTF-8 character
3−expect: error at 1:8 — a tab: Jibb uses spaces only; `é` counts as one column
tests/golden/lex-utf8-bad-1/source.jibbdeleted−1
@@ -1 +0,0 @@
1−++ x "é b"
tests/golden/lex-utf8-bad-1/tokens.txtdeleted−3
@@ -1,3 +0,0 @@
1−/tests/golden/lex-utf8-bad-1/source.jibb:1:8: a tab: Jibb uses spaces only
2−++ x "é b"
3− ^
tests/golden/lex-utf8-bad-1/tree.txtdeleted−3
@@ -1,3 +0,0 @@
1−/tests/golden/lex-utf8-bad-1/source.jibb:1:8: a tab: Jibb uses spaces only
2−++ x "é b"
3− ^
tests/golden/lex-utf8-bad-2/about.txtdeleted−3
@@ -1,3 +0,0 @@
1−source: Grammar tab, Lexical rules: "Spaces only"; the library's design notes, 2.2 Characters, which decide the rest (characters are not a doc question); section 1, Positions: columns count characters, not bytes
2−tests: a tab inside a comment, after a two-byte UTF-8 character
3−expect: error at 1:13 — a tab: Jibb uses spaces only; `é` counts as one column
tests/golden/lex-utf8-bad-2/source.jibbdeleted−1
@@ -1 +0,0 @@
1−++ x 1 :: é z
tests/golden/lex-utf8-bad-2/tokens.txtdeleted−3
@@ -1,3 +0,0 @@
1−/tests/golden/lex-utf8-bad-2/source.jibb:1:13: a tab: Jibb uses spaces only
2−++ x 1 :: é z
3− ^
tests/golden/lex-utf8-bad-2/tree.txtdeleted−3
@@ -1,3 +0,0 @@
1−/tests/golden/lex-utf8-bad-2/source.jibb:1:13: a tab: Jibb uses spaces only
2−++ x 1 :: é z
3− ^
tests/golden/lex-utf8-ok-1/about.txtdeleted−3
@@ -1,3 +0,0 @@
1−source: Grammar tab, Lexical rules: "Spaces only"; the library's design notes, 2.2 Characters, which decide the rest (characters are not a doc question); section 1, Positions: columns count characters, not bytes
2−tests: a two-byte UTF-8 character in a string, before more tokens on its line
3−expect: parses — `1` is at 1:11 and `]` at 1:12, counting `é` as one column
tests/golden/lex-utf8-ok-1/source.jibbdeleted−1
@@ -1 +0,0 @@
1−++ x ["é" 1]
tests/golden/lex-utf8-ok-1/tokens.txtdeleted−7
@@ -1,7 +0,0 @@
1−1:1 glyph ++
2−1:4 name x
3−1:6 glyph [
4−1:7 tight str "é"
5−1:11 lit 1
6−1:12 tight glyph ]
7−1:13 NEWLINE
tests/golden/lex-utf8-ok-1/tree.txtdeleted−3
@@ -1,3 +0,0 @@
1−(module
2− (value 1:1 x
3− (tuple 1:6 (str 1:7 "é") (lit 1:11 1))))
tests/golden/module-import-api-derived-clash/about.txtdeleted−4
@@ -1,4 +0,0 @@
1−source: Grammar, Modules: "An API module, `/ui/api/<agent>.jibb`, also exports derived gates: ... a request per `paths` case ... Clashing derived names are errors, including a derived name that clashes with an import face."
2−tests: An imported API whose `++ plain` clashes with the request derived from its `%plain` path case is rejected with a definite error at the path case and the definition, not as unsupported path analysis.
3−expect: parses
4−expect-types: a partial inference report
tests/golden/module-import-api-derived-clash/mar/full.txtdeleted−5
@@ -1,5 +0,0 @@
1−|_ a=@t
2−++ grab |% ++ noun @t --
3−++ grow |% ++ noun a --
4−++ grad %noun
5−--
tests/golden/module-import-api-derived-clash/marks.txtdeleted−1
@@ -1 +0,0 @@
1−full
tests/golden/module-import-api-derived-clash/module-trees.txtdeleted−8
@@ -1,8 +0,0 @@
1−/ui/api/demo.jibb
2−(module
3− (mark 1:1 %full)
4− (mold 2:1 paths
5− (union 3:3
6− (cell 3:3 (const 3:4 %plain) (path 3:11 /plain) (ref 3:18 full))
7− (cell 4:3 (const 4:4 %other) (path 4:11 /other) (ref 4:18 full))))
8− (value 5:1 plain (lit 5:10 5)))
tests/golden/module-import-api-derived-clash/modules.txtdeleted−1
@@ -1 +0,0 @@
1−/ui/api/demo.jibb
tests/golden/module-import-api-derived-clash/modules/ui/api/demo.jibbdeleted−5
@@ -1,5 +0,0 @@
1−/% %full
2−+$ paths
3− [%plain /plain full]
4− [%other /other full]
5−++ plain 5
tests/golden/module-import-api-derived-clash/source.jibbdeleted−2
@@ -1,2 +0,0 @@
1−/= api /ui/api/demo
2−++ x 1
tests/golden/module-import-api-derived-clash/tokens.txtdeleted−13
@@ -1,13 +0,0 @@
1−1:1 glyph /=
2−1:4 name api
3−1:8 glyph /
4−1:9 tight knot ui
5−1:11 tight glyph /
6−1:12 tight knot api
7−1:15 tight glyph /
8−1:16 tight knot demo
9−2:1 NEWLINE
10−2:1 glyph ++
11−2:4 name x
12−2:6 lit 1
13−2:7 NEWLINE
tests/golden/module-import-api-derived-clash/tree.txtdeleted−3
@@ -1,3 +0,0 @@
1−(module
2− (jibb 1:1 api /ui/api/demo)
3− (value 2:1 x (lit 2:6 1)))
tests/golden/module-import-api-derived-clash/types.txtdeleted−8
@@ -1,8 +0,0 @@
1−partial inference; module not checked
2−API derived name `plain` clashes with a definition
3−/ui/api/demo.jibb:3:3: `plain` is derived from this path case
4− [%plain /plain full]
5− ^
6−/ui/api/demo.jibb:5:1: clashing definition
7−++ plain 5
8−^
tests/golden/module-import-api-import-error/about.txtdeleted−4
@@ -1,4 +0,0 @@
1−source: Grammar, Modules: "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."
2−tests: An imported API imports a store whose own `++ state` clashes with its derived `state` request. The store's definite error is reported as itself, at both sites, as for other importing modules, not as the API's unsupported inference.
3−expect: parses
4−expect-types: a partial inference report
tests/golden/module-import-api-import-error/mar/full.txtdeleted−5
@@ -1,5 +0,0 @@
1−|_ a=@t
2−++ grab |% ++ noun @t --
3−++ grow |% ++ noun a --
4−++ grad %noun
5−--
tests/golden/module-import-api-import-error/marks.txtdeleted−1
@@ -1 +0,0 @@
1−full
tests/golden/module-import-api-import-error/module-trees.txtdeleted−48
@@ -1,48 +0,0 @@
1−/ui/api/demo.jibb
2−(module
3− (mark 1:1 %full)
4− (jibb 2:1 cart /ui/stores/cart)
5− (mold 3:1 paths
6− (union 4:3
7− (cell 4:3 (const 4:4 %plain) (path 4:11 /plain) (ref 4:18 full))
8− (cell 5:3 (const 5:4 %other) (path 5:11 /other) (ref 5:18 full)))))
9−/ui/stores/cart.jibb
10−(module
11− (mold 1:1 state
12− (cell 1:10
13− (face 1:11 items
14− (apply 1:17 list (aura 1:23 @t)))
15− (face 1:27 open (flag 1:32))))
16− (mold 2:1 poke
17− (union 3:3
18− (cell 3:3
19− (const 3:4 %add)
20− (face 3:9 item (aura 3:14 @t)))
21− (const 4:3 %toggle)))
22− (value 6:1 main
23− (group 6:9
24− (call 6:10 (wing 6:10 store) (wing 6:16 init) (wing 6:21 update))))
25− (value 7:1 init
26− (cast 7:9
27− (ref 7:12 state)
28− (tuple 7:18 (lit 7:19 ~) (lit 7:21 %.n))))
29− (value 8:1 update
30− (gate 8:11
31− (cell 8:14
32− (face 8:15 a (ref 8:17 poke))
33− (face 8:22 s (ref 8:24 state)))
34− (body 9:3
35− (branch 9:3
36− (wing 9:6 a)
37− (arm 10:5
38− (cell 10:5 (lit 10:6 %add) (bind 10:11 item))
39− (change 10:18 s
40− (edit 10:20 items
41− (tuple 10:26 (wing 10:27 item) (wing 10:32 items.s)))))
42− (arm 11:5
43− (lit 11:5 %toggle)
44− (change 11:18 s
45− (edit 11:20 open
46− (group 11:25
47− (call 11:26 (wing 11:26 not) (wing 11:30 open.s))))))))))
48− (value 12:1 state (lit 12:10 5)))
tests/golden/module-import-api-import-error/modules.txtdeleted−2
@@ -1,2 +0,0 @@
1−/ui/api/demo.jibb
2−/ui/stores/cart.jibb
tests/golden/module-import-api-import-error/modules/ui/api/demo.jibbdeleted−5
@@ -1,5 +0,0 @@
1−/% %full
2−/= cart /ui/stores/cart
3−+$ paths
4− [%plain /plain full]
5− [%other /other full]
tests/golden/module-import-api-import-error/modules/ui/stores/cart.jibbdeleted−12
@@ -1,12 +0,0 @@
1−+$ state [items=(list @t) open=?]
2−+$ poke
3− [%add item=@t]
4− %toggle
5−
6−++ main (store init update)
7−++ init ^- state [~ %.n]
8−++ update |= [a=poke s=state]
9− ?- a
10− [%add item] s(items=[item items.s])
11− %toggle s(open=(not open.s))
12−++ state 5
tests/golden/module-import-api-import-error/source.jibbdeleted−2
@@ -1,2 +0,0 @@
1−/= api /ui/api/demo
2−++ x 1
tests/golden/module-import-api-import-error/tokens.txtdeleted−13
@@ -1,13 +0,0 @@
1−1:1 glyph /=
2−1:4 name api
3−1:8 glyph /
4−1:9 tight knot ui
5−1:11 tight glyph /
6−1:12 tight knot api
7−1:15 tight glyph /
8−1:16 tight knot demo
9−2:1 NEWLINE
10−2:1 glyph ++
11−2:4 name x
12−2:6 lit 1
13−2:7 NEWLINE
tests/golden/module-import-api-import-error/tree.txtdeleted−3
@@ -1,3 +0,0 @@
1−(module
2− (jibb 1:1 api /ui/api/demo)
3− (value 2:1 x (lit 2:6 1)))
tests/golden/module-import-api-import-error/types.txtdeleted−8
@@ -1,8 +0,0 @@
1−partial inference; module not checked
2−store derived name `state` clashes with a definition
3−/ui/stores/cart.jibb:1:1: `state` is derived from this mold
4−+$ state [items=(list @t) open=?]
5−^
6−/ui/stores/cart.jibb:12:1: clashing definition
7−++ state 5
8−^
tests/golden/module-import-api-mark-prelude-value/about.txtdeleted−4
@@ -1,4 +0,0 @@
1−source: Grammar, 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."
2−tests: An imported poke-only API whose mark is named `same`, like the prelude value. A mark names a mold, so this is not a name conflict; the poke-only check reports its import scope as unsupported.
3−expect: parses
4−expect-types: a partial inference report
tests/golden/module-import-api-mark-prelude-value/mar/same.txtdeleted−5
@@ -1,5 +0,0 @@
1−|_ a=@t
2−++ grab |% ++ noun @t --
3−++ grow |% ++ noun a --
4−++ grad %noun
5−--
tests/golden/module-import-api-mark-prelude-value/marks.txtdeleted−1
@@ -1 +0,0 @@
1−same
tests/golden/module-import-api-mark-prelude-value/module-trees.txtdeleted−4
@@ -1,4 +0,0 @@
1−/ui/api/demo.jibb
2−(module
3− (mark 1:1 %same)
4− (mold 2:1 poke (ref 2:9 same)))
tests/golden/module-import-api-mark-prelude-value/modules.txtdeleted−1
@@ -1 +0,0 @@
1−/ui/api/demo.jibb
tests/golden/module-import-api-mark-prelude-value/modules/ui/api/demo.jibbdeleted−2
@@ -1,2 +0,0 @@
1−/% %same
2−+$ poke same
tests/golden/module-import-api-mark-prelude-value/source.jibbdeleted−2
@@ -1,2 +0,0 @@
1−/= api /ui/api/demo
2−++ x 1
tests/golden/module-import-api-mark-prelude-value/tokens.txtdeleted−13
@@ -1,13 +0,0 @@
1−1:1 glyph /=
2−1:4 name api
3−1:8 glyph /
4−1:9 tight knot ui
5−1:11 tight glyph /
6−1:12 tight knot api
7−1:15 tight glyph /
8−1:16 tight knot demo
9−2:1 NEWLINE
10−2:1 glyph ++
11−2:4 name x
12−2:6 lit 1
13−2:7 NEWLINE
tests/golden/module-import-api-mark-prelude-value/tree.txtdeleted−3
@@ -1,3 +0,0 @@
1−(module
2− (jibb 1:1 api /ui/api/demo)
3− (value 2:1 x (lit 2:6 1)))
tests/golden/module-import-api-mark-prelude-value/types.txtdeleted−2
@@ -1,2 +0,0 @@
1−partial inference; module not checked
2−API module needs unsupported inference: /ui/api/demo/jibb: API import scope needs unsupported inference
tests/golden/module-import-api-mark-value/about.txtdeleted−4
@@ -1,4 +0,0 @@
1−source: Grammar, 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."
2−tests: An imported poke-only API whose mark `full` names a mold, beside a value `++ full`. The two names are in separate namespaces, so this is not a name conflict; the poke-only check stops at the extra value, which it does not support.
3−expect: parses
4−expect-types: a partial inference report
tests/golden/module-import-api-mark-value/mar/full.txtdeleted−5
@@ -1,5 +0,0 @@
1−|_ a=@t
2−++ grab |% ++ noun @t --
3−++ grow |% ++ noun a --
4−++ grad %noun
5−--
tests/golden/module-import-api-mark-value/marks.txtdeleted−1
@@ -1 +0,0 @@
1−full
tests/golden/module-import-api-mark-value/module-trees.txtdeleted−5
@@ -1,5 +0,0 @@
1−/ui/api/demo.jibb
2−(module
3− (mark 1:1 %full)
4− (mold 2:1 poke (ref 2:9 full))
5− (value 3:1 full (lit 3:9 5)))
tests/golden/module-import-api-mark-value/modules.txtdeleted−1
@@ -1 +0,0 @@
1−/ui/api/demo.jibb
tests/golden/module-import-api-mark-value/modules/ui/api/demo.jibbdeleted−3
@@ -1,3 +0,0 @@
1−/% %full
2−+$ poke full
3−++ full 5
tests/golden/module-import-api-mark-value/source.jibbdeleted−2
@@ -1,2 +0,0 @@
1−/= api /ui/api/demo
2−++ x 1
tests/golden/module-import-api-mark-value/tokens.txtdeleted−13
@@ -1,13 +0,0 @@
1−1:1 glyph /=
2−1:4 name api
3−1:8 glyph /
4−1:9 tight knot ui
5−1:11 tight glyph /
6−1:12 tight knot api
7−1:15 tight glyph /
8−1:16 tight knot demo
9−2:1 NEWLINE
10−2:1 glyph ++
11−2:4 name x
12−2:6 lit 1
13−2:7 NEWLINE
tests/golden/module-import-api-mark-value/tree.txtdeleted−3
@@ -1,3 +0,0 @@
1−(module
2− (jibb 1:1 api /ui/api/demo)
3− (value 2:1 x (lit 2:6 1)))
tests/golden/module-import-api-mark-value/types.txtdeleted−2
@@ -1,2 +0,0 @@
1−partial inference; module not checked
2−API module needs unsupported inference: /ui/api/demo/jibb: poke-only API definitions need unsupported inference
tests/golden/module-import-api-nested-path/about.txtdeleted−4
@@ -1,4 +0,0 @@
1−source: Grammar, Modules: "An API module, `/ui/api/<agent>.jibb`, also exports derived gates".
2−tests: An imported module at `/ui/api/foo/bar.jibb` with only `+$ poke full` is outside the poke-only fragment because of its path. It fails with the specific reason that API path evidence requires `/ui/api/<agent>.jibb`, the reason a module at that path that declares `+$ paths` gives too.
3−expect: parses
4−expect-types: a partial inference report
tests/golden/module-import-api-nested-path/mar/full.txtdeleted−5
@@ -1,5 +0,0 @@
1−|_ a=@t
2−++ grab |% ++ noun @t --
3−++ grow |% ++ noun a --
4−++ grad %noun
5−--
tests/golden/module-import-api-nested-path/marks.txtdeleted−1
@@ -1 +0,0 @@
1−full
tests/golden/module-import-api-nested-path/module-trees.txtdeleted−4
@@ -1,4 +0,0 @@
1−/ui/api/foo/bar.jibb
2−(module
3− (mark 1:1 %full)
4− (mold 2:1 poke (ref 2:9 full)))
tests/golden/module-import-api-nested-path/modules.txtdeleted−1
@@ -1 +0,0 @@
1−/ui/api/foo/bar.jibb
tests/golden/module-import-api-nested-path/modules/ui/api/foo/bar.jibbdeleted−2
@@ -1,2 +0,0 @@
1−/% %full
2−+$ poke full
tests/golden/module-import-api-nested-path/source.jibbdeleted−2
@@ -1,2 +0,0 @@
1−/= api /ui/api/foo/bar
2−++ x 1
tests/golden/module-import-api-nested-path/tokens.txtdeleted−15
@@ -1,15 +0,0 @@
1−1:1 glyph /=
2−1:4 name api
3−1:8 glyph /
4−1:9 tight knot ui
5−1:11 tight glyph /
6−1:12 tight knot api
7−1:15 tight glyph /
8−1:16 tight knot foo
9−1:19 tight glyph /
10−1:20 tight knot bar
11−2:1 NEWLINE
12−2:1 glyph ++
13−2:4 name x
14−2:6 lit 1
15−2:7 NEWLINE
tests/golden/module-import-api-nested-path/tree.txtdeleted−3
@@ -1,3 +0,0 @@
1−(module
2− (jibb 1:1 api /ui/api/foo/bar)
3− (value 2:1 x (lit 2:6 1)))
tests/golden/module-import-api-nested-path/types.txtdeleted−2
@@ -1,2 +0,0 @@
1−partial inference; module not checked
2−API module needs unsupported inference: /ui/api/foo/bar/jibb: API path evidence requires /ui/api/<agent>.jibb
tests/golden/module-import-api-paths-mark-value/about.txtdeleted−4
@@ -1,4 +0,0 @@
1−source: Grammar, 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."
2−tests: An imported API with `+$ paths` whose mark `other` names a mold, beside a value `++ other`. This is not a name conflict; the path declaration with a value beside it is unsupported.
3−expect: parses
4−expect-types: a partial inference report
tests/golden/module-import-api-paths-mark-value/mar/full.txtdeleted−5
@@ -1,5 +0,0 @@
1−|_ a=@t
2−++ grab |% ++ noun @t --
3−++ grow |% ++ noun a --
4−++ grad %noun
5−--
tests/golden/module-import-api-paths-mark-value/mar/other.txtdeleted−5
@@ -1,5 +0,0 @@
1−|_ a=@t
2−++ grab |% ++ noun @t --
3−++ grow |% ++ noun a --
4−++ grad %noun
5−--
tests/golden/module-import-api-paths-mark-value/marks.txtdeleted−2
@@ -1,2 +0,0 @@
1−full
2−other
tests/golden/module-import-api-paths-mark-value/module-trees.txtdeleted−7
@@ -1,7 +0,0 @@
1−/ui/api/demo.jibb
2−(module
3− (mark 1:1 %full)
4− (mark 2:1 %other)
5− (mold 3:1 paths
6− (cell 4:3 (const 4:4 %plain) (path 4:11 /plain) (ref 4:18 full)))
7− (value 5:1 other (lit 5:10 5)))
tests/golden/module-import-api-paths-mark-value/modules.txtdeleted−1
@@ -1 +0,0 @@
1−/ui/api/demo.jibb
tests/golden/module-import-api-paths-mark-value/modules/ui/api/demo.jibbdeleted−5
@@ -1,5 +0,0 @@
1−/% %full
2−/% %other
3−+$ paths
4− [%plain /plain full]
5−++ other 5
tests/golden/module-import-api-paths-mark-value/source.jibbdeleted−2
@@ -1,2 +0,0 @@
1−/= api /ui/api/demo
2−++ x 1
tests/golden/module-import-api-paths-mark-value/tokens.txtdeleted−13
@@ -1,13 +0,0 @@
1−1:1 glyph /=
2−1:4 name api
3−1:8 glyph /
4−1:9 tight knot ui
5−1:11 tight glyph /
6−1:12 tight knot api
7−1:15 tight glyph /
8−1:16 tight knot demo
9−2:1 NEWLINE
10−2:1 glyph ++
11−2:4 name x
12−2:6 lit 1
13−2:7 NEWLINE
tests/golden/module-import-api-paths-mark-value/tree.txtdeleted−3
@@ -1,3 +0,0 @@
1−(module
2− (jibb 1:1 api /ui/api/demo)
3− (value 2:1 x (lit 2:6 1)))
tests/golden/module-import-api-paths-mark-value/types.txtdeleted−2
@@ -1,2 +0,0 @@
1−partial inference; module not checked
2−API module needs unsupported inference: /ui/api/demo/jibb: API path declaration needs unsupported analysis
tests/golden/module-import-api-paths-scope-conflict/about.txtdeleted−4
@@ -1,4 +0,0 @@
1−source: Grammar, Modules: "no name may shadow one already in scope, imports and the prelude included".
2−tests: An imported API that declares `+$ paths` imports the mark `full` twice. As in other modules, the conflict is reported as conflicting names, not as a path declaration that needs unsupported analysis.
3−expect: parses
4−expect-types: a partial inference report
tests/golden/module-import-api-paths-scope-conflict/mar/full.txtdeleted−5
@@ -1,5 +0,0 @@
1−|_ a=@t
2−++ grab |% ++ noun @t --
3−++ grow |% ++ noun a --
4−++ grad %noun
5−--
tests/golden/module-import-api-paths-scope-conflict/marks.txtdeleted−1
@@ -1 +0,0 @@
1−full
tests/golden/module-import-api-paths-scope-conflict/module-trees.txtdeleted−6
@@ -1,6 +0,0 @@
1−/ui/api/demo.jibb
2−(module
3− (mark 1:1 %full)
4− (mark 2:1 %full)
5− (mold 3:1 paths
6− (cell 3:10 (const 3:11 %plain) (path 3:18 /plain) (ref 3:25 full))))
tests/golden/module-import-api-paths-scope-conflict/modules.txtdeleted−1
@@ -1 +0,0 @@
1−/ui/api/demo.jibb
tests/golden/module-import-api-paths-scope-conflict/modules/ui/api/demo.jibbdeleted−3
@@ -1,3 +0,0 @@
1−/% %full
2−/% %full
3−+$ paths [%plain /plain full]
tests/golden/module-import-api-paths-scope-conflict/source.jibbdeleted−2
@@ -1,2 +0,0 @@
1−/= api /ui/api/demo
2−++ x 1
tests/golden/module-import-api-paths-scope-conflict/tokens.txtdeleted−13
@@ -1,13 +0,0 @@
1−1:1 glyph /=
2−1:4 name api
3−1:8 glyph /
4−1:9 tight knot ui
5−1:11 tight glyph /
6−1:12 tight knot api
7−1:15 tight glyph /
8−1:16 tight knot demo
9−2:1 NEWLINE
10−2:1 glyph ++
11−2:4 name x
12−2:6 lit 1
13−2:7 NEWLINE
tests/golden/module-import-api-paths-scope-conflict/tree.txtdeleted−3
@@ -1,3 +0,0 @@
1−(module
2− (jibb 1:1 api /ui/api/demo)
3− (value 2:1 x (lit 2:6 1)))
tests/golden/module-import-api-paths-scope-conflict/types.txtdeleted−2
@@ -1,2 +0,0 @@
1−partial inference; module not checked
2−module has conflicting names: /ui/api/demo/jibb
tests/golden/module-import-api-poke-clash/about.txtdeleted−4
@@ -1,4 +0,0 @@
1−source: Grammar, Modules: "An API module, `/ui/api/<agent>.jibb`, also exports derived gates: a generic `poke` command helper ... Clashing derived names are errors, including a derived name that clashes with an import face."
2−tests: An imported API whose `++ poke` clashes with the helper derived from its `+$ poke` is rejected with a definite error at the mold and the definition. The API has no `+$ paths`, so no path declaration is blamed.
3−expect: parses
4−expect-types: a partial inference report
tests/golden/module-import-api-poke-clash/mar/full.txtdeleted−5
@@ -1,5 +0,0 @@
1−|_ a=@t
2−++ grab |% ++ noun @t --
3−++ grow |% ++ noun a --
4−++ grad %noun
5−--
tests/golden/module-import-api-poke-clash/marks.txtdeleted−1
@@ -1 +0,0 @@
1−full
tests/golden/module-import-api-poke-clash/module-trees.txtdeleted−5
@@ -1,5 +0,0 @@
1−/ui/api/demo.jibb
2−(module
3− (mark 1:1 %full)
4− (mold 2:1 poke (ref 2:9 full))
5− (value 3:1 poke (str 3:9 "bad")))
tests/golden/module-import-api-poke-clash/modules.txtdeleted−1
@@ -1 +0,0 @@
1−/ui/api/demo.jibb
tests/golden/module-import-api-poke-clash/modules/ui/api/demo.jibbdeleted−3
@@ -1,3 +0,0 @@
1−/% %full
2−+$ poke full
3−++ poke "bad"
tests/golden/module-import-api-poke-clash/source.jibbdeleted−2
@@ -1,2 +0,0 @@
1−/= api /ui/api/demo
2−++ x 1
tests/golden/module-import-api-poke-clash/tokens.txtdeleted−13
@@ -1,13 +0,0 @@
1−1:1 glyph /=
2−1:4 name api
3−1:8 glyph /
4−1:9 tight knot ui
5−1:11 tight glyph /
6−1:12 tight knot api
7−1:15 tight glyph /
8−1:16 tight knot demo
9−2:1 NEWLINE
10−2:1 glyph ++
11−2:4 name x
12−2:6 lit 1
13−2:7 NEWLINE
tests/golden/module-import-api-poke-clash/tree.txtdeleted−3
@@ -1,3 +0,0 @@
1−(module
2− (jibb 1:1 api /ui/api/demo)
3− (value 2:1 x (lit 2:6 1)))
tests/golden/module-import-api-poke-clash/types.txtdeleted−8
@@ -1,8 +0,0 @@
1−partial inference; module not checked
2−API derived name `poke` clashes with a definition
3−/ui/api/demo.jibb:2:1: `poke` is derived from this mold
4−+$ poke full
5−^
6−/ui/api/demo.jibb:3:1: clashing definition
7−++ poke "bad"
8−^
tests/golden/module-import-api-poke-reason/about.txtdeleted−4
@@ -1,4 +0,0 @@
1−source: Grammar, Imports: "`/%` names a type after its mark, so it takes no face"; Modules: an API module exports "a generic `poke` command helper, adding the agent and mark".
2−tests: An imported API with only `+$ poke full` and no `/%` import is outside the poke-only fragment, which needs one `/%` mark import. It fails with that check's reason after the module's path; the module has no `+$ paths`, so no path declaration is blamed.
3−expect: parses
4−expect-types: a partial inference report
tests/golden/module-import-api-poke-reason/module-trees.txtdeleted−3
@@ -1,3 +0,0 @@
1−/ui/api/demo.jibb
2−(module
3− (mold 1:1 poke (ref 1:9 full)))
tests/golden/module-import-api-poke-reason/modules.txtdeleted−1
@@ -1 +0,0 @@
1−/ui/api/demo.jibb
tests/golden/module-import-api-poke-reason/modules/ui/api/demo.jibbdeleted−1
@@ -1 +0,0 @@
1−+$ poke full
tests/golden/module-import-api-poke-reason/source.jibbdeleted−2
@@ -1,2 +0,0 @@
1−/= api /ui/api/demo
2−++ x 1
tests/golden/module-import-api-poke-reason/tokens.txtdeleted−13
@@ -1,13 +0,0 @@
1−1:1 glyph /=
2−1:4 name api
3−1:8 glyph /
4−1:9 tight knot ui
5−1:11 tight glyph /
6−1:12 tight knot api
7−1:15 tight glyph /
8−1:16 tight knot demo
9−2:1 NEWLINE
10−2:1 glyph ++
11−2:4 name x
12−2:6 lit 1
13−2:7 NEWLINE
tests/golden/module-import-api-poke-reason/tree.txtdeleted−3
@@ -1,3 +0,0 @@
1−(module
2− (jibb 1:1 api /ui/api/demo)
3− (value 2:1 x (lit 2:6 1)))
tests/golden/module-import-api-poke-reason/types.txtdeleted−2
@@ -1,2 +0,0 @@
1−partial inference; module not checked
2−API module needs unsupported inference: /ui/api/demo/jibb: poke-only API mark imports need unsupported inference
tests/golden/module-import-api-request-reason/about.txtdeleted−4
@@ -1,4 +0,0 @@
1−source: docs/spec/overview.md, Agent APIs: "A path case is a request name, a path and a type."
2−tests: A path case with two typed parameters is outside the request fragment, so the imported API fails with the reason its request constructor gave, `request paths need unsupported inference`, after the module's path.
3−expect: parses
4−expect-types: a partial inference report
tests/golden/module-import-api-request-reason/mar/full.txtdeleted−5
@@ -1,5 +0,0 @@
1−|_ a=@t
2−++ grab |% ++ noun @t --
3−++ grow |% ++ noun a --
4−++ grad %noun
5−--
tests/golden/module-import-api-request-reason/marks.txtdeleted−1
@@ -1 +0,0 @@
1−full
tests/golden/module-import-api-request-reason/module-trees.txtdeleted−7
@@ -1,7 +0,0 @@
1−/ui/api/demo.jibb
2−(module
3− (mark 1:1 %full)
4− (mold 2:1 paths
5− (union 3:3
6− (cell 3:3 (const 3:4 %plain) (path 3:11 /plain) (ref 3:18 full))
7− (cell 4:3 (const 4:4 %pair) (path 4:10 /pair/[a=@ud]/[b=@ud]) (ref 4:32 full)))))
tests/golden/module-import-api-request-reason/modules.txtdeleted−1
@@ -1 +0,0 @@
1−/ui/api/demo.jibb
tests/golden/module-import-api-request-reason/modules/ui/api/demo.jibbdeleted−4
@@ -1,4 +0,0 @@
1−/% %full
2−+$ paths
3− [%plain /plain full]
4− [%pair /pair/[a=@ud]/[b=@ud] full]
tests/golden/module-import-api-request-reason/source.jibbdeleted−2
@@ -1,2 +0,0 @@
1−/= api /ui/api/demo
2−++ cord (plain.api |=(x=@t "ok"))
tests/golden/module-import-api-request-reason/tokens.txtdeleted−21
@@ -1,21 +0,0 @@
1−1:1 glyph /=
2−1:4 name api
3−1:8 glyph /
4−1:9 tight knot ui
5−1:11 tight glyph /
6−1:12 tight knot api
7−1:15 tight glyph /
8−1:16 tight knot demo
9−2:1 NEWLINE
10−2:1 glyph ++
11−2:4 name cord
12−2:9 glyph (
13−2:10 tight wing plain.api
14−2:20 glyph |=(
15−2:23 tight name x
16−2:24 tight glyph =
17−2:25 tight aura @t
18−2:28 str "ok"
19−2:32 tight glyph )
20−2:33 tight glyph )
21−2:34 NEWLINE
tests/golden/module-import-api-request-reason/tree.txtdeleted−9
@@ -1,9 +0,0 @@
1−(module
2− (jibb 1:1 api /ui/api/demo)
3− (value 2:1 cord
4− (group 2:9
5− (call 2:10
6− (wing 2:10 plain.api)
7− (gate-wide 2:20
8− (face 2:23 x (aura 2:25 @t))
9− (str 2:28 "ok"))))))
tests/golden/module-import-api-request-reason/types.txtdeleted−2
@@ -1,2 +0,0 @@
1−partial inference; module not checked
2−API module needs unsupported inference: /ui/api/demo/jibb: request paths need unsupported inference
tests/golden/module-import-api-scope-conflict/about.txtdeleted−4
@@ -1,4 +0,0 @@
1−source: Grammar, Modules: "no name may shadow one already in scope, imports and the prelude included".
2−tests: An imported API with only `+$ poke full` gives a Jibb import the face `same`, which shadows the prelude value `same`. The poke-only check stops there, and the conflict is reported as conflicting names, as in other modules, not as unsupported inference.
3−expect: parses
4−expect-types: a partial inference report
tests/golden/module-import-api-scope-conflict/mar/full.txtdeleted−5
@@ -1,5 +0,0 @@
1−|_ a=@t
2−++ grab |% ++ noun @t --
3−++ grow |% ++ noun a --
4−++ grad %noun
5−--
tests/golden/module-import-api-scope-conflict/marks.txtdeleted−1
@@ -1 +0,0 @@
1−full
tests/golden/module-import-api-scope-conflict/module-trees.txtdeleted−11
@@ -1,11 +0,0 @@
1−/ui/api/demo.jibb
2−(module
3− (mark 1:1 %full)
4− (jibb 2:1 same /ui/lib)
5− (mold 3:1 poke (ref 3:9 full)))
6−/ui/lib.jibb
7−(module
8− (value 1:1 safe
9− (gate 1:9
10− (face 1:12 x (aura 1:14 @t))
11− (wing 1:17 x))))
tests/golden/module-import-api-scope-conflict/modules.txtdeleted−2
@@ -1,2 +0,0 @@
1−/ui/api/demo.jibb
2−/ui/lib.jibb
tests/golden/module-import-api-scope-conflict/modules/ui/api/demo.jibbdeleted−3
@@ -1,3 +0,0 @@
1−/% %full
2−/= same /ui/lib
3−+$ poke full
tests/golden/module-import-api-scope-conflict/modules/ui/lib.jibbdeleted−1
@@ -1 +0,0 @@
1−++ safe |= x=@t x
tests/golden/module-import-api-scope-conflict/source.jibbdeleted−2
@@ -1,2 +0,0 @@
1−/= api /ui/api/demo
2−++ x 1
tests/golden/module-import-api-scope-conflict/tokens.txtdeleted−13
@@ -1,13 +0,0 @@
1−1:1 glyph /=
2−1:4 name api
3−1:8 glyph /
4−1:9 tight knot ui
5−1:11 tight glyph /
6−1:12 tight knot api
7−1:15 tight glyph /
8−1:16 tight knot demo
9−2:1 NEWLINE
10−2:1 glyph ++
11−2:4 name x
12−2:6 lit 1
13−2:7 NEWLINE
tests/golden/module-import-api-scope-conflict/tree.txtdeleted−3
@@ -1,3 +0,0 @@
1−(module
2− (jibb 1:1 api /ui/api/demo)
3− (value 2:1 x (lit 2:6 1)))
tests/golden/module-import-api-scope-conflict/types.txtdeleted−2
@@ -1,2 +0,0 @@
1−partial inference; module not checked
2−module has conflicting names: /ui/api/demo/jibb
tests/golden/module-import-cycle/source.jibb+1−1
@@ -1,2 +1,2 @@
1/= a /ui/a
1/= a /ui/a
2−++ text-value (identity.a "hi")
2+++ text (identity.a "hi")
tests/golden/module-import-cycle/tokens.txt+6−6
@@ -6,9 +6,9 @@
61:11 tight knot a
61:11 tight knot a
72:1 NEWLINE
72:1 NEWLINE
82:1 glyph ++
82:1 glyph ++
9−2:4 name text-value
9+2:4 name text
10−2:15 glyph (
10+2:9 glyph (
11−2:16 tight wing identity.a
11+2:10 tight wing identity.a
12−2:27 str "hi"
12+2:21 str "hi"
13−2:31 tight glyph )
13+2:25 tight glyph )
14−2:32 NEWLINE
14+2:26 NEWLINE
tests/golden/module-import-cycle/tree.txt+3−3
@@ -1,5 +1,5 @@
1(module
1(module
2 (jibb 1:1 a /ui/a)
2 (jibb 1:1 a /ui/a)
3− (value 2:1 text-value
3+ (value 2:1 text
4− (group 2:15
4+ (group 2:9
5− (call 2:16 (wing 2:16 identity.a) (str 2:27 "hi")))))
5+ (call 2:10 (wing 2:10 identity.a) (str 2:21 "hi")))))
tests/golden/module-import-identity/source.jibb+1−1
@@ -1,3 +1,3 @@
1/= lib /ui/lib
1/= lib /ui/lib
2−++ text-value (identity.lib "hi")
2+++ text (identity.lib "hi")
3++ ship (identity.lib ~zod)
3++ ship (identity.lib ~zod)
tests/golden/module-import-identity/tokens.txt+5−5
@@ -6,11 +6,11 @@
61:13 tight knot lib
61:13 tight knot lib
72:1 NEWLINE
72:1 NEWLINE
82:1 glyph ++
82:1 glyph ++
9−2:4 name text-value
9+2:4 name text
10−2:15 glyph (
10+2:9 glyph (
11−2:16 tight wing identity.lib
11+2:10 tight wing identity.lib
12−2:29 str "hi"
12+2:23 str "hi"
13−2:33 tight glyph )
13+2:27 tight glyph )
143:1 NEWLINE
143:1 NEWLINE
153:1 glyph ++
153:1 glyph ++
163:4 name ship
163:4 name ship
tests/golden/module-import-identity/tree.txt+3−3
@@ -1,8 +1,8 @@
1(module
1(module
2 (jibb 1:1 lib /ui/lib)
2 (jibb 1:1 lib /ui/lib)
3− (value 2:1 text-value
3+ (value 2:1 text
4− (group 2:15
4+ (group 2:9
5− (call 2:16 (wing 2:16 identity.lib) (str 2:29 "hi"))))
5+ (call 2:10 (wing 2:10 identity.lib) (str 2:23 "hi"))))
6 (value 3:1 ship
6 (value 3:1 ship
7 (group 3:9
7 (group 3:9
8 (call 3:10 (wing 3:10 identity.lib) (lit 3:23 ~zod)))))
8 (call 3:10 (wing 3:10 identity.lib) (lit 3:23 ~zod)))))
tests/golden/module-import-identity/types.txt+1−1
@@ -1,3 +1,3 @@
1partial inference; module not checked
1partial inference; module not checked
2−++ text-value: @t
2+++ text: @t
3++ ship: @p
3++ ship: @p
tests/golden/module-import-store-derived-clash/about.txtdeleted−4
@@ -1,4 +0,0 @@
1−source: Grammar, Modules: "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."
2−tests: An imported store whose own `++ state` clashes with its derived `state` request is rejected with a definite error at both sites, not as unsupported inference.
3−expect: parses
4−expect-types: a partial inference report
tests/golden/module-import-store-derived-clash/module-trees.txtdeleted−40
@@ -1,40 +0,0 @@
1−/ui/stores/cart.jibb
2−(module
3− (mold 1:1 state
4− (cell 1:10
5− (face 1:11 items
6− (apply 1:17 list (aura 1:23 @t)))
7− (face 1:27 open (flag 1:32))))
8− (mold 2:1 poke
9− (union 3:3
10− (cell 3:3
11− (const 3:4 %add)
12− (face 3:9 item (aura 3:14 @t)))
13− (const 4:3 %toggle)))
14− (value 6:1 main
15− (group 6:9
16− (call 6:10 (wing 6:10 store) (wing 6:16 init) (wing 6:21 update))))
17− (value 7:1 init
18− (cast 7:9
19− (ref 7:12 state)
20− (tuple 7:18 (lit 7:19 ~) (lit 7:21 %.n))))
21− (value 8:1 update
22− (gate 8:11
23− (cell 8:14
24− (face 8:15 a (ref 8:17 poke))
25− (face 8:22 s (ref 8:24 state)))
26− (body 9:3
27− (branch 9:3
28− (wing 9:6 a)
29− (arm 10:5
30− (cell 10:5 (lit 10:6 %add) (bind 10:11 item))
31− (change 10:18 s
32− (edit 10:20 items
33− (tuple 10:26 (wing 10:27 item) (wing 10:32 items.s)))))
34− (arm 11:5
35− (lit 11:5 %toggle)
36− (change 11:18 s
37− (edit 11:20 open
38− (group 11:25
39− (call 11:26 (wing 11:26 not) (wing 11:30 open.s))))))))))
40− (value 12:1 state (lit 12:10 5)))
tests/golden/module-import-store-derived-clash/modules.txtdeleted−1
@@ -1 +0,0 @@
1−/ui/stores/cart.jibb
tests/golden/module-import-store-derived-clash/modules/ui/stores/cart.jibbdeleted−12
@@ -1,12 +0,0 @@
1−+$ state [items=(list @t) open=?]
2−+$ poke
3− [%add item=@t]
4− %toggle
5−
6−++ main (store init update)
7−++ init ^- state [~ %.n]
8−++ update |= [a=poke s=state]
9− ?- a
10− [%add item] s(items=[item items.s])
11− %toggle s(open=(not open.s))
12−++ state 5
tests/golden/module-import-store-derived-clash/source.jibbdeleted−2
@@ -1,2 +0,0 @@
1−/= cart /ui/stores/cart
2−++ cart-main main.cart
tests/golden/module-import-store-derived-clash/tokens.txtdeleted−13
@@ -1,13 +0,0 @@
1−1:1 glyph /=
2−1:4 name cart
3−1:9 glyph /
4−1:10 tight knot ui
5−1:12 tight glyph /
6−1:13 tight knot stores
7−1:19 tight glyph /
8−1:20 tight knot cart
9−2:1 NEWLINE
10−2:1 glyph ++
11−2:4 name cart-main
12−2:14 wing main.cart
13−2:23 NEWLINE
tests/golden/module-import-store-derived-clash/tree.txtdeleted−3
@@ -1,3 +0,0 @@
1−(module
2− (jibb 1:1 cart /ui/stores/cart)
3− (value 2:1 cart-main (wing 2:14 main.cart)))
tests/golden/module-import-store-derived-clash/types.txtdeleted−8
@@ -1,8 +0,0 @@
1−partial inference; module not checked
2−store derived name `state` clashes with a definition
3−/ui/stores/cart.jibb:1:1: `state` is derived from this mold
4−+$ state [items=(list @t) open=?]
5−^
6−/ui/stores/cart.jibb:12:1: clashing definition
7−++ state 5
8−^
tests/golden/module-import-store-face-clash/about.txtdeleted−4
@@ -1,4 +0,0 @@
1−source: Grammar, Modules: "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."
2−tests: An imported store whose `/-` face clashes with its derived `poke` helper is rejected with a definite error at the mold and the import, not as unsupported inference, although the face also clashes with the `poke` mold.
3−expect: parses
4−expect-types: a partial inference report
tests/golden/module-import-store-face-clash/module-trees.txtdeleted−40
@@ -1,40 +0,0 @@
1−/ui/stores/cart.jibb
2−(module
3− (sur 1:1 poke)
4− (mold 2:1 state
5− (cell 2:10
6− (face 2:11 items
7− (apply 2:17 list (aura 2:23 @t)))
8− (face 2:27 open (flag 2:32))))
9− (mold 3:1 poke
10− (union 4:3
11− (cell 4:3
12− (const 4:4 %add)
13− (face 4:9 item (aura 4:14 @t)))
14− (const 5:3 %toggle)))
15− (value 7:1 main
16− (group 7:9
17− (call 7:10 (wing 7:10 store) (wing 7:16 init) (wing 7:21 update))))
18− (value 8:1 init
19− (cast 8:9
20− (ref 8:12 state)
21− (tuple 8:18 (lit 8:19 ~) (lit 8:21 %.n))))
22− (value 9:1 update
23− (gate 9:11
24− (cell 9:14
25− (face 9:15 a (ref 9:17 poke))
26− (face 9:22 s (ref 9:24 state)))
27− (body 10:3
28− (branch 10:3
29− (wing 10:6 a)
30− (arm 11:5
31− (cell 11:5 (lit 11:6 %add) (bind 11:11 item))
32− (change 11:18 s
33− (edit 11:20 items
34− (tuple 11:26 (wing 11:27 item) (wing 11:32 items.s)))))
35− (arm 12:5
36− (lit 12:5 %toggle)
37− (change 12:18 s
38− (edit 12:20 open
39− (group 12:25
40− (call 12:26 (wing 12:26 not) (wing 12:30 open.s)))))))))))
tests/golden/module-import-store-face-clash/modules.txtdeleted−1
@@ -1 +0,0 @@
1−/ui/stores/cart.jibb
tests/golden/module-import-store-face-clash/modules/ui/stores/cart.jibbdeleted−12
@@ -1,12 +0,0 @@
1−/- poke
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/golden/module-import-store-face-clash/source.jibbdeleted−2
@@ -1,2 +0,0 @@
1−/= cart /ui/stores/cart
2−++ cart-main main.cart
tests/golden/module-import-store-face-clash/tokens.txtdeleted−13
@@ -1,13 +0,0 @@
1−1:1 glyph /=
2−1:4 name cart
3−1:9 glyph /
4−1:10 tight knot ui
5−1:12 tight glyph /
6−1:13 tight knot stores
7−1:19 tight glyph /
8−1:20 tight knot cart
9−2:1 NEWLINE
10−2:1 glyph ++
11−2:4 name cart-main
12−2:14 wing main.cart
13−2:23 NEWLINE
tests/golden/module-import-store-face-clash/tree.txtdeleted−3
@@ -1,3 +0,0 @@
1−(module
2− (jibb 1:1 cart /ui/stores/cart)
3− (value 2:1 cart-main (wing 2:14 main.cart)))
tests/golden/module-import-store-face-clash/types.txtdeleted−8
@@ -1,8 +0,0 @@
1−partial inference; module not checked
2−store derived name `poke` clashes with an import face
3−/ui/stores/cart.jibb:3:1: `poke` is derived from this mold
4−+$ poke
5−^
6−/ui/stores/cart.jibb:1:1: clashing import face
7−/- poke
8−^
tests/golden/module-import-sur-scope/types.txt+1−1
@@ -1,2 +1,2 @@
1partial inference; module not checked
1partial inference; module not checked
2−module definitions need unsupported inference: /ui/lib/jibb: ++ identity
2+module definitions need unsupported inference: /ui/lib/jibb
tests/golden/module-import-transitive/source.jibb+1−1
@@ -1,2 +1,2 @@
1/= a /ui/a
1/= a /ui/a
2−++ text-value (identity.a "hi")
2+++ text (identity.a "hi")
tests/golden/module-import-transitive/tokens.txt+6−6
@@ -6,9 +6,9 @@
61:11 tight knot a
61:11 tight knot a
72:1 NEWLINE
72:1 NEWLINE
82:1 glyph ++
82:1 glyph ++
9−2:4 name text-value
9+2:4 name text
10−2:15 glyph (
10+2:9 glyph (
11−2:16 tight wing identity.a
11+2:10 tight wing identity.a
12−2:27 str "hi"
12+2:21 str "hi"
13−2:31 tight glyph )
13+2:25 tight glyph )
14−2:32 NEWLINE
14+2:26 NEWLINE
tests/golden/module-import-transitive/tree.txt+3−3
@@ -1,5 +1,5 @@
1(module
1(module
2 (jibb 1:1 a /ui/a)
2 (jibb 1:1 a /ui/a)
3− (value 2:1 text-value
3+ (value 2:1 text
4− (group 2:15
4+ (group 2:9
5− (call 2:16 (wing 2:16 identity.a) (str 2:27 "hi")))))
5+ (call 2:10 (wing 2:10 identity.a) (str 2:21 "hi")))))
tests/golden/module-import-transitive/types.txt+1−1
@@ -1,2 +1,2 @@
1partial inference; module not checked
1partial inference; module not checked
2−++ text-value: @t
2+++ text: @t
tests/golden/module-import-unused-invalid/source.jibb+1−1
@@ -1,2 +1,2 @@
1/= good /ui/good
1/= good /ui/good
2−++ text-value (identity.good "hi")
2+++ text (identity.good "hi")
tests/golden/module-import-unused-invalid/tokens.txt+6−6
@@ -6,9 +6,9 @@
61:14 tight knot good
61:14 tight knot good
72:1 NEWLINE
72:1 NEWLINE
82:1 glyph ++
82:1 glyph ++
9−2:4 name text-value
9+2:4 name text
10−2:15 glyph (
10+2:9 glyph (
11−2:16 tight wing identity.good
11+2:10 tight wing identity.good
12−2:30 str "hi"
12+2:24 str "hi"
13−2:34 tight glyph )
13+2:28 tight glyph )
14−2:35 NEWLINE
14+2:29 NEWLINE
tests/golden/module-import-unused-invalid/tree.txt+3−3
@@ -1,5 +1,5 @@
1(module
1(module
2 (jibb 1:1 good /ui/good)
2 (jibb 1:1 good /ui/good)
3− (value 2:1 text-value
3+ (value 2:1 text
4− (group 2:15
4+ (group 2:9
5− (call 2:16 (wing 2:16 identity.good) (str 2:30 "hi")))))
5+ (call 2:10 (wing 2:10 identity.good) (str 2:24 "hi")))))
tests/golden/module-import-unused-invalid/types.txt+1−1
@@ -1,2 +1,2 @@
1partial inference; module not checked
1partial inference; module not checked
2−++ text-value: @t
2+++ text: @t
tests/golden/module-missing-value-cycle/about.txtdeleted−4
@@ -1,4 +0,0 @@
1−source: Grammar, Runes: "Gates may call themselves and their siblings; other values can't depend on themselves, even through a gate"; Modules: "Names may refer to each other in any order."
2−tests: Every missing value of the imported library waits on another: `user` calls into the failing `left`/`right` cycle without being on it. The generic error follows those waits from `user` until a value repeats and names `++ left`, a cycle member, not `++ user`. It claims no error in the named value.
3−expect: parses
4−expect-types: a partial inference report
tests/golden/module-missing-value-cycle/module-trees.txtdeleted−21
@@ -1,21 +0,0 @@
1−/ui/lib.jibb
2−(module
3− (value 1:1 user
4− (gate 1:9
5− (face 1:12 x (aura 1:14 @t))
6− (group 1:17
7− (call 1:18 (wing 1:18 left) (wing 1:23 x)))))
8− (value 2:1 left
9− (gate 2:9
10− (face 2:12 x (aura 2:14 @t))
11− (group 2:17
12− (call 2:18 (wing 2:18 right) (wing 2:24 x)))))
13− (value 3:1 right
14− (gate 3:10
15− (face 3:13 y (aura 3:15 @p))
16− (group 3:18
17− (call 3:19 (wing 3:19 left) (wing 3:24 y)))))
18− (value 4:1 safe
19− (gate 4:9
20− (face 4:12 x (aura 4:14 @t))
21− (wing 4:17 x))))
tests/golden/module-missing-value-cycle/modules.txtdeleted−1
@@ -1 +0,0 @@
1−/ui/lib.jibb
tests/golden/module-missing-value-cycle/modules/ui/lib.jibbdeleted−4
@@ -1,4 +0,0 @@
1−++ user |= x=@t (left x)
2−++ left |= x=@t (right x)
3−++ right |= y=@p (left y)
4−++ safe |= x=@t x
tests/golden/module-missing-value-cycle/source.jibbdeleted−2
@@ -1,2 +0,0 @@
1−/= lib /ui/lib
2−++ use (safe.lib "hello")
tests/golden/module-missing-value-cycle/tokens.txtdeleted−14
@@ -1,14 +0,0 @@
1−1:1 glyph /=
2−1:4 name lib
3−1:8 glyph /
4−1:9 tight knot ui
5−1:11 tight glyph /
6−1:12 tight knot lib
7−2:1 NEWLINE
8−2:1 glyph ++
9−2:4 name use
10−2:8 glyph (
11−2:9 tight wing safe.lib
12−2:18 str "hello"
13−2:25 tight glyph )
14−2:26 NEWLINE
tests/golden/module-missing-value-cycle/tree.txtdeleted−5
@@ -1,5 +0,0 @@
1−(module
2− (jibb 1:1 lib /ui/lib)
3− (value 2:1 use
4− (group 2:8
5− (call 2:9 (wing 2:9 safe.lib) (str 2:18 "hello")))))
tests/golden/module-missing-value-cycle/types.txtdeleted−2
@@ -1,2 +0,0 @@
1−partial inference; module not checked
2−module definitions need unsupported inference: /ui/lib/jibb: ++ left
tests/golden/module-missing-value-sample-shadow/about.txtdeleted−4
@@ -1,4 +0,0 @@
1−source: Grammar, Modules: "Names may refer to each other in any order, and no name may shadow one already in scope, imports and the prelude included."
2−tests: In the imported library, `helper`'s sample `user` shadows the top-level `user`, which calls `helper`. The error is that sample, shown at it, not a generic error naming `++ user`, which a walk over dependencies that ignore binders would reach.
3−expect: parses
4−expect-types: a partial inference report
tests/golden/module-missing-value-sample-shadow/module-trees.txtdeleted−15
@@ -1,15 +0,0 @@
1−/ui/lib.jibb
2−(module
3− (value 1:1 user
4− (gate 1:9
5− (face 1:12 x (aura 1:14 @t))
6− (group 1:17
7− (call 1:18 (wing 1:18 helper) (wing 1:25 x)))))
8− (value 2:1 helper
9− (gate 2:11
10− (face 2:14 user (aura 2:19 @t))
11− (wing 2:22 user)))
12− (value 3:1 safe
13− (gate 3:9
14− (face 3:12 x (aura 3:14 @t))
15− (wing 3:17 x))))
tests/golden/module-missing-value-sample-shadow/modules.txtdeleted−1
@@ -1 +0,0 @@
1−/ui/lib.jibb
tests/golden/module-missing-value-sample-shadow/modules/ui/lib.jibbdeleted−3
@@ -1,3 +0,0 @@
1−++ user |= x=@t (helper x)
2−++ helper |= user=@t user
3−++ safe |= x=@t x
tests/golden/module-missing-value-sample-shadow/source.jibbdeleted−2
@@ -1,2 +0,0 @@
1−/= lib /ui/lib
2−++ use (safe.lib "hello")
tests/golden/module-missing-value-sample-shadow/tokens.txtdeleted−14
@@ -1,14 +0,0 @@
1−1:1 glyph /=
2−1:4 name lib
3−1:8 glyph /
4−1:9 tight knot ui
5−1:11 tight glyph /
6−1:12 tight knot lib
7−2:1 NEWLINE
8−2:1 glyph ++
9−2:4 name use
10−2:8 glyph (
11−2:9 tight wing safe.lib
12−2:18 str "hello"
13−2:25 tight glyph )
14−2:26 NEWLINE
tests/golden/module-missing-value-sample-shadow/tree.txtdeleted−5
@@ -1,5 +0,0 @@
1−(module
2− (jibb 1:1 lib /ui/lib)
3− (value 2:1 use
4− (group 2:8
5− (call 2:9 (wing 2:9 safe.lib) (str 2:18 "hello")))))
tests/golden/module-missing-value-sample-shadow/types.txtdeleted−4
@@ -1,4 +0,0 @@
1−partial inference; module not checked
2−/ui/lib.jibb:2:14: sample `user` shadows a name already in scope
3−++ helper |= user=@t user
4− ^
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`, `clef`, `hunt` and `mate`, and 2b includes `join`, `murn`, `rear`, `snip`, `skim`, `skip`, `levy`, `lien`, `roll` and `reel`. Folds take an explicit start.
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, several 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 `eq` with its generalized gate-free constraint and the source-backed `ask` re-export and `pure` gate.
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.
3expect: parses
3expect: parses
4expect-types: a partial inference report, not a checked module; unit and list gate typing is not complete
4expect-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+2−30
@@ -1,5 +1,5 @@
1/= internal /lib/jibb/internal
1/= internal /lib/jibb/internal
2−+$ raw-poke raw-poke.internal
2++$ poke poke.internal
3+$ qath qath.internal
3+$ qath qath.internal
4
4
5:: Initial prelude functions. The rest of the inventory is still to come.
5:: Initial prelude functions. The rest of the inventory is still to come.
@@ -19,8 +19,6 @@
19 %.y %.n
19 %.y %.n
20 %.n %.y
20 %.n %.y
21
21
22−++ eq |= args=[A A] (eq-data.internal args)
23−
24+$ list |$ [A]
22+$ list |$ [A]
25 ~
23 ~
26 [i=A t=(list A)]
24 [i=A t=(list A)]
@@ -200,32 +198,6 @@
200 ~ first
198 ~ first
201 [~ b] `(combine a b)
199 [~ b] `(combine a b)
202
200
203−++ hunt |= args=[$-([A A] ?) (unit A) (unit A)]
204− ?- args
205− [choose first second] ^- (unit A)
206− ?- first
207− ~ second
208− [~ a]
209− ?- second
210− ~ first
211− [~ b]
212− ?- (choose a b)
213− %.y first
214− %.n second
215−
216−++ mate |= args=[(unit A) (unit A)]
217− ?- args
218− [first second] ^- (unit A)
219− ?- second
220− ~ first
221− [~ b]
222− ?- first
223− ~ second
224− [~ a]
225− ?- (eq a b)
226− %.y first
227− %.n !!
228−
229++ clef |= args=[(unit A) (unit B) $-([A B] (unit C))]
201++ clef |= args=[(unit A) (unit B) $-([A B] (unit C))]
230 ?- args
202 ?- args
231 [first second combine] ^- (unit C)
203 [first second combine] ^- (unit C)
@@ -353,7 +325,7 @@
353 [f b] |= a=A (f a b)
325 [f b] |= a=A (f a b)
354
326
355+$ cmd |$ [M]
327+$ cmd |$ [M]
356− [%poke p=raw-poke reply=$-((unit @t) M)]
328+ [%poke p=poke reply=$-((unit @t) M)]
357 [%go url=@t]
329 [%go url=@t]
358 [%wait gap=@dr msg=M]
330 [%wait gap=@dr msg=M]
359 [%now reply=$-(@da M)]
331 [%now reply=$-(@da M)]
tests/golden/prelude-unit-list-transforms/tokens.txt+2045−2211
@@ -8,8 +8,8 @@
81:23 tight knot internal
81:23 tight knot internal
92:1 NEWLINE
92:1 NEWLINE
102:1 glyph +$
102:1 glyph +$
11−2:4 name raw-poke
11+2:4 name poke
12−2:13 wing raw-poke.internal
12+2:9 wing poke.internal
133:1 NEWLINE
133:1 NEWLINE
143:1 glyph +$
143:1 glyph +$
153:4 name qath
153:4 name qath
@@ -83,2318 +83,2152 @@
8322:1 DEDENT
8322:1 DEDENT
8422:1 DEDENT
8422:1 DEDENT
8522:1 NEWLINE
8522:1 NEWLINE
86−22:1 glyph ++
86+22:1 glyph +$
87−22:4 name eq
88−22:7 glyph |=
89−22:10 name args
90−22:14 tight glyph =
91−22:15 tight glyph [
92−22:16 tight tvar A
93−22:18 tvar A
94−22:19 tight glyph ]
95−22:21 glyph (
96−22:22 tight wing eq-data.internal
97−22:39 name args
98−22:43 tight glyph )
99−24:1 NEWLINE
100−24:1 glyph +$
101−24:4 name list
87+22:4 name list
102−24:9 glyph |$
88+22:9 glyph |$
103−24:12 glyph [
89+22:12 glyph [
104−24:13 tight tvar A
90+22:13 tight tvar A
105−24:14 tight glyph ]
91+22:14 tight glyph ]
106−25:3 INDENT
92+23:3 INDENT
107−25:3 lit ~
93+23:3 lit ~
108−26:3 NEWLINE
94+24:3 NEWLINE
109−26:3 glyph [
95+24:3 glyph [
110−26:4 tight name i
96+24:4 tight name i
111−26:5 tight glyph =
97+24:5 tight glyph =
112−26:6 tight tvar A
98+24:6 tight tvar A
113−26:8 name t
99+24:8 name t
114−26:9 tight glyph =
100+24:9 tight glyph =
115−26:10 tight glyph (
101+24:10 tight glyph (
116−26:11 tight name list
102+24:11 tight name list
117−26:16 tvar A
103+24:16 tvar A
118−26:17 tight glyph )
104+24:17 tight glyph )
119−26:18 tight glyph ]
105+24:18 tight glyph ]
120−28:1 DEDENT
106+26:1 DEDENT
121−28:1 NEWLINE
107+26:1 NEWLINE
122−28:1 glyph +$
108+26:1 glyph +$
123−28:4 name unit
109+26:4 name unit
124−28:9 glyph |$
110+26:9 glyph |$
125−28:12 glyph [
111+26:12 glyph [
126−28:13 tight tvar A
112+26:13 tight tvar A
127−28:14 tight glyph ]
113+26:14 tight glyph ]
128−29:3 INDENT
114+27:3 INDENT
129−29:3 lit ~
115+27:3 lit ~
130−30:3 NEWLINE
116+28:3 NEWLINE
131−30:3 glyph [
117+28:3 glyph [
132−30:4 tight lit ~
118+28:4 tight lit ~
133−30:6 name u
119+28:6 name u
134−30:7 tight glyph =
120+28:7 tight glyph =
135−30:8 tight tvar A
121+28:8 tight tvar A
136−30:9 tight glyph ]
122+28:9 tight glyph ]
137−32:1 DEDENT
123+30:1 DEDENT
138−32:1 NEWLINE
124+30:1 NEWLINE
139−32:1 glyph ++
125+30:1 glyph ++
140−32:4 name fall
126+30:4 name fall
141−32:9 glyph |=
127+30:9 glyph |=
142−32:12 name args
128+30:12 name args
143−32:16 tight glyph =
129+30:16 tight glyph =
144−32:17 tight glyph [
130+30:17 tight glyph [
145−32:18 tight glyph (
131+30:18 tight glyph (
146−32:19 tight name unit
132+30:19 tight name unit
147−32:24 tvar A
133+30:24 tvar A
148−32:25 tight glyph )
134+30:25 tight glyph )
149−32:27 tvar A
135+30:27 tvar A
150−32:28 tight glyph ]
136+30:28 tight glyph ]
151−33:3 INDENT
137+31:3 INDENT
152−33:3 glyph ?-
138+31:3 glyph ?-
153−33:6 name args
139+31:6 name args
154−34:5 INDENT
140+32:5 INDENT
155−34:5 glyph [
141+32:5 glyph [
156−34:6 tight name maybe
142+32:6 tight name maybe
157−34:12 name fallback
143+32:12 name fallback
158−34:20 tight glyph ]
144+32:20 tight glyph ]
159−35:7 INDENT
145+33:7 INDENT
160−35:7 glyph ?-
146+33:7 glyph ?-
161−35:10 name maybe
147+33:10 name maybe
162−36:9 INDENT
148+34:9 INDENT
163−36:9 lit ~
149+34:9 lit ~
164−36:11 name fallback
150+34:11 name fallback
165−37:9 NEWLINE
151+35:9 NEWLINE
166−37:9 glyph [
152+35:9 glyph [
167−37:10 tight lit ~
153+35:10 tight lit ~
168−37:12 name value
154+35:12 name value
169−37:17 tight glyph ]
155+35:17 tight glyph ]
170−37:19 name value
156+35:19 name value
171−39:1 DEDENT
157+37:1 DEDENT
172−39:1 DEDENT
158+37:1 DEDENT
173−39:1 DEDENT
159+37:1 DEDENT
174−39:1 DEDENT
160+37:1 DEDENT
175−39:1 NEWLINE
161+37:1 NEWLINE
176−39:1 glyph ++
162+37:1 glyph ++
177−39:4 name need
163+37:4 name need
178−39:9 glyph |=
164+37:9 glyph |=
179−39:12 name maybe
165+37:12 name maybe
180−39:17 tight glyph =
166+37:17 tight glyph =
181−39:18 tight glyph (
167+37:18 tight glyph (
182−39:19 tight name unit
168+37:19 tight name unit
183−39:24 tvar A
169+37:24 tvar A
184−39:25 tight glyph )
170+37:25 tight glyph )
185−40:3 INDENT
171+38:3 INDENT
186−40:3 glyph ?-
172+38:3 glyph ?-
187−40:6 name maybe
173+38:6 name maybe
188−41:5 INDENT
174+39:5 INDENT
189−41:5 lit ~
175+39:5 lit ~
190−41:7 glyph !!
176+39:7 glyph !!
191−42:5 NEWLINE
177+40:5 NEWLINE
192−42:5 glyph [
178+40:5 glyph [
193−42:6 tight lit ~
179+40:6 tight lit ~
194−42:8 name value
180+40:8 name value
195−42:13 tight glyph ]
181+40:13 tight glyph ]
196−42:15 name value
182+40:15 name value
197−44:1 DEDENT
183+42:1 DEDENT
198−44:1 DEDENT
184+42:1 DEDENT
199−44:1 NEWLINE
185+42:1 NEWLINE
200−44:1 glyph ++
186+42:1 glyph ++
201−44:4 name weld
187+42:4 name weld
202−44:9 glyph |=
188+42:9 glyph |=
203−44:12 name args
189+42:12 name args
204−44:16 tight glyph =
190+42:16 tight glyph =
205−44:17 tight glyph [
191+42:17 tight glyph [
206−44:18 tight glyph (
192+42:18 tight glyph (
207−44:19 tight name list
193+42:19 tight name list
208−44:24 tvar A
194+42:24 tvar A
209−44:25 tight glyph )
195+42:25 tight glyph )
210−44:27 glyph (
196+42:27 glyph (
211−44:28 tight name list
197+42:28 tight name list
212−44:33 tvar A
198+42:33 tvar A
213−44:34 tight glyph )
199+42:34 tight glyph )
214−44:35 tight glyph ]
200+42:35 tight glyph ]
215−45:3 INDENT
201+43:3 INDENT
216−45:3 glyph ?-
202+43:3 glyph ?-
217−45:6 name args
203+43:6 name args
218−46:5 INDENT
204+44:5 INDENT
219−46:5 glyph [
205+44:5 glyph [
220−46:6 tight name xs
206+44:6 tight name xs
221−46:9 name ys
207+44:9 name ys
222−46:11 tight glyph ]
208+44:11 tight glyph ]
223−47:7 INDENT
209+45:7 INDENT
224−47:7 glyph ^-
210+45:7 glyph ^-
225−47:10 glyph (
211+45:10 glyph (
226−47:11 tight name list
212+45:11 tight name list
227−47:16 tvar A
213+45:16 tvar A
228−47:17 tight glyph )
214+45:17 tight glyph )
229−48:9 INDENT
215+46:9 INDENT
230−48:9 glyph ?-
216+46:9 glyph ?-
231−48:12 name xs
217+46:12 name xs
232−49:11 INDENT
218+47:11 INDENT
233−49:11 lit ~
219+47:11 lit ~
234−49:13 name ys
220+47:13 name ys
235−50:11 NEWLINE
221+48:11 NEWLINE
236−50:11 glyph [
222+48:11 glyph [
237−50:12 tight name item
223+48:12 tight name item
238−50:17 name rest
224+48:17 name rest
239−50:21 tight glyph ]
225+48:21 tight glyph ]
240−50:23 glyph [
226+48:23 glyph [
241−50:24 tight name item
227+48:24 tight name item
242−50:29 glyph (
228+48:29 glyph (
243−50:30 tight name weld
229+48:30 tight name weld
244−50:35 name rest
230+48:35 name rest
245−50:40 name ys
231+48:40 name ys
246−50:42 tight glyph )
232+48:42 tight glyph )
247−50:43 tight glyph ]
233+48:43 tight glyph ]
248−52:1 DEDENT
234+50:1 DEDENT
249−52:1 DEDENT
235+50:1 DEDENT
250−52:1 DEDENT
236+50:1 DEDENT
251−52:1 DEDENT
237+50:1 DEDENT
252−52:1 DEDENT
238+50:1 DEDENT
253−52:1 NEWLINE
239+50:1 NEWLINE
254−52:1 glyph ++
240+50:1 glyph ++
255−52:4 name turn
241+50:4 name turn
256−52:9 glyph |=
242+50:9 glyph |=
257−52:12 name args
243+50:12 name args
258−52:16 tight glyph =
244+50:16 tight glyph =
259−52:17 tight glyph [
245+50:17 tight glyph [
260−52:18 tight glyph (
246+50:18 tight glyph (
261−52:19 tight name list
247+50:19 tight name list
262−52:24 tvar A
248+50:24 tvar A
263−52:25 tight glyph )
249+50:25 tight glyph )
264−52:27 glyph $-(
250+50:27 glyph $-(
265−52:30 tight tvar A
251+50:30 tight tvar A
266−52:32 tvar B
252+50:32 tvar B
267−52:33 tight glyph )
253+50:33 tight glyph )
268−52:34 tight glyph ]
254+50:34 tight glyph ]
269−53:3 INDENT
255+51:3 INDENT
270−53:3 glyph ?-
256+51:3 glyph ?-
271−53:6 name args
257+51:6 name args
272−54:5 INDENT
258+52:5 INDENT
273−54:5 glyph [
259+52:5 glyph [
274−54:6 tight name xs
260+52:6 tight name xs
275−54:9 name f
261+52:9 name f
276−54:10 tight glyph ]
262+52:10 tight glyph ]
277−55:7 INDENT
263+53:7 INDENT
278−55:7 glyph ^-
264+53:7 glyph ^-
279−55:10 glyph (
265+53:10 glyph (
280−55:11 tight name list
266+53:11 tight name list
281−55:16 tvar B
267+53:16 tvar B
282−55:17 tight glyph )
268+53:17 tight glyph )
283−56:9 INDENT
269+54:9 INDENT
284−56:9 glyph ?-
270+54:9 glyph ?-
285−56:12 name xs
271+54:12 name xs
286−57:11 INDENT
272+55:11 INDENT
287−57:11 lit ~
273+55:11 lit ~
288−57:13 lit ~
274+55:13 lit ~
289−58:11 NEWLINE
275+56:11 NEWLINE
290−58:11 glyph [
276+56:11 glyph [
291−58:12 tight name item
277+56:12 tight name item
292−58:17 name rest
278+56:17 name rest
293−58:21 tight glyph ]
279+56:21 tight glyph ]
294−58:23 glyph [
280+56:23 glyph [
295−58:24 tight glyph (
281+56:24 tight glyph (
296−58:25 tight name f
282+56:25 tight name f
297−58:27 name item
283+56:27 name item
298−58:31 tight glyph )
284+56:31 tight glyph )
299−58:33 glyph (
285+56:33 glyph (
300−58:34 tight name turn
286+56:34 tight name turn
301−58:39 name rest
287+56:39 name rest
302−58:44 name f
288+56:44 name f
303−58:45 tight glyph )
289+56:45 tight glyph )
304−58:46 tight glyph ]
290+56:46 tight glyph ]
305−60:1 DEDENT
291+58:1 DEDENT
306−60:1 DEDENT
292+58:1 DEDENT
307−60:1 DEDENT
293+58:1 DEDENT
308−60:1 DEDENT
294+58:1 DEDENT
309−60:1 DEDENT
295+58:1 DEDENT
296+58:1 NEWLINE
297+58:1 glyph +$
298+58:4 name dime
299+58:9 glyph [
300+58:10 tight name p
301+58:11 tight glyph =
302+58:12 tight aura @ta
303+58:16 name q
304+58:17 tight glyph =
305+58:18 tight aura @
306+58:19 tight glyph ]
31060:1 NEWLINE
30760:1 NEWLINE
31160:1 glyph +$
30860:1 glyph +$
312−60:4 name dime
309+60:4 name hair
31360:9 glyph [
31060:9 glyph [
31460:10 tight name p
31160:10 tight name p
31560:11 tight glyph =
31260:11 tight glyph =
316−60:12 tight aura @ta
313+60:12 tight aura @ud
31760:16 name q
31460:16 name q
31860:17 tight glyph =
31560:17 tight glyph =
319−60:18 tight aura @
316+60:18 tight aura @ud
320−60:19 tight glyph ]
317+60:21 tight glyph ]
32162:1 NEWLINE
31862:1 NEWLINE
32262:1 glyph +$
31962:1 glyph +$
323−62:4 name hair
320+62:4 name pint
32462:9 glyph [
32162:9 glyph [
32562:10 tight name p
32262:10 tight name p
32662:11 tight glyph =
32362:11 tight glyph =
327−62:12 tight aura @ud
324+62:12 tight glyph [
328−62:16 name q
325+62:13 tight name p
329−62:17 tight glyph =
326+62:14 tight glyph =
327+62:15 tight aura @
328+62:17 name q
330−62:18 tight aura @ud
329+62:18 tight glyph =
330+62:19 tight aura @
331+62:20 tight glyph ]
332+62:22 name q
333+62:23 tight glyph =
334+62:24 tight glyph [
335+62:25 tight name p
336+62:26 tight glyph =
337+62:27 tight aura @
338+62:29 name q
339+62:30 tight glyph =
340+62:31 tight aura @
341+62:32 tight glyph ]
331−62:21 tight glyph ]
342+62:33 tight glyph ]
33264:1 NEWLINE
34364:1 NEWLINE
33364:1 glyph +$
34464:1 glyph +$
334−64:4 name pint
345+64:4 name coin
346+65:3 INDENT
347+65:3 glyph [
348+65:4 tight lit %$
349+65:7 name p
350+65:8 tight glyph =
351+65:9 tight name dime
335−64:9 glyph [
352+65:13 tight glyph ]
353+66:3 NEWLINE
354+66:3 glyph [
355+66:4 tight lit %blob
336−64:10 tight name p
356+66:10 name p
337−64:11 tight glyph =
357+66:11 tight glyph =
338−64:12 tight glyph [
358+66:12 tight glyph *
339−64:13 tight name p
359+66:13 tight glyph ]
340−64:14 tight glyph =
360+67:3 NEWLINE
341−64:15 tight aura @
342−64:17 name q
343−64:18 tight glyph =
344−64:19 tight aura @
345−64:20 tight glyph ]
346−64:22 name q
347−64:23 tight glyph =
348−64:24 tight glyph [
349−64:25 tight name p
350−64:26 tight glyph =
351−64:27 tight aura @
352−64:29 name q
353−64:30 tight glyph =
354−64:31 tight aura @
355−64:32 tight glyph ]
356−64:33 tight glyph ]
357−66:1 NEWLINE
358−66:1 glyph +$
359−66:4 name coin
360−67:3 INDENT
36167:3 glyph [
36167:3 glyph [
362−67:4 tight lit %$
362+67:4 tight lit %many
363−67:7 name p
364−67:8 tight glyph =
365−67:9 tight name dime
366−67:13 tight glyph ]
367−68:3 NEWLINE
368−68:3 glyph [
369−68:4 tight lit %blob
370−68:10 name p
371−68:11 tight glyph =
372−68:12 tight glyph *
373−68:13 tight glyph ]
374−69:3 NEWLINE
375−69:3 glyph [
376−69:4 tight lit %many
377−69:10 name p
363+67:10 name p
378−69:11 tight glyph =
364+67:11 tight glyph =
379−69:12 tight glyph (
365+67:12 tight glyph (
380−69:13 tight name list
366+67:13 tight name list
381−69:18 name coin
367+67:18 name coin
382−69:22 tight glyph )
368+67:22 tight glyph )
383−69:23 tight glyph ]
369+67:23 tight glyph ]
384−71:1 DEDENT
370+69:1 DEDENT
371+69:1 NEWLINE
372+69:1 glyph +$
373+69:4 name pair
374+69:9 glyph |$
375+69:12 glyph [
376+69:13 tight tvar A
377+69:15 tvar B
378+69:16 tight glyph ]
379+69:18 glyph [
380+69:19 tight name p
381+69:20 tight glyph =
382+69:21 tight tvar A
383+69:23 name q
384+69:24 tight glyph =
385+69:25 tight tvar B
386+69:26 tight glyph ]
38571:1 NEWLINE
38771:1 NEWLINE
38671:1 glyph +$
38871:1 glyph +$
387−71:4 name pair
389+71:4 name trel
38871:9 glyph |$
39071:9 glyph |$
38971:12 glyph [
39171:12 glyph [
39071:13 tight tvar A
39271:13 tight tvar A
39171:15 tvar B
39371:15 tvar B
392−71:16 tight glyph ]
394+71:17 tvar C
395+71:18 tight glyph ]
393−71:18 glyph [
396+71:20 glyph [
394−71:19 tight name p
395−71:20 tight glyph =
396−71:21 tight tvar A
397+71:21 tight name p
397−71:23 name q
398+71:22 tight glyph =
398−71:24 tight glyph =
399+71:23 tight tvar A
400+71:25 name q
401+71:26 tight glyph =
399−71:25 tight tvar B
402+71:27 tight tvar B
403+71:29 name r
404+71:30 tight glyph =
405+71:31 tight tvar C
400−71:26 tight glyph ]
406+71:32 tight glyph ]
40173:1 NEWLINE
40773:1 NEWLINE
40273:1 glyph +$
40873:1 glyph +$
403−73:4 name trel
409+73:4 name qual
40473:9 glyph |$
41073:9 glyph |$
40573:12 glyph [
41173:12 glyph [
40673:13 tight tvar A
41273:13 tight tvar A
40773:15 tvar B
41373:15 tvar B
40873:17 tvar C
41473:17 tvar C
409−73:18 tight glyph ]
415+73:19 tvar D
416+73:20 tight glyph ]
410−73:20 glyph [
417+73:22 glyph [
411−73:21 tight name p
418+73:23 tight name p
412−73:22 tight glyph =
419+73:24 tight glyph =
413−73:23 tight tvar A
420+73:25 tight tvar A
414−73:25 name q
421+73:27 name q
415−73:26 tight glyph =
422+73:28 tight glyph =
416−73:27 tight tvar B
423+73:29 tight tvar B
417−73:29 name r
424+73:31 name r
418−73:30 tight glyph =
419−73:31 tight tvar C
420−73:32 tight glyph ]
425+73:32 tight glyph =
426+73:33 tight tvar C
427+73:35 name s
428+73:36 tight glyph =
429+73:37 tight tvar D
430+73:38 tight glyph ]
42175:1 NEWLINE
43175:1 NEWLINE
42275:1 glyph +$
43275:1 glyph +$
423−75:4 name qual
433+75:4 name cord
424−75:9 glyph |$
434+75:9 aura @t
425−75:12 glyph [
426−75:13 tight tvar A
427−75:15 tvar B
428−75:17 tvar C
429−75:19 tvar D
430−75:20 tight glyph ]
431−75:22 glyph [
432−75:23 tight name p
433−75:24 tight glyph =
434−75:25 tight tvar A
435−75:27 name q
436−75:28 tight glyph =
437−75:29 tight tvar B
438−75:31 name r
439−75:32 tight glyph =
440−75:33 tight tvar C
441−75:35 name s
442−75:36 tight glyph =
443−75:37 tight tvar D
444−75:38 tight glyph ]
44577:1 NEWLINE
43577:1 NEWLINE
44677:1 glyph +$
43677:1 glyph +$
447−77:4 name cord
437+77:4 name knot
448−77:9 aura @t
438+77:9 aura @ta
44979:1 NEWLINE
43979:1 NEWLINE
45079:1 glyph +$
44079:1 glyph +$
451−79:4 name knot
441+79:4 name tape
442+79:9 glyph (
443+79:10 tight name list
452−79:9 aura @ta
444+79:15 aura @tD
445+79:18 tight glyph )
45381:1 NEWLINE
44681:1 NEWLINE
45481:1 glyph +$
44781:1 glyph +$
455−81:4 name tape
448+81:4 name path
45681:9 glyph (
44981:9 glyph (
45781:10 tight name list
45081:10 tight name list
458−81:15 aura @tD
451+81:15 name knot
459−81:18 tight glyph )
452+81:19 tight glyph )
46083:1 NEWLINE
45383:1 NEWLINE
46183:1 glyph +$
45483:1 glyph +$
462−83:4 name path
455+83:4 name tank
463−83:9 glyph (
464−83:10 tight name list
465−83:15 name knot
466−83:19 tight glyph )
467−85:1 NEWLINE
468−85:1 glyph +$
469−85:4 name tank
470−86:3 INDENT
456+84:3 INDENT
471−86:3 name cord
457+84:3 name cord
458+85:3 NEWLINE
459+85:3 glyph [
460+85:4 tight lit %leaf
461+85:10 name p
462+85:11 tight glyph =
463+85:12 tight name tape
464+85:16 tight glyph ]
465+86:3 NEWLINE
466+86:3 glyph [
467+86:4 tight lit %palm
468+86:10 name p
469+86:11 tight glyph =
470+86:12 tight glyph (
471+86:13 tight name qual
472+86:18 name tape
473+86:23 name tape
474+86:28 name tape
475+86:33 name tape
476+86:37 tight glyph )
477+86:39 name q
478+86:40 tight glyph =
479+86:41 tight glyph (
480+86:42 tight name list
481+86:47 name tank
482+86:51 tight glyph )
483+86:52 tight glyph ]
47287:3 NEWLINE
48487:3 NEWLINE
47387:3 glyph [
48587:3 glyph [
474−87:4 tight lit %leaf
486+87:4 tight lit %rose
47587:10 name p
48787:10 name p
47687:11 tight glyph =
48887:11 tight glyph =
477−87:12 tight name tape
489+87:12 tight glyph (
478−87:16 tight glyph ]
479−88:3 NEWLINE
480−88:3 glyph [
481−88:4 tight lit %palm
482−88:10 name p
483−88:11 tight glyph =
484−88:12 tight glyph (
485−88:13 tight name qual
490+87:13 tight name trel
486−88:18 name tape
491+87:18 name tape
487−88:23 name tape
492+87:23 name tape
488−88:28 name tape
493+87:28 name tape
489−88:33 name tape
494+87:32 tight glyph )
495+87:34 name q
496+87:35 tight glyph =
497+87:36 tight glyph (
490−88:37 tight glyph )
498+87:37 tight name list
491−88:39 name q
499+87:42 name tank
492−88:40 tight glyph =
500+87:46 tight glyph )
493−88:41 tight glyph (
494−88:42 tight name list
495−88:47 name tank
496−88:51 tight glyph )
501+87:47 tight glyph ]
497−88:52 tight glyph ]
502+89:1 DEDENT
498−89:3 NEWLINE
503+89:1 NEWLINE
499−89:3 glyph [
504+89:1 glyph +$
500−89:4 tight lit %rose
505+89:4 name nail
506+89:9 glyph [
501−89:10 name p
507+89:10 tight name p
50289:11 tight glyph =
50889:11 tight glyph =
503−89:12 tight glyph (
509+89:12 tight name hair
504−89:13 tight name trel
510+89:17 name q
511+89:18 tight glyph =
505−89:18 name tape
512+89:19 tight name tape
506−89:23 name tape
507−89:28 name tape
508−89:32 tight glyph )
509−89:34 name q
510−89:35 tight glyph =
511−89:36 tight glyph (
512−89:37 tight name list
513−89:42 name tank
514−89:46 tight glyph )
515−89:47 tight glyph ]
513+89:23 tight glyph ]
516−91:1 DEDENT
51791:1 NEWLINE
51491:1 NEWLINE
51891:1 glyph +$
51591:1 glyph +$
519−91:4 name nail
516+91:4 name edge
52091:9 glyph [
51791:9 glyph [
52191:10 tight name p
51891:10 tight name p
52291:11 tight glyph =
51991:11 tight glyph =
52391:12 tight name hair
52091:12 tight name hair
52491:17 name q
52191:17 name q
52591:18 tight glyph =
52291:18 tight glyph =
526−91:19 tight name tape
523+91:19 tight glyph (
524+91:20 tight name unit
525+91:25 glyph [
526+91:26 tight name p
527+91:27 tight glyph =
528+91:28 tight glyph *
529+91:30 name q
530+91:31 tight glyph =
531+91:32 tight name nail
532+91:36 tight glyph ]
533+91:37 tight glyph )
527−91:23 tight glyph ]
534+91:38 tight glyph ]
52893:1 NEWLINE
53593:1 NEWLINE
52993:1 glyph +$
53693:1 glyph +$
530−93:4 name edge
537+93:4 name rule
531−93:9 glyph [
538+93:9 glyph $-(
532−93:10 tight name p
533−93:11 tight glyph =
534−93:12 tight name hair
539+93:12 tight name nail
535−93:17 name q
540+93:17 name edge
536−93:18 tight glyph =
537−93:19 tight glyph (
538−93:20 tight name unit
539−93:25 glyph [
540−93:26 tight name p
541−93:27 tight glyph =
542−93:28 tight glyph *
543−93:30 name q
544−93:31 tight glyph =
545−93:32 tight name nail
546−93:36 tight glyph ]
547−93:37 tight glyph )
541+93:21 tight glyph )
548−93:38 tight glyph ]
54995:1 NEWLINE
54295:1 NEWLINE
55095:1 glyph +$
54395:1 glyph +$
551−95:4 name rule
544+95:4 name spot
552−95:9 glyph $-(
545+95:9 glyph [
546+95:10 tight name p
547+95:11 tight glyph =
553−95:12 tight name nail
548+95:12 tight name path
554−95:17 name edge
549+95:17 name q
550+95:18 tight glyph =
551+95:19 tight name pint
555−95:21 tight glyph )
552+95:23 tight glyph ]
55697:1 NEWLINE
55397:1 NEWLINE
55797:1 glyph +$
55497:1 glyph +$
558−97:4 name spot
555+97:4 name toon
559−97:9 glyph [
556+98:3 INDENT
560−97:10 tight name p
557+98:3 glyph [
561−97:11 tight glyph =
558+98:4 tight lit %0
562−97:12 tight name path
559+98:7 name p
563−97:17 name q
560+98:8 tight glyph =
564−97:18 tight glyph =
561+98:9 tight glyph *
565−97:19 tight name pint
562+98:10 tight glyph ]
566−97:23 tight glyph ]
563+99:3 NEWLINE
567−99:1 NEWLINE
564+99:3 glyph [
568−99:1 glyph +$
565+99:4 tight lit %1
569−99:4 name toon
566+99:7 name p
570−100:3 INDENT
567+99:8 tight glyph =
568+99:9 tight glyph *
569+99:10 tight glyph ]
570+100:3 NEWLINE
571100:3 glyph [
571100:3 glyph [
572−100:4 tight lit %0
572+100:4 tight lit %2
573100:7 name p
573100:7 name p
574100:8 tight glyph =
574100:8 tight glyph =
575−100:9 tight glyph *
575+100:9 tight glyph (
576−100:10 tight glyph ]
577−101:3 NEWLINE
578−101:3 glyph [
579−101:4 tight lit %1
580−101:7 name p
581−101:8 tight glyph =
582−101:9 tight glyph *
583−101:10 tight glyph ]
584−102:3 NEWLINE
585−102:3 glyph [
586−102:4 tight lit %2
587−102:7 name p
588−102:8 tight glyph =
589−102:9 tight glyph (
590−102:10 tight name list
576+100:10 tight name list
591−102:15 name tank
577+100:15 name tank
592−102:19 tight glyph )
578+100:19 tight glyph )
593−102:20 tight glyph ]
579+100:20 tight glyph ]
594−104:1 DEDENT
580+102:1 DEDENT
581+102:1 NEWLINE
582+102:1 glyph +$
583+102:4 name like
584+102:9 glyph |$
585+102:12 glyph [
586+102:13 tight tvar A
587+102:14 tight glyph ]
588+102:16 glyph [
589+102:17 tight name p
590+102:18 tight glyph =
591+102:19 tight name hair
592+102:24 name q
593+102:25 tight glyph =
594+102:26 tight glyph (
595+102:27 tight name unit
596+102:32 glyph [
597+102:33 tight name p
598+102:34 tight glyph =
599+102:35 tight tvar A
600+102:37 name q
601+102:38 tight glyph =
602+102:39 tight name nail
603+102:43 tight glyph ]
604+102:44 tight glyph )
605+102:45 tight glyph ]
595104:1 NEWLINE
606104:1 NEWLINE
596−104:1 glyph +$
607+104:1 glyph ++
597104:4 name like
608104:4 name like
598−104:9 glyph |$
609+104:9 glyph |=
599104:12 glyph [
610104:12 glyph [
600−104:13 tight tvar A
611+104:13 tight name f
601−104:14 tight glyph ]
602−104:16 glyph [
603−104:17 tight name p
604−104:18 tight glyph =
605−104:19 tight name hair
606−104:24 name q
607−104:25 tight glyph =
608−104:26 tight glyph (
609−104:27 tight name unit
610−104:32 glyph [
611−104:33 tight name p
612−104:34 tight glyph =
613−104:35 tight tvar A
614−104:37 name q
615−104:38 tight glyph =
612+104:14 tight glyph =
616−104:39 tight name nail
617−104:43 tight glyph ]
618−104:44 tight glyph )
619−104:45 tight glyph ]
620−106:1 NEWLINE
621−106:1 glyph ++
622−106:4 name like
623−106:9 glyph |=
624−106:12 glyph [
625−106:13 tight name f
626−106:14 tight glyph =
627−106:15 tight glyph $-(
613+104:15 tight glyph $-(
628−106:18 tight tvar A
614+104:18 tight tvar A
629−106:20 tvar B
615+104:20 tvar B
630−106:21 tight glyph )
616+104:21 tight glyph )
631−106:23 name result
617+104:23 name result
632−106:29 tight glyph =
618+104:29 tight glyph =
633−106:30 tight glyph (
619+104:30 tight glyph (
634−106:31 tight name like
620+104:31 tight name like
635−106:36 tvar A
621+104:36 tvar A
636−106:37 tight glyph )
622+104:37 tight glyph )
637−106:38 tight glyph ]
623+104:38 tight glyph ]
638−107:3 INDENT
624+105:3 INDENT
639−107:3 glyph ++
625+105:3 glyph ++
640−107:6 name mapped
626+105:6 name mapped
641−108:5 INDENT
627+106:5 INDENT
642−108:5 glyph ^-
628+106:5 glyph ^-
643−108:8 glyph (
629+106:8 glyph (
644−108:9 tight name unit
630+106:9 tight name unit
645−108:14 glyph [
631+106:14 glyph [
646−108:15 tight name p
632+106:15 tight name p
647−108:16 tight glyph =
633+106:16 tight glyph =
648−108:17 tight tvar B
634+106:17 tight tvar B
649−108:19 name q
635+106:19 name q
650−108:20 tight glyph =
636+106:20 tight glyph =
651−108:21 tight name nail
637+106:21 tight name nail
652−108:25 tight glyph ]
638+106:25 tight glyph ]
653−108:26 tight glyph )
639+106:26 tight glyph )
654−109:7 INDENT
640+107:7 INDENT
655−109:7 glyph ?-
641+107:7 glyph ?-
656−109:10 wing q.result
642+107:10 wing q.result
657−110:9 INDENT
643+108:9 INDENT
658−110:9 lit ~
644+108:9 lit ~
659−110:11 lit ~
645+108:11 lit ~
660−111:9 NEWLINE
646+109:9 NEWLINE
661−111:9 glyph [
647+109:9 glyph [
662−111:10 tight lit ~
648+109:10 tight lit ~
663−111:12 name value
649+109:12 name value
664−111:17 tight glyph ]
650+109:17 tight glyph ]
665−111:19 glyph `
651+109:19 glyph `
666−111:20 tight glyph [
652+109:20 tight glyph [
667−111:21 tight name p
653+109:21 tight name p
668−111:22 tight glyph =
654+109:22 tight glyph =
669−111:23 tight glyph (
655+109:23 tight glyph (
670−111:24 tight name f
656+109:24 tight name f
671−111:26 wing p.value
657+109:26 wing p.value
672−111:33 tight glyph )
658+109:33 tight glyph )
673−111:35 name q
659+109:35 name q
674−111:36 tight glyph =
660+109:36 tight glyph =
675−111:37 tight wing q.value
661+109:37 tight wing q.value
676−111:44 tight glyph ]
662+109:44 tight glyph ]
677−112:3 DEDENT
663+110:3 DEDENT
678−112:3 DEDENT
664+110:3 DEDENT
679−112:3 DEDENT
665+110:3 DEDENT
680−112:3 NEWLINE
666+110:3 NEWLINE
681−112:3 glyph ^-
667+110:3 glyph ^-
682−112:6 glyph (
668+110:6 glyph (
683−112:7 tight name like
669+110:7 tight name like
684−112:12 tvar B
670+110:12 tvar B
685−112:13 tight glyph )
671+110:13 tight glyph )
686−112:15 glyph [
672+110:15 glyph [
687−112:16 tight name p
673+110:16 tight name p
688−112:17 tight glyph =
674+110:17 tight glyph =
689−112:18 tight wing p.result
675+110:18 tight wing p.result
690−112:27 name q
676+110:27 name q
691−112:28 tight glyph =
677+110:28 tight glyph =
692−112:29 tight name mapped
678+110:29 tight name mapped
693−112:35 tight glyph ]
679+110:35 tight glyph ]
694−114:1 DEDENT
680+112:1 DEDENT
695−114:1 NEWLINE
681+112:1 NEWLINE
696−114:1 glyph ++
682+112:1 glyph ++
697−114:4 name wonk
683+112:4 name wonk
698−114:9 glyph |=
684+112:9 glyph |=
699−114:12 name veq
685+112:12 name veq
700−114:15 tight glyph =
686+112:15 tight glyph =
701−114:16 tight glyph (
687+112:16 tight glyph (
702−114:17 tight name like
688+112:17 tight name like
703−114:22 tvar A
689+112:22 tvar A
704−114:23 tight glyph )
690+112:23 tight glyph )
705−115:3 INDENT
691+113:3 INDENT
706−115:3 glyph ?-
692+113:3 glyph ?-
707−115:6 wing q.veq
693+113:6 wing q.veq
708−116:5 INDENT
694+114:5 INDENT
709−116:5 lit ~
695+114:5 lit ~
710−116:7 glyph !!
696+114:7 glyph !!
711−117:5 NEWLINE
697+115:5 NEWLINE
712−117:5 glyph [
698+115:5 glyph [
713−117:6 tight lit ~
699+115:6 tight lit ~
714−117:8 name product
700+115:8 name product
715−117:15 tight glyph ]
701+115:15 tight glyph ]
716−117:17 wing p.product
702+115:17 wing p.product
717−119:1 DEDENT
703+117:1 DEDENT
718−119:1 DEDENT
704+117:1 DEDENT
705+117:1 NEWLINE
706+117:1 glyph +$
707+117:4 name lone
708+117:9 glyph |$
709+117:12 glyph [
710+117:13 tight tvar A
711+117:14 tight glyph ]
712+117:16 glyph [
713+117:17 tight name p
714+117:18 tight glyph =
715+117:19 tight tvar A
716+117:20 tight glyph ]
719119:1 NEWLINE
717119:1 NEWLINE
720119:1 glyph +$
718119:1 glyph +$
721−119:4 name lone
719+119:4 name lest
722119:9 glyph |$
720119:9 glyph |$
723119:12 glyph [
721119:12 glyph [
724119:13 tight tvar A
722119:13 tight tvar A
725119:14 tight glyph ]
723119:14 tight glyph ]
726119:16 glyph [
724119:16 glyph [
727−119:17 tight name p
725+119:17 tight name i
728119:18 tight glyph =
726119:18 tight glyph =
729119:19 tight tvar A
727119:19 tight tvar A
728+119:21 name t
729+119:22 tight glyph =
730+119:23 tight glyph (
731+119:24 tight name list
732+119:29 tvar A
733+119:30 tight glyph )
730−119:20 tight glyph ]
734+119:31 tight glyph ]
731121:1 NEWLINE
735121:1 NEWLINE
732121:1 glyph +$
736121:1 glyph +$
733−121:4 name lest
737+121:4 name pole
734121:9 glyph |$
738121:9 glyph |$
735121:12 glyph [
739121:12 glyph [
736121:13 tight tvar A
740121:13 tight tvar A
737121:14 tight glyph ]
741121:14 tight glyph ]
738−121:16 glyph [
742+122:3 INDENT
739−121:17 tight name i
743+122:3 lit ~
740−121:18 tight glyph =
741−121:19 tight tvar A
742−121:21 name t
743−121:22 tight glyph =
744−121:23 tight glyph (
745−121:24 tight name list
746−121:29 tvar A
747−121:30 tight glyph )
748−121:31 tight glyph ]
749−123:1 NEWLINE
744+123:3 NEWLINE
750−123:1 glyph +$
745+123:3 glyph [
746+123:4 tight tvar A
747+123:6 glyph (
751−123:4 name pole
748+123:7 tight name pole
752−123:9 glyph |$
749+123:12 tvar A
753−123:12 glyph [
754−123:13 tight tvar A
750+123:13 tight glyph )
755123:14 tight glyph ]
751123:14 tight glyph ]
756−124:3 INDENT
752+125:1 DEDENT
757−124:3 lit ~
758−125:3 NEWLINE
753+125:1 NEWLINE
759−125:3 glyph [
754+125:1 glyph +$
760−125:4 tight tvar A
755+125:4 name quip
761−125:6 glyph (
756+125:9 glyph |$
762−125:7 tight name pole
763−125:12 tvar A
757+125:12 glyph [
764−125:13 tight glyph )
758+125:13 tight tvar A
759+125:15 tvar B
760+125:16 tight glyph ]
761+125:18 glyph [
762+125:19 tight glyph (
763+125:20 tight name list
764+125:25 tvar A
765+125:26 tight glyph )
766+125:28 tvar B
765−125:14 tight glyph ]
767+125:29 tight glyph ]
766−127:1 DEDENT
767127:1 NEWLINE
768127:1 NEWLINE
768127:1 glyph +$
769127:1 glyph +$
769−127:4 name quip
770+127:4 name tree
770127:9 glyph |$
771127:9 glyph |$
771127:12 glyph [
772127:12 glyph [
772127:13 tight tvar A
773127:13 tight tvar A
773−127:15 tvar B
774−127:16 tight glyph ]
775−127:18 glyph [
776−127:19 tight glyph (
777−127:20 tight name list
778−127:25 tvar A
779−127:26 tight glyph )
780−127:28 tvar B
781−127:29 tight glyph ]
782−129:1 NEWLINE
783−129:1 glyph +$
784−129:4 name tree
785−129:9 glyph |$
786−129:12 glyph [
787−129:13 tight tvar A
788−129:14 tight glyph ]
774+127:14 tight glyph ]
789−130:3 INDENT
775+128:3 INDENT
790−130:3 lit ~
776+128:3 lit ~
791−131:3 NEWLINE
777+129:3 NEWLINE
792−131:3 glyph [
778+129:3 glyph [
793−131:4 tight name n
779+129:4 tight name n
794−131:5 tight glyph =
780+129:5 tight glyph =
795−131:6 tight tvar A
781+129:6 tight tvar A
796−131:8 name l
782+129:8 name l
797−131:9 tight glyph =
783+129:9 tight glyph =
798−131:10 tight glyph (
784+129:10 tight glyph (
799−131:11 tight name tree
785+129:11 tight name tree
800−131:16 tvar A
786+129:16 tvar A
801−131:17 tight glyph )
787+129:17 tight glyph )
802−131:19 name r
788+129:19 name r
803−131:20 tight glyph =
789+129:20 tight glyph =
804−131:21 tight glyph (
790+129:21 tight glyph (
805−131:22 tight name tree
791+129:22 tight name tree
806−131:27 tvar A
792+129:27 tvar A
807−131:28 tight glyph )
793+129:28 tight glyph )
808−131:29 tight glyph ]
794+129:29 tight glyph ]
809−133:1 DEDENT
795+131:1 DEDENT
810−133:1 NEWLINE
796+131:1 NEWLINE
811−133:1 glyph +$
797+131:1 glyph +$
812−133:4 name each
798+131:4 name each
813−133:9 glyph |$
799+131:9 glyph |$
814−133:12 glyph [
800+131:12 glyph [
815−133:13 tight tvar A
801+131:13 tight tvar A
816−133:15 tvar B
802+131:15 tvar B
817−133:16 tight glyph ]
803+131:16 tight glyph ]
818−134:3 INDENT
804+132:3 INDENT
819−134:3 glyph [
805+132:3 glyph [
820−134:4 tight lit %|
806+132:4 tight lit %|
821−134:7 name p
807+132:7 name p
822−134:8 tight glyph =
808+132:8 tight glyph =
823−134:9 tight tvar B
809+132:9 tight tvar B
824−134:10 tight glyph ]
810+132:10 tight glyph ]
825−135:3 NEWLINE
811+133:3 NEWLINE
826−135:3 glyph [
812+133:3 glyph [
827−135:4 tight lit %&
813+133:4 tight lit %&
828−135:7 name p
814+133:7 name p
829−135:8 tight glyph =
815+133:8 tight glyph =
830−135:9 tight tvar A
816+133:9 tight tvar A
831−135:10 tight glyph ]
817+133:10 tight glyph ]
832−137:1 DEDENT
818+135:1 DEDENT
819+135:1 NEWLINE
820+135:1 glyph +$
821+135:4 name bloq
822+135:9 aura @
833137:1 NEWLINE
823137:1 NEWLINE
834−137:1 glyph +$
824+137:1 glyph ++
835−137:4 name bloq
825+137:4 name some
836−137:9 aura @
826+137:9 glyph |=
827+137:12 name item
828+137:16 tight glyph =
829+137:17 tight tvar A
830+137:19 glyph `
831+137:20 tight name item
837139:1 NEWLINE
832139:1 NEWLINE
838139:1 glyph ++
833139:1 glyph ++
839−139:4 name some
834+139:4 name lure
840139:9 glyph |=
835139:9 glyph |=
841139:12 name item
836139:12 name item
842139:16 tight glyph =
837139:16 tight glyph =
843139:17 tight tvar A
838139:17 tight tvar A
844−139:19 glyph `
845−139:20 tight name item
846−141:1 NEWLINE
847−141:1 glyph ++
848−141:4 name lure
849−141:9 glyph |=
850−141:12 name item
851−141:16 tight glyph =
852−141:17 tight tvar A
853−142:3 INDENT
839+140:3 INDENT
854−142:3 glyph ^-
840+140:3 glyph ^-
855−142:6 glyph (
841+140:6 glyph (
856−142:7 tight name list
842+140:7 tight name list
857−142:12 tvar A
843+140:12 tvar A
858−142:13 tight glyph )
844+140:13 tight glyph )
859−142:15 glyph [
845+140:15 glyph [
860−142:16 tight name item
846+140:16 tight name item
861−142:21 lit ~
847+140:21 lit ~
862−142:22 tight glyph ]
848+140:22 tight glyph ]
863−144:1 DEDENT
849+142:1 DEDENT
864−144:1 NEWLINE
850+142:1 NEWLINE
865−144:1 glyph ++
851+142:1 glyph ++
866−144:4 name snoc
852+142:4 name snoc
867−144:9 glyph |=
853+142:9 glyph |=
868−144:12 name args
854+142:12 name args
869−144:16 tight glyph =
855+142:16 tight glyph =
870−144:17 tight glyph [
856+142:17 tight glyph [
871−144:18 tight glyph (
857+142:18 tight glyph (
872−144:19 tight name list
858+142:19 tight name list
873−144:24 tvar A
859+142:24 tvar A
874−144:25 tight glyph )
860+142:25 tight glyph )
875−144:27 tvar A
861+142:27 tvar A
876−144:28 tight glyph ]
862+142:28 tight glyph ]
877−145:3 INDENT
863+143:3 INDENT
878−145:3 glyph ?-
864+143:3 glyph ?-
879−145:6 name args
865+143:6 name args
880−146:5 INDENT
866+144:5 INDENT
881−146:5 glyph [
867+144:5 glyph [
882−146:6 tight name xs
868+144:6 tight name xs
883−146:9 name item
869+144:9 name item
884−146:13 tight glyph ]
870+144:13 tight glyph ]
885−146:15 glyph (
871+144:15 glyph (
886−146:16 tight name weld
872+144:16 tight name weld
887−146:21 name xs
873+144:21 name xs
888−146:24 glyph [
874+144:24 glyph [
889−146:25 tight name item
875+144:25 tight name item
890−146:30 lit ~
876+144:30 lit ~
891−146:31 tight glyph ]
877+144:31 tight glyph ]
892−146:32 tight glyph )
878+144:32 tight glyph )
893−148:1 DEDENT
879+146:1 DEDENT
894−148:1 DEDENT
880+146:1 DEDENT
895−148:1 NEWLINE
881+146:1 NEWLINE
896−148:1 glyph ++
882+146:1 glyph ++
897−148:4 name flop
883+146:4 name flop
898−148:9 glyph |=
884+146:9 glyph |=
899−148:12 name xs
885+146:12 name xs
900−148:14 tight glyph =
886+146:14 tight glyph =
901−148:15 tight glyph (
887+146:15 tight glyph (
902−148:16 tight name list
888+146:16 tight name list
903−148:21 tvar A
889+146:21 tvar A
904−148:22 tight glyph )
890+146:22 tight glyph )
905−149:3 INDENT
891+147:3 INDENT
906−149:3 glyph ++
892+147:3 glyph ++
907−149:6 name reverse-into
893+147:6 name reverse-into
908−149:19 glyph |=
894+147:19 glyph |=
909−149:22 name args
895+147:22 name args
910−149:26 tight glyph =
896+147:26 tight glyph =
911−149:27 tight glyph [
897+147:27 tight glyph [
912−149:28 tight glyph (
898+147:28 tight glyph (
913−149:29 tight name list
899+147:29 tight name list
914−149:34 tvar A
900+147:34 tvar A
915−149:35 tight glyph )
901+147:35 tight glyph )
916−149:37 glyph (
902+147:37 glyph (
917−149:38 tight name list
903+147:38 tight name list
918−149:43 tvar A
904+147:43 tvar A
919−149:44 tight glyph )
905+147:44 tight glyph )
920−149:45 tight glyph ]
906+147:45 tight glyph ]
921−150:5 INDENT
907+148:5 INDENT
922−150:5 glyph ?-
908+148:5 glyph ?-
923−150:8 name args
909+148:8 name args
924−151:7 INDENT
910+149:7 INDENT
925−151:7 glyph [
911+149:7 glyph [
926−151:8 tight name rest
912+149:8 tight name rest
913+149:13 name acc
914+149:16 tight glyph ]
915+150:9 INDENT
916+150:9 glyph ?-
917+150:12 name rest
918+151:11 INDENT
919+151:11 lit ~
927151:13 name acc
920151:13 name acc
928−151:16 tight glyph ]
929−152:9 INDENT
930−152:9 glyph ?-
931−152:12 name rest
932−153:11 INDENT
933−153:11 lit ~
934−153:13 name acc
935−154:11 NEWLINE
921+152:11 NEWLINE
936−154:11 glyph [
922+152:11 glyph [
937−154:12 tight name item
923+152:12 tight name item
938−154:17 name more
924+152:17 name more
939−154:21 tight glyph ]
925+152:21 tight glyph ]
940−154:23 glyph (
926+152:23 glyph (
941−154:24 tight name reverse-into
927+152:24 tight name reverse-into
942−154:37 name more
928+152:37 name more
943−154:42 glyph [
929+152:42 glyph [
944−154:43 tight name item
930+152:43 tight name item
945−154:48 name acc
931+152:48 name acc
946−154:51 tight glyph ]
932+152:51 tight glyph ]
947−154:52 tight glyph )
933+152:52 tight glyph )
948−155:3 DEDENT
934+153:3 DEDENT
949−155:3 DEDENT
935+153:3 DEDENT
950−155:3 DEDENT
936+153:3 DEDENT
951−155:3 DEDENT
937+153:3 DEDENT
952−155:3 NEWLINE
938+153:3 NEWLINE
953−155:3 glyph (
939+153:3 glyph (
954−155:4 tight name reverse-into
940+153:4 tight name reverse-into
955−155:17 name xs
941+153:17 name xs
956−155:20 lit ~
942+153:20 lit ~
957−155:21 tight glyph )
943+153:21 tight glyph )
958−157:1 DEDENT
944+155:1 DEDENT
959−157:1 NEWLINE
945+155:1 NEWLINE
960−157:1 glyph ++
946+155:1 glyph ++
961−157:4 name drop
947+155:4 name drop
962−157:9 glyph |=
948+155:9 glyph |=
963−157:12 name maybe
949+155:12 name maybe
964−157:17 tight glyph =
950+155:17 tight glyph =
965−157:18 tight glyph (
951+155:18 tight glyph (
966−157:19 tight name unit
952+155:19 tight name unit
967−157:24 tvar A
953+155:24 tvar A
968−157:25 tight glyph )
954+155:25 tight glyph )
969−158:3 INDENT
955+156:3 INDENT
970−158:3 glyph ^-
956+156:3 glyph ^-
971−158:6 glyph (
957+156:6 glyph (
972−158:7 tight name list
958+156:7 tight name list
973−158:12 tvar A
959+156:12 tvar A
974−158:13 tight glyph )
960+156:13 tight glyph )
975−159:5 INDENT
961+157:5 INDENT
976−159:5 glyph ?-
962+157:5 glyph ?-
977−159:8 name maybe
963+157:8 name maybe
978−160:7 INDENT
964+158:7 INDENT
979−160:7 lit ~
965+158:7 lit ~
980−160:9 lit ~
966+158:9 lit ~
981−161:7 NEWLINE
967+159:7 NEWLINE
982−161:7 glyph [
968+159:7 glyph [
983−161:8 tight lit ~
969+159:8 tight lit ~
984−161:10 name value
970+159:10 name value
985−161:15 tight glyph ]
971+159:15 tight glyph ]
986−161:17 glyph [
972+159:17 glyph [
987−161:18 tight name value
973+159:18 tight name value
988−161:24 lit ~
974+159:24 lit ~
989−161:25 tight glyph ]
975+159:25 tight glyph ]
990−163:1 DEDENT
976+161:1 DEDENT
991−163:1 DEDENT
977+161:1 DEDENT
992−163:1 DEDENT
978+161:1 DEDENT
993−163:1 NEWLINE
979+161:1 NEWLINE
994−163:1 glyph ++
980+161:1 glyph ++
995−163:4 name bond
981+161:4 name bond
996−163:9 glyph |=
982+161:9 glyph |=
997−163:12 name fallback
983+161:12 name fallback
998−163:20 tight glyph =
984+161:20 tight glyph =
999−163:21 tight glyph $-(
985+161:21 tight glyph $-(
1000−163:24 tight lit ~
986+161:24 tight lit ~
1001−163:26 tvar A
987+161:26 tvar A
1002−163:27 tight glyph )
988+161:27 tight glyph )
1003−164:3 INDENT
989+162:3 INDENT
1004−164:3 glyph |=
990+162:3 glyph |=
1005−164:6 name maybe
991+162:6 name maybe
1006−164:11 tight glyph =
992+162:11 tight glyph =
1007−164:12 tight glyph (
993+162:12 tight glyph (
1008−164:13 tight name unit
994+162:13 tight name unit
1009−164:18 tvar A
995+162:18 tvar A
1010−164:19 tight glyph )
996+162:19 tight glyph )
1011−165:5 INDENT
997+163:5 INDENT
1012−165:5 glyph ?-
998+163:5 glyph ?-
1013−165:8 name maybe
999+163:8 name maybe
1014−166:7 INDENT
1000+164:7 INDENT
1015−166:7 lit ~
1001+164:7 lit ~
1016−166:9 glyph (
1002+164:9 glyph (
1017−166:10 tight name fallback
1003+164:10 tight name fallback
1018−166:19 lit ~
1004+164:19 lit ~
1019−166:20 tight glyph )
1005+164:20 tight glyph )
1020−167:7 NEWLINE
1006+165:7 NEWLINE
1021−167:7 glyph [
1007+165:7 glyph [
1022−167:8 tight lit ~
1008+165:8 tight lit ~
1023−167:10 name value
1009+165:10 name value
1024−167:15 tight glyph ]
1010+165:15 tight glyph ]
1025−167:17 name value
1011+165:17 name value
1026−169:1 DEDENT
1012+167:1 DEDENT
1027−169:1 DEDENT
1013+167:1 DEDENT
1028−169:1 DEDENT
1014+167:1 DEDENT
1029−169:1 NEWLINE
1015+167:1 NEWLINE
1030−169:1 glyph ++
1016+167:1 glyph ++
1031−169:4 name bind
1017+167:4 name bind
1032−169:9 glyph |=
1018+167:9 glyph |=
1033−169:12 name args
1019+167:12 name args
1034−169:16 tight glyph =
1020+167:16 tight glyph =
1035−169:17 tight glyph [
1021+167:17 tight glyph [
1022+167:18 tight glyph (
1023+167:19 tight name unit
1024+167:24 tvar A
1025+167:25 tight glyph )
1026+167:27 glyph $-(
1027+167:30 tight tvar A
1028+167:32 tvar B
1029+167:33 tight glyph )
1030+167:34 tight glyph ]
1031+168:3 INDENT
1032+168:3 glyph ?-
1033+168:6 name args
1034+169:5 INDENT
1035+169:5 glyph [
1036−169:18 tight glyph (
1036+169:6 tight name maybe
1037+169:12 name f
1038+169:13 tight glyph ]
1039+169:15 glyph ^-
1040+169:18 glyph (
1037169:19 tight name unit
1041169:19 tight name unit
1038−169:24 tvar A
1042+169:24 tvar B
1039169:25 tight glyph )
1043169:25 tight glyph )
1040−169:27 glyph $-(
1041−169:30 tight tvar A
1042−169:32 tvar B
1043−169:33 tight glyph )
1044−169:34 tight glyph ]
1045−170:3 INDENT
1044+170:7 INDENT
1046−170:3 glyph ?-
1045+170:7 glyph ?-
1047−170:6 name args
1048−171:5 INDENT
1049−171:5 glyph [
1050−171:6 tight name maybe
1046+170:10 name maybe
1051−171:12 name f
1052−171:13 tight glyph ]
1053−171:15 glyph ^-
1054−171:18 glyph (
1055−171:19 tight name unit
1056−171:24 tvar B
1057−171:25 tight glyph )
1058−172:7 INDENT
1059−172:7 glyph ?-
1060−172:10 name maybe
1061−173:9 INDENT
1047+171:9 INDENT
1062−173:9 lit ~
1048+171:9 lit ~
1063−173:11 lit ~
1049+171:11 lit ~
1064−174:9 NEWLINE
1050+172:9 NEWLINE
1065−174:9 glyph [
1051+172:9 glyph [
1066−174:10 tight lit ~
1052+172:10 tight lit ~
1067−174:12 name value
1053+172:12 name value
1068−174:17 tight glyph ]
1054+172:17 tight glyph ]
1069−174:19 glyph `
1055+172:19 glyph `
1070−174:20 tight glyph (
1056+172:20 tight glyph (
1071−174:21 tight name f
1057+172:21 tight name f
1072−174:23 name value
1058+172:23 name value
1073−174:28 tight glyph )
1059+172:28 tight glyph )
1074−176:1 DEDENT
1060+174:1 DEDENT
1075−176:1 DEDENT
1061+174:1 DEDENT
1076−176:1 DEDENT
1062+174:1 DEDENT
1077−176:1 DEDENT
1063+174:1 DEDENT
1078−176:1 NEWLINE
1064+174:1 NEWLINE
1079−176:1 glyph ++
1065+174:1 glyph ++
1080−176:4 name biff
1066+174:4 name biff
1081−176:9 glyph |=
1067+174:9 glyph |=
1082−176:12 name args
1068+174:12 name args
1083−176:16 tight glyph =
1069+174:16 tight glyph =
1084−176:17 tight glyph [
1070+174:17 tight glyph [
1071+174:18 tight glyph (
1072+174:19 tight name unit
1073+174:24 tvar A
1074+174:25 tight glyph )
1075+174:27 glyph $-(
1076+174:30 tight tvar A
1077+174:32 glyph (
1078+174:33 tight name unit
1079+174:38 tvar B
1080+174:39 tight glyph )
1081+174:40 tight glyph )
1082+174:41 tight glyph ]
1083+175:3 INDENT
1084+175:3 glyph ?-
1085+175:6 name args
1086+176:5 INDENT
1087+176:5 glyph [
1085−176:18 tight glyph (
1088+176:6 tight name maybe
1089+176:12 name f
1090+176:13 tight glyph ]
1091+176:15 glyph ^-
1092+176:18 glyph (
1086176:19 tight name unit
1093176:19 tight name unit
1087−176:24 tvar A
1094+176:24 tvar B
1088176:25 tight glyph )
1095176:25 tight glyph )
1089−176:27 glyph $-(
1090−176:30 tight tvar A
1091−176:32 glyph (
1092−176:33 tight name unit
1093−176:38 tvar B
1094−176:39 tight glyph )
1095−176:40 tight glyph )
1096−176:41 tight glyph ]
1097−177:3 INDENT
1096+177:7 INDENT
1098−177:3 glyph ?-
1097+177:7 glyph ?-
1099−177:6 name args
1100−178:5 INDENT
1101−178:5 glyph [
1102−178:6 tight name maybe
1098+177:10 name maybe
1103−178:12 name f
1104−178:13 tight glyph ]
1105−178:15 glyph ^-
1106−178:18 glyph (
1107−178:19 tight name unit
1108−178:24 tvar B
1109−178:25 tight glyph )
1110−179:7 INDENT
1111−179:7 glyph ?-
1112−179:10 name maybe
1113−180:9 INDENT
1099+178:9 INDENT
1114−180:9 lit ~
1100+178:9 lit ~
1115−180:11 lit ~
1101+178:11 lit ~
1116−181:9 NEWLINE
1102+179:9 NEWLINE
1117−181:9 glyph [
1103+179:9 glyph [
1118−181:10 tight lit ~
1104+179:10 tight lit ~
1119−181:12 name value
1105+179:12 name value
1120−181:17 tight glyph ]
1106+179:17 tight glyph ]
1121−181:19 glyph (
1107+179:19 glyph (
1122−181:20 tight name f
1108+179:20 tight name f
1123−181:22 name value
1109+179:22 name value
1124−181:27 tight glyph )
1110+179:27 tight glyph )
1125−183:1 DEDENT
1111+181:1 DEDENT
1126−183:1 DEDENT
1112+181:1 DEDENT
1127−183:1 DEDENT
1113+181:1 DEDENT
1128−183:1 DEDENT
1114+181:1 DEDENT
1129−183:1 NEWLINE
1115+181:1 NEWLINE
1130−183:1 glyph ++
1116+181:1 glyph ++
1131−183:4 name both
1117+181:4 name both
1132−183:9 glyph |=
1118+181:9 glyph |=
1133−183:12 name args
1119+181:12 name args
1134−183:16 tight glyph =
1120+181:16 tight glyph =
1135−183:17 tight glyph [
1121+181:17 tight glyph [
1136−183:18 tight glyph (
1122+181:18 tight glyph (
1137−183:19 tight name unit
1123+181:19 tight name unit
1138−183:24 tvar A
1124+181:24 tvar A
1139−183:25 tight glyph )
1125+181:25 tight glyph )
1140−183:27 glyph (
1126+181:27 glyph (
1141−183:28 tight name unit
1127+181:28 tight name unit
1142−183:33 tvar B
1128+181:33 tvar B
1129+181:34 tight glyph )
1130+181:35 tight glyph ]
1131+182:3 INDENT
1132+182:3 glyph ?-
1133+182:6 name args
1134+183:5 INDENT
1135+183:5 glyph [
1136+183:6 tight name first
1137+183:12 name second
1138+183:18 tight glyph ]
1139+183:20 glyph ^-
1140+183:23 glyph (
1141+183:24 tight name unit
1142+183:29 glyph [
1143+183:30 tight tvar A
1144+183:32 tvar B
1145+183:33 tight glyph ]
1143183:34 tight glyph )
1146183:34 tight glyph )
1144−183:35 tight glyph ]
1147+184:7 INDENT
1145−184:3 INDENT
1148+184:7 glyph ?-
1146−184:3 glyph ?-
1149+184:10 name first
1147−184:6 name args
1150+185:9 INDENT
1148−185:5 INDENT
1151+185:9 lit ~
1149−185:5 glyph [
1152+185:11 lit ~
1150−185:6 tight name first
1153+186:9 NEWLINE
1151−185:12 name second
1154+186:9 glyph [
1152−185:18 tight glyph ]
1155+186:10 tight lit ~
1153−185:20 glyph ^-
1156+186:12 name a
1154−185:23 glyph (
1157+186:13 tight glyph ]
1155−185:24 tight name unit
1158+187:11 INDENT
1156−185:29 glyph [
1159+187:11 glyph ?-
1157−185:30 tight tvar A
1160+187:14 name second
1158−185:32 tvar B
1161+188:13 INDENT
1159−185:33 tight glyph ]
1162+188:13 lit ~
1160−185:34 tight glyph )
1163+188:15 lit ~
1161−186:7 INDENT
1164+189:13 NEWLINE
1162−186:7 glyph ?-
1165+189:13 glyph [
1163−186:10 name first
1166+189:14 tight lit ~
1164−187:9 INDENT
1167+189:16 name b
1165−187:9 lit ~
1168+189:17 tight glyph ]
1166−187:11 lit ~
1169+189:19 glyph `
1167−188:9 NEWLINE
1170+189:20 tight glyph [
1168−188:9 glyph [
1171+189:21 tight name a
1169−188:10 tight lit ~
1172+189:23 name b
1170−188:12 name a
1173+189:24 tight glyph ]
1171−188:13 tight glyph ]
1174+191:1 DEDENT
1172−189:11 INDENT
1175+191:1 DEDENT
1173−189:11 glyph ?-
1176+191:1 DEDENT
1174−189:14 name second
1177+191:1 DEDENT
1175−190:13 INDENT
1178+191:1 DEDENT
1176−190:13 lit ~
1179+191:1 DEDENT
1177−190:15 lit ~
1180+191:1 NEWLINE
1178−191:13 NEWLINE
1181+191:1 glyph ++
1179−191:13 glyph [
1182+191:4 name clap
1180−191:14 tight lit ~
1183+191:9 glyph |=
1181−191:16 name b
1184+191:12 name args
1182−191:17 tight glyph ]
1185+191:16 tight glyph =
1183−191:19 glyph `
1186+191:17 tight glyph [
1184−191:20 tight glyph [
1187+191:18 tight glyph (
1185−191:21 tight name a
1188+191:19 tight name unit
1186−191:23 name b
1189+191:24 tvar A
1187−191:24 tight glyph ]
1190+191:25 tight glyph )
1188−193:1 DEDENT
1191+191:27 glyph (
1189−193:1 DEDENT
1192+191:28 tight name unit
1190−193:1 DEDENT
1193+191:33 tvar A
1191−193:1 DEDENT
1194+191:34 tight glyph )
1192−193:1 DEDENT
1195+191:36 glyph $-(
1193−193:1 DEDENT
1196+191:39 tight glyph [
1194−193:1 NEWLINE
1197+191:40 tight tvar A
1195−193:1 glyph ++
1198+191:42 tvar A
1196−193:4 name clap
1199+191:43 tight glyph ]
1197−193:9 glyph |=
1200+191:45 tvar A
1198−193:12 name args
1201+191:46 tight glyph )
1199−193:16 tight glyph =
1202+191:47 tight glyph ]
1200−193:17 tight glyph [
1203+192:3 INDENT
1201−193:18 tight glyph (
1204+192:3 glyph ?-
1202−193:19 tight name unit
1205+192:6 name args
1203−193:24 tvar A
1206+193:5 INDENT
1204−193:25 tight glyph )
1207+193:5 glyph [
1205−193:27 glyph (
1208+193:6 tight name first
1206−193:28 tight name unit
1209+193:12 name second
1207−193:33 tvar A
1210+193:19 name combine
1208−193:34 tight glyph )
1211+193:26 tight glyph ]
1209−193:36 glyph $-(
1212+193:28 glyph ^-
1210−193:39 tight glyph [
1213+193:31 glyph (
1211−193:40 tight tvar A
1214+193:32 tight name unit
1212−193:42 tvar A
1215+193:37 tvar A
1213−193:43 tight glyph ]
1216+193:38 tight glyph )
1214−193:45 tvar A
1217+194:7 INDENT
1215−193:46 tight glyph )
1218+194:7 glyph ?-
1216−193:47 tight glyph ]
1219+194:10 name first
1217−194:3 INDENT
1220+195:9 INDENT
1218−194:3 glyph ?-
1221+195:9 lit ~
1219−194:6 name args
1222+195:11 name second
1220−195:5 INDENT
1223+196:9 NEWLINE
1221−195:5 glyph [
1224+196:9 glyph [
1222−195:6 tight name first
1225+196:10 tight lit ~
1223−195:12 name second
1226+196:12 name a
1224−195:19 name combine
1227+196:13 tight glyph ]
1225−195:26 tight glyph ]
1228+197:11 INDENT
1226−195:28 glyph ^-
1229+197:11 glyph ?-
1227−195:31 glyph (
1230+197:14 name second
1228−195:32 tight name unit
1231+198:13 INDENT
1229−195:37 tvar A
1232+198:13 lit ~
1230−195:38 tight glyph )
1233+198:15 name first
1231−196:7 INDENT
1234+199:13 NEWLINE
1232−196:7 glyph ?-
1235+199:13 glyph [
1233−196:10 name first
1236+199:14 tight lit ~
1234−197:9 INDENT
1237+199:16 name b
1235−197:9 lit ~
1238+199:17 tight glyph ]
1236−197:11 name second
1239+199:19 glyph `
1237−198:9 NEWLINE
1240+199:20 tight glyph (
1238−198:9 glyph [
1241+199:21 tight name combine
1239−198:10 tight lit ~
1242+199:29 name a
1240−198:12 name a
1243+199:31 name b
1241−198:13 tight glyph ]
1244+199:32 tight glyph )
1242−199:11 INDENT
1245+201:1 DEDENT
1243−199:11 glyph ?-
1246+201:1 DEDENT
1244−199:14 name second
1247+201:1 DEDENT
1245−200:13 INDENT
1248+201:1 DEDENT
1246−200:13 lit ~
1249+201:1 DEDENT
1247−200:15 name first
1250+201:1 DEDENT
1248−201:13 NEWLINE
1251+201:1 NEWLINE
1249−201:13 glyph [
1252+201:1 glyph ++
1250−201:14 tight lit ~
1253+201:4 name clef
1251−201:16 name b
1254+201:9 glyph |=
1252−201:17 tight glyph ]
1255+201:12 name args
1253−201:19 glyph `
1256+201:16 tight glyph =
1254−201:20 tight glyph (
1257+201:17 tight glyph [
1255−201:21 tight name combine
1258+201:18 tight glyph (
1256−201:29 name a
1259+201:19 tight name unit
1257−201:31 name b
1260+201:24 tvar A
1258−201:32 tight glyph )
1261+201:25 tight glyph )
1259−203:1 DEDENT
1262+201:27 glyph (
1260−203:1 DEDENT
1263+201:28 tight name unit
1261−203:1 DEDENT
1264+201:33 tvar B
1262−203:1 DEDENT
1265+201:34 tight glyph )
1263−203:1 DEDENT
1266+201:36 glyph $-(
1264−203:1 DEDENT
1267+201:39 tight glyph [
1265−203:1 NEWLINE
1268+201:40 tight tvar A
1266−203:1 glyph ++
1269+201:42 tvar B
1267−203:4 name hunt
1270+201:43 tight glyph ]
1268−203:9 glyph |=
1271+201:45 glyph (
1269−203:12 name args
1272+201:46 tight name unit
1270−203:16 tight glyph =
1273+201:51 tvar C
1271−203:17 tight glyph [
1274+201:52 tight glyph )
1272−203:18 tight glyph $-(
1275+201:53 tight glyph )
1273−203:21 tight glyph [
1276+201:54 tight glyph ]
1274−203:22 tight tvar A
1277+202:3 INDENT
1275−203:24 tvar A
1278+202:3 glyph ?-
1276−203:25 tight glyph ]
1279+202:6 name args
1277−203:27 glyph ?
1280+203:5 INDENT
1278−203:28 tight glyph )
1281+203:5 glyph [
1279−203:30 glyph (
1282+203:6 tight name first
1280−203:31 tight name unit
1283+203:12 name second
1281−203:36 tvar A
1284+203:19 name combine
1282−203:37 tight glyph )
1285+203:26 tight glyph ]
1283−203:39 glyph (
1286+203:28 glyph ^-
1284−203:40 tight name unit
1287+203:31 glyph (
1285−203:45 tvar A
1288+203:32 tight name unit
1286−203:46 tight glyph )
1289+203:37 tvar C
1287−203:47 tight glyph ]
1290+203:38 tight glyph )
1288−204:3 INDENT
1291+204:7 INDENT
1289−204:3 glyph ?-
1292+204:7 glyph ?-
1290−204:6 name args
1293+204:10 name first
1291−205:5 INDENT
1294+205:9 INDENT
1292−205:5 glyph [
1295+205:9 lit ~
1293−205:6 tight name choose
1296+205:11 lit ~
1294−205:13 name first
1297+206:9 NEWLINE
1295−205:19 name second
1298+206:9 glyph [
1296−205:25 tight glyph ]
1299+206:10 tight lit ~
1297−205:27 glyph ^-
1300+206:12 name a
1298−205:30 glyph (
1301+206:13 tight glyph ]
1299−205:31 tight name unit
1302+207:11 INDENT
1300−205:36 tvar A
1303+207:11 glyph ?-
1301−205:37 tight glyph )
1304+207:14 name second
1302−206:7 INDENT
1305+208:13 INDENT
1303−206:7 glyph ?-
1306+208:13 lit ~
1304−206:10 name first
1307+208:15 lit ~
1305−207:9 INDENT
1308+209:13 NEWLINE
1306−207:9 lit ~
1309+209:13 glyph [
1307−207:11 name second
1310+209:14 tight lit ~
1308−208:9 NEWLINE
1311+209:16 name b
1309−208:9 glyph [
1312+209:17 tight glyph ]
1310−208:10 tight lit ~
1313+209:19 glyph (
1311−208:12 name a
1314+209:20 tight name combine
1312−208:13 tight glyph ]
1315+209:28 name a
1313−209:11 INDENT
1316+209:30 name b
1314−209:11 glyph ?-
1317+209:31 tight glyph )
1315−209:14 name second
1318+211:1 DEDENT
1316−210:13 INDENT
1319+211:1 DEDENT
1317−210:13 lit ~
1320+211:1 DEDENT
1318−210:15 name first
1321+211:1 DEDENT
1319−211:13 NEWLINE
1322+211:1 DEDENT
1320−211:13 glyph [
1323+211:1 DEDENT
1321−211:14 tight lit ~
1324+211:1 NEWLINE
1322−211:16 name b
1325+211:1 glyph ++
1323−211:17 tight glyph ]
1326+211:4 name skim
1324−212:15 INDENT
1327+211:9 glyph |=
1325−212:15 glyph ?-
1328+211:12 name args
1326−212:18 glyph (
1329+211:16 tight glyph =
1327−212:19 tight name choose
1330+211:17 tight glyph [
1328−212:26 name a
1331+211:18 tight glyph (
1329−212:28 name b
1332+211:19 tight name list
1330−212:29 tight glyph )
1333+211:24 tvar A
1331−213:17 INDENT
1334+211:25 tight glyph )
1332−213:17 lit %.y
1335+211:27 glyph $-(
1333−213:21 name first
1336+211:30 tight tvar A
1334−214:17 NEWLINE
1337+211:32 glyph ?
1335−214:17 lit %.n
1338+211:33 tight glyph )
1336−214:21 name second
1339+211:34 tight glyph ]
1337−216:1 DEDENT
1340+212:3 INDENT
1338−216:1 DEDENT
1341+212:3 glyph ?-
1339−216:1 DEDENT
1342+212:6 name args
1340−216:1 DEDENT
1343+213:5 INDENT
1341−216:1 DEDENT
1344+213:5 glyph [
1342−216:1 DEDENT
1345+213:6 tight name xs
1343−216:1 DEDENT
1346+213:9 name predicate
1344−216:1 DEDENT
1347+213:18 tight glyph ]
1345−216:1 NEWLINE
1348+213:20 glyph ^-
1346−216:1 glyph ++
1349+213:23 glyph (
1347−216:4 name mate
1350+213:24 tight name list
1348−216:9 glyph |=
1351+213:29 tvar A
1349−216:12 name args
1352+213:30 tight glyph )
1350−216:16 tight glyph =
1353+214:9 INDENT
1351−216:17 tight glyph [
1354+214:9 glyph ?-
1352−216:18 tight glyph (
1355+214:12 name xs
1353−216:19 tight name unit
1356+215:11 INDENT
1354−216:24 tvar A
1357+215:11 lit ~
1355−216:25 tight glyph )
1358+215:13 lit ~
1356−216:27 glyph (
1359+216:11 NEWLINE
1357−216:28 tight name unit
1360+216:11 glyph [
1358−216:33 tvar A
1361+216:12 tight name item
1359−216:34 tight glyph )
1362+216:17 name rest
1360−216:35 tight glyph ]
1363+216:21 tight glyph ]
1361−217:3 INDENT
1364+217:13 INDENT
1362−217:3 glyph ?-
1365+217:13 glyph ?-
1363−217:6 name args
1366+217:16 glyph (
1364−218:5 INDENT
1367+217:17 tight name predicate
1365−218:5 glyph [
1368+217:27 name item
1366−218:6 tight name first
1369+217:31 tight glyph )
1367−218:12 name second
1370+218:15 INDENT
1368−218:18 tight glyph ]
1371+218:15 lit %.y
1369−218:20 glyph ^-
1372+218:19 glyph [
1370−218:23 glyph (
1373+218:20 tight name item
1371−218:24 tight name unit
1374+218:25 glyph (
1372−218:29 tvar A
1375+218:26 tight name skim
1373−218:30 tight glyph )
1376+218:31 name rest
1374−219:7 INDENT
1377+218:36 name predicate
1375−219:7 glyph ?-
1378+218:45 tight glyph )
1376−219:10 name second
1379+218:46 tight glyph ]
1377−220:9 INDENT
1380+219:15 NEWLINE
1378−220:9 lit ~
1381+219:15 lit %.n
1379−220:11 name first
1382+219:19 glyph (
1380−221:9 NEWLINE
1383+219:20 tight name skim
1381−221:9 glyph [
1384+219:25 name rest
1382−221:10 tight lit ~
1385+219:30 name predicate
1383−221:12 name b
1386+219:39 tight glyph )
1384−221:13 tight glyph ]
1387+221:1 DEDENT
1385−222:11 INDENT
1388+221:1 DEDENT
1386−222:11 glyph ?-
1389+221:1 DEDENT
1387−222:14 name first
1390+221:1 DEDENT
1388−223:13 INDENT
1391+221:1 DEDENT
1389−223:13 lit ~
1392+221:1 DEDENT
1390−223:15 name second
1393+221:1 NEWLINE
1391−224:13 NEWLINE
1394+221:1 glyph ++
1392−224:13 glyph [
1395+221:4 name skip
1393−224:14 tight lit ~
1396+221:9 glyph |=
1394−224:16 name a
1397+221:12 name args
1395−224:17 tight glyph ]
1398+221:16 tight glyph =
1396−225:15 INDENT
1399+221:17 tight glyph [
1397−225:15 glyph ?-
1400+221:18 tight glyph (
1398−225:18 glyph (
1401+221:19 tight name list
1399−225:19 tight name eq
1402+221:24 tvar A
1400−225:22 name a
1403+221:25 tight glyph )
1401−225:24 name b
1404+221:27 glyph $-(
1402−225:25 tight glyph )
1405+221:30 tight tvar A
1403−226:17 INDENT
1406+221:32 glyph ?
1404−226:17 lit %.y
1407+221:33 tight glyph )
1405−226:21 name first
1408+221:34 tight glyph ]
1406−227:17 NEWLINE
1409+222:3 INDENT
1407−227:17 lit %.n
1410+222:3 glyph ?-
1408−227:21 glyph !!
1411+222:6 name args
1409−229:1 DEDENT
1412+223:5 INDENT
1410−229:1 DEDENT
1413+223:5 glyph [
1411−229:1 DEDENT
1414+223:6 tight name xs
1412−229:1 DEDENT
1415+223:9 name predicate
1413−229:1 DEDENT
1416+223:18 tight glyph ]
1414−229:1 DEDENT
1417+223:20 glyph ^-
1415−229:1 DEDENT
1418+223:23 glyph (
1416−229:1 DEDENT
1419+223:24 tight name list
1417−229:1 NEWLINE
1420+223:29 tvar A
1418−229:1 glyph ++
1421+223:30 tight glyph )
1419−229:4 name clef
1422+224:9 INDENT
1420−229:9 glyph |=
1423+224:9 glyph ?-
1421−229:12 name args
1424+224:12 name xs
1422−229:16 tight glyph =
1425+225:11 INDENT
1423−229:17 tight glyph [
1426+225:11 lit ~
1424−229:18 tight glyph (
1427+225:13 lit ~
1425−229:19 tight name unit
1428+226:11 NEWLINE
1426−229:24 tvar A
1429+226:11 glyph [
1427−229:25 tight glyph )
1430+226:12 tight name item
1428−229:27 glyph (
1431+226:17 name rest
1429−229:28 tight name unit
1432+226:21 tight glyph ]
1430−229:33 tvar B
1433+227:13 INDENT
1431−229:34 tight glyph )
1434+227:13 glyph ?-
1432−229:36 glyph $-(
1435+227:16 glyph (
1433−229:39 tight glyph [
1436+227:17 tight name predicate
1434−229:40 tight tvar A
1437+227:27 name item
1435−229:42 tvar B
1438+227:31 tight glyph )
1436−229:43 tight glyph ]
1439+228:15 INDENT
1437−229:45 glyph (
1440+228:15 lit %.y
1438−229:46 tight name unit
1441+228:19 glyph (
1439−229:51 tvar C
1442+228:20 tight name skip
1440−229:52 tight glyph )
1443+228:25 name rest
1441−229:53 tight glyph )
1444+228:30 name predicate
1442−229:54 tight glyph ]
1445+228:39 tight glyph )
1443−230:3 INDENT
1446+229:15 NEWLINE
1444−230:3 glyph ?-
1447+229:15 lit %.n
1445−230:6 name args
1448+229:19 glyph [
1446−231:5 INDENT
1449+229:20 tight name item
1447−231:5 glyph [
1450+229:25 glyph (
1448−231:6 tight name first
1451+229:26 tight name skip
1449−231:12 name second
1452+229:31 name rest
1450−231:19 name combine
1453+229:36 name predicate
1451−231:26 tight glyph ]
1454+229:45 tight glyph )
1452−231:28 glyph ^-
1455+229:46 tight glyph ]
1453−231:31 glyph (
1456+231:1 DEDENT
1454−231:32 tight name unit
1457+231:1 DEDENT
1455−231:37 tvar C
1458+231:1 DEDENT
1456−231:38 tight glyph )
1459+231:1 DEDENT
1457−232:7 INDENT
1460+231:1 DEDENT
1458−232:7 glyph ?-
1461+231:1 DEDENT
1459−232:10 name first
1462+231:1 NEWLINE
1460−233:9 INDENT
1463+231:1 glyph ++
1461−233:9 lit ~
1464+231:4 name levy
1462−233:11 lit ~
1465+231:9 glyph |=
1463−234:9 NEWLINE
1466+231:12 name args
1464−234:9 glyph [
1467+231:16 tight glyph =
1465−234:10 tight lit ~
1468+231:17 tight glyph [
1466−234:12 name a
1469+231:18 tight glyph (
1467−234:13 tight glyph ]
1470+231:19 tight name list
1468−235:11 INDENT
1471+231:24 tvar A
1469−235:11 glyph ?-
1472+231:25 tight glyph )
1470−235:14 name second
1473+231:27 glyph $-(
1471−236:13 INDENT
1474+231:30 tight tvar A
1472−236:13 lit ~
1475+231:32 glyph ?
1473−236:15 lit ~
1476+231:33 tight glyph )
1474−237:13 NEWLINE
1477+231:34 tight glyph ]
1475−237:13 glyph [
1478+232:3 INDENT
1476−237:14 tight lit ~
1479+232:3 glyph ^-
1477−237:16 name b
1480+232:6 glyph ?
1478−237:17 tight glyph ]
1481+233:5 INDENT
1479−237:19 glyph (
1482+233:5 glyph ?-
1480−237:20 tight name combine
1483+233:8 name args
1481−237:28 name a
1484+234:7 INDENT
1482−237:30 name b
1485+234:7 glyph [
1483−237:31 tight glyph )
1486+234:8 tight name xs
1484−239:1 DEDENT
1487+234:11 name predicate
1485−239:1 DEDENT
1488+234:20 tight glyph ]
1486−239:1 DEDENT
1489+235:9 INDENT
1487−239:1 DEDENT
1490+235:9 glyph ?-
1488−239:1 DEDENT
1491+235:12 name xs
1489−239:1 DEDENT
1492+236:11 INDENT
1490−239:1 NEWLINE
1493+236:11 lit ~
1491−239:1 glyph ++
1494+236:13 lit %.y
1492−239:4 name skim
1495+237:11 NEWLINE
1493−239:9 glyph |=
1496+237:11 glyph [
1494−239:12 name args
1497+237:12 tight name item
1495−239:16 tight glyph =
1498+237:17 name rest
1496−239:17 tight glyph [
1499+237:21 tight glyph ]
1497−239:18 tight glyph (
1500+238:13 INDENT
1498−239:19 tight name list
1501+238:13 glyph ?-
1499−239:24 tvar A
1502+238:16 glyph (
1500−239:25 tight glyph )
1503+238:17 tight name predicate
1501−239:27 glyph $-(
1504+238:27 name item
1502−239:30 tight tvar A
1505+238:31 tight glyph )
1503−239:32 glyph ?
1506+239:15 INDENT
1504−239:33 tight glyph )
1507+239:15 lit %.y
1505−239:34 tight glyph ]
1508+239:19 glyph (
1506−240:3 INDENT
1509+239:20 tight name levy
1507−240:3 glyph ?-
1510+239:25 name rest
1508−240:6 name args
1511+239:30 name predicate
1509−241:5 INDENT
1512+239:39 tight glyph )
1510−241:5 glyph [
1513+240:15 NEWLINE
1511−241:6 tight name xs
1514+240:15 lit %.n
1512−241:9 name predicate
1515+240:19 lit %.n
1513−241:18 tight glyph ]
1516+242:1 DEDENT
1514−241:20 glyph ^-
1517+242:1 DEDENT
1515−241:23 glyph (
1518+242:1 DEDENT
1516−241:24 tight name list
1519+242:1 DEDENT
1517−241:29 tvar A
1520+242:1 DEDENT
1518−241:30 tight glyph )
1521+242:1 DEDENT
1519−242:9 INDENT
1522+242:1 DEDENT
1520−242:9 glyph ?-
1523+242:1 NEWLINE
1521−242:12 name xs
1524+242:1 glyph ++
1522−243:11 INDENT
1525+242:4 name lien
1523−243:11 lit ~
1526+242:9 glyph |=
1524−243:13 lit ~
1527+242:12 name args
1525−244:11 NEWLINE
1528+242:16 tight glyph =
1526−244:11 glyph [
1529+242:17 tight glyph [
1527−244:12 tight name item
1530+242:18 tight glyph (
1528−244:17 name rest
1531+242:19 tight name list
1529−244:21 tight glyph ]
1532+242:24 tvar A
1530−245:13 INDENT
1533+242:25 tight glyph )
1531−245:13 glyph ?-
1534+242:27 glyph $-(
1532−245:16 glyph (
1535+242:30 tight tvar A
1533−245:17 tight name predicate
1536+242:32 glyph ?
1534−245:27 name item
1537+242:33 tight glyph )
1535−245:31 tight glyph )
1538+242:34 tight glyph ]
1536−246:15 INDENT
1539+243:3 INDENT
1537−246:15 lit %.y
1540+243:3 glyph ^-
1538−246:19 glyph [
1541+243:6 glyph ?
1539−246:20 tight name item
1542+244:5 INDENT
1540−246:25 glyph (
1543+244:5 glyph ?-
1541−246:26 tight name skim
1544+244:8 name args
1542−246:31 name rest
1545+245:7 INDENT
1543−246:36 name predicate
1546+245:7 glyph [
1544−246:45 tight glyph )
1547+245:8 tight name xs
1545−246:46 tight glyph ]
1548+245:11 name predicate
1546−247:15 NEWLINE
1549+245:20 tight glyph ]
1547−247:15 lit %.n
1550+246:9 INDENT
1548−247:19 glyph (
1551+246:9 glyph ?-
1549−247:20 tight name skim
1552+246:12 name xs
1550−247:25 name rest
1553+247:11 INDENT
1551−247:30 name predicate
1554+247:11 lit ~
1552−247:39 tight glyph )
1555+247:13 lit %.n
1553−249:1 DEDENT
1556+248:11 NEWLINE
1554−249:1 DEDENT
1557+248:11 glyph [
1555−249:1 DEDENT
1558+248:12 tight name item
1556−249:1 DEDENT
1559+248:17 name rest
1557−249:1 DEDENT
1560+248:21 tight glyph ]
1558−249:1 DEDENT
1561+249:13 INDENT
1559−249:1 NEWLINE
1562+249:13 glyph ?-
1560−249:1 glyph ++
1563+249:16 glyph (
1561−249:4 name skip
1564+249:17 tight name predicate
1562−249:9 glyph |=
1565+249:27 name item
1563−249:12 name args
1566+249:31 tight glyph )
1564−249:16 tight glyph =
1567+250:15 INDENT
1565−249:17 tight glyph [
1568+250:15 lit %.y
1566−249:18 tight glyph (
1569+250:19 lit %.y
1567−249:19 tight name list
1570+251:15 NEWLINE
1568−249:24 tvar A
1571+251:15 lit %.n
1569−249:25 tight glyph )
1572+251:19 glyph (
1570−249:27 glyph $-(
1573+251:20 tight name lien
1571−249:30 tight tvar A
1574+251:25 name rest
1572−249:32 glyph ?
1575+251:30 name predicate
1573−249:33 tight glyph )
1576+251:39 tight glyph )
1574−249:34 tight glyph ]
1577+253:1 DEDENT
1575−250:3 INDENT
1578+253:1 DEDENT
1576−250:3 glyph ?-
1579+253:1 DEDENT
1577−250:6 name args
1580+253:1 DEDENT
1578−251:5 INDENT
1581+253:1 DEDENT
1579−251:5 glyph [
1582+253:1 DEDENT
1580−251:6 tight name xs
1583+253:1 DEDENT
1581−251:9 name predicate
1584+253:1 NEWLINE
1582−251:18 tight glyph ]
1585+253:1 glyph ++
1583−251:20 glyph ^-
1586+253:4 name roll
1584−251:23 glyph (
1587+253:9 glyph |=
1585−251:24 tight name list
1588+253:12 name args
1586−251:29 tvar A
1589+253:16 tight glyph =
1587−251:30 tight glyph )
1590+253:17 tight glyph [
1588−252:9 INDENT
1591+253:18 tight glyph (
1589−252:9 glyph ?-
1592+253:19 tight name list
1590−252:12 name xs
1593+253:24 tvar A
1591−253:11 INDENT
1594+253:25 tight glyph )
1592−253:11 lit ~
1595+253:27 tvar B
1593−253:13 lit ~
1596+253:29 glyph $-(
1594−254:11 NEWLINE
1597+253:32 tight glyph [
1595−254:11 glyph [
1598+253:33 tight tvar A
1596−254:12 tight name item
1599+253:35 tvar B
1597−254:17 name rest
1600+253:36 tight glyph ]
1598−254:21 tight glyph ]
1601+253:38 tvar B
1599−255:13 INDENT
1602+253:39 tight glyph )
1600−255:13 glyph ?-
1603+253:40 tight glyph ]
1601−255:16 glyph (
1604+254:3 INDENT
1602−255:17 tight name predicate
1605+254:3 glyph ?-
1603−255:27 name item
1606+254:6 name args
1604−255:31 tight glyph )
1607+255:5 INDENT
1605−256:15 INDENT
1608+255:5 glyph [
1606−256:15 lit %.y
1609+255:6 tight name xs
1607−256:19 glyph (
1610+255:9 name start
1608−256:20 tight name skip
1611+255:15 name combine
1609−256:25 name rest
1612+255:22 tight glyph ]
1610−256:30 name predicate
1613+256:7 INDENT
1611−256:39 tight glyph )
1614+256:7 glyph ?-
1612−257:15 NEWLINE
1615+256:10 name xs
1613−257:15 lit %.n
1616+257:9 INDENT
1614−257:19 glyph [
1617+257:9 lit ~
1615−257:20 tight name item
1618+257:11 name start
1616−257:25 glyph (
1619+258:9 NEWLINE
1617−257:26 tight name skip
1620+258:9 glyph [
1618−257:31 name rest
1621+258:10 tight name item
1619−257:36 name predicate
1622+258:15 name rest
1620−257:45 tight glyph )
1623+258:19 tight glyph ]
1621−257:46 tight glyph ]
1624+258:21 glyph (
1622−259:1 DEDENT
1625+258:22 tight name roll
1623−259:1 DEDENT
1626+258:27 name rest
1624−259:1 DEDENT
1627+258:32 glyph (
1625−259:1 DEDENT
1628+258:33 tight name combine
1626−259:1 DEDENT
1629+258:41 name item
1627−259:1 DEDENT
1630+258:46 name start
1628−259:1 NEWLINE
1631+258:51 tight glyph )
1629−259:1 glyph ++
1632+258:53 name combine
1630−259:4 name levy
1633+258:60 tight glyph )
1631−259:9 glyph |=
1634+260:1 DEDENT
1632−259:12 name args
1635+260:1 DEDENT
1633−259:16 tight glyph =
1636+260:1 DEDENT
1634−259:17 tight glyph [
1637+260:1 DEDENT
1635−259:18 tight glyph (
1638+260:1 NEWLINE
1636−259:19 tight name list
1639+260:1 glyph ++
1637−259:24 tvar A
1640+260:4 name reel
1638−259:25 tight glyph )
1641+260:9 glyph |=
1639−259:27 glyph $-(
1642+260:12 name args
1640−259:30 tight tvar A
1643+260:16 tight glyph =
1641−259:32 glyph ?
1644+260:17 tight glyph [
1642−259:33 tight glyph )
1645+260:18 tight glyph (
1643−259:34 tight glyph ]
1646+260:19 tight name list
1644−260:3 INDENT
1647+260:24 tvar A
1645−260:3 glyph ^-
1648+260:25 tight glyph )
1646−260:6 glyph ?
1649+260:27 tvar B
1647−261:5 INDENT
1650+260:29 glyph $-(
1648−261:5 glyph ?-
1651+260:32 tight glyph [
1649−261:8 name args
1652+260:33 tight tvar A
1650−262:7 INDENT
1653+260:35 tvar B
1651−262:7 glyph [
1654+260:36 tight glyph ]
1652−262:8 tight name xs
1655+260:38 tvar B
1653−262:11 name predicate
1656+260:39 tight glyph )
1654−262:20 tight glyph ]
1657+260:40 tight glyph ]
1655−263:9 INDENT
1658+261:3 INDENT
1656−263:9 glyph ?-
1659+261:3 glyph ?-
1657−263:12 name xs
1660+261:6 name args
1658−264:11 INDENT
1661+262:5 INDENT
1659−264:11 lit ~
1662+262:5 glyph [
1660−264:13 lit %.y
1663+262:6 tight name xs
1661−265:11 NEWLINE
1664+262:9 name start
1662−265:11 glyph [
1665+262:15 name combine
1663−265:12 tight name item
1666+262:22 tight glyph ]
1664−265:17 name rest
1667+263:7 INDENT
1665−265:21 tight glyph ]
1668+263:7 glyph ?-
1666−266:13 INDENT
1669+263:10 name xs
1667−266:13 glyph ?-
1670+264:9 INDENT
1668−266:16 glyph (
1671+264:9 lit ~
1669−266:17 tight name predicate
1672+264:11 name start
1670−266:27 name item
1673+265:9 NEWLINE
1671−266:31 tight glyph )
1674+265:9 glyph [
1672−267:15 INDENT
1675+265:10 tight name item
1673−267:15 lit %.y
1676+265:15 name rest
1674−267:19 glyph (
1677+265:19 tight glyph ]
1675−267:20 tight name levy
1678+265:21 glyph (
1676−267:25 name rest
1679+265:22 tight name combine
1677−267:30 name predicate
1680+265:30 name item
1678−267:39 tight glyph )
1681+265:35 glyph (
1679−268:15 NEWLINE
1682+265:36 tight name reel
1680−268:15 lit %.n
1683+265:41 name rest
1681−268:19 lit %.n
1684+265:46 name start
1682−270:1 DEDENT
1685+265:52 name combine
1683−270:1 DEDENT
1686+265:59 tight glyph )
1684−270:1 DEDENT
1687+265:60 tight glyph )
1685−270:1 DEDENT
1688+267:1 DEDENT
1686−270:1 DEDENT
1689+267:1 DEDENT
1687−270:1 DEDENT
1690+267:1 DEDENT
1688−270:1 DEDENT
1691+267:1 DEDENT
1689−270:1 NEWLINE
1692+267:1 NEWLINE
1690−270:1 glyph ++
1693+267:1 glyph ++
1691−270:4 name lien
1694+267:4 name flit
1692−270:9 glyph |=
1695+267:9 glyph |=
1693−270:12 name args
1696+267:12 name predicate
1694−270:16 tight glyph =
1697+267:21 tight glyph =
1695−270:17 tight glyph [
1698+267:22 tight glyph $-(
1696−270:18 tight glyph (
1699+267:25 tight tvar A
1697−270:19 tight name list
1700+267:27 glyph ?
1698−270:24 tvar A
1701+267:28 tight glyph )
1699−270:25 tight glyph )
1702+268:3 INDENT
1700−270:27 glyph $-(
1703+268:3 glyph |=
1701−270:30 tight tvar A
1704+268:6 name value
1702−270:32 glyph ?
1705+268:11 tight glyph =
1703−270:33 tight glyph )
1706+268:12 tight tvar A
1704−270:34 tight glyph ]
1707+269:5 INDENT
1705−271:3 INDENT
1708+269:5 glyph ^-
1706−271:3 glyph ^-
1709+269:8 glyph (
1707−271:6 glyph ?
1710+269:9 tight name unit
1708−272:5 INDENT
1711+269:14 tvar A
1709−272:5 glyph ?-
1712+269:15 tight glyph )
1710−272:8 name args
1713+270:7 INDENT
1711−273:7 INDENT
1714+270:7 glyph ?-
1712−273:7 glyph [
1715+270:10 glyph (
1713−273:8 tight name xs
1716+270:11 tight name predicate
1714−273:11 name predicate
1717+270:21 name value
1715−273:20 tight glyph ]
1718+270:26 tight glyph )
1716−274:9 INDENT
1719+271:9 INDENT
1717−274:9 glyph ?-
1720+271:9 lit %.y
1718−274:12 name xs
1721+271:13 glyph `
1719−275:11 INDENT
1722+271:14 tight name value
1720−275:11 lit ~
1723+272:9 NEWLINE
1721−275:13 lit %.n
1724+272:9 lit %.n
1722−276:11 NEWLINE
1725+272:13 lit ~
1723−276:11 glyph [
1726+274:1 DEDENT
1724−276:12 tight name item
1727+274:1 DEDENT
1725−276:17 name rest
1728+274:1 DEDENT
1726−276:21 tight glyph ]
1729+274:1 DEDENT
1727−277:13 INDENT
1730+274:1 NEWLINE
1728−277:13 glyph ?-
1731+274:1 glyph ++
1729−277:16 glyph (
1732+274:4 name murn
1730−277:17 tight name predicate
1733+274:9 glyph |=
1731−277:27 name item
1734+274:12 name args
1732−277:31 tight glyph )
1735+274:16 tight glyph =
1733−278:15 INDENT
1736+274:17 tight glyph [
1734−278:15 lit %.y
1737+274:18 tight glyph (
1735−278:19 lit %.y
1738+274:19 tight name list
1736−279:15 NEWLINE
1739+274:24 tvar A
1737−279:15 lit %.n
1740+274:25 tight glyph )
1738−279:19 glyph (
1741+274:27 glyph $-(
1739−279:20 tight name lien
1742+274:30 tight tvar A
1740−279:25 name rest
1743+274:32 glyph (
1741−279:30 name predicate
1744+274:33 tight name unit
1742−279:39 tight glyph )
1745+274:38 tvar B
1743−281:1 DEDENT
1746+274:39 tight glyph )
1744−281:1 DEDENT
1747+274:40 tight glyph )
1745−281:1 DEDENT
1748+274:41 tight glyph ]
1746−281:1 DEDENT
1749+275:3 INDENT
1747−281:1 DEDENT
1750+275:3 glyph ?-
1748−281:1 DEDENT
1751+275:6 name args
1749−281:1 DEDENT
1752+276:5 INDENT
1750−281:1 NEWLINE
1753+276:5 glyph [
1751−281:1 glyph ++
1754+276:6 tight name xs
1752−281:4 name roll
1755+276:9 name f
1753−281:9 glyph |=
1756+276:10 tight glyph ]
1754−281:12 name args
1757+276:12 glyph ^-
1755−281:16 tight glyph =
1758+276:15 glyph (
1756−281:17 tight glyph [
1759+276:16 tight name list
1757−281:18 tight glyph (
1760+276:21 tvar B
1758−281:19 tight name list
1761+276:22 tight glyph )
1759−281:24 tvar A
1762+277:9 INDENT
1760−281:25 tight glyph )
1763+277:9 glyph ?-
1761−281:27 tvar B
1764+277:12 name xs
1762−281:29 glyph $-(
1765+278:11 INDENT
1763−281:32 tight glyph [
1766+278:11 lit ~
1764−281:33 tight tvar A
1767+278:13 lit ~
1765−281:35 tvar B
1768+279:11 NEWLINE
1766−281:36 tight glyph ]
1769+279:11 glyph [
1767−281:38 tvar B
1770+279:12 tight name item
1768−281:39 tight glyph )
1771+279:17 name rest
1769−281:40 tight glyph ]
1772+279:21 tight glyph ]
1770−282:3 INDENT
1773+280:13 INDENT
1771−282:3 glyph ?-
1774+280:13 glyph ?-
1772−282:6 name args
1775+280:16 glyph (
1773−283:5 INDENT
1776+280:17 tight name f
1774−283:5 glyph [
1777+280:19 name item
1775−283:6 tight name xs
1778+280:23 tight glyph )
1776−283:9 name start
1779+281:15 INDENT
1777−283:15 name combine
1780+281:15 lit ~
1778−283:22 tight glyph ]
1781+281:17 glyph (
1779−284:7 INDENT
1782+281:18 tight name murn
1780−284:7 glyph ?-
1783+281:23 name rest
1781−284:10 name xs
1784+281:28 name f
1782−285:9 INDENT
1785+281:29 tight glyph )
1783−285:9 lit ~
1786+282:15 NEWLINE
1784−285:11 name start
1787+282:15 glyph [
1785−286:9 NEWLINE
1788+282:16 tight lit ~
1786−286:9 glyph [
1789+282:18 name value
1787−286:10 tight name item
1790+282:23 tight glyph ]
1788−286:15 name rest
1791+282:25 glyph [
1789−286:19 tight glyph ]
1792+282:26 tight name value
1790−286:21 glyph (
1793+282:32 glyph (
1791−286:22 tight name roll
1794+282:33 tight name murn
1792−286:27 name rest
1795+282:38 name rest
1793−286:32 glyph (
1796+282:43 name f
1794−286:33 tight name combine
1797+282:44 tight glyph )
1795−286:41 name item
1798+282:45 tight glyph ]
1796−286:46 name start
1799+284:1 DEDENT
1797−286:51 tight glyph )
1800+284:1 DEDENT
1798−286:53 name combine
1801+284:1 DEDENT
1799−286:60 tight glyph )
1802+284:1 DEDENT
1800−288:1 DEDENT
1803+284:1 DEDENT
1801−288:1 DEDENT
1804+284:1 DEDENT
1802−288:1 DEDENT
1805+284:1 NEWLINE
1803−288:1 DEDENT
1806+284:1 glyph ++
1804−288:1 NEWLINE
1807+284:4 name join
1805−288:1 glyph ++
1808+284:9 glyph |=
1806−288:4 name reel
1809+284:12 name args
1807−288:9 glyph |=
1810+284:16 tight glyph =
1808−288:12 name args
1811+284:17 tight glyph [
1809−288:16 tight glyph =
1812+284:18 tight tvar A
1810−288:17 tight glyph [
1813+284:20 glyph (
1811−288:18 tight glyph (
1814+284:21 tight name list
1812−288:19 tight name list
1815+284:26 tvar A
1813−288:24 tvar A
1816+284:27 tight glyph )
1814−288:25 tight glyph )
1817+284:28 tight glyph ]
1815−288:27 tvar B
1818+285:3 INDENT
1816−288:29 glyph $-(
1819+285:3 glyph ?-
1817−288:32 tight glyph [
1820+285:6 name args
1818−288:33 tight tvar A
1821+286:5 INDENT
1819−288:35 tvar B
1822+286:5 glyph [
1820−288:36 tight glyph ]
1823+286:6 tight name separator
1821−288:38 tvar B
1824+286:16 name xs
1822−288:39 tight glyph )
1825+286:18 tight glyph ]
1823−288:40 tight glyph ]
1826+286:20 glyph ^-
1824−289:3 INDENT
1827+286:23 glyph (
1825−289:3 glyph ?-
1828+286:24 tight name list
1826−289:6 name args
1829+286:29 tvar A
1827−290:5 INDENT
1830+286:30 tight glyph )
1828−290:5 glyph [
1831+287:9 INDENT
1829−290:6 tight name xs
1832+287:9 glyph ?-
1830−290:9 name start
1833+287:12 name xs
1831−290:15 name combine
1834+288:11 INDENT
1832−290:22 tight glyph ]
1835+288:11 lit ~
1833−291:7 INDENT
1836+288:13 lit ~
1834−291:7 glyph ?-
1837+289:11 NEWLINE
1835−291:10 name xs
1838+289:11 glyph [
1836−292:9 INDENT
1839+289:12 tight name item
1837−292:9 lit ~
1840+289:17 name rest
1838−292:11 name start
1841+289:21 tight glyph ]
1839−293:9 NEWLINE
1842+290:13 INDENT
1840−293:9 glyph [
1843+290:13 glyph ?-
1841−293:10 tight name item
1844+290:16 name rest
1842−293:15 name rest
1845+291:15 INDENT
1843−293:19 tight glyph ]
1846+291:15 lit ~
1844−293:21 glyph (
1847+291:17 glyph [
1845−293:22 tight name combine
1848+291:18 tight name item
1846−293:30 name item
1849+291:23 lit ~
1847−293:35 glyph (
1850+291:24 tight glyph ]
1848−293:36 tight name reel
1851+292:15 NEWLINE
1849−293:41 name rest
1852+292:15 glyph [
1850−293:46 name start
1853+292:16 tight name next
1851−293:52 name combine
1854+292:21 name more
1852−293:59 tight glyph )
1855+292:25 tight glyph ]
1853−293:60 tight glyph )
1856+292:27 glyph [
1854−295:1 DEDENT
1857+292:28 tight name item
1855−295:1 DEDENT
1858+292:33 glyph [
1856−295:1 DEDENT
1859+292:34 tight name separator
1857−295:1 DEDENT
1860+292:44 glyph (
1858−295:1 NEWLINE
1861+292:45 tight name join
1859−295:1 glyph ++
1862+292:50 name separator
1860−295:4 name flit
1863+292:60 name rest
1861−295:9 glyph |=
1864+292:64 tight glyph )
1862−295:12 name predicate
1865+292:65 tight glyph ]
1863−295:21 tight glyph =
1866+292:66 tight glyph ]
1864−295:22 tight glyph $-(
1867+294:1 DEDENT
1865−295:25 tight tvar A
1868+294:1 DEDENT
1866−295:27 glyph ?
1869+294:1 DEDENT
1867−295:28 tight glyph )
1870+294:1 DEDENT
1868−296:3 INDENT
1871+294:1 DEDENT
1869−296:3 glyph |=
1872+294:1 DEDENT
1870−296:6 name value
1873+294:1 NEWLINE
1871−296:11 tight glyph =
1874+294:1 glyph ++
1872−296:12 tight tvar A
1875+294:4 name snip
1873−297:5 INDENT
1876+294:9 glyph |=
1874−297:5 glyph ^-
1877+294:12 name xs
1875−297:8 glyph (
1878+294:14 tight glyph =
1876−297:9 tight name unit
1879+294:15 tight glyph (
1877−297:14 tvar A
1880+294:16 tight name list
1878−297:15 tight glyph )
1881+294:21 tvar A
1879−298:7 INDENT
1882+294:22 tight glyph )
1880−298:7 glyph ?-
1883+295:3 INDENT
1881−298:10 glyph (
1884+295:3 glyph ^-
1882−298:11 tight name predicate
1885+295:6 glyph (
1883−298:21 name value
1886+295:7 tight name list
1884−298:26 tight glyph )
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 ]
1885299:9 INDENT
1900299:9 INDENT
1886−299:9 lit %.y
1887−299:13 glyph `
1901+299:9 glyph ?-
1888−299:14 tight name value
1902+299:12 name rest
1889−300:9 NEWLINE
1903+300:11 INDENT
1890−300:9 lit %.n
1904+300:11 lit ~
1891300:13 lit ~
1905300:13 lit ~
1892−302:1 DEDENT
1893−302:1 DEDENT
1894−302:1 DEDENT
1895−302:1 DEDENT
1896−302:1 NEWLINE
1897−302:1 glyph ++
1898−302:4 name murn
1899−302:9 glyph |=
1900−302:12 name args
1901−302:16 tight glyph =
1902−302:17 tight glyph [
1903−302:18 tight glyph (
1904−302:19 tight name list
1905−302:24 tvar A
1906−302:25 tight glyph )
1907−302:27 glyph $-(
1908−302:30 tight tvar A
1909−302:32 glyph (
1910−302:33 tight name unit
1911−302:38 tvar B
1912−302:39 tight glyph )
1913−302:40 tight glyph )
1914−302:41 tight glyph ]
1915−303:3 INDENT
1916−303:3 glyph ?-
1917−303:6 name args
1918−304:5 INDENT
1919−304:5 glyph [
1920−304:6 tight name xs
1921−304:9 name f
1922−304:10 tight glyph ]
1923−304:12 glyph ^-
1924−304:15 glyph (
1925−304:16 tight name list
1926−304:21 tvar B
1927−304:22 tight glyph )
1928−305:9 INDENT
1929−305:9 glyph ?-
1930−305:12 name xs
1931−306:11 INDENT
1932−306:11 lit ~
1933−306:13 lit ~
1934−307:11 NEWLINE
1935−307:11 glyph [
1936−307:12 tight name item
1937−307:17 name rest
1938−307:21 tight glyph ]
1939−308:13 INDENT
1940−308:13 glyph ?-
1941−308:16 glyph (
1942−308:17 tight name f
1943−308:19 name item
1944−308:23 tight glyph )
1945−309:15 INDENT
1946−309:15 lit ~
1947−309:17 glyph (
1948−309:18 tight name murn
1949−309:23 name rest
1950−309:28 name f
1951−309:29 tight glyph )
1952−310:15 NEWLINE
1953−310:15 glyph [
1954−310:16 tight lit ~
1955−310:18 name value
1956−310:23 tight glyph ]
1957−310:25 glyph [
1958−310:26 tight name value
1959−310:32 glyph (
1960−310:33 tight name murn
1961−310:38 name rest
1962−310:43 name f
1963−310:44 tight glyph )
1964−310:45 tight glyph ]
1965−312:1 DEDENT
1966−312:1 DEDENT
1967−312:1 DEDENT
1968−312:1 DEDENT
1969−312:1 DEDENT
1970−312:1 DEDENT
1971−312:1 NEWLINE
1972−312:1 glyph ++
1973−312:4 name join
1974−312:9 glyph |=
1975−312:12 name args
1976−312:16 tight glyph =
1977−312:17 tight glyph [
1978−312:18 tight tvar A
1979−312:20 glyph (
1980−312:21 tight name list
1981−312:26 tvar A
1982−312:27 tight glyph )
1983−312:28 tight glyph ]
1984−313:3 INDENT
1985−313:3 glyph ?-
1986−313:6 name args
1987−314:5 INDENT
1988−314:5 glyph [
1989−314:6 tight name separator
1990−314:16 name xs
1991−314:18 tight glyph ]
1992−314:20 glyph ^-
1993−314:23 glyph (
1994−314:24 tight name list
1995−314:29 tvar A
1996−314:30 tight glyph )
1997−315:9 INDENT
1998−315:9 glyph ?-
1999−315:12 name xs
2000−316:11 INDENT
2001−316:11 lit ~
2002−316:13 lit ~
2003−317:11 NEWLINE
2004−317:11 glyph [
2005−317:12 tight name item
2006−317:17 name rest
2007−317:21 tight glyph ]
2008−318:13 INDENT
2009−318:13 glyph ?-
2010−318:16 name rest
2011−319:15 INDENT
2012−319:15 lit ~
2013−319:17 glyph [
2014−319:18 tight name item
2015−319:23 lit ~
2016−319:24 tight glyph ]
2017−320:15 NEWLINE
2018−320:15 glyph [
2019−320:16 tight name next
2020−320:21 name more
2021−320:25 tight glyph ]
2022−320:27 glyph [
2023−320:28 tight name item
2024−320:33 glyph [
2025−320:34 tight name separator
2026−320:44 glyph (
2027−320:45 tight name join
2028−320:50 name separator
2029−320:60 name rest
2030−320:64 tight glyph )
2031−320:65 tight glyph ]
2032−320:66 tight glyph ]
2033−322:1 DEDENT
2034−322:1 DEDENT
2035−322:1 DEDENT
2036−322:1 DEDENT
2037−322:1 DEDENT
2038−322:1 DEDENT
2039−322:1 NEWLINE
2040−322:1 glyph ++
2041−322:4 name snip
2042−322:9 glyph |=
2043−322:12 name xs
2044−322:14 tight glyph =
2045−322:15 tight glyph (
2046−322:16 tight name list
2047−322:21 tvar A
2048−322:22 tight glyph )
2049−323:3 INDENT
2050−323:3 glyph ^-
2051−323:6 glyph (
2052−323:7 tight name list
2053−323:12 tvar A
2054−323:13 tight glyph )
2055−324:5 INDENT
2056−324:5 glyph ?-
2057−324:8 name xs
2058−325:7 INDENT
2059−325:7 lit ~
2060−325:9 lit ~
2061−326:7 NEWLINE
2062−326:7 glyph [
2063−326:8 tight name item
2064−326:13 name rest
2065−326:17 tight glyph ]
2066−327:9 INDENT
2067−327:9 glyph ?-
2068−327:12 name rest
2069−328:11 INDENT
2070−328:11 lit ~
2071−328:13 lit ~
2072−329:11 NEWLINE
1906+301:11 NEWLINE
2073−329:11 glyph [
1907+301:11 glyph [
2074−329:12 tight name next
1908+301:12 tight name next
2075−329:17 name more
1909+301:17 name more
2076−329:21 tight glyph ]
1910+301:21 tight glyph ]
2077−329:23 glyph [
1911+301:23 glyph [
2078−329:24 tight name item
1912+301:24 tight name item
2079−329:29 glyph (
1913+301:29 glyph (
2080−329:30 tight name snip
1914+301:30 tight name snip
2081−329:35 name rest
1915+301:35 name rest
2082−329:39 tight glyph )
1916+301:39 tight glyph )
2083−329:40 tight glyph ]
1917+301:40 tight glyph ]
2084−331:1 DEDENT
1918+303:1 DEDENT
2085−331:1 DEDENT
1919+303:1 DEDENT
2086−331:1 DEDENT
1920+303:1 DEDENT
2087−331:1 DEDENT
1921+303:1 DEDENT
2088−331:1 DEDENT
1922+303:1 DEDENT
2089−331:1 NEWLINE
1923+303:1 NEWLINE
2090−331:1 glyph ++
1924+303:1 glyph ++
2091−331:4 name rear
1925+303:4 name rear
2092−331:9 glyph |=
1926+303:9 glyph |=
2093−331:12 name xs
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
2094331:14 tight glyph =
2151331:14 tight glyph =
2095−331:15 tight glyph (
2152+331:15 tight glyph $-(
2096−331:16 tight name list
2153+331:18 tight aura @da
2097−331:21 tvar A
2154+331:22 tvar M
2098−331:22 tight glyph )
2155+331:23 tight glyph )
2099−332:3 INDENT
2156+331:24 tight glyph ]
2157+332:3 NEWLINE
2100−332:3 glyph ?-
2158+332:3 glyph [
2159+332:4 tight lit %who
2101−332:6 name xs
2160+332:9 name reply
2102−333:5 INDENT
2161+332:14 tight glyph =
2103−333:5 lit ~
2162+332:15 tight glyph $-(
2163+332:18 tight aura @p
2164+332:21 tvar M
2104−333:7 glyph !!
2165+332:22 tight glyph )
2166+332:23 tight glyph ]
2167+334:1 DEDENT
2105−334:5 NEWLINE
2168+334:1 NEWLINE
2106−334:5 glyph [
2169+334:1 glyph ++
2107−334:6 tight name item
2170+334:4 name gth
2171+334:8 glyph |=
2108−334:11 name rest
2172+334:11 name args
2109−334:15 tight glyph ]
2173+334:15 tight glyph =
2110−335:7 INDENT
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
2111−335:7 glyph ?-
2181+334:45 tight glyph )
2112−335:10 name rest
2182+335:1 NEWLINE
2113−336:9 INDENT
2183+335:1 glyph ++
2114−336:9 lit ~
2184+335:4 name add
2185+335:8 glyph |=
2115−336:11 name item
2186+335:11 name args
2116−337:9 NEWLINE
2187+335:15 tight glyph =
2117−337:9 glyph [
2188+335:16 tight glyph [
2118−337:10 tight name next
2189+335:17 tight tvar A
2119−337:15 name more
2190+335:19 tvar A
2120−337:19 tight glyph ]
2191+335:20 tight glyph ]
2121−337:21 glyph (
2192+335:22 glyph (
2122−337:22 tight name rear
2193+335:23 tight wing add-atom.internal
2123−337:27 name rest
2194+335:41 name args
2124−337:31 tight glyph )
2195+335:45 tight glyph )
2125−339:1 DEDENT
2196+336:1 NEWLINE
2126−339:1 DEDENT
2197+336:1 glyph ++
2127−339:1 DEDENT
2198+336:4 name dec
2128−339:1 DEDENT
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 )
2129339:1 NEWLINE
2218339:1 NEWLINE
2130339:1 glyph ++
2219339:1 glyph ++
2131−339:4 name cork
2220+339:4 name pure
2132339:9 glyph |=
2221339:9 glyph |=
2133−339:12 name gates
2222+339:12 name x
2134−339:17 tight glyph =
2223+339:13 tight glyph =
2135−339:18 tight glyph [
2224+339:14 tight tvar M
2225+339:16 glyph ^-
2136−339:19 tight glyph $-(
2226+339:19 glyph (
2137−339:22 tight tvar A
2227+339:20 tight name ask
2138−339:24 tvar B
2228+339:24 tvar M
2139339:25 tight glyph )
2229339:25 tight glyph )
2140−339:27 glyph $-(
2230+339:27 glyph [
2141−339:30 tight tvar B
2142−339:32 tvar C
2143−339:33 tight glyph )
2144−339:34 tight glyph ]
2145−340:3 INDENT
2146−340:3 glyph ?-
2147−340:6 name gates
2148−341:5 INDENT
2149−341:5 glyph [
2150−341:6 tight name f
2151−341:8 name g
2152−341:9 tight glyph ]
2153−341:11 glyph |=
2154−341:14 name x
2155−341:15 tight glyph =
2156−341:16 tight tvar A
2157−341:18 glyph (
2158−341:19 tight name g
2159−341:21 glyph (
2160−341:22 tight name f
2161−341:24 name x
2162−341:25 tight glyph )
2163−341:26 tight glyph )
2164−343:1 DEDENT
2165−343:1 DEDENT
2166−343:1 NEWLINE
2167−343:1 glyph ++
2168−343:4 name corl
2169−343:9 glyph |=
2170−343:12 name gates
2171−343:17 tight glyph =
2172−343:18 tight glyph [
2173−343:19 tight glyph $-(
2174−343:22 tight tvar B
2175−343:24 tvar C
2176−343:25 tight glyph )
2177−343:27 glyph $-(
2178−343:30 tight tvar A
2179−343:32 tvar B
2180−343:33 tight glyph )
2181−343:34 tight glyph ]
2182−344:3 INDENT
2183−344:3 glyph ?-
2184−344:6 name gates
2185−345:5 INDENT
2186−345:5 glyph [
2187−345:6 tight name f
2188−345:8 name g
2189−345:9 tight glyph ]
2190−345:11 glyph |=
2191−345:14 name x
2192−345:15 tight glyph =
2193−345:16 tight tvar A
2194−345:18 glyph (
2195−345:19 tight name f
2196−345:21 glyph (
2197−345:22 tight name g
2198−345:24 name x
2199−345:25 tight glyph )
2200−345:26 tight glyph )
2201−347:1 DEDENT
2202−347:1 DEDENT
2203−347:1 NEWLINE
2204−347:1 glyph ++
2205−347:4 name cury
2206−347:9 glyph |=
2207−347:12 name args
2208−347:16 tight glyph =
2209−347:17 tight glyph [
2210−347:18 tight glyph $-(
2211−347:21 tight glyph [
2212−347:22 tight tvar A
2213−347:24 tvar B
2214−347:25 tight glyph ]
2215−347:27 tvar C
2216−347:28 tight glyph )
2231+339:28 tight lit %pure
2217−347:30 tvar A
2218−347:31 tight glyph ]
2219−348:3 INDENT
2220−348:3 glyph ?-
2221−348:6 name args
2222−349:5 INDENT
2223−349:5 glyph [
2224−349:6 tight name f
2225−349:8 name a
2226−349:9 tight glyph ]
2227−349:11 glyph |=
2228−349:14 name b
2229−349:15 tight glyph =
2230−349:16 tight tvar B
2231−349:18 glyph (
2232−349:19 tight name f
2233−349:21 name a
2234−349:23 name b
2235−349:24 tight glyph )
2236−351:1 DEDENT
2237−351:1 DEDENT
2238−351:1 NEWLINE
2239−351:1 glyph ++
2240−351:4 name curr
2241−351:9 glyph |=
2242−351:12 name args
2243−351:16 tight glyph =
2244−351:17 tight glyph [
2245−351:18 tight glyph $-(
2246−351:21 tight glyph [
2247−351:22 tight tvar A
2248−351:24 tvar B
2249−351:25 tight glyph ]
2250−351:27 tvar C
2251−351:28 tight glyph )
2252−351:30 tvar B
2253−351:31 tight glyph ]
2254−352:3 INDENT
2255−352:3 glyph ?-
2256−352:6 name args
2257−353:5 INDENT
2258−353:5 glyph [
2259−353:6 tight name f
2260−353:8 name b
2261−353:9 tight glyph ]
2262−353:11 glyph |=
2263−353:14 name a
2264−353:15 tight glyph =
2265−353:16 tight tvar A
2266−353:18 glyph (
2267−353:19 tight name f
2268−353:21 name a
2269−353:23 name b
2270−353:24 tight glyph )
2271−355:1 DEDENT
2272−355:1 DEDENT
2273−355:1 NEWLINE
2274−355:1 glyph +$
2275−355:4 name cmd
2276−355:8 glyph |$
2277−355:11 glyph [
2278−355:12 tight tvar M
2279−355:13 tight glyph ]
2280−356:3 INDENT
2281−356:3 glyph [
2282−356:4 tight lit %poke
2283−356:10 name p
2284−356:11 tight glyph =
2285−356:12 tight name raw-poke
2286−356:21 name reply
2287−356:26 tight glyph =
2288−356:27 tight glyph $-(
2289−356:30 tight glyph (
2290−356:31 tight name unit
2291−356:36 aura @t
2292−356:38 tight glyph )
2293−356:40 tvar M
2294−356:41 tight glyph )
2295−356:42 tight glyph ]
2296−357:3 NEWLINE
2297−357:3 glyph [
2298−357:4 tight lit %go
2299−357:8 name url
2300−357:11 tight glyph =
2301−357:12 tight aura @t
2302−357:14 tight glyph ]
2303−358:3 NEWLINE
2304−358:3 glyph [
2305−358:4 tight lit %wait
2306−358:10 name gap
2307−358:13 tight glyph =
2308−358:14 tight aura @dr
2309−358:18 name msg
2310−358:21 tight glyph =
2311−358:22 tight tvar M
2312−358:23 tight glyph ]
2313−359:3 NEWLINE
2314−359:3 glyph [
2315−359:4 tight lit %now
2316−359:9 name reply
2317−359:14 tight glyph =
2318−359:15 tight glyph $-(
2319−359:18 tight aura @da
2320−359:22 tvar M
2321−359:23 tight glyph )
2322−359:24 tight glyph ]
2323−360:3 NEWLINE
2324−360:3 glyph [
2325−360:4 tight lit %who
2326−360:9 name reply
2327−360:14 tight glyph =
2328−360:15 tight glyph $-(
2329−360:18 tight aura @p
2330−360:21 tvar M
2331−360:22 tight glyph )
2332−360:23 tight glyph ]
2333−362:1 DEDENT
2334−362:1 NEWLINE
2335−362:1 glyph ++
2336−362:4 name gth
2337−362:8 glyph |=
2338−362:11 name args
2339−362:15 tight glyph =
2340−362:16 tight glyph [
2341−362:17 tight tvar A
2342−362:19 tvar A
2343−362:20 tight glyph ]
2344−362:22 glyph (
2345−362:23 tight wing gth-atom.internal
2346−362:41 name args
2347−362:45 tight glyph )
2348−363:1 NEWLINE
2349−363:1 glyph ++
2350−363:4 name add
2351−363:8 glyph |=
2352−363:11 name args
2353−363:15 tight glyph =
2354−363:16 tight glyph [
2355−363:17 tight tvar A
2356−363:19 tvar A
2357−363:20 tight glyph ]
2358−363:22 glyph (
2359−363:23 tight wing add-atom.internal
2360−363:41 name args
2361−363:45 tight glyph )
2362−364:1 NEWLINE
2363−364:1 glyph ++
2364−364:4 name dec
2365−364:8 glyph |=
2366−364:11 name atom
2367−364:15 tight glyph =
2368−364:16 tight tvar A
2369−364:18 glyph (
2370−364:19 tight wing dec-atom.internal
2371−364:37 name atom
2372−364:41 tight glyph )
2373−366:1 NEWLINE
2374−366:1 glyph +$
2375−366:4 name ask
2376−366:8 glyph |$
2377−366:11 glyph [
2378−366:12 tight tvar M
2379−366:13 tight glyph ]
2380−366:15 glyph (
2381−366:16 tight wing ask.internal
2382−366:29 tvar M
2383−366:30 tight glyph )
2384−367:1 NEWLINE
2385−367:1 glyph ++
2386−367:4 name pure
2387−367:9 glyph |=
2388−367:12 name x
2389−367:13 tight glyph =
2390−367:14 tight tvar M
2391−367:16 glyph ^-
2392−367:19 glyph (
2393−367:20 tight name ask
2394−367:24 tvar M
2395−367:25 tight glyph )
2396−367:27 glyph [
2397−367:28 tight lit %pure
2398−367:34 name x
2232+339:34 name x
2399−367:35 tight glyph ]
2233+339:35 tight glyph ]
2400−367:36 NEWLINE
2234+339:36 NEWLINE
tests/golden/prelude-unit-list-transforms/tree.txt+924−995
@@ -1,6 +1,6 @@
1(module
1(module
2 (jibb 1:1 internal /lib/jibb/internal)
2 (jibb 1:1 internal /lib/jibb/internal)
3− (mold 2:1 raw-poke (ref 2:13 raw-poke.internal))
3+ (mold 2:1 poke (ref 2:9 poke.internal))
4 (mold 3:1 qath (ref 3:9 qath.internal))
4 (mold 3:1 qath (ref 3:9 qath.internal))
5 (value 7:1 same
5 (value 7:1 same
6 (gate 7:9
6 (gate 7:9
@@ -34,1010 +34,939 @@
34 (wing 18:6 b)
34 (wing 18:6 b)
35 (arm 19:5 (lit 19:5 %.y) (lit 19:9 %.n))
35 (arm 19:5 (lit 19:5 %.y) (lit 19:9 %.n))
36 (arm 20:5 (lit 20:5 %.n) (lit 20:9 %.y))))))
36 (arm 20:5 (lit 20:5 %.n) (lit 20:9 %.y))))))
37− (value 22:1 eq
38− (gate 22:7
39− (face 22:10 args
40− (cell 22:15 (tvar 22:16 A) (tvar 22:18 A)))
41− (group 22:21
42− (call 22:22 (wing 22:22 eq-data.internal) (wing 22:39 args)))))
43− (mold 24:1 list
37+ (mold 22:1 list
44− (generic 24:9 A
38+ (generic 22:9 A
45− (union 25:3
39+ (union 23:3
46− (const 25:3 ~)
40+ (const 23:3 ~)
47− (cell 26:3
41+ (cell 24:3
48− (face 26:4 i (tvar 26:6 A))
42+ (face 24:4 i (tvar 24:6 A))
49− (face 26:8 t
43+ (face 24:8 t
50− (apply 26:10 list (tvar 26:16 A)))))))
44+ (apply 24:10 list (tvar 24:16 A)))))))
51− (mold 28:1 unit
45+ (mold 26:1 unit
52− (generic 28:9 A
46+ (generic 26:9 A
53− (union 29:3
47+ (union 27:3
54− (const 29:3 ~)
48+ (const 27:3 ~)
55− (cell 30:3
49+ (cell 28:3
56− (const 30:4 ~)
50+ (const 28:4 ~)
57− (face 30:6 u (tvar 30:8 A))))))
51+ (face 28:6 u (tvar 28:8 A))))))
58− (value 32:1 fall
52+ (value 30:1 fall
59− (gate 32:9
53+ (gate 30:9
60− (face 32:12 args
54+ (face 30:12 args
61− (cell 32:17
55+ (cell 30:17
62− (apply 32:18 unit (tvar 32:24 A))
56+ (apply 30:18 unit (tvar 30:24 A))
63− (tvar 32:27 A)))
57+ (tvar 30:27 A)))
64− (body 33:3
58+ (body 31:3
65− (branch 33:3
59+ (branch 31:3
66− (wing 33:6 args)
60+ (wing 31:6 args)
67− (arm 34:5
61+ (arm 32:5
68− (cell 34:5 (bind 34:6 maybe) (bind 34:12 fallback))
62+ (cell 32:5 (bind 32:6 maybe) (bind 32:12 fallback))
69− (body 35:7
63+ (body 33:7
70− (branch 35:7
64+ (branch 33:7
71− (wing 35:10 maybe)
65+ (wing 33:10 maybe)
72− (arm 36:9 (lit 36:9 ~) (wing 36:11 fallback))
66+ (arm 34:9 (lit 34:9 ~) (wing 34:11 fallback))
73− (arm 37:9
67+ (arm 35:9
74− (cell 37:9 (lit 37:10 ~) (bind 37:12 value))
68+ (cell 35:9 (lit 35:10 ~) (bind 35:12 value))
75− (wing 37:19 value)))))))))
69+ (wing 35:19 value)))))))))
76− (value 39:1 need
70+ (value 37:1 need
77− (gate 39:9
71+ (gate 37:9
78− (face 39:12 maybe
72+ (face 37:12 maybe
79− (apply 39:18 unit (tvar 39:24 A)))
73+ (apply 37:18 unit (tvar 37:24 A)))
80− (body 40:3
74+ (body 38:3
81− (branch 40:3
75+ (branch 38:3
82− (wing 40:6 maybe)
76+ (wing 38:6 maybe)
83− (arm 41:5 (lit 41:5 ~) (crash 41:7))
77+ (arm 39:5 (lit 39:5 ~) (crash 39:7))
84− (arm 42:5
78+ (arm 40:5
85− (cell 42:5 (lit 42:6 ~) (bind 42:8 value))
79+ (cell 40:5 (lit 40:6 ~) (bind 40:8 value))
86− (wing 42:15 value))))))
80+ (wing 40:15 value))))))
87− (value 44:1 weld
81+ (value 42:1 weld
88− (gate 44:9
82+ (gate 42:9
89− (face 44:12 args
83+ (face 42:12 args
90− (cell 44:17
84+ (cell 42:17
91− (apply 44:18 list (tvar 44:24 A))
85+ (apply 42:18 list (tvar 42:24 A))
92− (apply 44:27 list (tvar 44:33 A))))
86+ (apply 42:27 list (tvar 42:33 A))))
93− (body 45:3
87+ (body 43:3
94− (branch 45:3
88+ (branch 43:3
95− (wing 45:6 args)
89+ (wing 43:6 args)
96− (arm 46:5
90+ (arm 44:5
97− (cell 46:5 (bind 46:6 xs) (bind 46:9 ys))
91+ (cell 44:5 (bind 44:6 xs) (bind 44:9 ys))
98− (body 47:7
92+ (body 45:7
99− (cast 47:7
93+ (cast 45:7
100− (apply 47:10 list (tvar 47:16 A))
94+ (apply 45:10 list (tvar 45:16 A))
101− (body 48:9
95+ (body 46:9
102− (branch 48:9
96+ (branch 46:9
103− (wing 48:12 xs)
97+ (wing 46:12 xs)
104− (arm 49:11 (lit 49:11 ~) (wing 49:13 ys))
98+ (arm 47:11 (lit 47:11 ~) (wing 47:13 ys))
105− (arm 50:11
99+ (arm 48:11
106− (cell 50:11 (bind 50:12 item) (bind 50:17 rest))
100+ (cell 48:11 (bind 48:12 item) (bind 48:17 rest))
107− (tuple 50:23
101+ (tuple 48:23
108− (wing 50:24 item)
102+ (wing 48:24 item)
109− (group 50:29
103+ (group 48:29
110− (call 50:30 (wing 50:30 weld) (wing 50:35 rest) (wing 50:40 ys))))))))))))))
104+ (call 48:30 (wing 48:30 weld) (wing 48:35 rest) (wing 48:40 ys))))))))))))))
111− (value 52:1 turn
105+ (value 50:1 turn
112− (gate 52:9
106+ (gate 50:9
113− (face 52:12 args
107+ (face 50:12 args
114− (cell 52:17
108+ (cell 50:17
115− (apply 52:18 list (tvar 52:24 A))
109+ (apply 50:18 list (tvar 50:24 A))
116− (fn 52:27 (tvar 52:30 A) (tvar 52:32 B))))
110+ (fn 50:27 (tvar 50:30 A) (tvar 50:32 B))))
117− (body 53:3
111+ (body 51:3
118− (branch 53:3
112+ (branch 51:3
119− (wing 53:6 args)
113+ (wing 51:6 args)
120− (arm 54:5
114+ (arm 52:5
121− (cell 54:5 (bind 54:6 xs) (bind 54:9 f))
115+ (cell 52:5 (bind 52:6 xs) (bind 52:9 f))
122− (body 55:7
116+ (body 53:7
123− (cast 55:7
117+ (cast 53:7
124− (apply 55:10 list (tvar 55:16 B))
118+ (apply 53:10 list (tvar 53:16 B))
125− (body 56:9
119+ (body 54:9
126− (branch 56:9
120+ (branch 54:9
127− (wing 56:12 xs)
121+ (wing 54:12 xs)
128− (arm 57:11 (lit 57:11 ~) (lit 57:13 ~))
122+ (arm 55:11 (lit 55:11 ~) (lit 55:13 ~))
129− (arm 58:11
123+ (arm 56:11
130− (cell 58:11 (bind 58:12 item) (bind 58:17 rest))
124+ (cell 56:11 (bind 56:12 item) (bind 56:17 rest))
131− (tuple 58:23
125+ (tuple 56:23
132− (group 58:24
126+ (group 56:24
133− (call 58:25 (wing 58:25 f) (wing 58:27 item)))
127+ (call 56:25 (wing 56:25 f) (wing 56:27 item)))
134− (group 58:33
128+ (group 56:33
135− (call 58:34 (wing 58:34 turn) (wing 58:39 rest) (wing 58:44 f))))))))))))))
129+ (call 56:34 (wing 56:34 turn) (wing 56:39 rest) (wing 56:44 f))))))))))))))
136− (mold 60:1 dime
130+ (mold 58:1 dime
131+ (cell 58:9
132+ (face 58:10 p (aura 58:12 @ta))
133+ (face 58:16 q (aura 58:18 @))))
134+ (mold 60:1 hair
137 (cell 60:9
135 (cell 60:9
138− (face 60:10 p (aura 60:12 @ta))
136+ (face 60:10 p (aura 60:12 @ud))
139− (face 60:16 q (aura 60:18 @))))
137+ (face 60:16 q (aura 60:18 @ud))))
140− (mold 62:1 hair
138+ (mold 62:1 pint
141 (cell 62:9
139 (cell 62:9
142− (face 62:10 p (aura 62:12 @ud))
140+ (face 62:10 p
143− (face 62:16 q (aura 62:18 @ud))))
144− (mold 64:1 pint
145− (cell 64:9
146− (face 64:10 p
147− (cell 64:12
141+ (cell 62:12
148− (face 64:13 p (aura 64:15 @))
142+ (face 62:13 p (aura 62:15 @))
149− (face 64:17 q (aura 64:19 @))))
143+ (face 62:17 q (aura 62:19 @))))
150− (face 64:22 q
144+ (face 62:22 q
151− (cell 64:24
145+ (cell 62:24
152− (face 64:25 p (aura 64:27 @))
146+ (face 62:25 p (aura 62:27 @))
153− (face 64:29 q (aura 64:31 @))))))
147+ (face 62:29 q (aura 62:31 @))))))
154− (mold 66:1 coin
148+ (mold 64:1 coin
155− (union 67:3
149+ (union 65:3
150+ (cell 65:3
151+ (const 65:4 %$)
152+ (face 65:7 p (ref 65:9 dime)))
153+ (cell 66:3
154+ (const 66:4 %blob)
155+ (face 66:10 p (noun 66:12)))
156 (cell 67:3
156 (cell 67:3
157− (const 67:4 %$)
157+ (const 67:4 %many)
158− (face 67:7 p (ref 67:9 dime)))
159− (cell 68:3
160− (const 68:4 %blob)
161− (face 68:10 p (noun 68:12)))
162− (cell 69:3
163− (const 69:4 %many)
164− (face 69:10 p
158+ (face 67:10 p
165− (apply 69:12 list (ref 69:18 coin))))))
159+ (apply 67:12 list (ref 67:18 coin))))))
166− (mold 71:1 pair
160+ (mold 69:1 pair
167− (generic 71:9 A B
161+ (generic 69:9 A B
168− (cell 71:18
162+ (cell 69:18
169− (face 71:19 p (tvar 71:21 A))
163+ (face 69:19 p (tvar 69:21 A))
170− (face 71:23 q (tvar 71:25 B)))))
164+ (face 69:23 q (tvar 69:25 B)))))
171− (mold 73:1 trel
165+ (mold 71:1 trel
172− (generic 73:9 A B C
166+ (generic 71:9 A B C
173− (cell 73:20
167+ (cell 71:20
174− (face 73:21 p (tvar 73:23 A))
168+ (face 71:21 p (tvar 71:23 A))
175− (face 73:25 q (tvar 73:27 B))
169+ (face 71:25 q (tvar 71:27 B))
176− (face 73:29 r (tvar 73:31 C)))))
170+ (face 71:29 r (tvar 71:31 C)))))
177− (mold 75:1 qual
171+ (mold 73:1 qual
178− (generic 75:9 A B C D
172+ (generic 73:9 A B C D
179− (cell 75:22
173+ (cell 73:22
180− (face 75:23 p (tvar 75:25 A))
174+ (face 73:23 p (tvar 73:25 A))
181− (face 75:27 q (tvar 75:29 B))
175+ (face 73:27 q (tvar 73:29 B))
182− (face 75:31 r (tvar 75:33 C))
176+ (face 73:31 r (tvar 73:33 C))
183− (face 75:35 s (tvar 75:37 D)))))
177+ (face 73:35 s (tvar 73:37 D)))))
184− (mold 77:1 cord (aura 77:9 @t))
178+ (mold 75:1 cord (aura 75:9 @t))
185− (mold 79:1 knot (aura 79:9 @ta))
179+ (mold 77:1 knot (aura 77:9 @ta))
186− (mold 81:1 tape
180+ (mold 79:1 tape
187− (apply 81:9 list (aura 81:15 @tD)))
181+ (apply 79:9 list (aura 79:15 @tD)))
188− (mold 83:1 path
182+ (mold 81:1 path
189− (apply 83:9 list (ref 83:15 knot)))
183+ (apply 81:9 list (ref 81:15 knot)))
190− (mold 85:1 tank
184+ (mold 83:1 tank
191− (union 86:3
185+ (union 84:3
192− (ref 86:3 cord)
186+ (ref 84:3 cord)
187+ (cell 85:3
188+ (const 85:4 %leaf)
189+ (face 85:10 p (ref 85:12 tape)))
190+ (cell 86:3
191+ (const 86:4 %palm)
192+ (face 86:10 p
193+ (apply 86:12 qual (ref 86:18 tape) (ref 86:23 tape) (ref 86:28 tape) (ref 86:33 tape)))
194+ (face 86:39 q
195+ (apply 86:41 list (ref 86:47 tank))))
193 (cell 87:3
196 (cell 87:3
194− (const 87:4 %leaf)
197+ (const 87:4 %rose)
195− (face 87:10 p (ref 87:12 tape)))
196− (cell 88:3
197− (const 88:4 %palm)
198− (face 88:10 p
199− (apply 88:12 qual (ref 88:18 tape) (ref 88:23 tape) (ref 88:28 tape) (ref 88:33 tape)))
200− (face 88:39 q
201− (apply 88:41 list (ref 88:47 tank))))
202− (cell 89:3
203− (const 89:4 %rose)
204− (face 89:10 p
198+ (face 87:10 p
205− (apply 89:12 trel (ref 89:18 tape) (ref 89:23 tape) (ref 89:28 tape)))
199+ (apply 87:12 trel (ref 87:18 tape) (ref 87:23 tape) (ref 87:28 tape)))
206− (face 89:34 q
200+ (face 87:34 q
207− (apply 89:36 list (ref 89:42 tank))))))
201+ (apply 87:36 list (ref 87:42 tank))))))
208− (mold 91:1 nail
202+ (mold 89:1 nail
203+ (cell 89:9
204+ (face 89:10 p (ref 89:12 hair))
205+ (face 89:17 q (ref 89:19 tape))))
206+ (mold 91:1 edge
209 (cell 91:9
207 (cell 91:9
210 (face 91:10 p (ref 91:12 hair))
208 (face 91:10 p (ref 91:12 hair))
211− (face 91:17 q (ref 91:19 tape))))
209+ (face 91:17 q
212− (mold 93:1 edge
213− (cell 93:9
214− (face 93:10 p (ref 93:12 hair))
215− (face 93:17 q
216− (apply 93:19 unit
210+ (apply 91:19 unit
217− (cell 93:25
211+ (cell 91:25
218− (face 93:26 p (noun 93:28))
212+ (face 91:26 p (noun 91:28))
219− (face 93:30 q (ref 93:32 nail)))))))
213+ (face 91:30 q (ref 91:32 nail)))))))
220− (mold 95:1 rule
214+ (mold 93:1 rule
221− (fn 95:9 (ref 95:12 nail) (ref 95:17 edge)))
215+ (fn 93:9 (ref 93:12 nail) (ref 93:17 edge)))
222− (mold 97:1 spot
216+ (mold 95:1 spot
223− (cell 97:9
217+ (cell 95:9
224− (face 97:10 p (ref 97:12 path))
218+ (face 95:10 p (ref 95:12 path))
225− (face 97:17 q (ref 97:19 pint))))
219+ (face 95:17 q (ref 95:19 pint))))
226− (mold 99:1 toon
220+ (mold 97:1 toon
227− (union 100:3
221+ (union 98:3
222+ (cell 98:3
223+ (const 98:4 %0)
224+ (face 98:7 p (noun 98:9)))
225+ (cell 99:3
226+ (const 99:4 %1)
227+ (face 99:7 p (noun 99:9)))
228 (cell 100:3
228 (cell 100:3
229− (const 100:4 %0)
229+ (const 100:4 %2)
230− (face 100:7 p (noun 100:9)))
231− (cell 101:3
232− (const 101:4 %1)
233− (face 101:7 p (noun 101:9)))
234− (cell 102:3
235− (const 102:4 %2)
236− (face 102:7 p
230+ (face 100:7 p
237− (apply 102:9 list (ref 102:15 tank))))))
231+ (apply 100:9 list (ref 100:15 tank))))))
238− (mold 104:1 like
232+ (mold 102:1 like
239− (generic 104:9 A
233+ (generic 102:9 A
240− (cell 104:16
234+ (cell 102:16
241− (face 104:17 p (ref 104:19 hair))
235+ (face 102:17 p (ref 102:19 hair))
242− (face 104:24 q
236+ (face 102:24 q
243− (apply 104:26 unit
237+ (apply 102:26 unit
244− (cell 104:32
238+ (cell 102:32
245− (face 104:33 p (tvar 104:35 A))
239+ (face 102:33 p (tvar 102:35 A))
246− (face 104:37 q (ref 104:39 nail))))))))
240+ (face 102:37 q (ref 102:39 nail))))))))
247− (value 106:1 like
241+ (value 104:1 like
248− (gate 106:9
242+ (gate 104:9
249− (cell 106:12
243+ (cell 104:12
250− (face 106:13 f
244+ (face 104:13 f
251− (fn 106:15 (tvar 106:18 A) (tvar 106:20 B)))
245+ (fn 104:15 (tvar 104:18 A) (tvar 104:20 B)))
252− (face 106:23 result
246+ (face 104:23 result
253− (apply 106:30 like (tvar 106:36 A))))
247+ (apply 104:30 like (tvar 104:36 A))))
254− (body 107:3
248+ (body 105:3
255− (value 107:3 mapped
249+ (value 105:3 mapped
256− (body 108:5
250+ (body 106:5
257− (cast 108:5
251+ (cast 106:5
258− (apply 108:8 unit
252+ (apply 106:8 unit
259− (cell 108:14
253+ (cell 106:14
260− (face 108:15 p (tvar 108:17 B))
254+ (face 106:15 p (tvar 106:17 B))
261− (face 108:19 q (ref 108:21 nail))))
255+ (face 106:19 q (ref 106:21 nail))))
262− (body 109:7
256+ (body 107:7
263− (branch 109:7
257+ (branch 107:7
264− (wing 109:10 q.result)
258+ (wing 107:10 q.result)
265− (arm 110:9 (lit 110:9 ~) (lit 110:11 ~))
259+ (arm 108:9 (lit 108:9 ~) (lit 108:11 ~))
266− (arm 111:9
260+ (arm 109:9
267− (cell 111:9 (lit 111:10 ~) (bind 111:12 value))
261+ (cell 109:9 (lit 109:10 ~) (bind 109:12 value))
268− (unit 111:19
262+ (unit 109:19
269− (tuple 111:20
263+ (tuple 109:20
270− (face 111:21 p
264+ (face 109:21 p
271− (group 111:23
265+ (group 109:23
272− (call 111:24 (wing 111:24 f) (wing 111:26 p.value))))
266+ (call 109:24 (wing 109:24 f) (wing 109:26 p.value))))
273− (face 111:35 q (wing 111:37 q.value))))))))))
267+ (face 109:35 q (wing 109:37 q.value))))))))))
274− (cast 112:3
268+ (cast 110:3
275− (apply 112:6 like (tvar 112:12 B))
269+ (apply 110:6 like (tvar 110:12 B))
276− (tuple 112:15
270+ (tuple 110:15
277− (face 112:16 p (wing 112:18 p.result))
271+ (face 110:16 p (wing 110:18 p.result))
278− (face 112:27 q (wing 112:29 mapped)))))))
272+ (face 110:27 q (wing 110:29 mapped)))))))
279− (value 114:1 wonk
273+ (value 112:1 wonk
280− (gate 114:9
274+ (gate 112:9
281− (face 114:12 veq
275+ (face 112:12 veq
282− (apply 114:16 like (tvar 114:22 A)))
276+ (apply 112:16 like (tvar 112:22 A)))
283− (body 115:3
277+ (body 113:3
284− (branch 115:3
278+ (branch 113:3
285− (wing 115:6 q.veq)
279+ (wing 113:6 q.veq)
286− (arm 116:5 (lit 116:5 ~) (crash 116:7))
280+ (arm 114:5 (lit 114:5 ~) (crash 114:7))
287− (arm 117:5
281+ (arm 115:5
288− (cell 117:5 (lit 117:6 ~) (bind 117:8 product))
282+ (cell 115:5 (lit 115:6 ~) (bind 115:8 product))
289− (wing 117:17 p.product))))))
283+ (wing 115:17 p.product))))))
290− (mold 119:1 lone
284+ (mold 117:1 lone
285+ (generic 117:9 A
286+ (cell 117:16
287+ (face 117:17 p (tvar 117:19 A)))))
288+ (mold 119:1 lest
291 (generic 119:9 A
289 (generic 119:9 A
292 (cell 119:16
290 (cell 119:16
293− (face 119:17 p (tvar 119:19 A)))))
291+ (face 119:17 i (tvar 119:19 A))
292+ (face 119:21 t
293+ (apply 119:23 list (tvar 119:29 A))))))
294− (mold 121:1 lest
294+ (mold 121:1 pole
295 (generic 121:9 A
295 (generic 121:9 A
296− (cell 121:16
297− (face 121:17 i (tvar 121:19 A))
298− (face 121:21 t
299− (apply 121:23 list (tvar 121:29 A))))))
300− (mold 123:1 pole
301− (generic 123:9 A
302− (union 124:3
296+ (union 122:3
303− (const 124:3 ~)
297+ (const 122:3 ~)
304− (cell 125:3
298+ (cell 123:3
305− (tvar 125:4 A)
299+ (tvar 123:4 A)
306− (apply 125:6 pole (tvar 125:12 A))))))
300+ (apply 123:6 pole (tvar 123:12 A))))))
307− (mold 127:1 quip
301+ (mold 125:1 quip
308− (generic 127:9 A B
302+ (generic 125:9 A B
309− (cell 127:18
303+ (cell 125:18
310− (apply 127:19 list (tvar 127:25 A))
304+ (apply 125:19 list (tvar 125:25 A))
311− (tvar 127:28 B))))
305+ (tvar 125:28 B))))
312− (mold 129:1 tree
306+ (mold 127:1 tree
313− (generic 129:9 A
307+ (generic 127:9 A
314− (union 130:3
308+ (union 128:3
315− (const 130:3 ~)
309+ (const 128:3 ~)
316− (cell 131:3
310+ (cell 129:3
317− (face 131:4 n (tvar 131:6 A))
311+ (face 129:4 n (tvar 129:6 A))
318− (face 131:8 l
312+ (face 129:8 l
319− (apply 131:10 tree (tvar 131:16 A)))
313+ (apply 129:10 tree (tvar 129:16 A)))
320− (face 131:19 r
314+ (face 129:19 r
321− (apply 131:21 tree (tvar 131:27 A)))))))
315+ (apply 129:21 tree (tvar 129:27 A)))))))
322− (mold 133:1 each
316+ (mold 131:1 each
323− (generic 133:9 A B
317+ (generic 131:9 A B
324− (union 134:3
318+ (union 132:3
325− (cell 134:3
319+ (cell 132:3
326− (const 134:4 %|)
320+ (const 132:4 %|)
327− (face 134:7 p (tvar 134:9 B)))
321+ (face 132:7 p (tvar 132:9 B)))
328− (cell 135:3
322+ (cell 133:3
329− (const 135:4 %&)
323+ (const 133:4 %&)
330− (face 135:7 p (tvar 135:9 A))))))
324+ (face 133:7 p (tvar 133:9 A))))))
331− (mold 137:1 bloq (aura 137:9 @))
325+ (mold 135:1 bloq (aura 135:9 @))
332− (value 139:1 some
326+ (value 137:1 some
327+ (gate 137:9
328+ (face 137:12 item (tvar 137:17 A))
329+ (unit 137:19 (wing 137:20 item))))
330+ (value 139:1 lure
333 (gate 139:9
331 (gate 139:9
334 (face 139:12 item (tvar 139:17 A))
332 (face 139:12 item (tvar 139:17 A))
335− (unit 139:19 (wing 139:20 item))))
333+ (body 140:3
336− (value 141:1 lure
334+ (cast 140:3
337− (gate 141:9
335+ (apply 140:6 list (tvar 140:12 A))
338− (face 141:12 item (tvar 141:17 A))
336+ (tuple 140:15 (wing 140:16 item) (lit 140:21 ~))))))
339− (body 142:3
337+ (value 142:1 snoc
340− (cast 142:3
338+ (gate 142:9
341− (apply 142:6 list (tvar 142:12 A))
339+ (face 142:12 args
342− (tuple 142:15 (wing 142:16 item) (lit 142:21 ~))))))
340+ (cell 142:17
343− (value 144:1 snoc
341+ (apply 142:18 list (tvar 142:24 A))
344− (gate 144:9
342+ (tvar 142:27 A)))
345− (face 144:12 args
343+ (body 143:3
346− (cell 144:17
344+ (branch 143:3
347− (apply 144:18 list (tvar 144:24 A))
345+ (wing 143:6 args)
348− (tvar 144:27 A)))
346+ (arm 144:5
349− (body 145:3
347+ (cell 144:5 (bind 144:6 xs) (bind 144:9 item))
350− (branch 145:3
348+ (group 144:15
351− (wing 145:6 args)
349+ (call 144:16
352− (arm 146:5
350+ (wing 144:16 weld)
353− (cell 146:5 (bind 146:6 xs) (bind 146:9 item))
351+ (wing 144:21 xs)
354− (group 146:15
352+ (tuple 144:24 (wing 144:25 item) (lit 144:30 ~)))))))))
355− (call 146:16
353+ (value 146:1 flop
356− (wing 146:16 weld)
354+ (gate 146:9
357− (wing 146:21 xs)
355+ (face 146:12 xs
358− (tuple 146:24 (wing 146:25 item) (lit 146:30 ~)))))))))
356+ (apply 146:15 list (tvar 146:21 A)))
359− (value 148:1 flop
357+ (body 147:3
360− (gate 148:9
358+ (value 147:3 reverse-into
361− (face 148:12 xs
359+ (gate 147:19
362− (apply 148:15 list (tvar 148:21 A)))
360+ (face 147:22 args
363− (body 149:3
361+ (cell 147:27
364− (value 149:3 reverse-into
362+ (apply 147:28 list (tvar 147:34 A))
365− (gate 149:19
363+ (apply 147:37 list (tvar 147:43 A))))
366− (face 149:22 args
364+ (body 148:5
367− (cell 149:27
365+ (branch 148:5
368− (apply 149:28 list (tvar 149:34 A))
366+ (wing 148:8 args)
369− (apply 149:37 list (tvar 149:43 A))))
367+ (arm 149:7
370− (body 150:5
368+ (cell 149:7 (bind 149:8 rest) (bind 149:13 acc))
371− (branch 150:5
369+ (body 150:9
372− (wing 150:8 args)
370+ (branch 150:9
373− (arm 151:7
371+ (wing 150:12 rest)
374− (cell 151:7 (bind 151:8 rest) (bind 151:13 acc))
372+ (arm 151:11 (lit 151:11 ~) (wing 151:13 acc))
375− (body 152:9
373+ (arm 152:11
376− (branch 152:9
374+ (cell 152:11 (bind 152:12 item) (bind 152:17 more))
377− (wing 152:12 rest)
375+ (group 152:23
378− (arm 153:11 (lit 153:11 ~) (wing 153:13 acc))
376+ (call 152:24
379− (arm 154:11
377+ (wing 152:24 reverse-into)
380− (cell 154:11 (bind 154:12 item) (bind 154:17 more))
378+ (wing 152:37 more)
381− (group 154:23
379+ (tuple 152:42 (wing 152:43 item) (wing 152:48 acc))))))))))))
382− (call 154:24
380+ (group 153:3
383− (wing 154:24 reverse-into)
381+ (call 153:4 (wing 153:4 reverse-into) (wing 153:17 xs) (lit 153:20 ~))))))
384− (wing 154:37 more)
382+ (value 155:1 drop
385− (tuple 154:42 (wing 154:43 item) (wing 154:48 acc))))))))))))
383+ (gate 155:9
386− (group 155:3
384+ (face 155:12 maybe
387− (call 155:4 (wing 155:4 reverse-into) (wing 155:17 xs) (lit 155:20 ~))))))
385+ (apply 155:18 unit (tvar 155:24 A)))
388− (value 157:1 drop
386+ (body 156:3
389− (gate 157:9
387+ (cast 156:3
390− (face 157:12 maybe
388+ (apply 156:6 list (tvar 156:12 A))
391− (apply 157:18 unit (tvar 157:24 A)))
389+ (body 157:5
392− (body 158:3
390+ (branch 157:5
393− (cast 158:3
391+ (wing 157:8 maybe)
394− (apply 158:6 list (tvar 158:12 A))
392+ (arm 158:7 (lit 158:7 ~) (lit 158:9 ~))
395− (body 159:5
393+ (arm 159:7
396− (branch 159:5
394+ (cell 159:7 (lit 159:8 ~) (bind 159:10 value))
397− (wing 159:8 maybe)
395+ (tuple 159:17 (wing 159:18 value) (lit 159:24 ~)))))))))
398− (arm 160:7 (lit 160:7 ~) (lit 160:9 ~))
396+ (value 161:1 bond
399− (arm 161:7
397+ (gate 161:9
400− (cell 161:7 (lit 161:8 ~) (bind 161:10 value))
398+ (face 161:12 fallback
401− (tuple 161:17 (wing 161:18 value) (lit 161:24 ~)))))))))
399+ (fn 161:21 (const 161:24 ~) (tvar 161:26 A)))
402− (value 163:1 bond
400+ (body 162:3
403− (gate 163:9
401+ (gate 162:3
404− (face 163:12 fallback
402+ (face 162:6 maybe
405− (fn 163:21 (const 163:24 ~) (tvar 163:26 A)))
403+ (apply 162:12 unit (tvar 162:18 A)))
406− (body 164:3
404+ (body 163:5
407− (gate 164:3
405+ (branch 163:5
408− (face 164:6 maybe
406+ (wing 163:8 maybe)
409− (apply 164:12 unit (tvar 164:18 A)))
407+ (arm 164:7
410− (body 165:5
408+ (lit 164:7 ~)
411− (branch 165:5
409+ (group 164:9
412− (wing 165:8 maybe)
410+ (call 164:10 (wing 164:10 fallback) (lit 164:19 ~))))
413− (arm 166:7
411+ (arm 165:7
414− (lit 166:7 ~)
412+ (cell 165:7 (lit 165:8 ~) (bind 165:10 value))
415− (group 166:9
413+ (wing 165:17 value))))))))
416− (call 166:10 (wing 166:10 fallback) (lit 166:19 ~))))
414+ (value 167:1 bind
417− (arm 167:7
415+ (gate 167:9
418− (cell 167:7 (lit 167:8 ~) (bind 167:10 value))
416+ (face 167:12 args
419− (wing 167:17 value))))))))
417+ (cell 167:17
420− (value 169:1 bind
418+ (apply 167:18 unit (tvar 167:24 A))
421− (gate 169:9
419+ (fn 167:27 (tvar 167:30 A) (tvar 167:32 B))))
422− (face 169:12 args
420+ (body 168:3
423− (cell 169:17
421+ (branch 168:3
424− (apply 169:18 unit (tvar 169:24 A))
422+ (wing 168:6 args)
425− (fn 169:27 (tvar 169:30 A) (tvar 169:32 B))))
423+ (arm 169:5
426− (body 170:3
424+ (cell 169:5 (bind 169:6 maybe) (bind 169:12 f))
427− (branch 170:3
425+ (cast 169:15
428− (wing 170:6 args)
426+ (apply 169:18 unit (tvar 169:24 B))
429− (arm 171:5
427+ (body 170:7
430− (cell 171:5 (bind 171:6 maybe) (bind 171:12 f))
428+ (branch 170:7
431− (cast 171:15
429+ (wing 170:10 maybe)
432− (apply 171:18 unit (tvar 171:24 B))
430+ (arm 171:9 (lit 171:9 ~) (lit 171:11 ~))
433− (body 172:7
431+ (arm 172:9
434− (branch 172:7
432+ (cell 172:9 (lit 172:10 ~) (bind 172:12 value))
435− (wing 172:10 maybe)
433+ (unit 172:19
436− (arm 173:9 (lit 173:9 ~) (lit 173:11 ~))
434+ (group 172:20
437− (arm 174:9
435+ (call 172:21 (wing 172:21 f) (wing 172:23 value)))))))))))))
438− (cell 174:9 (lit 174:10 ~) (bind 174:12 value))
436+ (value 174:1 biff
439− (unit 174:19
437+ (gate 174:9
440− (group 174:20
438+ (face 174:12 args
441− (call 174:21 (wing 174:21 f) (wing 174:23 value)))))))))))))
439+ (cell 174:17
442− (value 176:1 biff
440+ (apply 174:18 unit (tvar 174:24 A))
443− (gate 176:9
441+ (fn 174:27
444− (face 176:12 args
442+ (tvar 174:30 A)
445− (cell 176:17
443+ (apply 174:32 unit (tvar 174:38 B)))))
446− (apply 176:18 unit (tvar 176:24 A))
444+ (body 175:3
447− (fn 176:27
445+ (branch 175:3
448− (tvar 176:30 A)
446+ (wing 175:6 args)
449− (apply 176:32 unit (tvar 176:38 B)))))
447+ (arm 176:5
450− (body 177:3
448+ (cell 176:5 (bind 176:6 maybe) (bind 176:12 f))
451− (branch 177:3
449+ (cast 176:15
452− (wing 177:6 args)
450+ (apply 176:18 unit (tvar 176:24 B))
453− (arm 178:5
451+ (body 177:7
454− (cell 178:5 (bind 178:6 maybe) (bind 178:12 f))
452+ (branch 177:7
455− (cast 178:15
453+ (wing 177:10 maybe)
456− (apply 178:18 unit (tvar 178:24 B))
454+ (arm 178:9 (lit 178:9 ~) (lit 178:11 ~))
457− (body 179:7
455+ (arm 179:9
458− (branch 179:7
456+ (cell 179:9 (lit 179:10 ~) (bind 179:12 value))
459− (wing 179:10 maybe)
457+ (group 179:19
460− (arm 180:9 (lit 180:9 ~) (lit 180:11 ~))
458+ (call 179:20 (wing 179:20 f) (wing 179:22 value))))))))))))
461− (arm 181:9
459+ (value 181:1 both
462− (cell 181:9 (lit 181:10 ~) (bind 181:12 value))
460+ (gate 181:9
463− (group 181:19
461+ (face 181:12 args
464− (call 181:20 (wing 181:20 f) (wing 181:22 value))))))))))))
462+ (cell 181:17
465− (value 183:1 both
463+ (apply 181:18 unit (tvar 181:24 A))
466− (gate 183:9
464+ (apply 181:27 unit (tvar 181:33 B))))
467− (face 183:12 args
465+ (body 182:3
468− (cell 183:17
466+ (branch 182:3
469− (apply 183:18 unit (tvar 183:24 A))
467+ (wing 182:6 args)
470− (apply 183:27 unit (tvar 183:33 B))))
468+ (arm 183:5
471− (body 184:3
469+ (cell 183:5 (bind 183:6 first) (bind 183:12 second))
472− (branch 184:3
470+ (cast 183:20
473− (wing 184:6 args)
471+ (apply 183:23 unit
474− (arm 185:5
472+ (cell 183:29 (tvar 183:30 A) (tvar 183:32 B)))
475− (cell 185:5 (bind 185:6 first) (bind 185:12 second))
473+ (body 184:7
476− (cast 185:20
474+ (branch 184:7
477− (apply 185:23 unit
475+ (wing 184:10 first)
478− (cell 185:29 (tvar 185:30 A) (tvar 185:32 B)))
476+ (arm 185:9 (lit 185:9 ~) (lit 185:11 ~))
479− (body 186:7
477+ (arm 186:9
480− (branch 186:7
478+ (cell 186:9 (lit 186:10 ~) (bind 186:12 a))
481− (wing 186:10 first)
479+ (body 187:11
482− (arm 187:9 (lit 187:9 ~) (lit 187:11 ~))
480+ (branch 187:11
483− (arm 188:9
481+ (wing 187:14 second)
484− (cell 188:9 (lit 188:10 ~) (bind 188:12 a))
482+ (arm 188:13 (lit 188:13 ~) (lit 188:15 ~))
485− (body 189:11
483+ (arm 189:13
486− (branch 189:11
484+ (cell 189:13 (lit 189:14 ~) (bind 189:16 b))
487− (wing 189:14 second)
485+ (unit 189:19
488− (arm 190:13 (lit 190:13 ~) (lit 190:15 ~))
486+ (tuple 189:20 (wing 189:21 a) (wing 189:23 b)))))))))))))))
489− (arm 191:13
487+ (value 191:1 clap
490− (cell 191:13 (lit 191:14 ~) (bind 191:16 b))
488+ (gate 191:9
491− (unit 191:19
489+ (face 191:12 args
492− (tuple 191:20 (wing 191:21 a) (wing 191:23 b)))))))))))))))
490+ (cell 191:17
493− (value 193:1 clap
491+ (apply 191:18 unit (tvar 191:24 A))
494− (gate 193:9
492+ (apply 191:27 unit (tvar 191:33 A))
495− (face 193:12 args
493+ (fn 191:36
496− (cell 193:17
494+ (cell 191:39 (tvar 191:40 A) (tvar 191:42 A))
497− (apply 193:18 unit (tvar 193:24 A))
495+ (tvar 191:45 A))))
498− (apply 193:27 unit (tvar 193:33 A))
496+ (body 192:3
499− (fn 193:36
497+ (branch 192:3
500− (cell 193:39 (tvar 193:40 A) (tvar 193:42 A))
498+ (wing 192:6 args)
501− (tvar 193:45 A))))
499+ (arm 193:5
502− (body 194:3
500+ (cell 193:5 (bind 193:6 first) (bind 193:12 second) (bind 193:19 combine))
503− (branch 194:3
501+ (cast 193:28
504− (wing 194:6 args)
502+ (apply 193:31 unit (tvar 193:37 A))
505− (arm 195:5
503+ (body 194:7
506− (cell 195:5 (bind 195:6 first) (bind 195:12 second) (bind 195:19 combine))
504+ (branch 194:7
507− (cast 195:28
505+ (wing 194:10 first)
508− (apply 195:31 unit (tvar 195:37 A))
506+ (arm 195:9 (lit 195:9 ~) (wing 195:11 second))
509− (body 196:7
507+ (arm 196:9
510− (branch 196:7
508+ (cell 196:9 (lit 196:10 ~) (bind 196:12 a))
511− (wing 196:10 first)
509+ (body 197:11
512− (arm 197:9 (lit 197:9 ~) (wing 197:11 second))
510+ (branch 197:11
513− (arm 198:9
511+ (wing 197:14 second)
514− (cell 198:9 (lit 198:10 ~) (bind 198:12 a))
512+ (arm 198:13 (lit 198:13 ~) (wing 198:15 first))
515− (body 199:11
513+ (arm 199:13
516− (branch 199:11
514+ (cell 199:13 (lit 199:14 ~) (bind 199:16 b))
517− (wing 199:14 second)
515+ (unit 199:19
518− (arm 200:13 (lit 200:13 ~) (wing 200:15 first))
516+ (group 199:20
519− (arm 201:13
517+ (call 199:21 (wing 199:21 combine) (wing 199:29 a) (wing 199:31 b))))))))))))))))
520− (cell 201:13 (lit 201:14 ~) (bind 201:16 b))
518+ (value 201:1 clef
521− (unit 201:19
519+ (gate 201:9
522− (group 201:20
520+ (face 201:12 args
523− (call 201:21 (wing 201:21 combine) (wing 201:29 a) (wing 201:31 b))))))))))))))))
521+ (cell 201:17
524− (value 203:1 hunt
522+ (apply 201:18 unit (tvar 201:24 A))
525− (gate 203:9
523+ (apply 201:27 unit (tvar 201:33 B))
526− (face 203:12 args
524+ (fn 201:36
527− (cell 203:17
525+ (cell 201:39 (tvar 201:40 A) (tvar 201:42 B))
528− (fn 203:18
526+ (apply 201:45 unit (tvar 201:51 C)))))
529− (cell 203:21 (tvar 203:22 A) (tvar 203:24 A))
527+ (body 202:3
530− (flag 203:27))
528+ (branch 202:3
531− (apply 203:30 unit (tvar 203:36 A))
529+ (wing 202:6 args)
532− (apply 203:39 unit (tvar 203:45 A))))
530+ (arm 203:5
533− (body 204:3
531+ (cell 203:5 (bind 203:6 first) (bind 203:12 second) (bind 203:19 combine))
534− (branch 204:3
532+ (cast 203:28
535− (wing 204:6 args)
533+ (apply 203:31 unit (tvar 203:37 C))
536− (arm 205:5
534+ (body 204:7
537− (cell 205:5 (bind 205:6 choose) (bind 205:13 first) (bind 205:19 second))
535+ (branch 204:7
538− (cast 205:27
536+ (wing 204:10 first)
539− (apply 205:30 unit (tvar 205:36 A))
537+ (arm 205:9 (lit 205:9 ~) (lit 205:11 ~))
540− (body 206:7
538+ (arm 206:9
541− (branch 206:7
539+ (cell 206:9 (lit 206:10 ~) (bind 206:12 a))
542− (wing 206:10 first)
540+ (body 207:11
543− (arm 207:9 (lit 207:9 ~) (wing 207:11 second))
541+ (branch 207:11
544− (arm 208:9
542+ (wing 207:14 second)
545− (cell 208:9 (lit 208:10 ~) (bind 208:12 a))
543+ (arm 208:13 (lit 208:13 ~) (lit 208:15 ~))
546− (body 209:11
544+ (arm 209:13
547− (branch 209:11
545+ (cell 209:13 (lit 209:14 ~) (bind 209:16 b))
548− (wing 209:14 second)
546+ (group 209:19
549− (arm 210:13 (lit 210:13 ~) (wing 210:15 first))
547+ (call 209:20 (wing 209:20 combine) (wing 209:28 a) (wing 209:30 b)))))))))))))))
550− (arm 211:13
548+ (value 211:1 skim
551− (cell 211:13 (lit 211:14 ~) (bind 211:16 b))
549+ (gate 211:9
552− (body 212:15
550+ (face 211:12 args
553− (branch 212:15
551+ (cell 211:17
554− (group 212:18
552+ (apply 211:18 list (tvar 211:24 A))
555− (call 212:19 (wing 212:19 choose) (wing 212:26 a) (wing 212:28 b)))
553+ (fn 211:27 (tvar 211:30 A) (flag 211:32))))
556− (arm 213:17 (lit 213:17 %.y) (wing 213:21 first))
554+ (body 212:3
557− (arm 214:17 (lit 214:17 %.n) (wing 214:21 second))))))))))))))))
555+ (branch 212:3
558− (value 216:1 mate
556+ (wing 212:6 args)
559− (gate 216:9
557+ (arm 213:5
560− (face 216:12 args
558+ (cell 213:5 (bind 213:6 xs) (bind 213:9 predicate))
561− (cell 216:17
559+ (cast 213:20
562− (apply 216:18 unit (tvar 216:24 A))
560+ (apply 213:23 list (tvar 213:29 A))
563− (apply 216:27 unit (tvar 216:33 A))))
561+ (body 214:9
564− (body 217:3
562+ (branch 214:9
565− (branch 217:3
563+ (wing 214:12 xs)
566− (wing 217:6 args)
564+ (arm 215:11 (lit 215:11 ~) (lit 215:13 ~))
567− (arm 218:5
565+ (arm 216:11
568− (cell 218:5 (bind 218:6 first) (bind 218:12 second))
566+ (cell 216:11 (bind 216:12 item) (bind 216:17 rest))
569− (cast 218:20
567+ (body 217:13
570− (apply 218:23 unit (tvar 218:29 A))
568+ (branch 217:13
571− (body 219:7
569+ (group 217:16
572− (branch 219:7
570+ (call 217:17 (wing 217:17 predicate) (wing 217:27 item)))
573− (wing 219:10 second)
571+ (arm 218:15
574− (arm 220:9 (lit 220:9 ~) (wing 220:11 first))
572+ (lit 218:15 %.y)
575− (arm 221:9
573+ (tuple 218:19
576− (cell 221:9 (lit 221:10 ~) (bind 221:12 b))
574+ (wing 218:20 item)
577− (body 222:11
575+ (group 218:25
578− (branch 222:11
576+ (call 218:26 (wing 218:26 skim) (wing 218:31 rest) (wing 218:36 predicate)))))
579− (wing 222:14 first)
577+ (arm 219:15
580− (arm 223:13 (lit 223:13 ~) (wing 223:15 second))
578+ (lit 219:15 %.n)
581− (arm 224:13
579+ (group 219:19
582− (cell 224:13 (lit 224:14 ~) (bind 224:16 a))
580+ (call 219:20 (wing 219:20 skim) (wing 219:25 rest) (wing 219:30 predicate)))))))))))))))
583− (body 225:15
581+ (value 221:1 skip
584− (branch 225:15
582+ (gate 221:9
585− (group 225:18
583+ (face 221:12 args
586− (call 225:19 (wing 225:19 eq) (wing 225:22 a) (wing 225:24 b)))
584+ (cell 221:17
587− (arm 226:17 (lit 226:17 %.y) (wing 226:21 first))
585+ (apply 221:18 list (tvar 221:24 A))
588− (arm 227:17 (lit 227:17 %.n) (crash 227:21))))))))))))))))
586+ (fn 221:27 (tvar 221:30 A) (flag 221:32))))
589− (value 229:1 clef
587+ (body 222:3
590− (gate 229:9
588+ (branch 222:3
591− (face 229:12 args
589+ (wing 222:6 args)
592− (cell 229:17
590+ (arm 223:5
593− (apply 229:18 unit (tvar 229:24 A))
591+ (cell 223:5 (bind 223:6 xs) (bind 223:9 predicate))
594− (apply 229:27 unit (tvar 229:33 B))
592+ (cast 223:20
595− (fn 229:36
593+ (apply 223:23 list (tvar 223:29 A))
596− (cell 229:39 (tvar 229:40 A) (tvar 229:42 B))
594+ (body 224:9
597− (apply 229:45 unit (tvar 229:51 C)))))
595+ (branch 224:9
598− (body 230:3
596+ (wing 224:12 xs)
599− (branch 230:3
597+ (arm 225:11 (lit 225:11 ~) (lit 225:13 ~))
600− (wing 230:6 args)
598+ (arm 226:11
601− (arm 231:5
599+ (cell 226:11 (bind 226:12 item) (bind 226:17 rest))
602− (cell 231:5 (bind 231:6 first) (bind 231:12 second) (bind 231:19 combine))
600+ (body 227:13
603− (cast 231:28
601+ (branch 227:13
604− (apply 231:31 unit (tvar 231:37 C))
602+ (group 227:16
605− (body 232:7
603+ (call 227:17 (wing 227:17 predicate) (wing 227:27 item)))
606− (branch 232:7
604+ (arm 228:15
607− (wing 232:10 first)
605+ (lit 228:15 %.y)
608− (arm 233:9 (lit 233:9 ~) (lit 233:11 ~))
606+ (group 228:19
609− (arm 234:9
607+ (call 228:20 (wing 228:20 skip) (wing 228:25 rest) (wing 228:30 predicate))))
610− (cell 234:9 (lit 234:10 ~) (bind 234:12 a))
608+ (arm 229:15
611− (body 235:11
609+ (lit 229:15 %.n)
612− (branch 235:11
610+ (tuple 229:19
613− (wing 235:14 second)
611+ (wing 229:20 item)
614− (arm 236:13 (lit 236:13 ~) (lit 236:15 ~))
612+ (group 229:25
615− (arm 237:13
613+ (call 229:26 (wing 229:26 skip) (wing 229:31 rest) (wing 229:36 predicate))))))))))))))))
616− (cell 237:13 (lit 237:14 ~) (bind 237:16 b))
614+ (value 231:1 levy
617− (group 237:19
615+ (gate 231:9
618− (call 237:20 (wing 237:20 combine) (wing 237:28 a) (wing 237:30 b)))))))))))))))
616+ (face 231:12 args
619− (value 239:1 skim
617+ (cell 231:17
620− (gate 239:9
618+ (apply 231:18 list (tvar 231:24 A))
621− (face 239:12 args
619+ (fn 231:27 (tvar 231:30 A) (flag 231:32))))
622− (cell 239:17
620+ (body 232:3
623− (apply 239:18 list (tvar 239:24 A))
621+ (cast 232:3
624− (fn 239:27 (tvar 239:30 A) (flag 239:32))))
622+ (flag 232:6)
625− (body 240:3
623+ (body 233:5
626− (branch 240:3
624+ (branch 233:5
627− (wing 240:6 args)
625+ (wing 233:8 args)
628− (arm 241:5
626+ (arm 234:7
629− (cell 241:5 (bind 241:6 xs) (bind 241:9 predicate))
627+ (cell 234:7 (bind 234:8 xs) (bind 234:11 predicate))
630− (cast 241:20
628+ (body 235:9
631− (apply 241:23 list (tvar 241:29 A))
629+ (branch 235:9
632− (body 242:9
630+ (wing 235:12 xs)
633− (branch 242:9
631+ (arm 236:11 (lit 236:11 ~) (lit 236:13 %.y))
634− (wing 242:12 xs)
632+ (arm 237:11
635− (arm 243:11 (lit 243:11 ~) (lit 243:13 ~))
633+ (cell 237:11 (bind 237:12 item) (bind 237:17 rest))
636− (arm 244:11
634+ (body 238:13
637− (cell 244:11 (bind 244:12 item) (bind 244:17 rest))
635+ (branch 238:13
638− (body 245:13
636+ (group 238:16
639− (branch 245:13
637+ (call 238:17 (wing 238:17 predicate) (wing 238:27 item)))
640− (group 245:16
638+ (arm 239:15
641− (call 245:17 (wing 245:17 predicate) (wing 245:27 item)))
639+ (lit 239:15 %.y)
642− (arm 246:15
640+ (group 239:19
643− (lit 246:15 %.y)
641+ (call 239:20 (wing 239:20 levy) (wing 239:25 rest) (wing 239:30 predicate))))
644− (tuple 246:19
642+ (arm 240:15 (lit 240:15 %.n) (lit 240:19 %.n))))))))))))))
645− (wing 246:20 item)
643+ (value 242:1 lien
646− (group 246:25
644+ (gate 242:9
647− (call 246:26 (wing 246:26 skim) (wing 246:31 rest) (wing 246:36 predicate)))))
645+ (face 242:12 args
648− (arm 247:15
646+ (cell 242:17
649− (lit 247:15 %.n)
647+ (apply 242:18 list (tvar 242:24 A))
650− (group 247:19
648+ (fn 242:27 (tvar 242:30 A) (flag 242:32))))
651− (call 247:20 (wing 247:20 skim) (wing 247:25 rest) (wing 247:30 predicate)))))))))))))))
649+ (body 243:3
652− (value 249:1 skip
650+ (cast 243:3
653− (gate 249:9
651+ (flag 243:6)
654− (face 249:12 args
652+ (body 244:5
655− (cell 249:17
653+ (branch 244:5
656− (apply 249:18 list (tvar 249:24 A))
654+ (wing 244:8 args)
657− (fn 249:27 (tvar 249:30 A) (flag 249:32))))
655+ (arm 245:7
658− (body 250:3
656+ (cell 245:7 (bind 245:8 xs) (bind 245:11 predicate))
659− (branch 250:3
657+ (body 246:9
660− (wing 250:6 args)
658+ (branch 246:9
661− (arm 251:5
659+ (wing 246:12 xs)
662− (cell 251:5 (bind 251:6 xs) (bind 251:9 predicate))
660+ (arm 247:11 (lit 247:11 ~) (lit 247:13 %.n))
663− (cast 251:20
661+ (arm 248:11
664− (apply 251:23 list (tvar 251:29 A))
662+ (cell 248:11 (bind 248:12 item) (bind 248:17 rest))
665− (body 252:9
663+ (body 249:13
666− (branch 252:9
664+ (branch 249:13
667− (wing 252:12 xs)
665+ (group 249:16
668− (arm 253:11 (lit 253:11 ~) (lit 253:13 ~))
666+ (call 249:17 (wing 249:17 predicate) (wing 249:27 item)))
669− (arm 254:11
667+ (arm 250:15 (lit 250:15 %.y) (lit 250:19 %.y))
670− (cell 254:11 (bind 254:12 item) (bind 254:17 rest))
668+ (arm 251:15
671− (body 255:13
669+ (lit 251:15 %.n)
672− (branch 255:13
670+ (group 251:19
673− (group 255:16
671+ (call 251:20 (wing 251:20 lien) (wing 251:25 rest) (wing 251:30 predicate))))))))))))))))
674− (call 255:17 (wing 255:17 predicate) (wing 255:27 item)))
672+ (value 253:1 roll
675− (arm 256:15
673+ (gate 253:9
676− (lit 256:15 %.y)
674+ (face 253:12 args
677− (group 256:19
675+ (cell 253:17
678− (call 256:20 (wing 256:20 skip) (wing 256:25 rest) (wing 256:30 predicate))))
676+ (apply 253:18 list (tvar 253:24 A))
679− (arm 257:15
677+ (tvar 253:27 B)
680− (lit 257:15 %.n)
678+ (fn 253:29
681− (tuple 257:19
679+ (cell 253:32 (tvar 253:33 A) (tvar 253:35 B))
682− (wing 257:20 item)
680+ (tvar 253:38 B))))
683− (group 257:25
681+ (body 254:3
684− (call 257:26 (wing 257:26 skip) (wing 257:31 rest) (wing 257:36 predicate))))))))))))))))
682+ (branch 254:3
685− (value 259:1 levy
683+ (wing 254:6 args)
686− (gate 259:9
684+ (arm 255:5
687− (face 259:12 args
685+ (cell 255:5 (bind 255:6 xs) (bind 255:9 start) (bind 255:15 combine))
688− (cell 259:17
686+ (body 256:7
689− (apply 259:18 list (tvar 259:24 A))
687+ (branch 256:7
690− (fn 259:27 (tvar 259:30 A) (flag 259:32))))
688+ (wing 256:10 xs)
691− (body 260:3
689+ (arm 257:9 (lit 257:9 ~) (wing 257:11 start))
692− (cast 260:3
690+ (arm 258:9
693− (flag 260:6)
691+ (cell 258:9 (bind 258:10 item) (bind 258:15 rest))
694− (body 261:5
692+ (group 258:21
695− (branch 261:5
693+ (call 258:22
696− (wing 261:8 args)
694+ (wing 258:22 roll)
697− (arm 262:7
695+ (wing 258:27 rest)
698− (cell 262:7 (bind 262:8 xs) (bind 262:11 predicate))
696+ (group 258:32
699− (body 263:9
697+ (call 258:33 (wing 258:33 combine) (wing 258:41 item) (wing 258:46 start)))
700− (branch 263:9
698+ (wing 258:53 combine)))))))))))
701− (wing 263:12 xs)
699+ (value 260:1 reel
702− (arm 264:11 (lit 264:11 ~) (lit 264:13 %.y))
700+ (gate 260:9
703− (arm 265:11
701+ (face 260:12 args
704− (cell 265:11 (bind 265:12 item) (bind 265:17 rest))
702+ (cell 260:17
705− (body 266:13
703+ (apply 260:18 list (tvar 260:24 A))
706− (branch 266:13
704+ (tvar 260:27 B)
707− (group 266:16
705+ (fn 260:29
708− (call 266:17 (wing 266:17 predicate) (wing 266:27 item)))
706+ (cell 260:32 (tvar 260:33 A) (tvar 260:35 B))
709− (arm 267:15
707+ (tvar 260:38 B))))
710− (lit 267:15 %.y)
708+ (body 261:3
711− (group 267:19
709+ (branch 261:3
712− (call 267:20 (wing 267:20 levy) (wing 267:25 rest) (wing 267:30 predicate))))
710+ (wing 261:6 args)
713− (arm 268:15 (lit 268:15 %.n) (lit 268:19 %.n))))))))))))))
711+ (arm 262:5
714− (value 270:1 lien
712+ (cell 262:5 (bind 262:6 xs) (bind 262:9 start) (bind 262:15 combine))
715− (gate 270:9
713+ (body 263:7
716− (face 270:12 args
714+ (branch 263:7
717− (cell 270:17
715+ (wing 263:10 xs)
718− (apply 270:18 list (tvar 270:24 A))
716+ (arm 264:9 (lit 264:9 ~) (wing 264:11 start))
719− (fn 270:27 (tvar 270:30 A) (flag 270:32))))
717+ (arm 265:9
720− (body 271:3
718+ (cell 265:9 (bind 265:10 item) (bind 265:15 rest))
721− (cast 271:3
719+ (group 265:21
722− (flag 271:6)
720+ (call 265:22
723− (body 272:5
721+ (wing 265:22 combine)
724− (branch 272:5
722+ (wing 265:30 item)
725− (wing 272:8 args)
723+ (group 265:35
726− (arm 273:7
724+ (call 265:36 (wing 265:36 reel) (wing 265:41 rest) (wing 265:46 start) (wing 265:52 combine)))))))))))))
727− (cell 273:7 (bind 273:8 xs) (bind 273:11 predicate))
725+ (value 267:1 flit
728− (body 274:9
726+ (gate 267:9
729− (branch 274:9
727+ (face 267:12 predicate
730− (wing 274:12 xs)
728+ (fn 267:22 (tvar 267:25 A) (flag 267:27)))
731− (arm 275:11 (lit 275:11 ~) (lit 275:13 %.n))
729+ (body 268:3
732− (arm 276:11
730+ (gate 268:3
733− (cell 276:11 (bind 276:12 item) (bind 276:17 rest))
731+ (face 268:6 value (tvar 268:12 A))
734− (body 277:13
732+ (body 269:5
735− (branch 277:13
733+ (cast 269:5
736− (group 277:16
734+ (apply 269:8 unit (tvar 269:14 A))
737− (call 277:17 (wing 277:17 predicate) (wing 277:27 item)))
735+ (body 270:7
738− (arm 278:15 (lit 278:15 %.y) (lit 278:19 %.y))
736+ (branch 270:7
739− (arm 279:15
737+ (group 270:10
740− (lit 279:15 %.n)
738+ (call 270:11 (wing 270:11 predicate) (wing 270:21 value)))
741− (group 279:19
739+ (arm 271:9
742− (call 279:20 (wing 279:20 lien) (wing 279:25 rest) (wing 279:30 predicate))))))))))))))))
740+ (lit 271:9 %.y)
743− (value 281:1 roll
741+ (unit 271:13 (wing 271:14 value)))
744− (gate 281:9
742+ (arm 272:9 (lit 272:9 %.n) (lit 272:13 ~))))))))))
745− (face 281:12 args
743+ (value 274:1 murn
746− (cell 281:17
744+ (gate 274:9
747− (apply 281:18 list (tvar 281:24 A))
745+ (face 274:12 args
748− (tvar 281:27 B)
746+ (cell 274:17
749− (fn 281:29
747+ (apply 274:18 list (tvar 274:24 A))
750− (cell 281:32 (tvar 281:33 A) (tvar 281:35 B))
748+ (fn 274:27
751− (tvar 281:38 B))))
749+ (tvar 274:30 A)
752− (body 282:3
750+ (apply 274:32 unit (tvar 274:38 B)))))
753− (branch 282:3
751+ (body 275:3
754− (wing 282:6 args)
752+ (branch 275:3
755− (arm 283:5
753+ (wing 275:6 args)
756− (cell 283:5 (bind 283:6 xs) (bind 283:9 start) (bind 283:15 combine))
754+ (arm 276:5
757− (body 284:7
755+ (cell 276:5 (bind 276:6 xs) (bind 276:9 f))
758− (branch 284:7
756+ (cast 276:12
759− (wing 284:10 xs)
757+ (apply 276:15 list (tvar 276:21 B))
760− (arm 285:9 (lit 285:9 ~) (wing 285:11 start))
758+ (body 277:9
761− (arm 286:9
759+ (branch 277:9
762− (cell 286:9 (bind 286:10 item) (bind 286:15 rest))
760+ (wing 277:12 xs)
763− (group 286:21
761+ (arm 278:11 (lit 278:11 ~) (lit 278:13 ~))
764− (call 286:22
762+ (arm 279:11
765− (wing 286:22 roll)
763+ (cell 279:11 (bind 279:12 item) (bind 279:17 rest))
766− (wing 286:27 rest)
764+ (body 280:13
767− (group 286:32
765+ (branch 280:13
768− (call 286:33 (wing 286:33 combine) (wing 286:41 item) (wing 286:46 start)))
766+ (group 280:16
769− (wing 286:53 combine)))))))))))
767+ (call 280:17 (wing 280:17 f) (wing 280:19 item)))
770− (value 288:1 reel
768+ (arm 281:15
771− (gate 288:9
769+ (lit 281:15 ~)
772− (face 288:12 args
770+ (group 281:17
773− (cell 288:17
771+ (call 281:18 (wing 281:18 murn) (wing 281:23 rest) (wing 281:28 f))))
774− (apply 288:18 list (tvar 288:24 A))
772+ (arm 282:15
775− (tvar 288:27 B)
773+ (cell 282:15 (lit 282:16 ~) (bind 282:18 value))
776− (fn 288:29
774+ (tuple 282:25
777− (cell 288:32 (tvar 288:33 A) (tvar 288:35 B))
775+ (wing 282:26 value)
778− (tvar 288:38 B))))
776+ (group 282:32
779− (body 289:3
777+ (call 282:33 (wing 282:33 murn) (wing 282:38 rest) (wing 282:43 f))))))))))))))))
780− (branch 289:3
778+ (value 284:1 join
781− (wing 289:6 args)
779+ (gate 284:9
782− (arm 290:5
780+ (face 284:12 args
783− (cell 290:5 (bind 290:6 xs) (bind 290:9 start) (bind 290:15 combine))
781+ (cell 284:17
784− (body 291:7
782+ (tvar 284:18 A)
785− (branch 291:7
783+ (apply 284:20 list (tvar 284:26 A))))
786− (wing 291:10 xs)
784+ (body 285:3
787− (arm 292:9 (lit 292:9 ~) (wing 292:11 start))
785+ (branch 285:3
788− (arm 293:9
786+ (wing 285:6 args)
789− (cell 293:9 (bind 293:10 item) (bind 293:15 rest))
787+ (arm 286:5
790− (group 293:21
788+ (cell 286:5 (bind 286:6 separator) (bind 286:16 xs))
791− (call 293:22
789+ (cast 286:20
792− (wing 293:22 combine)
790+ (apply 286:23 list (tvar 286:29 A))
793− (wing 293:30 item)
791+ (body 287:9
794− (group 293:35
792+ (branch 287:9
795− (call 293:36 (wing 293:36 reel) (wing 293:41 rest) (wing 293:46 start) (wing 293:52 combine)))))))))))))
793+ (wing 287:12 xs)
796− (value 295:1 flit
794+ (arm 288:11 (lit 288:11 ~) (lit 288:13 ~))
797− (gate 295:9
795+ (arm 289:11
798− (face 295:12 predicate
796+ (cell 289:11 (bind 289:12 item) (bind 289:17 rest))
799− (fn 295:22 (tvar 295:25 A) (flag 295:27)))
797+ (body 290:13
800− (body 296:3
798+ (branch 290:13
801− (gate 296:3
799+ (wing 290:16 rest)
802− (face 296:6 value (tvar 296:12 A))
800+ (arm 291:15
803− (body 297:5
801+ (lit 291:15 ~)
804− (cast 297:5
802+ (tuple 291:17 (wing 291:18 item) (lit 291:23 ~)))
805− (apply 297:8 unit (tvar 297:14 A))
803+ (arm 292:15
806− (body 298:7
804+ (cell 292:15 (bind 292:16 next) (bind 292:21 more))
807− (branch 298:7
805+ (tuple 292:27
808− (group 298:10
806+ (wing 292:28 item)
809− (call 298:11 (wing 298:11 predicate) (wing 298:21 value)))
807+ (tuple 292:33
810− (arm 299:9
808+ (wing 292:34 separator)
811− (lit 299:9 %.y)
809+ (group 292:44
812− (unit 299:13 (wing 299:14 value)))
810+ (call 292:45 (wing 292:45 join) (wing 292:50 separator) (wing 292:60 rest)))))))))))))))))
813− (arm 300:9 (lit 300:9 %.n) (lit 300:13 ~))))))))))
811+ (value 294:1 snip
814− (value 302:1 murn
812+ (gate 294:9
815− (gate 302:9
813+ (face 294:12 xs
816− (face 302:12 args
814+ (apply 294:15 list (tvar 294:21 A)))
817− (cell 302:17
815+ (body 295:3
818− (apply 302:18 list (tvar 302:24 A))
816+ (cast 295:3
819− (fn 302:27
817+ (apply 295:6 list (tvar 295:12 A))
820− (tvar 302:30 A)
818+ (body 296:5
821− (apply 302:32 unit (tvar 302:38 B)))))
819+ (branch 296:5
822− (body 303:3
820+ (wing 296:8 xs)
823− (branch 303:3
821+ (arm 297:7 (lit 297:7 ~) (lit 297:9 ~))
824− (wing 303:6 args)
822+ (arm 298:7
825− (arm 304:5
823+ (cell 298:7 (bind 298:8 item) (bind 298:13 rest))
826− (cell 304:5 (bind 304:6 xs) (bind 304:9 f))
824+ (body 299:9
827− (cast 304:12
825+ (branch 299:9
828− (apply 304:15 list (tvar 304:21 B))
826+ (wing 299:12 rest)
829− (body 305:9
827+ (arm 300:11 (lit 300:11 ~) (lit 300:13 ~))
830− (branch 305:9
828+ (arm 301:11
831− (wing 305:12 xs)
829+ (cell 301:11 (bind 301:12 next) (bind 301:17 more))
832− (arm 306:11 (lit 306:11 ~) (lit 306:13 ~))
830+ (tuple 301:23
833− (arm 307:11
831+ (wing 301:24 item)
834− (cell 307:11 (bind 307:12 item) (bind 307:17 rest))
832+ (group 301:29
835− (body 308:13
833+ (call 301:30 (wing 301:30 snip) (wing 301:35 rest))))))))))))))
836− (branch 308:13
834+ (value 303:1 rear
837− (group 308:16
835+ (gate 303:9
838− (call 308:17 (wing 308:17 f) (wing 308:19 item)))
836+ (face 303:12 xs
839− (arm 309:15
837+ (apply 303:15 list (tvar 303:21 A)))
840− (lit 309:15 ~)
838+ (body 304:3
841− (group 309:17
839+ (branch 304:3
842− (call 309:18 (wing 309:18 murn) (wing 309:23 rest) (wing 309:28 f))))
840+ (wing 304:6 xs)
843− (arm 310:15
841+ (arm 305:5 (lit 305:5 ~) (crash 305:7))
844− (cell 310:15 (lit 310:16 ~) (bind 310:18 value))
842+ (arm 306:5
845− (tuple 310:25
843+ (cell 306:5 (bind 306:6 item) (bind 306:11 rest))
846− (wing 310:26 value)
844+ (body 307:7
847− (group 310:32
845+ (branch 307:7
848− (call 310:33 (wing 310:33 murn) (wing 310:38 rest) (wing 310:43 f))))))))))))))))
846+ (wing 307:10 rest)
849− (value 312:1 join
847+ (arm 308:9 (lit 308:9 ~) (wing 308:11 item))
850− (gate 312:9
848+ (arm 309:9
851− (face 312:12 args
849+ (cell 309:9 (bind 309:10 next) (bind 309:15 more))
852− (cell 312:17
850+ (group 309:21
853− (tvar 312:18 A)
851+ (call 309:22 (wing 309:22 rear) (wing 309:27 rest)))))))))))
854− (apply 312:20 list (tvar 312:26 A))))
852+ (value 311:1 cork
855− (body 313:3
853+ (gate 311:9
856− (branch 313:3
854+ (face 311:12 gates
857− (wing 313:6 args)
855+ (cell 311:18
858− (arm 314:5
856+ (fn 311:19 (tvar 311:22 A) (tvar 311:24 B))
859− (cell 314:5 (bind 314:6 separator) (bind 314:16 xs))
857+ (fn 311:27 (tvar 311:30 B) (tvar 311:32 C))))
860− (cast 314:20
858+ (body 312:3
861− (apply 314:23 list (tvar 314:29 A))
859+ (branch 312:3
862− (body 315:9
860+ (wing 312:6 gates)
863− (branch 315:9
861+ (arm 313:5
864− (wing 315:12 xs)
862+ (cell 313:5 (bind 313:6 f) (bind 313:8 g))
865− (arm 316:11 (lit 316:11 ~) (lit 316:13 ~))
863+ (gate 313:11
866− (arm 317:11
864+ (face 313:14 x (tvar 313:16 A))
867− (cell 317:11 (bind 317:12 item) (bind 317:17 rest))
865+ (group 313:18
868− (body 318:13
866+ (call 313:19
869− (branch 318:13
867+ (wing 313:19 g)
870− (wing 318:16 rest)
868+ (group 313:21
871− (arm 319:15
869+ (call 313:22 (wing 313:22 f) (wing 313:24 x)))))))))))
872− (lit 319:15 ~)
870+ (value 315:1 corl
873− (tuple 319:17 (wing 319:18 item) (lit 319:23 ~)))
871+ (gate 315:9
874− (arm 320:15
872+ (face 315:12 gates
875− (cell 320:15 (bind 320:16 next) (bind 320:21 more))
873+ (cell 315:18
876− (tuple 320:27
874+ (fn 315:19 (tvar 315:22 B) (tvar 315:24 C))
877− (wing 320:28 item)
875+ (fn 315:27 (tvar 315:30 A) (tvar 315:32 B))))
878− (tuple 320:33
876+ (body 316:3
879− (wing 320:34 separator)
877+ (branch 316:3
880− (group 320:44
878+ (wing 316:6 gates)
881− (call 320:45 (wing 320:45 join) (wing 320:50 separator) (wing 320:60 rest)))))))))))))))))
879+ (arm 317:5
882− (value 322:1 snip
880+ (cell 317:5 (bind 317:6 f) (bind 317:8 g))
883− (gate 322:9
881+ (gate 317:11
884− (face 322:12 xs
882+ (face 317:14 x (tvar 317:16 A))
885− (apply 322:15 list (tvar 322:21 A)))
883+ (group 317:18
886− (body 323:3
884+ (call 317:19
887− (cast 323:3
885+ (wing 317:19 f)
888− (apply 323:6 list (tvar 323:12 A))
886+ (group 317:21
889− (body 324:5
887+ (call 317:22 (wing 317:22 g) (wing 317:24 x)))))))))))
890− (branch 324:5
888+ (value 319:1 cury
891− (wing 324:8 xs)
889+ (gate 319:9
892− (arm 325:7 (lit 325:7 ~) (lit 325:9 ~))
890+ (face 319:12 args
893− (arm 326:7
891+ (cell 319:17
894− (cell 326:7 (bind 326:8 item) (bind 326:13 rest))
892+ (fn 319:18
895− (body 327:9
893+ (cell 319:21 (tvar 319:22 A) (tvar 319:24 B))
896− (branch 327:9
894+ (tvar 319:27 C))
897− (wing 327:12 rest)
895+ (tvar 319:30 A)))
898− (arm 328:11 (lit 328:11 ~) (lit 328:13 ~))
896+ (body 320:3
899− (arm 329:11
897+ (branch 320:3
900− (cell 329:11 (bind 329:12 next) (bind 329:17 more))
898+ (wing 320:6 args)
901− (tuple 329:23
899+ (arm 321:5
902− (wing 329:24 item)
900+ (cell 321:5 (bind 321:6 f) (bind 321:8 a))
903− (group 329:29
901+ (gate 321:11
904− (call 329:30 (wing 329:30 snip) (wing 329:35 rest))))))))))))))
902+ (face 321:14 b (tvar 321:16 B))
905− (value 331:1 rear
903+ (group 321:18
906− (gate 331:9
904+ (call 321:19 (wing 321:19 f) (wing 321:21 a) (wing 321:23 b)))))))))
907− (face 331:12 xs
905+ (value 323:1 curr
908− (apply 331:15 list (tvar 331:21 A)))
906+ (gate 323:9
909− (body 332:3
907+ (face 323:12 args
910− (branch 332:3
908+ (cell 323:17
911− (wing 332:6 xs)
909+ (fn 323:18
912− (arm 333:5 (lit 333:5 ~) (crash 333:7))
910+ (cell 323:21 (tvar 323:22 A) (tvar 323:24 B))
913− (arm 334:5
911+ (tvar 323:27 C))
914− (cell 334:5 (bind 334:6 item) (bind 334:11 rest))
912+ (tvar 323:30 B)))
915− (body 335:7
913+ (body 324:3
916− (branch 335:7
914+ (branch 324:3
917− (wing 335:10 rest)
915+ (wing 324:6 args)
918− (arm 336:9 (lit 336:9 ~) (wing 336:11 item))
916+ (arm 325:5
919− (arm 337:9
917+ (cell 325:5 (bind 325:6 f) (bind 325:8 b))
920− (cell 337:9 (bind 337:10 next) (bind 337:15 more))
918+ (gate 325:11
921− (group 337:21
919+ (face 325:14 a (tvar 325:16 A))
922− (call 337:22 (wing 337:22 rear) (wing 337:27 rest)))))))))))
920+ (group 325:18
923− (value 339:1 cork
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
924 (gate 339:9
968 (gate 339:9
925− (face 339:12 gates
969+ (face 339:12 x (tvar 339:14 M))
926− (cell 339:18
927− (fn 339:19 (tvar 339:22 A) (tvar 339:24 B))
928− (fn 339:27 (tvar 339:30 B) (tvar 339:32 C))))
929− (body 340:3
930− (branch 340:3
931− (wing 340:6 gates)
932− (arm 341:5
933− (cell 341:5 (bind 341:6 f) (bind 341:8 g))
934− (gate 341:11
935− (face 341:14 x (tvar 341:16 A))
936− (group 341:18
937− (call 341:19
938− (wing 341:19 g)
939− (group 341:21
940− (call 341:22 (wing 341:22 f) (wing 341:24 x)))))))))))
941− (value 343:1 corl
942− (gate 343:9
943− (face 343:12 gates
944− (cell 343:18
945− (fn 343:19 (tvar 343:22 B) (tvar 343:24 C))
946− (fn 343:27 (tvar 343:30 A) (tvar 343:32 B))))
947− (body 344:3
948− (branch 344:3
949− (wing 344:6 gates)
950− (arm 345:5
951− (cell 345:5 (bind 345:6 f) (bind 345:8 g))
952− (gate 345:11
953− (face 345:14 x (tvar 345:16 A))
954− (group 345:18
955− (call 345:19
956− (wing 345:19 f)
957− (group 345:21
958− (call 345:22 (wing 345:22 g) (wing 345:24 x)))))))))))
959− (value 347:1 cury
960− (gate 347:9
961− (face 347:12 args
962− (cell 347:17
963− (fn 347:18
964− (cell 347:21 (tvar 347:22 A) (tvar 347:24 B))
965− (tvar 347:27 C))
966− (tvar 347:30 A)))
967− (body 348:3
968− (branch 348:3
969− (wing 348:6 args)
970− (arm 349:5
971− (cell 349:5 (bind 349:6 f) (bind 349:8 a))
972− (gate 349:11
973− (face 349:14 b (tvar 349:16 B))
974− (group 349:18
975− (call 349:19 (wing 349:19 f) (wing 349:21 a) (wing 349:23 b)))))))))
976− (value 351:1 curr
977− (gate 351:9
978− (face 351:12 args
979− (cell 351:17
980− (fn 351:18
981− (cell 351:21 (tvar 351:22 A) (tvar 351:24 B))
982− (tvar 351:27 C))
983− (tvar 351:30 B)))
984− (body 352:3
985− (branch 352:3
986− (wing 352:6 args)
987− (arm 353:5
988− (cell 353:5 (bind 353:6 f) (bind 353:8 b))
989− (gate 353:11
990− (face 353:14 a (tvar 353:16 A))
991− (group 353:18
992− (call 353:19 (wing 353:19 f) (wing 353:21 a) (wing 353:23 b)))))))))
993− (mold 355:1 cmd
994− (generic 355:8 M
995− (union 356:3
996− (cell 356:3
997− (const 356:4 %poke)
998− (face 356:10 p (ref 356:12 raw-poke))
999− (face 356:21 reply
1000− (fn 356:27
1001− (apply 356:30 unit (aura 356:36 @t))
1002− (tvar 356:40 M))))
1003− (cell 357:3
1004− (const 357:4 %go)
1005− (face 357:8 url (aura 357:12 @t)))
1006− (cell 358:3
1007− (const 358:4 %wait)
1008− (face 358:10 gap (aura 358:14 @dr))
1009− (face 358:18 msg (tvar 358:22 M)))
1010− (cell 359:3
1011− (const 359:4 %now)
1012− (face 359:9 reply
1013− (fn 359:15 (aura 359:18 @da) (tvar 359:22 M))))
1014− (cell 360:3
1015− (const 360:4 %who)
1016− (face 360:9 reply
1017− (fn 360:15 (aura 360:18 @p) (tvar 360:21 M)))))))
1018− (value 362:1 gth
1019− (gate 362:8
1020− (face 362:11 args
1021− (cell 362:16 (tvar 362:17 A) (tvar 362:19 A)))
1022− (group 362:22
1023− (call 362:23 (wing 362:23 gth-atom.internal) (wing 362:41 args)))))
1024− (value 363:1 add
1025− (gate 363:8
1026− (face 363:11 args
1027− (cell 363:16 (tvar 363:17 A) (tvar 363:19 A)))
1028− (group 363:22
1029− (call 363:23 (wing 363:23 add-atom.internal) (wing 363:41 args)))))
1030− (value 364:1 dec
1031− (gate 364:8
1032− (face 364:11 atom (tvar 364:16 A))
1033− (group 364:18
1034− (call 364:19 (wing 364:19 dec-atom.internal) (wing 364:37 atom)))))
1035− (mold 366:1 ask
1036− (generic 366:8 M
1037− (apply 366:15 ask.internal (tvar 366:29 M))))
1038− (value 367:1 pure
1039− (gate 367:9
1040− (face 367:12 x (tvar 367:14 M))
1041− (cast 367:16
970+ (cast 339:16
1042− (apply 367:19 ask (tvar 367:24 M))
971+ (apply 339:19 ask (tvar 339:24 M))
1043− (tuple 367:27 (lit 367:28 %pure) (wing 367:34 x))))))
972+ (tuple 339:27 (lit 339:28 %pure) (wing 339:34 x))))))
tests/golden/prelude-unit-list-transforms/types.txt+1−4
@@ -1,11 +1,10 @@
1partial inference; module not checked
1partial inference; module not checked
2−+$ raw-poke: not checked
2++$ poke: not checked
3+$ qath: not checked
3+$ qath: not checked
4++ same: $-(A A)
4++ same: $-(A A)
5++ head: $-([A B] A)
5++ head: $-([A B] A)
6++ tail: $-([A B] B)
6++ tail: $-([A B] B)
7++ not: $-(? ?)
7++ not: $-(? ?)
8−++ eq: field access is not supported by partial inference
9+$ list: cases proven disjoint; mold not checked
8+$ list: cases proven disjoint; mold not checked
10+$ unit: cases proven disjoint; mold not checked
9+$ unit: cases proven disjoint; mold not checked
11++ fall: $-([(unit A) A] A)
10++ fall: $-([(unit A) A] A)
@@ -49,8 +48,6 @@ partial inference; module not checked
49++ biff: $-([(unit A) $-(A (unit B))] (unit B))
48++ biff: $-([(unit A) $-(A (unit B))] (unit B))
50++ both: unit construction needs the standard prelude in partial inference
49++ both: unit construction needs the standard prelude in partial inference
51++ clap: unit construction needs the standard prelude in partial inference
50++ clap: unit construction needs the standard prelude in partial inference
52−++ hunt: $-([$-([A A] ?) [(unit A) (unit A)]] (unit A))
53−++ mate: name is not available to partial inference
54++ clef: $-([(unit A) [(unit B) $-([A B] (unit C))]] (unit C))
51++ clef: $-([(unit A) [(unit B) $-([A B] (unit C))]] (unit C))
55++ skim: sample mold is not supported by partial inference
52++ skim: sample mold is not supported by partial inference
56++ skip: sample mold is not supported by partial inference
53++ skip: sample mold is not supported by partial inference
tests/golden/types-arithmetic-module/source.jibb+1−1
@@ -1,7 +1,7 @@
1/= math /ui/math
1/= math /ui/math
2++ decimal ^- @ud (sum.math 1 2)
2++ decimal ^- @ud (sum.math 1 2)
3++ hex ^- @ux (sum.math 0x1 0x2)
3++ hex ^- @ux (sum.math 0x1 0x2)
4−++ text-value ^- @t (alias.math "a" "b")
4+++ text ^- @t (alias.math "a" "b")
5++ ship ^- @p (down.math ~zod)
5++ ship ^- @p (down.math ~zod)
6++ reject-bool (sum.math %.y %.n)
6++ reject-bool (sum.math %.y %.n)
7++ reject-down (down.math %.y)
7++ reject-down (down.math %.y)
tests/golden/types-arithmetic-module/tokens.txt+8−8
@@ -26,14 +26,14 @@
263:32 tight glyph )
263:32 tight glyph )
274:1 NEWLINE
274:1 NEWLINE
284:1 glyph ++
284:1 glyph ++
29−4:4 name text-value
29+4:4 name text
30−4:15 glyph ^-
30+4:9 glyph ^-
31−4:18 aura @t
31+4:12 aura @t
32−4:21 glyph (
32+4:15 glyph (
33−4:22 tight wing alias.math
33+4:16 tight wing alias.math
34−4:33 str "a"
34+4:27 str "a"
35−4:37 str "b"
35+4:31 str "b"
36−4:40 tight glyph )
36+4:34 tight glyph )
375:1 NEWLINE
375:1 NEWLINE
385:1 glyph ++
385:1 glyph ++
395:4 name ship
395:4 name ship
tests/golden/types-arithmetic-module/tree.txt+5−5
@@ -10,11 +10,11 @@
10 (aura 3:11 @ux)
10 (aura 3:11 @ux)
11 (group 3:15
11 (group 3:15
12 (call 3:16 (wing 3:16 sum.math) (lit 3:25 0x1) (lit 3:29 0x2)))))
12 (call 3:16 (wing 3:16 sum.math) (lit 3:25 0x1) (lit 3:29 0x2)))))
13− (value 4:1 text-value
13+ (value 4:1 text
14− (cast 4:15
14+ (cast 4:9
15− (aura 4:18 @t)
15+ (aura 4:12 @t)
16− (group 4:21
16+ (group 4:15
17− (call 4:22 (wing 4:22 alias.math) (str 4:33 "a") (str 4:37 "b")))))
17+ (call 4:16 (wing 4:16 alias.math) (str 4:27 "a") (str 4:31 "b")))))
18 (value 5:1 ship
18 (value 5:1 ship
19 (cast 5:9
19 (cast 5:9
20 (aura 5:12 @p)
20 (aura 5:12 @p)
tests/golden/types-arithmetic-module/types.txt+2−2
@@ -1,7 +1,7 @@
1partial inference; module not checked
1partial inference; module not checked
2++ decimal: @ud
2++ decimal: @ud
3++ hex: @ux
3++ hex: @ux
4−++ text-value: @t
4+++ text: @t
5++ ship: @p
5++ ship: @p
6++ reject-bool: call's sample and argument types do not unify
6++ reject-bool: call's sample and argument types do not unify
7/tests/golden/types-arithmetic-module/source.jibb:6:17: called gate has type $-([a=A b=A] A) where A is an atom other than ?
7/tests/golden/types-arithmetic-module/source.jibb:6:17: called gate has type $-([a=A b=A] A) where A is an atom other than ?
@@ -25,7 +25,7 @@ partial inference; module not checked
25++ reject-alias (alias.math %.n %.y)
25++ reject-alias (alias.math %.n %.y)
26 ^
26 ^
27++ reject-any: call constraint is not supported by partial inference
27++ reject-any: call constraint is not supported by partial inference
28−++ nested: $-(A A) where A is an atom other than ?
28+++ nested: local definitions need unsupported inference
29++ inc-decimal: @ud
29++ inc-decimal: @ud
30++ inc-hex: @ux
30++ inc-hex: @ux
31++ inc-bool: call's sample and argument types do not unify
31++ 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 @@
10++ identity |= x
10++ identity |= x
11 ?- x
11 ?- x
12 [a b c] [a b c]
12 [a b c] [a b c]
13−++ text-value (identity "hi" ~zod %.y)
13+++ text (identity "hi" ~zod %.y)
14++ ship (identity ~zod "hi" %.n)
14++ ship (identity ~zod "hi" %.n)
15++ shared |= x=[A A A]
15++ shared |= x=[A A A]
16 ?- x
16 ?- x
tests/golden/types-cell-pattern-schemes/tokens.txt+7−7
@@ -73,13 +73,13 @@
7313:1 DEDENT
7313:1 DEDENT
7413:1 NEWLINE
7413:1 NEWLINE
7513:1 glyph ++
7513:1 glyph ++
76−13:4 name text-value
76+13:4 name text
77−13:15 glyph (
77+13:9 glyph (
78−13:16 tight name identity
78+13:10 tight name identity
79−13:25 str "hi"
79+13:19 str "hi"
80−13:30 lit ~zod
80+13:24 lit ~zod
81−13:35 lit %.y
81+13:29 lit %.y
82−13:38 tight glyph )
82+13:32 tight glyph )
8314:1 NEWLINE
8314:1 NEWLINE
8414:1 glyph ++
8414:1 glyph ++
8514:4 name ship
8514:4 name ship
tests/golden/types-cell-pattern-schemes/tree.txt+3−3
@@ -31,9 +31,9 @@
31 (arm 12:5
31 (arm 12:5
32 (cell 12:5 (bind 12:6 a) (bind 12:8 b) (bind 12:10 c))
32 (cell 12:5 (bind 12:6 a) (bind 12:8 b) (bind 12:10 c))
33 (tuple 12:13 (wing 12:14 a) (wing 12:16 b) (wing 12:18 c)))))))
33 (tuple 12:13 (wing 12:14 a) (wing 12:16 b) (wing 12:18 c)))))))
34− (value 13:1 text-value
34+ (value 13:1 text
35− (group 13:15
35+ (group 13:9
36− (call 13:16 (wing 13:16 identity) (str 13:25 "hi") (lit 13:30 ~zod) (lit 13:35 %.y))))
36+ (call 13:10 (wing 13:10 identity) (str 13:19 "hi") (lit 13:24 ~zod) (lit 13:29 %.y))))
37 (value 14:1 ship
37 (value 14:1 ship
38 (group 14:9
38 (group 14:9
39 (call 14:10 (wing 14:10 identity) (lit 14:19 ~zod) (str 14:24 "hi") (lit 14:29 %.n))))
39 (call 14:10 (wing 14:10 identity) (lit 14:19 ~zod) (str 14:24 "hi") (lit 14:29 %.n))))
tests/golden/types-cell-pattern-schemes/types.txt+1−1
@@ -3,7 +3,7 @@ partial inference; module not checked
3++ maybe-union: cell pattern subject is not supported by partial inference
3++ maybe-union: cell pattern subject is not supported by partial inference
4++ maybe-list: cell pattern subject is not supported by partial inference
4++ maybe-list: cell pattern subject is not supported by partial inference
5++ identity: $-([A [B C]] [A [B C]])
5++ identity: $-([A [B C]] [A [B C]])
6−++ text-value: [@t [@p ?]]
6+++ text: [@t [@p ?]]
7++ ship: [@p [@t ?]]
7++ ship: [@p [@t ?]]
8++ shared: $-([A [A A]] [A [A A]])
8++ shared: $-([A [A A]] [A [A A]])
9++ wrong: call's sample and argument types do not unify
9++ wrong: call's sample and argument types do not unify
tests/golden/types-generic-face-inference/types.txt+1−7
@@ -10,10 +10,4 @@ partial inference; module not checked
10/tests/golden/types-generic-face-inference/source.jibb:7:60: expression has type [left=@t rest=@ud]
10/tests/golden/types-generic-face-inference/source.jibb:7:60: expression has type [left=@t rest=@ud]
11++ mismatch |= x=[left=@t rest=@ud] ^- [right=@t rest=@ud] x
11++ mismatch |= x=[left=@t rest=@ud] ^- [right=@t rest=@ud] x
12 ^
12 ^
13−++ uncertain: distinct type variables `A` and `B` must not be forced equal; use the same capital for a shared type
13+++ uncertain: cast constraint is not supported by partial inference
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-gates/about.txt+1−1
@@ -1,4 +1,4 @@
1source: Grammar, Molds: "Generic molds" are defined with `|$` after a `+$` name; type variables are capitals.
1source: Grammar, Molds: "Generic molds" are defined with `|$` after a `+$` name; type variables are capitals.
2−tests: Nonrecursive generic gate and two-parameter record molds retain independent parameter types; a user mold named `map` does not acquire the collection key constraint.
2+tests: Nonrecursive generic gate and two-parameter record molds retain independent parameter types.
3expect: parses
3expect: parses
4expect-types: a partial inference report
4expect-types: a partial inference report
tests/golden/types-generic-gates/source.jibb−2
@@ -2,5 +2,3 @@
2+$ duo |$ [A B] [left=A right=B]
2+$ duo |$ [A B] [left=A right=B]
3++ gate ^- (mapper @t @t) |= x=@t x
3++ gate ^- (mapper @t @t) |= x=@t x
4++ pair ^- (duo @t @p) [left="hi" right=~zod]
4++ pair ^- (duo @t @p) [left="hi" right=~zod]
5−+$ map |$ [A B] [first=A second=B]
6−++ named-map ^- (map $-(@t @t) @t) [first=(|= x=@t x) second="ok"]
tests/golden/types-generic-gates/tokens.txt+1−43
@@ -56,46 +56,4 @@
564:40 tight glyph =
564:40 tight glyph =
574:41 tight lit ~zod
574:41 tight lit ~zod
584:45 tight glyph ]
584:45 tight glyph ]
59−5:1 NEWLINE
60−5:1 glyph +$
61−5:4 name map
62−5:8 glyph |$
63−5:11 glyph [
64−5:12 tight tvar A
65−5:14 tvar B
66−5:15 tight glyph ]
67−5:17 glyph [
68−5:18 tight name first
69−5:23 tight glyph =
70−5:24 tight tvar A
71−5:26 name second
72−5:32 tight glyph =
73−5:33 tight tvar B
74−5:34 tight glyph ]
75−6:1 NEWLINE
76−6:1 glyph ++
77−6:4 name named-map
78−6:14 glyph ^-
79−6:17 glyph (
80−6:18 tight name map
81−6:22 glyph $-(
82−6:25 tight aura @t
83−6:28 aura @t
84−6:30 tight glyph )
85−6:32 aura @t
86−6:34 tight glyph )
87−6:36 glyph [
88−6:37 tight name first
89−6:42 tight glyph =
90−6:43 tight glyph (
91−6:44 tight glyph |=
92−6:47 name x
93−6:48 tight glyph =
94−6:49 tight aura @t
95−6:52 name x
96−6:53 tight glyph )
97−6:55 name second
98−6:61 tight glyph =
99−6:62 tight str "ok"
100−6:66 tight glyph ]
101−6:67 NEWLINE
59+4:46 NEWLINE
tests/golden/types-generic-gates/tree.txt+1−18
@@ -18,21 +18,4 @@
18 (apply 4:12 duo (aura 4:17 @t) (aura 4:20 @p))
18 (apply 4:12 duo (aura 4:17 @t) (aura 4:20 @p))
19 (tuple 4:24
19 (tuple 4:24
20 (face 4:25 left (str 4:30 "hi"))
20 (face 4:25 left (str 4:30 "hi"))
21− (face 4:35 right (lit 4:41 ~zod)))))
21+ (face 4:35 right (lit 4:41 ~zod))))))
22− (mold 5:1 map
23− (generic 5:8 A B
24− (cell 5:17
25− (face 5:18 first (tvar 5:24 A))
26− (face 5:26 second (tvar 5:33 B)))))
27− (value 6:1 named-map
28− (cast 6:14
29− (apply 6:17 map
30− (fn 6:22 (aura 6:25 @t) (aura 6:28 @t))
31− (aura 6:32 @t))
32− (tuple 6:36
33− (face 6:37 first
34− (group 6:43
35− (gate 6:44
36− (face 6:47 x (aura 6:49 @t))
37− (wing 6:52 x))))
38− (face 6:55 second (str 6:62 "ok"))))))
tests/golden/types-generic-gates/types.txt−2
@@ -3,5 +3,3 @@ partial inference; module not checked
3+$ duo: not checked
3+$ duo: not checked
4++ gate: $-(@t @t)
4++ gate: $-(@t @t)
5++ pair: [left=@t right=@p]
5++ pair: [left=@t right=@p]
6−+$ map: not checked
7−++ named-map: [first=$-(@t @t) second=@t]
tests/golden/types-generic-result-context/source.jibb+9−9
@@ -10,15 +10,15 @@
10+$ swap |$ [A B] (choice B A)
10+$ swap |$ [A B] (choice B A)
11+$ repeated |$ [A] (choice A A)
11+$ repeated |$ [A] (choice A A)
12+$ phantom |$ [A B] (choice A @p)
12+$ phantom |$ [A B] (choice A @p)
13−++ wrap-value |= x=A ^- (choice A @p) [%one x]
13+++ wrap |= x=A ^- (choice A @p) [%one x]
14−++ wrap-value-repeat |= x=A ^- (repeated A) [%one x]
14+++ wrap-repeat |= x=A ^- (repeated A) [%one x]
15−++ use-msg ^- (choice msg @p) (wrap-value %idle)
15+++ use-msg ^- (choice msg @p) (wrap %idle)
16−++ use-alias ^- (swap @p msg) (wrap-value %idle)
16+++ use-alias ^- (swap @p msg) (wrap %idle)
17−++ use-repeated ^- (repeated msg) (wrap-value-repeat %idle)
17+++ use-repeated ^- (repeated msg) (wrap-repeat %idle)
18−++ use-distinct ^- (choice other @p) (wrap-value %idle)
18+++ use-distinct ^- (choice other @p) (wrap %idle)
19++ independent |= [m=msg n=other]
19++ independent |= [m=msg n=other]
20− [(^- (choice msg @p) (wrap-value m)) (^- (choice other @p) (wrap-value n))]
20+ [(^- (choice msg @p) (wrap m)) (^- (choice other @p) (wrap n))]
21++ pending
21++ pending
22 ~& %orphan
22 ~& %orphan
23− ^- (choice msg @p) (wrap-value %idle)
23+ ^- (choice msg @p) (wrap %idle)
24−++ wrong-case ^- (choice msg @p) (wrap-value %absent)
24+++ wrong-case ^- (choice msg @p) (wrap %absent)
tests/golden/types-generic-result-context/tokens.txt+65−65
@@ -76,37 +76,37 @@
7612:33 tight glyph )
7612:33 tight glyph )
7713:1 NEWLINE
7713:1 NEWLINE
7813:1 glyph ++
7813:1 glyph ++
79−13:4 name wrap-value
79+13:4 name wrap
80−13:15 glyph |=
80+13:9 glyph |=
81−13:18 name x
81+13:12 name x
82−13:19 tight glyph =
82+13:13 tight glyph =
83−13:20 tight tvar A
83+13:14 tight tvar A
84−13:22 glyph ^-
84+13:16 glyph ^-
85−13:25 glyph (
85+13:19 glyph (
86−13:26 tight name choice
86+13:20 tight name choice
87−13:33 tvar A
87+13:27 tvar A
88−13:35 aura @p
88+13:29 aura @p
89−13:37 tight glyph )
89+13:31 tight glyph )
90−13:39 glyph [
90+13:33 glyph [
91−13:40 tight lit %one
91+13:34 tight lit %one
92−13:45 name x
92+13:39 name x
93−13:46 tight glyph ]
93+13:40 tight glyph ]
9414:1 NEWLINE
9414:1 NEWLINE
9514:1 glyph ++
9514:1 glyph ++
96−14:4 name wrap-value-repeat
96+14:4 name wrap-repeat
97−14:22 glyph |=
97+14:16 glyph |=
98−14:25 name x
98+14:19 name x
99−14:26 tight glyph =
99+14:20 tight glyph =
100−14:27 tight tvar A
100+14:21 tight tvar A
101−14:29 glyph ^-
101+14:23 glyph ^-
102−14:32 glyph (
102+14:26 glyph (
103−14:33 tight name repeated
103+14:27 tight name repeated
104−14:42 tvar A
104+14:36 tvar A
105−14:43 tight glyph )
105+14:37 tight glyph )
106−14:45 glyph [
106+14:39 glyph [
107−14:46 tight lit %one
107+14:40 tight lit %one
108−14:51 name x
108+14:45 name x
109−14:52 tight glyph ]
109+14:46 tight glyph ]
11015:1 NEWLINE
11015:1 NEWLINE
11115:1 glyph ++
11115:1 glyph ++
11215:4 name use-msg
11215:4 name use-msg
@@ -117,9 +117,9 @@
11715:27 aura @p
11715:27 aura @p
11815:29 tight glyph )
11815:29 tight glyph )
11915:31 glyph (
11915:31 glyph (
120−15:32 tight name wrap-value
120+15:32 tight name wrap
121−15:43 lit %idle
121+15:37 lit %idle
122−15:48 tight glyph )
122+15:42 tight glyph )
12316:1 NEWLINE
12316:1 NEWLINE
12416:1 glyph ++
12416:1 glyph ++
12516:4 name use-alias
12516:4 name use-alias
@@ -130,9 +130,9 @@
13016:26 name msg
13016:26 name msg
13116:29 tight glyph )
13116:29 tight glyph )
13216:31 glyph (
13216:31 glyph (
133−16:32 tight name wrap-value
133+16:32 tight name wrap
134−16:43 lit %idle
134+16:37 lit %idle
135−16:48 tight glyph )
135+16:42 tight glyph )
13617:1 NEWLINE
13617:1 NEWLINE
13717:1 glyph ++
13717:1 glyph ++
13817:4 name use-repeated
13817:4 name use-repeated
@@ -142,9 +142,9 @@
14217:30 name msg
14217:30 name msg
14317:33 tight glyph )
14317:33 tight glyph )
14417:35 glyph (
14417:35 glyph (
145−17:36 tight name wrap-value-repeat
145+17:36 tight name wrap-repeat
146−17:54 lit %idle
146+17:48 lit %idle
147−17:59 tight glyph )
147+17:53 tight glyph )
14818:1 NEWLINE
14818:1 NEWLINE
14918:1 glyph ++
14918:1 glyph ++
15018:4 name use-distinct
15018:4 name use-distinct
@@ -155,9 +155,9 @@
15518:34 aura @p
15518:34 aura @p
15618:36 tight glyph )
15618:36 tight glyph )
15718:38 glyph (
15718:38 glyph (
158−18:39 tight name wrap-value
158+18:39 tight name wrap
159−18:50 lit %idle
159+18:44 lit %idle
160−18:55 tight glyph )
160+18:49 tight glyph )
16119:1 NEWLINE
16119:1 NEWLINE
16219:1 glyph ++
16219:1 glyph ++
16319:4 name independent
16319:4 name independent
@@ -180,23 +180,23 @@
18020:20 aura @p
18020:20 aura @p
18120:22 tight glyph )
18120:22 tight glyph )
18220:24 glyph (
18220:24 glyph (
183−20:25 tight name wrap-value
183+20:25 tight name wrap
184−20:36 name m
184+20:30 name m
185−20:37 tight glyph )
185+20:31 tight glyph )
186−20:38 tight glyph )
186+20:32 tight glyph )
187−20:40 glyph (
187+20:34 glyph (
188−20:41 tight glyph ^-
188+20:35 tight glyph ^-
189−20:44 glyph (
189+20:38 glyph (
190−20:45 tight name choice
190+20:39 tight name choice
191−20:52 name other
191+20:46 name other
192−20:58 aura @p
192+20:52 aura @p
193−20:60 tight glyph )
193+20:54 tight glyph )
194−20:62 glyph (
194+20:56 glyph (
195−20:63 tight name wrap-value
195+20:57 tight name wrap
196−20:74 name n
196+20:62 name n
197−20:75 tight glyph )
197+20:63 tight glyph )
198−20:76 tight glyph )
198+20:64 tight glyph )
199−20:77 tight glyph ]
199+20:65 tight glyph ]
20021:1 DEDENT
20021:1 DEDENT
20121:1 NEWLINE
20121:1 NEWLINE
20221:1 glyph ++
20221:1 glyph ++
@@ -212,9 +212,9 @@
21223:20 aura @p
21223:20 aura @p
21323:22 tight glyph )
21323:22 tight glyph )
21423:24 glyph (
21423:24 glyph (
215−23:25 tight name wrap-value
215+23:25 tight name wrap
216−23:36 lit %idle
216+23:30 lit %idle
217−23:41 tight glyph )
217+23:35 tight glyph )
21824:1 DEDENT
21824:1 DEDENT
21924:1 DEDENT
21924:1 DEDENT
22024:1 NEWLINE
22024:1 NEWLINE
@@ -227,7 +227,7 @@
22724:30 aura @p
22724:30 aura @p
22824:32 tight glyph )
22824:32 tight glyph )
22924:34 glyph (
22924:34 glyph (
230−24:35 tight name wrap-value
230+24:35 tight name wrap
231−24:46 lit %absent
231+24:40 lit %absent
232−24:53 tight glyph )
232+24:47 tight glyph )
233−24:54 NEWLINE
233+24:48 NEWLINE
tests/golden/types-generic-result-context/tree.txt+24−24
@@ -21,38 +21,38 @@
21 (mold 12:1 phantom
21 (mold 12:1 phantom
22 (generic 12:12 A B
22 (generic 12:12 A B
23 (apply 12:21 choice (tvar 12:29 A) (aura 12:31 @p))))
23 (apply 12:21 choice (tvar 12:29 A) (aura 12:31 @p))))
24− (value 13:1 wrap-value
24+ (value 13:1 wrap
25− (gate 13:15
25+ (gate 13:9
26− (face 13:18 x (tvar 13:20 A))
26+ (face 13:12 x (tvar 13:14 A))
27− (cast 13:22
27+ (cast 13:16
28− (apply 13:25 choice (tvar 13:33 A) (aura 13:35 @p))
28+ (apply 13:19 choice (tvar 13:27 A) (aura 13:29 @p))
29− (tuple 13:39 (lit 13:40 %one) (wing 13:45 x)))))
29+ (tuple 13:33 (lit 13:34 %one) (wing 13:39 x)))))
30− (value 14:1 wrap-value-repeat
30+ (value 14:1 wrap-repeat
31− (gate 14:22
31+ (gate 14:16
32− (face 14:25 x (tvar 14:27 A))
32+ (face 14:19 x (tvar 14:21 A))
33− (cast 14:29
33+ (cast 14:23
34− (apply 14:32 repeated (tvar 14:42 A))
34+ (apply 14:26 repeated (tvar 14:36 A))
35− (tuple 14:45 (lit 14:46 %one) (wing 14:51 x)))))
35+ (tuple 14:39 (lit 14:40 %one) (wing 14:45 x)))))
36 (value 15:1 use-msg
36 (value 15:1 use-msg
37 (cast 15:12
37 (cast 15:12
38 (apply 15:15 choice (ref 15:23 msg) (aura 15:27 @p))
38 (apply 15:15 choice (ref 15:23 msg) (aura 15:27 @p))
39 (group 15:31
39 (group 15:31
40− (call 15:32 (wing 15:32 wrap-value) (lit 15:43 %idle)))))
40+ (call 15:32 (wing 15:32 wrap) (lit 15:37 %idle)))))
41 (value 16:1 use-alias
41 (value 16:1 use-alias
42 (cast 16:14
42 (cast 16:14
43 (apply 16:17 swap (aura 16:23 @p) (ref 16:26 msg))
43 (apply 16:17 swap (aura 16:23 @p) (ref 16:26 msg))
44 (group 16:31
44 (group 16:31
45− (call 16:32 (wing 16:32 wrap-value) (lit 16:43 %idle)))))
45+ (call 16:32 (wing 16:32 wrap) (lit 16:37 %idle)))))
46 (value 17:1 use-repeated
46 (value 17:1 use-repeated
47 (cast 17:17
47 (cast 17:17
48 (apply 17:20 repeated (ref 17:30 msg))
48 (apply 17:20 repeated (ref 17:30 msg))
49 (group 17:35
49 (group 17:35
50− (call 17:36 (wing 17:36 wrap-value-repeat) (lit 17:54 %idle)))))
50+ (call 17:36 (wing 17:36 wrap-repeat) (lit 17:48 %idle)))))
51 (value 18:1 use-distinct
51 (value 18:1 use-distinct
52 (cast 18:17
52 (cast 18:17
53 (apply 18:20 choice (ref 18:28 other) (aura 18:34 @p))
53 (apply 18:20 choice (ref 18:28 other) (aura 18:34 @p))
54 (group 18:38
54 (group 18:38
55− (call 18:39 (wing 18:39 wrap-value) (lit 18:50 %idle)))))
55+ (call 18:39 (wing 18:39 wrap) (lit 18:44 %idle)))))
56 (value 19:1 independent
56 (value 19:1 independent
57 (gate 19:16
57 (gate 19:16
58 (cell 19:19
58 (cell 19:19
@@ -64,12 +64,12 @@
64 (cast 20:5
64 (cast 20:5
65 (apply 20:8 choice (ref 20:16 msg) (aura 20:20 @p))
65 (apply 20:8 choice (ref 20:16 msg) (aura 20:20 @p))
66 (group 20:24
66 (group 20:24
67− (call 20:25 (wing 20:25 wrap-value) (wing 20:36 m)))))
67+ (call 20:25 (wing 20:25 wrap) (wing 20:30 m)))))
68− (group 20:40
68+ (group 20:34
69− (cast 20:41
69+ (cast 20:35
70− (apply 20:44 choice (ref 20:52 other) (aura 20:58 @p))
70+ (apply 20:38 choice (ref 20:46 other) (aura 20:52 @p))
71− (group 20:62
71+ (group 20:56
72− (call 20:63 (wing 20:63 wrap-value) (wing 20:74 n)))))))))
72+ (call 20:57 (wing 20:57 wrap) (wing 20:62 n)))))))))
73 (value 21:1 pending
73 (value 21:1 pending
74 (body 22:3
74 (body 22:3
75 (trace 22:3
75 (trace 22:3
@@ -78,9 +78,9 @@
78 (cast 23:5
78 (cast 23:5
79 (apply 23:8 choice (ref 23:16 msg) (aura 23:20 @p))
79 (apply 23:8 choice (ref 23:16 msg) (aura 23:20 @p))
80 (group 23:24
80 (group 23:24
81− (call 23:25 (wing 23:25 wrap-value) (lit 23:36 %idle))))))))
81+ (call 23:25 (wing 23:25 wrap) (lit 23:30 %idle))))))))
82 (value 24:1 wrong-case
82 (value 24:1 wrong-case
83 (cast 24:15
83 (cast 24:15
84 (apply 24:18 choice (ref 24:26 msg) (aura 24:30 @p))
84 (apply 24:18 choice (ref 24:26 msg) (aura 24:30 @p))
85 (group 24:34
85 (group 24:34
86− (call 24:35 (wing 24:35 wrap-value) (lit 24:46 %absent))))))
86+ (call 24:35 (wing 24:35 wrap) (lit 24:40 %absent))))))
tests/golden/types-generic-result-context/types.txt+6−6
@@ -5,8 +5,8 @@ partial inference; module not checked
5+$ swap: not checked
5+$ swap: not checked
6+$ repeated: not checked
6+$ repeated: not checked
7+$ phantom: not checked
7+$ phantom: not checked
8−++ wrap-value: $-(A (choice A @p))
8+++ wrap: $-(A (choice A @p))
9−++ wrap-value-repeat: $-(A (choice A A))
9+++ wrap-repeat: $-(A (choice A A))
10++ use-msg: (choice msg @p)
10++ use-msg: (choice msg @p)
11++ use-alias: (choice msg @p)
11++ use-alias: (choice msg @p)
12++ use-repeated: (choice msg msg)
12++ use-repeated: (choice msg msg)
@@ -15,8 +15,8 @@ partial inference; module not checked
15++ pending: tag needs context in partial inference
15++ pending: tag needs context in partial inference
16++ wrong-case: msg has no case `%absent`
16++ wrong-case: msg has no case `%absent`
17/tests/golden/types-generic-result-context/source.jibb:24:35: expected union
17/tests/golden/types-generic-result-context/source.jibb:24:35: expected union
18−++ wrong-case ^- (choice msg @p) (wrap-value %absent)
18+++ wrong-case ^- (choice msg @p) (wrap %absent)
19 ^
19 ^
20−/tests/golden/types-generic-result-context/source.jibb:24:46: tag
20+/tests/golden/types-generic-result-context/source.jibb:24:40: tag
21−++ wrong-case ^- (choice msg @p) (wrap-value %absent)
21+++ wrong-case ^- (choice msg @p) (wrap %absent)
22− ^
22+ ^
tests/golden/types-generic-union-escaping/module-trees.txt+4−4
@@ -6,10 +6,10 @@
6/ui/mid.jibb
6/ui/mid.jibb
7(module
7(module
8 (jibb 1:1 base /ui/base)
8 (jibb 1:1 base /ui/base)
9− (value 2:1 text-value
9+ (value 2:1 text
10− (cast 2:15
10+ (cast 2:9
11− (apply 2:18 phantom.base (aura 2:32 @t))
11+ (apply 2:12 phantom.base (aura 2:26 @t))
12− (lit 2:36 %yes)))
12+ (lit 2:30 %yes)))
13 (value 3:1 ship
13 (value 3:1 ship
14 (cast 3:9
14 (cast 3:9
15 (apply 3:12 phantom.base (aura 3:26 @p))
15 (apply 3:12 phantom.base (aura 3:26 @p))
tests/golden/types-generic-union-escaping/modules/ui/mid.jibb+1−1
@@ -1,3 +1,3 @@
1/= base /ui/base
1/= base /ui/base
2−++ text-value ^- (phantom.base @t) %yes
2+++ text ^- (phantom.base @t) %yes
3++ ship ^- (phantom.base @p) %yes
3++ ship ^- (phantom.base @p) %yes
tests/golden/types-generic-union-escaping/source.jibb+1−1
@@ -1,3 +1,3 @@
1/= mid /ui/mid
1/= mid /ui/mid
2−++ text-value text-value.mid
2+++ text-value text.mid
3++ ship-value ship.mid
3++ ship-value ship.mid
tests/golden/types-generic-union-escaping/tokens.txt+1−1
@@ -7,7 +7,7 @@
72:1 NEWLINE
72:1 NEWLINE
82:1 glyph ++
82:1 glyph ++
92:4 name text-value
92:4 name text-value
10−2:15 wing text-value.mid
10+2:15 wing text.mid
113:1 NEWLINE
113:1 NEWLINE
123:1 glyph ++
123:1 glyph ++
133:4 name ship-value
133:4 name ship-value
tests/golden/types-generic-union-escaping/tree.txt+1−1
@@ -1,4 +1,4 @@
1(module
1(module
2 (jibb 1:1 mid /ui/mid)
2 (jibb 1:1 mid /ui/mid)
3− (value 2:1 text-value (wing 2:15 text-value.mid))
3+ (value 2:1 text-value (wing 2:15 text.mid))
4 (value 3:1 ship-value (wing 3:15 ship.mid)))
4 (value 3:1 ship-value (wing 3:15 ship.mid)))
tests/golden/types-hole-module-boundary/types.txt+1−1
@@ -1,2 +1,2 @@
1partial inference; module not checked
1partial inference; module not checked
2−module definitions need unsupported inference: /ui/lib/jibb: ++ id
2+module definitions need unsupported inference: /ui/lib/jibb
tests/golden/types-hole-numeric-capture/types.txt+4−10
@@ -1,16 +1,10 @@
1partial inference; module not checked
1partial inference; module not checked
2++ same: $-([a=A b=A] A)
2++ same: $-([a=A b=A] A)
3++ independent: @ud
3++ independent: @ud
4−++ first: explicit capital constraints are not supported by partial inference
4+++ first: call constraint is not supported by partial inference
5−++ second: explicit capital constraints are not supported by partial inference
5+++ second: call constraint is not supported by partial inference
6−++ capture: type hole needs unsupported inference
6+++ capture: local definitions need unsupported inference
7−/tests/golden/types-hole-numeric-capture/source.jibb:6:15: type hole
8− ++ local ^- _ (same x 1)
9− ^
10++ local-independent: $-(@t @t)
7++ local-independent: $-(@t @t)
11++ unresolved-tag: tag needs context in partial inference
8++ unresolved-tag: tag needs context in partial inference
12++ discarded-number: @t
9++ discarded-number: @t
13−++ captured-second: type hole needs unsupported inference
10+++ captured-second: local definitions need unsupported inference
14−/tests/golden/types-hole-numeric-capture/source.jibb:18:15: type hole
15− ++ local ^- _ (same 1 x)
16− ^
tests/golden/types-local-capitals/about.txt+1−1
@@ -1,4 +1,4 @@
1source: Grammar, Molds: "A capital in a local `++` shares the enclosing `++`'s variable of the same name if the enclosing `++` also uses it; otherwise the local `++` introduces and generalizes its own variable."
1source: Grammar, Molds: "A capital in a local `++` shares the enclosing `++`'s variable of the same name if the enclosing `++` also uses it; otherwise the local `++` introduces and generalizes its own variable."
2−tests: A recursive local gate captures a capital in its enclosing sample; a bare local binder generalizes independently. Local-only capitals generalize independently, including across sibling and nested definitions; a capital used later in the enclosing body is shared. Generic mold parameters keep their own scope. Atom constraints and distinct-capital errors retain their source sites. Recursive self aliases remain monomorphic, so incompatible calls through one report the call and argument sites, and unresolved tags remain pending.
2+tests: A recursive local gate captures a capital in its enclosing sample; a bare local binder generalizes independently. Local-only capitals generalize independently, including across sibling and nested definitions; a capital used later in the enclosing body is shared. Generic mold parameters keep their own scope. Atom constraints and distinct-capital errors retain their source sites. Recursive self aliases remain monomorphic and unresolved tags remain pending.
3expect: parses
3expect: parses
4expect-types: a partial inference report
4expect-types: a partial inference report
tests/golden/types-local-capitals/types.txt+1−7
@@ -3,13 +3,7 @@ partial inference; module not checked
3++ later: explicit capital constraints are not supported by partial inference
3++ later: explicit capital constraints are not supported by partial inference
4++ captured: $-(A A)
4++ captured: $-(A A)
5++ implicit: $-(A @p)
5++ implicit: $-(A @p)
6−++ local-mono: call's sample and argument types do not unify
6+++ local-mono: local definitions need unsupported inference
7−/tests/golden/types-local-capitals/source.jibb:27:8: called gate has type $-(@t A)
8− (alias ~zod)
9− ^
10−/tests/golden/types-local-capitals/source.jibb:27:14: argument has type @p
11− (alias ~zod)
12− ^
13++ fresh: $-(@t @t)
7++ fresh: $-(@t @t)
14++ captured-acyclic: $-(A A)
8++ captured-acyclic: $-(A A)
15++ implicit-capture: $-(@t @t)
9++ implicit-capture: $-(@t @t)
tests/golden/types-local-error-call/about.txtdeleted−4
@@ -1,4 +0,0 @@
1−source: Implementation plan, Risks: "Each error names both conflicting sites, with excerpts"; Grammar, Runes: "local names at the start of any body (a gate's, an arm's, a `^-`'s, a `~&`'s or a `++`'s), visible to each other and the final expression".
2−tests: a definite call mismatch inside a local `++` reports the gate and argument sites, as the same call does at top level: calling a top-level gate, a local gate defined earlier, and a top-level gate from inside a local gate's body. When a later sibling's cast fixes the untyped sample's type before a waiting call is retried, the generic message remains, since sibling order can then change the outcome: the site blamed, or, with a gate whose sample is `!!`, whether the body is accepted at all, as it is when that gate comes first.
3−expect: parses
4−expect-types: a partial inference report, not a checked module
tests/golden/types-local-error-call/source.jibbdeleted−27
@@ -1,27 +0,0 @@
1−++ inc |= n=@ud n
2−++ top (inc %.y)
3−++ local |= x=@t
4− ++ bad (inc %.y)
5− x
6−++ local-gate |= x=@t
7− ++ twice |= y=@ud (inc y)
8− ++ bad (twice x)
9− bad
10−++ in-gate |= x=@t
11− ++ bump |= y=@t (inc y)
12− (bump x)
13−++ blame-order |= x
14− ++ a (c x)
15− ++ b ^- @ud x
16− ++ c |= y=@t y
17− a
18−++ blame-empty |= x
19− ++ a (c x)
20− ++ b ^- @ud x
21− ++ c |= y=!! y
22− a
23−++ blame-empty-c-first |= x
24− ++ c |= y=!! y
25− ++ a (c x)
26− ++ b ^- @ud x
27− a
tests/golden/types-local-error-call/tokens.txtdeleted−171
@@ -1,171 +0,0 @@
1−1:1 glyph ++
2−1:4 name inc
3−1:8 glyph |=
4−1:11 name n
5−1:12 tight glyph =
6−1:13 tight aura @ud
7−1:17 name n
8−2:1 NEWLINE
9−2:1 glyph ++
10−2:4 name top
11−2:8 glyph (
12−2:9 tight name inc
13−2:13 lit %.y
14−2:16 tight glyph )
15−3:1 NEWLINE
16−3:1 glyph ++
17−3:4 name local
18−3:10 glyph |=
19−3:13 name x
20−3:14 tight glyph =
21−3:15 tight aura @t
22−4:3 INDENT
23−4:3 glyph ++
24−4:6 name bad
25−4:10 glyph (
26−4:11 tight name inc
27−4:15 lit %.y
28−4:18 tight glyph )
29−5:3 NEWLINE
30−5:3 name x
31−6:1 DEDENT
32−6:1 NEWLINE
33−6:1 glyph ++
34−6:4 name local-gate
35−6:15 glyph |=
36−6:18 name x
37−6:19 tight glyph =
38−6:20 tight aura @t
39−7:3 INDENT
40−7:3 glyph ++
41−7:6 name twice
42−7:12 glyph |=
43−7:15 name y
44−7:16 tight glyph =
45−7:17 tight aura @ud
46−7:21 glyph (
47−7:22 tight name inc
48−7:26 name y
49−7:27 tight glyph )
50−8:3 NEWLINE
51−8:3 glyph ++
52−8:6 name bad
53−8:10 glyph (
54−8:11 tight name twice
55−8:17 name x
56−8:18 tight glyph )
57−9:3 NEWLINE
58−9:3 name bad
59−10:1 DEDENT
60−10:1 NEWLINE
61−10:1 glyph ++
62−10:4 name in-gate
63−10:12 glyph |=
64−10:15 name x
65−10:16 tight glyph =
66−10:17 tight aura @t
67−11:3 INDENT
68−11:3 glyph ++
69−11:6 name bump
70−11:11 glyph |=
71−11:14 name y
72−11:15 tight glyph =
73−11:16 tight aura @t
74−11:19 glyph (
75−11:20 tight name inc
76−11:24 name y
77−11:25 tight glyph )
78−12:3 NEWLINE
79−12:3 glyph (
80−12:4 tight name bump
81−12:9 name x
82−12:10 tight glyph )
83−13:1 DEDENT
84−13:1 NEWLINE
85−13:1 glyph ++
86−13:4 name blame-order
87−13:16 glyph |=
88−13:19 name x
89−14:3 INDENT
90−14:3 glyph ++
91−14:6 name a
92−14:8 glyph (
93−14:9 tight name c
94−14:11 name x
95−14:12 tight glyph )
96−15:3 NEWLINE
97−15:3 glyph ++
98−15:6 name b
99−15:8 glyph ^-
100−15:11 aura @ud
101−15:15 name x
102−16:3 NEWLINE
103−16:3 glyph ++
104−16:6 name c
105−16:8 glyph |=
106−16:11 name y
107−16:12 tight glyph =
108−16:13 tight aura @t
109−16:16 name y
110−17:3 NEWLINE
111−17:3 name a
112−18:1 DEDENT
113−18:1 NEWLINE
114−18:1 glyph ++
115−18:4 name blame-empty
116−18:16 glyph |=
117−18:19 name x
118−19:3 INDENT
119−19:3 glyph ++
120−19:6 name a
121−19:8 glyph (
122−19:9 tight name c
123−19:11 name x
124−19:12 tight glyph )
125−20:3 NEWLINE
126−20:3 glyph ++
127−20:6 name b
128−20:8 glyph ^-
129−20:11 aura @ud
130−20:15 name x
131−21:3 NEWLINE
132−21:3 glyph ++
133−21:6 name c
134−21:8 glyph |=
135−21:11 name y
136−21:12 tight glyph =
137−21:13 tight glyph !!
138−21:16 name y
139−22:3 NEWLINE
140−22:3 name a
141−23:1 DEDENT
142−23:1 NEWLINE
143−23:1 glyph ++
144−23:4 name blame-empty-c-first
145−23:24 glyph |=
146−23:27 name x
147−24:3 INDENT
148−24:3 glyph ++
149−24:6 name c
150−24:8 glyph |=
151−24:11 name y
152−24:12 tight glyph =
153−24:13 tight glyph !!
154−24:16 name y
155−25:3 NEWLINE
156−25:3 glyph ++
157−25:6 name a
158−25:8 glyph (
159−25:9 tight name c
160−25:11 name x
161−25:12 tight glyph )
162−26:3 NEWLINE
163−26:3 glyph ++
164−26:6 name b
165−26:8 glyph ^-
166−26:11 aura @ud
167−26:15 name x
168−27:3 NEWLINE
169−27:3 name a
170−27:4 DEDENT
171−27:4 NEWLINE
tests/golden/types-local-error-call/tree.txtdeleted−82
@@ -1,82 +0,0 @@
1−(module
2− (value 1:1 inc
3− (gate 1:8
4− (face 1:11 n (aura 1:13 @ud))
5− (wing 1:17 n)))
6− (value 2:1 top
7− (group 2:8
8− (call 2:9 (wing 2:9 inc) (lit 2:13 %.y))))
9− (value 3:1 local
10− (gate 3:10
11− (face 3:13 x (aura 3:15 @t))
12− (body 4:3
13− (value 4:3 bad
14− (group 4:10
15− (call 4:11 (wing 4:11 inc) (lit 4:15 %.y))))
16− (wing 5:3 x))))
17− (value 6:1 local-gate
18− (gate 6:15
19− (face 6:18 x (aura 6:20 @t))
20− (body 7:3
21− (value 7:3 twice
22− (gate 7:12
23− (face 7:15 y (aura 7:17 @ud))
24− (group 7:21
25− (call 7:22 (wing 7:22 inc) (wing 7:26 y)))))
26− (value 8:3 bad
27− (group 8:10
28− (call 8:11 (wing 8:11 twice) (wing 8:17 x))))
29− (wing 9:3 bad))))
30− (value 10:1 in-gate
31− (gate 10:12
32− (face 10:15 x (aura 10:17 @t))
33− (body 11:3
34− (value 11:3 bump
35− (gate 11:11
36− (face 11:14 y (aura 11:16 @t))
37− (group 11:19
38− (call 11:20 (wing 11:20 inc) (wing 11:24 y)))))
39− (group 12:3
40− (call 12:4 (wing 12:4 bump) (wing 12:9 x))))))
41− (value 13:1 blame-order
42− (gate 13:16
43− (bind 13:19 x)
44− (body 14:3
45− (value 14:3 a
46− (group 14:8
47− (call 14:9 (wing 14:9 c) (wing 14:11 x))))
48− (value 15:3 b
49− (cast 15:8 (aura 15:11 @ud) (wing 15:15 x)))
50− (value 16:3 c
51− (gate 16:8
52− (face 16:11 y (aura 16:13 @t))
53− (wing 16:16 y)))
54− (wing 17:3 a))))
55− (value 18:1 blame-empty
56− (gate 18:16
57− (bind 18:19 x)
58− (body 19:3
59− (value 19:3 a
60− (group 19:8
61− (call 19:9 (wing 19:9 c) (wing 19:11 x))))
62− (value 20:3 b
63− (cast 20:8 (aura 20:11 @ud) (wing 20:15 x)))
64− (value 21:3 c
65− (gate 21:8
66− (face 21:11 y (void 21:13))
67− (wing 21:16 y)))
68− (wing 22:3 a))))
69− (value 23:1 blame-empty-c-first
70− (gate 23:24
71− (bind 23:27 x)
72− (body 24:3
73− (value 24:3 c
74− (gate 24:8
75− (face 24:11 y (void 24:13))
76− (wing 24:16 y)))
77− (value 25:3 a
78− (group 25:8
79− (call 25:9 (wing 25:9 c) (wing 25:11 x))))
80− (value 26:3 b
81− (cast 26:8 (aura 26:11 @ud) (wing 26:15 x)))
82− (wing 27:3 a)))))
tests/golden/types-local-error-call/types.txtdeleted−33
@@ -1,33 +0,0 @@
1−partial inference; module not checked
2−++ inc: $-(@ud @ud)
3−++ top: call's sample and argument types do not unify
4−/tests/golden/types-local-error-call/source.jibb:2:9: called gate has type $-(@ud @ud)
5−++ top (inc %.y)
6− ^
7−/tests/golden/types-local-error-call/source.jibb:2:13: argument has type ?
8−++ top (inc %.y)
9− ^
10−++ local: call's sample and argument types do not unify
11−/tests/golden/types-local-error-call/source.jibb:4:11: called gate has type $-(@ud @ud)
12− ++ bad (inc %.y)
13− ^
14−/tests/golden/types-local-error-call/source.jibb:4:15: argument has type ?
15− ++ bad (inc %.y)
16− ^
17−++ local-gate: call's sample and argument types do not unify
18−/tests/golden/types-local-error-call/source.jibb:8:11: called gate has type $-(@ud @ud)
19− ++ bad (twice x)
20− ^
21−/tests/golden/types-local-error-call/source.jibb:8:17: argument has type @t
22− ++ bad (twice x)
23− ^
24−++ in-gate: call's sample and argument types do not unify
25−/tests/golden/types-local-error-call/source.jibb:11:20: called gate has type $-(@ud @ud)
26− ++ bump |= y=@t (inc y)
27− ^
28−/tests/golden/types-local-error-call/source.jibb:11:24: argument has type @t
29− ++ bump |= y=@t (inc y)
30− ^
31−++ blame-order: local definitions need unsupported inference
32−++ blame-empty: local definitions need unsupported inference
33−++ blame-empty-c-first: $-(!! !!)
tests/golden/types-local-error-cast/about.txtdeleted−4
@@ -1,4 +0,0 @@
1−source: Implementation plan, Risks: "Each error names both conflicting sites, with excerpts"; Grammar, Runes: "local names at the start of any body (a gate's, an arm's, a `^-`'s, a `~&`'s or a `++`'s), visible to each other and the final expression".
2−tests: a definite cast mismatch inside a local `++` reports the mold and expression sites, as the same cast does at top level: in a local value, in a later sibling that an earlier one waits on, after a local gate's self-call, in a nested body, and beside a sibling that uses the untyped sample without constraining it. A later sibling that infers but is then unsupported, because it forces an explicit capital to a concrete type or leaves an uncertain type hole, reports its own unsupported message, even after an earlier mismatch: a sibling's cast of the untyped sample to `!!` makes every cast of it fit, so an earlier failure can pass on a retry. When a sibling has constrained the untyped sample before the definitions stall, a mismatch that another order accepts keeps the generic message.
3−expect: parses
4−expect-types: a partial inference report, not a checked module
tests/golden/types-local-error-cast/source.jibbdeleted−56
@@ -1,56 +0,0 @@
1−++ top ^- @t %.y
2−++ local |= x=@t
3− ++ flag ^- @t %.y
4− x
5−++ waiting |= x=@t
6− ++ first (second x)
7− ++ second |= y=@t ^- @ud y
8− first
9−++ after-self |= x=@t
10− ++ recur |= y=@t
11− ?- %.y
12− %.y (recur y)
13− %.n ^- @ud y
14− (recur x)
15−++ nested |= x=@t
16− ++ outer |= y=@t
17− ++ inner ^- @p y
18− inner
19− (outer x)
20−++ mask-capital |= x=A
21− ++ a ^- @ud "s"
22− ++ b ^- @t x
23− x
24−++ mask-after-progress |= x=A
25− ++ a ^- @ud "s"
26− ++ ok x
27− ++ b ^- @t x
28− x
29−++ same |= [a=A b=A] a
30−++ mask-hole |= x
31− ++ a ^- @ud "s"
32− ++ b ^- _ (same x 1)
33− ^- @ux x
34−++ captured |= x
35− ++ a ^- @ud "s"
36− ++ b x
37− a
38−++ empty-mask |= x
39− ++ a [(^- @ux x) (^- @t x)]
40− ++ g ^- !! x
41− ++ d |= y=B ^- @t y
42− a
43−++ empty-ok |= x
44− ++ a [(^- @ux x) (^- @t x)]
45− ++ g ^- !! x
46− a
47−++ empty-stall |= x
48− ++ a ^- @ux x
49− ++ b ^- @t x
50− ++ g ^- !! x
51− a
52−++ empty-stall-g-first |= x
53− ++ g ^- !! x
54− ++ a ^- @ux x
55− ++ b ^- @t x
56− a
tests/golden/types-local-error-cast/tokens.txtdeleted−339
@@ -1,339 +0,0 @@
1−1:1 glyph ++
2−1:4 name top
3−1:8 glyph ^-
4−1:11 aura @t
5−1:14 lit %.y
6−2:1 NEWLINE
7−2:1 glyph ++
8−2:4 name local
9−2:10 glyph |=
10−2:13 name x
11−2:14 tight glyph =
12−2:15 tight aura @t
13−3:3 INDENT
14−3:3 glyph ++
15−3:6 name flag
16−3:11 glyph ^-
17−3:14 aura @t
18−3:17 lit %.y
19−4:3 NEWLINE
20−4:3 name x
21−5:1 DEDENT
22−5:1 NEWLINE
23−5:1 glyph ++
24−5:4 name waiting
25−5:12 glyph |=
26−5:15 name x
27−5:16 tight glyph =
28−5:17 tight aura @t
29−6:3 INDENT
30−6:3 glyph ++
31−6:6 name first
32−6:12 glyph (
33−6:13 tight name second
34−6:20 name x
35−6:21 tight glyph )
36−7:3 NEWLINE
37−7:3 glyph ++
38−7:6 name second
39−7:13 glyph |=
40−7:16 name y
41−7:17 tight glyph =
42−7:18 tight aura @t
43−7:21 glyph ^-
44−7:24 aura @ud
45−7:28 name y
46−8:3 NEWLINE
47−8:3 name first
48−9:1 DEDENT
49−9:1 NEWLINE
50−9:1 glyph ++
51−9:4 name after-self
52−9:15 glyph |=
53−9:18 name x
54−9:19 tight glyph =
55−9:20 tight aura @t
56−10:3 INDENT
57−10:3 glyph ++
58−10:6 name recur
59−10:12 glyph |=
60−10:15 name y
61−10:16 tight glyph =
62−10:17 tight aura @t
63−11:5 INDENT
64−11:5 glyph ?-
65−11:8 lit %.y
66−12:7 INDENT
67−12:7 lit %.y
68−12:11 glyph (
69−12:12 tight name recur
70−12:18 name y
71−12:19 tight glyph )
72−13:7 NEWLINE
73−13:7 lit %.n
74−13:11 glyph ^-
75−13:14 aura @ud
76−13:18 name y
77−14:3 DEDENT
78−14:3 DEDENT
79−14:3 NEWLINE
80−14:3 glyph (
81−14:4 tight name recur
82−14:10 name x
83−14:11 tight glyph )
84−15:1 DEDENT
85−15:1 NEWLINE
86−15:1 glyph ++
87−15:4 name nested
88−15:11 glyph |=
89−15:14 name x
90−15:15 tight glyph =
91−15:16 tight aura @t
92−16:3 INDENT
93−16:3 glyph ++
94−16:6 name outer
95−16:12 glyph |=
96−16:15 name y
97−16:16 tight glyph =
98−16:17 tight aura @t
99−17:5 INDENT
100−17:5 glyph ++
101−17:8 name inner
102−17:14 glyph ^-
103−17:17 aura @p
104−17:20 name y
105−18:5 NEWLINE
106−18:5 name inner
107−19:3 DEDENT
108−19:3 NEWLINE
109−19:3 glyph (
110−19:4 tight name outer
111−19:10 name x
112−19:11 tight glyph )
113−20:1 DEDENT
114−20:1 NEWLINE
115−20:1 glyph ++
116−20:4 name mask-capital
117−20:17 glyph |=
118−20:20 name x
119−20:21 tight glyph =
120−20:22 tight tvar A
121−21:3 INDENT
122−21:3 glyph ++
123−21:6 name a
124−21:8 glyph ^-
125−21:11 aura @ud
126−21:15 str "s"
127−22:3 NEWLINE
128−22:3 glyph ++
129−22:6 name b
130−22:8 glyph ^-
131−22:11 aura @t
132−22:14 name x
133−23:3 NEWLINE
134−23:3 name x
135−24:1 DEDENT
136−24:1 NEWLINE
137−24:1 glyph ++
138−24:4 name mask-after-progress
139−24:24 glyph |=
140−24:27 name x
141−24:28 tight glyph =
142−24:29 tight tvar A
143−25:3 INDENT
144−25:3 glyph ++
145−25:6 name a
146−25:8 glyph ^-
147−25:11 aura @ud
148−25:15 str "s"
149−26:3 NEWLINE
150−26:3 glyph ++
151−26:6 name ok
152−26:9 name x
153−27:3 NEWLINE
154−27:3 glyph ++
155−27:6 name b
156−27:8 glyph ^-
157−27:11 aura @t
158−27:14 name x
159−28:3 NEWLINE
160−28:3 name x
161−29:1 DEDENT
162−29:1 NEWLINE
163−29:1 glyph ++
164−29:4 name same
165−29:9 glyph |=
166−29:12 glyph [
167−29:13 tight name a
168−29:14 tight glyph =
169−29:15 tight tvar A
170−29:17 name b
171−29:18 tight glyph =
172−29:19 tight tvar A
173−29:20 tight glyph ]
174−29:22 name a
175−30:1 NEWLINE
176−30:1 glyph ++
177−30:4 name mask-hole
178−30:14 glyph |=
179−30:17 name x
180−31:3 INDENT
181−31:3 glyph ++
182−31:6 name a
183−31:8 glyph ^-
184−31:11 aura @ud
185−31:15 str "s"
186−32:3 NEWLINE
187−32:3 glyph ++
188−32:6 name b
189−32:8 glyph ^-
190−32:11 glyph _
191−32:13 glyph (
192−32:14 tight name same
193−32:19 name x
194−32:21 lit 1
195−32:22 tight glyph )
196−33:3 NEWLINE
197−33:3 glyph ^-
198−33:6 aura @ux
199−33:10 name x
200−34:1 DEDENT
201−34:1 NEWLINE
202−34:1 glyph ++
203−34:4 name captured
204−34:13 glyph |=
205−34:16 name x
206−35:3 INDENT
207−35:3 glyph ++
208−35:6 name a
209−35:8 glyph ^-
210−35:11 aura @ud
211−35:15 str "s"
212−36:3 NEWLINE
213−36:3 glyph ++
214−36:6 name b
215−36:8 name x
216−37:3 NEWLINE
217−37:3 name a
218−38:1 DEDENT
219−38:1 NEWLINE
220−38:1 glyph ++
221−38:4 name empty-mask
222−38:15 glyph |=
223−38:18 name x
224−39:3 INDENT
225−39:3 glyph ++
226−39:6 name a
227−39:8 glyph [
228−39:9 tight glyph (
229−39:10 tight glyph ^-
230−39:13 aura @ux
231−39:17 name x
232−39:18 tight glyph )
233−39:20 glyph (
234−39:21 tight glyph ^-
235−39:24 aura @t
236−39:27 name x
237−39:28 tight glyph )
238−39:29 tight glyph ]
239−40:3 NEWLINE
240−40:3 glyph ++
241−40:6 name g
242−40:8 glyph ^-
243−40:11 glyph !!
244−40:14 name x
245−41:3 NEWLINE
246−41:3 glyph ++
247−41:6 name d
248−41:8 glyph |=
249−41:11 name y
250−41:12 tight glyph =
251−41:13 tight tvar B
252−41:15 glyph ^-
253−41:18 aura @t
254−41:21 name y
255−42:3 NEWLINE
256−42:3 name a
257−43:1 DEDENT
258−43:1 NEWLINE
259−43:1 glyph ++
260−43:4 name empty-ok
261−43:13 glyph |=
262−43:16 name x
263−44:3 INDENT
264−44:3 glyph ++
265−44:6 name a
266−44:8 glyph [
267−44:9 tight glyph (
268−44:10 tight glyph ^-
269−44:13 aura @ux
270−44:17 name x
271−44:18 tight glyph )
272−44:20 glyph (
273−44:21 tight glyph ^-
274−44:24 aura @t
275−44:27 name x
276−44:28 tight glyph )
277−44:29 tight glyph ]
278−45:3 NEWLINE
279−45:3 glyph ++
280−45:6 name g
281−45:8 glyph ^-
282−45:11 glyph !!
283−45:14 name x
284−46:3 NEWLINE
285−46:3 name a
286−47:1 DEDENT
287−47:1 NEWLINE
288−47:1 glyph ++
289−47:4 name empty-stall
290−47:16 glyph |=
291−47:19 name x
292−48:3 INDENT
293−48:3 glyph ++
294−48:6 name a
295−48:8 glyph ^-
296−48:11 aura @ux
297−48:15 name x
298−49:3 NEWLINE
299−49:3 glyph ++
300−49:6 name b
301−49:8 glyph ^-
302−49:11 aura @t
303−49:14 name x
304−50:3 NEWLINE
305−50:3 glyph ++
306−50:6 name g
307−50:8 glyph ^-
308−50:11 glyph !!
309−50:14 name x
310−51:3 NEWLINE
311−51:3 name a
312−52:1 DEDENT
313−52:1 NEWLINE
314−52:1 glyph ++
315−52:4 name empty-stall-g-first
316−52:24 glyph |=
317−52:27 name x
318−53:3 INDENT
319−53:3 glyph ++
320−53:6 name g
321−53:8 glyph ^-
322−53:11 glyph !!
323−53:14 name x
324−54:3 NEWLINE
325−54:3 glyph ++
326−54:6 name a
327−54:8 glyph ^-
328−54:11 aura @ux
329−54:15 name x
330−55:3 NEWLINE
331−55:3 glyph ++
332−55:6 name b
333−55:8 glyph ^-
334−55:11 aura @t
335−55:14 name x
336−56:3 NEWLINE
337−56:3 name a
338−56:4 DEDENT
339−56:4 NEWLINE
tests/golden/types-local-error-cast/tree.txtdeleted−151
@@ -1,151 +0,0 @@
1−(module
2− (value 1:1 top
3− (cast 1:8 (aura 1:11 @t) (lit 1:14 %.y)))
4− (value 2:1 local
5− (gate 2:10
6− (face 2:13 x (aura 2:15 @t))
7− (body 3:3
8− (value 3:3 flag
9− (cast 3:11 (aura 3:14 @t) (lit 3:17 %.y)))
10− (wing 4:3 x))))
11− (value 5:1 waiting
12− (gate 5:12
13− (face 5:15 x (aura 5:17 @t))
14− (body 6:3
15− (value 6:3 first
16− (group 6:12
17− (call 6:13 (wing 6:13 second) (wing 6:20 x))))
18− (value 7:3 second
19− (gate 7:13
20− (face 7:16 y (aura 7:18 @t))
21− (cast 7:21 (aura 7:24 @ud) (wing 7:28 y))))
22− (wing 8:3 first))))
23− (value 9:1 after-self
24− (gate 9:15
25− (face 9:18 x (aura 9:20 @t))
26− (body 10:3
27− (value 10:3 recur
28− (gate 10:12
29− (face 10:15 y (aura 10:17 @t))
30− (body 11:5
31− (branch 11:5
32− (lit 11:8 %.y)
33− (arm 12:7
34− (lit 12:7 %.y)
35− (group 12:11
36− (call 12:12 (wing 12:12 recur) (wing 12:18 y))))
37− (arm 13:7
38− (lit 13:7 %.n)
39− (cast 13:11 (aura 13:14 @ud) (wing 13:18 y)))))))
40− (group 14:3
41− (call 14:4 (wing 14:4 recur) (wing 14:10 x))))))
42− (value 15:1 nested
43− (gate 15:11
44− (face 15:14 x (aura 15:16 @t))
45− (body 16:3
46− (value 16:3 outer
47− (gate 16:12
48− (face 16:15 y (aura 16:17 @t))
49− (body 17:5
50− (value 17:5 inner
51− (cast 17:14 (aura 17:17 @p) (wing 17:20 y)))
52− (wing 18:5 inner))))
53− (group 19:3
54− (call 19:4 (wing 19:4 outer) (wing 19:10 x))))))
55− (value 20:1 mask-capital
56− (gate 20:17
57− (face 20:20 x (tvar 20:22 A))
58− (body 21:3
59− (value 21:3 a
60− (cast 21:8 (aura 21:11 @ud) (str 21:15 "s")))
61− (value 22:3 b
62− (cast 22:8 (aura 22:11 @t) (wing 22:14 x)))
63− (wing 23:3 x))))
64− (value 24:1 mask-after-progress
65− (gate 24:24
66− (face 24:27 x (tvar 24:29 A))
67− (body 25:3
68− (value 25:3 a
69− (cast 25:8 (aura 25:11 @ud) (str 25:15 "s")))
70− (value 26:3 ok (wing 26:9 x))
71− (value 27:3 b
72− (cast 27:8 (aura 27:11 @t) (wing 27:14 x)))
73− (wing 28:3 x))))
74− (value 29:1 same
75− (gate 29:9
76− (cell 29:12
77− (face 29:13 a (tvar 29:15 A))
78− (face 29:17 b (tvar 29:19 A)))
79− (wing 29:22 a)))
80− (value 30:1 mask-hole
81− (gate 30:14
82− (bind 30:17 x)
83− (body 31:3
84− (value 31:3 a
85− (cast 31:8 (aura 31:11 @ud) (str 31:15 "s")))
86− (value 32:3 b
87− (cast 32:8
88− (hole 32:11)
89− (group 32:13
90− (call 32:14 (wing 32:14 same) (wing 32:19 x) (lit 32:21 1)))))
91− (cast 33:3 (aura 33:6 @ux) (wing 33:10 x)))))
92− (value 34:1 captured
93− (gate 34:13
94− (bind 34:16 x)
95− (body 35:3
96− (value 35:3 a
97− (cast 35:8 (aura 35:11 @ud) (str 35:15 "s")))
98− (value 36:3 b (wing 36:8 x))
99− (wing 37:3 a))))
100− (value 38:1 empty-mask
101− (gate 38:15
102− (bind 38:18 x)
103− (body 39:3
104− (value 39:3 a
105− (tuple 39:8
106− (group 39:9
107− (cast 39:10 (aura 39:13 @ux) (wing 39:17 x)))
108− (group 39:20
109− (cast 39:21 (aura 39:24 @t) (wing 39:27 x)))))
110− (value 40:3 g
111− (cast 40:8 (void 40:11) (wing 40:14 x)))
112− (value 41:3 d
113− (gate 41:8
114− (face 41:11 y (tvar 41:13 B))
115− (cast 41:15 (aura 41:18 @t) (wing 41:21 y))))
116− (wing 42:3 a))))
117− (value 43:1 empty-ok
118− (gate 43:13
119− (bind 43:16 x)
120− (body 44:3
121− (value 44:3 a
122− (tuple 44:8
123− (group 44:9
124− (cast 44:10 (aura 44:13 @ux) (wing 44:17 x)))
125− (group 44:20
126− (cast 44:21 (aura 44:24 @t) (wing 44:27 x)))))
127− (value 45:3 g
128− (cast 45:8 (void 45:11) (wing 45:14 x)))
129− (wing 46:3 a))))
130− (value 47:1 empty-stall
131− (gate 47:16
132− (bind 47:19 x)
133− (body 48:3
134− (value 48:3 a
135− (cast 48:8 (aura 48:11 @ux) (wing 48:15 x)))
136− (value 49:3 b
137− (cast 49:8 (aura 49:11 @t) (wing 49:14 x)))
138− (value 50:3 g
139− (cast 50:8 (void 50:11) (wing 50:14 x)))
140− (wing 51:3 a))))
141− (value 52:1 empty-stall-g-first
142− (gate 52:24
143− (bind 52:27 x)
144− (body 53:3
145− (value 53:3 g
146− (cast 53:8 (void 53:11) (wing 53:14 x)))
147− (value 54:3 a
148− (cast 54:8 (aura 54:11 @ux) (wing 54:15 x)))
149− (value 55:3 b
150− (cast 55:8 (aura 55:11 @t) (wing 55:14 x)))
151− (wing 56:3 a)))))
tests/golden/types-local-error-cast/types.txtdeleted−54
@@ -1,54 +0,0 @@
1−partial inference; module not checked
2−++ top: cast mold and expression type do not unify
3−/tests/golden/types-local-error-cast/source.jibb:1:11: cast mold has type @t
4−++ top ^- @t %.y
5− ^
6−/tests/golden/types-local-error-cast/source.jibb:1:14: expression has type ?
7−++ top ^- @t %.y
8− ^
9−++ local: cast mold and expression type do not unify
10−/tests/golden/types-local-error-cast/source.jibb:3:14: cast mold has type @t
11− ++ flag ^- @t %.y
12− ^
13−/tests/golden/types-local-error-cast/source.jibb:3:17: expression has type ?
14− ++ flag ^- @t %.y
15− ^
16−++ waiting: cast mold and expression type do not unify
17−/tests/golden/types-local-error-cast/source.jibb:7:24: cast mold has type @ud
18− ++ second |= y=@t ^- @ud y
19− ^
20−/tests/golden/types-local-error-cast/source.jibb:7:28: expression has type @t
21− ++ second |= y=@t ^- @ud y
22− ^
23−++ after-self: cast mold and expression type do not unify
24−/tests/golden/types-local-error-cast/source.jibb:13:14: cast mold has type @ud
25− %.n ^- @ud y
26− ^
27−/tests/golden/types-local-error-cast/source.jibb:13:18: expression has type @t
28− %.n ^- @ud y
29− ^
30−++ nested: cast mold and expression type do not unify
31−/tests/golden/types-local-error-cast/source.jibb:17:17: cast mold has type @p
32− ++ inner ^- @p y
33− ^
34−/tests/golden/types-local-error-cast/source.jibb:17:20: expression has type @t
35− ++ inner ^- @p y
36− ^
37−++ mask-capital: explicit capital constraints are not supported by partial inference
38−++ mask-after-progress: explicit capital constraints are not supported by partial inference
39−++ same: $-([a=A b=A] A)
40−++ mask-hole: type hole needs unsupported inference
41−/tests/golden/types-local-error-cast/source.jibb:32:11: type hole
42− ++ b ^- _ (same x 1)
43− ^
44−++ captured: cast mold and expression type do not unify
45−/tests/golden/types-local-error-cast/source.jibb:35:11: cast mold has type @ud
46− ++ a ^- @ud "s"
47− ^
48−/tests/golden/types-local-error-cast/source.jibb:35:15: expression has type @t
49− ++ a ^- @ud "s"
50− ^
51−++ empty-mask: explicit capital constraints are not supported by partial inference
52−++ empty-ok: $-(!! [@ux @t])
53−++ empty-stall: local definitions need unsupported inference
54−++ empty-stall-g-first: $-(!! @ux)
tests/golden/types-local-error-forward/about.txtdeleted−4
@@ -1,4 +0,0 @@
1−source: Grammar, Modules: "Names may refer to each other in any order"; Runes: "local names at the start of any body (a gate's, an arm's, a `^-`'s, a `~&`'s or a `++`'s), visible to each other and the final expression".
2−tests: a local value or gate that refers forward to a later sibling still infers once that sibling does, through a chain; a reference to a sibling not yet inferred is not reported as an error. When a sibling never infers, because it names something unavailable or its tag stays pending, the waiting definition keeps the generic unsupported message; when the sibling infers but forces an explicit capital to a concrete type, its unsupported message stays.
3−expect: parses
4−expect-types: a partial inference report, not a checked module
tests/golden/types-local-error-forward/source.jibbdeleted−26
@@ -1,26 +0,0 @@
1−++ inc |= n=@ud n
2−++ forward |= x=@ud
3− ++ first (second x)
4− ++ second |= y=@ud (inc y)
5− first
6−++ forward-value |= x=@t
7− ++ first ^- @t second
8− ++ second x
9− first
10−++ forward-chain |= x=@ud
11− ++ first (second x)
12− ++ second |= y=@ud (third y)
13− ++ third |= z=@ud (inc z)
14− first
15−++ waits-on-unknown |= x=@t
16− ++ first ^- @t second
17− ++ second nope
18− first
19−++ waits-on-pending |= x=@t
20− ++ first ^- @t second
21− ++ second %orphan
22− first
23−++ waits-then-capital |= x=A
24− ++ first ^- @t second
25− ++ second ^- @t x
26− first
tests/golden/types-local-error-forward/tokens.txtdeleted−157
@@ -1,157 +0,0 @@
1−1:1 glyph ++
2−1:4 name inc
3−1:8 glyph |=
4−1:11 name n
5−1:12 tight glyph =
6−1:13 tight aura @ud
7−1:17 name n
8−2:1 NEWLINE
9−2:1 glyph ++
10−2:4 name forward
11−2:12 glyph |=
12−2:15 name x
13−2:16 tight glyph =
14−2:17 tight aura @ud
15−3:3 INDENT
16−3:3 glyph ++
17−3:6 name first
18−3:12 glyph (
19−3:13 tight name second
20−3:20 name x
21−3:21 tight glyph )
22−4:3 NEWLINE
23−4:3 glyph ++
24−4:6 name second
25−4:13 glyph |=
26−4:16 name y
27−4:17 tight glyph =
28−4:18 tight aura @ud
29−4:22 glyph (
30−4:23 tight name inc
31−4:27 name y
32−4:28 tight glyph )
33−5:3 NEWLINE
34−5:3 name first
35−6:1 DEDENT
36−6:1 NEWLINE
37−6:1 glyph ++
38−6:4 name forward-value
39−6:18 glyph |=
40−6:21 name x
41−6:22 tight glyph =
42−6:23 tight aura @t
43−7:3 INDENT
44−7:3 glyph ++
45−7:6 name first
46−7:12 glyph ^-
47−7:15 aura @t
48−7:18 name second
49−8:3 NEWLINE
50−8:3 glyph ++
51−8:6 name second
52−8:13 name x
53−9:3 NEWLINE
54−9:3 name first
55−10:1 DEDENT
56−10:1 NEWLINE
57−10:1 glyph ++
58−10:4 name forward-chain
59−10:18 glyph |=
60−10:21 name x
61−10:22 tight glyph =
62−10:23 tight aura @ud
63−11:3 INDENT
64−11:3 glyph ++
65−11:6 name first
66−11:12 glyph (
67−11:13 tight name second
68−11:20 name x
69−11:21 tight glyph )
70−12:3 NEWLINE
71−12:3 glyph ++
72−12:6 name second
73−12:13 glyph |=
74−12:16 name y
75−12:17 tight glyph =
76−12:18 tight aura @ud
77−12:22 glyph (
78−12:23 tight name third
79−12:29 name y
80−12:30 tight glyph )
81−13:3 NEWLINE
82−13:3 glyph ++
83−13:6 name third
84−13:12 glyph |=
85−13:15 name z
86−13:16 tight glyph =
87−13:17 tight aura @ud
88−13:21 glyph (
89−13:22 tight name inc
90−13:26 name z
91−13:27 tight glyph )
92−14:3 NEWLINE
93−14:3 name first
94−15:1 DEDENT
95−15:1 NEWLINE
96−15:1 glyph ++
97−15:4 name waits-on-unknown
98−15:21 glyph |=
99−15:24 name x
100−15:25 tight glyph =
101−15:26 tight aura @t
102−16:3 INDENT
103−16:3 glyph ++
104−16:6 name first
105−16:12 glyph ^-
106−16:15 aura @t
107−16:18 name second
108−17:3 NEWLINE
109−17:3 glyph ++
110−17:6 name second
111−17:13 name nope
112−18:3 NEWLINE
113−18:3 name first
114−19:1 DEDENT
115−19:1 NEWLINE
116−19:1 glyph ++
117−19:4 name waits-on-pending
118−19:21 glyph |=
119−19:24 name x
120−19:25 tight glyph =
121−19:26 tight aura @t
122−20:3 INDENT
123−20:3 glyph ++
124−20:6 name first
125−20:12 glyph ^-
126−20:15 aura @t
127−20:18 name second
128−21:3 NEWLINE
129−21:3 glyph ++
130−21:6 name second
131−21:13 lit %orphan
132−22:3 NEWLINE
133−22:3 name first
134−23:1 DEDENT
135−23:1 NEWLINE
136−23:1 glyph ++
137−23:4 name waits-then-capital
138−23:23 glyph |=
139−23:26 name x
140−23:27 tight glyph =
141−23:28 tight tvar A
142−24:3 INDENT
143−24:3 glyph ++
144−24:6 name first
145−24:12 glyph ^-
146−24:15 aura @t
147−24:18 name second
148−25:3 NEWLINE
149−25:3 glyph ++
150−25:6 name second
151−25:13 glyph ^-
152−25:16 aura @t
153−25:19 name x
154−26:3 NEWLINE
155−26:3 name first
156−26:8 DEDENT
157−26:8 NEWLINE
tests/golden/types-local-error-forward/tree.txtdeleted−69
@@ -1,69 +0,0 @@
1−(module
2− (value 1:1 inc
3− (gate 1:8
4− (face 1:11 n (aura 1:13 @ud))
5− (wing 1:17 n)))
6− (value 2:1 forward
7− (gate 2:12
8− (face 2:15 x (aura 2:17 @ud))
9− (body 3:3
10− (value 3:3 first
11− (group 3:12
12− (call 3:13 (wing 3:13 second) (wing 3:20 x))))
13− (value 4:3 second
14− (gate 4:13
15− (face 4:16 y (aura 4:18 @ud))
16− (group 4:22
17− (call 4:23 (wing 4:23 inc) (wing 4:27 y)))))
18− (wing 5:3 first))))
19− (value 6:1 forward-value
20− (gate 6:18
21− (face 6:21 x (aura 6:23 @t))
22− (body 7:3
23− (value 7:3 first
24− (cast 7:12 (aura 7:15 @t) (wing 7:18 second)))
25− (value 8:3 second (wing 8:13 x))
26− (wing 9:3 first))))
27− (value 10:1 forward-chain
28− (gate 10:18
29− (face 10:21 x (aura 10:23 @ud))
30− (body 11:3
31− (value 11:3 first
32− (group 11:12
33− (call 11:13 (wing 11:13 second) (wing 11:20 x))))
34− (value 12:3 second
35− (gate 12:13
36− (face 12:16 y (aura 12:18 @ud))
37− (group 12:22
38− (call 12:23 (wing 12:23 third) (wing 12:29 y)))))
39− (value 13:3 third
40− (gate 13:12
41− (face 13:15 z (aura 13:17 @ud))
42− (group 13:21
43− (call 13:22 (wing 13:22 inc) (wing 13:26 z)))))
44− (wing 14:3 first))))
45− (value 15:1 waits-on-unknown
46− (gate 15:21
47− (face 15:24 x (aura 15:26 @t))
48− (body 16:3
49− (value 16:3 first
50− (cast 16:12 (aura 16:15 @t) (wing 16:18 second)))
51− (value 17:3 second (wing 17:13 nope))
52− (wing 18:3 first))))
53− (value 19:1 waits-on-pending
54− (gate 19:21
55− (face 19:24 x (aura 19:26 @t))
56− (body 20:3
57− (value 20:3 first
58− (cast 20:12 (aura 20:15 @t) (wing 20:18 second)))
59− (value 21:3 second (lit 21:13 %orphan))
60− (wing 22:3 first))))
61− (value 23:1 waits-then-capital
62− (gate 23:23
63− (face 23:26 x (tvar 23:28 A))
64− (body 24:3
65− (value 24:3 first
66− (cast 24:12 (aura 24:15 @t) (wing 24:18 second)))
67− (value 25:3 second
68− (cast 25:13 (aura 25:16 @t) (wing 25:19 x)))
69− (wing 26:3 first)))))
tests/golden/types-local-error-forward/types.txtdeleted−8
@@ -1,8 +0,0 @@
1−partial inference; module not checked
2−++ inc: $-(@ud @ud)
3−++ forward: $-(@ud @ud)
4−++ forward-value: $-(@t @t)
5−++ forward-chain: $-(@ud @ud)
6−++ waits-on-unknown: local definitions need unsupported inference
7−++ waits-on-pending: local definitions need unsupported inference
8−++ waits-then-capital: explicit capital constraints are not supported by partial inference
tests/golden/types-local-error-order/about.txtdeleted−4
@@ -1,4 +0,0 @@
1−source: Implementation plan, Risks: "Each error names both conflicting sites, with excerpts"; Grammar, Runes: "local names at the start of any body (a gate's, an arm's, a `^-`'s, a `~&`'s or a `++`'s), visible to each other and the final expression".
2−tests: a cast mismatch inside a local `++` is not reported as an error while a sibling that might fix the untyped sample's type waits without sites, since another order, or support for that sibling, could let the body pass. The sibling waits on a branch the checker does not support (`flat-mask`, and `outer-mask` one body further out), on its own nested stall (`nest-order`), or, in a local recursive gate, on the gate itself (`rec-order`, `rec-mask`, `rec-widen`). Each keeps the generic message; the `-ok`, `-g-first` and `-top` controls show the orders and forms the checker accepts or already leaves generic.
3−expect: parses
4−expect-types: a partial inference report, not a checked module
tests/golden/types-local-error-order/source.jibbdeleted−80
@@ -1,80 +0,0 @@
1−++ rec-order |= z=@t
2− ++ f |= x
3− ++ p [(^- @ux x) (f x)]
4− ++ b [(^- @ux x) (^- @t x)]
5− ++ g [(^- !! x) (f x)]
6− b
7− z
8−++ rec-order-g-first |= z=@t
9− ++ f |= x
10− ++ g [(^- !! x) (f x)]
11− ++ p [(^- @ux x) (f x)]
12− ++ b [(^- @ux x) (^- @t x)]
13− b
14− z
15−++ rec-order-top |= x
16− ++ p [(^- @ux x) (rec-order-top x)]
17− ++ b [(^- @ux x) (^- @t x)]
18− ++ g [(^- !! x) (rec-order-top x)]
19− b
20−++ flat-mask |= x
21− ++ g [(^- !! x) c]
22− ++ b [(^- @ux x) (^- @t x)]
23− ++ c ?- %.y
24− %.y 1
25− %.n 0x2
26− b
27−++ flat-mask-ok |= x
28− ++ g [(^- !! x) c]
29− ++ b [(^- @ux x) (^- @t x)]
30− ++ c ^- @ 1
31− b
32−++ outer-mask |= x
33− ++ a
34− ++ g [(^- !! x) c]
35− ++ b [(^- @ux x) (^- @t x)]
36− b
37− ++ c ?- %.y
38− %.y 1
39− %.n 0x2
40− a
41−++ nest-order |= x
42− ++ g [(^- !! x) c]
43− ++ b [(^- @ux x) (^- @t x)]
44− ++ c |= w
45− ++ a2 ^- @ux w
46− ++ b2 ^- @t w
47− ++ g2 ^- !! w
48− a2
49− b
50−++ nest-order-ok |= x
51− ++ g [(^- !! x) c]
52− ++ b [(^- @ux x) (^- @t x)]
53− ++ c |= w
54− ++ g2 ^- !! w
55− ++ a2 ^- @ux w
56− ++ b2 ^- @t w
57− a2
58− b
59−++ rec-mask |= z=@t
60− ++ f |= x
61− ++ g [(^- !! x) (f x)]
62− ++ b [(^- @ux x) (^- @t x)]
63− ++ h foo
64− b
65− z
66−++ rec-ok |= z=@t
67− ++ f |= x
68− ++ g [(^- !! x) (f x)]
69− ++ b [(^- @ux x) (^- @t x)]
70− b
71− z
72−++ rec-widen |= z=@t
73− ++ f |= x
74− ++ g [(^- !! x) (f x)]
75− ++ b [(^- @ux x) (^- @t x)]
76− ++ h ?- %.y
77− %.y 1
78− %.n 0x2
79− b
80− z
tests/golden/types-local-error-order/tokens.txtdeleted−588
@@ -1,588 +0,0 @@
1−1:1 glyph ++
2−1:4 name rec-order
3−1:14 glyph |=
4−1:17 name z
5−1:18 tight glyph =
6−1:19 tight aura @t
7−2:3 INDENT
8−2:3 glyph ++
9−2:6 name f
10−2:8 glyph |=
11−2:11 name x
12−3:5 INDENT
13−3:5 glyph ++
14−3:8 name p
15−3:10 glyph [
16−3:11 tight glyph (
17−3:12 tight glyph ^-
18−3:15 aura @ux
19−3:19 name x
20−3:20 tight glyph )
21−3:22 glyph (
22−3:23 tight name f
23−3:25 name x
24−3:26 tight glyph )
25−3:27 tight glyph ]
26−4:5 NEWLINE
27−4:5 glyph ++
28−4:8 name b
29−4:10 glyph [
30−4:11 tight glyph (
31−4:12 tight glyph ^-
32−4:15 aura @ux
33−4:19 name x
34−4:20 tight glyph )
35−4:22 glyph (
36−4:23 tight glyph ^-
37−4:26 aura @t
38−4:29 name x
39−4:30 tight glyph )
40−4:31 tight glyph ]
41−5:5 NEWLINE
42−5:5 glyph ++
43−5:8 name g
44−5:10 glyph [
45−5:11 tight glyph (
46−5:12 tight glyph ^-
47−5:15 glyph !!
48−5:18 name x
49−5:19 tight glyph )
50−5:21 glyph (
51−5:22 tight name f
52−5:24 name x
53−5:25 tight glyph )
54−5:26 tight glyph ]
55−6:5 NEWLINE
56−6:5 name b
57−7:3 DEDENT
58−7:3 NEWLINE
59−7:3 name z
60−8:1 DEDENT
61−8:1 NEWLINE
62−8:1 glyph ++
63−8:4 name rec-order-g-first
64−8:22 glyph |=
65−8:25 name z
66−8:26 tight glyph =
67−8:27 tight aura @t
68−9:3 INDENT
69−9:3 glyph ++
70−9:6 name f
71−9:8 glyph |=
72−9:11 name x
73−10:5 INDENT
74−10:5 glyph ++
75−10:8 name g
76−10:10 glyph [
77−10:11 tight glyph (
78−10:12 tight glyph ^-
79−10:15 glyph !!
80−10:18 name x
81−10:19 tight glyph )
82−10:21 glyph (
83−10:22 tight name f
84−10:24 name x
85−10:25 tight glyph )
86−10:26 tight glyph ]
87−11:5 NEWLINE
88−11:5 glyph ++
89−11:8 name p
90−11:10 glyph [
91−11:11 tight glyph (
92−11:12 tight glyph ^-
93−11:15 aura @ux
94−11:19 name x
95−11:20 tight glyph )
96−11:22 glyph (
97−11:23 tight name f
98−11:25 name x
99−11:26 tight glyph )
100−11:27 tight glyph ]
101−12:5 NEWLINE
102−12:5 glyph ++
103−12:8 name b
104−12:10 glyph [
105−12:11 tight glyph (
106−12:12 tight glyph ^-
107−12:15 aura @ux
108−12:19 name x
109−12:20 tight glyph )
110−12:22 glyph (
111−12:23 tight glyph ^-
112−12:26 aura @t
113−12:29 name x
114−12:30 tight glyph )
115−12:31 tight glyph ]
116−13:5 NEWLINE
117−13:5 name b
118−14:3 DEDENT
119−14:3 NEWLINE
120−14:3 name z
121−15:1 DEDENT
122−15:1 NEWLINE
123−15:1 glyph ++
124−15:4 name rec-order-top
125−15:18 glyph |=
126−15:21 name x
127−16:3 INDENT
128−16:3 glyph ++
129−16:6 name p
130−16:8 glyph [
131−16:9 tight glyph (
132−16:10 tight glyph ^-
133−16:13 aura @ux
134−16:17 name x
135−16:18 tight glyph )
136−16:20 glyph (
137−16:21 tight name rec-order-top
138−16:35 name x
139−16:36 tight glyph )
140−16:37 tight glyph ]
141−17:3 NEWLINE
142−17:3 glyph ++
143−17:6 name b
144−17:8 glyph [
145−17:9 tight glyph (
146−17:10 tight glyph ^-
147−17:13 aura @ux
148−17:17 name x
149−17:18 tight glyph )
150−17:20 glyph (
151−17:21 tight glyph ^-
152−17:24 aura @t
153−17:27 name x
154−17:28 tight glyph )
155−17:29 tight glyph ]
156−18:3 NEWLINE
157−18:3 glyph ++
158−18:6 name g
159−18:8 glyph [
160−18:9 tight glyph (
161−18:10 tight glyph ^-
162−18:13 glyph !!
163−18:16 name x
164−18:17 tight glyph )
165−18:19 glyph (
166−18:20 tight name rec-order-top
167−18:34 name x
168−18:35 tight glyph )
169−18:36 tight glyph ]
170−19:3 NEWLINE
171−19:3 name b
172−20:1 DEDENT
173−20:1 NEWLINE
174−20:1 glyph ++
175−20:4 name flat-mask
176−20:14 glyph |=
177−20:17 name x
178−21:3 INDENT
179−21:3 glyph ++
180−21:6 name g
181−21:8 glyph [
182−21:9 tight glyph (
183−21:10 tight glyph ^-
184−21:13 glyph !!
185−21:16 name x
186−21:17 tight glyph )
187−21:19 name c
188−21:20 tight glyph ]
189−22:3 NEWLINE
190−22:3 glyph ++
191−22:6 name b
192−22:8 glyph [
193−22:9 tight glyph (
194−22:10 tight glyph ^-
195−22:13 aura @ux
196−22:17 name x
197−22:18 tight glyph )
198−22:20 glyph (
199−22:21 tight glyph ^-
200−22:24 aura @t
201−22:27 name x
202−22:28 tight glyph )
203−22:29 tight glyph ]
204−23:3 NEWLINE
205−23:3 glyph ++
206−23:6 name c
207−23:8 glyph ?-
208−23:11 lit %.y
209−24:5 INDENT
210−24:5 lit %.y
211−24:9 lit 1
212−25:5 NEWLINE
213−25:5 lit %.n
214−25:9 lit 0x2
215−26:3 DEDENT
216−26:3 NEWLINE
217−26:3 name b
218−27:1 DEDENT
219−27:1 NEWLINE
220−27:1 glyph ++
221−27:4 name flat-mask-ok
222−27:17 glyph |=
223−27:20 name x
224−28:3 INDENT
225−28:3 glyph ++
226−28:6 name g
227−28:8 glyph [
228−28:9 tight glyph (
229−28:10 tight glyph ^-
230−28:13 glyph !!
231−28:16 name x
232−28:17 tight glyph )
233−28:19 name c
234−28:20 tight glyph ]
235−29:3 NEWLINE
236−29:3 glyph ++
237−29:6 name b
238−29:8 glyph [
239−29:9 tight glyph (
240−29:10 tight glyph ^-
241−29:13 aura @ux
242−29:17 name x
243−29:18 tight glyph )
244−29:20 glyph (
245−29:21 tight glyph ^-
246−29:24 aura @t
247−29:27 name x
248−29:28 tight glyph )
249−29:29 tight glyph ]
250−30:3 NEWLINE
251−30:3 glyph ++
252−30:6 name c
253−30:8 glyph ^-
254−30:11 aura @
255−30:13 lit 1
256−31:3 NEWLINE
257−31:3 name b
258−32:1 DEDENT
259−32:1 NEWLINE
260−32:1 glyph ++
261−32:4 name outer-mask
262−32:15 glyph |=
263−32:18 name x
264−33:3 INDENT
265−33:3 glyph ++
266−33:6 name a
267−34:5 INDENT
268−34:5 glyph ++
269−34:8 name g
270−34:10 glyph [
271−34:11 tight glyph (
272−34:12 tight glyph ^-
273−34:15 glyph !!
274−34:18 name x
275−34:19 tight glyph )
276−34:21 name c
277−34:22 tight glyph ]
278−35:5 NEWLINE
279−35:5 glyph ++
280−35:8 name b
281−35:10 glyph [
282−35:11 tight glyph (
283−35:12 tight glyph ^-
284−35:15 aura @ux
285−35:19 name x
286−35:20 tight glyph )
287−35:22 glyph (
288−35:23 tight glyph ^-
289−35:26 aura @t
290−35:29 name x
291−35:30 tight glyph )
292−35:31 tight glyph ]
293−36:5 NEWLINE
294−36:5 name b
295−37:3 DEDENT
296−37:3 NEWLINE
297−37:3 glyph ++
298−37:6 name c
299−37:8 glyph ?-
300−37:11 lit %.y
301−38:5 INDENT
302−38:5 lit %.y
303−38:9 lit 1
304−39:5 NEWLINE
305−39:5 lit %.n
306−39:9 lit 0x2
307−40:3 DEDENT
308−40:3 NEWLINE
309−40:3 name a
310−41:1 DEDENT
311−41:1 NEWLINE
312−41:1 glyph ++
313−41:4 name nest-order
314−41:15 glyph |=
315−41:18 name x
316−42:3 INDENT
317−42:3 glyph ++
318−42:6 name g
319−42:8 glyph [
320−42:9 tight glyph (
321−42:10 tight glyph ^-
322−42:13 glyph !!
323−42:16 name x
324−42:17 tight glyph )
325−42:19 name c
326−42:20 tight glyph ]
327−43:3 NEWLINE
328−43:3 glyph ++
329−43:6 name b
330−43:8 glyph [
331−43:9 tight glyph (
332−43:10 tight glyph ^-
333−43:13 aura @ux
334−43:17 name x
335−43:18 tight glyph )
336−43:20 glyph (
337−43:21 tight glyph ^-
338−43:24 aura @t
339−43:27 name x
340−43:28 tight glyph )
341−43:29 tight glyph ]
342−44:3 NEWLINE
343−44:3 glyph ++
344−44:6 name c
345−44:8 glyph |=
346−44:11 name w
347−45:5 INDENT
348−45:5 glyph ++
349−45:8 name a2
350−45:11 glyph ^-
351−45:14 aura @ux
352−45:18 name w
353−46:5 NEWLINE
354−46:5 glyph ++
355−46:8 name b2
356−46:11 glyph ^-
357−46:14 aura @t
358−46:17 name w
359−47:5 NEWLINE
360−47:5 glyph ++
361−47:8 name g2
362−47:11 glyph ^-
363−47:14 glyph !!
364−47:17 name w
365−48:5 NEWLINE
366−48:5 name a2
367−49:3 DEDENT
368−49:3 NEWLINE
369−49:3 name b
370−50:1 DEDENT
371−50:1 NEWLINE
372−50:1 glyph ++
373−50:4 name nest-order-ok
374−50:18 glyph |=
375−50:21 name x
376−51:3 INDENT
377−51:3 glyph ++
378−51:6 name g
379−51:8 glyph [
380−51:9 tight glyph (
381−51:10 tight glyph ^-
382−51:13 glyph !!
383−51:16 name x
384−51:17 tight glyph )
385−51:19 name c
386−51:20 tight glyph ]
387−52:3 NEWLINE
388−52:3 glyph ++
389−52:6 name b
390−52:8 glyph [
391−52:9 tight glyph (
392−52:10 tight glyph ^-
393−52:13 aura @ux
394−52:17 name x
395−52:18 tight glyph )
396−52:20 glyph (
397−52:21 tight glyph ^-
398−52:24 aura @t
399−52:27 name x
400−52:28 tight glyph )
401−52:29 tight glyph ]
402−53:3 NEWLINE
403−53:3 glyph ++
404−53:6 name c
405−53:8 glyph |=
406−53:11 name w
407−54:5 INDENT
408−54:5 glyph ++
409−54:8 name g2
410−54:11 glyph ^-
411−54:14 glyph !!
412−54:17 name w
413−55:5 NEWLINE
414−55:5 glyph ++
415−55:8 name a2
416−55:11 glyph ^-
417−55:14 aura @ux
418−55:18 name w
419−56:5 NEWLINE
420−56:5 glyph ++
421−56:8 name b2
422−56:11 glyph ^-
423−56:14 aura @t
424−56:17 name w
425−57:5 NEWLINE
426−57:5 name a2
427−58:3 DEDENT
428−58:3 NEWLINE
429−58:3 name b
430−59:1 DEDENT
431−59:1 NEWLINE
432−59:1 glyph ++
433−59:4 name rec-mask
434−59:13 glyph |=
435−59:16 name z
436−59:17 tight glyph =
437−59:18 tight aura @t
438−60:3 INDENT
439−60:3 glyph ++
440−60:6 name f
441−60:8 glyph |=
442−60:11 name x
443−61:5 INDENT
444−61:5 glyph ++
445−61:8 name g
446−61:10 glyph [
447−61:11 tight glyph (
448−61:12 tight glyph ^-
449−61:15 glyph !!
450−61:18 name x
451−61:19 tight glyph )
452−61:21 glyph (
453−61:22 tight name f
454−61:24 name x
455−61:25 tight glyph )
456−61:26 tight glyph ]
457−62:5 NEWLINE
458−62:5 glyph ++
459−62:8 name b
460−62:10 glyph [
461−62:11 tight glyph (
462−62:12 tight glyph ^-
463−62:15 aura @ux
464−62:19 name x
465−62:20 tight glyph )
466−62:22 glyph (
467−62:23 tight glyph ^-
468−62:26 aura @t
469−62:29 name x
470−62:30 tight glyph )
471−62:31 tight glyph ]
472−63:5 NEWLINE
473−63:5 glyph ++
474−63:8 name h
475−63:10 name foo
476−64:5 NEWLINE
477−64:5 name b
478−65:3 DEDENT
479−65:3 NEWLINE
480−65:3 name z
481−66:1 DEDENT
482−66:1 NEWLINE
483−66:1 glyph ++
484−66:4 name rec-ok
485−66:11 glyph |=
486−66:14 name z
487−66:15 tight glyph =
488−66:16 tight aura @t
489−67:3 INDENT
490−67:3 glyph ++
491−67:6 name f
492−67:8 glyph |=
493−67:11 name x
494−68:5 INDENT
495−68:5 glyph ++
496−68:8 name g
497−68:10 glyph [
498−68:11 tight glyph (
499−68:12 tight glyph ^-
500−68:15 glyph !!
501−68:18 name x
502−68:19 tight glyph )
503−68:21 glyph (
504−68:22 tight name f
505−68:24 name x
506−68:25 tight glyph )
507−68:26 tight glyph ]
508−69:5 NEWLINE
509−69:5 glyph ++
510−69:8 name b
511−69:10 glyph [
512−69:11 tight glyph (
513−69:12 tight glyph ^-
514−69:15 aura @ux
515−69:19 name x
516−69:20 tight glyph )
517−69:22 glyph (
518−69:23 tight glyph ^-
519−69:26 aura @t
520−69:29 name x
521−69:30 tight glyph )
522−69:31 tight glyph ]
523−70:5 NEWLINE
524−70:5 name b
525−71:3 DEDENT
526−71:3 NEWLINE
527−71:3 name z
528−72:1 DEDENT
529−72:1 NEWLINE
530−72:1 glyph ++
531−72:4 name rec-widen
532−72:14 glyph |=
533−72:17 name z
534−72:18 tight glyph =
535−72:19 tight aura @t
536−73:3 INDENT
537−73:3 glyph ++
538−73:6 name f
539−73:8 glyph |=
540−73:11 name x
541−74:5 INDENT
542−74:5 glyph ++
543−74:8 name g
544−74:10 glyph [
545−74:11 tight glyph (
546−74:12 tight glyph ^-
547−74:15 glyph !!
548−74:18 name x
549−74:19 tight glyph )
550−74:21 glyph (
551−74:22 tight name f
552−74:24 name x
553−74:25 tight glyph )
554−74:26 tight glyph ]
555−75:5 NEWLINE
556−75:5 glyph ++
557−75:8 name b
558−75:10 glyph [
559−75:11 tight glyph (
560−75:12 tight glyph ^-
561−75:15 aura @ux
562−75:19 name x
563−75:20 tight glyph )
564−75:22 glyph (
565−75:23 tight glyph ^-
566−75:26 aura @t
567−75:29 name x
568−75:30 tight glyph )
569−75:31 tight glyph ]
570−76:5 NEWLINE
571−76:5 glyph ++
572−76:8 name h
573−76:10 glyph ?-
574−76:13 lit %.y
575−77:7 INDENT
576−77:7 lit %.y
577−77:11 lit 1
578−78:7 NEWLINE
579−78:7 lit %.n
580−78:11 lit 0x2
581−79:5 DEDENT
582−79:5 NEWLINE
583−79:5 name b
584−80:3 DEDENT
585−80:3 NEWLINE
586−80:3 name z
587−80:4 DEDENT
588−80:4 NEWLINE
tests/golden/types-local-error-order/tree.txtdeleted−269
@@ -1,269 +0,0 @@
1−(module
2− (value 1:1 rec-order
3− (gate 1:14
4− (face 1:17 z (aura 1:19 @t))
5− (body 2:3
6− (value 2:3 f
7− (gate 2:8
8− (bind 2:11 x)
9− (body 3:5
10− (value 3:5 p
11− (tuple 3:10
12− (group 3:11
13− (cast 3:12 (aura 3:15 @ux) (wing 3:19 x)))
14− (group 3:22
15− (call 3:23 (wing 3:23 f) (wing 3:25 x)))))
16− (value 4:5 b
17− (tuple 4:10
18− (group 4:11
19− (cast 4:12 (aura 4:15 @ux) (wing 4:19 x)))
20− (group 4:22
21− (cast 4:23 (aura 4:26 @t) (wing 4:29 x)))))
22− (value 5:5 g
23− (tuple 5:10
24− (group 5:11
25− (cast 5:12 (void 5:15) (wing 5:18 x)))
26− (group 5:21
27− (call 5:22 (wing 5:22 f) (wing 5:24 x)))))
28− (wing 6:5 b))))
29− (wing 7:3 z))))
30− (value 8:1 rec-order-g-first
31− (gate 8:22
32− (face 8:25 z (aura 8:27 @t))
33− (body 9:3
34− (value 9:3 f
35− (gate 9:8
36− (bind 9:11 x)
37− (body 10:5
38− (value 10:5 g
39− (tuple 10:10
40− (group 10:11
41− (cast 10:12 (void 10:15) (wing 10:18 x)))
42− (group 10:21
43− (call 10:22 (wing 10:22 f) (wing 10:24 x)))))
44− (value 11:5 p
45− (tuple 11:10
46− (group 11:11
47− (cast 11:12 (aura 11:15 @ux) (wing 11:19 x)))
48− (group 11:22
49− (call 11:23 (wing 11:23 f) (wing 11:25 x)))))
50− (value 12:5 b
51− (tuple 12:10
52− (group 12:11
53− (cast 12:12 (aura 12:15 @ux) (wing 12:19 x)))
54− (group 12:22
55− (cast 12:23 (aura 12:26 @t) (wing 12:29 x)))))
56− (wing 13:5 b))))
57− (wing 14:3 z))))
58− (value 15:1 rec-order-top
59− (gate 15:18
60− (bind 15:21 x)
61− (body 16:3
62− (value 16:3 p
63− (tuple 16:8
64− (group 16:9
65− (cast 16:10 (aura 16:13 @ux) (wing 16:17 x)))
66− (group 16:20
67− (call 16:21 (wing 16:21 rec-order-top) (wing 16:35 x)))))
68− (value 17:3 b
69− (tuple 17:8
70− (group 17:9
71− (cast 17:10 (aura 17:13 @ux) (wing 17:17 x)))
72− (group 17:20
73− (cast 17:21 (aura 17:24 @t) (wing 17:27 x)))))
74− (value 18:3 g
75− (tuple 18:8
76− (group 18:9
77− (cast 18:10 (void 18:13) (wing 18:16 x)))
78− (group 18:19
79− (call 18:20 (wing 18:20 rec-order-top) (wing 18:34 x)))))
80− (wing 19:3 b))))
81− (value 20:1 flat-mask
82− (gate 20:14
83− (bind 20:17 x)
84− (body 21:3
85− (value 21:3 g
86− (tuple 21:8
87− (group 21:9
88− (cast 21:10 (void 21:13) (wing 21:16 x)))
89− (wing 21:19 c)))
90− (value 22:3 b
91− (tuple 22:8
92− (group 22:9
93− (cast 22:10 (aura 22:13 @ux) (wing 22:17 x)))
94− (group 22:20
95− (cast 22:21 (aura 22:24 @t) (wing 22:27 x)))))
96− (value 23:3 c
97− (branch 23:8
98− (lit 23:11 %.y)
99− (arm 24:5 (lit 24:5 %.y) (lit 24:9 1))
100− (arm 25:5 (lit 25:5 %.n) (lit 25:9 0x2))))
101− (wing 26:3 b))))
102− (value 27:1 flat-mask-ok
103− (gate 27:17
104− (bind 27:20 x)
105− (body 28:3
106− (value 28:3 g
107− (tuple 28:8
108− (group 28:9
109− (cast 28:10 (void 28:13) (wing 28:16 x)))
110− (wing 28:19 c)))
111− (value 29:3 b
112− (tuple 29:8
113− (group 29:9
114− (cast 29:10 (aura 29:13 @ux) (wing 29:17 x)))
115− (group 29:20
116− (cast 29:21 (aura 29:24 @t) (wing 29:27 x)))))
117− (value 30:3 c
118− (cast 30:8 (aura 30:11 @) (lit 30:13 1)))
119− (wing 31:3 b))))
120− (value 32:1 outer-mask
121− (gate 32:15
122− (bind 32:18 x)
123− (body 33:3
124− (value 33:3 a
125− (body 34:5
126− (value 34:5 g
127− (tuple 34:10
128− (group 34:11
129− (cast 34:12 (void 34:15) (wing 34:18 x)))
130− (wing 34:21 c)))
131− (value 35:5 b
132− (tuple 35:10
133− (group 35:11
134− (cast 35:12 (aura 35:15 @ux) (wing 35:19 x)))
135− (group 35:22
136− (cast 35:23 (aura 35:26 @t) (wing 35:29 x)))))
137− (wing 36:5 b)))
138− (value 37:3 c
139− (branch 37:8
140− (lit 37:11 %.y)
141− (arm 38:5 (lit 38:5 %.y) (lit 38:9 1))
142− (arm 39:5 (lit 39:5 %.n) (lit 39:9 0x2))))
143− (wing 40:3 a))))
144− (value 41:1 nest-order
145− (gate 41:15
146− (bind 41:18 x)
147− (body 42:3
148− (value 42:3 g
149− (tuple 42:8
150− (group 42:9
151− (cast 42:10 (void 42:13) (wing 42:16 x)))
152− (wing 42:19 c)))
153− (value 43:3 b
154− (tuple 43:8
155− (group 43:9
156− (cast 43:10 (aura 43:13 @ux) (wing 43:17 x)))
157− (group 43:20
158− (cast 43:21 (aura 43:24 @t) (wing 43:27 x)))))
159− (value 44:3 c
160− (gate 44:8
161− (bind 44:11 w)
162− (body 45:5
163− (value 45:5 a2
164− (cast 45:11 (aura 45:14 @ux) (wing 45:18 w)))
165− (value 46:5 b2
166− (cast 46:11 (aura 46:14 @t) (wing 46:17 w)))
167− (value 47:5 g2
168− (cast 47:11 (void 47:14) (wing 47:17 w)))
169− (wing 48:5 a2))))
170− (wing 49:3 b))))
171− (value 50:1 nest-order-ok
172− (gate 50:18
173− (bind 50:21 x)
174− (body 51:3
175− (value 51:3 g
176− (tuple 51:8
177− (group 51:9
178− (cast 51:10 (void 51:13) (wing 51:16 x)))
179− (wing 51:19 c)))
180− (value 52:3 b
181− (tuple 52:8
182− (group 52:9
183− (cast 52:10 (aura 52:13 @ux) (wing 52:17 x)))
184− (group 52:20
185− (cast 52:21 (aura 52:24 @t) (wing 52:27 x)))))
186− (value 53:3 c
187− (gate 53:8
188− (bind 53:11 w)
189− (body 54:5
190− (value 54:5 g2
191− (cast 54:11 (void 54:14) (wing 54:17 w)))
192− (value 55:5 a2
193− (cast 55:11 (aura 55:14 @ux) (wing 55:18 w)))
194− (value 56:5 b2
195− (cast 56:11 (aura 56:14 @t) (wing 56:17 w)))
196− (wing 57:5 a2))))
197− (wing 58:3 b))))
198− (value 59:1 rec-mask
199− (gate 59:13
200− (face 59:16 z (aura 59:18 @t))
201− (body 60:3
202− (value 60:3 f
203− (gate 60:8
204− (bind 60:11 x)
205− (body 61:5
206− (value 61:5 g
207− (tuple 61:10
208− (group 61:11
209− (cast 61:12 (void 61:15) (wing 61:18 x)))
210− (group 61:21
211− (call 61:22 (wing 61:22 f) (wing 61:24 x)))))
212− (value 62:5 b
213− (tuple 62:10
214− (group 62:11
215− (cast 62:12 (aura 62:15 @ux) (wing 62:19 x)))
216− (group 62:22
217− (cast 62:23 (aura 62:26 @t) (wing 62:29 x)))))
218− (value 63:5 h (wing 63:10 foo))
219− (wing 64:5 b))))
220− (wing 65:3 z))))
221− (value 66:1 rec-ok
222− (gate 66:11
223− (face 66:14 z (aura 66:16 @t))
224− (body 67:3
225− (value 67:3 f
226− (gate 67:8
227− (bind 67:11 x)
228− (body 68:5
229− (value 68:5 g
230− (tuple 68:10
231− (group 68:11
232− (cast 68:12 (void 68:15) (wing 68:18 x)))
233− (group 68:21
234− (call 68:22 (wing 68:22 f) (wing 68:24 x)))))
235− (value 69:5 b
236− (tuple 69:10
237− (group 69:11
238− (cast 69:12 (aura 69:15 @ux) (wing 69:19 x)))
239− (group 69:22
240− (cast 69:23 (aura 69:26 @t) (wing 69:29 x)))))
241− (wing 70:5 b))))
242− (wing 71:3 z))))
243− (value 72:1 rec-widen
244− (gate 72:14
245− (face 72:17 z (aura 72:19 @t))
246− (body 73:3
247− (value 73:3 f
248− (gate 73:8
249− (bind 73:11 x)
250− (body 74:5
251− (value 74:5 g
252− (tuple 74:10
253− (group 74:11
254− (cast 74:12 (void 74:15) (wing 74:18 x)))
255− (group 74:21
256− (call 74:22 (wing 74:22 f) (wing 74:24 x)))))
257− (value 75:5 b
258− (tuple 75:10
259− (group 75:11
260− (cast 75:12 (aura 75:15 @ux) (wing 75:19 x)))
261− (group 75:22
262− (cast 75:23 (aura 75:26 @t) (wing 75:29 x)))))
263− (value 76:5 h
264− (branch 76:10
265− (lit 76:13 %.y)
266− (arm 77:7 (lit 77:7 %.y) (lit 77:11 1))
267− (arm 78:7 (lit 78:7 %.n) (lit 78:11 0x2))))
268− (wing 79:5 b))))
269− (wing 80:3 z)))))
tests/golden/types-local-error-order/types.txtdeleted−12
@@ -1,12 +0,0 @@
1−partial inference; module not checked
2−++ rec-order: local definitions need unsupported inference
3−++ rec-order-g-first: $-(@t @t)
4−++ rec-order-top: local definitions need unsupported inference
5−++ flat-mask: local definitions need unsupported inference
6−++ flat-mask-ok: $-(!! [@ux @t])
7−++ outer-mask: local definitions need unsupported inference
8−++ nest-order: local definitions need unsupported inference
9−++ nest-order-ok: $-(!! [@ux @t])
10−++ rec-mask: local definitions need unsupported inference
11−++ rec-ok: $-(@t @t)
12−++ rec-widen: local definitions need unsupported inference
tests/golden/types-local-recursive/about.txt+1−1
@@ -1,4 +1,4 @@
1source: Grammar, Modules: "Gates may call themselves and their siblings; other values can't depend on themselves, even through a gate"; Molds: "Type variables are capitals, generalized per `++`."
1source: Grammar, Modules: "Gates may call themselves and their siblings; other values can't depend on themselves, even through a gate"; Molds: "Type variables are capitals, generalized per `++`."
2−tests: A body-local recursive gate uses a monomorphic self reference and generalizes independently where allowed. Recursive list copy, capture, bare-binder polymorphism and a mutual gate cycle infer. Incompatible calls through a recursive alias, and self-application, report the call and argument sites, as they do at top level; name collisions, value cycles, unresolved tags and explicit-capital forcing remain unsupported in this fragment.
2+tests: A body-local recursive gate uses a monomorphic self reference and generalizes independently where allowed. Recursive list copy, capture, bare-binder polymorphism and a mutual gate cycle infer; name collisions, value cycles, unresolved tags, incompatible recursive aliases, self-application and explicit-capital forcing remain unsupported in this fragment.
3expect: parses
3expect: parses
4expect-types: a partial inference report
4expect-types: a partial inference report
tests/golden/types-local-recursive/types.txt+2−14
@@ -6,19 +6,7 @@ partial inference; module not checked
6++ cycle: local definitions need unsupported inference
6++ cycle: local definitions need unsupported inference
7++ mutual: $-(@t A)
7++ mutual: $-(@t A)
8++ pending: local definitions need unsupported inference
8++ pending: local definitions need unsupported inference
9−++ alias-mono: call's sample and argument types do not unify
9+++ alias-mono: local definitions need unsupported inference
10−/tests/golden/types-local-recursive/source.jibb:40:8: called gate has type $-(@t A)
10+++ occurs: local definitions need unsupported inference
11− (alias ~zod)
12− ^
13−/tests/golden/types-local-recursive/source.jibb:40:14: argument has type @p
14− (alias ~zod)
15− ^
16−++ occurs: call's sample and argument types do not unify
17−/tests/golden/types-local-recursive/source.jibb:43:18: called gate has type $-(A B)
18− ++ recur |= y (recur recur)
19− ^
20−/tests/golden/types-local-recursive/source.jibb:43:24: argument has type $-(A B)
21− ++ recur |= y (recur recur)
22− ^
23++ captures: local definitions need unsupported inference
11++ captures: local definitions need unsupported inference
24++ via-gate: local definitions need unsupported inference
12++ via-gate: local definitions need unsupported inference
tests/golden/types-module-fixtures/types.txt+1−1
@@ -1,2 +1,2 @@
1partial inference; module not checked
1partial inference; module not checked
2−API module needs unsupported inference: /ui/api/blog/jibb: API path declaration needs unsupported analysis
2+API module needs unsupported inference: /ui/api/blog/jibb
tests/golden/types-nested-shallow-preserve/source.jibb+15−15
@@ -1,25 +1,25 @@
1−+$ extent
1++$ length
2 [%fill n=@ud]
2 [%fill n=@ud]
3 %shrink
3 %shrink
4−+$ attribute
4++$ attr
5− [%width extent]
5+ [%width length]
6 [%gap @tas]
6 [%gap @tas]
7++ number-id |= x=@ud x
7++ number-id |= x=@ud x
8−++ plain ^- attribute width+[%fill 1]
8+++ plain ^- attr width+[%fill 1]
9−++ direct ^- attribute [%width [%fill 1]]
9+++ direct ^- attr [%width [%fill 1]]
10−++ list ^- (list attribute) ~[width+[%fill 1]]
10+++ list ^- (list attr) ~[width+[%fill 1]]
11−++ accept |= value=attribute value
11+++ accept |= value=attr value
12++ call (accept width+[%fill 1])
12++ call (accept width+[%fill 1])
13−++ simple-call ^- attribute width+[%fill (number-id 1)]
13+++ simple-call ^- attr width+[%fill (number-id 1)]
14−++ grouped-call ^- attribute width+[%fill ((number-id 1))]
14+++ grouped-call ^- attr width+[%fill ((number-id 1))]
15−++ cast-call ^- attribute width+[%fill (^- @ud (number-id 1))]
15+++ cast-call ^- attr width+[%fill (^- @ud (number-id 1))]
16−++ nested-call ^- attribute width+[%fill (number-id (number-id 1))]
16+++ nested-call ^- attr width+[%fill (number-id (number-id 1))]
17−++ bad-tag ^- attribute width+[%missing 1]
17+++ bad-tag ^- attr width+[%missing 1]
18−++ bad-number ^- attribute width+[%fill "bad"]
18+++ bad-number ^- attr width+[%fill "bad"]
19++ pending
19++ pending
20 ~& %unrelated
20 ~& %unrelated
21− ^- attribute width+[%fill (number-id 1)]
21+ ^- attr width+[%fill (number-id 1)]
22−++ singleton ^- attribute width+%shrink
22+++ singleton ^- attr width+%shrink
23+$ event
23+$ event
24 [%got value=@t]
24 [%got value=@t]
25 %idle
25 %idle
tests/golden/types-nested-shallow-preserve/tokens.txt+107−107
@@ -1,5 +1,5 @@
11:1 glyph +$
11:1 glyph +$
2−1:4 name extent
2+1:4 name length
32:3 INDENT
32:3 INDENT
42:3 glyph [
42:3 glyph [
52:4 tight lit %fill
52:4 tight lit %fill
@@ -12,11 +12,11 @@
124:1 DEDENT
124:1 DEDENT
134:1 NEWLINE
134:1 NEWLINE
144:1 glyph +$
144:1 glyph +$
15−4:4 name attribute
15+4:4 name attr
165:3 INDENT
165:3 INDENT
175:3 glyph [
175:3 glyph [
185:4 tight lit %width
185:4 tight lit %width
19−5:11 name extent
19+5:11 name length
205:17 tight glyph ]
205:17 tight glyph ]
216:3 NEWLINE
216:3 NEWLINE
226:3 glyph [
226:3 glyph [
@@ -36,49 +36,49 @@
368:1 glyph ++
368:1 glyph ++
378:4 name plain
378:4 name plain
388:10 glyph ^-
388:10 glyph ^-
39−8:13 name attribute
39+8:13 name attr
40−8:23 name width
40+8:18 name width
41−8:28 tight glyph +
41+8:23 tight glyph +
42−8:29 tight glyph [
42+8:24 tight glyph [
43−8:30 tight lit %fill
43+8:25 tight lit %fill
44−8:36 lit 1
44+8:31 lit 1
45−8:37 tight glyph ]
45+8:32 tight glyph ]
469:1 NEWLINE
469:1 NEWLINE
479:1 glyph ++
479:1 glyph ++
489:4 name direct
489:4 name direct
499:11 glyph ^-
499:11 glyph ^-
50−9:14 name attribute
50+9:14 name attr
51−9:24 glyph [
51+9:19 glyph [
52−9:25 tight lit %width
52+9:20 tight lit %width
53−9:32 glyph [
53+9:27 glyph [
54−9:33 tight lit %fill
54+9:28 tight lit %fill
55−9:39 lit 1
55+9:34 lit 1
56−9:40 tight glyph ]
56+9:35 tight glyph ]
57−9:41 tight glyph ]
57+9:36 tight glyph ]
5810:1 NEWLINE
5810:1 NEWLINE
5910:1 glyph ++
5910:1 glyph ++
6010:4 name list
6010:4 name list
6110:9 glyph ^-
6110:9 glyph ^-
6210:12 glyph (
6210:12 glyph (
6310:13 tight name list
6310:13 tight name list
64−10:18 name attribute
64+10:18 name attr
65−10:27 tight glyph )
65+10:22 tight glyph )
66−10:29 glyph ~[
66+10:24 glyph ~[
67−10:31 tight name width
67+10:26 tight name width
68−10:36 tight glyph +
68+10:31 tight glyph +
69−10:37 tight glyph [
69+10:32 tight glyph [
70−10:38 tight lit %fill
70+10:33 tight lit %fill
71−10:44 lit 1
71+10:39 lit 1
72−10:45 tight glyph ]
72+10:40 tight glyph ]
73−10:46 tight glyph ]
73+10:41 tight glyph ]
7411:1 NEWLINE
7411:1 NEWLINE
7511:1 glyph ++
7511:1 glyph ++
7611:4 name accept
7611:4 name accept
7711:11 glyph |=
7711:11 glyph |=
7811:14 name value
7811:14 name value
7911:19 tight glyph =
7911:19 tight glyph =
80−11:20 tight name attribute
80+11:20 tight name attr
81−11:30 name value
81+11:25 name value
8212:1 NEWLINE
8212:1 NEWLINE
8312:1 glyph ++
8312:1 glyph ++
8412:4 name call
8412:4 name call
@@ -95,89 +95,89 @@
9513:1 glyph ++
9513:1 glyph ++
9613:4 name simple-call
9613:4 name simple-call
9713:16 glyph ^-
9713:16 glyph ^-
98−13:19 name attribute
98+13:19 name attr
99−13:29 name width
99+13:24 name width
100−13:34 tight glyph +
100+13:29 tight glyph +
101−13:35 tight glyph [
101+13:30 tight glyph [
102−13:36 tight lit %fill
102+13:31 tight lit %fill
103−13:42 glyph (
103+13:37 glyph (
104−13:43 tight name number-id
104+13:38 tight name number-id
105−13:53 lit 1
105+13:48 lit 1
106−13:54 tight glyph )
106+13:49 tight glyph )
107−13:55 tight glyph ]
107+13:50 tight glyph ]
10814:1 NEWLINE
10814:1 NEWLINE
10914:1 glyph ++
10914:1 glyph ++
11014:4 name grouped-call
11014:4 name grouped-call
11114:17 glyph ^-
11114:17 glyph ^-
112−14:20 name attribute
112+14:20 name attr
113−14:30 name width
113+14:25 name width
114−14:35 tight glyph +
114+14:30 tight glyph +
115−14:36 tight glyph [
115+14:31 tight glyph [
116−14:37 tight lit %fill
116+14:32 tight lit %fill
117−14:43 glyph (
117+14:38 glyph (
118−14:44 tight glyph (
118+14:39 tight glyph (
119−14:45 tight name number-id
119+14:40 tight name number-id
120−14:55 lit 1
120+14:50 lit 1
121−14:56 tight glyph )
121+14:51 tight glyph )
122−14:57 tight glyph )
122+14:52 tight glyph )
123−14:58 tight glyph ]
123+14:53 tight glyph ]
12415:1 NEWLINE
12415:1 NEWLINE
12515:1 glyph ++
12515:1 glyph ++
12615:4 name cast-call
12615:4 name cast-call
12715:14 glyph ^-
12715:14 glyph ^-
128−15:17 name attribute
128+15:17 name attr
129−15:27 name width
129+15:22 name width
130−15:32 tight glyph +
130+15:27 tight glyph +
131−15:33 tight glyph [
131+15:28 tight glyph [
132−15:34 tight lit %fill
132+15:29 tight lit %fill
133−15:40 glyph (
133+15:35 glyph (
134−15:41 tight glyph ^-
134+15:36 tight glyph ^-
135−15:44 aura @ud
135+15:39 aura @ud
136−15:48 glyph (
136+15:43 glyph (
137−15:49 tight name number-id
137+15:44 tight name number-id
138−15:59 lit 1
138+15:54 lit 1
139−15:60 tight glyph )
139+15:55 tight glyph )
140−15:61 tight glyph )
140+15:56 tight glyph )
141−15:62 tight glyph ]
141+15:57 tight glyph ]
14216:1 NEWLINE
14216:1 NEWLINE
14316:1 glyph ++
14316:1 glyph ++
14416:4 name nested-call
14416:4 name nested-call
14516:16 glyph ^-
14516:16 glyph ^-
146−16:19 name attribute
146+16:19 name attr
147−16:29 name width
147+16:24 name width
148−16:34 tight glyph +
148+16:29 tight glyph +
149−16:35 tight glyph [
149+16:30 tight glyph [
150−16:36 tight lit %fill
150+16:31 tight lit %fill
151−16:42 glyph (
151+16:37 glyph (
152−16:43 tight name number-id
152+16:38 tight name number-id
153−16:53 glyph (
153+16:48 glyph (
154−16:54 tight name number-id
154+16:49 tight name number-id
155−16:64 lit 1
155+16:59 lit 1
156−16:65 tight glyph )
156+16:60 tight glyph )
157−16:66 tight glyph )
157+16:61 tight glyph )
158−16:67 tight glyph ]
158+16:62 tight glyph ]
15917:1 NEWLINE
15917:1 NEWLINE
16017:1 glyph ++
16017:1 glyph ++
16117:4 name bad-tag
16117:4 name bad-tag
16217:12 glyph ^-
16217:12 glyph ^-
163−17:15 name attribute
163+17:15 name attr
164−17:25 name width
164+17:20 name width
165−17:30 tight glyph +
165+17:25 tight glyph +
166−17:31 tight glyph [
166+17:26 tight glyph [
167−17:32 tight lit %missing
167+17:27 tight lit %missing
168−17:41 lit 1
168+17:36 lit 1
169−17:42 tight glyph ]
169+17:37 tight glyph ]
17018:1 NEWLINE
17018:1 NEWLINE
17118:1 glyph ++
17118:1 glyph ++
17218:4 name bad-number
17218:4 name bad-number
17318:15 glyph ^-
17318:15 glyph ^-
174−18:18 name attribute
174+18:18 name attr
175−18:28 name width
175+18:23 name width
176−18:33 tight glyph +
176+18:28 tight glyph +
177−18:34 tight glyph [
177+18:29 tight glyph [
178−18:35 tight lit %fill
178+18:30 tight lit %fill
179−18:41 str "bad"
179+18:36 str "bad"
180−18:46 tight glyph ]
180+18:41 tight glyph ]
18119:1 NEWLINE
18119:1 NEWLINE
18219:1 glyph ++
18219:1 glyph ++
18319:4 name pending
18319:4 name pending
@@ -186,26 +186,26 @@
18620:6 lit %unrelated
18620:6 lit %unrelated
18721:5 INDENT
18721:5 INDENT
18821:5 glyph ^-
18821:5 glyph ^-
189−21:8 name attribute
189+21:8 name attr
190−21:18 name width
190+21:13 name width
191−21:23 tight glyph +
191+21:18 tight glyph +
192−21:24 tight glyph [
192+21:19 tight glyph [
193−21:25 tight lit %fill
193+21:20 tight lit %fill
194−21:31 glyph (
194+21:26 glyph (
195−21:32 tight name number-id
195+21:27 tight name number-id
196−21:42 lit 1
196+21:37 lit 1
197−21:43 tight glyph )
197+21:38 tight glyph )
198−21:44 tight glyph ]
198+21:39 tight glyph ]
19922:1 DEDENT
19922:1 DEDENT
20022:1 DEDENT
20022:1 DEDENT
20122:1 NEWLINE
20122:1 NEWLINE
20222:1 glyph ++
20222:1 glyph ++
20322:4 name singleton
20322:4 name singleton
20422:14 glyph ^-
20422:14 glyph ^-
205−22:17 name attribute
205+22:17 name attr
206−22:27 name width
206+22:22 name width
207−22:32 tight glyph +
207+22:27 tight glyph +
208−22:33 tight lit %shrink
208+22:28 tight lit %shrink
20923:1 NEWLINE
20923:1 NEWLINE
21023:1 glyph +$
21023:1 glyph +$
21123:4 name event
21123:4 name event
tests/golden/types-nested-shallow-preserve/tree.txt+61−61
@@ -1,13 +1,13 @@
1(module
1(module
2− (mold 1:1 extent
2+ (mold 1:1 length
3 (union 2:3
3 (union 2:3
4 (cell 2:3
4 (cell 2:3
5 (const 2:4 %fill)
5 (const 2:4 %fill)
6 (face 2:10 n (aura 2:12 @ud)))
6 (face 2:10 n (aura 2:12 @ud)))
7 (const 3:3 %shrink)))
7 (const 3:3 %shrink)))
8− (mold 4:1 attribute
8+ (mold 4:1 attr
9 (union 5:3
9 (union 5:3
10− (cell 5:3 (const 5:4 %width) (ref 5:11 extent))
10+ (cell 5:3 (const 5:4 %width) (ref 5:11 length))
11 (cell 6:3 (const 6:4 %gap) (aura 6:9 @tas))))
11 (cell 6:3 (const 6:4 %gap) (aura 6:9 @tas))))
12 (value 7:1 number-id
12 (value 7:1 number-id
13 (gate 7:14
13 (gate 7:14
@@ -15,25 +15,25 @@
15 (wing 7:23 x)))
15 (wing 7:23 x)))
16 (value 8:1 plain
16 (value 8:1 plain
17 (cast 8:10
17 (cast 8:10
18− (ref 8:13 attribute)
18+ (ref 8:13 attr)
19− (pair 8:23 width
19+ (pair 8:18 width
20− (tuple 8:29 (lit 8:30 %fill) (lit 8:36 1)))))
20+ (tuple 8:24 (lit 8:25 %fill) (lit 8:31 1)))))
21 (value 9:1 direct
21 (value 9:1 direct
22 (cast 9:11
22 (cast 9:11
23− (ref 9:14 attribute)
23+ (ref 9:14 attr)
24− (tuple 9:24
24+ (tuple 9:19
25− (lit 9:25 %width)
25+ (lit 9:20 %width)
26− (tuple 9:32 (lit 9:33 %fill) (lit 9:39 1)))))
26+ (tuple 9:27 (lit 9:28 %fill) (lit 9:34 1)))))
27 (value 10:1 list
27 (value 10:1 list
28 (cast 10:9
28 (cast 10:9
29− (apply 10:12 list (ref 10:18 attribute))
29+ (apply 10:12 list (ref 10:18 attr))
30− (list 10:29
30+ (list 10:24
31− (pair 10:31 width
31+ (pair 10:26 width
32− (tuple 10:37 (lit 10:38 %fill) (lit 10:44 1))))))
32+ (tuple 10:32 (lit 10:33 %fill) (lit 10:39 1))))))
33 (value 11:1 accept
33 (value 11:1 accept
34 (gate 11:11
34 (gate 11:11
35− (face 11:14 value (ref 11:20 attribute))
35+ (face 11:14 value (ref 11:20 attr))
36− (wing 11:30 value)))
36+ (wing 11:25 value)))
37 (value 12:1 call
37 (value 12:1 call
38 (group 12:9
38 (group 12:9
39 (call 12:10
39 (call 12:10
@@ -42,69 +42,69 @@
42 (tuple 12:23 (lit 12:24 %fill) (lit 12:30 1))))))
42 (tuple 12:23 (lit 12:24 %fill) (lit 12:30 1))))))
43 (value 13:1 simple-call
43 (value 13:1 simple-call
44 (cast 13:16
44 (cast 13:16
45− (ref 13:19 attribute)
45+ (ref 13:19 attr)
46− (pair 13:29 width
46+ (pair 13:24 width
47− (tuple 13:35
47+ (tuple 13:30
48− (lit 13:36 %fill)
48+ (lit 13:31 %fill)
49− (group 13:42
49+ (group 13:37
50− (call 13:43 (wing 13:43 number-id) (lit 13:53 1)))))))
50+ (call 13:38 (wing 13:38 number-id) (lit 13:48 1)))))))
51 (value 14:1 grouped-call
51 (value 14:1 grouped-call
52 (cast 14:17
52 (cast 14:17
53− (ref 14:20 attribute)
53+ (ref 14:20 attr)
54− (pair 14:30 width
54+ (pair 14:25 width
55− (tuple 14:36
55+ (tuple 14:31
56− (lit 14:37 %fill)
56+ (lit 14:32 %fill)
57− (group 14:43
57+ (group 14:38
58− (group 14:44
58+ (group 14:39
59− (call 14:45 (wing 14:45 number-id) (lit 14:55 1))))))))
59+ (call 14:40 (wing 14:40 number-id) (lit 14:50 1))))))))
60 (value 15:1 cast-call
60 (value 15:1 cast-call
61 (cast 15:14
61 (cast 15:14
62− (ref 15:17 attribute)
62+ (ref 15:17 attr)
63− (pair 15:27 width
63+ (pair 15:22 width
64− (tuple 15:33
64+ (tuple 15:28
65− (lit 15:34 %fill)
65+ (lit 15:29 %fill)
66− (group 15:40
66+ (group 15:35
67− (cast 15:41
67+ (cast 15:36
68− (aura 15:44 @ud)
68+ (aura 15:39 @ud)
69− (group 15:48
69+ (group 15:43
70− (call 15:49 (wing 15:49 number-id) (lit 15:59 1)))))))))
70+ (call 15:44 (wing 15:44 number-id) (lit 15:54 1)))))))))
71 (value 16:1 nested-call
71 (value 16:1 nested-call
72 (cast 16:16
72 (cast 16:16
73− (ref 16:19 attribute)
73+ (ref 16:19 attr)
74− (pair 16:29 width
74+ (pair 16:24 width
75− (tuple 16:35
75+ (tuple 16:30
76− (lit 16:36 %fill)
76+ (lit 16:31 %fill)
77− (group 16:42
77+ (group 16:37
78− (call 16:43
78+ (call 16:38
79− (wing 16:43 number-id)
79+ (wing 16:38 number-id)
80− (group 16:53
80+ (group 16:48
81− (call 16:54 (wing 16:54 number-id) (lit 16:64 1)))))))))
81+ (call 16:49 (wing 16:49 number-id) (lit 16:59 1)))))))))
82 (value 17:1 bad-tag
82 (value 17:1 bad-tag
83 (cast 17:12
83 (cast 17:12
84− (ref 17:15 attribute)
84+ (ref 17:15 attr)
85− (pair 17:25 width
85+ (pair 17:20 width
86− (tuple 17:31 (lit 17:32 %missing) (lit 17:41 1)))))
86+ (tuple 17:26 (lit 17:27 %missing) (lit 17:36 1)))))
87 (value 18:1 bad-number
87 (value 18:1 bad-number
88 (cast 18:15
88 (cast 18:15
89− (ref 18:18 attribute)
89+ (ref 18:18 attr)
90− (pair 18:28 width
90+ (pair 18:23 width
91− (tuple 18:34 (lit 18:35 %fill) (str 18:41 "bad")))))
91+ (tuple 18:29 (lit 18:30 %fill) (str 18:36 "bad")))))
92 (value 19:1 pending
92 (value 19:1 pending
93 (body 20:3
93 (body 20:3
94 (trace 20:3
94 (trace 20:3
95 (lit 20:6 %unrelated)
95 (lit 20:6 %unrelated)
96 (body 21:5
96 (body 21:5
97 (cast 21:5
97 (cast 21:5
98− (ref 21:8 attribute)
98+ (ref 21:8 attr)
99− (pair 21:18 width
99+ (pair 21:13 width
100− (tuple 21:24
100+ (tuple 21:19
101− (lit 21:25 %fill)
101+ (lit 21:20 %fill)
102− (group 21:31
102+ (group 21:26
103− (call 21:32 (wing 21:32 number-id) (lit 21:42 1))))))))))
103+ (call 21:27 (wing 21:27 number-id) (lit 21:37 1))))))))))
104 (value 22:1 singleton
104 (value 22:1 singleton
105 (cast 22:14
105 (cast 22:14
106− (ref 22:17 attribute)
106+ (ref 22:17 attr)
107− (pair 22:27 width (lit 22:33 %shrink))))
107+ (pair 22:22 width (lit 22:28 %shrink))))
108 (mold 23:1 event
108 (mold 23:1 event
109 (union 24:3
109 (union 24:3
110 (cell 24:3
110 (cell 24:3
tests/golden/types-nested-shallow-preserve/types.txt+20−20
@@ -1,32 +1,32 @@
1partial inference; module not checked
1partial inference; module not checked
2−+$ extent: cases proven disjoint; mold not checked
2++$ length: cases proven disjoint; mold not checked
3−+$ attribute: cases proven disjoint; mold not checked
3++$ attr: cases proven disjoint; mold not checked
4++ number-id: $-(@ud @ud)
4++ number-id: $-(@ud @ud)
5−++ plain: attribute
5+++ plain: attr
6−++ direct: attribute
6+++ direct: attr
7−++ list: (list attribute)
7+++ list: (list attr)
8−++ accept: $-(attribute attribute)
8+++ accept: $-(attr attr)
9−++ call: attribute
9+++ call: attr
10−++ simple-call: attribute
10+++ simple-call: attr
11−++ grouped-call: attribute
11+++ grouped-call: attr
12−++ cast-call: attribute
12+++ cast-call: attr
13−++ nested-call: attribute
13+++ nested-call: attr
14++ bad-tag: cast mold and expression type do not unify
14++ bad-tag: cast mold and expression type do not unify
15/tests/golden/types-nested-shallow-preserve/source.jibb:17:15: cast mold
15/tests/golden/types-nested-shallow-preserve/source.jibb:17:15: cast mold
16−++ bad-tag ^- attribute width+[%missing 1]
16+++ bad-tag ^- attr width+[%missing 1]
17 ^
17 ^
18−/tests/golden/types-nested-shallow-preserve/source.jibb:17:25: expression
18+/tests/golden/types-nested-shallow-preserve/source.jibb:17:20: expression
19−++ bad-tag ^- attribute width+[%missing 1]
19+++ bad-tag ^- attr width+[%missing 1]
20− ^
20+ ^
21++ bad-number: cast mold and expression type do not unify
21++ bad-number: cast mold and expression type do not unify
22/tests/golden/types-nested-shallow-preserve/source.jibb:18:18: cast mold
22/tests/golden/types-nested-shallow-preserve/source.jibb:18:18: cast mold
23−++ bad-number ^- attribute width+[%fill "bad"]
23+++ bad-number ^- attr width+[%fill "bad"]
24 ^
24 ^
25−/tests/golden/types-nested-shallow-preserve/source.jibb:18:28: expression
25+/tests/golden/types-nested-shallow-preserve/source.jibb:18:23: expression
26−++ bad-number ^- attribute width+[%fill "bad"]
26+++ bad-number ^- attr width+[%fill "bad"]
27− ^
27+ ^
28++ pending: tag needs context in partial inference
28++ pending: tag needs context in partial inference
29−++ singleton: attribute
29+++ singleton: attr
30+$ event: cases proven disjoint; mold not checked
30+$ event: cases proven disjoint; mold not checked
31+$ envelope: cases proven disjoint; mold not checked
31+$ envelope: cases proven disjoint; mold not checked
32++ constructor: envelope
32++ constructor: envelope
tests/golden/types-pair-context/source.jibb+14−14
@@ -3,30 +3,30 @@
3 %s1
3 %s1
4 %s2
4 %s2
5 %s3
5 %s3
6−+$ extent
6++$ length
7 [%fill n=@ud]
7 [%fill n=@ud]
8 %shrink
8 %shrink
9−+$ attribute
9++$ attr
10 [%gap spacing]
10 [%gap spacing]
11 [%pad spacing]
11 [%pad spacing]
12− [%width extent]
12+ [%width length]
13−+$ other-attribute
13++$ other-attr
14 [%gap spacing]
14 [%gap spacing]
15 [%pad spacing]
15 [%pad spacing]
16− [%width extent]
16+ [%width length]
17−++ one ^- attribute gap+%s2
17+++ one ^- attr gap+%s2
18−++ equiv ^- attribute [%gap %s2]
18+++ equiv ^- attr [%gap %s2]
19−++ attributes ^- (list attribute) ~[gap+%s2 pad+%s3 width+[%fill 1]]
19+++ attrs ^- (list attr) ~[gap+%s2 pad+%s3 width+[%fill 1]]
20++ gap-structural ^- [@tas @tas] gap+%s2
20++ gap-structural ^- [@tas @tas] gap+%s2
21−++ nested ^- attribute width+[%fill 1]
21+++ nested ^- attr width+[%fill 1]
22−++ mismatch ^- attribute gap+%shrink
22+++ mismatch ^- attr gap+%shrink
23−++ missing ^- attribute width+[%oops 1]
23+++ missing ^- attr width+[%oops 1]
24++ pending gap+%s2
24++ pending gap+%s2
25−++ cross-origin ^- attribute ^- other-attribute gap+%s2
25+++ cross-origin ^- attr ^- other-attr gap+%s2
26++ noun-pair ^- [* *] gap+%s2
26++ noun-pair ^- [* *] gap+%s2
27++ atom-pair ^- [@ta @tas] gap+%s2
27++ atom-pair ^- [@ta @tas] gap+%s2
28++ wrong-head ^- [@ud @tas] gap+%s2
28++ wrong-head ^- [@ud @tas] gap+%s2
29−++ wrong-number ^- attribute width+[%fill "hi"]
29+++ wrong-number ^- attr width+[%fill "hi"]
30++ unrelated
30++ unrelated
31 ~& %dangling
31 ~& %dangling
32− ^- attribute gap+%s2
32+ ^- attr gap+%s2
tests/golden/types-pair-context/tokens.txt+71−71
@@ -11,7 +11,7 @@
116:1 DEDENT
116:1 DEDENT
126:1 NEWLINE
126:1 NEWLINE
136:1 glyph +$
136:1 glyph +$
14−6:4 name extent
14+6:4 name length
157:3 INDENT
157:3 INDENT
167:3 glyph [
167:3 glyph [
177:4 tight lit %fill
177:4 tight lit %fill
@@ -24,7 +24,7 @@
249:1 DEDENT
249:1 DEDENT
259:1 NEWLINE
259:1 NEWLINE
269:1 glyph +$
269:1 glyph +$
27−9:4 name attribute
27+9:4 name attr
2810:3 INDENT
2810:3 INDENT
2910:3 glyph [
2910:3 glyph [
3010:4 tight lit %gap
3010:4 tight lit %gap
@@ -38,12 +38,12 @@
3812:3 NEWLINE
3812:3 NEWLINE
3912:3 glyph [
3912:3 glyph [
4012:4 tight lit %width
4012:4 tight lit %width
41−12:11 name extent
41+12:11 name length
4212:17 tight glyph ]
4212:17 tight glyph ]
4313:1 DEDENT
4313:1 DEDENT
4413:1 NEWLINE
4413:1 NEWLINE
4513:1 glyph +$
4513:1 glyph +$
46−13:4 name other-attribute
46+13:4 name other-attr
4714:3 INDENT
4714:3 INDENT
4814:3 glyph [
4814:3 glyph [
4914:4 tight lit %gap
4914:4 tight lit %gap
@@ -57,48 +57,48 @@
5716:3 NEWLINE
5716:3 NEWLINE
5816:3 glyph [
5816:3 glyph [
5916:4 tight lit %width
5916:4 tight lit %width
60−16:11 name extent
60+16:11 name length
6116:17 tight glyph ]
6116:17 tight glyph ]
6217:1 DEDENT
6217:1 DEDENT
6317:1 NEWLINE
6317:1 NEWLINE
6417:1 glyph ++
6417:1 glyph ++
6517:4 name one
6517:4 name one
6617:8 glyph ^-
6617:8 glyph ^-
67−17:11 name attribute
67+17:11 name attr
68−17:21 name gap
68+17:16 name gap
69−17:24 tight glyph +
69+17:19 tight glyph +
70−17:25 tight lit %s2
70+17:20 tight lit %s2
7118:1 NEWLINE
7118:1 NEWLINE
7218:1 glyph ++
7218:1 glyph ++
7318:4 name equiv
7318:4 name equiv
7418:10 glyph ^-
7418:10 glyph ^-
75−18:13 name attribute
75+18:13 name attr
76−18:23 glyph [
76+18:18 glyph [
77−18:24 tight lit %gap
77+18:19 tight lit %gap
78−18:29 lit %s2
78+18:24 lit %s2
79−18:32 tight glyph ]
79+18:27 tight glyph ]
8019:1 NEWLINE
8019:1 NEWLINE
8119:1 glyph ++
8119:1 glyph ++
82−19:4 name attributes
82+19:4 name attrs
83−19:15 glyph ^-
83+19:10 glyph ^-
84−19:18 glyph (
84+19:13 glyph (
85−19:19 tight name list
85+19:14 tight name list
86−19:24 name attribute
86+19:19 name attr
87−19:33 tight glyph )
87+19:23 tight glyph )
88−19:35 glyph ~[
88+19:25 glyph ~[
89−19:37 tight name gap
89+19:27 tight name gap
90−19:40 tight glyph +
90+19:30 tight glyph +
91−19:41 tight lit %s2
91+19:31 tight lit %s2
92−19:45 name pad
92+19:35 name pad
93+19:38 tight glyph +
94+19:39 tight lit %s3
95+19:43 name width
9319:48 tight glyph +
9619:48 tight glyph +
94−19:49 tight lit %s3
97+19:49 tight glyph [
95−19:53 name width
96−19:58 tight glyph +
97−19:59 tight glyph [
98−19:60 tight lit %fill
98+19:50 tight lit %fill
99−19:66 lit 1
99+19:56 lit 1
100−19:67 tight glyph ]
100+19:57 tight glyph ]
101−19:68 tight glyph ]
101+19:58 tight glyph ]
10220:1 NEWLINE
10220:1 NEWLINE
10320:1 glyph ++
10320:1 glyph ++
10420:4 name gap-structural
10420:4 name gap-structural
@@ -114,32 +114,32 @@
11421:1 glyph ++
11421:1 glyph ++
11521:4 name nested
11521:4 name nested
11621:11 glyph ^-
11621:11 glyph ^-
117−21:14 name attribute
117+21:14 name attr
118−21:24 name width
118+21:19 name width
119−21:29 tight glyph +
119+21:24 tight glyph +
120−21:30 tight glyph [
120+21:25 tight glyph [
121−21:31 tight lit %fill
121+21:26 tight lit %fill
122−21:37 lit 1
122+21:32 lit 1
123−21:38 tight glyph ]
123+21:33 tight glyph ]
12422:1 NEWLINE
12422:1 NEWLINE
12522:1 glyph ++
12522:1 glyph ++
12622:4 name mismatch
12622:4 name mismatch
12722:13 glyph ^-
12722:13 glyph ^-
128−22:16 name attribute
128+22:16 name attr
129−22:26 name gap
129+22:21 name gap
130−22:29 tight glyph +
130+22:24 tight glyph +
131−22:30 tight lit %shrink
131+22:25 tight lit %shrink
13223:1 NEWLINE
13223:1 NEWLINE
13323:1 glyph ++
13323:1 glyph ++
13423:4 name missing
13423:4 name missing
13523:12 glyph ^-
13523:12 glyph ^-
136−23:15 name attribute
136+23:15 name attr
137−23:25 name width
137+23:20 name width
138−23:30 tight glyph +
138+23:25 tight glyph +
139−23:31 tight glyph [
139+23:26 tight glyph [
140−23:32 tight lit %oops
140+23:27 tight lit %oops
141−23:38 lit 1
141+23:33 lit 1
142−23:39 tight glyph ]
142+23:34 tight glyph ]
14324:1 NEWLINE
14324:1 NEWLINE
14424:1 glyph ++
14424:1 glyph ++
14524:4 name pending
14524:4 name pending
@@ -150,12 +150,12 @@
15025:1 glyph ++
15025:1 glyph ++
15125:4 name cross-origin
15125:4 name cross-origin
15225:17 glyph ^-
15225:17 glyph ^-
153−25:20 name attribute
153+25:20 name attr
154−25:30 glyph ^-
154+25:25 glyph ^-
155−25:33 name other-attribute
155+25:28 name other-attr
156−25:49 name gap
156+25:39 name gap
157−25:52 tight glyph +
157+25:42 tight glyph +
158−25:53 tight lit %s2
158+25:43 tight lit %s2
15926:1 NEWLINE
15926:1 NEWLINE
16026:1 glyph ++
16026:1 glyph ++
16126:4 name noun-pair
16126:4 name noun-pair
@@ -193,13 +193,13 @@
19329:1 glyph ++
19329:1 glyph ++
19429:4 name wrong-number
19429:4 name wrong-number
19529:17 glyph ^-
19529:17 glyph ^-
196−29:20 name attribute
196+29:20 name attr
197−29:30 name width
197+29:25 name width
198−29:35 tight glyph +
198+29:30 tight glyph +
199−29:36 tight glyph [
199+29:31 tight glyph [
200−29:37 tight lit %fill
200+29:32 tight lit %fill
201−29:43 str "hi"
201+29:38 str "hi"
202−29:47 tight glyph ]
202+29:42 tight glyph ]
20330:1 NEWLINE
20330:1 NEWLINE
20430:1 glyph ++
20430:1 glyph ++
20530:4 name unrelated
20530:4 name unrelated
@@ -208,10 +208,10 @@
20831:6 lit %dangling
20831:6 lit %dangling
20932:5 INDENT
20932:5 INDENT
21032:5 glyph ^-
21032:5 glyph ^-
211−32:8 name attribute
211+32:8 name attr
212−32:18 name gap
212+32:13 name gap
213−32:21 tight glyph +
213+32:16 tight glyph +
214−32:22 tight lit %s2
214+32:17 tight lit %s2
215−32:25 DEDENT
215+32:20 DEDENT
216−32:25 DEDENT
216+32:20 DEDENT
217−32:25 NEWLINE
217+32:20 NEWLINE
tests/golden/types-pair-context/tree.txt+34−34
@@ -1,64 +1,64 @@
1(module
1(module
2 (mold 1:1 spacing
2 (mold 1:1 spacing
3 (union 2:3 (const 2:3 %s0) (const 3:3 %s1) (const 4:3 %s2) (const 5:3 %s3)))
3 (union 2:3 (const 2:3 %s0) (const 3:3 %s1) (const 4:3 %s2) (const 5:3 %s3)))
4− (mold 6:1 extent
4+ (mold 6:1 length
5 (union 7:3
5 (union 7:3
6 (cell 7:3
6 (cell 7:3
7 (const 7:4 %fill)
7 (const 7:4 %fill)
8 (face 7:10 n (aura 7:12 @ud)))
8 (face 7:10 n (aura 7:12 @ud)))
9 (const 8:3 %shrink)))
9 (const 8:3 %shrink)))
10− (mold 9:1 attribute
10+ (mold 9:1 attr
11 (union 10:3
11 (union 10:3
12 (cell 10:3 (const 10:4 %gap) (ref 10:9 spacing))
12 (cell 10:3 (const 10:4 %gap) (ref 10:9 spacing))
13 (cell 11:3 (const 11:4 %pad) (ref 11:9 spacing))
13 (cell 11:3 (const 11:4 %pad) (ref 11:9 spacing))
14− (cell 12:3 (const 12:4 %width) (ref 12:11 extent))))
14+ (cell 12:3 (const 12:4 %width) (ref 12:11 length))))
15− (mold 13:1 other-attribute
15+ (mold 13:1 other-attr
16 (union 14:3
16 (union 14:3
17 (cell 14:3 (const 14:4 %gap) (ref 14:9 spacing))
17 (cell 14:3 (const 14:4 %gap) (ref 14:9 spacing))
18 (cell 15:3 (const 15:4 %pad) (ref 15:9 spacing))
18 (cell 15:3 (const 15:4 %pad) (ref 15:9 spacing))
19− (cell 16:3 (const 16:4 %width) (ref 16:11 extent))))
19+ (cell 16:3 (const 16:4 %width) (ref 16:11 length))))
20 (value 17:1 one
20 (value 17:1 one
21 (cast 17:8
21 (cast 17:8
22− (ref 17:11 attribute)
22+ (ref 17:11 attr)
23− (pair 17:21 gap (lit 17:25 %s2))))
23+ (pair 17:16 gap (lit 17:20 %s2))))
24 (value 18:1 equiv
24 (value 18:1 equiv
25 (cast 18:10
25 (cast 18:10
26− (ref 18:13 attribute)
26+ (ref 18:13 attr)
27− (tuple 18:23 (lit 18:24 %gap) (lit 18:29 %s2))))
27+ (tuple 18:18 (lit 18:19 %gap) (lit 18:24 %s2))))
28− (value 19:1 attributes
28+ (value 19:1 attrs
29− (cast 19:15
29+ (cast 19:10
30− (apply 19:18 list (ref 19:24 attribute))
30+ (apply 19:13 list (ref 19:19 attr))
31− (list 19:35
31+ (list 19:25
32− (pair 19:37 gap (lit 19:41 %s2))
32+ (pair 19:27 gap (lit 19:31 %s2))
33− (pair 19:45 pad (lit 19:49 %s3))
33+ (pair 19:35 pad (lit 19:39 %s3))
34− (pair 19:53 width
34+ (pair 19:43 width
35− (tuple 19:59 (lit 19:60 %fill) (lit 19:66 1))))))
35+ (tuple 19:49 (lit 19:50 %fill) (lit 19:56 1))))))
36 (value 20:1 gap-structural
36 (value 20:1 gap-structural
37 (cast 20:19
37 (cast 20:19
38 (cell 20:22 (aura 20:23 @tas) (aura 20:28 @tas))
38 (cell 20:22 (aura 20:23 @tas) (aura 20:28 @tas))
39 (pair 20:34 gap (lit 20:38 %s2))))
39 (pair 20:34 gap (lit 20:38 %s2))))
40 (value 21:1 nested
40 (value 21:1 nested
41 (cast 21:11
41 (cast 21:11
42− (ref 21:14 attribute)
42+ (ref 21:14 attr)
43− (pair 21:24 width
43+ (pair 21:19 width
44− (tuple 21:30 (lit 21:31 %fill) (lit 21:37 1)))))
44+ (tuple 21:25 (lit 21:26 %fill) (lit 21:32 1)))))
45 (value 22:1 mismatch
45 (value 22:1 mismatch
46 (cast 22:13
46 (cast 22:13
47− (ref 22:16 attribute)
47+ (ref 22:16 attr)
48− (pair 22:26 gap (lit 22:30 %shrink))))
48+ (pair 22:21 gap (lit 22:25 %shrink))))
49 (value 23:1 missing
49 (value 23:1 missing
50 (cast 23:12
50 (cast 23:12
51− (ref 23:15 attribute)
51+ (ref 23:15 attr)
52− (pair 23:25 width
52+ (pair 23:20 width
53− (tuple 23:31 (lit 23:32 %oops) (lit 23:38 1)))))
53+ (tuple 23:26 (lit 23:27 %oops) (lit 23:33 1)))))
54 (value 24:1 pending
54 (value 24:1 pending
55 (pair 24:12 gap (lit 24:16 %s2)))
55 (pair 24:12 gap (lit 24:16 %s2)))
56 (value 25:1 cross-origin
56 (value 25:1 cross-origin
57 (cast 25:17
57 (cast 25:17
58− (ref 25:20 attribute)
58+ (ref 25:20 attr)
59− (cast 25:30
59+ (cast 25:25
60− (ref 25:33 other-attribute)
60+ (ref 25:28 other-attr)
61− (pair 25:49 gap (lit 25:53 %s2)))))
61+ (pair 25:39 gap (lit 25:43 %s2)))))
62 (value 26:1 noun-pair
62 (value 26:1 noun-pair
63 (cast 26:14
63 (cast 26:14
64 (cell 26:17 (noun 26:18) (noun 26:20))
64 (cell 26:17 (noun 26:18) (noun 26:20))
@@ -73,14 +73,14 @@
73 (pair 28:29 gap (lit 28:33 %s2))))
73 (pair 28:29 gap (lit 28:33 %s2))))
74 (value 29:1 wrong-number
74 (value 29:1 wrong-number
75 (cast 29:17
75 (cast 29:17
76− (ref 29:20 attribute)
76+ (ref 29:20 attr)
77− (pair 29:30 width
77+ (pair 29:25 width
78− (tuple 29:36 (lit 29:37 %fill) (str 29:43 "hi")))))
78+ (tuple 29:31 (lit 29:32 %fill) (str 29:38 "hi")))))
79 (value 30:1 unrelated
79 (value 30:1 unrelated
80 (body 31:3
80 (body 31:3
81 (trace 31:3
81 (trace 31:3
82 (lit 31:6 %dangling)
82 (lit 31:6 %dangling)
83 (body 32:5
83 (body 32:5
84 (cast 32:5
84 (cast 32:5
85− (ref 32:8 attribute)
85+ (ref 32:8 attr)
86− (pair 32:18 gap (lit 32:22 %s2))))))))
86+ (pair 32:13 gap (lit 32:17 %s2))))))))
tests/golden/types-pair-context/types.txt+19−19
@@ -1,27 +1,27 @@
1partial inference; module not checked
1partial inference; module not checked
2+$ spacing: cases proven disjoint; mold not checked
2+$ spacing: cases proven disjoint; mold not checked
3−+$ extent: cases proven disjoint; mold not checked
3++$ length: cases proven disjoint; mold not checked
4−+$ attribute: cases proven disjoint; mold not checked
4++$ attr: cases proven disjoint; mold not checked
5−+$ other-attribute: cases proven disjoint; mold not checked
5++$ other-attr: cases proven disjoint; mold not checked
6−++ one: attribute
6+++ one: attr
7−++ equiv: attribute
7+++ equiv: attr
8−++ attributes: (list attribute)
8+++ attrs: (list attr)
9++ gap-structural: [@tas @tas]
9++ gap-structural: [@tas @tas]
10−++ nested: attribute
10+++ nested: attr
11++ mismatch: cast mold and expression type do not unify
11++ mismatch: cast mold and expression type do not unify
12/tests/golden/types-pair-context/source.jibb:22:16: cast mold
12/tests/golden/types-pair-context/source.jibb:22:16: cast mold
13−++ mismatch ^- attribute gap+%shrink
13+++ mismatch ^- attr gap+%shrink
14 ^
14 ^
15−/tests/golden/types-pair-context/source.jibb:22:26: expression
15+/tests/golden/types-pair-context/source.jibb:22:21: expression
16−++ mismatch ^- attribute gap+%shrink
16+++ mismatch ^- attr gap+%shrink
17− ^
17+ ^
18++ missing: cast mold and expression type do not unify
18++ missing: cast mold and expression type do not unify
19/tests/golden/types-pair-context/source.jibb:23:15: cast mold
19/tests/golden/types-pair-context/source.jibb:23:15: cast mold
20−++ missing ^- attribute width+[%oops 1]
20+++ missing ^- attr width+[%oops 1]
21 ^
21 ^
22−/tests/golden/types-pair-context/source.jibb:23:25: expression
22+/tests/golden/types-pair-context/source.jibb:23:20: expression
23−++ missing ^- attribute width+[%oops 1]
23+++ missing ^- attr width+[%oops 1]
24− ^
24+ ^
25++ pending: tag needs context in partial inference
25++ pending: tag needs context in partial inference
26++ cross-origin: cast constraint is not supported by partial inference
26++ cross-origin: cast constraint is not supported by partial inference
27++ noun-pair: [* *]
27++ noun-pair: [* *]
@@ -35,9 +35,9 @@ partial inference; module not checked
35 ^
35 ^
36++ wrong-number: cast mold and expression type do not unify
36++ wrong-number: cast mold and expression type do not unify
37/tests/golden/types-pair-context/source.jibb:29:20: cast mold
37/tests/golden/types-pair-context/source.jibb:29:20: cast mold
38−++ wrong-number ^- attribute width+[%fill "hi"]
38+++ wrong-number ^- attr width+[%fill "hi"]
39 ^
39 ^
40−/tests/golden/types-pair-context/source.jibb:29:30: expression
40+/tests/golden/types-pair-context/source.jibb:29:25: expression
41−++ wrong-number ^- attribute width+[%fill "hi"]
41+++ wrong-number ^- attr width+[%fill "hi"]
42− ^
42+ ^
43++ unrelated: tag needs context in partial inference
43++ unrelated: tag needs context in partial inference
tests/golden/types-partial-aura-family/source.jibb+1−1
@@ -1,7 +1,7 @@
1++ decimal |= x=@ud ^- @u x
1++ decimal |= x=@ud ^- @u x
2++ hex ^- @u 0x1f
2++ hex ^- @u 0x1f
3++ base32 |= x=@uv ^- @u x
3++ base32 |= x=@uv ^- @u x
4−++ text-value |= x=@tD ^- @t x
4+++ text |= x=@tD ^- @t x
5++ narrow |= x=@t ^- @tD x
5++ narrow |= x=@t ^- @tD x
6++ siblings |= x=@ux ^- @ud x
6++ siblings |= x=@ux ^- @ud x
7++ dup |= p=[A A] p
7++ dup |= p=[A A] p
tests/golden/types-partial-aura-family/tokens.txt+8−8
@@ -25,14 +25,14 @@
253:26 name x
253:26 name x
264:1 NEWLINE
264:1 NEWLINE
274:1 glyph ++
274:1 glyph ++
28−4:4 name text-value
28+4:4 name text
29−4:15 glyph |=
29+4:9 glyph |=
30−4:18 name x
30+4:12 name x
31−4:19 tight glyph =
31+4:13 tight glyph =
32−4:20 tight aura @tD
32+4:14 tight aura @tD
33−4:24 glyph ^-
33+4:18 glyph ^-
34−4:27 aura @t
34+4:21 aura @t
35−4:30 name x
35+4:24 name x
365:1 NEWLINE
365:1 NEWLINE
375:1 glyph ++
375:1 glyph ++
385:4 name narrow
385:4 name narrow
tests/golden/types-partial-aura-family/tree.txt+4−4
@@ -9,10 +9,10 @@
9 (gate 3:11
9 (gate 3:11
10 (face 3:14 x (aura 3:16 @uv))
10 (face 3:14 x (aura 3:16 @uv))
11 (cast 3:20 (aura 3:23 @u) (wing 3:26 x))))
11 (cast 3:20 (aura 3:23 @u) (wing 3:26 x))))
12− (value 4:1 text-value
12+ (value 4:1 text
13− (gate 4:15
13+ (gate 4:9
14− (face 4:18 x (aura 4:20 @tD))
14+ (face 4:12 x (aura 4:14 @tD))
15− (cast 4:24 (aura 4:27 @t) (wing 4:30 x))))
15+ (cast 4:18 (aura 4:21 @t) (wing 4:24 x))))
16 (value 5:1 narrow
16 (value 5:1 narrow
17 (gate 5:11
17 (gate 5:11
18 (face 5:14 x (aura 5:16 @t))
18 (face 5:14 x (aura 5:16 @t))
tests/golden/types-partial-aura-family/types.txt+1−1
@@ -2,7 +2,7 @@ partial inference; module not checked
2++ decimal: $-(@ud @u)
2++ decimal: $-(@ud @u)
3++ hex: @u
3++ hex: @u
4++ base32: $-(@uv @u)
4++ base32: $-(@uv @u)
5−++ text-value: $-(@tD @t)
5+++ text: $-(@tD @t)
6++ narrow: cast mold and expression type do not unify
6++ narrow: cast mold and expression type do not unify
7/tests/golden/types-partial-aura-family/source.jibb:5:22: cast mold has type @tD
7/tests/golden/types-partial-aura-family/source.jibb:5:22: cast mold has type @tD
8++ narrow |= x=@t ^- @tD x
8++ narrow |= x=@t ^- @tD x
tests/golden/types-partial-locals/source.jibb+2−2
@@ -32,9 +32,9 @@
32++ local-mold |= x
32++ local-mold |= x
33 +$ item @t
33 +$ item @t
34 x
34 x
35−++ wrap-value |= y |=(z y)
35+++ wrap |= y |=(z y)
36++ through-global |= x
36++ through-global |= x
37− ++ local (wrap-value x)
37+ ++ local (wrap x)
38 ~& ^- @t (local ~zod)
38 ~& ^- @t (local ~zod)
39 ^- @p (local "hi")
39 ^- @p (local "hi")
40++ nested-shadow |= x
40++ nested-shadow |= x
tests/golden/types-partial-locals/tokens.txt+10−10
@@ -180,13 +180,13 @@
18035:1 DEDENT
18035:1 DEDENT
18135:1 NEWLINE
18135:1 NEWLINE
18235:1 glyph ++
18235:1 glyph ++
183−35:4 name wrap-value
183+35:4 name wrap
184−35:15 glyph |=
184+35:9 glyph |=
185−35:18 name y
185+35:12 name y
186−35:20 glyph |=(
186+35:14 glyph |=(
187−35:23 tight name z
187+35:17 tight name z
188−35:25 name y
188+35:19 name y
189−35:26 tight glyph )
189+35:20 tight glyph )
19036:1 NEWLINE
19036:1 NEWLINE
19136:1 glyph ++
19136:1 glyph ++
19236:4 name through-global
19236:4 name through-global
@@ -196,9 +196,9 @@
19637:3 glyph ++
19637:3 glyph ++
19737:6 name local
19737:6 name local
19837:12 glyph (
19837:12 glyph (
199−37:13 tight name wrap-value
199+37:13 tight name wrap
200−37:24 name x
200+37:18 name x
201−37:25 tight glyph )
201+37:19 tight glyph )
20238:3 NEWLINE
20238:3 NEWLINE
20338:3 glyph ~&
20338:3 glyph ~&
20438:6 glyph ^-
20438:6 glyph ^-
tests/golden/types-partial-locals/tree.txt+5−5
@@ -88,17 +88,17 @@
88 (body 33:3
88 (body 33:3
89 (mold 33:3 item (aura 33:11 @t))
89 (mold 33:3 item (aura 33:11 @t))
90 (wing 34:3 x))))
90 (wing 34:3 x))))
91− (value 35:1 wrap-value
91+ (value 35:1 wrap
92− (gate 35:15
92+ (gate 35:9
93− (bind 35:18 y)
93+ (bind 35:12 y)
94− (gate-wide 35:20 (bind 35:23 z) (wing 35:25 y))))
94+ (gate-wide 35:14 (bind 35:17 z) (wing 35:19 y))))
95 (value 36:1 through-global
95 (value 36:1 through-global
96 (gate 36:19
96 (gate 36:19
97 (bind 36:22 x)
97 (bind 36:22 x)
98 (body 37:3
98 (body 37:3
99 (value 37:3 local
99 (value 37:3 local
100 (group 37:12
100 (group 37:12
101− (call 37:13 (wing 37:13 wrap-value) (wing 37:24 x))))
101+ (call 37:13 (wing 37:13 wrap) (wing 37:18 x))))
102 (trace 38:3
102 (trace 38:3
103 (cast 38:6
103 (cast 38:6
104 (aura 38:9 @t)
104 (aura 38:9 @t)
tests/golden/types-partial-locals/types.txt+1−1
@@ -21,7 +21,7 @@ partial inference; module not checked
21 ^
21 ^
22++ unused-bad: local definitions need unsupported inference
22++ unused-bad: local definitions need unsupported inference
23++ local-mold: $-(A A)
23++ local-mold: $-(A A)
24−++ wrap-value: $-(A $-(B A))
24+++ wrap: $-(A $-(B A))
25++ through-global: cast mold and expression type do not unify
25++ through-global: cast mold and expression type do not unify
26/tests/golden/types-partial-locals/source.jibb:39:8: cast mold has type @p
26/tests/golden/types-partial-locals/source.jibb:39:8: cast mold has type @p
27 ^- @p (local "hi")
27 ^- @p (local "hi")
tests/golden/types-prelude-arithmetic/about.txt+1−1
@@ -1,4 +1,4 @@
1source: docs/spec/grammar.md, Molds, Atoms: "Arithmetic rejects loobean operands: `?` contains only 0 and 1, while an arithmetic result need not."
1source: docs/spec/grammar.md, Molds, Atoms: "Arithmetic rejects loobean operands: `?` contains only 0 and 1, while an arithmetic result need not."
2−tests: The source-backed add, dec and gth wrappers preserve numeric auras, constrained generic types, and independent comparison behavior. Loobean operands are rejected by add and dec, with both sites, including inside a local gate; the source-backed lent infers list lengths. Primitive lowering, jet recognition and execution remain unfinished. The module report is partial.
2+tests: The source-backed add, dec and gth wrappers preserve numeric auras, constrained generic types, and independent comparison behavior. Loobean operands are rejected by add and dec; the source-backed lent infers list lengths. Primitive lowering, jet recognition and execution remain unfinished. The module report is partial.
3expect: parses
3expect: parses
4expect-types: a partial inference report
4expect-types: a partial inference report
tests/golden/types-prelude-arithmetic/types.txt+1−7
@@ -46,11 +46,5 @@ partial inference; module not checked
46/tests/golden/types-prelude-arithmetic/source.jibb:19:25: argument has type ?
46/tests/golden/types-prelude-arithmetic/source.jibb:19:25: argument has type ?
47++ captured |= x=? (add x x)
47++ captured |= x=? (add x x)
48 ^
48 ^
49−++ captured-local: call's sample and argument types do not unify
49+++ captured-local: local definitions need unsupported inference
50−/tests/golden/types-prelude-arithmetic/source.jibb:21:20: called gate has type $-([A A] A) where A is an atom other than ?
51− ++ local |= y=? (add x y)
52− ^
53−/tests/golden/types-prelude-arithmetic/source.jibb:21:24: argument has type ?
54− ++ local |= y=? (add x y)
55− ^
56++ inc: $-(A A) where A is an atom other than ?
50++ inc: $-(A A) where A is an atom other than ?
tests/golden/types-prelude-ask/about.txt+1−1
@@ -1,4 +1,4 @@
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."
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."
2tests: 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.
2tests: 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.
3expect: parses
3expect: parses
4expect-types: a partial inference report
4expect-types: a partial inference report
tests/golden/types-prelude-ask/source.jibb+1−1
@@ -40,7 +40,7 @@
40++ ordinary-path ^- path ~[~.items]
40++ ordinary-path ^- path ~[~.items]
41++ ask-from-ordinary (agent ordinary-path |=(v=[mark=@tas state=(unit *) fact=*] [state=0 message="ok"]))
41++ ask-from-ordinary (agent ordinary-path |=(v=[mark=@tas state=(unit *) fact=*] [state=0 message="ok"]))
42++ ask-from-qath (agent %/items |=(v=[mark=@tas state=(unit *) fact=*] [state=0 message="ok"]))
42++ ask-from-qath (agent %/items |=(v=[mark=@tas state=(unit *) fact=*] [state=0 message="ok"]))
43−++ store-ask |= rec=$-([state=(unit *) fact=*] [state=* message=@t])
43+++ store |= rec=$-([state=(unit *) fact=*] [state=* message=@t])
44 ^- (ask @t) [%store module="/ui/store/cart" name=%state receive=rec]
44 ^- (ask @t) [%store module="/ui/store/cart" name=%state receive=rec]
45++ wrong-store |= rec=$-([state=(unit *) fact=*] [state=* message=@p])
45++ wrong-store |= rec=$-([state=(unit *) fact=*] [state=* message=@p])
46 ^- (ask @t) [%store module="/ui/store/cart" name=%state receive=rec]
46 ^- (ask @t) [%store module="/ui/store/cart" name=%state receive=rec]
tests/golden/types-prelude-ask/tokens.txt+25−25
@@ -639,31 +639,31 @@
63942:95 tight glyph )
63942:95 tight glyph )
64043:1 NEWLINE
64043:1 NEWLINE
64143:1 glyph ++
64143:1 glyph ++
642−43:4 name store-ask
642+43:4 name store
643−43:14 glyph |=
643+43:10 glyph |=
644−43:17 name rec
644+43:13 name rec
645+43:16 tight glyph =
646+43:17 tight glyph $-(
645−43:20 tight glyph =
647+43:20 tight glyph [
646−43:21 tight glyph $-(
648+43:21 tight name state
647−43:24 tight glyph [
648−43:25 tight name state
649−43:30 tight glyph =
649+43:26 tight glyph =
650−43:31 tight glyph (
650+43:27 tight glyph (
651−43:32 tight name unit
651+43:28 tight name unit
652−43:37 glyph *
652+43:33 glyph *
653−43:38 tight glyph )
653+43:34 tight glyph )
654−43:40 name fact
654+43:36 name fact
655+43:40 tight glyph =
656+43:41 tight glyph *
657+43:42 tight glyph ]
655−43:44 tight glyph =
658+43:44 glyph [
656−43:45 tight glyph *
659+43:45 tight name state
657−43:46 tight glyph ]
658−43:48 glyph [
659−43:49 tight name state
660−43:54 tight glyph =
660+43:50 tight glyph =
661−43:55 tight glyph *
661+43:51 tight glyph *
662−43:57 name message
662+43:53 name message
663−43:64 tight glyph =
663+43:60 tight glyph =
664−43:65 tight aura @t
664+43:61 tight aura @t
665−43:67 tight glyph ]
665+43:63 tight glyph ]
666−43:68 tight glyph )
666+43:64 tight glyph )
66744:3 INDENT
66744:3 INDENT
66844:3 glyph ^-
66844:3 glyph ^-
66944:6 glyph (
66944:6 glyph (
tests/golden/types-prelude-ask/tree.txt+11−11
@@ -266,17 +266,17 @@
266 (tuple 42:72
266 (tuple 42:72
267 (face 42:73 state (lit 42:79 0))
267 (face 42:73 state (lit 42:79 0))
268 (face 42:81 message (str 42:89 "ok")))))))
268 (face 42:81 message (str 42:89 "ok")))))))
269− (value 43:1 store-ask
269+ (value 43:1 store
270− (gate 43:14
270+ (gate 43:10
271− (face 43:17 rec
271+ (face 43:13 rec
272− (fn 43:21
272+ (fn 43:17
273− (cell 43:24
273+ (cell 43:20
274− (face 43:25 state
274+ (face 43:21 state
275− (apply 43:31 unit (noun 43:37)))
275+ (apply 43:27 unit (noun 43:33)))
276− (face 43:40 fact (noun 43:45)))
276+ (face 43:36 fact (noun 43:41)))
277− (cell 43:48
277+ (cell 43:44
278− (face 43:49 state (noun 43:55))
278+ (face 43:45 state (noun 43:51))
279− (face 43:57 message (aura 43:65 @t)))))
279+ (face 43:53 message (aura 43:61 @t)))))
280 (body 44:3
280 (body 44:3
281 (cast 44:3
281 (cast 44:3
282 (apply 44:6 ask (aura 44:11 @t))
282 (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
35++ ordinary-path: (list @ta)
35++ ordinary-path: (list @ta)
36++ ask-from-ordinary: call constraint is not supported by partial inference
36++ ask-from-ordinary: call constraint is not supported by partial inference
37++ ask-from-qath: call constraint is not supported by partial inference
37++ ask-from-qath: call constraint is not supported by partial inference
38−++ store-ask: $-($-([state=(unit *) fact=*] [state=* message=@t]) (ask @t))
38+++ store: $-($-([state=(unit *) fact=*] [state=* message=@t]) (ask @t))
39++ wrong-store: cast constraint is not supported by partial inference
39++ wrong-store: cast constraint is not supported by partial inference
40++ incomplete: missing union case [%store [module=@t [name=@tas receive=$-([state=(unit *) fact=*] [state=* message=@t])]]]
40++ incomplete: missing union case [%store [module=@t [name=@tas receive=$-([state=(unit *) fact=*] [state=* message=@t])]]]
41++ complete: $-((ask @t) @t)
41++ complete: $-((ask @t) @t)
tests/golden/types-prelude-bond/source.jibb+1−1
@@ -1,6 +1,6 @@
1++ choose (bond |=(~ "default"))
1++ choose (bond |=(~ "default"))
2++ missing (choose ~)
2++ missing (choose ~)
3++ present (choose `"found")
3++ present (choose `"found")
4−++ wrap-value |= fallback=$-(~ A) (bond fallback)
4+++ wrap |= fallback=$-(~ A) (bond fallback)
5++ choose-ship (bond |=(~ ~zod))
5++ choose-ship (bond |=(~ ~zod))
6++ present-ship (choose-ship `~zod)
6++ present-ship (choose-ship `~zod)
tests/golden/types-prelude-bond/tokens.txt+12−12
@@ -24,18 +24,18 @@
243:28 tight glyph )
243:28 tight glyph )
254:1 NEWLINE
254:1 NEWLINE
264:1 glyph ++
264:1 glyph ++
27−4:4 name wrap-value
27+4:4 name wrap
28−4:15 glyph |=
28+4:9 glyph |=
29−4:18 name fallback
29+4:12 name fallback
30−4:26 tight glyph =
30+4:20 tight glyph =
31−4:27 tight glyph $-(
31+4:21 tight glyph $-(
32−4:30 tight lit ~
32+4:24 tight lit ~
33−4:32 tvar A
33+4:26 tvar A
34−4:33 tight glyph )
34+4:27 tight glyph )
35−4:35 glyph (
35+4:29 glyph (
36−4:36 tight name bond
36+4:30 tight name bond
37−4:41 name fallback
37+4:35 name fallback
38−4:49 tight glyph )
38+4:43 tight glyph )
395:1 NEWLINE
395:1 NEWLINE
405:1 glyph ++
405:1 glyph ++
415:4 name choose-ship
415:4 name choose-ship
tests/golden/types-prelude-bond/tree.txt+6−6
@@ -12,12 +12,12 @@
12 (call 3:13
12 (call 3:13
13 (wing 3:13 choose)
13 (wing 3:13 choose)
14 (unit 3:20 (str 3:21 "found")))))
14 (unit 3:20 (str 3:21 "found")))))
15− (value 4:1 wrap-value
15+ (value 4:1 wrap
16− (gate 4:15
16+ (gate 4:9
17− (face 4:18 fallback
17+ (face 4:12 fallback
18− (fn 4:27 (const 4:30 ~) (tvar 4:32 A)))
18+ (fn 4:21 (const 4:24 ~) (tvar 4:26 A)))
19− (group 4:35
19+ (group 4:29
20− (call 4:36 (wing 4:36 bond) (wing 4:41 fallback)))))
20+ (call 4:30 (wing 4:30 bond) (wing 4:35 fallback)))))
21 (value 5:1 choose-ship
21 (value 5:1 choose-ship
22 (group 5:16
22 (group 5:16
23 (call 5:17
23 (call 5:17
tests/golden/types-prelude-bond/types.txt+1−1
@@ -2,6 +2,6 @@ partial inference; module not checked
2++ choose: $-((unit @t) @t)
2++ choose: $-((unit @t) @t)
3++ missing: @t
3++ missing: @t
4++ present: @t
4++ present: @t
5−++ wrap-value: $-($-(~ A) $-((unit A) A))
5+++ wrap: $-($-(~ A) $-((unit A) A))
6++ choose-ship: $-((unit @p) @p)
6++ choose-ship: $-((unit @p) @p)
7++ present-ship: @p
7++ present-ship: @p
tests/golden/types-prelude-cmd/source.jibb+6−6
@@ -3,19 +3,19 @@
3++ nav ^- (cmd @t) [%go url="/home"]
3++ nav ^- (cmd @t) [%go url="/home"]
4++ time ^- (cmd @t) [%now reply=|=(d=@da "done")]
4++ time ^- (cmd @t) [%now reply=|=(d=@da "done")]
5++ bad ^- (cmd @t) [%go url=~zod]
5++ bad ^- (cmd @t) [%go url=~zod]
6−++ send |= p=raw-poke
6+++ send |= p=poke
7 ^- (cmd @t) [%poke p |=(r=(unit @t) "done")]
7 ^- (cmd @t) [%poke p |=(r=(unit @t) "done")]
8++ wait ^- (cmd @t) [%wait ~s30 "done"]
8++ wait ^- (cmd @t) [%wait ~s30 "done"]
9++ who ^- (cmd @t) [%who |=(p=@p "done")]
9++ who ^- (cmd @t) [%who |=(p=@p "done")]
10++ wrong-message ^- (cmd @t) [%wait ~s30 ~zod]
10++ wrong-message ^- (cmd @t) [%wait ~s30 ~zod]
11−++ wrap-value |= x=A ^- (cmd A) [%wait ~s30 x]
11+++ wrap |= x=A ^- (cmd A) [%wait ~s30 x]
12−++ wrap-value-text (wrap-value "hello")
12+++ wrap-text (wrap "hello")
13−++ wrap-value-ship (wrap-value ~zod)
13+++ wrap-ship (wrap ~zod)
14++ wrong-reply ^- (cmd @t) [%who |=(p=@p ~zod)]
14++ wrong-reply ^- (cmd @t) [%who |=(p=@p ~zod)]
15++ commands ^- (list (cmd @t)) ~[[%go "/home"] [%wait ~s30 "done"]]
15++ commands ^- (list (cmd @t)) ~[[%go "/home"] [%wait ~s30 "done"]]
16++ commands-bad ^- (list (cmd @t)) ~[[%go "/home"] [%wait ~s30 ~zod]]
16++ commands-bad ^- (list (cmd @t)) ~[[%go "/home"] [%wait ~s30 ~zod]]
17−++ wrong-poke |= p=raw-poke
17+++ wrong-poke |= p=poke
18 ^- (cmd @t) [%poke p |=(r=@p "done")]
18 ^- (cmd @t) [%poke p |=(r=@p "done")]
19++ wrong-case ^- (cmd @t) %oops
19++ wrong-case ^- (cmd @t) %oops
20++ use-text |= x=(cmd @t) x
20++ use-text |= x=(cmd @t) x
21−++ cross (use-text (wrap-value ~zod))
21+++ cross (use-text (wrap ~zod))
tests/golden/types-prelude-cmd/tokens.txt+32−32
@@ -72,7 +72,7 @@
726:9 glyph |=
726:9 glyph |=
736:12 name p
736:12 name p
746:13 tight glyph =
746:13 tight glyph =
75−6:14 tight name raw-poke
75+6:14 tight name poke
767:3 INDENT
767:3 INDENT
777:3 glyph ^-
777:3 glyph ^-
787:6 glyph (
787:6 glyph (
@@ -138,35 +138,35 @@
13810:46 tight glyph ]
13810:46 tight glyph ]
13911:1 NEWLINE
13911:1 NEWLINE
14011:1 glyph ++
14011:1 glyph ++
141−11:4 name wrap-value
141+11:4 name wrap
142−11:15 glyph |=
142+11:9 glyph |=
143−11:18 name x
143+11:12 name x
144−11:19 tight glyph =
144+11:13 tight glyph =
145−11:20 tight tvar A
145+11:14 tight tvar A
146−11:22 glyph ^-
146+11:16 glyph ^-
147−11:25 glyph (
147+11:19 glyph (
148−11:26 tight name cmd
148+11:20 tight name cmd
149−11:30 tvar A
149+11:24 tvar A
150−11:31 tight glyph )
150+11:25 tight glyph )
151−11:33 glyph [
151+11:27 glyph [
152−11:34 tight lit %wait
152+11:28 tight lit %wait
153−11:40 lit ~s30
153+11:34 lit ~s30
154−11:45 name x
154+11:39 name x
155−11:46 tight glyph ]
155+11:40 tight glyph ]
15612:1 NEWLINE
15612:1 NEWLINE
15712:1 glyph ++
15712:1 glyph ++
158−12:4 name wrap-value-text
158+12:4 name wrap-text
159−12:20 glyph (
159+12:14 glyph (
160−12:21 tight name wrap-value
160+12:15 tight name wrap
161−12:32 str "hello"
161+12:20 str "hello"
162−12:39 tight glyph )
162+12:27 tight glyph )
16313:1 NEWLINE
16313:1 NEWLINE
16413:1 glyph ++
16413:1 glyph ++
165−13:4 name wrap-value-ship
165+13:4 name wrap-ship
166−13:20 glyph (
166+13:14 glyph (
167−13:21 tight name wrap-value
167+13:15 tight name wrap
168−13:32 lit ~zod
168+13:20 lit ~zod
169−13:36 tight glyph )
169+13:24 tight glyph )
17014:1 NEWLINE
17014:1 NEWLINE
17114:1 glyph ++
17114:1 glyph ++
17214:4 name wrong-reply
17214:4 name wrong-reply
@@ -234,7 +234,7 @@
23417:15 glyph |=
23417:15 glyph |=
23517:18 name p
23517:18 name p
23617:19 tight glyph =
23617:19 tight glyph =
237−17:20 tight name raw-poke
237+17:20 tight name poke
23818:3 INDENT
23818:3 INDENT
23918:3 glyph ^-
23918:3 glyph ^-
24018:6 glyph (
24018:6 glyph (
@@ -278,8 +278,8 @@
27821:10 glyph (
27821:10 glyph (
27921:11 tight name use-text
27921:11 tight name use-text
28021:20 glyph (
28021:20 glyph (
281−21:21 tight name wrap-value
281+21:21 tight name wrap
282−21:32 lit ~zod
282+21:26 lit ~zod
283−21:36 tight glyph )
283+21:30 tight glyph )
284−21:37 tight glyph )
284+21:31 tight glyph )
285−21:38 NEWLINE
285+21:32 NEWLINE
tests/golden/types-prelude-cmd/tree.txt+15−15
@@ -32,7 +32,7 @@
32 (face 5:25 url (lit 5:29 ~zod)))))
32 (face 5:25 url (lit 5:29 ~zod)))))
33 (value 6:1 send
33 (value 6:1 send
34 (gate 6:9
34 (gate 6:9
35− (face 6:12 p (ref 6:14 raw-poke))
35+ (face 6:12 p (ref 6:14 poke))
36 (body 7:3
36 (body 7:3
37 (cast 7:3
37 (cast 7:3
38 (apply 7:6 cmd (aura 7:11 @t))
38 (apply 7:6 cmd (aura 7:11 @t))
@@ -59,18 +59,18 @@
59 (cast 10:18
59 (cast 10:18
60 (apply 10:21 cmd (aura 10:26 @t))
60 (apply 10:21 cmd (aura 10:26 @t))
61 (tuple 10:30 (lit 10:31 %wait) (lit 10:37 ~s30) (lit 10:42 ~zod))))
61 (tuple 10:30 (lit 10:31 %wait) (lit 10:37 ~s30) (lit 10:42 ~zod))))
62− (value 11:1 wrap-value
62+ (value 11:1 wrap
63− (gate 11:15
63+ (gate 11:9
64− (face 11:18 x (tvar 11:20 A))
64+ (face 11:12 x (tvar 11:14 A))
65− (cast 11:22
65+ (cast 11:16
66− (apply 11:25 cmd (tvar 11:30 A))
66+ (apply 11:19 cmd (tvar 11:24 A))
67− (tuple 11:33 (lit 11:34 %wait) (lit 11:40 ~s30) (wing 11:45 x)))))
67+ (tuple 11:27 (lit 11:28 %wait) (lit 11:34 ~s30) (wing 11:39 x)))))
68− (value 12:1 wrap-value-text
68+ (value 12:1 wrap-text
69− (group 12:20
69+ (group 12:14
70− (call 12:21 (wing 12:21 wrap-value) (str 12:32 "hello"))))
70+ (call 12:15 (wing 12:15 wrap) (str 12:20 "hello"))))
71− (value 13:1 wrap-value-ship
71+ (value 13:1 wrap-ship
72− (group 13:20
72+ (group 13:14
73− (call 13:21 (wing 13:21 wrap-value) (lit 13:32 ~zod))))
73+ (call 13:15 (wing 13:15 wrap) (lit 13:20 ~zod))))
74 (value 14:1 wrong-reply
74 (value 14:1 wrong-reply
75 (cast 14:16
75 (cast 14:16
76 (apply 14:19 cmd (aura 14:24 @t))
76 (apply 14:19 cmd (aura 14:24 @t))
@@ -95,7 +95,7 @@
95 (tuple 16:52 (lit 16:53 %wait) (lit 16:59 ~s30) (lit 16:64 ~zod)))))
95 (tuple 16:52 (lit 16:53 %wait) (lit 16:59 ~s30) (lit 16:64 ~zod)))))
96 (value 17:1 wrong-poke
96 (value 17:1 wrong-poke
97 (gate 17:15
97 (gate 17:15
98− (face 17:18 p (ref 17:20 raw-poke))
98+ (face 17:18 p (ref 17:20 poke))
99 (body 18:3
99 (body 18:3
100 (cast 18:3
100 (cast 18:3
101 (apply 18:6 cmd (aura 18:11 @t))
101 (apply 18:6 cmd (aura 18:11 @t))
@@ -119,4 +119,4 @@
119 (call 21:11
119 (call 21:11
120 (wing 21:11 use-text)
120 (wing 21:11 use-text)
121 (group 21:20
121 (group 21:20
122− (call 21:21 (wing 21:21 wrap-value) (lit 21:32 ~zod)))))))
122+ (call 21:21 (wing 21:21 wrap) (lit 21:26 ~zod)))))))
tests/golden/types-prelude-cmd/types.txt+8−8
@@ -10,7 +10,7 @@ partial inference; module not checked
10/tests/golden/types-prelude-cmd/source.jibb:5:20: expression
10/tests/golden/types-prelude-cmd/source.jibb:5:20: expression
11++ bad ^- (cmd @t) [%go url=~zod]
11++ bad ^- (cmd @t) [%go url=~zod]
12 ^
12 ^
13−++ send: $-(raw-poke (cmd @t))
13+++ send: $-(poke (cmd @t))
14++ wait: (cmd @t)
14++ wait: (cmd @t)
15++ who: (cmd @t)
15++ who: (cmd @t)
16++ wrong-message: cast mold and expression type do not unify
16++ wrong-message: cast mold and expression type do not unify
@@ -20,9 +20,9 @@ partial inference; module not checked
20/tests/golden/types-prelude-cmd/source.jibb:10:30: expression
20/tests/golden/types-prelude-cmd/source.jibb:10:30: expression
21++ wrong-message ^- (cmd @t) [%wait ~s30 ~zod]
21++ wrong-message ^- (cmd @t) [%wait ~s30 ~zod]
22 ^
22 ^
23−++ wrap-value: $-(A (cmd A))
23+++ wrap: $-(A (cmd A))
24−++ wrap-value-text: (cmd @t)
24+++ wrap-text: (cmd @t)
25−++ wrap-value-ship: (cmd @p)
25+++ wrap-ship: (cmd @p)
26++ wrong-reply: cast mold and expression type do not unify
26++ wrong-reply: cast mold and expression type do not unify
27/tests/golden/types-prelude-cmd/source.jibb:14:19: cast mold
27/tests/golden/types-prelude-cmd/source.jibb:14:19: cast mold
28++ wrong-reply ^- (cmd @t) [%who |=(p=@p ~zod)]
28++ wrong-reply ^- (cmd @t) [%who |=(p=@p ~zod)]
@@ -49,8 +49,8 @@ partial inference; module not checked
49++ use-text: $-((cmd @t) (cmd @t))
49++ use-text: $-((cmd @t) (cmd @t))
50++ cross: call's sample and argument types do not unify
50++ cross: call's sample and argument types do not unify
51/tests/golden/types-prelude-cmd/source.jibb:21:21: called gate
51/tests/golden/types-prelude-cmd/source.jibb:21:21: called gate
52−++ cross (use-text (wrap-value ~zod))
52+++ cross (use-text (wrap ~zod))
53 ^
53 ^
54−/tests/golden/types-prelude-cmd/source.jibb:21:32: argument has type @p
54+/tests/golden/types-prelude-cmd/source.jibb:21:26: argument has type @p
55−++ cross (use-text (wrap-value ~zod))
55+++ cross (use-text (wrap ~zod))
56− ^
56+ ^
tests/golden/types-prelude-list-alias/source.jibb+1−1
@@ -2,6 +2,6 @@
2++ path-id |= x=path x
2++ path-id |= x=path x
3++ tape-id |= x=tape x
3++ tape-id |= x=tape x
4++ spot-id |= x=spot x
4++ spot-id |= x=spot x
5−++ text-value |= x=(bag @t) x
5+++ text |= x=(bag @t) x
6++ ship |= x=(bag @p) x
6++ ship |= x=(bag @p) x
7++ wrong ^- (bag @t) ~[~zod]
7++ wrong ^- (bag @t) ~[~zod]
tests/golden/types-prelude-list-alias/tokens.txt+9−9
@@ -34,15 +34,15 @@
344:22 name x
344:22 name x
355:1 NEWLINE
355:1 NEWLINE
365:1 glyph ++
365:1 glyph ++
37−5:4 name text-value
37+5:4 name text
38−5:15 glyph |=
38+5:9 glyph |=
39−5:18 name x
39+5:12 name x
40−5:19 tight glyph =
40+5:13 tight glyph =
41−5:20 tight glyph (
41+5:14 tight glyph (
42−5:21 tight name bag
42+5:15 tight name bag
43−5:25 aura @t
43+5:19 aura @t
44−5:27 tight glyph )
44+5:21 tight glyph )
45−5:29 name x
45+5:23 name x
466:1 NEWLINE
466:1 NEWLINE
476:1 glyph ++
476:1 glyph ++
486:4 name ship
486:4 name ship
tests/golden/types-prelude-list-alias/tree.txt+5−5
@@ -14,11 +14,11 @@
14 (gate 4:12
14 (gate 4:12
15 (face 4:15 x (ref 4:17 spot))
15 (face 4:15 x (ref 4:17 spot))
16 (wing 4:22 x)))
16 (wing 4:22 x)))
17− (value 5:1 text-value
17+ (value 5:1 text
18− (gate 5:15
18+ (gate 5:9
19− (face 5:18 x
19+ (face 5:12 x
20− (apply 5:20 bag (aura 5:25 @t)))
20+ (apply 5:14 bag (aura 5:19 @t)))
21− (wing 5:29 x)))
21+ (wing 5:23 x)))
22 (value 6:1 ship
22 (value 6:1 ship
23 (gate 6:9
23 (gate 6:9
24 (face 6:12 x
24 (face 6:12 x
tests/golden/types-prelude-list-alias/types.txt+1−1
@@ -3,7 +3,7 @@ partial inference; module not checked
3++ path-id: $-((list @ta) (list @ta))
3++ path-id: $-((list @ta) (list @ta))
4++ tape-id: $-((list @tD) (list @tD))
4++ tape-id: $-((list @tD) (list @tD))
5++ spot-id: $-([p=(list @ta) q=[p=[p=@ q=@] q=[p=@ q=@]]] [p=(list @ta) q=[p=[p=@ q=@] q=[p=@ q=@]]])
5++ spot-id: $-([p=(list @ta) q=[p=[p=@ q=@] q=[p=@ q=@]]] [p=(list @ta) q=[p=[p=@ q=@] q=[p=@ q=@]]])
6−++ text-value: $-((list @t) (list @t))
6+++ text: $-((list @t) (list @t))
7++ ship: $-((list @p) (list @p))
7++ ship: $-((list @p) (list @p))
8++ wrong: list item does not fit its expected type
8++ wrong: list item does not fit its expected type
9/tests/golden/types-prelude-list-alias/source.jibb:7:13: expected item has type @t
9/tests/golden/types-prelude-list-alias/source.jibb:7:13: expected item has type @t
tests/golden/types-prelude-text/about.txtdeleted−4
@@ -1,4 +0,0 @@
1−source: docs/spec/overview.md, Prelude: "Text ... crip, trip, cass, cuss, trim, tufa, tuba"; the target ship's Hoon 135 definitions give trip and tuba their tape and UTF-32 types.
2−tests: Source-backed trip and tuba wrappers preserve cord, tape and UTF-32 list types through composition and generic list length. Empty input infers; non-cord and non-tape arguments fail. Primitive lowering and execution remain unfinished. The module report is partial.
3−expect: parses
4−expect-types: a partial inference report
tests/golden/types-prelude-text/modules.txtdeleted−1
@@ -1 +0,0 @@
1−# no module fixtures
tests/golden/types-prelude-text/source.jibbdeleted−8
@@ -1,8 +0,0 @@
1−++ to-tape (trip "abc")
2−++ to-codepoints (tuba (trip "abc"))
3−++ empty-codepoints (tuba ~)
4−++ count-codepoints |= value=@t
5− (lent (tuba (trip value)))
6−++ bad-trip (trip ~zod)
7−++ bad-tuba (tuba "abc")
8−++ bad-tuba-items (tuba ~[~zod])
tests/golden/types-prelude-text/tokens.txtdeleted−66
@@ -1,66 +0,0 @@
1−1:1 glyph ++
2−1:4 name to-tape
3−1:12 glyph (
4−1:13 tight name trip
5−1:18 str "abc"
6−1:23 tight glyph )
7−2:1 NEWLINE
8−2:1 glyph ++
9−2:4 name to-codepoints
10−2:18 glyph (
11−2:19 tight name tuba
12−2:24 glyph (
13−2:25 tight name trip
14−2:30 str "abc"
15−2:35 tight glyph )
16−2:36 tight glyph )
17−3:1 NEWLINE
18−3:1 glyph ++
19−3:4 name empty-codepoints
20−3:21 glyph (
21−3:22 tight name tuba
22−3:27 lit ~
23−3:28 tight glyph )
24−4:1 NEWLINE
25−4:1 glyph ++
26−4:4 name count-codepoints
27−4:21 glyph |=
28−4:24 name value
29−4:29 tight glyph =
30−4:30 tight aura @t
31−5:3 INDENT
32−5:3 glyph (
33−5:4 tight name lent
34−5:9 glyph (
35−5:10 tight name tuba
36−5:15 glyph (
37−5:16 tight name trip
38−5:21 name value
39−5:26 tight glyph )
40−5:27 tight glyph )
41−5:28 tight glyph )
42−6:1 DEDENT
43−6:1 NEWLINE
44−6:1 glyph ++
45−6:4 name bad-trip
46−6:13 glyph (
47−6:14 tight name trip
48−6:19 lit ~zod
49−6:23 tight glyph )
50−7:1 NEWLINE
51−7:1 glyph ++
52−7:4 name bad-tuba
53−7:13 glyph (
54−7:14 tight name tuba
55−7:19 str "abc"
56−7:24 tight glyph )
57−8:1 NEWLINE
58−8:1 glyph ++
59−8:4 name bad-tuba-items
60−8:19 glyph (
61−8:20 tight name tuba
62−8:25 glyph ~[
63−8:27 tight lit ~zod
64−8:31 tight glyph ]
65−8:32 tight glyph )
66−8:33 NEWLINE
tests/golden/types-prelude-text/tree.txtdeleted−36
@@ -1,36 +0,0 @@
1−(module
2− (value 1:1 to-tape
3− (group 1:12
4− (call 1:13 (wing 1:13 trip) (str 1:18 "abc"))))
5− (value 2:1 to-codepoints
6− (group 2:18
7− (call 2:19
8− (wing 2:19 tuba)
9− (group 2:24
10− (call 2:25 (wing 2:25 trip) (str 2:30 "abc"))))))
11− (value 3:1 empty-codepoints
12− (group 3:21
13− (call 3:22 (wing 3:22 tuba) (lit 3:27 ~))))
14− (value 4:1 count-codepoints
15− (gate 4:21
16− (face 4:24 value (aura 4:30 @t))
17− (body 5:3
18− (group 5:3
19− (call 5:4
20− (wing 5:4 lent)
21− (group 5:9
22− (call 5:10
23− (wing 5:10 tuba)
24− (group 5:15
25− (call 5:16 (wing 5:16 trip) (wing 5:21 value))))))))))
26− (value 6:1 bad-trip
27− (group 6:13
28− (call 6:14 (wing 6:14 trip) (lit 6:19 ~zod))))
29− (value 7:1 bad-tuba
30− (group 7:13
31− (call 7:14 (wing 7:14 tuba) (str 7:19 "abc"))))
32− (value 8:1 bad-tuba-items
33− (group 8:19
34− (call 8:20
35− (wing 8:20 tuba)
36− (list 8:25 (lit 8:27 ~zod))))))
tests/golden/types-prelude-text/types.txtdeleted−26
@@ -1,26 +0,0 @@
1−partial inference; module not checked
2−++ to-tape: (list @tD)
3−++ to-codepoints: (list @c)
4−++ empty-codepoints: (list @c)
5−++ count-codepoints: $-(@t @ud)
6−++ bad-trip: call's sample and argument types do not unify
7−/tests/golden/types-prelude-text/source.jibb:6:14: called gate has type $-(@t (list @tD))
8−++ bad-trip (trip ~zod)
9− ^
10−/tests/golden/types-prelude-text/source.jibb:6:19: argument has type @p
11−++ bad-trip (trip ~zod)
12− ^
13−++ bad-tuba: call's sample and argument types do not unify
14−/tests/golden/types-prelude-text/source.jibb:7:14: called gate has type $-((list @tD) (list @c))
15−++ bad-tuba (tuba "abc")
16− ^
17−/tests/golden/types-prelude-text/source.jibb:7:19: argument has type @t
18−++ bad-tuba (tuba "abc")
19− ^
20−++ bad-tuba-items: list item does not fit its expected type
21−/tests/golden/types-prelude-text/source.jibb:8:20: expected item has type @tD
22−++ bad-tuba-items (tuba ~[~zod])
23− ^
24−/tests/golden/types-prelude-text/source.jibb:8:27: list item has type @p
25−++ bad-tuba-items (tuba ~[~zod])
26− ^
tests/golden/types-prelude-ui/about.txtdeleted−4
@@ -1,4 +0,0 @@
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.txtdeleted−1
@@ -1 +0,0 @@
1−# no module fixtures
tests/golden/types-prelude-ui/source.jibbdeleted−78
@@ -1,78 +0,0 @@
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.txtdeleted−728
@@ -1,728 +0,0 @@
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.txtdeleted−300

This diff is too big to show here.

tests/golden/types-prelude-ui/types.txtdeleted−85

This diff is too big to show here.

tests/golden/types-prelude-unit-helpers/about.txt+1−1

This diff is too big to show here.

tests/golden/types-prelude-unit-helpers/source.jibb−16

This diff is too big to show here.

tests/golden/types-prelude-unit-helpers/tokens.txt+1−219

This diff is too big to show here.

tests/golden/types-prelude-unit-helpers/tree.txt+1−117

This diff is too big to show here.

tests/golden/types-prelude-unit-helpers/types.txt−52

This diff is too big to show here.

tests/golden/types-record-cast-context/types.txt+1−1

This diff is too big to show here.

tests/golden/types-recursion-scc-import-bad/types.txt+1−1

This diff is too big to show here.

tests/golden/types-recursion-scc-import/source.jibb+1−1

This diff is too big to show here.

tests/golden/types-recursion-scc-import/tokens.txt+7−7

This diff is too big to show here.

tests/golden/types-recursion-scc-import/tree.txt+5−5

This diff is too big to show here.

tests/golden/types-recursion-scc-import/types.txt+1−1

This diff is too big to show here.

tests/golden/types-scope-library-poke/types.txt+1−2

This diff is too big to show here.

tests/golden/types-scope-root-api/types.txt+1−1

This diff is too big to show here.

tests/golden/types-union-finite-context/source.jibb+1−1

This diff is too big to show here.

tests/golden/types-union-finite-context/tokens.txt+3−3

This diff is too big to show here.

tests/golden/types-union-finite-context/tree.txt+2−2

This diff is too big to show here.

tests/golden/types-union-nonwing-subject/source.jibb+13−13

This diff is too big to show here.

tests/golden/types-union-nonwing-subject/tokens.txt+54−54

This diff is too big to show here.

tests/golden/types-union-nonwing-subject/tree.txt+26−26

This diff is too big to show here.

tests/golden/types-union-nonwing-subject/types.txt+3−3

This diff is too big to show here.

tests/golden/types-union-polymorphic-identity/types.txt+1−1

This diff is too big to show here.

tests/golden/types-unit-context/source.jibb+3−3

This diff is too big to show here.

tests/golden/types-unit-context/tokens.txt+33−33

This diff is too big to show here.

tests/golden/types-unit-context/tree.txt+21−21

This diff is too big to show here.

tests/golden/types-unit-context/types.txt+15−15

This diff is too big to show here.

tests/lib/jibb-api-paths.hoon+2−39

This diff is too big to show here.

tests/lib/jibb-bridge.hoon+2−5

This diff is too big to show here.

tests/lib/jibb-buttons.hoondeleted−81

This diff is too big to show here.

tests/lib/jibb-deferred-prepared.hoondeleted−114

This diff is too big to show here.

tests/lib/jibb-deferred.hoon+1−1

This diff is too big to show here.

tests/lib/jibb-direct-gate-source.hoon+3−3

This diff is too big to show here.

tests/lib/jibb-doc-examples.hoondeleted−166

This diff is too big to show here.

tests/lib/jibb-full-overlap-basic.hoondeleted−190

This diff is too big to show here.

tests/lib/jibb-full-overlap-graph.hoondeleted−126

This diff is too big to show here.

tests/lib/jibb-gate-free-guards.hoon−64

This diff is too big to show here.

tests/lib/jibb-generic-construction.hoon+2−2

This diff is too big to show here.

tests/lib/jibb-generic-pattern.hoon+2−2

This diff is too big to show here.

tests/lib/jibb-generic-recursion.hoon+4−4

This diff is too big to show here.

tests/lib/jibb-hole-guards.hoon+3−3

This diff is too big to show here.

tests/lib/jibb-list-alias-guards.hoon+1−1

This diff is too big to show here.

tests/lib/jibb-page-main.hoondeleted−168

This diff is too big to show here.

tests/lib/jibb-poke-bridge.hoon+2−2

This diff is too big to show here.

tests/lib/jibb-program-init.hoondeleted−140

This diff is too big to show here.

tests/lib/jibb-program-main.hoondeleted−141

This diff is too big to show here.

tests/lib/jibb-program-update.hoondeleted−140

This diff is too big to show here.

tests/lib/jibb-program-watch.hoondeleted−209

This diff is too big to show here.

tests/lib/jibb-proj-guards.hoon+2−2

This diff is too big to show here.

tests/lib/jibb-request-guards.hoon+2−2

This diff is too big to show here.

tests/lib/jibb-store.hoondeleted−285

This diff is too big to show here.

tests/lib/jibb-theme.hoondeleted−86

This diff is too big to show here.

tests/lib/jibb-todo-api.hoon+1−1

This diff is too big to show here.

tests/lib/jibb-todo-full.hoondeleted−166

This diff is too big to show here.

tests/lib/jibb-union-source.hoon+2−2

This diff is too big to show here.

tests/lib/jibb.hoon+2341−2561

This diff is too big to show here.

tests/type-api-paths/about.txt+1−1

This diff is too big to show here.

tests/type-api-paths/expected.txt+2−17

This diff is too big to show here.

tests/type-api-paths/poke-clash.txt−2

This diff is too big to show here.

tests/type-buttons/error.txtdeleted−3

This diff is too big to show here.

tests/type-buttons/expected.txtdeleted−2

This diff is too big to show here.

tests/type-buttons/valid.txtdeleted−4

This diff is too big to show here.

tests/type-deferred-prepared/expected-control.txtdeleted−7

This diff is too big to show here.

tests/type-deferred-prepared/expected-tuple-only.txtdeleted−4

This diff is too big to show here.

tests/type-deferred-prepared/expected.txtdeleted−8

This diff is too big to show here.

tests/type-deferred-prepared/good.txtdeleted−9

This diff is too big to show here.

tests/type-deferred-prepared/imported.txtdeleted−11

This diff is too big to show here.

tests/type-deferred-prepared/main.txtdeleted−10

This diff is too big to show here.

tests/type-deferred-prepared/mold-collision.txtdeleted−9

This diff is too big to show here.

tests/type-deferred-prepared/no-final-cast.txtdeleted−8

This diff is too big to show here.

tests/type-deferred-prepared/no-prelude.txtdeleted−9

This diff is too big to show here.

tests/type-deferred-prepared/tuple-only.txtdeleted−3

This diff is too big to show here.

tests/type-deferred-prepared/unrelated-tag.txtdeleted−11

This diff is too big to show here.

tests/type-deferred-prepared/wrong-draft.txtdeleted−9

This diff is too big to show here.

tests/type-deferred-prepared/wrong-unit.txtdeleted−9

This diff is too big to show here.

tests/type-direct-gate/expected.txt+11−11

This diff is too big to show here.

tests/type-direct-gate/source.txt+3−3

This diff is too big to show here.

tests/type-full-overlap/about.txtdeleted−3

This diff is too big to show here.

tests/type-full-overlap/atoms.txtdeleted−4

This diff is too big to show here.

tests/type-full-overlap/child.txtdeleted−4

This diff is too big to show here.

tests/type-full-overlap/distinct.txtdeleted−5

This diff is too big to show here.

tests/type-full-overlap/duplicate-generic.txtdeleted−4

This diff is too big to show here.

tests/type-full-overlap/duplicate.txtdeleted−5

This diff is too big to show here.

tests/type-full-overlap/expected-basic.txtdeleted−23

This diff is too big to show here.

tests/type-full-overlap/expected-graph.txtdeleted−8

This diff is too big to show here.

tests/type-full-overlap/flag.txtdeleted−4

This diff is too big to show here.

tests/type-full-overlap/generic.txtdeleted−4

This diff is too big to show here.

tests/type-full-overlap/invalid.txtdeleted−4

This diff is too big to show here.

tests/type-full-overlap/nested.txtdeleted−4

This diff is too big to show here.

tests/type-full-overlap/order.txtdeleted−7

This diff is too big to show here.

tests/type-full-overlap/parent.txtdeleted−5

This diff is too big to show here.

tests/type-full-overlap/precedence.txtdeleted−5

This diff is too big to show here.

tests/type-full-overlap/same.txtdeleted−4

This diff is too big to show here.

tests/type-full-overlap/unsupported.txtdeleted−4

This diff is too big to show here.

tests/type-full-overlap/zero.txtdeleted−4

This diff is too big to show here.

tests/type-gate-free/todo-gate.txt+2−2

This diff is too big to show here.

tests/type-gate-free/todo-noun.txt+2−2

This diff is too big to show here.

tests/type-gate-free/todo.txt+2−2

This diff is too big to show here.

tests/type-generic-construction/alias-client.txt+4−4

This diff is too big to show here.

tests/type-generic-construction/alias.txt+1−1

This diff is too big to show here.

tests/type-generic-construction/client.txt+20−20

This diff is too big to show here.

tests/type-generic-construction/expected.txt+13−13

This diff is too big to show here.

tests/type-generic-construction/no-event-client.txt+6−6

This diff is too big to show here.

tests/type-generic-construction/owner-negative.txt+8−8

This diff is too big to show here.

tests/type-generic-construction/owner-positive.txt+7−7

This diff is too big to show here.

tests/type-generic-construction/tree-no-event.txt+3−3

This diff is too big to show here.

tests/type-generic-construction/tree.txt+5−5

This diff is too big to show here.

tests/type-generic-pattern/client.txt+48−48

This diff is too big to show here.

tests/type-generic-pattern/expected.txt+24−24

This diff is too big to show here.

tests/type-generic-pattern/no-event.txt+5−5

This diff is too big to show here.

tests/type-generic-pattern/owner-bad.txt+11−11

This diff is too big to show here.

tests/type-generic-pattern/owner.txt+10−10

This diff is too big to show here.

tests/type-generic-recursion/about.txt+1−1

This diff is too big to show here.

tests/type-generic-recursion/alias.txt+1−1

This diff is too big to show here.

tests/type-generic-recursion/bad-constructor.txt+6−6

This diff is too big to show here.

tests/type-generic-recursion/bad-match.txt+6−6

This diff is too big to show here.

tests/type-generic-recursion/bad-mold.txt+5−5

This diff is too big to show here.

tests/type-generic-recursion/bad-parameter.txt+5−5

This diff is too big to show here.

tests/type-generic-recursion/client.txt+6−6

This diff is too big to show here.

tests/type-generic-recursion/expected.txt+5−5

This diff is too big to show here.

tests/type-generic-recursion/list-shadow.txt+2−2

This diff is too big to show here.

tests/type-generic-recursion/local-distinct.txt+7−7

This diff is too big to show here.

tests/type-generic-recursion/local-only.txt+5−5

This diff is too big to show here.

tests/type-generic-recursion/local-shadow.txt+7−7

This diff is too big to show here.

tests/type-generic-recursion/tree-changed.txt+5−5

This diff is too big to show here.

tests/type-generic-recursion/tree.txt+5−5

This diff is too big to show here.

tests/type-import/about.txt+2−4

This diff is too big to show here.

tests/type-import/expected.txt+5−15

This diff is too big to show here.

tests/type-import/source.txt−1

This diff is too big to show here.

tests/type-list-alias/expected.txt+4−4

This diff is too big to show here.

tests/type-page-main/about.txtdeleted−3

This diff is too big to show here.

tests/type-page-main/arbitrary-main.txtdeleted−1

This diff is too big to show here.

tests/type-page-main/blog-api.txtdeleted−5

This diff is too big to show here.

tests/type-page-main/blog-index.txtdeleted−9

This diff is too big to show here.

tests/type-page-main/blog-sur.txtdeleted−6

This diff is too big to show here.

tests/type-page-main/card.txtdeleted−5

This diff is too big to show here.

tests/type-page-main/ctor-page.txtdeleted−10

This diff is too big to show here.

tests/type-page-main/diff-load.txtdeleted−11

This diff is too big to show here.

tests/type-page-main/hand-built-load.txtdeleted−14

This diff is too big to show here.

tests/type-page-main/index.txtdeleted−10

This diff is too big to show here.

tests/type-page-main/indirect-load.txtdeleted−11

This diff is too big to show here.

tests/type-page-main/page-alias.txtdeleted−11

This diff is too big to show here.

tests/type-page-main/posts-mark.txtdeleted−6

This diff is too big to show here.

tests/type-page-main/pure-load.txtdeleted−10

This diff is too big to show here.

tests/type-page-main/static.txtdeleted−7

This diff is too big to show here.

tests/type-page-main/todo-api.txtdeleted−13

This diff is too big to show here.

tests/type-page-main/todo-island.txtdeleted−40

This diff is too big to show here.

tests/type-page-main/typed-load.txtdeleted−8

This diff is too big to show here.

tests/type-page-main/wrong-static.txtdeleted−1

This diff is too big to show here.

tests/type-poke/about.txt+4−7

This diff is too big to show here.

tests/type-poke/alias.txt+1−1

This diff is too big to show here.

tests/type-poke/client.txt+13−13

This diff is too big to show here.

tests/type-poke/direct.txt+1−1

This diff is too big to show here.

tests/type-poke/expected.txt+26−32

This diff is too big to show here.

tests/type-poke/exported.txt+4−4

This diff is too big to show here.

tests/type-poke/inner.txt+1−1

This diff is too big to show here.

tests/type-poke/public.txt+1−1

This diff is too big to show here.

tests/type-poke/transitive.txt+1−1

This diff is too big to show here.

tests/type-program-main/about.txtdeleted−1

This diff is too big to show here.

tests/type-program-main/alias-main.txtdeleted−11

This diff is too big to show here.

tests/type-program-main/arbitrary-main.txtdeleted−10

This diff is too big to show here.

tests/type-program-main/consumer.txtdeleted−2

This diff is too big to show here.

tests/type-program-main/gate-data.txtdeleted−10

This diff is too big to show here.

tests/type-program-main/gate-model.txtdeleted−11

This diff is too big to show here.

tests/type-program-main/initializer-consumer.txtdeleted−2

This diff is too big to show here.

tests/type-program-main/initializer-earlier.txtdeleted−10

This diff is too big to show here.

tests/type-program-main/initializer-error.txtdeleted−10

This diff is too big to show here.

tests/type-program-main/initializer-generic.txtdeleted−10

This diff is too big to show here.

tests/type-program-main/initializer-message.txtdeleted−13

This diff is too big to show here.

tests/type-program-main/initializer-missing.txtdeleted−9

This diff is too big to show here.

tests/type-program-main/initializer-model.txtdeleted−11

This diff is too big to show here.

tests/type-program-main/initializer-no-main.txtdeleted−10

This diff is too big to show here.

tests/type-program-main/initializer-subs.txtdeleted−10

This diff is too big to show here.

tests/type-program-main/initializer-tag.txtdeleted−13

This diff is too big to show here.

tests/type-program-main/initializer-unfaced.txtdeleted−10

This diff is too big to show here.

tests/type-program-main/initializer.txtdeleted−12

This diff is too big to show here.

tests/type-program-main/mismatched-model.txtdeleted−10

This diff is too big to show here.

tests/type-program-main/nonempty-subs.txtdeleted−12

This diff is too big to show here.

tests/type-program-main/open-message.txtdeleted−7

This diff is too big to show here.

tests/type-program-main/source.txtdeleted−12

This diff is too big to show here.

tests/type-program-update/consumer.txtdeleted−2

This diff is too big to show here.

tests/type-program-update/malformed-sample.txtdeleted−9

This diff is too big to show here.

tests/type-program-update/missing-list.txtdeleted−15

This diff is too big to show here.

tests/type-program-update/non-main.txtdeleted−14

This diff is too big to show here.

tests/type-program-update/source.txtdeleted−15

This diff is too big to show here.

tests/type-program-update/three-slot-sample.txtdeleted−9

This diff is too big to show here.

tests/type-program-update/unrelated-tag.txtdeleted−16

This diff is too big to show here.

tests/type-program-update/wrong-message.txtdeleted−10

This diff is too big to show here.

tests/type-program-update/wrong-model.txtdeleted−12

This diff is too big to show here.

tests/type-program-update/wrong-result.txtdeleted−12

This diff is too big to show here.

tests/type-program-watch/about.txtdeleted−1

This diff is too big to show here.

tests/type-store/basket.txtdeleted−32

This diff is too big to show here.

tests/type-store/cart.txtdeleted−12

This diff is too big to show here.

tests/type-theme/dark-absent.txtdeleted−8

This diff is too big to show here.

tests/type-theme/missing-field.txtdeleted−7

This diff is too big to show here.

tests/type-theme/source.txtdeleted−8

This diff is too big to show here.

tests/type-theme/wrong-dark.txtdeleted−8

This diff is too big to show here.

tests/type-theme/wrong-font.txtdeleted−8

This diff is too big to show here.

tests/type-theme/wrong-nested-aura.txtdeleted−8

This diff is too big to show here.

tests/type-todo-api/expected.txt+1−1

This diff is too big to show here.

tests/type-todo-api/negative-expected.txt+4−4

This diff is too big to show here.

tests/type-todo-api/negative.txt+1−1

This diff is too big to show here.

tests/type-todo-api/source.txt+1−1

This diff is too big to show here.

tests/type-todo-full/about.txtdeleted−3

This diff is too big to show here.

tests/type-todo-full/alias.txtdeleted−42

This diff is too big to show here.

tests/type-todo-full/ambiguous-mapper.txtdeleted−41

This diff is too big to show here.

tests/type-todo-full/cast-init.txtdeleted−43

This diff is too big to show here.

tests/type-todo-full/expected.txtdeleted−2

This diff is too big to show here.

tests/type-todo-full/non-gate-view.txtdeleted−33

This diff is too big to show here.

tests/type-todo-full/open-key.txtdeleted−40

This diff is too big to show here.

tests/type-todo-full/wrong-message.txtdeleted−40

This diff is too big to show here.

tests/type-todo-full/wrong-model.txtdeleted−40

This diff is too big to show here.

tests/type-todo-full/wrong-result.txtdeleted−40

This diff is too big to show here.

tests/type-todo-full/wrong-watch.txtdeleted−40

This diff is too big to show here.

tests/type-todo-partial/expected.txt+2−2

This diff is too big to show here.

tests/type-union-source/mixed-source.txt+2−2

This diff is too big to show here.

tools/checkdeleted−385

This diff is too big to show here.

tools/golden+15−39

This diff is too big to show here.

tools/hoon+2−8

This diff is too big to show here.

tools/ship+6−40

This diff is too big to show here.

tools/testdata/clay-fixtures-selftest+1−3

This diff is too big to show here.

tools/testdata/selftest+1−7

This diff is too big to show here.

tools/testdata/ship-golden/empty/about.txt+1−1

This diff is too big to show here.

tools/testdata/ship-golden/empty/blank.txtdeleted

No changes to the content.

tools/testdata/ship-selftest−68

This diff is too big to show here.

tools/type-buttons-testdeleted−40

This diff is too big to show here.

tools/type-deferred-prepared-testdeleted−49

This diff is too big to show here.

tools/type-doc-examples-testdeleted−49

This diff is too big to show here.

tools/type-full-overlap-testdeleted−49

This diff is too big to show here.

tools/type-page-main-testdeleted−86

This diff is too big to show here.

tools/type-program-init-testdeleted−49

This diff is too big to show here.

tools/type-program-main-testdeleted−46

This diff is too big to show here.

tools/type-program-update-testdeleted−46

This diff is too big to show here.

tools/type-program-watch-testdeleted−48

This diff is too big to show here.

tools/type-store-testdeleted−41

This diff is too big to show here.

tools/type-theme-testdeleted−44

This diff is too big to show here.

tools/type-todo-full-testdeleted−105

This diff is too big to show here.

tools/urbit_eval.py+3−7

This diff is too big to show here.

vendor/LICENSE-urbit.txtdeleted−21

This diff is too big to show here.

vendor/SOURCES.txt+1−3

This diff is too big to show here.