on master help sign in
Start type inference and Hoon imports
1dd92a6iko
README.md+5−5
@@ -2,11 +2,11 @@
2
2
3Jibb 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.
3Jibb 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
5−Milestone 1 of the doc's eight, the parser and the `%jibb` mark, is done; milestone 2, types and prelude, is next. [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.
5+Milestone 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
7## Layout
7## Layout
8
8
9−- `jibb-dev/`: what app desks vendor: the `%jibb` mark (`mar/jibb.hoon`) and the compiler (`lib/jibb.hoon`, one Hoon core without Ford runes); later the prelude and browser library.
9+- `jibb-dev/`: what app desks vendor: the `%jibb` mark, the compiler, the partial Hoon type reader and the beginning of the prelude; later the browser library.
10- `jibb/`: the `%jibb` desk, for the shared host (milestone 4).
10- `jibb/`: the `%jibb` desk, for the shared host (milestone 4).
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.
@@ -16,7 +16,7 @@ Milestone 1 of the doc's eight, the parser and the `%jibb` mark, is done; milest
16
16
17## Golden tests
17## Golden tests
18
18
19−Each 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.
19+Each 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.
20
20
21Run them without a ship. This needs `urbit` on PATH and Python 3.
21Run them without a ship. This needs `urbit` on PATH and Python 3.
22
22
@@ -42,7 +42,7 @@ tools/hoon '(golden /a/b/jibb (crip "++ main view"))'
42tools/hoon --raw --cord src=tests/golden/foo/source.jibb 'tree:(golden /a/b/jibb src)'
42tools/hoon --raw --cord src=tests/golden/foo/source.jibb 'tree:(golden /a/b/jibb src)'
43```
43```
44
44
45−`tools/testdata/selftest` tests both tools against a stub library, and `tools/doc-blocks` against Markdown it writes.
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.
46
46
47### The doc's examples
47### The doc's examples
48
48
@@ -74,7 +74,7 @@ tools/ship stop
74| `jibb` | `vendor/*`, then `jibb` |
74| `jibb` | `vendor/*`, then `jibb` |
75| `jibb-dev` | `vendor/*`, then `jibb-dev`, then `tests/`, with `tests/lib/jibb.hoon` generated, and `jibb/sys.kelvin` |
75| `jibb-dev` | `vendor/*`, then `jibb-dev`, then `tests/`, with `tests/lib/jibb.hoon` generated, and `jibb/sys.kelvin` |
76
76
77−The `jibb-dev` desk runs the golden cases on the ship, as `-test` arms. `tools/ship gen-tests` writes `tests/lib/jibb.hoon` from `tests/golden`: for each case it imports `source.jibb`, `tokens.txt` and `tree.txt` with `/*`, and its `test-` arm compares `golden:jibb` with them. Don't edit that file; `--check` says whether it's up to date. `tools/ship test` regenerates it, syncs the desk and runs `-test /=jibb-dev=/tests`, printing each case's OK, FAILED or CRASHED and the reason. It exits 0 only when every case passes.
77+The `jibb-dev` desk runs the golden cases on the ship, as `-test` arms. `tools/ship gen-tests` writes `tests/lib/jibb.hoon` from `tests/golden`: for each case it imports `source.jibb`, `tokens.txt` and `tree.txt` with `/*`, and its `test-` arm compares `golden:jibb` with them. Cases opted into `types.txt` also compare the partial inference output. Don't edit that file; `--check` says whether it's up to date. `tools/ship test` regenerates it, syncs the desk and runs `-test /=jibb-dev=/tests`, printing each case's OK, FAILED or CRASHED and the reason. It exits 0 only when every case passes.
78
78
79```
79```
80tools/ship test # the library and tests/golden
80tools/ship test # the library and tests/golden
docs/README.md+4−3
@@ -1,6 +1,6 @@
1# Docs
1# Docs
2
2
3−Jibb'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 the 2026-10-30 decision to drop `$?`; the Claude document still needs that change. This folder also holds where the build stands, what is still open, and how to work on the code.
3+Jibb'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 `$?` 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| File | What it holds |
5| File | What it holds |
6| --- | --- |
6| --- | --- |
@@ -9,12 +9,13 @@ Jibb's spec is a design doc by @iko, [Jibb — an Elm-architecture UI language f
9| [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 |
10| [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 |
11| [compiler.md](compiler.md) | A map of `jibb-dev/lib/jibb.hoon`: its API, data, errors and printed formats |
11| [compiler.md](compiler.md) | A map of `jibb-dev/lib/jibb.hoon`: its API, data, errors and printed formats |
12+| [prelude-inventory.md](prelude-inventory.md) | Working source audit for the prelude's exported inventory |
12| [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 |
13| [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 |
14
15
15## The spec
16## The spec
16
17
17−`spec/` began as a snapshot of the doc taken on 2026-10-30, after @iko's answers to the 12 grammar questions that day. It has since been edited to record the decision to drop `$?`; the Claude document still needs those edits. It also has the doc's rules of the same day for gates generic over auras. Each file corresponds to one tab:
18+`spec/` began as a snapshot of the doc taken on 2026-10-30, after @iko's answers to the 12 grammar questions that day. It has since been edited to record decisions including dropping `$?`, local type-variable scope, cells and changes, record faces, and the noun type `*`; the Claude document still needs those edits. It also has the doc's rules of the same day for gates generic over auras. Each file corresponds to one tab:
18
19
19| File | Tab |
20| File | Tab |
20| --- | --- |
21| --- | --- |
@@ -28,7 +29,7 @@ The doc has a sixth tab, "Loom on Urbit", which is empty, so it has no file.
28
29
29The 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.
30
31
31−The two copies can diverge. Sync the decision 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:
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:
32
33
33```
34```
34git diff docs/spec # what changed in the doc
35git diff docs/spec # what changed in the doc
docs/compiler.md+7−1
@@ -31,6 +31,7 @@ From the header of the file:
31| `+parse` | `[file=path src=@t]` | `(each module error)` |
31| `+parse` | `[file=path src=@t]` | `(each module error)` |
32| `+parse-tokens` | `[file=path toks=(list token)]` | `(each module error)` |
32| `+parse-tokens` | `[file=path toks=(list token)]` | `(each module error)` |
33| `+golden` | `[file=path src=@t]` | `[tokens=@t tree=@t]`: both stages printed, or the rendered error |
33| `+golden` | `[file=path src=@t]` | `[tokens=@t tree=@t]`: both stages printed, or the rendered error |
34+| `+golden-types` | `[file=path src=@t]` | A partial inference report; explicitly says the module has not been checked |
34| `+show-tokens` | `(list token)` | `@t` |
35| `+show-tokens` | `(list token)` | `@t` |
35| `+show-module` | `module` | `@t` |
36| `+show-module` | `module` | `@t` |
36| `+show-error` | `[src=@t error]` | `@t` |
37| `+show-error` | `[src=@t error]` | `@t` |
@@ -52,6 +53,11 @@ The core is split into chapters, `+| %name`, in this order:
52| `%parser-helpers` | Error building (`+fail`, `+fail-in`, `+fail-space`, `+fail-line`, `+moved`, …) and the `+then` combinator |
53| `%parser-helpers` | Error building (`+fail`, `+fail-in`, `+fail-space`, `+fail-line`, `+moved`, …) and the `+then` combinator |
53| `%parser` | The parser's door, `+parser`: one arm per EBNF rule, as `+read-module`, `+read-expr`, `+read-mold` |
54| `%parser` | The parser's door, `+parser`: one arm per EBNF rule, as `+read-module`, `+read-expr`, `+read-mold` |
54| `%span-check` | `+check-spans`, which `+golden` runs on every tree, and `+check-spans-test` |
55| `%span-check` | `+check-spans`, which `+golden` runs on every tree, and `+check-spans-test` |
56+| `%type-inference` | The initial inference fragment and its unification helpers; not yet a module type checker |
57+
58+The inference fragment supports fixed auras, generic variables and gates, unfaced cells, a two-binder cell pattern, and a complete two-arm loobean branch. It instantiates generalized top-level definitions when they are used. It does not yet check a module, its imports, faces, general patterns, deferred constraints, dependency cycles or errors with both conflicting excerpts. Unsupported forms are reported as such, and the partial output says the module has not been checked.
59+
60+The separate `jibb-dev/lib/jibb-import.hoon` is an unfinished reader for selected Hoon type graphs. It handles several collections and named recursion, but source-aware aliases and disjointness, marks and integration with the checker remain unfinished. Its fixtures include a real Tlon type; `tools/importer-test` compares the internal projection under eval, and the ship test compares the same golden output.
55
61
56And the design notes:
62And the design notes:
57
63
@@ -91,7 +97,7 @@ Note 4 has examples of each.
91
97
92## Tests
98## Tests
93
99
94−`+golden` is the only arm the golden tests call: `tools/golden` runs it under `urbit eval` on every case and compares `tokens.txt` and `tree.txt`; `tools/ship gen-tests` writes a `-test` arm per case that does the same on the ship. Adding a stage, such as the checker's output, means adding a field to `+golden`'s product and teaching both runners, the stub libraries in `tools/testdata` and their self-tests about it.
100+`tools/golden` runs `+golden` under `urbit eval` on every case and compares `tokens.txt` and `tree.txt`; opted-in cases also compare `+golden-types` with `types.txt`. `tools/ship gen-tests` writes a `-test` arm per case that does the same on the ship. The type output is provisional until the checker can check complete modules and imports.
95
101
96## Speed
102## Speed
97
103
docs/development.md+6−2
@@ -59,6 +59,7 @@ git clone https://github.com/urbit/tools /root/src/tools
59| Tool | What it does |
59| Tool | What it does |
60| --- | --- |
60| --- | --- |
61| `tools/golden` | Runs the golden cases under `urbit eval`: every case, or those matching `--case`; `--update` rewrites the expected outputs; `--show` prints them |
61| `tools/golden` | Runs the golden cases under `urbit eval`: every case, or those matching `--case`; `--update` rewrites the expected outputs; `--show` prints them |
62+| `tools/importer-test` | Compares the partial Hoon importer's diagnostic trees and errors with `tests/importer/tree.txt` under `urbit eval` |
62| `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 |
63| `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 |
63| `tools/doc-blocks` | Checks the doc's `jibb` blocks against the `doc-*` golden cases: `tools/doc-blocks docs/spec` |
64| `tools/doc-blocks` | Checks the doc's `jibb` blocks against the `doc-*` golden cases: `tools/doc-blocks docs/spec` |
64| `tools/ship` | Runs the fake ship: `start`, `stop`, `status`, `log`, `sync <desk>`, `test`, `gen-tests`, `check-commit`, `scry`, `hoon`, `run`, `poke`, `commit`, `mount`, `unmount` |
65| `tools/ship` | Runs the fake ship: `start`, `stop`, `status`, `log`, `sync <desk>`, `test`, `gen-tests`, `check-commit`, `scry`, `hoon`, `run`, `poke`, `commit`, `mount`, `unmount` |
@@ -71,8 +72,9 @@ git clone https://github.com/urbit/tools /root/src/tools
71
72
72```
73```
73tools/golden # all cases pass
74tools/golden # all cases pass
75+tools/importer-test # Hoon importer fixture projections match
74tools/hoon check-spans-test # prints <<>>
76tools/hoon check-spans-test # prints <<>>
75−tools/testdata/selftest # 18 checks, 0 failed
77+tools/testdata/selftest # 19 checks, 0 failed
76tools/doc-blocks docs/spec # every jibb block has its case
78tools/doc-blocks docs/spec # every jibb block has its case
77tools/ship gen-tests --check # tests/lib/jibb.hoon is up to date
79tools/ship gen-tests --check # tests/lib/jibb.hoon is up to date
78tools/ship test # the cases pass as -test arms on the ship
80tools/ship test # the cases pass as -test arms on the ship
@@ -80,7 +82,7 @@ tools/testdata/ship-selftest # when tools/ship changed
80tools/ship check-commit # when the mark or the desks changed
82tools/ship check-commit # when the mark or the desks changed
81```
83```
82
84
83−`tools/ship test` regenerates `tests/lib/jibb.hoon` and syncs the `jibb-dev` desk before it runs, so commit the regenerated file.
85+`tools/ship test` regenerates `tests/lib/jibb.hoon` and syncs the `jibb-dev` desk before it runs, so commit the regenerated file. 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.
84
86
85## Golden cases
87## Golden cases
86
88
@@ -89,6 +91,8 @@ A case is a folder `tests/golden/<name>/` holding:
89- `source.jibb`, the input, ending in one newline;
91- `source.jibb`, the input, ending in one newline;
90- `about.txt`: a `source:` line with the doc's words or block it comes from, a `tests:` line saying what it exercises, and an `expect:` line, either `parses` or `error at <line>:<col>` and why (one case, `inline-leftout-signed-float-auras`, says `unclear`: see grammar question 13 in [open-questions.md](open-questions.md));
92- `about.txt`: a `source:` line with the doc's words or block it comes from, a `tests:` line saying what it exercises, and an `expect:` line, either `parses` or `error at <line>:<col>` and why (one case, `inline-leftout-signed-float-auras`, says `unclear`: see grammar question 13 in [open-questions.md](open-questions.md));
91- the expected outputs, `tokens.txt` and `tree.txt`, each the output plus one newline.
93- the expected outputs, `tokens.txt` and `tree.txt`, each the output plus one newline.
94+- optionally, `path.txt`, the logical `/ui/.../*.jibb` path to pass to the compiler; the source remains `source.jibb`.
95+- 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.
92
96
93Names say what a case is for:
97Names say what a case is for:
94
98
docs/open-questions.md+18−17
@@ -8,31 +8,32 @@ From [spec/implementation-plan.md](spec/implementation-plan.md), Open questions:
8
8
9| Question | Needed by |
9| Question | Needed by |
10| --- | --- |
10| --- | --- |
11−| Are the three proposed core-language rules adopted: gate-free `eq` arguments and map keys, natives that take gates, and no value that depends on itself through a gate? | Milestones 2 and 3 |
12| What is the typography scale for heading levels and the `role` values? | Milestone 4 |
11| What is the typography scale for heading levels and the `role` values? | Milestone 4 |
13| Does the Eyre channel CSRF test reproduce on a fake ship? @iko has the write-up; if it does, it goes to Urbit privately. | Milestone 4 |
12| Does the Eyre channel CSRF test reproduce on a fake ship? @iko has the write-up; if it does, it goes to Urbit privately. | Milestone 4 |
14| What is the benchmark's bar? Proposed: a keystroke in a 500-row list island renders within one 16 ms frame on a mid-range phone. | Milestone 6 |
13| What is the benchmark's bar? Proposed: a keystroke in a 500-row list island renders within one 16 ms frame on a mid-range phone. | Milestone 6 |
15| 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 |
16| 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 |
17
16
18−The three core-language rules are in [spec/core-language.md](spec/core-language.md), marked *proposed*: under Values and invariants ("so are `eq`'s arguments and map and set keys, and a gate never tells a union's cases apart"), Programs and linking ("a value that depends on itself, even through a gate, is an error") and Natives ("natives may take gates").
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.
19
18
20## Questions milestone 2 raises
19## Questions milestone 2 raises
21
20
22−Found while writing [prompts/milestone-2.md](prompts/milestone-2.md) and checking it against the doc's examples. The type checker needs an answer to each. @iko settled most of question 4 on 2026-10-30; the others haven't been put to @iko yet.
21+Found while writing [prompts/milestone-2.md](prompts/milestone-2.md) and checking it against the doc's examples. The numbering is retained so existing references stay valid. The prelude inventory in question 3 remains to be specified; the other questions are settled.
23−
22+
24−1. **How the prelude declares natives.** The overview's Prelude section says the prelude is "written in Jibb and vendored as `/lib/jibb/prelude`", and that "Only the prelude declares natives, Jibb's jets, and private helpers". The Core language tab gives each native "a Jibb type, a Hoon gate in `/lib/jibb` … and a JavaScript function in the runtime". The Grammar has no syntax for declaring a native, so how does the prelude say that `add` is a native of type `$-([@ @] @)`? The rules of 2026-10-30 make it sharper: outside a `+$` each bare `@` is its own aura variable, and a capital becomes an aura variable only by meeting an atom in a body, which a native doesn't have. So the declaration needs some way to say that `add`'s three atoms share one aura.
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.
25−2. **How the prelude marks its private names.** Modules: "Everything is exported and read through the import's face, as `card.card`. Only the prelude has private names." The Grammar has no syntax for privacy either.
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.
26−3. **What the prelude holds, and how much of it milestone 2 writes.** The Prelude table names groups and examples, "such as `(get.by m k)`", and for the data molds says "and the rest", so which names and types make up the prelude? Its list probably belongs in the doc. The plan's milestone 2 builds "the prelude's types", while the Decisions tab's Build order puts "the core prelude gates" in the same step. And which list gates are natives depends on the plan's first open question, "natives that take gates". The prelude must name every union its elements and attributes take, such as spaces, roles and tones; no module may use those names, since no name may shadow the prelude's.
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. 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.
27−4. **A capital in a local `++`.** @iko settled the rest of this question on 2026-10-30, in the Grammar's Molds and Literals by context and the Decisions rows Inference, Type variables and Text: outside a `+$` each bare `@` is its own aura variable, generalized per `++` if nothing fixes it; a capital that meets an atom becomes an aura variable, and nothing more specific; a number takes `@ud` only if its `++` isn't generic over its aura; and printing an atom whose aura its `++` is generic over is an error. Still open: is a capital in a local `++` the enclosing `++`'s, so that a local helper can name its parent's types, or a fresh one? The proposed reading is the enclosing one's.
26+4. **Settled: a capital in a local `++`.** On 2026-10-30, @iko said it shares the enclosing `++`'s variable of that name; a different type uses a different capital. The Grammar and Decisions record this alongside the earlier aura rules.
28−5. **Cells of no items or one.** The parser takes `[]` and `[a]` as tuples, as the EBNF's `"[" { item } "]"` allows, and leaves them to the checker. The Literals section may already answer it: "Every literal reads exactly as Hoon reads it", and its table lists Cell. Hoon reads `[a]` as `a` and rejects `[]`. The proposed reading is Hoon's. Whatever the answer, the theme's `dark=[tones=[…]]`, a record of one field, must still check.
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.
29−6. **A change with no items.** `m()` parses as a change with no edits, as `wing "(" { item } ")"` allows. Is it an error?
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.
30−7. **The doc's blocks that aren't whole modules.** The plan's "Done when" for milestone 2 says "the doc's examples typecheck, except those written as errors". Three `jibb` blocks need context to check. The overview's `cmd` and `sub` molds (`doc-overview-01-cmd-sub`) are what the Effects decision calls "the library unions", so in a module of their own they would shadow the prelude's. The Core language tab's `update` (`doc-core-02-update`) is a part of the todo list island. And the Grammar's imports (`doc-grammar-01-imports`) import `/sur/todo.hoon` and `/ui/components/card`, which the doc doesn't show, and the `%todo-action` mark, which the overview shows but which imports `/sur/todo.hoon` itself. The proposed reading is to check each in its context: the first as prelude source, the second inside the island, the third against fixture files.
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.
31−8. **Tuples and records.** Molds: "Faces are part of the type, so `[a=@ b=@]` and `[x=@ y=@]` don't unify", and a cell literal "takes a default when its `++` is checked", a tuple. Can a tuple meet a record? The doc's examples need it to: worked example 3's `init` gives `[ts "" ~]` for the `model` record, and the basket's `init` gives `[[~ %.n] ""]`; `row-of` gives `[id.t …]` where `each` takes `[key=* el=(element M)]`; `|=%typed` builds `[%typed t]` for the case `[%typed text=@t]`, which the Grammar calls "a case `[%typed @t]`"; and `program` and `store` can't know the faces of samples such as `[=msg m=model]` and `[a=cart-action s=state]`. The proposed reading: a position without a face unifies with one that has a face, and takes it; two different faces don't unify.
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.
32−9. **Values where `*` is expected.** Molds: "**Any noun**: `*`", with "no subtyping". `each` and `table` take `key=*`, and worked example 3 passes a `@ud` key. How does a typed value meet `*`? One reading: `*` in a gate's mold is a fresh type variable, so any value fits, and the rule against gates in keys comes from the core-language proposal.
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`.
33−10. **What `link`, `image` and `go` take.** Links and URLs: "`link`, `image` and `go` also take two kinds of unchecked cord", besides application paths, and `image`'s `src` is "an application path to a static image or `[url=@t width=@ud height=@ud]`". But the Effects block has `[%go url=@t]`, and a union of a `qath` and a cord breaks the union rule, since "molds that can be either … overlap both" and the Core language tab lowers an application path to "A list of knots". `link` is in worked example 1. Two gates, or a type-directed rule listed in the Grammar ("No built-ins; type-directed rules are welcome, each listed in the Grammar tab")?
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.
34−11. **Stores and derived gates.** "`poke` and `paths` are declarations, not molds" in an API file; is a store's `+$ poke` one too, since as a mold it would shadow the prelude's opaque `poke`? How does the checker know a module is a store before it has checked `main`, whose type decides the kind? What may a derived name clash with, given that the doc's API file imports `/- todo` and has a `%todo` case whose request is `todo`? And since "islands can't watch paths that need a separate scry path", is watching a request whose case has `scry=` a type error?
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`.
35−12. **How to print a union without a name.** Jibb has no syntax for one, but Hoon imports bring them in, as in a field's `?(%approve %deny)`, `$@` and `$^`, and the fold of a `(facts full d1 d2)` request does too. How should messages and `types.txt` print them? @iko's decision calls for "a print-only notation".
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 a gate-free constraint.** On 2026-10-30, @iko agreed to print the type followed by `where A contains no gates`, as `$-([A A] ?) where A 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.
36
37
37## Grammar questions never put to the doc's author
38## Grammar questions never put to the doc's author
38
39
@@ -43,7 +44,7 @@ In milestone 1 the parser met about thirty places where the doc could be read mo
43| 1 | `knot` may be empty, so the EBNF admits `//`, `/a//b` and a trailing `/`. Which are paths? | A segment has at least one character, as in Hoon. `/` alone is the empty path, in expressions and molds; `%/` alone is the root application path. `//` fails at the second `/`, and a trailing `/` just past it. `inline-mold-paths` has `/` alone as a mold |
44| 1 | `knot` may be empty, so the EBNF admits `//`, `/a//b` and a trailing `/`. Which are paths? | A segment has at least one character, as in Hoon. `/` alone is the empty path, in expressions and molds; `%/` alone is the root application path. `//` fails at the second `/`, and a trailing `/` just past it. `inline-mold-paths` has `/` alone as a mold |
44| 2 | Is `/` alone a valid path for a `/=` import? | No: `/=` names a module's file, so its path has a segment. `/= card /` fails just past the `/` (`inline-import-root-bad`) |
45| 2 | Is `/` alone a valid path for a `/=` import? | No: `/=` names a module's file, so its path has a segment. `/= card /` fails just past the `/` (`inline-import-root-bad`) |
45| 3 | The EBNF's `line = [ name "=" ] expr` lets every open bracket's lines take `name=`. What would it mean on a line of an open `(` or `~[`? | An error: `name=` lines belong to tuples and changes. "expected a space between items, found `=`; `name=value` goes in a cell, as [a=1], or a change, as m(a=1)" |
46| 3 | The EBNF's `line = [ name "=" ] expr` lets every open bracket's lines take `name=`. What would it mean on a line of an open `(` or `~[`? | An error: `name=` lines belong to tuples and changes. "expected a space between items, found `=`; `name=value` goes in a cell, as [a=1], or a change, as m(a=1)" |
46−| 4 | Does "items named" make every item of a change need `name=`? | Yes: `m(x)` fails just past `x`, "a change's items are named, as in m(done=%.y)" (`lex-tight-change-bad-3` to `-7`; `-8` and `-9` test what follows a name there). `m()` parses; see question 6 above |
47+| 4 | Does "items named" make every item of a change need `name=`? | Yes: `m(x)` fails just past `x`, "a change's items are named, as in m(done=%.y)" (`lex-tight-change-bad-3` to `-7`; `-8` and `-9` test what follows a name there). The parser still accepts `m()`, though question 6 settled it as an error |
47| 5 | `term` includes `%0`, `%&` and `%\|`, which no mark is called. What does `/%` take? | `%` and a name only: `/% %0` is "expected a mark's term, as `%todo-action`, found `%0`" |
48| 5 | `term` includes `%0`, `%&` and `%\|`, which no mark is called. What does `/%` take? | `%` and a name only: `/% %0` is "expected a mark's term, as `%todo-action`, found `%0`" |
48| 6 | What does an indented first line mean? | An error: "the first line is indented: top-level lines start at column 1" (`lex-indent-bad-3`) |
49| 6 | What does an indented first line mean? | An error: "the first line is indented: top-level lines start at column 1" (`lex-indent-bad-3`) |
49| 7 | With levels open at columns 1 and 5, what does a line at column 3 mean? | An error naming the open columns: "this line's indentation matches no enclosing line: indent it to column 1 or 5". `lex-indent-bad-2`, with levels at 1, 5 and 7, gives "column 1, 5 or 7" |
50| 7 | With levels open at columns 1 and 5, what does a line at column 3 mean? | An error naming the open columns: "this line's indentation matches no enclosing line: indent it to column 1 or 5". `lex-indent-bad-2`, with levels at 1, 5 and 7, gives "column 1, 5 or 7" |
docs/prelude-inventory.mdnew file+120
@@ -0,0 +1,120 @@
1+# Prelude inventory: source audit
2+
3+This is a working inventory, not a completed prelude interface. It lists top-level arms in the Hoon sections selected for inclusion, before checking each signature, unsupported mold, parser exclusion, collision, grouping or Jibb implementation. The first-level arms in selected Hoon doors are listed separately; each still needs classification and a Jibb signature. `3g` is included for audit because the spec names `coin` and `dime` from it; the rest needs classification.
4+
5+The 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+
7+Hoon `+$` 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 are excluded from the intended prelude except the specifically listed `slav` and `slaw`; the raw candidates below still need to be classified.
8+
9+## 1a
10+
11+`add`, `dec`, `div`, `dvr`, `gte`, `gth`, `lte`, `lth`, `max`, `min`, `mod`, `mul`, `sub`.
12+
13+## 1c
14+
15+`bite` (mold), `bloq` (mold), `each`, `gate` (mold), `list`, `lone`, `lest`, `mold` (mold), `pair`, `pole`, `qual`, `quip`, `step`, `trap`, `tree`, `trel`, `unit`.
16+
17+## 2a
18+
19+`biff`, `bind`, `bond`, `both`, `clap`, `clef`, `drop`, `fall`, `flit`, `hunt`, `lift`, `mate`, `need`, `some`.
20+
21+## 2b
22+
23+`snoc`, `lure`, `fand`, `find`, `flop`, `gulf`, `homo`, `join`, `bake`, `lent`, `levy`, `lien`, `limo`, `murn`, `oust`, `reap`, `rear`, `reel`, `roll`, `scag`, `skid`, `skim`, `skip`, `slag`, `snag`, `snip`, `sort`, `spin`, `spun`, `swag`, `turn`, `weld`, `snap`, `into`, `welp`, `zing`.
24+
25+## 2c
26+
27+`bex`, `can`, `cat`, `cut`, `end`, `fil`, `hew`, `lsh`, `met`, `rap`, `rep`, `rev`, `rig`, `rip`, `rsh`, `run`, `rut`, `sew`, `swp`, `xeb`, `fe`.
28+
29+## 2d
30+
31+`con`, `clz`, `ctz`, `dis`, `ham`, `mix`, `not`.
32+
33+## 2e
34+
35+`muk`, `mug`.
36+
37+## 2f
38+
39+`aor`, `dor`, `gor`, `mor`.
40+
41+## 2g
42+
43+`pow`, `sqt`.
44+
45+## 2h
46+
47+`in`.
48+
49+## 2i
50+
51+`by`.
52+
53+## 2j
54+
55+`ja`, `ju`.
56+
57+## 2k
58+
59+`to`.
60+
61+## 2l
62+
63+`malt`, `molt`, `silt`.
64+
65+## 2m
66+
67+`ly`, `my`, `sy`, `nl`.
68+
69+## 2n
70+
71+`aftr`, `cork`, `corl`, `cury`, `curr`, `fore`, `head`, `same`, `succ`, `tail`, `test`, `lead`, `late`.
72+
73+## 2o
74+
75+`jar`, `jug`, `map`, `qeu`, `set`.
76+
77+## 2q
78+
79+`axis` (mold), `bean` (mold), `flag` (mold), `char` (mold), `cord` (mold), `byts` (mold), `date` (mold), `knot` (mold), `noun` (mold), `path` (mold), `pith` (mold), `stud` (mold), `tang` (mold), `iota` (mold), `tank` (mold), `tape` (mold), `tour` (mold), `tarp` (mold), `term` (mold), `wain` (mold), `wall` (mold).
80+
81+## 3c
82+
83+`year`, `yore`, `yell`, `yule`, `yall`, `yawn`, `yelp`, `yo`.
84+
85+## 3g
86+
87+`coin` (mold), `dime` (mold), `edge` (mold), `hair` (mold), `like`, `nail` (mold), `pint` (mold), `rule` (mold), `spot` (mold), `tone` (mold), `toon` (mold), `wonk`.
88+
89+## 4a
90+
91+`po`, `fa`.
92+
93+## 4b
94+
95+`at`, `cass`, `cuss`, `crip`, `mesc`, `runt`, `sand`, `sane`, `ruth`, `trim`, `trip`, `teff`, `taft`, `tuba`, `tufa`, `tuft`, `wack`, `wick`, `woad`, `wood`.
96+
97+## 4k
98+
99+`co`.
100+
101+## 4m
102+
103+`scot`, `scow`, `slat`, `slav`, `slaw`, `slay`, `smyt`, `spat`, `spud`, `stab`, `stap`, `stip`, `pout`, `pave`.
104+
105+## Selected door arms
106+
107+These are first-level Hoon arms for the container and base-conversion doors, before applying the parser and internal-helper exclusions or converting door operations to plain Jibb gates.
108+
109+| Hoon door | Arms |
110+| --- | --- |
111+| `in` | `all`, `any`, `apt`, `bif`, `del`, `dif`, `dig`, `gas`, `has`, `int`, `put`, `rep`, `run`, `tap`, `uni`, `wyt` |
112+| `by` | `all`, `any`, `bif`, `del`, `dif`, `dig`, `apt`, `gas`, `get`, `got`, `gut`, `has`, `int`, `jab`, `mar`, `put`, `rep`, `rib`, `run`, `tap`, `uni`, `uno`, `urn`, `wyt`, `key`, `val` |
113+| `ja` | `get`, `add`, `zip` |
114+| `ju` | `del`, `gas`, `get`, `has`, `put` |
115+| `to` | `apt`, `bal`, `dep`, `gas`, `get`, `nip`, `nap`, `put`, `run`, `tap`, `top` |
116+| `po` | `ins`, `ind`, `tos`, `tod` |
117+| `fa` | `cha`, `tok`, `pad`, `enc`, `den` |
118+| `co` | `em-co`, `ed-co`, `ox-co`, `ro-co` |
119+
120+The raw 4m candidates need special care: `slat`, `slay`, `stab`, `stap` and `stip` parse atoms or paths, while `slav` and `slaw` are the explicitly approved exceptions. Some door arms, such as `ins.po` and `ind.po`, also parse. The final inventory must classify each rather than expose this raw list wholesale.
docs/prompts/milestone-2.md+18−29
@@ -49,21 +49,9 @@ And from the plan's Risks:
49
49
50## First steps
50## First steps
51
51
52−1. **Settle the open questions.** The checker needs answers the doc doesn't give yet. `docs/open-questions.md` lists twelve under "Questions milestone 2 raises", found by walking the doc's examples through its rules:
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.
53− 1. how the prelude declares natives;
53+
54− 2. how it marks private names;
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.
55− 3. what the prelude holds, and whether milestone 2 writes "the prelude's types", as the plan says, or "the core prelude gates", as the Decisions tab's Build order says;
56− 4. whether a capital in a local `++` is the enclosing `++`'s (the rest of that question was settled on 2026-10-30);
57− 5. `[]` and `[a]`;
58− 6. `m()`;
59− 7. how to check the doc's blocks that aren't whole modules;
60− 8. whether a tuple can meet a record, which worked example 3 needs;
61− 9. how a typed value meets `*`, as `each`'s `key=*` does;
62− 10. what `link`, `image` and `go` take;
63− 11. stores' `+$ poke`, derived-name clashes, and watching a `scry=` case;
64− 12. the print-only notation for unions without a name.
65−
66− The plan's first open question matters too: whether `eq`'s arguments and map and set keys must be free of gates, and a gate may never tell a union's cases apart, which changes the disjointness check; whether natives may take gates, which decides whether `turn`, `sort` and `skim` are natives; and whether a value that depends on itself through a gate is an error. Put each to @iko in your first days with a proposed answer and the reason for it, and build on the proposal until you hear back.
672. **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.
68
56
69## What the doc asks of the checker
57## What the doc asks of the checker
@@ -73,20 +61,21 @@ The rules are scattered across the tabs. This is a map of them, not a replacemen
73**Types and inference** (Grammar: Molds, Modules, Runes, Expressions; Decisions: Inference, Type variables, Sample names, Inline gates)
61**Types and inference** (Grammar: Molds, Modules, Runes, Expressions; Decisions: Inference, Type variables, Sample names, Inline gates)
74- Hindley–Milner with aura variables: "every expression has a principal type, and there is no subtyping".
62- Hindley–Milner with aura variables: "every expression has a principal type, and there is no subtyping".
75- "`@` is an atom whose aura isn't known yet, fixed by what it meets": `add` takes `[@ @]` and returns `@`, all one aura. "Different auras never unify." "A bare `@` in a `+$` is one aura variable per module, `@ud` if unfixed." Elsewhere, "as in a gate's sample or a cast, each bare `@` is its own aura variable, generalized per `++` if nothing fixes it; atoms that must share an aura take one capital".
63- "`@` is an atom whose aura isn't known yet, fixed by what it meets": `add` takes `[@ @]` and returns `@`, all one aura. "Different auras never unify." "A bare `@` in a `+$` is one aura variable per module, `@ud` if unfixed." Elsewhere, "as in a gate's sample or a cast, each bare `@` is its own aura variable, generalized per `++` if nothing fixes it; atoms that must share an aura take one capital".
76−- Faces are part of record types: `[a=@ b=@]` and `[x=@ y=@]` don't unify. Whether a tuple meets a record is open question 8.
64+- Faces are part of record types: `[a=@ b=@]` and `[x=@ y=@]` don't unify. An unnamed position can unify with a faced one and take its face, so `[0 0]` fits `[x=@ud y=@ud]`. A single-item cell `[a]` is `a`; an empty `[]` is an error.
77−- Type variables are capitals, "generalized per `++`". "A type variable that meets an atom becomes an aura variable", so `++ clamp |= [lo=A hi=A n=A]`, calling `gth` and `max`, works on any one aura; "It can become nothing more specific: a body that makes `A` a `@ud` or a list is an error." Whether a capital in a local `++` is the enclosing one's is open question 4. Names "may refer to each other in any order", so infer `++` definitions in dependency order, a group of mutually recursive ones together.
65+- Type variables are capitals, "generalized per `++`". A capital in a local `++` shares the enclosing `++`'s variable of that name; a different type takes a different capital. "A type variable that meets an atom becomes an aura variable", so `++ clamp |= [lo=A hi=A n=A]`, calling `gth` and `max`, works on any one aura; "It can become nothing more specific: a body that makes `A` a `@ud` or a list is an error." Names "may refer to each other in any order", so infer `++` definitions in dependency order, a group of mutually recursive ones together.
66+- The checker infers a gate-free constraint for `eq` arguments and map and set keys and retains it when a type variable is generalized. The requirement applies recursively to nested values; union-case matching treats gates as opaque. Print a constrained type as `$-([A A] ?) where A contains no gates`.
78−- "Gates may call themselves and their siblings; other values can't refer to themselves, so `++ title (trim title)` is an error." Molds may be recursive, and "recursive molds go by name and module".
67+- Gates may call themselves and their siblings; a non-gate value that depends on itself, even through a gate, is an error. Molds may be recursive, and "recursive molds go by name and module".
79- A sample's mold may be left out: every bare name in a sample binds, at any depth, as in `|=(p title.p)` "when the call fixes the type", `|= [a=@ b]` and `|=(m ~)`.
68- A sample's mold may be left out: every bare name in a sample binds, at any depth, as in `|=(p title.p)` "when the call fixes the type", `|= [a=@ b]` and `|=(m ~)`.
80- 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]`.
69- 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]`.
81−- `!!` is the empty mold, and as an expression it has any type. `*` is any noun; how other types meet it is open question 9.
70+- `!!` 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.
82- `poke`, `ask` and `qath` are opaque, built only by derived gates, `pure` and application-path literals.
71- `poke`, `ask` and `qath` are opaque, built only by derived gates, `pure` and application-path literals.
83- 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`.
72- 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`.
84
73
85**Tags, `~`, numbers and cells wait for their context** (Grammar: Tag resolution, Literals by context)
74**Tags, `~`, numbers and cells wait for their context** (Grammar: Tag resolution, Literals by context)
86- A tag or `~` gets a fresh variable and a pending constraint, checked once unification fixes the variable: against a union's cases, by shape and shared tag positions, or as a constant atom for `@tas`, `@ta`, `@` or `*`. A literal that matches nothing is "an error naming the union, such as "msg has no case %submitt"".
75- A tag or `~` gets a fresh variable and a pending constraint, checked once unification fixes the variable: against a union's cases, by shape and shared tag positions, or as a constant atom for `@tas`, `@ta`, `@` or `*`. A literal that matches nothing is "an error naming the union, such as "msg has no case %submitt"".
87- `|=%typed` is a case's constructor: "against `$-(@t M)` it is `|=(t [%typed t])`, requiring `M` to have a case `[%typed @t]`. It works for cases tagged at their head; a bare tag is always a value."
76- `|=%typed` is a case's constructor: "against `$-(@t M)` it is `|=(t [%typed t])`, requiring `M` to have a case `[%typed @t]`. It works for cases tagged at their head; a bare tag is always a value."
88−- "A constrained variable, and any it mentions, doesn't generalize; it stays open until something in the module fixes it. An island's `main` fixes its messages." A constraint still open when the module is checked "is an error asking for a `^-`; the checker never guesses".
77+- A variable constrained by tag resolution, and any it mentions, doesn't generalize; it stays open until something in the module fixes it. An island's `main` fixes its messages. A tag constraint still open when the module is checked is an error asking for a `^-`; the checker never guesses. Gate-free constraints are retained when generalized.
89−- "Wing access, changes and `?-` on a type not yet known wait the same way." Patterns don't: they're checked against the subject's type.
78+- "Wing access, changes and `?-` on a type not yet known wait the same way." A change with no items, `m()`, is an error; the parser still accepts it. Patterns don't wait: they're checked against the subject's type.
90- Number and cell literals each "takes a default when its `++` is checked": a number `@ud`, a cell a tuple. But "A number takes `@ud` only if nothing fixes its aura and its `++` isn't generic over it", so `++ inc |= n=A (add n 1)` stays generic: unlike a tag's, a number's variable doesn't stop its `++` from generalizing. A cell can also become a record or, where a list is expected, a cons.
79- Number and cell literals each "takes a default when its `++` is checked": a number `@ud`, a cell a tuple. But "A number takes `@ud` only if nothing fixes its aura and its `++` isn't generic over it", so `++ inc |= n=A (add n 1)` stays generic: unlike a tag's, a number's variable doesn't stop its `++` from generalizing. A cell can also become a record or, where a list is expected, a cons.
91- In `{…}`, atoms print by aura, a bare `@` as `@ud`; `@t`, `@ta`, `@tas` and tapes splice as text; "any other cell is an error asking for a printer". "Printers are picked when compiling", so an atom whose aura its `++` is generic over "is an error asking for an aura", in `{…}` and in a `(…)` segment of an application path. String literals are always cords.
80- In `{…}`, atoms print by aura, a bare `@` as `@ud`; `@t`, `@ta`, `@tas` and tapes splice as text; "any other cell is an error asking for a printer". "Printers are picked when compiling", so an atom whose aura its `++` is generic over "is an error asking for an aura", in `{…}` and in a `(…)` segment of an application path. String literals are always cords.
92
81
@@ -118,16 +107,16 @@ The rules are scattered across the tabs. This is a map of them, not a replacemen
118- "Island data and models can't hold gates; the checker names the field."
107- "Island data and models can't hold gates; the checker names the field."
119
108
120**API files, stores and derived gates** (overview: Agent APIs, Effects; Grammar: Modules)
109**API files, stores and derived gates** (overview: Agent APIs, Effects; Grammar: Modules)
121−- `/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." Islands "can't watch paths that need a separate scry path".
110+- `/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 watching a request whose case has `scry=` has a type error.
122- 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)`.
111- 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)`.
123−- A store exports a constructor per poke type and a `state` request. "Clashing derived names are errors." Open question 11 asks the rest.
112+- 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.
124
113
125**The prelude** (overview: Prelude, Layout and styling, Links and URLs, Effects)
114**The prelude** (overview: Prelude, Layout and styling, Links and URLs, Effects)
126- 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.
115- 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.
127- Signatures change where the Prelude table says: maps and sets are plain gates over Hoon's trees, as `(get.by m k)`; folds take a start, as `(roll xs init f)`, `rep.by` and `rep.in`; ordered maps go through lull's `on`, as `(get.on lte m k)`.
116- Signatures change where the Prelude table says: maps and sets are plain gates over Hoon's trees, as `(get.by m k)`; folds take a start, as `(roll xs init f)`, `rep.by` and `rep.in`; ordered maps go through lull's `on`, as `(get.on lte m k)`.
128−- Left out: signed and float gates, parsers, and the table's "The rest" (1b, 2p, 3d, 3f, 4c, 4n, 4o, 5a–5f); "`jam`, `cue` and `fein` run inside the runtime".
117+- Left out: signed and float gates, parser helpers other than the explicitly listed `slav` and `slaw`, and the table's "The rest" (1b, 2p, 3d, 3f, 4c, 4n, 4o, 5a–5f); "`jam`, `cue` and `fein` run inside the runtime".
129−- Write the prelude in Jibb, enough to give every name its type: Jibb-written gates as code the checker checks, natives as declarations, in whatever form open question 1 settles. The Hoon gates behind natives come with the Nock backend in milestone 3.
118+- Write the prelude in Jibb, enough to give every name its type. Foundational gates use private low-level primitives from the internal prelude module. Jetted functions have working Jibb implementations; the compiler recognizes their shapes and uses the Hoon versions so jets can fire. They may take gates as arguments; the Nock backend comes in milestone 3.
130−- Element signatures are in the Layout and styling table; what `link`, `image` and `go` take is open question 10. "The same attribute twice in a literal list is an error."
119+- Element signatures are in the Layout and styling table. Paths and unchecked cords have separate declarations, with `link-unsafe`, `image-unsafe` and `go-unsafe` for the unchecked forms. Both navigation declarations produce `[%go url=@t]`; `go` converts its application path to a cord including the app's base path. "The same attribute twice in a literal list is an error."
131
120
132**Errors**
121**Errors**
133- Each one the Grammar tab describes needs a golden case with its message. A start on the list: an aura mismatch; mismatched faces; "msg has no case %submitt"; an unresolved tag, as the Grammar's `add-button` ("nothing fixes the union of %add"); an open constraint at the end of a module; a `|=%tag` whose union has no such case tagged at its head; a union whose cases overlap; a missing `?-` case, named; an arm that earlier arms cover; a value that refers to itself; a shadowed name, including a prelude or imported one; a cell in `{…}` with no printer; an atom of a generic aura in `{…}` or a path's `(…)`; a capital that a body makes a `@ud` or a list; `~[text "hi"]`, where the checker suggests `~[(text "hi")]`; clashing derived names; an import cycle; from an import, a signed or float aura, a core, gate or vase, or a `$^` whose cases don't differ as nouns, each where used; a `(facts …)` outside an API file's `paths`; a gate in island data or a model, naming the field; a repeated attribute in a literal list. Read the Grammar tab, and the other tabs' mentions of "error" and "the checker", and make the list complete.
122- Each one the Grammar tab describes needs a golden case with its message. A start on the list: an aura mismatch; mismatched faces; "msg has no case %submitt"; an unresolved tag, as the Grammar's `add-button` ("nothing fixes the union of %add"); an open constraint at the end of a module; a `|=%tag` whose union has no such case tagged at its head; a union whose cases overlap; a missing `?-` case, named; an arm that earlier arms cover; a value that refers to itself; a shadowed name, including a prelude or imported one; a cell in `{…}` with no printer; an atom of a generic aura in `{…}` or a path's `(…)`; a capital that a body makes a `@ud` or a list; `~[text "hi"]`, where the checker suggests `~[(text "hi")]`; clashing derived names; an import cycle; from an import, a signed or float aura, a core, gate or vase, or a `$^` whose cases don't differ as nouns, each where used; a `(facts …)` outside an API file's `paths`; a gate in island data or a model, naming the field; a repeated attribute in a literal list. Read the Grammar tab, and the other tabs' mentions of "error" and "the checker", and make the list complete.
@@ -149,16 +138,16 @@ Suggestions, not rules; change them where you find better.
149 `..zuse` is the subject a ship builds `/sur` files against, so molds from lull and zuse, such as `json` and `mark`, resolve. Each `+$` arm's type comes as a `%hold` whose expansion is a `%hint` with a `%made` note naming the arm, then the mold: a `$%` is a `%fork` of cells headed by `%tas` constants. A `(map id item)` field is named only in its arm's own `%hold`, whose Hoon calls `map` by name. Once the arm is expanded, the field is a `%hold` whose Hoon is the body of `map`, `(tree (pair key value))` with its `apt` check, which expands to a second `%hold`, `tree`'s body, and only then to a treap's `%fork`. So recognising maps, sets and the rest by name means reading an arm's Hoon before expanding it, or comparing a `%hold`'s Hoon with the standard library molds' own bodies. On a ship, `.^(vase %ca /=my-app=/sur/todo/hoon)` builds a `/sur` file, and a mark's type is its door's sample. Most of Tlon's `/sur` files begin with `/-` or `/+` (25 of the 40 in `tloncorp/tlon-apps`, `desk/sur`, on 2026-10-30), so under eval their imports must be resolved by hand; on the ship Clay does it.
138 `..zuse` is the subject a ship builds `/sur` files against, so molds from lull and zuse, such as `json` and `mark`, resolve. Each `+$` arm's type comes as a `%hold` whose expansion is a `%hint` with a `%made` note naming the arm, then the mold: a `$%` is a `%fork` of cells headed by `%tas` constants. A `(map id item)` field is named only in its arm's own `%hold`, whose Hoon calls `map` by name. Once the arm is expanded, the field is a `%hold` whose Hoon is the body of `map`, `(tree (pair key value))` with its `apt` check, which expands to a second `%hold`, `tree`'s body, and only then to a treap's `%fork`. So recognising maps, sets and the rest by name means reading an arm's Hoon before expanding it, or comparing a `%hold`'s Hoon with the standard library molds' own bodies. On a ship, `.^(vase %ca /=my-app=/sur/todo/hoon)` builds a `/sur` file, and a mark's type is its door's sample. Most of Tlon's `/sur` files begin with `/-` or `/+` (25 of the 40 in `tloncorp/tlon-apps`, `desk/sur`, on 2026-10-30), so under eval their imports must be resolved by hand; on the ship Clay does it.
150- **Inference**: union-find over a map of variables, levels for generalization rather than scanning the environment, and a queue of deferred constraints, retried as variables are bound and reported when the module ends. Infer `++`s in strongly connected groups. Measure early: Hoon is slow, and a 2,000-line module should check in seconds, not minutes.
139- **Inference**: union-find over a map of variables, levels for generalization rather than scanning the environment, and a queue of deferred constraints, retried as variables are bound and reported when the module ends. Infer `++`s in strongly connected groups. Measure early: Hoon is slow, and a 2,000-line module should check in seconds, not minutes.
151- **Exhaustiveness**: Maranget's "Warnings for pattern matching" (Journal of Functional Programming, 2007) fits nouns: constructors are constants and cells.
140- **Exhaustiveness**: Maranget's "Warnings for pattern matching" (Journal of Functional Programming, 2007) fits nouns: constructors are constants and cells.
152−- **A type printer** for golden output and messages. Use Jibb's mold syntax where possible; Jibb has no syntax for an unnamed union. Open question 12 asks for a print-only notation.
141+- **A type printer** for golden output and messages. Use Jibb's mold syntax where possible; Jibb has no syntax for an unnamed union, which prints its cases separated by spaces, as `%approve %deny`.
153- **Mind two names.** The library's `+in`, a bit test, hides the standard library's set door `in`, and `+fail` hides Hoon's parser rule `fail`. Write `in:..zuse`, or rename `+in` before the checker uses sets.
142- **Mind two names.** The library's `+in`, a bit test, hides the standard library's set door `in`, and `+fail` hides Hoon's parser rule `fail`. Write `in:..zuse`, or rename `+in` before the checker uses sets.
154
143
155## Tests
144## Tests
156
145
157−- **A third golden output.** Add the checker's output to `+golden`, say `types.txt`: each definition's type (using the print-only notation for unnamed unions once question 12 is settled) and the module's kind, or the rendered error. Teach `tools/golden`, `tools/ship gen-tests`, the stubs and self-tests in `tools/testdata`, README.md and `docs/development.md` about it, with an `expect:` form for the checker, then add it to the existing cases and review every one.
146+- **A third golden output.** Add the checker's output to `+golden`, say `types.txt`: each definition's type (printing an unnamed union's cases separated by spaces) and the module's kind, or the rendered error. Teach `tools/golden`, `tools/ship gen-tests`, the stubs and self-tests in `tools/testdata`, README.md and `docs/development.md` about it, with an `expect:` form for the checker, then add it to the existing cases and review every one.
158- **Cases with imports.** Six of the doc's fourteen `jibb` blocks import other modules, three of them `/sur` files or marks, and the Core language tab's `update` needs the todo API without importing it. Give a case a way to carry the files it imports, under eval and on the ship alike. A case also needs its own path under `/ui`: both runners pass the file as `/tests/golden/<case>/source/jibb`, but an API file is known by its path, `/ui/api/<agent>.jibb`, whose name is the agent its constructors poke.
147- **Cases with imports.** Six of the doc's fourteen `jibb` blocks import other modules, three of them `/sur` files or marks, and the Core language tab's `update` needs the todo API without importing it. Give a case a way to carry the files it imports, under eval and on the ship alike. A case also needs its own path under `/ui`: both runners pass the file as `/tests/golden/<case>/source/jibb`, but an API file is known by its path, `/ui/api/<agent>.jibb`, whose name is the agent its constructors poke.
159- **Hoon files on the ship.** `tools/ship test` runs `-test` on the `jibb-dev` desk's `/tests`, which builds every `.hoon` file there as a test file. A fixture mark that starts `/- todo`, or one of Tlon's files, fails that build, and with it the run. Keep such files where `-test` won't build them, as `.txt` read with `/*`, or in a desk of their own, and keep them out of `jibb-dev/`, which app desks vendor, and `vendor/`, which goes into every desk.
148- **Hoon files on the ship.** `tools/ship test` runs `-test` on the `jibb-dev` desk's `/tests`, which builds every `.hoon` file there as a test file. A fixture mark that starts `/- todo`, or one of Tlon's files, fails that build, and with it the run. Keep such files where `-test` won't build them, as `.txt` read with `/*`, or in a desk of their own, and keep them out of `jibb-dev/`, which app desks vendor, and `vendor/`, which goes into every desk.
160- **Fixtures for the doc's examples.** `my-app/ui/` holds nine of the doc's blocks as modules. Add what they import that the doc doesn't show: `/sur/todo.hoon` and the marks `todo-action`, `todos`, `todo-update` and `todo-item` (the overview shows `/mar/todo-action.hoon`; `row-of` reads `id`, `done` and `text` from an item); `/sur/blog.hoon`, a mark for the posts, of type `(list post:blog)`, and `/ui/api/blog.jibb`, whose `posts` case names that type through `/%`; and `/ui/components/card.jibb`, with a `card` gate from a post to an element. Keep them as small as the examples allow, say in a comment at the top of each that it is a fixture and not from the doc, and don't change the doc's blocks.
149- **Fixtures for the doc's examples.** `my-app/ui/` holds nine of the doc's blocks as modules. Add what they import that the doc doesn't show: `/sur/todo.hoon` and the marks `todo-action`, `todos`, `todo-update` and `todo-item` (the overview shows `/mar/todo-action.hoon`; `row-of` reads `id`, `done` and `text` from an item); `/sur/blog.hoon`, a mark for the posts, of type `(list post:blog)`, and `/ui/api/blog.jibb`, whose `posts` case names that type through `/%`; and `/ui/components/card.jibb`, with a `card` gate from a post to an element. Keep them as small as the examples allow, say in a comment at the top of each that it is a fixture and not from the doc, and don't change the doc's blocks.
161−- **Every doc example typechecks**, except the Grammar's buttons example, whose `add-button` is written as an error and must fail with it. The same block marks `labelled` and `wide` as fine, so show them checking too, by printing the definitions that check beside the error or in a case without `add-button`. Open question 7 proposes how to check the three blocks that aren't whole modules.
150+- **Every doc example typechecks**, except the Grammar's buttons example, whose `add-button` is written as an error and must fail with it. The same block marks `labelled` and `wide` as fine, so show them checking too, by printing the definitions that check beside the error or in a case without `add-button`. Check the three blocks that aren't whole modules in their intended contexts: `cmd` and `sub` as prelude source, the Core language tab's `update` inside the todo island, and the imports example against fixtures.
162- **The `/sur` import.** A test `/sur` file with `$%`, `$@`, a map and a recursive mold, imported and printed, using the print-only notation for unnamed unions when needed, under eval and on the ship. Then Tlon's real files, as the risk asks: they need not import fully, but every mold a test uses must, and any error must be the table's.
151- **The `/sur` import.** A test `/sur` file with `$%`, `$@`, a map and a recursive mold, imported and printed, using the print-only notation for unnamed unions when needed, under eval and on the ship. Then Tlon's real files, as the risk asks: they need not import fully, but every mold a test uses must, and any error must be the table's.
163- **On the ship**: the golden cases as `-test` arms, and the `my-app` desk checked with its Hoon types read through Clay: every module checks except `ui/components/buttons.jibb`, which gives `add-button`'s error.
152- **On the ship**: the golden cases as `-test` arms, and the `my-app` desk checked with its Hoon types read through Clay: every module checks except `ui/components/buttons.jibb`, which gives `add-button`'s error.
164- **Speed**: time the corpus and the `my-app` desk, and record both in `docs/status.md`.
153- **Speed**: time the corpus and the `my-app` desk, and record both in `docs/status.md`.
docs/spec/core-language.md+4−4
@@ -36,7 +36,7 @@ The front end guarantees the backends:
36
36
37- **No shadowing.** No binding hides another: Jibb forbids it, and generated names start with `_`, which Jibb names can't.
37- **No shadowing.** No binding hides another: Jibb forbids it, and generated names start with `_`, which Jibb names can't.
38- **`rec` binds functions.** Every right side of a `rec` is a `lam`.
38- **`rec` binds functions.** Every right side of a `rec` is a `lam`.
39−- **Functions aren't taken apart.** `cell?`, `eq`, `slot` and `edit` never get a function itself, and `eq` never compares nouns that contain one. Island data and models are already first-order. *Proposed*: so are `eq`'s arguments and map and set keys, and a gate never tells a union's cases apart.
39+- **Functions aren't taken apart.** `cell?`, `eq`, `slot` and `edit` never get a function itself, and `eq` never compares nouns that contain one. Island data and models are already first-order. So are `eq`'s arguments and map and set keys, and a gate never tells a union's cases apart.
40- **Strict evaluation.** A call's sample is evaluated before the call, and a node's parts in text order; `if` evaluates only the branch it takes. Only `trace` and `crash` can observe the order, and differential tests compare results and whether a program crashes, not traces. So the backends may evaluate a node's parts in another order, as Nock 10 does with edit's v and e.
40- **Strict evaluation.** A call's sample is evaluated before the call, and a node's parts in text order; `if` evaluates only the branch it takes. Only `trace` and `crash` can observe the order, and differential tests compare results and whether a program crashes, not traces. So the backends may evaluate a node's parts in another order, as Nock 10 does with edit's v and e.
41- **Crashes stay crashes.** Where types already guarantee a test, the backends still crash on a violation, as Nock does, instead of carrying on.
41- **Crashes stay crashes.** Where types already guarantee a test, the backends still crash on a violation, as Nock does, instead of carrying on.
42
42
@@ -141,14 +141,14 @@ lowers to the program below. The model `[todos draft error]` puts `todos` at axi
141
141
142- Each module lowers to `(module <path> (def name e) …)`, in source order. Its own and the prelude's definitions are named plainly, since no name may shadow another; imports are qualified, as in `api/todo:todo-action`.
142- Each module lowers to `(module <path> (def name e) …)`, in source order. Its own and the prelude's definitions are named plainly, since no name may shadow another; imports are qualified, as in `api/todo:todo-action`.
143- The linker builds one program per entry: on the ship, each page; in the browser, each island's `update`, `view` and `subs`, and each store. It keeps only the definitions the entry reaches, sorts them by dependency into `let`s and `rec`s, and ends with the entry.
143- The linker builds one program per entry: on the ship, each page; in the browser, each island's `update`, `view` and `subs`, and each store. It keeps only the definitions the entry reaches, sorts them by dependency into `let`s and `rec`s, and ends with the entry.
144−- Values that aren't gates are computed once per program, before anything calls them; the Nock backend may compute them at build time. *Proposed*: a value that depends on itself, even through a gate, is an error.
144+- Values that aren't gates are computed once per program, before anything calls them; the Nock backend may compute them at build time. A value that depends on itself, even through a gate, is an error.
145- A module used as a whole value is a cell of its definitions, in name order.
145- A module used as a whole value is a cell of its definitions, in name order.
146
146
147## Natives
147## Natives
148
148
149−- Only the prelude declares natives. Each has a Jibb type, a Hoon gate in `/lib/jibb` that calls the standard library, so its jets fire, and a JavaScript function in the runtime. Differential tests check each pair.
149+- Jetted prelude functions have working Jibb implementations. Foundational gates use private low-level primitives from the internal prelude module. The compiler recognizes the functions' shapes and uses the corresponding Hoon versions, so their jets can fire. The JavaScript runtime supplies corresponding implementations; differential tests check their behavior.
150- The lowering uses a few private ones: `join` for interpolation, a printer per aura, and the map and set checks in validators.
150- The lowering uses a few private ones: `join` for interpolation, a printer per aura, and the map and set checks in validators.
151−- *Proposed*: natives may take gates. On the ship a Jibb gate is shaped like Hoon's, so Hoon's own `turn`, `sort` and `skim` can call it, with their jets where vere has them. In JavaScript they're loops, which keeps long lists off the stack. This would replace the rule that Jibb-written gates such as `turn` run unjetted on the ship. A native only calls such a gate and never takes it apart, so the invariant above still holds.
151+- Jetted prelude functions may take gates. On the ship a Jibb gate is shaped like Hoon's, so functions such as `turn`, `sort` and `skim` can call it. In JavaScript native implementations can use loops, which keeps long lists off the stack. Such a function only calls the gate and never takes it apart, so the invariant above still holds.
152
152
153## Backends
153## Backends
154
154
docs/spec/decisions.md+14−9
@@ -8,8 +8,9 @@ The choices behind the Language tab, made on 2026-10-23; a later date marks a re
8
8
9| Decision | Choice | Status |
9| Decision | Choice | Status |
10| --- | --- | --- |
10| --- | --- | --- |
11−| Syntax | Hoon's runes as keywords, and its literals; wide forms only for `\|=` and `$-`; changes take record items, as `m(draft="x")`; `.` reads fields, imports and prelude groups; no name may shadow another | Decided 2026-10-30 |
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| Literals | Exactly Hoon's: `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 |
12| Literals | Exactly Hoon's: `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+| Cells | A single-item cell `[a]` is `a`; an empty `[]` is an error, in expressions and molds | Decided 2026-10-30 |
13| Numeric terms | `%` and a decimal as Hoon writes it: `%1.000`; `%1000` and `%007` are errors | Decided 2026-10-30 |
14| Numeric terms | `%` and a decimal as Hoon writes it: `%1.000`; `%1000` and `%007` are errors | Decided 2026-10-30 |
14| 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 |
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 |
15| 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 |
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,27 +18,31 @@ The choices behind the Language tab, made on 2026-10-23; a later date marks a re
17| Crash | `!!` is an operand, so `f !!` and `~[!!]` need no parentheses | Decided 2026-10-30 |
18| Crash | `!!` is an operand, so `f !!` and `~[!!]` need no parentheses | Decided 2026-10-30 |
18| Sample names | Every bare name in a sample binds, at any depth: `\|= [a=@ b]` binds `a` and `b` | Decided 2026-10-30 |
19| Sample names | Every bare name in a sample binds, at any depth: `\|= [a=@ b]` binds `a` and `b` | Decided 2026-10-30 |
19| 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 |
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+| 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 |
20| 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 |
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 |
21| Open groups | A `(` alone at line end puts the call's head on the first deeper line | Decided 2026-10-30 |
23| Open groups | A `(` alone at line end puts the call's head on the first deeper line | Decided 2026-10-30 |
22| 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 |
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 |
23| Jibb code blocks | Labelled `jibb` in this doc; each is a golden test | Decided 2026-10-30 |
25| Jibb code blocks | Labelled `jibb` in this doc; each is a golden test | Decided 2026-10-30 |
24| Definitions | `++` for values, `+$` for molds; no `=/` | Decided |
26| Definitions | `++` for values, `+$` for molds; no `=/` | Decided |
25| 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; cases differ as nouns; a tag literal or `~` waits for its union, and an unresolved one is an error | Decided 2026-10-30 |
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; cases differ as nouns; a tag literal or `~` waits for its union, and an unresolved one is an error | Decided 2026-10-30 |
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+| Printed gate-free constraints | Print the type followed by `where A contains no gates`, as `$-([A A] ?) where A contains no gates` | Decided 2026-10-30 |
26| Branching | `?-` only, loobeans included; exhaustive, with explicit catch-alls; covered arms are errors; failures say `!!` | Decided 2026-10-29 |
30| Branching | `?-` only, loobeans included; exhaustive, with explicit catch-alls; covered arms are errors; failures say `!!` | Decided 2026-10-29 |
27−| Equality and negation | The gates `eq` and `not` | Decided |
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 |
28| Special rules | No built-ins; type-directed rules are welcome, each listed in the Grammar tab | Decided 2026-10-29 |
32| Special rules | No built-ins; type-directed rules are welcome, each listed in the Grammar tab | Decided 2026-10-29 |
29−| Inference | Hindley–Milner with aura variables; a bare `@` in a `+$` is one per module, `@ud` if unfixed, and elsewhere each is its own, generalized per `++`; a number takes `@ud` only where its `++` isn't generic over its aura; different auras never unify; faces are part of record types; principal types | Decided 2026-10-30 |
33+| Inference | Hindley–Milner with aura variables; a bare `@` in a `+$` is one per module, `@ud` if unfixed, and elsewhere each is its own, generalized per `++`; a number takes `@ud` only where its `++` isn't generic over its aura; different auras never unify; 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 |
30| Effects | The library unions `cmd` and `sub`; pokes and requests are opaque, from derived gates and `pure`; 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-29 |
34| Effects | The library unions `cmd` and `sub`; pokes and requests are opaque, from derived gates and `pure`; 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-29 |
31−| 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; typed segments by aura | Decided 2026-10-29 |
35+| 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 watching such a request has a type error; typed segments by aura | Decided 2026-10-30 |
32| Mark names | Any name: `/%` names types after marks, and constructors poke with their type's mark; no alias marks | Decided 2026-10-26 |
36| Mark names | Any name: `/%` names types after marks, and constructors poke with their type's mark; no alias marks | Decided 2026-10-26 |
33−| 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 | Decided 2026-10-29 |
37+| 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 |
34| Hoon types | A fixed translation table; `map`, `set`, `qeu`, `jar`, `jug` by name; `mop` as `(mop K V)`, read with `on`; unused molds skipped | Decided 2026-10-29 |
38| Hoon types | A fixed translation table; `map`, `set`, `qeu`, `jar`, `jug` by name; `mop` as `(mop K V)`, read with `on`; unused molds skipped | Decided 2026-10-29 |
35| Layout | Indentation; juxtaposed calls; a bracket open at line end takes one item per line, with no closer | Decided |
39| Layout | Indentation; juxtaposed calls; a bracket open at line end takes one item per line, with no closer | Decided |
36| 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 |
40| 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 |
37| Long calls | One argument per line inside parentheses | Decided |
41| Long calls | One argument per line inside parentheses | Decided |
38| 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 |
42| 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 |
39| Empty mold | `!!`, with no values; the expression has any type; pages are `(element !!)`, which keeps islands out of islands | Decided 2026-10-29 |
43| Empty mold | `!!`, with no values; the expression has any type; pages are `(element !!)`, which keeps islands out of islands | Decided 2026-10-29 |
44+| 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 |
40−| Type variables | Capitals, generalized per `++`; one that meets an atom becomes an aura variable, and nothing more specific | Decided 2026-10-30 |
45+| Type variables | Capitals, generalized per `++`; a capital in a local `++` shares the enclosing `++`'s variable of that name, and a different type takes a different capital; one that meets an atom becomes an aura variable, and nothing more specific | Decided 2026-10-30 |
41| Loobean mold | `?`, switched with `?-` | Decided 2026-10-26 |
46| Loobean mold | `?`, switched with `?-` | Decided 2026-10-26 |
42| Defaults | None | Decided |
47| Defaults | None | Decided |
43| Modules | Records, not cores | Decided |
48| Modules | Records, not cores | Decided |
@@ -62,16 +67,16 @@ The choices behind the Language tab, made on 2026-10-23; a later date marks a re
62| 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 |
67| 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 |
63| Transactions | None; one poke per command | Decided |
68| Transactions | None; one poke per command | Decided |
64| Reloads | Restart from the model the page is served with | Decided 2026-10-29 |
69| Reloads | Restart from the model the page is served with | Decided 2026-10-29 |
65−| Shared state | Stores: browser agents written like API files, with `state`, `+$ poke` and `(store init update)`; poked and watched through derived gates; one per page | Decided 2026-10-29 |
70+| 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; poked and watched through derived gates; one per page | Decided 2026-10-30 |
66| 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 |
71| 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 |
67| 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 |
72| 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 |
68| 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 |
73| 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 |
69| Responsive layout | `stack` switches at the theme's `wide` | Decided 2026-10-29 |
74| Responsive layout | `stack` switches at the theme's `wide` | Decided 2026-10-29 |
70| 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 |
75| 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 |
71| Dark mode | Hand-written dark tones under `dark`, used when the reader prefers dark | Decided 2026-10-27 |
76| Dark mode | Hand-written dark tones under `dark`, used when the reader prefers dark | Decided 2026-10-27 |
72−| 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; `link`, `image` and `go` also take unchecked `https`, `mailto` and `tel` URLs and root-relative cords such as `"/apps/groups"`; other cords render as text; a CSP on every page | Decided 2026-10-29 |
77+| 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 |
73| Data layer | Hoon's nouns: units, treaps, loobeans | Decided |
78| Data layer | Hoon's nouns: units, treaps, loobeans | Decided |
74−| Prelude | Hoon's standard library regrouped: 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; bits and hashing as natives; no signed, float or parser gates, and signed or float auras are errors | Decided 2026-10-29 |
79+| Prelude | Hoon's standard library regrouped: all names from the listed sections except explicitly excluded groups, including 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; no signed, float or parser gates except `slav` and `slaw`, and signed or float auras are errors | Decided 2026-10-30 |
75| Wire format | Noun channels; Jibb's own noun codec in the browser | Decided 2026-10-29 |
80| Wire format | Noun channels; Jibb's own noun codec in the browser | Decided 2026-10-29 |
76| 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 |
81| 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 |
77| Private pages | Served by the host per request and never cached; non-owners go to the login page | Decided 2026-10-29 |
82| Private pages | Served by the host per request and never cached; non-owners go to the login page | Decided 2026-10-29 |
docs/spec/grammar.md+12−10
@@ -30,7 +30,7 @@ The syntax the compiler accepts.
30| Loobean | `%.y`, `%.n` | `?` |
30| Loobean | `%.y`, `%.n` | `?` |
31| Null | `~` | A constant: the `~` case of any union with one, such as `(unit A)`, `(list A)`, `(map K V)` or `(set A)` |
31| Null | `~` | A constant: the `~` case of any union with one, such as `(unit A)`, `(list A)`, `(map K V)` or `(set A)` |
32| Unit | `` `x `` | `(unit A)` |
32| Unit | `` `x `` | `(unit A)` |
33−| Cell | `[a b c]`, `[text="milk" done=%.n]` | A tuple; a record when faced; a cons where a list is expected |
33+| Cell | `[a b c]`, `[text="milk" done=%.n]` | A tuple; a record when faced; a cons where a list is expected. `[a]` is `a`; `[]` is an error |
34| List | `~[1 2 3]` | `(list A)` |
34| List | `~[1 2 3]` | `(list A)` |
35| Term-headed pair | `gap+%s2` | `[%gap %s2]`, any operand after the `+` |
35| Term-headed pair | `gap+%s2` | `[%gap %s2]`, any operand after the `+` |
36| Path | `/posts/~zod` | `path` |
36| Path | `/posts/~zod` | `path` |
@@ -42,7 +42,7 @@ Every literal reads exactly as Hoon reads it: `1000` is an error (write `1.000`)
42
42
43- **Call**: `f a b`; parentheses only group. A call open in parentheses puts its head and first arguments on the first line, then one argument per indented line; a `(` alone at the end of a line puts the head on the first indented line.
43- **Call**: `f a b`; parentheses only group. A call open in parentheses puts its head and first arguments on the first line, then one argument per indented line; a `(` alone at the end of a line puts the head on the first indented line.
44- **Lists**: `~[a b c]`, or `~[` at line end with one item per line. On one line, whitespace separates items, so calls need parentheses: `~[(text "hi")]`, which the checker suggests for `~[text "hi"]`. On indented lines, each line is an item.
44- **Lists**: `~[a b c]`, or `~[` at line end with one item per line. On one line, whitespace separates items, so calls need parentheses: `~[(text "hi")]`, which the checker suggests for `~[text "hi"]`. On indented lines, each line is an item.
45−- **Faced cells**: `[text="milk" done=%.n]`, or one `name=value` per line of an open bracket. A change takes the same items, as `m(done=%.y)`.
45+- **Faced cells**: `[text="milk" done=%.n]`, or one `name=value` per line of an open bracket. A change takes one or more of the same items, as `m(done=%.y)`; `m()` is an error.
46- **Pairs and units**: `gap+%s2` and `` `x `` bind tighter than calls, so `pad+%s3 gap+%s2` is two items.
46- **Pairs and units**: `gap+%s2` and `` `x `` bind tighter than calls, so `pad+%s3 gap+%s2` is two items.
47- **Wing** `title.p`, also for imports and prelude groups, which are records: `card.card`, `space.theme.theme`, `get.by`. **Change** `m(draft="x" error=~)`.
47- **Wing** `title.p`, also for imports and prelude groups, which are records: `card.card`, `space.theme.theme`, `get.by`. **Change** `m(draft="x" error=~)`.
48- **Inline gate**: `|=(p=post.blog title.p)`, or `|=(p title.p)` when the call fixes the type. A bare name in a sample always binds. `|=%got` is case `%got`'s constructor, typed by the gate expected. A bare name binds at any depth of a sample, so `|= [a=@ b]` binds `a` and `b`.
48- **Inline gate**: `|=(p=post.blog title.p)`, or `|=(p title.p)` when the call fixes the type. A bare name in a sample always binds. `|=%got` is case `%got`'s constructor, typed by the gate expected. A bare name binds at any depth of a sample, so `|= [a=@ b]` binds `a` and `b`.
@@ -53,7 +53,7 @@ Every literal reads exactly as Hoon reads it: `1000` is an error (write `1.000`)
53
53
54A rune's first children sit on its line, the last taking the rest of it; the others follow, indented.
54A rune's first children sit on its line, the last taking the rest of it; the others follow, indented.
55
55
56−- `++` **luslus**: defines a value, at top level or as 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. Gates may call themselves and their siblings; other values can't refer to themselves, so `++ title (trim title)` is an error.
56+- `++` **luslus**: defines a value, at top level or as 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. Gates may call themselves and their siblings; other values can't depend on themselves, even through a gate, so `++ title (trim title)` is an error.
57- `+$` **lusbuc**: defines a mold, likewise: on its line, or as cases on the lines below, one per line, where several cases make a union and one is just that mold. Molds may be recursive.
57- `+$` **lusbuc**: defines a mold, likewise: on its line, or as cases on the lines below, one per line, where several cases make a union and one is just that mold. Molds may be recursive.
58- `|=` **bartis**: a gate with a faced sample, `m=model`, `=msg` (`msg=msg`) or `[a=@ b=@]`; the body on the same line or below.
58- `|=` **bartis**: a gate with a faced sample, `m=model`, `=msg` (`msg=msg`) or `[a=@ b=@]`; the body on the same line or below.
59- `?-` **wuthep**: the only branch, exhaustive; the subject on its line, then arms of a pattern and an expression or body. Conditions switch on `%.y` and `%.n`.
59- `?-` **wuthep**: the only branch, exhaustive; the subject on its line, then arms of a pattern and an expression or body. Conditions switch on `%.y` and `%.n`.
@@ -101,8 +101,8 @@ A file is a module: imports, then definitions.
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 and its constructor, `todos.todo` a mold and a request.
102- Molds and values have separate namespaces, told apart by position: `todo-action.todo` is a mold 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`. Only the prelude has private names.
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 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 …)`. A store exports a constructor per `poke` type and a `state` request. Clashing derived names are errors.
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 that watches a request whose case has a separate `scry=` path has 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
@@ -122,23 +122,25 @@ A mold is only a type: never called on a noun, and with no default. Types are in
122
122
123- **Atoms**: `@` and auras such as `@ud`, `@t`, `@p`, `@da`; `?` is a loobean. `@` is an atom whose aura isn't known yet, fixed by what it meets: `add` takes `[@ @]` and returns `@`, all one aura, so `(add n 1)` with `n=@ud` is a `@ud`. Different auras never unify. A bare `@` in a `+$` is one aura variable per module, `@ud` if unfixed. Elsewhere, as in a gate's sample or a cast, each bare `@` is its own aura variable, generalized per `++` if nothing fixes it; atoms that must share an aura take one capital, as `[lo=A hi=A]`.
123- **Atoms**: `@` and auras such as `@ud`, `@t`, `@p`, `@da`; `?` is a loobean. `@` is an atom whose aura isn't known yet, fixed by what it meets: `add` takes `[@ @]` and returns `@`, all one aura, so `(add n 1)` with `n=@ud` is a `@ud`. Different auras never unify. A bare `@` in a `+$` is one aura variable per module, `@ud` if unfixed. Elsewhere, as in a gate's sample or a cast, each bare `@` is its own aura variable, generalized per `++` if nothing fixes it; atoms that must share an aura take one capital, as `[lo=A hi=A]`.
124- **Constants**: `%add`, `~` and the loobeans have one value each.
124- **Constants**: `%add`, `~` and the loobeans have one value each.
125−- **Records and tuples**: `[text=@t done=?]`, `[@t ?]`. Faces are part of the type, so `[a=@ b=@]` and `[x=@ y=@]` don't unify. A record too long for one line can leave its `[` open, with one field per deeper line, as an expression's bracket does.
125+- **Records and tuples**: `[text=@t done=?]`, `[@t ?]`. An empty `[]` is an error. Faces are part of the type, so `[a=@ b=@]` and `[x=@ y=@]` don't unify. An unnamed position can unify with a faced position and take its face, so `[0 0]` fits `[x=@ud y=@ud]`; two different faces don't unify. A record too long for one line can leave its `[` open, with one field per deeper line, as an expression's bracket does.
126- **Unions**: a `+$` with several cases below it. Every union written in Jibb has a name, so one used in a field, a sample, a cast, a gate's mold or an argument gets its own `+$`; only imports bring in unions without one. Tags take their union from context, as Tag resolution describes. Cases must differ as nouns: at some position of their right-nested cells, one is an atom and the other a cell, or both are different constants. `*`, type variables and molds that can be either, such as `(list A)` or `?`, overlap both. A union whose cases don't all differ is rejected.
126- **Unions**: a `+$` with several cases below it. Every union written in Jibb has a name, so one used in a field, a sample, a cast, a gate's mold or an argument gets its own `+$`; only imports bring in unions without one. Tags take their union from context, as Tag resolution describes. Cases must differ as nouns: at some position of their right-nested cells, one is an atom and the other a cell, or both are different constants. `*`, type variables and molds that can be either, such as `(list A)` or `?`, overlap both. A union whose cases don't all differ is rejected.
127- **Containers**: `(list A)`, `(unit A)`, `(set A)`, `(map K V)`, `(mop K V)`, `(qeu A)`, `(jar K V)`, `(jug K V)`.
127- **Containers**: `(list A)`, `(unit A)`, `(set A)`, `(map K V)`, `(mop K V)`, `(qeu A)`, `(jar K V)`, `(jug K V)`.
128−- **Gates**: `$-(A B)`. Type variables are capitals, generalized per `++`. A type variable that meets an atom becomes an aura variable, so `++ clamp |= [lo=A hi=A n=A]`, whose body calls `gth` and `max`, works on any one aura. It can become nothing more specific: a body that makes `A` a `@ud` or a list is an error.
128+- **Gates**: `$-(A B)`. Type variables are capitals, generalized per `++`. A capital in a local `++` shares the enclosing `++`'s variable of the same name; use another capital for a different type. A type variable that meets an atom becomes an aura variable, so `++ clamp |= [lo=A hi=A n=A]`, whose body calls `gth` and `max`, works on any one aura. It can become nothing more specific: a body that makes `A` a `@ud` or a list is an error.
129- **Paths**: `/todos` is constant, `/` empty, and `/todo/[id=@ud]` typed by aura. `%/blog/(slug)` is an `qath`, checked against routes and static files.
129- **Paths**: `/todos` is constant, `/` empty, and `/todo/[id=@ud]` typed by aura. `%/blog/(slug)` is an `qath`, checked against routes and static files.
130- **Generic molds**: `+$ result |$ [V E]` with cases below; `|$` goes only right after a `+$`'s name.
130- **Generic molds**: `+$ result |$ [V E]` with cases below; `|$` goes only right after a `+$`'s name.
131−- **Any noun**: `*`. **Empty**: `!!`.
131+- **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- **Opaque**: `poke`, `ask` and `qath`, built only by derived gates, `pure` and application-path literals. `(facts full diff …)` appears only in an API file's `paths`.
132- **Opaque**: `poke`, `ask` and `qath`, built only by derived gates, `pure` and application-path literals. `(facts full diff …)` appears only in an API file's `paths`.
133- **Identity**: recursive molds go by name and module.
133- **Identity**: recursive molds go by name and module.
134
134
135+`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`. Union-case matching treats gates as opaque and never inspects a gate to distinguish cases.
136+
135## Tag resolution
137## Tag resolution
136
138
137A tag literal or `~` gets a fresh type variable and a pending constraint: the variable must become a union with a matching case, or an atom type the term fits. A mold that isn't a union counts as a union of one case, for tags and for `|=%tag`: `[%go "x"]` fits `+$ go [%go url=@t]`, and `|=%typed` works against `$-(@t M)` when `M` is `[%typed text=@t]`. Once unification fixes the variable, each constraint is checked against the union's cases or, for `@tas`, `@ta`, `@` or `*`, makes the tag that constant atom. A literal that matches nothing is an error naming the union, such as "msg has no case %submitt".
139A tag literal or `~` gets a fresh type variable and a pending constraint: the variable must become a union with a matching case, or an atom type the term fits. A mold that isn't a union counts as a union of one case, for tags and for `|=%tag`: `[%go "x"]` fits `+$ go [%go url=@t]`, and `|=%typed` works against `$-(@t M)` when `M` is `[%typed text=@t]`. Once unification fixes the variable, each constraint is checked against the union's cases or, for `@tas`, `@ta`, `@` or `*`, makes the tag that constant atom. A literal that matches nothing is an error naming the union, such as "msg has no case %submitt".
138
140
139- A constraint records the literal's shape, such as `[@t %draft]`, and matches cases by shape and shared tag positions; a literal in a field position is checked against that field.
141- A constraint records the literal's shape, such as `[@t %draft]`, and matches cases by shape and shared tag positions; a literal in a field position is checked against that field.
140- `|=%typed` is a case's constructor: against `$-(@t M)` it is `|=(t [%typed t])`, requiring `M` to have a case `[%typed @t]`. It works for cases tagged at their head; a bare tag is always a value.
142- `|=%typed` is a case's constructor: against `$-(@t M)` it is `|=(t [%typed t])`, requiring `M` to have a case `[%typed @t]`. It works for cases tagged at their head; a bare tag is always a value.
141−- A constrained variable, and any it mentions, doesn't generalize; it stays open until something in the module fixes it. An island's `main` fixes its messages, so islands resolve their own tags.
143+- A variable constrained by tag resolution, and any it mentions, doesn't generalize; it stays open until something in the module fixes it. An island's `main` fixes its messages, so islands resolve their own tags. The inferred gate-free constraint is retained when a type variable is generalized.
142- A constraint still open when its module is checked is an error asking for a `^-`; the checker never guesses. Library helpers can cast, as in `^- (list attr)`.
144- A constraint still open when its module is checked is an error asking for a `^-`; the checker never guesses. Library helpers can cast, as in `^- (list attr)`.
143- Wing access, changes and `?-` on a type not yet known wait the same way.
145- Wing access, changes and `?-` on a type not yet known wait the same way.
144- Patterns need none of this; they're checked against the subject's type.
146- Patterns need none of this; they're checked against the subject's type.
@@ -238,7 +240,7 @@ operand = literal | qath | ref | change | pair | unit | group | list | tuple
238 | gate | ctor | pathlit | "!!" ;
240 | gate | ctor | pathlit | "!!" ;
239ref = wing ;
241ref = wing ;
240wing = name { "." name } ;
242wing = name { "." name } ;
241−change = wing "(" { item } ")" | wing "(" { item } open ; (* no space before "("; items named *)
243+change = wing "(" item { item } ")" | wing "(" { item } open ; (* no space before "("; items named *)
242pair = name "+" operand ; (* [%name operand] *)
244pair = name "+" operand ; (* [%name operand] *)
243unit = "`" operand ; (* [~ operand] *)
245unit = "`" operand ; (* [~ operand] *)
244group = "(" expr ")" | "(" { operand } open ;
246group = "(" expr ")" | "(" { operand } open ;
docs/spec/implementation-plan.md−1
@@ -96,7 +96,6 @@ For milestone 6. An island is one loop over one model: events become messages, `
96
96
97| Question | Needed by |
97| Question | Needed by |
98| --- | --- |
98| --- | --- |
99−| Are the three proposed core-language rules adopted: gate-free `eq` arguments and map keys, natives that take gates, and no value that depends on itself through a gate? | Milestones 2 and 3 |
100| What is the typography scale for heading levels and the `role` values? | Milestone 4 |
99| What is the typography scale for heading levels and the `role` values? | Milestone 4 |
101| Does the Eyre channel CSRF test reproduce on a fake ship? @iko has the write-up; if it does, it goes to Urbit privately. | Milestone 4 |
100| Does the Eyre channel CSRF test reproduce on a fake ship? @iko has the write-up; if it does, it goes to Urbit privately. | Milestone 4 |
102| What is the benchmark's bar? Proposed: a keystroke in a 500-row list island renders within one 16 ms frame on a mid-range phone. | Milestone 6 |
101| What is the benchmark's bar? Proposed: a keystroke in a 500-row list island renders within one 16 ms frame on a mid-range phone. | Milestone 6 |
docs/spec/overview.md+13−13
@@ -74,11 +74,11 @@ Hoon's runes and literals in an indentation layout, over Hoon's nouns and molds,
74| Recursive molds, such as `json` | Recursive, matched by name |
74| Recursive molds, such as `json` | Recursive, matched by name |
75| Cores, gates, vases, signed and float auras | An error where used |
75| Cores, gates, vases, signed and float auras | An error where used |
76
76
77−Unused molds are skipped, so unsupported constructs elsewhere in a `/sur` file are fine. A union without a name, as a field's `?(%approve %deny)`, imports too, though Jibb can't write one.
77+Unused molds are skipped, so unsupported constructs elsewhere in a `/sur` file are fine. A union without a name, as a field's `?(%approve %deny)`, imports too, though Jibb can't write one. Messages and printed types show its cases separated by spaces, as `%approve %deny`; this notation is print-only.
78
78
79## Prelude
79## Prelude
80
80
81−Hoon's standard library regrouped, written in Jibb and vendored as `/lib/jibb/prelude`; an island's bundle carries only what it uses. Only the prelude declares natives, Jibb's jets, and private helpers; Jibb-written gates run unjetted on the ship; *proposed*: list gates such as `turn` become natives that take gates (Core language). It also holds `eq`, `not`, `page`, `program`, `store`, `pure`, `island`, and the layout elements and molds.
81+Hoon's standard library regrouped, written in Jibb and vendored as `/lib/jibb/prelude`; an island's bundle carries only what it uses. The exported inventory includes all names from the Hoon library sections listed below, excluding the groups explicitly left out. Jetted prelude functions have working Jibb implementations; the compiler recognizes their shapes and uses the Hoon versions so jets can fire. They may take gates as arguments (Core language). Private helpers and low-level primitives live in a separate internal prelude module, imported without exposing them; foundational public gates are implemented in Jibb on top of those primitives. The prelude also holds `eq`, `not`, `page`, `program`, `store`, `pure`, `island`, and the layout elements and molds.
82
82
83| Group | Hoon | Jibb |
83| Group | Hoon | Jibb |
84| --- | --- | --- |
84| --- | --- | --- |
@@ -91,10 +91,10 @@ Hoon's standard library regrouped, written in Jibb and vendored as `/lib/jibb/pr
91| Atom printing | [4a](https://docs.urbit.org/hoon/stdlib/4a), [4j](https://docs.urbit.org/hoon/stdlib/4j)–[4m](https://docs.urbit.org/hoon/stdlib/4m) | `scot`, `scow`, `slav`, `slaw`. `print-date` prints Urbit-style in the theme's zone, to the minute, as `~2026.10.29..14.30`, from a zone table jibb-dev keeps current. Numbers print as Hoon does, as `1.000` |
91| Atom printing | [4a](https://docs.urbit.org/hoon/stdlib/4a), [4j](https://docs.urbit.org/hoon/stdlib/4j)–[4m](https://docs.urbit.org/hoon/stdlib/4m) | `scot`, `scow`, `slav`, `slaw`. `print-date` prints Urbit-style in the theme's zone, to the minute, as `~2026.10.29..14.30`, from a zone table jibb-dev keeps current. Numbers print as Hoon does, as `1.000` |
92| Time | [3c](https://docs.urbit.org/hoon/stdlib/3c) | `yore`, `year` |
92| Time | [3c](https://docs.urbit.org/hoon/stdlib/3c) | `yore`, `year` |
93| Data molds | [1c](https://docs.urbit.org/hoon/stdlib/1c), [2q](https://docs.urbit.org/hoon/stdlib/2q), `coin` and `dime` from [3g](https://docs.urbit.org/hoon/stdlib/3g) | `unit`, `list`, `pair`, `tape`, `path` and the rest |
93| Data molds | [1c](https://docs.urbit.org/hoon/stdlib/1c), [2q](https://docs.urbit.org/hoon/stdlib/2q), `coin` and `dime` from [3g](https://docs.urbit.org/hoon/stdlib/3g) | `unit`, `list`, `pair`, `tape`, `path` and the rest |
94−| Bits | [2c](https://docs.urbit.org/hoon/stdlib/2c), [2d](https://docs.urbit.org/hoon/stdlib/2d) | Natives; `met`, `cut`, `rap`, `rip` exposed. Jibb's `not` negates a loobean |
94+| Bits | [2c](https://docs.urbit.org/hoon/stdlib/2c), [2d](https://docs.urbit.org/hoon/stdlib/2d) | Jibb's `not` negates a loobean; Hoon's bitwise `not` is exposed as `not.bit` |
95| Hashing and ordering | [2e](https://docs.urbit.org/hoon/stdlib/2e), [2f](https://docs.urbit.org/hoon/stdlib/2f) | Natives behind maps and sets; `aor` exposed |
95| Hashing and ordering | [2e](https://docs.urbit.org/hoon/stdlib/2e), [2f](https://docs.urbit.org/hoon/stdlib/2f) | Natives behind maps and sets; `aor` exposed |
96| Signed and floats | [3a](https://docs.urbit.org/hoon/stdlib/3a), [3b](https://docs.urbit.org/hoon/stdlib/3b) | Left out; `@s…` and `@r…` auras are errors, imported ones included |
96| Signed and floats | [3a](https://docs.urbit.org/hoon/stdlib/3a), [3b](https://docs.urbit.org/hoon/stdlib/3b) | Left out; `@s…` and `@r…` auras are errors, imported ones included |
97−| Parsers | [4d](https://docs.urbit.org/hoon/stdlib/4d)–[4i](https://docs.urbit.org/hoon/stdlib/4i) | Left out |
97+| Parsers | [4d](https://docs.urbit.org/hoon/stdlib/4d)–[4i](https://docs.urbit.org/hoon/stdlib/4i), parser helpers in 4j and 4l | Left out, except the explicitly listed `slav` and `slaw` |
98| The rest | [1b](https://docs.urbit.org/hoon/stdlib/1b), [2p](https://docs.urbit.org/hoon/stdlib/2p), [3d](https://docs.urbit.org/hoon/stdlib/3d), [3f](https://docs.urbit.org/hoon/stdlib/3f), [4c](https://docs.urbit.org/hoon/stdlib/4c), [4n](https://docs.urbit.org/hoon/stdlib/4n), [4o](https://docs.urbit.org/hoon/stdlib/4o), [5a](https://docs.urbit.org/hoon/stdlib/5a)–[5f](https://docs.urbit.org/hoon/stdlib/5f) | Left out; `jam`, `cue` and `fein` run inside the runtime |
98| The rest | [1b](https://docs.urbit.org/hoon/stdlib/1b), [2p](https://docs.urbit.org/hoon/stdlib/2p), [3d](https://docs.urbit.org/hoon/stdlib/3d), [3f](https://docs.urbit.org/hoon/stdlib/3f), [4c](https://docs.urbit.org/hoon/stdlib/4c), [4n](https://docs.urbit.org/hoon/stdlib/4n), [4o](https://docs.urbit.org/hoon/stdlib/4o), [5a](https://docs.urbit.org/hoon/stdlib/5a)–[5f](https://docs.urbit.org/hoon/stdlib/5f) | Left out; `jam`, `cue` and `fein` run inside the runtime |
99
99
100Maps are Hoon's trees on both sides, so equal maps are equal nouns. Requests check incoming maps and sets with `apt`.
100Maps are Hoon's trees on both sides, so equal maps are equal nouns. Requests check incoming maps and sets with `apt`.
@@ -152,7 +152,7 @@ Loads and renders run in Nock.
152
152
153- `poke` and `ask` are opaque, built only by derived gates and `pure`. A 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.
153- `poke` and `ask` are opaque, built only by derived gates and `pure`. A 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.
154- 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`.
154- 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`.
155−- Islands read agents only by watching. A watch's first fact must be full state, so islands can't watch paths that need a separate scry path. 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.
155+- 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 runtime acks facts, rewatches after a kick or a dropped connection and reseeds from the first fact; a refused watch shows the crash notice.
156- 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.
156- 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.
157
157
158Inputs send a message per `input` event, and one per IME composition, so validation runs as you type; only commands reach the ship. After every event, controls reset to the latest view, so a toggle whose poke fails unchecks. A field's text is rewritten only when it differs, which keeps the caret. Fields are read-only until their island starts.
158Inputs send a message per `input` event, and one per IME composition, so validation runs as you type; only commands reach the ship. After every event, controls reset to the latest view, so a toggle whose poke fails unchecks. A field's text is rewritten only when it differs, which keeps the caret. Fields are read-only until their island starts.
@@ -161,7 +161,7 @@ Inputs send a message per `input` event, and one per IME composition, so validat
161
161
162- `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.
162- `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.
163- A crash in `update` drops the message, keeps the model and shows the standard notice.
163- A crash in `update` drops the message, keeps the model and shows the standard notice.
164−- 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. 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.
164+- 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.
165- 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.
165- 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.
166- 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.
166- 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.
167
167
@@ -177,10 +177,10 @@ Elements are ordinary gates with their own signatures. Containers take attribute
177| `para` | `kids` | Flowing text |
177| `para` | `kids` | Flowing text |
178| `text` | A cord | Text |
178| `text` | A cord | Text |
179| `heading` | `level words` | `<h1>` to `<h6>` |
179| `heading` | `level words` | `<h1>` to `<h6>` |
180−| `each` | `(list [key=* el=(element M)])` | Keyed children; repeated keys match in order |
180+| `each` | `(list [key=K el=(element M)])` | Keyed children; repeated keys match in order |
181−| `table` | Columns `(list [header=@t width=length align=align])`, rows `(list [key=* cells=(list (element M))])` | A table with keyed rows |
181+| `table` | Columns `(list [header=@t width=length align=align])`, rows `(list [key=K cells=(list (element M))])` | A table with keyed rows |
182−| `image` | `src description`, with `src` an application path to a static image or `[url=@t width=@ud height=@ud]` | Boxed to its aspect ratio before loading, never wider than its container; static images are sized from the file; `""` marks it decorative |
182+| `image`, `image-unsafe` | Application path and description; `[url=@t width=@ud height=@ud]` and description, respectively | Boxed to its aspect ratio before loading, never wider than its container; static images are sized from the file; `""` marks it decorative |
183−| `link` | `url label` | See Links and URLs |
183+| `link`, `link-unsafe` | Application path and label; unchecked cord and label, respectively | See Links and URLs |
184| `button` | `label msg` | A control |
184| `button` | `label msg` | A control |
185| `toggle` | `on label msg` | A control |
185| `toggle` | `on label msg` | A control |
186| `field` | `label value reply` | A control; `reply` turns its text into a message, as `\|=%typed` |
186| `field` | `label value reply` | A control; `reply` turns its text into a message, as `\|=%typed` |
@@ -223,7 +223,7 @@ Style attributes compile to atomic classes in one stylesheet built from the them
223
223
224Both backends escape all text and attributes. In-app links are application paths, `%/blog` or `%/blog/(slug.p)`, checked at compile time against routes and static files; parameters print by aura, and the base path is implicit. They carry no query or fragment, so apps keep their state in the path.
224Both backends escape all text and attributes. In-app links are application paths, `%/blog` or `%/blog/(slug.p)`, checked at compile time against routes and static files; parameters print by aura, and the base path is implicit. They carry no query or fragment, so apps keep their state in the path.
225
225
226−`link`, `image` and `go` also take two kinds of unchecked cord: a root-relative path to another app on the ship, such as `"/apps/groups"`, and an `https`, `mailto` or `tel` URL. A cord starting `//` or `/\` is neither. Any other cord, such as `javascript:`, is drawn as text, and `go` ignores it. External links open in a new tab with `noopener`. Pages send a Content-Security-Policy allowing scripts only from the ship.
226+Links, images and navigation also accept two kinds of unchecked cord, through declarations separate from the application-path forms: a root-relative path to another app on the ship, such as `"/apps/groups"`, and an `https`, `mailto` or `tel` URL. `link-unsafe`, `image-unsafe` and `go-unsafe` are the unchecked forms. Both navigation declarations produce the `[%go url=@t]` command; `go` converts the application path to a cord, including the app's base path. A cord starting `//` or `/\` is neither. Any other cord, such as `javascript:`, is drawn as text, and `go` ignores it. External links open in a new tab with `noopener`. Pages send a Content-Security-Policy allowing scripts only from the ship.
227
227
228## Stages
228## Stages
229
229
@@ -293,7 +293,7 @@ Each agent Jibb talks to has `/ui/api/<agent>.jibb`, declaring its pokes in `+$
293+$ paths
293+$ paths
294 [%todos /todos todos]
294 [%todos /todos todos]
295 [%changes /changes (facts todos todo-update)]
295 [%changes /changes (facts todos todo-update)]
296− [%todo /todo/[id=@ud] todo-item]
296+ [%todo-by-id /todo/[id=@ud] todo-item]
297```
297```
298
298
299A path case is a request name, a path and a type. A plain mold is full state, which a watch's first fact must carry. `(facts full diff …)` adds diffs, told apart by mark, and its request takes a fold, here `$-([[%todo-update todo-update] todos] todos)`. Pages scry the path, so the agent must answer a peek there. A case can name another scry path, as in `[%changes /updates (facts todos todo-update) scry=/todos]`, used only by pages.
299A path case is a request name, a path and a type. A plain mold is full state, which a watch's first fact must carry. `(facts full diff …)` adds diffs, told apart by mark, and its request takes a fold, here `$-([[%todo-update todo-update] todos] todos)`. Pages scry the path, so the agent must answer a peek there. A case can name another scry path, as in `[%changes /updates (facts todos todo-update) scry=/todos]`, used only by pages.
@@ -330,7 +330,7 @@ Pages route by their path under `/ui`; islands, stores and libraries are only im
330- Parameters bind to `load`'s sample by name, which must have exactly those fields; a catch-all's is a `path`.
330- Parameters bind to `load`'s sample by name, which must have exactly those fields; a catch-all's is a `path`.
331- `/apps/my-app/~jibb/` and `/apps/my-app/static/` belong to the host.
331- `/apps/my-app/~jibb/` and `/apps/my-app/static/` belong to the host.
332
332
333−Typed segments share one notation across routes, application paths and agent paths. `@ta` and `@tas` are raw text, checked as knots, as `/blog/my-post`; other auras print and parse as Hoon does, so `@ud` is `1.000`. The host splits the raw URL, so dots stay inside segments; a segment that doesn't parse is a 404. `%/todo/(id)` and `[%todo /todo/[id=@ud] todo-item]` print the same way.
333+Typed segments share one notation across routes, application paths and agent paths. `@ta` and `@tas` are raw text, checked as knots, as `/blog/my-post`; other auras print and parse as Hoon does, so `@ud` is `1.000`. The host splits the raw URL, so dots stay inside segments; a segment that doesn't parse is a 404. `%/todo/(id)` and `[%todo-by-id /todo/[id=@ud] todo-item]` print the same way.
334
334
335### Desk layout
335### Desk layout
336
336
docs/status.md+13−8
@@ -1,11 +1,11 @@
1# Status
1# Status
2
2
3−As of 2026-10-30, at commit ab797a9. 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-30. 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| --- | --- | --- |
7| 1 | Parser and mark | Done (7c739b7; the doc's grammar decisions of 2026-10-30 in ab797a9) |
7| 1 | Parser and mark | Done (7c739b7; the doc's grammar decisions of 2026-10-30 in ab797a9) |
8−| 2 | Types and prelude | Next. [prompts/milestone-2.md](prompts/milestone-2.md) briefs the developer |
8+| 2 | Types and prelude | In progress. [prompts/milestone-2.md](prompts/milestone-2.md) briefs the developer; the checker and importer are partial |
9| 3 | Core language | Not started |
9| 3 | Core language | Not started |
10| 4 | Host and static pages: the first release | Not started |
10| 4 | Host and static pages: the first release | Not started |
11| 5 | Published pages | Not started |
11| 5 | Published pages | Not started |
@@ -17,6 +17,10 @@ The plan sets no dates: "agree them after milestone 1, once it shows how fast th
17
17
18On 2026-10-30, @iko decided that Jibb drops `$?`, so a `+$` takes a union's cases on the lines below its name. [prompts/drop-union-rune.md](prompts/drop-union-rune.md) records the change before milestone 2. The repository spec records the decision; the Claude document still needs to be synchronized.
18On 2026-10-30, @iko decided that Jibb drops `$?`, so a `+$` takes a union's cases on the lines below its name. [prompts/drop-union-rune.md](prompts/drop-union-rune.md) records the change before milestone 2. The repository spec records the decision; the Claude document still needs to be synchronized.
19
19
20+## Milestone 2: in progress
21+
22+The repository spec records the subsequent type-system and prelude decisions; those changes also need synchronization to the Claude document. An initial inference fragment and a standalone Hoon type reader are being tested. The fragment explicitly reports that it does not check a module; the reader is not yet connected to the checker and does not cover every supported Hoon type. The prelude currently has only a few functions, and [prelude-inventory.md](prelude-inventory.md) is a source audit, not the complete inventory or signatures. The milestone remains unfinished.
23+
20## Milestone 1: parser and mark
24## Milestone 1: parser and mark
21
25
22What the plan asks for, and where it is:
26What the plan asks for, and where it is:
@@ -33,9 +37,9 @@ What the plan asks for, and where it is:
33
37
34Besides the plan's list:
38Besides the plan's list:
35
39
36−- 368 golden cases: 153 that parse and 215 that fail, each failure at a stated line and column. One failing case has an unclear expectation (corpus question 3). Each case's `about.txt` quotes the doc's words it tests.
40+- 382 golden cases: 167 that parse and 215 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.
37−- They pass under `urbit eval` (`tools/golden`, about 9 s for the corpus) and as `-test` arms on the fake ship (`tools/ship test`).
41+- The 382-case corpus passed under `urbit eval` in 26.0 s. On the fake ship, those cases and the importer and unification checks passed: 384 tests in all, with 44.2 s for sync and 15.5 s for the tests.
38−- `tools/testdata/selftest` (18 checks) and `tools/testdata/ship-selftest` test the tools themselves.
42+- `tools/testdata/selftest` (19 checks) and `tools/testdata/ship-selftest` test the tools themselves.
39- 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.
43- 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.
40- 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).
44- 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).
41
45
@@ -56,13 +60,14 @@ Besides the plan's list:
56On a machine set up as [development.md](development.md) says:
60On a machine set up as [development.md](development.md) says:
57
61
58```
62```
59−tools/golden # 368 cases under urbit eval
63+tools/golden # 382 cases under urbit eval
64+tools/importer-test # the Hoon importer fixture projection
60tools/hoon check-spans-test # prints <<>> when the span checker works
65tools/hoon check-spans-test # prints <<>> when the span checker works
61tools/testdata/selftest # the tools themselves
66tools/testdata/selftest # the tools themselves
62tools/doc-blocks docs/spec # the doc's examples are golden cases
67tools/doc-blocks docs/spec # the doc's examples are golden cases
63tools/ship start
68tools/ship start
64tools/ship gen-tests --check # tests/lib/jibb.hoon is up to date
69tools/ship gen-tests --check # tests/lib/jibb.hoon is up to date
65−tools/ship test # the same 368 cases as -test arms on the ship
70+tools/ship test # the same 382 cases as -test arms on the ship
66tools/testdata/ship-selftest
71tools/testdata/ship-selftest
67tools/ship check-commit # |commit stores .jibb files
72tools/ship check-commit # |commit stores .jibb files
68```
73```
@@ -70,5 +75,5 @@ tools/ship check-commit # |commit stores .jibb files
70## What milestone 1 leaves to later milestones
75## What milestone 1 leaves to later milestones
71
76
72- Errors carry a start only. Spans keep each node's end so that milestone 2's type errors can underline both conflicting sites with excerpts (library section 1).
77- Errors carry a start only. Spans keep each node's end so that milestone 2's type errors can underline both conflicting sites with excerpts (library section 1).
73−- The parser accepts what only the checker can judge: `[]` and `[a]`, `m()`, `!! a`, and the module kinds. The Grammar's buttons example parses, though the doc marks it as a type error.
78+- The parser accepts forms for the checker to judge: `[]`, `[a]`, `m()`, `!! a`, and the module kinds. `[]` and `m()` have since been decided to be errors, and `[a]` is `a`; the parser has not changed. The Grammar's buttons example parses, though the doc marks it as a type error.
74- Grammar questions the doc's author hasn't been asked follow the readings in [open-questions.md](open-questions.md).
79- Grammar questions the doc's author hasn't been asked follow the readings in [open-questions.md](open-questions.md).
jibb-dev/lib/jibb-import.hoonnew file+324
@@ -0,0 +1,324 @@
1+:: /lib/jibb-import.hoon: a partial reader of Hoon's type graph
2+::
3+:: +read-mold accepts one selected Hoon type and its module/name, rather
4+:: than loading a whole /sur. The caller selects only types actually used.
5+:: Hoon's %hold nodes retain the generator's Hoon and its bound arguments.
6+:: Comparing that Hoon to the standard generators identifies collections
7+:: before they expand into trees. Recursive holds are tracked by identity;
8+:: a repeated named hold becomes a module-qualified reference.
9+::
10+:: This is not yet connected to Jibb's checker: source-level $^ overlap,
11+:: imported aliases, marks, ordered maps, and full error locations still
12+:: need work. Failures return %|; no partial tree is returned as success.
13+::
14+|%
15++$ imported
16+ $~ [%noun ~]
17+ $% [%noun ~]
18+ [%void ~]
19+ [%atom aura=term value=(unit @)]
20+ [%cell head=imported tail=imported]
21+ [%face name=term body=imported]
22+ [%fork cases=(list imported)]
23+ [%apply name=term args=(list imported)]
24+ [%ref module=term name=term]
25+ [%bad reason=@t]
26+ ==
27++$ signatures (list [name=term code=hoon])
28++$ visiting (list [typ=type name=(unit term)])
29+::
30+:: +code-of: the generator body, independent of its mold arguments.
31+::
32+++ code-of
33+ |= text=@t
34+ ^- hoon
35+ =/ typ=type (~(play ut -:!>(..zuse)) (ream text))
36+ ?> ?=([%hold *] typ)
37+ q.typ
38+::
39+++ catalog
40+ ^- signatures
41+ :~ [%map (code-of '*(map @ud @ud)')]
42+ [%set (code-of '*(set @ud)')]
43+ [%qeu (code-of '*(qeu @ud)')]
44+ [%jar (code-of '*(jar @ud @ud)')]
45+ [%jug (code-of '*(jug @ud @ud)')]
46+ [%list (code-of '*(list @ud)')]
47+ [%unit (code-of '*(unit @ud)')]
48+ [%vase (code-of '*vase')]
49+ ==
50+::
51+++ read-mold
52+ |= [module=term name=term typ=type]
53+ ^- (each imported @t)
54+ =/ out (walk module typ catalog ~)
55+ =/ err (first-bad out)
56+ ?~ err [%& out]
57+ [%| u.err]
58+::
59+:: +hold-name: names supplied by Hoon's %made note survive on a hold.
60+::
61+++ hold-name
62+ |= h=hoon
63+ ^- (unit term)
64+ ?: ?=([%tsls [%note [%made *] *] *] h)
65+ [~ p.p.p.h]
66+ ~
67+::
68+:: The named wrapper records an alias before Hoon reduces it to a map.
69+++ hold-alias
70+ |= h=hoon
71+ ^- (unit term)
72+ ?. ?=([%tsls [%note * *] *] h) ~
73+ =/ body=hoon q.p.h
74+ ?. ?=([%cncl *] body) ~
75+ ?. ?=([%tsgr *] p.body) ~
76+ ?. ?=([%cncl *] q.p.body) ~
77+ ?. ?=([%wing *] p.q.p.body) ~
78+ =/ w=wing p.p.q.p.body
79+ ?: =(w ~[%jar]) [~ %jar]
80+ ?: =(w ~[%jug]) [~ %jug]
81+ ~
82+::
83+:: Nested aliases can be erased before their hold is exposed. Until the
84+:: source tree is walked in parallel, reject that input instead of
85+:: mistaking a jar or jug for its underlying map, or a mop for a tree.
86+++ has-hidden-alias
87+ |= h=*
88+ ^- ?
89+ ?: |(=(h [%wing ~[%jar]]) =(h [%wing ~[%jug]]) =(h [%wing ~[%mop]])) &
90+ ?@ h |
91+ |($(h -.h) $(h +.h))
92+::
93+:: $^ is lowered to a conditional by Hoon's parser; conservatively
94+:: reject its distinctive test until the original branches have been
95+:: checked for disjointness. Other Hoon code can produce the same test,
96+:: so this partial reader may reject some supported molds too.
97+++ has-cell-union
98+ |= h=*
99+ ^- ?
100+ ?@ h |
101+ ?: =(h [%dtwt [%$ 12]]) &
102+ |($(h -.h) $(h +.h))
103+::
104+++ match-signature
105+ |= [h=hoon sig=signatures]
106+ ^- (unit term)
107+ ?~ sig ~
108+ ?: =(h code.i.sig) [~ name.i.sig]
109+ $(sig t.sig)
110+::
111+++ find-seen
112+ |= [typ=type seen=visiting]
113+ ^- (unit (unit term))
114+ ?~ seen ~
115+ ?: =(typ typ.i.seen) [~ name.i.seen]
116+ $(seen t.seen)
117+::
118+++ walk
119+ |= [module=term typ=type sig=signatures seen=visiting]
120+ ^- imported
121+ ?- typ
122+ %noun [%noun ~]
123+ %void [%void ~]
124+ [%atom *]
125+ ?: |(=('s' (cut 3 [0 1] p.typ)) =('r' (cut 3 [0 1] p.typ)))
126+ [%bad 'signed and float auras cannot be imported']
127+ [%atom p.typ q.typ]
128+ [%cell *] [%cell $(typ p.typ) $(typ q.typ)]
129+ [%core *] [%bad 'cores and gates cannot be imported']
130+ [%face *]
131+ ?@ p.typ [%face p.typ $(typ q.typ)]
132+ [%bad 'a complex Hoon face needs translation']
133+ [%fork *]
134+ =/ cases=(list imported)
135+ (turn ~(tap in:..zuse p.typ) |=(t=type ^$(typ t)))
136+ [%fork (sort cases |=(pair=[imported imported] (dor -.pair +.pair)))]
137+ [%hint *] $(typ q.typ)
138+ [%hold *]
139+ =/ named=(unit term) (match-signature q.typ sig)
140+ ?^ named
141+ =/ name u.named
142+ ?: =(%vase name) [%bad 'vases cannot be imported']
143+ =/ first=type
144+ (~(play ut p.typ) (ream ?:(|(=(%map name) =(%jar name) =(%jug name)) '*key' '*item')))
145+ =/ first-import $(typ first)
146+ ?: |(=(%map name) =(%jar name) =(%jug name))
147+ =/ second=type (~(play ut p.typ) (ream '*value'))
148+ [%apply name ~[first-import $(typ second)]]
149+ [%apply name ~[first-import]]
150+ =/ prior=(unit (unit term)) (find-seen typ seen)
151+ ?^ prior
152+ ?~ u.prior [%bad 'an anonymous recursive Hoon mold cannot be named']
153+ [%ref module u.u.prior]
154+ =/ nm (hold-name q.typ)
155+ ?: =(nm [~ %vase]) [%bad 'vases cannot be imported']
156+ ?: (has-cell-union q.typ)
157+ [%bad 'a Hoon $^ union needs a source-level disjointness check']
158+ =/ alias (hold-alias q.typ)
159+ ?: &(?=(~ alias) (has-hidden-alias q.typ))
160+ [%bad 'a nested jar, jug or mop needs source-aware import']
161+ =/ body $(typ ~(repo ut typ), seen [[typ nm] seen])
162+ ?~ alias body
163+ ?. ?=([%apply %map [* [%apply * [* ~]] ~]] body)
164+ [%bad 'a Hoon collection alias could not be recovered']
165+ =/ inner i.args.i.t.args.body
166+ ?: &(?=(%jar u.alias) ?=(%list name.i.t.args.body))
167+ [%apply %jar ~[i.args.body inner]]
168+ ?: &(?=(%jug u.alias) ?=(%set name.i.t.args.body))
169+ [%apply %jug ~[i.args.body inner]]
170+ [%bad 'a Hoon collection alias could not be recovered']
171+ ==
172+::
173+++ first-bad
174+ |= out=imported
175+ ^- (unit @t)
176+ ?- out
177+ [%noun *] ~
178+ [%void *] ~
179+ [%atom *] ~
180+ [%ref *] ~
181+ [%bad *] [~ reason.out]
182+ [%face *] $(out body.out)
183+ [%cell *]
184+ =/ err $(out head.out)
185+ ?~ err $(out tail.out)
186+ err
187+ [%fork *] (first-bads cases.out)
188+ [%apply *] (first-bads args.out)
189+ ==
190+::
191+++ first-bads
192+ |= xs=(list imported)
193+ ^- (unit @t)
194+ ?~ xs ~
195+ =/ err (first-bad i.xs)
196+ ?~ err $(xs t.xs)
197+ err
198+:: +fixture-test: shared golden expectations for eval and the ship.
199+++ fixture-test
200+ |= [small=@t epic=@t]
201+ ^- (list @t)
202+ =/ sc=type -:(ride -:!>(..zuse) small)
203+ =/ ec=type -:(ride -:!>(..zuse) epic)
204+ =/ sample
205+ |= name=term
206+ (read-mold %small name (~(play ut sc) (ream (cat 3 '*' name))))
207+ =/ tlon
208+ |= name=term
209+ (read-mold %epic name (~(play ut ec) (ream (cat 3 '*' name))))
210+ =/ errors=(list @t) ~
211+ =/ expect-action=imported
212+ [%fork ~[[%cell [%atom %tas [~ %add]] [%face %text [%atom %t ~]]] [%cell [%atom %tas [~ %remove]] [%face %id [%atom %ud ~]]]]]
213+ =/ errors ?: =((sample %action) [%& expect-action]) errors
214+ ['union cases and faces' errors]
215+ =/ expect-map=imported
216+ [%apply %map ~[[%atom %ud ~] [%cell [%face %id [%atom %ud ~]] [%face %text [%atom %t ~]]]]]
217+ =/ errors ?: =((sample %items) [%& expect-map]) errors
218+ ['map and its arguments' errors]
219+ =/ expect-optional=imported
220+ [%fork ~[[%cell [%face %name [%atom %t ~]] [%face %stamp [%atom %ud ~]]] [%atom %ud ~]]]
221+ =/ errors ?: =((sample %optional) [%& expect-optional]) errors
222+ ['atom-or-cell union' errors]
223+ =/ expect-containers=imported
224+ [%cell [%apply %set ~[[%atom %ud ~]]] [%cell [%apply %qeu ~[[%atom %ud ~]]] [%cell [%apply %list ~[[%atom %t ~]]] [%apply %unit ~[[%atom %ud ~]]]]]]
225+ =/ errors ?: =((sample %containers) [%& expect-containers]) errors
226+ ['set queue list and unit' errors]
227+ =/ expect-chain=imported
228+ [%fork ~[[%cell [%face %value [%atom %ud ~]] [%face %next [%ref %small %chain]]] [%atom %n [~ 0]]]]
229+ =/ errors ?: =((sample %chain) [%& expect-chain]) errors
230+ ['recursive reference' errors]
231+ =/ expect-jar=imported [%apply %jar ~[[%atom %ud ~] [%atom %t ~]]]
232+ =/ expect-jug=imported [%apply %jug ~[[%atom %ud ~] [%atom %t ~]]]
233+ =/ errors ?: =((sample %jar-test) [%& expect-jar]) errors
234+ ['jar name and arguments' errors]
235+ =/ errors ?: =((sample %jug-test) [%& expect-jug]) errors
236+ ['jug name and arguments' errors]
237+ =/ errors ?: =((sample %nested-jar) [%| 'a nested jar, jug or mop needs source-aware import']) errors
238+ ['nested jar is explicitly unsupported' errors]
239+ =/ errors ?: =((sample %signed) [%| 'signed and float auras cannot be imported']) errors
240+ ['signed aura rejected' errors]
241+ =/ errors ?: =((sample %float) [%| 'signed and float auras cannot be imported']) errors
242+ ['float aura rejected' errors]
243+ =/ errors ?: =((sample %gate-test) [%| 'cores and gates cannot be imported']) errors
244+ ['gate rejected' errors]
245+ =/ errors ?: =((read-mold %std %vase (~(play ut -:!>(..zuse)) (ream '*vase'))) [%| 'vases cannot be imported']) errors
246+ ['vase rejected' errors]
247+ =/ errors ?: =((sample %valid-cell) [%| 'a Hoon $^ union needs a source-level disjointness check']) errors
248+ ['cell union pending disjointness check' errors]
249+ =/ errors ?: =((sample %invalid-cell) [%| 'a Hoon $^ union needs a source-level disjointness check']) errors
250+ ['overlapping cell union is not accepted' errors]
251+ =/ expect-saga=imported
252+ [%fork ~[[%cell [%atom %tas [~ %chi]] [%atom %n [~ 0]]] [%cell [%atom %tas [~ %lev]] [%atom %n [~ 0]]] [%cell [%atom %tas [~ %dex]] [%face %ver [%atom %ud ~]]]]]
253+ =/ errors ?: =((tlon %saga) [%& expect-saga]) errors
254+ ['Tlon saga union' errors]
255+ =/ errors ?: =((tlon %epic) [%& [%atom %ud ~]]) errors
256+ ['Tlon epic atom' errors]
257+ errors
258+
259+:: A compact diagnostic projection for importer golden files. This is
260+:: not the Jibb type printer: it exposes constants and recursive refs.
261+++ show-import
262+ |= out=imported
263+ ^- tape
264+ ?- out
265+ [%noun *] "*"
266+ [%void *] "!!"
267+ [%atom *]
268+ ?~ value.out "@{(trip aura.out)}"
269+ ?: =(%tas aura.out) "{(trip (scot %tas u.value.out))}"
270+ "@{(trip aura.out)}:{(trip (scot %ud u.value.out))}"
271+ [%cell *] "[{(show-import head.out)} {(show-import tail.out)}]"
272+ [%face *] "{(trip name.out)}={(show-import body.out)}"
273+ [%fork *] "(union {(show-imports cases.out)})"
274+ [%apply *] "({(trip name.out)} {(show-imports args.out)})"
275+ [%ref *] "{(trip name.out)}.{(trip module.out)}"
276+ [%bad *] "error: {(trip reason.out)}"
277+ ==
278+::
279+++ show-imports
280+ |= xs=(list imported)
281+ ^- tape
282+ ?~ xs ""
283+ ?~ t.xs (show-import i.xs)
284+ "{(show-import i.xs)} {$(xs t.xs)}"
285+::
286+++ show-result
287+ |= result=(each imported @t)
288+ ^- tape
289+ ?- result
290+ [%& *] (show-import p.result)
291+ [%| *] "error: {(trip p.result)}"
292+ ==
293+::
294+++ fixture-output
295+ |= [small=@t epic=@t]
296+ ^- wain
297+ =/ sc=type -:(ride -:!>(..zuse) small)
298+ =/ ec=type -:(ride -:!>(..zuse) epic)
299+ =/ sample
300+ |= name=term
301+ (read-mold %small name (~(play ut sc) (ream (cat 3 '*' name))))
302+ =/ tlon
303+ |= name=term
304+ (read-mold %epic name (~(play ut ec) (ream (cat 3 '*' name))))
305+ =/ vase (read-mold %std %vase (~(play ut -:!>(..zuse)) (ream '*vase')))
306+ :~ (crip "action: {(show-result (sample %action))}")
307+ (crip "optional: {(show-result (sample %optional))}")
308+ (crip "items: {(show-result (sample %items))}")
309+ (crip "containers: {(show-result (sample %containers))}")
310+ (crip "chain: {(show-result (sample %chain))}")
311+ (crip "jar: {(show-result (sample %jar-test))}")
312+ (crip "jug: {(show-result (sample %jug-test))}")
313+ (crip "nested-jar: {(show-result (sample %nested-jar))}")
314+ (crip "signed: {(show-result (sample %signed))}")
315+ (crip "float: {(show-result (sample %float))}")
316+ (crip "gate: {(show-result (sample %gate-test))}")
317+ (crip "vase: {(show-result vase)}")
318+ (crip "valid-cell: {(show-result (sample %valid-cell))}")
319+ (crip "invalid-cell: {(show-result (sample %invalid-cell))}")
320+ (crip "tlon-saga: {(show-result (tlon %saga))}")
321+ (crip "tlon-epic: {(show-result (tlon %epic))}")
322+ ==
323+
324+--
jibb-dev/lib/jibb.hoon+483−2
@@ -11,6 +11,7 @@
11:: +parse [file=path src=@t] (each module error)
11:: +parse [file=path src=@t] (each module error)
12:: +parse-tokens [file=path toks=(list token)] (each module error)
12:: +parse-tokens [file=path toks=(list token)] (each module error)
13:: +golden [file=path src=@t] [tokens=@t tree=@t]
13:: +golden [file=path src=@t] [tokens=@t tree=@t]
14+:: +golden-types [file=path src=@t] @t (partial inference)
14:: +show-tokens (list token) @t
15:: +show-tokens (list token) @t
15:: +show-module module @t
16:: +show-module module @t
16:: +show-error [src=@t error] @t
17:: +show-error [src=@t error] @t
@@ -19,7 +20,7 @@
19:: fails: an error it finds is its last token (2.0), and +layout-error
20:: fails: an error it finds is its last token (2.0), and +layout-error
20:: takes it out.
21:: takes it out.
21::
22::
22−:: Status: the types, the printers, +golden, the layout pass (+layout,
23+:: Status: the syntax types, the printers, +golden, the layout pass (+layout,
23:: +lexer) and the parser (+parse-tokens, +parser) work, and +golden
24:: +lexer) and the parser (+parse-tokens, +parser) work, and +golden
24:: checks every tree's spans (+check-spans, section 1). Choices the
25:: checks every tree's spans (+check-spans, section 1). Choices the
25:: doc leaves open are marked "(doc question)": they follow the most
26:: doc leaves open are marked "(doc question)": they follow the most
@@ -27,7 +28,9 @@
27:: author to settle. Those the author has settled, in the Decisions
28:: author to settle. Those the author has settled, in the Decisions
28:: tab's rows of 2026-10-30, are marked "(Decisions)" beside the rule
29:: tab's rows of 2026-10-30, are marked "(Decisions)" beside the rule
29:: decided. The golden corpus's "expect:" lines give each error's
30:: decided. The golden corpus's "expect:" lines give each error's
31+:: position. A partial inference fragment is in %type-inference; its
32+:: output explicitly says the module has not been checked. The layout
30−:: position. The layout pass's errors sit there, except where the
33+:: pass's errors sit there, except where the
31:: parser finds an earlier error first, as in `++ 2nd 5`, or moves one
34:: parser finds an earlier error first, as in `++ 2nd 5`, or moves one
32:: back to the start of its text, as in `++ x @sd` (2.0, 2.8, and
35:: back to the start of its text, as in `++ x @sd` (2.0, 2.8, and
33:: section 3, Errors).
36:: section 3, Errors).
@@ -4572,4 +4575,482 @@
4572 =? at.o &(=(kind kind.o) =(beg beg.at.o)) at
4575 =? at.o &(=(kind kind.o) =(beg beg.at.o)) at
4573 :- o(kids $(os kids.o))
4576 :- o(kids $(os kids.o))
4574 $(os t.os)
4577 $(os t.os)
4578+::
4579++| %type-inference
4580+::
4581+:: Preliminary type inference substrate. These types are internal and do
4582+:: not yet represent every Jibb mold. In particular this is not a complete
4583+:: module checker. A substitution is an association list whose first entry
4584+:: for a variable is its binding. The occurs check prevents infinite types;
4585+:: recursive named molds need their own representation, not cyclic vars.
4586+:: Each top-level inferred definition generalizes its free variables, and
4587+:: a use instantiates them afresh. Binders inside a gate stay monomorphic;
4588+:: capital variables in molds share one allocation within the definition.
4589+:: Decimal literals and bare @ have atom-only variables; until their
4590+:: constraints can be printed and generalized, an unresolved one is
4591+:: reported as unsupported. Only unfaced cells are represented here.
4592+::
4593++$ itype
4594+ $~ [%var 0]
4595+ $% [%var id=@ud]
4596+ [%avar id=@ud]
4597+ [%atom aura=@ta]
4598+ [%flag ~]
4599+ [%fn sample=itype product=itype]
4600+ [%cell hed=itype tal=itype]
4601+ ==
4602++$ ibinding [id=@ud val=itype]
4603++$ isub (list ibinding)
4604+::
4605+++ itype-lookup
4606+ |= [n=@ud sub=isub]
4607+ ^- (unit itype)
4608+ ?~ sub ~
4609+ ?: =(n id.i.sub) `val.i.sub
4610+ $(sub t.sub)
4611+::
4612+++ itype-walk
4613+ |= [t=itype sub=isub]
4614+ ^- itype
4615+ ?+ -.t t
4616+ %var
4617+ =/ found=(unit itype) (itype-lookup id.t sub)
4618+ ?~ found t
4619+ $(t u.found)
4620+ %avar
4621+ =/ found=(unit itype) (itype-lookup id.t sub)
4622+ ?~ found t
4623+ $(t u.found)
4624+ ==
4625+::
4626+++ itype-occurs
4627+ |= [n=@ud t=itype sub=isub]
4628+ ^- ?
4629+ =. t (itype-walk t sub)
4630+ ?- -.t
4631+ %var =(n id.t)
4632+ %avar =(n id.t)
4633+ %atom |
4634+ %flag |
4635+ %fn |($(t sample.t) $(t product.t))
4636+ %cell |($(t hed.t) $(t tal.t))
4637+ ==
4638+::
4639+:: +itype-unify: consistent substitutions, or ~ for a mismatch
4640+::
4641+:: Different concrete auras conflict. A variable may become an atom or
4642+:: a function, but cannot contain itself. Aura-only variables and faces
4643+:: require further distinctions before this supports general Jibb.
4644+::
4645+++ itype-unify
4646+ |= [a=itype b=itype sub=isub]
4647+ ^- (unit isub)
4648+ =. a (itype-walk a sub)
4649+ =. b (itype-walk b sub)
4650+ ?: =(a b) `sub
4651+ ?: ?=(%var -.a)
4652+ ?: (itype-occurs id.a b sub) ~
4653+ `[[id.a b] sub]
4654+ ?: ?=(%var -.b)
4655+ ?: (itype-occurs id.b a sub) ~
4656+ `[[id.b a] sub]
4657+ ?: ?=(%avar -.a)
4658+ ?. |(?=(%avar -.b) ?=(%atom -.b)) ~
4659+ `[[id.a b] sub]
4660+ ?: ?=(%avar -.b)
4661+ ?. ?=(%atom -.a) ~
4662+ `[[id.b a] sub]
4663+ ?: &(?=(%atom -.a) ?=(%atom -.b)) ~
4664+ ?: &(?=(%fn -.a) ?=(%fn -.b))
4665+ =/ first=(unit isub) $(a sample.a, b sample.b)
4666+ ?~ first ~
4667+ $(a product.a, b product.b, sub u.first)
4668+ ?: &(?=(%cell -.a) ?=(%cell -.b))
4669+ =/ first=(unit isub) $(a hed.a, b hed.b)
4670+ ?~ first ~
4671+ $(a tal.a, b tal.b, sub u.first)
4672+ ~
4673+::
4674+++ itype-unify-test
4675+ ^- (list tape)
4676+ =/ a=itype [%var 0]
4677+ =/ b=itype [%var 1]
4678+ =/ txt=itype [%atom %t]
4679+ =/ num=itype [%atom %ud]
4680+ =/ same=itype [%fn a a]
4681+ =/ mismatch=itype [%fn txt num]
4682+ =/ fine=itype [%fn txt txt]
4683+ =/ sub=(unit isub) (itype-unify a b ~)
4684+ ?~ sub ~["variables should unify"]
4685+ =/ sub2=(unit isub) (itype-unify b txt u.sub)
4686+ ?~ sub2 ~["a chained variable should unify"]
4687+ =/ problems=(list tape) ~
4688+ =? problems !=((itype-walk a u.sub2) txt)
4689+ ["substitutions should follow chains" problems]
4690+ =? problems ?=(^ (itype-unify txt num ~))
4691+ ["different concrete auras should conflict" problems]
4692+ =? problems ?=(^ (itype-unify a [%fn a txt] ~))
4693+ ["occurs check should reject an infinite type" problems]
4694+ =? problems ?=(^ (itype-unify same mismatch ~))
4695+ ["a shared type variable should reject incompatible arguments" problems]
4696+ =? problems ?=(~ (itype-unify same fine ~))
4697+ ["a shared type variable should accept equal arguments" problems]
4698+ problems
4699+::
4700+:: The expression inference below is deliberately a fragment: bindings,
4701+:: simple gates, unary calls, fixed-aura literals, and plain strings. The
4702+:: result for unsupported syntax is a diagnostic, never a checked module.
4703+::
4704++$ ischeme [typ=itype vars=(list @ud)]
4705++$ ienv (list [name=term scheme=ischeme])
4706++$ icaps (list [name=@t id=@ud])
4707++$ istate [next=@ud sub=isub caps=icaps]
4708++$ iresult (each [typ=itype state=istate] tape)
4709++$ isample-result (each [typ=itype env=ienv state=istate] tape)
4710+::
4711+++ ienv-lookup
4712+ |= [name=term env=ienv]
4713+ ^- (unit ischeme)
4714+ ?~ env ~
4715+ ?: =(name name.i.env) `scheme.i.env
4716+ $(env t.env)
4717+::
4718+:: Generalized variables are renamed freshly on each use. The renaming
4719+:: substitutes only once, so an old variable and its fresh number may
4720+:: coincide without forming a substitution cycle.
4721+::
4722+++ itype-normalize
4723+ |= [t=itype sub=isub]
4724+ ^- itype
4725+ =. t (itype-walk t sub)
4726+ ?: ?=(%fn -.t)
4727+ [%fn $(t sample.t) $(t product.t)]
4728+ ?: ?=(%cell -.t)
4729+ [%cell $(t hed.t) $(t tal.t)]
4730+ t
4731+::
4732+++ itype-vars
4733+ |= t=itype
4734+ ^- (list @ud)
4735+ ?- -.t
4736+ %var ~[id.t]
4737+ %avar ~[id.t]
4738+ %atom ~
4739+ %flag ~
4740+ %fn (weld $(t sample.t) $(t product.t))
4741+ %cell (weld $(t hed.t) $(t tal.t))
4742+ ==
4743+::
4744+++ unique-type-vars
4745+ |= ns=(list @ud)
4746+ ^- (list @ud)
4747+ =/ out=(list @ud) ~
4748+ |-
4749+ ?~ ns (flop out)
4750+ ?: (lien out |=(x=@ud =(x i.ns))) $(ns t.ns)
4751+ $(ns t.ns, out [i.ns out])
4752+::
4753+++ itype-rename
4754+ |= [t=itype ren=isub]
4755+ ^- itype
4756+ ?- -.t
4757+ %var
4758+ =/ found=(unit itype) (itype-lookup id.t ren)
4759+ ?~ found t
4760+ u.found
4761+ %avar t
4762+ %atom t
4763+ %flag t
4764+ %fn [%fn $(t sample.t) $(t product.t)]
4765+ %cell [%cell $(t hed.t) $(t tal.t)]
4766+ ==
4767+::
4768+:: Canonical numbering makes printed variables independent of the order
4769+:: the unifier happened to allocate intermediates.
4770+::
4771+++ canonical-itype
4772+ |= [t=itype vars=(list @ud)]
4773+ ^- itype
4774+ =/ ren=isub ~
4775+ =/ n=@ud 0
4776+ |-
4777+ ?~ vars (itype-rename t ren)
4778+ $(vars t.vars, ren [[i.vars [%var n]] ren], n +(n))
4779+::
4780+++ instantiate-scheme
4781+ |= [scheme=ischeme state=istate]
4782+ ^- [typ=itype state=istate]
4783+ =/ ren=isub ~
4784+ =/ vars=(list @ud) vars.scheme
4785+ |-
4786+ ?~ vars [(itype-rename typ.scheme ren) state]
4787+ $(vars t.vars, ren [[i.vars [%var next.state]] ren], state state(next +(next.state)))
4788+::
4789+++ icap-lookup
4790+ |= [n=@t caps=icaps]
4791+ ^- (unit @ud)
4792+ ?~ caps ~
4793+ ?: =(n name.i.caps) `id.i.caps
4794+ $(caps t.caps)
4795+::
4796+++ infer-simple-shape
4797+ |= [sh=shape state=istate]
4798+ ^- (unit [typ=itype state=istate])
4799+ ?- -.sh
4800+ %aura
4801+ ?: =(0 aura.sh)
4802+ `[[%avar next.state] state(next +(next.state))]
4803+ `[[%atom aura.sh] state]
4804+ %flag `[[%flag ~] state]
4805+ %cell (infer-simple-fields fields.sh state)
4806+ %tvar
4807+ =/ n=(unit @ud) (icap-lookup name.sh caps.state)
4808+ ?^ n `[[%var u.n] state]
4809+ `[[%var next.state] state(next +(next.state), caps [[name.sh next.state] caps.state])]
4810+ * ~
4811+ ==
4812+::
4813+++ infer-simple-fields
4814+ |= [fields=(list field) state=istate]
4815+ ^- (unit [typ=itype state=istate])
4816+ ?~ fields ~
4817+ ?. ?=(%bare -.i.fields) ~
4818+ =/ head=(unit [typ=itype state=istate]) (infer-simple-shape shape.i.fields state)
4819+ ?~ head ~
4820+ ?~ t.fields head
4821+ =/ tail=(unit [typ=itype state=istate]) $(fields t.fields, state state.u.head)
4822+ ?~ tail ~
4823+ `[[%cell typ.u.head typ.u.tail] state.u.tail]
4824+::
4825+++ infer-sample
4826+ |= [s=sample env=ienv state=istate]
4827+ ^- isample-result
4828+ ?- -.s
4829+ %bind
4830+ ?. ?=(~ (ienv-lookup name.s env))
4831+ [%| "sample shadows a name"]
4832+ =/ t=itype [%var next.state]
4833+ [%& t [[name.s [t ~]] env] state(next +(next.state))]
4834+ %face
4835+ ?. ?=(~ (ienv-lookup name.s env))
4836+ [%| "sample shadows a name"]
4837+ =/ t=(unit [typ=itype state=istate]) (infer-simple-shape shape.s state)
4838+ ?~ t [%| "sample mold is not supported by partial inference"]
4839+ [%& typ.u.t [[name.s [typ.u.t ~]] env] state.u.t]
4840+ %bare
4841+ =/ t=(unit [typ=itype state=istate]) (infer-simple-shape shape.s state)
4842+ ?~ t [%| "sample mold is not supported by partial inference"]
4843+ [%& typ.u.t env state.u.t]
4844+ * [%| "sample is not supported by partial inference"]
4845+ ==
4846+::
4847+++ infer-fragment
4848+ |= [e=expr env=ienv state=istate]
4849+ ^- iresult
4850+ ?- -.e
4851+ %lit
4852+ ?- form.lit.e
4853+ %number ?: =(%ud aura.lit.e)
4854+ [%& [%avar next.state] state(next +(next.state))]
4855+ [%& [%atom aura.lit.e] state]
4856+ %ship [%& [%atom %p] state]
4857+ %date [%& [%atom %da] state]
4858+ %duration [%& [%atom %dr] state]
4859+ %knot [%& [%atom %ta] state]
4860+ %loobean [%& [%flag ~] state]
4861+ * [%| "literal needs contextual inference"]
4862+ ==
4863+ %str
4864+ =/ interpolated=? (lien pieces.e |=(p=piece ?=(%expr -.p)))
4865+ ?: interpolated [%| "interpolation is not supported by partial inference"]
4866+ [%& [%atom %t] state]
4867+ %wing
4868+ ?~ names.e [%| "empty wing"]
4869+ ?^ t.names.e [%| "field access is not supported by partial inference"]
4870+ =/ scheme=(unit ischeme) (ienv-lookup i.names.e env)
4871+ ?~ scheme [%| "name is not available to partial inference"]
4872+ =/ instance=[typ=itype state=istate] (instantiate-scheme u.scheme state)
4873+ [%& typ.instance state.instance]
4874+ %group $(e inner.e)
4875+ %tuple (infer-simple-items items.e env state)
4876+ %body
4877+ ?^ defs.e [%| "local definitions are not supported by partial inference"]
4878+ $(e final.e)
4879+ %branch
4880+ ?~ arms.e [%| "branch is not supported by partial inference"]
4881+ ?~ t.arms.e (infer-cell-branch e env state)
4882+ ?^ t.t.arms.e [%| "branch is not supported by partial inference"]
4883+ =/ x=arm i.arms.e
4884+ =/ y=arm i.t.arms.e
4885+ ?. ?=(%lit -.pat.x) [%| "branch pattern is not supported by partial inference"]
4886+ ?. ?=(%lit -.pat.y) [%| "branch pattern is not supported by partial inference"]
4887+ ?. &(=(%loobean form.lit.pat.x) =(%loobean form.lit.pat.y))
4888+ [%| "branch pattern is not supported by partial inference"]
4889+ ?: =(val.lit.pat.x val.lit.pat.y)
4890+ [%| "branch does not cover both loobeans"]
4891+ =/ subject=iresult $(e subject.e)
4892+ ?: ?=(%| -.subject) subject
4893+ =/ su=(unit isub) (itype-unify typ.p.subject [%flag ~] sub.state.p.subject)
4894+ ?~ su [%| "loobean branch subject does not unify with ?"]
4895+ =/ left=iresult $(e val.x, state state.p.subject(sub u.su))
4896+ ?: ?=(%| -.left) left
4897+ =/ right=iresult $(e val.y, state state.p.left)
4898+ ?: ?=(%| -.right) right
4899+ =/ joined=(unit isub) (itype-unify typ.p.left typ.p.right sub.state.p.right)
4900+ ?~ joined [%| "branch arms have incompatible types"]
4901+ [%& typ.p.left state.p.right(sub u.joined)]
4902+ %cast
4903+ =/ target=(unit [typ=itype state=istate]) (infer-simple-shape shape.e state)
4904+ ?~ target [%| "cast mold is not supported by partial inference"]
4905+ =/ value=iresult $(e val.e, state state.u.target)
4906+ ?: ?=(%| -.value) value
4907+ =/ uni=(unit isub) (itype-unify typ.u.target typ.p.value sub.state.p.value)
4908+ ?~ uni [%| "cast mold and expression type do not unify"]
4909+ [%& typ.u.target state.p.value(sub u.uni)]
4910+ %crash [%& [%var next.state] state(next +(next.state))]
4911+ %gate
4912+ =/ sam=isample-result (infer-sample sample.e env state)
4913+ ?: ?=(%| -.sam) [%| p.sam]
4914+ =/ body=iresult $(e body.e, env env.p.sam, state state.p.sam)
4915+ ?: ?=(%| -.body) body
4916+ [%& [%fn typ.p.sam typ.p.body] state.p.body]
4917+ %gate-wide
4918+ =/ sam=isample-result (infer-sample sample.e env state)
4919+ ?: ?=(%| -.sam) [%| p.sam]
4920+ =/ body=iresult $(e body.e, env env.p.sam, state state.p.sam)
4921+ ?: ?=(%| -.body) body
4922+ [%& [%fn typ.p.sam typ.p.body] state.p.body]
4923+ %call
4924+ ?~ args.e [%| "call has no argument"]
4925+ ?^ t.args.e [%| "multiple arguments are not supported by partial inference"]
4926+ =/ head=iresult $(e head.e)
4927+ ?: ?=(%| -.head) head
4928+ =/ arg=iresult $(e i.args.e, state state.p.head)
4929+ ?: ?=(%| -.arg) arg
4930+ =/ st=istate state.p.arg
4931+ =/ result=itype [%var next.st]
4932+ =/ uni=(unit isub)
4933+ (itype-unify typ.p.head [%fn typ.p.arg result] sub.st)
4934+ ?~ uni [%| "call's sample and argument types do not unify"]
4935+ [%& result st(next +(next.st), sub u.uni)]
4936+ * [%| "expression is not supported by partial inference"]
4937+ ==
4938+::
4939+:: Unfaced tuple expressions are the one supported cell construction.
4940+:: Faced cells wait for the representation to preserve record faces.
4941+::
4942+++ infer-simple-items
4943+ |= [items=(list item) env=ienv state=istate]
4944+ ^- iresult
4945+ ?~ items [%| "empty cell is not supported by partial inference"]
4946+ ?^ face.i.items [%| "record faces are not supported by partial inference"]
4947+ =/ head=iresult (infer-fragment val.i.items env state)
4948+ ?: ?=(%| -.head) head
4949+ ?~ t.items head
4950+ =/ tail=iresult $(items t.items, state state.p.head)
4951+ ?: ?=(%| -.tail) tail
4952+ [%& [%cell typ.p.head typ.p.tail] state.p.tail]
4953+::
4954+:: A single two-binder cell pattern covers every value of a cell type.
4955+:: No other pattern matrix is implemented here.
4956+::
4957+++ infer-cell-branch
4958+ |= [e=expr env=ienv state=istate]
4959+ ^- iresult
4960+ ?> ?=(%branch -.e)
4961+ ?~ arms.e [%| "branch is not supported by partial inference"]
4962+ =/ arm=arm i.arms.e
4963+ ?. ?=(%cell -.pat.arm) [%| "branch pattern is not supported by partial inference"]
4964+ =/ pats=(list pattern) items.pat.arm
4965+ ?~ pats [%| "branch pattern is not supported by partial inference"]
4966+ ?~ t.pats [%| "branch pattern is not supported by partial inference"]
4967+ ?^ t.t.pats [%| "branch pattern is not supported by partial inference"]
4968+ ?. ?=(%bind -.i.pats) [%| "branch pattern is not supported by partial inference"]
4969+ ?. ?=(%bind -.i.t.pats) [%| "branch pattern is not supported by partial inference"]
4970+ =/ one=term name.i.pats
4971+ =/ two=term name.i.t.pats
4972+ ?: |(=(one two) ?=(^ (ienv-lookup one env)) ?=(^ (ienv-lookup two env)))
4973+ [%| "pattern shadows a name"]
4974+ =/ subject=iresult (infer-fragment subject.e env state)
4975+ ?: ?=(%| -.subject) subject
4976+ =/ st=istate state.p.subject
4977+ =/ head=itype [%var next.st]
4978+ =/ tail=itype [%var +(next.st)]
4979+ =/ sub=(unit isub) (itype-unify typ.p.subject [%cell head tail] sub.st)
4980+ ?~ sub [%| "cell pattern does not match the subject type"]
4981+ (infer-fragment val.arm [[one [head ~]] [two [tail ~]] env] st(next (add 2 next.st), sub u.sub))
4982+::
4983+++ show-itype
4984+ |= [t=itype sub=isub]
4985+ ^- tape
4986+ =. t (itype-walk t sub)
4987+ ?- -.t
4988+ %var
4989+ ?: (lth id.t 26) [(add 65 id.t) ~]
4990+ "T{<id.t>}"
4991+ %avar "@"
4992+ %atom "@{(trip aura.t)}"
4993+ %flag "?"
4994+ %fn "$-({$(t sample.t)} {$(t product.t)})"
4995+ %cell "[{$(t hed.t)} {$(t tal.t)}]"
4996+ ==
4997+::
4998+:: Unfixed aura variables are withheld from the output until inference
4999+:: can generalize them and the printer represents their constraints.
5000+::
5001+++ itype-has-avar
5002+ |= t=itype
5003+ ^- ?
5004+ ?- -.t
5005+ %avar &
5006+ %var |
5007+ %atom |
5008+ %flag |
5009+ %fn |($(t sample.t) $(t product.t))
5010+ %cell |($(t hed.t) $(t tal.t))
5011+ ==
5012+::
5013+:: A capital in a written mold is generalized with its enclosing ++.
5014+:: Until its rigidity and aura constraints are represented, do not
5015+:: report a type when unification made one more specific.
5016+::
5017+++ constrained-capitals
5018+ |= [caps=icaps sub=isub]
5019+ ^- ?
5020+ ?~ caps |
5021+ =/ resolved=itype (itype-walk [%var id.i.caps] sub)
5022+ ?. ?=(%var -.resolved) &
5023+ $(caps t.caps)
5024+::
5025+:: +golden-types: a partial report; it does not claim the module checks
5026+::
5027+++ golden-types
5028+ |= [file=path src=@t]
5029+ ^- @t
5030+ =/ parsed (parse file src)
5031+ ?: ?=(%| -.parsed) (show-error src p.parsed)
5032+ =/ ds=(list def) defs.p.parsed
5033+ =/ env=ienv ~
5034+ =/ lines=(list @t) ~
5035+ |-
5036+ ?~ ds (of-wain:format ['partial inference; module not checked' (flop lines)])
5037+ =/ d=def i.ds
5038+ ?: ?=(%mold -.d)
5039+ $(ds t.ds, lines [(crip "+$ {(trip name.d)}: not checked") lines])
5040+ ?: ?=(^ (ienv-lookup name.d env))
5041+ $(ds t.ds, lines [(crip "++ {(trip name.d)}: name already in scope") lines])
5042+ =/ result=iresult (infer-fragment val.d env [0 ~ ~])
5043+ ?: ?=(%| -.result)
5044+ $(ds t.ds, lines [(crip "++ {(trip name.d)}: {p.result}") lines])
5045+ ?: (constrained-capitals caps.state.p.result sub.state.p.result)
5046+ $(ds t.ds, lines [(crip "++ {(trip name.d)}: explicit capital constraints are not supported by partial inference") lines])
5047+ =/ typ=itype (itype-normalize typ.p.result sub.state.p.result)
5048+ ?: (itype-has-avar typ)
5049+ $(ds t.ds, lines [(crip "++ {(trip name.d)}: unresolved aura-variable inference") lines])
5050+ =/ vars=(list @ud) (unique-type-vars (itype-vars typ))
5051+ ?: (gth (lent vars) 26)
5052+ $(ds t.ds, lines [(crip "++ {(trip name.d)}: too many variables for partial printer") lines])
5053+ =/ printable=itype (canonical-itype typ vars)
5054+ =/ line=@t (crip "++ {(trip name.d)}: {(show-itype printable ~)}")
5055+ $(ds t.ds, env [[name.d [typ vars]] env], lines [line lines])
4575--
5056--
jibb-dev/lib/jibb/prelude.jibbnew file+15
@@ -0,0 +1,15 @@
1+:: Initial prelude functions. The rest of the inventory is still to come.
2+++ same |= x=A x
3+
4+++ head |= p=[A B]
5+ ?- p
6+ [a b] a
7+
8+++ tail |= p=[A B]
9+ ?- p
10+ [a b] b
11+
12+++ not |= b=?
13+ ?- b
14+ %.y %.n
15+ %.n %.y
my-app/mar/posts.hoonnew file+7
@@ -0,0 +1,7 @@
1+:: Fixture for the documented examples; not supplied by the design doc.
2+/- blog
3+|_ a=(list post:blog)
4+++ grab |% ++ noun (list post:blog) --
5+++ grow |% ++ noun a --
6+++ grad %noun
7+--
my-app/mar/todo-action.hoonnew file+7
@@ -0,0 +1,7 @@
1+:: Fixture for the documented examples; not supplied by the design doc.
2+/- todo
3+|_ a=action:todo
4+++ grab |% ++ noun action:todo --
5+++ grow |% ++ noun a --
6+++ grad %noun
7+--
my-app/mar/todo-item.hoonnew file+7
@@ -0,0 +1,7 @@
1+:: Fixture for the documented examples; not supplied by the design doc.
2+/- todo
3+|_ a=item:todo
4+++ grab |% ++ noun item:todo --
5+++ grow |% ++ noun a --
6+++ grad %noun
7+--
my-app/mar/todo-update.hoonnew file+7
@@ -0,0 +1,7 @@
1+:: Fixture for the documented examples; not supplied by the design doc.
2+/- todo
3+|_ a=update:todo
4+++ grab |% ++ noun update:todo --
5+++ grow |% ++ noun a --
6+++ grad %noun
7+--
my-app/mar/todos.hoonnew file+7
@@ -0,0 +1,7 @@
1+:: Fixture for the documented examples; not supplied by the design doc.
2+/- todo
3+|_ a=(list item:todo)
4+++ grab |% ++ noun (list item:todo) --
5+++ grow |% ++ noun a --
6+++ grad %noun
7+--
my-app/sur/blog.hoonnew file+4
@@ -0,0 +1,4 @@
1+:: Fixture for the documented examples; not supplied by the design doc.
2+|%
3++$ post [title=@t slug=@ta]
4+--
my-app/sur/todo.hoonnew file+12
@@ -0,0 +1,12 @@
1+:: Fixture for the documented examples; not supplied by the design doc.
2+|%
3++$ item [id=@ud done=? text=@t]
4++$ action
5+ $% [%add text=@t]
6+ [%toggle id=@ud]
7+ ==
8++$ update
9+ $% [%added item=item]
10+ [%toggled id=@ud]
11+ ==
12+--
my-app/ui/api/blog.jibbnew file+5
@@ -0,0 +1,5 @@
1+:: Fixture for the documented examples; not supplied by the design doc.
2+/% %posts
3+
4++$ paths
5+ [%posts /posts posts]
my-app/ui/api/todo.jibb+1−1
@@ -10,4 +10,4 @@
10+$ paths
10+$ paths
11 [%todos /todos todos]
11 [%todos /todos todos]
12 [%changes /changes (facts todos todo-update)]
12 [%changes /changes (facts todos todo-update)]
13− [%todo /todo/[id=@ud] todo-item]
13+ [%todo-by-id /todo/[id=@ud] todo-item]
my-app/ui/components/card.jibbnew file+5
@@ -0,0 +1,5 @@
1+:: Fixture for the documented examples; not supplied by the design doc.
2+/- blog
3+
4+++ card |= p=post.blog
5+ text title.p
tests/checker/unification.txtnew file+1
@@ -0,0 +1 @@
1+unification passed
tests/golden/doc-overview-04-todo-api/source.jibb+1−1
@@ -10,4 +10,4 @@
10+$ paths
10+$ paths
11 [%todos /todos todos]
11 [%todos /todos todos]
12 [%changes /changes (facts todos todo-update)]
12 [%changes /changes (facts todos todo-update)]
13− [%todo /todo/[id=@ud] todo-item]
13+ [%todo-by-id /todo/[id=@ud] todo-item]
tests/golden/doc-overview-04-todo-api/tokens.txt+13−13
@@ -43,16 +43,16 @@
4312:47 tight glyph ]
4312:47 tight glyph ]
4413:3 NEWLINE
4413:3 NEWLINE
4513:3 glyph [
4513:3 glyph [
46−13:4 tight lit %todo
46+13:4 tight lit %todo-by-id
47−13:10 glyph /
47+13:16 glyph /
48−13:11 tight knot todo
48+13:17 tight knot todo
49−13:15 tight glyph /
49+13:21 tight glyph /
50−13:16 tight glyph [
50+13:22 tight glyph [
51−13:17 tight name id
51+13:23 tight name id
52−13:19 tight glyph =
52+13:25 tight glyph =
53−13:20 tight aura @ud
53+13:26 tight aura @ud
54−13:23 tight glyph ]
54+13:29 tight glyph ]
55−13:25 name todo-item
55+13:31 name todo-item
56−13:34 tight glyph ]
56+13:40 tight glyph ]
57−13:35 DEDENT
57+13:41 DEDENT
58−13:35 NEWLINE
58+13:41 NEWLINE
tests/golden/doc-overview-04-todo-api/tree.txt+1−1
@@ -13,4 +13,4 @@
13 (const 12:4 %changes)
13 (const 12:4 %changes)
14 (path 12:13 /changes)
14 (path 12:13 /changes)
15 (apply 12:22 facts (ref 12:29 todos) (ref 12:35 todo-update)))
15 (apply 12:22 facts (ref 12:29 todos) (ref 12:35 todo-update)))
16− (cell 13:3 (const 13:4 %todo) (path 13:10 /todo/[id=@ud]) (ref 13:25 todo-item)))))
16+ (cell 13:3 (const 13:4 %todo-by-id) (path 13:16 /todo/[id=@ud]) (ref 13:31 todo-item)))))
tests/golden/fixture-blog-api/about.txtnew file+3
@@ -0,0 +1,3 @@
1+source: Overview, Agent APIs: "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 /%."
2+tests: A blog API fixture used by the documented published-page example; path.txt supplies its API path.
3+expect: parses; type checking and mark imports wait for milestone 2.
tests/golden/fixture-blog-api/path.txtnew file+1
@@ -0,0 +1 @@
1+/ui/api/blog.jibb
tests/golden/fixture-blog-api/source.jibbnew file+5
@@ -0,0 +1,5 @@
1+:: Fixture for the documented examples; not supplied by the design doc.
2+/% %posts
3+
4++$ paths
5+ [%posts /posts posts]
tests/golden/fixture-blog-api/tokens.txtnew file+14
@@ -0,0 +1,14 @@
1+2:1 glyph /%
2+2:5 lit %posts
3+4:1 NEWLINE
4+4:1 glyph +$
5+4:4 name paths
6+5:3 INDENT
7+5:3 glyph [
8+5:4 tight lit %posts
9+5:11 glyph /
10+5:12 tight knot posts
11+5:18 name posts
12+5:23 tight glyph ]
13+5:24 DEDENT
14+5:24 NEWLINE
tests/golden/fixture-blog-api/tree.txtnew file+4
@@ -0,0 +1,4 @@
1+(module
2+ (mark 2:1 %posts)
3+ (mold 4:1 paths
4+ (cell 5:3 (const 5:4 %posts) (path 5:11 /posts) (ref 5:18 posts))))
tests/golden/fixture-blog-card/about.txtnew file+3
@@ -0,0 +1,3 @@
1+source: Overview, worked example 2: the published page imports /ui/components/card and calls card.card.
2+tests: A card component fixture for the documented published-page example, importing its blog mold; path.txt supplies its module path.
3+expect: parses; type checking and /sur imports wait for milestone 2.
tests/golden/fixture-blog-card/path.txtnew file+1
@@ -0,0 +1 @@
1+/ui/components/card.jibb
tests/golden/fixture-blog-card/source.jibbnew file+5
@@ -0,0 +1,5 @@
1+:: Fixture for the documented examples; not supplied by the design doc.
2+/- blog
3+
4+++ card |= p=post.blog
5+ text title.p
tests/golden/fixture-blog-card/tokens.txtnew file+14
@@ -0,0 +1,14 @@
1+2:1 glyph /-
2+2:5 name blog
3+4:1 NEWLINE
4+4:1 glyph ++
5+4:4 name card
6+4:9 glyph |=
7+4:12 name p
8+4:13 tight glyph =
9+4:14 tight wing post.blog
10+5:3 INDENT
11+5:3 name text
12+5:8 wing title.p
13+5:15 DEDENT
14+5:15 NEWLINE
tests/golden/fixture-blog-card/tree.txtnew file+7
@@ -0,0 +1,7 @@
1+(module
2+ (sur 2:1 blog)
3+ (value 4:1 card
4+ (gate 4:9
5+ (face 4:12 p (ref 4:14 post.blog))
6+ (body 5:3
7+ (call 5:3 (wing 5:3 text) (wing 5:8 title.p))))))
tests/golden/prelude-core-functions/about.txtnew file+4
@@ -0,0 +1,4 @@
1+source: Overview, Prelude: "It also holds eq, not, page, program, store, pure, island, and the layout elements and molds"; the Function helpers group includes same, head and tail.
2+tests: Initial executable prelude definitions, including identity, pair projections and loobean negation.
3+expect: parses
4+expect-types: partial inference reports the types of all four prelude gates; it does not check the module.
tests/golden/prelude-core-functions/source.jibbnew file+15
@@ -0,0 +1,15 @@
1+:: Initial prelude functions. The rest of the inventory is still to come.
2+++ same |= x=A x
3+
4+++ head |= p=[A B]
5+ ?- p
6+ [a b] a
7+
8+++ tail |= p=[A B]
9+ ?- p
10+ [a b] b
11+
12+++ not |= b=?
13+ ?- b
14+ %.y %.n
15+ %.n %.y
tests/golden/prelude-core-functions/tokens.txtnew file+68
@@ -0,0 +1,68 @@
1+2:1 glyph ++
2+2:4 name same
3+2:9 glyph |=
4+2:12 name x
5+2:13 tight glyph =
6+2:14 tight tvar A
7+2:16 name x
8+4:1 NEWLINE
9+4:1 glyph ++
10+4:4 name head
11+4:9 glyph |=
12+4:12 name p
13+4:13 tight glyph =
14+4:14 tight glyph [
15+4:15 tight tvar A
16+4:17 tvar B
17+4:18 tight glyph ]
18+5:3 INDENT
19+5:3 glyph ?-
20+5:6 name p
21+6:5 INDENT
22+6:5 glyph [
23+6:6 tight name a
24+6:8 name b
25+6:9 tight glyph ]
26+6:11 name a
27+8:1 DEDENT
28+8:1 DEDENT
29+8:1 NEWLINE
30+8:1 glyph ++
31+8:4 name tail
32+8:9 glyph |=
33+8:12 name p
34+8:13 tight glyph =
35+8:14 tight glyph [
36+8:15 tight tvar A
37+8:17 tvar B
38+8:18 tight glyph ]
39+9:3 INDENT
40+9:3 glyph ?-
41+9:6 name p
42+10:5 INDENT
43+10:5 glyph [
44+10:6 tight name a
45+10:8 name b
46+10:9 tight glyph ]
47+10:11 name b
48+12:1 DEDENT
49+12:1 DEDENT
50+12:1 NEWLINE
51+12:1 glyph ++
52+12:4 name not
53+12:8 glyph |=
54+12:11 name b
55+12:12 tight glyph =
56+12:13 tight glyph ?
57+13:3 INDENT
58+13:3 glyph ?-
59+13:6 name b
60+14:5 INDENT
61+14:5 lit %.y
62+14:9 lit %.n
63+15:5 NEWLINE
64+15:5 lit %.n
65+15:9 lit %.y
66+15:12 DEDENT
67+15:12 DEDENT
68+15:12 NEWLINE
tests/golden/prelude-core-functions/tree.txtnew file+33
@@ -0,0 +1,33 @@
1+(module
2+ (value 2:1 same
3+ (gate 2:9
4+ (face 2:12 x (tvar 2:14 A))
5+ (wing 2:16 x)))
6+ (value 4:1 head
7+ (gate 4:9
8+ (face 4:12 p
9+ (cell 4:14 (tvar 4:15 A) (tvar 4:17 B)))
10+ (body 5:3
11+ (branch 5:3
12+ (wing 5:6 p)
13+ (arm 6:5
14+ (cell 6:5 (bind 6:6 a) (bind 6:8 b))
15+ (wing 6:11 a))))))
16+ (value 8:1 tail
17+ (gate 8:9
18+ (face 8:12 p
19+ (cell 8:14 (tvar 8:15 A) (tvar 8:17 B)))
20+ (body 9:3
21+ (branch 9:3
22+ (wing 9:6 p)
23+ (arm 10:5
24+ (cell 10:5 (bind 10:6 a) (bind 10:8 b))
25+ (wing 10:11 b))))))
26+ (value 12:1 not
27+ (gate 12:8
28+ (face 12:11 b (flag 12:13))
29+ (body 13:3
30+ (branch 13:3
31+ (wing 13:6 b)
32+ (arm 14:5 (lit 14:5 %.y) (lit 14:9 %.n))
33+ (arm 15:5 (lit 15:5 %.n) (lit 15:9 %.y)))))))
tests/golden/prelude-core-functions/types.txtnew file+5
@@ -0,0 +1,5 @@
1+partial inference; module not checked
2+++ same: $-(A A)
3+++ head: $-([A B] A)
4+++ tail: $-([A B] B)
5+++ not: $-(? ?)
tests/golden/types-partial-apply/about.txtnew file+4
@@ -0,0 +1,4 @@
1+source: Grammar tab, Molds: "every expression has a principal type, and there is no subtyping".
2+tests: partial inference infers an applied gate through unification; the report does not claim the module checks.
3+expect: parses
4+expect-types: a partial inference report, not a checked module
tests/golden/types-partial-apply/source.jibbnew file+1
@@ -0,0 +1 @@
1+++ apply |=(f |=(x (f x)))
tests/golden/types-partial-apply/tokens.txtnew file+13
@@ -0,0 +1,13 @@
1+1:1 glyph ++
2+1:4 name apply
3+1:10 glyph |=(
4+1:13 tight name f
5+1:15 glyph |=(
6+1:18 tight name x
7+1:20 glyph (
8+1:21 tight name f
9+1:23 name x
10+1:24 tight glyph )
11+1:25 tight glyph )
12+1:26 tight glyph )
13+1:27 NEWLINE
tests/golden/types-partial-apply/tree.txtnew file+8
@@ -0,0 +1,8 @@
1+(module
2+ (value 1:1 apply
3+ (gate-wide 1:10
4+ (bind 1:13 f)
5+ (gate-wide 1:15
6+ (bind 1:18 x)
7+ (group 1:20
8+ (call 1:21 (wing 1:21 f) (wing 1:23 x)))))))
tests/golden/types-partial-apply/types.txtnew file+2
@@ -0,0 +1,2 @@
1+partial inference; module not checked
2+++ apply: $-($-(A B) $-(A B))
tests/golden/types-partial-aura-generalization/about.txtnew file+4
@@ -0,0 +1,4 @@
1+source: Grammar tab, Molds: "every expression has a principal type, and there is no subtyping".
2+tests: partial inference: a cast fixes the aura of a number passed through a polymorphic identity.
3+expect: parses
4+expect-types: a partial inference report, not a checked module
tests/golden/types-partial-aura-generalization/source.jibbnew file+2
@@ -0,0 +1,2 @@
1+++ id |=(x x)
2+++ hex ^- @ux (id 1)
tests/golden/types-partial-aura-generalization/tokens.txtnew file+16
@@ -0,0 +1,16 @@
1+1:1 glyph ++
2+1:4 name id
3+1:7 glyph |=(
4+1:10 tight name x
5+1:12 name x
6+1:13 tight glyph )
7+2:1 NEWLINE
8+2:1 glyph ++
9+2:4 name hex
10+2:8 glyph ^-
11+2:11 aura @ux
12+2:15 glyph (
13+2:16 tight name id
14+2:19 lit 1
15+2:20 tight glyph )
16+2:21 NEWLINE
tests/golden/types-partial-aura-generalization/tree.txtnew file+8
@@ -0,0 +1,8 @@
1+(module
2+ (value 1:1 id
3+ (gate-wide 1:7 (bind 1:10 x) (wing 1:12 x)))
4+ (value 2:1 hex
5+ (cast 2:8
6+ (aura 2:11 @ux)
7+ (group 2:15
8+ (call 2:16 (wing 2:16 id) (lit 2:19 1))))))
tests/golden/types-partial-aura-generalization/types.txtnew file+3
@@ -0,0 +1,3 @@
1+partial inference; module not checked
2+++ id: $-(A A)
3+++ hex: @ux
tests/golden/types-partial-aura/about.txtnew file+4
@@ -0,0 +1,4 @@
1+source: Grammar tab, Molds: "every expression has a principal type, and there is no subtyping".
2+tests: partial inference: an open numeric aura, an aura fixed by a cast, and an incompatible cast.
3+expect: parses
4+expect-types: a partial inference report, not a checked module
tests/golden/types-partial-aura/source.jibbnew file+3
@@ -0,0 +1,3 @@
1+++ n 1
2+++ good ^- @ux 1
3+++ bad ^- ? 1
tests/golden/types-partial-aura/tokens.txtnew file+16
@@ -0,0 +1,16 @@
1+1:1 glyph ++
2+1:4 name n
3+1:6 lit 1
4+2:1 NEWLINE
5+2:1 glyph ++
6+2:4 name good
7+2:9 glyph ^-
8+2:12 aura @ux
9+2:16 lit 1
10+3:1 NEWLINE
11+3:1 glyph ++
12+3:4 name bad
13+3:8 glyph ^-
14+3:11 glyph ?
15+3:13 lit 1
16+3:14 NEWLINE
tests/golden/types-partial-aura/tree.txtnew file+6
@@ -0,0 +1,6 @@
1+(module
2+ (value 1:1 n (lit 1:6 1))
3+ (value 2:1 good
4+ (cast 2:9 (aura 2:12 @ux) (lit 2:16 1)))
5+ (value 3:1 bad
6+ (cast 3:8 (flag 3:11) (lit 3:13 1))))
tests/golden/types-partial-aura/types.txtnew file+4
@@ -0,0 +1,4 @@
1+partial inference; module not checked
2+++ n: unresolved aura-variable inference
3+++ good: @ux
4+++ bad: cast mold and expression type do not unify
tests/golden/types-partial-explicit-capital/about.txtnew file+4
@@ -0,0 +1,4 @@
1+source: Grammar tab, Molds: "every expression has a principal type, and there is no subtyping".
2+tests: an explicit capital used in a cast to a concrete aura is reported as unsupported until rigid variables are implemented.
3+expect: parses
4+expect-types: a partial inference report, not a checked module
tests/golden/types-partial-explicit-capital/source.jibbnew file+1
@@ -0,0 +1 @@
1+++ f |= x=A ^- @t x
tests/golden/types-partial-explicit-capital/tokens.txtnew file+10
@@ -0,0 +1,10 @@
1+1:1 glyph ++
2+1:4 name f
3+1:6 glyph |=
4+1:9 name x
5+1:10 tight glyph =
6+1:11 tight tvar A
7+1:13 glyph ^-
8+1:16 aura @t
9+1:19 name x
10+1:20 NEWLINE
tests/golden/types-partial-explicit-capital/tree.txtnew file+5
@@ -0,0 +1,5 @@
1+(module
2+ (value 1:1 f
3+ (gate 1:6
4+ (face 1:9 x (tvar 1:11 A))
5+ (cast 1:13 (aura 1:16 @t) (wing 1:19 x)))))
tests/golden/types-partial-explicit-capital/types.txtnew file+2
@@ -0,0 +1,2 @@
1+partial inference; module not checked
2+++ f: explicit capital constraints are not supported by partial inference
tests/golden/types-partial-forward/about.txtnew file+4
@@ -0,0 +1,4 @@
1+source: Grammar tab, Molds: "every expression has a principal type, and there is no subtyping".
2+tests: partial inference: a forward reference remains unsupported.
3+expect: parses
4+expect-types: a partial inference report, not a checked module
tests/golden/types-partial-forward/source.jibbnew file+2
@@ -0,0 +1,2 @@
1+++ first second
2+++ second "later"
tests/golden/types-partial-forward/tokens.txtnew file+8
@@ -0,0 +1,8 @@
1+1:1 glyph ++
2+1:4 name first
3+1:10 name second
4+2:1 NEWLINE
5+2:1 glyph ++
6+2:4 name second
7+2:11 str "later"
8+2:18 NEWLINE
tests/golden/types-partial-forward/tree.txtnew file+3
@@ -0,0 +1,3 @@
1+(module
2+ (value 1:1 first (wing 1:10 second))
3+ (value 2:1 second (str 2:11 "later")))
tests/golden/types-partial-forward/types.txtnew file+3
@@ -0,0 +1,3 @@
1+partial inference; module not checked
2+++ first: name is not available to partial inference
3+++ second: @t
tests/golden/types-partial-generalization/about.txtnew file+4
@@ -0,0 +1,4 @@
1+source: Grammar tab, Molds: "every expression has a principal type, and there is no subtyping".
2+tests: partial inference: a generalized identity gate at cord and ship types.
3+expect: parses
4+expect-types: a partial inference report, not a checked module
tests/golden/types-partial-generalization/source.jibbnew file+3
@@ -0,0 +1,3 @@
1+++ id |=(x x)
2+++ word (id "hello")
3+++ ship-name (id ~zod)
tests/golden/types-partial-generalization/tokens.txtnew file+21
@@ -0,0 +1,21 @@
1+1:1 glyph ++
2+1:4 name id
3+1:7 glyph |=(
4+1:10 tight name x
5+1:12 name x
6+1:13 tight glyph )
7+2:1 NEWLINE
8+2:1 glyph ++
9+2:4 name word
10+2:9 glyph (
11+2:10 tight name id
12+2:13 str "hello"
13+2:20 tight glyph )
14+3:1 NEWLINE
15+3:1 glyph ++
16+3:4 name ship-name
17+3:14 glyph (
18+3:15 tight name id
19+3:18 lit ~zod
20+3:22 tight glyph )
21+3:23 NEWLINE
tests/golden/types-partial-generalization/tree.txtnew file+9
@@ -0,0 +1,9 @@
1+(module
2+ (value 1:1 id
3+ (gate-wide 1:7 (bind 1:10 x) (wing 1:12 x)))
4+ (value 2:1 word
5+ (group 2:9
6+ (call 2:10 (wing 2:10 id) (str 2:13 "hello"))))
7+ (value 3:1 ship-name
8+ (group 3:14
9+ (call 3:15 (wing 3:15 id) (lit 3:18 ~zod)))))
tests/golden/types-partial-generalization/types.txtnew file+4
@@ -0,0 +1,4 @@
1+partial inference; module not checked
2+++ id: $-(A A)
3+++ word: @t
4+++ ship-name: @p
tests/golden/types-partial-identity/about.txtnew file+4
@@ -0,0 +1,4 @@
1+source: Grammar tab, Molds: "every expression has a principal type, and there is no subtyping".
2+tests: partial inference infers the identity gate; the report does not claim the module checks.
3+expect: parses
4+expect-types: a partial inference report, not a checked module
tests/golden/types-partial-identity/source.jibbnew file+1
@@ -0,0 +1 @@
1+++ id |=(x x)
tests/golden/types-partial-identity/tokens.txtnew file+7
@@ -0,0 +1,7 @@
1+1:1 glyph ++
2+1:4 name id
3+1:7 glyph |=(
4+1:10 tight name x
5+1:12 name x
6+1:13 tight glyph )
7+1:14 NEWLINE
tests/golden/types-partial-identity/tree.txtnew file+3
@@ -0,0 +1,3 @@
1+(module
2+ (value 1:1 id
3+ (gate-wide 1:7 (bind 1:10 x) (wing 1:12 x))))
tests/golden/types-partial-identity/types.txtnew file+2
@@ -0,0 +1,2 @@
1+partial inference; module not checked
2+++ id: $-(A A)
tests/golden/types-partial-occurs/about.txtnew file+4
@@ -0,0 +1,4 @@
1+source: Grammar tab, Molds: "every expression has a principal type, and there is no subtyping".
2+tests: partial inference: the occurs check rejects an infinite type.
3+expect: parses
4+expect-types: a partial inference report, not a checked module
tests/golden/types-partial-occurs/source.jibbnew file+1
@@ -0,0 +1 @@
1+++ self-apply |=(x (x x))
tests/golden/types-partial-occurs/tokens.txtnew file+10
@@ -0,0 +1,10 @@
1+1:1 glyph ++
2+1:4 name self-apply
3+1:15 glyph |=(
4+1:18 tight name x
5+1:20 glyph (
6+1:21 tight name x
7+1:23 name x
8+1:24 tight glyph )
9+1:25 tight glyph )
10+1:26 NEWLINE
tests/golden/types-partial-occurs/tree.txtnew file+6
@@ -0,0 +1,6 @@
1+(module
2+ (value 1:1 self-apply
3+ (gate-wide 1:15
4+ (bind 1:18 x)
5+ (group 1:20
6+ (call 1:21 (wing 1:21 x) (wing 1:23 x))))))
tests/golden/types-partial-occurs/types.txtnew file+2
@@ -0,0 +1,2 @@
1+partial inference; module not checked
2+++ self-apply: call's sample and argument types do not unify
tests/golden/types-partial-projection/about.txtnew file+4
@@ -0,0 +1,4 @@
1+source: Grammar tab, Molds: "every expression has a principal type, and there is no subtyping".
2+tests: a polymorphic first projection applied to a ship and a cord.
3+expect: parses
4+expect-types: a partial inference report, not a checked module
tests/golden/types-partial-projection/source.jibbnew file+4
@@ -0,0 +1,4 @@
1+++ head |= p=[A B]
2+ ?- p
3+ [a b] a
4+++ who (head [~zod "hello"])
tests/golden/types-partial-projection/tokens.txtnew file+31
@@ -0,0 +1,31 @@
1+1:1 glyph ++
2+1:4 name head
3+1:9 glyph |=
4+1:12 name p
5+1:13 tight glyph =
6+1:14 tight glyph [
7+1:15 tight tvar A
8+1:17 tvar B
9+1:18 tight glyph ]
10+2:3 INDENT
11+2:3 glyph ?-
12+2:6 name p
13+3:5 INDENT
14+3:5 glyph [
15+3:6 tight name a
16+3:8 name b
17+3:9 tight glyph ]
18+3:11 name a
19+4:1 DEDENT
20+4:1 DEDENT
21+4:1 NEWLINE
22+4:1 glyph ++
23+4:4 name who
24+4:8 glyph (
25+4:9 tight name head
26+4:14 glyph [
27+4:15 tight lit ~zod
28+4:20 str "hello"
29+4:27 tight glyph ]
30+4:28 tight glyph )
31+4:29 NEWLINE
tests/golden/types-partial-projection/tree.txtnew file+16
@@ -0,0 +1,16 @@
1+(module
2+ (value 1:1 head
3+ (gate 1:9
4+ (face 1:12 p
5+ (cell 1:14 (tvar 1:15 A) (tvar 1:17 B)))
6+ (body 2:3
7+ (branch 2:3
8+ (wing 2:6 p)
9+ (arm 3:5
10+ (cell 3:5 (bind 3:6 a) (bind 3:8 b))
11+ (wing 3:11 a))))))
12+ (value 4:1 who
13+ (group 4:8
14+ (call 4:9
15+ (wing 4:9 head)
16+ (tuple 4:14 (lit 4:15 ~zod) (str 4:20 "hello"))))))
tests/golden/types-partial-projection/types.txtnew file+3
@@ -0,0 +1,3 @@
1+partial inference; module not checked
2+++ head: $-([A B] A)
3+++ who: @p
tests/golden/types-partial-shared-tvar/about.txtnew file+4
@@ -0,0 +1,4 @@
1+source: Grammar tab, Molds: "every expression has a principal type, and there is no subtyping".
2+tests: both positions of [A A] share a type: a matching ship pair checks, while a ship and a cord conflict.
3+expect: parses
4+expect-types: a partial inference report, not a checked module
tests/golden/types-partial-shared-tvar/source.jibbnew file+3
@@ -0,0 +1,3 @@
1+++ dup |= p=[A A] p
2+++ good (dup [~zod ~zod])
3+++ bad (dup [~zod "hi"])
tests/golden/types-partial-shared-tvar/tokens.txtnew file+31
@@ -0,0 +1,31 @@
1+1:1 glyph ++
2+1:4 name dup
3+1:8 glyph |=
4+1:11 name p
5+1:12 tight glyph =
6+1:13 tight glyph [
7+1:14 tight tvar A
8+1:16 tvar A
9+1:17 tight glyph ]
10+1:19 name p
11+2:1 NEWLINE
12+2:1 glyph ++
13+2:4 name good
14+2:9 glyph (
15+2:10 tight name dup
16+2:14 glyph [
17+2:15 tight lit ~zod
18+2:20 lit ~zod
19+2:24 tight glyph ]
20+2:25 tight glyph )
21+3:1 NEWLINE
22+3:1 glyph ++
23+3:4 name bad
24+3:8 glyph (
25+3:9 tight name dup
26+3:13 glyph [
27+3:14 tight lit ~zod
28+3:19 str "hi"
29+3:23 tight glyph ]
30+3:24 tight glyph )
31+3:25 NEWLINE
tests/golden/types-partial-shared-tvar/tree.txtnew file+16
@@ -0,0 +1,16 @@
1+(module
2+ (value 1:1 dup
3+ (gate 1:8
4+ (face 1:11 p
5+ (cell 1:13 (tvar 1:14 A) (tvar 1:16 A)))
6+ (wing 1:19 p)))
7+ (value 2:1 good
8+ (group 2:9
9+ (call 2:10
10+ (wing 2:10 dup)
11+ (tuple 2:14 (lit 2:15 ~zod) (lit 2:20 ~zod)))))
12+ (value 3:1 bad
13+ (group 3:8
14+ (call 3:9
15+ (wing 3:9 dup)
16+ (tuple 3:13 (lit 3:14 ~zod) (str 3:19 "hi"))))))
tests/golden/types-partial-shared-tvar/types.txtnew file+4
@@ -0,0 +1,4 @@
1+partial inference; module not checked
2+++ dup: $-([A A] [A A])
3+++ good: [@p @p]
4+++ bad: call's sample and argument types do not unify
tests/golden/types-partial-unresolved-tag/about.txtnew file+4
@@ -0,0 +1,4 @@
1+source: Grammar tab, Molds: "every expression has a principal type, and there is no subtyping".
2+tests: partial inference reports a tag whose contextual inference is not implemented; the report does not claim the module checks.
3+expect: parses
4+expect-types: a partial inference report, not a checked module
tests/golden/types-partial-unresolved-tag/source.jibbnew file+1
@@ -0,0 +1 @@
1+++ message %hello
tests/golden/types-partial-unresolved-tag/tokens.txtnew file+4
@@ -0,0 +1,4 @@
1+1:1 glyph ++
2+1:4 name message
3+1:12 lit %hello
4+1:18 NEWLINE
tests/golden/types-partial-unresolved-tag/tree.txtnew file+2
@@ -0,0 +1,2 @@
1+(module
2+ (value 1:1 message (lit 1:12 %hello)))
tests/golden/types-partial-unresolved-tag/types.txtnew file+2
@@ -0,0 +1,2 @@
1+partial inference; module not checked
2+++ message: literal needs contextual inference
tests/importer/about.txtnew file+8
@@ -0,0 +1,8 @@
1+`small.txt` exercises union and atom-or-cell cases, fields, collections,
2+recursion, and unsupported forms. `tlon-epic.txt` is the unmodified
3+`desk/sur/epic.hoon` from tloncorp/tlon-apps at commit
4+38f9328f4580000a37a7fdc3ab820fcd65069487; its MIT license is in
5+`tlon-license.txt`. The files use .txt so -test does not build them as
6+Hoon tests. The separately stored tree.txt is a diagnostic projection of the internal
7+type graph, not the Jibb type printer. It runs under eval and on the fake
8+ship; +fixture-test also checks the underlying structured values.
tests/importer/small.txtnew file+16
@@ -0,0 +1,16 @@
1+|%
2++$ action $%([%add text=@t] [%remove id=@ud])
3++$ item [id=@ud text=@t]
4++$ optional $@(@ud [name=@t stamp=@ud])
5++$ items (map @ud item)
6++$ chain $@(~ [value=@ud next=chain])
7++$ containers [(set @ud) (qeu @ud) (list @t) (unit @ud)]
8++$ jar-test (jar @ud @t)
9++$ jug-test (jug @ud @t)
10++$ nested-jar [field=(jar @ud @t)]
11++$ signed @sd
12++$ float @rd
13++$ gate-test $-(@ud @ud)
14++$ valid-cell $^(@ud [x=@ud])
15++$ invalid-cell $^(@ud @ud)
16+--
tests/importer/tlon-epic.txtnew file+15
@@ -0,0 +1,15 @@
1+|%
2+:: $saga: version synchronisation state
3+:: %dex: publisher is ahead
4+:: %lev: we are ahead
5+:: %chi: full sync
6+::
7++$ saga
8+ $~ [%lev ~]
9+ $% [%dex ver=@ud]
10+ [%lev ~]
11+ [%chi ~]
12+ ==
13+
14++$ epic @ud
15+--
tests/importer/tlon-license.txtnew file+21
@@ -0,0 +1,21 @@
1+The MIT License (MIT)
2+
3+Copyright (c) 2022-present Tlon Corporation
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.
tests/importer/tree.txtnew file+16
@@ -0,0 +1,16 @@
1+action: (union [add text=@t] [remove id=@ud])
2+optional: (union [name=@t stamp=@ud] @ud)
3+items: (map @ud [id=@ud text=@t])
4+containers: [(set @ud) [(qeu @ud) [(list @t) (unit @ud)]]]
5+chain: (union [value=@ud next=chain.small] @n:0)
6+jar: (jar @ud @t)
7+jug: (jug @ud @t)
8+nested-jar: error: a nested jar, jug or mop needs source-aware import
9+signed: error: signed and float auras cannot be imported
10+float: error: signed and float auras cannot be imported
11+gate: error: cores and gates cannot be imported
12+vase: error: vases cannot be imported
13+valid-cell: error: a Hoon $^ union needs a source-level disjointness check
14+invalid-cell: error: a Hoon $^ union needs a source-level disjointness check
15+tlon-saga: (union [chi @n:0] [lev @n:0] [dex ver=@ud])
16+tlon-epic: @ud
tests/lib/jibb-import.hoonnew file+22
@@ -0,0 +1,22 @@
1+:: The importer fixtures and their golden output, read as text so -test
2+:: does not try to compile the fixture /sur files as test programs.
3+/+ jibb-import
4+/* small %txt /tests/importer/small/txt
5+/* epic %txt /tests/importer/tlon-epic/txt
6+/* expected %txt /tests/importer/tree/txt
7+|%
8+++ lines-to-cord
9+ |= lines=wain
10+ ^- @t
11+ (rap 3 (turn lines |=(line=@t (cat 3 line '\0a'))))
12+::
13+++ test-importer-golden
14+ ^- tang
15+ ?~ small ~[leaf+"small importer fixture is missing"]
16+ ?~ epic ~[leaf+"Tlon importer fixture is missing"]
17+ ?~ expected ~[leaf+"importer golden output is missing"]
18+ =/ actual (fixture-output:jibb-import (lines-to-cord small) (lines-to-cord epic))
19+ ?. =(actual expected)
20+ ~[leaf+"importer projection differs from tests/importer/tree.txt"]
21+ ~
22+--
tests/lib/jibb-typecheck.hoonnew file+14
@@ -0,0 +1,14 @@
1+:: Check the partial inference unifier on the ship against its golden output.
2+/+ jibb
3+/* expected %txt /tests/checker/unification/txt
4+|%
5+++ test-unification
6+ ^- tang
7+ ?~ expected ~[leaf+"unification golden is missing"]
8+ =/ failures=(list tape) itype-unify-test:jibb
9+ =/ actual=wain
10+ ?~ failures ~['unification passed']
11+ (turn failures crip)
12+ ?: =(actual expected) ~
13+ ~[leaf+"unification output differs from tests/checker/unification.txt"]
14+--
tests/lib/jibb.hoon+1515−1424
@@ -5,12 +5,12 @@
5:: after changing the cases.
5:: after changing the cases.
6::
6::
7:: Each test- arm runs golden:jibb on one case's source.jibb, with the
7:: Each test- arm runs golden:jibb on one case's source.jibb, with the
8−:: file set to the case's Clay path, /tests/golden/<case>/source/jibb,
8+:: file set to /tests/golden/<case>/source/jibb or the logical path in
9−:: and compares the outputs with tokens.txt and tree.txt, which hold
9+:: path.txt, and compares the outputs with tokens.txt and tree.txt.
10−:: the output plus one trailing newline, as in tools/golden. The
10+:: Each file holds the output plus one newline. An expect-types: line
11+:: or types.txt opts a case into golden-types and its types.txt output.
11−:: files come in at build time through /*; a missing tokens.txt or
12+:: Files come in through /*; a missing expected output fails its case.
12−:: tree.txt fails its case. tools/ship test syncs the jibb-dev desk
13−:: and runs these with -test /=jibb-dev=/tests.
13+:: tools/ship test syncs the desk and runs -test /=jibb-dev=/tests.
14::
14::
15:: The .txt files reach Clay through the %txt mark, as lines, so the
15:: The .txt files reach Clay through the %txt mark, as lines, so the
16:: test compares lines: the file's with those of the output plus a
16:: test compares lines: the file's with those of the output plus a
@@ -62,1068 +62,1122 @@
62/* src-14 %jibb /tests/golden/doc-overview-11-index/source/jibb
62/* src-14 %jibb /tests/golden/doc-overview-11-index/source/jibb
63/* tok-14 %txt /tests/golden/doc-overview-11-index/tokens/txt
63/* tok-14 %txt /tests/golden/doc-overview-11-index/tokens/txt
64/* tre-14 %txt /tests/golden/doc-overview-11-index/tree/txt
64/* tre-14 %txt /tests/golden/doc-overview-11-index/tree/txt
65−/* src-15 %jibb /tests/golden/inline-base32/source/jibb
65+/* src-15 %jibb /tests/golden/fixture-blog-api/source/jibb
66−/* tok-15 %txt /tests/golden/inline-base32/tokens/txt
66+/* tok-15 %txt /tests/golden/fixture-blog-api/tokens/txt
67−/* tre-15 %txt /tests/golden/inline-base32/tree/txt
67+/* tre-15 %txt /tests/golden/fixture-blog-api/tree/txt
68−/* src-16 %jibb /tests/golden/inline-call/source/jibb
68+/* src-16 %jibb /tests/golden/fixture-blog-card/source/jibb
69−/* tok-16 %txt /tests/golden/inline-call/tokens/txt
69+/* tok-16 %txt /tests/golden/fixture-blog-card/tokens/txt
70−/* tre-16 %txt /tests/golden/inline-call/tree/txt
70+/* tre-16 %txt /tests/golden/fixture-blog-card/tree/txt
71−/* src-17 %jibb /tests/golden/inline-cell/source/jibb
71+/* src-17 %jibb /tests/golden/inline-base32/source/jibb
72−/* tok-17 %txt /tests/golden/inline-cell/tokens/txt
72+/* tok-17 %txt /tests/golden/inline-base32/tokens/txt
73−/* tre-17 %txt /tests/golden/inline-cell/tree/txt
73+/* tre-17 %txt /tests/golden/inline-base32/tree/txt
74−/* src-18 %jibb /tests/golden/inline-change-done/source/jibb
74+/* src-18 %jibb /tests/golden/inline-call/source/jibb
75−/* tok-18 %txt /tests/golden/inline-change-done/tokens/txt
75+/* tok-18 %txt /tests/golden/inline-call/tokens/txt
76−/* tre-18 %txt /tests/golden/inline-change-done/tree/txt
76+/* tre-18 %txt /tests/golden/inline-call/tree/txt
77−/* src-19 %jibb /tests/golden/inline-change-draft/source/jibb
77+/* src-19 %jibb /tests/golden/inline-cell/source/jibb
78−/* tok-19 %txt /tests/golden/inline-change-draft/tokens/txt
78+/* tok-19 %txt /tests/golden/inline-cell/tokens/txt
79−/* tre-19 %txt /tests/golden/inline-change-draft/tree/txt
79+/* tre-19 %txt /tests/golden/inline-cell/tree/txt
80−/* src-20 %jibb /tests/golden/inline-crash/source/jibb
80+/* src-20 %jibb /tests/golden/inline-change-done/source/jibb
81−/* tok-20 %txt /tests/golden/inline-crash/tokens/txt
81+/* tok-20 %txt /tests/golden/inline-change-done/tokens/txt
82−/* tre-20 %txt /tests/golden/inline-crash/tree/txt
82+/* tre-20 %txt /tests/golden/inline-change-done/tree/txt
83−/* src-21 %jibb /tests/golden/inline-crash-call/source/jibb
83+/* src-21 %jibb /tests/golden/inline-change-draft/source/jibb
84−/* tok-21 %txt /tests/golden/inline-crash-call/tokens/txt
84+/* tok-21 %txt /tests/golden/inline-change-draft/tokens/txt
85−/* tre-21 %txt /tests/golden/inline-crash-call/tree/txt
85+/* tre-21 %txt /tests/golden/inline-change-draft/tree/txt
86−/* src-22 %jibb /tests/golden/inline-crash-operands/source/jibb
86+/* src-22 %jibb /tests/golden/inline-crash/source/jibb
87−/* tok-22 %txt /tests/golden/inline-crash-operands/tokens/txt
87+/* tok-22 %txt /tests/golden/inline-crash/tokens/txt
88−/* tre-22 %txt /tests/golden/inline-crash-operands/tree/txt
88+/* tre-22 %txt /tests/golden/inline-crash/tree/txt
89−/* src-23 %jibb /tests/golden/inline-ctor-typed/source/jibb
89+/* src-23 %jibb /tests/golden/inline-crash-call/source/jibb
90−/* tok-23 %txt /tests/golden/inline-ctor-typed/tokens/txt
90+/* tok-23 %txt /tests/golden/inline-crash-call/tokens/txt
91−/* tre-23 %txt /tests/golden/inline-ctor-typed/tree/txt
91+/* tre-23 %txt /tests/golden/inline-crash-call/tree/txt
92−/* src-24 %jibb /tests/golden/inline-date/source/jibb
92+/* src-24 %jibb /tests/golden/inline-crash-operands/source/jibb
93−/* tok-24 %txt /tests/golden/inline-date/tokens/txt
93+/* tok-24 %txt /tests/golden/inline-crash-operands/tokens/txt
94−/* tre-24 %txt /tests/golden/inline-date/tree/txt
94+/* tre-24 %txt /tests/golden/inline-crash-operands/tree/txt
95−/* src-25 %jibb /tests/golden/inline-decimal/source/jibb
95+/* src-25 %jibb /tests/golden/inline-ctor-typed/source/jibb
96−/* tok-25 %txt /tests/golden/inline-decimal/tokens/txt
96+/* tok-25 %txt /tests/golden/inline-ctor-typed/tokens/txt
97−/* tre-25 %txt /tests/golden/inline-decimal/tree/txt
97+/* tre-25 %txt /tests/golden/inline-ctor-typed/tree/txt
98−/* src-26 %jibb /tests/golden/inline-duration/source/jibb
98+/* src-26 %jibb /tests/golden/inline-date/source/jibb
99−/* tok-26 %txt /tests/golden/inline-duration/tokens/txt
99+/* tok-26 %txt /tests/golden/inline-date/tokens/txt
100−/* tre-26 %txt /tests/golden/inline-duration/tree/txt
100+/* tre-26 %txt /tests/golden/inline-date/tree/txt
101−/* src-27 %jibb /tests/golden/inline-fold-mold/source/jibb
101+/* src-27 %jibb /tests/golden/inline-decimal/source/jibb
102−/* tok-27 %txt /tests/golden/inline-fold-mold/tokens/txt
102+/* tok-27 %txt /tests/golden/inline-decimal/tokens/txt
103−/* tre-27 %txt /tests/golden/inline-fold-mold/tree/txt
103+/* tre-27 %txt /tests/golden/inline-decimal/tree/txt
104−/* src-28 %jibb /tests/golden/inline-gate-after-definition-bad/source/jibb
104+/* src-28 %jibb /tests/golden/inline-duration/source/jibb
105−/* tok-28 %txt /tests/golden/inline-gate-after-definition-bad/tokens/txt
105+/* tok-28 %txt /tests/golden/inline-duration/tokens/txt
106−/* tre-28 %txt /tests/golden/inline-gate-after-definition-bad/tree/txt
106+/* tre-28 %txt /tests/golden/inline-duration/tree/txt
107−/* src-29 %jibb /tests/golden/inline-gate-field-bad/source/jibb
107+/* src-29 %jibb /tests/golden/inline-fold-mold/source/jibb
108−/* tok-29 %txt /tests/golden/inline-gate-field-bad/tokens/txt
108+/* tok-29 %txt /tests/golden/inline-fold-mold/tokens/txt
109−/* tre-29 %txt /tests/golden/inline-gate-field-bad/tree/txt
109+/* tre-29 %txt /tests/golden/inline-fold-mold/tree/txt
110−/* src-30 %jibb /tests/golden/inline-gate-mold/source/jibb
110+/* src-30 %jibb /tests/golden/inline-gate-after-definition-bad/source/jibb
111−/* tok-30 %txt /tests/golden/inline-gate-mold/tokens/txt
111+/* tok-30 %txt /tests/golden/inline-gate-after-definition-bad/tokens/txt
112−/* tre-30 %txt /tests/golden/inline-gate-mold/tree/txt
112+/* tre-30 %txt /tests/golden/inline-gate-after-definition-bad/tree/txt
113−/* src-31 %jibb /tests/golden/inline-gate-sample-binds/source/jibb
113+/* src-31 %jibb /tests/golden/inline-gate-field-bad/source/jibb
114−/* tok-31 %txt /tests/golden/inline-gate-sample-binds/tokens/txt
114+/* tok-31 %txt /tests/golden/inline-gate-field-bad/tokens/txt
115−/* tre-31 %txt /tests/golden/inline-gate-sample-binds/tree/txt
115+/* tre-31 %txt /tests/golden/inline-gate-field-bad/tree/txt
116−/* src-32 %jibb /tests/golden/inline-gate-samples/source/jibb
116+/* src-32 %jibb /tests/golden/inline-gate-mold/source/jibb
117−/* tok-32 %txt /tests/golden/inline-gate-samples/tokens/txt
117+/* tok-32 %txt /tests/golden/inline-gate-mold/tokens/txt
118−/* tre-32 %txt /tests/golden/inline-gate-samples/tree/txt
118+/* tre-32 %txt /tests/golden/inline-gate-mold/tree/txt
119−/* src-33 %jibb /tests/golden/inline-gate-wide/source/jibb
119+/* src-33 %jibb /tests/golden/inline-gate-sample-binds/source/jibb
120−/* tok-33 %txt /tests/golden/inline-gate-wide/tokens/txt
120+/* tok-33 %txt /tests/golden/inline-gate-sample-binds/tokens/txt
121−/* tre-33 %txt /tests/golden/inline-gate-wide/tree/txt
121+/* tre-33 %txt /tests/golden/inline-gate-sample-binds/tree/txt
122−/* src-34 %jibb /tests/golden/inline-generic-apply-bad/source/jibb
122+/* src-34 %jibb /tests/golden/inline-gate-samples/source/jibb
123−/* tok-34 %txt /tests/golden/inline-generic-apply-bad/tokens/txt
123+/* tok-34 %txt /tests/golden/inline-gate-samples/tokens/txt
124−/* tre-34 %txt /tests/golden/inline-generic-apply-bad/tree/txt
124+/* tre-34 %txt /tests/golden/inline-gate-samples/tree/txt
125−/* src-35 %jibb /tests/golden/inline-generic-both-bad/source/jibb
125+/* src-35 %jibb /tests/golden/inline-gate-wide/source/jibb
126−/* tok-35 %txt /tests/golden/inline-generic-both-bad/tokens/txt
126+/* tok-35 %txt /tests/golden/inline-gate-wide/tokens/txt
127−/* tre-35 %txt /tests/golden/inline-generic-both-bad/tree/txt
127+/* tre-35 %txt /tests/golden/inline-gate-wide/tree/txt
128−/* src-36 %jibb /tests/golden/inline-generic-case-bad/source/jibb
128+/* src-36 %jibb /tests/golden/inline-generic-apply-bad/source/jibb
129−/* tok-36 %txt /tests/golden/inline-generic-case-bad/tokens/txt
129+/* tok-36 %txt /tests/golden/inline-generic-apply-bad/tokens/txt
130−/* tre-36 %txt /tests/golden/inline-generic-case-bad/tree/txt
130+/* tre-36 %txt /tests/golden/inline-generic-apply-bad/tree/txt
131−/* src-37 %jibb /tests/golden/inline-generic-cast-bad/source/jibb
131+/* src-37 %jibb /tests/golden/inline-generic-both-bad/source/jibb
132−/* tok-37 %txt /tests/golden/inline-generic-cast-bad/tokens/txt
132+/* tok-37 %txt /tests/golden/inline-generic-both-bad/tokens/txt
133−/* tre-37 %txt /tests/golden/inline-generic-cast-bad/tree/txt
133+/* tre-37 %txt /tests/golden/inline-generic-both-bad/tree/txt
134−/* src-38 %jibb /tests/golden/inline-generic-empty-bad/source/jibb
134+/* src-38 %jibb /tests/golden/inline-generic-case-bad/source/jibb
135−/* tok-38 %txt /tests/golden/inline-generic-empty-bad/tokens/txt
135+/* tok-38 %txt /tests/golden/inline-generic-case-bad/tokens/txt
136−/* tre-38 %txt /tests/golden/inline-generic-empty-bad/tree/txt
136+/* tre-38 %txt /tests/golden/inline-generic-case-bad/tree/txt
137−/* src-39 %jibb /tests/golden/inline-generic-field-bad/source/jibb
137+/* src-39 %jibb /tests/golden/inline-generic-cast-bad/source/jibb
138−/* tok-39 %txt /tests/golden/inline-generic-field-bad/tokens/txt
138+/* tok-39 %txt /tests/golden/inline-generic-cast-bad/tokens/txt
139−/* tre-39 %txt /tests/golden/inline-generic-field-bad/tree/txt
139+/* tre-39 %txt /tests/golden/inline-generic-cast-bad/tree/txt
140−/* src-40 %jibb /tests/golden/inline-generic-mold/source/jibb
140+/* src-40 %jibb /tests/golden/inline-generic-empty-bad/source/jibb
141−/* tok-40 %txt /tests/golden/inline-generic-mold/tokens/txt
141+/* tok-40 %txt /tests/golden/inline-generic-empty-bad/tokens/txt
142−/* tre-40 %txt /tests/golden/inline-generic-mold/tree/txt
142+/* tre-40 %txt /tests/golden/inline-generic-empty-bad/tree/txt
143−/* src-41 %jibb /tests/golden/inline-generic-prefix-bad/source/jibb
143+/* src-41 %jibb /tests/golden/inline-generic-field-bad/source/jibb
144−/* tok-41 %txt /tests/golden/inline-generic-prefix-bad/tokens/txt
144+/* tok-41 %txt /tests/golden/inline-generic-field-bad/tokens/txt
145−/* tre-41 %txt /tests/golden/inline-generic-prefix-bad/tree/txt
145+/* tre-41 %txt /tests/golden/inline-generic-field-bad/tree/txt
146−/* src-42 %jibb /tests/golden/inline-hex/source/jibb
146+/* src-42 %jibb /tests/golden/inline-generic-mold/source/jibb
147−/* tok-42 %txt /tests/golden/inline-hex/tokens/txt
147+/* tok-42 %txt /tests/golden/inline-generic-mold/tokens/txt
148−/* tre-42 %txt /tests/golden/inline-hex/tree/txt
148+/* tre-42 %txt /tests/golden/inline-generic-mold/tree/txt
149−/* src-43 %jibb /tests/golden/inline-hoon-union-apply-bad/source/jibb
149+/* src-43 %jibb /tests/golden/inline-generic-prefix-bad/source/jibb
150−/* tok-43 %txt /tests/golden/inline-hoon-union-apply-bad/tokens/txt
150+/* tok-43 %txt /tests/golden/inline-generic-prefix-bad/tokens/txt
151−/* tre-43 %txt /tests/golden/inline-hoon-union-apply-bad/tree/txt
151+/* tre-43 %txt /tests/golden/inline-generic-prefix-bad/tree/txt
152−/* src-44 %jibb /tests/golden/inline-hoon-union-cast-bad/source/jibb
152+/* src-44 %jibb /tests/golden/inline-hex/source/jibb
153−/* tok-44 %txt /tests/golden/inline-hoon-union-cast-bad/tokens/txt
153+/* tok-44 %txt /tests/golden/inline-hex/tokens/txt
154−/* tre-44 %txt /tests/golden/inline-hoon-union-cast-bad/tree/txt
154+/* tre-44 %txt /tests/golden/inline-hex/tree/txt
155−/* src-45 %jibb /tests/golden/inline-hoon-union-definition-bad/source/jibb
155+/* src-45 %jibb /tests/golden/inline-hoon-union-apply-bad/source/jibb
156−/* tok-45 %txt /tests/golden/inline-hoon-union-definition-bad/tokens/txt
156+/* tok-45 %txt /tests/golden/inline-hoon-union-apply-bad/tokens/txt
157−/* tre-45 %txt /tests/golden/inline-hoon-union-definition-bad/tree/txt
157+/* tre-45 %txt /tests/golden/inline-hoon-union-apply-bad/tree/txt
158−/* src-46 %jibb /tests/golden/inline-hoon-union-field-bad/source/jibb
158+/* src-46 %jibb /tests/golden/inline-hoon-union-cast-bad/source/jibb
159−/* tok-46 %txt /tests/golden/inline-hoon-union-field-bad/tokens/txt
159+/* tok-46 %txt /tests/golden/inline-hoon-union-cast-bad/tokens/txt
160−/* tre-46 %txt /tests/golden/inline-hoon-union-field-bad/tree/txt
160+/* tre-46 %txt /tests/golden/inline-hoon-union-cast-bad/tree/txt
161−/* src-47 %jibb /tests/golden/inline-hoon-union-gate-bad/source/jibb
161+/* src-47 %jibb /tests/golden/inline-hoon-union-definition-bad/source/jibb
162−/* tok-47 %txt /tests/golden/inline-hoon-union-gate-bad/tokens/txt
162+/* tok-47 %txt /tests/golden/inline-hoon-union-definition-bad/tokens/txt
163−/* tre-47 %txt /tests/golden/inline-hoon-union-gate-bad/tree/txt
163+/* tre-47 %txt /tests/golden/inline-hoon-union-definition-bad/tree/txt
164−/* src-48 %jibb /tests/golden/inline-hoon-union-nested-sample-bad/source/jibb
164+/* src-48 %jibb /tests/golden/inline-hoon-union-field-bad/source/jibb
165−/* tok-48 %txt /tests/golden/inline-hoon-union-nested-sample-bad/tokens/txt
165+/* tok-48 %txt /tests/golden/inline-hoon-union-field-bad/tokens/txt
166−/* tre-48 %txt /tests/golden/inline-hoon-union-nested-sample-bad/tree/txt
166+/* tre-48 %txt /tests/golden/inline-hoon-union-field-bad/tree/txt
167−/* src-49 %jibb /tests/golden/inline-hoon-union-open-apply-bad/source/jibb
167+/* src-49 %jibb /tests/golden/inline-hoon-union-gate-bad/source/jibb
168−/* tok-49 %txt /tests/golden/inline-hoon-union-open-apply-bad/tokens/txt
168+/* tok-49 %txt /tests/golden/inline-hoon-union-gate-bad/tokens/txt
169−/* tre-49 %txt /tests/golden/inline-hoon-union-open-apply-bad/tree/txt
169+/* tre-49 %txt /tests/golden/inline-hoon-union-gate-bad/tree/txt
170−/* src-50 %jibb /tests/golden/inline-hoon-union-open-field-bad/source/jibb
170+/* src-50 %jibb /tests/golden/inline-hoon-union-nested-sample-bad/source/jibb
171−/* tok-50 %txt /tests/golden/inline-hoon-union-open-field-bad/tokens/txt
171+/* tok-50 %txt /tests/golden/inline-hoon-union-nested-sample-bad/tokens/txt
172−/* tre-50 %txt /tests/golden/inline-hoon-union-open-field-bad/tree/txt
172+/* tre-50 %txt /tests/golden/inline-hoon-union-nested-sample-bad/tree/txt
173−/* src-51 %jibb /tests/golden/inline-hoon-union-sample-bad/source/jibb
173+/* src-51 %jibb /tests/golden/inline-hoon-union-open-apply-bad/source/jibb
174−/* tok-51 %txt /tests/golden/inline-hoon-union-sample-bad/tokens/txt
174+/* tok-51 %txt /tests/golden/inline-hoon-union-open-apply-bad/tokens/txt
175−/* tre-51 %txt /tests/golden/inline-hoon-union-sample-bad/tree/txt
175+/* tre-51 %txt /tests/golden/inline-hoon-union-open-apply-bad/tree/txt
176−/* src-52 %jibb /tests/golden/inline-hoon-union-wide-sample-bad/source/jibb
176+/* src-52 %jibb /tests/golden/inline-hoon-union-open-field-bad/source/jibb
177−/* tok-52 %txt /tests/golden/inline-hoon-union-wide-sample-bad/tokens/txt
177+/* tok-52 %txt /tests/golden/inline-hoon-union-open-field-bad/tokens/txt
178−/* tre-52 %txt /tests/golden/inline-hoon-union-wide-sample-bad/tree/txt
178+/* tre-52 %txt /tests/golden/inline-hoon-union-open-field-bad/tree/txt
179−/* src-53 %jibb /tests/golden/inline-import-mark-face-bad/source/jibb
179+/* src-53 %jibb /tests/golden/inline-hoon-union-sample-bad/source/jibb
180−/* tok-53 %txt /tests/golden/inline-import-mark-face-bad/tokens/txt
180+/* tok-53 %txt /tests/golden/inline-hoon-union-sample-bad/tokens/txt
181−/* tre-53 %txt /tests/golden/inline-import-mark-face-bad/tree/txt
181+/* tre-53 %txt /tests/golden/inline-hoon-union-sample-bad/tree/txt
182−/* src-54 %jibb /tests/golden/inline-import-root-bad/source/jibb
182+/* src-54 %jibb /tests/golden/inline-hoon-union-wide-sample-bad/source/jibb
183−/* tok-54 %txt /tests/golden/inline-import-root-bad/tokens/txt
183+/* tok-54 %txt /tests/golden/inline-hoon-union-wide-sample-bad/tokens/txt
184−/* tre-54 %txt /tests/golden/inline-import-root-bad/tree/txt
184+/* tre-54 %txt /tests/golden/inline-hoon-union-wide-sample-bad/tree/txt
185−/* src-55 %jibb /tests/golden/inline-imports-after-definition/source/jibb
185+/* src-55 %jibb /tests/golden/inline-import-mark-face-bad/source/jibb
186−/* tok-55 %txt /tests/golden/inline-imports-after-definition/tokens/txt
186+/* tok-55 %txt /tests/golden/inline-import-mark-face-bad/tokens/txt
187−/* tre-55 %txt /tests/golden/inline-imports-after-definition/tree/txt
187+/* tre-55 %txt /tests/golden/inline-import-mark-face-bad/tree/txt
188−/* src-56 %jibb /tests/golden/inline-island/source/jibb
188+/* src-56 %jibb /tests/golden/inline-import-root-bad/source/jibb
189−/* tok-56 %txt /tests/golden/inline-island/tokens/txt
189+/* tok-56 %txt /tests/golden/inline-import-root-bad/tokens/txt
190−/* tre-56 %txt /tests/golden/inline-island/tree/txt
190+/* tre-56 %txt /tests/golden/inline-import-root-bad/tree/txt
191−/* src-57 %jibb /tests/golden/inline-kinds/source/jibb
191+/* src-57 %jibb /tests/golden/inline-imports-after-definition/source/jibb
192−/* tok-57 %txt /tests/golden/inline-kinds/tokens/txt
192+/* tok-57 %txt /tests/golden/inline-imports-after-definition/tokens/txt
193−/* tre-57 %txt /tests/golden/inline-kinds/tree/txt
193+/* tre-57 %txt /tests/golden/inline-imports-after-definition/tree/txt
194−/* src-58 %jibb /tests/golden/inline-knot/source/jibb
194+/* src-58 %jibb /tests/golden/inline-island/source/jibb
195−/* tok-58 %txt /tests/golden/inline-knot/tokens/txt
195+/* tok-58 %txt /tests/golden/inline-island/tokens/txt
196−/* tre-58 %txt /tests/golden/inline-knot/tree/txt
196+/* tre-58 %txt /tests/golden/inline-island/tree/txt
197−/* src-59 %jibb /tests/golden/inline-leftout-barcab/source/jibb
197+/* src-59 %jibb /tests/golden/inline-kinds/source/jibb
198−/* tok-59 %txt /tests/golden/inline-leftout-barcab/tokens/txt
198+/* tok-59 %txt /tests/golden/inline-kinds/tokens/txt
199−/* tre-59 %txt /tests/golden/inline-leftout-barcab/tree/txt
199+/* tre-59 %txt /tests/golden/inline-kinds/tree/txt
200−/* src-60 %jibb /tests/golden/inline-leftout-barcen/source/jibb
200+/* src-60 %jibb /tests/golden/inline-knot/source/jibb
201−/* tok-60 %txt /tests/golden/inline-leftout-barcen/tokens/txt
201+/* tok-60 %txt /tests/golden/inline-knot/tokens/txt
202−/* tre-60 %txt /tests/golden/inline-leftout-barcen/tree/txt
202+/* tre-60 %txt /tests/golden/inline-knot/tree/txt
203−/* src-61 %jibb /tests/golden/inline-leftout-barcen-2/source/jibb
203+/* src-61 %jibb /tests/golden/inline-leftout-barcab/source/jibb
204−/* tok-61 %txt /tests/golden/inline-leftout-barcen-2/tokens/txt
204+/* tok-61 %txt /tests/golden/inline-leftout-barcab/tokens/txt
205−/* tre-61 %txt /tests/golden/inline-leftout-barcen-2/tree/txt
205+/* tre-61 %txt /tests/golden/inline-leftout-barcab/tree/txt
206−/* src-62 %jibb /tests/golden/inline-leftout-barcen-3/source/jibb
206+/* src-62 %jibb /tests/golden/inline-leftout-barcen/source/jibb
207−/* tok-62 %txt /tests/golden/inline-leftout-barcen-3/tokens/txt
207+/* tok-62 %txt /tests/golden/inline-leftout-barcen/tokens/txt
208−/* tre-62 %txt /tests/golden/inline-leftout-barcen-3/tree/txt
208+/* tre-62 %txt /tests/golden/inline-leftout-barcen/tree/txt
209−/* src-63 %jibb /tests/golden/inline-leftout-barhep/source/jibb
209+/* src-63 %jibb /tests/golden/inline-leftout-barcen-2/source/jibb
210−/* tok-63 %txt /tests/golden/inline-leftout-barhep/tokens/txt
210+/* tok-63 %txt /tests/golden/inline-leftout-barcen-2/tokens/txt
211−/* tre-63 %txt /tests/golden/inline-leftout-barhep/tree/txt
211+/* tre-63 %txt /tests/golden/inline-leftout-barcen-2/tree/txt
212−/* src-64 %jibb /tests/golden/inline-leftout-bartar/source/jibb
212+/* src-64 %jibb /tests/golden/inline-leftout-barcen-3/source/jibb
213−/* tok-64 %txt /tests/golden/inline-leftout-bartar/tokens/txt
213+/* tok-64 %txt /tests/golden/inline-leftout-barcen-3/tokens/txt
214−/* tre-64 %txt /tests/golden/inline-leftout-bartar/tree/txt
214+/* tre-64 %txt /tests/golden/inline-leftout-barcen-3/tree/txt
215−/* src-65 %jibb /tests/golden/inline-leftout-buc-alone/source/jibb
215+/* src-65 %jibb /tests/golden/inline-leftout-barhep/source/jibb
216−/* tok-65 %txt /tests/golden/inline-leftout-buc-alone/tokens/txt
216+/* tok-65 %txt /tests/golden/inline-leftout-barhep/tokens/txt
217−/* tre-65 %txt /tests/golden/inline-leftout-buc-alone/tree/txt
217+/* tre-65 %txt /tests/golden/inline-leftout-barhep/tree/txt
218−/* src-66 %jibb /tests/golden/inline-leftout-buc-paren/source/jibb
218+/* src-66 %jibb /tests/golden/inline-leftout-bartar/source/jibb
219−/* tok-66 %txt /tests/golden/inline-leftout-buc-paren/tokens/txt
219+/* tok-66 %txt /tests/golden/inline-leftout-bartar/tokens/txt
220−/* tre-66 %txt /tests/golden/inline-leftout-buc-paren/tree/txt
220+/* tre-66 %txt /tests/golden/inline-leftout-bartar/tree/txt
221−/* src-67 %jibb /tests/golden/inline-leftout-buc-paren-2/source/jibb
221+/* src-67 %jibb /tests/golden/inline-leftout-buc-alone/source/jibb
222−/* tok-67 %txt /tests/golden/inline-leftout-buc-paren-2/tokens/txt
222+/* tok-67 %txt /tests/golden/inline-leftout-buc-alone/tokens/txt
223−/* tre-67 %txt /tests/golden/inline-leftout-buc-paren-2/tree/txt
223+/* tre-67 %txt /tests/golden/inline-leftout-buc-alone/tree/txt
224−/* src-68 %jibb /tests/golden/inline-leftout-buc-paren-3/source/jibb
224+/* src-68 %jibb /tests/golden/inline-leftout-buc-paren/source/jibb
225−/* tok-68 %txt /tests/golden/inline-leftout-buc-paren-3/tokens/txt
225+/* tok-68 %txt /tests/golden/inline-leftout-buc-paren/tokens/txt
226−/* tre-68 %txt /tests/golden/inline-leftout-buc-paren-3/tree/txt
226+/* tre-68 %txt /tests/golden/inline-leftout-buc-paren/tree/txt
227−/* src-69 %jibb /tests/golden/inline-leftout-buccen/source/jibb
227+/* src-69 %jibb /tests/golden/inline-leftout-buc-paren-2/source/jibb
228−/* tok-69 %txt /tests/golden/inline-leftout-buccen/tokens/txt
228+/* tok-69 %txt /tests/golden/inline-leftout-buc-paren-2/tokens/txt
229−/* tre-69 %txt /tests/golden/inline-leftout-buccen/tree/txt
229+/* tre-69 %txt /tests/golden/inline-leftout-buc-paren-2/tree/txt
230−/* src-70 %jibb /tests/golden/inline-leftout-cencol/source/jibb
230+/* src-70 %jibb /tests/golden/inline-leftout-buc-paren-3/source/jibb
231−/* tok-70 %txt /tests/golden/inline-leftout-cencol/tokens/txt
231+/* tok-70 %txt /tests/golden/inline-leftout-buc-paren-3/tokens/txt
232−/* tre-70 %txt /tests/golden/inline-leftout-cencol/tree/txt
232+/* tre-70 %txt /tests/golden/inline-leftout-buc-paren-3/tree/txt
233−/* src-71 %jibb /tests/golden/inline-leftout-cenhep/source/jibb
233+/* src-71 %jibb /tests/golden/inline-leftout-buccen/source/jibb
234−/* tok-71 %txt /tests/golden/inline-leftout-cenhep/tokens/txt
234+/* tok-71 %txt /tests/golden/inline-leftout-buccen/tokens/txt
235−/* tre-71 %txt /tests/golden/inline-leftout-cenhep/tree/txt
235+/* tre-71 %txt /tests/golden/inline-leftout-buccen/tree/txt
236−/* src-72 %jibb /tests/golden/inline-leftout-centis/source/jibb
236+/* src-72 %jibb /tests/golden/inline-leftout-cencol/source/jibb
237−/* tok-72 %txt /tests/golden/inline-leftout-centis/tokens/txt
237+/* tok-72 %txt /tests/golden/inline-leftout-cencol/tokens/txt
238−/* tre-72 %txt /tests/golden/inline-leftout-centis/tree/txt
238+/* tre-72 %txt /tests/golden/inline-leftout-cencol/tree/txt
239−/* src-73 %jibb /tests/golden/inline-leftout-colhep/source/jibb
239+/* src-73 %jibb /tests/golden/inline-leftout-cenhep/source/jibb
240−/* tok-73 %txt /tests/golden/inline-leftout-colhep/tokens/txt
240+/* tok-73 %txt /tests/golden/inline-leftout-cenhep/tokens/txt
241−/* tre-73 %txt /tests/golden/inline-leftout-colhep/tree/txt
241+/* tre-73 %txt /tests/golden/inline-leftout-cenhep/tree/txt
242−/* src-74 %jibb /tests/golden/inline-leftout-colon-wing/source/jibb
242+/* src-74 %jibb /tests/golden/inline-leftout-centis/source/jibb
243−/* tok-74 %txt /tests/golden/inline-leftout-colon-wing/tokens/txt
243+/* tok-74 %txt /tests/golden/inline-leftout-centis/tokens/txt
244−/* tre-74 %txt /tests/golden/inline-leftout-colon-wing/tree/txt
244+/* tre-74 %txt /tests/golden/inline-leftout-centis/tree/txt
245−/* src-75 %jibb /tests/golden/inline-leftout-colsig/source/jibb
245+/* src-75 %jibb /tests/golden/inline-leftout-colhep/source/jibb
246−/* tok-75 %txt /tests/golden/inline-leftout-colsig/tokens/txt
246+/* tok-75 %txt /tests/golden/inline-leftout-colhep/tokens/txt
247−/* tre-75 %txt /tests/golden/inline-leftout-colsig/tree/txt
247+/* tre-75 %txt /tests/golden/inline-leftout-colhep/tree/txt
248−/* src-76 %jibb /tests/golden/inline-leftout-coltar/source/jibb
248+/* src-76 %jibb /tests/golden/inline-leftout-colon-wing/source/jibb
249−/* tok-76 %txt /tests/golden/inline-leftout-coltar/tokens/txt
249+/* tok-76 %txt /tests/golden/inline-leftout-colon-wing/tokens/txt
250−/* tre-76 %txt /tests/golden/inline-leftout-coltar/tree/txt
250+/* tre-76 %txt /tests/golden/inline-leftout-colon-wing/tree/txt
251−/* src-77 %jibb /tests/golden/inline-leftout-dottar/source/jibb
251+/* src-77 %jibb /tests/golden/inline-leftout-colsig/source/jibb
252−/* tok-77 %txt /tests/golden/inline-leftout-dottar/tokens/txt
252+/* tok-77 %txt /tests/golden/inline-leftout-colsig/tokens/txt
253−/* tre-77 %txt /tests/golden/inline-leftout-dottar/tree/txt
253+/* tre-77 %txt /tests/golden/inline-leftout-colsig/tree/txt
254−/* src-78 %jibb /tests/golden/inline-leftout-dottis/source/jibb
254+/* src-78 %jibb /tests/golden/inline-leftout-coltar/source/jibb
255−/* tok-78 %txt /tests/golden/inline-leftout-dottis/tokens/txt
255+/* tok-78 %txt /tests/golden/inline-leftout-coltar/tokens/txt
256−/* tre-78 %txt /tests/golden/inline-leftout-dottis/tree/txt
256+/* tre-78 %txt /tests/golden/inline-leftout-coltar/tree/txt
257−/* src-79 %jibb /tests/golden/inline-leftout-faslus/source/jibb
257+/* src-79 %jibb /tests/golden/inline-leftout-dottar/source/jibb
258−/* tok-79 %txt /tests/golden/inline-leftout-faslus/tokens/txt
258+/* tok-79 %txt /tests/golden/inline-leftout-dottar/tokens/txt
259−/* tre-79 %txt /tests/golden/inline-leftout-faslus/tree/txt
259+/* tre-79 %txt /tests/golden/inline-leftout-dottar/tree/txt
260−/* src-80 %jibb /tests/golden/inline-leftout-hephep/source/jibb
260+/* src-80 %jibb /tests/golden/inline-leftout-dottis/source/jibb
261−/* tok-80 %txt /tests/golden/inline-leftout-hephep/tokens/txt
261+/* tok-80 %txt /tests/golden/inline-leftout-dottis/tokens/txt
262−/* tre-80 %txt /tests/golden/inline-leftout-hephep/tree/txt
262+/* tre-80 %txt /tests/golden/inline-leftout-dottis/tree/txt
263−/* src-81 %jibb /tests/golden/inline-leftout-kethep-wide/source/jibb
263+/* src-81 %jibb /tests/golden/inline-leftout-faslus/source/jibb
264−/* tok-81 %txt /tests/golden/inline-leftout-kethep-wide/tokens/txt
264+/* tok-81 %txt /tests/golden/inline-leftout-faslus/tokens/txt
265−/* tre-81 %txt /tests/golden/inline-leftout-kethep-wide/tree/txt
265+/* tre-81 %txt /tests/golden/inline-leftout-faslus/tree/txt
266−/* src-82 %jibb /tests/golden/inline-leftout-kettar/source/jibb
266+/* src-82 %jibb /tests/golden/inline-leftout-hephep/source/jibb
267−/* tok-82 %txt /tests/golden/inline-leftout-kettar/tokens/txt
267+/* tok-82 %txt /tests/golden/inline-leftout-hephep/tokens/txt
268−/* tre-82 %txt /tests/golden/inline-leftout-kettar/tree/txt
268+/* tre-82 %txt /tests/golden/inline-leftout-hephep/tree/txt
269−/* src-83 %jibb /tests/golden/inline-leftout-miccol/source/jibb
269+/* src-83 %jibb /tests/golden/inline-leftout-kethep-wide/source/jibb
270−/* tok-83 %txt /tests/golden/inline-leftout-miccol/tokens/txt
270+/* tok-83 %txt /tests/golden/inline-leftout-kethep-wide/tokens/txt
271−/* tre-83 %txt /tests/golden/inline-leftout-miccol/tree/txt
271+/* tre-83 %txt /tests/golden/inline-leftout-kethep-wide/tree/txt
272−/* src-84 %jibb /tests/golden/inline-leftout-sail/source/jibb
272+/* src-84 %jibb /tests/golden/inline-leftout-kettar/source/jibb
273−/* tok-84 %txt /tests/golden/inline-leftout-sail/tokens/txt
273+/* tok-84 %txt /tests/golden/inline-leftout-kettar/tokens/txt
274−/* tre-84 %txt /tests/golden/inline-leftout-sail/tree/txt
274+/* tre-84 %txt /tests/golden/inline-leftout-kettar/tree/txt
275−/* src-85 %jibb /tests/golden/inline-leftout-sigbar/source/jibb
275+/* src-85 %jibb /tests/golden/inline-leftout-miccol/source/jibb
276−/* tok-85 %txt /tests/golden/inline-leftout-sigbar/tokens/txt
276+/* tok-85 %txt /tests/golden/inline-leftout-miccol/tokens/txt
277−/* tre-85 %txt /tests/golden/inline-leftout-sigbar/tree/txt
277+/* tre-85 %txt /tests/golden/inline-leftout-miccol/tree/txt
278−/* src-86 %jibb /tests/golden/inline-leftout-signed-float-auras/source/jibb
278+/* src-86 %jibb /tests/golden/inline-leftout-sail/source/jibb
279−/* tok-86 %txt /tests/golden/inline-leftout-signed-float-auras/tokens/txt
279+/* tok-86 %txt /tests/golden/inline-leftout-sail/tokens/txt
280−/* tre-86 %txt /tests/golden/inline-leftout-signed-float-auras/tree/txt
280+/* tre-86 %txt /tests/golden/inline-leftout-sail/tree/txt
281−/* src-87 %jibb /tests/golden/inline-leftout-signed-float-auras-2/source/jibb
281+/* src-87 %jibb /tests/golden/inline-leftout-sigbar/source/jibb
282−/* tok-87 %txt /tests/golden/inline-leftout-signed-float-auras-2/tokens/txt
282+/* tok-87 %txt /tests/golden/inline-leftout-sigbar/tokens/txt
283−/* tre-87 %txt /tests/golden/inline-leftout-signed-float-auras-2/tree/txt
283+/* tre-87 %txt /tests/golden/inline-leftout-sigbar/tree/txt
284−/* src-88 %jibb /tests/golden/inline-leftout-sigpam-wide/source/jibb
284+/* src-88 %jibb /tests/golden/inline-leftout-signed-float-auras/source/jibb
285−/* tok-88 %txt /tests/golden/inline-leftout-sigpam-wide/tokens/txt
285+/* tok-88 %txt /tests/golden/inline-leftout-signed-float-auras/tokens/txt
286−/* tre-88 %txt /tests/golden/inline-leftout-sigpam-wide/tree/txt
286+/* tre-88 %txt /tests/golden/inline-leftout-signed-float-auras/tree/txt
287−/* src-89 %jibb /tests/golden/inline-leftout-tis-paren/source/jibb
287+/* src-89 %jibb /tests/golden/inline-leftout-signed-float-auras-2/source/jibb
288−/* tok-89 %txt /tests/golden/inline-leftout-tis-paren/tokens/txt
288+/* tok-89 %txt /tests/golden/inline-leftout-signed-float-auras-2/tokens/txt
289−/* tre-89 %txt /tests/golden/inline-leftout-tis-paren/tree/txt
289+/* tre-89 %txt /tests/golden/inline-leftout-signed-float-auras-2/tree/txt
290−/* src-90 %jibb /tests/golden/inline-leftout-tisfas/source/jibb
290+/* src-90 %jibb /tests/golden/inline-leftout-sigpam-wide/source/jibb
291−/* tok-90 %txt /tests/golden/inline-leftout-tisfas/tokens/txt
291+/* tok-90 %txt /tests/golden/inline-leftout-sigpam-wide/tokens/txt
292−/* tre-90 %txt /tests/golden/inline-leftout-tisfas/tree/txt
292+/* tre-90 %txt /tests/golden/inline-leftout-sigpam-wide/tree/txt
293−/* src-91 %jibb /tests/golden/inline-leftout-tisgal/source/jibb
293+/* src-91 %jibb /tests/golden/inline-leftout-tis-paren/source/jibb
294−/* tok-91 %txt /tests/golden/inline-leftout-tisgal/tokens/txt
294+/* tok-91 %txt /tests/golden/inline-leftout-tis-paren/tokens/txt
295−/* tre-91 %txt /tests/golden/inline-leftout-tisgal/tree/txt
295+/* tre-91 %txt /tests/golden/inline-leftout-tis-paren/tree/txt
296−/* src-92 %jibb /tests/golden/inline-leftout-tisgal-2/source/jibb
296+/* src-92 %jibb /tests/golden/inline-leftout-tisfas/source/jibb
297−/* tok-92 %txt /tests/golden/inline-leftout-tisgal-2/tokens/txt
297+/* tok-92 %txt /tests/golden/inline-leftout-tisfas/tokens/txt
298−/* tre-92 %txt /tests/golden/inline-leftout-tisgal-2/tree/txt
298+/* tre-92 %txt /tests/golden/inline-leftout-tisfas/tree/txt
299−/* src-93 %jibb /tests/golden/inline-leftout-tisgar/source/jibb
299+/* src-93 %jibb /tests/golden/inline-leftout-tisgal/source/jibb
300−/* tok-93 %txt /tests/golden/inline-leftout-tisgar/tokens/txt
300+/* tok-93 %txt /tests/golden/inline-leftout-tisgal/tokens/txt
301−/* tre-93 %txt /tests/golden/inline-leftout-tisgar/tree/txt
301+/* tre-93 %txt /tests/golden/inline-leftout-tisgal/tree/txt
302−/* src-94 %jibb /tests/golden/inline-leftout-tislus/source/jibb
302+/* src-94 %jibb /tests/golden/inline-leftout-tisgal-2/source/jibb
303−/* tok-94 %txt /tests/golden/inline-leftout-tislus/tokens/txt
303+/* tok-94 %txt /tests/golden/inline-leftout-tisgal-2/tokens/txt
304−/* tre-94 %txt /tests/golden/inline-leftout-tislus/tree/txt
304+/* tre-94 %txt /tests/golden/inline-leftout-tisgal-2/tree/txt
305−/* src-95 %jibb /tests/golden/inline-leftout-tistis/source/jibb
305+/* src-95 %jibb /tests/golden/inline-leftout-tisgar/source/jibb
306−/* tok-95 %txt /tests/golden/inline-leftout-tistis/tokens/txt
306+/* tok-95 %txt /tests/golden/inline-leftout-tisgar/tokens/txt
307−/* tre-95 %txt /tests/golden/inline-leftout-tistis/tree/txt
307+/* tre-95 %txt /tests/golden/inline-leftout-tisgar/tree/txt
308−/* src-96 %jibb /tests/golden/inline-leftout-wutcol/source/jibb
308+/* src-96 %jibb /tests/golden/inline-leftout-tislus/source/jibb
309−/* tok-96 %txt /tests/golden/inline-leftout-wutcol/tokens/txt
309+/* tok-96 %txt /tests/golden/inline-leftout-tislus/tokens/txt
310−/* tre-96 %txt /tests/golden/inline-leftout-wutcol/tree/txt
310+/* tre-96 %txt /tests/golden/inline-leftout-tislus/tree/txt
311−/* src-97 %jibb /tests/golden/inline-leftout-wutcol-2/source/jibb
311+/* src-97 %jibb /tests/golden/inline-leftout-tistis/source/jibb
312−/* tok-97 %txt /tests/golden/inline-leftout-wutcol-2/tokens/txt
312+/* tok-97 %txt /tests/golden/inline-leftout-tistis/tokens/txt
313−/* tre-97 %txt /tests/golden/inline-leftout-wutcol-2/tree/txt
313+/* tre-97 %txt /tests/golden/inline-leftout-tistis/tree/txt
314−/* src-98 %jibb /tests/golden/inline-leftout-wuthep-wide/source/jibb
314+/* src-98 %jibb /tests/golden/inline-leftout-wutcol/source/jibb
315−/* tok-98 %txt /tests/golden/inline-leftout-wuthep-wide/tokens/txt
315+/* tok-98 %txt /tests/golden/inline-leftout-wutcol/tokens/txt
316−/* tre-98 %txt /tests/golden/inline-leftout-wuthep-wide/tree/txt
316+/* tre-98 %txt /tests/golden/inline-leftout-wutcol/tree/txt
317−/* src-99 %jibb /tests/golden/inline-leftout-wutlus/source/jibb
317+/* src-99 %jibb /tests/golden/inline-leftout-wutcol-2/source/jibb
318−/* tok-99 %txt /tests/golden/inline-leftout-wutlus/tokens/txt
318+/* tok-99 %txt /tests/golden/inline-leftout-wutcol-2/tokens/txt
319−/* tre-99 %txt /tests/golden/inline-leftout-wutlus/tree/txt
319+/* tre-99 %txt /tests/golden/inline-leftout-wutcol-2/tree/txt
320−/* src-100 %jibb /tests/golden/inline-leftout-wutsig/source/jibb
320+/* src-100 %jibb /tests/golden/inline-leftout-wuthep-wide/source/jibb
321−/* tok-100 %txt /tests/golden/inline-leftout-wutsig/tokens/txt
321+/* tok-100 %txt /tests/golden/inline-leftout-wuthep-wide/tokens/txt
322−/* tre-100 %txt /tests/golden/inline-leftout-wutsig/tree/txt
322+/* tre-100 %txt /tests/golden/inline-leftout-wuthep-wide/tree/txt
323−/* src-101 %jibb /tests/golden/inline-leftout-wutzap/source/jibb
323+/* src-101 %jibb /tests/golden/inline-leftout-wutlus/source/jibb
324−/* tok-101 %txt /tests/golden/inline-leftout-wutzap/tokens/txt
324+/* tok-101 %txt /tests/golden/inline-leftout-wutlus/tokens/txt
325−/* tre-101 %txt /tests/golden/inline-leftout-wutzap/tree/txt
325+/* tre-101 %txt /tests/golden/inline-leftout-wutlus/tree/txt
326−/* src-102 %jibb /tests/golden/inline-leftout-zap-not/source/jibb
326+/* src-102 %jibb /tests/golden/inline-leftout-wutsig/source/jibb
327−/* tok-102 %txt /tests/golden/inline-leftout-zap-not/tokens/txt
327+/* tok-102 %txt /tests/golden/inline-leftout-wutsig/tokens/txt
328−/* tre-102 %txt /tests/golden/inline-leftout-zap-not/tree/txt
328+/* tre-102 %txt /tests/golden/inline-leftout-wutsig/tree/txt
329−/* src-103 %jibb /tests/golden/inline-leftout-zap-not-2/source/jibb
329+/* src-103 %jibb /tests/golden/inline-leftout-wutzap/source/jibb
330−/* tok-103 %txt /tests/golden/inline-leftout-zap-not-2/tokens/txt
330+/* tok-103 %txt /tests/golden/inline-leftout-wutzap/tokens/txt
331−/* tre-103 %txt /tests/golden/inline-leftout-zap-not-2/tree/txt
331+/* tre-103 %txt /tests/golden/inline-leftout-wutzap/tree/txt
332−/* src-104 %jibb /tests/golden/inline-leftout-zapgar/source/jibb
332+/* src-104 %jibb /tests/golden/inline-leftout-zap-not/source/jibb
333−/* tok-104 %txt /tests/golden/inline-leftout-zapgar/tokens/txt
333+/* tok-104 %txt /tests/golden/inline-leftout-zap-not/tokens/txt
334−/* tre-104 %txt /tests/golden/inline-leftout-zapgar/tree/txt
334+/* tre-104 %txt /tests/golden/inline-leftout-zap-not/tree/txt
335−/* src-105 %jibb /tests/golden/inline-list/source/jibb
335+/* src-105 %jibb /tests/golden/inline-leftout-zap-not-2/source/jibb
336−/* tok-105 %txt /tests/golden/inline-list/tokens/txt
336+/* tok-105 %txt /tests/golden/inline-leftout-zap-not-2/tokens/txt
337−/* tre-105 %txt /tests/golden/inline-list/tree/txt
337+/* tre-105 %txt /tests/golden/inline-leftout-zap-not-2/tree/txt
338−/* src-106 %jibb /tests/golden/inline-list-parens/source/jibb
338+/* src-106 %jibb /tests/golden/inline-leftout-zapgar/source/jibb
339−/* tok-106 %txt /tests/golden/inline-list-parens/tokens/txt
339+/* tok-106 %txt /tests/golden/inline-leftout-zapgar/tokens/txt
340−/* tre-106 %txt /tests/golden/inline-list-parens/tree/txt
340+/* tre-106 %txt /tests/golden/inline-leftout-zapgar/tree/txt
341−/* src-107 %jibb /tests/golden/inline-literal-defaults/source/jibb
341+/* src-107 %jibb /tests/golden/inline-list/source/jibb
342−/* tok-107 %txt /tests/golden/inline-literal-defaults/tokens/txt
342+/* tok-107 %txt /tests/golden/inline-list/tokens/txt
343−/* tre-107 %txt /tests/golden/inline-literal-defaults/tree/txt
343+/* tre-107 %txt /tests/golden/inline-list/tree/txt
344−/* src-108 %jibb /tests/golden/inline-load-slug/source/jibb
344+/* src-108 %jibb /tests/golden/inline-list-parens/source/jibb
345−/* tok-108 %txt /tests/golden/inline-load-slug/tokens/txt
345+/* tok-108 %txt /tests/golden/inline-list-parens/tokens/txt
346−/* tre-108 %txt /tests/golden/inline-load-slug/tree/txt
346+/* tre-108 %txt /tests/golden/inline-list-parens/tree/txt
347−/* src-109 %jibb /tests/golden/inline-local-names/source/jibb
347+/* src-109 %jibb /tests/golden/inline-literal-defaults/source/jibb
348−/* tok-109 %txt /tests/golden/inline-local-names/tokens/txt
348+/* tok-109 %txt /tests/golden/inline-literal-defaults/tokens/txt
349−/* tre-109 %txt /tests/golden/inline-local-names/tree/txt
349+/* tre-109 %txt /tests/golden/inline-literal-defaults/tree/txt
350−/* src-110 %jibb /tests/golden/inline-local-names-bodies/source/jibb
350+/* src-110 %jibb /tests/golden/inline-load-slug/source/jibb
351−/* tok-110 %txt /tests/golden/inline-local-names-bodies/tokens/txt
351+/* tok-110 %txt /tests/golden/inline-load-slug/tokens/txt
352−/* tre-110 %txt /tests/golden/inline-local-names-bodies/tree/txt
352+/* tre-110 %txt /tests/golden/inline-load-slug/tree/txt
353−/* src-111 %jibb /tests/golden/inline-loobean/source/jibb
353+/* src-111 %jibb /tests/golden/inline-local-names/source/jibb
354−/* tok-111 %txt /tests/golden/inline-loobean/tokens/txt
354+/* tok-111 %txt /tests/golden/inline-local-names/tokens/txt
355−/* tre-111 %txt /tests/golden/inline-loobean/tree/txt
355+/* tre-111 %txt /tests/golden/inline-local-names/tree/txt
356−/* src-112 %jibb /tests/golden/inline-mark-digit/source/jibb
356+/* src-112 %jibb /tests/golden/inline-local-names-bodies/source/jibb
357−/* tok-112 %txt /tests/golden/inline-mark-digit/tokens/txt
357+/* tok-112 %txt /tests/golden/inline-local-names-bodies/tokens/txt
358−/* tre-112 %txt /tests/golden/inline-mark-digit/tree/txt
358+/* tre-112 %txt /tests/golden/inline-local-names-bodies/tree/txt
359−/* src-113 %jibb /tests/golden/inline-module-definitions/source/jibb
359+/* src-113 %jibb /tests/golden/inline-loobean/source/jibb
360−/* tok-113 %txt /tests/golden/inline-module-definitions/tokens/txt
360+/* tok-113 %txt /tests/golden/inline-loobean/tokens/txt
361−/* tre-113 %txt /tests/golden/inline-module-definitions/tree/txt
361+/* tre-113 %txt /tests/golden/inline-loobean/tree/txt
362−/* src-114 %jibb /tests/golden/inline-mold-add/source/jibb
362+/* src-114 %jibb /tests/golden/inline-mark-digit/source/jibb
363−/* tok-114 %txt /tests/golden/inline-mold-add/tokens/txt
363+/* tok-114 %txt /tests/golden/inline-mark-digit/tokens/txt
364−/* tre-114 %txt /tests/golden/inline-mold-add/tree/txt
364+/* tre-114 %txt /tests/golden/inline-mark-digit/tree/txt
365−/* src-115 %jibb /tests/golden/inline-mold-any-empty/source/jibb
365+/* src-115 %jibb /tests/golden/inline-module-definitions/source/jibb
366−/* tok-115 %txt /tests/golden/inline-mold-any-empty/tokens/txt
366+/* tok-115 %txt /tests/golden/inline-module-definitions/tokens/txt
367−/* tre-115 %txt /tests/golden/inline-mold-any-empty/tree/txt
367+/* tre-115 %txt /tests/golden/inline-module-definitions/tree/txt
368−/* src-116 %jibb /tests/golden/inline-mold-atoms/source/jibb
368+/* src-116 %jibb /tests/golden/inline-mold-add/source/jibb
369−/* tok-116 %txt /tests/golden/inline-mold-atoms/tokens/txt
369+/* tok-116 %txt /tests/golden/inline-mold-add/tokens/txt
370−/* tre-116 %txt /tests/golden/inline-mold-atoms/tree/txt
370+/* tre-116 %txt /tests/golden/inline-mold-add/tree/txt
371−/* src-117 %jibb /tests/golden/inline-mold-constants/source/jibb
371+/* src-117 %jibb /tests/golden/inline-mold-any-empty/source/jibb
372−/* tok-117 %txt /tests/golden/inline-mold-constants/tokens/txt
372+/* tok-117 %txt /tests/golden/inline-mold-any-empty/tokens/txt
373−/* tre-117 %txt /tests/golden/inline-mold-constants/tree/txt
373+/* tre-117 %txt /tests/golden/inline-mold-any-empty/tree/txt
374−/* src-118 %jibb /tests/golden/inline-mold-containers/source/jibb
374+/* src-118 %jibb /tests/golden/inline-mold-atoms/source/jibb
375−/* tok-118 %txt /tests/golden/inline-mold-containers/tokens/txt
375+/* tok-118 %txt /tests/golden/inline-mold-atoms/tokens/txt
376−/* tre-118 %txt /tests/golden/inline-mold-containers/tree/txt
376+/* tre-118 %txt /tests/golden/inline-mold-atoms/tree/txt
377−/* src-119 %jibb /tests/golden/inline-mold-gate/source/jibb
377+/* src-119 %jibb /tests/golden/inline-mold-constants/source/jibb
378−/* tok-119 %txt /tests/golden/inline-mold-gate/tokens/txt
378+/* tok-119 %txt /tests/golden/inline-mold-constants/tokens/txt
379−/* tre-119 %txt /tests/golden/inline-mold-gate/tree/txt
379+/* tre-119 %txt /tests/golden/inline-mold-constants/tree/txt
380−/* src-120 %jibb /tests/golden/inline-mold-generic/source/jibb
380+/* src-120 %jibb /tests/golden/inline-mold-containers/source/jibb
381−/* tok-120 %txt /tests/golden/inline-mold-generic/tokens/txt
381+/* tok-120 %txt /tests/golden/inline-mold-containers/tokens/txt
382−/* tre-120 %txt /tests/golden/inline-mold-generic/tree/txt
382+/* tre-120 %txt /tests/golden/inline-mold-containers/tree/txt
383−/* src-121 %jibb /tests/golden/inline-mold-opaque/source/jibb
383+/* src-121 %jibb /tests/golden/inline-mold-gate/source/jibb
384−/* tok-121 %txt /tests/golden/inline-mold-opaque/tokens/txt
384+/* tok-121 %txt /tests/golden/inline-mold-gate/tokens/txt
385−/* tre-121 %txt /tests/golden/inline-mold-opaque/tree/txt
385+/* tre-121 %txt /tests/golden/inline-mold-gate/tree/txt
386−/* src-122 %jibb /tests/golden/inline-mold-paths/source/jibb
386+/* src-122 %jibb /tests/golden/inline-mold-generic/source/jibb
387−/* tok-122 %txt /tests/golden/inline-mold-paths/tokens/txt
387+/* tok-122 %txt /tests/golden/inline-mold-generic/tokens/txt
388−/* tre-122 %txt /tests/golden/inline-mold-paths/tree/txt
388+/* tre-122 %txt /tests/golden/inline-mold-generic/tree/txt
389−/* src-123 %jibb /tests/golden/inline-mold-records/source/jibb
389+/* src-123 %jibb /tests/golden/inline-mold-opaque/source/jibb
390−/* tok-123 %txt /tests/golden/inline-mold-records/tokens/txt
390+/* tok-123 %txt /tests/golden/inline-mold-opaque/tokens/txt
391−/* tre-123 %txt /tests/golden/inline-mold-records/tree/txt
391+/* tre-123 %txt /tests/golden/inline-mold-opaque/tree/txt
392−/* src-124 %jibb /tests/golden/inline-namespaces/source/jibb
392+/* src-124 %jibb /tests/golden/inline-mold-paths/source/jibb
393−/* tok-124 %txt /tests/golden/inline-namespaces/tokens/txt
393+/* tok-124 %txt /tests/golden/inline-mold-paths/tokens/txt
394−/* tre-124 %txt /tests/golden/inline-namespaces/tree/txt
394+/* tre-124 %txt /tests/golden/inline-mold-paths/tree/txt
395−/* src-125 %jibb /tests/golden/inline-no-operators/source/jibb
395+/* src-125 %jibb /tests/golden/inline-mold-records/source/jibb
396−/* tok-125 %txt /tests/golden/inline-no-operators/tokens/txt
396+/* tok-125 %txt /tests/golden/inline-mold-records/tokens/txt
397−/* tre-125 %txt /tests/golden/inline-no-operators/tree/txt
397+/* tre-125 %txt /tests/golden/inline-mold-records/tree/txt
398−/* src-126 %jibb /tests/golden/inline-no-subs/source/jibb
398+/* src-126 %jibb /tests/golden/inline-namespaces/source/jibb
399−/* tok-126 %txt /tests/golden/inline-no-subs/tokens/txt
399+/* tok-126 %txt /tests/golden/inline-namespaces/tokens/txt
400−/* tre-126 %txt /tests/golden/inline-no-subs/tree/txt
400+/* tre-126 %txt /tests/golden/inline-namespaces/tree/txt
401−/* src-127 %jibb /tests/golden/inline-null/source/jibb
401+/* src-127 %jibb /tests/golden/inline-no-operators/source/jibb
402−/* tok-127 %txt /tests/golden/inline-null/tokens/txt
402+/* tok-127 %txt /tests/golden/inline-no-operators/tokens/txt
403−/* tre-127 %txt /tests/golden/inline-null/tree/txt
403+/* tre-127 %txt /tests/golden/inline-no-operators/tree/txt
404−/* src-128 %jibb /tests/golden/inline-pair/source/jibb
404+/* src-128 %jibb /tests/golden/inline-no-subs/source/jibb
405−/* tok-128 %txt /tests/golden/inline-pair/tokens/txt
405+/* tok-128 %txt /tests/golden/inline-no-subs/tokens/txt
406−/* tre-128 %txt /tests/golden/inline-pair/tree/txt
406+/* tre-128 %txt /tests/golden/inline-no-subs/tree/txt
407−/* src-129 %jibb /tests/golden/inline-pairs-two-items/source/jibb
407+/* src-129 %jibb /tests/golden/inline-null/source/jibb
408−/* tok-129 %txt /tests/golden/inline-pairs-two-items/tokens/txt
408+/* tok-129 %txt /tests/golden/inline-null/tokens/txt
409−/* tre-129 %txt /tests/golden/inline-pairs-two-items/tree/txt
409+/* tre-129 %txt /tests/golden/inline-null/tree/txt
410−/* src-130 %jibb /tests/golden/inline-path/source/jibb
410+/* src-130 %jibb /tests/golden/inline-pair/source/jibb
411−/* tok-130 %txt /tests/golden/inline-path/tokens/txt
411+/* tok-130 %txt /tests/golden/inline-pair/tokens/txt
412−/* tre-130 %txt /tests/golden/inline-path/tree/txt
412+/* tre-130 %txt /tests/golden/inline-pair/tree/txt
413−/* src-131 %jibb /tests/golden/inline-pattern-any/source/jibb
413+/* src-131 %jibb /tests/golden/inline-pairs-two-items/source/jibb
414−/* tok-131 %txt /tests/golden/inline-pattern-any/tokens/txt
414+/* tok-131 %txt /tests/golden/inline-pairs-two-items/tokens/txt
415−/* tre-131 %txt /tests/golden/inline-pattern-any/tree/txt
415+/* tre-131 %txt /tests/golden/inline-pairs-two-items/tree/txt
416−/* src-132 %jibb /tests/golden/inline-pattern-cell/source/jibb
416+/* src-132 %jibb /tests/golden/inline-path/source/jibb
417−/* tok-132 %txt /tests/golden/inline-pattern-cell/tokens/txt
417+/* tok-132 %txt /tests/golden/inline-path/tokens/txt
418−/* tre-132 %txt /tests/golden/inline-pattern-cell/tree/txt
418+/* tre-132 %txt /tests/golden/inline-path/tree/txt
419−/* src-133 %jibb /tests/golden/inline-pattern-cell-open-bad/source/jibb
419+/* src-133 %jibb /tests/golden/inline-pattern-any/source/jibb
420−/* tok-133 %txt /tests/golden/inline-pattern-cell-open-bad/tokens/txt
420+/* tok-133 %txt /tests/golden/inline-pattern-any/tokens/txt
421−/* tre-133 %txt /tests/golden/inline-pattern-cell-open-bad/tree/txt
421+/* tre-133 %txt /tests/golden/inline-pattern-any/tree/txt
422−/* src-134 %jibb /tests/golden/inline-pattern-crash-arm/source/jibb
422+/* src-134 %jibb /tests/golden/inline-pattern-cell/source/jibb
423−/* tok-134 %txt /tests/golden/inline-pattern-crash-arm/tokens/txt
423+/* tok-134 %txt /tests/golden/inline-pattern-cell/tokens/txt
424−/* tre-134 %txt /tests/golden/inline-pattern-crash-arm/tree/txt
424+/* tre-134 %txt /tests/golden/inline-pattern-cell/tree/txt
425−/* src-135 %jibb /tests/golden/inline-pattern-crash-bad/source/jibb
425+/* src-135 %jibb /tests/golden/inline-pattern-cell-open-bad/source/jibb
426−/* tok-135 %txt /tests/golden/inline-pattern-crash-bad/tokens/txt
426+/* tok-135 %txt /tests/golden/inline-pattern-cell-open-bad/tokens/txt
427−/* tre-135 %txt /tests/golden/inline-pattern-crash-bad/tree/txt
427+/* tre-135 %txt /tests/golden/inline-pattern-cell-open-bad/tree/txt
428−/* src-136 %jibb /tests/golden/inline-pattern-date-bad/source/jibb
428+/* src-136 %jibb /tests/golden/inline-pattern-crash-arm/source/jibb
429−/* tok-136 %txt /tests/golden/inline-pattern-date-bad/tokens/txt
429+/* tok-136 %txt /tests/golden/inline-pattern-crash-arm/tokens/txt
430−/* tre-136 %txt /tests/golden/inline-pattern-date-bad/tree/txt
430+/* tre-136 %txt /tests/golden/inline-pattern-crash-arm/tree/txt
431−/* src-137 %jibb /tests/golden/inline-pattern-duration-bad/source/jibb
431+/* src-137 %jibb /tests/golden/inline-pattern-crash-bad/source/jibb
432−/* tok-137 %txt /tests/golden/inline-pattern-duration-bad/tokens/txt
432+/* tok-137 %txt /tests/golden/inline-pattern-crash-bad/tokens/txt
433−/* tre-137 %txt /tests/golden/inline-pattern-duration-bad/tree/txt
433+/* tre-137 %txt /tests/golden/inline-pattern-crash-bad/tree/txt
434−/* src-138 %jibb /tests/golden/inline-pattern-eq/source/jibb
434+/* src-138 %jibb /tests/golden/inline-pattern-date-bad/source/jibb
435−/* tok-138 %txt /tests/golden/inline-pattern-eq/tokens/txt
435+/* tok-138 %txt /tests/golden/inline-pattern-date-bad/tokens/txt
436−/* tre-138 %txt /tests/golden/inline-pattern-eq/tree/txt
436+/* tre-138 %txt /tests/golden/inline-pattern-date-bad/tree/txt
437−/* src-139 %jibb /tests/golden/inline-pattern-face-bad/source/jibb
437+/* src-139 %jibb /tests/golden/inline-pattern-duration-bad/source/jibb
438−/* tok-139 %txt /tests/golden/inline-pattern-face-bad/tokens/txt
438+/* tok-139 %txt /tests/golden/inline-pattern-duration-bad/tokens/txt
439−/* tre-139 %txt /tests/golden/inline-pattern-face-bad/tree/txt
439+/* tre-139 %txt /tests/golden/inline-pattern-duration-bad/tree/txt
440−/* src-140 %jibb /tests/golden/inline-pattern-head-tag/source/jibb
440+/* src-140 %jibb /tests/golden/inline-pattern-eq/source/jibb
441−/* tok-140 %txt /tests/golden/inline-pattern-head-tag/tokens/txt
441+/* tok-140 %txt /tests/golden/inline-pattern-eq/tokens/txt
442−/* tre-140 %txt /tests/golden/inline-pattern-head-tag/tree/txt
442+/* tre-140 %txt /tests/golden/inline-pattern-eq/tree/txt
443−/* src-141 %jibb /tests/golden/inline-pattern-interpolated-bad/source/jibb
443+/* src-141 %jibb /tests/golden/inline-pattern-face-bad/source/jibb
444−/* tok-141 %txt /tests/golden/inline-pattern-interpolated-bad/tokens/txt
444+/* tok-141 %txt /tests/golden/inline-pattern-face-bad/tokens/txt
445−/* tre-141 %txt /tests/golden/inline-pattern-interpolated-bad/tree/txt
445+/* tre-141 %txt /tests/golden/inline-pattern-face-bad/tree/txt
446−/* src-142 %jibb /tests/golden/inline-pattern-list-bad/source/jibb
446+/* src-142 %jibb /tests/golden/inline-pattern-head-tag/source/jibb
447−/* tok-142 %txt /tests/golden/inline-pattern-list-bad/tokens/txt
447+/* tok-142 %txt /tests/golden/inline-pattern-head-tag/tokens/txt
448−/* tre-142 %txt /tests/golden/inline-pattern-list-bad/tree/txt
448+/* tre-142 %txt /tests/golden/inline-pattern-head-tag/tree/txt
449−/* src-143 %jibb /tests/golden/inline-pattern-literals/source/jibb
449+/* src-143 %jibb /tests/golden/inline-pattern-interpolated-bad/source/jibb
450−/* tok-143 %txt /tests/golden/inline-pattern-literals/tokens/txt
450+/* tok-143 %txt /tests/golden/inline-pattern-interpolated-bad/tokens/txt
451−/* tre-143 %txt /tests/golden/inline-pattern-literals/tree/txt
451+/* tre-143 %txt /tests/golden/inline-pattern-interpolated-bad/tree/txt
452−/* src-144 %jibb /tests/golden/inline-pattern-loobean/source/jibb
452+/* src-144 %jibb /tests/golden/inline-pattern-list-bad/source/jibb
453−/* tok-144 %txt /tests/golden/inline-pattern-loobean/tokens/txt
453+/* tok-144 %txt /tests/golden/inline-pattern-list-bad/tokens/txt
454−/* tre-144 %txt /tests/golden/inline-pattern-loobean/tree/txt
454+/* tre-144 %txt /tests/golden/inline-pattern-list-bad/tree/txt
455−/* src-145 %jibb /tests/golden/inline-pattern-move-any/source/jibb
455+/* src-145 %jibb /tests/golden/inline-pattern-literals/source/jibb
456−/* tok-145 %txt /tests/golden/inline-pattern-move-any/tokens/txt
456+/* tok-145 %txt /tests/golden/inline-pattern-literals/tokens/txt
457−/* tre-145 %txt /tests/golden/inline-pattern-move-any/tree/txt
457+/* tre-145 %txt /tests/golden/inline-pattern-literals/tree/txt
458−/* src-146 %jibb /tests/golden/inline-pattern-name/source/jibb
458+/* src-146 %jibb /tests/golden/inline-pattern-loobean/source/jibb
459−/* tok-146 %txt /tests/golden/inline-pattern-name/tokens/txt
459+/* tok-146 %txt /tests/golden/inline-pattern-loobean/tokens/txt
460−/* tre-146 %txt /tests/golden/inline-pattern-name/tree/txt
460+/* tre-146 %txt /tests/golden/inline-pattern-loobean/tree/txt
461−/* src-147 %jibb /tests/golden/inline-pattern-null/source/jibb
461+/* src-147 %jibb /tests/golden/inline-pattern-move-any/source/jibb
462−/* tok-147 %txt /tests/golden/inline-pattern-null/tokens/txt
462+/* tok-147 %txt /tests/golden/inline-pattern-move-any/tokens/txt
463−/* tre-147 %txt /tests/golden/inline-pattern-null/tree/txt
463+/* tre-147 %txt /tests/golden/inline-pattern-move-any/tree/txt
464−/* src-148 %jibb /tests/golden/inline-pattern-pair-bad/source/jibb
464+/* src-148 %jibb /tests/golden/inline-pattern-name/source/jibb
465−/* tok-148 %txt /tests/golden/inline-pattern-pair-bad/tokens/txt
465+/* tok-148 %txt /tests/golden/inline-pattern-name/tokens/txt
466−/* tre-148 %txt /tests/golden/inline-pattern-pair-bad/tree/txt
466+/* tre-148 %txt /tests/golden/inline-pattern-name/tree/txt
467−/* src-149 %jibb /tests/golden/inline-pattern-tail-tag/source/jibb
467+/* src-149 %jibb /tests/golden/inline-pattern-null/source/jibb
468−/* tok-149 %txt /tests/golden/inline-pattern-tail-tag/tokens/txt
468+/* tok-149 %txt /tests/golden/inline-pattern-null/tokens/txt
469−/* tre-149 %txt /tests/golden/inline-pattern-tail-tag/tree/txt
469+/* tre-149 %txt /tests/golden/inline-pattern-null/tree/txt
470−/* src-150 %jibb /tests/golden/inline-pattern-term/source/jibb
470+/* src-150 %jibb /tests/golden/inline-pattern-pair-bad/source/jibb
471−/* tok-150 %txt /tests/golden/inline-pattern-term/tokens/txt
471+/* tok-150 %txt /tests/golden/inline-pattern-pair-bad/tokens/txt
472−/* tre-150 %txt /tests/golden/inline-pattern-term/tree/txt
472+/* tre-150 %txt /tests/golden/inline-pattern-pair-bad/tree/txt
473−/* src-151 %jibb /tests/golden/inline-pattern-two-tags/source/jibb
473+/* src-151 %jibb /tests/golden/inline-pattern-tail-tag/source/jibb
474−/* tok-151 %txt /tests/golden/inline-pattern-two-tags/tokens/txt
474+/* tok-151 %txt /tests/golden/inline-pattern-tail-tag/tokens/txt
475−/* tre-151 %txt /tests/golden/inline-pattern-two-tags/tree/txt
475+/* tre-151 %txt /tests/golden/inline-pattern-tail-tag/tree/txt
476−/* src-152 %jibb /tests/golden/inline-pattern-unit/source/jibb
476+/* src-152 %jibb /tests/golden/inline-pattern-term/source/jibb
477−/* tok-152 %txt /tests/golden/inline-pattern-unit/tokens/txt
477+/* tok-152 %txt /tests/golden/inline-pattern-term/tokens/txt
478−/* tre-152 %txt /tests/golden/inline-pattern-unit/tree/txt
478+/* tre-152 %txt /tests/golden/inline-pattern-term/tree/txt
479−/* src-153 %jibb /tests/golden/inline-qath/source/jibb
479+/* src-153 %jibb /tests/golden/inline-pattern-two-tags/source/jibb
480−/* tok-153 %txt /tests/golden/inline-qath/tokens/txt
480+/* tok-153 %txt /tests/golden/inline-pattern-two-tags/tokens/txt
481−/* tre-153 %txt /tests/golden/inline-qath/tree/txt
481+/* tre-153 %txt /tests/golden/inline-pattern-two-tags/tree/txt
482−/* src-154 %jibb /tests/golden/inline-requests/source/jibb
482+/* src-154 %jibb /tests/golden/inline-pattern-unit/source/jibb
483−/* tok-154 %txt /tests/golden/inline-requests/tokens/txt
483+/* tok-154 %txt /tests/golden/inline-pattern-unit/tokens/txt
484−/* tre-154 %txt /tests/golden/inline-requests/tree/txt
484+/* tre-154 %txt /tests/golden/inline-pattern-unit/tree/txt
485−/* src-155 %jibb /tests/golden/inline-scry-case/source/jibb
485+/* src-155 %jibb /tests/golden/inline-qath/source/jibb
486−/* tok-155 %txt /tests/golden/inline-scry-case/tokens/txt
486+/* tok-155 %txt /tests/golden/inline-qath/tokens/txt
487−/* tre-155 %txt /tests/golden/inline-scry-case/tree/txt
487+/* tre-155 %txt /tests/golden/inline-qath/tree/txt
488−/* src-156 %jibb /tests/golden/inline-self-reference/source/jibb
488+/* src-156 %jibb /tests/golden/inline-requests/source/jibb
489−/* tok-156 %txt /tests/golden/inline-self-reference/tokens/txt
489+/* tok-156 %txt /tests/golden/inline-requests/tokens/txt
490−/* tre-156 %txt /tests/golden/inline-self-reference/tree/txt
490+/* tre-156 %txt /tests/golden/inline-requests/tree/txt
491−/* src-157 %jibb /tests/golden/inline-ship/source/jibb
491+/* src-157 %jibb /tests/golden/inline-scry-case/source/jibb
492−/* tok-157 %txt /tests/golden/inline-ship/tokens/txt
492+/* tok-157 %txt /tests/golden/inline-scry-case/tokens/txt
493−/* tre-157 %txt /tests/golden/inline-ship/tree/txt
493+/* tre-157 %txt /tests/golden/inline-scry-case/tree/txt
494−/* src-158 %jibb /tests/golden/inline-static-image/source/jibb
494+/* src-158 %jibb /tests/golden/inline-self-reference/source/jibb
495−/* tok-158 %txt /tests/golden/inline-static-image/tokens/txt
495+/* tok-158 %txt /tests/golden/inline-self-reference/tokens/txt
496−/* tre-158 %txt /tests/golden/inline-static-image/tree/txt
496+/* tre-158 %txt /tests/golden/inline-self-reference/tree/txt
497−/* src-159 %jibb /tests/golden/inline-string/source/jibb
497+/* src-159 %jibb /tests/golden/inline-ship/source/jibb
498−/* tok-159 %txt /tests/golden/inline-string/tokens/txt
498+/* tok-159 %txt /tests/golden/inline-ship/tokens/txt
499−/* tre-159 %txt /tests/golden/inline-string/tree/txt
499+/* tre-159 %txt /tests/golden/inline-ship/tree/txt
500−/* src-160 %jibb /tests/golden/inline-tag-shape/source/jibb
500+/* src-160 %jibb /tests/golden/inline-static-image/source/jibb
501−/* tok-160 %txt /tests/golden/inline-tag-shape/tokens/txt
501+/* tok-160 %txt /tests/golden/inline-static-image/tokens/txt
502−/* tre-160 %txt /tests/golden/inline-tag-shape/tree/txt
502+/* tre-160 %txt /tests/golden/inline-static-image/tree/txt
503−/* src-161 %jibb /tests/golden/inline-term/source/jibb
503+/* src-161 %jibb /tests/golden/inline-string/source/jibb
504−/* tok-161 %txt /tests/golden/inline-term/tokens/txt
504+/* tok-161 %txt /tests/golden/inline-string/tokens/txt
505−/* tre-161 %txt /tests/golden/inline-term/tree/txt
505+/* tre-161 %txt /tests/golden/inline-string/tree/txt
506−/* src-162 %jibb /tests/golden/inline-term-numeric/source/jibb
506+/* src-162 %jibb /tests/golden/inline-tag-shape/source/jibb
507−/* tok-162 %txt /tests/golden/inline-term-numeric/tokens/txt
507+/* tok-162 %txt /tests/golden/inline-tag-shape/tokens/txt
508−/* tre-162 %txt /tests/golden/inline-term-numeric/tree/txt
508+/* tre-162 %txt /tests/golden/inline-tag-shape/tree/txt
509−/* src-163 %jibb /tests/golden/inline-text-items/source/jibb
509+/* src-163 %jibb /tests/golden/inline-term/source/jibb
510−/* tok-163 %txt /tests/golden/inline-text-items/tokens/txt
510+/* tok-163 %txt /tests/golden/inline-term/tokens/txt
511−/* tre-163 %txt /tests/golden/inline-text-items/tree/txt
511+/* tre-163 %txt /tests/golden/inline-term/tree/txt
512−/* src-164 %jibb /tests/golden/inline-union-both-bad/source/jibb
512+/* src-164 %jibb /tests/golden/inline-term-numeric/source/jibb
513−/* tok-164 %txt /tests/golden/inline-union-both-bad/tokens/txt
513+/* tok-164 %txt /tests/golden/inline-term-numeric/tokens/txt
514−/* tre-164 %txt /tests/golden/inline-union-both-bad/tree/txt
514+/* tre-164 %txt /tests/golden/inline-term-numeric/tree/txt
515−/* src-165 %jibb /tests/golden/inline-union-local/source/jibb
515+/* src-165 %jibb /tests/golden/inline-text-items/source/jibb
516−/* tok-165 %txt /tests/golden/inline-union-local/tokens/txt
516+/* tok-165 %txt /tests/golden/inline-text-items/tokens/txt
517−/* tre-165 %txt /tests/golden/inline-union-local/tree/txt
517+/* tre-165 %txt /tests/golden/inline-text-items/tree/txt
518−/* src-166 %jibb /tests/golden/inline-union-one-case/source/jibb
518+/* src-166 %jibb /tests/golden/inline-union-both-bad/source/jibb
519−/* tok-166 %txt /tests/golden/inline-union-one-case/tokens/txt
519+/* tok-166 %txt /tests/golden/inline-union-both-bad/tokens/txt
520−/* tre-166 %txt /tests/golden/inline-union-one-case/tree/txt
520+/* tre-166 %txt /tests/golden/inline-union-both-bad/tree/txt
521−/* src-167 %jibb /tests/golden/inline-union-record-bad/source/jibb
521+/* src-167 %jibb /tests/golden/inline-union-local/source/jibb
522−/* tok-167 %txt /tests/golden/inline-union-record-bad/tokens/txt
522+/* tok-167 %txt /tests/golden/inline-union-local/tokens/txt
523−/* tre-167 %txt /tests/golden/inline-union-record-bad/tree/txt
523+/* tre-167 %txt /tests/golden/inline-union-local/tree/txt
524−/* src-168 %jibb /tests/golden/inline-union-wide/source/jibb
524+/* src-168 %jibb /tests/golden/inline-union-one-case/source/jibb
525−/* tok-168 %txt /tests/golden/inline-union-wide/tokens/txt
525+/* tok-168 %txt /tests/golden/inline-union-one-case/tokens/txt
526−/* tre-168 %txt /tests/golden/inline-union-wide/tree/txt
526+/* tre-168 %txt /tests/golden/inline-union-one-case/tree/txt
527−/* src-169 %jibb /tests/golden/inline-unit/source/jibb
527+/* src-169 %jibb /tests/golden/inline-union-record-bad/source/jibb
528−/* tok-169 %txt /tests/golden/inline-unit/tokens/txt
528+/* tok-169 %txt /tests/golden/inline-union-record-bad/tokens/txt
529−/* tre-169 %txt /tests/golden/inline-unit/tree/txt
529+/* tre-169 %txt /tests/golden/inline-union-record-bad/tree/txt
530−/* src-170 %jibb /tests/golden/inline-wide-form-rune-bad/source/jibb
530+/* src-170 %jibb /tests/golden/inline-union-wide/source/jibb
531−/* tok-170 %txt /tests/golden/inline-wide-form-rune-bad/tokens/txt
531+/* tok-170 %txt /tests/golden/inline-union-wide/tokens/txt
532−/* tre-170 %txt /tests/golden/inline-wide-form-rune-bad/tree/txt
532+/* tre-170 %txt /tests/golden/inline-union-wide/tree/txt
533−/* src-171 %jibb /tests/golden/inline-wide-forms/source/jibb
533+/* src-171 %jibb /tests/golden/inline-unit/source/jibb
534−/* tok-171 %txt /tests/golden/inline-wide-forms/tokens/txt
534+/* tok-171 %txt /tests/golden/inline-unit/tokens/txt
535−/* tre-171 %txt /tests/golden/inline-wide-forms/tree/txt
535+/* tre-171 %txt /tests/golden/inline-unit/tree/txt
536−/* src-172 %jibb /tests/golden/inline-wide-union-call/source/jibb
536+/* src-172 %jibb /tests/golden/inline-wide-form-rune-bad/source/jibb
537−/* tok-172 %txt /tests/golden/inline-wide-union-call/tokens/txt
537+/* tok-172 %txt /tests/golden/inline-wide-form-rune-bad/tokens/txt
538−/* tre-172 %txt /tests/golden/inline-wide-union-call/tree/txt
538+/* tre-172 %txt /tests/golden/inline-wide-form-rune-bad/tree/txt
539−/* src-173 %jibb /tests/golden/inline-wings/source/jibb
539+/* src-173 %jibb /tests/golden/inline-wide-forms/source/jibb
540−/* tok-173 %txt /tests/golden/inline-wings/tokens/txt
540+/* tok-173 %txt /tests/golden/inline-wide-forms/tokens/txt
541−/* tre-173 %txt /tests/golden/inline-wings/tree/txt
541+/* tre-173 %txt /tests/golden/inline-wide-forms/tree/txt
542−/* src-174 %jibb /tests/golden/lex-base32-bad-1/source/jibb
542+/* src-174 %jibb /tests/golden/inline-wide-union-call/source/jibb
543−/* tok-174 %txt /tests/golden/lex-base32-bad-1/tokens/txt
543+/* tok-174 %txt /tests/golden/inline-wide-union-call/tokens/txt
544−/* tre-174 %txt /tests/golden/lex-base32-bad-1/tree/txt
544+/* tre-174 %txt /tests/golden/inline-wide-union-call/tree/txt
545−/* src-175 %jibb /tests/golden/lex-base32-ok-1/source/jibb
545+/* src-175 %jibb /tests/golden/inline-wings/source/jibb
546−/* tok-175 %txt /tests/golden/lex-base32-ok-1/tokens/txt
546+/* tok-175 %txt /tests/golden/inline-wings/tokens/txt
547−/* tre-175 %txt /tests/golden/lex-base32-ok-1/tree/txt
547+/* tre-175 %txt /tests/golden/inline-wings/tree/txt
548−/* src-176 %jibb /tests/golden/lex-blob-bad-1/source/jibb
548+/* src-176 %jibb /tests/golden/lex-base32-bad-1/source/jibb
549−/* tok-176 %txt /tests/golden/lex-blob-bad-1/tokens/txt
549+/* tok-176 %txt /tests/golden/lex-base32-bad-1/tokens/txt
550−/* tre-176 %txt /tests/golden/lex-blob-bad-1/tree/txt
550+/* tre-176 %txt /tests/golden/lex-base32-bad-1/tree/txt
551−/* src-177 %jibb /tests/golden/lex-call-open-bad-1/source/jibb
551+/* src-177 %jibb /tests/golden/lex-base32-ok-1/source/jibb
552−/* tok-177 %txt /tests/golden/lex-call-open-bad-1/tokens/txt
552+/* tok-177 %txt /tests/golden/lex-base32-ok-1/tokens/txt
553−/* tre-177 %txt /tests/golden/lex-call-open-bad-1/tree/txt
553+/* tre-177 %txt /tests/golden/lex-base32-ok-1/tree/txt
554−/* src-178 %jibb /tests/golden/lex-call-open-bad-2/source/jibb
554+/* src-178 %jibb /tests/golden/lex-blob-bad-1/source/jibb
555−/* tok-178 %txt /tests/golden/lex-call-open-bad-2/tokens/txt
555+/* tok-178 %txt /tests/golden/lex-blob-bad-1/tokens/txt
556−/* tre-178 %txt /tests/golden/lex-call-open-bad-2/tree/txt
556+/* tre-178 %txt /tests/golden/lex-blob-bad-1/tree/txt
557−/* src-179 %jibb /tests/golden/lex-call-open-bad-4/source/jibb
557+/* src-179 %jibb /tests/golden/lex-call-open-bad-1/source/jibb
558−/* tok-179 %txt /tests/golden/lex-call-open-bad-4/tokens/txt
558+/* tok-179 %txt /tests/golden/lex-call-open-bad-1/tokens/txt
559−/* tre-179 %txt /tests/golden/lex-call-open-bad-4/tree/txt
559+/* tre-179 %txt /tests/golden/lex-call-open-bad-1/tree/txt
560−/* src-180 %jibb /tests/golden/lex-call-open-ok-1/source/jibb
560+/* src-180 %jibb /tests/golden/lex-call-open-bad-2/source/jibb
561−/* tok-180 %txt /tests/golden/lex-call-open-ok-1/tokens/txt
561+/* tok-180 %txt /tests/golden/lex-call-open-bad-2/tokens/txt
562−/* tre-180 %txt /tests/golden/lex-call-open-ok-1/tree/txt
562+/* tre-180 %txt /tests/golden/lex-call-open-bad-2/tree/txt
563−/* src-181 %jibb /tests/golden/lex-call-open-ok-2/source/jibb
563+/* src-181 %jibb /tests/golden/lex-call-open-bad-4/source/jibb
564−/* tok-181 %txt /tests/golden/lex-call-open-ok-2/tokens/txt
564+/* tok-181 %txt /tests/golden/lex-call-open-bad-4/tokens/txt
565−/* tre-181 %txt /tests/golden/lex-call-open-ok-2/tree/txt
565+/* tre-181 %txt /tests/golden/lex-call-open-bad-4/tree/txt
566−/* src-182 %jibb /tests/golden/lex-cell-bad-1/source/jibb
566+/* src-182 %jibb /tests/golden/lex-call-open-ok-1/source/jibb
567−/* tok-182 %txt /tests/golden/lex-cell-bad-1/tokens/txt
567+/* tok-182 %txt /tests/golden/lex-call-open-ok-1/tokens/txt
568−/* tre-182 %txt /tests/golden/lex-cell-bad-1/tree/txt
568+/* tre-182 %txt /tests/golden/lex-call-open-ok-1/tree/txt
569−/* src-183 %jibb /tests/golden/lex-cell-ok-1/source/jibb
569+/* src-183 %jibb /tests/golden/lex-call-open-ok-2/source/jibb
570−/* tok-183 %txt /tests/golden/lex-cell-ok-1/tokens/txt
570+/* tok-183 %txt /tests/golden/lex-call-open-ok-2/tokens/txt
571−/* tre-183 %txt /tests/golden/lex-cell-ok-1/tree/txt
571+/* tre-183 %txt /tests/golden/lex-call-open-ok-2/tree/txt
572−/* src-184 %jibb /tests/golden/lex-closer-bad-1/source/jibb
572+/* src-184 %jibb /tests/golden/lex-cell-bad-1/source/jibb
573−/* tok-184 %txt /tests/golden/lex-closer-bad-1/tokens/txt
573+/* tok-184 %txt /tests/golden/lex-cell-bad-1/tokens/txt
574−/* tre-184 %txt /tests/golden/lex-closer-bad-1/tree/txt
574+/* tre-184 %txt /tests/golden/lex-cell-bad-1/tree/txt
575−/* src-185 %jibb /tests/golden/lex-closer-bad-2/source/jibb
575+/* src-185 %jibb /tests/golden/lex-cell-ok-1/source/jibb
576−/* tok-185 %txt /tests/golden/lex-closer-bad-2/tokens/txt
576+/* tok-185 %txt /tests/golden/lex-cell-ok-1/tokens/txt
577−/* tre-185 %txt /tests/golden/lex-closer-bad-2/tree/txt
577+/* tre-185 %txt /tests/golden/lex-cell-ok-1/tree/txt
578−/* src-186 %jibb /tests/golden/lex-closer-bad-3/source/jibb
578+/* src-186 %jibb /tests/golden/lex-closer-bad-1/source/jibb
579−/* tok-186 %txt /tests/golden/lex-closer-bad-3/tokens/txt
579+/* tok-186 %txt /tests/golden/lex-closer-bad-1/tokens/txt
580−/* tre-186 %txt /tests/golden/lex-closer-bad-3/tree/txt
580+/* tre-186 %txt /tests/golden/lex-closer-bad-1/tree/txt
581−/* src-187 %jibb /tests/golden/lex-closer-bad-4/source/jibb
581+/* src-187 %jibb /tests/golden/lex-closer-bad-2/source/jibb
582−/* tok-187 %txt /tests/golden/lex-closer-bad-4/tokens/txt
582+/* tok-187 %txt /tests/golden/lex-closer-bad-2/tokens/txt
583−/* tre-187 %txt /tests/golden/lex-closer-bad-4/tree/txt
583+/* tre-187 %txt /tests/golden/lex-closer-bad-2/tree/txt
584−/* src-188 %jibb /tests/golden/lex-codepoint-bad-1/source/jibb
584+/* src-188 %jibb /tests/golden/lex-closer-bad-3/source/jibb
585−/* tok-188 %txt /tests/golden/lex-codepoint-bad-1/tokens/txt
585+/* tok-188 %txt /tests/golden/lex-closer-bad-3/tokens/txt
586−/* tre-188 %txt /tests/golden/lex-codepoint-bad-1/tree/txt
586+/* tre-188 %txt /tests/golden/lex-closer-bad-3/tree/txt
587−/* src-189 %jibb /tests/golden/lex-comment-bad-1/source/jibb
587+/* src-189 %jibb /tests/golden/lex-closer-bad-4/source/jibb
588−/* tok-189 %txt /tests/golden/lex-comment-bad-1/tokens/txt
588+/* tok-189 %txt /tests/golden/lex-closer-bad-4/tokens/txt
589−/* tre-189 %txt /tests/golden/lex-comment-bad-1/tree/txt
589+/* tre-189 %txt /tests/golden/lex-closer-bad-4/tree/txt
590−/* src-190 %jibb /tests/golden/lex-comment-ok-1/source/jibb
590+/* src-190 %jibb /tests/golden/lex-codepoint-bad-1/source/jibb
591−/* tok-190 %txt /tests/golden/lex-comment-ok-1/tokens/txt
591+/* tok-190 %txt /tests/golden/lex-codepoint-bad-1/tokens/txt
592−/* tre-190 %txt /tests/golden/lex-comment-ok-1/tree/txt
592+/* tre-190 %txt /tests/golden/lex-codepoint-bad-1/tree/txt
593−/* src-191 %jibb /tests/golden/lex-comment-ok-2/source/jibb
593+/* src-191 %jibb /tests/golden/lex-comment-bad-1/source/jibb
594−/* tok-191 %txt /tests/golden/lex-comment-ok-2/tokens/txt
594+/* tok-191 %txt /tests/golden/lex-comment-bad-1/tokens/txt
595−/* tre-191 %txt /tests/golden/lex-comment-ok-2/tree/txt
595+/* tre-191 %txt /tests/golden/lex-comment-bad-1/tree/txt
596−/* src-192 %jibb /tests/golden/lex-comment-ok-3/source/jibb
596+/* src-192 %jibb /tests/golden/lex-comment-ok-1/source/jibb
597−/* tok-192 %txt /tests/golden/lex-comment-ok-3/tokens/txt
597+/* tok-192 %txt /tests/golden/lex-comment-ok-1/tokens/txt
598−/* tre-192 %txt /tests/golden/lex-comment-ok-3/tree/txt
598+/* tre-192 %txt /tests/golden/lex-comment-ok-1/tree/txt
599−/* src-193 %jibb /tests/golden/lex-date-bad-1/source/jibb
599+/* src-193 %jibb /tests/golden/lex-comment-ok-2/source/jibb
600−/* tok-193 %txt /tests/golden/lex-date-bad-1/tokens/txt
600+/* tok-193 %txt /tests/golden/lex-comment-ok-2/tokens/txt
601−/* tre-193 %txt /tests/golden/lex-date-bad-1/tree/txt
601+/* tre-193 %txt /tests/golden/lex-comment-ok-2/tree/txt
602−/* src-194 %jibb /tests/golden/lex-date-bad-2/source/jibb
602+/* src-194 %jibb /tests/golden/lex-comment-ok-3/source/jibb
603−/* tok-194 %txt /tests/golden/lex-date-bad-2/tokens/txt
603+/* tok-194 %txt /tests/golden/lex-comment-ok-3/tokens/txt
604−/* tre-194 %txt /tests/golden/lex-date-bad-2/tree/txt
604+/* tre-194 %txt /tests/golden/lex-comment-ok-3/tree/txt
605−/* src-195 %jibb /tests/golden/lex-date-bad-3/source/jibb
605+/* src-195 %jibb /tests/golden/lex-date-bad-1/source/jibb
606−/* tok-195 %txt /tests/golden/lex-date-bad-3/tokens/txt
606+/* tok-195 %txt /tests/golden/lex-date-bad-1/tokens/txt
607−/* tre-195 %txt /tests/golden/lex-date-bad-3/tree/txt
607+/* tre-195 %txt /tests/golden/lex-date-bad-1/tree/txt
608−/* src-196 %jibb /tests/golden/lex-date-ok-1/source/jibb
608+/* src-196 %jibb /tests/golden/lex-date-bad-2/source/jibb
609−/* tok-196 %txt /tests/golden/lex-date-ok-1/tokens/txt
609+/* tok-196 %txt /tests/golden/lex-date-bad-2/tokens/txt
610−/* tre-196 %txt /tests/golden/lex-date-ok-1/tree/txt
610+/* tre-196 %txt /tests/golden/lex-date-bad-2/tree/txt
611−/* src-197 %jibb /tests/golden/lex-date-ok-2/source/jibb
611+/* src-197 %jibb /tests/golden/lex-date-bad-3/source/jibb
612−/* tok-197 %txt /tests/golden/lex-date-ok-2/tokens/txt
612+/* tok-197 %txt /tests/golden/lex-date-bad-3/tokens/txt
613−/* tre-197 %txt /tests/golden/lex-date-ok-2/tree/txt
613+/* tre-197 %txt /tests/golden/lex-date-bad-3/tree/txt
614−/* src-198 %jibb /tests/golden/lex-decimal-bad-1/source/jibb
614+/* src-198 %jibb /tests/golden/lex-date-ok-1/source/jibb
615−/* tok-198 %txt /tests/golden/lex-decimal-bad-1/tokens/txt
615+/* tok-198 %txt /tests/golden/lex-date-ok-1/tokens/txt
616−/* tre-198 %txt /tests/golden/lex-decimal-bad-1/tree/txt
616+/* tre-198 %txt /tests/golden/lex-date-ok-1/tree/txt
617−/* src-199 %jibb /tests/golden/lex-decimal-bad-2/source/jibb
617+/* src-199 %jibb /tests/golden/lex-date-ok-2/source/jibb
618−/* tok-199 %txt /tests/golden/lex-decimal-bad-2/tokens/txt
618+/* tok-199 %txt /tests/golden/lex-date-ok-2/tokens/txt
619−/* tre-199 %txt /tests/golden/lex-decimal-bad-2/tree/txt
619+/* tre-199 %txt /tests/golden/lex-date-ok-2/tree/txt
620−/* src-200 %jibb /tests/golden/lex-decimal-ok-1/source/jibb
620+/* src-200 %jibb /tests/golden/lex-decimal-bad-1/source/jibb
621−/* tok-200 %txt /tests/golden/lex-decimal-ok-1/tokens/txt
621+/* tok-200 %txt /tests/golden/lex-decimal-bad-1/tokens/txt
622−/* tre-200 %txt /tests/golden/lex-decimal-ok-1/tree/txt
622+/* tre-200 %txt /tests/golden/lex-decimal-bad-1/tree/txt
623−/* src-201 %jibb /tests/golden/lex-duration-bad-1/source/jibb
623+/* src-201 %jibb /tests/golden/lex-decimal-bad-2/source/jibb
624−/* tok-201 %txt /tests/golden/lex-duration-bad-1/tokens/txt
624+/* tok-201 %txt /tests/golden/lex-decimal-bad-2/tokens/txt
625−/* tre-201 %txt /tests/golden/lex-duration-bad-1/tree/txt
625+/* tre-201 %txt /tests/golden/lex-decimal-bad-2/tree/txt
626−/* src-202 %jibb /tests/golden/lex-duration-bad-2/source/jibb
626+/* src-202 %jibb /tests/golden/lex-decimal-ok-1/source/jibb
627−/* tok-202 %txt /tests/golden/lex-duration-bad-2/tokens/txt
627+/* tok-202 %txt /tests/golden/lex-decimal-ok-1/tokens/txt
628−/* tre-202 %txt /tests/golden/lex-duration-bad-2/tree/txt
628+/* tre-202 %txt /tests/golden/lex-decimal-ok-1/tree/txt
629−/* src-203 %jibb /tests/golden/lex-duration-ok-1/source/jibb
629+/* src-203 %jibb /tests/golden/lex-duration-bad-1/source/jibb
630−/* tok-203 %txt /tests/golden/lex-duration-ok-1/tokens/txt
630+/* tok-203 %txt /tests/golden/lex-duration-bad-1/tokens/txt
631−/* tre-203 %txt /tests/golden/lex-duration-ok-1/tree/txt
631+/* tre-203 %txt /tests/golden/lex-duration-bad-1/tree/txt
632−/* src-204 %jibb /tests/golden/lex-hex-bad-1/source/jibb
632+/* src-204 %jibb /tests/golden/lex-duration-bad-2/source/jibb
633−/* tok-204 %txt /tests/golden/lex-hex-bad-1/tokens/txt
633+/* tok-204 %txt /tests/golden/lex-duration-bad-2/tokens/txt
634−/* tre-204 %txt /tests/golden/lex-hex-bad-1/tree/txt
634+/* tre-204 %txt /tests/golden/lex-duration-bad-2/tree/txt
635−/* src-205 %jibb /tests/golden/lex-hex-ok-1/source/jibb
635+/* src-205 %jibb /tests/golden/lex-duration-ok-1/source/jibb
636−/* tok-205 %txt /tests/golden/lex-hex-ok-1/tokens/txt
636+/* tok-205 %txt /tests/golden/lex-duration-ok-1/tokens/txt
637−/* tre-205 %txt /tests/golden/lex-hex-ok-1/tree/txt
637+/* tre-205 %txt /tests/golden/lex-duration-ok-1/tree/txt
638−/* src-206 %jibb /tests/golden/lex-indent-bad-1/source/jibb
638+/* src-206 %jibb /tests/golden/lex-hex-bad-1/source/jibb
639−/* tok-206 %txt /tests/golden/lex-indent-bad-1/tokens/txt
639+/* tok-206 %txt /tests/golden/lex-hex-bad-1/tokens/txt
640−/* tre-206 %txt /tests/golden/lex-indent-bad-1/tree/txt
640+/* tre-206 %txt /tests/golden/lex-hex-bad-1/tree/txt
641−/* src-207 %jibb /tests/golden/lex-indent-bad-2/source/jibb
641+/* src-207 %jibb /tests/golden/lex-hex-ok-1/source/jibb
642−/* tok-207 %txt /tests/golden/lex-indent-bad-2/tokens/txt
642+/* tok-207 %txt /tests/golden/lex-hex-ok-1/tokens/txt
643−/* tre-207 %txt /tests/golden/lex-indent-bad-2/tree/txt
643+/* tre-207 %txt /tests/golden/lex-hex-ok-1/tree/txt
644−/* src-208 %jibb /tests/golden/lex-indent-bad-3/source/jibb
644+/* src-208 %jibb /tests/golden/lex-indent-bad-1/source/jibb
645−/* tok-208 %txt /tests/golden/lex-indent-bad-3/tokens/txt
645+/* tok-208 %txt /tests/golden/lex-indent-bad-1/tokens/txt
646−/* tre-208 %txt /tests/golden/lex-indent-bad-3/tree/txt
646+/* tre-208 %txt /tests/golden/lex-indent-bad-1/tree/txt
647−/* src-209 %jibb /tests/golden/lex-indent-ok-1/source/jibb
647+/* src-209 %jibb /tests/golden/lex-indent-bad-2/source/jibb
648−/* tok-209 %txt /tests/golden/lex-indent-ok-1/tokens/txt
648+/* tok-209 %txt /tests/golden/lex-indent-bad-2/tokens/txt
649−/* tre-209 %txt /tests/golden/lex-indent-ok-1/tree/txt
649+/* tre-209 %txt /tests/golden/lex-indent-bad-2/tree/txt
650−/* src-210 %jibb /tests/golden/lex-indent-ok-2/source/jibb
650+/* src-210 %jibb /tests/golden/lex-indent-bad-3/source/jibb
651−/* tok-210 %txt /tests/golden/lex-indent-ok-2/tokens/txt
651+/* tok-210 %txt /tests/golden/lex-indent-bad-3/tokens/txt
652−/* tre-210 %txt /tests/golden/lex-indent-ok-2/tree/txt
652+/* tre-210 %txt /tests/golden/lex-indent-bad-3/tree/txt
653−/* src-211 %jibb /tests/golden/lex-indent-ok-3/source/jibb
653+/* src-211 %jibb /tests/golden/lex-indent-ok-1/source/jibb
654−/* tok-211 %txt /tests/golden/lex-indent-ok-3/tokens/txt
654+/* tok-211 %txt /tests/golden/lex-indent-ok-1/tokens/txt
655−/* tre-211 %txt /tests/golden/lex-indent-ok-3/tree/txt
655+/* tre-211 %txt /tests/golden/lex-indent-ok-1/tree/txt
656−/* src-212 %jibb /tests/golden/lex-interp-bad-1/source/jibb
656+/* src-212 %jibb /tests/golden/lex-indent-ok-2/source/jibb
657−/* tok-212 %txt /tests/golden/lex-interp-bad-1/tokens/txt
657+/* tok-212 %txt /tests/golden/lex-indent-ok-2/tokens/txt
658−/* tre-212 %txt /tests/golden/lex-interp-bad-1/tree/txt
658+/* tre-212 %txt /tests/golden/lex-indent-ok-2/tree/txt
659−/* src-213 %jibb /tests/golden/lex-interp-bad-2/source/jibb
659+/* src-213 %jibb /tests/golden/lex-indent-ok-3/source/jibb
660−/* tok-213 %txt /tests/golden/lex-interp-bad-2/tokens/txt
660+/* tok-213 %txt /tests/golden/lex-indent-ok-3/tokens/txt
661−/* tre-213 %txt /tests/golden/lex-interp-bad-2/tree/txt
661+/* tre-213 %txt /tests/golden/lex-indent-ok-3/tree/txt
662−/* src-214 %jibb /tests/golden/lex-interp-bad-3/source/jibb
662+/* src-214 %jibb /tests/golden/lex-interp-bad-1/source/jibb
663−/* tok-214 %txt /tests/golden/lex-interp-bad-3/tokens/txt
663+/* tok-214 %txt /tests/golden/lex-interp-bad-1/tokens/txt
664−/* tre-214 %txt /tests/golden/lex-interp-bad-3/tree/txt
664+/* tre-214 %txt /tests/golden/lex-interp-bad-1/tree/txt
665−/* src-215 %jibb /tests/golden/lex-interp-bad-5/source/jibb
665+/* src-215 %jibb /tests/golden/lex-interp-bad-2/source/jibb
666−/* tok-215 %txt /tests/golden/lex-interp-bad-5/tokens/txt
666+/* tok-215 %txt /tests/golden/lex-interp-bad-2/tokens/txt
667−/* tre-215 %txt /tests/golden/lex-interp-bad-5/tree/txt
667+/* tre-215 %txt /tests/golden/lex-interp-bad-2/tree/txt
668−/* src-216 %jibb /tests/golden/lex-interp-bad-6/source/jibb
668+/* src-216 %jibb /tests/golden/lex-interp-bad-3/source/jibb
669−/* tok-216 %txt /tests/golden/lex-interp-bad-6/tokens/txt
669+/* tok-216 %txt /tests/golden/lex-interp-bad-3/tokens/txt
670−/* tre-216 %txt /tests/golden/lex-interp-bad-6/tree/txt
670+/* tre-216 %txt /tests/golden/lex-interp-bad-3/tree/txt
671−/* src-217 %jibb /tests/golden/lex-interp-ok-1/source/jibb
671+/* src-217 %jibb /tests/golden/lex-interp-bad-5/source/jibb
672−/* tok-217 %txt /tests/golden/lex-interp-ok-1/tokens/txt
672+/* tok-217 %txt /tests/golden/lex-interp-bad-5/tokens/txt
673−/* tre-217 %txt /tests/golden/lex-interp-ok-1/tree/txt
673+/* tre-217 %txt /tests/golden/lex-interp-bad-5/tree/txt
674−/* src-218 %jibb /tests/golden/lex-interp-ok-2/source/jibb
674+/* src-218 %jibb /tests/golden/lex-interp-bad-6/source/jibb
675−/* tok-218 %txt /tests/golden/lex-interp-ok-2/tokens/txt
675+/* tok-218 %txt /tests/golden/lex-interp-bad-6/tokens/txt
676−/* tre-218 %txt /tests/golden/lex-interp-ok-2/tree/txt
676+/* tre-218 %txt /tests/golden/lex-interp-bad-6/tree/txt
677−/* src-219 %jibb /tests/golden/lex-interp-ok-3/source/jibb
677+/* src-219 %jibb /tests/golden/lex-interp-ok-1/source/jibb
678−/* tok-219 %txt /tests/golden/lex-interp-ok-3/tokens/txt
678+/* tok-219 %txt /tests/golden/lex-interp-ok-1/tokens/txt
679−/* tre-219 %txt /tests/golden/lex-interp-ok-3/tree/txt
679+/* tre-219 %txt /tests/golden/lex-interp-ok-1/tree/txt
680−/* src-220 %jibb /tests/golden/lex-knot-bad-1/source/jibb
680+/* src-220 %jibb /tests/golden/lex-interp-ok-2/source/jibb
681−/* tok-220 %txt /tests/golden/lex-knot-bad-1/tokens/txt
681+/* tok-220 %txt /tests/golden/lex-interp-ok-2/tokens/txt
682−/* tre-220 %txt /tests/golden/lex-knot-bad-1/tree/txt
682+/* tre-220 %txt /tests/golden/lex-interp-ok-2/tree/txt
683−/* src-221 %jibb /tests/golden/lex-knot-ok-1/source/jibb
683+/* src-221 %jibb /tests/golden/lex-interp-ok-3/source/jibb
684−/* tok-221 %txt /tests/golden/lex-knot-ok-1/tokens/txt
684+/* tok-221 %txt /tests/golden/lex-interp-ok-3/tokens/txt
685−/* tre-221 %txt /tests/golden/lex-knot-ok-1/tree/txt
685+/* tre-221 %txt /tests/golden/lex-interp-ok-3/tree/txt
686−/* src-222 %jibb /tests/golden/lex-layout-bad-1/source/jibb
686+/* src-222 %jibb /tests/golden/lex-knot-bad-1/source/jibb
687−/* tok-222 %txt /tests/golden/lex-layout-bad-1/tokens/txt
687+/* tok-222 %txt /tests/golden/lex-knot-bad-1/tokens/txt
688−/* tre-222 %txt /tests/golden/lex-layout-bad-1/tree/txt
688+/* tre-222 %txt /tests/golden/lex-knot-bad-1/tree/txt
689−/* src-223 %jibb /tests/golden/lex-layout-bad-10/source/jibb
689+/* src-223 %jibb /tests/golden/lex-knot-ok-1/source/jibb
690−/* tok-223 %txt /tests/golden/lex-layout-bad-10/tokens/txt
690+/* tok-223 %txt /tests/golden/lex-knot-ok-1/tokens/txt
691−/* tre-223 %txt /tests/golden/lex-layout-bad-10/tree/txt
691+/* tre-223 %txt /tests/golden/lex-knot-ok-1/tree/txt
692−/* src-224 %jibb /tests/golden/lex-layout-bad-2/source/jibb
692+/* src-224 %jibb /tests/golden/lex-layout-bad-1/source/jibb
693−/* tok-224 %txt /tests/golden/lex-layout-bad-2/tokens/txt
693+/* tok-224 %txt /tests/golden/lex-layout-bad-1/tokens/txt
694−/* tre-224 %txt /tests/golden/lex-layout-bad-2/tree/txt
694+/* tre-224 %txt /tests/golden/lex-layout-bad-1/tree/txt
695−/* src-225 %jibb /tests/golden/lex-layout-bad-3/source/jibb
695+/* src-225 %jibb /tests/golden/lex-layout-bad-10/source/jibb
696−/* tok-225 %txt /tests/golden/lex-layout-bad-3/tokens/txt
696+/* tok-225 %txt /tests/golden/lex-layout-bad-10/tokens/txt
697−/* tre-225 %txt /tests/golden/lex-layout-bad-3/tree/txt
697+/* tre-225 %txt /tests/golden/lex-layout-bad-10/tree/txt
698−/* src-226 %jibb /tests/golden/lex-layout-bad-4/source/jibb
698+/* src-226 %jibb /tests/golden/lex-layout-bad-2/source/jibb
699−/* tok-226 %txt /tests/golden/lex-layout-bad-4/tokens/txt
699+/* tok-226 %txt /tests/golden/lex-layout-bad-2/tokens/txt
700−/* tre-226 %txt /tests/golden/lex-layout-bad-4/tree/txt
700+/* tre-226 %txt /tests/golden/lex-layout-bad-2/tree/txt
701−/* src-227 %jibb /tests/golden/lex-layout-bad-5/source/jibb
701+/* src-227 %jibb /tests/golden/lex-layout-bad-3/source/jibb
702−/* tok-227 %txt /tests/golden/lex-layout-bad-5/tokens/txt
702+/* tok-227 %txt /tests/golden/lex-layout-bad-3/tokens/txt
703−/* tre-227 %txt /tests/golden/lex-layout-bad-5/tree/txt
703+/* tre-227 %txt /tests/golden/lex-layout-bad-3/tree/txt
704−/* src-228 %jibb /tests/golden/lex-layout-bad-6/source/jibb
704+/* src-228 %jibb /tests/golden/lex-layout-bad-4/source/jibb
705−/* tok-228 %txt /tests/golden/lex-layout-bad-6/tokens/txt
705+/* tok-228 %txt /tests/golden/lex-layout-bad-4/tokens/txt
706−/* tre-228 %txt /tests/golden/lex-layout-bad-6/tree/txt
706+/* tre-228 %txt /tests/golden/lex-layout-bad-4/tree/txt
707−/* src-229 %jibb /tests/golden/lex-layout-bad-7/source/jibb
707+/* src-229 %jibb /tests/golden/lex-layout-bad-5/source/jibb
708−/* tok-229 %txt /tests/golden/lex-layout-bad-7/tokens/txt
708+/* tok-229 %txt /tests/golden/lex-layout-bad-5/tokens/txt
709−/* tre-229 %txt /tests/golden/lex-layout-bad-7/tree/txt
709+/* tre-229 %txt /tests/golden/lex-layout-bad-5/tree/txt
710−/* src-230 %jibb /tests/golden/lex-layout-bad-8/source/jibb
710+/* src-230 %jibb /tests/golden/lex-layout-bad-6/source/jibb
711−/* tok-230 %txt /tests/golden/lex-layout-bad-8/tokens/txt
711+/* tok-230 %txt /tests/golden/lex-layout-bad-6/tokens/txt
712−/* tre-230 %txt /tests/golden/lex-layout-bad-8/tree/txt
712+/* tre-230 %txt /tests/golden/lex-layout-bad-6/tree/txt
713−/* src-231 %jibb /tests/golden/lex-layout-bad-9/source/jibb
713+/* src-231 %jibb /tests/golden/lex-layout-bad-7/source/jibb
714−/* tok-231 %txt /tests/golden/lex-layout-bad-9/tokens/txt
714+/* tok-231 %txt /tests/golden/lex-layout-bad-7/tokens/txt
715−/* tre-231 %txt /tests/golden/lex-layout-bad-9/tree/txt
715+/* tre-231 %txt /tests/golden/lex-layout-bad-7/tree/txt
716−/* src-232 %jibb /tests/golden/lex-layout-ok-1/source/jibb
716+/* src-232 %jibb /tests/golden/lex-layout-bad-8/source/jibb
717−/* tok-232 %txt /tests/golden/lex-layout-ok-1/tokens/txt
717+/* tok-232 %txt /tests/golden/lex-layout-bad-8/tokens/txt
718−/* tre-232 %txt /tests/golden/lex-layout-ok-1/tree/txt
718+/* tre-232 %txt /tests/golden/lex-layout-bad-8/tree/txt
719−/* src-233 %jibb /tests/golden/lex-list-bad-1/source/jibb
719+/* src-233 %jibb /tests/golden/lex-layout-bad-9/source/jibb
720−/* tok-233 %txt /tests/golden/lex-list-bad-1/tokens/txt
720+/* tok-233 %txt /tests/golden/lex-layout-bad-9/tokens/txt
721−/* tre-233 %txt /tests/golden/lex-list-bad-1/tree/txt
721+/* tre-233 %txt /tests/golden/lex-layout-bad-9/tree/txt
722−/* src-234 %jibb /tests/golden/lex-list-ok-1/source/jibb
722+/* src-234 %jibb /tests/golden/lex-layout-ok-1/source/jibb
723−/* tok-234 %txt /tests/golden/lex-list-ok-1/tokens/txt
723+/* tok-234 %txt /tests/golden/lex-layout-ok-1/tokens/txt
724−/* tre-234 %txt /tests/golden/lex-list-ok-1/tree/txt
724+/* tre-234 %txt /tests/golden/lex-layout-ok-1/tree/txt
725−/* src-235 %jibb /tests/golden/lex-loobean-bad-1/source/jibb
725+/* src-235 %jibb /tests/golden/lex-list-bad-1/source/jibb
726−/* tok-235 %txt /tests/golden/lex-loobean-bad-1/tokens/txt
726+/* tok-235 %txt /tests/golden/lex-list-bad-1/tokens/txt
727−/* tre-235 %txt /tests/golden/lex-loobean-bad-1/tree/txt
727+/* tre-235 %txt /tests/golden/lex-list-bad-1/tree/txt
728−/* src-236 %jibb /tests/golden/lex-loobean-ok-1/source/jibb
728+/* src-236 %jibb /tests/golden/lex-list-ok-1/source/jibb
729−/* tok-236 %txt /tests/golden/lex-loobean-ok-1/tokens/txt
729+/* tok-236 %txt /tests/golden/lex-list-ok-1/tokens/txt
730−/* tre-236 %txt /tests/golden/lex-loobean-ok-1/tree/txt
730+/* tre-236 %txt /tests/golden/lex-list-ok-1/tree/txt
731−/* src-237 %jibb /tests/golden/lex-name-bad-1/source/jibb
731+/* src-237 %jibb /tests/golden/lex-loobean-bad-1/source/jibb
732−/* tok-237 %txt /tests/golden/lex-name-bad-1/tokens/txt
732+/* tok-237 %txt /tests/golden/lex-loobean-bad-1/tokens/txt
733−/* tre-237 %txt /tests/golden/lex-name-bad-1/tree/txt
733+/* tre-237 %txt /tests/golden/lex-loobean-bad-1/tree/txt
734−/* src-238 %jibb /tests/golden/lex-name-bad-2/source/jibb
734+/* src-238 %jibb /tests/golden/lex-loobean-ok-1/source/jibb
735−/* tok-238 %txt /tests/golden/lex-name-bad-2/tokens/txt
735+/* tok-238 %txt /tests/golden/lex-loobean-ok-1/tokens/txt
736−/* tre-238 %txt /tests/golden/lex-name-bad-2/tree/txt
736+/* tre-238 %txt /tests/golden/lex-loobean-ok-1/tree/txt
737−/* src-239 %jibb /tests/golden/lex-name-bad-3/source/jibb
737+/* src-239 %jibb /tests/golden/lex-name-bad-1/source/jibb
738−/* tok-239 %txt /tests/golden/lex-name-bad-3/tokens/txt
738+/* tok-239 %txt /tests/golden/lex-name-bad-1/tokens/txt
739−/* tre-239 %txt /tests/golden/lex-name-bad-3/tree/txt
739+/* tre-239 %txt /tests/golden/lex-name-bad-1/tree/txt
740−/* src-240 %jibb /tests/golden/lex-name-bad-4/source/jibb
740+/* src-240 %jibb /tests/golden/lex-name-bad-2/source/jibb
741−/* tok-240 %txt /tests/golden/lex-name-bad-4/tokens/txt
741+/* tok-240 %txt /tests/golden/lex-name-bad-2/tokens/txt
742−/* tre-240 %txt /tests/golden/lex-name-bad-4/tree/txt
742+/* tre-240 %txt /tests/golden/lex-name-bad-2/tree/txt
743−/* src-241 %jibb /tests/golden/lex-name-bad-5/source/jibb
743+/* src-241 %jibb /tests/golden/lex-name-bad-3/source/jibb
744−/* tok-241 %txt /tests/golden/lex-name-bad-5/tokens/txt
744+/* tok-241 %txt /tests/golden/lex-name-bad-3/tokens/txt
745−/* tre-241 %txt /tests/golden/lex-name-bad-5/tree/txt
745+/* tre-241 %txt /tests/golden/lex-name-bad-3/tree/txt
746−/* src-242 %jibb /tests/golden/lex-name-bad-6/source/jibb
746+/* src-242 %jibb /tests/golden/lex-name-bad-4/source/jibb
747−/* tok-242 %txt /tests/golden/lex-name-bad-6/tokens/txt
747+/* tok-242 %txt /tests/golden/lex-name-bad-4/tokens/txt
748−/* tre-242 %txt /tests/golden/lex-name-bad-6/tree/txt
748+/* tre-242 %txt /tests/golden/lex-name-bad-4/tree/txt
749−/* src-243 %jibb /tests/golden/lex-name-ok-1/source/jibb
749+/* src-243 %jibb /tests/golden/lex-name-bad-5/source/jibb
750−/* tok-243 %txt /tests/golden/lex-name-ok-1/tokens/txt
750+/* tok-243 %txt /tests/golden/lex-name-bad-5/tokens/txt
751−/* tre-243 %txt /tests/golden/lex-name-ok-1/tree/txt
751+/* tre-243 %txt /tests/golden/lex-name-bad-5/tree/txt
752−/* src-244 %jibb /tests/golden/lex-null-bad-1/source/jibb
752+/* src-244 %jibb /tests/golden/lex-name-bad-6/source/jibb
753−/* tok-244 %txt /tests/golden/lex-null-bad-1/tokens/txt
753+/* tok-244 %txt /tests/golden/lex-name-bad-6/tokens/txt
754−/* tre-244 %txt /tests/golden/lex-null-bad-1/tree/txt
754+/* tre-244 %txt /tests/golden/lex-name-bad-6/tree/txt
755−/* src-245 %jibb /tests/golden/lex-null-bad-2/source/jibb
755+/* src-245 %jibb /tests/golden/lex-name-ok-1/source/jibb
756−/* tok-245 %txt /tests/golden/lex-null-bad-2/tokens/txt
756+/* tok-245 %txt /tests/golden/lex-name-ok-1/tokens/txt
757−/* tre-245 %txt /tests/golden/lex-null-bad-2/tree/txt
757+/* tre-245 %txt /tests/golden/lex-name-ok-1/tree/txt
758−/* src-246 %jibb /tests/golden/lex-null-ok-1/source/jibb
758+/* src-246 %jibb /tests/golden/lex-null-bad-1/source/jibb
759−/* tok-246 %txt /tests/golden/lex-null-ok-1/tokens/txt
759+/* tok-246 %txt /tests/golden/lex-null-bad-1/tokens/txt
760−/* tre-246 %txt /tests/golden/lex-null-ok-1/tree/txt
760+/* tre-246 %txt /tests/golden/lex-null-bad-1/tree/txt
761−/* src-247 %jibb /tests/golden/lex-open-bracket-bad-1/source/jibb
761+/* src-247 %jibb /tests/golden/lex-null-bad-2/source/jibb
762−/* tok-247 %txt /tests/golden/lex-open-bracket-bad-1/tokens/txt
762+/* tok-247 %txt /tests/golden/lex-null-bad-2/tokens/txt
763−/* tre-247 %txt /tests/golden/lex-open-bracket-bad-1/tree/txt
763+/* tre-247 %txt /tests/golden/lex-null-bad-2/tree/txt
764−/* src-248 %jibb /tests/golden/lex-open-bracket-bad-10/source/jibb
764+/* src-248 %jibb /tests/golden/lex-null-ok-1/source/jibb
765−/* tok-248 %txt /tests/golden/lex-open-bracket-bad-10/tokens/txt
765+/* tok-248 %txt /tests/golden/lex-null-ok-1/tokens/txt
766−/* tre-248 %txt /tests/golden/lex-open-bracket-bad-10/tree/txt
766+/* tre-248 %txt /tests/golden/lex-null-ok-1/tree/txt
767−/* src-249 %jibb /tests/golden/lex-open-bracket-bad-11/source/jibb
767+/* src-249 %jibb /tests/golden/lex-open-bracket-bad-1/source/jibb
768−/* tok-249 %txt /tests/golden/lex-open-bracket-bad-11/tokens/txt
768+/* tok-249 %txt /tests/golden/lex-open-bracket-bad-1/tokens/txt
769−/* tre-249 %txt /tests/golden/lex-open-bracket-bad-11/tree/txt
769+/* tre-249 %txt /tests/golden/lex-open-bracket-bad-1/tree/txt
770−/* src-250 %jibb /tests/golden/lex-open-bracket-bad-12/source/jibb
770+/* src-250 %jibb /tests/golden/lex-open-bracket-bad-10/source/jibb
771−/* tok-250 %txt /tests/golden/lex-open-bracket-bad-12/tokens/txt
771+/* tok-250 %txt /tests/golden/lex-open-bracket-bad-10/tokens/txt
772−/* tre-250 %txt /tests/golden/lex-open-bracket-bad-12/tree/txt
772+/* tre-250 %txt /tests/golden/lex-open-bracket-bad-10/tree/txt
773−/* src-251 %jibb /tests/golden/lex-open-bracket-bad-13/source/jibb
773+/* src-251 %jibb /tests/golden/lex-open-bracket-bad-11/source/jibb
774−/* tok-251 %txt /tests/golden/lex-open-bracket-bad-13/tokens/txt
774+/* tok-251 %txt /tests/golden/lex-open-bracket-bad-11/tokens/txt
775−/* tre-251 %txt /tests/golden/lex-open-bracket-bad-13/tree/txt
775+/* tre-251 %txt /tests/golden/lex-open-bracket-bad-11/tree/txt
776−/* src-252 %jibb /tests/golden/lex-open-bracket-bad-14/source/jibb
776+/* src-252 %jibb /tests/golden/lex-open-bracket-bad-12/source/jibb
777−/* tok-252 %txt /tests/golden/lex-open-bracket-bad-14/tokens/txt
777+/* tok-252 %txt /tests/golden/lex-open-bracket-bad-12/tokens/txt
778−/* tre-252 %txt /tests/golden/lex-open-bracket-bad-14/tree/txt
778+/* tre-252 %txt /tests/golden/lex-open-bracket-bad-12/tree/txt
779−/* src-253 %jibb /tests/golden/lex-open-bracket-bad-15/source/jibb
779+/* src-253 %jibb /tests/golden/lex-open-bracket-bad-13/source/jibb
780−/* tok-253 %txt /tests/golden/lex-open-bracket-bad-15/tokens/txt
780+/* tok-253 %txt /tests/golden/lex-open-bracket-bad-13/tokens/txt
781−/* tre-253 %txt /tests/golden/lex-open-bracket-bad-15/tree/txt
781+/* tre-253 %txt /tests/golden/lex-open-bracket-bad-13/tree/txt
782−/* src-254 %jibb /tests/golden/lex-open-bracket-bad-16/source/jibb
782+/* src-254 %jibb /tests/golden/lex-open-bracket-bad-14/source/jibb
783−/* tok-254 %txt /tests/golden/lex-open-bracket-bad-16/tokens/txt
783+/* tok-254 %txt /tests/golden/lex-open-bracket-bad-14/tokens/txt
784−/* tre-254 %txt /tests/golden/lex-open-bracket-bad-16/tree/txt
784+/* tre-254 %txt /tests/golden/lex-open-bracket-bad-14/tree/txt
785−/* src-255 %jibb /tests/golden/lex-open-bracket-bad-2/source/jibb
785+/* src-255 %jibb /tests/golden/lex-open-bracket-bad-15/source/jibb
786−/* tok-255 %txt /tests/golden/lex-open-bracket-bad-2/tokens/txt
786+/* tok-255 %txt /tests/golden/lex-open-bracket-bad-15/tokens/txt
787−/* tre-255 %txt /tests/golden/lex-open-bracket-bad-2/tree/txt
787+/* tre-255 %txt /tests/golden/lex-open-bracket-bad-15/tree/txt
788−/* src-256 %jibb /tests/golden/lex-open-bracket-bad-3/source/jibb
788+/* src-256 %jibb /tests/golden/lex-open-bracket-bad-16/source/jibb
789−/* tok-256 %txt /tests/golden/lex-open-bracket-bad-3/tokens/txt
789+/* tok-256 %txt /tests/golden/lex-open-bracket-bad-16/tokens/txt
790−/* tre-256 %txt /tests/golden/lex-open-bracket-bad-3/tree/txt
790+/* tre-256 %txt /tests/golden/lex-open-bracket-bad-16/tree/txt
791−/* src-257 %jibb /tests/golden/lex-open-bracket-bad-5/source/jibb
791+/* src-257 %jibb /tests/golden/lex-open-bracket-bad-2/source/jibb
792−/* tok-257 %txt /tests/golden/lex-open-bracket-bad-5/tokens/txt
792+/* tok-257 %txt /tests/golden/lex-open-bracket-bad-2/tokens/txt
793−/* tre-257 %txt /tests/golden/lex-open-bracket-bad-5/tree/txt
793+/* tre-257 %txt /tests/golden/lex-open-bracket-bad-2/tree/txt
794−/* src-258 %jibb /tests/golden/lex-open-bracket-bad-6/source/jibb
794+/* src-258 %jibb /tests/golden/lex-open-bracket-bad-3/source/jibb
795−/* tok-258 %txt /tests/golden/lex-open-bracket-bad-6/tokens/txt
795+/* tok-258 %txt /tests/golden/lex-open-bracket-bad-3/tokens/txt
796−/* tre-258 %txt /tests/golden/lex-open-bracket-bad-6/tree/txt
796+/* tre-258 %txt /tests/golden/lex-open-bracket-bad-3/tree/txt
797−/* src-259 %jibb /tests/golden/lex-open-bracket-bad-7/source/jibb
797+/* src-259 %jibb /tests/golden/lex-open-bracket-bad-5/source/jibb
798−/* tok-259 %txt /tests/golden/lex-open-bracket-bad-7/tokens/txt
798+/* tok-259 %txt /tests/golden/lex-open-bracket-bad-5/tokens/txt
799−/* tre-259 %txt /tests/golden/lex-open-bracket-bad-7/tree/txt
799+/* tre-259 %txt /tests/golden/lex-open-bracket-bad-5/tree/txt
800−/* src-260 %jibb /tests/golden/lex-open-bracket-bad-8/source/jibb
800+/* src-260 %jibb /tests/golden/lex-open-bracket-bad-6/source/jibb
801−/* tok-260 %txt /tests/golden/lex-open-bracket-bad-8/tokens/txt
801+/* tok-260 %txt /tests/golden/lex-open-bracket-bad-6/tokens/txt
802−/* tre-260 %txt /tests/golden/lex-open-bracket-bad-8/tree/txt
802+/* tre-260 %txt /tests/golden/lex-open-bracket-bad-6/tree/txt
803−/* src-261 %jibb /tests/golden/lex-open-bracket-bad-9/source/jibb
803+/* src-261 %jibb /tests/golden/lex-open-bracket-bad-7/source/jibb
804−/* tok-261 %txt /tests/golden/lex-open-bracket-bad-9/tokens/txt
804+/* tok-261 %txt /tests/golden/lex-open-bracket-bad-7/tokens/txt
805−/* tre-261 %txt /tests/golden/lex-open-bracket-bad-9/tree/txt
805+/* tre-261 %txt /tests/golden/lex-open-bracket-bad-7/tree/txt
806−/* src-262 %jibb /tests/golden/lex-open-bracket-ok-1/source/jibb
806+/* src-262 %jibb /tests/golden/lex-open-bracket-bad-8/source/jibb
807−/* tok-262 %txt /tests/golden/lex-open-bracket-ok-1/tokens/txt
807+/* tok-262 %txt /tests/golden/lex-open-bracket-bad-8/tokens/txt
808−/* tre-262 %txt /tests/golden/lex-open-bracket-ok-1/tree/txt
808+/* tre-262 %txt /tests/golden/lex-open-bracket-bad-8/tree/txt
809−/* src-263 %jibb /tests/golden/lex-open-bracket-ok-2/source/jibb
809+/* src-263 %jibb /tests/golden/lex-open-bracket-bad-9/source/jibb
810−/* tok-263 %txt /tests/golden/lex-open-bracket-ok-2/tokens/txt
810+/* tok-263 %txt /tests/golden/lex-open-bracket-bad-9/tokens/txt
811−/* tre-263 %txt /tests/golden/lex-open-bracket-ok-2/tree/txt
811+/* tre-263 %txt /tests/golden/lex-open-bracket-bad-9/tree/txt
812−/* src-264 %jibb /tests/golden/lex-open-bracket-ok-3/source/jibb
812+/* src-264 %jibb /tests/golden/lex-open-bracket-ok-1/source/jibb
813−/* tok-264 %txt /tests/golden/lex-open-bracket-ok-3/tokens/txt
813+/* tok-264 %txt /tests/golden/lex-open-bracket-ok-1/tokens/txt
814−/* tre-264 %txt /tests/golden/lex-open-bracket-ok-3/tree/txt
814+/* tre-264 %txt /tests/golden/lex-open-bracket-ok-1/tree/txt
815−/* src-265 %jibb /tests/golden/lex-open-bracket-ok-4/source/jibb
815+/* src-265 %jibb /tests/golden/lex-open-bracket-ok-2/source/jibb
816−/* tok-265 %txt /tests/golden/lex-open-bracket-ok-4/tokens/txt
816+/* tok-265 %txt /tests/golden/lex-open-bracket-ok-2/tokens/txt
817−/* tre-265 %txt /tests/golden/lex-open-bracket-ok-4/tree/txt
817+/* tre-265 %txt /tests/golden/lex-open-bracket-ok-2/tree/txt
818−/* src-266 %jibb /tests/golden/lex-open-bracket-ok-5/source/jibb
818+/* src-266 %jibb /tests/golden/lex-open-bracket-ok-3/source/jibb
819−/* tok-266 %txt /tests/golden/lex-open-bracket-ok-5/tokens/txt
819+/* tok-266 %txt /tests/golden/lex-open-bracket-ok-3/tokens/txt
820−/* tre-266 %txt /tests/golden/lex-open-bracket-ok-5/tree/txt
820+/* tre-266 %txt /tests/golden/lex-open-bracket-ok-3/tree/txt
821−/* src-267 %jibb /tests/golden/lex-open-bracket-ok-6/source/jibb
821+/* src-267 %jibb /tests/golden/lex-open-bracket-ok-4/source/jibb
822−/* tok-267 %txt /tests/golden/lex-open-bracket-ok-6/tokens/txt
822+/* tok-267 %txt /tests/golden/lex-open-bracket-ok-4/tokens/txt
823−/* tre-267 %txt /tests/golden/lex-open-bracket-ok-6/tree/txt
823+/* tre-267 %txt /tests/golden/lex-open-bracket-ok-4/tree/txt
824−/* src-268 %jibb /tests/golden/lex-open-bracket-ok-7/source/jibb
824+/* src-268 %jibb /tests/golden/lex-open-bracket-ok-5/source/jibb
825−/* tok-268 %txt /tests/golden/lex-open-bracket-ok-7/tokens/txt
825+/* tok-268 %txt /tests/golden/lex-open-bracket-ok-5/tokens/txt
826−/* tre-268 %txt /tests/golden/lex-open-bracket-ok-7/tree/txt
826+/* tre-268 %txt /tests/golden/lex-open-bracket-ok-5/tree/txt
827−/* src-269 %jibb /tests/golden/lex-open-bracket-ok-8/source/jibb
827+/* src-269 %jibb /tests/golden/lex-open-bracket-ok-6/source/jibb
828−/* tok-269 %txt /tests/golden/lex-open-bracket-ok-8/tokens/txt
828+/* tok-269 %txt /tests/golden/lex-open-bracket-ok-6/tokens/txt
829−/* tre-269 %txt /tests/golden/lex-open-bracket-ok-8/tree/txt
829+/* tre-269 %txt /tests/golden/lex-open-bracket-ok-6/tree/txt
830−/* src-270 %jibb /tests/golden/lex-open-bracket-ok-9/source/jibb
830+/* src-270 %jibb /tests/golden/lex-open-bracket-ok-7/source/jibb
831−/* tok-270 %txt /tests/golden/lex-open-bracket-ok-9/tokens/txt
831+/* tok-270 %txt /tests/golden/lex-open-bracket-ok-7/tokens/txt
832−/* tre-270 %txt /tests/golden/lex-open-bracket-ok-9/tree/txt
832+/* tre-270 %txt /tests/golden/lex-open-bracket-ok-7/tree/txt
833−/* src-271 %jibb /tests/golden/lex-open-mold-bad-1/source/jibb
833+/* src-271 %jibb /tests/golden/lex-open-bracket-ok-8/source/jibb
834−/* tok-271 %txt /tests/golden/lex-open-mold-bad-1/tokens/txt
834+/* tok-271 %txt /tests/golden/lex-open-bracket-ok-8/tokens/txt
835−/* tre-271 %txt /tests/golden/lex-open-mold-bad-1/tree/txt
835+/* tre-271 %txt /tests/golden/lex-open-bracket-ok-8/tree/txt
836−/* src-272 %jibb /tests/golden/lex-open-mold-bad-10/source/jibb
836+/* src-272 %jibb /tests/golden/lex-open-bracket-ok-9/source/jibb
837−/* tok-272 %txt /tests/golden/lex-open-mold-bad-10/tokens/txt
837+/* tok-272 %txt /tests/golden/lex-open-bracket-ok-9/tokens/txt
838−/* tre-272 %txt /tests/golden/lex-open-mold-bad-10/tree/txt
838+/* tre-272 %txt /tests/golden/lex-open-bracket-ok-9/tree/txt
839−/* src-273 %jibb /tests/golden/lex-open-mold-bad-11/source/jibb
839+/* src-273 %jibb /tests/golden/lex-open-mold-bad-1/source/jibb
840−/* tok-273 %txt /tests/golden/lex-open-mold-bad-11/tokens/txt
840+/* tok-273 %txt /tests/golden/lex-open-mold-bad-1/tokens/txt
841−/* tre-273 %txt /tests/golden/lex-open-mold-bad-11/tree/txt
841+/* tre-273 %txt /tests/golden/lex-open-mold-bad-1/tree/txt
842−/* src-274 %jibb /tests/golden/lex-open-mold-bad-12/source/jibb
842+/* src-274 %jibb /tests/golden/lex-open-mold-bad-10/source/jibb
843−/* tok-274 %txt /tests/golden/lex-open-mold-bad-12/tokens/txt
843+/* tok-274 %txt /tests/golden/lex-open-mold-bad-10/tokens/txt
844−/* tre-274 %txt /tests/golden/lex-open-mold-bad-12/tree/txt
844+/* tre-274 %txt /tests/golden/lex-open-mold-bad-10/tree/txt
845−/* src-275 %jibb /tests/golden/lex-open-mold-bad-13/source/jibb
845+/* src-275 %jibb /tests/golden/lex-open-mold-bad-11/source/jibb
846−/* tok-275 %txt /tests/golden/lex-open-mold-bad-13/tokens/txt
846+/* tok-275 %txt /tests/golden/lex-open-mold-bad-11/tokens/txt
847−/* tre-275 %txt /tests/golden/lex-open-mold-bad-13/tree/txt
847+/* tre-275 %txt /tests/golden/lex-open-mold-bad-11/tree/txt
848−/* src-276 %jibb /tests/golden/lex-open-mold-bad-14/source/jibb
848+/* src-276 %jibb /tests/golden/lex-open-mold-bad-12/source/jibb
849−/* tok-276 %txt /tests/golden/lex-open-mold-bad-14/tokens/txt
849+/* tok-276 %txt /tests/golden/lex-open-mold-bad-12/tokens/txt
850−/* tre-276 %txt /tests/golden/lex-open-mold-bad-14/tree/txt
850+/* tre-276 %txt /tests/golden/lex-open-mold-bad-12/tree/txt
851−/* src-277 %jibb /tests/golden/lex-open-mold-bad-15/source/jibb
851+/* src-277 %jibb /tests/golden/lex-open-mold-bad-13/source/jibb
852−/* tok-277 %txt /tests/golden/lex-open-mold-bad-15/tokens/txt
852+/* tok-277 %txt /tests/golden/lex-open-mold-bad-13/tokens/txt
853−/* tre-277 %txt /tests/golden/lex-open-mold-bad-15/tree/txt
853+/* tre-277 %txt /tests/golden/lex-open-mold-bad-13/tree/txt
854−/* src-278 %jibb /tests/golden/lex-open-mold-bad-16/source/jibb
854+/* src-278 %jibb /tests/golden/lex-open-mold-bad-14/source/jibb
855−/* tok-278 %txt /tests/golden/lex-open-mold-bad-16/tokens/txt
855+/* tok-278 %txt /tests/golden/lex-open-mold-bad-14/tokens/txt
856−/* tre-278 %txt /tests/golden/lex-open-mold-bad-16/tree/txt
856+/* tre-278 %txt /tests/golden/lex-open-mold-bad-14/tree/txt
857−/* src-279 %jibb /tests/golden/lex-open-mold-bad-2/source/jibb
857+/* src-279 %jibb /tests/golden/lex-open-mold-bad-15/source/jibb
858−/* tok-279 %txt /tests/golden/lex-open-mold-bad-2/tokens/txt
858+/* tok-279 %txt /tests/golden/lex-open-mold-bad-15/tokens/txt
859−/* tre-279 %txt /tests/golden/lex-open-mold-bad-2/tree/txt
859+/* tre-279 %txt /tests/golden/lex-open-mold-bad-15/tree/txt
860−/* src-280 %jibb /tests/golden/lex-open-mold-bad-3/source/jibb
860+/* src-280 %jibb /tests/golden/lex-open-mold-bad-16/source/jibb
861−/* tok-280 %txt /tests/golden/lex-open-mold-bad-3/tokens/txt
861+/* tok-280 %txt /tests/golden/lex-open-mold-bad-16/tokens/txt
862−/* tre-280 %txt /tests/golden/lex-open-mold-bad-3/tree/txt
862+/* tre-280 %txt /tests/golden/lex-open-mold-bad-16/tree/txt
863−/* src-281 %jibb /tests/golden/lex-open-mold-bad-4/source/jibb
863+/* src-281 %jibb /tests/golden/lex-open-mold-bad-2/source/jibb
864−/* tok-281 %txt /tests/golden/lex-open-mold-bad-4/tokens/txt
864+/* tok-281 %txt /tests/golden/lex-open-mold-bad-2/tokens/txt
865−/* tre-281 %txt /tests/golden/lex-open-mold-bad-4/tree/txt
865+/* tre-281 %txt /tests/golden/lex-open-mold-bad-2/tree/txt
866−/* src-282 %jibb /tests/golden/lex-open-mold-bad-5/source/jibb
866+/* src-282 %jibb /tests/golden/lex-open-mold-bad-3/source/jibb
867−/* tok-282 %txt /tests/golden/lex-open-mold-bad-5/tokens/txt
867+/* tok-282 %txt /tests/golden/lex-open-mold-bad-3/tokens/txt
868−/* tre-282 %txt /tests/golden/lex-open-mold-bad-5/tree/txt
868+/* tre-282 %txt /tests/golden/lex-open-mold-bad-3/tree/txt
869−/* src-283 %jibb /tests/golden/lex-open-mold-bad-6/source/jibb
869+/* src-283 %jibb /tests/golden/lex-open-mold-bad-4/source/jibb
870−/* tok-283 %txt /tests/golden/lex-open-mold-bad-6/tokens/txt
870+/* tok-283 %txt /tests/golden/lex-open-mold-bad-4/tokens/txt
871−/* tre-283 %txt /tests/golden/lex-open-mold-bad-6/tree/txt
871+/* tre-283 %txt /tests/golden/lex-open-mold-bad-4/tree/txt
872−/* src-284 %jibb /tests/golden/lex-open-mold-bad-7/source/jibb
872+/* src-284 %jibb /tests/golden/lex-open-mold-bad-5/source/jibb
873−/* tok-284 %txt /tests/golden/lex-open-mold-bad-7/tokens/txt
873+/* tok-284 %txt /tests/golden/lex-open-mold-bad-5/tokens/txt
874−/* tre-284 %txt /tests/golden/lex-open-mold-bad-7/tree/txt
874+/* tre-284 %txt /tests/golden/lex-open-mold-bad-5/tree/txt
875−/* src-285 %jibb /tests/golden/lex-open-mold-bad-8/source/jibb
875+/* src-285 %jibb /tests/golden/lex-open-mold-bad-6/source/jibb
876−/* tok-285 %txt /tests/golden/lex-open-mold-bad-8/tokens/txt
876+/* tok-285 %txt /tests/golden/lex-open-mold-bad-6/tokens/txt
877−/* tre-285 %txt /tests/golden/lex-open-mold-bad-8/tree/txt
877+/* tre-285 %txt /tests/golden/lex-open-mold-bad-6/tree/txt
878−/* src-286 %jibb /tests/golden/lex-open-mold-bad-9/source/jibb
878+/* src-286 %jibb /tests/golden/lex-open-mold-bad-7/source/jibb
879−/* tok-286 %txt /tests/golden/lex-open-mold-bad-9/tokens/txt
879+/* tok-286 %txt /tests/golden/lex-open-mold-bad-7/tokens/txt
880−/* tre-286 %txt /tests/golden/lex-open-mold-bad-9/tree/txt
880+/* tre-286 %txt /tests/golden/lex-open-mold-bad-7/tree/txt
881−/* src-287 %jibb /tests/golden/lex-open-mold-ok-1/source/jibb
881+/* src-287 %jibb /tests/golden/lex-open-mold-bad-8/source/jibb
882−/* tok-287 %txt /tests/golden/lex-open-mold-ok-1/tokens/txt
882+/* tok-287 %txt /tests/golden/lex-open-mold-bad-8/tokens/txt
883−/* tre-287 %txt /tests/golden/lex-open-mold-ok-1/tree/txt
883+/* tre-287 %txt /tests/golden/lex-open-mold-bad-8/tree/txt
884−/* src-288 %jibb /tests/golden/lex-open-mold-ok-2/source/jibb
884+/* src-288 %jibb /tests/golden/lex-open-mold-bad-9/source/jibb
885−/* tok-288 %txt /tests/golden/lex-open-mold-ok-2/tokens/txt
885+/* tok-288 %txt /tests/golden/lex-open-mold-bad-9/tokens/txt
886−/* tre-288 %txt /tests/golden/lex-open-mold-ok-2/tree/txt
886+/* tre-288 %txt /tests/golden/lex-open-mold-bad-9/tree/txt
887−/* src-289 %jibb /tests/golden/lex-open-mold-ok-3/source/jibb
887+/* src-289 %jibb /tests/golden/lex-open-mold-ok-1/source/jibb
888−/* tok-289 %txt /tests/golden/lex-open-mold-ok-3/tokens/txt
888+/* tok-289 %txt /tests/golden/lex-open-mold-ok-1/tokens/txt
889−/* tre-289 %txt /tests/golden/lex-open-mold-ok-3/tree/txt
889+/* tre-289 %txt /tests/golden/lex-open-mold-ok-1/tree/txt
890−/* src-290 %jibb /tests/golden/lex-open-mold-ok-4/source/jibb
890+/* src-290 %jibb /tests/golden/lex-open-mold-ok-2/source/jibb
891−/* tok-290 %txt /tests/golden/lex-open-mold-ok-4/tokens/txt
891+/* tok-290 %txt /tests/golden/lex-open-mold-ok-2/tokens/txt
892−/* tre-290 %txt /tests/golden/lex-open-mold-ok-4/tree/txt
892+/* tre-290 %txt /tests/golden/lex-open-mold-ok-2/tree/txt
893−/* src-291 %jibb /tests/golden/lex-open-mold-ok-5/source/jibb
893+/* src-291 %jibb /tests/golden/lex-open-mold-ok-3/source/jibb
894−/* tok-291 %txt /tests/golden/lex-open-mold-ok-5/tokens/txt
894+/* tok-291 %txt /tests/golden/lex-open-mold-ok-3/tokens/txt
895−/* tre-291 %txt /tests/golden/lex-open-mold-ok-5/tree/txt
895+/* tre-291 %txt /tests/golden/lex-open-mold-ok-3/tree/txt
896−/* src-292 %jibb /tests/golden/lex-open-mold-ok-6/source/jibb
896+/* src-292 %jibb /tests/golden/lex-open-mold-ok-4/source/jibb
897−/* tok-292 %txt /tests/golden/lex-open-mold-ok-6/tokens/txt
897+/* tok-292 %txt /tests/golden/lex-open-mold-ok-4/tokens/txt
898−/* tre-292 %txt /tests/golden/lex-open-mold-ok-6/tree/txt
898+/* tre-292 %txt /tests/golden/lex-open-mold-ok-4/tree/txt
899−/* src-293 %jibb /tests/golden/lex-pair-binding-bad-1/source/jibb
899+/* src-293 %jibb /tests/golden/lex-open-mold-ok-5/source/jibb
900−/* tok-293 %txt /tests/golden/lex-pair-binding-bad-1/tokens/txt
900+/* tok-293 %txt /tests/golden/lex-open-mold-ok-5/tokens/txt
901−/* tre-293 %txt /tests/golden/lex-pair-binding-bad-1/tree/txt
901+/* tre-293 %txt /tests/golden/lex-open-mold-ok-5/tree/txt
902−/* src-294 %jibb /tests/golden/lex-pair-binding-ok-1/source/jibb
902+/* src-294 %jibb /tests/golden/lex-open-mold-ok-6/source/jibb
903−/* tok-294 %txt /tests/golden/lex-pair-binding-ok-1/tokens/txt
903+/* tok-294 %txt /tests/golden/lex-open-mold-ok-6/tokens/txt
904−/* tre-294 %txt /tests/golden/lex-pair-binding-ok-1/tree/txt
904+/* tre-294 %txt /tests/golden/lex-open-mold-ok-6/tree/txt
905−/* src-295 %jibb /tests/golden/lex-path-bad-1/source/jibb
905+/* src-295 %jibb /tests/golden/lex-pair-binding-bad-1/source/jibb
906−/* tok-295 %txt /tests/golden/lex-path-bad-1/tokens/txt
906+/* tok-295 %txt /tests/golden/lex-pair-binding-bad-1/tokens/txt
907−/* tre-295 %txt /tests/golden/lex-path-bad-1/tree/txt
907+/* tre-295 %txt /tests/golden/lex-pair-binding-bad-1/tree/txt
908−/* src-296 %jibb /tests/golden/lex-path-ok-1/source/jibb
908+/* src-296 %jibb /tests/golden/lex-pair-binding-ok-1/source/jibb
909−/* tok-296 %txt /tests/golden/lex-path-ok-1/tokens/txt
909+/* tok-296 %txt /tests/golden/lex-pair-binding-ok-1/tokens/txt
910−/* tre-296 %txt /tests/golden/lex-path-ok-1/tree/txt
910+/* tre-296 %txt /tests/golden/lex-pair-binding-ok-1/tree/txt
911−/* src-297 %jibb /tests/golden/lex-rune-layout-bad-1/source/jibb
911+/* src-297 %jibb /tests/golden/lex-path-bad-1/source/jibb
912−/* tok-297 %txt /tests/golden/lex-rune-layout-bad-1/tokens/txt
912+/* tok-297 %txt /tests/golden/lex-path-bad-1/tokens/txt
913−/* tre-297 %txt /tests/golden/lex-rune-layout-bad-1/tree/txt
913+/* tre-297 %txt /tests/golden/lex-path-bad-1/tree/txt
914−/* src-298 %jibb /tests/golden/lex-rune-layout-bad-11/source/jibb
914+/* src-298 %jibb /tests/golden/lex-path-ok-1/source/jibb
915−/* tok-298 %txt /tests/golden/lex-rune-layout-bad-11/tokens/txt
915+/* tok-298 %txt /tests/golden/lex-path-ok-1/tokens/txt
916−/* tre-298 %txt /tests/golden/lex-rune-layout-bad-11/tree/txt
916+/* tre-298 %txt /tests/golden/lex-path-ok-1/tree/txt
917−/* src-299 %jibb /tests/golden/lex-rune-layout-bad-12/source/jibb
917+/* src-299 %jibb /tests/golden/lex-rune-layout-bad-1/source/jibb
918−/* tok-299 %txt /tests/golden/lex-rune-layout-bad-12/tokens/txt
918+/* tok-299 %txt /tests/golden/lex-rune-layout-bad-1/tokens/txt
919−/* tre-299 %txt /tests/golden/lex-rune-layout-bad-12/tree/txt
919+/* tre-299 %txt /tests/golden/lex-rune-layout-bad-1/tree/txt
920−/* src-300 %jibb /tests/golden/lex-rune-layout-bad-13/source/jibb
920+/* src-300 %jibb /tests/golden/lex-rune-layout-bad-11/source/jibb
921−/* tok-300 %txt /tests/golden/lex-rune-layout-bad-13/tokens/txt
921+/* tok-300 %txt /tests/golden/lex-rune-layout-bad-11/tokens/txt
922−/* tre-300 %txt /tests/golden/lex-rune-layout-bad-13/tree/txt
922+/* tre-300 %txt /tests/golden/lex-rune-layout-bad-11/tree/txt
923−/* src-301 %jibb /tests/golden/lex-rune-layout-bad-14/source/jibb
923+/* src-301 %jibb /tests/golden/lex-rune-layout-bad-12/source/jibb
924−/* tok-301 %txt /tests/golden/lex-rune-layout-bad-14/tokens/txt
924+/* tok-301 %txt /tests/golden/lex-rune-layout-bad-12/tokens/txt
925−/* tre-301 %txt /tests/golden/lex-rune-layout-bad-14/tree/txt
925+/* tre-301 %txt /tests/golden/lex-rune-layout-bad-12/tree/txt
926−/* src-302 %jibb /tests/golden/lex-rune-layout-bad-15/source/jibb
926+/* src-302 %jibb /tests/golden/lex-rune-layout-bad-13/source/jibb
927−/* tok-302 %txt /tests/golden/lex-rune-layout-bad-15/tokens/txt
927+/* tok-302 %txt /tests/golden/lex-rune-layout-bad-13/tokens/txt
928−/* tre-302 %txt /tests/golden/lex-rune-layout-bad-15/tree/txt
928+/* tre-302 %txt /tests/golden/lex-rune-layout-bad-13/tree/txt
929−/* src-303 %jibb /tests/golden/lex-rune-layout-bad-2/source/jibb
929+/* src-303 %jibb /tests/golden/lex-rune-layout-bad-14/source/jibb
930−/* tok-303 %txt /tests/golden/lex-rune-layout-bad-2/tokens/txt
930+/* tok-303 %txt /tests/golden/lex-rune-layout-bad-14/tokens/txt
931−/* tre-303 %txt /tests/golden/lex-rune-layout-bad-2/tree/txt
931+/* tre-303 %txt /tests/golden/lex-rune-layout-bad-14/tree/txt
932−/* src-304 %jibb /tests/golden/lex-rune-layout-bad-3/source/jibb
932+/* src-304 %jibb /tests/golden/lex-rune-layout-bad-15/source/jibb
933−/* tok-304 %txt /tests/golden/lex-rune-layout-bad-3/tokens/txt
933+/* tok-304 %txt /tests/golden/lex-rune-layout-bad-15/tokens/txt
934−/* tre-304 %txt /tests/golden/lex-rune-layout-bad-3/tree/txt
934+/* tre-304 %txt /tests/golden/lex-rune-layout-bad-15/tree/txt
935−/* src-305 %jibb /tests/golden/lex-rune-layout-bad-4/source/jibb
935+/* src-305 %jibb /tests/golden/lex-rune-layout-bad-2/source/jibb
936−/* tok-305 %txt /tests/golden/lex-rune-layout-bad-4/tokens/txt
936+/* tok-305 %txt /tests/golden/lex-rune-layout-bad-2/tokens/txt
937−/* tre-305 %txt /tests/golden/lex-rune-layout-bad-4/tree/txt
937+/* tre-305 %txt /tests/golden/lex-rune-layout-bad-2/tree/txt
938−/* src-306 %jibb /tests/golden/lex-rune-layout-bad-5/source/jibb
938+/* src-306 %jibb /tests/golden/lex-rune-layout-bad-3/source/jibb
939−/* tok-306 %txt /tests/golden/lex-rune-layout-bad-5/tokens/txt
939+/* tok-306 %txt /tests/golden/lex-rune-layout-bad-3/tokens/txt
940−/* tre-306 %txt /tests/golden/lex-rune-layout-bad-5/tree/txt
940+/* tre-306 %txt /tests/golden/lex-rune-layout-bad-3/tree/txt
941−/* src-307 %jibb /tests/golden/lex-rune-layout-bad-6/source/jibb
941+/* src-307 %jibb /tests/golden/lex-rune-layout-bad-4/source/jibb
942−/* tok-307 %txt /tests/golden/lex-rune-layout-bad-6/tokens/txt
942+/* tok-307 %txt /tests/golden/lex-rune-layout-bad-4/tokens/txt
943−/* tre-307 %txt /tests/golden/lex-rune-layout-bad-6/tree/txt
943+/* tre-307 %txt /tests/golden/lex-rune-layout-bad-4/tree/txt
944−/* src-308 %jibb /tests/golden/lex-rune-layout-bad-7/source/jibb
944+/* src-308 %jibb /tests/golden/lex-rune-layout-bad-5/source/jibb
945−/* tok-308 %txt /tests/golden/lex-rune-layout-bad-7/tokens/txt
945+/* tok-308 %txt /tests/golden/lex-rune-layout-bad-5/tokens/txt
946−/* tre-308 %txt /tests/golden/lex-rune-layout-bad-7/tree/txt
946+/* tre-308 %txt /tests/golden/lex-rune-layout-bad-5/tree/txt
947−/* src-309 %jibb /tests/golden/lex-rune-layout-bad-8/source/jibb
947+/* src-309 %jibb /tests/golden/lex-rune-layout-bad-6/source/jibb
948−/* tok-309 %txt /tests/golden/lex-rune-layout-bad-8/tokens/txt
948+/* tok-309 %txt /tests/golden/lex-rune-layout-bad-6/tokens/txt
949−/* tre-309 %txt /tests/golden/lex-rune-layout-bad-8/tree/txt
949+/* tre-309 %txt /tests/golden/lex-rune-layout-bad-6/tree/txt
950−/* src-310 %jibb /tests/golden/lex-rune-layout-bad-9/source/jibb
950+/* src-310 %jibb /tests/golden/lex-rune-layout-bad-7/source/jibb
951−/* tok-310 %txt /tests/golden/lex-rune-layout-bad-9/tokens/txt
951+/* tok-310 %txt /tests/golden/lex-rune-layout-bad-7/tokens/txt
952−/* tre-310 %txt /tests/golden/lex-rune-layout-bad-9/tree/txt
952+/* tre-310 %txt /tests/golden/lex-rune-layout-bad-7/tree/txt
953−/* src-311 %jibb /tests/golden/lex-rune-layout-ok-1/source/jibb
953+/* src-311 %jibb /tests/golden/lex-rune-layout-bad-8/source/jibb
954−/* tok-311 %txt /tests/golden/lex-rune-layout-ok-1/tokens/txt
954+/* tok-311 %txt /tests/golden/lex-rune-layout-bad-8/tokens/txt
955−/* tre-311 %txt /tests/golden/lex-rune-layout-ok-1/tree/txt
955+/* tre-311 %txt /tests/golden/lex-rune-layout-bad-8/tree/txt
956−/* src-312 %jibb /tests/golden/lex-rune-layout-ok-2/source/jibb
956+/* src-312 %jibb /tests/golden/lex-rune-layout-bad-9/source/jibb
957−/* tok-312 %txt /tests/golden/lex-rune-layout-ok-2/tokens/txt
957+/* tok-312 %txt /tests/golden/lex-rune-layout-bad-9/tokens/txt
958−/* tre-312 %txt /tests/golden/lex-rune-layout-ok-2/tree/txt
958+/* tre-312 %txt /tests/golden/lex-rune-layout-bad-9/tree/txt
959−/* src-313 %jibb /tests/golden/lex-ship-bad-1/source/jibb
959+/* src-313 %jibb /tests/golden/lex-rune-layout-ok-1/source/jibb
960−/* tok-313 %txt /tests/golden/lex-ship-bad-1/tokens/txt
960+/* tok-313 %txt /tests/golden/lex-rune-layout-ok-1/tokens/txt
961−/* tre-313 %txt /tests/golden/lex-ship-bad-1/tree/txt
961+/* tre-313 %txt /tests/golden/lex-rune-layout-ok-1/tree/txt
962−/* src-314 %jibb /tests/golden/lex-ship-ok-1/source/jibb
962+/* src-314 %jibb /tests/golden/lex-rune-layout-ok-2/source/jibb
963−/* tok-314 %txt /tests/golden/lex-ship-ok-1/tokens/txt
963+/* tok-314 %txt /tests/golden/lex-rune-layout-ok-2/tokens/txt
964−/* tre-314 %txt /tests/golden/lex-ship-ok-1/tree/txt
964+/* tre-314 %txt /tests/golden/lex-rune-layout-ok-2/tree/txt
965−/* src-315 %jibb /tests/golden/lex-spacing-bad-1/source/jibb
965+/* src-315 %jibb /tests/golden/lex-ship-bad-1/source/jibb
966−/* tok-315 %txt /tests/golden/lex-spacing-bad-1/tokens/txt
966+/* tok-315 %txt /tests/golden/lex-ship-bad-1/tokens/txt
967−/* tre-315 %txt /tests/golden/lex-spacing-bad-1/tree/txt
967+/* tre-315 %txt /tests/golden/lex-ship-bad-1/tree/txt
968−/* src-316 %jibb /tests/golden/lex-spacing-bad-2/source/jibb
968+/* src-316 %jibb /tests/golden/lex-ship-ok-1/source/jibb
969−/* tok-316 %txt /tests/golden/lex-spacing-bad-2/tokens/txt
969+/* tok-316 %txt /tests/golden/lex-ship-ok-1/tokens/txt
970−/* tre-316 %txt /tests/golden/lex-spacing-bad-2/tree/txt
970+/* tre-316 %txt /tests/golden/lex-ship-ok-1/tree/txt
971−/* src-317 %jibb /tests/golden/lex-spacing-ok-1/source/jibb
971+/* src-317 %jibb /tests/golden/lex-spacing-bad-1/source/jibb
972−/* tok-317 %txt /tests/golden/lex-spacing-ok-1/tokens/txt
972+/* tok-317 %txt /tests/golden/lex-spacing-bad-1/tokens/txt
973−/* tre-317 %txt /tests/golden/lex-spacing-ok-1/tree/txt
973+/* tre-317 %txt /tests/golden/lex-spacing-bad-1/tree/txt
974−/* src-318 %jibb /tests/golden/lex-spacing-ok-2/source/jibb
974+/* src-318 %jibb /tests/golden/lex-spacing-bad-2/source/jibb
975−/* tok-318 %txt /tests/golden/lex-spacing-ok-2/tokens/txt
975+/* tok-318 %txt /tests/golden/lex-spacing-bad-2/tokens/txt
976−/* tre-318 %txt /tests/golden/lex-spacing-ok-2/tree/txt
976+/* tre-318 %txt /tests/golden/lex-spacing-bad-2/tree/txt
977−/* src-319 %jibb /tests/golden/lex-spacing-ok-3/source/jibb
977+/* src-319 %jibb /tests/golden/lex-spacing-ok-1/source/jibb
978−/* tok-319 %txt /tests/golden/lex-spacing-ok-3/tokens/txt
978+/* tok-319 %txt /tests/golden/lex-spacing-ok-1/tokens/txt
979−/* tre-319 %txt /tests/golden/lex-spacing-ok-3/tree/txt
979+/* tre-319 %txt /tests/golden/lex-spacing-ok-1/tree/txt
980−/* src-320 %jibb /tests/golden/lex-string-bad-1/source/jibb
980+/* src-320 %jibb /tests/golden/lex-spacing-ok-2/source/jibb
981−/* tok-320 %txt /tests/golden/lex-string-bad-1/tokens/txt
981+/* tok-320 %txt /tests/golden/lex-spacing-ok-2/tokens/txt
982−/* tre-320 %txt /tests/golden/lex-string-bad-1/tree/txt
982+/* tre-320 %txt /tests/golden/lex-spacing-ok-2/tree/txt
983−/* src-321 %jibb /tests/golden/lex-string-bad-2/source/jibb
983+/* src-321 %jibb /tests/golden/lex-spacing-ok-3/source/jibb
984−/* tok-321 %txt /tests/golden/lex-string-bad-2/tokens/txt
984+/* tok-321 %txt /tests/golden/lex-spacing-ok-3/tokens/txt
985−/* tre-321 %txt /tests/golden/lex-string-bad-2/tree/txt
985+/* tre-321 %txt /tests/golden/lex-spacing-ok-3/tree/txt
986−/* src-322 %jibb /tests/golden/lex-string-ok-1/source/jibb
986+/* src-322 %jibb /tests/golden/lex-string-bad-1/source/jibb
987−/* tok-322 %txt /tests/golden/lex-string-ok-1/tokens/txt
987+/* tok-322 %txt /tests/golden/lex-string-bad-1/tokens/txt
988−/* tre-322 %txt /tests/golden/lex-string-ok-1/tree/txt
988+/* tre-322 %txt /tests/golden/lex-string-bad-1/tree/txt
989−/* src-323 %jibb /tests/golden/lex-term-bad-1/source/jibb
989+/* src-323 %jibb /tests/golden/lex-string-bad-2/source/jibb
990−/* tok-323 %txt /tests/golden/lex-term-bad-1/tokens/txt
990+/* tok-323 %txt /tests/golden/lex-string-bad-2/tokens/txt
991−/* tre-323 %txt /tests/golden/lex-term-bad-1/tree/txt
991+/* tre-323 %txt /tests/golden/lex-string-bad-2/tree/txt
992−/* src-324 %jibb /tests/golden/lex-term-bad-10/source/jibb
992+/* src-324 %jibb /tests/golden/lex-string-ok-1/source/jibb
993−/* tok-324 %txt /tests/golden/lex-term-bad-10/tokens/txt
993+/* tok-324 %txt /tests/golden/lex-string-ok-1/tokens/txt
994−/* tre-324 %txt /tests/golden/lex-term-bad-10/tree/txt
994+/* tre-324 %txt /tests/golden/lex-string-ok-1/tree/txt
995−/* src-325 %jibb /tests/golden/lex-term-bad-11/source/jibb
995+/* src-325 %jibb /tests/golden/lex-term-bad-1/source/jibb
996−/* tok-325 %txt /tests/golden/lex-term-bad-11/tokens/txt
996+/* tok-325 %txt /tests/golden/lex-term-bad-1/tokens/txt
997−/* tre-325 %txt /tests/golden/lex-term-bad-11/tree/txt
997+/* tre-325 %txt /tests/golden/lex-term-bad-1/tree/txt
998−/* src-326 %jibb /tests/golden/lex-term-bad-12/source/jibb
998+/* src-326 %jibb /tests/golden/lex-term-bad-10/source/jibb
999−/* tok-326 %txt /tests/golden/lex-term-bad-12/tokens/txt
999+/* tok-326 %txt /tests/golden/lex-term-bad-10/tokens/txt
1000−/* tre-326 %txt /tests/golden/lex-term-bad-12/tree/txt
1000+/* tre-326 %txt /tests/golden/lex-term-bad-10/tree/txt
1001−/* src-327 %jibb /tests/golden/lex-term-bad-13/source/jibb
1001+/* src-327 %jibb /tests/golden/lex-term-bad-11/source/jibb
1002−/* tok-327 %txt /tests/golden/lex-term-bad-13/tokens/txt
1002+/* tok-327 %txt /tests/golden/lex-term-bad-11/tokens/txt
1003−/* tre-327 %txt /tests/golden/lex-term-bad-13/tree/txt
1003+/* tre-327 %txt /tests/golden/lex-term-bad-11/tree/txt
1004−/* src-328 %jibb /tests/golden/lex-term-bad-14/source/jibb
1004+/* src-328 %jibb /tests/golden/lex-term-bad-12/source/jibb
1005−/* tok-328 %txt /tests/golden/lex-term-bad-14/tokens/txt
1005+/* tok-328 %txt /tests/golden/lex-term-bad-12/tokens/txt
1006−/* tre-328 %txt /tests/golden/lex-term-bad-14/tree/txt
1006+/* tre-328 %txt /tests/golden/lex-term-bad-12/tree/txt
1007−/* src-329 %jibb /tests/golden/lex-term-bad-15/source/jibb
1007+/* src-329 %jibb /tests/golden/lex-term-bad-13/source/jibb
1008−/* tok-329 %txt /tests/golden/lex-term-bad-15/tokens/txt
1008+/* tok-329 %txt /tests/golden/lex-term-bad-13/tokens/txt
1009−/* tre-329 %txt /tests/golden/lex-term-bad-15/tree/txt
1009+/* tre-329 %txt /tests/golden/lex-term-bad-13/tree/txt
1010−/* src-330 %jibb /tests/golden/lex-term-bad-2/source/jibb
1010+/* src-330 %jibb /tests/golden/lex-term-bad-14/source/jibb
1011−/* tok-330 %txt /tests/golden/lex-term-bad-2/tokens/txt
1011+/* tok-330 %txt /tests/golden/lex-term-bad-14/tokens/txt
1012−/* tre-330 %txt /tests/golden/lex-term-bad-2/tree/txt
1012+/* tre-330 %txt /tests/golden/lex-term-bad-14/tree/txt
1013−/* src-331 %jibb /tests/golden/lex-term-bad-3/source/jibb
1013+/* src-331 %jibb /tests/golden/lex-term-bad-15/source/jibb
1014−/* tok-331 %txt /tests/golden/lex-term-bad-3/tokens/txt
1014+/* tok-331 %txt /tests/golden/lex-term-bad-15/tokens/txt
1015−/* tre-331 %txt /tests/golden/lex-term-bad-3/tree/txt
1015+/* tre-331 %txt /tests/golden/lex-term-bad-15/tree/txt
1016−/* src-332 %jibb /tests/golden/lex-term-bad-4/source/jibb
1016+/* src-332 %jibb /tests/golden/lex-term-bad-2/source/jibb
1017−/* tok-332 %txt /tests/golden/lex-term-bad-4/tokens/txt
1017+/* tok-332 %txt /tests/golden/lex-term-bad-2/tokens/txt
1018−/* tre-332 %txt /tests/golden/lex-term-bad-4/tree/txt
1018+/* tre-332 %txt /tests/golden/lex-term-bad-2/tree/txt
1019−/* src-333 %jibb /tests/golden/lex-term-bad-5/source/jibb
1019+/* src-333 %jibb /tests/golden/lex-term-bad-3/source/jibb
1020−/* tok-333 %txt /tests/golden/lex-term-bad-5/tokens/txt
1020+/* tok-333 %txt /tests/golden/lex-term-bad-3/tokens/txt
1021−/* tre-333 %txt /tests/golden/lex-term-bad-5/tree/txt
1021+/* tre-333 %txt /tests/golden/lex-term-bad-3/tree/txt
1022−/* src-334 %jibb /tests/golden/lex-term-bad-6/source/jibb
1022+/* src-334 %jibb /tests/golden/lex-term-bad-4/source/jibb
1023−/* tok-334 %txt /tests/golden/lex-term-bad-6/tokens/txt
1023+/* tok-334 %txt /tests/golden/lex-term-bad-4/tokens/txt
1024−/* tre-334 %txt /tests/golden/lex-term-bad-6/tree/txt
1024+/* tre-334 %txt /tests/golden/lex-term-bad-4/tree/txt
1025−/* src-335 %jibb /tests/golden/lex-term-bad-7/source/jibb
1025+/* src-335 %jibb /tests/golden/lex-term-bad-5/source/jibb
1026−/* tok-335 %txt /tests/golden/lex-term-bad-7/tokens/txt
1026+/* tok-335 %txt /tests/golden/lex-term-bad-5/tokens/txt
1027−/* tre-335 %txt /tests/golden/lex-term-bad-7/tree/txt
1027+/* tre-335 %txt /tests/golden/lex-term-bad-5/tree/txt
1028−/* src-336 %jibb /tests/golden/lex-term-bad-8/source/jibb
1028+/* src-336 %jibb /tests/golden/lex-term-bad-6/source/jibb
1029−/* tok-336 %txt /tests/golden/lex-term-bad-8/tokens/txt
1029+/* tok-336 %txt /tests/golden/lex-term-bad-6/tokens/txt
1030−/* tre-336 %txt /tests/golden/lex-term-bad-8/tree/txt
1030+/* tre-336 %txt /tests/golden/lex-term-bad-6/tree/txt
1031−/* src-337 %jibb /tests/golden/lex-term-bad-9/source/jibb
1031+/* src-337 %jibb /tests/golden/lex-term-bad-7/source/jibb
1032−/* tok-337 %txt /tests/golden/lex-term-bad-9/tokens/txt
1032+/* tok-337 %txt /tests/golden/lex-term-bad-7/tokens/txt
1033−/* tre-337 %txt /tests/golden/lex-term-bad-9/tree/txt
1033+/* tre-337 %txt /tests/golden/lex-term-bad-7/tree/txt
1034−/* src-338 %jibb /tests/golden/lex-term-ok-1/source/jibb
1034+/* src-338 %jibb /tests/golden/lex-term-bad-8/source/jibb
1035−/* tok-338 %txt /tests/golden/lex-term-ok-1/tokens/txt
1035+/* tok-338 %txt /tests/golden/lex-term-bad-8/tokens/txt
1036−/* tre-338 %txt /tests/golden/lex-term-ok-1/tree/txt
1036+/* tre-338 %txt /tests/golden/lex-term-bad-8/tree/txt
1037−/* src-339 %jibb /tests/golden/lex-tight-change-bad-1/source/jibb
1037+/* src-339 %jibb /tests/golden/lex-term-bad-9/source/jibb
1038−/* tok-339 %txt /tests/golden/lex-tight-change-bad-1/tokens/txt
1038+/* tok-339 %txt /tests/golden/lex-term-bad-9/tokens/txt
1039−/* tre-339 %txt /tests/golden/lex-tight-change-bad-1/tree/txt
1039+/* tre-339 %txt /tests/golden/lex-term-bad-9/tree/txt
1040−/* src-340 %jibb /tests/golden/lex-tight-change-bad-2/source/jibb
1040+/* src-340 %jibb /tests/golden/lex-term-ok-1/source/jibb
1041−/* tok-340 %txt /tests/golden/lex-tight-change-bad-2/tokens/txt
1041+/* tok-340 %txt /tests/golden/lex-term-ok-1/tokens/txt
1042−/* tre-340 %txt /tests/golden/lex-tight-change-bad-2/tree/txt
1042+/* tre-340 %txt /tests/golden/lex-term-ok-1/tree/txt
1043−/* src-341 %jibb /tests/golden/lex-tight-change-bad-3/source/jibb
1043+/* src-341 %jibb /tests/golden/lex-tight-change-bad-1/source/jibb
1044−/* tok-341 %txt /tests/golden/lex-tight-change-bad-3/tokens/txt
1044+/* tok-341 %txt /tests/golden/lex-tight-change-bad-1/tokens/txt
1045−/* tre-341 %txt /tests/golden/lex-tight-change-bad-3/tree/txt
1045+/* tre-341 %txt /tests/golden/lex-tight-change-bad-1/tree/txt
1046−/* src-342 %jibb /tests/golden/lex-tight-change-bad-4/source/jibb
1046+/* src-342 %jibb /tests/golden/lex-tight-change-bad-2/source/jibb
1047−/* tok-342 %txt /tests/golden/lex-tight-change-bad-4/tokens/txt
1047+/* tok-342 %txt /tests/golden/lex-tight-change-bad-2/tokens/txt
1048−/* tre-342 %txt /tests/golden/lex-tight-change-bad-4/tree/txt
1048+/* tre-342 %txt /tests/golden/lex-tight-change-bad-2/tree/txt
1049−/* src-343 %jibb /tests/golden/lex-tight-change-bad-5/source/jibb
1049+/* src-343 %jibb /tests/golden/lex-tight-change-bad-3/source/jibb
1050−/* tok-343 %txt /tests/golden/lex-tight-change-bad-5/tokens/txt
1050+/* tok-343 %txt /tests/golden/lex-tight-change-bad-3/tokens/txt
1051−/* tre-343 %txt /tests/golden/lex-tight-change-bad-5/tree/txt
1051+/* tre-343 %txt /tests/golden/lex-tight-change-bad-3/tree/txt
1052−/* src-344 %jibb /tests/golden/lex-tight-change-bad-6/source/jibb
1052+/* src-344 %jibb /tests/golden/lex-tight-change-bad-4/source/jibb
1053−/* tok-344 %txt /tests/golden/lex-tight-change-bad-6/tokens/txt
1053+/* tok-344 %txt /tests/golden/lex-tight-change-bad-4/tokens/txt
1054−/* tre-344 %txt /tests/golden/lex-tight-change-bad-6/tree/txt
1054+/* tre-344 %txt /tests/golden/lex-tight-change-bad-4/tree/txt
1055−/* src-345 %jibb /tests/golden/lex-tight-change-bad-7/source/jibb
1055+/* src-345 %jibb /tests/golden/lex-tight-change-bad-5/source/jibb
1056−/* tok-345 %txt /tests/golden/lex-tight-change-bad-7/tokens/txt
1056+/* tok-345 %txt /tests/golden/lex-tight-change-bad-5/tokens/txt
1057−/* tre-345 %txt /tests/golden/lex-tight-change-bad-7/tree/txt
1057+/* tre-345 %txt /tests/golden/lex-tight-change-bad-5/tree/txt
1058−/* src-346 %jibb /tests/golden/lex-tight-change-bad-8/source/jibb
1058+/* src-346 %jibb /tests/golden/lex-tight-change-bad-6/source/jibb
1059−/* tok-346 %txt /tests/golden/lex-tight-change-bad-8/tokens/txt
1059+/* tok-346 %txt /tests/golden/lex-tight-change-bad-6/tokens/txt
1060−/* tre-346 %txt /tests/golden/lex-tight-change-bad-8/tree/txt
1060+/* tre-346 %txt /tests/golden/lex-tight-change-bad-6/tree/txt
1061−/* src-347 %jibb /tests/golden/lex-tight-change-bad-9/source/jibb
1061+/* src-347 %jibb /tests/golden/lex-tight-change-bad-7/source/jibb
1062−/* tok-347 %txt /tests/golden/lex-tight-change-bad-9/tokens/txt
1062+/* tok-347 %txt /tests/golden/lex-tight-change-bad-7/tokens/txt
1063−/* tre-347 %txt /tests/golden/lex-tight-change-bad-9/tree/txt
1063+/* tre-347 %txt /tests/golden/lex-tight-change-bad-7/tree/txt
1064−/* src-348 %jibb /tests/golden/lex-tight-change-ok-1/source/jibb
1064+/* src-348 %jibb /tests/golden/lex-tight-change-bad-8/source/jibb
1065−/* tok-348 %txt /tests/golden/lex-tight-change-ok-1/tokens/txt
1065+/* tok-348 %txt /tests/golden/lex-tight-change-bad-8/tokens/txt
1066−/* tre-348 %txt /tests/golden/lex-tight-change-ok-1/tree/txt
1066+/* tre-348 %txt /tests/golden/lex-tight-change-bad-8/tree/txt
1067−/* src-349 %jibb /tests/golden/lex-tight-ctor-bad-1/source/jibb
1067+/* src-349 %jibb /tests/golden/lex-tight-change-bad-9/source/jibb
1068−/* tok-349 %txt /tests/golden/lex-tight-ctor-bad-1/tokens/txt
1068+/* tok-349 %txt /tests/golden/lex-tight-change-bad-9/tokens/txt
1069−/* tre-349 %txt /tests/golden/lex-tight-ctor-bad-1/tree/txt
1069+/* tre-349 %txt /tests/golden/lex-tight-change-bad-9/tree/txt
1070−/* src-350 %jibb /tests/golden/lex-tight-ctor-bad-2/source/jibb
1070+/* src-350 %jibb /tests/golden/lex-tight-change-ok-1/source/jibb
1071−/* tok-350 %txt /tests/golden/lex-tight-ctor-bad-2/tokens/txt
1071+/* tok-350 %txt /tests/golden/lex-tight-change-ok-1/tokens/txt
1072−/* tre-350 %txt /tests/golden/lex-tight-ctor-bad-2/tree/txt
1072+/* tre-350 %txt /tests/golden/lex-tight-change-ok-1/tree/txt
1073−/* src-351 %jibb /tests/golden/lex-tight-ctor-ok-1/source/jibb
1073+/* src-351 %jibb /tests/golden/lex-tight-ctor-bad-1/source/jibb
1074−/* tok-351 %txt /tests/golden/lex-tight-ctor-ok-1/tokens/txt
1074+/* tok-351 %txt /tests/golden/lex-tight-ctor-bad-1/tokens/txt
1075−/* tre-351 %txt /tests/golden/lex-tight-ctor-ok-1/tree/txt
1075+/* tre-351 %txt /tests/golden/lex-tight-ctor-bad-1/tree/txt
1076−/* src-352 %jibb /tests/golden/lex-tight-opener-bad-1/source/jibb
1076+/* src-352 %jibb /tests/golden/lex-tight-ctor-bad-2/source/jibb
1077−/* tok-352 %txt /tests/golden/lex-tight-opener-bad-1/tokens/txt
1077+/* tok-352 %txt /tests/golden/lex-tight-ctor-bad-2/tokens/txt
1078−/* tre-352 %txt /tests/golden/lex-tight-opener-bad-1/tree/txt
1078+/* tre-352 %txt /tests/golden/lex-tight-ctor-bad-2/tree/txt
1079−/* src-353 %jibb /tests/golden/lex-tight-opener-bad-2/source/jibb
1079+/* src-353 %jibb /tests/golden/lex-tight-ctor-ok-1/source/jibb
1080−/* tok-353 %txt /tests/golden/lex-tight-opener-bad-2/tokens/txt
1080+/* tok-353 %txt /tests/golden/lex-tight-ctor-ok-1/tokens/txt
1081−/* tre-353 %txt /tests/golden/lex-tight-opener-bad-2/tree/txt
1081+/* tre-353 %txt /tests/golden/lex-tight-ctor-ok-1/tree/txt
1082−/* src-354 %jibb /tests/golden/lex-tight-opener-bad-3/source/jibb
1082+/* src-354 %jibb /tests/golden/lex-tight-opener-bad-1/source/jibb
1083−/* tok-354 %txt /tests/golden/lex-tight-opener-bad-3/tokens/txt
1083+/* tok-354 %txt /tests/golden/lex-tight-opener-bad-1/tokens/txt
1084−/* tre-354 %txt /tests/golden/lex-tight-opener-bad-3/tree/txt
1084+/* tre-354 %txt /tests/golden/lex-tight-opener-bad-1/tree/txt
1085−/* src-355 %jibb /tests/golden/lex-tight-opener-bad-4/source/jibb
1085+/* src-355 %jibb /tests/golden/lex-tight-opener-bad-2/source/jibb
1086−/* tok-355 %txt /tests/golden/lex-tight-opener-bad-4/tokens/txt
1086+/* tok-355 %txt /tests/golden/lex-tight-opener-bad-2/tokens/txt
1087−/* tre-355 %txt /tests/golden/lex-tight-opener-bad-4/tree/txt
1087+/* tre-355 %txt /tests/golden/lex-tight-opener-bad-2/tree/txt
1088−/* src-356 %jibb /tests/golden/lex-tight-opener-ok-1/source/jibb
1088+/* src-356 %jibb /tests/golden/lex-tight-opener-bad-3/source/jibb
1089−/* tok-356 %txt /tests/golden/lex-tight-opener-ok-1/tokens/txt
1089+/* tok-356 %txt /tests/golden/lex-tight-opener-bad-3/tokens/txt
1090−/* tre-356 %txt /tests/golden/lex-tight-opener-ok-1/tree/txt
1090+/* tre-356 %txt /tests/golden/lex-tight-opener-bad-3/tree/txt
1091−/* src-357 %jibb /tests/golden/lex-tight-pair-bad-1/source/jibb
1091+/* src-357 %jibb /tests/golden/lex-tight-opener-bad-4/source/jibb
1092−/* tok-357 %txt /tests/golden/lex-tight-pair-bad-1/tokens/txt
1092+/* tok-357 %txt /tests/golden/lex-tight-opener-bad-4/tokens/txt
1093−/* tre-357 %txt /tests/golden/lex-tight-pair-bad-1/tree/txt
1093+/* tre-357 %txt /tests/golden/lex-tight-opener-bad-4/tree/txt
1094−/* src-358 %jibb /tests/golden/lex-tight-pair-bad-2/source/jibb
1094+/* src-358 %jibb /tests/golden/lex-tight-opener-ok-1/source/jibb
1095−/* tok-358 %txt /tests/golden/lex-tight-pair-bad-2/tokens/txt
1095+/* tok-358 %txt /tests/golden/lex-tight-opener-ok-1/tokens/txt
1096−/* tre-358 %txt /tests/golden/lex-tight-pair-bad-2/tree/txt
1096+/* tre-358 %txt /tests/golden/lex-tight-opener-ok-1/tree/txt
1097−/* src-359 %jibb /tests/golden/lex-tight-pair-bad-3/source/jibb
1097+/* src-359 %jibb /tests/golden/lex-tight-pair-bad-1/source/jibb
1098−/* tok-359 %txt /tests/golden/lex-tight-pair-bad-3/tokens/txt
1098+/* tok-359 %txt /tests/golden/lex-tight-pair-bad-1/tokens/txt
1099−/* tre-359 %txt /tests/golden/lex-tight-pair-bad-3/tree/txt
1099+/* tre-359 %txt /tests/golden/lex-tight-pair-bad-1/tree/txt
1100−/* src-360 %jibb /tests/golden/lex-tight-pair-ok-1/source/jibb
1100+/* src-360 %jibb /tests/golden/lex-tight-pair-bad-2/source/jibb
1101−/* tok-360 %txt /tests/golden/lex-tight-pair-ok-1/tokens/txt
1101+/* tok-360 %txt /tests/golden/lex-tight-pair-bad-2/tokens/txt
1102−/* tre-360 %txt /tests/golden/lex-tight-pair-ok-1/tree/txt
1102+/* tre-360 %txt /tests/golden/lex-tight-pair-bad-2/tree/txt
1103−/* src-361 %jibb /tests/golden/lex-tight-qath-bad-1/source/jibb
1103+/* src-361 %jibb /tests/golden/lex-tight-pair-bad-3/source/jibb
1104−/* tok-361 %txt /tests/golden/lex-tight-qath-bad-1/tokens/txt
1104+/* tok-361 %txt /tests/golden/lex-tight-pair-bad-3/tokens/txt
1105−/* tre-361 %txt /tests/golden/lex-tight-qath-bad-1/tree/txt
1105+/* tre-361 %txt /tests/golden/lex-tight-pair-bad-3/tree/txt
1106−/* src-362 %jibb /tests/golden/lex-tight-qath-bad-2/source/jibb
1106+/* src-362 %jibb /tests/golden/lex-tight-pair-ok-1/source/jibb
1107−/* tok-362 %txt /tests/golden/lex-tight-qath-bad-2/tokens/txt
1107+/* tok-362 %txt /tests/golden/lex-tight-pair-ok-1/tokens/txt
1108−/* tre-362 %txt /tests/golden/lex-tight-qath-bad-2/tree/txt
1108+/* tre-362 %txt /tests/golden/lex-tight-pair-ok-1/tree/txt
1109−/* src-363 %jibb /tests/golden/lex-tight-qath-bad-3/source/jibb
1109+/* src-363 %jibb /tests/golden/lex-tight-qath-bad-1/source/jibb
1110−/* tok-363 %txt /tests/golden/lex-tight-qath-bad-3/tokens/txt
1110+/* tok-363 %txt /tests/golden/lex-tight-qath-bad-1/tokens/txt
1111−/* tre-363 %txt /tests/golden/lex-tight-qath-bad-3/tree/txt
1111+/* tre-363 %txt /tests/golden/lex-tight-qath-bad-1/tree/txt
1112−/* src-364 %jibb /tests/golden/lex-tight-qath-ok-1/source/jibb
1112+/* src-364 %jibb /tests/golden/lex-tight-qath-bad-2/source/jibb
1113−/* tok-364 %txt /tests/golden/lex-tight-qath-ok-1/tokens/txt
1113+/* tok-364 %txt /tests/golden/lex-tight-qath-bad-2/tokens/txt
1114−/* tre-364 %txt /tests/golden/lex-tight-qath-ok-1/tree/txt
1114+/* tre-364 %txt /tests/golden/lex-tight-qath-bad-2/tree/txt
1115−/* src-365 %jibb /tests/golden/lex-tight-unit-bad-1/source/jibb
1115+/* src-365 %jibb /tests/golden/lex-tight-qath-bad-3/source/jibb
1116−/* tok-365 %txt /tests/golden/lex-tight-unit-bad-1/tokens/txt
1116+/* tok-365 %txt /tests/golden/lex-tight-qath-bad-3/tokens/txt
1117−/* tre-365 %txt /tests/golden/lex-tight-unit-bad-1/tree/txt
1117+/* tre-365 %txt /tests/golden/lex-tight-qath-bad-3/tree/txt
1118−/* src-366 %jibb /tests/golden/lex-tight-unit-ok-1/source/jibb
1118+/* src-366 %jibb /tests/golden/lex-tight-qath-ok-1/source/jibb
1119−/* tok-366 %txt /tests/golden/lex-tight-unit-ok-1/tokens/txt
1119+/* tok-366 %txt /tests/golden/lex-tight-qath-ok-1/tokens/txt
1120−/* tre-366 %txt /tests/golden/lex-tight-unit-ok-1/tree/txt
1120+/* tre-366 %txt /tests/golden/lex-tight-qath-ok-1/tree/txt
1121−/* src-367 %jibb /tests/golden/lex-tight-wing-bad-1/source/jibb
1121+/* src-367 %jibb /tests/golden/lex-tight-unit-bad-1/source/jibb
1122−/* tok-367 %txt /tests/golden/lex-tight-wing-bad-1/tokens/txt
1122+/* tok-367 %txt /tests/golden/lex-tight-unit-bad-1/tokens/txt
1123−/* tre-367 %txt /tests/golden/lex-tight-wing-bad-1/tree/txt
1123+/* tre-367 %txt /tests/golden/lex-tight-unit-bad-1/tree/txt
1124−/* src-368 %jibb /tests/golden/lex-tight-wing-ok-1/source/jibb
1124+/* src-368 %jibb /tests/golden/lex-tight-unit-ok-1/source/jibb
1125−/* tok-368 %txt /tests/golden/lex-tight-wing-ok-1/tokens/txt
1125+/* tok-368 %txt /tests/golden/lex-tight-unit-ok-1/tokens/txt
1126−/* tre-368 %txt /tests/golden/lex-tight-wing-ok-1/tree/txt
1126+/* tre-368 %txt /tests/golden/lex-tight-unit-ok-1/tree/txt
1127+/* src-369 %jibb /tests/golden/lex-tight-wing-bad-1/source/jibb
1128+/* tok-369 %txt /tests/golden/lex-tight-wing-bad-1/tokens/txt
1129+/* tre-369 %txt /tests/golden/lex-tight-wing-bad-1/tree/txt
1130+/* src-370 %jibb /tests/golden/lex-tight-wing-ok-1/source/jibb
1131+/* tok-370 %txt /tests/golden/lex-tight-wing-ok-1/tokens/txt
1132+/* tre-370 %txt /tests/golden/lex-tight-wing-ok-1/tree/txt
1133+/* src-371 %jibb /tests/golden/prelude-core-functions/source/jibb
1134+/* tok-371 %txt /tests/golden/prelude-core-functions/tokens/txt
1135+/* tre-371 %txt /tests/golden/prelude-core-functions/tree/txt
1136+/* typ-371 %txt /tests/golden/prelude-core-functions/types/txt
1137+/* src-372 %jibb /tests/golden/types-partial-apply/source/jibb
1138+/* tok-372 %txt /tests/golden/types-partial-apply/tokens/txt
1139+/* tre-372 %txt /tests/golden/types-partial-apply/tree/txt
1140+/* typ-372 %txt /tests/golden/types-partial-apply/types/txt
1141+/* src-373 %jibb /tests/golden/types-partial-aura/source/jibb
1142+/* tok-373 %txt /tests/golden/types-partial-aura/tokens/txt
1143+/* tre-373 %txt /tests/golden/types-partial-aura/tree/txt
1144+/* typ-373 %txt /tests/golden/types-partial-aura/types/txt
1145+/* src-374 %jibb /tests/golden/types-partial-aura-generalization/source/jibb
1146+/* tok-374 %txt /tests/golden/types-partial-aura-generalization/tokens/txt
1147+/* tre-374 %txt /tests/golden/types-partial-aura-generalization/tree/txt
1148+/* typ-374 %txt /tests/golden/types-partial-aura-generalization/types/txt
1149+/* src-375 %jibb /tests/golden/types-partial-explicit-capital/source/jibb
1150+/* tok-375 %txt /tests/golden/types-partial-explicit-capital/tokens/txt
1151+/* tre-375 %txt /tests/golden/types-partial-explicit-capital/tree/txt
1152+/* typ-375 %txt /tests/golden/types-partial-explicit-capital/types/txt
1153+/* src-376 %jibb /tests/golden/types-partial-forward/source/jibb
1154+/* tok-376 %txt /tests/golden/types-partial-forward/tokens/txt
1155+/* tre-376 %txt /tests/golden/types-partial-forward/tree/txt
1156+/* typ-376 %txt /tests/golden/types-partial-forward/types/txt
1157+/* src-377 %jibb /tests/golden/types-partial-generalization/source/jibb
1158+/* tok-377 %txt /tests/golden/types-partial-generalization/tokens/txt
1159+/* tre-377 %txt /tests/golden/types-partial-generalization/tree/txt
1160+/* typ-377 %txt /tests/golden/types-partial-generalization/types/txt
1161+/* src-378 %jibb /tests/golden/types-partial-identity/source/jibb
1162+/* tok-378 %txt /tests/golden/types-partial-identity/tokens/txt
1163+/* tre-378 %txt /tests/golden/types-partial-identity/tree/txt
1164+/* typ-378 %txt /tests/golden/types-partial-identity/types/txt
1165+/* src-379 %jibb /tests/golden/types-partial-occurs/source/jibb
1166+/* tok-379 %txt /tests/golden/types-partial-occurs/tokens/txt
1167+/* tre-379 %txt /tests/golden/types-partial-occurs/tree/txt
1168+/* typ-379 %txt /tests/golden/types-partial-occurs/types/txt
1169+/* src-380 %jibb /tests/golden/types-partial-projection/source/jibb
1170+/* tok-380 %txt /tests/golden/types-partial-projection/tokens/txt
1171+/* tre-380 %txt /tests/golden/types-partial-projection/tree/txt
1172+/* typ-380 %txt /tests/golden/types-partial-projection/types/txt
1173+/* src-381 %jibb /tests/golden/types-partial-shared-tvar/source/jibb
1174+/* tok-381 %txt /tests/golden/types-partial-shared-tvar/tokens/txt
1175+/* tre-381 %txt /tests/golden/types-partial-shared-tvar/tree/txt
1176+/* typ-381 %txt /tests/golden/types-partial-shared-tvar/types/txt
1177+/* src-382 %jibb /tests/golden/types-partial-unresolved-tag/source/jibb
1178+/* tok-382 %txt /tests/golden/types-partial-unresolved-tag/tokens/txt
1179+/* tre-382 %txt /tests/golden/types-partial-unresolved-tag/tree/txt
1180+/* typ-382 %txt /tests/golden/types-partial-unresolved-tag/types/txt
1127|%
1181|%
1128:: one arm per case
1182:: one arm per case
1129::
1183::
@@ -1155,722 +1209,754 @@
1155 (check ~.doc-overview-10-todo-list src-13 `tok-13 `tre-13)
1209 (check ~.doc-overview-10-todo-list src-13 `tok-13 `tre-13)
1156++ test-doc-overview-11-index
1210++ test-doc-overview-11-index
1157 (check ~.doc-overview-11-index src-14 `tok-14 `tre-14)
1211 (check ~.doc-overview-11-index src-14 `tok-14 `tre-14)
1212+++ test-fixture-blog-api
1213+ (check-at ~.fixture-blog-api ~[~.ui ~.api ~.blog ~.jibb] src-15 `tok-15 `tre-15)
1214+++ test-fixture-blog-card
1215+ (check-at ~.fixture-blog-card ~[~.ui ~.components ~.card ~.jibb] src-16 `tok-16 `tre-16)
1158++ test-inline-base32
1216++ test-inline-base32
1159− (check ~.inline-base32 src-15 `tok-15 `tre-15)
1217+ (check ~.inline-base32 src-17 `tok-17 `tre-17)
1160++ test-inline-call
1218++ test-inline-call
1161− (check ~.inline-call src-16 `tok-16 `tre-16)
1219+ (check ~.inline-call src-18 `tok-18 `tre-18)
1162++ test-inline-cell
1220++ test-inline-cell
1163− (check ~.inline-cell src-17 `tok-17 `tre-17)
1221+ (check ~.inline-cell src-19 `tok-19 `tre-19)
1164++ test-inline-change-done
1222++ test-inline-change-done
1165− (check ~.inline-change-done src-18 `tok-18 `tre-18)
1223+ (check ~.inline-change-done src-20 `tok-20 `tre-20)
1166++ test-inline-change-draft
1224++ test-inline-change-draft
1167− (check ~.inline-change-draft src-19 `tok-19 `tre-19)
1225+ (check ~.inline-change-draft src-21 `tok-21 `tre-21)
1168++ test-inline-crash
1226++ test-inline-crash
1169− (check ~.inline-crash src-20 `tok-20 `tre-20)
1227+ (check ~.inline-crash src-22 `tok-22 `tre-22)
1170++ test-inline-crash-call
1228++ test-inline-crash-call
1171− (check ~.inline-crash-call src-21 `tok-21 `tre-21)
1229+ (check ~.inline-crash-call src-23 `tok-23 `tre-23)
1172++ test-inline-crash-operands
1230++ test-inline-crash-operands
1173− (check ~.inline-crash-operands src-22 `tok-22 `tre-22)
1231+ (check ~.inline-crash-operands src-24 `tok-24 `tre-24)
1174++ test-inline-ctor-typed
1232++ test-inline-ctor-typed
1175− (check ~.inline-ctor-typed src-23 `tok-23 `tre-23)
1233+ (check ~.inline-ctor-typed src-25 `tok-25 `tre-25)
1176++ test-inline-date
1234++ test-inline-date
1177− (check ~.inline-date src-24 `tok-24 `tre-24)
1235+ (check ~.inline-date src-26 `tok-26 `tre-26)
1178++ test-inline-decimal
1236++ test-inline-decimal
1179− (check ~.inline-decimal src-25 `tok-25 `tre-25)
1237+ (check ~.inline-decimal src-27 `tok-27 `tre-27)
1180++ test-inline-duration
1238++ test-inline-duration
1181− (check ~.inline-duration src-26 `tok-26 `tre-26)
1239+ (check ~.inline-duration src-28 `tok-28 `tre-28)
1182++ test-inline-fold-mold
1240++ test-inline-fold-mold
1183− (check ~.inline-fold-mold src-27 `tok-27 `tre-27)
1241+ (check ~.inline-fold-mold src-29 `tok-29 `tre-29)
1184++ test-inline-gate-after-definition-bad
1242++ test-inline-gate-after-definition-bad
1185− (check ~.inline-gate-after-definition-bad src-28 `tok-28 `tre-28)
1243+ (check ~.inline-gate-after-definition-bad src-30 `tok-30 `tre-30)
1186++ test-inline-gate-field-bad
1244++ test-inline-gate-field-bad
1187− (check ~.inline-gate-field-bad src-29 `tok-29 `tre-29)
1245+ (check ~.inline-gate-field-bad src-31 `tok-31 `tre-31)
1188++ test-inline-gate-mold
1246++ test-inline-gate-mold
1189− (check ~.inline-gate-mold src-30 `tok-30 `tre-30)
1247+ (check ~.inline-gate-mold src-32 `tok-32 `tre-32)
1190++ test-inline-gate-sample-binds
1248++ test-inline-gate-sample-binds
1191− (check ~.inline-gate-sample-binds src-31 `tok-31 `tre-31)
1249+ (check ~.inline-gate-sample-binds src-33 `tok-33 `tre-33)
1192++ test-inline-gate-samples
1250++ test-inline-gate-samples
1193− (check ~.inline-gate-samples src-32 `tok-32 `tre-32)
1251+ (check ~.inline-gate-samples src-34 `tok-34 `tre-34)
1194++ test-inline-gate-wide
1252++ test-inline-gate-wide
1195− (check ~.inline-gate-wide src-33 `tok-33 `tre-33)
1253+ (check ~.inline-gate-wide src-35 `tok-35 `tre-35)
1196++ test-inline-generic-apply-bad
1254++ test-inline-generic-apply-bad
1197− (check ~.inline-generic-apply-bad src-34 `tok-34 `tre-34)
1255+ (check ~.inline-generic-apply-bad src-36 `tok-36 `tre-36)
1198++ test-inline-generic-both-bad
1256++ test-inline-generic-both-bad
1199− (check ~.inline-generic-both-bad src-35 `tok-35 `tre-35)
1257+ (check ~.inline-generic-both-bad src-37 `tok-37 `tre-37)
1200++ test-inline-generic-case-bad
1258++ test-inline-generic-case-bad
1201− (check ~.inline-generic-case-bad src-36 `tok-36 `tre-36)
1259+ (check ~.inline-generic-case-bad src-38 `tok-38 `tre-38)
1202++ test-inline-generic-cast-bad
1260++ test-inline-generic-cast-bad
1203− (check ~.inline-generic-cast-bad src-37 `tok-37 `tre-37)
1261+ (check ~.inline-generic-cast-bad src-39 `tok-39 `tre-39)
1204++ test-inline-generic-empty-bad
1262++ test-inline-generic-empty-bad
1205− (check ~.inline-generic-empty-bad src-38 `tok-38 `tre-38)
1263+ (check ~.inline-generic-empty-bad src-40 `tok-40 `tre-40)
1206++ test-inline-generic-field-bad
1264++ test-inline-generic-field-bad
1207− (check ~.inline-generic-field-bad src-39 `tok-39 `tre-39)
1265+ (check ~.inline-generic-field-bad src-41 `tok-41 `tre-41)
1208++ test-inline-generic-mold
1266++ test-inline-generic-mold
1209− (check ~.inline-generic-mold src-40 `tok-40 `tre-40)
1267+ (check ~.inline-generic-mold src-42 `tok-42 `tre-42)
1210++ test-inline-generic-prefix-bad
1268++ test-inline-generic-prefix-bad
1211− (check ~.inline-generic-prefix-bad src-41 `tok-41 `tre-41)
1269+ (check ~.inline-generic-prefix-bad src-43 `tok-43 `tre-43)
1212++ test-inline-hex
1270++ test-inline-hex
1213− (check ~.inline-hex src-42 `tok-42 `tre-42)
1271+ (check ~.inline-hex src-44 `tok-44 `tre-44)
1214++ test-inline-hoon-union-apply-bad
1272++ test-inline-hoon-union-apply-bad
1215− (check ~.inline-hoon-union-apply-bad src-43 `tok-43 `tre-43)
1273+ (check ~.inline-hoon-union-apply-bad src-45 `tok-45 `tre-45)
1216++ test-inline-hoon-union-cast-bad
1274++ test-inline-hoon-union-cast-bad
1217− (check ~.inline-hoon-union-cast-bad src-44 `tok-44 `tre-44)
1275+ (check ~.inline-hoon-union-cast-bad src-46 `tok-46 `tre-46)
1218++ test-inline-hoon-union-definition-bad
1276++ test-inline-hoon-union-definition-bad
1219− (check ~.inline-hoon-union-definition-bad src-45 `tok-45 `tre-45)
1277+ (check ~.inline-hoon-union-definition-bad src-47 `tok-47 `tre-47)
1220++ test-inline-hoon-union-field-bad
1278++ test-inline-hoon-union-field-bad
1221− (check ~.inline-hoon-union-field-bad src-46 `tok-46 `tre-46)
1279+ (check ~.inline-hoon-union-field-bad src-48 `tok-48 `tre-48)
1222++ test-inline-hoon-union-gate-bad
1280++ test-inline-hoon-union-gate-bad
1223− (check ~.inline-hoon-union-gate-bad src-47 `tok-47 `tre-47)
1281+ (check ~.inline-hoon-union-gate-bad src-49 `tok-49 `tre-49)
1224++ test-inline-hoon-union-nested-sample-bad
1282++ test-inline-hoon-union-nested-sample-bad
1225− (check ~.inline-hoon-union-nested-sample-bad src-48 `tok-48 `tre-48)
1283+ (check ~.inline-hoon-union-nested-sample-bad src-50 `tok-50 `tre-50)
1226++ test-inline-hoon-union-open-apply-bad
1284++ test-inline-hoon-union-open-apply-bad
1227− (check ~.inline-hoon-union-open-apply-bad src-49 `tok-49 `tre-49)
1285+ (check ~.inline-hoon-union-open-apply-bad src-51 `tok-51 `tre-51)
1228++ test-inline-hoon-union-open-field-bad
1286++ test-inline-hoon-union-open-field-bad
1229− (check ~.inline-hoon-union-open-field-bad src-50 `tok-50 `tre-50)
1287+ (check ~.inline-hoon-union-open-field-bad src-52 `tok-52 `tre-52)
1230++ test-inline-hoon-union-sample-bad
1288++ test-inline-hoon-union-sample-bad
1231− (check ~.inline-hoon-union-sample-bad src-51 `tok-51 `tre-51)
1289+ (check ~.inline-hoon-union-sample-bad src-53 `tok-53 `tre-53)
1232++ test-inline-hoon-union-wide-sample-bad
1290++ test-inline-hoon-union-wide-sample-bad
1233− (check ~.inline-hoon-union-wide-sample-bad src-52 `tok-52 `tre-52)
1291+ (check ~.inline-hoon-union-wide-sample-bad src-54 `tok-54 `tre-54)
1234++ test-inline-import-mark-face-bad
1292++ test-inline-import-mark-face-bad
1235− (check ~.inline-import-mark-face-bad src-53 `tok-53 `tre-53)
1293+ (check ~.inline-import-mark-face-bad src-55 `tok-55 `tre-55)
1236++ test-inline-import-root-bad
1294++ test-inline-import-root-bad
1237− (check ~.inline-import-root-bad src-54 `tok-54 `tre-54)
1295+ (check ~.inline-import-root-bad src-56 `tok-56 `tre-56)
1238++ test-inline-imports-after-definition
1296++ test-inline-imports-after-definition
1239− (check ~.inline-imports-after-definition src-55 `tok-55 `tre-55)
1297+ (check ~.inline-imports-after-definition src-57 `tok-57 `tre-57)
1240++ test-inline-island
1298++ test-inline-island
1241− (check ~.inline-island src-56 `tok-56 `tre-56)
1299+ (check ~.inline-island src-58 `tok-58 `tre-58)
1242++ test-inline-kinds
1300++ test-inline-kinds
1243− (check ~.inline-kinds src-57 `tok-57 `tre-57)
1301+ (check ~.inline-kinds src-59 `tok-59 `tre-59)
1244++ test-inline-knot
1302++ test-inline-knot
1245− (check ~.inline-knot src-58 `tok-58 `tre-58)
1303+ (check ~.inline-knot src-60 `tok-60 `tre-60)
1246++ test-inline-leftout-barcab
1304++ test-inline-leftout-barcab
1247− (check ~.inline-leftout-barcab src-59 `tok-59 `tre-59)
1305+ (check ~.inline-leftout-barcab src-61 `tok-61 `tre-61)
1248++ test-inline-leftout-barcen
1306++ test-inline-leftout-barcen
1249− (check ~.inline-leftout-barcen src-60 `tok-60 `tre-60)
1307+ (check ~.inline-leftout-barcen src-62 `tok-62 `tre-62)
1250++ test-inline-leftout-barcen-2
1308++ test-inline-leftout-barcen-2
1251− (check ~.inline-leftout-barcen-2 src-61 `tok-61 `tre-61)
1309+ (check ~.inline-leftout-barcen-2 src-63 `tok-63 `tre-63)
1252++ test-inline-leftout-barcen-3
1310++ test-inline-leftout-barcen-3
1253− (check ~.inline-leftout-barcen-3 src-62 `tok-62 `tre-62)
1311+ (check ~.inline-leftout-barcen-3 src-64 `tok-64 `tre-64)
1254++ test-inline-leftout-barhep
1312++ test-inline-leftout-barhep
1255− (check ~.inline-leftout-barhep src-63 `tok-63 `tre-63)
1313+ (check ~.inline-leftout-barhep src-65 `tok-65 `tre-65)
1256++ test-inline-leftout-bartar
1314++ test-inline-leftout-bartar
1257− (check ~.inline-leftout-bartar src-64 `tok-64 `tre-64)
1315+ (check ~.inline-leftout-bartar src-66 `tok-66 `tre-66)
1258++ test-inline-leftout-buc-alone
1316++ test-inline-leftout-buc-alone
1259− (check ~.inline-leftout-buc-alone src-65 `tok-65 `tre-65)
1317+ (check ~.inline-leftout-buc-alone src-67 `tok-67 `tre-67)
1260++ test-inline-leftout-buc-paren
1318++ test-inline-leftout-buc-paren
1261− (check ~.inline-leftout-buc-paren src-66 `tok-66 `tre-66)
1319+ (check ~.inline-leftout-buc-paren src-68 `tok-68 `tre-68)
1262++ test-inline-leftout-buc-paren-2
1320++ test-inline-leftout-buc-paren-2
1263− (check ~.inline-leftout-buc-paren-2 src-67 `tok-67 `tre-67)
1321+ (check ~.inline-leftout-buc-paren-2 src-69 `tok-69 `tre-69)
1264++ test-inline-leftout-buc-paren-3
1322++ test-inline-leftout-buc-paren-3
1265− (check ~.inline-leftout-buc-paren-3 src-68 `tok-68 `tre-68)
1323+ (check ~.inline-leftout-buc-paren-3 src-70 `tok-70 `tre-70)
1266++ test-inline-leftout-buccen
1324++ test-inline-leftout-buccen
1267− (check ~.inline-leftout-buccen src-69 `tok-69 `tre-69)
1325+ (check ~.inline-leftout-buccen src-71 `tok-71 `tre-71)
1268++ test-inline-leftout-cencol
1326++ test-inline-leftout-cencol
1269− (check ~.inline-leftout-cencol src-70 `tok-70 `tre-70)
1327+ (check ~.inline-leftout-cencol src-72 `tok-72 `tre-72)
1270++ test-inline-leftout-cenhep
1328++ test-inline-leftout-cenhep
1271− (check ~.inline-leftout-cenhep src-71 `tok-71 `tre-71)
1329+ (check ~.inline-leftout-cenhep src-73 `tok-73 `tre-73)
1272++ test-inline-leftout-centis
1330++ test-inline-leftout-centis
1273− (check ~.inline-leftout-centis src-72 `tok-72 `tre-72)
1331+ (check ~.inline-leftout-centis src-74 `tok-74 `tre-74)
1274++ test-inline-leftout-colhep
1332++ test-inline-leftout-colhep
1275− (check ~.inline-leftout-colhep src-73 `tok-73 `tre-73)
1333+ (check ~.inline-leftout-colhep src-75 `tok-75 `tre-75)
1276++ test-inline-leftout-colon-wing
1334++ test-inline-leftout-colon-wing
1277− (check ~.inline-leftout-colon-wing src-74 `tok-74 `tre-74)
1335+ (check ~.inline-leftout-colon-wing src-76 `tok-76 `tre-76)
1278++ test-inline-leftout-colsig
1336++ test-inline-leftout-colsig
1279− (check ~.inline-leftout-colsig src-75 `tok-75 `tre-75)
1337+ (check ~.inline-leftout-colsig src-77 `tok-77 `tre-77)
1280++ test-inline-leftout-coltar
1338++ test-inline-leftout-coltar
1281− (check ~.inline-leftout-coltar src-76 `tok-76 `tre-76)
1339+ (check ~.inline-leftout-coltar src-78 `tok-78 `tre-78)
1282++ test-inline-leftout-dottar
1340++ test-inline-leftout-dottar
1283− (check ~.inline-leftout-dottar src-77 `tok-77 `tre-77)
1341+ (check ~.inline-leftout-dottar src-79 `tok-79 `tre-79)
1284++ test-inline-leftout-dottis
1342++ test-inline-leftout-dottis
1285− (check ~.inline-leftout-dottis src-78 `tok-78 `tre-78)
1343+ (check ~.inline-leftout-dottis src-80 `tok-80 `tre-80)
1286++ test-inline-leftout-faslus
1344++ test-inline-leftout-faslus
1287− (check ~.inline-leftout-faslus src-79 `tok-79 `tre-79)
1345+ (check ~.inline-leftout-faslus src-81 `tok-81 `tre-81)
1288++ test-inline-leftout-hephep
1346++ test-inline-leftout-hephep
1289− (check ~.inline-leftout-hephep src-80 `tok-80 `tre-80)
1347+ (check ~.inline-leftout-hephep src-82 `tok-82 `tre-82)
1290++ test-inline-leftout-kethep-wide
1348++ test-inline-leftout-kethep-wide
1291− (check ~.inline-leftout-kethep-wide src-81 `tok-81 `tre-81)
1349+ (check ~.inline-leftout-kethep-wide src-83 `tok-83 `tre-83)
1292++ test-inline-leftout-kettar
1350++ test-inline-leftout-kettar
1293− (check ~.inline-leftout-kettar src-82 `tok-82 `tre-82)
1351+ (check ~.inline-leftout-kettar src-84 `tok-84 `tre-84)
1294++ test-inline-leftout-miccol
1352++ test-inline-leftout-miccol
1295− (check ~.inline-leftout-miccol src-83 `tok-83 `tre-83)
1353+ (check ~.inline-leftout-miccol src-85 `tok-85 `tre-85)
1296++ test-inline-leftout-sail
1354++ test-inline-leftout-sail
1297− (check ~.inline-leftout-sail src-84 `tok-84 `tre-84)
1355+ (check ~.inline-leftout-sail src-86 `tok-86 `tre-86)
1298++ test-inline-leftout-sigbar
1356++ test-inline-leftout-sigbar
1299− (check ~.inline-leftout-sigbar src-85 `tok-85 `tre-85)
1357+ (check ~.inline-leftout-sigbar src-87 `tok-87 `tre-87)
1300++ test-inline-leftout-signed-float-auras
1358++ test-inline-leftout-signed-float-auras
1301− (check ~.inline-leftout-signed-float-auras src-86 `tok-86 `tre-86)
1359+ (check ~.inline-leftout-signed-float-auras src-88 `tok-88 `tre-88)
1302++ test-inline-leftout-signed-float-auras-2
1360++ test-inline-leftout-signed-float-auras-2
1303− (check ~.inline-leftout-signed-float-auras-2 src-87 `tok-87 `tre-87)
1361+ (check ~.inline-leftout-signed-float-auras-2 src-89 `tok-89 `tre-89)
1304++ test-inline-leftout-sigpam-wide
1362++ test-inline-leftout-sigpam-wide
1305− (check ~.inline-leftout-sigpam-wide src-88 `tok-88 `tre-88)
1363+ (check ~.inline-leftout-sigpam-wide src-90 `tok-90 `tre-90)
1306++ test-inline-leftout-tis-paren
1364++ test-inline-leftout-tis-paren
1307− (check ~.inline-leftout-tis-paren src-89 `tok-89 `tre-89)
1365+ (check ~.inline-leftout-tis-paren src-91 `tok-91 `tre-91)
1308++ test-inline-leftout-tisfas
1366++ test-inline-leftout-tisfas
1309− (check ~.inline-leftout-tisfas src-90 `tok-90 `tre-90)
1367+ (check ~.inline-leftout-tisfas src-92 `tok-92 `tre-92)
1310++ test-inline-leftout-tisgal
1368++ test-inline-leftout-tisgal
1311− (check ~.inline-leftout-tisgal src-91 `tok-91 `tre-91)
1369+ (check ~.inline-leftout-tisgal src-93 `tok-93 `tre-93)
1312++ test-inline-leftout-tisgal-2
1370++ test-inline-leftout-tisgal-2
1313− (check ~.inline-leftout-tisgal-2 src-92 `tok-92 `tre-92)
1371+ (check ~.inline-leftout-tisgal-2 src-94 `tok-94 `tre-94)
1314++ test-inline-leftout-tisgar
1372++ test-inline-leftout-tisgar
1315− (check ~.inline-leftout-tisgar src-93 `tok-93 `tre-93)
1373+ (check ~.inline-leftout-tisgar src-95 `tok-95 `tre-95)
1316++ test-inline-leftout-tislus
1374++ test-inline-leftout-tislus
1317− (check ~.inline-leftout-tislus src-94 `tok-94 `tre-94)
1375+ (check ~.inline-leftout-tislus src-96 `tok-96 `tre-96)
1318++ test-inline-leftout-tistis
1376++ test-inline-leftout-tistis
1319− (check ~.inline-leftout-tistis src-95 `tok-95 `tre-95)
1377+ (check ~.inline-leftout-tistis src-97 `tok-97 `tre-97)
1320++ test-inline-leftout-wutcol
1378++ test-inline-leftout-wutcol
1321− (check ~.inline-leftout-wutcol src-96 `tok-96 `tre-96)
1379+ (check ~.inline-leftout-wutcol src-98 `tok-98 `tre-98)
1322++ test-inline-leftout-wutcol-2
1380++ test-inline-leftout-wutcol-2
1323− (check ~.inline-leftout-wutcol-2 src-97 `tok-97 `tre-97)
1381+ (check ~.inline-leftout-wutcol-2 src-99 `tok-99 `tre-99)
1324++ test-inline-leftout-wuthep-wide
1382++ test-inline-leftout-wuthep-wide
1325− (check ~.inline-leftout-wuthep-wide src-98 `tok-98 `tre-98)
1383+ (check ~.inline-leftout-wuthep-wide src-100 `tok-100 `tre-100)
1326++ test-inline-leftout-wutlus
1384++ test-inline-leftout-wutlus
1327− (check ~.inline-leftout-wutlus src-99 `tok-99 `tre-99)
1385+ (check ~.inline-leftout-wutlus src-101 `tok-101 `tre-101)
1328++ test-inline-leftout-wutsig
1386++ test-inline-leftout-wutsig
1329− (check ~.inline-leftout-wutsig src-100 `tok-100 `tre-100)
1387+ (check ~.inline-leftout-wutsig src-102 `tok-102 `tre-102)
1330++ test-inline-leftout-wutzap
1388++ test-inline-leftout-wutzap
1331− (check ~.inline-leftout-wutzap src-101 `tok-101 `tre-101)
1389+ (check ~.inline-leftout-wutzap src-103 `tok-103 `tre-103)
1332++ test-inline-leftout-zap-not
1390++ test-inline-leftout-zap-not
1333− (check ~.inline-leftout-zap-not src-102 `tok-102 `tre-102)
1391+ (check ~.inline-leftout-zap-not src-104 `tok-104 `tre-104)
1334++ test-inline-leftout-zap-not-2
1392++ test-inline-leftout-zap-not-2
1335− (check ~.inline-leftout-zap-not-2 src-103 `tok-103 `tre-103)
1393+ (check ~.inline-leftout-zap-not-2 src-105 `tok-105 `tre-105)
1336++ test-inline-leftout-zapgar
1394++ test-inline-leftout-zapgar
1337− (check ~.inline-leftout-zapgar src-104 `tok-104 `tre-104)
1395+ (check ~.inline-leftout-zapgar src-106 `tok-106 `tre-106)
1338++ test-inline-list
1396++ test-inline-list
1339− (check ~.inline-list src-105 `tok-105 `tre-105)
1397+ (check ~.inline-list src-107 `tok-107 `tre-107)
1340++ test-inline-list-parens
1398++ test-inline-list-parens
1341− (check ~.inline-list-parens src-106 `tok-106 `tre-106)
1399+ (check ~.inline-list-parens src-108 `tok-108 `tre-108)
1342++ test-inline-literal-defaults
1400++ test-inline-literal-defaults
1343− (check ~.inline-literal-defaults src-107 `tok-107 `tre-107)
1401+ (check ~.inline-literal-defaults src-109 `tok-109 `tre-109)
1344++ test-inline-load-slug
1402++ test-inline-load-slug
1345− (check ~.inline-load-slug src-108 `tok-108 `tre-108)
1403+ (check ~.inline-load-slug src-110 `tok-110 `tre-110)
1346++ test-inline-local-names
1404++ test-inline-local-names
1347− (check ~.inline-local-names src-109 `tok-109 `tre-109)
1405+ (check ~.inline-local-names src-111 `tok-111 `tre-111)
1348++ test-inline-local-names-bodies
1406++ test-inline-local-names-bodies
1349− (check ~.inline-local-names-bodies src-110 `tok-110 `tre-110)
1407+ (check ~.inline-local-names-bodies src-112 `tok-112 `tre-112)
1350++ test-inline-loobean
1408++ test-inline-loobean
1351− (check ~.inline-loobean src-111 `tok-111 `tre-111)
1409+ (check ~.inline-loobean src-113 `tok-113 `tre-113)
1352++ test-inline-mark-digit
1410++ test-inline-mark-digit
1353− (check ~.inline-mark-digit src-112 `tok-112 `tre-112)
1411+ (check ~.inline-mark-digit src-114 `tok-114 `tre-114)
1354++ test-inline-module-definitions
1412++ test-inline-module-definitions
1355− (check ~.inline-module-definitions src-113 `tok-113 `tre-113)
1413+ (check ~.inline-module-definitions src-115 `tok-115 `tre-115)
1356++ test-inline-mold-add
1414++ test-inline-mold-add
1357− (check ~.inline-mold-add src-114 `tok-114 `tre-114)
1415+ (check ~.inline-mold-add src-116 `tok-116 `tre-116)
1358++ test-inline-mold-any-empty
1416++ test-inline-mold-any-empty
1359− (check ~.inline-mold-any-empty src-115 `tok-115 `tre-115)
1417+ (check ~.inline-mold-any-empty src-117 `tok-117 `tre-117)
1360++ test-inline-mold-atoms
1418++ test-inline-mold-atoms
1361− (check ~.inline-mold-atoms src-116 `tok-116 `tre-116)
1419+ (check ~.inline-mold-atoms src-118 `tok-118 `tre-118)
1362++ test-inline-mold-constants
1420++ test-inline-mold-constants
1363− (check ~.inline-mold-constants src-117 `tok-117 `tre-117)
1421+ (check ~.inline-mold-constants src-119 `tok-119 `tre-119)
1364++ test-inline-mold-containers
1422++ test-inline-mold-containers
1365− (check ~.inline-mold-containers src-118 `tok-118 `tre-118)
1423+ (check ~.inline-mold-containers src-120 `tok-120 `tre-120)
1366++ test-inline-mold-gate
1424++ test-inline-mold-gate
1367− (check ~.inline-mold-gate src-119 `tok-119 `tre-119)
1425+ (check ~.inline-mold-gate src-121 `tok-121 `tre-121)
1368++ test-inline-mold-generic
1426++ test-inline-mold-generic
1369− (check ~.inline-mold-generic src-120 `tok-120 `tre-120)
1427+ (check ~.inline-mold-generic src-122 `tok-122 `tre-122)
1370++ test-inline-mold-opaque
1428++ test-inline-mold-opaque
1371− (check ~.inline-mold-opaque src-121 `tok-121 `tre-121)
1429+ (check ~.inline-mold-opaque src-123 `tok-123 `tre-123)
1372++ test-inline-mold-paths
1430++ test-inline-mold-paths
1373− (check ~.inline-mold-paths src-122 `tok-122 `tre-122)
1431+ (check ~.inline-mold-paths src-124 `tok-124 `tre-124)
1374++ test-inline-mold-records
1432++ test-inline-mold-records
1375− (check ~.inline-mold-records src-123 `tok-123 `tre-123)
1433+ (check ~.inline-mold-records src-125 `tok-125 `tre-125)
1376++ test-inline-namespaces
1434++ test-inline-namespaces
1377− (check ~.inline-namespaces src-124 `tok-124 `tre-124)
1435+ (check ~.inline-namespaces src-126 `tok-126 `tre-126)
1378++ test-inline-no-operators
1436++ test-inline-no-operators
1379− (check ~.inline-no-operators src-125 `tok-125 `tre-125)
1437+ (check ~.inline-no-operators src-127 `tok-127 `tre-127)
1380++ test-inline-no-subs
1438++ test-inline-no-subs
1381− (check ~.inline-no-subs src-126 `tok-126 `tre-126)
1439+ (check ~.inline-no-subs src-128 `tok-128 `tre-128)
1382++ test-inline-null
1440++ test-inline-null
1383− (check ~.inline-null src-127 `tok-127 `tre-127)
1441+ (check ~.inline-null src-129 `tok-129 `tre-129)
1384++ test-inline-pair
1442++ test-inline-pair
1385− (check ~.inline-pair src-128 `tok-128 `tre-128)
1443+ (check ~.inline-pair src-130 `tok-130 `tre-130)
1386++ test-inline-pairs-two-items
1444++ test-inline-pairs-two-items
1387− (check ~.inline-pairs-two-items src-129 `tok-129 `tre-129)
1445+ (check ~.inline-pairs-two-items src-131 `tok-131 `tre-131)
1388++ test-inline-path
1446++ test-inline-path
1389− (check ~.inline-path src-130 `tok-130 `tre-130)
1447+ (check ~.inline-path src-132 `tok-132 `tre-132)
1390++ test-inline-pattern-any
1448++ test-inline-pattern-any
1391− (check ~.inline-pattern-any src-131 `tok-131 `tre-131)
1449+ (check ~.inline-pattern-any src-133 `tok-133 `tre-133)
1392++ test-inline-pattern-cell
1450++ test-inline-pattern-cell
1393− (check ~.inline-pattern-cell src-132 `tok-132 `tre-132)
1451+ (check ~.inline-pattern-cell src-134 `tok-134 `tre-134)
1394++ test-inline-pattern-cell-open-bad
1452++ test-inline-pattern-cell-open-bad
1395− (check ~.inline-pattern-cell-open-bad src-133 `tok-133 `tre-133)
1453+ (check ~.inline-pattern-cell-open-bad src-135 `tok-135 `tre-135)
1396++ test-inline-pattern-crash-arm
1454++ test-inline-pattern-crash-arm
1397− (check ~.inline-pattern-crash-arm src-134 `tok-134 `tre-134)
1455+ (check ~.inline-pattern-crash-arm src-136 `tok-136 `tre-136)
1398++ test-inline-pattern-crash-bad
1456++ test-inline-pattern-crash-bad
1399− (check ~.inline-pattern-crash-bad src-135 `tok-135 `tre-135)
1457+ (check ~.inline-pattern-crash-bad src-137 `tok-137 `tre-137)
1400++ test-inline-pattern-date-bad
1458++ test-inline-pattern-date-bad
1401− (check ~.inline-pattern-date-bad src-136 `tok-136 `tre-136)
1459+ (check ~.inline-pattern-date-bad src-138 `tok-138 `tre-138)
1402++ test-inline-pattern-duration-bad
1460++ test-inline-pattern-duration-bad
1403− (check ~.inline-pattern-duration-bad src-137 `tok-137 `tre-137)
1461+ (check ~.inline-pattern-duration-bad src-139 `tok-139 `tre-139)
1404++ test-inline-pattern-eq
1462++ test-inline-pattern-eq
1405− (check ~.inline-pattern-eq src-138 `tok-138 `tre-138)
1463+ (check ~.inline-pattern-eq src-140 `tok-140 `tre-140)
1406++ test-inline-pattern-face-bad
1464++ test-inline-pattern-face-bad
1407− (check ~.inline-pattern-face-bad src-139 `tok-139 `tre-139)
1465+ (check ~.inline-pattern-face-bad src-141 `tok-141 `tre-141)
1408++ test-inline-pattern-head-tag
1466++ test-inline-pattern-head-tag
1409− (check ~.inline-pattern-head-tag src-140 `tok-140 `tre-140)
1467+ (check ~.inline-pattern-head-tag src-142 `tok-142 `tre-142)
1410++ test-inline-pattern-interpolated-bad
1468++ test-inline-pattern-interpolated-bad
1411− (check ~.inline-pattern-interpolated-bad src-141 `tok-141 `tre-141)
1469+ (check ~.inline-pattern-interpolated-bad src-143 `tok-143 `tre-143)
1412++ test-inline-pattern-list-bad
1470++ test-inline-pattern-list-bad
1413− (check ~.inline-pattern-list-bad src-142 `tok-142 `tre-142)
1471+ (check ~.inline-pattern-list-bad src-144 `tok-144 `tre-144)
1414++ test-inline-pattern-literals
1472++ test-inline-pattern-literals
1415− (check ~.inline-pattern-literals src-143 `tok-143 `tre-143)
1473+ (check ~.inline-pattern-literals src-145 `tok-145 `tre-145)
1416++ test-inline-pattern-loobean
1474++ test-inline-pattern-loobean
1417− (check ~.inline-pattern-loobean src-144 `tok-144 `tre-144)
1475+ (check ~.inline-pattern-loobean src-146 `tok-146 `tre-146)
1418++ test-inline-pattern-move-any
1476++ test-inline-pattern-move-any
1419− (check ~.inline-pattern-move-any src-145 `tok-145 `tre-145)
1477+ (check ~.inline-pattern-move-any src-147 `tok-147 `tre-147)
1420++ test-inline-pattern-name
1478++ test-inline-pattern-name
1421− (check ~.inline-pattern-name src-146 `tok-146 `tre-146)
1479+ (check ~.inline-pattern-name src-148 `tok-148 `tre-148)
1422++ test-inline-pattern-null
1480++ test-inline-pattern-null
1423− (check ~.inline-pattern-null src-147 `tok-147 `tre-147)
1481+ (check ~.inline-pattern-null src-149 `tok-149 `tre-149)
1424++ test-inline-pattern-pair-bad
1482++ test-inline-pattern-pair-bad
1425− (check ~.inline-pattern-pair-bad src-148 `tok-148 `tre-148)
1483+ (check ~.inline-pattern-pair-bad src-150 `tok-150 `tre-150)
1426++ test-inline-pattern-tail-tag
1484++ test-inline-pattern-tail-tag
1427− (check ~.inline-pattern-tail-tag src-149 `tok-149 `tre-149)
1485+ (check ~.inline-pattern-tail-tag src-151 `tok-151 `tre-151)
1428++ test-inline-pattern-term
1486++ test-inline-pattern-term
1429− (check ~.inline-pattern-term src-150 `tok-150 `tre-150)
1487+ (check ~.inline-pattern-term src-152 `tok-152 `tre-152)
1430++ test-inline-pattern-two-tags
1488++ test-inline-pattern-two-tags
1431− (check ~.inline-pattern-two-tags src-151 `tok-151 `tre-151)
1489+ (check ~.inline-pattern-two-tags src-153 `tok-153 `tre-153)
1432++ test-inline-pattern-unit
1490++ test-inline-pattern-unit
1433− (check ~.inline-pattern-unit src-152 `tok-152 `tre-152)
1491+ (check ~.inline-pattern-unit src-154 `tok-154 `tre-154)
1434++ test-inline-qath
1492++ test-inline-qath
1435− (check ~.inline-qath src-153 `tok-153 `tre-153)
1493+ (check ~.inline-qath src-155 `tok-155 `tre-155)
1436++ test-inline-requests
1494++ test-inline-requests
1437− (check ~.inline-requests src-154 `tok-154 `tre-154)
1495+ (check ~.inline-requests src-156 `tok-156 `tre-156)
1438++ test-inline-scry-case
1496++ test-inline-scry-case
1439− (check ~.inline-scry-case src-155 `tok-155 `tre-155)
1497+ (check ~.inline-scry-case src-157 `tok-157 `tre-157)
1440++ test-inline-self-reference
1498++ test-inline-self-reference
1441− (check ~.inline-self-reference src-156 `tok-156 `tre-156)
1499+ (check ~.inline-self-reference src-158 `tok-158 `tre-158)
1442++ test-inline-ship
1500++ test-inline-ship
1443− (check ~.inline-ship src-157 `tok-157 `tre-157)
1501+ (check ~.inline-ship src-159 `tok-159 `tre-159)
1444++ test-inline-static-image
1502++ test-inline-static-image
1445− (check ~.inline-static-image src-158 `tok-158 `tre-158)
1503+ (check ~.inline-static-image src-160 `tok-160 `tre-160)
1446++ test-inline-string
1504++ test-inline-string
1447− (check ~.inline-string src-159 `tok-159 `tre-159)
1505+ (check ~.inline-string src-161 `tok-161 `tre-161)
1448++ test-inline-tag-shape
1506++ test-inline-tag-shape
1449− (check ~.inline-tag-shape src-160 `tok-160 `tre-160)
1507+ (check ~.inline-tag-shape src-162 `tok-162 `tre-162)
1450++ test-inline-term
1508++ test-inline-term
1451− (check ~.inline-term src-161 `tok-161 `tre-161)
1509+ (check ~.inline-term src-163 `tok-163 `tre-163)
1452++ test-inline-term-numeric
1510++ test-inline-term-numeric
1453− (check ~.inline-term-numeric src-162 `tok-162 `tre-162)
1511+ (check ~.inline-term-numeric src-164 `tok-164 `tre-164)
1454++ test-inline-text-items
1512++ test-inline-text-items
1455− (check ~.inline-text-items src-163 `tok-163 `tre-163)
1513+ (check ~.inline-text-items src-165 `tok-165 `tre-165)
1456++ test-inline-union-both-bad
1514++ test-inline-union-both-bad
1457− (check ~.inline-union-both-bad src-164 `tok-164 `tre-164)
1515+ (check ~.inline-union-both-bad src-166 `tok-166 `tre-166)
1458++ test-inline-union-local
1516++ test-inline-union-local
1459− (check ~.inline-union-local src-165 `tok-165 `tre-165)
1517+ (check ~.inline-union-local src-167 `tok-167 `tre-167)
1460++ test-inline-union-one-case
1518++ test-inline-union-one-case
1461− (check ~.inline-union-one-case src-166 `tok-166 `tre-166)
1519+ (check ~.inline-union-one-case src-168 `tok-168 `tre-168)
1462++ test-inline-union-record-bad
1520++ test-inline-union-record-bad
1463− (check ~.inline-union-record-bad src-167 `tok-167 `tre-167)
1521+ (check ~.inline-union-record-bad src-169 `tok-169 `tre-169)
1464++ test-inline-union-wide
1522++ test-inline-union-wide
1465− (check ~.inline-union-wide src-168 `tok-168 `tre-168)
1523+ (check ~.inline-union-wide src-170 `tok-170 `tre-170)
1466++ test-inline-unit
1524++ test-inline-unit
1467− (check ~.inline-unit src-169 `tok-169 `tre-169)
1525+ (check ~.inline-unit src-171 `tok-171 `tre-171)
1468++ test-inline-wide-form-rune-bad
1526++ test-inline-wide-form-rune-bad
1469− (check ~.inline-wide-form-rune-bad src-170 `tok-170 `tre-170)
1527+ (check ~.inline-wide-form-rune-bad src-172 `tok-172 `tre-172)
1470++ test-inline-wide-forms
1528++ test-inline-wide-forms
1471− (check ~.inline-wide-forms src-171 `tok-171 `tre-171)
1529+ (check ~.inline-wide-forms src-173 `tok-173 `tre-173)
1472++ test-inline-wide-union-call
1530++ test-inline-wide-union-call
1473− (check ~.inline-wide-union-call src-172 `tok-172 `tre-172)
1531+ (check ~.inline-wide-union-call src-174 `tok-174 `tre-174)
1474++ test-inline-wings
1532++ test-inline-wings
1475− (check ~.inline-wings src-173 `tok-173 `tre-173)
1533+ (check ~.inline-wings src-175 `tok-175 `tre-175)
1476++ test-lex-base32-bad-1
1534++ test-lex-base32-bad-1
1477− (check ~.lex-base32-bad-1 src-174 `tok-174 `tre-174)
1535+ (check ~.lex-base32-bad-1 src-176 `tok-176 `tre-176)
1478++ test-lex-base32-ok-1
1536++ test-lex-base32-ok-1
1479− (check ~.lex-base32-ok-1 src-175 `tok-175 `tre-175)
1537+ (check ~.lex-base32-ok-1 src-177 `tok-177 `tre-177)
1480++ test-lex-blob-bad-1
1538++ test-lex-blob-bad-1
1481− (check ~.lex-blob-bad-1 src-176 `tok-176 `tre-176)
1539+ (check ~.lex-blob-bad-1 src-178 `tok-178 `tre-178)
1482++ test-lex-call-open-bad-1
1540++ test-lex-call-open-bad-1
1483− (check ~.lex-call-open-bad-1 src-177 `tok-177 `tre-177)
1541+ (check ~.lex-call-open-bad-1 src-179 `tok-179 `tre-179)
1484++ test-lex-call-open-bad-2
1542++ test-lex-call-open-bad-2
1485− (check ~.lex-call-open-bad-2 src-178 `tok-178 `tre-178)
1543+ (check ~.lex-call-open-bad-2 src-180 `tok-180 `tre-180)
1486++ test-lex-call-open-bad-4
1544++ test-lex-call-open-bad-4
1487− (check ~.lex-call-open-bad-4 src-179 `tok-179 `tre-179)
1545+ (check ~.lex-call-open-bad-4 src-181 `tok-181 `tre-181)
1488++ test-lex-call-open-ok-1
1546++ test-lex-call-open-ok-1
1489− (check ~.lex-call-open-ok-1 src-180 `tok-180 `tre-180)
1547+ (check ~.lex-call-open-ok-1 src-182 `tok-182 `tre-182)
1490++ test-lex-call-open-ok-2
1548++ test-lex-call-open-ok-2
1491− (check ~.lex-call-open-ok-2 src-181 `tok-181 `tre-181)
1549+ (check ~.lex-call-open-ok-2 src-183 `tok-183 `tre-183)
1492++ test-lex-cell-bad-1
1550++ test-lex-cell-bad-1
1493− (check ~.lex-cell-bad-1 src-182 `tok-182 `tre-182)
1551+ (check ~.lex-cell-bad-1 src-184 `tok-184 `tre-184)
1494++ test-lex-cell-ok-1
1552++ test-lex-cell-ok-1
1495− (check ~.lex-cell-ok-1 src-183 `tok-183 `tre-183)
1553+ (check ~.lex-cell-ok-1 src-185 `tok-185 `tre-185)
1496++ test-lex-closer-bad-1
1554++ test-lex-closer-bad-1
1497− (check ~.lex-closer-bad-1 src-184 `tok-184 `tre-184)
1555+ (check ~.lex-closer-bad-1 src-186 `tok-186 `tre-186)
1498++ test-lex-closer-bad-2
1556++ test-lex-closer-bad-2
1499− (check ~.lex-closer-bad-2 src-185 `tok-185 `tre-185)
1557+ (check ~.lex-closer-bad-2 src-187 `tok-187 `tre-187)
1500++ test-lex-closer-bad-3
1558++ test-lex-closer-bad-3
1501− (check ~.lex-closer-bad-3 src-186 `tok-186 `tre-186)
1559+ (check ~.lex-closer-bad-3 src-188 `tok-188 `tre-188)
1502++ test-lex-closer-bad-4
1560++ test-lex-closer-bad-4
1503− (check ~.lex-closer-bad-4 src-187 `tok-187 `tre-187)
1561+ (check ~.lex-closer-bad-4 src-189 `tok-189 `tre-189)
1504++ test-lex-codepoint-bad-1
1562++ test-lex-codepoint-bad-1
1505− (check ~.lex-codepoint-bad-1 src-188 `tok-188 `tre-188)
1563+ (check ~.lex-codepoint-bad-1 src-190 `tok-190 `tre-190)
1506++ test-lex-comment-bad-1
1564++ test-lex-comment-bad-1
1507− (check ~.lex-comment-bad-1 src-189 `tok-189 `tre-189)
1565+ (check ~.lex-comment-bad-1 src-191 `tok-191 `tre-191)
1508++ test-lex-comment-ok-1
1566++ test-lex-comment-ok-1
1509− (check ~.lex-comment-ok-1 src-190 `tok-190 `tre-190)
1567+ (check ~.lex-comment-ok-1 src-192 `tok-192 `tre-192)
1510++ test-lex-comment-ok-2
1568++ test-lex-comment-ok-2
1511− (check ~.lex-comment-ok-2 src-191 `tok-191 `tre-191)
1569+ (check ~.lex-comment-ok-2 src-193 `tok-193 `tre-193)
1512++ test-lex-comment-ok-3
1570++ test-lex-comment-ok-3
1513− (check ~.lex-comment-ok-3 src-192 `tok-192 `tre-192)
1571+ (check ~.lex-comment-ok-3 src-194 `tok-194 `tre-194)
1514++ test-lex-date-bad-1
1572++ test-lex-date-bad-1
1515− (check ~.lex-date-bad-1 src-193 `tok-193 `tre-193)
1573+ (check ~.lex-date-bad-1 src-195 `tok-195 `tre-195)
1516++ test-lex-date-bad-2
1574++ test-lex-date-bad-2
1517− (check ~.lex-date-bad-2 src-194 `tok-194 `tre-194)
1575+ (check ~.lex-date-bad-2 src-196 `tok-196 `tre-196)
1518++ test-lex-date-bad-3
1576++ test-lex-date-bad-3
1519− (check ~.lex-date-bad-3 src-195 `tok-195 `tre-195)
1577+ (check ~.lex-date-bad-3 src-197 `tok-197 `tre-197)
1520++ test-lex-date-ok-1
1578++ test-lex-date-ok-1
1521− (check ~.lex-date-ok-1 src-196 `tok-196 `tre-196)
1579+ (check ~.lex-date-ok-1 src-198 `tok-198 `tre-198)
1522++ test-lex-date-ok-2
1580++ test-lex-date-ok-2
1523− (check ~.lex-date-ok-2 src-197 `tok-197 `tre-197)
1581+ (check ~.lex-date-ok-2 src-199 `tok-199 `tre-199)
1524++ test-lex-decimal-bad-1
1582++ test-lex-decimal-bad-1
1525− (check ~.lex-decimal-bad-1 src-198 `tok-198 `tre-198)
1583+ (check ~.lex-decimal-bad-1 src-200 `tok-200 `tre-200)
1526++ test-lex-decimal-bad-2
1584++ test-lex-decimal-bad-2
1527− (check ~.lex-decimal-bad-2 src-199 `tok-199 `tre-199)
1585+ (check ~.lex-decimal-bad-2 src-201 `tok-201 `tre-201)
1528++ test-lex-decimal-ok-1
1586++ test-lex-decimal-ok-1
1529− (check ~.lex-decimal-ok-1 src-200 `tok-200 `tre-200)
1587+ (check ~.lex-decimal-ok-1 src-202 `tok-202 `tre-202)
1530++ test-lex-duration-bad-1
1588++ test-lex-duration-bad-1
1531− (check ~.lex-duration-bad-1 src-201 `tok-201 `tre-201)
1589+ (check ~.lex-duration-bad-1 src-203 `tok-203 `tre-203)
1532++ test-lex-duration-bad-2
1590++ test-lex-duration-bad-2
1533− (check ~.lex-duration-bad-2 src-202 `tok-202 `tre-202)
1591+ (check ~.lex-duration-bad-2 src-204 `tok-204 `tre-204)
1534++ test-lex-duration-ok-1
1592++ test-lex-duration-ok-1
1535− (check ~.lex-duration-ok-1 src-203 `tok-203 `tre-203)
1593+ (check ~.lex-duration-ok-1 src-205 `tok-205 `tre-205)
1536++ test-lex-hex-bad-1
1594++ test-lex-hex-bad-1
1537− (check ~.lex-hex-bad-1 src-204 `tok-204 `tre-204)
1595+ (check ~.lex-hex-bad-1 src-206 `tok-206 `tre-206)
1538++ test-lex-hex-ok-1
1596++ test-lex-hex-ok-1
1539− (check ~.lex-hex-ok-1 src-205 `tok-205 `tre-205)
1597+ (check ~.lex-hex-ok-1 src-207 `tok-207 `tre-207)
1540++ test-lex-indent-bad-1
1598++ test-lex-indent-bad-1
1541− (check ~.lex-indent-bad-1 src-206 `tok-206 `tre-206)
1599+ (check ~.lex-indent-bad-1 src-208 `tok-208 `tre-208)
1542++ test-lex-indent-bad-2
1600++ test-lex-indent-bad-2
1543− (check ~.lex-indent-bad-2 src-207 `tok-207 `tre-207)
1601+ (check ~.lex-indent-bad-2 src-209 `tok-209 `tre-209)
1544++ test-lex-indent-bad-3
1602++ test-lex-indent-bad-3
1545− (check ~.lex-indent-bad-3 src-208 `tok-208 `tre-208)
1603+ (check ~.lex-indent-bad-3 src-210 `tok-210 `tre-210)
1546++ test-lex-indent-ok-1
1604++ test-lex-indent-ok-1
1547− (check ~.lex-indent-ok-1 src-209 `tok-209 `tre-209)
1605+ (check ~.lex-indent-ok-1 src-211 `tok-211 `tre-211)
1548++ test-lex-indent-ok-2
1606++ test-lex-indent-ok-2
1549− (check ~.lex-indent-ok-2 src-210 `tok-210 `tre-210)
1607+ (check ~.lex-indent-ok-2 src-212 `tok-212 `tre-212)
1550++ test-lex-indent-ok-3
1608++ test-lex-indent-ok-3
1551− (check ~.lex-indent-ok-3 src-211 `tok-211 `tre-211)
1609+ (check ~.lex-indent-ok-3 src-213 `tok-213 `tre-213)
1552++ test-lex-interp-bad-1
1610++ test-lex-interp-bad-1
1553− (check ~.lex-interp-bad-1 src-212 `tok-212 `tre-212)
1611+ (check ~.lex-interp-bad-1 src-214 `tok-214 `tre-214)
1554++ test-lex-interp-bad-2
1612++ test-lex-interp-bad-2
1555− (check ~.lex-interp-bad-2 src-213 `tok-213 `tre-213)
1613+ (check ~.lex-interp-bad-2 src-215 `tok-215 `tre-215)
1556++ test-lex-interp-bad-3
1614++ test-lex-interp-bad-3
1557− (check ~.lex-interp-bad-3 src-214 `tok-214 `tre-214)
1615+ (check ~.lex-interp-bad-3 src-216 `tok-216 `tre-216)
1558++ test-lex-interp-bad-5
1616++ test-lex-interp-bad-5
1559− (check ~.lex-interp-bad-5 src-215 `tok-215 `tre-215)
1617+ (check ~.lex-interp-bad-5 src-217 `tok-217 `tre-217)
1560++ test-lex-interp-bad-6
1618++ test-lex-interp-bad-6
1561− (check ~.lex-interp-bad-6 src-216 `tok-216 `tre-216)
1619+ (check ~.lex-interp-bad-6 src-218 `tok-218 `tre-218)
1562++ test-lex-interp-ok-1
1620++ test-lex-interp-ok-1
1563− (check ~.lex-interp-ok-1 src-217 `tok-217 `tre-217)
1621+ (check ~.lex-interp-ok-1 src-219 `tok-219 `tre-219)
1564++ test-lex-interp-ok-2
1622++ test-lex-interp-ok-2
1565− (check ~.lex-interp-ok-2 src-218 `tok-218 `tre-218)
1623+ (check ~.lex-interp-ok-2 src-220 `tok-220 `tre-220)
1566++ test-lex-interp-ok-3
1624++ test-lex-interp-ok-3
1567− (check ~.lex-interp-ok-3 src-219 `tok-219 `tre-219)
1625+ (check ~.lex-interp-ok-3 src-221 `tok-221 `tre-221)
1568++ test-lex-knot-bad-1
1626++ test-lex-knot-bad-1
1569− (check ~.lex-knot-bad-1 src-220 `tok-220 `tre-220)
1627+ (check ~.lex-knot-bad-1 src-222 `tok-222 `tre-222)
1570++ test-lex-knot-ok-1
1628++ test-lex-knot-ok-1
1571− (check ~.lex-knot-ok-1 src-221 `tok-221 `tre-221)
1629+ (check ~.lex-knot-ok-1 src-223 `tok-223 `tre-223)
1572++ test-lex-layout-bad-1
1630++ test-lex-layout-bad-1
1573− (check ~.lex-layout-bad-1 src-222 `tok-222 `tre-222)
1631+ (check ~.lex-layout-bad-1 src-224 `tok-224 `tre-224)
1574++ test-lex-layout-bad-10
1632++ test-lex-layout-bad-10
1575− (check ~.lex-layout-bad-10 src-223 `tok-223 `tre-223)
1633+ (check ~.lex-layout-bad-10 src-225 `tok-225 `tre-225)
1576++ test-lex-layout-bad-2
1634++ test-lex-layout-bad-2
1577− (check ~.lex-layout-bad-2 src-224 `tok-224 `tre-224)
1635+ (check ~.lex-layout-bad-2 src-226 `tok-226 `tre-226)
1578++ test-lex-layout-bad-3
1636++ test-lex-layout-bad-3
1579− (check ~.lex-layout-bad-3 src-225 `tok-225 `tre-225)
1637+ (check ~.lex-layout-bad-3 src-227 `tok-227 `tre-227)
1580++ test-lex-layout-bad-4
1638++ test-lex-layout-bad-4
1581− (check ~.lex-layout-bad-4 src-226 `tok-226 `tre-226)
1639+ (check ~.lex-layout-bad-4 src-228 `tok-228 `tre-228)
1582++ test-lex-layout-bad-5
1640++ test-lex-layout-bad-5
1583− (check ~.lex-layout-bad-5 src-227 `tok-227 `tre-227)
1641+ (check ~.lex-layout-bad-5 src-229 `tok-229 `tre-229)
1584++ test-lex-layout-bad-6
1642++ test-lex-layout-bad-6
1585− (check ~.lex-layout-bad-6 src-228 `tok-228 `tre-228)
1643+ (check ~.lex-layout-bad-6 src-230 `tok-230 `tre-230)
1586++ test-lex-layout-bad-7
1644++ test-lex-layout-bad-7
1587− (check ~.lex-layout-bad-7 src-229 `tok-229 `tre-229)
1645+ (check ~.lex-layout-bad-7 src-231 `tok-231 `tre-231)
1588++ test-lex-layout-bad-8
1646++ test-lex-layout-bad-8
1589− (check ~.lex-layout-bad-8 src-230 `tok-230 `tre-230)
1647+ (check ~.lex-layout-bad-8 src-232 `tok-232 `tre-232)
1590++ test-lex-layout-bad-9
1648++ test-lex-layout-bad-9
1591− (check ~.lex-layout-bad-9 src-231 `tok-231 `tre-231)
1649+ (check ~.lex-layout-bad-9 src-233 `tok-233 `tre-233)
1592++ test-lex-layout-ok-1
1650++ test-lex-layout-ok-1
1593− (check ~.lex-layout-ok-1 src-232 `tok-232 `tre-232)
1651+ (check ~.lex-layout-ok-1 src-234 `tok-234 `tre-234)
1594++ test-lex-list-bad-1
1652++ test-lex-list-bad-1
1595− (check ~.lex-list-bad-1 src-233 `tok-233 `tre-233)
1653+ (check ~.lex-list-bad-1 src-235 `tok-235 `tre-235)
1596++ test-lex-list-ok-1
1654++ test-lex-list-ok-1
1597− (check ~.lex-list-ok-1 src-234 `tok-234 `tre-234)
1655+ (check ~.lex-list-ok-1 src-236 `tok-236 `tre-236)
1598++ test-lex-loobean-bad-1
1656++ test-lex-loobean-bad-1
1599− (check ~.lex-loobean-bad-1 src-235 `tok-235 `tre-235)
1657+ (check ~.lex-loobean-bad-1 src-237 `tok-237 `tre-237)
1600++ test-lex-loobean-ok-1
1658++ test-lex-loobean-ok-1
1601− (check ~.lex-loobean-ok-1 src-236 `tok-236 `tre-236)
1659+ (check ~.lex-loobean-ok-1 src-238 `tok-238 `tre-238)
1602++ test-lex-name-bad-1
1660++ test-lex-name-bad-1
1603− (check ~.lex-name-bad-1 src-237 `tok-237 `tre-237)
1661+ (check ~.lex-name-bad-1 src-239 `tok-239 `tre-239)
1604++ test-lex-name-bad-2
1662++ test-lex-name-bad-2
1605− (check ~.lex-name-bad-2 src-238 `tok-238 `tre-238)
1663+ (check ~.lex-name-bad-2 src-240 `tok-240 `tre-240)
1606++ test-lex-name-bad-3
1664++ test-lex-name-bad-3
1607− (check ~.lex-name-bad-3 src-239 `tok-239 `tre-239)
1665+ (check ~.lex-name-bad-3 src-241 `tok-241 `tre-241)
1608++ test-lex-name-bad-4
1666++ test-lex-name-bad-4
1609− (check ~.lex-name-bad-4 src-240 `tok-240 `tre-240)
1667+ (check ~.lex-name-bad-4 src-242 `tok-242 `tre-242)
1610++ test-lex-name-bad-5
1668++ test-lex-name-bad-5
1611− (check ~.lex-name-bad-5 src-241 `tok-241 `tre-241)
1669+ (check ~.lex-name-bad-5 src-243 `tok-243 `tre-243)
1612++ test-lex-name-bad-6
1670++ test-lex-name-bad-6
1613− (check ~.lex-name-bad-6 src-242 `tok-242 `tre-242)
1671+ (check ~.lex-name-bad-6 src-244 `tok-244 `tre-244)
1614++ test-lex-name-ok-1
1672++ test-lex-name-ok-1
1615− (check ~.lex-name-ok-1 src-243 `tok-243 `tre-243)
1673+ (check ~.lex-name-ok-1 src-245 `tok-245 `tre-245)
1616++ test-lex-null-bad-1
1674++ test-lex-null-bad-1
1617− (check ~.lex-null-bad-1 src-244 `tok-244 `tre-244)
1675+ (check ~.lex-null-bad-1 src-246 `tok-246 `tre-246)
1618++ test-lex-null-bad-2
1676++ test-lex-null-bad-2
1619− (check ~.lex-null-bad-2 src-245 `tok-245 `tre-245)
1677+ (check ~.lex-null-bad-2 src-247 `tok-247 `tre-247)
1620++ test-lex-null-ok-1
1678++ test-lex-null-ok-1
1621− (check ~.lex-null-ok-1 src-246 `tok-246 `tre-246)
1679+ (check ~.lex-null-ok-1 src-248 `tok-248 `tre-248)
1622++ test-lex-open-bracket-bad-1
1680++ test-lex-open-bracket-bad-1
1623− (check ~.lex-open-bracket-bad-1 src-247 `tok-247 `tre-247)
1681+ (check ~.lex-open-bracket-bad-1 src-249 `tok-249 `tre-249)
1624++ test-lex-open-bracket-bad-10
1682++ test-lex-open-bracket-bad-10
1625− (check ~.lex-open-bracket-bad-10 src-248 `tok-248 `tre-248)
1683+ (check ~.lex-open-bracket-bad-10 src-250 `tok-250 `tre-250)
1626++ test-lex-open-bracket-bad-11
1684++ test-lex-open-bracket-bad-11
1627− (check ~.lex-open-bracket-bad-11 src-249 `tok-249 `tre-249)
1685+ (check ~.lex-open-bracket-bad-11 src-251 `tok-251 `tre-251)
1628++ test-lex-open-bracket-bad-12
1686++ test-lex-open-bracket-bad-12
1629− (check ~.lex-open-bracket-bad-12 src-250 `tok-250 `tre-250)
1687+ (check ~.lex-open-bracket-bad-12 src-252 `tok-252 `tre-252)
1630++ test-lex-open-bracket-bad-13
1688++ test-lex-open-bracket-bad-13
1631− (check ~.lex-open-bracket-bad-13 src-251 `tok-251 `tre-251)
1689+ (check ~.lex-open-bracket-bad-13 src-253 `tok-253 `tre-253)
1632++ test-lex-open-bracket-bad-14
1690++ test-lex-open-bracket-bad-14
1633− (check ~.lex-open-bracket-bad-14 src-252 `tok-252 `tre-252)
1691+ (check ~.lex-open-bracket-bad-14 src-254 `tok-254 `tre-254)
1634++ test-lex-open-bracket-bad-15
1692++ test-lex-open-bracket-bad-15
1635− (check ~.lex-open-bracket-bad-15 src-253 `tok-253 `tre-253)
1693+ (check ~.lex-open-bracket-bad-15 src-255 `tok-255 `tre-255)
1636++ test-lex-open-bracket-bad-16
1694++ test-lex-open-bracket-bad-16
1637− (check ~.lex-open-bracket-bad-16 src-254 `tok-254 `tre-254)
1695+ (check ~.lex-open-bracket-bad-16 src-256 `tok-256 `tre-256)
1638++ test-lex-open-bracket-bad-2
1696++ test-lex-open-bracket-bad-2
1639− (check ~.lex-open-bracket-bad-2 src-255 `tok-255 `tre-255)
1697+ (check ~.lex-open-bracket-bad-2 src-257 `tok-257 `tre-257)
1640++ test-lex-open-bracket-bad-3
1698++ test-lex-open-bracket-bad-3
1641− (check ~.lex-open-bracket-bad-3 src-256 `tok-256 `tre-256)
1699+ (check ~.lex-open-bracket-bad-3 src-258 `tok-258 `tre-258)
1642++ test-lex-open-bracket-bad-5
1700++ test-lex-open-bracket-bad-5
1643− (check ~.lex-open-bracket-bad-5 src-257 `tok-257 `tre-257)
1701+ (check ~.lex-open-bracket-bad-5 src-259 `tok-259 `tre-259)
1644++ test-lex-open-bracket-bad-6
1702++ test-lex-open-bracket-bad-6
1645− (check ~.lex-open-bracket-bad-6 src-258 `tok-258 `tre-258)
1703+ (check ~.lex-open-bracket-bad-6 src-260 `tok-260 `tre-260)
1646++ test-lex-open-bracket-bad-7
1704++ test-lex-open-bracket-bad-7
1647− (check ~.lex-open-bracket-bad-7 src-259 `tok-259 `tre-259)
1705+ (check ~.lex-open-bracket-bad-7 src-261 `tok-261 `tre-261)
1648++ test-lex-open-bracket-bad-8
1706++ test-lex-open-bracket-bad-8
1649− (check ~.lex-open-bracket-bad-8 src-260 `tok-260 `tre-260)
1707+ (check ~.lex-open-bracket-bad-8 src-262 `tok-262 `tre-262)
1650++ test-lex-open-bracket-bad-9
1708++ test-lex-open-bracket-bad-9
1651− (check ~.lex-open-bracket-bad-9 src-261 `tok-261 `tre-261)
1709+ (check ~.lex-open-bracket-bad-9 src-263 `tok-263 `tre-263)
1652++ test-lex-open-bracket-ok-1
1710++ test-lex-open-bracket-ok-1
1653− (check ~.lex-open-bracket-ok-1 src-262 `tok-262 `tre-262)
1711+ (check ~.lex-open-bracket-ok-1 src-264 `tok-264 `tre-264)
1654++ test-lex-open-bracket-ok-2
1712++ test-lex-open-bracket-ok-2
1655− (check ~.lex-open-bracket-ok-2 src-263 `tok-263 `tre-263)
1713+ (check ~.lex-open-bracket-ok-2 src-265 `tok-265 `tre-265)
1656++ test-lex-open-bracket-ok-3
1714++ test-lex-open-bracket-ok-3
1657− (check ~.lex-open-bracket-ok-3 src-264 `tok-264 `tre-264)
1715+ (check ~.lex-open-bracket-ok-3 src-266 `tok-266 `tre-266)
1658++ test-lex-open-bracket-ok-4
1716++ test-lex-open-bracket-ok-4
1659− (check ~.lex-open-bracket-ok-4 src-265 `tok-265 `tre-265)
1717+ (check ~.lex-open-bracket-ok-4 src-267 `tok-267 `tre-267)
1660++ test-lex-open-bracket-ok-5
1718++ test-lex-open-bracket-ok-5
1661− (check ~.lex-open-bracket-ok-5 src-266 `tok-266 `tre-266)
1719+ (check ~.lex-open-bracket-ok-5 src-268 `tok-268 `tre-268)
1662++ test-lex-open-bracket-ok-6
1720++ test-lex-open-bracket-ok-6
1663− (check ~.lex-open-bracket-ok-6 src-267 `tok-267 `tre-267)
1721+ (check ~.lex-open-bracket-ok-6 src-269 `tok-269 `tre-269)
1664++ test-lex-open-bracket-ok-7
1722++ test-lex-open-bracket-ok-7
1665− (check ~.lex-open-bracket-ok-7 src-268 `tok-268 `tre-268)
1723+ (check ~.lex-open-bracket-ok-7 src-270 `tok-270 `tre-270)
1666++ test-lex-open-bracket-ok-8
1724++ test-lex-open-bracket-ok-8
1667− (check ~.lex-open-bracket-ok-8 src-269 `tok-269 `tre-269)
1725+ (check ~.lex-open-bracket-ok-8 src-271 `tok-271 `tre-271)
1668++ test-lex-open-bracket-ok-9
1726++ test-lex-open-bracket-ok-9
1669− (check ~.lex-open-bracket-ok-9 src-270 `tok-270 `tre-270)
1727+ (check ~.lex-open-bracket-ok-9 src-272 `tok-272 `tre-272)
1670++ test-lex-open-mold-bad-1
1728++ test-lex-open-mold-bad-1
1671− (check ~.lex-open-mold-bad-1 src-271 `tok-271 `tre-271)
1729+ (check ~.lex-open-mold-bad-1 src-273 `tok-273 `tre-273)
1672++ test-lex-open-mold-bad-10
1730++ test-lex-open-mold-bad-10
1673− (check ~.lex-open-mold-bad-10 src-272 `tok-272 `tre-272)
1731+ (check ~.lex-open-mold-bad-10 src-274 `tok-274 `tre-274)
1674++ test-lex-open-mold-bad-11
1732++ test-lex-open-mold-bad-11
1675− (check ~.lex-open-mold-bad-11 src-273 `tok-273 `tre-273)
1733+ (check ~.lex-open-mold-bad-11 src-275 `tok-275 `tre-275)
1676++ test-lex-open-mold-bad-12
1734++ test-lex-open-mold-bad-12
1677− (check ~.lex-open-mold-bad-12 src-274 `tok-274 `tre-274)
1735+ (check ~.lex-open-mold-bad-12 src-276 `tok-276 `tre-276)
1678++ test-lex-open-mold-bad-13
1736++ test-lex-open-mold-bad-13
1679− (check ~.lex-open-mold-bad-13 src-275 `tok-275 `tre-275)
1737+ (check ~.lex-open-mold-bad-13 src-277 `tok-277 `tre-277)
1680++ test-lex-open-mold-bad-14
1738++ test-lex-open-mold-bad-14
1681− (check ~.lex-open-mold-bad-14 src-276 `tok-276 `tre-276)
1739+ (check ~.lex-open-mold-bad-14 src-278 `tok-278 `tre-278)
1682++ test-lex-open-mold-bad-15
1740++ test-lex-open-mold-bad-15
1683− (check ~.lex-open-mold-bad-15 src-277 `tok-277 `tre-277)
1741+ (check ~.lex-open-mold-bad-15 src-279 `tok-279 `tre-279)
1684++ test-lex-open-mold-bad-16
1742++ test-lex-open-mold-bad-16
1685− (check ~.lex-open-mold-bad-16 src-278 `tok-278 `tre-278)
1743+ (check ~.lex-open-mold-bad-16 src-280 `tok-280 `tre-280)
1686++ test-lex-open-mold-bad-2
1744++ test-lex-open-mold-bad-2
1687− (check ~.lex-open-mold-bad-2 src-279 `tok-279 `tre-279)
1745+ (check ~.lex-open-mold-bad-2 src-281 `tok-281 `tre-281)
1688++ test-lex-open-mold-bad-3
1746++ test-lex-open-mold-bad-3
1689− (check ~.lex-open-mold-bad-3 src-280 `tok-280 `tre-280)
1747+ (check ~.lex-open-mold-bad-3 src-282 `tok-282 `tre-282)
1690++ test-lex-open-mold-bad-4
1748++ test-lex-open-mold-bad-4
1691− (check ~.lex-open-mold-bad-4 src-281 `tok-281 `tre-281)
1749+ (check ~.lex-open-mold-bad-4 src-283 `tok-283 `tre-283)
1692++ test-lex-open-mold-bad-5
1750++ test-lex-open-mold-bad-5
1693− (check ~.lex-open-mold-bad-5 src-282 `tok-282 `tre-282)
1751+ (check ~.lex-open-mold-bad-5 src-284 `tok-284 `tre-284)
1694++ test-lex-open-mold-bad-6
1752++ test-lex-open-mold-bad-6
1695− (check ~.lex-open-mold-bad-6 src-283 `tok-283 `tre-283)
1753+ (check ~.lex-open-mold-bad-6 src-285 `tok-285 `tre-285)
1696++ test-lex-open-mold-bad-7
1754++ test-lex-open-mold-bad-7
1697− (check ~.lex-open-mold-bad-7 src-284 `tok-284 `tre-284)
1755+ (check ~.lex-open-mold-bad-7 src-286 `tok-286 `tre-286)
1698++ test-lex-open-mold-bad-8
1756++ test-lex-open-mold-bad-8
1699− (check ~.lex-open-mold-bad-8 src-285 `tok-285 `tre-285)
1757+ (check ~.lex-open-mold-bad-8 src-287 `tok-287 `tre-287)
1700++ test-lex-open-mold-bad-9
1758++ test-lex-open-mold-bad-9
1701− (check ~.lex-open-mold-bad-9 src-286 `tok-286 `tre-286)
1759+ (check ~.lex-open-mold-bad-9 src-288 `tok-288 `tre-288)
1702++ test-lex-open-mold-ok-1
1760++ test-lex-open-mold-ok-1
1703− (check ~.lex-open-mold-ok-1 src-287 `tok-287 `tre-287)
1761+ (check ~.lex-open-mold-ok-1 src-289 `tok-289 `tre-289)
1704++ test-lex-open-mold-ok-2
1762++ test-lex-open-mold-ok-2
1705− (check ~.lex-open-mold-ok-2 src-288 `tok-288 `tre-288)
1763+ (check ~.lex-open-mold-ok-2 src-290 `tok-290 `tre-290)
1706++ test-lex-open-mold-ok-3
1764++ test-lex-open-mold-ok-3
1707− (check ~.lex-open-mold-ok-3 src-289 `tok-289 `tre-289)
1765+ (check ~.lex-open-mold-ok-3 src-291 `tok-291 `tre-291)
1708++ test-lex-open-mold-ok-4
1766++ test-lex-open-mold-ok-4
1709− (check ~.lex-open-mold-ok-4 src-290 `tok-290 `tre-290)
1767+ (check ~.lex-open-mold-ok-4 src-292 `tok-292 `tre-292)
1710++ test-lex-open-mold-ok-5
1768++ test-lex-open-mold-ok-5
1711− (check ~.lex-open-mold-ok-5 src-291 `tok-291 `tre-291)
1769+ (check ~.lex-open-mold-ok-5 src-293 `tok-293 `tre-293)
1712++ test-lex-open-mold-ok-6
1770++ test-lex-open-mold-ok-6
1713− (check ~.lex-open-mold-ok-6 src-292 `tok-292 `tre-292)
1771+ (check ~.lex-open-mold-ok-6 src-294 `tok-294 `tre-294)
1714++ test-lex-pair-binding-bad-1
1772++ test-lex-pair-binding-bad-1
1715− (check ~.lex-pair-binding-bad-1 src-293 `tok-293 `tre-293)
1773+ (check ~.lex-pair-binding-bad-1 src-295 `tok-295 `tre-295)
1716++ test-lex-pair-binding-ok-1
1774++ test-lex-pair-binding-ok-1
1717− (check ~.lex-pair-binding-ok-1 src-294 `tok-294 `tre-294)
1775+ (check ~.lex-pair-binding-ok-1 src-296 `tok-296 `tre-296)
1718++ test-lex-path-bad-1
1776++ test-lex-path-bad-1
1719− (check ~.lex-path-bad-1 src-295 `tok-295 `tre-295)
1777+ (check ~.lex-path-bad-1 src-297 `tok-297 `tre-297)
1720++ test-lex-path-ok-1
1778++ test-lex-path-ok-1
1721− (check ~.lex-path-ok-1 src-296 `tok-296 `tre-296)
1779+ (check ~.lex-path-ok-1 src-298 `tok-298 `tre-298)
1722++ test-lex-rune-layout-bad-1
1780++ test-lex-rune-layout-bad-1
1723− (check ~.lex-rune-layout-bad-1 src-297 `tok-297 `tre-297)
1781+ (check ~.lex-rune-layout-bad-1 src-299 `tok-299 `tre-299)
1724++ test-lex-rune-layout-bad-11
1782++ test-lex-rune-layout-bad-11
1725− (check ~.lex-rune-layout-bad-11 src-298 `tok-298 `tre-298)
1783+ (check ~.lex-rune-layout-bad-11 src-300 `tok-300 `tre-300)
1726++ test-lex-rune-layout-bad-12
1784++ test-lex-rune-layout-bad-12
1727− (check ~.lex-rune-layout-bad-12 src-299 `tok-299 `tre-299)
1785+ (check ~.lex-rune-layout-bad-12 src-301 `tok-301 `tre-301)
1728++ test-lex-rune-layout-bad-13
1786++ test-lex-rune-layout-bad-13
1729− (check ~.lex-rune-layout-bad-13 src-300 `tok-300 `tre-300)
1787+ (check ~.lex-rune-layout-bad-13 src-302 `tok-302 `tre-302)
1730++ test-lex-rune-layout-bad-14
1788++ test-lex-rune-layout-bad-14
1731− (check ~.lex-rune-layout-bad-14 src-301 `tok-301 `tre-301)
1789+ (check ~.lex-rune-layout-bad-14 src-303 `tok-303 `tre-303)
1732++ test-lex-rune-layout-bad-15
1790++ test-lex-rune-layout-bad-15
1733− (check ~.lex-rune-layout-bad-15 src-302 `tok-302 `tre-302)
1791+ (check ~.lex-rune-layout-bad-15 src-304 `tok-304 `tre-304)
1734++ test-lex-rune-layout-bad-2
1792++ test-lex-rune-layout-bad-2
1735− (check ~.lex-rune-layout-bad-2 src-303 `tok-303 `tre-303)
1793+ (check ~.lex-rune-layout-bad-2 src-305 `tok-305 `tre-305)
1736++ test-lex-rune-layout-bad-3
1794++ test-lex-rune-layout-bad-3
1737− (check ~.lex-rune-layout-bad-3 src-304 `tok-304 `tre-304)
1795+ (check ~.lex-rune-layout-bad-3 src-306 `tok-306 `tre-306)
1738++ test-lex-rune-layout-bad-4
1796++ test-lex-rune-layout-bad-4
1739− (check ~.lex-rune-layout-bad-4 src-305 `tok-305 `tre-305)
1797+ (check ~.lex-rune-layout-bad-4 src-307 `tok-307 `tre-307)
1740++ test-lex-rune-layout-bad-5
1798++ test-lex-rune-layout-bad-5
1741− (check ~.lex-rune-layout-bad-5 src-306 `tok-306 `tre-306)
1799+ (check ~.lex-rune-layout-bad-5 src-308 `tok-308 `tre-308)
1742++ test-lex-rune-layout-bad-6
1800++ test-lex-rune-layout-bad-6
1743− (check ~.lex-rune-layout-bad-6 src-307 `tok-307 `tre-307)
1801+ (check ~.lex-rune-layout-bad-6 src-309 `tok-309 `tre-309)
1744++ test-lex-rune-layout-bad-7
1802++ test-lex-rune-layout-bad-7
1745− (check ~.lex-rune-layout-bad-7 src-308 `tok-308 `tre-308)
1803+ (check ~.lex-rune-layout-bad-7 src-310 `tok-310 `tre-310)
1746++ test-lex-rune-layout-bad-8
1804++ test-lex-rune-layout-bad-8
1747− (check ~.lex-rune-layout-bad-8 src-309 `tok-309 `tre-309)
1805+ (check ~.lex-rune-layout-bad-8 src-311 `tok-311 `tre-311)
1748++ test-lex-rune-layout-bad-9
1806++ test-lex-rune-layout-bad-9
1749− (check ~.lex-rune-layout-bad-9 src-310 `tok-310 `tre-310)
1807+ (check ~.lex-rune-layout-bad-9 src-312 `tok-312 `tre-312)
1750++ test-lex-rune-layout-ok-1
1808++ test-lex-rune-layout-ok-1
1751− (check ~.lex-rune-layout-ok-1 src-311 `tok-311 `tre-311)
1809+ (check ~.lex-rune-layout-ok-1 src-313 `tok-313 `tre-313)
1752++ test-lex-rune-layout-ok-2
1810++ test-lex-rune-layout-ok-2
1753− (check ~.lex-rune-layout-ok-2 src-312 `tok-312 `tre-312)
1811+ (check ~.lex-rune-layout-ok-2 src-314 `tok-314 `tre-314)
1754++ test-lex-ship-bad-1
1812++ test-lex-ship-bad-1
1755− (check ~.lex-ship-bad-1 src-313 `tok-313 `tre-313)
1813+ (check ~.lex-ship-bad-1 src-315 `tok-315 `tre-315)
1756++ test-lex-ship-ok-1
1814++ test-lex-ship-ok-1
1757− (check ~.lex-ship-ok-1 src-314 `tok-314 `tre-314)
1815+ (check ~.lex-ship-ok-1 src-316 `tok-316 `tre-316)
1758++ test-lex-spacing-bad-1
1816++ test-lex-spacing-bad-1
1759− (check ~.lex-spacing-bad-1 src-315 `tok-315 `tre-315)
1817+ (check ~.lex-spacing-bad-1 src-317 `tok-317 `tre-317)
1760++ test-lex-spacing-bad-2
1818++ test-lex-spacing-bad-2
1761− (check ~.lex-spacing-bad-2 src-316 `tok-316 `tre-316)
1819+ (check ~.lex-spacing-bad-2 src-318 `tok-318 `tre-318)
1762++ test-lex-spacing-ok-1
1820++ test-lex-spacing-ok-1
1763− (check ~.lex-spacing-ok-1 src-317 `tok-317 `tre-317)
1821+ (check ~.lex-spacing-ok-1 src-319 `tok-319 `tre-319)
1764++ test-lex-spacing-ok-2
1822++ test-lex-spacing-ok-2
1765− (check ~.lex-spacing-ok-2 src-318 `tok-318 `tre-318)
1823+ (check ~.lex-spacing-ok-2 src-320 `tok-320 `tre-320)
1766++ test-lex-spacing-ok-3
1824++ test-lex-spacing-ok-3
1767− (check ~.lex-spacing-ok-3 src-319 `tok-319 `tre-319)
1825+ (check ~.lex-spacing-ok-3 src-321 `tok-321 `tre-321)
1768++ test-lex-string-bad-1
1826++ test-lex-string-bad-1
1769− (check ~.lex-string-bad-1 src-320 `tok-320 `tre-320)
1827+ (check ~.lex-string-bad-1 src-322 `tok-322 `tre-322)
1770++ test-lex-string-bad-2
1828++ test-lex-string-bad-2
1771− (check ~.lex-string-bad-2 src-321 `tok-321 `tre-321)
1829+ (check ~.lex-string-bad-2 src-323 `tok-323 `tre-323)
1772++ test-lex-string-ok-1
1830++ test-lex-string-ok-1
1773− (check ~.lex-string-ok-1 src-322 `tok-322 `tre-322)
1831+ (check ~.lex-string-ok-1 src-324 `tok-324 `tre-324)
1774++ test-lex-term-bad-1
1832++ test-lex-term-bad-1
1775− (check ~.lex-term-bad-1 src-323 `tok-323 `tre-323)
1833+ (check ~.lex-term-bad-1 src-325 `tok-325 `tre-325)
1776++ test-lex-term-bad-10
1834++ test-lex-term-bad-10
1777− (check ~.lex-term-bad-10 src-324 `tok-324 `tre-324)
1835+ (check ~.lex-term-bad-10 src-326 `tok-326 `tre-326)
1778++ test-lex-term-bad-11
1836++ test-lex-term-bad-11
1779− (check ~.lex-term-bad-11 src-325 `tok-325 `tre-325)
1837+ (check ~.lex-term-bad-11 src-327 `tok-327 `tre-327)
1780++ test-lex-term-bad-12
1838++ test-lex-term-bad-12
1781− (check ~.lex-term-bad-12 src-326 `tok-326 `tre-326)
1839+ (check ~.lex-term-bad-12 src-328 `tok-328 `tre-328)
1782++ test-lex-term-bad-13
1840++ test-lex-term-bad-13
1783− (check ~.lex-term-bad-13 src-327 `tok-327 `tre-327)
1841+ (check ~.lex-term-bad-13 src-329 `tok-329 `tre-329)
1784++ test-lex-term-bad-14
1842++ test-lex-term-bad-14
1785− (check ~.lex-term-bad-14 src-328 `tok-328 `tre-328)
1843+ (check ~.lex-term-bad-14 src-330 `tok-330 `tre-330)
1786++ test-lex-term-bad-15
1844++ test-lex-term-bad-15
1787− (check ~.lex-term-bad-15 src-329 `tok-329 `tre-329)
1845+ (check ~.lex-term-bad-15 src-331 `tok-331 `tre-331)
1788++ test-lex-term-bad-2
1846++ test-lex-term-bad-2
1789− (check ~.lex-term-bad-2 src-330 `tok-330 `tre-330)
1847+ (check ~.lex-term-bad-2 src-332 `tok-332 `tre-332)
1790++ test-lex-term-bad-3
1848++ test-lex-term-bad-3
1791− (check ~.lex-term-bad-3 src-331 `tok-331 `tre-331)
1849+ (check ~.lex-term-bad-3 src-333 `tok-333 `tre-333)
1792++ test-lex-term-bad-4
1850++ test-lex-term-bad-4
1793− (check ~.lex-term-bad-4 src-332 `tok-332 `tre-332)
1851+ (check ~.lex-term-bad-4 src-334 `tok-334 `tre-334)
1794++ test-lex-term-bad-5
1852++ test-lex-term-bad-5
1795− (check ~.lex-term-bad-5 src-333 `tok-333 `tre-333)
1853+ (check ~.lex-term-bad-5 src-335 `tok-335 `tre-335)
1796++ test-lex-term-bad-6
1854++ test-lex-term-bad-6
1797− (check ~.lex-term-bad-6 src-334 `tok-334 `tre-334)
1855+ (check ~.lex-term-bad-6 src-336 `tok-336 `tre-336)
1798++ test-lex-term-bad-7
1856++ test-lex-term-bad-7
1799− (check ~.lex-term-bad-7 src-335 `tok-335 `tre-335)
1857+ (check ~.lex-term-bad-7 src-337 `tok-337 `tre-337)
1800++ test-lex-term-bad-8
1858++ test-lex-term-bad-8
1801− (check ~.lex-term-bad-8 src-336 `tok-336 `tre-336)
1859+ (check ~.lex-term-bad-8 src-338 `tok-338 `tre-338)
1802++ test-lex-term-bad-9
1860++ test-lex-term-bad-9
1803− (check ~.lex-term-bad-9 src-337 `tok-337 `tre-337)
1861+ (check ~.lex-term-bad-9 src-339 `tok-339 `tre-339)
1804++ test-lex-term-ok-1
1862++ test-lex-term-ok-1
1805− (check ~.lex-term-ok-1 src-338 `tok-338 `tre-338)
1863+ (check ~.lex-term-ok-1 src-340 `tok-340 `tre-340)
1806++ test-lex-tight-change-bad-1
1864++ test-lex-tight-change-bad-1
1807− (check ~.lex-tight-change-bad-1 src-339 `tok-339 `tre-339)
1865+ (check ~.lex-tight-change-bad-1 src-341 `tok-341 `tre-341)
1808++ test-lex-tight-change-bad-2
1866++ test-lex-tight-change-bad-2
1809− (check ~.lex-tight-change-bad-2 src-340 `tok-340 `tre-340)
1867+ (check ~.lex-tight-change-bad-2 src-342 `tok-342 `tre-342)
1810++ test-lex-tight-change-bad-3
1868++ test-lex-tight-change-bad-3
1811− (check ~.lex-tight-change-bad-3 src-341 `tok-341 `tre-341)
1869+ (check ~.lex-tight-change-bad-3 src-343 `tok-343 `tre-343)
1812++ test-lex-tight-change-bad-4
1870++ test-lex-tight-change-bad-4
1813− (check ~.lex-tight-change-bad-4 src-342 `tok-342 `tre-342)
1871+ (check ~.lex-tight-change-bad-4 src-344 `tok-344 `tre-344)
1814++ test-lex-tight-change-bad-5
1872++ test-lex-tight-change-bad-5
1815− (check ~.lex-tight-change-bad-5 src-343 `tok-343 `tre-343)
1873+ (check ~.lex-tight-change-bad-5 src-345 `tok-345 `tre-345)
1816++ test-lex-tight-change-bad-6
1874++ test-lex-tight-change-bad-6
1817− (check ~.lex-tight-change-bad-6 src-344 `tok-344 `tre-344)
1875+ (check ~.lex-tight-change-bad-6 src-346 `tok-346 `tre-346)
1818++ test-lex-tight-change-bad-7
1876++ test-lex-tight-change-bad-7
1819− (check ~.lex-tight-change-bad-7 src-345 `tok-345 `tre-345)
1877+ (check ~.lex-tight-change-bad-7 src-347 `tok-347 `tre-347)
1820++ test-lex-tight-change-bad-8
1878++ test-lex-tight-change-bad-8
1821− (check ~.lex-tight-change-bad-8 src-346 `tok-346 `tre-346)
1879+ (check ~.lex-tight-change-bad-8 src-348 `tok-348 `tre-348)
1822++ test-lex-tight-change-bad-9
1880++ test-lex-tight-change-bad-9
1823− (check ~.lex-tight-change-bad-9 src-347 `tok-347 `tre-347)
1881+ (check ~.lex-tight-change-bad-9 src-349 `tok-349 `tre-349)
1824++ test-lex-tight-change-ok-1
1882++ test-lex-tight-change-ok-1
1825− (check ~.lex-tight-change-ok-1 src-348 `tok-348 `tre-348)
1883+ (check ~.lex-tight-change-ok-1 src-350 `tok-350 `tre-350)
1826++ test-lex-tight-ctor-bad-1
1884++ test-lex-tight-ctor-bad-1
1827− (check ~.lex-tight-ctor-bad-1 src-349 `tok-349 `tre-349)
1885+ (check ~.lex-tight-ctor-bad-1 src-351 `tok-351 `tre-351)
1828++ test-lex-tight-ctor-bad-2
1886++ test-lex-tight-ctor-bad-2
1829− (check ~.lex-tight-ctor-bad-2 src-350 `tok-350 `tre-350)
1887+ (check ~.lex-tight-ctor-bad-2 src-352 `tok-352 `tre-352)
1830++ test-lex-tight-ctor-ok-1
1888++ test-lex-tight-ctor-ok-1
1831− (check ~.lex-tight-ctor-ok-1 src-351 `tok-351 `tre-351)
1889+ (check ~.lex-tight-ctor-ok-1 src-353 `tok-353 `tre-353)
1832++ test-lex-tight-opener-bad-1
1890++ test-lex-tight-opener-bad-1
1833− (check ~.lex-tight-opener-bad-1 src-352 `tok-352 `tre-352)
1891+ (check ~.lex-tight-opener-bad-1 src-354 `tok-354 `tre-354)
1834++ test-lex-tight-opener-bad-2
1892++ test-lex-tight-opener-bad-2
1835− (check ~.lex-tight-opener-bad-2 src-353 `tok-353 `tre-353)
1893+ (check ~.lex-tight-opener-bad-2 src-355 `tok-355 `tre-355)
1836++ test-lex-tight-opener-bad-3
1894++ test-lex-tight-opener-bad-3
1837− (check ~.lex-tight-opener-bad-3 src-354 `tok-354 `tre-354)
1895+ (check ~.lex-tight-opener-bad-3 src-356 `tok-356 `tre-356)
1838++ test-lex-tight-opener-bad-4
1896++ test-lex-tight-opener-bad-4
1839− (check ~.lex-tight-opener-bad-4 src-355 `tok-355 `tre-355)
1897+ (check ~.lex-tight-opener-bad-4 src-357 `tok-357 `tre-357)
1840++ test-lex-tight-opener-ok-1
1898++ test-lex-tight-opener-ok-1
1841− (check ~.lex-tight-opener-ok-1 src-356 `tok-356 `tre-356)
1899+ (check ~.lex-tight-opener-ok-1 src-358 `tok-358 `tre-358)
1842++ test-lex-tight-pair-bad-1
1900++ test-lex-tight-pair-bad-1
1843− (check ~.lex-tight-pair-bad-1 src-357 `tok-357 `tre-357)
1901+ (check ~.lex-tight-pair-bad-1 src-359 `tok-359 `tre-359)
1844++ test-lex-tight-pair-bad-2
1902++ test-lex-tight-pair-bad-2
1845− (check ~.lex-tight-pair-bad-2 src-358 `tok-358 `tre-358)
1903+ (check ~.lex-tight-pair-bad-2 src-360 `tok-360 `tre-360)
1846++ test-lex-tight-pair-bad-3
1904++ test-lex-tight-pair-bad-3
1847− (check ~.lex-tight-pair-bad-3 src-359 `tok-359 `tre-359)
1905+ (check ~.lex-tight-pair-bad-3 src-361 `tok-361 `tre-361)
1848++ test-lex-tight-pair-ok-1
1906++ test-lex-tight-pair-ok-1
1849− (check ~.lex-tight-pair-ok-1 src-360 `tok-360 `tre-360)
1907+ (check ~.lex-tight-pair-ok-1 src-362 `tok-362 `tre-362)
1850++ test-lex-tight-qath-bad-1
1908++ test-lex-tight-qath-bad-1
1851− (check ~.lex-tight-qath-bad-1 src-361 `tok-361 `tre-361)
1909+ (check ~.lex-tight-qath-bad-1 src-363 `tok-363 `tre-363)
1852++ test-lex-tight-qath-bad-2
1910++ test-lex-tight-qath-bad-2
1853− (check ~.lex-tight-qath-bad-2 src-362 `tok-362 `tre-362)
1911+ (check ~.lex-tight-qath-bad-2 src-364 `tok-364 `tre-364)
1854++ test-lex-tight-qath-bad-3
1912++ test-lex-tight-qath-bad-3
1855− (check ~.lex-tight-qath-bad-3 src-363 `tok-363 `tre-363)
1913+ (check ~.lex-tight-qath-bad-3 src-365 `tok-365 `tre-365)
1856++ test-lex-tight-qath-ok-1
1914++ test-lex-tight-qath-ok-1
1857− (check ~.lex-tight-qath-ok-1 src-364 `tok-364 `tre-364)
1915+ (check ~.lex-tight-qath-ok-1 src-366 `tok-366 `tre-366)
1858++ test-lex-tight-unit-bad-1
1916++ test-lex-tight-unit-bad-1
1859− (check ~.lex-tight-unit-bad-1 src-365 `tok-365 `tre-365)
1917+ (check ~.lex-tight-unit-bad-1 src-367 `tok-367 `tre-367)
1860++ test-lex-tight-unit-ok-1
1918++ test-lex-tight-unit-ok-1
1861− (check ~.lex-tight-unit-ok-1 src-366 `tok-366 `tre-366)
1919+ (check ~.lex-tight-unit-ok-1 src-368 `tok-368 `tre-368)
1862++ test-lex-tight-wing-bad-1
1920++ test-lex-tight-wing-bad-1
1863− (check ~.lex-tight-wing-bad-1 src-367 `tok-367 `tre-367)
1921+ (check ~.lex-tight-wing-bad-1 src-369 `tok-369 `tre-369)
1864++ test-lex-tight-wing-ok-1
1922++ test-lex-tight-wing-ok-1
1865− (check ~.lex-tight-wing-ok-1 src-368 `tok-368 `tre-368)
1923+ (check ~.lex-tight-wing-ok-1 src-370 `tok-370 `tre-370)
1924+++ test-prelude-core-functions
1925+ (weld (check ~.prelude-core-functions src-371 `tok-371 `tre-371) (check-types ~.prelude-core-functions ~[%tests %golden ~.prelude-core-functions %source %jibb] src-371 `typ-371))
1926+++ test-types-partial-apply
1927+ (weld (check ~.types-partial-apply src-372 `tok-372 `tre-372) (check-types ~.types-partial-apply ~[%tests %golden ~.types-partial-apply %source %jibb] src-372 `typ-372))
1928+++ test-types-partial-aura
1929+ (weld (check ~.types-partial-aura src-373 `tok-373 `tre-373) (check-types ~.types-partial-aura ~[%tests %golden ~.types-partial-aura %source %jibb] src-373 `typ-373))
1930+++ test-types-partial-aura-generalization
1931+ (weld (check ~.types-partial-aura-generalization src-374 `tok-374 `tre-374) (check-types ~.types-partial-aura-generalization ~[%tests %golden ~.types-partial-aura-generalization %source %jibb] src-374 `typ-374))
1932+++ test-types-partial-explicit-capital
1933+ (weld (check ~.types-partial-explicit-capital src-375 `tok-375 `tre-375) (check-types ~.types-partial-explicit-capital ~[%tests %golden ~.types-partial-explicit-capital %source %jibb] src-375 `typ-375))
1934+++ test-types-partial-forward
1935+ (weld (check ~.types-partial-forward src-376 `tok-376 `tre-376) (check-types ~.types-partial-forward ~[%tests %golden ~.types-partial-forward %source %jibb] src-376 `typ-376))
1936+++ test-types-partial-generalization
1937+ (weld (check ~.types-partial-generalization src-377 `tok-377 `tre-377) (check-types ~.types-partial-generalization ~[%tests %golden ~.types-partial-generalization %source %jibb] src-377 `typ-377))
1938+++ test-types-partial-identity
1939+ (weld (check ~.types-partial-identity src-378 `tok-378 `tre-378) (check-types ~.types-partial-identity ~[%tests %golden ~.types-partial-identity %source %jibb] src-378 `typ-378))
1940+++ test-types-partial-occurs
1941+ (weld (check ~.types-partial-occurs src-379 `tok-379 `tre-379) (check-types ~.types-partial-occurs ~[%tests %golden ~.types-partial-occurs %source %jibb] src-379 `typ-379))
1942+++ test-types-partial-projection
1943+ (weld (check ~.types-partial-projection src-380 `tok-380 `tre-380) (check-types ~.types-partial-projection ~[%tests %golden ~.types-partial-projection %source %jibb] src-380 `typ-380))
1944+++ test-types-partial-shared-tvar
1945+ (weld (check ~.types-partial-shared-tvar src-381 `tok-381 `tre-381) (check-types ~.types-partial-shared-tvar ~[%tests %golden ~.types-partial-shared-tvar %source %jibb] src-381 `typ-381))
1946+++ test-types-partial-unresolved-tag
1947+ (weld (check ~.types-partial-unresolved-tag src-382 `tok-382 `tre-382) (check-types ~.types-partial-unresolved-tag ~[%tests %golden ~.types-partial-unresolved-tag %source %jibb] src-382 `typ-382))
1866::
1948::
1867:: +check: run golden:jibb on a case and compare both outputs
1949:: +check: run golden:jibb on a case and compare both outputs
1868::
1950::
1869++ check
1951++ check
1870 |= [case=@ta src=@t tokens=(unit wain) tree=(unit wain)]
1952 |= [case=@ta src=@t tokens=(unit wain) tree=(unit wain)]
1871 ^- tang
1953 ^- tang
1954+ (check-at case /tests/golden/[case]/source/jibb src tokens tree)
1955+::
1956+++ check-at
1957+ |= [case=@ta at=path src=@t tokens=(unit wain) tree=(unit wain)]
1958+ ^- tang
1872− =/ out=[tokens=@t tree=@t]
1959+ =/ out=[tokens=@t tree=@t] (golden:jibb at src)
1873− (golden:jibb /tests/golden/[case]/source/jibb src)
1874 %+ weld
1960 %+ weld
1875 (compare (file case "tokens.txt") tokens tokens.out)
1961 (compare (file case "tokens.txt") tokens tokens.out)
1876 (compare (file case "tree.txt") tree tree.out)
1962 (compare (file case "tree.txt") tree tree.out)
@@ -1914,4 +2000,9 @@
1914 ?: =('' (snag n lines))
2000 ?: =('' (snag n lines))
1915 "(an empty line)"
2001 "(an empty line)"
1916 (trip (snag n lines))
2002 (trip (snag n lines))
2003+::
2004+++ check-types
2005+ |= [case=@ta at=path src=@t want=(unit wain)]
2006+ ^- tang
2007+ (compare (file case "types.txt") want (golden-types:jibb at src))
1917--
2008--
tools/golden+47−23
@@ -9,7 +9,9 @@ parser). The runner builds one Hoon program, `!: => <library>
9 ++ golden |= [file=path src=@t] ^- [tokens=@t tree=@t]
9 ++ golden |= [file=path src=@t] ^- [tokens=@t tree=@t]
10
10
11on every case, each under mule so that one crash doesn't stop the rest,
11on every case, each under mule so that one crash doesn't stop the rest,
12−with file set to the case's Clay path, /tests/golden/<case>/source/jibb.
12+with file set to the case's Clay path, /tests/golden/<case>/source/jibb,
13+or its logical /ui path from path.txt. Cases with an expect-types: line
14+or types.txt also call +golden-types and compare its output with types.txt.
13It runs the program with `urbit eval`, decodes the jammed result, and
15It runs the program with `urbit eval`, decodes the jammed result, and
14compares each output with its file, which holds the output plus one
16compares each output with its file, which holds the output plus one
15trailing newline.
17trailing newline.
@@ -34,6 +36,7 @@ sys.dont_write_bytecode = True
34sys.path.insert(0, os.path.dirname(os.path.realpath(__file__)))
36sys.path.insert(0, os.path.dirname(os.path.realpath(__file__)))
35
37
36import urbit_eval as ue # noqa: E402
38import urbit_eval as ue # noqa: E402
39+import golden_case # noqa: E402
37from noun import atom_to_bytes # noqa: E402
40from noun import atom_to_bytes # noqa: E402
38
41
39DEFAULT_DIR = os.path.join(ue.ROOT, 'tests', 'golden')
42DEFAULT_DIR = os.path.join(ue.ROOT, 'tests', 'golden')
@@ -43,7 +46,7 @@ KNOT = re.compile(r'^[a-z0-9\-.~_]+$')
43HARNESS = r""":: The harness tools/golden writes after the library. It runs
46HARNESS = r""":: The harness tools/golden writes after the library. It runs
44:: golden:lib on each case under mule and returns one cord of fields,
47:: golden:lib on each case under mule and returns one cord of fields,
45:: each <length>:<bytes>, first jibb-golden and the case count, then
48:: each <length>:<bytes>, first jibb-golden and the case count, then
46−:: per case its name, ok or crash, tokens and tree.
49+:: per case its name, ok or crash, tokens, tree and types.
47::
50::
48=> [lib=. ..zuse]
51=> [lib=. ..zuse]
49|^ %+ rap 3
52|^ %+ rap 3
@@ -52,14 +55,15 @@ HARNESS = r""":: The harness tools/golden writes after the library. It runs
52 ==
55 ==
53::
56::
54++ run
57++ run
55− |= [name=@t src=@t]
58+ |= [name=@t metadata=[logical=(unit path) check=?] src=@t]
56 ^- @t
59 ^- @t
60+ =/ at=path ?~(logical.metadata (file name) u.logical.metadata)
57− =/ res (mule |.((golden:lib (file name) src)))
61+ =/ res (mule |.([(golden:lib at src) {types-expr}]))
58 ?: ?=(%| -.res)
62 ?: ?=(%| -.res)
59 =/ why=@t (crash p.res)
63 =/ why=@t (crash p.res)
60− (fields ~[name 'crash' why why])
64+ (fields ~[name 'crash' why why why])
61− =/ out=[tokens=@t tree=@t] p.res
65+ =/ out=[[tokens=@t tree=@t] types=@t] p.res
62− (fields ~[name 'ok' tokens.out tree.out])
66+ (fields ~[name 'ok' tokens.out tree.out types.out])
63::
67::
64++ file
68++ file
65 |= name=@
69 |= name=@
@@ -102,6 +106,11 @@ class Case:
102 self.name = name
106 self.name = name
103 self.folder = folder
107 self.folder = folder
104 self.source_path = os.path.join(folder, 'source.jibb')
108 self.source_path = os.path.join(folder, 'source.jibb')
109+ try:
110+ self.logical_path = golden_case.source_path(folder)
111+ except ValueError as e:
112+ raise ue.ToolError(str(e))
113+ self.want_types = golden_case.wants_types(folder)
105 with open(self.source_path, 'rb') as f:
114 with open(self.source_path, 'rb') as f:
106 self.source = f.read()
115 self.source = f.read()
107 self.crashed = False
116 self.crashed = False
@@ -134,7 +143,10 @@ def run_lines(case):
134 into several cords, as Hoon reads a long cord literal in about
143 into several cords, as Hoon reads a long cord literal in about
135 quadratic time (ue.cord_pieces)."""
144 quadratic time (ue.cord_pieces)."""
136 lines = ue.cord_pieces(case.source)
145 lines = ue.cord_pieces(case.source)
146+ out = [' %%^ run %s [%s %s]' % (
137− out = [' %%+ run %s' % ue.cord_literal(case.name.encode()),
147+ ue.cord_literal(case.name.encode()),
148+ '`' + case.logical_path if case.logical_path else '~',
149+ '%.y' if case.want_types else '%.n'),
138 ' %- text',
150 ' %- text',
139 ' :~ ' + ue.cord_literal(lines[0])]
151 ' :~ ' + ue.cord_literal(lines[0])]
140 out += [' ' + ue.cord_literal(line) for line in lines[1:]]
152 out += [' ' + ue.cord_literal(line) for line in lines[1:]]
@@ -146,7 +158,11 @@ def golden_program(lib_path, cases):
146 prog = ue.library_program(lib_path)
158 prog = ue.library_program(lib_path)
147 runs = '\n'.join(line for case in cases for line in run_lines(case))
159 runs = '\n'.join(line for case in cases for line in run_lines(case))
148 prog.add(HARNESS.replace('{count}', str(len(cases)))
160 prog.add(HARNESS.replace('{count}', str(len(cases)))
149− .replace('{runs}', runs), '(harness)', 'harness')
161+ .replace('{runs}', runs)
162+ .replace('{types-expr}',
163+ '?:(check.metadata (golden-types:lib at src) \'\')'
164+ if any(c.want_types for c in cases) else "''"),
165+ '(harness)', 'harness')
150 return prog
166 return prog
151
167
152
168
@@ -179,10 +195,10 @@ def decode(prog, noun, cases):
179 except ValueError as e:
195 except ValueError as e:
180 raise ue.ToolError('the harness output is malformed: %s' % e)
196 raise ue.ToolError('the harness output is malformed: %s' % e)
181 if fields[:2] != [MAGIC, str(len(cases)).encode()] or \
197 if fields[:2] != [MAGIC, str(len(cases)).encode()] or \
182− len(fields) != 2 + 4 * len(cases):
198+ len(fields) != 2 + 5 * len(cases):
183 raise ue.ToolError('the harness output has the wrong shape')
199 raise ue.ToolError('the harness output has the wrong shape')
184 for i, case in enumerate(cases):
200 for i, case in enumerate(cases):
185− name, status, tokens, tree = fields[2 + 4 * i:6 + 4 * i]
201+ name, status, tokens, tree, types = fields[2 + 5 * i:7 + 5 * i]
186 if name != case.name.encode():
202 if name != case.name.encode():
187 raise ue.ToolError('the harness output is out of order at %s'
203 raise ue.ToolError('the harness output is out of order at %s'
188 % case.name)
204 % case.name)
@@ -190,8 +206,10 @@ def decode(prog, noun, cases):
190 if case.crashed:
206 if case.crashed:
191 tokens, case.crash_at = crash_text(
207 tokens, case.crash_at = crash_text(
192 prog, tokens.decode('utf-8', 'surrogateescape').split('\n'))
208 prog, tokens.decode('utf-8', 'surrogateescape').split('\n'))
193− tree = tokens
209+ tree = types = tokens
194 case.outputs = {'tokens': tokens, 'tree': tree}
210 case.outputs = {'tokens': tokens, 'tree': tree}
211+ if case.want_types:
212+ case.outputs['types'] = types
195
213
196
214
197def eval_crash(prog, res, case):
215def eval_crash(prog, res, case):
@@ -199,6 +217,8 @@ def eval_crash(prog, res, case):
199 case.crashed = True
217 case.crashed = True
200 out, case.crash_at = crash_text(prog, ['CRASH', res.describe()] + res.trace)
218 out, case.crash_at = crash_text(prog, ['CRASH', res.describe()] + res.trace)
201 case.outputs = {'tokens': out, 'tree': out}
219 case.outputs = {'tokens': out, 'tree': out}
220+ if case.want_types:
221+ case.outputs['types'] = out
202
222
203
223
204def run_batch(lib_path, cases, opts, top=True):
224def run_batch(lib_path, cases, opts, top=True):
@@ -214,12 +234,16 @@ def run_batch(lib_path, cases, opts, top=True):
214 return
234 return
215 if res.is_compile_error():
235 if res.is_compile_error():
216 lib = ue.display_path(lib_path)
236 lib = ue.display_path(lib_path)
237+ signature = ("error: the golden harness doesn't compile "
238+ "against %s, whose golden arm must be\n"
239+ " ++ golden |= [file=path src=@t] ^- [tokens=@t tree=@t]"
240+ % lib)
241+ if any(c.want_types for c in cases):
242+ signature += ("\nand whose golden-types arm must be\n"
243+ " ++ golden-types |= [file=path src=@t] ^- @t")
217 report = ue.failure_report(
244 report = ue.failure_report(
218 prog, res, "error: %s doesn't compile" % lib,
245 prog, res, "error: %s doesn't compile" % lib,
219− harness_headline="error: the golden harness doesn't compile "
246+ harness_headline=signature)
220− "against %s, whose golden arm must be\n"
221− " ++ golden |= [file=path src=@t] ^- [tokens=@t tree=@t]"
222− % lib)
223 hint = ue.lib_hint(ue.read_text(lib_path))
247 hint = ue.lib_hint(ue.read_text(lib_path))
224 raise ue.ToolError(report + ('\n\n' + hint if hint else ''))
248 raise ue.ToolError(report + ('\n\n' + hint if hint else ''))
225 if len(cases) == 1:
249 if len(cases) == 1:
@@ -290,7 +314,7 @@ def compare(case):
290 case.crash_at.excerpt(indent=' ')]
314 case.crash_at.excerpt(indent=' ')]
291 return False, out
315 return False, out
292 problems = []
316 problems = []
293− for kind in ('tokens', 'tree'):
317+ for kind in case.outputs:
294 path = os.path.join(case.folder, kind + '.txt')
318 path = os.path.join(case.folder, kind + '.txt')
295 want = case.outputs[kind] + b'\n'
319 want = case.outputs[kind] + b'\n'
296 if os.path.isfile(path):
320 if os.path.isfile(path):
@@ -312,7 +336,7 @@ def compare(case):
312def update(case):
336def update(case):
313 """Write a case's outputs; returns the paths written."""
337 """Write a case's outputs; returns the paths written."""
314 written = []
338 written = []
315− for kind in ('tokens', 'tree'):
339+ for kind in case.outputs:
316 path = os.path.join(case.folder, kind + '.txt')
340 path = os.path.join(case.folder, kind + '.txt')
317 want = case.outputs[kind] + b'\n'
341 want = case.outputs[kind] + b'\n'
318 try:
342 try:
@@ -329,7 +353,7 @@ def update(case):
329
353
330def show(case):
354def show(case):
331 out = []
355 out = []
332− for kind in ('tokens', 'tree'):
356+ for kind in case.outputs:
333 out.append(colour('1', '==> %s: %s <==' % (case.name, kind)))
357 out.append(colour('1', '==> %s: %s <==' % (case.name, kind)))
334 out.append(case.outputs[kind].decode('utf-8', 'surrogateescape'))
358 out.append(case.outputs[kind].decode('utf-8', 'surrogateescape'))
335 return out
359 return out
@@ -341,19 +365,19 @@ def main(argv):
341 formatter_class=argparse.RawDescriptionHelpFormatter,
365 formatter_class=argparse.RawDescriptionHelpFormatter,
342 description='Run the golden tests (tests/golden/<case>/source.jibb) '
366 description='Run the golden tests (tests/golden/<case>/source.jibb) '
343 'through urbit eval and compare the outputs with '
367 'through urbit eval and compare the outputs with '
344− 'tokens.txt and tree.txt.',
368+ 'tokens.txt, tree.txt and any opted-in types.txt.',
345 epilog=EPILOG)
369 epilog=EPILOG)
346 ap.add_argument('--dir', default=DEFAULT_DIR,
370 ap.add_argument('--dir', default=DEFAULT_DIR,
347 help='the folder of cases (default: tests/golden). The '
371 help='the folder of cases (default: tests/golden). The '
348− 'file path passed to golden stays '
372+ 'file path passed to golden defaults to '
349− '/tests/golden/<case>/source/jibb')
373+ '/tests/golden/<case>/source/jibb; path.txt overrides it')
350 ap.add_argument('--case', action='append', default=[], metavar='GLOB',
374 ap.add_argument('--case', action='append', default=[], metavar='GLOB',
351 help='only cases whose name matches GLOB; repeatable')
375 help='only cases whose name matches GLOB; repeatable')
352 ap.add_argument('--lib', default=ue.DEFAULT_LIB, metavar='PATH',
376 ap.add_argument('--lib', default=ue.DEFAULT_LIB, metavar='PATH',
353 help='the library (default: jibb-dev/lib/jibb.hoon)')
377 help='the library (default: jibb-dev/lib/jibb.hoon)')
354 mode = ap.add_mutually_exclusive_group()
378 mode = ap.add_mutually_exclusive_group()
355 mode.add_argument('--update', action='store_true',
379 mode.add_argument('--update', action='store_true',
356− help='write the outputs to tokens.txt and tree.txt')
380+ help='write tokens.txt, tree.txt and any opted-in types.txt')
357 mode.add_argument('--show', action='store_true',
381 mode.add_argument('--show', action='store_true',
358 help='print the outputs without comparing')
382 help='print the outputs without comparing')
359 ap.add_argument('--timeout', type=float, default=600, metavar='SECONDS',
383 ap.add_argument('--timeout', type=float, default=600, metavar='SECONDS',
tools/golden_case.pynew file+35
@@ -0,0 +1,35 @@
1+"""Metadata shared by the eval and ship golden runners."""
2+import os
3+import re
4+
5+KNOT = re.compile(r'^[a-z0-9.\-_~]+$')
6+
7+
8+def source_path(folder):
9+ """The optional logical /ui path as a Hoon path expression."""
10+ filename = os.path.join(folder, 'path.txt')
11+ try:
12+ with open(filename, encoding='utf-8') as f:
13+ raw = f.read()
14+ except FileNotFoundError:
15+ return None
16+ except UnicodeError:
17+ raise ValueError('%s: path must be UTF-8' % filename)
18+ path = raw[:-1] if raw.endswith('\n') else raw
19+ parts = path.split('/')
20+ if len(parts) < 3 or parts[:2] != ['', 'ui'] or not parts[-1].endswith('.jibb'):
21+ raise ValueError('%s: expected an absolute /ui/.../*.jibb path' % filename)
22+ parts[-1] = parts[-1][:-5]
23+ if any(not KNOT.fullmatch(p) or p in ('.', '..') for p in parts[1:]):
24+ raise ValueError('%s: path components must be nonempty knots' % filename)
25+ return '~[' + ' '.join('~.' + p for p in parts[1:] + ['jibb']) + ']'
26+
27+
28+def wants_types(folder):
29+ """An expect-types line keeps a deleted expected file from disabling a test."""
30+ try:
31+ with open(os.path.join(folder, 'about.txt'), encoding='utf-8') as f:
32+ marked = any(line.startswith('expect-types:') for line in f)
33+ except FileNotFoundError:
34+ marked = False
35+ return marked or os.path.isfile(os.path.join(folder, 'types.txt'))
tools/importer-testnew file+25
@@ -0,0 +1,25 @@
1+#!/usr/bin/env python3
2+"""Compare the Hoon importer's projections with their golden file."""
3+
4+from pathlib import Path
5+import subprocess
6+import sys
7+
8+root = Path(__file__).resolve().parent.parent
9+fixture = root / 'tests' / 'importer'
10+command = [str(root / 'tools' / 'hoon'), '--lib', str(root / 'jibb-dev' / 'lib' / 'jibb-import.hoon'),
11+ '--raw', '--cord', 'small=' + str(fixture / 'small.txt'),
12+ '--cord', 'epic=' + str(fixture / 'tlon-epic.txt'),
13+ '(fixture-output small epic)']
14+result = subprocess.run(command, stdout=subprocess.PIPE)
15+if result.returncode:
16+ sys.exit(result.returncode)
17+expected = (fixture / 'tree.txt').read_bytes()
18+if result.stdout != expected:
19+ import difflib
20+ sys.stderr.writelines(difflib.unified_diff(
21+ expected.decode().splitlines(keepends=True),
22+ result.stdout.decode().splitlines(keepends=True),
23+ fromfile='expected tree.txt', tofile='actual types'))
24+ sys.exit(1)
25+print('importer golden: 16 projections passed')
tools/ship+44−12
@@ -46,6 +46,9 @@ import sys
46import tempfile
46import tempfile
47import time
47import time
48
48
49+sys.path.insert(0, os.path.dirname(os.path.realpath(__file__)))
50+import golden_case
51+
49ROOT = os.path.dirname(os.path.dirname(os.path.realpath(__file__)))
52ROOT = os.path.dirname(os.path.dirname(os.path.realpath(__file__)))
50PIER = os.environ.get('JIBB_PIER', '/root/urbit/zod')
53PIER = os.environ.get('JIBB_PIER', '/root/urbit/zod')
51CLICK = os.environ.get('JIBB_CLICK', '/root/src/tools/pkg/click/click')
54CLICK = os.environ.get('JIBB_CLICK', '/root/src/tools/pkg/click/click')
@@ -928,12 +931,12 @@ TESTS_HEADER = """\
928:: after changing the cases.
931:: after changing the cases.
929::
932::
930:: Each test- arm runs golden:jibb on one case's source.jibb, with the
933:: Each test- arm runs golden:jibb on one case's source.jibb, with the
931−:: file set to the case's Clay path, /tests/golden/<case>/source/jibb,
934+:: file set to /tests/golden/<case>/source/jibb or the logical path in
932−:: and compares the outputs with tokens.txt and tree.txt, which hold
935+:: path.txt, and compares the outputs with tokens.txt and tree.txt.
933−:: the output plus one trailing newline, as in tools/golden. The
936+:: Each file holds the output plus one newline. An expect-types: line
937+:: or types.txt opts a case into golden-types and its types.txt output.
934−:: files come in at build time through /*; a missing tokens.txt or
938+:: Files come in through /*; a missing expected output fails its case.
935−:: tree.txt fails its case. tools/ship test syncs the jibb-dev desk
936−:: and runs these with -test /=jibb-dev=/tests.
939+:: tools/ship test syncs the desk and runs -test /=jibb-dev=/tests.
937::
940::
938:: The .txt files reach Clay through the %txt mark, as lines, so the
941:: The .txt files reach Clay through the %txt mark, as lines, so the
939:: test compares lines: the file's with those of the output plus a
942:: test compares lines: the file's with those of the output plus a
@@ -950,8 +953,12 @@ TESTS_HELPERS = r"""::
950++ check
953++ check
951 |= [case=@ta src=@t tokens=(unit wain) tree=(unit wain)]
954 |= [case=@ta src=@t tokens=(unit wain) tree=(unit wain)]
952 ^- tang
955 ^- tang
956+ (check-at case /tests/golden/[case]/source/jibb src tokens tree)
957+::
958+++ check-at
959+ |= [case=@ta at=path src=@t tokens=(unit wain) tree=(unit wain)]
960+ ^- tang
953− =/ out=[tokens=@t tree=@t]
961+ =/ out=[tokens=@t tree=@t] (golden:jibb at src)
954− (golden:jibb /tests/golden/[case]/source/jibb src)
955 %+ weld
962 %+ weld
956 (compare (file case "tokens.txt") tokens tokens.out)
963 (compare (file case "tokens.txt") tokens tokens.out)
957 (compare (file case "tree.txt") tree tree.out)
964 (compare (file case "tree.txt") tree tree.out)
@@ -1044,7 +1051,14 @@ def generate_tests(golden):
1044 lines.append('/* src-%d %%jibb %s/source/jibb' % (i, base))
1051 lines.append('/* src-%d %%jibb %s/source/jibb' % (i, base))
1045 # a knot literal: a case's name may hold . and _, which a
1052 # a knot literal: a case's name may hold . and _, which a
1046 # path literal in Hoon can't, though /* takes them
1053 # path literal in Hoon can't, though /* takes them
1054+ try:
1055+ logical = golden_case.source_path(folder)
1056+ except ValueError as e:
1057+ raise Unable(str(e))
1047− args = ['~.%s' % name, 'src-%d' % i]
1058+ args = ['~.%s' % name]
1059+ if logical:
1060+ args.append(logical)
1061+ args.append('src-%d' % i)
1048 for kind, face in (('tokens', 'tok'), ('tree', 'tre')):
1062 for kind, face in (('tokens', 'tok'), ('tree', 'tre')):
1049 if os.path.isfile(os.path.join(folder, kind + '.txt')):
1063 if os.path.isfile(os.path.join(folder, kind + '.txt')):
1050 lines.append('/* %s-%d %%txt %s/%s/txt'
1064 lines.append('/* %s-%d %%txt %s/%s/txt'
@@ -1052,13 +1066,31 @@ def generate_tests(golden):
1052 args.append('`%s-%d' % (face, i))
1066 args.append('`%s-%d' % (face, i))
1053 else:
1067 else:
1054 args.append('~')
1068 args.append('~')
1069+ call = '(%s %s)' % ('check-at' if logical else 'check', ' '.join(args))
1070+ if golden_case.wants_types(folder):
1071+ if os.path.isfile(os.path.join(folder, 'types.txt')):
1072+ lines.append('/* typ-%d %%txt %s/types/txt' % (i, base))
1073+ expected_types = '`typ-%d' % i
1074+ else:
1075+ expected_types = '~'
1076+ path = logical or '~[%%tests %%golden ~.%s %%source %%jibb]' % name
1077+ call = '(weld %s (check-types ~.%s %s src-%d %s))' % (
1078+ call, name, path, i, expected_types)
1055− arms.append('++ %s\n (check %s)' % (arm, ' '.join(args)))
1079+ arms.append('++ %s\n %s' % (arm, call))
1056 lines.append('|%')
1080 lines.append('|%')
1057 if arms:
1081 if arms:
1058 lines.append(':: one arm per case')
1082 lines.append(':: one arm per case')
1059 lines.append('::')
1083 lines.append('::')
1060 lines.extend(arms)
1084 lines.extend(arms)
1085+ types_helper = ''
1086+ if any(golden_case.wants_types(folder) for _, folder in cases):
1087+ types_helper = '''::
1088+++ check-types
1089+ |= [case=@ta at=path src=@t want=(unit wain)]
1090+ ^- tang
1091+ (compare (file case "types.txt") want (golden-types:jibb at src))
1092+'''
1061− return '\n'.join(lines) + '\n' + TESTS_HELPERS
1093+ return '\n'.join(lines) + '\n' + TESTS_HELPERS.replace('\n--\n', '\n' + types_helper + '--\n')
1062
1094
1063
1095
1064# ---------------------------------------------------------------- sync
1096# ---------------------------------------------------------------- sync
@@ -1542,7 +1574,7 @@ def cmd_test(ship, args):
1542 f.write(content)
1574 f.write(content)
1543 say('updated %s from %s' % (show(TESTS_LIB), show(golden)))
1575 say('updated %s from %s' % (show(TESTS_LIB), show(golden)))
1544 for _name, folder in golden_cases(golden):
1576 for _name, folder in golden_cases(golden):
1545− for fn in ('tokens.txt', 'tree.txt'):
1577+ for fn in ('tokens.txt', 'tree.txt', 'types.txt'):
1546 data = _read(os.path.join(folder, fn))
1578 data = _read(os.path.join(folder, fn))
1547 if data and not data.endswith(b'\n'):
1579 if data and not data.endswith(b'\n'):
1548 warn("%s has no final newline: the ship can't see that (the "
1580 warn("%s has no final newline: the ship can't see that (the "
tools/testdata/selftest+32−1
@@ -74,7 +74,9 @@ def stub_with(tmp, name, old, new):
74 and the line number of the change."""
74 and the line number of the change."""
75 with open(STUB) as f:
75 with open(STUB) as f:
76 lines = f.read().split('\n')
76 lines = f.read().split('\n')
77− hits = [i for i, l in enumerate(lines) if old in l]
77+ hits = [i for i, l in enumerate(lines) if l == old]
78+ if not hits:
79+ hits = [i for i, l in enumerate(lines) if old in l]
78 assert len(hits) == 1, (old, hits)
80 assert len(hits) == 1, (old, hits)
79 lines[hits[0]] = lines[hits[0]].replace(old, new)
81 lines[hits[0]] = lines[hits[0]].replace(old, new)
80 path = os.path.join(tmp, name)
82 path = os.path.join(tmp, name)
@@ -142,6 +144,35 @@ def check_expected_files_by_hand(c, tmp):
142 % name)
144 % name)
143
145
144
146
147+def check_types_and_logical_path(c, tmp):
148+ cases = copy_cases(tmp)
149+ folder = os.path.join(cases, 'basic')
150+ with open(os.path.join(folder, 'path.txt'), 'w') as f:
151+ f.write('/ui/api/todo.jibb\n')
152+ with open(os.path.join(folder, 'about.txt'), 'a') as f:
153+ f.write('expect-types: partial report\n')
154+ status, out = golden('--dir', cases, '--lib', STUB, '--case', 'basic')
155+ c.expect(status == 1 and 'types.txt is missing' in out,
156+ 'missing types file: %d\n%s' % (status, out))
157+ status, out = golden('--dir', cases, '--lib', STUB, '--update',
158+ '--case', 'basic')
159+ c.expect(status == 0, 'update types: %d\n%s' % (status, out))
160+ actual = read(os.path.join(folder, 'types.txt'))
161+ c.expect(actual.startswith(b'type of /ui/api/todo/jibb:'), repr(actual))
162+ c.expect(read(os.path.join(folder, 'tokens.txt')).startswith(
163+ b'file: /ui/api/todo/jibb\n'), 'wrong logical path in tokens')
164+ status, out = golden('--dir', cases, '--lib', STUB, '--case', 'basic')
165+ c.expect(status == 0, 'compare types: %d\n%s' % (status, out))
166+ with open(os.path.join(folder, 'types.txt'), 'wb') as f:
167+ f.write(b'wrong\n')
168+ status, out = golden('--dir', cases, '--lib', STUB, '--case', 'basic')
169+ c.expect(status == 1 and 'types.txt' in out, 'type mismatch: ' + out)
170+ with open(os.path.join(folder, 'path.txt'), 'w') as f:
171+ f.write('/ui/api/../todo.jibb\n')
172+ status, out = golden('--dir', cases, '--lib', STUB, '--case', 'basic')
173+ c.expect(status == 2, 'invalid path: %d\n%s' % (status, out))
174+
175+
145def check_mismatch_diff(c, tmp):
176def check_mismatch_diff(c, tmp):
146 cases = copy_cases(tmp)
177 cases = copy_cases(tmp)
147 with open(os.path.join(cases, 'basic', 'tree.txt'), 'wb') as f:
178 with open(os.path.join(cases, 'basic', 'tree.txt'), 'wb') as f:
tools/testdata/ship-selftest+45
@@ -124,6 +124,33 @@ def generator_checks(tmp):
124 ('tre-1', 'txt', '/tests/golden/basic/tree/txt') in imports and
124 ('tre-1', 'txt', '/tests/golden/basic/tree/txt') in imports and
125 len(imports) == 3 * len(names) - 1, imports)
125 len(imports) == 3 * len(names) - 1, imports)
126
126
127+ logical = os.path.join(tmp, 'logical')
128+ write_case(logical, 'api', b'++ x\n')
129+ with open(os.path.join(logical, 'api', 'path.txt'), 'w') as f:
130+ f.write('/ui/api/todo.jibb\n')
131+ with open(os.path.join(logical, 'api', 'types.txt'), 'w') as f:
132+ f.write('expected\n')
133+ out = ship.generate_tests(logical)
134+ check('logical path and types output are passed to golden',
135+ '(check-at ~.api ~[~.ui ~.api ~.todo ~.jibb] src-1' in out and
136+ '/* typ-1 %txt /tests/golden/api/types/txt' in out and
137+ '(golden-types:jibb at src)' in out, out)
138+ os.remove(os.path.join(logical, 'api', 'types.txt'))
139+ with open(os.path.join(logical, 'api', 'about.txt'), 'w') as f:
140+ f.write('expect-types: partial report\n')
141+ out = ship.generate_tests(logical)
142+ check('missing opted-in types are passed as a missing expectation',
143+ 'src-1 ~)' in out and '++ check-types' in out, out)
144+ with open(os.path.join(logical, 'api', 'path.txt'), 'w') as f:
145+ f.write('/ui/api/../todo.jibb\n')
146+ try:
147+ ship.generate_tests(logical)
148+ except ship.Unable:
149+ bad_path = True
150+ else:
151+ bad_path = False
152+ check('invalid logical paths are rejected', bad_path)
153+
127 clash = os.path.join(tmp, 'clash')
154 clash = os.path.join(tmp, 'clash')
128 for case in ('a.b', 'a_b', 'a-b', 'Upper', 'has space'):
155 for case in ('a.b', 'a_b', 'a-b', 'Upper', 'has space'):
129 write_case(clash, case, b'++ x\n')
156 write_case(clash, case, b'++ x\n')
@@ -207,6 +234,24 @@ def ship_checks(tmp, many):
207 n['OK'], n['FAILED'], n['CRASHED']) in res.stdout,
234 n['OK'], n['FAILED'], n['CRASHED']) in res.stdout,
208 res.stdout[-400:] + res.stderr)
235 res.stdout[-400:] + res.stderr)
209
236
237+ logical = os.path.join(tmp, 'logical-on-ship')
238+ src = b'++ api\n'
239+ write_case(logical, 'api', src)
240+ folder = os.path.join(logical, 'api')
241+ with open(os.path.join(folder, 'path.txt'), 'w') as f:
242+ f.write('/ui/api/todo.jibb\n')
243+ tokens, _tree = stub_output('api', src)
244+ with open(os.path.join(folder, 'tokens.txt'), 'wb') as f:
245+ f.write(tokens.replace(b'/tests/golden/api/source/jibb',
246+ b'/ui/api/todo/jibb') + b'\n')
247+ with open(os.path.join(folder, 'types.txt'), 'wb') as f:
248+ f.write(b'type of /ui/api/todo/jibb: %d bytes\n' % len(src))
249+ res = run('test', '--stub', '--golden', logical)
250+ check('logical path and type output pass on the ship',
251+ res.returncode == 0 and
252+ 'PASS: 1 OK, 0 FAILED, 0 CRASHED' in res.stdout,
253+ res.stdout[-1500:] + res.stderr)
254+
210 broken = os.path.join(tmp, 'broken.hoon')
255 broken = os.path.join(tmp, 'broken.hoon')
211 with open(STUB) as f:
256 with open(STUB) as f:
212 src = f.read()
257 src = f.read()
tools/testdata/ship-stub.hoon+5
@@ -15,6 +15,11 @@
15:: either would hold up the whole ship.
15:: either would hold up the whole ship.
16::
16::
17|%
17|%
18+++ golden-types
19+ |= [file=path src=@t]
20+ ^- @t
21+ (crip "type of {(spud file)}: {(a-co:co (met 3 src))} bytes")
22+::
18++ golden
23++ golden
19 |= [file=path src=@t]
24 |= [file=path src=@t]
20 ^- [tokens=@t tree=@t]
25 ^- [tokens=@t tree=@t]
tools/testdata/stub.hoon+5
@@ -18,6 +18,11 @@
18:: test that errors are reported at the right lines.
18:: test that errors are reported at the right lines.
19::
19::
20|%
20|%
21+++ golden-types
22+ |= [file=path src=@t]
23+ ^- @t
24+ (crip "type of {(spud file)}: {(a-co:co (met 3 src))} bytes")
25+::
21++ golden
26++ golden
22 |= [file=path src=@t]
27 |= [file=path src=@t]
23 ^- [tokens=@t tree=@t]
28 ^- [tokens=@t tree=@t]