on master help sign in
30 files changed+4893−3024
since splitsnapshots
unifiedsplit
README.md+2 docs/README.md+2 docs/compiler.md+3−1 docs/development.md+3−1 docs/open-questions.md+3−3 docs/prelude-inventory.md+6−6 docs/reviews/2026-11-02-questions.md+342 docs/reviews/2026-11-02-repo-review.md+294 docs/status.md+7−1 jibb-dev/lib/jibb.hoon+216−38 jibb-dev/lib/jibb/internal.jibb+1 jibb-dev/lib/jibb/prelude.jibb+28 tests/golden/prelude-unit-list-transforms/about.txt+2−2 tests/golden/prelude-unit-list-transforms/source.jibb+28 tests/golden/prelude-unit-list-transforms/tokens.txt+2209−2043 tests/golden/prelude-unit-list-transforms/tree.txt+994−923 tests/golden/prelude-unit-list-transforms/types.txt+3 tests/golden/types-generic-gates/about.txt+1−1 tests/golden/types-generic-gates/source.jibb+2 tests/golden/types-generic-gates/tokens.txt+43−1 tests/golden/types-generic-gates/tree.txt+18−1 tests/golden/types-generic-gates/types.txt+2 tests/golden/types-prelude-unit-helpers/about.txt+1−1 tests/golden/types-prelude-unit-helpers/source.jibb+16 tests/golden/types-prelude-unit-helpers/tokens.txt+219−1 tests/golden/types-prelude-unit-helpers/tree.txt+117−1 tests/golden/types-prelude-unit-helpers/types.txt+52 tests/lib/jibb-doc-examples.hoon+166 tests/lib/jibb-gate-free-guards.hoon+64 tools/type-doc-examples-test+49
README.md+2
@@ -48,6 +48,8 @@ The focused `tools/type-page-main-test` fully checks the byte-identical static a
4848
4949The focused `tools/type-buttons-test` fully checks the documented `labelled` and `wide` definitions and the unchanged module's exact source-located unresolved-`%add` error through detailed and legacy inference. The eval test and fake-ship arm share the valid source, schemes and error fixtures. It does not render or execute UI.
5050
51+The focused `tools/type-doc-examples-test` fully checks the import-only example with real Hoon readers and the card module, the `view-day` and `step` modules, and the `cmd`/`sub` molds at their prelude path through detailed and legacy inference. The same fixture runs on the fake ship.
52+
5153The focused `tools/type-theme-test` fully checks the byte-identical real theme against the exact prelude mold, including its exported type, structural downstream import, dark absent/present forms and malformed-field negatives under eval with a shared fake-ship arm. It does not check contrast, render themes or route fonts.
5254
5355The focused `tools/type-store-test` checks the byte-identical cart store and basket through detailed and legacy inference, exact main and derived schemes, structural imports, direct store watch evidence and rejection controls under eval with a shared fake-ship arm. It does not lower or execute stores, support multi-action declarations, or permit store requests in page loads.
docs/README.md+2
@@ -14,6 +14,8 @@ The current full-module checker also has a narrow static/data-page slice, docume
1414| [prelude-inventory.md](prelude-inventory.md) | Working source audit for the prelude's exported inventory |
1515| [prompts/milestone-2.md](prompts/milestone-2.md) | A brief for the developer who builds milestone 2, types and prelude |
1616| [prompts/drop-union-rune.md](prompts/drop-union-rune.md) | The completed brief for dropping `$?`, as decided on 2026-10-30, before milestone 2 |
17+| [reviews/2026-11-02-repo-review.md](reviews/2026-11-02-repo-review.md) | A review of the whole repository on 2026-11-02: bugs, gaps and simplifications, each checked by a second reviewer |
18+| [reviews/2026-11-02-questions.md](reviews/2026-11-02-questions.md) | The 45 decisions that review raises, with options and recommendations |
1719
1820## The spec
1921
docs/compiler.md+3−1
@@ -126,7 +126,9 @@ A call whose direct result is a known named generic union can receive a matching
126126
127127A two-item tuple with an explicit term, null or loobean head can receive payload context from a known union when every alternative is a literal-headed cell and its head noun is unique. The payload must be a direct wing-headed call, optionally grouped, with literal, wing or constructor arguments. The checker first retains the original inference if it already fits; otherwise it tries the contextual path once and fits the selected case and enclosing union. It declines this path if any substitution has a structural root, because a caller may have walked away variable provenance. Duplicate heads, opaque competitors and other shapes also stay conservative. The guard scans the substitution for each eligible tuple and may perform one extra shallow inference; it does not guarantee globally linear work. This lets an explicitly typed todo subscription body infer; it does not check an island or prove request watchability.
128128
129−`+gate-free-type` is a separate three-way proof over normalized checker types: it reports a gate-free result, a gate-bearing witness with its field path, or unknown. It tracks conservative inhabitance before reporting a gate in a cell, spends one shared node budget, and treats opaque recursion, open variables, unknown collection forms and `*` conservatively. Source-proven `qath` and the recognized list/unit representations have dedicated proofs. `+gate-free-mold-source` parses and resolves one named mold with a fresh active-root graph, retaining the complete prepared prelude, source bundle, trusted reader inputs, dependency cache and inferred mold. It caps classification at 256 nodes; parsing, import resolution and type inference are not covered by that cap. The host must canonicalize paths and bind trusted sources and reader results to their versions. API, store and private roots decline; other definitions and unused imported Hoon bindings are not fully checked. This is mold analysis, not a module, kind, island, watchability or runtime check, and it does not infer general gate-free constraints.
129+`+gate-free-type` is a separate three-way proof over normalized checker types: it reports a gate-free result, a gate-bearing witness with its field path, or unknown. It tracks conservative inhabitance before reporting a gate in a cell, spends one shared node budget, and treats opaque recursion, open variables, unknown collection forms and `*` conservatively. Source-proven `qath` and the recognized list/unit representations have dedicated proofs. `+gate-free-mold-source` parses and resolves one named mold with a fresh active-root graph, retaining the complete prepared prelude, source bundle, trusted reader inputs, dependency cache and inferred mold. It caps classification at 256 nodes; parsing, import resolution and type inference are not covered by that cap. The host must canonicalize paths and bind trusted sources and reader results to their versions. API, store and private roots decline; other definitions and unused imported Hoon bindings are not fully checked. This is mold analysis, not a module, kind, island, watchability or runtime check, and it is separate from the generalized constraint solver below.
130+
131+A dedicated `%fvar` form retains the `contains no gates` constraint inside schemes. Unification resolves and updates nested substitutions, so existing or later gate injection fails rather than bypassing the constraint; atom-constrained variables remain the stronger form. Constraint propagation covers open cells, faces, collections and unions with a 256-node bound. Canonicalization and instantiation preserve the constraint, template application validates constrained arguments, and an exhausted variable scan never chooses the unconstrained fallback. `set`, `map`, `mop`, `jar` and `jug` apply the same bounded propagation only to their key positions, leaving values independent. Public `eq` uses the private primitive interface, and generic `mate` retains the same constraint.
130132
131133A full ordinary module may export a narrow checked program `main` only as a direct, unqualified `(program init update view subs)` call with four simple wing arguments, modulo transparent grouping. The canonical prepared prelude must supply both the `program` value and mold. The ordinary source-backed program fit and all normal mold, value and request-graph checks complete first. The inferred `main` must be closed and invariantly match an instantiated `program` mold from that prelude. The initializer must have a closed gate scheme; its data and model contain no open variables and share the existing 256-node gate-free budget, with `%yes` required for both. The named subscription gate may syntactically return null through transparent casts, groups and definition-free bodies. Alternatively, after a successful request-graph merge, it may return one singleton list containing an unfaced `[%watch request]` pair whose request is a direct `case.face` call with one direct constructor callback. The face must resolve to an imported interface whose member has the exact plain derived-request scheme. Exactly one merged request evidence must match its API path and case, agree with the declaration's inner name, and appear in that interface's own graph; the interface source must equal the evidence's API source. The declaration must have no scry, diffs or path parameters. Pure or hand-built requests, helpers, aliases, re-exports, typed paths, folds, multiple subscriptions and missing or ambiguous evidence fail closed. Arbitrary or aliased mains, API/store kinds, and gates or unknowns in data/model also fail closed. This retains source and graph evidence and permits ordinary downstream imports; it neither executes the program nor implements runtime watching.
132134
docs/development.md+3−1
@@ -93,6 +93,7 @@ git clone https://github.com/urbit/tools /root/src/tools
9393| `tools/type-direct-gate-test` | Checks a synthetic source-backed program report and direct gate provenance under eval and on the ship |
9494| `tools/type-page-main-test` | Fully checks byte-identical static and direct data pages through real readers, exact main types, downstream imports and rejection guards under eval and on the ship |
9595| `tools/type-buttons-test` | Checks the documented valid button helpers and the unchanged unresolved-`%add` module through detailed and legacy inference under eval and on the ship |
96+| `tools/type-doc-examples-test` | Fully checks the import-only, view-day, step and cmd/sub doc fragments in their intended contexts through detailed and legacy inference under eval and on the ship |
9697| `tools/type-theme-test` | Fully checks the byte-identical real theme, its exact exported type, structural downstream import, dark absent/present forms and rejection guards under eval and on the ship |
9798| `tools/type-program-main-test` | Checks the narrow closed subscription-free program-main interface, downstream import and rejection guards under eval and on the ship |
9899| `tools/type-program-init-test` | Checks transactional direct-program initializer recovery, exact exported/imported types and fail-closed boundaries under eval and on the ship |
@@ -104,7 +105,7 @@ git clone https://github.com/urbit/tools /root/src/tools
104105| `tools/type-constructor-fit-guards-test` | Checks constructor-case uncertainty and known mismatches under eval and on the ship |
105106| `tools/type-nested-union-guards-test` | Checks nested tagged-union case selection and uncertainty under eval and on the ship |
106107| `tools/type-empty-test` | Checks source-backed empty molds, inhabitedness, coverage and proof budgets under eval and on the ship |
107−| `tools/type-gate-free-guards-test` | Checks bounded gate-free verdicts, inhabitation and witness paths under eval and on the ship |
108+| `tools/type-gate-free-guards-test` | Checks bounded gate-free verdicts, persistent constraints, substitution safeguards, collection keys and witness paths under eval and on the ship |
108109| `tools/type-gate-free-source-test` | Checks source-backed todo mold analysis through the real readers under eval and on the ship |
109110| `tools/type-sub-guards-test` | Checks source-backed subscription mold dependencies under eval and on the ship |
110111| `tools/type-ask-guards-test` | Runs ask origin and canonical list/unit bootstrap guards under eval and on the ship |
@@ -151,6 +152,7 @@ tools/type-todo-api-test # real todo API partial inference and reader
151152tools/type-direct-gate-test # direct gate source and provenance guards pass
152153tools/type-page-main-test # static/data pages, exact types, imports and rejection guards pass
153154tools/type-buttons-test # documented buttons schemes and exact pending-tag error
155+tools/type-doc-examples-test # remaining doc fragments fully check in context
154156tools/type-theme-test # real theme, exact type, structural import and rejection guards pass
155157tools/type-program-main-test # closed program-main interface and rejection guards pass
156158tools/type-program-init-test # transactional direct-program initializer context guards pass
docs/open-questions.md+3−3
@@ -30,7 +30,7 @@ Found while writing [prompts/milestone-2.md](prompts/milestone-2.md), checking i
30308. **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.
31319. **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`.
323210. **Settled: navigation commands.** On 2026-10-30, @iko chose separate declarations for application paths and unchecked cords, with `link-unsafe`, `image-unsafe` and `go-unsafe` for the unchecked forms. `image-unsafe` takes a sized URL record. Both navigation declarations produce `[%go url=@t]`; `go` converts the application path to a cord including the app's base path.
33−11. **Settled: stores and derived gates.** On 2026-10-30, @iko said a store's `+$ poke` is a declaration, like an API file's, not a mold; a derived name clashes with an import face; and an island watching a request whose case has a separate `scry=` path has a type error. The todo API's request is renamed `todo-by-id` so it does not clash with `/- todo`. The checker must account for the fact that a store's kind is determined by the type of `main`.
33+11. **Settled: stores and derived gates.** On 2026-11-01, @iko said a store's local `+$ poke` is an ordinary action mold and the runtime envelope is `raw-poke`; a derived name clashes with an import face; and an island watching a request whose case has a separate `scry=` path has a type error. The todo API's request is renamed `todo-by-id` so it does not clash with `/- todo`. The checker must account for the fact that a store's kind is determined by the type of `main`.
343412. **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.
353513. **Settled: how to print type constraints.** On 2026-10-30, @iko chose `$-([A A] A) where A is an atom` for an atom constraint and `$-([A A] ?) where A contains no gates` for a gate-free constraint. Multiple clauses are comma-separated, as `where A is an atom, B contains no gates`.
363614. **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.
@@ -44,9 +44,9 @@ Found while writing [prompts/milestone-2.md](prompts/milestone-2.md), checking i
444422. **Settled: overlapping imported `$%` and `$?` cases.** On 2026-10-30, @iko confirmed that the general union disjointness rule rejects imported `$%` and `$?` cases that overlap as nouns where the type is used, as it does for `$^`. The importer rejects recognizable overlaps and fails closed when it cannot verify them.
454523. **Settled: converging explicit capitals.** On 2026-10-30, @iko chose that a body cannot force two separately written capitals to be equal. For `++ repeated |= x=(choice A A) x`, `++ f |= x=(choice A B) (repeated x)` is an error; use `A` in both positions when the type must be shared. This also applies across local captures and within generic mold applications.
4646
47−24. **Settled: how the internal prelude provides `poke`.** On 2026-10-31, @iko chose to define `poke` in the source-backed private internal prelude module and re-export it through the public prelude as an ordinary transparent type. Ordinary modules can construct and inspect its values. This settles `poke`; it does not decide the representation of `ask` or `qath`.
47+24. **Settled: how the internal prelude provides `raw-poke`.** On 2026-11-01, @iko chose to define `raw-poke` in the source-backed private internal prelude module and re-export it through the public prelude as an ordinary transparent type. Ordinary modules can construct and inspect its values, while derived API/store `poke` helpers return commands. This settles `raw-poke`; it does not decide the representation of `ask` or `qath`.
4848
49−25. **Settled: how the prelude provides `ask` and `qath`.** On 2026-10-31, @iko chose ordinary transparent types defined in the internal prelude and re-exported normally, as for `poke`. Callers may construct and inspect their values.
49+25. **Settled: how the prelude provides `ask` and `qath`.** On 2026-10-31, @iko chose ordinary transparent types defined in the internal prelude and re-exported normally, as for `raw-poke`. Callers may construct and inspect their values.
5050
515126. **Settled: the `step` example's `at` binder.** On 2026-10-31, @iko chose to rename the `describe` pattern binder to `sent-at`, keeping Hoon's `at` in the prelude and the no-shadowing rule.
5252
docs/prelude-inventory.md+6−6
@@ -4,13 +4,13 @@ This is a working inventory, not a completed prelude interface. It lists top-lev
44
55The source is the fake ship's `%base` `/sys/hoon.hoon` (Hoon version 135), read through Clay with `tools/ship scry /cx/=base=/sys/hoon/hoon --raw`. SHA-256: `ef538ced0877230f02ff86f9fb7a0abc6833bb1cf0e8675742b4d6ce478fcc92`. It differs in bytes from [upstream Hoon at the inspected commit](https://github.com/urbit/urbit/blob/5a187fededc4582a34fcd6055c67bb63e0917b94/pkg/arvo/sys/hoon.hoon); verify against the actual target ship when updating this inventory.
66
7−The vendored prelude defines `poke` in its private internal module and re-exports it as a transparent type. The partial checker resolves its supported source shape and a narrow imported API constructor; complete checking of the private body, other API shapes, effect lowering and runtime execution remain unfinished. `qath` is defined there as a transparent recursive knot sequence and re-exported by the public prelude; the partial checker supports its named identity, selected construction and matching, and static application-path literals. The internal prelude also defines a transparent generic `ask` with pure, agent and store cases; the public prelude re-exports it and defines `pure`. Supported source construction and matching infer, while derived requests, source-schema validation and execution remain unfinished.
7+The vendored prelude defines `raw-poke` in its private internal module and re-exports it as a transparent type. Derived API/store `poke` helpers take an action and reply and return `(cmd M)` after checking the canonical `raw-poke`, `cmd` and `unit` shapes; complete checking of the private body, other API shapes, effect lowering and runtime execution remain unfinished. `qath` is defined there as a transparent recursive knot sequence and re-exported by the public prelude; the partial checker supports its named identity, selected construction and matching, and static application-path literals. The internal prelude also defines a transparent generic `ask` with pure, agent and store cases; the public prelude re-exports it and defines `pure`. Supported source construction and matching infer, while derived requests, source-schema validation and execution remain unfinished.
88
9−The prelude also declares the generic `cmd` mold exactly as in Overview, Effects. The partial checker infers its five cases and independent message types in the supported examples; complete module checking and backend validation remain outstanding. The public prelude also declares `sub`; the partial checker infers supported constructions, while request watchability and execution remain outstanding.
9+The prelude also declares the generic `cmd` mold exactly as in Overview, Effects. The partial checker infers its five cases and independent message types in the supported examples; the doc's `cmd`/`sub` block also passes full detailed and legacy checking at the prelude path with matching printed schemes. Backend validation, request watchability and execution remain outstanding.
1010
1111The public prelude now defines the UI `length`, `align`, `role`, `tone` and `attr` molds, a nonrecursive generic `element` union with one case per UI node, and the exact `program` and `page` records with their builders. Nested child, keyed-item and table payloads in the runtime union are erased to `*`; the public constructors retain typed children and independent key types, and `island` stores `[program data]` in its erased payload. The focused `types-prelude-ui` golden infers the complete union and constructor schemes, including static and message-bearing composition. Raw-constructor encapsulation, duplicate-attribute rejection, rendering, storage, navigation and execution are not established by this slice.
1212
13−The public prelude defines the approved generic `store` record `[init=S update=*]` and its builder, whose update argument is `$-([A S] S)` while the result exposes only `S`. Focused store coverage checks both exact schemes, the unchanged cart's closed main and derived state/action gates, and downstream structural imports. Store declaration checking and watch evidence are implemented; multi-action declarations, lowering and runtime execution are not.
13+The public prelude defines the approved generic `store` record `[init=S update=*]` and its builder, whose update argument is `$-([A S] S)` while the result exposes only `S`. Focused store coverage checks both exact schemes, the unchanged cart's closed main and derived generic poke/state gates, malformed-prelude controls and downstream structural imports. The local `+$ poke` remains an ordinary action mold. Store declaration checking and watch evidence are implemented; multi-action declarations, lowering and runtime execution are not.
1414
1515The public prelude also defines the exact `theme` mold: three space cords, five normal tone cords, `wide`, `lang` and `zone` cords, `(unit qath)` for `font`, and a unit containing the same five dark tone cords. The shared `type-theme` fixture fully checks the byte-identical real theme and its structural downstream import, including dark absent/present and malformed-field negatives. It does not implement contrast checking, rendering, routing or any other theme behavior.
1616
@@ -32,7 +32,7 @@ The source-backed `gth` gate calls a compiler-supplied private comparison interf
3232
3333`biff`, `bind`, `bond`, `both`, `clap`, `clef`, `drop`, `fall`, `flit`, `hunt`, `lift`, `mate`, `need`, `some`.
3434
35−The following is an audit of the Hoon 135 bodies, not a completed Jibb interface. The partial checker infers `fall`, `need`, `some`, `bind`, `biff`, `bond`, `both`, `clap`, `clef`, `drop` and `flit`; the remaining written implementations have been parsed, but complete checker validation remains outstanding. Backend validation and jet recognition remain outstanding for all of them.
35+The following is an audit of the Hoon 135 bodies, not a completed Jibb interface. The partial checker infers `fall`, `need`, `some`, `bind`, `biff`, `bond`, `both`, `clap`, `clef`, `drop`, `flit`, `hunt` and `mate`; the remaining written implementations have been parsed, but complete checker validation remains outstanding. Backend validation and jet recognition remain outstanding for all of them.
3636
3737| Name | Hoon behavior | Jibb status |
3838| --- | --- | --- |
@@ -45,9 +45,9 @@ The following is an audit of the Hoon 135 bodies, not a completed Jibb interface
4545| `drop` | Converts an absent unit to an empty list and a present unit to a singleton. | Written; inferred by the partial checker |
4646| `fall` | Returns the value of a present unit or the supplied fallback. | Written; inferred by the partial checker |
4747| `flit` | Returns a gate that wraps a value only if it satisfies the predicate. | Written |
48−| `hunt` | Returns the only present unit or chooses between two present values with an ordering gate. | Missing |
48+| `hunt` | Returns the only present unit or chooses between two present values with an ordering gate. | Written with the ordering gate first, as `(hunt ord a b)`; both ordering outcomes and absent units are inferred |
4949| `lift` | Takes a mold and a unit, then applies the mold to a present value as `bind` does. | Missing; Jibb molds are not callable values |
50−| `mate` | Returns the present unit if only one is present; when both are present it returns one if their values are equal and crashes otherwise. | Missing |
50+| `mate` | Returns the present unit if only one is present; when both are present it returns one if their values are equal and crashes otherwise. | Written over `eq`; its generic payload retains the gate-free constraint |
5151| `need` | Extracts a present value and crashes on an absent unit. | Written; inferred by the partial checker |
5252| `some` | Wraps a value in a present unit. | Written |
5353
docs/reviews/2026-11-02-questions.mdnew file+342
@@ -0,0 +1,342 @@
1+# Questions from the 2026-11-02 review
2+
3+Every decision that [the review](2026-11-02-repo-review.md) raises, with options. Each **Answer** is prefilled with the recommended option, so only the ones you disagree with need changing. A-numbers point into the review's appendix.
4+
5+Questions 16 to 28 are language or spec rulings. Under the ground rules they are @iko's to make and are recorded in decisions.md before the code changes.
6+
7+## Scope and process
8+
9+**1. Where should the review land?** It is on `claude/project-thread-7prdcx` now.
10+
11+- a) Push it to `master`, as development.md's "push straight to master" rule says.
12+- b) Open a pull request.
13+- c) Leave it on the branch.
14+
15+**Answer:** a
16+
17+**2. What should be done first?**
18+
19+- a) The eight "fix first" bugs.
20+- b) The simplifications, starting with the test runner.
21+- c) The docs cleanup.
22+- d) Nothing more for now.
23+
24+**Answer:** a, then c
25+
26+**3. How should fixes land?**
27+
28+- a) Commits straight to `master` once every check passes, as development.md says.
29+- b) One pull request per theme.
30+- c) A branch you merge yourself.
31+
32+**Answer:** a
33+
34+**4. Should a fake ship be set up in the cloud container**, so the ship checks run too? That needs the brass pill from GitHub LFS and a few minutes to boot.
35+
36+- a) Yes, before any fix that touches tools/ship, the desks or the mark.
37+- b) No, eval checks are enough.
38+
39+**Answer:** a
40+
41+## Direction
42+
43+**5. How should the checker grow from here?** (A121)
44+
45+- a) Build the general core first: union-find bindings with levels, a deferred-constraint queue and Maranget's usefulness check, with `main = (program …)` checked as an ordinary application.
46+- b) Keep adding recovery paths until milestone 2's examples pass, and refactor after.
47+- c) Both: make today's recovery fall back to ordinary inference now, and plan the core as the next milestone-2 task.
48+
49+**Answer:** c
50+
51+**6. Should the partial `golden-types` report be rendered from the full checker's per-definition results**, so there is one pipeline? (A122) About 283 `types.txt` outputs would change once.
52+
53+- a) Yes.
54+- b) No, keep the two pipelines.
55+
56+**Answer:** a
57+
58+## Checker fixes
59+
60+**7. How should the keyed-view screen be fixed?** (A119, A38)
61+
62+- a) Run ordinary inference first, and recovery only for components it leaves unresolved. Some todo diagnostics may change.
63+- b) Keep recovery first, and fall back to ordinary inference when it declines.
64+
65+**Answer:** a
66+
67+**8. Should the narrow initializer recovery go?** Deleting the null-sample gate and `program-init-context` (about 140 lines) lets the general path handle reordered models, and the seven negative init fixtures still fail. (A39)
68+
69+- a) Yes, once the todo, store and program tests pass.
70+- b) No.
71+
72+**Answer:** a
73+
74+**9. How should an imported Hoon `(unit T)` be handled?** (A10)
75+
76+- a) Translate it to the prelude's `unit` union, passing the prelude template into the import bridge.
77+- b) For now, make it fit as unknown, so it fails closed instead of giving a false error.
78+
79+**Answer:** a
80+
81+**10. Should printed types say `ask` and `qath` instead of `ask.internal` and `qath.internal`?** Two expected outputs change. (A134)
82+
83+- a) Yes.
84+- b) No.
85+
86+**Answer:** a
87+
88+**11. Should every `?-` branch kind join its arm results by one rule:** unify, and if that fails, widen to an explicitly present parent aura or `@`? Then `?- b %.y n %.n 0` with `n=@ud` checks. (A133)
89+
90+- a) Yes.
91+- b) No, keep the per-kind rules.
92+
93+**Answer:** a
94+
95+**12. Should top-level resolution make one pass in dependency order**, keeping the fixpoint as a fallback, with a 400-definition timing check added to the suite? (A135)
96+
97+- a) Yes.
98+- b) Only the fix.
99+- c) No.
100+
101+**Answer:** a
102+
103+**13. Should the checker keep the errors it already finds?** That means the real error inside a local `++`, the name of the failing definition, the API reasons, and a definite error for a derived-name clash. Boundary strings that tests lock in would change. (A12, A40, A24)
104+
105+- a) Yes.
106+- b) No.
107+
108+**Answer:** a
109+
110+**14. Should the 26-variable printer limit stop gating which modules check?** The printer would print `T27` and on, as it already can. (A124)
111+
112+- a) Yes.
113+- b) No.
114+
115+**Answer:** a
116+
117+**15. Should the 32,768-node freshness scan be replaced** by a fresh-ID high-water mark computed once, with `%recursive` treated as a leaf? (A37)
118+
119+- a) Yes.
120+- b) Keep the scan and document its budget.
121+
122+**Answer:** a
123+
124+## Language and spec rulings
125+
126+**16. Which auras may a term literal fit?** Today `^- @tas %1.000` and `^- @tas %&` are accepted and `^- @ud %1.000` is rejected, the opposite of Hoon. grammar.md:141 supports the code; grammar.md:29 and "Literals: exactly Hoon's" don't. (A20)
127+
128+- a) Follow Hoon: a term literal fits its own aura family, so `%1.000` is `@ud` and `%&` is `?`.
129+- b) Keep grammar.md:141 as written.
130+
131+**Answer:** a
132+
133+**17. May a name term fit `@t`, as `@tas` nests in `@t` in Hoon?** grammar.md:141 lists only `@tas`, `@ta`, `@` and `*`. (A20)
134+
135+- a) Yes.
136+- b) No.
137+
138+**Answer:** a
139+
140+**18. May a gate fit `*`?** core-language.md says a function isn't a noun, but the prelude's `element` erases gates into `*`. (A23)
141+
142+- a) Yes: say in the spec that `*` may hold gates.
143+- b) No: design a typed erasure first.
144+
145+**Answer:** a
146+
147+**19. Where should `[]` and `m()` be rejected?** Both are decided errors. Today the parser accepts them, and the checker calls `[]` "not supported". (A6, A100)
148+
149+- a) In the parser, at the closer, with new golden cases.
150+- b) In the checker, as definite errors.
151+
152+**Answer:** a
153+
154+**20. Is `[a=@ud [a=@t b=?]]` one record or two scopes?** Hoon treats it as flat, and field access already does. Today the duplicate `a` is accepted and `a.x` is "ambiguous". (A30)
155+
156+- a) One record: the duplicate is an error.
157+- b) Two scopes, as compiler.md says now.
158+
159+**Answer:** a
160+
161+**21. Should `/% %foo` together with `++ foo 1` be allowed?** `/%` binds only a mold, and molds and values have separate namespaces (grammar.md:94 and :102), but the scope check rejects it. (A25)
162+
163+- a) Yes.
164+- b) No.
165+
166+**Answer:** a
167+
168+**22. Should a `?-` arm that matches no remaining case be a definite error** ("arm matches no case"), as grammar.md:184 implies, instead of "not supported"? (A15)
169+
170+- a) Yes.
171+- b) No.
172+
173+**Answer:** a
174+
175+**23. Should `(mop K V)` carry its comparator,** so that `get.on gth` on an `lte` mop is an error? Neither Hoon nor decisions.md:39 does this. (A55)
176+
177+- a) No, match Hoon.
178+- b) Yes.
179+
180+**Answer:** a
181+
182+**24. Should Hoon's `each` mold be renamed to `each.hoon`**, since the prelude also has the element gate `each`? They live in separate namespaces. (A64)
183+
184+- a) No, keep both.
185+- b) Yes.
186+
187+**Answer:** a
188+
189+**25. When should `eq` and the gate-free type-variable constraint be built?** Both are decided, neither exists, and no doc tracks them. (A98)
190+
191+- a) In milestone 2.
192+- b) Later, and list them as outstanding.
193+
194+**Answer:** a
195+
196+**26. Which Hoon unions should the importer learn?** Today `$%` with `%&`, `%|` or `%0` tags, `(each a b)` and `json` all fail, though the spec's import table lists them. (A50)
197+
198+- a) The non-`%tas` tags now, then `each` and `json` as catalog entries.
199+- b) Only the tags.
200+- c) Later.
201+
202+**Answer:** a
203+
204+**27. Should the `%jibb` mark keep dropping the final newline on a `%txt` round trip**, as `%hoon` does? (A61)
205+
206+- a) Keep it, like `%hoon`.
207+- b) Preserve the newline, and change tools/ship's assertion.
208+
209+**Answer:** a
210+
211+**28. Should the printer flatten `[a [b c]]` to `[a b c]` and print named molds by name**, such as `theme` and `item.todo`? (A136)
212+
213+- a) Yes.
214+- b) No.
215+
216+**Answer:** a
217+
218+## Tests and tooling
219+
220+**29. Should one runner over the `tests/lib` test arms replace the 49 `tools/type-*-test` scripts and `importer-test`?** A prototype ran them in 681 s instead of 2,591 s. The `my-app` byte guards would move to a manifest. (A82, A120)
221+
222+- a) Yes.
223+- b) No.
224+
225+**Answer:** a
226+
227+**30. Should there be one `tools/check` command, and CI?** (A92, A96)
228+
229+- a) `tools/check` now, and a CI job for the eval checks now.
230+- b) `tools/check` now, CI at milestone 7 as planned.
231+- c) Neither.
232+
233+**Answer:** b
234+
235+**31. How should the 28 copies of `my-app` files under `tests/` be handled?** (A108, A109)
236+
237+- a) Map `my-app` into the `jibb-dev` desk outside `/tests` and read it directly, removing the copies.
238+- b) Keep the copies, and guard them all from one manifest.
239+
240+**Answer:** a
241+
242+**32. Should the generated `tests/lib/jibb.hoon` (3,949 lines) stop being committed?** Assembly drops it and regenerates it anyway. (A83)
243+
244+- a) Yes, and add it to .gitignore.
245+- b) No.
246+
247+**Answer:** a
248+
249+**33. Should the importer's test fixtures (about 550 lines) move out of `jibb-import.hoon`**, which app desks vendor, into `tests/lib/jibb-import.hoon`? (A52)
250+
251+- a) Yes.
252+- b) No.
253+
254+**Answer:** a
255+
256+**34. Should the import-only fixtures move off `my-app`** (`sur/import-fixture.hoon`, `mar/label.hoon`, the Tlon probe) to a fixtures desk? (A113)
257+
258+- a) Yes.
259+- b) No.
260+
261+**Answer:** a
262+
263+**35. Should the five `tools/hoon` checks that exit 0 whatever they print become test arms?** (A91)
264+
265+- a) Yes.
266+- b) No.
267+
268+**Answer:** a
269+
270+**36. Should type-checker golden cases keep their full token and tree outputs?** They are 73% of all parser golden lines. (A94)
271+
272+- a) Keep them: each stage's output is compared.
273+- b) Let type cases opt out.
274+
275+**Answer:** a
276+
277+**37. Should the tests keep calling internal library arms (137 of them)?** (A126)
278+
279+- a) Keep them for now, and revisit after the checker core changes.
280+- b) Move them behind a small public facade.
281+
282+**Answer:** a
283+
284+**38. Should `my-app` keep the failing buttons example and the doc theme's static font?** Milestone 4 will treat both as errors. (A112)
285+
286+- a) Keep them through milestone 2, and list it as a milestone-4 open question.
287+- b) Move the error example out now.
288+
289+**Answer:** a
290+
291+**39. Should every vendored package keep going into every desk?** (A117)
292+
293+- a) Yes, as designed.
294+- b) Make it per desk.
295+
296+**Answer:** a
297+
298+**40. Should `tools/hoon` get a `--no-debug` mode** for timings, with the docs' figures re-measured? Every eval runs with `!:`, which makes checker work 2.2 to 2.6 times slower. (A137)
299+
300+- a) Yes.
301+- b) No.
302+
303+**Answer:** a
304+
305+## Docs and repository
306+
307+**41. Should status.md become a capability table** (area, status, the test that proves it) plus a short list of gaps, with the history table replaced by `git log`? (A97, A95)
308+
309+- a) Yes.
310+- b) Only fix the contradictions.
311+
312+**Answer:** a
313+
314+**42. Until the Claude design doc is synced, which spec wins?** (A104)
315+
316+- a) The repository copy, with a "synced" column in decisions.md.
317+- b) The Claude doc, as development.md says now.
318+
319+**Answer:** a
320+
321+**43. Who syncs the Claude design doc with the repository's decisions?**
322+
323+- a) Me, if you give me edit access to it.
324+- b) @iko.
325+- c) Leave it for now.
326+
327+**Answer:** b
328+
329+**44. Should open-questions.md hold only open questions**, with settled ones moved to decisions.md? (A103)
330+
331+- a) Yes.
332+- b) No.
333+
334+**Answer:** a
335+
336+**45. Which licence should the repository have?** It has none, and doesn't state the licences of `vendor/` or the Tlon fixtures. (A107)
337+
338+- a) MIT, like urbit/urbit.
339+- b) Another licence.
340+- c) None: keep it private.
341+
342+**Answer:** a
docs/reviews/2026-11-02-repo-review.mdnew file+294
@@ -0,0 +1,294 @@
1+# Repository review, 2026-11-02
2+
3+A review of the whole repository at [`4bf477e`](https://github.com/iko-soy/jibb/commit/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36), asked for in the project chat: look for issues and gaps, and for what could be simpler or more elegant.
4+
5+How it was done: ten reviewers each took one area (the lexer and parser, three slices of the checker, the importer with the mark and prelude, the Python tooling, the test harness, the docs, the example desks, and the architecture as a whole). A second reviewer then tried to refute every finding, by reading the code and by reproducing it with `tools/hoon` where that was cheap. A final pass looked for what the ten had missed. Every eval-based check in [development.md](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/docs/development.md#L124-L194) was also run, with vere 4.6 built from nixpkgs.
6+
7+Four commits reached `master` while the review ran (`2d74861` to `5ccd150`). The fix-first items 1 to 3 were rechecked at `5ccd150` and still hold there. Line numbers below are links into `4bf477e`. Findings are numbered A1 to A137 in the [appendix](#appendix-every-finding).
8+
9+## Summary
10+
11+- **Everything that can run without a ship passes.** All 60 eval checks pass, including 660 of 660 golden cases. The ship checks were not run, because this container has no fake ship.
12+- **137 findings survived verification: 2 high, 31 medium and 104 low.** 75 held exactly as reported and 62 held with corrections to scope, numbers or severity. None was refuted outright. Most of the low ones are polish.
13+- **The real bugs are in the full checker, and they reject valid code.** A program that is one step away from the todo island's exact shape is rejected, an imported Hoon `(unit T)` doesn't fit the prelude's `unit`, and private prelude names leak into printed types. None of them accepts a wrong program.
14+- **The test and docs scaffolding is heavier than it needs to be.** The push checklist is about 65 commands and 49 minutes. 49 copy-paste test scripts rebuild the library 81 times. `my-app` files are copied 28 times under `tests/`, several with no guard. `status.md` is a 59 KB log that contradicts itself on whether the cart store checks.
15+- **The checker grows one example at a time.** Each new example gets a narrow recovery path, a script, a fixture folder and a paragraph of docs, where a few shared mechanisms would remove code. That trend is the main thing worth deciding on (see [Direction](#direction)).
16+
17+## Check run
18+
19+| Check | Result | Time |
20+| --- | --- | --- |
21+| `tools/golden` | 660 of 660 pass | 74 s |
22+| 49 `tools/type-*-test` scripts and `tools/importer-test` | All pass | 2,591 s together. The slowest are `type-todo-full-test` (581 s) and `type-deferred-prepared-test` (411 s) |
23+| `tools/testdata/selftest` | 22 checks, 0 failed | 141 s |
24+| `tools/doc-blocks docs/spec` | 14 `jibb` blocks, 14 `doc-*` cases, none missing | under 1 s |
25+| `tools/ship gen-tests --check` | Up to date, 660 cases | under 1 s |
26+| The 5 `tools/hoon` checks (`check-spans-test`, `itype-unify-test`, three reference files) | Print the expected values. They exit 0 whatever they print (A91) | about 23 s each |
27+| `tools/testdata/clay-fixtures-selftest` | Pass | 4 s |
28+| `tools/ship test`, `check-commit`, `clay-fixtures`, `ship-selftest` | Not run: they need a fake ship | |
29+
30+The checks ran three at a time on four CPUs and took 2,924 s of check time in all. Every eval rebuilds the 15,172-line library, which now takes about 22 s, not the 8 s the docs quote (A102).
31+
32+## Fix first
33+
34+These are the bugs and gaps with the most effect on users of the checker or the tools. Each was reproduced by the second reviewer.
35+
36+| # | Problem | Evidence | Fix | Refs |
37+| --- | --- | --- | --- | --- |
38+| 1 | **Valid programs are rejected when their view has one keyed `each (turn …)` site.** The screen that skips "doomed" ordinary inference also skips attempts that would succeed | A program whose `init` is ``^- model [0 input `"x"]`` is rejected with "module definitions need unsupported inference". Listing the same `each` site twice turns the screen off, and the same program then passes. [`add-supported-defs-core`](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L10293) skips every name from [`program-recovery-names`](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L12997-L13038). Only the [recovery chain](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L14152-L14173) can add them back, and its init recoveries accept only a tuple ending in `~` or a `~` sample ([13667](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L13667), [13595](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L13595)) | Run ordinary inference first, then recover only the components it left unresolved. Separately, deleting the null-sample gate at 13595 makes reordered models pass and keeps all seven negative init fixtures failing, which removes about 140 lines | A119, A38, A39 |
39+| 2 | **An imported Hoon `(unit T)` does not fit the prelude's `unit`.** `fall`, `need` and `^- (unit @t)` on an imported unit give definite "do not unify" errors | [`import-to-itype`](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L6339-L6350) builds `[%collection %unit …]`, while the prelude's unit is an origin-tagged union ([8245-8255](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L8245-L8255)). [`itype-fit-inner`](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L5437-L5439) answers `%bad`. No fixture passes an imported unit to `fall` or `need` | Translate Hoon `unit` to the prelude's union, as `list` already shares its representation. At the least, make a collection against a prelude-origin union fit as `%unknown`. Add a golden case | A10 |
40+| 3 | **Printed types name the private prelude module**, as `(ask.internal @ud)` and `(unit qath.internal)` inside every `page` and `theme` type | [`prelude-label`](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L11423-L11436) relabels only a mold's top level. Two expected outputs lock the leak in: [types-prelude-ui/types.txt:85](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tests/golden/types-prelude-ui/types.txt#L85) and [jibb-theme.hoon:66](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tests/lib/jibb-theme.hoon#L66). [grammar.md:104](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/docs/spec/grammar.md#L104) says the prelude does not expose its internal module | Relabel internal origins with the public re-export name while preparing the prelude | A134 |
41+| 4 | **`?-` branches join their results by three different rules.** `?- b %.y n %.n 0` with `n=@ud` fails with "branch widening is not supported", even under `^- @ud`. A unit branch can't widen, and a union branch compares types with `!=` | Loobean pre-check at [8518](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L8518), plain unify for unit and list at [7671](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L7671), syntactic inequality for unions at [7841](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L7841) and [7943](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L7943) | One join helper for every branch kind: unify, then widen to an explicitly present parent aura or `@` | A133 |
42+| 5 | **Diagnostics the checker already has are thrown away** | An error inside a local `++` becomes the site-less "local definitions need unsupported inference" ([7236-7258](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L7236-L7258)). Full-check failures don't name the definition, and the API branch drops reasons it computed ([14087](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L14087), [14092](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L14092)). A derived-name clash, an error in the spec, is reported as "unsupported". The full module check reports a plain `@t`/`@ud` overlap as "unsupported" while the partial report proves it ([11340-11351](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L11340-L11351)) | Thread a reason, or the failing definition's name, through the resolver and recoveries. Use one overlap witness for both paths | A12, A40, A24 |
43+| 6 | **Forward references cost near-cubic time.** A 400-definition chain written top-down takes about 26 s of checker work, against about 1 s written bottom-up. The brief asks for "a 2,000-line module in seconds" | [`resolve-groups-core`](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L10309-L10328) is a fixpoint that resolves one link per pass and re-infers every unresolved definition each time. The dependency-ordered SCCs at [10318](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L10318) are used only for cycles | Resolve in one pass over the components already computed, keeping the fixpoint as a fallback. Compute `program-recovery-names` once per module, not per definition per pass | A135, A33 |
44+| 7 | **`tools/ship` and `tools/golden` bugs** | `tools/ship --pier /abs/path stop` can SIGTERM itself, because [`processes()`](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tools/ship#L285-L305) takes any process naming the pier for the king. The zero-byte `.txt` sync failure that [development.md:206](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/docs/development.md#L206) blames on the ship is a `MANIFEST` and `verify()` bug in `tools/ship` ([693](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tools/ship#L693), [1438](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tools/ship#L1438)). When a batch dies, `tools/golden` reruns all 660 cases one by one, each rebuilding the library, and Ctrl-C doesn't stop the queue ([363-396](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tools/golden#L363-L396)) | Identify the king from `.vere.lock`. Test `%txt` before `?@` in `MANIFEST`. Bisect failing batches and cancel queued futures | A65, A66, A67 |
45+| 8 | **A trailing `\` in a string says "a control character"**, and the lexer's character rules have no tests | [`+bad-char`](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L1637-L1643) treats the line feed as a control character. No golden source holds a CR, a control byte or any byte at or above 0x80, so UTF-8 column counting and about 20 hints are untested | Make `+bad-char` return `~` for 10 (verified to give the end-of-file messages). Add `lex-char-*` and `lex-utf8-*` cases | A1, A3 |
46+
47+Medium gaps that fail closed, so nothing wrong is accepted, but common code is refused:
48+
49+| Gap | Refs |
50+| --- | --- |
51+| A union reached through two import faces stops matching once one of its cases holds another named union, because cases are compared with their display labels ([4859](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L4859)) | A11 |
52+| Union matches on cases holding an imported `map`, `set`, `qeu`, `mop`, `jar` or `jug` fail, because inhabitation and gate-free proofs know only `list` and `unit` ([4793](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L4793), [5785](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L5785)) | A13 |
53+| An imported bare `@`, and auras such as `@uw`, are rejected, and the aura whitelist is written twice ([6326](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L6326-L6329), [6198-6209](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L6198-L6209)) | A14 |
54+| An undocumented 32,768-node freshness scan, run in up to six recovery arms, turns recovery off silently. The prelude alone uses 57% of it, and any imported recursive type makes it decline ([dg-scan](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L14512-L14539)) | A37 |
55+| The importer accepts only `%tas` head tags and knows no standard unions, so `$%` with `%&`, `%\|` or `%0` tags, `(each a b)` and `json` fail, although the spec's import table lists them ([jibb-import.hoon:104-110](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb-import.hoon#L104-L110)) | A50 |
56+| The full todo, page and API checks read five copies of the todo `/sur` and marks that nothing compares with `my-app`. Changing `my-app/sur/todo.hoon` leaves `type-todo-partial-test` passing | A109, A81 |
57+| `eq` is decided but missing from the prelude, the checker has no gate-free type-variable constraint, and no doc tracks either | A98 |
58+
59+## Simplify
60+
61+Each row was checked to be behaviour-preserving, or the table says what it would change.
62+
63+| Opportunity | Today | Proposed | Payoff | Refs |
64+| --- | --- | --- | --- | --- |
65+| One test runner | 49 `tools/type-*-test` scripts and `importer-test`, 2,154 lines. Each one slices a `tests/lib` file at `'\n\|%\n'` or at arm names, rebinds its fixtures under new names, and starts its own eval. Several keep Python copies of the check lists in the ship arms, so eval and ship run different wrappers | One runner that reads each `tests/lib/jibb-*.hoon` header, binds `/+` and `/*` as Ford would, and runs every `test-` arm under `mule`. Keep the `my-app` byte guards, diffs and `--update` somewhere else | A 90-line prototype ran all 55 ship test arms under eval in 681 s, against 2,591 s for the scripts, and removes the eval/ship drift | A82, A120, A80, A84 |
66+| One check command | About 65 commands, kept in four lists that disagree. `status.md` misses 18 and the README names 27 of the 49 type tools | `tools/check`, with `--ship` for the ship steps. Point every doc at it | One list, and a base for the CI that milestone 7 plans | A96, A92 |
67+| One source of `my-app` | 28 byte copies of 13 `my-app` files, plus 5 marks with the `/-` line removed. Eight tools hard-code their own guard pairs, and several copies have no guard | Map `my-app` into the `jibb-dev` desk outside `/tests` and read it directly, or keep one manifest checked by one tool | Removes the copies, and the drift they allow | A108, A128, A81, A109 |
68+| One checker pipeline | The partial report ([`golden-types-in-context-core`](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L14385-L14510)) repeats the finalization of [`add-supported-result`](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L10266-L10286) and runs none of the kind checks. The todo island gets a partial report but passes the full check | Have `infer-jibb-file-detailed` return a scheme or an error per definition, and render the report from that | Finalization in one place, and typed goldens that test the real checker | A122, A46, A42 |
69+| Program recovery | Six recovery arms repeat a preamble and a 25-35 line tail, and the copies have drifted. Four copies of the `main` walk | A `recover-def` helper and one `main-call-args` walk | A few hundred lines | A48, A39 |
70+| AST and type walkers | 56 arms, about 650 lines, in the `scope-*`, `dependency-*`, `duplicate-*`, `reserved-proj-*`, `*-has-hole` and `program-view-sites-*` families | One `node-kids` enumeration and a fold. The printers and `infer-fragment` still need their own dispatch | Fewer places to edit per new node kind | A129, A32, A21 |
71+| `%gate` and `%gate-wide` | Identical fields. 40 uses in the checker, 10 `\|(?=(%gate …) ?=(%gate-wide …))` tests and two duplicated 9-line branches | `?=(?(%gate %gate-wide) -.x)`, or one node with a `wide` flag | Noise removed without changing goldens | A123, A34 |
72+| Dead code | Five unreferenced arms and a type (A26). `one-request-interface-source`, and the narrow API branch, which gives an identical interface for `blog.jibb` (A44). `golden-types-with-modules`. The importer's `+fixture-test`. The committed, generated `tests/lib/jibb.hoon` (3,949 lines), which assembly drops and regenerates. `my-app` assembly skipping a `jibb-dev/tests` that doesn't exist | Delete them, and drop `gen-tests --check` from the checklist | Less to read and keep current | A26, A31, A44, A42, A51, A83, A111 |
73+| Test code in shipped libraries | About 550 lines, nearly a quarter of `jibb-import.hoon`, are fixtures used only by tests, and app desks vendor the file | Move them into `tests/lib/jibb-import.hoon`, as `jibb-api-paths.hoon` already does | A smaller vendored library | A52, A127 |
74+| Named state and limits | `istate`'s 27 fields are built positionally at 10 sites, `add-supported-defs-core` takes 19 positional arguments, and budgets are literals (256 ×32, 64 ×18, 32,768 ×13). The printer's 26-variable cap also rejects modules with 27 type variables | An `icontext` record with a `fresh-state` constructor, a `limits` core, and one `deferred-eligible` arm in place of three copies | Safer edits, and no printer limit on what checks | A28, A125, A124 |
75+| Parser helpers | The `?(` check is a backward token walk at 12 call sites. `+in` and `+fail` shadow the standard library, which costs 16 `in:..zuse` workarounds | One lexer branch for `?(` (verified to keep every error column). Rename `+in` and move the `+fail*` helpers into `+parser` | Smaller parser, no shadowing | A7, A8 |
76+
77+## Direction
78+
79+The checker is growing as narrow recovery paths fitted to the example files: the todo island, the cart store, the theme. In the 50 commits this clone holds, `jibb.hoon` grew by 6,199 lines, and the seven commits that add a kind of module added 1,816 of them. There are now three representations of recursive types (`%recursive`, `%jrec`, `%grec`), about 50 branch and pattern arms, and 257 strings that report something as "unsupported" or "not supported". Each slice also brings a test script, a fixture folder and a paragraph in `compiler.md`, which is now 75 KB. Fix-first item 1 shows the cost: a program one edit away from the todo's shape is rejected.
80+
81+The milestone-2 brief suggests, without requiring it, a different core: union-find bindings with levels, a queue of deferred constraints, and Maranget's usefulness check for matches ([milestone-2.md:130-142](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/docs/prompts/milestone-2.md#L130-L142)). With it, `main = (program init update view subs)` would be an ordinary application whose sample unifies with its components, and much of the 1,180 lines of program recovery could go. Whether to build that core before adding the next slice is the main decision this review raises. (A121)
82+
83+## Docs
84+
85+| Doc | Problem | Fix | Refs |
86+| --- | --- | --- | --- |
87+| [status.md](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/docs/status.md) | 59 KB, with a 16,412-character paragraph at line 68 and a 115-row table that repeats `git log`. It says the cart store passes ([54](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/docs/status.md#L54)) and that it fails closed ([68](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/docs/status.md#L68)). Both are true, for different entry points, and the doc says neither | A capability table (area, status, the test that proves it), a short list of known gaps, and milestone commits instead of the history table | A97, A95 |
88+| Check lists in README, development.md and status.md | They disagree. [development.md:3](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/docs/development.md#L3) says the README describes each tool in full, but only development.md's table is complete | One `tools/check`, and one list | A96 |
89+| [compiler.md](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/docs/compiler.md) and the [`jibb.hoon` header](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L1-L36) | Both still say milestone 1, and the chapter map leaves out `%union-analysis`, about 4,700 lines. The program-recovery chain is described inaccurately: the "doomed attempts" the screen skips can succeed | Update the header, the chapter map and the recovery paragraph | A60, A101, A131, A41 |
90+| The library's design notes | Sections 2.6, 3 and 4.2 don't mention the `_` type hole or the `?(` hint | Add both | A2 |
91+| [open-questions.md](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/docs/open-questions.md) | Mostly settled questions, against its own rule. Question 6 is stale. `eq` reads as implemented | Move settled ones to decisions; mark `eq` as decided, not built | A103, A100, A98 |
92+| decisions.md, prelude-inventory.md | The core-language row still says "proposed". The inventory lists shapes as future work that now exist | Update | A99, A54, A105 |
93+| Timings | "About 8 s" to build the library is now about 22 s. Every figure is measured with `!:`, which makes checker work 2.2 to 2.6 times slower than on a ship, and no doc says so | Update the figure, and say which mode each figure uses | A102, A137 |
94+| Licence | No LICENSE, and the licences of `vendor/` and the Tlon fixtures are unstated | Add a LICENSE and a line in the README | A107 |
95+
96+## Not covered
97+
98+The ship checks weren't run, so ship-only behaviour, such as `tools/ship test`, `check-commit` and `clay-fixtures`, is reviewed from the code only. The spec in `docs/spec/` was checked for internal consistency and against the code, not as language design. The findings come from targeted reading and probes, not a line-by-line audit of all 15,172 lines.
99+
100+## Appendix: every finding
101+
102+"Confirmed" means the second reviewer reproduced the finding as stated. "Partly" means the core holds but the scope, numbers or severity were corrected; the title shown is the corrected one. Severity is the second reviewer's, judged for a project in the middle of milestone 2. Some problems were found independently by two reviewers and appear in both areas, for example A38 and A119, A82 and A120, A108 and A128.
103+
104+### Lexer, parser and printers (`jibb.hoon` 1–4597)
105+
106+| # | Finding | Severity | Verdict | Kind | Where |
107+| --- | --- | --- | --- | --- | --- |
108+| A1 | A `\` or `\X` escape cut off by the end of the line reports "a control character", which contradicts 2.2 and differs from the same text at the end of the file | Medium | Confirmed | bug | [jibb.hoon:1609-1625](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L1609-L1625), [jibb.hoon:1637-1643](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L1637-L1643), [jibb.hoon:105-110](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L105-L110) and 1 more |
109+| A2 | Design notes 2.6, 3 and 4.2 never mention the `_` type hole or the `?(` union hint; the header still says milestone 1 | Medium | Confirmed | inconsistency | [jibb.hoon:1](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L1), [jibb.hoon:162-231](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L162-L231), [jibb.hoon:489-505](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L489-L505) and 7 more |
110+| A3 | Section 2.2's CR/control/non-ASCII errors, UTF-8 column counting and about 20 lexer and parser hints have no golden case | Medium | Confirmed | test-gap | [jibb.hoon:1637-1645](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L1637-L1645), [jibb.hoon:1630](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L1630), [jibb.hoon:1709-1712](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L1709-L1712) and 3 more |
111+| A4 | +read-string's +doomed call, and the notes' "or the } of an interpolation" case, can never trigger | Low | Confirmed | dead-code | [jibb.hoon:3426-3431](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L3426-L3431), [jibb.hoon:2953-2975](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L2953-L2975), [jibb.hoon:651-657](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L651-L657) and 2 more |
112+| A5 | Left-out Hoon runes get the doc's reason only sometimes, and second-character messages override 2.2's character errors | Low | Confirmed | inconsistency | [jibb.hoon:238-240](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L238-L240), [jibb.hoon:270-274](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L270-L274), [jibb.hoon:1317-1324](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L1317-L1324) and 3 more |
113+| A6 | `[]` in an expression reaches the checker as "not supported", not the decided error, and open question 6 is stale; the parser's acceptance of `[]`/`m()` is a documented milestone-1 choice | Low | Partly | gap | [jibb.hoon:3492-3493](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L3492-L3493), [jibb.hoon:9400](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L9400), [jibb.hoon:9440](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L9440) and 4 more |
114+| A7 | The `?(` check is a backward token walk repeated at 12 parser call sites, where one lexer branch would do (verified to keep every column) | Low | Partly | simplification | [jibb.hoon:3144-3153](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L3144-L3153), [jibb.hoon:1337-1345](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L1337-L1345), [jibb.hoon:3164](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L3164) and 2 more |
115+| A8 | Renaming +in and moving the +fail* helpers into +parser would remove both standard-library shadowings, the 16 `in:..zuse` workarounds and the `file` forwarders | Low | Partly | simplification | [jibb.hoon:2368-2572](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L2368-L2572), [jibb.hoon:2727-2759](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L2727-L2759), [jibb.hoon:2892-2902](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L2892-L2902) and 3 more |
116+| A9 | Path-segment loops, open-mold-line loops and item/line name branches are near copies; some proposed merges are not clearly simpler | Low | Partly | duplication | [jibb.hoon:3087-3105](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L3087-L3105), [jibb.hoon:3375-3391](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L3375-L3391), [jibb.hoon:4048-4064](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L4048-L4064) and 6 more |
117+
118+### Checker core (`jibb.hoon` 4597–8364)
119+
120+| # | Finding | Severity | Verdict | Kind | Where |
121+| --- | --- | --- | --- | --- | --- |
122+| A10 | An imported Hoon (unit T) is a %collection, but the prelude unit is an origin-tagged union, so fall, need and (unit T) casts give false definite errors | High | Confirmed | bug | [jibb.hoon:6339-6350](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L6339-L6350), [jibb.hoon:5437-5439](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L5437-L5439), [jibb.hoon:8245-8255](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L8245-L8255) and 3 more |
123+| A11 | Same-origin, non-generic unions are compared by raw case equality, so a union reached through two import faces fails once a case contains a relabelled nested union | Medium | Confirmed | bug | [jibb.hoon:4857-4860](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L4857-L4860), [jibb.hoon:5415-5418](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L5415-L5418), [jibb.hoon:6553-6582](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L6553-L6582) and 1 more |
124+| A12 | Definite errors inside local `++` definitions are deferred and then replaced by the site-less 'local definitions need unsupported inference' | Medium | Confirmed | gap | [jibb.hoon:7236-7258](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L7236-L7258), [jibb.hoon:7284-7300](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L7284-L7300) |
125+| A13 | Union inhabitation and gate-free proofs only recognize list/unit collections, so union matches on cases holding imported map/set/qeu/mop/jar/jug fail closed | Medium | Confirmed | gap | [jibb.hoon:4792-4794](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L4792-L4794), [jibb.hoon:5784-5788](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L5784-L5788), [jibb.hoon:6342-6350](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L6342-L6350) |
126+| A14 | The import bridge rejects bare `@` and other unsigned auras, and recursive molds with `?` or `*` fields; the aura whitelist is duplicated | Medium | Confirmed | gap | [jibb.hoon:6326-6329](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L6326-L6329), [jibb.hoon:6198-6209](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L6198-L6209), [jibb-import.hoon:1522-1526](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb-import.hoon#L1522-L1526) |
127+| A15 | A ?- arm that matches no remaining case is reported as 'union pattern is not supported' instead of a definite unreachable-arm error | Low | Confirmed | gap | [jibb.hoon:7830-7833](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L7830-L7833), [jibb.hoon:7869-7872](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L7869-L7872), [jibb.hoon:7918-7921](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L7918-L7921) and 1 more |
128+| A16 | Variable-kind refinement relies on self-bindings that itype-walk special-cases in six copied arms (plus a seventh copy at 14523) | Low | Confirmed | robustness | [jibb.hoon:4693-4727](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L4693-L4727), [jibb.hoon:4873-4876](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L4873-L4876), [jibb.hoon:5939](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L5939) and 1 more |
129+| A17 | Union-branch coverage loop exists in three copies; list/unit branch, list-item, standard-list and fit-and-diagnose code is also duplicated, and one copy has drifted | Low | Confirmed | duplication | [jibb.hoon:7806-7945](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L7806-L7945), [jibb.hoon:7583-7673](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L7583-L7673), [jibb.hoon:7477-7519](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L7477-L7519) and 1 more |
130+| A18 | Dead fuel and sub parameters, an always-true unify, and two dead find-imported-mold lines | Low | Confirmed | dead-code | [jibb.hoon:5089-5111](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L5089-L5111), [jibb.hoon:5656-5730](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L5656-L5730), [jibb.hoon:6439-6440](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L6439-L6440) |
131+| A19 | The record-width guard counts faced spine entries, so a flat faced tuple cast to a record with a faced nested tail is refused as unsupported | Low | Confirmed | gap | [jibb.hoon:5373-5377](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L5373-L5377), [jibb.hoon:5656-5675](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L5656-L5675) |
132+| A20 | Term-literal fit into an atom ignores the literal's aura: `%1.000`, `%&` and `%1` fit @tas or ?, and `%1.000` never fits @ud, unlike Hoon; the spec is ambiguous | Low | Partly | bug | [jibb.hoon:5459-5465](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L5459-L5465), [jibb.hoon:5477-5486](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L5477-L5486), [jibb.hoon:8279](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L8279) and 2 more |
133+| A21 | Many hand-written itype 'contains X' traversals and a repeated variable-kind disjunction could share one children/fold helper | Low | Partly | simplification | [jibb.hoon:5064-5075](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L5064-L5075), [jibb.hoon:5216-5290](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L5216-L5290), [jibb.hoon:5846-5870](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L5846-L5870) and 1 more |
134+| A22 | The noun-fit comment says a bare tag is 'fixed as a constant', but the tag is bound to `*` or to the expected aura | Low | Partly | inconsistency | [jibb.hoon:5390-5396](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L5390-L5396), [jibb.hoon:5460-5463](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L5460-L5463) |
135+| A23 | Gates fit `*`, in tension with core-language.md ('a function isn't a noun'), but the prelude relies on it | Low | Partly | inconsistency | [jibb.hoon:5390-5396](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L5390-L5396), [docs/spec/core-language.md:33](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/docs/spec/core-language.md#L33), [docs/compiler.md:149](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/docs/compiler.md#L149) and 1 more |
136+
137+### Expression inference, unions, API analysis (`jibb.hoon` 8364–12535)
138+
139+| # | Finding | Severity | Verdict | Kind | Where |
140+| --- | --- | --- | --- | --- | --- |
141+| A24 | Full module check reports overlaps that the partial report proves (atoms, ? vs a loobean, nested tags) as 'unsupported', with no overlap evidence | Medium | Confirmed | inconsistency | [jibb.hoon:11340-11351](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L11340-L11351), [jibb.hoon:11352-11365](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L11352-L11365), [jibb.hoon:10965-10993](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L10965-L10993) and 3 more |
142+| A25 | module-scope-valid checks /% mark names against the value namespace, though /% binds only a mold | Low | Confirmed | inconsistency | [jibb.hoon:11232-11242](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L11232-L11242), [jibb.hoon:11298-11311](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L11298-L11311), [jibb.hoon:11893-11903](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L11893-L11903) and 2 more |
143+| A26 | Five unreferenced arms (plus the iwidth-elaboration type) and header comments sitting above unrelated arms | Low | Confirmed | dead-code | [jibb.hoon:8585-8603](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L8585-L8603), [jibb.hoon:8919-8920](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L8919-L8920), [jibb.hoon:9099-9104](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L9099-L9104) and 4 more |
144+| A27 | request-graph-merge re-inlines input matching and the bound check; its fuel arguments never limit; the unconditional bound contradicts 'request-bearing graphs alone have a size limit' | Low | Confirmed | inconsistency | [jibb.hoon:11656-11728](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L11656-L11728), [jibb.hoon:14192](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L14192), [jibb.hoon:14234-14235](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L14234-L14235) and 1 more |
145+| A28 | istate (27 fields) is built as a positional tuple at 10 sites | Low | Confirmed | robustness | [jibb.hoon:5807](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L5807), [jibb.hoon:10297](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L10297), [jibb.hoon:10324](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L10324) and 8 more |
146+| A29 | prepare-prelude*, module-mold-types*, union-state budgets and several small predicates are near-copies | Low | Confirmed | duplication | [jibb.hoon:11614-11634](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L11614-L11634), [jibb.hoon:11352-11377](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L11352-L11377), [jibb.hoon:10704-10721](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L10704-L10721) and 5 more |
147+| A30 | Nested unfaced tail brackets get their own duplicate-field scope (documented), while field reads treat the whole spine as one record, so [a=@ud [a=@t b=?]] is accepted but a.x is 'ambiguous' | Low | Partly | bug | [jibb.hoon:11058](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L11058), [jibb.hoon:11098](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L11098), [jibb.hoon:11141-11150](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L11141-L11150) and 4 more |
148+| A31 | API analysis duplicates its -source/-graph gates, keeps a dead one-request-interface-source and a narrow branch that multi-request nearly subsumes | Low | Partly | duplication | [jibb.hoon:12006-12043](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L12006-L12043), [jibb.hoon:12112-12178](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L12112-L12178), [jibb.hoon:12253-12359](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L12253-L12359) and 3 more |
149+| A32 | Expression and itype walkers repeat the same per-kind dispatch and per-container helpers | Low | Partly | duplication | [jibb.hoon:9917-10018](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L9917-L10018), [jibb.hoon:10936-10955](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L10936-L10955), [jibb.hoon:11134-11231](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L11134-L11231) and 5 more |
150+| A33 | infer-recursive-gate is retried for every failed definition, including non-self-referencing gates, and a failed single self-loop is retried again via infer-gate-group | Low | Partly | performance | [jibb.hoon:10287-10307](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L10287-L10307), [jibb.hoon:10234-10256](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L10234-L10256), [jibb.hoon:10309-10328](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L10309-L10328) and 3 more |
151+| A34 | %gate and %gate-wide get separate ?- arms with identical bodies in the inference chapter | Low | Partly | simplification | [jibb.hoon:8559-8576](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L8559-L8576), [jibb.hoon:9850-9910](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L9850-L9910), [jibb.hoon:10031-10047](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L10031-L10047) and 2 more |
152+| A35 | Four capital helpers repeat the same resolve-to-ident block; show-itype has five identical variable arms; 'is a variable' tests are inlined in several places | Low | Partly | simplification | [jibb.hoon:9640-9699](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L9640-L9699), [jibb.hoon:9537-9552](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L9537-L9552), [jibb.hoon:8904](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L8904) and 4 more |
153+| A36 | infer-call-context-args and infer-fragment's two-name %wing branch duplicate existing gates; raw-expected use at the 'direct' context sites is deliberate but uncommented | Low | Partly | simplification | [jibb.hoon:9419-9433](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L9419-L9433), [jibb.hoon:8840-8844](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L8840-L8844), [jibb.hoon:8423-8431](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L8423-L8431) and 2 more |
154+
155+### Program, page and store mains; entry points; deferred inference (`jibb.hoon` 12535–15172)
156+
157+| # | Finding | Severity | Verdict | Kind | Where |
158+| --- | --- | --- | --- | --- | --- |
159+| A37 | An undocumented 32,768-node freshness scan, repeated in up to six recovery arms, silently turns off program recovery when it runs out or meets a %recursive type | Medium | Confirmed | robustness | [jibb.hoon:12747](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L12747), [jibb.hoon:12909](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L12909), [jibb.hoon:13302](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L13302) and 6 more |
160+| A38 | The keyed-view screen also skips ordinary inference of init, so an init that would check ordinarily is rejected unless it matches the tuple-ending-null or null-sample recovery shape | Medium | Partly | bug | [jibb.hoon:10293](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L10293), [jibb.hoon:12997-13037](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L12997-L13037), [jibb.hoon:14152-14173](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L14152-L14173) and 4 more |
161+| A39 | Unannotated init recovery is limited to a tuple ending in `~` or a `~` sample; dropping the null-sample gate in program-plain-init-context covers reordered models and keeps the init guards | Medium | Partly | gap | [jibb.hoon:13595](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L13595), [jibb.hoon:13650-13752](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L13650-L13752), [jibb.hoon:12692-12706](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L12692-L12706) and 4 more |
162+| A40 | Full-check failures collapse to generic boundary messages: no definition named, API reasons discarded, and a derived-name clash (a spec error) reported as unsupported | Medium | Partly | gap | [jibb.hoon:14189-14190](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L14189-L14190), [jibb.hoon:14087](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L14087), [jibb.hoon:14092](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L14092) and 4 more |
163+| A41 | compiler.md and status.md describe the program-recovery chain inaccurately (nonempty subscriptions, 'doomed' screen, missing null-sample and plain-view recoveries), and a comment points the wrong way | Low | Confirmed | docs | [docs/compiler.md:139](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/docs/compiler.md#L139), [docs/compiler.md:141](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/docs/compiler.md#L141), [docs/status.md:50](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/docs/status.md#L50) and 2 more |
164+| A42 | The golden-types entry chain parses and duplicate-checks the source up to three times, the deferred paths parse and resolve again, eligibility guards are repeated, and golden-types-with-modules has no callers | Low | Confirmed | simplification | [jibb.hoon:14297-14392](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L14297-L14392), [jibb.hoon:14943-15017](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L14943-L15017), [jibb.hoon:14176-14185](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L14176-L14185) and 3 more |
165+| A43 | The no-prelude report prints a bare 'module has reserved proj name' without the partial-inference header, the prepared path reports 'module has conflicting names', and the no-prelude branch is untested | Low | Confirmed | inconsistency | [jibb.hoon:14393-14394](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L14393-L14394), [jibb.hoon:14344-14347](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L14344-L14347), [jibb.hoon:11305](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L11305) |
166+| A44 | The 'narrow' API branch with one-request-interface-graph is redundant for blog.jibb: multi-request-interface-graph produces the identical interface and cache | Low | Confirmed | simplification | [jibb.hoon:14078-14093](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L14078-L14093), [jibb.hoon:12307-12362](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L12307-L12362), [jibb.hoon:12488-12531](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L12488-L12531) and 1 more |
167+| A45 | Unused parameters, no-op scans and defensive or unreachable checks in the recovery and dg arms | Low | Confirmed | dead-code | [jibb.hoon:12713](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L12713), [jibb.hoon:14585-14591](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L14585-L14591), [jibb.hoon:14842](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L14842) and 6 more |
168+| A46 | The partial golden-types report uses its own resolver, with no program recovery and no grec index, so it disagrees with the full checker; this is deliberate, labelled and tested | Low | Partly | inconsistency | [jibb.hoon:14385-14508](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L14385-L14508), [jibb.hoon:14400](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L14400), [jibb.hoon:14152-14173](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L14152-L14173) and 1 more |
169+| A47 | The experimental deferred (dg-*) transaction cannot affect a prelude-backed full check; this is already documented, and the cost is maintenance | Low | Partly | gap | [jibb.hoon:14176-14185](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L14176-L14185), [jibb.hoon:14972](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L14972), [jibb.hoon:15014](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L15014) and 4 more |
170+| A48 | Program recovery arms repeat the same preamble and a 25-35 line tail, which has drifted slightly; a shared helper would remove a few hundred lines, not most of 1,000 | Low | Partly | duplication | [jibb.hoon:12712-12816](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L12712-L12816), [jibb.hoon:12874-12972](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L12874-L12972), [jibb.hoon:13266-13341](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L13266-L13341) and 4 more |
171+| A49 | grec proves one fixed recursive-tree layout on purpose; unfolding re-proves it and re-asserts its shape with 16 ?> checks instead of reusing the parts the proof found | Low | Partly | simplification | [jibb.hoon:15085-15115](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L15085-L15115), [jibb.hoon:15118-15157](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L15118-L15157), [tests/type-generic-recursion/about.txt:1-12](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tests/type-generic-recursion/about.txt#L1-L12) and 1 more |
172+
173+### Hoon importer, `%jibb` mark and prelude
174+
175+| # | Finding | Severity | Verdict | Kind | Where |
176+| --- | --- | --- | --- | --- | --- |
177+| A50 | The source fallback accepts only %tas head tags, and the catalog has no hoon.hoon or zuse unions, so $% or $? with %&, %\| or %0 tags, (each a b) and json all fail closed, although the spec's import table lists them | Medium | Partly | gap | [jibb-import.hoon:104-110](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb-import.hoon#L104-L110), [jibb-import.hoon:383](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb-import.hoon#L383), [jibb-import.hoon:413](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb-import.hoon#L413) and 5 more |
178+| A51 | +fixture-test is never called, but tests/importer/about.txt says it checks the structured values | Low | Confirmed | dead-code | [jibb-import.hoon:1720](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb-import.hoon#L1720), [jibb-import.hoon:1727-1839](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb-import.hoon#L1727-L1839), [tests/importer/about.txt:57-58](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tests/importer/about.txt#L57-L58) |
179+| A52 | About 540 lines (about 23%) of test-only fixture arms live in the importer library that app desks vendor | Low | Confirmed | simplification | [jibb-import.hoon:1720-1839](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb-import.hoon#L1720-L1839), [jibb-import.hoon:1887-2306](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb-import.hoon#L1887-L2306), [tests/lib/jibb-import.hoon:42](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tests/lib/jibb-import.hoon#L42) and 1 more |
180+| A53 | The importer header and two jibb.hoon comments name +read-mold, which no caller uses and which cannot import collections, instead of +read-named or +read-mark | Low | Confirmed | inconsistency | [jibb-import.hoon:1-31](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb-import.hoon#L1-L31), [jibb.hoon:5640](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L5640), [jibb.hoon:11032](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L11032) |
181+| A54 | prelude-inventory.md still lists the 3g shapes as future work and contradicts itself on the 2a inference status | Low | Confirmed | docs | [docs/prelude-inventory.md:141-157](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/docs/prelude-inventory.md#L141-L157), [docs/prelude-inventory.md:35](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/docs/prelude-inventory.md#L35), [docs/prelude-inventory.md:39-52](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/docs/prelude-inventory.md#L39-L52) and 1 more |
182+| A55 | The importer drops a mop's comparator, as the spec's (mop K V) decision implies, so lte and gth mops import identically; whether the order should be checked is a design question, not an importer bug | Low | Partly | gap | [jibb-import.hoon:1242-1266](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb-import.hoon#L1242-L1266), [jibb-import.hoon:1578-1581](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb-import.hoon#L1578-L1581), [docs/spec/decisions.md:39](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/docs/spec/decisions.md#L39) and 2 more |
183+| A56 | The definite-overlap witness covers only a top-level $? of tagged cells, as documented; duplicate $% tags, ?(%a %a) and nested overlaps report 'could not be verified' | Low | Partly | inconsistency | [jibb-import.hoon:416-441](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb-import.hoon#L416-L441), [jibb-import.hoon:390-401](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb-import.hoon#L390-L401), [tests/importer/tree.txt:76-78](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tests/importer/tree.txt#L76-L78) and 1 more |
184+| A57 | The provenance preamble, the local-chapter scan and the standard-collection name list are copied in many places | Low | Partly | duplication | [jibb-import.hoon:527-532](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb-import.hoon#L527-L532), [jibb-import.hoon:552-557](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb-import.hoon#L552-L557), [jibb-import.hoon:629-634](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb-import.hoon#L629-L634) and 12 more |
185+| A58 | Several helpers are near-copies; the $% and $? case scans differ only in a budget that was deliberately added to the $? path alone | Low | Partly | simplification | [jibb-import.hoon:88-102](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb-import.hoon#L88-L102), [jibb-import.hoon:168-181](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb-import.hoon#L168-L181), [jibb-import.hoon:124-163](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb-import.hoon#L124-L163) and 8 more |
186+| A59 | The opt-in diagnostic readers re-run provenance, the overlap witness and the walk after a failure; this is documented | Low | Partly | performance | [jibb-import.hoon:624-660](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb-import.hoon#L624-L660), [jibb-import.hoon:535-536](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb-import.hoon#L535-L536), [docs/compiler.md:107](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/docs/compiler.md#L107) and 1 more |
187+| A60 | jibb.hoon's header still says milestone 1 and lists a partial API; compiler.md's 'From the header' table and its %api chapter row do not match the file | Low | Partly | docs | [jibb.hoon:1-36](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L1-L36), [docs/compiler.md:25-38](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/docs/compiler.md#L25-L38), [docs/compiler.md:51](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/docs/compiler.md#L51) and 3 more |
188+| A61 | The %jibb mark's %txt round trip drops the final newline, deliberately mirroring %hoon; changing grab txt would also require changing tools/ship's assertion | Low | Partly | robustness | [mar/jibb.hoon:6](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/mar/jibb.hoon#L6), [mar/jibb.hoon:11](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/mar/jibb.hoon#L11), [mar/jibb.hoon:14](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/mar/jibb.hoon#L14) and 2 more |
189+| A62 | +$ attr spells pad and gap as eight constant cases where a spacing mold and two cases would match the other attributes | Low | Partly | simplification | [prelude.jibb:405-417](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb/prelude.jibb#L405-L417), [docs/spec/overview.md:198](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/docs/spec/overview.md#L198), [docs/spec/overview.md:204](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/docs/spec/overview.md#L204) |
190+| A63 | internal.jibb has no comment saying that list.core and unit.core are the public prelude's validated molds, which the compiler injects; tuba-text has no sample mold | Low | Partly | docs | [internal.jibb:1](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb/internal.jibb#L1), [internal.jibb:22](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb/internal.jibb#L22), [internal.jibb:29-33](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb/internal.jibb#L29-L33) and 2 more |
191+| A64 | The prelude's mold each (Hoon 1c) and the element gate each are unrelated, as the spec requires; whether to rename is a spec question | Low | Partly | inconsistency | [prelude.jibb:131-133](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb/prelude.jibb#L131-L133), [prelude.jibb:464-465](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb/prelude.jibb#L464-L465), [docs/spec/overview.md:184](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/docs/spec/overview.md#L184) and 2 more |
192+
193+### Python tooling
194+
195+| # | Finding | Severity | Verdict | Kind | Where |
196+| --- | --- | --- | --- | --- | --- |
197+| A65 | Ship.processes() treats any process whose argv names the absolute pier path as the king, tools/ship itself included, so `tools/ship --pier /abs/pier stop` can SIGTERM itself and `start` reports 'already running' with no ship | Medium | Confirmed | bug | [tools/ship:285-305](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tools/ship#L285-L305), [tools/ship:340-344](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tools/ship#L340-L344), [tools/ship:388-409](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tools/ship#L388-L409) and 2 more |
198+| A66 | sync's verify reports a zero-byte .txt file as different: %txt stores ~ (an atom) for it, MANIFEST classifies any atom as %cord before checking for %txt, and verify() requires 'wain' for .txt; docs blame the ship | Medium | Confirmed | bug | [tools/ship:693-696](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tools/ship#L693-L696), [tools/ship:1437-1439](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tools/ship#L1437-L1439), [docs/development.md:206](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/docs/development.md#L206) and 1 more |
199+| A67 | When the batched eval dies, tools/golden reruns every case alone, each compiling the whole library (no bisection), under the same 600 s timeout, and Ctrl-C does not stop the queued reruns | Medium | Confirmed | robustness | [tools/golden:363-396](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tools/golden#L363-L396), [tools/golden:285-286](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tools/golden#L285-L286), [tools/golden:522-526](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tools/golden#L522-L526) |
200+| A68 | jibb-import.hoon is spliced into the '(harness)' segment, so its compile errors get the 'golden harness doesn't compile / golden arm must be' headline with harness line numbers, and crash frames inside the reader are dropped | Low | Confirmed | bug | [tools/golden:243-247](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tools/golden#L243-L247), [tools/golden:287-294](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tools/golden#L287-L294), [tools/golden:311-316](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tools/golden#L311-L316) and 1 more |
201+| A69 | tools/ship test/sync/gen-tests accept a nonexistent --golden folder: zero cases are generated, the other tests/lib programs are dropped as 'isolated', and -test passes with 0 tests | Low | Confirmed | gap | [tools/ship:1018-1021](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tools/ship#L1018-L1021), [tools/ship:877-898](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tools/ship#L877-L898), [tools/ship:1754-1778](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tools/ship#L1754-L1778) and 1 more |
202+| A70 | ship-selftest hard-codes 44 tests/lib program names (11 of the 55 are missing) and dozens of fixture names that assemble() copies generically | Low | Confirmed | test-gap | [tools/testdata/ship-selftest:301-345](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tools/testdata/ship-selftest#L301-L345), [tools/testdata/ship-selftest:346-448](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tools/testdata/ship-selftest#L346-L448) |
203+| A71 | check_fixture_crash_isolated in tools/testdata/selftest runs the real 15k-line compiler and asserts on checker output, contradicting the 'about half a minute' docstring | Low | Confirmed | inconsistency | [tools/testdata/selftest:373-410](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tools/testdata/selftest#L373-L410), [tools/testdata/selftest:5](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tools/testdata/selftest#L5) |
204+| A72 | tools/golden embeds the prelude and internal prelude twice per module-types program (as arms and inline in prepare-prelude) and repeats the read-to-rap-literal code several times | Low | Confirmed | simplification | [tools/golden:201-222](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tools/golden#L201-L222), [tools/golden:263-286](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tools/golden#L263-L286) |
205+| A73 | delete_batches keeps an empty-list special case (`batches or partition([])`) that only a selftest relies on; sync never calls it with no paths | Low | Confirmed | simplification | [tools/ship:1512-1538](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tools/ship#L1512-L1538), [tools/testdata/ship-selftest:550-554](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tools/testdata/ship-selftest#L550-L554) |
206+| A74 | A non-UTF-8 about.txt makes tools/golden and tools/ship gen-tests die with a UnicodeDecodeError traceback and exit 1 instead of a report and exit 2 | Low | Confirmed | robustness | [tools/golden_case.py:34-41](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tools/golden_case.py#L34-L41), [tools/golden:160-168](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tools/golden#L160-L168), [tools/ship:1114](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tools/ship#L1114) and 1 more |
207+| A75 | tools/golden substitutes harness placeholders after splicing in case sources, so a Jibb source that interpolates {types-expr}, {import-helper}, {modules-expr}, {module-helper} or {prelude-helper} is silently rewritten or breaks the harness (latent: nothing in the corpus triggers it) | Low | Partly | bug | [tools/golden:287-294](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tools/golden#L287-L294), [tools/golden:243-247](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tools/golden#L243-L247), [tools/golden:285-286](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tools/golden#L285-L286) and 1 more |
208+| A76 | The eval and ship runners duplicate per-case metadata handling and the fixture-compiling Hoon helpers, and crash isolation has drifted (the ship's plain check-types is not under mule); the per-batch/per-case entry-point choice is equivalent and keeps stub libraries minimal | Low | Partly | duplication | [tools/golden:103-143](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tools/golden#L103-L143), [tools/golden:248-262](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tools/golden#L248-L262), [tools/ship:1058-1168](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tools/ship#L1058-L1168) and 5 more |
209+| A77 | tools/ship keeps its own copies of noun decoding, cord-literal escaping, display paths and KNOT/TERM; some are not drop-in replaceable (tuple vs Cell nouns, pier-first urbit lookup) | Low | Partly | duplication | [tools/ship:121-228](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tools/ship#L121-L228), [tools/ship:83-84](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tools/ship#L83-L84), [tools/ship:266-273](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tools/ship#L266-L273) and 6 more |
210+| A78 | tools/clay-fixtures repeats one run/compare/print block for 11 fixtures (plus build, import and Tlon variants), and the Tlon step clones tools/ship into a scratch repo just to add one /sur file; the restore has no timeout | Low | Partly | simplification | [tools/clay-fixtures:54-145](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tools/clay-fixtures#L54-L145), [tools/clay-fixtures:188-238](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tools/clay-fixtures#L188-L238), [tools/clay-fixtures:147-186](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tools/clay-fixtures#L147-L186) and 1 more |
211+| A79 | tools/ship defaults to /root/urbit/zod and /root/src/tools/pkg/click/click (documented and overridable), and its find_urbit ignores $URBIT | Low | Partly | tooling | [tools/ship:53-54](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tools/ship#L53-L54), [tools/ship:18-24](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tools/ship#L18-L24), [tools/noun.py:5-6](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tools/noun.py#L5-L6) and 2 more |
212+
213+### Test harness
214+
215+| # | Finding | Severity | Verdict | Kind | Where |
216+| --- | --- | --- | --- | --- | --- |
217+| A80 | Eval scripts cut or bypass the ship's test- arms and keep their own copies of the check lists, so eval and ship run different wrapper code | Medium | Confirmed | inconsistency | [tools/type-store-test:19-34](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tools/type-store-test#L19-L34), [tests/lib/jibb-store.hoon:256-260](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tests/lib/jibb-store.hoon#L256-L260), [tools/type-todo-full-test:21-32](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tools/type-todo-full-test#L21-L32) and 6 more |
218+| A81 | Test copies of my-app files are guarded inconsistently: the todo /sur and mark copies and all 14 golden copies are unchecked, and no check parses my-app's own .jibb files | Medium | Confirmed | gap | [tests/type-api-paths/about.txt:2](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tests/type-api-paths/about.txt#L2), [tests/type-api-paths/todo-sur.txt](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tests/type-api-paths/todo-sur.txt), [tests/type-api-paths/todo-action.txt](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tests/type-api-paths/todo-action.txt) and 3 more |
219+| A82 | The 49 tools/type-*-test scripts and importer-test rebuild by hand the bindings each ship test file already declares; a generic runner over tests/lib could replace most of them and run several times faster | Medium | Partly | simplification | [tools/type-deferred-prepared-test:10-48](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tools/type-deferred-prepared-test#L10-L48), [tools/type-todo-full-test:16-97](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tools/type-todo-full-test#L16-L97), [tools/type-arithmetic-guards-test:13-28](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tools/type-arithmetic-guards-test#L13-L28) and 1 more |
220+| A83 | The committed, generated tests/lib/jibb.hoon (3,949 lines) is never used: assembly drops it and regenerates it | Low | Confirmed | simplification | [tools/ship:887-898](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tools/ship#L887-L898), [tools/ship:1754-1778](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tools/ship#L1754-L1778), [docs/development.md:186](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/docs/development.md#L186) and 1 more |
221+| A84 | Each new test is registered by hand in several places, and some of those lists are incomplete | Low | Confirmed | duplication | [tools/testdata/ship-selftest:304-346](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tools/testdata/ship-selftest#L304-L346), [tools/testdata/ship-selftest:348-446](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tools/testdata/ship-selftest#L348-L446), [docs/development.md:3](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/docs/development.md#L3) and 2 more |
222+| A85 | Some checks test little: a one-line pass/fail golden file for unification, and three Hoon-versus-Hoon reference files that build the full library for nothing | Low | Confirmed | simplification | [tests/checker/unification.txt:1](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tests/checker/unification.txt#L1), [tests/lib/jibb-typecheck.hoon:5-13](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tests/lib/jibb-typecheck.hoon#L5-L13), [tools/testdata/succ-hoon-reference.hoon:1-9](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tools/testdata/succ-hoon-reference.hoon#L1-L9) and 3 more |
223+| A86 | 36 tests/lib files repeat the same lines-to-cord helper, and many suites build Jibb sources inline from '\0a' cords | Low | Confirmed | duplication | [tests/lib/jibb-store.hoon:8-45](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tests/lib/jibb-store.hoon#L8-L45), [tests/lib/jibb-program-watch.hoon:12-55](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tests/lib/jibb-program-watch.hoon#L12-L55) |
224+| A87 | The golden naming table documents only lex-, inline- and doc- prefixes, and 10 about.txt files miss required lines; nothing lints them | Low | Confirmed | docs | [docs/development.md:212-218](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/docs/development.md#L212-L218), [tests/golden/types-constructor-context/about.txt:1](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tests/golden/types-constructor-context/about.txt#L1), [tests/golden/types-partial-locals/about.txt:1](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tests/golden/types-partial-locals/about.txt#L1) and 1 more |
225+| A88 | Fixture folders, script names, arm names and flags follow no consistent mapping | Low | Confirmed | inconsistency | [tests/type-program-watch/about.txt:1](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tests/type-program-watch/about.txt#L1), [tools/type-gate-free-source-test:13](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tools/type-gate-free-source-test#L13), [tools/type-program-init-test:27-32](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tools/type-program-init-test#L27-L32) and 3 more |
226+| A89 | tools/clay-fixtures repeats one run-and-compare block per fixture, and the importer fixture list is spread over several places with a hand-kept count | Low | Confirmed | duplication | [tools/clay-fixtures:15-238](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tools/clay-fixtures#L15-L238), [tools/importer-test:10-37](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tools/importer-test#L10-L37), [tests/lib/jibb-import.hoon:3-42](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tests/lib/jibb-import.hoon#L3-L42) and 1 more |
227+| A90 | The docs' claims about 2,000-line modules and 100,000 nested brackets have no automated test | Low | Confirmed | test-gap | [docs/compiler.md:209](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/docs/compiler.md#L209), [docs/development.md:230](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/docs/development.md#L230) |
228+| A91 | Five 'Before pushing' checks run through tools/hoon are eyeball checks: they exit 0 whatever value they print | Low | Partly | bug | [docs/development.md:179-183](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/docs/development.md#L179-L183), [tools/hoon:149-171](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tools/hoon#L149-L171) |
229+| A92 | No single command runs the ~65-command push checklist (about 49 minutes serially); CI is planned only for milestone 7 | Low | Partly | gap | [docs/development.md:124-192](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/docs/development.md#L124-L192), [docs/development.md:234](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/docs/development.md#L234), [docs/spec/implementation-plan.md:31](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/docs/spec/implementation-plan.md#L31) |
230+| A93 | The importer's +fixture-test is never run although tests/importer/about.txt says it checks structured values; test-support arms live in the shipped libraries | Low | Partly | dead-code | [jibb-import.hoon:1720-1842](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb-import.hoon#L1720-L1842), [tests/importer/about.txt:58](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tests/importer/about.txt#L58), [jibb.hoon:4505-4595](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L4505-L4595) and 2 more |
231+| A94 | Type-checker golden cases also carry full token and tree outputs (about 73% of all parser golden lines), a deliberate trade-off that adds churn when sources or printers change | Low | Partly | simplification | [docs/spec/implementation-plan.md:40](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/docs/spec/implementation-plan.md#L40), [docs/development.md:12](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/docs/development.md#L12), [tools/ship:947](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tools/ship#L947) |
232+
233+### Documentation
234+
235+| # | Finding | Severity | Verdict | Kind | Where |
236+| --- | --- | --- | --- | --- | --- |
237+| A95 | status.md says the cart store fully checks (line 54) and also that it fails closed (line 68), because the golden-types path and the full-module path disagree and status.md never says which it means | Medium | Confirmed | inconsistency | [docs/status.md:54](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/docs/status.md#L54), [docs/status.md:68](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/docs/status.md#L68), [tests/golden/doc-grammar-06-cart-store/types.txt:2](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tests/golden/doc-grammar-06-cart-store/types.txt#L2) and 2 more |
238+| A96 | The hand-maintained check lists have drifted: status.md's 'Checking it' misses 18 checks, the README names 27 of the 49 type-* tools, and development.md:3 points to the README as the full reference | Medium | Confirmed | tooling | [docs/status.md:234-286](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/docs/status.md#L234-L286), [docs/development.md:3](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/docs/development.md#L3), [docs/development.md:124-194](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/docs/development.md#L124-L194) and 3 more |
239+| A97 | status.md is a 59 KB append-only log: a 16,412-character paragraph, a 115-row history table that repeats git log, and stale dates | Medium | Confirmed | docs | [docs/status.md:3](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/docs/status.md#L3), [docs/status.md:68](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/docs/status.md#L68), [docs/status.md:90](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/docs/status.md#L90) and 2 more |
240+| A98 | `eq` is absent from the prelude and the checker has no gate-free type-variable constraint, and no doc lists either as outstanding | Medium | Partly | gap | [docs/open-questions.md:17](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/docs/open-questions.md#L17), [docs/spec/decisions.md:31](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/docs/spec/decisions.md#L31), [docs/spec/grammar.md:137](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/docs/spec/grammar.md#L137) and 4 more |
241+| A99 | decisions.md's Core language row still says three rules are proposed, but core-language.md marks none and the decisions rows record them as adopted | Low | Confirmed | inconsistency | [docs/spec/decisions.md:63](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/docs/spec/decisions.md#L63), [docs/spec/core-language.md:5](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/docs/spec/core-language.md#L5), [docs/spec/decisions.md:21](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/docs/spec/decisions.md#L21) and 2 more |
242+| A100 | The EBNF admits `[]` but not `m()`, the checker reports `[]` as unsupported rather than as the decided error, nothing tests `[]`, and open-questions Q6 is stale | Low | Confirmed | inconsistency | [docs/spec/grammar.md:245](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/docs/spec/grammar.md#L245), [docs/spec/grammar.md:250](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/docs/spec/grammar.md#L250), [docs/spec/decisions.md:13](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/docs/spec/decisions.md#L13) and 6 more |
243+| A101 | compiler.md's chapter table omits `%union-analysis`, which holds the golden-types and module-checking entry points; the page and the file header still say milestone 1 | Low | Confirmed | docs | [docs/compiler.md:3](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/docs/compiler.md#L3), [docs/compiler.md:23-38](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/docs/compiler.md#L23-L38), [docs/compiler.md:44-57](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/docs/compiler.md#L44-L57) and 4 more |
244+| A102 | Three docs say starting urbit eval and building the library takes about 8 s; it takes about 23 s now | Low | Confirmed | docs | [docs/development.md:122](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/docs/development.md#L122), [docs/compiler.md:209](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/docs/compiler.md#L209), [docs/status.md:112](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/docs/status.md#L112) |
245+| A103 | open-questions.md mostly holds settled questions, against its own stated rule, its 'as of' date is stale, and status.md cites a nonexistent 'corpus question 3' | Low | Confirmed | docs | [docs/open-questions.md:3](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/docs/open-questions.md#L3), [docs/open-questions.md:21](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/docs/open-questions.md#L21), [docs/status.md:108](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/docs/status.md#L108) and 1 more |
246+| A104 | 'The doc itself is the authority' conflicts with the repo spec, which records decisions the Claude doc does not yet have | Low | Confirmed | inconsistency | [docs/development.md:9](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/docs/development.md#L9), [README.md:3](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/README.md#L3), [docs/README.md:3](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/docs/README.md#L3) and 2 more |
247+| A105 | prelude-inventory.md says nine molds already in the prelude 'can be written once present', and its 2a table disagrees with its own paragraph | Low | Confirmed | docs | [docs/prelude-inventory.md:141-159](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/docs/prelude-inventory.md#L141-L159), [docs/prelude-inventory.md:35-52](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/docs/prelude-inventory.md#L35-L52), [prelude.jibb:58-97](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb/prelude.jibb#L58-L97) |
248+| A106 | Tool narratives have been appended under Ground rules and Commits in development.md, and status content sits in the docs/README.md index | Low | Confirmed | docs | [docs/development.md:17](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/docs/development.md#L17), [docs/development.md:236](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/docs/development.md#L236), [docs/README.md:5](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/docs/README.md#L5) |
249+| A107 | The repo has no licence and does not state the licences of its vendored code; CI is deliberately deferred to milestone 7 | Low | Partly | gap | [README.md:1](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/README.md#L1), [vendor/SOURCES.txt:1](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/vendor/SOURCES.txt#L1), [tests/importer/tlon-license.txt:1](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tests/importer/tlon-license.txt#L1) and 1 more |
250+
251+### Example desk, host desk and vendored files
252+
253+| # | Finding | Severity | Verdict | Kind | Where |
254+| --- | --- | --- | --- | --- | --- |
255+| A108 | my-app files are copied 28 times under tests/, with sync pairs hand-coded in 8 tools and several copies never checked | Medium | Confirmed | duplication | [tools/type-page-main-test:15-30](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tools/type-page-main-test#L15-L30), [tools/type-todo-full-test:16-19](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tools/type-todo-full-test#L16-L19), [tools/type-todo-partial-test:18-21](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tools/type-todo-partial-test#L18-L21) and 9 more |
256+| A109 | Nothing compares the five todo reader copies (todo-sur.txt and four mark copies) with my-app. Clay checks cover only item, action and the todo-action mark | Medium | Partly | test-gap | [tools/type-todo-partial-test:18-34](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tools/type-todo-partial-test#L18-L34), [tools/type-todo-full-test:16-43](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tools/type-todo-full-test#L16-L43), [tools/type-page-main-test:15-40](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tools/type-page-main-test#L15-L40) and 5 more |
257+| A110 | The example marks are built only as Hoon cores (%ca); no test builds them as marks (%cb) or checks their vale | Low | Confirmed | test-gap | [tests/clay-fixtures/build.txt:6-11](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tests/clay-fixtures/build.txt#L6-L11), [tests/clay-fixtures/mark-shape.txt:4](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tests/clay-fixtures/mark-shape.txt#L4), [tools/ship:685](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tools/ship#L685) |
258+| A111 | The my-app assembly skips jibb-dev/tests, which does not exist | Low | Confirmed | dead-code | [tools/ship:63](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tools/ship#L63), [README.md:81](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/README.md#L81), [tools/ship:2261](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tools/ship#L2261) |
259+| A112 | Milestone-4 tension: my-app deliberately holds the failing buttons example, and its doc-identical theme names a static font that milestone 4 will treat as missing | Low | Partly | gap | [my-app/ui/components/buttons.jibb:3](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/my-app/ui/components/buttons.jibb#L3), [my-app/ui/theme.jibb:7](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/my-app/ui/theme.jibb#L7), [docs/prompts/milestone-2.md:154](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/docs/prompts/milestone-2.md#L154) and 4 more |
260+| A113 | Importer-only fixtures (sur/import-fixture.hoon, mar/label.hoon) sit on the example desk, and the Tlon probe needs a temp-copy, sync and restore of my-app | Low | Partly | simplification | [my-app/sur/import-fixture.hoon:1-7](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/my-app/sur/import-fixture.hoon#L1-L7), [my-app/mar/label.hoon:1](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/my-app/mar/label.hoon#L1), [tools/clay-fixtures:144-187](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tools/clay-fixtures#L144-L187) and 2 more |
261+| A114 | The importer fixture's $^(@ud [a=@ud b=@t]) is a malformed $^ whose mold accepts only atom-headed cells, though its type (and the import) admits atoms | Low | Partly | bug | [my-app/sur/import-fixture.hoon:6](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/my-app/sur/import-fixture.hoon#L6), [tests/clay-fixtures/ford-nested-union-expected.txt:1](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tests/clay-fixtures/ford-nested-union-expected.txt#L1), [tests/clay-fixtures/ford-nested-union-bridge-expected.txt:1](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tests/clay-fixtures/ford-nested-union-bridge-expected.txt#L1) and 1 more |
262+| A115 | my-app/mar/todo-action.hoon claims it is 'not supplied by the design doc', but apart from that comment line it is the overview's block | Low | Partly | inconsistency | [my-app/mar/todo-action.hoon:1](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/my-app/mar/todo-action.hoon#L1), [docs/spec/overview.md:310-316](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/docs/spec/overview.md#L310-L316), [tests/type-api-paths/todo-action.txt:1](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tests/type-api-paths/todo-action.txt#L1) and 1 more |
263+| A116 | No %todo/%blog fixture agents and no page embedding basket exist yet for milestones 5-6, and my-app's agentless desk.bill `~` is undocumented | Low | Partly | gap | [my-app/desk.bill:1](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/my-app/desk.bill#L1), [docs/spec/overview.md:350](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/docs/spec/overview.md#L350), [docs/spec/overview.md:358](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/docs/spec/overview.md#L358) and 4 more |
264+| A117 | Every desk gets all vendor packages by documented design (so app desks carry lib/test.hoon), and the zuse kelvin is hand-copied in two desks | Low | Partly | simplification | [tools/ship:59-69](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tools/ship#L59-L69), [tools/ship:881-884](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tools/ship#L881-L884), [vendor/SOURCES.txt:9-10](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/vendor/SOURCES.txt#L9-L10) and 3 more |
265+| A118 | SOURCES.txt credits the docket files to urbit/urbit's legacy pkg/landscape and records a machine-local path; the files themselves are current | Low | Partly | docs | [vendor/SOURCES.txt:1-15](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/vendor/SOURCES.txt#L1-L15) |
266+
267+### Architecture (cross-cutting)
268+
269+| # | Finding | Severity | Verdict | Kind | Where |
270+| --- | --- | --- | --- | --- | --- |
271+| A119 | The one-site keyed-view screen skips ordinary inference for all five program components, so a fully annotated, valid program is rejected | High | Confirmed | bug | [jibb.hoon:10293](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L10293), [jibb.hoon:12975-13038](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L12975-L13038), [jibb.hoon:13595](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L13595) and 3 more |
272+| A120 | 49 near-identical type-*-test scripts each start an eval and rebuild the library | Medium | Confirmed | tooling | [tools/type-closed-gate-guards-test:1-29](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tools/type-closed-gate-guards-test#L1-L29), [tools/type-todo-full-test:19-98](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tools/type-todo-full-test#L19-L98), [tools/golden:61](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tools/golden#L61) |
273+| A121 | The checker grows by example-fitted recovery slices rather than a module-wide deferred-constraint core; the brief suggests that core but does not prescribe it | Medium | Partly | gap | [docs/prompts/milestone-2.md:130-142](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/docs/prompts/milestone-2.md#L130-L142), [docs/spec/implementation-plan.md:15](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/docs/spec/implementation-plan.md#L15), [jibb.hoon:4674-4691](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L4674-L4691) and 2 more |
274+| A122 | The partial golden report and the full-module interface are separate pipelines with duplicated finalization, and the typed goldens exercise only the report | Medium | Partly | inconsistency | [jibb.hoon:14385-14510](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L14385-L14510), [jibb.hoon:10266-10286](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L10266-L10286), [jibb.hoon:14176-14184](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L14176-L14184) and 1 more |
275+| A123 | %gate and %gate-wide carry identical fields and the checker handles both identically | Low | Confirmed | simplification | [jibb.hoon:945-948](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L945-L948), [jibb.hoon:8559-8575](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L8559-L8575), [jibb.hoon:9848-9862](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L9848-L9862) |
276+| A124 | Hard-coded budgets are scattered, and the printer's 26-variable cap also gates interface acceptance | Low | Confirmed | robustness | [jibb.hoon:10279](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L10279), [jibb.hoon:10095](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L10095), [jibb.hoon:14939](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L14939) and 3 more |
277+| A125 | The 27-field istate is built from positional literals in 10 places, and resolver arms take up to 19 positional arguments | Low | Confirmed | robustness | [jibb.hoon:5807](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L5807), [jibb.hoon:10287-10297](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L10287-L10297), [jibb.hoon:10309-10324](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L10309-L10324) |
278+| A126 | Tests call 137 internal library arms directly, coupling guards to the current code shape | Low | Confirmed | test-gap | [tests/lib/jibb-deferred.hoon:1](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tests/lib/jibb-deferred.hoon#L1), [tests/lib/jibb-cell-branch.hoon:1](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tests/lib/jibb-cell-branch.hoon#L1), [tests/lib/jibb-generic-pattern.hoon:1](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tests/lib/jibb-generic-pattern.hoon#L1) |
279+| A127 | About 586 lines of jibb-import.hoon, which app desks vendor, are test fixtures and printers | Low | Confirmed | simplification | [jibb-import.hoon:1720-2308](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb-import.hoon#L1720-L2308), [jibb.hoon:5555-5615](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L5555-L5615), [README.md:11](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/README.md#L11) |
280+| A128 | my-app sources are copied 28 times under tests, with 9 hand-written byte checks in 8 tools | Low | Confirmed | duplication | [tools/type-page-main-test:14-31](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tools/type-page-main-test#L14-L31), [tests/golden/types-module-fixtures/modules/ui/api/blog.jibb:1](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tests/golden/types-module-fixtures/modules/ui/api/blog.jibb#L1) |
281+| A129 | Several AST walker families and itype predicates repeat the same recursion skeleton | Low | Partly | simplification | [jibb.hoon:7097-7223](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L7097-L7223), [jibb.hoon:9917-10022](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L9917-L10022), [jibb.hoon:11059-11297](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L11059-L11297) and 2 more |
282+| A130 | Dead arms, copy-pasted -source/-graph twins and many golden-types wrappers | Low | Partly | duplication | [jibb.hoon:8591-8603](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L8591-L8603), [jibb.hoon:8661-8666](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L8661-L8666), [jibb.hoon:10142-10145](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L10142-L10145) and 6 more |
283+| A131 | The library header and compiler.md chapter map are stale (milestone 1, no %union-analysis), and %union-analysis mislabels about 4,700 lines | Low | Partly | inconsistency | [jibb.hoon:1-36](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L1-L36), [jibb.hoon:10452](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L10452), [docs/compiler.md:3](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/docs/compiler.md#L3) and 2 more |
284+| A132 | The prelude source is reparsed on each direct-prelude-evidence call, and program-recovery-names is recomputed for every definition | Low | Partly | performance | [jibb.hoon:8633-8647](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L8633-L8647), [jibb.hoon:10293](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L10293), [jibb.hoon:11488-11492](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L11488-L11492) and 2 more |
285+
286+### Found by the completeness pass
287+
288+| # | Finding | Severity | Verdict | Kind | Where |
289+| --- | --- | --- | --- | --- | --- |
290+| A133 | Loobean, unit/list and union ?- branches join arm results by three different rules: a loobean branch rejects a decimal literal against @ud even under ^- @ud, a unit/list branch unifies them but cannot widen, and a union branch requires syntactically equal normalized types | Medium | Confirmed | inconsistency | [jibb.hoon:8518-8519](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L8518-L8519), [jibb.hoon:7671-7672](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L7671-L7672), [jibb.hoon:7841-7842](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L7841-L7842) and 2 more |
291+| A134 | Printed types name the private prelude module: `(ask.internal @ud)` and `(unit qath.internal)` appear when ask or qath is reached through page or theme, and a golden and a ship test lock this in | Medium | Confirmed | bug | [jibb.hoon:11423-11436](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L11423-L11436), [prelude.jibb:3](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb/prelude.jibb#L3), [prelude.jibb:338](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb/prelude.jibb#L338) and 6 more |
292+| A135 | Top-level resolution is a whole-module fixpoint that resolves one link of a forward chain per pass. It re-infers every unresolved definition and rescans the module on each pass, giving roughly cubic cost, and the SCC order it already computes is used only for cycles. | Medium | Partly | performance | [jibb.hoon:10309-10328](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L10309-L10328), [jibb.hoon:10293](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L10293), [jibb.hoon:10303](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L10303) and 6 more |
293+| A136 | The type printer leaves right-nested tuples unflattened and does not name non-recursive records or imported non-recursive Hoon molds; the missing-tag error for a named imported union lists its cases instead of naming it | Low | Partly | inconsistency | [jibb.hoon:9570](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L9570), [jibb.hoon:9562-9565](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/jibb-dev/lib/jibb.hoon#L9562-L9565), [tests/golden/types-missing-tag-imported/types.txt:2-3](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tests/golden/types-missing-tag-imported/types.txt#L2-L3) and 5 more |
294+| A137 | Every eval tool compiles with `!:`, which makes checker work about 2.2-2.6x slower and library build about 20% slower than a ship build; docs/ never says so, though the published figures are caveated A/B comparisons and status.md's 8 s startup figure is stale | Low | Partly | docs | [tools/urbit_eval.py:176-185](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/tools/urbit_eval.py#L176-L185), [docs/compiler.md:65](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/docs/compiler.md#L65), [docs/compiler.md:67](https://github.com/iko-soy/jibb/blob/4bf477e2c4a093f7d2d6aa2bff1ce5858bd98e36/docs/compiler.md#L67) and 5 more |
docs/status.md+7−1
@@ -39,6 +39,8 @@ The internal prelude defines a transparent generic `ask` with pure, agent and st
3939
4040The public prelude now contains the source-backed UI length/attribute molds, all element constructors, and exact program/page records and builders. The full 19-case generic `element` union is nonrecursive: nested child, keyed-item and table payloads are `*`, while public constructor schemes preserve typed composition and independent key types. `island` returns `(element !!)` with `[program data]` as its erased payload. The focused UI golden checks exact schemes, static and message-bearing composition, concrete programs/pages/islands, malformed inputs and selected mismatches. A child-message mismatch fails closed as an unsupported constraint. Raw-constructor encapsulation, duplicate-attribute checks, rendering, storage, navigation and execution are not claimed.
4141
42+The remaining doc fragments now also have full detailed and legacy checks: the import-only module resolves its real `/sur`, mark and Jibb-module inputs; `view-day` and `step` check with their exact exported schemes; and the `cmd`/`sub` block checks at the prelude path against the canonical printed schemes. Additional consumers use all three imported names, and the shared eval/ship fixture rejects missing `/sur`, mark and Jibb-module inputs.
43+
4244The documented buttons library now fully checks its valid `labelled` and `wide` definitions with their exact generic element and attribute-list schemes. Ordinary positional calls unify a variable argument with the body of an expected faced sample slot without propagating that slot face. When full checking would otherwise reject an incomplete module, a failure-only retry of at most 64 missing definitions can report a still-pending tag at its source; the unchanged buttons module thus reports that nothing fixes the union of `%add`, with the actual excerpt, through both detailed and legacy inference. Successful checks do not run that retry. The shared eval/ship fixture is type checking only and claims no UI runtime.
4345
4446The public prelude now defines the exact documented `theme` record, including required text tokens, an optional `qath` font and optional dark tones. A shared eval/ship fixture fully checks the byte-identical `my-app/ui/theme.jibb`, checks its exact exported type and structural downstream import, and covers absent dark tones plus wrong nested auras, missing fields and wrong font/dark types. On 2026-11-01, @iko chose explicit backtick syntax for present units, and the documented dark record now uses it. No contrast check, rendering, routing or other theme behavior is implemented.
@@ -69,6 +71,10 @@ The Hoon reader's tagged-union source proof also handles `$~` default wrappers.
6971
7072The repository spec records the subsequent type-system and prelude decisions, including the chosen `like` result-mapping gate; those changes also need synchronization to the Claude document. An initial inference fragment and a standalone Hoon type reader are being tested. The fragment explicitly reports that it does not check a module; partial bridges pass Hoon `*` in supported nonrecursive molds, selected Hoon atoms, term singletons, the null singleton, the two loobean singletons and their exact fork, nested faced or unfaced cells, supported disjoint unions and opaque standard collections from `/sur` molds and marks into inference. Collections retain their names and supported arguments for printing and unification; nested supported union arguments are retained too. The bridge trusts unchanged results from the source-aware reader; a materialized type graph alone cannot reveal cases Hoon already collapsed. The source-validated standard prelude `list` mold shares this representation with imported lists; other Jibb-written collection molds and most prelude collection operations remain unsupported; malformed names and arities fail closed. Selected self-recursive `/sur` molds, including Tlon `notes.import-node` with list-wrapped self references, cross as opaque module-and-name identities; aliases, foreign references, recursive marks, unfolding and construction remain unsupported. The reader handles mark samples, including a source-proved nonrecursive union from a single Ford-imported `/sur` core, recursive molds whose origins can be verified through Ford imports, nested collections, direct ordered maps, including source-validated named operands such as Tlon `notes.log`, certain ordered-map fields, direct `$^` unions whose cases can be proved disjoint, and one verified explicit union argument in a list, set, map or unit. Tagged `$%` cases can additionally use restricted local named payload molds, bare `~` fields and one level of local named tagged unions, as in real Tlon `notes`, with bounded source proof; unsupported or ambiguous dependencies fail closed. Ambiguous recursive origins fail closed; recognizable explicit unions are checked from source before Hoon can collapse their cases, as @iko confirmed for imported `$%`, `$?` and `$^`, while other nested unions, nested ordered maps, general union disjointness and complete import integration remain unfinished. Opt-in structured reader APIs preserve successful graphs and distinguish definite unsupported-aura and core evidence from failures the reader cannot prove; unverified union disjointness and name-only vase recognition remain unsupported. They revalidate and re-walk failed types. An opt-in partial checker entry point consumes unchanged reader results and reports definite aura or core errors at imported mold use sites when their inputs are unique. Ordered replay covers nested cell samples, record and function casts, and non-generic same-module aliases; unsupported prefixes, cycles and shadowing stop it. Union molds, generic applications, transitive modules and unsupported reader outcomes remain generic. Replay repeats inference and may add work. The partial checker resolves a subset of ordinary library imports in dependency order using supplied Jibb sources and a source-derived partial prelude interface, caches completed interfaces per run, detects missing sources and cycles, and resolves nested fields of imported values with independent scheme instantiation. The source-backed internal prelude defines `poke` and the public prelude re-exports it as a transparent type. A dedicated trusted preparation path supplies private comparison and arithmetic schemes to the Jibb-written `gth`, `add` and `dec` wrappers; ordinary imports cannot access them. The public `add` and `dec` wrappers use private arithmetic interfaces; supported inference preserves the shared atom constraint that excludes loobeans. Primitive execution, jet recognition and length remain unfinished. The partial checker resolves its supported source shape and rejects ordinary imports of the private path. An imported API with one mark and a matching direct `+$ poke` declaration can export a constructor and retain agent/mark metadata when the representation has the supported agent case. A separate partial analysis resolves supported API path declarations and their full and diff mark types, including the todo paths; it does not by itself create requests or check an API module. Ordinary imports additionally infer the supported multi-path request-gate types described above. Complete private module checking, other API shapes, request lowering, root API and kind checking, stores, complete `ask` and `pure` checking and runtime effects remain unfinished. A possible store or root API with `+$ poke` reports unsupported kind or scope, while definite duplicates and unrelated shadowing still report conflicts. The prelude includes the doc-exact generic `cmd` union; the prelude inventory is incomplete. The inference fragment supports unrestricted `@`, selected one-way widenings including aura-family ancestors, generalized atom constraints arising from explicit capitals or bare sample binders, acyclic local value definitions with captures, selected single self-recursive top-level and local gates, simple and nonrecursive generic mold aliases, selected faced record casts and field reads, and contextual tags, `~` and constructors for closed disjoint unions, including direct nonrecursive generic unions and propagation through complete loobean and unit-shaped branches in casts and known union-sample calls, including nested branches. Known loobean result context also propagates through supported complete branches and binder-only cell arms; binder-only arms over union subjects remain unsupported. A directly known named union can instantiate an unconstrained generic gate sample with its origin, generic arguments and faces preserved; unnamed, pending, recursive and variable-bound cases remain unsupported. A known gate with an unresolved result variable can receive a known enclosing result type before its arguments are inferred; unknown calls and unresolved targets remain conservative. Multi-argument calls form a right-nested sample, retain known faces and shared type variables, and can use known sample positions to contextualize list and union arguments. A definite mismatch points to the failing argument when the fragment can establish it, otherwise to the combined sample; unsupported contextual forms still fail closed. For a supported recursive gate, the checker infers the sample first and uses its exact type, including field faces, for one monomorphic self reference. It generalizes after the body is checked; subsequent uses instantiate it independently. Incompatible recursive arguments can report the gate and argument sites. For a complete loobean branch with one direct self-call arm, a separately inferred closed base type can seed the recursive result before the whole body is checked. Open or pending base types do not seed it; other branch shapes remain subject to the fragment’s existing limits. A supported single local recursive gate also uses a monomorphic self reference and generalizes variables free of the enclosing environment after checking its body; captured variables remain shared. The checker collects written capitals per `++` before inference, excluding nested definitions: a capital used in an enclosing definition is shared with its locals even when written later, while a capital introduced only in a local definition is generalized there. Sibling locals can introduce independent capitals with the same spelling; generic mold parameters keep their own scope. Top-level groups of syntactic gates are inferred together with monomorphic placeholders and shared substitutions, then generalized only after the whole group checks; downstream uses and library interfaces instantiate those schemes independently. A dependency graph identifies groups with two iterative depth-first passes; its conservative local-reference edges can reject otherwise valid programs. Supported local mutually recursive gate groups also use shared monomorphic placeholders and generalize only after the group checks, preserving captured outer variables. A bounded dependency proof reports certain non-gate cycles through values and gates when an explicit atom or loobean result cast and simple unshadowed expressions establish the cycle. Other mixed gate/value cycles, polymorphic recursion, unresolved literal constraints and unresolved branch joins remain unsupported. Reporting repeats inference for a single recursive gate outside a group; grouped reports use the stored schemes. Its performance cost remains unmeasured. A single-arm cell pattern accepts two or more binders, the last capturing the remaining tail; duplicate and shadowed binders are rejected. A structured single-arm pattern also works for a known non-union cell when coverage is proven, including nested literal and wildcard positions. Intermediate union or collection tails, nested patterns, wildcards and faced records remain unsupported. String interpolation accepts known atom auras, unrestricted `@`, tapes and isolated decimal literals; a known cell asks for a printer, and an explicitly generic atom asks for an aura. Loobeans, term singletons, non-tape collections, open types and a type fixed only later remain unsupported. A known closed union with two or more arms supports patterns that provably cover or exclude each remaining case, including payload binders, imported and generic cases, and binder-free catch-alls. Partial boolean patterns can split known `?` positions into their two noun values, up to 64 alternatives across the union; binders retain their original case type. Missing alternatives and covered arms are reported. Other partial patterns, expansions above the limit, binders spanning distinct cases, differing arm result types and some complex two-arm subjects remain unsupported. A cast or known call sample can supply result context through whole-case arms and supported finite loobean refinements for a known union accessed by a wing, a grouped wing or a supported shallow call, including nested cell and list positions; other partial-pattern contexts and subject forms remain unsupported. The Grammar’s `step` block infers in this fragment, but its module is not yet checked. A bare tag proved absent from a known union reports the union and tag sites in casts, single-argument calls, unit payloads, list items and supported branch arms; imported unnamed unions print their cases. Ordered fit replay can identify a missing tag nested in a syntactic tuple, stopping at an earlier mismatch or uncertainty. Known faced records support uniquely named field changes, including nested wings, with field context passed to replacements and the original record type retained. Missing fields, empty changes and definite mismatches report sites; the expected-type site is the edit because the original field declaration location is not retained. Unknown or partly unfaced spines, ambiguous fields and repeated edits remain unsupported. A known record cast supplies field context to its tuple or record initializer, including nested list and union fields; mismatch diagnostics use the cast mold because the original field declaration location is not retained. Isolated cart-style `init` and `update` expressions infer, while the complete cart-store fails closed because its kind and declaration scope remain unchecked. Uncontextualized list literals infer a fresh element type, including empty and nested lists, with independently generalized uses. Unresolved item tags and uncertain widening remain unsupported. Backtick unit construction uses the validated standard prelude unit template, infers its payload without losing pending constraints, and makes the prelude’s `some` available. Ordinary result annotations also let its `bind`, `biff`, `both`, `clap`, `clef` and `flit` infer. A known unit in a cast, call, list item or record field supplies context to its payload, including nested units and lists; mismatches identify the payload and context. Unrelated union identities, some variable-dependent fits, and missing or altered prelude unit templates remain unsupported. Literal singleton heads compare by runtime noun, so `|=%$` also matches explicit null- and loobean-zero-headed cases. When equal heads have disjoint payloads, the constructor selects a uniquely proven compatible payload; unknown and ambiguous candidates remain unsupported. Unresolved nulls remain pending and are reported separately from tags. A known union of `~` and a null-headed cell supports a complete `~` / `[~ value]` branch in either order, including shadow checks; unknown subjects, missing or duplicate arms, and unresolved branch results remain unsupported. This fragment infers the prelude’s `fall` and `need` signatures. With the validated prelude list and a known cast or gate sample, empty, nonempty and nested list literals infer their element types, including contextual union tags; a mismatched element names both sites. In that context `~` and zero-valued terms fit an empty list, and two-item unfaced cells form cons lists, including nested cons and imported-list contexts; invalid heads or tails name both sites. A known gate sample also supplies context to matching positions in a single tuple or record argument, including nested cells; zero literals can fit list positions. A bound zero constant remains unsupported rather than a definite mismatch, and an unknown callee does not supply context. Faced or longer cells and a missing or altered prelude list fail closed. A known list result also supplies context through complete loobean, unit-shaped and list-shaped branches, including recursive and nested branches. For a known standard list with a supported element type, a complete `~` / `[item rest]` branch infers the element and tail types in either arm order and checks binders for shadowing. Unknown subjects, unsupported element types and other or incomplete list patterns remain unsupported. A value with type variable `A` can fit a field whose type is that same `A`, including in generic union payloads and nested or repeated record fields. Other variable-dependent face merges remain unsupported. Forced equality of distinct written capitals now reports both source sites, following @iko’s decision; forcing one to a concrete type remains unsupported. Imported record spines with repeated faces fail closed where used, but only with a generic unsupported diagnostic. Hoon may erase unfaced nested-cell boundaries, so the check can conservatively reject valid names in distinct erased scopes. Supported closed unions print using an in-scope name or imported alias; an unnamed nongeneric union prints its cases, parenthesized when nested. The latter is print-only. Generic union types retain all arguments in their printed name; if that name is unavailable, the partial printer reports the limitation. Different import faces for the same origin remain compatible; compatibility across distinct union origins and some generic-argument comparisons remain unsupported. Nonrecursive generic aliases can reorder, repeat or omit parameters while retaining a union’s origin, including through local scopes and library interfaces. A generic union declared directly inside a body remains unsupported, as do differing-variable face constraints in a union payload. A transitive generic union whose name is unavailable is reported as unsupported instead of hiding its arguments. Unfixed decimal literals default to `@ud` in gate-free inferred types; recursive molds, general branch tag context, other constraint cases and defaulting inside gate types still need work. Collection recognition checks the originating core and fails closed on shadows or unsupported Ford subject shapes; a wrapper regression also rejects forged subjects, samples and tails. Its golden fixtures include three real Tlon files. A Clay test passes a Ford-built nested union through the reader into partial inference. The partial prelude includes `murn`, `join`, `snip`, `rear` and the agreed shared-type `clap`; supported calls infer, while backend validation remains outstanding, and [prelude-inventory.md](prelude-inventory.md) is a source audit, not the complete inventory or signatures. The milestone remains unfinished.
7173
74+The prelude now writes `hunt` with the ordering gate first, matching the target Hoon's `(hunt ord a b)`. Its focused golden infers both ordering outcomes and absent units, and reports mismatched unit payloads and ordering-gate samples. Execution and jet recognition remain unverified.
75+
76+The prelude now also writes `eq` and `mate`. A dedicated constrained variable retains `A contains no gates` through nested unification, canonicalization, instantiation and imports; atom constraints remain stronger. Direct and nested gate arguments fail, while open cell, face, collection and union members receive the constraint with bounded traversal and substitution updates. `set`, `map`, `mop`, `jar` and `jug` constrain only their key positions, leaving map values independent. The shared solver guards cover existing and later gate injection, exact traversal budgets and conservative budget fallback; backend equality and crash behavior remain unverified.
77+
7278The shared prelude interface reserves every name present in the supplied vendored source and makes only supported inferred entries available, including `list`, `unit`, `same`, `fall`, `need`, `bond`, `lure`, `weld`, `snoc`, `turn` and `lent`. The validated standard `list` mold is injected when the prelude’s own gates are inferred; `weld` and `turn` have ordinary explicit result casts. An absent or altered `list` is not injected, and an altered declaration cannot leak through direct or transitive mold aliases. The same validated template is available when prelude mold aliases are prepared, so supported direct and transitive aliases can use it. Unsupported entries such as most list helpers remain reserved but unavailable; backend validation of the helpers remains outstanding. All callers use the same prelude origin, so a library can export a type containing unqualified `(unit A)` to another module. The source-only `+prepare-prelude` rejects empty, malformed, conflicting or import-bearing source; `+prepare-prelude-with-internal` also accepts the supported private internal import. Prepared values are trusted and must come unchanged from the matching preparation arm. When canonical public list or unit templates are missing or altered, independently inferred private molds remain available, while molds that depend on those templates do not. The module-scope fixture compares the prepared and source-taking paths against the real prelude and a two-module golden under eval and on the ship. The source and checker remain incomplete, so this does not establish complete shadowing coverage or a checked module.
7379
7480The prelude has a Jibb-written `succ` gate that increments through `add`; partial inference retains its arithmetic atom constraint. A Hoon translation agrees with Hoon on ten selected inputs. Jibb execution and jet recognition remain unverified.
@@ -108,7 +114,7 @@ What the plan asks for, and where it is:
108114Besides the plan's list:
109115
110116- 660 golden cases: 440 that parse and 220 that fail, each failure at a stated line and column. One failing case has an unclear expectation (corpus question 3). The newer type-output cases exercise only the partial inference fragment. Each case's `about.txt` quotes the doc's words it tests.
111−- The 660-case corpus passed under `urbit eval` in 111.3 s while other checks were running. The fake ship passed all 716 tests, including the source-overlap, structural-overlap, generic-union source and alias-overlap, full-module overlap, deferred-context, generic-recursion, generic-construction, generic-pattern, deferred-inference, empty-mold and cell-branch fixtures, importer, importer/checker and mark/checker bridges, module scope, unification, hole, qath, ask, default-wrapper importer, projection, arithmetic, generic-alias, positional-face, API-evidence, request, closed-gate, todo API, constructor, sub, nested-union, gate-free and direct-gate guards and the unchanged todo report. Desk sync took 110.2 s and the ship's `-test` run took 290.7 s. The importer golden compares 221 projections; `tools/clay-fixtures` builds the example Hoon fixtures through Clay, checks a recursive Ford import's origin, and passes Clay-built types through the Clay-built importer and partial checker.
117+- The 660-case corpus passed under `urbit eval` in 108.0 s while other checks were running. The fake ship passed all 717 tests, including the source-overlap, structural-overlap, generic-union source and alias-overlap, full-module overlap, deferred-context, generic-recursion, generic-construction, generic-pattern, deferred-inference, empty-mold and cell-branch fixtures, importer, importer/checker and mark/checker bridges, module scope, unification, hole, qath, ask, default-wrapper importer, projection, arithmetic, generic-alias, positional-face, API-evidence, request, closed-gate, todo API, constructor, sub, nested-union, gate-free and direct-gate guards and the unchanged todo report. Desk sync took 111.2 s and the ship's `-test` run took 316.7 s. The importer golden compares 221 projections; `tools/clay-fixtures` builds the example Hoon fixtures through Clay, checks a recursive Ford import's origin, and passes Clay-built types through the Clay-built importer and partial checker.
112118- `tools/testdata/selftest` (22 checks), `tools/testdata/ship-selftest` and `tools/testdata/clay-fixtures-selftest` test the tools themselves; the last checks temporary Clay fixture cleanup and signal handling without a ship.
113119- 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.
114120- 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).
jibb-dev/lib/jibb.hoon+216−38
@@ -4657,7 +4657,8 @@
46574657::
46584658+$ itype
46594659 $~ [%var 0]
4660− $% [%var id=@ud]
4660+ $% [%var id=@ud]
4661+ [%fvar id=@ud]
46614662 [%avar id=@ud]
46624663 [%rvar id=@ud]
46634664 [%nvar id=@ud]
@@ -4693,35 +4694,35 @@
46934694 |= [t=itype sub=isub]
46944695 ^- itype
46954696 ?+ -.t t
4696− %var
4697+ ?(%var %fvar)
46974698 =/ found=(unit itype) (itype-lookup id.t sub)
46984699 ?~ found t
4699− ?: &(|(?=(%rvar -.u.found) ?=(%rnvar -.u.found)) =(id.t +.u.found)) u.found
4700+ ?: &(|(?=(%fvar -.u.found) ?=(%rvar -.u.found) ?=(%rnvar -.u.found)) =(id.t +.u.found)) u.found
47004701 $(t u.found)
47014702 %avar
47024703 =/ found=(unit itype) (itype-lookup id.t sub)
47034704 ?~ found t
4704− ?: &(|(?=(%rvar -.u.found) ?=(%rnvar -.u.found)) =(id.t +.u.found)) u.found
4705+ ?: &(|(?=(%fvar -.u.found) ?=(%rvar -.u.found) ?=(%rnvar -.u.found)) =(id.t +.u.found)) u.found
47054706 $(t u.found)
47064707 %rvar
47074708 =/ found=(unit itype) (itype-lookup id.t sub)
47084709 ?~ found t
4709− ?: &(|(?=(%rvar -.u.found) ?=(%rnvar -.u.found)) =(id.t +.u.found)) u.found
4710+ ?: &(|(?=(%fvar -.u.found) ?=(%rvar -.u.found) ?=(%rnvar -.u.found)) =(id.t +.u.found)) u.found
47104711 $(t u.found)
47114712 %nvar
47124713 =/ found=(unit itype) (itype-lookup id.t sub)
47134714 ?~ found t
4714− ?: &(|(?=(%rvar -.u.found) ?=(%rnvar -.u.found)) =(id.t +.u.found)) u.found
4715+ ?: &(|(?=(%fvar -.u.found) ?=(%rvar -.u.found) ?=(%rnvar -.u.found)) =(id.t +.u.found)) u.found
47154716 $(t u.found)
47164717 %rnvar
47174718 =/ found=(unit itype) (itype-lookup id.t sub)
47184719 ?~ found t
4719− ?: &(|(?=(%rvar -.u.found) ?=(%rnvar -.u.found)) =(id.t +.u.found)) u.found
4720+ ?: &(|(?=(%fvar -.u.found) ?=(%rvar -.u.found) ?=(%rnvar -.u.found)) =(id.t +.u.found)) u.found
47204721 $(t u.found)
47214722 %tag
47224723 =/ found=(unit itype) (itype-lookup id.t sub)
47234724 ?~ found t
4724− ?: &(|(?=(%rvar -.u.found) ?=(%rnvar -.u.found)) =(id.t +.u.found)) u.found
4725+ ?: &(|(?=(%fvar -.u.found) ?=(%rvar -.u.found) ?=(%rnvar -.u.found)) =(id.t +.u.found)) u.found
47254726 $(t u.found)
47264727 ==
47274728::
@@ -4774,6 +4775,7 @@
47744775 ?- -.typ
47754776 %empty `[%no fuel]
47764777 ?(%atom %any-atom %flag %const %noun %avar %rvar %nvar %rnvar %fn %jrec) `[%yes fuel]
4778+ %fvar `[%unknown fuel]
47774779 %var
47784780 ?: (lien caps |=(c=icap (hole-same-variable typ (itype-walk [%var id.c] sub)))) `[%yes fuel]
47794781 `[%unknown fuel]
@@ -4813,6 +4815,7 @@
48134815 =. t (itype-walk t sub)
48144816 ?- -.t
48154817 %var =(n id.t)
4818+ %fvar =(n id.t)
48164819 %avar =(n id.t)
48174820 %rvar =(n id.t)
48184821 %nvar =(n id.t)
@@ -4867,6 +4870,12 @@
48674870 ?: ?=(%var -.b)
48684871 ?: (itype-occurs id.b a sub) ~
48694872 `[[id.b a] sub]
4873+ ?: ?=(%fvar -.a)
4874+ ?: (itype-occurs id.a b sub) ~
4875+ (itype-bind-gate-free id.a b sub)
4876+ ?: ?=(%fvar -.b)
4877+ ?: (itype-occurs id.b a sub) ~
4878+ (itype-bind-gate-free id.b a sub)
48704879 :: Arithmetic's aura variable excludes loobeans; decimal literals
48714880 :: remain defaultable until a later constraint makes them concrete.
48724881 ?: &(?=(%nvar -.a) ?=(%rvar -.b))
@@ -4925,6 +4934,69 @@
49254934 $(a tal.a, b tal.b, sub u.first)
49264935 ~
49274936::
4937++$ igf-form [typ=itype sub=isub left=@ud]
4938++$ igf-forms [types=(list itype) sub=isub left=@ud]
4939+++ itype-gate-free-forms
4940+ |= [xs=(list itype) sub=isub fuel=@ud]
4941+ ^- (unit igf-forms)
4942+ ?~ xs `[~ sub fuel]
4943+ =/ head=(unit igf-form) (itype-gate-free-form i.xs sub fuel)
4944+ ?~ head ~
4945+ =/ tail=(unit igf-forms) $(xs t.xs, sub sub.u.head, fuel left.u.head)
4946+ ?~ tail ~
4947+ `[[typ.u.head types.u.tail] sub.u.tail left.u.tail]
4948+::
4949+++ itype-gate-free-form
4950+ |= [t=itype sub=isub fuel=@ud]
4951+ ^- (unit igf-form)
4952+ ?: =(0 fuel) ~
4953+ =. fuel (dec fuel)
4954+ =. t (itype-walk t sub)
4955+ ?- -.t
4956+ %var
4957+ =/ free=itype [%fvar id.t]
4958+ `[free [[id.t free] sub] fuel]
4959+ %fvar `[t sub fuel]
4960+ ?(%atom %any-atom %flag %const %empty %avar %rvar %nvar %rnvar %jrec) `[t sub fuel]
4961+ %face
4962+ =/ body=(unit igf-form) $(t body.t, sub sub, fuel fuel)
4963+ ?~ body ~
4964+ `[[%face name.t typ.u.body] sub.u.body left.u.body]
4965+ %cell
4966+ =/ head=(unit igf-form) $(t hed.t, sub sub, fuel fuel)
4967+ ?~ head ~
4968+ =/ tail=(unit igf-form) $(t tal.t, sub sub.u.head, fuel left.u.head)
4969+ ?~ tail ~
4970+ `[[%cell typ.u.head typ.u.tail] sub.u.tail left.u.tail]
4971+ %collection
4972+ =/ args=(unit igf-forms) (itype-gate-free-forms args.t sub fuel)
4973+ ?~ args ~
4974+ `[[%collection name.t types.u.args] sub.u.args left.u.args]
4975+ %union
4976+ =/ cases=(unit igf-forms) (itype-gate-free-forms cases.t sub fuel)
4977+ ?~ cases ~
4978+ =/ args=(unit igf-forms) (itype-gate-free-forms args.t sub.u.cases left.u.cases)
4979+ ?~ args ~
4980+ `[[%union types.u.cases origin.t label.t types.u.args] sub.u.args left.u.args]
4981+ * ~
4982+ ==
4983+::
4984+++ itype-collection-keys
4985+ |= [name=term args=(list itype) sub=isub]
4986+ ^- (unit [types=(list itype) sub=isub])
4987+ ?~ args `[~ sub]
4988+ ?. |(?=(?(%set %map %mop %jar %jug) name)) `[args sub]
4989+ =/ key=(unit igf-form) (itype-gate-free-form i.args sub 256)
4990+ ?~ key ~
4991+ `[[typ.u.key t.args] sub.u.key]
4992+::
4993+++ itype-bind-gate-free
4994+ |= [n=@ud t=itype sub=isub]
4995+ ^- (unit isub)
4996+ =/ constrained=(unit igf-form) (itype-gate-free-form t sub 256)
4997+ ?~ constrained ~
4998+ `[[n typ.u.constrained] sub.u.constrained]
4999+::
49285000++ itype-unify-args
49295001 |= [as=(list itype) bs=(list itype) sub=isub]
49305002 ^- (unit isub)
@@ -4946,10 +5018,11 @@
49465018 =. t (itype-walk t sub)
49475019 ?- -.t
49485020 %var |
5021+ %fvar |
49495022 %avar |
49505023 %rvar |
49515024 %nvar |
4952− %rnvar |
5025+ %rnvar |
49535026 %atom |
49545027 %any-atom &
49555028 %flag |
@@ -5022,6 +5095,7 @@
50225095 ^- ?
50235096 ?- -.typ
50245097 %var |
5098+ %fvar |
50255099 %avar |
50265100 %rvar |
50275101 %nvar |
@@ -5129,8 +5203,8 @@
51295203 ?. =(name.a name.b) |
51305204 (itype-face-asym-collection-args args.a args.b sub)
51315205 ?: &(?=(%face -.a) ?=(%face -.b)) $(a body.a, b body.b)
5132− ?: ?=(%face -.a) !|(?=(%var -.b) ?=(%avar -.b) ?=(%rvar -.b) |(?=(%nvar -.b) ?=(%rnvar -.b)))
5133− ?: ?=(%face -.b) !|(?=(%var -.a) ?=(%avar -.a) ?=(%rvar -.a) |(?=(%nvar -.a) ?=(%rnvar -.a)))
5206+ ?: ?=(%face -.a) !|(?=(%var -.b) ?=(%fvar -.b) ?=(%avar -.b) ?=(%rvar -.b) |(?=(%nvar -.b) ?=(%rnvar -.b)))
5207+ ?: ?=(%face -.b) !|(?=(%var -.a) ?=(%fvar -.a) ?=(%avar -.a) ?=(%rvar -.a) |(?=(%nvar -.a) ?=(%rnvar -.a)))
51345208 ?: &(?=(%cell -.a) ?=(%cell -.b)) |($(a hed.a, b hed.b) $(a tal.a, b tal.b))
51355209 ?: &(?=(%fn -.a) ?=(%fn -.b)) |($(a sample.a, b sample.b) $(a product.a, b product.b))
51365210 |
@@ -5383,9 +5457,9 @@
53835457 ?: too-wide [%unknown ~]
53845458 =/ spine-checked=? |(spine-proof ?=(^ known))
53855459 =/ uncertain=?
5386− |(?=(%var -.actual) ?=(%avar -.actual) ?=(%rvar -.actual) |(?=(%nvar -.actual) ?=(%rnvar -.actual)) ?=(%var -.expected) ?=(%avar -.expected) ?=(%rvar -.expected) |(?=(%nvar -.expected) ?=(%rnvar -.expected)))
5460+ |(?=(%var -.actual) ?=(%fvar -.actual) ?=(%avar -.actual) ?=(%rvar -.actual) |(?=(%nvar -.actual) ?=(%rnvar -.actual)) ?=(%var -.expected) ?=(%fvar -.expected) ?=(%avar -.expected) ?=(%rvar -.expected) |(?=(%nvar -.expected) ?=(%rnvar -.expected)))
53875461 =/ actual-open=?
5388− |(?=(%var -.actual) ?=(%avar -.actual) ?=(%rvar -.actual) |(?=(%nvar -.actual) ?=(%rnvar -.actual)))
5462+ |(?=(%var -.actual) ?=(%fvar -.actual) ?=(%avar -.actual) ?=(%rvar -.actual) |(?=(%nvar -.actual) ?=(%rnvar -.actual)))
53895463 =. actual (itype-walk actual sub)
53905464 =. expected (itype-walk expected sub)
53915465 ?: =(actual expected) [%ok sub next]
@@ -5440,7 +5514,7 @@
54405514 ?: &(!uncertain ?=(%union -.actual) ?=(%face -.expected))
54415515 $(expected body.expected)
54425516 ?: ?=(%union -.actual) [%unknown ~]
5443− ?: &(?=(%union -.expected) |(?=(%avar -.actual) ?=(%rvar -.actual) |(?=(%nvar -.actual) ?=(%rnvar -.actual)))) [%unknown ~]
5517+ ?: &(?=(%union -.expected) |(?=(%fvar -.actual) ?=(%avar -.actual) ?=(%rvar -.actual) |(?=(%nvar -.actual) ?=(%rnvar -.actual)))) [%unknown ~]
54445518 ?: &(?=(%union -.expected) !?=(%var -.actual))
54455519 (itype-fit-cases actual cases.expected sub next)
54465520 ?: ?=(%tag -.actual)
@@ -5448,7 +5522,7 @@
54485522 =/ u=(unit isub) (itype-unify actual expected sub)
54495523 ?~ u [%bad ~]
54505524 [%ok u.u next]
5451− ?: |(?=(%avar -.expected) ?=(%rvar -.expected) |(?=(%nvar -.expected) ?=(%rnvar -.expected))) [%unknown ~]
5525+ ?: |(?=(%fvar -.expected) ?=(%avar -.expected) ?=(%rvar -.expected) |(?=(%nvar -.expected) ?=(%rnvar -.expected))) [%unknown ~]
54525526 ?: ?=(%face -.expected) $(expected body.expected)
54535527 ?: constructor.actual
54545528 ?. ?=(%fn -.expected) [%bad ~]
@@ -5476,7 +5550,7 @@
54765550 =/ u=(unit isub) (itype-unify actual expected sub)
54775551 ?~ u [%bad ~]
54785552 [%ok u.u next]
5479− ?: |(?=(%avar -.expected) ?=(%rvar -.expected) |(?=(%nvar -.expected) ?=(%rnvar -.expected))) [%unknown ~]
5553+ ?: |(?=(%fvar -.expected) ?=(%avar -.expected) ?=(%rvar -.expected) |(?=(%nvar -.expected) ?=(%rnvar -.expected))) [%unknown ~]
54805554 ?: ?=(%face -.expected) $(expected body.expected)
54815555 ?: &(?=(%collection -.expected) =(%list name.expected) =(0 val.literal.actual))
54825556 [%unknown ~]
@@ -5519,7 +5593,7 @@
55195593 =/ unified=(unit isub) (itype-unify actual expected sub)
55205594 ?~ unified [%bad ~]
55215595 [%ok u.unified next]
5522− ?: |(?=(%avar -.expected) ?=(%rvar -.expected) |(?=(%nvar -.expected) ?=(%rnvar -.expected))) [%unknown ~]
5596+ ?: |(?=(%fvar -.expected) ?=(%avar -.expected) ?=(%rvar -.expected) |(?=(%nvar -.expected) ?=(%rnvar -.expected))) [%unknown ~]
55235597 [%bad ~]
55245598 ?: &(?=(%atom -.actual) ?=(%atom -.expected))
55255599 ?: (aura-prefix aura.expected aura.actual) [%ok sub next]
@@ -5532,7 +5606,7 @@
55325606 ?: &(?=(%face -.actual) ?=(%var -.expected)) [%unknown ~]
55335607 ?: &(?=(%var -.actual) (itype-has-any-atom expected sub))
55345608 [%unknown ~]
5535− ?: |(?=(%var -.actual) ?=(%var -.expected))
5609+ ?: |(?=(%var -.actual) ?=(%var -.expected) ?=(%fvar -.expected))
55365610 =/ unified=(unit isub) (itype-unify actual expected sub)
55375611 ?~ unified
55385612 ?: |(?=(%face -.actual) ?=(%face -.expected)) [%unknown ~]
@@ -5612,6 +5686,36 @@
56125686 (itype-fit [%collection %list ~[a]] list-t ~[[0 recursive]] 1)
56135687 =? problems !?=(%unknown -.nested-fit)
56145688 ["recursive types behind substitutions should remain uncertain" problems]
5689+ =/ free=itype [%fvar 40]
5690+ =/ open-cell=itype [%cell [%var 41] [%face %x [%var 42]]]
5691+ =/ constrained=(unit isub) (itype-unify free open-cell ~)
5692+ =/ expected-cell=itype [%cell [%fvar 41] [%face %x [%fvar 42]]]
5693+ =? problems !=(constrained [~ [[40 expected-cell] [[42 [%fvar 42]] [[41 [%fvar 41]] ~]]]])
5694+ ["gate-free constraints should propagate through cells and faces" problems]
5695+ =? problems ?=(^ (itype-unify free open-cell ~[[41 [%fn txt txt]]]))
5696+ ["an existing nested gate substitution should be rejected" problems]
5697+ =/ shared-sub=isub [[42 [%fvar 42]] [[41 [%fvar 41]] ~]]
5698+ =? problems ?=(^ (itype-unify [%var 41] [%fn txt txt] shared-sub))
5699+ ["a later nested gate substitution should be rejected" problems]
5700+ =? problems ?=(^ (itype-unify free [%fn txt txt] ~))
5701+ ["a gate-free variable should reject a gate" problems]
5702+ =? problems ?=(^ (itype-unify free [%noun ~] ~))
5703+ ["a gate-free variable should reject an opaque noun" problems]
5704+ =/ atom-strong=(unit isub) (itype-unify [%avar 43] free ~)
5705+ =? problems !=(atom-strong [~ [[40 [%avar 43]] ~]])
5706+ ["the atom constraint should be stronger than gate-free" problems]
5707+ =/ free-fit=ifit (itype-fit txt free ~ 44)
5708+ =? problems !?=(%ok -.free-fit)
5709+ ["a concrete atom should fit a gate-free variable" problems]
5710+ =/ gate-fit=ifit (itype-fit [%fn txt txt] free ~ 44)
5711+ =? problems !?=(%bad -.gate-fit)
5712+ ["a gate should not fit a gate-free variable" problems]
5713+ =/ free-scheme=ischeme [[%fn free free] ~[40]]
5714+ =/ canonical-free=itype (canonical-itype typ.free-scheme vars.free-scheme)
5715+ =? problems !=(canonical-free [%fn [%fvar 0] [%fvar 0]])
5716+ ["canonicalization should retain gate-free variables" problems]
5717+ =? problems !=((show-atom-constraint canonical-free) " where A contains no gates")
5718+ ["the printer should show gate-free constraints" problems]
56155719 problems
56165720::
56175721:: The expression inference below is deliberately a fragment: bindings,
@@ -5797,6 +5901,7 @@
57975901 %noun [%unknown & fuel ~]
57985902 %empty [%yes | fuel ~]
57995903 %var [%unknown | fuel ~]
5904+ %fvar [%yes & fuel ~]
58005905 %avar [%yes & fuel ~]
58015906 %rvar [%yes & fuel ~]
58025907 %nvar [%yes & fuel ~]
@@ -5863,10 +5968,11 @@
58635968 %tag |
58645969 %const |
58655970 %var |
5971+ %fvar |
58665972 %avar |
58675973 %rvar |
58685974 %nvar |
5869− %rnvar |
5975+ %rnvar |
58705976 %atom |
58715977 %any-atom |
58725978 %flag |
@@ -5897,6 +6003,7 @@
58976003 ^- (unit @ud)
58986004 ?- -.t
58996005 %var `id.t
6006+ %fvar `id.t
59006007 %avar `id.t
59016008 %rvar `id.t
59026009 %nvar `id.t
@@ -5917,7 +6024,7 @@
59176024 ^- ?
59186025 =. t (itype-walk t sub.state)
59196026 ?- -.t
5920− ?(%var %avar %rvar %nvar %rnvar)
6027+ ?(%var %fvar %avar %rvar %nvar %rnvar)
59216028 ?: (lien caps.state |=(c=icap (hole-same-variable t (itype-walk [%var id.c] sub.state)))) &
59226029 (lien params.state |=(p=[name=@t typ=itype] (hole-same-variable t (itype-walk typ.p sub.state))))
59236030 %tag |
@@ -5969,7 +6076,7 @@
59696076 ^- ?
59706077 =. t (itype-walk t sub.state)
59716078 ?- -.t
5972− ?(%tag %nvar %rnvar %avar %rvar) !(hole-known t state)
6079+ ?(%tag %nvar %rnvar %fvar %avar %rvar) !(hole-known t state)
59736080 %union |((lien cases.t |=(c=itype (hole-uncertain c state))) (lien args.t |=(c=itype (hole-uncertain c state))))
59746081 %grec (lien args.t |=(c=itype (hole-uncertain c state)))
59756082 %collection (lien args.t |=(c=itype (hole-uncertain c state)))
@@ -5995,6 +6102,7 @@
59956102 ^- (list @ud)
59966103 ?- -.t
59976104 %var ~[id.t]
6105+ %fvar ~[id.t]
59986106 %avar ~[id.t]
59996107 %rvar ~[id.t]
60006108 %nvar ~[id.t]
@@ -6033,6 +6141,10 @@
60336141 =/ found=(unit itype) (itype-lookup id.t ren)
60346142 ?~ found t
60356143 u.found
6144+ %fvar
6145+ =/ found=(unit itype) (itype-lookup id.t ren)
6146+ ?~ found t
6147+ u.found
60366148 %avar
60376149 =/ found=(unit itype) (itype-lookup id.t ren)
60386150 ?~ found t
@@ -6074,6 +6186,7 @@
60746186 ^- ?
60756187 ?- -.t
60766188 %var |
6189+ %fvar |
60776190 %avar =(n id.t)
60786191 %rvar =(n id.t)
60796192 %nvar =(n id.t)
@@ -6099,6 +6212,7 @@
60996212 ^- ?
61006213 ?- -.t
61016214 %var |
6215+ %fvar |
61026216 %avar |
61036217 %rvar =(n id.t)
61046218 %nvar |
@@ -6123,6 +6237,28 @@
61236237:: Canonical numbering makes printed variables independent of the order
61246238:: the unifier happened to allocate intermediates.
61256239::
6240+++ itype-var-is-gate-free-fuel
6241+ |= [n=@ud t=itype fuel=@ud]
6242+ ^- ?
6243+ ?: =(0 fuel) &
6244+ =. fuel (dec fuel)
6245+ ?- -.t
6246+ %var |
6247+ %fvar =(n id.t)
6248+ %union |((lien cases.t |=(c=itype (itype-var-is-gate-free-fuel n c fuel))) (lien args.t |=(c=itype (itype-var-is-gate-free-fuel n c fuel))))
6249+ %grec (lien args.t |=(c=itype (itype-var-is-gate-free-fuel n c fuel)))
6250+ %collection (lien args.t |=(c=itype (itype-var-is-gate-free-fuel n c fuel)))
6251+ %face $(t body.t, fuel fuel)
6252+ %fn |($(t sample.t, fuel fuel) $(t product.t, fuel fuel))
6253+ %cell |($(t hed.t, fuel fuel) $(t tal.t, fuel fuel))
6254+ * |
6255+ ==
6256+::
6257+++ itype-var-is-gate-free
6258+ |= [n=@ud t=itype]
6259+ ^- ?
6260+ (itype-var-is-gate-free-fuel n t 256)
6261+::
61266262++ canonical-itype
61276263 |= [t=itype vars=(list @ud)]
61286264 ^- itype
@@ -6130,7 +6266,7 @@
61306266 =/ n=@ud 0
61316267 |-
61326268 ?~ vars (itype-rename t ren)
6133− =/ replacement=itype ?:((itype-var-is-restricted i.vars t) [%rvar n] ?:((itype-var-is-atom i.vars t) [%avar n] [%var n]))
6269+ =/ replacement=itype ?:((itype-var-is-restricted i.vars t) [%rvar n] ?:((itype-var-is-atom i.vars t) [%avar n] ?:((itype-var-is-gate-free i.vars t) [%fvar n] [%var n])))
61346270 $(vars t.vars, ren [[i.vars replacement] ren], n +(n))
61356271::
61366272++ instantiate-scheme
@@ -6141,11 +6277,11 @@
61416277 |-
61426278 ?~ vars [(itype-rename typ.scheme ren) state]
61436279 =/ replacement=itype
6144− ?:((itype-var-is-restricted i.vars typ.scheme) [%rvar next.state] ?:((itype-var-is-atom i.vars typ.scheme) [%avar next.state] [%var next.state]))
6280+ ?:((itype-var-is-restricted i.vars typ.scheme) [%rvar next.state] ?:((itype-var-is-atom i.vars typ.scheme) [%avar next.state] ?:((itype-var-is-gate-free i.vars typ.scheme) [%fvar next.state] [%var next.state])))
61456281 :: A generalized atom variable is a valid origin for re-generalizing
61466282 :: an alias, just as a sample binder is.
61476283 =/ st=istate state(next +(next.state))
6148− =? binders.st |(?=(%avar -.replacement) ?=(%rvar -.replacement)) [next.state binders.state]
6284+ =? binders.st |(?=(%fvar -.replacement) ?=(%avar -.replacement) ?=(%rvar -.replacement)) [next.state binders.state]
61496285 $(vars t.vars, ren [[i.vars replacement] ren], state st)
61506286::
61516287++ icap-lookup
@@ -6352,7 +6488,9 @@
63526488 =/ args=(unit (list itype)) (import-to-itypes +>.node)
63536489 ?~ args ~
63546490 ?. =(arity (lent u.args)) ~
6355− `[%collection name u.args]
6491+ =/ keyed=(unit [types=(list itype) sub=isub]) (itype-collection-keys name u.args ~)
6492+ ?~ keyed ~
6493+ `[%collection name types.u.keyed]
63566494 %fork
63576495 :: Hoon's ordinary ? mold is the fork of its two %f singletons.
63586496 =/ raw=* +.node
@@ -6631,15 +6769,27 @@
66316769 ?~ rest ~
66326770 `[[i.names i.args] u.rest]
66336771::
6634−++ template-apply
6635− |= [template=ischeme args=(list itype)]
6636− ^- (unit itype)
6772+++ template-apply-sub
6773+ |= [template=ischeme args=(list itype) sub=isub]
6774+ ^- (unit [typ=itype sub=isub])
66376775 =/ vars=(list @ud) vars.template
66386776 =/ ren=isub ~
66396777 |-
6640− ?~ vars ?~(args `(itype-rename typ.template ren) ~)
6778+ ?~ vars ?~(args `[(itype-rename typ.template ren) sub] ~)
66416779 ?~ args ~
6642− $(vars t.vars, args t.args, ren [[i.vars i.args] ren])
6780+ =/ replacement=(unit igf-form)
6781+ ?: (itype-var-is-gate-free i.vars typ.template)
6782+ (itype-gate-free-form i.args sub 256)
6783+ `[i.args sub 256]
6784+ ?~ replacement ~
6785+ $(vars t.vars, args t.args, ren [[i.vars typ.u.replacement] ren], sub sub.u.replacement)
6786+::
6787+++ template-apply
6788+ |= [template=ischeme args=(list itype)]
6789+ ^- (unit itype)
6790+ =/ applied=(unit [typ=itype sub=isub]) (template-apply-sub template args ~)
6791+ ?~ applied ~
6792+ `typ.u.applied
66436793::
66446794++ infer-shape-args
66456795 |= [args=(list shape) state=istate]
@@ -6909,6 +7059,17 @@
69097059 =/ args=(unit [types=(list itype) state=istate]) (infer-shape-args args.sh state)
69107060 ?~ args ~
69117061 =/ n=term i.ref.sh
7062+ =/ keyed=(unit [types=(list itype) sub=isub])
7063+ ?: ?=(^ (find-simple-mold n molds.state.u.args))
7064+ `[types.u.args sub.state.u.args]
7065+ ?~ prelude.state.u.args
7066+ (itype-collection-keys n types.u.args sub.state.u.args)
7067+ ?: ?=(^ (find-jibb-mold n u.prelude.state.u.args))
7068+ `[types.u.args sub.state.u.args]
7069+ (itype-collection-keys n types.u.args sub.state.u.args)
7070+ ?~ keyed ~
7071+ =. types.u.args types.u.keyed
7072+ =. sub.state.u.args sub.u.keyed
69127073 ?^ t.ref.sh
69137074 ?^ t.t.ref.sh ~
69147075 =/ iface=(unit ifile) (find-jibb-interface i.t.ref.sh jimports.state.u.args)
@@ -6916,9 +7077,10 @@
69167077 =/ template=(unit ischeme) (find-jibb-mold n u.iface)
69177078 ?~ template ~
69187079 ?~ vars.u.template ~
6919− =/ applied=(unit itype) (template-apply u.template types.u.args)
7080+ =/ applied=(unit [typ=itype sub=isub]) (template-apply-sub u.template types.u.args sub.state.u.args)
69207081 ?~ applied ~
6921− `[(itype-in-import u.applied u.iface i.t.ref.sh prelude.state.u.args) state.u.args]
7082+ =. sub.state.u.args sub.u.applied
7083+ `[(itype-in-import typ.u.applied u.iface i.t.ref.sh prelude.state.u.args) state.u.args]
69227084 ?: (lien active.state.u.args |=(x=term =(x n))) ~
69237085 =/ found=(unit shape) (find-simple-mold n molds.state.u.args)
69247086 ?~ found
@@ -6927,9 +7089,10 @@
69277089 =/ prelude-entry=(unit ischeme) (find-jibb-mold n u.prelude.state.u.args)
69287090 ?~ prelude-entry ~
69297091 ?~ vars.u.prelude-entry ~
6930− =/ applied=(unit itype) (template-apply u.prelude-entry types.u.args)
7092+ =/ applied=(unit [typ=itype sub=isub]) (template-apply-sub u.prelude-entry types.u.args sub.state.u.args)
69317093 ?~ applied ~
6932− `[u.applied state.u.args]
7094+ =. sub.state.u.args sub.u.applied
7095+ `[typ.u.applied state.u.args]
69337096 ?. ?=(%generic -.u.found) ~
69347097 =/ grec=(unit itype) (simple-source-generic-recursive n u.found types.u.args state.u.args)
69357098 ?^ grec `[u.grec state.u.args]
@@ -9543,6 +9706,9 @@
95439706 %var
95449707 ?: (lth id.t 26) [(add 65 id.t) ~]
95459708 "T{<id.t>}"
9709+ %fvar
9710+ ?: (lth id.t 26) [(add 65 id.t) ~]
9711+ "T{<id.t>}"
95469712 %avar
95479713 ?: (lth id.t 26) [(add 65 id.t) ~]
95489714 "T{<id.t>}"
@@ -9606,6 +9772,7 @@
96069772 %nvar &
96079773 %rnvar &
96089774 %var |
9775+ %fvar |
96099776 %avar |
96109777 %rvar |
96119778 %atom |
@@ -9629,7 +9796,7 @@
96299796 |= [label=tape typ=itype sub=isub]
96309797 ^- tape
96319798 =/ normalized=itype (itype-normalize typ sub)
9632− ?: |(?=(%var -.normalized) ?=(%avar -.normalized) ?=(%rvar -.normalized) (itype-has-nvar normalized) (itype-has-tag normalized) (itype-has-union normalized)) label
9799+ ?: |(?=(%var -.normalized) ?=(%fvar -.normalized) ?=(%avar -.normalized) ?=(%rvar -.normalized) (itype-has-nvar normalized) (itype-has-tag normalized) (itype-has-union normalized)) label
96339800 ?: (itype-has-hidden-recursive normalized) label
96349801 =/ vars=(list @ud) (unique-type-vars (itype-vars normalized))
96359802 ?: (gth (lent vars) 26) label
@@ -9650,6 +9817,7 @@
96509817 =/ ident=(unit @ud)
96519818 ?+ -.resolved ~
96529819 %var `id.resolved
9820+ %fvar `id.resolved
96539821 %avar `id.resolved
96549822 %rvar `id.resolved
96559823 ==
@@ -9665,6 +9833,7 @@
96659833 =/ ident=(unit @ud)
96669834 ?+ -.resolved ~
96679835 %var `id.resolved
9836+ %fvar `id.resolved
96689837 %avar `id.resolved
96699838 %rvar `id.resolved
96709839 ==
@@ -9680,6 +9849,7 @@
96809849 =/ ident=(unit @ud)
96819850 ?+ -.resolved ~
96829851 %var `id.resolved
9852+ %fvar `id.resolved
96839853 %avar `id.resolved
96849854 %rvar `id.resolved
96859855 ==
@@ -9696,6 +9866,7 @@
96969866 =/ ident=(unit @ud)
96979867 ?+ -.resolved ~
96989868 %var `id.resolved
9869+ %fvar `id.resolved
96999870 %avar `id.resolved
97009871 %rvar `id.resolved
97019872 ==
@@ -9722,6 +9893,7 @@
97229893 ^- ?
97239894 ?- -.t
97249895 %var |
9896+ %fvar |
97259897 %avar =(n id.t)
97269898 %rvar =(n id.t)
97279899 %nvar |
@@ -9784,6 +9956,10 @@
97849956 =/ sep=tape ?:(printed ", " " where ")
97859957 =/ clause=tape "{sep}{(show-itype [%avar i.vars] ~)} is an atom"
97869958 $(vars t.vars, printed &, out (weld out clause))
9959+ ?: (itype-var-is-gate-free i.vars t)
9960+ =/ sep=tape ?:(printed ", " " where ")
9961+ =/ clause=tape "{sep}{(show-itype [%fvar i.vars] ~)} contains no gates"
9962+ $(vars t.vars, printed &, out (weld out clause))
97879963 $(vars t.vars)
97889964::
97899965:: Build the supported part of the value environment in dependency order.
@@ -10716,7 +10892,7 @@
1071610892++ union-state-leaf
1071710893 |= t=itype
1071810894 ^- ?
10719− ?=(?(%var %avar %rvar %nvar %rnvar %atom %any-atom %flag %noun %empty %const) -.t)
10895+ ?=(?(%var %fvar %avar %rvar %nvar %rnvar %atom %any-atom %flag %noun %empty %const) -.t)
1072010896++ union-state-params-budget
1072110897 |= [params=iparams fuel=@ud]
1072210898 ^- (unit @ud)
@@ -11473,12 +11649,14 @@
1147311649 =/ plus=ischeme [[%fn [%cell b b] b] ~[0]]
1147411650 =/ minus=ischeme [[%fn b b] ~[0]]
1147511651 =/ greater=ischeme [[%fn pair [%flag ~]] ~[0]]
11652+ =/ free=itype [%fvar 0]
11653+ =/ equal=ischeme [[%fn [%cell free free] [%flag ~]] ~[0]]
1147611654 =/ utf8=itype [%atom 'tD']
1147711655 =/ tape=itype [%collection %list ~[utf8]]
1147811656 =/ codepoints=itype [%collection %list ~[[%atom %c]]]
1147911657 =/ text-trip=ischeme [[%fn [%atom %t] tape] ~]
1148011658 =/ text-tuba=ischeme [[%fn tape codepoints] ~]
11481− [~[[%raw-add plus] [%raw-dec minus] [%raw-gth greater] [%raw-trip text-trip] [%raw-tuba text-tuba]] ~ /lib/jibb/primitives/jibb ~ ~ ~ ~ ~]
11659+ [~[[%raw-add plus] [%raw-dec minus] [%raw-gth greater] [%raw-eq equal] [%raw-trip text-trip] [%raw-tuba text-tuba]] ~ /lib/jibb/primitives/jibb ~ ~ ~ ~ ~]
1148211660::
1148311661++ infer-private-internal
1148411662 |= [src=@t public-source=@t]
@@ -14561,7 +14739,7 @@
1456114739 ?: =(0 fuel) ~
1456214740 =. fuel (dec fuel)
1456314741 =/ t=itype i.todo
14564− ?: ?=(?(%var %avar %rvar %nvar %rnvar %tag) -.t)
14742+ ?: ?=(?(%var %fvar %avar %rvar %nvar %rnvar %tag) -.t)
1456514743 =/ node-id=@ud ?:(?=(%tag -.t) id.t +.t)
1456614744 =/ found=(unit itype) (itype-lookup node-id sub)
1456714745 ?~ found $(todo t.todo, ids [node-id ids])
jibb-dev/lib/jibb/internal.jibb+1
@@ -9,6 +9,7 @@
99
1010:: The compiler supplies this private interface; execution is not yet implemented.
1111++ gth-atom |= args=[A A] (raw-gth.core args)
12+++ eq-data |= args=[A A] (raw-eq.core args)
1213
1314:: Application paths are knot sequences.
1415+$ qath
jibb-dev/lib/jibb/prelude.jibb+28
@@ -19,6 +19,8 @@
1919 %.y %.n
2020 %.n %.y
2121
22+++ eq |= args=[A A] (eq-data.internal args)
23+
2224+$ list |$ [A]
2325 ~
2426 [i=A t=(list A)]
@@ -198,6 +200,32 @@
198200 ~ first
199201 [~ b] `(combine a b)
200202
203+++ hunt |= args=[$-([A A] ?) (unit A) (unit A)]
204+ ?- args
205+ [choose first second] ^- (unit A)
206+ ?- first
207+ ~ second
208+ [~ a]
209+ ?- second
210+ ~ first
211+ [~ b]
212+ ?- (choose a b)
213+ %.y first
214+ %.n second
215+
216+++ mate |= args=[(unit A) (unit A)]
217+ ?- args
218+ [first second] ^- (unit A)
219+ ?- second
220+ ~ first
221+ [~ b]
222+ ?- first
223+ ~ second
224+ [~ a]
225+ ?- (eq a b)
226+ %.y first
227+ %.n !!
228+
201229++ clef |= args=[(unit A) (unit B) $-([A B] (unit C))]
202230 ?- args
203231 [first second combine] ^- (unit C)
tests/golden/prelude-unit-list-transforms/about.txt+2−2
@@ -1,4 +1,4 @@
1−source: Overview, Prelude: "The exported inventory includes all names from the Hoon library sections listed below, excluding the groups explicitly left out"; Hoon 2a includes `drop`, `bind`, `biff`, `flit`, `both`, `clap` and `clef`, and 2b includes `join`, `murn`, `rear`, `snip`, `skim`, `skip`, `levy`, `lien`, `roll` and `reel`. Folds take an explicit start.
2−tests: The complete current prelude parses, including unit-to-list conversion, unit mapping and flat mapping, a curried unit-producing filter, three ways to combine units, including `clap` with one shared value type, complementary list filters, present-product mapping, joining, last-item operations, all/any predicates, and left and right folds. The filters retain the order of their selected items. It also includes the source-backed `ask` re-export and `pure` gate.
1+source: Overview, Prelude: "The exported inventory includes all names from the Hoon library sections listed below, excluding the groups explicitly left out"; Hoon 2a includes `drop`, `bind`, `biff`, `flit`, `both`, `clap`, `clef`, `hunt` and `mate`, and 2b includes `join`, `murn`, `rear`, `snip`, `skim`, `skip`, `levy`, `lien`, `roll` and `reel`. Folds take an explicit start.
2+tests: The complete current prelude parses, including unit-to-list conversion, unit mapping and flat mapping, a curried unit-producing filter, several ways to combine units, including `clap` with one shared value type, and `hunt` with its ordering gate first, complementary list filters, present-product mapping, joining, last-item operations, all/any predicates, and left and right folds. The filters retain the order of their selected items. It also includes `eq` with its generalized gate-free constraint and the source-backed `ask` re-export and `pure` gate.
33expect: parses
44expect-types: a partial inference report, not a checked module; unit and list gate typing is not complete
tests/golden/prelude-unit-list-transforms/source.jibb+28
@@ -19,6 +19,8 @@
1919 %.y %.n
2020 %.n %.y
2121
22+++ eq |= args=[A A] (eq-data.internal args)
23+
2224+$ list |$ [A]
2325 ~
2426 [i=A t=(list A)]
@@ -198,6 +200,32 @@
198200 ~ first
199201 [~ b] `(combine a b)
200202
203+++ hunt |= args=[$-([A A] ?) (unit A) (unit A)]
204+ ?- args
205+ [choose first second] ^- (unit A)
206+ ?- first
207+ ~ second
208+ [~ a]
209+ ?- second
210+ ~ first
211+ [~ b]
212+ ?- (choose a b)
213+ %.y first
214+ %.n second
215+
216+++ mate |= args=[(unit A) (unit A)]
217+ ?- args
218+ [first second] ^- (unit A)
219+ ?- second
220+ ~ first
221+ [~ b]
222+ ?- first
223+ ~ second
224+ [~ a]
225+ ?- (eq a b)
226+ %.y first
227+ %.n !!
228+
201229++ clef |= args=[(unit A) (unit B) $-([A B] (unit C))]
202230 ?- args
203231 [first second combine] ^- (unit C)
tests/golden/prelude-unit-list-transforms/tokens.txt+2209−2043
@@ -83,2152 +83,2318 @@
838322:1 DEDENT
848422:1 DEDENT
858522:1 NEWLINE
86−22:1 glyph +$
87−22:4 name list
88−22:9 glyph |$
89−22:12 glyph [
90−22:13 tight tvar A
91−22:14 tight glyph ]
92−23:3 INDENT
93−23:3 lit ~
94−24:3 NEWLINE
95−24:3 glyph [
96−24:4 tight name i
97−24:5 tight glyph =
98−24:6 tight tvar A
99−24:8 name t
100−24:9 tight glyph =
101−24:10 tight glyph (
102−24:11 tight name list
103−24:16 tvar A
104−24:17 tight glyph )
105−24:18 tight glyph ]
106−26:1 DEDENT
107−26:1 NEWLINE
108−26:1 glyph +$
109−26:4 name unit
110−26:9 glyph |$
111−26:12 glyph [
112−26:13 tight tvar A
113−26:14 tight glyph ]
114−27:3 INDENT
115−27:3 lit ~
116−28:3 NEWLINE
117−28:3 glyph [
118−28:4 tight lit ~
119−28:6 name u
120−28:7 tight glyph =
121−28:8 tight tvar A
122−28:9 tight glyph ]
123−30:1 DEDENT
124−30:1 NEWLINE
125−30:1 glyph ++
126−30:4 name fall
127−30:9 glyph |=
128−30:12 name args
129−30:16 tight glyph =
130−30:17 tight glyph [
131−30:18 tight glyph (
132−30:19 tight name unit
133−30:24 tvar A
134−30:25 tight glyph )
135−30:27 tvar A
136−30:28 tight glyph ]
137−31:3 INDENT
138−31:3 glyph ?-
139−31:6 name args
140−32:5 INDENT
141−32:5 glyph [
142−32:6 tight name maybe
143−32:12 name fallback
144−32:20 tight glyph ]
145−33:7 INDENT
146−33:7 glyph ?-
147−33:10 name maybe
148−34:9 INDENT
149−34:9 lit ~
150−34:11 name fallback
151−35:9 NEWLINE
152−35:9 glyph [
153−35:10 tight lit ~
154−35:12 name value
155−35:17 tight glyph ]
156−35:19 name value
157−37:1 DEDENT
158−37:1 DEDENT
159−37:1 DEDENT
160−37:1 DEDENT
161−37:1 NEWLINE
162−37:1 glyph ++
163−37:4 name need
164−37:9 glyph |=
165−37:12 name maybe
166−37:17 tight glyph =
167−37:18 tight glyph (
168−37:19 tight name unit
169−37:24 tvar A
170−37:25 tight glyph )
171−38:3 INDENT
172−38:3 glyph ?-
173−38:6 name maybe
174−39:5 INDENT
175−39:5 lit ~
176−39:7 glyph !!
177−40:5 NEWLINE
178−40:5 glyph [
179−40:6 tight lit ~
180−40:8 name value
181−40:13 tight glyph ]
182−40:15 name value
183−42:1 DEDENT
184−42:1 DEDENT
185−42:1 NEWLINE
186−42:1 glyph ++
187−42:4 name weld
188−42:9 glyph |=
189−42:12 name args
190−42:16 tight glyph =
191−42:17 tight glyph [
192−42:18 tight glyph (
193−42:19 tight name list
194−42:24 tvar A
195−42:25 tight glyph )
196−42:27 glyph (
197−42:28 tight name list
198−42:33 tvar A
199−42:34 tight glyph )
200−42:35 tight glyph ]
201−43:3 INDENT
202−43:3 glyph ?-
203−43:6 name args
204−44:5 INDENT
205−44:5 glyph [
206−44:6 tight name xs
207−44:9 name ys
208−44:11 tight glyph ]
209−45:7 INDENT
210−45:7 glyph ^-
211−45:10 glyph (
212−45:11 tight name list
213−45:16 tvar A
214−45:17 tight glyph )
215−46:9 INDENT
216−46:9 glyph ?-
217−46:12 name xs
218−47:11 INDENT
219−47:11 lit ~
220−47:13 name ys
221−48:11 NEWLINE
222−48:11 glyph [
223−48:12 tight name item
224−48:17 name rest
225−48:21 tight glyph ]
226−48:23 glyph [
227−48:24 tight name item
228−48:29 glyph (
229−48:30 tight name weld
230−48:35 name rest
231−48:40 name ys
232−48:42 tight glyph )
233−48:43 tight glyph ]
234−50:1 DEDENT
235−50:1 DEDENT
236−50:1 DEDENT
237−50:1 DEDENT
238−50:1 DEDENT
239−50:1 NEWLINE
240−50:1 glyph ++
241−50:4 name turn
242−50:9 glyph |=
243−50:12 name args
244−50:16 tight glyph =
245−50:17 tight glyph [
246−50:18 tight glyph (
247−50:19 tight name list
248−50:24 tvar A
249−50:25 tight glyph )
250−50:27 glyph $-(
251−50:30 tight tvar A
252−50:32 tvar B
253−50:33 tight glyph )
254−50:34 tight glyph ]
255−51:3 INDENT
256−51:3 glyph ?-
257−51:6 name args
258−52:5 INDENT
259−52:5 glyph [
260−52:6 tight name xs
261−52:9 name f
262−52:10 tight glyph ]
263−53:7 INDENT
264−53:7 glyph ^-
265−53:10 glyph (
266−53:11 tight name list
267−53:16 tvar B
268−53:17 tight glyph )
269−54:9 INDENT
270−54:9 glyph ?-
271−54:12 name xs
272−55:11 INDENT
273−55:11 lit ~
274−55:13 lit ~
275−56:11 NEWLINE
276−56:11 glyph [
277−56:12 tight name item
278−56:17 name rest
279−56:21 tight glyph ]
280−56:23 glyph [
281−56:24 tight glyph (
282−56:25 tight name f
283−56:27 name item
284−56:31 tight glyph )
285−56:33 glyph (
286−56:34 tight name turn
287−56:39 name rest
288−56:44 name f
289−56:45 tight glyph )
290−56:46 tight glyph ]
291−58:1 DEDENT
292−58:1 DEDENT
293−58:1 DEDENT
294−58:1 DEDENT
295−58:1 DEDENT
296−58:1 NEWLINE
297−58:1 glyph +$
298−58:4 name dime
299−58:9 glyph [
300−58:10 tight name p
301−58:11 tight glyph =
302−58:12 tight aura @ta
303−58:16 name q
304−58:17 tight glyph =
305−58:18 tight aura @
306−58:19 tight glyph ]
86+22:1 glyph ++
87+22:4 name eq
88+22:7 glyph |=
89+22:10 name args
90+22:14 tight glyph =
91+22:15 tight glyph [
92+22:16 tight tvar A
93+22:18 tvar A
94+22:19 tight glyph ]
95+22:21 glyph (
96+22:22 tight wing eq-data.internal
97+22:39 name args
98+22:43 tight glyph )
99+24:1 NEWLINE
100+24:1 glyph +$
101+24:4 name list
102+24:9 glyph |$
103+24:12 glyph [
104+24:13 tight tvar A
105+24:14 tight glyph ]
106+25:3 INDENT
107+25:3 lit ~
108+26:3 NEWLINE
109+26:3 glyph [
110+26:4 tight name i
111+26:5 tight glyph =
112+26:6 tight tvar A
113+26:8 name t
114+26:9 tight glyph =
115+26:10 tight glyph (
116+26:11 tight name list
117+26:16 tvar A
118+26:17 tight glyph )
119+26:18 tight glyph ]
120+28:1 DEDENT
121+28:1 NEWLINE
122+28:1 glyph +$
123+28:4 name unit
124+28:9 glyph |$
125+28:12 glyph [
126+28:13 tight tvar A
127+28:14 tight glyph ]
128+29:3 INDENT
129+29:3 lit ~
130+30:3 NEWLINE
131+30:3 glyph [
132+30:4 tight lit ~
133+30:6 name u
134+30:7 tight glyph =
135+30:8 tight tvar A
136+30:9 tight glyph ]
137+32:1 DEDENT
138+32:1 NEWLINE
139+32:1 glyph ++
140+32:4 name fall
141+32:9 glyph |=
142+32:12 name args
143+32:16 tight glyph =
144+32:17 tight glyph [
145+32:18 tight glyph (
146+32:19 tight name unit
147+32:24 tvar A
148+32:25 tight glyph )
149+32:27 tvar A
150+32:28 tight glyph ]
151+33:3 INDENT
152+33:3 glyph ?-
153+33:6 name args
154+34:5 INDENT
155+34:5 glyph [
156+34:6 tight name maybe
157+34:12 name fallback
158+34:20 tight glyph ]
159+35:7 INDENT
160+35:7 glyph ?-
161+35:10 name maybe
162+36:9 INDENT
163+36:9 lit ~
164+36:11 name fallback
165+37:9 NEWLINE
166+37:9 glyph [
167+37:10 tight lit ~
168+37:12 name value
169+37:17 tight glyph ]
170+37:19 name value
171+39:1 DEDENT
172+39:1 DEDENT
173+39:1 DEDENT
174+39:1 DEDENT
175+39:1 NEWLINE
176+39:1 glyph ++
177+39:4 name need
178+39:9 glyph |=
179+39:12 name maybe
180+39:17 tight glyph =
181+39:18 tight glyph (
182+39:19 tight name unit
183+39:24 tvar A
184+39:25 tight glyph )
185+40:3 INDENT
186+40:3 glyph ?-
187+40:6 name maybe
188+41:5 INDENT
189+41:5 lit ~
190+41:7 glyph !!
191+42:5 NEWLINE
192+42:5 glyph [
193+42:6 tight lit ~
194+42:8 name value
195+42:13 tight glyph ]
196+42:15 name value
197+44:1 DEDENT
198+44:1 DEDENT
199+44:1 NEWLINE
200+44:1 glyph ++
201+44:4 name weld
202+44:9 glyph |=
203+44:12 name args
204+44:16 tight glyph =
205+44:17 tight glyph [
206+44:18 tight glyph (
207+44:19 tight name list
208+44:24 tvar A
209+44:25 tight glyph )
210+44:27 glyph (
211+44:28 tight name list
212+44:33 tvar A
213+44:34 tight glyph )
214+44:35 tight glyph ]
215+45:3 INDENT
216+45:3 glyph ?-
217+45:6 name args
218+46:5 INDENT
219+46:5 glyph [
220+46:6 tight name xs
221+46:9 name ys
222+46:11 tight glyph ]
223+47:7 INDENT
224+47:7 glyph ^-
225+47:10 glyph (
226+47:11 tight name list
227+47:16 tvar A
228+47:17 tight glyph )
229+48:9 INDENT
230+48:9 glyph ?-
231+48:12 name xs
232+49:11 INDENT
233+49:11 lit ~
234+49:13 name ys
235+50:11 NEWLINE
236+50:11 glyph [
237+50:12 tight name item
238+50:17 name rest
239+50:21 tight glyph ]
240+50:23 glyph [
241+50:24 tight name item
242+50:29 glyph (
243+50:30 tight name weld
244+50:35 name rest
245+50:40 name ys
246+50:42 tight glyph )
247+50:43 tight glyph ]
248+52:1 DEDENT
249+52:1 DEDENT
250+52:1 DEDENT
251+52:1 DEDENT
252+52:1 DEDENT
253+52:1 NEWLINE
254+52:1 glyph ++
255+52:4 name turn
256+52:9 glyph |=
257+52:12 name args
258+52:16 tight glyph =
259+52:17 tight glyph [
260+52:18 tight glyph (
261+52:19 tight name list
262+52:24 tvar A
263+52:25 tight glyph )
264+52:27 glyph $-(
265+52:30 tight tvar A
266+52:32 tvar B
267+52:33 tight glyph )
268+52:34 tight glyph ]
269+53:3 INDENT
270+53:3 glyph ?-
271+53:6 name args
272+54:5 INDENT
273+54:5 glyph [
274+54:6 tight name xs
275+54:9 name f
276+54:10 tight glyph ]
277+55:7 INDENT
278+55:7 glyph ^-
279+55:10 glyph (
280+55:11 tight name list
281+55:16 tvar B
282+55:17 tight glyph )
283+56:9 INDENT
284+56:9 glyph ?-
285+56:12 name xs
286+57:11 INDENT
287+57:11 lit ~
288+57:13 lit ~
289+58:11 NEWLINE
290+58:11 glyph [
291+58:12 tight name item
292+58:17 name rest
293+58:21 tight glyph ]
294+58:23 glyph [
295+58:24 tight glyph (
296+58:25 tight name f
297+58:27 name item
298+58:31 tight glyph )
299+58:33 glyph (
300+58:34 tight name turn
301+58:39 name rest
302+58:44 name f
303+58:45 tight glyph )
304+58:46 tight glyph ]
305+60:1 DEDENT
306+60:1 DEDENT
307+60:1 DEDENT
308+60:1 DEDENT
309+60:1 DEDENT
30731060:1 NEWLINE
30831160:1 glyph +$
309−60:4 name hair
312+60:4 name dime
31031360:9 glyph [
31131460:10 tight name p
31231560:11 tight glyph =
313−60:12 tight aura @ud
316+60:12 tight aura @ta
31431760:16 name q
31531860:17 tight glyph =
316−60:18 tight aura @ud
317−60:21 tight glyph ]
319+60:18 tight aura @
320+60:19 tight glyph ]
31832162:1 NEWLINE
31932262:1 glyph +$
320−62:4 name pint
323+62:4 name hair
32132462:9 glyph [
32232562:10 tight name p
32332662:11 tight glyph =
324−62:12 tight glyph [
325−62:13 tight name p
326−62:14 tight glyph =
327−62:15 tight aura @
328−62:17 name q
329−62:18 tight glyph =
330−62:19 tight aura @
331−62:20 tight glyph ]
332−62:22 name q
333−62:23 tight glyph =
334−62:24 tight glyph [
335−62:25 tight name p
336−62:26 tight glyph =
337−62:27 tight aura @
338−62:29 name q
339−62:30 tight glyph =
340−62:31 tight aura @
341−62:32 tight glyph ]
342−62:33 tight glyph ]
327+62:12 tight aura @ud
328+62:16 name q
329+62:17 tight glyph =
330+62:18 tight aura @ud
331+62:21 tight glyph ]
34333264:1 NEWLINE
34433364:1 glyph +$
345−64:4 name coin
346−65:3 INDENT
347−65:3 glyph [
348−65:4 tight lit %$
349−65:7 name p
350−65:8 tight glyph =
351−65:9 tight name dime
352−65:13 tight glyph ]
353−66:3 NEWLINE
354−66:3 glyph [
355−66:4 tight lit %blob
356−66:10 name p
357−66:11 tight glyph =
358−66:12 tight glyph *
359−66:13 tight glyph ]
360−67:3 NEWLINE
334+64:4 name pint
335+64:9 glyph [
336+64:10 tight name p
337+64:11 tight glyph =
338+64:12 tight glyph [
339+64:13 tight name p
340+64:14 tight glyph =
341+64:15 tight aura @
342+64:17 name q
343+64:18 tight glyph =
344+64:19 tight aura @
345+64:20 tight glyph ]
346+64:22 name q
347+64:23 tight glyph =
348+64:24 tight glyph [
349+64:25 tight name p
350+64:26 tight glyph =
351+64:27 tight aura @
352+64:29 name q
353+64:30 tight glyph =
354+64:31 tight aura @
355+64:32 tight glyph ]
356+64:33 tight glyph ]
357+66:1 NEWLINE
358+66:1 glyph +$
359+66:4 name coin
360+67:3 INDENT
36136167:3 glyph [
362−67:4 tight lit %many
363−67:10 name p
364−67:11 tight glyph =
365−67:12 tight glyph (
366−67:13 tight name list
367−67:18 name coin
368−67:22 tight glyph )
369−67:23 tight glyph ]
370−69:1 DEDENT
371−69:1 NEWLINE
372−69:1 glyph +$
373−69:4 name pair
374−69:9 glyph |$
375−69:12 glyph [
376−69:13 tight tvar A
377−69:15 tvar B
378−69:16 tight glyph ]
379−69:18 glyph [
380−69:19 tight name p
381−69:20 tight glyph =
382−69:21 tight tvar A
383−69:23 name q
384−69:24 tight glyph =
385−69:25 tight tvar B
386−69:26 tight glyph ]
362+67:4 tight lit %$
363+67:7 name p
364+67:8 tight glyph =
365+67:9 tight name dime
366+67:13 tight glyph ]
367+68:3 NEWLINE
368+68:3 glyph [
369+68:4 tight lit %blob
370+68:10 name p
371+68:11 tight glyph =
372+68:12 tight glyph *
373+68:13 tight glyph ]
374+69:3 NEWLINE
375+69:3 glyph [
376+69:4 tight lit %many
377+69:10 name p
378+69:11 tight glyph =
379+69:12 tight glyph (
380+69:13 tight name list
381+69:18 name coin
382+69:22 tight glyph )
383+69:23 tight glyph ]
384+71:1 DEDENT
38738571:1 NEWLINE
38838671:1 glyph +$
389−71:4 name trel
387+71:4 name pair
39038871:9 glyph |$
39138971:12 glyph [
39239071:13 tight tvar A
39339171:15 tvar B
394−71:17 tvar C
395−71:18 tight glyph ]
396−71:20 glyph [
397−71:21 tight name p
398−71:22 tight glyph =
399−71:23 tight tvar A
400−71:25 name q
401−71:26 tight glyph =
402−71:27 tight tvar B
403−71:29 name r
404−71:30 tight glyph =
405−71:31 tight tvar C
406−71:32 tight glyph ]
392+71:16 tight glyph ]
393+71:18 glyph [
394+71:19 tight name p
395+71:20 tight glyph =
396+71:21 tight tvar A
397+71:23 name q
398+71:24 tight glyph =
399+71:25 tight tvar B
400+71:26 tight glyph ]
40740173:1 NEWLINE
40840273:1 glyph +$
409−73:4 name qual
403+73:4 name trel
41040473:9 glyph |$
41140573:12 glyph [
41240673:13 tight tvar A
41340773:15 tvar B
41440873:17 tvar C
415−73:19 tvar D
416−73:20 tight glyph ]
417−73:22 glyph [
418−73:23 tight name p
419−73:24 tight glyph =
420−73:25 tight tvar A
421−73:27 name q
422−73:28 tight glyph =
423−73:29 tight tvar B
424−73:31 name r
425−73:32 tight glyph =
426−73:33 tight tvar C
427−73:35 name s
428−73:36 tight glyph =
429−73:37 tight tvar D
430−73:38 tight glyph ]
409+73:18 tight glyph ]
410+73:20 glyph [
411+73:21 tight name p
412+73:22 tight glyph =
413+73:23 tight tvar A
414+73:25 name q
415+73:26 tight glyph =
416+73:27 tight tvar B
417+73:29 name r
418+73:30 tight glyph =
419+73:31 tight tvar C
420+73:32 tight glyph ]
43142175:1 NEWLINE
43242275:1 glyph +$
433−75:4 name cord
434−75:9 aura @t
423+75:4 name qual
424+75:9 glyph |$
425+75:12 glyph [
426+75:13 tight tvar A
427+75:15 tvar B
428+75:17 tvar C
429+75:19 tvar D
430+75:20 tight glyph ]
431+75:22 glyph [
432+75:23 tight name p
433+75:24 tight glyph =
434+75:25 tight tvar A
435+75:27 name q
436+75:28 tight glyph =
437+75:29 tight tvar B
438+75:31 name r
439+75:32 tight glyph =
440+75:33 tight tvar C
441+75:35 name s
442+75:36 tight glyph =
443+75:37 tight tvar D
444+75:38 tight glyph ]
43544577:1 NEWLINE
43644677:1 glyph +$
437−77:4 name knot
438−77:9 aura @ta
447+77:4 name cord
448+77:9 aura @t
43944979:1 NEWLINE
44045079:1 glyph +$
441−79:4 name tape
442−79:9 glyph (
443−79:10 tight name list
444−79:15 aura @tD
445−79:18 tight glyph )
451+79:4 name knot
452+79:9 aura @ta
44645381:1 NEWLINE
44745481:1 glyph +$
448−81:4 name path
455+81:4 name tape
44945681:9 glyph (
45045781:10 tight name list
451−81:15 name knot
452−81:19 tight glyph )
458+81:15 aura @tD
459+81:18 tight glyph )
45346083:1 NEWLINE
45446183:1 glyph +$
455−83:4 name tank
456−84:3 INDENT
457−84:3 name cord
458−85:3 NEWLINE
459−85:3 glyph [
460−85:4 tight lit %leaf
461−85:10 name p
462−85:11 tight glyph =
463−85:12 tight name tape
464−85:16 tight glyph ]
465−86:3 NEWLINE
466−86:3 glyph [
467−86:4 tight lit %palm
468−86:10 name p
469−86:11 tight glyph =
470−86:12 tight glyph (
471−86:13 tight name qual
472−86:18 name tape
473−86:23 name tape
474−86:28 name tape
475−86:33 name tape
476−86:37 tight glyph )
477−86:39 name q
478−86:40 tight glyph =
479−86:41 tight glyph (
480−86:42 tight name list
481−86:47 name tank
482−86:51 tight glyph )
483−86:52 tight glyph ]
462+83:4 name path
463+83:9 glyph (
464+83:10 tight name list
465+83:15 name knot
466+83:19 tight glyph )
467+85:1 NEWLINE
468+85:1 glyph +$
469+85:4 name tank
470+86:3 INDENT
471+86:3 name cord
48447287:3 NEWLINE
48547387:3 glyph [
486−87:4 tight lit %rose
474+87:4 tight lit %leaf
48747587:10 name p
48847687:11 tight glyph =
489−87:12 tight glyph (
490−87:13 tight name trel
491−87:18 name tape
492−87:23 name tape
493−87:28 name tape
494−87:32 tight glyph )
495−87:34 name q
496−87:35 tight glyph =
497−87:36 tight glyph (
498−87:37 tight name list
499−87:42 name tank
500−87:46 tight glyph )
501−87:47 tight glyph ]
502−89:1 DEDENT
503−89:1 NEWLINE
504−89:1 glyph +$
505−89:4 name nail
506−89:9 glyph [
507−89:10 tight name p
477+87:12 tight name tape
478+87:16 tight glyph ]
479+88:3 NEWLINE
480+88:3 glyph [
481+88:4 tight lit %palm
482+88:10 name p
483+88:11 tight glyph =
484+88:12 tight glyph (
485+88:13 tight name qual
486+88:18 name tape
487+88:23 name tape
488+88:28 name tape
489+88:33 name tape
490+88:37 tight glyph )
491+88:39 name q
492+88:40 tight glyph =
493+88:41 tight glyph (
494+88:42 tight name list
495+88:47 name tank
496+88:51 tight glyph )
497+88:52 tight glyph ]
498+89:3 NEWLINE
499+89:3 glyph [
500+89:4 tight lit %rose
501+89:10 name p
50850289:11 tight glyph =
509−89:12 tight name hair
510−89:17 name q
511−89:18 tight glyph =
512−89:19 tight name tape
513−89:23 tight glyph ]
503+89:12 tight glyph (
504+89:13 tight name trel
505+89:18 name tape
506+89:23 name tape
507+89:28 name tape
508+89:32 tight glyph )
509+89:34 name q
510+89:35 tight glyph =
511+89:36 tight glyph (
512+89:37 tight name list
513+89:42 name tank
514+89:46 tight glyph )
515+89:47 tight glyph ]
516+91:1 DEDENT
51451791:1 NEWLINE
51551891:1 glyph +$
516−91:4 name edge
519+91:4 name nail
51752091:9 glyph [
51852191:10 tight name p
51952291:11 tight glyph =
52052391:12 tight name hair
52152491:17 name q
52252591:18 tight glyph =
523−91:19 tight glyph (
524−91:20 tight name unit
525−91:25 glyph [
526−91:26 tight name p
527−91:27 tight glyph =
528−91:28 tight glyph *
529−91:30 name q
530−91:31 tight glyph =
531−91:32 tight name nail
532−91:36 tight glyph ]
533−91:37 tight glyph )
534−91:38 tight glyph ]
526+91:19 tight name tape
527+91:23 tight glyph ]
53552893:1 NEWLINE
53652993:1 glyph +$
537−93:4 name rule
538−93:9 glyph $-(
539−93:12 tight name nail
540−93:17 name edge
541−93:21 tight glyph )
530+93:4 name edge
531+93:9 glyph [
532+93:10 tight name p
533+93:11 tight glyph =
534+93:12 tight name hair
535+93:17 name q
536+93:18 tight glyph =
537+93:19 tight glyph (
538+93:20 tight name unit
539+93:25 glyph [
540+93:26 tight name p
541+93:27 tight glyph =
542+93:28 tight glyph *
543+93:30 name q
544+93:31 tight glyph =
545+93:32 tight name nail
546+93:36 tight glyph ]
547+93:37 tight glyph )
548+93:38 tight glyph ]
54254995:1 NEWLINE
54355095:1 glyph +$
544−95:4 name spot
545−95:9 glyph [
546−95:10 tight name p
547−95:11 tight glyph =
548−95:12 tight name path
549−95:17 name q
550−95:18 tight glyph =
551−95:19 tight name pint
552−95:23 tight glyph ]
551+95:4 name rule
552+95:9 glyph $-(
553+95:12 tight name nail
554+95:17 name edge
555+95:21 tight glyph )
55355697:1 NEWLINE
55455797:1 glyph +$
555−97:4 name toon
556−98:3 INDENT
557−98:3 glyph [
558−98:4 tight lit %0
559−98:7 name p
560−98:8 tight glyph =
561−98:9 tight glyph *
562−98:10 tight glyph ]
563−99:3 NEWLINE
564−99:3 glyph [
565−99:4 tight lit %1
566−99:7 name p
567−99:8 tight glyph =
568−99:9 tight glyph *
569−99:10 tight glyph ]
570−100:3 NEWLINE
558+97:4 name spot
559+97:9 glyph [
560+97:10 tight name p
561+97:11 tight glyph =
562+97:12 tight name path
563+97:17 name q
564+97:18 tight glyph =
565+97:19 tight name pint
566+97:23 tight glyph ]
567+99:1 NEWLINE
568+99:1 glyph +$
569+99:4 name toon
570+100:3 INDENT
571571100:3 glyph [
572−100:4 tight lit %2
572+100:4 tight lit %0
573573100:7 name p
574574100:8 tight glyph =
575−100:9 tight glyph (
576−100:10 tight name list
577−100:15 name tank
578−100:19 tight glyph )
579−100:20 tight glyph ]
580−102:1 DEDENT
581−102:1 NEWLINE
582−102:1 glyph +$
583−102:4 name like
584−102:9 glyph |$
585−102:12 glyph [
586−102:13 tight tvar A
587−102:14 tight glyph ]
588−102:16 glyph [
589−102:17 tight name p
590−102:18 tight glyph =
591−102:19 tight name hair
592−102:24 name q
593−102:25 tight glyph =
594−102:26 tight glyph (
595−102:27 tight name unit
596−102:32 glyph [
597−102:33 tight name p
598−102:34 tight glyph =
599−102:35 tight tvar A
600−102:37 name q
601−102:38 tight glyph =
602−102:39 tight name nail
603−102:43 tight glyph ]
604−102:44 tight glyph )
605−102:45 tight glyph ]
575+100:9 tight glyph *
576+100:10 tight glyph ]
577+101:3 NEWLINE
578+101:3 glyph [
579+101:4 tight lit %1
580+101:7 name p
581+101:8 tight glyph =
582+101:9 tight glyph *
583+101:10 tight glyph ]
584+102:3 NEWLINE
585+102:3 glyph [
586+102:4 tight lit %2
587+102:7 name p
588+102:8 tight glyph =
589+102:9 tight glyph (
590+102:10 tight name list
591+102:15 name tank
592+102:19 tight glyph )
593+102:20 tight glyph ]
594+104:1 DEDENT
606595104:1 NEWLINE
607−104:1 glyph ++
596+104:1 glyph +$
608597104:4 name like
609−104:9 glyph |=
598+104:9 glyph |$
610599104:12 glyph [
611−104:13 tight name f
612−104:14 tight glyph =
613−104:15 tight glyph $-(
614−104:18 tight tvar A
615−104:20 tvar B
616−104:21 tight glyph )
617−104:23 name result
618−104:29 tight glyph =
619−104:30 tight glyph (
620−104:31 tight name like
621−104:36 tvar A
622−104:37 tight glyph )
623−104:38 tight glyph ]
624−105:3 INDENT
625−105:3 glyph ++
626−105:6 name mapped
627−106:5 INDENT
628−106:5 glyph ^-
629−106:8 glyph (
630−106:9 tight name unit
631−106:14 glyph [
632−106:15 tight name p
633−106:16 tight glyph =
634−106:17 tight tvar B
635−106:19 name q
636−106:20 tight glyph =
637−106:21 tight name nail
638−106:25 tight glyph ]
639−106:26 tight glyph )
640−107:7 INDENT
641−107:7 glyph ?-
642−107:10 wing q.result
643−108:9 INDENT
644−108:9 lit ~
645−108:11 lit ~
646−109:9 NEWLINE
647−109:9 glyph [
648−109:10 tight lit ~
649−109:12 name value
650−109:17 tight glyph ]
651−109:19 glyph `
652−109:20 tight glyph [
653−109:21 tight name p
654−109:22 tight glyph =
655−109:23 tight glyph (
656−109:24 tight name f
657−109:26 wing p.value
658−109:33 tight glyph )
659−109:35 name q
660−109:36 tight glyph =
661−109:37 tight wing q.value
662−109:44 tight glyph ]
663−110:3 DEDENT
664−110:3 DEDENT
665−110:3 DEDENT
666−110:3 NEWLINE
667−110:3 glyph ^-
668−110:6 glyph (
669−110:7 tight name like
670−110:12 tvar B
671−110:13 tight glyph )
672−110:15 glyph [
673−110:16 tight name p
674−110:17 tight glyph =
675−110:18 tight wing p.result
676−110:27 name q
677−110:28 tight glyph =
678−110:29 tight name mapped
679−110:35 tight glyph ]
680−112:1 DEDENT
681−112:1 NEWLINE
682−112:1 glyph ++
683−112:4 name wonk
684−112:9 glyph |=
685−112:12 name veq
686−112:15 tight glyph =
687−112:16 tight glyph (
688−112:17 tight name like
689−112:22 tvar A
690−112:23 tight glyph )
691−113:3 INDENT
692−113:3 glyph ?-
693−113:6 wing q.veq
694−114:5 INDENT
695−114:5 lit ~
696−114:7 glyph !!
697−115:5 NEWLINE
698−115:5 glyph [
699−115:6 tight lit ~
700−115:8 name product
701−115:15 tight glyph ]
702−115:17 wing p.product
703−117:1 DEDENT
704−117:1 DEDENT
705−117:1 NEWLINE
706−117:1 glyph +$
707−117:4 name lone
708−117:9 glyph |$
709−117:12 glyph [
710−117:13 tight tvar A
711−117:14 tight glyph ]
712−117:16 glyph [
713−117:17 tight name p
714−117:18 tight glyph =
715−117:19 tight tvar A
716−117:20 tight glyph ]
600+104:13 tight tvar A
601+104:14 tight glyph ]
602+104:16 glyph [
603+104:17 tight name p
604+104:18 tight glyph =
605+104:19 tight name hair
606+104:24 name q
607+104:25 tight glyph =
608+104:26 tight glyph (
609+104:27 tight name unit
610+104:32 glyph [
611+104:33 tight name p
612+104:34 tight glyph =
613+104:35 tight tvar A
614+104:37 name q
615+104:38 tight glyph =
616+104:39 tight name nail
617+104:43 tight glyph ]
618+104:44 tight glyph )
619+104:45 tight glyph ]
620+106:1 NEWLINE
621+106:1 glyph ++
622+106:4 name like
623+106:9 glyph |=
624+106:12 glyph [
625+106:13 tight name f
626+106:14 tight glyph =
627+106:15 tight glyph $-(
628+106:18 tight tvar A
629+106:20 tvar B
630+106:21 tight glyph )
631+106:23 name result
632+106:29 tight glyph =
633+106:30 tight glyph (
634+106:31 tight name like
635+106:36 tvar A
636+106:37 tight glyph )
637+106:38 tight glyph ]
638+107:3 INDENT
639+107:3 glyph ++
640+107:6 name mapped
641+108:5 INDENT
642+108:5 glyph ^-
643+108:8 glyph (
644+108:9 tight name unit
645+108:14 glyph [
646+108:15 tight name p
647+108:16 tight glyph =
648+108:17 tight tvar B
649+108:19 name q
650+108:20 tight glyph =
651+108:21 tight name nail
652+108:25 tight glyph ]
653+108:26 tight glyph )
654+109:7 INDENT
655+109:7 glyph ?-
656+109:10 wing q.result
657+110:9 INDENT
658+110:9 lit ~
659+110:11 lit ~
660+111:9 NEWLINE
661+111:9 glyph [
662+111:10 tight lit ~
663+111:12 name value
664+111:17 tight glyph ]
665+111:19 glyph `
666+111:20 tight glyph [
667+111:21 tight name p
668+111:22 tight glyph =
669+111:23 tight glyph (
670+111:24 tight name f
671+111:26 wing p.value
672+111:33 tight glyph )
673+111:35 name q
674+111:36 tight glyph =
675+111:37 tight wing q.value
676+111:44 tight glyph ]
677+112:3 DEDENT
678+112:3 DEDENT
679+112:3 DEDENT
680+112:3 NEWLINE
681+112:3 glyph ^-
682+112:6 glyph (
683+112:7 tight name like
684+112:12 tvar B
685+112:13 tight glyph )
686+112:15 glyph [
687+112:16 tight name p
688+112:17 tight glyph =
689+112:18 tight wing p.result
690+112:27 name q
691+112:28 tight glyph =
692+112:29 tight name mapped
693+112:35 tight glyph ]
694+114:1 DEDENT
695+114:1 NEWLINE
696+114:1 glyph ++
697+114:4 name wonk
698+114:9 glyph |=
699+114:12 name veq
700+114:15 tight glyph =
701+114:16 tight glyph (
702+114:17 tight name like
703+114:22 tvar A
704+114:23 tight glyph )
705+115:3 INDENT
706+115:3 glyph ?-
707+115:6 wing q.veq
708+116:5 INDENT
709+116:5 lit ~
710+116:7 glyph !!
711+117:5 NEWLINE
712+117:5 glyph [
713+117:6 tight lit ~
714+117:8 name product
715+117:15 tight glyph ]
716+117:17 wing p.product
717+119:1 DEDENT
718+119:1 DEDENT
717719119:1 NEWLINE
718720119:1 glyph +$
719−119:4 name lest
721+119:4 name lone
720722119:9 glyph |$
721723119:12 glyph [
722724119:13 tight tvar A
723725119:14 tight glyph ]
724726119:16 glyph [
725−119:17 tight name i
727+119:17 tight name p
726728119:18 tight glyph =
727729119:19 tight tvar A
728−119:21 name t
729−119:22 tight glyph =
730−119:23 tight glyph (
731−119:24 tight name list
732−119:29 tvar A
733−119:30 tight glyph )
734−119:31 tight glyph ]
730+119:20 tight glyph ]
735731121:1 NEWLINE
736732121:1 glyph +$
737−121:4 name pole
733+121:4 name lest
738734121:9 glyph |$
739735121:12 glyph [
740736121:13 tight tvar A
741737121:14 tight glyph ]
742−122:3 INDENT
743−122:3 lit ~
744−123:3 NEWLINE
745−123:3 glyph [
746−123:4 tight tvar A
747−123:6 glyph (
748−123:7 tight name pole
749−123:12 tvar A
750−123:13 tight glyph )
738+121:16 glyph [
739+121:17 tight name i
740+121:18 tight glyph =
741+121:19 tight tvar A
742+121:21 name t
743+121:22 tight glyph =
744+121:23 tight glyph (
745+121:24 tight name list
746+121:29 tvar A
747+121:30 tight glyph )
748+121:31 tight glyph ]
749+123:1 NEWLINE
750+123:1 glyph +$
751+123:4 name pole
752+123:9 glyph |$
753+123:12 glyph [
754+123:13 tight tvar A
751755123:14 tight glyph ]
752−125:1 DEDENT
753−125:1 NEWLINE
754−125:1 glyph +$
755−125:4 name quip
756−125:9 glyph |$
757−125:12 glyph [
758−125:13 tight tvar A
759−125:15 tvar B
760−125:16 tight glyph ]
761−125:18 glyph [
762−125:19 tight glyph (
763−125:20 tight name list
764−125:25 tvar A
765−125:26 tight glyph )
766−125:28 tvar B
767−125:29 tight glyph ]
756+124:3 INDENT
757+124:3 lit ~
758+125:3 NEWLINE
759+125:3 glyph [
760+125:4 tight tvar A
761+125:6 glyph (
762+125:7 tight name pole
763+125:12 tvar A
764+125:13 tight glyph )
765+125:14 tight glyph ]
766+127:1 DEDENT
768767127:1 NEWLINE
769768127:1 glyph +$
770−127:4 name tree
769+127:4 name quip
771770127:9 glyph |$
772771127:12 glyph [
773772127:13 tight tvar A
774−127:14 tight glyph ]
775−128:3 INDENT
776−128:3 lit ~
777−129:3 NEWLINE
778−129:3 glyph [
779−129:4 tight name n
780−129:5 tight glyph =
781−129:6 tight tvar A
782−129:8 name l
783−129:9 tight glyph =
784−129:10 tight glyph (
785−129:11 tight name tree
786−129:16 tvar A
787−129:17 tight glyph )
788−129:19 name r
789−129:20 tight glyph =
790−129:21 tight glyph (
791−129:22 tight name tree
792−129:27 tvar A
793−129:28 tight glyph )
794−129:29 tight glyph ]
795−131:1 DEDENT
796−131:1 NEWLINE
797−131:1 glyph +$
798−131:4 name each
799−131:9 glyph |$
800−131:12 glyph [
801−131:13 tight tvar A
802−131:15 tvar B
803−131:16 tight glyph ]
804−132:3 INDENT
805−132:3 glyph [
806−132:4 tight lit %|
807−132:7 name p
808−132:8 tight glyph =
809−132:9 tight tvar B
810−132:10 tight glyph ]
811−133:3 NEWLINE
812−133:3 glyph [
813−133:4 tight lit %&
814−133:7 name p
815−133:8 tight glyph =
816−133:9 tight tvar A
817−133:10 tight glyph ]
818−135:1 DEDENT
819−135:1 NEWLINE
820−135:1 glyph +$
821−135:4 name bloq
822−135:9 aura @
773+127:15 tvar B
774+127:16 tight glyph ]
775+127:18 glyph [
776+127:19 tight glyph (
777+127:20 tight name list
778+127:25 tvar A
779+127:26 tight glyph )
780+127:28 tvar B
781+127:29 tight glyph ]
782+129:1 NEWLINE
783+129:1 glyph +$
784+129:4 name tree
785+129:9 glyph |$
786+129:12 glyph [
787+129:13 tight tvar A
788+129:14 tight glyph ]
789+130:3 INDENT
790+130:3 lit ~
791+131:3 NEWLINE
792+131:3 glyph [
793+131:4 tight name n
794+131:5 tight glyph =
795+131:6 tight tvar A
796+131:8 name l
797+131:9 tight glyph =
798+131:10 tight glyph (
799+131:11 tight name tree
800+131:16 tvar A
801+131:17 tight glyph )
802+131:19 name r
803+131:20 tight glyph =
804+131:21 tight glyph (
805+131:22 tight name tree
806+131:27 tvar A
807+131:28 tight glyph )
808+131:29 tight glyph ]
809+133:1 DEDENT
810+133:1 NEWLINE
811+133:1 glyph +$
812+133:4 name each
813+133:9 glyph |$
814+133:12 glyph [
815+133:13 tight tvar A
816+133:15 tvar B
817+133:16 tight glyph ]
818+134:3 INDENT
819+134:3 glyph [
820+134:4 tight lit %|
821+134:7 name p
822+134:8 tight glyph =
823+134:9 tight tvar B
824+134:10 tight glyph ]
825+135:3 NEWLINE
826+135:3 glyph [
827+135:4 tight lit %&
828+135:7 name p
829+135:8 tight glyph =
830+135:9 tight tvar A
831+135:10 tight glyph ]
832+137:1 DEDENT
823833137:1 NEWLINE
824−137:1 glyph ++
825−137:4 name some
826−137:9 glyph |=
827−137:12 name item
828−137:16 tight glyph =
829−137:17 tight tvar A
830−137:19 glyph `
831−137:20 tight name item
834+137:1 glyph +$
835+137:4 name bloq
836+137:9 aura @
832837139:1 NEWLINE
833838139:1 glyph ++
834−139:4 name lure
839+139:4 name some
835840139:9 glyph |=
836841139:12 name item
837842139:16 tight glyph =
838843139:17 tight tvar A
839−140:3 INDENT
840−140:3 glyph ^-
841−140:6 glyph (
842−140:7 tight name list
843−140:12 tvar A
844−140:13 tight glyph )
845−140:15 glyph [
846−140:16 tight name item
847−140:21 lit ~
848−140:22 tight glyph ]
849−142:1 DEDENT
850−142:1 NEWLINE
851−142:1 glyph ++
852−142:4 name snoc
853−142:9 glyph |=
854−142:12 name args
855−142:16 tight glyph =
856−142:17 tight glyph [
857−142:18 tight glyph (
858−142:19 tight name list
859−142:24 tvar A
860−142:25 tight glyph )
861−142:27 tvar A
862−142:28 tight glyph ]
863−143:3 INDENT
864−143:3 glyph ?-
865−143:6 name args
866−144:5 INDENT
867−144:5 glyph [
868−144:6 tight name xs
869−144:9 name item
870−144:13 tight glyph ]
871−144:15 glyph (
872−144:16 tight name weld
873−144:21 name xs
874−144:24 glyph [
875−144:25 tight name item
876−144:30 lit ~
877−144:31 tight glyph ]
878−144:32 tight glyph )
879−146:1 DEDENT
880−146:1 DEDENT
881−146:1 NEWLINE
882−146:1 glyph ++
883−146:4 name flop
884−146:9 glyph |=
885−146:12 name xs
886−146:14 tight glyph =
887−146:15 tight glyph (
888−146:16 tight name list
889−146:21 tvar A
890−146:22 tight glyph )
891−147:3 INDENT
892−147:3 glyph ++
893−147:6 name reverse-into
894−147:19 glyph |=
895−147:22 name args
896−147:26 tight glyph =
897−147:27 tight glyph [
898−147:28 tight glyph (
899−147:29 tight name list
900−147:34 tvar A
901−147:35 tight glyph )
902−147:37 glyph (
903−147:38 tight name list
904−147:43 tvar A
905−147:44 tight glyph )
906−147:45 tight glyph ]
907−148:5 INDENT
908−148:5 glyph ?-
909−148:8 name args
910−149:7 INDENT
911−149:7 glyph [
912−149:8 tight name rest
913−149:13 name acc
914−149:16 tight glyph ]
915−150:9 INDENT
916−150:9 glyph ?-
917−150:12 name rest
918−151:11 INDENT
919−151:11 lit ~
844+139:19 glyph `
845+139:20 tight name item
846+141:1 NEWLINE
847+141:1 glyph ++
848+141:4 name lure
849+141:9 glyph |=
850+141:12 name item
851+141:16 tight glyph =
852+141:17 tight tvar A
853+142:3 INDENT
854+142:3 glyph ^-
855+142:6 glyph (
856+142:7 tight name list
857+142:12 tvar A
858+142:13 tight glyph )
859+142:15 glyph [
860+142:16 tight name item
861+142:21 lit ~
862+142:22 tight glyph ]
863+144:1 DEDENT
864+144:1 NEWLINE
865+144:1 glyph ++
866+144:4 name snoc
867+144:9 glyph |=
868+144:12 name args
869+144:16 tight glyph =
870+144:17 tight glyph [
871+144:18 tight glyph (
872+144:19 tight name list
873+144:24 tvar A
874+144:25 tight glyph )
875+144:27 tvar A
876+144:28 tight glyph ]
877+145:3 INDENT
878+145:3 glyph ?-
879+145:6 name args
880+146:5 INDENT
881+146:5 glyph [
882+146:6 tight name xs
883+146:9 name item
884+146:13 tight glyph ]
885+146:15 glyph (
886+146:16 tight name weld
887+146:21 name xs
888+146:24 glyph [
889+146:25 tight name item
890+146:30 lit ~
891+146:31 tight glyph ]
892+146:32 tight glyph )
893+148:1 DEDENT
894+148:1 DEDENT
895+148:1 NEWLINE
896+148:1 glyph ++
897+148:4 name flop
898+148:9 glyph |=
899+148:12 name xs
900+148:14 tight glyph =
901+148:15 tight glyph (
902+148:16 tight name list
903+148:21 tvar A
904+148:22 tight glyph )
905+149:3 INDENT
906+149:3 glyph ++
907+149:6 name reverse-into
908+149:19 glyph |=
909+149:22 name args
910+149:26 tight glyph =
911+149:27 tight glyph [
912+149:28 tight glyph (
913+149:29 tight name list
914+149:34 tvar A
915+149:35 tight glyph )
916+149:37 glyph (
917+149:38 tight name list
918+149:43 tvar A
919+149:44 tight glyph )
920+149:45 tight glyph ]
921+150:5 INDENT
922+150:5 glyph ?-
923+150:8 name args
924+151:7 INDENT
925+151:7 glyph [
926+151:8 tight name rest
920927151:13 name acc
921−152:11 NEWLINE
922−152:11 glyph [
923−152:12 tight name item
924−152:17 name more
925−152:21 tight glyph ]
926−152:23 glyph (
927−152:24 tight name reverse-into
928−152:37 name more
929−152:42 glyph [
930−152:43 tight name item
931−152:48 name acc
932−152:51 tight glyph ]
933−152:52 tight glyph )
934−153:3 DEDENT
935−153:3 DEDENT
936−153:3 DEDENT
937−153:3 DEDENT
938−153:3 NEWLINE
939−153:3 glyph (
940−153:4 tight name reverse-into
941−153:17 name xs
942−153:20 lit ~
943−153:21 tight glyph )
944−155:1 DEDENT
945−155:1 NEWLINE
946−155:1 glyph ++
947−155:4 name drop
948−155:9 glyph |=
949−155:12 name maybe
950−155:17 tight glyph =
951−155:18 tight glyph (
952−155:19 tight name unit
953−155:24 tvar A
954−155:25 tight glyph )
955−156:3 INDENT
956−156:3 glyph ^-
957−156:6 glyph (
958−156:7 tight name list
959−156:12 tvar A
960−156:13 tight glyph )
961−157:5 INDENT
962−157:5 glyph ?-
963−157:8 name maybe
964−158:7 INDENT
965−158:7 lit ~
966−158:9 lit ~
967−159:7 NEWLINE
968−159:7 glyph [
969−159:8 tight lit ~
970−159:10 name value
971−159:15 tight glyph ]
972−159:17 glyph [
973−159:18 tight name value
974−159:24 lit ~
975−159:25 tight glyph ]
976−161:1 DEDENT
977−161:1 DEDENT
978−161:1 DEDENT
979−161:1 NEWLINE
980−161:1 glyph ++
981−161:4 name bond
982−161:9 glyph |=
983−161:12 name fallback
984−161:20 tight glyph =
985−161:21 tight glyph $-(
986−161:24 tight lit ~
987−161:26 tvar A
988−161:27 tight glyph )
989−162:3 INDENT
990−162:3 glyph |=
991−162:6 name maybe
992−162:11 tight glyph =
993−162:12 tight glyph (
994−162:13 tight name unit
995−162:18 tvar A
996−162:19 tight glyph )
997−163:5 INDENT
998−163:5 glyph ?-
999−163:8 name maybe
1000−164:7 INDENT
1001−164:7 lit ~
1002−164:9 glyph (
1003−164:10 tight name fallback
1004−164:19 lit ~
1005−164:20 tight glyph )
1006−165:7 NEWLINE
1007−165:7 glyph [
1008−165:8 tight lit ~
1009−165:10 name value
1010−165:15 tight glyph ]
1011−165:17 name value
1012−167:1 DEDENT
1013−167:1 DEDENT
1014−167:1 DEDENT
1015−167:1 NEWLINE
1016−167:1 glyph ++
1017−167:4 name bind
1018−167:9 glyph |=
1019−167:12 name args
1020−167:16 tight glyph =
1021−167:17 tight glyph [
1022−167:18 tight glyph (
1023−167:19 tight name unit
1024−167:24 tvar A
1025−167:25 tight glyph )
1026−167:27 glyph $-(
1027−167:30 tight tvar A
1028−167:32 tvar B
1029−167:33 tight glyph )
1030−167:34 tight glyph ]
1031−168:3 INDENT
1032−168:3 glyph ?-
1033−168:6 name args
1034−169:5 INDENT
1035−169:5 glyph [
1036−169:6 tight name maybe
1037−169:12 name f
1038−169:13 tight glyph ]
1039−169:15 glyph ^-
1040−169:18 glyph (
928+151:16 tight glyph ]
929+152:9 INDENT
930+152:9 glyph ?-
931+152:12 name rest
932+153:11 INDENT
933+153:11 lit ~
934+153:13 name acc
935+154:11 NEWLINE
936+154:11 glyph [
937+154:12 tight name item
938+154:17 name more
939+154:21 tight glyph ]
940+154:23 glyph (
941+154:24 tight name reverse-into
942+154:37 name more
943+154:42 glyph [
944+154:43 tight name item
945+154:48 name acc
946+154:51 tight glyph ]
947+154:52 tight glyph )
948+155:3 DEDENT
949+155:3 DEDENT
950+155:3 DEDENT
951+155:3 DEDENT
952+155:3 NEWLINE
953+155:3 glyph (
954+155:4 tight name reverse-into
955+155:17 name xs
956+155:20 lit ~
957+155:21 tight glyph )
958+157:1 DEDENT
959+157:1 NEWLINE
960+157:1 glyph ++
961+157:4 name drop
962+157:9 glyph |=
963+157:12 name maybe
964+157:17 tight glyph =
965+157:18 tight glyph (
966+157:19 tight name unit
967+157:24 tvar A
968+157:25 tight glyph )
969+158:3 INDENT
970+158:3 glyph ^-
971+158:6 glyph (
972+158:7 tight name list
973+158:12 tvar A
974+158:13 tight glyph )
975+159:5 INDENT
976+159:5 glyph ?-
977+159:8 name maybe
978+160:7 INDENT
979+160:7 lit ~
980+160:9 lit ~
981+161:7 NEWLINE
982+161:7 glyph [
983+161:8 tight lit ~
984+161:10 name value
985+161:15 tight glyph ]
986+161:17 glyph [
987+161:18 tight name value
988+161:24 lit ~
989+161:25 tight glyph ]
990+163:1 DEDENT
991+163:1 DEDENT
992+163:1 DEDENT
993+163:1 NEWLINE
994+163:1 glyph ++
995+163:4 name bond
996+163:9 glyph |=
997+163:12 name fallback
998+163:20 tight glyph =
999+163:21 tight glyph $-(
1000+163:24 tight lit ~
1001+163:26 tvar A
1002+163:27 tight glyph )
1003+164:3 INDENT
1004+164:3 glyph |=
1005+164:6 name maybe
1006+164:11 tight glyph =
1007+164:12 tight glyph (
1008+164:13 tight name unit
1009+164:18 tvar A
1010+164:19 tight glyph )
1011+165:5 INDENT
1012+165:5 glyph ?-
1013+165:8 name maybe
1014+166:7 INDENT
1015+166:7 lit ~
1016+166:9 glyph (
1017+166:10 tight name fallback
1018+166:19 lit ~
1019+166:20 tight glyph )
1020+167:7 NEWLINE
1021+167:7 glyph [
1022+167:8 tight lit ~
1023+167:10 name value
1024+167:15 tight glyph ]
1025+167:17 name value
1026+169:1 DEDENT
1027+169:1 DEDENT
1028+169:1 DEDENT
1029+169:1 NEWLINE
1030+169:1 glyph ++
1031+169:4 name bind
1032+169:9 glyph |=
1033+169:12 name args
1034+169:16 tight glyph =
1035+169:17 tight glyph [
1036+169:18 tight glyph (
10411037169:19 tight name unit
1042−169:24 tvar B
1038+169:24 tvar A
10431039169:25 tight glyph )
1044−170:7 INDENT
1045−170:7 glyph ?-
1046−170:10 name maybe
1047−171:9 INDENT
1048−171:9 lit ~
1049−171:11 lit ~
1050−172:9 NEWLINE
1051−172:9 glyph [
1052−172:10 tight lit ~
1053−172:12 name value
1054−172:17 tight glyph ]
1055−172:19 glyph `
1056−172:20 tight glyph (
1057−172:21 tight name f
1058−172:23 name value
1059−172:28 tight glyph )
1060−174:1 DEDENT
1061−174:1 DEDENT
1062−174:1 DEDENT
1063−174:1 DEDENT
1064−174:1 NEWLINE
1065−174:1 glyph ++
1066−174:4 name biff
1067−174:9 glyph |=
1068−174:12 name args
1069−174:16 tight glyph =
1070−174:17 tight glyph [
1071−174:18 tight glyph (
1072−174:19 tight name unit
1073−174:24 tvar A
1074−174:25 tight glyph )
1075−174:27 glyph $-(
1076−174:30 tight tvar A
1077−174:32 glyph (
1078−174:33 tight name unit
1079−174:38 tvar B
1080−174:39 tight glyph )
1081−174:40 tight glyph )
1082−174:41 tight glyph ]
1083−175:3 INDENT
1084−175:3 glyph ?-
1085−175:6 name args
1086−176:5 INDENT
1087−176:5 glyph [
1088−176:6 tight name maybe
1089−176:12 name f
1090−176:13 tight glyph ]
1091−176:15 glyph ^-
1092−176:18 glyph (
1040+169:27 glyph $-(
1041+169:30 tight tvar A
1042+169:32 tvar B
1043+169:33 tight glyph )
1044+169:34 tight glyph ]
1045+170:3 INDENT
1046+170:3 glyph ?-
1047+170:6 name args
1048+171:5 INDENT
1049+171:5 glyph [
1050+171:6 tight name maybe
1051+171:12 name f
1052+171:13 tight glyph ]
1053+171:15 glyph ^-
1054+171:18 glyph (
1055+171:19 tight name unit
1056+171:24 tvar B
1057+171:25 tight glyph )
1058+172:7 INDENT
1059+172:7 glyph ?-
1060+172:10 name maybe
1061+173:9 INDENT
1062+173:9 lit ~
1063+173:11 lit ~
1064+174:9 NEWLINE
1065+174:9 glyph [
1066+174:10 tight lit ~
1067+174:12 name value
1068+174:17 tight glyph ]
1069+174:19 glyph `
1070+174:20 tight glyph (
1071+174:21 tight name f
1072+174:23 name value
1073+174:28 tight glyph )
1074+176:1 DEDENT
1075+176:1 DEDENT
1076+176:1 DEDENT
1077+176:1 DEDENT
1078+176:1 NEWLINE
1079+176:1 glyph ++
1080+176:4 name biff
1081+176:9 glyph |=
1082+176:12 name args
1083+176:16 tight glyph =
1084+176:17 tight glyph [
1085+176:18 tight glyph (
10931086176:19 tight name unit
1094−176:24 tvar B
1087+176:24 tvar A
10951088176:25 tight glyph )
1096−177:7 INDENT
1097−177:7 glyph ?-
1098−177:10 name maybe
1099−178:9 INDENT
1100−178:9 lit ~
1101−178:11 lit ~
1102−179:9 NEWLINE
1103−179:9 glyph [
1104−179:10 tight lit ~
1105−179:12 name value
1106−179:17 tight glyph ]
1107−179:19 glyph (
1108−179:20 tight name f
1109−179:22 name value
1110−179:27 tight glyph )
1111−181:1 DEDENT
1112−181:1 DEDENT
1113−181:1 DEDENT
1114−181:1 DEDENT
1115−181:1 NEWLINE
1116−181:1 glyph ++
1117−181:4 name both
1118−181:9 glyph |=
1119−181:12 name args
1120−181:16 tight glyph =
1121−181:17 tight glyph [
1122−181:18 tight glyph (
1123−181:19 tight name unit
1124−181:24 tvar A
1125−181:25 tight glyph )
1126−181:27 glyph (
1127−181:28 tight name unit
1128−181:33 tvar B
1129−181:34 tight glyph )
1130−181:35 tight glyph ]
1131−182:3 INDENT
1132−182:3 glyph ?-
1133−182:6 name args
1134−183:5 INDENT
1135−183:5 glyph [
1136−183:6 tight name first
1137−183:12 name second
1138−183:18 tight glyph ]
1139−183:20 glyph ^-
1140−183:23 glyph (
1141−183:24 tight name unit
1142−183:29 glyph [
1143−183:30 tight tvar A
1144−183:32 tvar B
1145−183:33 tight glyph ]
1089+176:27 glyph $-(
1090+176:30 tight tvar A
1091+176:32 glyph (
1092+176:33 tight name unit
1093+176:38 tvar B
1094+176:39 tight glyph )
1095+176:40 tight glyph )
1096+176:41 tight glyph ]
1097+177:3 INDENT
1098+177:3 glyph ?-
1099+177:6 name args
1100+178:5 INDENT
1101+178:5 glyph [
1102+178:6 tight name maybe
1103+178:12 name f
1104+178:13 tight glyph ]
1105+178:15 glyph ^-
1106+178:18 glyph (
1107+178:19 tight name unit
1108+178:24 tvar B
1109+178:25 tight glyph )
1110+179:7 INDENT
1111+179:7 glyph ?-
1112+179:10 name maybe
1113+180:9 INDENT
1114+180:9 lit ~
1115+180:11 lit ~
1116+181:9 NEWLINE
1117+181:9 glyph [
1118+181:10 tight lit ~
1119+181:12 name value
1120+181:17 tight glyph ]
1121+181:19 glyph (
1122+181:20 tight name f
1123+181:22 name value
1124+181:27 tight glyph )
1125+183:1 DEDENT
1126+183:1 DEDENT
1127+183:1 DEDENT
1128+183:1 DEDENT
1129+183:1 NEWLINE
1130+183:1 glyph ++
1131+183:4 name both
1132+183:9 glyph |=
1133+183:12 name args
1134+183:16 tight glyph =
1135+183:17 tight glyph [
1136+183:18 tight glyph (
1137+183:19 tight name unit
1138+183:24 tvar A
1139+183:25 tight glyph )
1140+183:27 glyph (
1141+183:28 tight name unit
1142+183:33 tvar B
11461143183:34 tight glyph )
1147−184:7 INDENT
1148−184:7 glyph ?-
1149−184:10 name first
1150−185:9 INDENT
1151−185:9 lit ~
1152−185:11 lit ~
1153−186:9 NEWLINE
1154−186:9 glyph [
1155−186:10 tight lit ~
1156−186:12 name a
1157−186:13 tight glyph ]
1158−187:11 INDENT
1159−187:11 glyph ?-
1160−187:14 name second
1161−188:13 INDENT
1162−188:13 lit ~
1163−188:15 lit ~
1164−189:13 NEWLINE
1165−189:13 glyph [
1166−189:14 tight lit ~
1167−189:16 name b
1168−189:17 tight glyph ]
1169−189:19 glyph `
1170−189:20 tight glyph [
1171−189:21 tight name a
1172−189:23 name b
1173−189:24 tight glyph ]
1174−191:1 DEDENT
1175−191:1 DEDENT
1176−191:1 DEDENT
1177−191:1 DEDENT
1178−191:1 DEDENT
1179−191:1 DEDENT
1180−191:1 NEWLINE
1181−191:1 glyph ++
1182−191:4 name clap
1183−191:9 glyph |=
1184−191:12 name args
1185−191:16 tight glyph =
1186−191:17 tight glyph [
1187−191:18 tight glyph (
1188−191:19 tight name unit
1189−191:24 tvar A
1190−191:25 tight glyph )
1191−191:27 glyph (
1192−191:28 tight name unit
1193−191:33 tvar A
1194−191:34 tight glyph )
1195−191:36 glyph $-(
1196−191:39 tight glyph [
1197−191:40 tight tvar A
1198−191:42 tvar A
1199−191:43 tight glyph ]
1200−191:45 tvar A
1201−191:46 tight glyph )
1202−191:47 tight glyph ]
1203−192:3 INDENT
1204−192:3 glyph ?-
1205−192:6 name args
1206−193:5 INDENT
1207−193:5 glyph [
1208−193:6 tight name first
1209−193:12 name second
1210−193:19 name combine
1211−193:26 tight glyph ]
1212−193:28 glyph ^-
1213−193:31 glyph (
1214−193:32 tight name unit
1215−193:37 tvar A
1216−193:38 tight glyph )
1217−194:7 INDENT
1218−194:7 glyph ?-
1219−194:10 name first
1220−195:9 INDENT
1221−195:9 lit ~
1222−195:11 name second
1223−196:9 NEWLINE
1224−196:9 glyph [
1225−196:10 tight lit ~
1226−196:12 name a
1227−196:13 tight glyph ]
1228−197:11 INDENT
1229−197:11 glyph ?-
1230−197:14 name second
1231−198:13 INDENT
1232−198:13 lit ~
1233−198:15 name first
1234−199:13 NEWLINE
1235−199:13 glyph [
1236−199:14 tight lit ~
1237−199:16 name b
1238−199:17 tight glyph ]
1239−199:19 glyph `
1240−199:20 tight glyph (
1241−199:21 tight name combine
1242−199:29 name a
1243−199:31 name b
1244−199:32 tight glyph )
1245−201:1 DEDENT
1246−201:1 DEDENT
1247−201:1 DEDENT
1248−201:1 DEDENT
1249−201:1 DEDENT
1250−201:1 DEDENT
1251−201:1 NEWLINE
1252−201:1 glyph ++
1253−201:4 name clef
1254−201:9 glyph |=
1255−201:12 name args
1256−201:16 tight glyph =
1257−201:17 tight glyph [
1258−201:18 tight glyph (
1259−201:19 tight name unit
1260−201:24 tvar A
1261−201:25 tight glyph )
1262−201:27 glyph (
1263−201:28 tight name unit
1264−201:33 tvar B
1265−201:34 tight glyph )
1266−201:36 glyph $-(
1267−201:39 tight glyph [
1268−201:40 tight tvar A
1269−201:42 tvar B
1270−201:43 tight glyph ]
1271−201:45 glyph (
1272−201:46 tight name unit
1273−201:51 tvar C
1274−201:52 tight glyph )
1275−201:53 tight glyph )
1276−201:54 tight glyph ]
1277−202:3 INDENT
1278−202:3 glyph ?-
1279−202:6 name args
1280−203:5 INDENT
1281−203:5 glyph [
1282−203:6 tight name first
1283−203:12 name second
1284−203:19 name combine
1285−203:26 tight glyph ]
1286−203:28 glyph ^-
1287−203:31 glyph (
1288−203:32 tight name unit
1289−203:37 tvar C
1290−203:38 tight glyph )
1291−204:7 INDENT
1292−204:7 glyph ?-
1293−204:10 name first
1294−205:9 INDENT
1295−205:9 lit ~
1296−205:11 lit ~
1297−206:9 NEWLINE
1298−206:9 glyph [
1299−206:10 tight lit ~
1300−206:12 name a
1301−206:13 tight glyph ]
1302−207:11 INDENT
1303−207:11 glyph ?-
1304−207:14 name second
1305−208:13 INDENT
1306−208:13 lit ~
1307−208:15 lit ~
1308−209:13 NEWLINE
1309−209:13 glyph [
1310−209:14 tight lit ~
1311−209:16 name b
1312−209:17 tight glyph ]
1313−209:19 glyph (
1314−209:20 tight name combine
1315−209:28 name a
1316−209:30 name b
1317−209:31 tight glyph )
1318−211:1 DEDENT
1319−211:1 DEDENT
1320−211:1 DEDENT
1321−211:1 DEDENT
1322−211:1 DEDENT
1323−211:1 DEDENT
1324−211:1 NEWLINE
1325−211:1 glyph ++
1326−211:4 name skim
1327−211:9 glyph |=
1328−211:12 name args
1329−211:16 tight glyph =
1330−211:17 tight glyph [
1331−211:18 tight glyph (
1332−211:19 tight name list
1333−211:24 tvar A
1334−211:25 tight glyph )
1335−211:27 glyph $-(
1336−211:30 tight tvar A
1337−211:32 glyph ?
1338−211:33 tight glyph )
1339−211:34 tight glyph ]
1340−212:3 INDENT
1341−212:3 glyph ?-
1342−212:6 name args
1343−213:5 INDENT
1344−213:5 glyph [
1345−213:6 tight name xs
1346−213:9 name predicate
1347−213:18 tight glyph ]
1348−213:20 glyph ^-
1349−213:23 glyph (
1350−213:24 tight name list
1351−213:29 tvar A
1352−213:30 tight glyph )
1353−214:9 INDENT
1354−214:9 glyph ?-
1355−214:12 name xs
1356−215:11 INDENT
1357−215:11 lit ~
1358−215:13 lit ~
1359−216:11 NEWLINE
1360−216:11 glyph [
1361−216:12 tight name item
1362−216:17 name rest
1363−216:21 tight glyph ]
1364−217:13 INDENT
1365−217:13 glyph ?-
1366−217:16 glyph (
1367−217:17 tight name predicate
1368−217:27 name item
1369−217:31 tight glyph )
1370−218:15 INDENT
1371−218:15 lit %.y
1372−218:19 glyph [
1373−218:20 tight name item
1374−218:25 glyph (
1375−218:26 tight name skim
1376−218:31 name rest
1377−218:36 name predicate
1378−218:45 tight glyph )
1379−218:46 tight glyph ]
1380−219:15 NEWLINE
1381−219:15 lit %.n
1382−219:19 glyph (
1383−219:20 tight name skim
1384−219:25 name rest
1385−219:30 name predicate
1386−219:39 tight glyph )
1387−221:1 DEDENT
1388−221:1 DEDENT
1389−221:1 DEDENT
1390−221:1 DEDENT
1391−221:1 DEDENT
1392−221:1 DEDENT
1393−221:1 NEWLINE
1394−221:1 glyph ++
1395−221:4 name skip
1396−221:9 glyph |=
1397−221:12 name args
1398−221:16 tight glyph =
1399−221:17 tight glyph [
1400−221:18 tight glyph (
1401−221:19 tight name list
1402−221:24 tvar A
1403−221:25 tight glyph )
1404−221:27 glyph $-(
1405−221:30 tight tvar A
1406−221:32 glyph ?
1407−221:33 tight glyph )
1408−221:34 tight glyph ]
1409−222:3 INDENT
1410−222:3 glyph ?-
1411−222:6 name args
1412−223:5 INDENT
1413−223:5 glyph [
1414−223:6 tight name xs
1415−223:9 name predicate
1416−223:18 tight glyph ]
1417−223:20 glyph ^-
1418−223:23 glyph (
1419−223:24 tight name list
1420−223:29 tvar A
1421−223:30 tight glyph )
1422−224:9 INDENT
1423−224:9 glyph ?-
1424−224:12 name xs
1425−225:11 INDENT
1426−225:11 lit ~
1427−225:13 lit ~
1428−226:11 NEWLINE
1429−226:11 glyph [
1430−226:12 tight name item
1431−226:17 name rest
1432−226:21 tight glyph ]
1433−227:13 INDENT
1434−227:13 glyph ?-
1435−227:16 glyph (
1436−227:17 tight name predicate
1437−227:27 name item
1438−227:31 tight glyph )
1439−228:15 INDENT
1440−228:15 lit %.y
1441−228:19 glyph (
1442−228:20 tight name skip
1443−228:25 name rest
1444−228:30 name predicate
1445−228:39 tight glyph )
1446−229:15 NEWLINE
1447−229:15 lit %.n
1448−229:19 glyph [
1449−229:20 tight name item
1450−229:25 glyph (
1451−229:26 tight name skip
1452−229:31 name rest
1453−229:36 name predicate
1454−229:45 tight glyph )
1455−229:46 tight glyph ]
1456−231:1 DEDENT
1457−231:1 DEDENT
1458−231:1 DEDENT
1459−231:1 DEDENT
1460−231:1 DEDENT
1461−231:1 DEDENT
1462−231:1 NEWLINE
1463−231:1 glyph ++
1464−231:4 name levy
1465−231:9 glyph |=
1466−231:12 name args
1467−231:16 tight glyph =
1468−231:17 tight glyph [
1469−231:18 tight glyph (
1470−231:19 tight name list
1471−231:24 tvar A
1472−231:25 tight glyph )
1473−231:27 glyph $-(
1474−231:30 tight tvar A
1475−231:32 glyph ?
1476−231:33 tight glyph )
1477−231:34 tight glyph ]
1478−232:3 INDENT
1479−232:3 glyph ^-
1480−232:6 glyph ?
1481−233:5 INDENT
1482−233:5 glyph ?-
1483−233:8 name args
1484−234:7 INDENT
1485−234:7 glyph [
1486−234:8 tight name xs
1487−234:11 name predicate
1488−234:20 tight glyph ]
1489−235:9 INDENT
1490−235:9 glyph ?-
1491−235:12 name xs
1492−236:11 INDENT
1493−236:11 lit ~
1494−236:13 lit %.y
1495−237:11 NEWLINE
1496−237:11 glyph [
1497−237:12 tight name item
1498−237:17 name rest
1499−237:21 tight glyph ]
1500−238:13 INDENT
1501−238:13 glyph ?-
1502−238:16 glyph (
1503−238:17 tight name predicate
1504−238:27 name item
1505−238:31 tight glyph )
1506−239:15 INDENT
1507−239:15 lit %.y
1508−239:19 glyph (
1509−239:20 tight name levy
1510−239:25 name rest
1511−239:30 name predicate
1512−239:39 tight glyph )
1513−240:15 NEWLINE
1514−240:15 lit %.n
1515−240:19 lit %.n
1516−242:1 DEDENT
1517−242:1 DEDENT
1518−242:1 DEDENT
1519−242:1 DEDENT
1520−242:1 DEDENT
1521−242:1 DEDENT
1522−242:1 DEDENT
1523−242:1 NEWLINE
1524−242:1 glyph ++
1525−242:4 name lien
1526−242:9 glyph |=
1527−242:12 name args
1528−242:16 tight glyph =
1529−242:17 tight glyph [
1530−242:18 tight glyph (
1531−242:19 tight name list
1532−242:24 tvar A
1533−242:25 tight glyph )
1534−242:27 glyph $-(
1535−242:30 tight tvar A
1536−242:32 glyph ?
1537−242:33 tight glyph )
1538−242:34 tight glyph ]
1539−243:3 INDENT
1540−243:3 glyph ^-
1541−243:6 glyph ?
1542−244:5 INDENT
1543−244:5 glyph ?-
1544−244:8 name args
1545−245:7 INDENT
1546−245:7 glyph [
1547−245:8 tight name xs
1548−245:11 name predicate
1549−245:20 tight glyph ]
1550−246:9 INDENT
1551−246:9 glyph ?-
1552−246:12 name xs
1553−247:11 INDENT
1554−247:11 lit ~
1555−247:13 lit %.n
1556−248:11 NEWLINE
1557−248:11 glyph [
1558−248:12 tight name item
1559−248:17 name rest
1560−248:21 tight glyph ]
1561−249:13 INDENT
1562−249:13 glyph ?-
1563−249:16 glyph (
1564−249:17 tight name predicate
1565−249:27 name item
1566−249:31 tight glyph )
1567−250:15 INDENT
1568−250:15 lit %.y
1569−250:19 lit %.y
1570−251:15 NEWLINE
1571−251:15 lit %.n
1572−251:19 glyph (
1573−251:20 tight name lien
1574−251:25 name rest
1575−251:30 name predicate
1576−251:39 tight glyph )
1577−253:1 DEDENT
1578−253:1 DEDENT
1579−253:1 DEDENT
1580−253:1 DEDENT
1581−253:1 DEDENT
1582−253:1 DEDENT
1583−253:1 DEDENT
1584−253:1 NEWLINE
1585−253:1 glyph ++
1586−253:4 name roll
1587−253:9 glyph |=
1588−253:12 name args
1589−253:16 tight glyph =
1590−253:17 tight glyph [
1591−253:18 tight glyph (
1592−253:19 tight name list
1593−253:24 tvar A
1594−253:25 tight glyph )
1595−253:27 tvar B
1596−253:29 glyph $-(
1597−253:32 tight glyph [
1598−253:33 tight tvar A
1599−253:35 tvar B
1600−253:36 tight glyph ]
1601−253:38 tvar B
1602−253:39 tight glyph )
1603−253:40 tight glyph ]
1604−254:3 INDENT
1605−254:3 glyph ?-
1606−254:6 name args
1607−255:5 INDENT
1608−255:5 glyph [
1609−255:6 tight name xs
1610−255:9 name start
1611−255:15 name combine
1612−255:22 tight glyph ]
1613−256:7 INDENT
1614−256:7 glyph ?-
1615−256:10 name xs
1616−257:9 INDENT
1617−257:9 lit ~
1618−257:11 name start
1619−258:9 NEWLINE
1620−258:9 glyph [
1621−258:10 tight name item
1622−258:15 name rest
1623−258:19 tight glyph ]
1624−258:21 glyph (
1625−258:22 tight name roll
1626−258:27 name rest
1627−258:32 glyph (
1628−258:33 tight name combine
1629−258:41 name item
1630−258:46 name start
1631−258:51 tight glyph )
1632−258:53 name combine
1633−258:60 tight glyph )
1634−260:1 DEDENT
1635−260:1 DEDENT
1636−260:1 DEDENT
1637−260:1 DEDENT
1638−260:1 NEWLINE
1639−260:1 glyph ++
1640−260:4 name reel
1641−260:9 glyph |=
1642−260:12 name args
1643−260:16 tight glyph =
1644−260:17 tight glyph [
1645−260:18 tight glyph (
1646−260:19 tight name list
1647−260:24 tvar A
1648−260:25 tight glyph )
1649−260:27 tvar B
1650−260:29 glyph $-(
1651−260:32 tight glyph [
1652−260:33 tight tvar A
1653−260:35 tvar B
1654−260:36 tight glyph ]
1655−260:38 tvar B
1656−260:39 tight glyph )
1657−260:40 tight glyph ]
1658−261:3 INDENT
1659−261:3 glyph ?-
1660−261:6 name args
1661−262:5 INDENT
1662−262:5 glyph [
1663−262:6 tight name xs
1664−262:9 name start
1665−262:15 name combine
1666−262:22 tight glyph ]
1667−263:7 INDENT
1668−263:7 glyph ?-
1669−263:10 name xs
1670−264:9 INDENT
1671−264:9 lit ~
1672−264:11 name start
1673−265:9 NEWLINE
1674−265:9 glyph [
1675−265:10 tight name item
1676−265:15 name rest
1677−265:19 tight glyph ]
1678−265:21 glyph (
1679−265:22 tight name combine
1680−265:30 name item
1681−265:35 glyph (
1682−265:36 tight name reel
1683−265:41 name rest
1684−265:46 name start
1685−265:52 name combine
1686−265:59 tight glyph )
1687−265:60 tight glyph )
1688−267:1 DEDENT
1689−267:1 DEDENT
1690−267:1 DEDENT
1691−267:1 DEDENT
1692−267:1 NEWLINE
1693−267:1 glyph ++
1694−267:4 name flit
1695−267:9 glyph |=
1696−267:12 name predicate
1697−267:21 tight glyph =
1698−267:22 tight glyph $-(
1699−267:25 tight tvar A
1700−267:27 glyph ?
1701−267:28 tight glyph )
1702−268:3 INDENT
1703−268:3 glyph |=
1704−268:6 name value
1705−268:11 tight glyph =
1706−268:12 tight tvar A
1707−269:5 INDENT
1708−269:5 glyph ^-
1709−269:8 glyph (
1710−269:9 tight name unit
1711−269:14 tvar A
1712−269:15 tight glyph )
1713−270:7 INDENT
1714−270:7 glyph ?-
1715−270:10 glyph (
1716−270:11 tight name predicate
1717−270:21 name value
1718−270:26 tight glyph )
1719−271:9 INDENT
1720−271:9 lit %.y
1721−271:13 glyph `
1722−271:14 tight name value
1723−272:9 NEWLINE
1724−272:9 lit %.n
1725−272:13 lit ~
1726−274:1 DEDENT
1727−274:1 DEDENT
1728−274:1 DEDENT
1729−274:1 DEDENT
1730−274:1 NEWLINE
1731−274:1 glyph ++
1732−274:4 name murn
1733−274:9 glyph |=
1734−274:12 name args
1735−274:16 tight glyph =
1736−274:17 tight glyph [
1737−274:18 tight glyph (
1738−274:19 tight name list
1739−274:24 tvar A
1740−274:25 tight glyph )
1741−274:27 glyph $-(
1742−274:30 tight tvar A
1743−274:32 glyph (
1744−274:33 tight name unit
1745−274:38 tvar B
1746−274:39 tight glyph )
1747−274:40 tight glyph )
1748−274:41 tight glyph ]
1749−275:3 INDENT
1750−275:3 glyph ?-
1751−275:6 name args
1752−276:5 INDENT
1753−276:5 glyph [
1754−276:6 tight name xs
1755−276:9 name f
1756−276:10 tight glyph ]
1757−276:12 glyph ^-
1758−276:15 glyph (
1759−276:16 tight name list
1760−276:21 tvar B
1761−276:22 tight glyph )
1762−277:9 INDENT
1763−277:9 glyph ?-
1764−277:12 name xs
1765−278:11 INDENT
1766−278:11 lit ~
1767−278:13 lit ~
1768−279:11 NEWLINE
1769−279:11 glyph [
1770−279:12 tight name item
1771−279:17 name rest
1772−279:21 tight glyph ]
1773−280:13 INDENT
1774−280:13 glyph ?-
1775−280:16 glyph (
1776−280:17 tight name f
1777−280:19 name item
1778−280:23 tight glyph )
1779−281:15 INDENT
1780−281:15 lit ~
1781−281:17 glyph (
1782−281:18 tight name murn
1783−281:23 name rest
1784−281:28 name f
1785−281:29 tight glyph )
1786−282:15 NEWLINE
1787−282:15 glyph [
1788−282:16 tight lit ~
1789−282:18 name value
1790−282:23 tight glyph ]
1791−282:25 glyph [
1792−282:26 tight name value
1793−282:32 glyph (
1794−282:33 tight name murn
1795−282:38 name rest
1796−282:43 name f
1797−282:44 tight glyph )
1798−282:45 tight glyph ]
1799−284:1 DEDENT
1800−284:1 DEDENT
1801−284:1 DEDENT
1802−284:1 DEDENT
1803−284:1 DEDENT
1804−284:1 DEDENT
1805−284:1 NEWLINE
1806−284:1 glyph ++
1807−284:4 name join
1808−284:9 glyph |=
1809−284:12 name args
1810−284:16 tight glyph =
1811−284:17 tight glyph [
1812−284:18 tight tvar A
1813−284:20 glyph (
1814−284:21 tight name list
1815−284:26 tvar A
1816−284:27 tight glyph )
1817−284:28 tight glyph ]
1818−285:3 INDENT
1819−285:3 glyph ?-
1820−285:6 name args
1821−286:5 INDENT
1822−286:5 glyph [
1823−286:6 tight name separator
1824−286:16 name xs
1825−286:18 tight glyph ]
1826−286:20 glyph ^-
1827−286:23 glyph (
1828−286:24 tight name list
1829−286:29 tvar A
1830−286:30 tight glyph )
1831−287:9 INDENT
1832−287:9 glyph ?-
1833−287:12 name xs
1834−288:11 INDENT
1835−288:11 lit ~
1836−288:13 lit ~
1837−289:11 NEWLINE
1838−289:11 glyph [
1839−289:12 tight name item
1840−289:17 name rest
1841−289:21 tight glyph ]
1842−290:13 INDENT
1843−290:13 glyph ?-
1844−290:16 name rest
1845−291:15 INDENT
1846−291:15 lit ~
1847−291:17 glyph [
1848−291:18 tight name item
1849−291:23 lit ~
1850−291:24 tight glyph ]
1851−292:15 NEWLINE
1852−292:15 glyph [
1853−292:16 tight name next
1854−292:21 name more
1855−292:25 tight glyph ]
1856−292:27 glyph [
1857−292:28 tight name item
1858−292:33 glyph [
1859−292:34 tight name separator
1860−292:44 glyph (
1861−292:45 tight name join
1862−292:50 name separator
1863−292:60 name rest
1864−292:64 tight glyph )
1865−292:65 tight glyph ]
1866−292:66 tight glyph ]
1867−294:1 DEDENT
1868−294:1 DEDENT
1869−294:1 DEDENT
1870−294:1 DEDENT
1871−294:1 DEDENT
1872−294:1 DEDENT
1873−294:1 NEWLINE
1874−294:1 glyph ++
1875−294:4 name snip
1876−294:9 glyph |=
1877−294:12 name xs
1878−294:14 tight glyph =
1879−294:15 tight glyph (
1880−294:16 tight name list
1881−294:21 tvar A
1882−294:22 tight glyph )
1883−295:3 INDENT
1884−295:3 glyph ^-
1885−295:6 glyph (
1886−295:7 tight name list
1887−295:12 tvar A
1888−295:13 tight glyph )
1889−296:5 INDENT
1890−296:5 glyph ?-
1891−296:8 name xs
1892−297:7 INDENT
1893−297:7 lit ~
1894−297:9 lit ~
1895−298:7 NEWLINE
1896−298:7 glyph [
1897−298:8 tight name item
1898−298:13 name rest
1899−298:17 tight glyph ]
1144+183:35 tight glyph ]
1145+184:3 INDENT
1146+184:3 glyph ?-
1147+184:6 name args
1148+185:5 INDENT
1149+185:5 glyph [
1150+185:6 tight name first
1151+185:12 name second
1152+185:18 tight glyph ]
1153+185:20 glyph ^-
1154+185:23 glyph (
1155+185:24 tight name unit
1156+185:29 glyph [
1157+185:30 tight tvar A
1158+185:32 tvar B
1159+185:33 tight glyph ]
1160+185:34 tight glyph )
1161+186:7 INDENT
1162+186:7 glyph ?-
1163+186:10 name first
1164+187:9 INDENT
1165+187:9 lit ~
1166+187:11 lit ~
1167+188:9 NEWLINE
1168+188:9 glyph [
1169+188:10 tight lit ~
1170+188:12 name a
1171+188:13 tight glyph ]
1172+189:11 INDENT
1173+189:11 glyph ?-
1174+189:14 name second
1175+190:13 INDENT
1176+190:13 lit ~
1177+190:15 lit ~
1178+191:13 NEWLINE
1179+191:13 glyph [
1180+191:14 tight lit ~
1181+191:16 name b
1182+191:17 tight glyph ]
1183+191:19 glyph `
1184+191:20 tight glyph [
1185+191:21 tight name a
1186+191:23 name b
1187+191:24 tight glyph ]
1188+193:1 DEDENT
1189+193:1 DEDENT
1190+193:1 DEDENT
1191+193:1 DEDENT
1192+193:1 DEDENT
1193+193:1 DEDENT
1194+193:1 NEWLINE
1195+193:1 glyph ++
1196+193:4 name clap
1197+193:9 glyph |=
1198+193:12 name args
1199+193:16 tight glyph =
1200+193:17 tight glyph [
1201+193:18 tight glyph (
1202+193:19 tight name unit
1203+193:24 tvar A
1204+193:25 tight glyph )
1205+193:27 glyph (
1206+193:28 tight name unit
1207+193:33 tvar A
1208+193:34 tight glyph )
1209+193:36 glyph $-(
1210+193:39 tight glyph [
1211+193:40 tight tvar A
1212+193:42 tvar A
1213+193:43 tight glyph ]
1214+193:45 tvar A
1215+193:46 tight glyph )
1216+193:47 tight glyph ]
1217+194:3 INDENT
1218+194:3 glyph ?-
1219+194:6 name args
1220+195:5 INDENT
1221+195:5 glyph [
1222+195:6 tight name first
1223+195:12 name second
1224+195:19 name combine
1225+195:26 tight glyph ]
1226+195:28 glyph ^-
1227+195:31 glyph (
1228+195:32 tight name unit
1229+195:37 tvar A
1230+195:38 tight glyph )
1231+196:7 INDENT
1232+196:7 glyph ?-
1233+196:10 name first
1234+197:9 INDENT
1235+197:9 lit ~
1236+197:11 name second
1237+198:9 NEWLINE
1238+198:9 glyph [
1239+198:10 tight lit ~
1240+198:12 name a
1241+198:13 tight glyph ]
1242+199:11 INDENT
1243+199:11 glyph ?-
1244+199:14 name second
1245+200:13 INDENT
1246+200:13 lit ~
1247+200:15 name first
1248+201:13 NEWLINE
1249+201:13 glyph [
1250+201:14 tight lit ~
1251+201:16 name b
1252+201:17 tight glyph ]
1253+201:19 glyph `
1254+201:20 tight glyph (
1255+201:21 tight name combine
1256+201:29 name a
1257+201:31 name b
1258+201:32 tight glyph )
1259+203:1 DEDENT
1260+203:1 DEDENT
1261+203:1 DEDENT
1262+203:1 DEDENT
1263+203:1 DEDENT
1264+203:1 DEDENT
1265+203:1 NEWLINE
1266+203:1 glyph ++
1267+203:4 name hunt
1268+203:9 glyph |=
1269+203:12 name args
1270+203:16 tight glyph =
1271+203:17 tight glyph [
1272+203:18 tight glyph $-(
1273+203:21 tight glyph [
1274+203:22 tight tvar A
1275+203:24 tvar A
1276+203:25 tight glyph ]
1277+203:27 glyph ?
1278+203:28 tight glyph )
1279+203:30 glyph (
1280+203:31 tight name unit
1281+203:36 tvar A
1282+203:37 tight glyph )
1283+203:39 glyph (
1284+203:40 tight name unit
1285+203:45 tvar A
1286+203:46 tight glyph )
1287+203:47 tight glyph ]
1288+204:3 INDENT
1289+204:3 glyph ?-
1290+204:6 name args
1291+205:5 INDENT
1292+205:5 glyph [
1293+205:6 tight name choose
1294+205:13 name first
1295+205:19 name second
1296+205:25 tight glyph ]
1297+205:27 glyph ^-
1298+205:30 glyph (
1299+205:31 tight name unit
1300+205:36 tvar A
1301+205:37 tight glyph )
1302+206:7 INDENT
1303+206:7 glyph ?-
1304+206:10 name first
1305+207:9 INDENT
1306+207:9 lit ~
1307+207:11 name second
1308+208:9 NEWLINE
1309+208:9 glyph [
1310+208:10 tight lit ~
1311+208:12 name a
1312+208:13 tight glyph ]
1313+209:11 INDENT
1314+209:11 glyph ?-
1315+209:14 name second
1316+210:13 INDENT
1317+210:13 lit ~
1318+210:15 name first
1319+211:13 NEWLINE
1320+211:13 glyph [
1321+211:14 tight lit ~
1322+211:16 name b
1323+211:17 tight glyph ]
1324+212:15 INDENT
1325+212:15 glyph ?-
1326+212:18 glyph (
1327+212:19 tight name choose
1328+212:26 name a
1329+212:28 name b
1330+212:29 tight glyph )
1331+213:17 INDENT
1332+213:17 lit %.y
1333+213:21 name first
1334+214:17 NEWLINE
1335+214:17 lit %.n
1336+214:21 name second
1337+216:1 DEDENT
1338+216:1 DEDENT
1339+216:1 DEDENT
1340+216:1 DEDENT
1341+216:1 DEDENT
1342+216:1 DEDENT
1343+216:1 DEDENT
1344+216:1 DEDENT
1345+216:1 NEWLINE
1346+216:1 glyph ++
1347+216:4 name mate
1348+216:9 glyph |=
1349+216:12 name args
1350+216:16 tight glyph =
1351+216:17 tight glyph [
1352+216:18 tight glyph (
1353+216:19 tight name unit
1354+216:24 tvar A
1355+216:25 tight glyph )
1356+216:27 glyph (
1357+216:28 tight name unit
1358+216:33 tvar A
1359+216:34 tight glyph )
1360+216:35 tight glyph ]
1361+217:3 INDENT
1362+217:3 glyph ?-
1363+217:6 name args
1364+218:5 INDENT
1365+218:5 glyph [
1366+218:6 tight name first
1367+218:12 name second
1368+218:18 tight glyph ]
1369+218:20 glyph ^-
1370+218:23 glyph (
1371+218:24 tight name unit
1372+218:29 tvar A
1373+218:30 tight glyph )
1374+219:7 INDENT
1375+219:7 glyph ?-
1376+219:10 name second
1377+220:9 INDENT
1378+220:9 lit ~
1379+220:11 name first
1380+221:9 NEWLINE
1381+221:9 glyph [
1382+221:10 tight lit ~
1383+221:12 name b
1384+221:13 tight glyph ]
1385+222:11 INDENT
1386+222:11 glyph ?-
1387+222:14 name first
1388+223:13 INDENT
1389+223:13 lit ~
1390+223:15 name second
1391+224:13 NEWLINE
1392+224:13 glyph [
1393+224:14 tight lit ~
1394+224:16 name a
1395+224:17 tight glyph ]
1396+225:15 INDENT
1397+225:15 glyph ?-
1398+225:18 glyph (
1399+225:19 tight name eq
1400+225:22 name a
1401+225:24 name b
1402+225:25 tight glyph )
1403+226:17 INDENT
1404+226:17 lit %.y
1405+226:21 name first
1406+227:17 NEWLINE
1407+227:17 lit %.n
1408+227:21 glyph !!
1409+229:1 DEDENT
1410+229:1 DEDENT
1411+229:1 DEDENT
1412+229:1 DEDENT
1413+229:1 DEDENT
1414+229:1 DEDENT
1415+229:1 DEDENT
1416+229:1 DEDENT
1417+229:1 NEWLINE
1418+229:1 glyph ++
1419+229:4 name clef
1420+229:9 glyph |=
1421+229:12 name args
1422+229:16 tight glyph =
1423+229:17 tight glyph [
1424+229:18 tight glyph (
1425+229:19 tight name unit
1426+229:24 tvar A
1427+229:25 tight glyph )
1428+229:27 glyph (
1429+229:28 tight name unit
1430+229:33 tvar B
1431+229:34 tight glyph )
1432+229:36 glyph $-(
1433+229:39 tight glyph [
1434+229:40 tight tvar A
1435+229:42 tvar B
1436+229:43 tight glyph ]
1437+229:45 glyph (
1438+229:46 tight name unit
1439+229:51 tvar C
1440+229:52 tight glyph )
1441+229:53 tight glyph )
1442+229:54 tight glyph ]
1443+230:3 INDENT
1444+230:3 glyph ?-
1445+230:6 name args
1446+231:5 INDENT
1447+231:5 glyph [
1448+231:6 tight name first
1449+231:12 name second
1450+231:19 name combine
1451+231:26 tight glyph ]
1452+231:28 glyph ^-
1453+231:31 glyph (
1454+231:32 tight name unit
1455+231:37 tvar C
1456+231:38 tight glyph )
1457+232:7 INDENT
1458+232:7 glyph ?-
1459+232:10 name first
1460+233:9 INDENT
1461+233:9 lit ~
1462+233:11 lit ~
1463+234:9 NEWLINE
1464+234:9 glyph [
1465+234:10 tight lit ~
1466+234:12 name a
1467+234:13 tight glyph ]
1468+235:11 INDENT
1469+235:11 glyph ?-
1470+235:14 name second
1471+236:13 INDENT
1472+236:13 lit ~
1473+236:15 lit ~
1474+237:13 NEWLINE
1475+237:13 glyph [
1476+237:14 tight lit ~
1477+237:16 name b
1478+237:17 tight glyph ]
1479+237:19 glyph (
1480+237:20 tight name combine
1481+237:28 name a
1482+237:30 name b
1483+237:31 tight glyph )
1484+239:1 DEDENT
1485+239:1 DEDENT
1486+239:1 DEDENT
1487+239:1 DEDENT
1488+239:1 DEDENT
1489+239:1 DEDENT
1490+239:1 NEWLINE
1491+239:1 glyph ++
1492+239:4 name skim
1493+239:9 glyph |=
1494+239:12 name args
1495+239:16 tight glyph =
1496+239:17 tight glyph [
1497+239:18 tight glyph (
1498+239:19 tight name list
1499+239:24 tvar A
1500+239:25 tight glyph )
1501+239:27 glyph $-(
1502+239:30 tight tvar A
1503+239:32 glyph ?
1504+239:33 tight glyph )
1505+239:34 tight glyph ]
1506+240:3 INDENT
1507+240:3 glyph ?-
1508+240:6 name args
1509+241:5 INDENT
1510+241:5 glyph [
1511+241:6 tight name xs
1512+241:9 name predicate
1513+241:18 tight glyph ]
1514+241:20 glyph ^-
1515+241:23 glyph (
1516+241:24 tight name list
1517+241:29 tvar A
1518+241:30 tight glyph )
1519+242:9 INDENT
1520+242:9 glyph ?-
1521+242:12 name xs
1522+243:11 INDENT
1523+243:11 lit ~
1524+243:13 lit ~
1525+244:11 NEWLINE
1526+244:11 glyph [
1527+244:12 tight name item
1528+244:17 name rest
1529+244:21 tight glyph ]
1530+245:13 INDENT
1531+245:13 glyph ?-
1532+245:16 glyph (
1533+245:17 tight name predicate
1534+245:27 name item
1535+245:31 tight glyph )
1536+246:15 INDENT
1537+246:15 lit %.y
1538+246:19 glyph [
1539+246:20 tight name item
1540+246:25 glyph (
1541+246:26 tight name skim
1542+246:31 name rest
1543+246:36 name predicate
1544+246:45 tight glyph )
1545+246:46 tight glyph ]
1546+247:15 NEWLINE
1547+247:15 lit %.n
1548+247:19 glyph (
1549+247:20 tight name skim
1550+247:25 name rest
1551+247:30 name predicate
1552+247:39 tight glyph )
1553+249:1 DEDENT
1554+249:1 DEDENT
1555+249:1 DEDENT
1556+249:1 DEDENT
1557+249:1 DEDENT
1558+249:1 DEDENT
1559+249:1 NEWLINE
1560+249:1 glyph ++
1561+249:4 name skip
1562+249:9 glyph |=
1563+249:12 name args
1564+249:16 tight glyph =
1565+249:17 tight glyph [
1566+249:18 tight glyph (
1567+249:19 tight name list
1568+249:24 tvar A
1569+249:25 tight glyph )
1570+249:27 glyph $-(
1571+249:30 tight tvar A
1572+249:32 glyph ?
1573+249:33 tight glyph )
1574+249:34 tight glyph ]
1575+250:3 INDENT
1576+250:3 glyph ?-
1577+250:6 name args
1578+251:5 INDENT
1579+251:5 glyph [
1580+251:6 tight name xs
1581+251:9 name predicate
1582+251:18 tight glyph ]
1583+251:20 glyph ^-
1584+251:23 glyph (
1585+251:24 tight name list
1586+251:29 tvar A
1587+251:30 tight glyph )
1588+252:9 INDENT
1589+252:9 glyph ?-
1590+252:12 name xs
1591+253:11 INDENT
1592+253:11 lit ~
1593+253:13 lit ~
1594+254:11 NEWLINE
1595+254:11 glyph [
1596+254:12 tight name item
1597+254:17 name rest
1598+254:21 tight glyph ]
1599+255:13 INDENT
1600+255:13 glyph ?-
1601+255:16 glyph (
1602+255:17 tight name predicate
1603+255:27 name item
1604+255:31 tight glyph )
1605+256:15 INDENT
1606+256:15 lit %.y
1607+256:19 glyph (
1608+256:20 tight name skip
1609+256:25 name rest
1610+256:30 name predicate
1611+256:39 tight glyph )
1612+257:15 NEWLINE
1613+257:15 lit %.n
1614+257:19 glyph [
1615+257:20 tight name item
1616+257:25 glyph (
1617+257:26 tight name skip
1618+257:31 name rest
1619+257:36 name predicate
1620+257:45 tight glyph )
1621+257:46 tight glyph ]
1622+259:1 DEDENT
1623+259:1 DEDENT
1624+259:1 DEDENT
1625+259:1 DEDENT
1626+259:1 DEDENT
1627+259:1 DEDENT
1628+259:1 NEWLINE
1629+259:1 glyph ++
1630+259:4 name levy
1631+259:9 glyph |=
1632+259:12 name args
1633+259:16 tight glyph =
1634+259:17 tight glyph [
1635+259:18 tight glyph (
1636+259:19 tight name list
1637+259:24 tvar A
1638+259:25 tight glyph )
1639+259:27 glyph $-(
1640+259:30 tight tvar A
1641+259:32 glyph ?
1642+259:33 tight glyph )
1643+259:34 tight glyph ]
1644+260:3 INDENT
1645+260:3 glyph ^-
1646+260:6 glyph ?
1647+261:5 INDENT
1648+261:5 glyph ?-
1649+261:8 name args
1650+262:7 INDENT
1651+262:7 glyph [
1652+262:8 tight name xs
1653+262:11 name predicate
1654+262:20 tight glyph ]
1655+263:9 INDENT
1656+263:9 glyph ?-
1657+263:12 name xs
1658+264:11 INDENT
1659+264:11 lit ~
1660+264:13 lit %.y
1661+265:11 NEWLINE
1662+265:11 glyph [
1663+265:12 tight name item
1664+265:17 name rest
1665+265:21 tight glyph ]
1666+266:13 INDENT
1667+266:13 glyph ?-
1668+266:16 glyph (
1669+266:17 tight name predicate
1670+266:27 name item
1671+266:31 tight glyph )
1672+267:15 INDENT
1673+267:15 lit %.y
1674+267:19 glyph (
1675+267:20 tight name levy
1676+267:25 name rest
1677+267:30 name predicate
1678+267:39 tight glyph )
1679+268:15 NEWLINE
1680+268:15 lit %.n
1681+268:19 lit %.n
1682+270:1 DEDENT
1683+270:1 DEDENT
1684+270:1 DEDENT
1685+270:1 DEDENT
1686+270:1 DEDENT
1687+270:1 DEDENT
1688+270:1 DEDENT
1689+270:1 NEWLINE
1690+270:1 glyph ++
1691+270:4 name lien
1692+270:9 glyph |=
1693+270:12 name args
1694+270:16 tight glyph =
1695+270:17 tight glyph [
1696+270:18 tight glyph (
1697+270:19 tight name list
1698+270:24 tvar A
1699+270:25 tight glyph )
1700+270:27 glyph $-(
1701+270:30 tight tvar A
1702+270:32 glyph ?
1703+270:33 tight glyph )
1704+270:34 tight glyph ]
1705+271:3 INDENT
1706+271:3 glyph ^-
1707+271:6 glyph ?
1708+272:5 INDENT
1709+272:5 glyph ?-
1710+272:8 name args
1711+273:7 INDENT
1712+273:7 glyph [
1713+273:8 tight name xs
1714+273:11 name predicate
1715+273:20 tight glyph ]
1716+274:9 INDENT
1717+274:9 glyph ?-
1718+274:12 name xs
1719+275:11 INDENT
1720+275:11 lit ~
1721+275:13 lit %.n
1722+276:11 NEWLINE
1723+276:11 glyph [
1724+276:12 tight name item
1725+276:17 name rest
1726+276:21 tight glyph ]
1727+277:13 INDENT
1728+277:13 glyph ?-
1729+277:16 glyph (
1730+277:17 tight name predicate
1731+277:27 name item
1732+277:31 tight glyph )
1733+278:15 INDENT
1734+278:15 lit %.y
1735+278:19 lit %.y
1736+279:15 NEWLINE
1737+279:15 lit %.n
1738+279:19 glyph (
1739+279:20 tight name lien
1740+279:25 name rest
1741+279:30 name predicate
1742+279:39 tight glyph )
1743+281:1 DEDENT
1744+281:1 DEDENT
1745+281:1 DEDENT
1746+281:1 DEDENT
1747+281:1 DEDENT
1748+281:1 DEDENT
1749+281:1 DEDENT
1750+281:1 NEWLINE
1751+281:1 glyph ++
1752+281:4 name roll
1753+281:9 glyph |=
1754+281:12 name args
1755+281:16 tight glyph =
1756+281:17 tight glyph [
1757+281:18 tight glyph (
1758+281:19 tight name list
1759+281:24 tvar A
1760+281:25 tight glyph )
1761+281:27 tvar B
1762+281:29 glyph $-(
1763+281:32 tight glyph [
1764+281:33 tight tvar A
1765+281:35 tvar B
1766+281:36 tight glyph ]
1767+281:38 tvar B
1768+281:39 tight glyph )
1769+281:40 tight glyph ]
1770+282:3 INDENT
1771+282:3 glyph ?-
1772+282:6 name args
1773+283:5 INDENT
1774+283:5 glyph [
1775+283:6 tight name xs
1776+283:9 name start
1777+283:15 name combine
1778+283:22 tight glyph ]
1779+284:7 INDENT
1780+284:7 glyph ?-
1781+284:10 name xs
1782+285:9 INDENT
1783+285:9 lit ~
1784+285:11 name start
1785+286:9 NEWLINE
1786+286:9 glyph [
1787+286:10 tight name item
1788+286:15 name rest
1789+286:19 tight glyph ]
1790+286:21 glyph (
1791+286:22 tight name roll
1792+286:27 name rest
1793+286:32 glyph (
1794+286:33 tight name combine
1795+286:41 name item
1796+286:46 name start
1797+286:51 tight glyph )
1798+286:53 name combine
1799+286:60 tight glyph )
1800+288:1 DEDENT
1801+288:1 DEDENT
1802+288:1 DEDENT
1803+288:1 DEDENT
1804+288:1 NEWLINE
1805+288:1 glyph ++
1806+288:4 name reel
1807+288:9 glyph |=
1808+288:12 name args
1809+288:16 tight glyph =
1810+288:17 tight glyph [
1811+288:18 tight glyph (
1812+288:19 tight name list
1813+288:24 tvar A
1814+288:25 tight glyph )
1815+288:27 tvar B
1816+288:29 glyph $-(
1817+288:32 tight glyph [
1818+288:33 tight tvar A
1819+288:35 tvar B
1820+288:36 tight glyph ]
1821+288:38 tvar B
1822+288:39 tight glyph )
1823+288:40 tight glyph ]
1824+289:3 INDENT
1825+289:3 glyph ?-
1826+289:6 name args
1827+290:5 INDENT
1828+290:5 glyph [
1829+290:6 tight name xs
1830+290:9 name start
1831+290:15 name combine
1832+290:22 tight glyph ]
1833+291:7 INDENT
1834+291:7 glyph ?-
1835+291:10 name xs
1836+292:9 INDENT
1837+292:9 lit ~
1838+292:11 name start
1839+293:9 NEWLINE
1840+293:9 glyph [
1841+293:10 tight name item
1842+293:15 name rest
1843+293:19 tight glyph ]
1844+293:21 glyph (
1845+293:22 tight name combine
1846+293:30 name item
1847+293:35 glyph (
1848+293:36 tight name reel
1849+293:41 name rest
1850+293:46 name start
1851+293:52 name combine
1852+293:59 tight glyph )
1853+293:60 tight glyph )
1854+295:1 DEDENT
1855+295:1 DEDENT
1856+295:1 DEDENT
1857+295:1 DEDENT
1858+295:1 NEWLINE
1859+295:1 glyph ++
1860+295:4 name flit
1861+295:9 glyph |=
1862+295:12 name predicate
1863+295:21 tight glyph =
1864+295:22 tight glyph $-(
1865+295:25 tight tvar A
1866+295:27 glyph ?
1867+295:28 tight glyph )
1868+296:3 INDENT
1869+296:3 glyph |=
1870+296:6 name value
1871+296:11 tight glyph =
1872+296:12 tight tvar A
1873+297:5 INDENT
1874+297:5 glyph ^-
1875+297:8 glyph (
1876+297:9 tight name unit
1877+297:14 tvar A
1878+297:15 tight glyph )
1879+298:7 INDENT
1880+298:7 glyph ?-
1881+298:10 glyph (
1882+298:11 tight name predicate
1883+298:21 name value
1884+298:26 tight glyph )
19001885299:9 INDENT
1901−299:9 glyph ?-
1902−299:12 name rest
1903−300:11 INDENT
1904−300:11 lit ~
1886+299:9 lit %.y
1887+299:13 glyph `
1888+299:14 tight name value
1889+300:9 NEWLINE
1890+300:9 lit %.n
19051891300:13 lit ~
1906−301:11 NEWLINE
1907−301:11 glyph [
1908−301:12 tight name next
1909−301:17 name more
1910−301:21 tight glyph ]
1911−301:23 glyph [
1912−301:24 tight name item
1913−301:29 glyph (
1914−301:30 tight name snip
1915−301:35 name rest
1916−301:39 tight glyph )
1917−301:40 tight glyph ]
1918−303:1 DEDENT
1919−303:1 DEDENT
1920−303:1 DEDENT
1921−303:1 DEDENT
1922−303:1 DEDENT
1923−303:1 NEWLINE
1924−303:1 glyph ++
1925−303:4 name rear
1926−303:9 glyph |=
1927−303:12 name xs
1928−303:14 tight glyph =
1929−303:15 tight glyph (
1930−303:16 tight name list
1931−303:21 tvar A
1932−303:22 tight glyph )
1933−304:3 INDENT
1934−304:3 glyph ?-
1935−304:6 name xs
1936−305:5 INDENT
1937−305:5 lit ~
1938−305:7 glyph !!
1939−306:5 NEWLINE
1940−306:5 glyph [
1941−306:6 tight name item
1942−306:11 name rest
1943−306:15 tight glyph ]
1944−307:7 INDENT
1945−307:7 glyph ?-
1946−307:10 name rest
1947−308:9 INDENT
1948−308:9 lit ~
1949−308:11 name item
1950−309:9 NEWLINE
1951−309:9 glyph [
1952−309:10 tight name next
1953−309:15 name more
1954−309:19 tight glyph ]
1955−309:21 glyph (
1956−309:22 tight name rear
1957−309:27 name rest
1958−309:31 tight glyph )
1959−311:1 DEDENT
1960−311:1 DEDENT
1961−311:1 DEDENT
1962−311:1 DEDENT
1963−311:1 NEWLINE
1964−311:1 glyph ++
1965−311:4 name cork
1966−311:9 glyph |=
1967−311:12 name gates
1968−311:17 tight glyph =
1969−311:18 tight glyph [
1970−311:19 tight glyph $-(
1971−311:22 tight tvar A
1972−311:24 tvar B
1973−311:25 tight glyph )
1974−311:27 glyph $-(
1975−311:30 tight tvar B
1976−311:32 tvar C
1977−311:33 tight glyph )
1978−311:34 tight glyph ]
1979−312:3 INDENT
1980−312:3 glyph ?-
1981−312:6 name gates
1982−313:5 INDENT
1983−313:5 glyph [
1984−313:6 tight name f
1985−313:8 name g
1986−313:9 tight glyph ]
1987−313:11 glyph |=
1988−313:14 name x
1989−313:15 tight glyph =
1990−313:16 tight tvar A
1991−313:18 glyph (
1992−313:19 tight name g
1993−313:21 glyph (
1994−313:22 tight name f
1995−313:24 name x
1996−313:25 tight glyph )
1997−313:26 tight glyph )
1998−315:1 DEDENT
1999−315:1 DEDENT
2000−315:1 NEWLINE
2001−315:1 glyph ++
2002−315:4 name corl
2003−315:9 glyph |=
2004−315:12 name gates
2005−315:17 tight glyph =
2006−315:18 tight glyph [
2007−315:19 tight glyph $-(
2008−315:22 tight tvar B
2009−315:24 tvar C
2010−315:25 tight glyph )
2011−315:27 glyph $-(
2012−315:30 tight tvar A
2013−315:32 tvar B
2014−315:33 tight glyph )
2015−315:34 tight glyph ]
2016−316:3 INDENT
2017−316:3 glyph ?-
2018−316:6 name gates
2019−317:5 INDENT
2020−317:5 glyph [
2021−317:6 tight name f
2022−317:8 name g
2023−317:9 tight glyph ]
2024−317:11 glyph |=
2025−317:14 name x
2026−317:15 tight glyph =
2027−317:16 tight tvar A
2028−317:18 glyph (
2029−317:19 tight name f
2030−317:21 glyph (
2031−317:22 tight name g
2032−317:24 name x
2033−317:25 tight glyph )
2034−317:26 tight glyph )
2035−319:1 DEDENT
2036−319:1 DEDENT
2037−319:1 NEWLINE
2038−319:1 glyph ++
2039−319:4 name cury
2040−319:9 glyph |=
2041−319:12 name args
2042−319:16 tight glyph =
2043−319:17 tight glyph [
2044−319:18 tight glyph $-(
2045−319:21 tight glyph [
2046−319:22 tight tvar A
2047−319:24 tvar B
2048−319:25 tight glyph ]
2049−319:27 tvar C
2050−319:28 tight glyph )
2051−319:30 tvar A
2052−319:31 tight glyph ]
2053−320:3 INDENT
2054−320:3 glyph ?-
2055−320:6 name args
2056−321:5 INDENT
2057−321:5 glyph [
2058−321:6 tight name f
2059−321:8 name a
2060−321:9 tight glyph ]
2061−321:11 glyph |=
2062−321:14 name b
2063−321:15 tight glyph =
2064−321:16 tight tvar B
2065−321:18 glyph (
2066−321:19 tight name f
2067−321:21 name a
2068−321:23 name b
2069−321:24 tight glyph )
2070−323:1 DEDENT
2071−323:1 DEDENT
2072−323:1 NEWLINE
2073−323:1 glyph ++
2074−323:4 name curr
2075−323:9 glyph |=
2076−323:12 name args
2077−323:16 tight glyph =
2078−323:17 tight glyph [
2079−323:18 tight glyph $-(
2080−323:21 tight glyph [
2081−323:22 tight tvar A
2082−323:24 tvar B
2083−323:25 tight glyph ]
2084−323:27 tvar C
2085−323:28 tight glyph )
2086−323:30 tvar B
2087−323:31 tight glyph ]
2088−324:3 INDENT
2089−324:3 glyph ?-
2090−324:6 name args
2091−325:5 INDENT
2092−325:5 glyph [
2093−325:6 tight name f
2094−325:8 name b
2095−325:9 tight glyph ]
2096−325:11 glyph |=
2097−325:14 name a
2098−325:15 tight glyph =
2099−325:16 tight tvar A
2100−325:18 glyph (
2101−325:19 tight name f
2102−325:21 name a
2103−325:23 name b
2104−325:24 tight glyph )
2105−327:1 DEDENT
2106−327:1 DEDENT
2107−327:1 NEWLINE
2108−327:1 glyph +$
2109−327:4 name cmd
2110−327:8 glyph |$
2111−327:11 glyph [
2112−327:12 tight tvar M
2113−327:13 tight glyph ]
2114−328:3 INDENT
2115−328:3 glyph [
2116−328:4 tight lit %poke
2117−328:10 name p
2118−328:11 tight glyph =
2119−328:12 tight name raw-poke
2120−328:21 name reply
2121−328:26 tight glyph =
2122−328:27 tight glyph $-(
2123−328:30 tight glyph (
2124−328:31 tight name unit
2125−328:36 aura @t
2126−328:38 tight glyph )
2127−328:40 tvar M
2128−328:41 tight glyph )
2129−328:42 tight glyph ]
2130−329:3 NEWLINE
2131−329:3 glyph [
2132−329:4 tight lit %go
2133−329:8 name url
2134−329:11 tight glyph =
2135−329:12 tight aura @t
2136−329:14 tight glyph ]
2137−330:3 NEWLINE
2138−330:3 glyph [
2139−330:4 tight lit %wait
2140−330:10 name gap
2141−330:13 tight glyph =
2142−330:14 tight aura @dr
2143−330:18 name msg
2144−330:21 tight glyph =
2145−330:22 tight tvar M
2146−330:23 tight glyph ]
2147−331:3 NEWLINE
2148−331:3 glyph [
2149−331:4 tight lit %now
2150−331:9 name reply
1892+302:1 DEDENT
1893+302:1 DEDENT
1894+302:1 DEDENT
1895+302:1 DEDENT
1896+302:1 NEWLINE
1897+302:1 glyph ++
1898+302:4 name murn
1899+302:9 glyph |=
1900+302:12 name args
1901+302:16 tight glyph =
1902+302:17 tight glyph [
1903+302:18 tight glyph (
1904+302:19 tight name list
1905+302:24 tvar A
1906+302:25 tight glyph )
1907+302:27 glyph $-(
1908+302:30 tight tvar A
1909+302:32 glyph (
1910+302:33 tight name unit
1911+302:38 tvar B
1912+302:39 tight glyph )
1913+302:40 tight glyph )
1914+302:41 tight glyph ]
1915+303:3 INDENT
1916+303:3 glyph ?-
1917+303:6 name args
1918+304:5 INDENT
1919+304:5 glyph [
1920+304:6 tight name xs
1921+304:9 name f
1922+304:10 tight glyph ]
1923+304:12 glyph ^-
1924+304:15 glyph (
1925+304:16 tight name list
1926+304:21 tvar B
1927+304:22 tight glyph )
1928+305:9 INDENT
1929+305:9 glyph ?-
1930+305:12 name xs
1931+306:11 INDENT
1932+306:11 lit ~
1933+306:13 lit ~
1934+307:11 NEWLINE
1935+307:11 glyph [
1936+307:12 tight name item
1937+307:17 name rest
1938+307:21 tight glyph ]
1939+308:13 INDENT
1940+308:13 glyph ?-
1941+308:16 glyph (
1942+308:17 tight name f
1943+308:19 name item
1944+308:23 tight glyph )
1945+309:15 INDENT
1946+309:15 lit ~
1947+309:17 glyph (
1948+309:18 tight name murn
1949+309:23 name rest
1950+309:28 name f
1951+309:29 tight glyph )
1952+310:15 NEWLINE
1953+310:15 glyph [
1954+310:16 tight lit ~
1955+310:18 name value
1956+310:23 tight glyph ]
1957+310:25 glyph [
1958+310:26 tight name value
1959+310:32 glyph (
1960+310:33 tight name murn
1961+310:38 name rest
1962+310:43 name f
1963+310:44 tight glyph )
1964+310:45 tight glyph ]
1965+312:1 DEDENT
1966+312:1 DEDENT
1967+312:1 DEDENT
1968+312:1 DEDENT
1969+312:1 DEDENT
1970+312:1 DEDENT
1971+312:1 NEWLINE
1972+312:1 glyph ++
1973+312:4 name join
1974+312:9 glyph |=
1975+312:12 name args
1976+312:16 tight glyph =
1977+312:17 tight glyph [
1978+312:18 tight tvar A
1979+312:20 glyph (
1980+312:21 tight name list
1981+312:26 tvar A
1982+312:27 tight glyph )
1983+312:28 tight glyph ]
1984+313:3 INDENT
1985+313:3 glyph ?-
1986+313:6 name args
1987+314:5 INDENT
1988+314:5 glyph [
1989+314:6 tight name separator
1990+314:16 name xs
1991+314:18 tight glyph ]
1992+314:20 glyph ^-
1993+314:23 glyph (
1994+314:24 tight name list
1995+314:29 tvar A
1996+314:30 tight glyph )
1997+315:9 INDENT
1998+315:9 glyph ?-
1999+315:12 name xs
2000+316:11 INDENT
2001+316:11 lit ~
2002+316:13 lit ~
2003+317:11 NEWLINE
2004+317:11 glyph [
2005+317:12 tight name item
2006+317:17 name rest
2007+317:21 tight glyph ]
2008+318:13 INDENT
2009+318:13 glyph ?-
2010+318:16 name rest
2011+319:15 INDENT
2012+319:15 lit ~
2013+319:17 glyph [
2014+319:18 tight name item
2015+319:23 lit ~
2016+319:24 tight glyph ]
2017+320:15 NEWLINE
2018+320:15 glyph [
2019+320:16 tight name next
2020+320:21 name more
2021+320:25 tight glyph ]
2022+320:27 glyph [
2023+320:28 tight name item
2024+320:33 glyph [
2025+320:34 tight name separator
2026+320:44 glyph (
2027+320:45 tight name join
2028+320:50 name separator
2029+320:60 name rest
2030+320:64 tight glyph )
2031+320:65 tight glyph ]
2032+320:66 tight glyph ]
2033+322:1 DEDENT
2034+322:1 DEDENT
2035+322:1 DEDENT
2036+322:1 DEDENT
2037+322:1 DEDENT
2038+322:1 DEDENT
2039+322:1 NEWLINE
2040+322:1 glyph ++
2041+322:4 name snip
2042+322:9 glyph |=
2043+322:12 name xs
2044+322:14 tight glyph =
2045+322:15 tight glyph (
2046+322:16 tight name list
2047+322:21 tvar A
2048+322:22 tight glyph )
2049+323:3 INDENT
2050+323:3 glyph ^-
2051+323:6 glyph (
2052+323:7 tight name list
2053+323:12 tvar A
2054+323:13 tight glyph )
2055+324:5 INDENT
2056+324:5 glyph ?-
2057+324:8 name xs
2058+325:7 INDENT
2059+325:7 lit ~
2060+325:9 lit ~
2061+326:7 NEWLINE
2062+326:7 glyph [
2063+326:8 tight name item
2064+326:13 name rest
2065+326:17 tight glyph ]
2066+327:9 INDENT
2067+327:9 glyph ?-
2068+327:12 name rest
2069+328:11 INDENT
2070+328:11 lit ~
2071+328:13 lit ~
2072+329:11 NEWLINE
2073+329:11 glyph [
2074+329:12 tight name next
2075+329:17 name more
2076+329:21 tight glyph ]
2077+329:23 glyph [
2078+329:24 tight name item
2079+329:29 glyph (
2080+329:30 tight name snip
2081+329:35 name rest
2082+329:39 tight glyph )
2083+329:40 tight glyph ]
2084+331:1 DEDENT
2085+331:1 DEDENT
2086+331:1 DEDENT
2087+331:1 DEDENT
2088+331:1 DEDENT
2089+331:1 NEWLINE
2090+331:1 glyph ++
2091+331:4 name rear
2092+331:9 glyph |=
2093+331:12 name xs
21512094331:14 tight glyph =
2152−331:15 tight glyph $-(
2153−331:18 tight aura @da
2154−331:22 tvar M
2155−331:23 tight glyph )
2156−331:24 tight glyph ]
2157−332:3 NEWLINE
2158−332:3 glyph [
2159−332:4 tight lit %who
2160−332:9 name reply
2161−332:14 tight glyph =
2162−332:15 tight glyph $-(
2163−332:18 tight aura @p
2164−332:21 tvar M
2165−332:22 tight glyph )
2166−332:23 tight glyph ]
2167−334:1 DEDENT
2168−334:1 NEWLINE
2169−334:1 glyph ++
2170−334:4 name gth
2171−334:8 glyph |=
2172−334:11 name args
2173−334:15 tight glyph =
2174−334:16 tight glyph [
2175−334:17 tight tvar A
2176−334:19 tvar A
2177−334:20 tight glyph ]
2178−334:22 glyph (
2179−334:23 tight wing gth-atom.internal
2180−334:41 name args
2181−334:45 tight glyph )
2182−335:1 NEWLINE
2183−335:1 glyph ++
2184−335:4 name add
2185−335:8 glyph |=
2186−335:11 name args
2187−335:15 tight glyph =
2188−335:16 tight glyph [
2189−335:17 tight tvar A
2190−335:19 tvar A
2191−335:20 tight glyph ]
2192−335:22 glyph (
2193−335:23 tight wing add-atom.internal
2194−335:41 name args
2195−335:45 tight glyph )
2196−336:1 NEWLINE
2197−336:1 glyph ++
2198−336:4 name dec
2199−336:8 glyph |=
2200−336:11 name atom
2201−336:15 tight glyph =
2202−336:16 tight tvar A
2203−336:18 glyph (
2204−336:19 tight wing dec-atom.internal
2205−336:37 name atom
2206−336:41 tight glyph )
2207−338:1 NEWLINE
2208−338:1 glyph +$
2209−338:4 name ask
2210−338:8 glyph |$
2211−338:11 glyph [
2212−338:12 tight tvar M
2213−338:13 tight glyph ]
2214−338:15 glyph (
2215−338:16 tight wing ask.internal
2216−338:29 tvar M
2217−338:30 tight glyph )
2095+331:15 tight glyph (
2096+331:16 tight name list
2097+331:21 tvar A
2098+331:22 tight glyph )
2099+332:3 INDENT
2100+332:3 glyph ?-
2101+332:6 name xs
2102+333:5 INDENT
2103+333:5 lit ~
2104+333:7 glyph !!
2105+334:5 NEWLINE
2106+334:5 glyph [
2107+334:6 tight name item
2108+334:11 name rest
2109+334:15 tight glyph ]
2110+335:7 INDENT
2111+335:7 glyph ?-
2112+335:10 name rest
2113+336:9 INDENT
2114+336:9 lit ~
2115+336:11 name item
2116+337:9 NEWLINE
2117+337:9 glyph [
2118+337:10 tight name next
2119+337:15 name more
2120+337:19 tight glyph ]
2121+337:21 glyph (
2122+337:22 tight name rear
2123+337:27 name rest
2124+337:31 tight glyph )
2125+339:1 DEDENT
2126+339:1 DEDENT
2127+339:1 DEDENT
2128+339:1 DEDENT
22182129339:1 NEWLINE
22192130339:1 glyph ++
2220−339:4 name pure
2131+339:4 name cork
22212132339:9 glyph |=
2222−339:12 name x
2223−339:13 tight glyph =
2224−339:14 tight tvar M
2225−339:16 glyph ^-
2226−339:19 glyph (
2227−339:20 tight name ask
2228−339:24 tvar M
2133+339:12 name gates
2134+339:17 tight glyph =
2135+339:18 tight glyph [
2136+339:19 tight glyph $-(
2137+339:22 tight tvar A
2138+339:24 tvar B
22292139339:25 tight glyph )
2230−339:27 glyph [
2231−339:28 tight lit %pure
2232−339:34 name x
2233−339:35 tight glyph ]
2234−339:36 NEWLINE
2140+339:27 glyph $-(
2141+339:30 tight tvar B
2142+339:32 tvar C
2143+339:33 tight glyph )
2144+339:34 tight glyph ]
2145+340:3 INDENT
2146+340:3 glyph ?-
2147+340:6 name gates
2148+341:5 INDENT
2149+341:5 glyph [
2150+341:6 tight name f
2151+341:8 name g
2152+341:9 tight glyph ]
2153+341:11 glyph |=
2154+341:14 name x
2155+341:15 tight glyph =
2156+341:16 tight tvar A
2157+341:18 glyph (
2158+341:19 tight name g
2159+341:21 glyph (
2160+341:22 tight name f
2161+341:24 name x
2162+341:25 tight glyph )
2163+341:26 tight glyph )
2164+343:1 DEDENT
2165+343:1 DEDENT
2166+343:1 NEWLINE
2167+343:1 glyph ++
2168+343:4 name corl
2169+343:9 glyph |=
2170+343:12 name gates
2171+343:17 tight glyph =
2172+343:18 tight glyph [
2173+343:19 tight glyph $-(
2174+343:22 tight tvar B
2175+343:24 tvar C
2176+343:25 tight glyph )
2177+343:27 glyph $-(
2178+343:30 tight tvar A
2179+343:32 tvar B
2180+343:33 tight glyph )
2181+343:34 tight glyph ]
2182+344:3 INDENT
2183+344:3 glyph ?-
2184+344:6 name gates
2185+345:5 INDENT
2186+345:5 glyph [
2187+345:6 tight name f
2188+345:8 name g
2189+345:9 tight glyph ]
2190+345:11 glyph |=
2191+345:14 name x
2192+345:15 tight glyph =
2193+345:16 tight tvar A
2194+345:18 glyph (
2195+345:19 tight name f
2196+345:21 glyph (
2197+345:22 tight name g
2198+345:24 name x
2199+345:25 tight glyph )
2200+345:26 tight glyph )
2201+347:1 DEDENT
2202+347:1 DEDENT
2203+347:1 NEWLINE
2204+347:1 glyph ++
2205+347:4 name cury
2206+347:9 glyph |=
2207+347:12 name args
2208+347:16 tight glyph =
2209+347:17 tight glyph [
2210+347:18 tight glyph $-(
2211+347:21 tight glyph [
2212+347:22 tight tvar A
2213+347:24 tvar B
2214+347:25 tight glyph ]
2215+347:27 tvar C
2216+347:28 tight glyph )
2217+347:30 tvar A
2218+347:31 tight glyph ]
2219+348:3 INDENT
2220+348:3 glyph ?-
2221+348:6 name args
2222+349:5 INDENT
2223+349:5 glyph [
2224+349:6 tight name f
2225+349:8 name a
2226+349:9 tight glyph ]
2227+349:11 glyph |=
2228+349:14 name b
2229+349:15 tight glyph =
2230+349:16 tight tvar B
2231+349:18 glyph (
2232+349:19 tight name f
2233+349:21 name a
2234+349:23 name b
2235+349:24 tight glyph )
2236+351:1 DEDENT
2237+351:1 DEDENT
2238+351:1 NEWLINE
2239+351:1 glyph ++
2240+351:4 name curr
2241+351:9 glyph |=
2242+351:12 name args
2243+351:16 tight glyph =
2244+351:17 tight glyph [
2245+351:18 tight glyph $-(
2246+351:21 tight glyph [
2247+351:22 tight tvar A
2248+351:24 tvar B
2249+351:25 tight glyph ]
2250+351:27 tvar C
2251+351:28 tight glyph )
2252+351:30 tvar B
2253+351:31 tight glyph ]
2254+352:3 INDENT
2255+352:3 glyph ?-
2256+352:6 name args
2257+353:5 INDENT
2258+353:5 glyph [
2259+353:6 tight name f
2260+353:8 name b
2261+353:9 tight glyph ]
2262+353:11 glyph |=
2263+353:14 name a
2264+353:15 tight glyph =
2265+353:16 tight tvar A
2266+353:18 glyph (
2267+353:19 tight name f
2268+353:21 name a
2269+353:23 name b
2270+353:24 tight glyph )
2271+355:1 DEDENT
2272+355:1 DEDENT
2273+355:1 NEWLINE
2274+355:1 glyph +$
2275+355:4 name cmd
2276+355:8 glyph |$
2277+355:11 glyph [
2278+355:12 tight tvar M
2279+355:13 tight glyph ]
2280+356:3 INDENT
2281+356:3 glyph [
2282+356:4 tight lit %poke
2283+356:10 name p
2284+356:11 tight glyph =
2285+356:12 tight name raw-poke
2286+356:21 name reply
2287+356:26 tight glyph =
2288+356:27 tight glyph $-(
2289+356:30 tight glyph (
2290+356:31 tight name unit
2291+356:36 aura @t
2292+356:38 tight glyph )
2293+356:40 tvar M
2294+356:41 tight glyph )
2295+356:42 tight glyph ]
2296+357:3 NEWLINE
2297+357:3 glyph [
2298+357:4 tight lit %go
2299+357:8 name url
2300+357:11 tight glyph =
2301+357:12 tight aura @t
2302+357:14 tight glyph ]
2303+358:3 NEWLINE
2304+358:3 glyph [
2305+358:4 tight lit %wait
2306+358:10 name gap
2307+358:13 tight glyph =
2308+358:14 tight aura @dr
2309+358:18 name msg
2310+358:21 tight glyph =
2311+358:22 tight tvar M
2312+358:23 tight glyph ]
2313+359:3 NEWLINE
2314+359:3 glyph [
2315+359:4 tight lit %now
2316+359:9 name reply
2317+359:14 tight glyph =
2318+359:15 tight glyph $-(
2319+359:18 tight aura @da
2320+359:22 tvar M
2321+359:23 tight glyph )
2322+359:24 tight glyph ]
2323+360:3 NEWLINE
2324+360:3 glyph [
2325+360:4 tight lit %who
2326+360:9 name reply
2327+360:14 tight glyph =
2328+360:15 tight glyph $-(
2329+360:18 tight aura @p
2330+360:21 tvar M
2331+360:22 tight glyph )
2332+360:23 tight glyph ]
2333+362:1 DEDENT
2334+362:1 NEWLINE
2335+362:1 glyph ++
2336+362:4 name gth
2337+362:8 glyph |=
2338+362:11 name args
2339+362:15 tight glyph =
2340+362:16 tight glyph [
2341+362:17 tight tvar A
2342+362:19 tvar A
2343+362:20 tight glyph ]
2344+362:22 glyph (
2345+362:23 tight wing gth-atom.internal
2346+362:41 name args
2347+362:45 tight glyph )
2348+363:1 NEWLINE
2349+363:1 glyph ++
2350+363:4 name add
2351+363:8 glyph |=
2352+363:11 name args
2353+363:15 tight glyph =
2354+363:16 tight glyph [
2355+363:17 tight tvar A
2356+363:19 tvar A
2357+363:20 tight glyph ]
2358+363:22 glyph (
2359+363:23 tight wing add-atom.internal
2360+363:41 name args
2361+363:45 tight glyph )
2362+364:1 NEWLINE
2363+364:1 glyph ++
2364+364:4 name dec
2365+364:8 glyph |=
2366+364:11 name atom
2367+364:15 tight glyph =
2368+364:16 tight tvar A
2369+364:18 glyph (
2370+364:19 tight wing dec-atom.internal
2371+364:37 name atom
2372+364:41 tight glyph )
2373+366:1 NEWLINE
2374+366:1 glyph +$
2375+366:4 name ask
2376+366:8 glyph |$
2377+366:11 glyph [
2378+366:12 tight tvar M
2379+366:13 tight glyph ]
2380+366:15 glyph (
2381+366:16 tight wing ask.internal
2382+366:29 tvar M
2383+366:30 tight glyph )
2384+367:1 NEWLINE
2385+367:1 glyph ++
2386+367:4 name pure
2387+367:9 glyph |=
2388+367:12 name x
2389+367:13 tight glyph =
2390+367:14 tight tvar M
2391+367:16 glyph ^-
2392+367:19 glyph (
2393+367:20 tight name ask
2394+367:24 tvar M
2395+367:25 tight glyph )
2396+367:27 glyph [
2397+367:28 tight lit %pure
2398+367:34 name x
2399+367:35 tight glyph ]
2400+367:36 NEWLINE
tests/golden/prelude-unit-list-transforms/tree.txt+994−923
@@ -34,939 +34,1010 @@
3434 (wing 18:6 b)
3535 (arm 19:5 (lit 19:5 %.y) (lit 19:9 %.n))
3636 (arm 20:5 (lit 20:5 %.n) (lit 20:9 %.y))))))
37− (mold 22:1 list
38− (generic 22:9 A
39− (union 23:3
40− (const 23:3 ~)
41− (cell 24:3
42− (face 24:4 i (tvar 24:6 A))
43− (face 24:8 t
44− (apply 24:10 list (tvar 24:16 A)))))))
45− (mold 26:1 unit
46− (generic 26:9 A
47− (union 27:3
48− (const 27:3 ~)
49− (cell 28:3
50− (const 28:4 ~)
51− (face 28:6 u (tvar 28:8 A))))))
52− (value 30:1 fall
53− (gate 30:9
54− (face 30:12 args
55− (cell 30:17
56− (apply 30:18 unit (tvar 30:24 A))
57− (tvar 30:27 A)))
58− (body 31:3
59− (branch 31:3
60− (wing 31:6 args)
61− (arm 32:5
62− (cell 32:5 (bind 32:6 maybe) (bind 32:12 fallback))
63− (body 33:7
64− (branch 33:7
65− (wing 33:10 maybe)
66− (arm 34:9 (lit 34:9 ~) (wing 34:11 fallback))
67− (arm 35:9
68− (cell 35:9 (lit 35:10 ~) (bind 35:12 value))
69− (wing 35:19 value)))))))))
70− (value 37:1 need
71− (gate 37:9
72− (face 37:12 maybe
73− (apply 37:18 unit (tvar 37:24 A)))
74− (body 38:3
75− (branch 38:3
76− (wing 38:6 maybe)
77− (arm 39:5 (lit 39:5 ~) (crash 39:7))
78− (arm 40:5
79− (cell 40:5 (lit 40:6 ~) (bind 40:8 value))
80− (wing 40:15 value))))))
81− (value 42:1 weld
82− (gate 42:9
83− (face 42:12 args
84− (cell 42:17
85− (apply 42:18 list (tvar 42:24 A))
86− (apply 42:27 list (tvar 42:33 A))))
87− (body 43:3
88− (branch 43:3
89− (wing 43:6 args)
90− (arm 44:5
91− (cell 44:5 (bind 44:6 xs) (bind 44:9 ys))
92− (body 45:7
93− (cast 45:7
94− (apply 45:10 list (tvar 45:16 A))
95− (body 46:9
96− (branch 46:9
97− (wing 46:12 xs)
98− (arm 47:11 (lit 47:11 ~) (wing 47:13 ys))
99− (arm 48:11
100− (cell 48:11 (bind 48:12 item) (bind 48:17 rest))
101− (tuple 48:23
102− (wing 48:24 item)
103− (group 48:29
104− (call 48:30 (wing 48:30 weld) (wing 48:35 rest) (wing 48:40 ys))))))))))))))
105− (value 50:1 turn
106− (gate 50:9
107− (face 50:12 args
108− (cell 50:17
109− (apply 50:18 list (tvar 50:24 A))
110− (fn 50:27 (tvar 50:30 A) (tvar 50:32 B))))
111− (body 51:3
112− (branch 51:3
113− (wing 51:6 args)
114− (arm 52:5
115− (cell 52:5 (bind 52:6 xs) (bind 52:9 f))
116− (body 53:7
117− (cast 53:7
118− (apply 53:10 list (tvar 53:16 B))
119− (body 54:9
120− (branch 54:9
121− (wing 54:12 xs)
122− (arm 55:11 (lit 55:11 ~) (lit 55:13 ~))
123− (arm 56:11
124− (cell 56:11 (bind 56:12 item) (bind 56:17 rest))
125− (tuple 56:23
126− (group 56:24
127− (call 56:25 (wing 56:25 f) (wing 56:27 item)))
128− (group 56:33
129− (call 56:34 (wing 56:34 turn) (wing 56:39 rest) (wing 56:44 f))))))))))))))
130− (mold 58:1 dime
131− (cell 58:9
132− (face 58:10 p (aura 58:12 @ta))
133− (face 58:16 q (aura 58:18 @))))
134− (mold 60:1 hair
37+ (value 22:1 eq
38+ (gate 22:7
39+ (face 22:10 args
40+ (cell 22:15 (tvar 22:16 A) (tvar 22:18 A)))
41+ (group 22:21
42+ (call 22:22 (wing 22:22 eq-data.internal) (wing 22:39 args)))))
43+ (mold 24:1 list
44+ (generic 24:9 A
45+ (union 25:3
46+ (const 25:3 ~)
47+ (cell 26:3
48+ (face 26:4 i (tvar 26:6 A))
49+ (face 26:8 t
50+ (apply 26:10 list (tvar 26:16 A)))))))
51+ (mold 28:1 unit
52+ (generic 28:9 A
53+ (union 29:3
54+ (const 29:3 ~)
55+ (cell 30:3
56+ (const 30:4 ~)
57+ (face 30:6 u (tvar 30:8 A))))))
58+ (value 32:1 fall
59+ (gate 32:9
60+ (face 32:12 args
61+ (cell 32:17
62+ (apply 32:18 unit (tvar 32:24 A))
63+ (tvar 32:27 A)))
64+ (body 33:3
65+ (branch 33:3
66+ (wing 33:6 args)
67+ (arm 34:5
68+ (cell 34:5 (bind 34:6 maybe) (bind 34:12 fallback))
69+ (body 35:7
70+ (branch 35:7
71+ (wing 35:10 maybe)
72+ (arm 36:9 (lit 36:9 ~) (wing 36:11 fallback))
73+ (arm 37:9
74+ (cell 37:9 (lit 37:10 ~) (bind 37:12 value))
75+ (wing 37:19 value)))))))))
76+ (value 39:1 need
77+ (gate 39:9
78+ (face 39:12 maybe
79+ (apply 39:18 unit (tvar 39:24 A)))
80+ (body 40:3
81+ (branch 40:3
82+ (wing 40:6 maybe)
83+ (arm 41:5 (lit 41:5 ~) (crash 41:7))
84+ (arm 42:5
85+ (cell 42:5 (lit 42:6 ~) (bind 42:8 value))
86+ (wing 42:15 value))))))
87+ (value 44:1 weld
88+ (gate 44:9
89+ (face 44:12 args
90+ (cell 44:17
91+ (apply 44:18 list (tvar 44:24 A))
92+ (apply 44:27 list (tvar 44:33 A))))
93+ (body 45:3
94+ (branch 45:3
95+ (wing 45:6 args)
96+ (arm 46:5
97+ (cell 46:5 (bind 46:6 xs) (bind 46:9 ys))
98+ (body 47:7
99+ (cast 47:7
100+ (apply 47:10 list (tvar 47:16 A))
101+ (body 48:9
102+ (branch 48:9
103+ (wing 48:12 xs)
104+ (arm 49:11 (lit 49:11 ~) (wing 49:13 ys))
105+ (arm 50:11
106+ (cell 50:11 (bind 50:12 item) (bind 50:17 rest))
107+ (tuple 50:23
108+ (wing 50:24 item)
109+ (group 50:29
110+ (call 50:30 (wing 50:30 weld) (wing 50:35 rest) (wing 50:40 ys))))))))))))))
111+ (value 52:1 turn
112+ (gate 52:9
113+ (face 52:12 args
114+ (cell 52:17
115+ (apply 52:18 list (tvar 52:24 A))
116+ (fn 52:27 (tvar 52:30 A) (tvar 52:32 B))))
117+ (body 53:3
118+ (branch 53:3
119+ (wing 53:6 args)
120+ (arm 54:5
121+ (cell 54:5 (bind 54:6 xs) (bind 54:9 f))
122+ (body 55:7
123+ (cast 55:7
124+ (apply 55:10 list (tvar 55:16 B))
125+ (body 56:9
126+ (branch 56:9
127+ (wing 56:12 xs)
128+ (arm 57:11 (lit 57:11 ~) (lit 57:13 ~))
129+ (arm 58:11
130+ (cell 58:11 (bind 58:12 item) (bind 58:17 rest))
131+ (tuple 58:23
132+ (group 58:24
133+ (call 58:25 (wing 58:25 f) (wing 58:27 item)))
134+ (group 58:33
135+ (call 58:34 (wing 58:34 turn) (wing 58:39 rest) (wing 58:44 f))))))))))))))
136+ (mold 60:1 dime
135137 (cell 60:9
136− (face 60:10 p (aura 60:12 @ud))
137− (face 60:16 q (aura 60:18 @ud))))
138− (mold 62:1 pint
138+ (face 60:10 p (aura 60:12 @ta))
139+ (face 60:16 q (aura 60:18 @))))
140+ (mold 62:1 hair
139141 (cell 62:9
140− (face 62:10 p
141− (cell 62:12
142− (face 62:13 p (aura 62:15 @))
143− (face 62:17 q (aura 62:19 @))))
144− (face 62:22 q
145− (cell 62:24
146− (face 62:25 p (aura 62:27 @))
147− (face 62:29 q (aura 62:31 @))))))
148− (mold 64:1 coin
149− (union 65:3
150− (cell 65:3
151− (const 65:4 %$)
152− (face 65:7 p (ref 65:9 dime)))
153− (cell 66:3
154− (const 66:4 %blob)
155− (face 66:10 p (noun 66:12)))
142+ (face 62:10 p (aura 62:12 @ud))
143+ (face 62:16 q (aura 62:18 @ud))))
144+ (mold 64:1 pint
145+ (cell 64:9
146+ (face 64:10 p
147+ (cell 64:12
148+ (face 64:13 p (aura 64:15 @))
149+ (face 64:17 q (aura 64:19 @))))
150+ (face 64:22 q
151+ (cell 64:24
152+ (face 64:25 p (aura 64:27 @))
153+ (face 64:29 q (aura 64:31 @))))))
154+ (mold 66:1 coin
155+ (union 67:3
156156 (cell 67:3
157− (const 67:4 %many)
158− (face 67:10 p
159− (apply 67:12 list (ref 67:18 coin))))))
160− (mold 69:1 pair
161− (generic 69:9 A B
162− (cell 69:18
163− (face 69:19 p (tvar 69:21 A))
164− (face 69:23 q (tvar 69:25 B)))))
165− (mold 71:1 trel
166− (generic 71:9 A B C
167− (cell 71:20
168− (face 71:21 p (tvar 71:23 A))
169− (face 71:25 q (tvar 71:27 B))
170− (face 71:29 r (tvar 71:31 C)))))
171− (mold 73:1 qual
172− (generic 73:9 A B C D
173− (cell 73:22
174− (face 73:23 p (tvar 73:25 A))
175− (face 73:27 q (tvar 73:29 B))
176− (face 73:31 r (tvar 73:33 C))
177− (face 73:35 s (tvar 73:37 D)))))
178− (mold 75:1 cord (aura 75:9 @t))
179− (mold 77:1 knot (aura 77:9 @ta))
180− (mold 79:1 tape
181− (apply 79:9 list (aura 79:15 @tD)))
182− (mold 81:1 path
183− (apply 81:9 list (ref 81:15 knot)))
184− (mold 83:1 tank
185− (union 84:3
186− (ref 84:3 cord)
187− (cell 85:3
188− (const 85:4 %leaf)
189− (face 85:10 p (ref 85:12 tape)))
190− (cell 86:3
191− (const 86:4 %palm)
192− (face 86:10 p
193− (apply 86:12 qual (ref 86:18 tape) (ref 86:23 tape) (ref 86:28 tape) (ref 86:33 tape)))
194− (face 86:39 q
195− (apply 86:41 list (ref 86:47 tank))))
157+ (const 67:4 %$)
158+ (face 67:7 p (ref 67:9 dime)))
159+ (cell 68:3
160+ (const 68:4 %blob)
161+ (face 68:10 p (noun 68:12)))
162+ (cell 69:3
163+ (const 69:4 %many)
164+ (face 69:10 p
165+ (apply 69:12 list (ref 69:18 coin))))))
166+ (mold 71:1 pair
167+ (generic 71:9 A B
168+ (cell 71:18
169+ (face 71:19 p (tvar 71:21 A))
170+ (face 71:23 q (tvar 71:25 B)))))
171+ (mold 73:1 trel
172+ (generic 73:9 A B C
173+ (cell 73:20
174+ (face 73:21 p (tvar 73:23 A))
175+ (face 73:25 q (tvar 73:27 B))
176+ (face 73:29 r (tvar 73:31 C)))))
177+ (mold 75:1 qual
178+ (generic 75:9 A B C D
179+ (cell 75:22
180+ (face 75:23 p (tvar 75:25 A))
181+ (face 75:27 q (tvar 75:29 B))
182+ (face 75:31 r (tvar 75:33 C))
183+ (face 75:35 s (tvar 75:37 D)))))
184+ (mold 77:1 cord (aura 77:9 @t))
185+ (mold 79:1 knot (aura 79:9 @ta))
186+ (mold 81:1 tape
187+ (apply 81:9 list (aura 81:15 @tD)))
188+ (mold 83:1 path
189+ (apply 83:9 list (ref 83:15 knot)))
190+ (mold 85:1 tank
191+ (union 86:3
192+ (ref 86:3 cord)
196193 (cell 87:3
197− (const 87:4 %rose)
198− (face 87:10 p
199− (apply 87:12 trel (ref 87:18 tape) (ref 87:23 tape) (ref 87:28 tape)))
200− (face 87:34 q
201− (apply 87:36 list (ref 87:42 tank))))))
202− (mold 89:1 nail
203− (cell 89:9
204− (face 89:10 p (ref 89:12 hair))
205− (face 89:17 q (ref 89:19 tape))))
206− (mold 91:1 edge
194+ (const 87:4 %leaf)
195+ (face 87:10 p (ref 87:12 tape)))
196+ (cell 88:3
197+ (const 88:4 %palm)
198+ (face 88:10 p
199+ (apply 88:12 qual (ref 88:18 tape) (ref 88:23 tape) (ref 88:28 tape) (ref 88:33 tape)))
200+ (face 88:39 q
201+ (apply 88:41 list (ref 88:47 tank))))
202+ (cell 89:3
203+ (const 89:4 %rose)
204+ (face 89:10 p
205+ (apply 89:12 trel (ref 89:18 tape) (ref 89:23 tape) (ref 89:28 tape)))
206+ (face 89:34 q
207+ (apply 89:36 list (ref 89:42 tank))))))
208+ (mold 91:1 nail
207209 (cell 91:9
208210 (face 91:10 p (ref 91:12 hair))
209− (face 91:17 q
210− (apply 91:19 unit
211− (cell 91:25
212− (face 91:26 p (noun 91:28))
213− (face 91:30 q (ref 91:32 nail)))))))
214− (mold 93:1 rule
215− (fn 93:9 (ref 93:12 nail) (ref 93:17 edge)))
216− (mold 95:1 spot
217− (cell 95:9
218− (face 95:10 p (ref 95:12 path))
219− (face 95:17 q (ref 95:19 pint))))
220− (mold 97:1 toon
221− (union 98:3
222− (cell 98:3
223− (const 98:4 %0)
224− (face 98:7 p (noun 98:9)))
225− (cell 99:3
226− (const 99:4 %1)
227− (face 99:7 p (noun 99:9)))
211+ (face 91:17 q (ref 91:19 tape))))
212+ (mold 93:1 edge
213+ (cell 93:9
214+ (face 93:10 p (ref 93:12 hair))
215+ (face 93:17 q
216+ (apply 93:19 unit
217+ (cell 93:25
218+ (face 93:26 p (noun 93:28))
219+ (face 93:30 q (ref 93:32 nail)))))))
220+ (mold 95:1 rule
221+ (fn 95:9 (ref 95:12 nail) (ref 95:17 edge)))
222+ (mold 97:1 spot
223+ (cell 97:9
224+ (face 97:10 p (ref 97:12 path))
225+ (face 97:17 q (ref 97:19 pint))))
226+ (mold 99:1 toon
227+ (union 100:3
228228 (cell 100:3
229− (const 100:4 %2)
230− (face 100:7 p
231− (apply 100:9 list (ref 100:15 tank))))))
232− (mold 102:1 like
233− (generic 102:9 A
234− (cell 102:16
235− (face 102:17 p (ref 102:19 hair))
236− (face 102:24 q
237− (apply 102:26 unit
238− (cell 102:32
239− (face 102:33 p (tvar 102:35 A))
240− (face 102:37 q (ref 102:39 nail))))))))
241− (value 104:1 like
242− (gate 104:9
243− (cell 104:12
244− (face 104:13 f
245− (fn 104:15 (tvar 104:18 A) (tvar 104:20 B)))
246− (face 104:23 result
247− (apply 104:30 like (tvar 104:36 A))))
248− (body 105:3
249− (value 105:3 mapped
250− (body 106:5
251− (cast 106:5
252− (apply 106:8 unit
253− (cell 106:14
254− (face 106:15 p (tvar 106:17 B))
255− (face 106:19 q (ref 106:21 nail))))
256− (body 107:7
257− (branch 107:7
258− (wing 107:10 q.result)
259− (arm 108:9 (lit 108:9 ~) (lit 108:11 ~))
260− (arm 109:9
261− (cell 109:9 (lit 109:10 ~) (bind 109:12 value))
262− (unit 109:19
263− (tuple 109:20
264− (face 109:21 p
265− (group 109:23
266− (call 109:24 (wing 109:24 f) (wing 109:26 p.value))))
267− (face 109:35 q (wing 109:37 q.value))))))))))
268− (cast 110:3
269− (apply 110:6 like (tvar 110:12 B))
270− (tuple 110:15
271− (face 110:16 p (wing 110:18 p.result))
272− (face 110:27 q (wing 110:29 mapped)))))))
273− (value 112:1 wonk
274− (gate 112:9
275− (face 112:12 veq
276− (apply 112:16 like (tvar 112:22 A)))
277− (body 113:3
278− (branch 113:3
279− (wing 113:6 q.veq)
280− (arm 114:5 (lit 114:5 ~) (crash 114:7))
281− (arm 115:5
282− (cell 115:5 (lit 115:6 ~) (bind 115:8 product))
283− (wing 115:17 p.product))))))
284− (mold 117:1 lone
285− (generic 117:9 A
286− (cell 117:16
287− (face 117:17 p (tvar 117:19 A)))))
288− (mold 119:1 lest
229+ (const 100:4 %0)
230+ (face 100:7 p (noun 100:9)))
231+ (cell 101:3
232+ (const 101:4 %1)
233+ (face 101:7 p (noun 101:9)))
234+ (cell 102:3
235+ (const 102:4 %2)
236+ (face 102:7 p
237+ (apply 102:9 list (ref 102:15 tank))))))
238+ (mold 104:1 like
239+ (generic 104:9 A
240+ (cell 104:16
241+ (face 104:17 p (ref 104:19 hair))
242+ (face 104:24 q
243+ (apply 104:26 unit
244+ (cell 104:32
245+ (face 104:33 p (tvar 104:35 A))
246+ (face 104:37 q (ref 104:39 nail))))))))
247+ (value 106:1 like
248+ (gate 106:9
249+ (cell 106:12
250+ (face 106:13 f
251+ (fn 106:15 (tvar 106:18 A) (tvar 106:20 B)))
252+ (face 106:23 result
253+ (apply 106:30 like (tvar 106:36 A))))
254+ (body 107:3
255+ (value 107:3 mapped
256+ (body 108:5
257+ (cast 108:5
258+ (apply 108:8 unit
259+ (cell 108:14
260+ (face 108:15 p (tvar 108:17 B))
261+ (face 108:19 q (ref 108:21 nail))))
262+ (body 109:7
263+ (branch 109:7
264+ (wing 109:10 q.result)
265+ (arm 110:9 (lit 110:9 ~) (lit 110:11 ~))
266+ (arm 111:9
267+ (cell 111:9 (lit 111:10 ~) (bind 111:12 value))
268+ (unit 111:19
269+ (tuple 111:20
270+ (face 111:21 p
271+ (group 111:23
272+ (call 111:24 (wing 111:24 f) (wing 111:26 p.value))))
273+ (face 111:35 q (wing 111:37 q.value))))))))))
274+ (cast 112:3
275+ (apply 112:6 like (tvar 112:12 B))
276+ (tuple 112:15
277+ (face 112:16 p (wing 112:18 p.result))
278+ (face 112:27 q (wing 112:29 mapped)))))))
279+ (value 114:1 wonk
280+ (gate 114:9
281+ (face 114:12 veq
282+ (apply 114:16 like (tvar 114:22 A)))
283+ (body 115:3
284+ (branch 115:3
285+ (wing 115:6 q.veq)
286+ (arm 116:5 (lit 116:5 ~) (crash 116:7))
287+ (arm 117:5
288+ (cell 117:5 (lit 117:6 ~) (bind 117:8 product))
289+ (wing 117:17 p.product))))))
290+ (mold 119:1 lone
289291 (generic 119:9 A
290292 (cell 119:16
291− (face 119:17 i (tvar 119:19 A))
292− (face 119:21 t
293− (apply 119:23 list (tvar 119:29 A))))))
294− (mold 121:1 pole
293+ (face 119:17 p (tvar 119:19 A)))))
294+ (mold 121:1 lest
295295 (generic 121:9 A
296− (union 122:3
297− (const 122:3 ~)
298− (cell 123:3
299− (tvar 123:4 A)
300− (apply 123:6 pole (tvar 123:12 A))))))
301− (mold 125:1 quip
302− (generic 125:9 A B
303− (cell 125:18
304− (apply 125:19 list (tvar 125:25 A))
305− (tvar 125:28 B))))
306− (mold 127:1 tree
307− (generic 127:9 A
308− (union 128:3
309− (const 128:3 ~)
310− (cell 129:3
311− (face 129:4 n (tvar 129:6 A))
312− (face 129:8 l
313− (apply 129:10 tree (tvar 129:16 A)))
314− (face 129:19 r
315− (apply 129:21 tree (tvar 129:27 A)))))))
316− (mold 131:1 each
317− (generic 131:9 A B
318− (union 132:3
319− (cell 132:3
320− (const 132:4 %|)
321− (face 132:7 p (tvar 132:9 B)))
322− (cell 133:3
323− (const 133:4 %&)
324− (face 133:7 p (tvar 133:9 A))))))
325− (mold 135:1 bloq (aura 135:9 @))
326− (value 137:1 some
327− (gate 137:9
328− (face 137:12 item (tvar 137:17 A))
329− (unit 137:19 (wing 137:20 item))))
330− (value 139:1 lure
296+ (cell 121:16
297+ (face 121:17 i (tvar 121:19 A))
298+ (face 121:21 t
299+ (apply 121:23 list (tvar 121:29 A))))))
300+ (mold 123:1 pole
301+ (generic 123:9 A
302+ (union 124:3
303+ (const 124:3 ~)
304+ (cell 125:3
305+ (tvar 125:4 A)
306+ (apply 125:6 pole (tvar 125:12 A))))))
307+ (mold 127:1 quip
308+ (generic 127:9 A B
309+ (cell 127:18
310+ (apply 127:19 list (tvar 127:25 A))
311+ (tvar 127:28 B))))
312+ (mold 129:1 tree
313+ (generic 129:9 A
314+ (union 130:3
315+ (const 130:3 ~)
316+ (cell 131:3
317+ (face 131:4 n (tvar 131:6 A))
318+ (face 131:8 l
319+ (apply 131:10 tree (tvar 131:16 A)))
320+ (face 131:19 r
321+ (apply 131:21 tree (tvar 131:27 A)))))))
322+ (mold 133:1 each
323+ (generic 133:9 A B
324+ (union 134:3
325+ (cell 134:3
326+ (const 134:4 %|)
327+ (face 134:7 p (tvar 134:9 B)))
328+ (cell 135:3
329+ (const 135:4 %&)
330+ (face 135:7 p (tvar 135:9 A))))))
331+ (mold 137:1 bloq (aura 137:9 @))
332+ (value 139:1 some
331333 (gate 139:9
332334 (face 139:12 item (tvar 139:17 A))
333− (body 140:3
334− (cast 140:3
335− (apply 140:6 list (tvar 140:12 A))
336− (tuple 140:15 (wing 140:16 item) (lit 140:21 ~))))))
337− (value 142:1 snoc
338− (gate 142:9
339− (face 142:12 args
340− (cell 142:17
341− (apply 142:18 list (tvar 142:24 A))
342− (tvar 142:27 A)))
343− (body 143:3
344− (branch 143:3
345− (wing 143:6 args)
346− (arm 144:5
347− (cell 144:5 (bind 144:6 xs) (bind 144:9 item))
348− (group 144:15
349− (call 144:16
350− (wing 144:16 weld)
351− (wing 144:21 xs)
352− (tuple 144:24 (wing 144:25 item) (lit 144:30 ~)))))))))
353− (value 146:1 flop
354− (gate 146:9
355− (face 146:12 xs
356− (apply 146:15 list (tvar 146:21 A)))
357− (body 147:3
358− (value 147:3 reverse-into
359− (gate 147:19
360− (face 147:22 args
361− (cell 147:27
362− (apply 147:28 list (tvar 147:34 A))
363− (apply 147:37 list (tvar 147:43 A))))
364− (body 148:5
365− (branch 148:5
366− (wing 148:8 args)
367− (arm 149:7
368− (cell 149:7 (bind 149:8 rest) (bind 149:13 acc))
369− (body 150:9
370− (branch 150:9
371− (wing 150:12 rest)
372− (arm 151:11 (lit 151:11 ~) (wing 151:13 acc))
373− (arm 152:11
374− (cell 152:11 (bind 152:12 item) (bind 152:17 more))
375− (group 152:23
376− (call 152:24
377− (wing 152:24 reverse-into)
378− (wing 152:37 more)
379− (tuple 152:42 (wing 152:43 item) (wing 152:48 acc))))))))))))
380− (group 153:3
381− (call 153:4 (wing 153:4 reverse-into) (wing 153:17 xs) (lit 153:20 ~))))))
382− (value 155:1 drop
383− (gate 155:9
384− (face 155:12 maybe
385− (apply 155:18 unit (tvar 155:24 A)))
386− (body 156:3
387− (cast 156:3
388− (apply 156:6 list (tvar 156:12 A))
389− (body 157:5
390− (branch 157:5
391− (wing 157:8 maybe)
392− (arm 158:7 (lit 158:7 ~) (lit 158:9 ~))
393− (arm 159:7
394− (cell 159:7 (lit 159:8 ~) (bind 159:10 value))
395− (tuple 159:17 (wing 159:18 value) (lit 159:24 ~)))))))))
396− (value 161:1 bond
397− (gate 161:9
398− (face 161:12 fallback
399− (fn 161:21 (const 161:24 ~) (tvar 161:26 A)))
400− (body 162:3
401− (gate 162:3
402− (face 162:6 maybe
403− (apply 162:12 unit (tvar 162:18 A)))
404− (body 163:5
405− (branch 163:5
406− (wing 163:8 maybe)
407− (arm 164:7
408− (lit 164:7 ~)
409− (group 164:9
410− (call 164:10 (wing 164:10 fallback) (lit 164:19 ~))))
411− (arm 165:7
412− (cell 165:7 (lit 165:8 ~) (bind 165:10 value))
413− (wing 165:17 value))))))))
414− (value 167:1 bind
415− (gate 167:9
416− (face 167:12 args
417− (cell 167:17
418− (apply 167:18 unit (tvar 167:24 A))
419− (fn 167:27 (tvar 167:30 A) (tvar 167:32 B))))
420− (body 168:3
421− (branch 168:3
422− (wing 168:6 args)
423− (arm 169:5
424− (cell 169:5 (bind 169:6 maybe) (bind 169:12 f))
425− (cast 169:15
426− (apply 169:18 unit (tvar 169:24 B))
427− (body 170:7
428− (branch 170:7
429− (wing 170:10 maybe)
430− (arm 171:9 (lit 171:9 ~) (lit 171:11 ~))
431− (arm 172:9
432− (cell 172:9 (lit 172:10 ~) (bind 172:12 value))
433− (unit 172:19
434− (group 172:20
435− (call 172:21 (wing 172:21 f) (wing 172:23 value)))))))))))))
436− (value 174:1 biff
437− (gate 174:9
438− (face 174:12 args
439− (cell 174:17
440− (apply 174:18 unit (tvar 174:24 A))
441− (fn 174:27
442− (tvar 174:30 A)
443− (apply 174:32 unit (tvar 174:38 B)))))
444− (body 175:3
445− (branch 175:3
446− (wing 175:6 args)
447− (arm 176:5
448− (cell 176:5 (bind 176:6 maybe) (bind 176:12 f))
449− (cast 176:15
450− (apply 176:18 unit (tvar 176:24 B))
451− (body 177:7
452− (branch 177:7
453− (wing 177:10 maybe)
454− (arm 178:9 (lit 178:9 ~) (lit 178:11 ~))
455− (arm 179:9
456− (cell 179:9 (lit 179:10 ~) (bind 179:12 value))
457− (group 179:19
458− (call 179:20 (wing 179:20 f) (wing 179:22 value))))))))))))
459− (value 181:1 both
460− (gate 181:9
461− (face 181:12 args
462− (cell 181:17
463− (apply 181:18 unit (tvar 181:24 A))
464− (apply 181:27 unit (tvar 181:33 B))))
465− (body 182:3
466− (branch 182:3
467− (wing 182:6 args)
468− (arm 183:5
469− (cell 183:5 (bind 183:6 first) (bind 183:12 second))
470− (cast 183:20
471− (apply 183:23 unit
472− (cell 183:29 (tvar 183:30 A) (tvar 183:32 B)))
473− (body 184:7
474− (branch 184:7
475− (wing 184:10 first)
476− (arm 185:9 (lit 185:9 ~) (lit 185:11 ~))
477− (arm 186:9
478− (cell 186:9 (lit 186:10 ~) (bind 186:12 a))
479− (body 187:11
480− (branch 187:11
481− (wing 187:14 second)
482− (arm 188:13 (lit 188:13 ~) (lit 188:15 ~))
483− (arm 189:13
484− (cell 189:13 (lit 189:14 ~) (bind 189:16 b))
485− (unit 189:19
486− (tuple 189:20 (wing 189:21 a) (wing 189:23 b)))))))))))))))
487− (value 191:1 clap
488− (gate 191:9
489− (face 191:12 args
490− (cell 191:17
491− (apply 191:18 unit (tvar 191:24 A))
492− (apply 191:27 unit (tvar 191:33 A))
493− (fn 191:36
494− (cell 191:39 (tvar 191:40 A) (tvar 191:42 A))
495− (tvar 191:45 A))))
496− (body 192:3
497− (branch 192:3
498− (wing 192:6 args)
499− (arm 193:5
500− (cell 193:5 (bind 193:6 first) (bind 193:12 second) (bind 193:19 combine))
501− (cast 193:28
502− (apply 193:31 unit (tvar 193:37 A))
503− (body 194:7
504− (branch 194:7
505− (wing 194:10 first)
506− (arm 195:9 (lit 195:9 ~) (wing 195:11 second))
507− (arm 196:9
508− (cell 196:9 (lit 196:10 ~) (bind 196:12 a))
509− (body 197:11
510− (branch 197:11
511− (wing 197:14 second)
512− (arm 198:13 (lit 198:13 ~) (wing 198:15 first))
513− (arm 199:13
514− (cell 199:13 (lit 199:14 ~) (bind 199:16 b))
515− (unit 199:19
516− (group 199:20
517− (call 199:21 (wing 199:21 combine) (wing 199:29 a) (wing 199:31 b))))))))))))))))
518− (value 201:1 clef
519− (gate 201:9
520− (face 201:12 args
521− (cell 201:17
522− (apply 201:18 unit (tvar 201:24 A))
523− (apply 201:27 unit (tvar 201:33 B))
524− (fn 201:36
525− (cell 201:39 (tvar 201:40 A) (tvar 201:42 B))
526− (apply 201:45 unit (tvar 201:51 C)))))
527− (body 202:3
528− (branch 202:3
529− (wing 202:6 args)
530− (arm 203:5
531− (cell 203:5 (bind 203:6 first) (bind 203:12 second) (bind 203:19 combine))
532− (cast 203:28
533− (apply 203:31 unit (tvar 203:37 C))
534− (body 204:7
535− (branch 204:7
536− (wing 204:10 first)
537− (arm 205:9 (lit 205:9 ~) (lit 205:11 ~))
538− (arm 206:9
539− (cell 206:9 (lit 206:10 ~) (bind 206:12 a))
540− (body 207:11
541− (branch 207:11
542− (wing 207:14 second)
543− (arm 208:13 (lit 208:13 ~) (lit 208:15 ~))
544− (arm 209:13
545− (cell 209:13 (lit 209:14 ~) (bind 209:16 b))
546− (group 209:19
547− (call 209:20 (wing 209:20 combine) (wing 209:28 a) (wing 209:30 b)))))))))))))))
548− (value 211:1 skim
549− (gate 211:9
550− (face 211:12 args
551− (cell 211:17
552− (apply 211:18 list (tvar 211:24 A))
553− (fn 211:27 (tvar 211:30 A) (flag 211:32))))
554− (body 212:3
555− (branch 212:3
556− (wing 212:6 args)
557− (arm 213:5
558− (cell 213:5 (bind 213:6 xs) (bind 213:9 predicate))
559− (cast 213:20
560− (apply 213:23 list (tvar 213:29 A))
561− (body 214:9
562− (branch 214:9
563− (wing 214:12 xs)
564− (arm 215:11 (lit 215:11 ~) (lit 215:13 ~))
565− (arm 216:11
566− (cell 216:11 (bind 216:12 item) (bind 216:17 rest))
567− (body 217:13
568− (branch 217:13
569− (group 217:16
570− (call 217:17 (wing 217:17 predicate) (wing 217:27 item)))
571− (arm 218:15
572− (lit 218:15 %.y)
573− (tuple 218:19
574− (wing 218:20 item)
575− (group 218:25
576− (call 218:26 (wing 218:26 skim) (wing 218:31 rest) (wing 218:36 predicate)))))
577− (arm 219:15
578− (lit 219:15 %.n)
579− (group 219:19
580− (call 219:20 (wing 219:20 skim) (wing 219:25 rest) (wing 219:30 predicate)))))))))))))))
581− (value 221:1 skip
582− (gate 221:9
583− (face 221:12 args
584− (cell 221:17
585− (apply 221:18 list (tvar 221:24 A))
586− (fn 221:27 (tvar 221:30 A) (flag 221:32))))
587− (body 222:3
588− (branch 222:3
589− (wing 222:6 args)
590− (arm 223:5
591− (cell 223:5 (bind 223:6 xs) (bind 223:9 predicate))
592− (cast 223:20
593− (apply 223:23 list (tvar 223:29 A))
594− (body 224:9
595− (branch 224:9
596− (wing 224:12 xs)
597− (arm 225:11 (lit 225:11 ~) (lit 225:13 ~))
598− (arm 226:11
599− (cell 226:11 (bind 226:12 item) (bind 226:17 rest))
600− (body 227:13
601− (branch 227:13
602− (group 227:16
603− (call 227:17 (wing 227:17 predicate) (wing 227:27 item)))
604− (arm 228:15
605− (lit 228:15 %.y)
606− (group 228:19
607− (call 228:20 (wing 228:20 skip) (wing 228:25 rest) (wing 228:30 predicate))))
608− (arm 229:15
609− (lit 229:15 %.n)
610− (tuple 229:19
611− (wing 229:20 item)
612− (group 229:25
613− (call 229:26 (wing 229:26 skip) (wing 229:31 rest) (wing 229:36 predicate))))))))))))))))
614− (value 231:1 levy
615− (gate 231:9
616− (face 231:12 args
617− (cell 231:17
618− (apply 231:18 list (tvar 231:24 A))
619− (fn 231:27 (tvar 231:30 A) (flag 231:32))))
620− (body 232:3
621− (cast 232:3
622− (flag 232:6)
623− (body 233:5
624− (branch 233:5
625− (wing 233:8 args)
626− (arm 234:7
627− (cell 234:7 (bind 234:8 xs) (bind 234:11 predicate))
628− (body 235:9
629− (branch 235:9
630− (wing 235:12 xs)
631− (arm 236:11 (lit 236:11 ~) (lit 236:13 %.y))
632− (arm 237:11
633− (cell 237:11 (bind 237:12 item) (bind 237:17 rest))
634− (body 238:13
635− (branch 238:13
636− (group 238:16
637− (call 238:17 (wing 238:17 predicate) (wing 238:27 item)))
638− (arm 239:15
639− (lit 239:15 %.y)
640− (group 239:19
641− (call 239:20 (wing 239:20 levy) (wing 239:25 rest) (wing 239:30 predicate))))
642− (arm 240:15 (lit 240:15 %.n) (lit 240:19 %.n))))))))))))))
643− (value 242:1 lien
644− (gate 242:9
645− (face 242:12 args
646− (cell 242:17
647− (apply 242:18 list (tvar 242:24 A))
648− (fn 242:27 (tvar 242:30 A) (flag 242:32))))
649− (body 243:3
650− (cast 243:3
651− (flag 243:6)
652− (body 244:5
653− (branch 244:5
654− (wing 244:8 args)
655− (arm 245:7
656− (cell 245:7 (bind 245:8 xs) (bind 245:11 predicate))
657− (body 246:9
658− (branch 246:9
659− (wing 246:12 xs)
660− (arm 247:11 (lit 247:11 ~) (lit 247:13 %.n))
661− (arm 248:11
662− (cell 248:11 (bind 248:12 item) (bind 248:17 rest))
663− (body 249:13
664− (branch 249:13
665− (group 249:16
666− (call 249:17 (wing 249:17 predicate) (wing 249:27 item)))
667− (arm 250:15 (lit 250:15 %.y) (lit 250:19 %.y))
668− (arm 251:15
669− (lit 251:15 %.n)
670− (group 251:19
671− (call 251:20 (wing 251:20 lien) (wing 251:25 rest) (wing 251:30 predicate))))))))))))))))
672− (value 253:1 roll
673− (gate 253:9
674− (face 253:12 args
675− (cell 253:17
676− (apply 253:18 list (tvar 253:24 A))
677− (tvar 253:27 B)
678− (fn 253:29
679− (cell 253:32 (tvar 253:33 A) (tvar 253:35 B))
680− (tvar 253:38 B))))
681− (body 254:3
682− (branch 254:3
683− (wing 254:6 args)
684− (arm 255:5
685− (cell 255:5 (bind 255:6 xs) (bind 255:9 start) (bind 255:15 combine))
686− (body 256:7
687− (branch 256:7
688− (wing 256:10 xs)
689− (arm 257:9 (lit 257:9 ~) (wing 257:11 start))
690− (arm 258:9
691− (cell 258:9 (bind 258:10 item) (bind 258:15 rest))
692− (group 258:21
693− (call 258:22
694− (wing 258:22 roll)
695− (wing 258:27 rest)
696− (group 258:32
697− (call 258:33 (wing 258:33 combine) (wing 258:41 item) (wing 258:46 start)))
698− (wing 258:53 combine)))))))))))
699− (value 260:1 reel
700− (gate 260:9
701− (face 260:12 args
702− (cell 260:17
703− (apply 260:18 list (tvar 260:24 A))
704− (tvar 260:27 B)
705− (fn 260:29
706− (cell 260:32 (tvar 260:33 A) (tvar 260:35 B))
707− (tvar 260:38 B))))
708− (body 261:3
709− (branch 261:3
710− (wing 261:6 args)
711− (arm 262:5
712− (cell 262:5 (bind 262:6 xs) (bind 262:9 start) (bind 262:15 combine))
713− (body 263:7
714− (branch 263:7
715− (wing 263:10 xs)
716− (arm 264:9 (lit 264:9 ~) (wing 264:11 start))
717− (arm 265:9
718− (cell 265:9 (bind 265:10 item) (bind 265:15 rest))
719− (group 265:21
720− (call 265:22
721− (wing 265:22 combine)
722− (wing 265:30 item)
723− (group 265:35
724− (call 265:36 (wing 265:36 reel) (wing 265:41 rest) (wing 265:46 start) (wing 265:52 combine)))))))))))))
725− (value 267:1 flit
726− (gate 267:9
727− (face 267:12 predicate
728− (fn 267:22 (tvar 267:25 A) (flag 267:27)))
729− (body 268:3
730− (gate 268:3
731− (face 268:6 value (tvar 268:12 A))
732− (body 269:5
733− (cast 269:5
734− (apply 269:8 unit (tvar 269:14 A))
735− (body 270:7
736− (branch 270:7
737− (group 270:10
738− (call 270:11 (wing 270:11 predicate) (wing 270:21 value)))
739− (arm 271:9
740− (lit 271:9 %.y)
741− (unit 271:13 (wing 271:14 value)))
742− (arm 272:9 (lit 272:9 %.n) (lit 272:13 ~))))))))))
743− (value 274:1 murn
744− (gate 274:9
745− (face 274:12 args
746− (cell 274:17
747− (apply 274:18 list (tvar 274:24 A))
748− (fn 274:27
749− (tvar 274:30 A)
750− (apply 274:32 unit (tvar 274:38 B)))))
751− (body 275:3
752− (branch 275:3
753− (wing 275:6 args)
754− (arm 276:5
755− (cell 276:5 (bind 276:6 xs) (bind 276:9 f))
756− (cast 276:12
757− (apply 276:15 list (tvar 276:21 B))
758− (body 277:9
759− (branch 277:9
760− (wing 277:12 xs)
761− (arm 278:11 (lit 278:11 ~) (lit 278:13 ~))
762− (arm 279:11
763− (cell 279:11 (bind 279:12 item) (bind 279:17 rest))
764− (body 280:13
765− (branch 280:13
766− (group 280:16
767− (call 280:17 (wing 280:17 f) (wing 280:19 item)))
768− (arm 281:15
769− (lit 281:15 ~)
770− (group 281:17
771− (call 281:18 (wing 281:18 murn) (wing 281:23 rest) (wing 281:28 f))))
772− (arm 282:15
773− (cell 282:15 (lit 282:16 ~) (bind 282:18 value))
774− (tuple 282:25
775− (wing 282:26 value)
776− (group 282:32
777− (call 282:33 (wing 282:33 murn) (wing 282:38 rest) (wing 282:43 f))))))))))))))))
778− (value 284:1 join
779− (gate 284:9
780− (face 284:12 args
781− (cell 284:17
782− (tvar 284:18 A)
783− (apply 284:20 list (tvar 284:26 A))))
784− (body 285:3
785− (branch 285:3
786− (wing 285:6 args)
787− (arm 286:5
788− (cell 286:5 (bind 286:6 separator) (bind 286:16 xs))
789− (cast 286:20
790− (apply 286:23 list (tvar 286:29 A))
791− (body 287:9
792− (branch 287:9
793− (wing 287:12 xs)
794− (arm 288:11 (lit 288:11 ~) (lit 288:13 ~))
795− (arm 289:11
796− (cell 289:11 (bind 289:12 item) (bind 289:17 rest))
797− (body 290:13
798− (branch 290:13
799− (wing 290:16 rest)
800− (arm 291:15
801− (lit 291:15 ~)
802− (tuple 291:17 (wing 291:18 item) (lit 291:23 ~)))
803− (arm 292:15
804− (cell 292:15 (bind 292:16 next) (bind 292:21 more))
805− (tuple 292:27
806− (wing 292:28 item)
807− (tuple 292:33
808− (wing 292:34 separator)
809− (group 292:44
810− (call 292:45 (wing 292:45 join) (wing 292:50 separator) (wing 292:60 rest)))))))))))))))))
811− (value 294:1 snip
812− (gate 294:9
813− (face 294:12 xs
814− (apply 294:15 list (tvar 294:21 A)))
815− (body 295:3
816− (cast 295:3
817− (apply 295:6 list (tvar 295:12 A))
818− (body 296:5
819− (branch 296:5
820− (wing 296:8 xs)
821− (arm 297:7 (lit 297:7 ~) (lit 297:9 ~))
822− (arm 298:7
823− (cell 298:7 (bind 298:8 item) (bind 298:13 rest))
824− (body 299:9
825− (branch 299:9
826− (wing 299:12 rest)
827− (arm 300:11 (lit 300:11 ~) (lit 300:13 ~))
828− (arm 301:11
829− (cell 301:11 (bind 301:12 next) (bind 301:17 more))
830− (tuple 301:23
831− (wing 301:24 item)
832− (group 301:29
833− (call 301:30 (wing 301:30 snip) (wing 301:35 rest))))))))))))))
834− (value 303:1 rear
835− (gate 303:9
836− (face 303:12 xs
837− (apply 303:15 list (tvar 303:21 A)))
838− (body 304:3
839− (branch 304:3
840− (wing 304:6 xs)
841− (arm 305:5 (lit 305:5 ~) (crash 305:7))
842− (arm 306:5
843− (cell 306:5 (bind 306:6 item) (bind 306:11 rest))
844− (body 307:7
845− (branch 307:7
846− (wing 307:10 rest)
847− (arm 308:9 (lit 308:9 ~) (wing 308:11 item))
848− (arm 309:9
849− (cell 309:9 (bind 309:10 next) (bind 309:15 more))
850− (group 309:21
851− (call 309:22 (wing 309:22 rear) (wing 309:27 rest)))))))))))
852− (value 311:1 cork
853− (gate 311:9
854− (face 311:12 gates
855− (cell 311:18
856− (fn 311:19 (tvar 311:22 A) (tvar 311:24 B))
857− (fn 311:27 (tvar 311:30 B) (tvar 311:32 C))))
858− (body 312:3
859− (branch 312:3
860− (wing 312:6 gates)
861− (arm 313:5
862− (cell 313:5 (bind 313:6 f) (bind 313:8 g))
863− (gate 313:11
864− (face 313:14 x (tvar 313:16 A))
865− (group 313:18
866− (call 313:19
867− (wing 313:19 g)
868− (group 313:21
869− (call 313:22 (wing 313:22 f) (wing 313:24 x)))))))))))
870− (value 315:1 corl
871− (gate 315:9
872− (face 315:12 gates
873− (cell 315:18
874− (fn 315:19 (tvar 315:22 B) (tvar 315:24 C))
875− (fn 315:27 (tvar 315:30 A) (tvar 315:32 B))))
876− (body 316:3
877− (branch 316:3
878− (wing 316:6 gates)
879− (arm 317:5
880− (cell 317:5 (bind 317:6 f) (bind 317:8 g))
881− (gate 317:11
882− (face 317:14 x (tvar 317:16 A))
883− (group 317:18
884− (call 317:19
885− (wing 317:19 f)
886− (group 317:21
887− (call 317:22 (wing 317:22 g) (wing 317:24 x)))))))))))
888− (value 319:1 cury
889− (gate 319:9
890− (face 319:12 args
891− (cell 319:17
892− (fn 319:18
893− (cell 319:21 (tvar 319:22 A) (tvar 319:24 B))
894− (tvar 319:27 C))
895− (tvar 319:30 A)))
896− (body 320:3
897− (branch 320:3
898− (wing 320:6 args)
899− (arm 321:5
900− (cell 321:5 (bind 321:6 f) (bind 321:8 a))
901− (gate 321:11
902− (face 321:14 b (tvar 321:16 B))
903− (group 321:18
904− (call 321:19 (wing 321:19 f) (wing 321:21 a) (wing 321:23 b)))))))))
905− (value 323:1 curr
906− (gate 323:9
907− (face 323:12 args
908− (cell 323:17
909− (fn 323:18
910− (cell 323:21 (tvar 323:22 A) (tvar 323:24 B))
911− (tvar 323:27 C))
912− (tvar 323:30 B)))
913− (body 324:3
914− (branch 324:3
915− (wing 324:6 args)
916− (arm 325:5
917− (cell 325:5 (bind 325:6 f) (bind 325:8 b))
918− (gate 325:11
919− (face 325:14 a (tvar 325:16 A))
920− (group 325:18
921− (call 325:19 (wing 325:19 f) (wing 325:21 a) (wing 325:23 b)))))))))
922− (mold 327:1 cmd
923− (generic 327:8 M
924− (union 328:3
925− (cell 328:3
926− (const 328:4 %poke)
927− (face 328:10 p (ref 328:12 raw-poke))
928− (face 328:21 reply
929− (fn 328:27
930− (apply 328:30 unit (aura 328:36 @t))
931− (tvar 328:40 M))))
932− (cell 329:3
933− (const 329:4 %go)
934− (face 329:8 url (aura 329:12 @t)))
935− (cell 330:3
936− (const 330:4 %wait)
937− (face 330:10 gap (aura 330:14 @dr))
938− (face 330:18 msg (tvar 330:22 M)))
939− (cell 331:3
940− (const 331:4 %now)
941− (face 331:9 reply
942− (fn 331:15 (aura 331:18 @da) (tvar 331:22 M))))
943− (cell 332:3
944− (const 332:4 %who)
945− (face 332:9 reply
946− (fn 332:15 (aura 332:18 @p) (tvar 332:21 M)))))))
947− (value 334:1 gth
948− (gate 334:8
949− (face 334:11 args
950− (cell 334:16 (tvar 334:17 A) (tvar 334:19 A)))
951− (group 334:22
952− (call 334:23 (wing 334:23 gth-atom.internal) (wing 334:41 args)))))
953− (value 335:1 add
954− (gate 335:8
955− (face 335:11 args
956− (cell 335:16 (tvar 335:17 A) (tvar 335:19 A)))
957− (group 335:22
958− (call 335:23 (wing 335:23 add-atom.internal) (wing 335:41 args)))))
959− (value 336:1 dec
960− (gate 336:8
961− (face 336:11 atom (tvar 336:16 A))
962− (group 336:18
963− (call 336:19 (wing 336:19 dec-atom.internal) (wing 336:37 atom)))))
964− (mold 338:1 ask
965− (generic 338:8 M
966− (apply 338:15 ask.internal (tvar 338:29 M))))
967− (value 339:1 pure
335+ (unit 139:19 (wing 139:20 item))))
336+ (value 141:1 lure
337+ (gate 141:9
338+ (face 141:12 item (tvar 141:17 A))
339+ (body 142:3
340+ (cast 142:3
341+ (apply 142:6 list (tvar 142:12 A))
342+ (tuple 142:15 (wing 142:16 item) (lit 142:21 ~))))))
343+ (value 144:1 snoc
344+ (gate 144:9
345+ (face 144:12 args
346+ (cell 144:17
347+ (apply 144:18 list (tvar 144:24 A))
348+ (tvar 144:27 A)))
349+ (body 145:3
350+ (branch 145:3
351+ (wing 145:6 args)
352+ (arm 146:5
353+ (cell 146:5 (bind 146:6 xs) (bind 146:9 item))
354+ (group 146:15
355+ (call 146:16
356+ (wing 146:16 weld)
357+ (wing 146:21 xs)
358+ (tuple 146:24 (wing 146:25 item) (lit 146:30 ~)))))))))
359+ (value 148:1 flop
360+ (gate 148:9
361+ (face 148:12 xs
362+ (apply 148:15 list (tvar 148:21 A)))
363+ (body 149:3
364+ (value 149:3 reverse-into
365+ (gate 149:19
366+ (face 149:22 args
367+ (cell 149:27
368+ (apply 149:28 list (tvar 149:34 A))
369+ (apply 149:37 list (tvar 149:43 A))))
370+ (body 150:5
371+ (branch 150:5
372+ (wing 150:8 args)
373+ (arm 151:7
374+ (cell 151:7 (bind 151:8 rest) (bind 151:13 acc))
375+ (body 152:9
376+ (branch 152:9
377+ (wing 152:12 rest)
378+ (arm 153:11 (lit 153:11 ~) (wing 153:13 acc))
379+ (arm 154:11
380+ (cell 154:11 (bind 154:12 item) (bind 154:17 more))
381+ (group 154:23
382+ (call 154:24
383+ (wing 154:24 reverse-into)
384+ (wing 154:37 more)
385+ (tuple 154:42 (wing 154:43 item) (wing 154:48 acc))))))))))))
386+ (group 155:3
387+ (call 155:4 (wing 155:4 reverse-into) (wing 155:17 xs) (lit 155:20 ~))))))
388+ (value 157:1 drop
389+ (gate 157:9
390+ (face 157:12 maybe
391+ (apply 157:18 unit (tvar 157:24 A)))
392+ (body 158:3
393+ (cast 158:3
394+ (apply 158:6 list (tvar 158:12 A))
395+ (body 159:5
396+ (branch 159:5
397+ (wing 159:8 maybe)
398+ (arm 160:7 (lit 160:7 ~) (lit 160:9 ~))
399+ (arm 161:7
400+ (cell 161:7 (lit 161:8 ~) (bind 161:10 value))
401+ (tuple 161:17 (wing 161:18 value) (lit 161:24 ~)))))))))
402+ (value 163:1 bond
403+ (gate 163:9
404+ (face 163:12 fallback
405+ (fn 163:21 (const 163:24 ~) (tvar 163:26 A)))
406+ (body 164:3
407+ (gate 164:3
408+ (face 164:6 maybe
409+ (apply 164:12 unit (tvar 164:18 A)))
410+ (body 165:5
411+ (branch 165:5
412+ (wing 165:8 maybe)
413+ (arm 166:7
414+ (lit 166:7 ~)
415+ (group 166:9
416+ (call 166:10 (wing 166:10 fallback) (lit 166:19 ~))))
417+ (arm 167:7
418+ (cell 167:7 (lit 167:8 ~) (bind 167:10 value))
419+ (wing 167:17 value))))))))
420+ (value 169:1 bind
421+ (gate 169:9
422+ (face 169:12 args
423+ (cell 169:17
424+ (apply 169:18 unit (tvar 169:24 A))
425+ (fn 169:27 (tvar 169:30 A) (tvar 169:32 B))))
426+ (body 170:3
427+ (branch 170:3
428+ (wing 170:6 args)
429+ (arm 171:5
430+ (cell 171:5 (bind 171:6 maybe) (bind 171:12 f))
431+ (cast 171:15
432+ (apply 171:18 unit (tvar 171:24 B))
433+ (body 172:7
434+ (branch 172:7
435+ (wing 172:10 maybe)
436+ (arm 173:9 (lit 173:9 ~) (lit 173:11 ~))
437+ (arm 174:9
438+ (cell 174:9 (lit 174:10 ~) (bind 174:12 value))
439+ (unit 174:19
440+ (group 174:20
441+ (call 174:21 (wing 174:21 f) (wing 174:23 value)))))))))))))
442+ (value 176:1 biff
443+ (gate 176:9
444+ (face 176:12 args
445+ (cell 176:17
446+ (apply 176:18 unit (tvar 176:24 A))
447+ (fn 176:27
448+ (tvar 176:30 A)
449+ (apply 176:32 unit (tvar 176:38 B)))))
450+ (body 177:3
451+ (branch 177:3
452+ (wing 177:6 args)
453+ (arm 178:5
454+ (cell 178:5 (bind 178:6 maybe) (bind 178:12 f))
455+ (cast 178:15
456+ (apply 178:18 unit (tvar 178:24 B))
457+ (body 179:7
458+ (branch 179:7
459+ (wing 179:10 maybe)
460+ (arm 180:9 (lit 180:9 ~) (lit 180:11 ~))
461+ (arm 181:9
462+ (cell 181:9 (lit 181:10 ~) (bind 181:12 value))
463+ (group 181:19
464+ (call 181:20 (wing 181:20 f) (wing 181:22 value))))))))))))
465+ (value 183:1 both
466+ (gate 183:9
467+ (face 183:12 args
468+ (cell 183:17
469+ (apply 183:18 unit (tvar 183:24 A))
470+ (apply 183:27 unit (tvar 183:33 B))))
471+ (body 184:3
472+ (branch 184:3
473+ (wing 184:6 args)
474+ (arm 185:5
475+ (cell 185:5 (bind 185:6 first) (bind 185:12 second))
476+ (cast 185:20
477+ (apply 185:23 unit
478+ (cell 185:29 (tvar 185:30 A) (tvar 185:32 B)))
479+ (body 186:7
480+ (branch 186:7
481+ (wing 186:10 first)
482+ (arm 187:9 (lit 187:9 ~) (lit 187:11 ~))
483+ (arm 188:9
484+ (cell 188:9 (lit 188:10 ~) (bind 188:12 a))
485+ (body 189:11
486+ (branch 189:11
487+ (wing 189:14 second)
488+ (arm 190:13 (lit 190:13 ~) (lit 190:15 ~))
489+ (arm 191:13
490+ (cell 191:13 (lit 191:14 ~) (bind 191:16 b))
491+ (unit 191:19
492+ (tuple 191:20 (wing 191:21 a) (wing 191:23 b)))))))))))))))
493+ (value 193:1 clap
494+ (gate 193:9
495+ (face 193:12 args
496+ (cell 193:17
497+ (apply 193:18 unit (tvar 193:24 A))
498+ (apply 193:27 unit (tvar 193:33 A))
499+ (fn 193:36
500+ (cell 193:39 (tvar 193:40 A) (tvar 193:42 A))
501+ (tvar 193:45 A))))
502+ (body 194:3
503+ (branch 194:3
504+ (wing 194:6 args)
505+ (arm 195:5
506+ (cell 195:5 (bind 195:6 first) (bind 195:12 second) (bind 195:19 combine))
507+ (cast 195:28
508+ (apply 195:31 unit (tvar 195:37 A))
509+ (body 196:7
510+ (branch 196:7
511+ (wing 196:10 first)
512+ (arm 197:9 (lit 197:9 ~) (wing 197:11 second))
513+ (arm 198:9
514+ (cell 198:9 (lit 198:10 ~) (bind 198:12 a))
515+ (body 199:11
516+ (branch 199:11
517+ (wing 199:14 second)
518+ (arm 200:13 (lit 200:13 ~) (wing 200:15 first))
519+ (arm 201:13
520+ (cell 201:13 (lit 201:14 ~) (bind 201:16 b))
521+ (unit 201:19
522+ (group 201:20
523+ (call 201:21 (wing 201:21 combine) (wing 201:29 a) (wing 201:31 b))))))))))))))))
524+ (value 203:1 hunt
525+ (gate 203:9
526+ (face 203:12 args
527+ (cell 203:17
528+ (fn 203:18
529+ (cell 203:21 (tvar 203:22 A) (tvar 203:24 A))
530+ (flag 203:27))
531+ (apply 203:30 unit (tvar 203:36 A))
532+ (apply 203:39 unit (tvar 203:45 A))))
533+ (body 204:3
534+ (branch 204:3
535+ (wing 204:6 args)
536+ (arm 205:5
537+ (cell 205:5 (bind 205:6 choose) (bind 205:13 first) (bind 205:19 second))
538+ (cast 205:27
539+ (apply 205:30 unit (tvar 205:36 A))
540+ (body 206:7
541+ (branch 206:7
542+ (wing 206:10 first)
543+ (arm 207:9 (lit 207:9 ~) (wing 207:11 second))
544+ (arm 208:9
545+ (cell 208:9 (lit 208:10 ~) (bind 208:12 a))
546+ (body 209:11
547+ (branch 209:11
548+ (wing 209:14 second)
549+ (arm 210:13 (lit 210:13 ~) (wing 210:15 first))
550+ (arm 211:13
551+ (cell 211:13 (lit 211:14 ~) (bind 211:16 b))
552+ (body 212:15
553+ (branch 212:15
554+ (group 212:18
555+ (call 212:19 (wing 212:19 choose) (wing 212:26 a) (wing 212:28 b)))
556+ (arm 213:17 (lit 213:17 %.y) (wing 213:21 first))
557+ (arm 214:17 (lit 214:17 %.n) (wing 214:21 second))))))))))))))))
558+ (value 216:1 mate
559+ (gate 216:9
560+ (face 216:12 args
561+ (cell 216:17
562+ (apply 216:18 unit (tvar 216:24 A))
563+ (apply 216:27 unit (tvar 216:33 A))))
564+ (body 217:3
565+ (branch 217:3
566+ (wing 217:6 args)
567+ (arm 218:5
568+ (cell 218:5 (bind 218:6 first) (bind 218:12 second))
569+ (cast 218:20
570+ (apply 218:23 unit (tvar 218:29 A))
571+ (body 219:7
572+ (branch 219:7
573+ (wing 219:10 second)
574+ (arm 220:9 (lit 220:9 ~) (wing 220:11 first))
575+ (arm 221:9
576+ (cell 221:9 (lit 221:10 ~) (bind 221:12 b))
577+ (body 222:11
578+ (branch 222:11
579+ (wing 222:14 first)
580+ (arm 223:13 (lit 223:13 ~) (wing 223:15 second))
581+ (arm 224:13
582+ (cell 224:13 (lit 224:14 ~) (bind 224:16 a))
583+ (body 225:15
584+ (branch 225:15
585+ (group 225:18
586+ (call 225:19 (wing 225:19 eq) (wing 225:22 a) (wing 225:24 b)))
587+ (arm 226:17 (lit 226:17 %.y) (wing 226:21 first))
588+ (arm 227:17 (lit 227:17 %.n) (crash 227:21))))))))))))))))
589+ (value 229:1 clef
590+ (gate 229:9
591+ (face 229:12 args
592+ (cell 229:17
593+ (apply 229:18 unit (tvar 229:24 A))
594+ (apply 229:27 unit (tvar 229:33 B))
595+ (fn 229:36
596+ (cell 229:39 (tvar 229:40 A) (tvar 229:42 B))
597+ (apply 229:45 unit (tvar 229:51 C)))))
598+ (body 230:3
599+ (branch 230:3
600+ (wing 230:6 args)
601+ (arm 231:5
602+ (cell 231:5 (bind 231:6 first) (bind 231:12 second) (bind 231:19 combine))
603+ (cast 231:28
604+ (apply 231:31 unit (tvar 231:37 C))
605+ (body 232:7
606+ (branch 232:7
607+ (wing 232:10 first)
608+ (arm 233:9 (lit 233:9 ~) (lit 233:11 ~))
609+ (arm 234:9
610+ (cell 234:9 (lit 234:10 ~) (bind 234:12 a))
611+ (body 235:11
612+ (branch 235:11
613+ (wing 235:14 second)
614+ (arm 236:13 (lit 236:13 ~) (lit 236:15 ~))
615+ (arm 237:13
616+ (cell 237:13 (lit 237:14 ~) (bind 237:16 b))
617+ (group 237:19
618+ (call 237:20 (wing 237:20 combine) (wing 237:28 a) (wing 237:30 b)))))))))))))))
619+ (value 239:1 skim
620+ (gate 239:9
621+ (face 239:12 args
622+ (cell 239:17
623+ (apply 239:18 list (tvar 239:24 A))
624+ (fn 239:27 (tvar 239:30 A) (flag 239:32))))
625+ (body 240:3
626+ (branch 240:3
627+ (wing 240:6 args)
628+ (arm 241:5
629+ (cell 241:5 (bind 241:6 xs) (bind 241:9 predicate))
630+ (cast 241:20
631+ (apply 241:23 list (tvar 241:29 A))
632+ (body 242:9
633+ (branch 242:9
634+ (wing 242:12 xs)
635+ (arm 243:11 (lit 243:11 ~) (lit 243:13 ~))
636+ (arm 244:11
637+ (cell 244:11 (bind 244:12 item) (bind 244:17 rest))
638+ (body 245:13
639+ (branch 245:13
640+ (group 245:16
641+ (call 245:17 (wing 245:17 predicate) (wing 245:27 item)))
642+ (arm 246:15
643+ (lit 246:15 %.y)
644+ (tuple 246:19
645+ (wing 246:20 item)
646+ (group 246:25
647+ (call 246:26 (wing 246:26 skim) (wing 246:31 rest) (wing 246:36 predicate)))))
648+ (arm 247:15
649+ (lit 247:15 %.n)
650+ (group 247:19
651+ (call 247:20 (wing 247:20 skim) (wing 247:25 rest) (wing 247:30 predicate)))))))))))))))
652+ (value 249:1 skip
653+ (gate 249:9
654+ (face 249:12 args
655+ (cell 249:17
656+ (apply 249:18 list (tvar 249:24 A))
657+ (fn 249:27 (tvar 249:30 A) (flag 249:32))))
658+ (body 250:3
659+ (branch 250:3
660+ (wing 250:6 args)
661+ (arm 251:5
662+ (cell 251:5 (bind 251:6 xs) (bind 251:9 predicate))
663+ (cast 251:20
664+ (apply 251:23 list (tvar 251:29 A))
665+ (body 252:9
666+ (branch 252:9
667+ (wing 252:12 xs)
668+ (arm 253:11 (lit 253:11 ~) (lit 253:13 ~))
669+ (arm 254:11
670+ (cell 254:11 (bind 254:12 item) (bind 254:17 rest))
671+ (body 255:13
672+ (branch 255:13
673+ (group 255:16
674+ (call 255:17 (wing 255:17 predicate) (wing 255:27 item)))
675+ (arm 256:15
676+ (lit 256:15 %.y)
677+ (group 256:19
678+ (call 256:20 (wing 256:20 skip) (wing 256:25 rest) (wing 256:30 predicate))))
679+ (arm 257:15
680+ (lit 257:15 %.n)
681+ (tuple 257:19
682+ (wing 257:20 item)
683+ (group 257:25
684+ (call 257:26 (wing 257:26 skip) (wing 257:31 rest) (wing 257:36 predicate))))))))))))))))
685+ (value 259:1 levy
686+ (gate 259:9
687+ (face 259:12 args
688+ (cell 259:17
689+ (apply 259:18 list (tvar 259:24 A))
690+ (fn 259:27 (tvar 259:30 A) (flag 259:32))))
691+ (body 260:3
692+ (cast 260:3
693+ (flag 260:6)
694+ (body 261:5
695+ (branch 261:5
696+ (wing 261:8 args)
697+ (arm 262:7
698+ (cell 262:7 (bind 262:8 xs) (bind 262:11 predicate))
699+ (body 263:9
700+ (branch 263:9
701+ (wing 263:12 xs)
702+ (arm 264:11 (lit 264:11 ~) (lit 264:13 %.y))
703+ (arm 265:11
704+ (cell 265:11 (bind 265:12 item) (bind 265:17 rest))
705+ (body 266:13
706+ (branch 266:13
707+ (group 266:16
708+ (call 266:17 (wing 266:17 predicate) (wing 266:27 item)))
709+ (arm 267:15
710+ (lit 267:15 %.y)
711+ (group 267:19
712+ (call 267:20 (wing 267:20 levy) (wing 267:25 rest) (wing 267:30 predicate))))
713+ (arm 268:15 (lit 268:15 %.n) (lit 268:19 %.n))))))))))))))
714+ (value 270:1 lien
715+ (gate 270:9
716+ (face 270:12 args
717+ (cell 270:17
718+ (apply 270:18 list (tvar 270:24 A))
719+ (fn 270:27 (tvar 270:30 A) (flag 270:32))))
720+ (body 271:3
721+ (cast 271:3
722+ (flag 271:6)
723+ (body 272:5
724+ (branch 272:5
725+ (wing 272:8 args)
726+ (arm 273:7
727+ (cell 273:7 (bind 273:8 xs) (bind 273:11 predicate))
728+ (body 274:9
729+ (branch 274:9
730+ (wing 274:12 xs)
731+ (arm 275:11 (lit 275:11 ~) (lit 275:13 %.n))
732+ (arm 276:11
733+ (cell 276:11 (bind 276:12 item) (bind 276:17 rest))
734+ (body 277:13
735+ (branch 277:13
736+ (group 277:16
737+ (call 277:17 (wing 277:17 predicate) (wing 277:27 item)))
738+ (arm 278:15 (lit 278:15 %.y) (lit 278:19 %.y))
739+ (arm 279:15
740+ (lit 279:15 %.n)
741+ (group 279:19
742+ (call 279:20 (wing 279:20 lien) (wing 279:25 rest) (wing 279:30 predicate))))))))))))))))
743+ (value 281:1 roll
744+ (gate 281:9
745+ (face 281:12 args
746+ (cell 281:17
747+ (apply 281:18 list (tvar 281:24 A))
748+ (tvar 281:27 B)
749+ (fn 281:29
750+ (cell 281:32 (tvar 281:33 A) (tvar 281:35 B))
751+ (tvar 281:38 B))))
752+ (body 282:3
753+ (branch 282:3
754+ (wing 282:6 args)
755+ (arm 283:5
756+ (cell 283:5 (bind 283:6 xs) (bind 283:9 start) (bind 283:15 combine))
757+ (body 284:7
758+ (branch 284:7
759+ (wing 284:10 xs)
760+ (arm 285:9 (lit 285:9 ~) (wing 285:11 start))
761+ (arm 286:9
762+ (cell 286:9 (bind 286:10 item) (bind 286:15 rest))
763+ (group 286:21
764+ (call 286:22
765+ (wing 286:22 roll)
766+ (wing 286:27 rest)
767+ (group 286:32
768+ (call 286:33 (wing 286:33 combine) (wing 286:41 item) (wing 286:46 start)))
769+ (wing 286:53 combine)))))))))))
770+ (value 288:1 reel
771+ (gate 288:9
772+ (face 288:12 args
773+ (cell 288:17
774+ (apply 288:18 list (tvar 288:24 A))
775+ (tvar 288:27 B)
776+ (fn 288:29
777+ (cell 288:32 (tvar 288:33 A) (tvar 288:35 B))
778+ (tvar 288:38 B))))
779+ (body 289:3
780+ (branch 289:3
781+ (wing 289:6 args)
782+ (arm 290:5
783+ (cell 290:5 (bind 290:6 xs) (bind 290:9 start) (bind 290:15 combine))
784+ (body 291:7
785+ (branch 291:7
786+ (wing 291:10 xs)
787+ (arm 292:9 (lit 292:9 ~) (wing 292:11 start))
788+ (arm 293:9
789+ (cell 293:9 (bind 293:10 item) (bind 293:15 rest))
790+ (group 293:21
791+ (call 293:22
792+ (wing 293:22 combine)
793+ (wing 293:30 item)
794+ (group 293:35
795+ (call 293:36 (wing 293:36 reel) (wing 293:41 rest) (wing 293:46 start) (wing 293:52 combine)))))))))))))
796+ (value 295:1 flit
797+ (gate 295:9
798+ (face 295:12 predicate
799+ (fn 295:22 (tvar 295:25 A) (flag 295:27)))
800+ (body 296:3
801+ (gate 296:3
802+ (face 296:6 value (tvar 296:12 A))
803+ (body 297:5
804+ (cast 297:5
805+ (apply 297:8 unit (tvar 297:14 A))
806+ (body 298:7
807+ (branch 298:7
808+ (group 298:10
809+ (call 298:11 (wing 298:11 predicate) (wing 298:21 value)))
810+ (arm 299:9
811+ (lit 299:9 %.y)
812+ (unit 299:13 (wing 299:14 value)))
813+ (arm 300:9 (lit 300:9 %.n) (lit 300:13 ~))))))))))
814+ (value 302:1 murn
815+ (gate 302:9
816+ (face 302:12 args
817+ (cell 302:17
818+ (apply 302:18 list (tvar 302:24 A))
819+ (fn 302:27
820+ (tvar 302:30 A)
821+ (apply 302:32 unit (tvar 302:38 B)))))
822+ (body 303:3
823+ (branch 303:3
824+ (wing 303:6 args)
825+ (arm 304:5
826+ (cell 304:5 (bind 304:6 xs) (bind 304:9 f))
827+ (cast 304:12
828+ (apply 304:15 list (tvar 304:21 B))
829+ (body 305:9
830+ (branch 305:9
831+ (wing 305:12 xs)
832+ (arm 306:11 (lit 306:11 ~) (lit 306:13 ~))
833+ (arm 307:11
834+ (cell 307:11 (bind 307:12 item) (bind 307:17 rest))
835+ (body 308:13
836+ (branch 308:13
837+ (group 308:16
838+ (call 308:17 (wing 308:17 f) (wing 308:19 item)))
839+ (arm 309:15
840+ (lit 309:15 ~)
841+ (group 309:17
842+ (call 309:18 (wing 309:18 murn) (wing 309:23 rest) (wing 309:28 f))))
843+ (arm 310:15
844+ (cell 310:15 (lit 310:16 ~) (bind 310:18 value))
845+ (tuple 310:25
846+ (wing 310:26 value)
847+ (group 310:32
848+ (call 310:33 (wing 310:33 murn) (wing 310:38 rest) (wing 310:43 f))))))))))))))))
849+ (value 312:1 join
850+ (gate 312:9
851+ (face 312:12 args
852+ (cell 312:17
853+ (tvar 312:18 A)
854+ (apply 312:20 list (tvar 312:26 A))))
855+ (body 313:3
856+ (branch 313:3
857+ (wing 313:6 args)
858+ (arm 314:5
859+ (cell 314:5 (bind 314:6 separator) (bind 314:16 xs))
860+ (cast 314:20
861+ (apply 314:23 list (tvar 314:29 A))
862+ (body 315:9
863+ (branch 315:9
864+ (wing 315:12 xs)
865+ (arm 316:11 (lit 316:11 ~) (lit 316:13 ~))
866+ (arm 317:11
867+ (cell 317:11 (bind 317:12 item) (bind 317:17 rest))
868+ (body 318:13
869+ (branch 318:13
870+ (wing 318:16 rest)
871+ (arm 319:15
872+ (lit 319:15 ~)
873+ (tuple 319:17 (wing 319:18 item) (lit 319:23 ~)))
874+ (arm 320:15
875+ (cell 320:15 (bind 320:16 next) (bind 320:21 more))
876+ (tuple 320:27
877+ (wing 320:28 item)
878+ (tuple 320:33
879+ (wing 320:34 separator)
880+ (group 320:44
881+ (call 320:45 (wing 320:45 join) (wing 320:50 separator) (wing 320:60 rest)))))))))))))))))
882+ (value 322:1 snip
883+ (gate 322:9
884+ (face 322:12 xs
885+ (apply 322:15 list (tvar 322:21 A)))
886+ (body 323:3
887+ (cast 323:3
888+ (apply 323:6 list (tvar 323:12 A))
889+ (body 324:5
890+ (branch 324:5
891+ (wing 324:8 xs)
892+ (arm 325:7 (lit 325:7 ~) (lit 325:9 ~))
893+ (arm 326:7
894+ (cell 326:7 (bind 326:8 item) (bind 326:13 rest))
895+ (body 327:9
896+ (branch 327:9
897+ (wing 327:12 rest)
898+ (arm 328:11 (lit 328:11 ~) (lit 328:13 ~))
899+ (arm 329:11
900+ (cell 329:11 (bind 329:12 next) (bind 329:17 more))
901+ (tuple 329:23
902+ (wing 329:24 item)
903+ (group 329:29
904+ (call 329:30 (wing 329:30 snip) (wing 329:35 rest))))))))))))))
905+ (value 331:1 rear
906+ (gate 331:9
907+ (face 331:12 xs
908+ (apply 331:15 list (tvar 331:21 A)))
909+ (body 332:3
910+ (branch 332:3
911+ (wing 332:6 xs)
912+ (arm 333:5 (lit 333:5 ~) (crash 333:7))
913+ (arm 334:5
914+ (cell 334:5 (bind 334:6 item) (bind 334:11 rest))
915+ (body 335:7
916+ (branch 335:7
917+ (wing 335:10 rest)
918+ (arm 336:9 (lit 336:9 ~) (wing 336:11 item))
919+ (arm 337:9
920+ (cell 337:9 (bind 337:10 next) (bind 337:15 more))
921+ (group 337:21
922+ (call 337:22 (wing 337:22 rear) (wing 337:27 rest)))))))))))
923+ (value 339:1 cork
968924 (gate 339:9
969− (face 339:12 x (tvar 339:14 M))
970− (cast 339:16
971− (apply 339:19 ask (tvar 339:24 M))
972− (tuple 339:27 (lit 339:28 %pure) (wing 339:34 x))))))
925+ (face 339:12 gates
926+ (cell 339:18
927+ (fn 339:19 (tvar 339:22 A) (tvar 339:24 B))
928+ (fn 339:27 (tvar 339:30 B) (tvar 339:32 C))))
929+ (body 340:3
930+ (branch 340:3
931+ (wing 340:6 gates)
932+ (arm 341:5
933+ (cell 341:5 (bind 341:6 f) (bind 341:8 g))
934+ (gate 341:11
935+ (face 341:14 x (tvar 341:16 A))
936+ (group 341:18
937+ (call 341:19
938+ (wing 341:19 g)
939+ (group 341:21
940+ (call 341:22 (wing 341:22 f) (wing 341:24 x)))))))))))
941+ (value 343:1 corl
942+ (gate 343:9
943+ (face 343:12 gates
944+ (cell 343:18
945+ (fn 343:19 (tvar 343:22 B) (tvar 343:24 C))
946+ (fn 343:27 (tvar 343:30 A) (tvar 343:32 B))))
947+ (body 344:3
948+ (branch 344:3
949+ (wing 344:6 gates)
950+ (arm 345:5
951+ (cell 345:5 (bind 345:6 f) (bind 345:8 g))
952+ (gate 345:11
953+ (face 345:14 x (tvar 345:16 A))
954+ (group 345:18
955+ (call 345:19
956+ (wing 345:19 f)
957+ (group 345:21
958+ (call 345:22 (wing 345:22 g) (wing 345:24 x)))))))))))
959+ (value 347:1 cury
960+ (gate 347:9
961+ (face 347:12 args
962+ (cell 347:17
963+ (fn 347:18
964+ (cell 347:21 (tvar 347:22 A) (tvar 347:24 B))
965+ (tvar 347:27 C))
966+ (tvar 347:30 A)))
967+ (body 348:3
968+ (branch 348:3
969+ (wing 348:6 args)
970+ (arm 349:5
971+ (cell 349:5 (bind 349:6 f) (bind 349:8 a))
972+ (gate 349:11
973+ (face 349:14 b (tvar 349:16 B))
974+ (group 349:18
975+ (call 349:19 (wing 349:19 f) (wing 349:21 a) (wing 349:23 b)))))))))
976+ (value 351:1 curr
977+ (gate 351:9
978+ (face 351:12 args
979+ (cell 351:17
980+ (fn 351:18
981+ (cell 351:21 (tvar 351:22 A) (tvar 351:24 B))
982+ (tvar 351:27 C))
983+ (tvar 351:30 B)))
984+ (body 352:3
985+ (branch 352:3
986+ (wing 352:6 args)
987+ (arm 353:5
988+ (cell 353:5 (bind 353:6 f) (bind 353:8 b))
989+ (gate 353:11
990+ (face 353:14 a (tvar 353:16 A))
991+ (group 353:18
992+ (call 353:19 (wing 353:19 f) (wing 353:21 a) (wing 353:23 b)))))))))
993+ (mold 355:1 cmd
994+ (generic 355:8 M
995+ (union 356:3
996+ (cell 356:3
997+ (const 356:4 %poke)
998+ (face 356:10 p (ref 356:12 raw-poke))
999+ (face 356:21 reply
1000+ (fn 356:27
1001+ (apply 356:30 unit (aura 356:36 @t))
1002+ (tvar 356:40 M))))
1003+ (cell 357:3
1004+ (const 357:4 %go)
1005+ (face 357:8 url (aura 357:12 @t)))
1006+ (cell 358:3
1007+ (const 358:4 %wait)
1008+ (face 358:10 gap (aura 358:14 @dr))
1009+ (face 358:18 msg (tvar 358:22 M)))
1010+ (cell 359:3
1011+ (const 359:4 %now)
1012+ (face 359:9 reply
1013+ (fn 359:15 (aura 359:18 @da) (tvar 359:22 M))))
1014+ (cell 360:3
1015+ (const 360:4 %who)
1016+ (face 360:9 reply
1017+ (fn 360:15 (aura 360:18 @p) (tvar 360:21 M)))))))
1018+ (value 362:1 gth
1019+ (gate 362:8
1020+ (face 362:11 args
1021+ (cell 362:16 (tvar 362:17 A) (tvar 362:19 A)))
1022+ (group 362:22
1023+ (call 362:23 (wing 362:23 gth-atom.internal) (wing 362:41 args)))))
1024+ (value 363:1 add
1025+ (gate 363:8
1026+ (face 363:11 args
1027+ (cell 363:16 (tvar 363:17 A) (tvar 363:19 A)))
1028+ (group 363:22
1029+ (call 363:23 (wing 363:23 add-atom.internal) (wing 363:41 args)))))
1030+ (value 364:1 dec
1031+ (gate 364:8
1032+ (face 364:11 atom (tvar 364:16 A))
1033+ (group 364:18
1034+ (call 364:19 (wing 364:19 dec-atom.internal) (wing 364:37 atom)))))
1035+ (mold 366:1 ask
1036+ (generic 366:8 M
1037+ (apply 366:15 ask.internal (tvar 366:29 M))))
1038+ (value 367:1 pure
1039+ (gate 367:9
1040+ (face 367:12 x (tvar 367:14 M))
1041+ (cast 367:16
1042+ (apply 367:19 ask (tvar 367:24 M))
1043+ (tuple 367:27 (lit 367:28 %pure) (wing 367:34 x))))))
tests/golden/prelude-unit-list-transforms/types.txt+3
@@ -5,6 +5,7 @@ partial inference; module not checked
55++ head: $-([A B] A)
66++ tail: $-([A B] B)
77++ not: $-(? ?)
8+++ eq: field access is not supported by partial inference
89+$ list: cases proven disjoint; mold not checked
910+$ unit: cases proven disjoint; mold not checked
1011++ fall: $-([(unit A) A] A)
@@ -48,6 +49,8 @@ partial inference; module not checked
4849++ biff: $-([(unit A) $-(A (unit B))] (unit B))
4950++ both: unit construction needs the standard prelude in partial inference
5051++ clap: unit construction needs the standard prelude in partial inference
52+++ hunt: $-([$-([A A] ?) [(unit A) (unit A)]] (unit A))
53+++ mate: name is not available to partial inference
5154++ clef: $-([(unit A) [(unit B) $-([A B] (unit C))]] (unit C))
5255++ skim: sample mold is not supported by partial inference
5356++ skip: sample mold is not supported by partial inference
tests/golden/types-generic-gates/about.txt+1−1
@@ -1,4 +1,4 @@
11source: Grammar, Molds: "Generic molds" are defined with `|$` after a `+$` name; type variables are capitals.
2−tests: Nonrecursive generic gate and two-parameter record molds retain independent parameter types.
2+tests: Nonrecursive generic gate and two-parameter record molds retain independent parameter types; a user mold named `map` does not acquire the collection key constraint.
33expect: parses
44expect-types: a partial inference report
tests/golden/types-generic-gates/source.jibb+2
@@ -2,3 +2,5 @@
22+$ duo |$ [A B] [left=A right=B]
33++ gate ^- (mapper @t @t) |= x=@t x
44++ pair ^- (duo @t @p) [left="hi" right=~zod]
5++$ map |$ [A B] [first=A second=B]
6+++ named-map ^- (map $-(@t @t) @t) [first=(|= x=@t x) second="ok"]
tests/golden/types-generic-gates/tokens.txt+43−1
@@ -56,4 +56,46 @@
56564:40 tight glyph =
57574:41 tight lit ~zod
58584:45 tight glyph ]
59−4:46 NEWLINE
59+5:1 NEWLINE
60+5:1 glyph +$
61+5:4 name map
62+5:8 glyph |$
63+5:11 glyph [
64+5:12 tight tvar A
65+5:14 tvar B
66+5:15 tight glyph ]
67+5:17 glyph [
68+5:18 tight name first
69+5:23 tight glyph =
70+5:24 tight tvar A
71+5:26 name second
72+5:32 tight glyph =
73+5:33 tight tvar B
74+5:34 tight glyph ]
75+6:1 NEWLINE
76+6:1 glyph ++
77+6:4 name named-map
78+6:14 glyph ^-
79+6:17 glyph (
80+6:18 tight name map
81+6:22 glyph $-(
82+6:25 tight aura @t
83+6:28 aura @t
84+6:30 tight glyph )
85+6:32 aura @t
86+6:34 tight glyph )
87+6:36 glyph [
88+6:37 tight name first
89+6:42 tight glyph =
90+6:43 tight glyph (
91+6:44 tight glyph |=
92+6:47 name x
93+6:48 tight glyph =
94+6:49 tight aura @t
95+6:52 name x
96+6:53 tight glyph )
97+6:55 name second
98+6:61 tight glyph =
99+6:62 tight str "ok"
100+6:66 tight glyph ]
101+6:67 NEWLINE
tests/golden/types-generic-gates/tree.txt+18−1
@@ -18,4 +18,21 @@
1818 (apply 4:12 duo (aura 4:17 @t) (aura 4:20 @p))
1919 (tuple 4:24
2020 (face 4:25 left (str 4:30 "hi"))
21− (face 4:35 right (lit 4:41 ~zod))))))
21+ (face 4:35 right (lit 4:41 ~zod)))))
22+ (mold 5:1 map
23+ (generic 5:8 A B
24+ (cell 5:17
25+ (face 5:18 first (tvar 5:24 A))
26+ (face 5:26 second (tvar 5:33 B)))))
27+ (value 6:1 named-map
28+ (cast 6:14
29+ (apply 6:17 map
30+ (fn 6:22 (aura 6:25 @t) (aura 6:28 @t))
31+ (aura 6:32 @t))
32+ (tuple 6:36
33+ (face 6:37 first
34+ (group 6:43
35+ (gate 6:44
36+ (face 6:47 x (aura 6:49 @t))
37+ (wing 6:52 x))))
38+ (face 6:55 second (str 6:62 "ok"))))))
tests/golden/types-generic-gates/types.txt+2
@@ -3,3 +3,5 @@ partial inference; module not checked
33+$ duo: not checked
44++ gate: $-(@t @t)
55++ pair: [left=@t right=@p]
6++$ map: not checked
7+++ named-map: [first=$-(@t @t) second=@t]
tests/golden/types-prelude-unit-helpers/about.txt+1−1
@@ -1,4 +1,4 @@
11source: Overview, Prelude: Hoon standard-library gates are regrouped into the prelude, with Jibb implementations.
2−tests: The actual prelude exposes bind, biff, both, clap, clef and flit with independently instantiated unit payloads. A mismatched gate argument reports both sites, an incompatible clef gate stays unsupported, and an unrelated tag stays pending.
2+tests: The actual prelude exposes bind, biff, both, clap, clef, flit, hunt, eq and mate with independently instantiated unit payloads. Hunt covers both ordering outcomes and absent units, with its ordering gate first as in Hoon. Equality and mate preserve the gate-free constraint through generic schemes and reject direct or nested gate payloads. A mismatched gate argument reports both sites, an incompatible clef gate stays unsupported, and an unrelated tag stays pending.
33expect: parses
44expect-types: a partial inference report
tests/golden/types-prelude-unit-helpers/source.jibb+16
@@ -13,3 +13,19 @@
1313++ clef-ship (clef `"hi" `~zod |=(p=[@t @p] `~zod))
1414++ clap-bad (clap `"hi" `~zod |=(p=[@t @t] "yes"))
1515++ clef-bad (clef `"hi" `~zod |=(p=[@p @t] `"ok"))
16+++ hunt-first (hunt |=(p=[@t @t] %.y) `"a" `"b")
17+++ hunt-second (hunt |=(p=[@t @t] %.n) `"a" `"b")
18+++ hunt-left (hunt |=(p=[@t @t] %.y) ~ `"b")
19+++ hunt-right (hunt |=(p=[@t @t] %.n) `"a" ~)
20+++ hunt-bad (hunt |=(p=[@t @t] %.y) `"a" `~zod)
21+++ hunt-gate-bad (hunt |=(p=[@t @p] %.y) `"a" `"b")
22+++ eq-cell (eq [1 "a"] [1 "a"])
23+++ eq-gate (eq same same)
24+++ eq-nested-gate (eq [1 same] [1 same])
25+++ eq-open |= x=A (eq x x)
26+++ mate-same (mate `"hi" `"hi")
27+++ mate-left (mate ~ `"hi")
28+++ mate-right (mate `"hi" ~)
29+++ mate-crash (mate `"hi" `"there")
30+++ mate-gate (mate `same `same)
31+++ mate-bad (mate `"hi" `~zod)
tests/golden/types-prelude-unit-helpers/tokens.txt+219−1
@@ -206,4 +206,222 @@
20620615:45 tight str "ok"
20720715:49 tight glyph )
20820815:50 tight glyph )
209−15:51 NEWLINE
209+16:1 NEWLINE
210+16:1 glyph ++
211+16:4 name hunt-first
212+16:15 glyph (
213+16:16 tight name hunt
214+16:21 glyph |=(
215+16:24 tight name p
216+16:25 tight glyph =
217+16:26 tight glyph [
218+16:27 tight aura @t
219+16:30 aura @t
220+16:32 tight glyph ]
221+16:34 lit %.y
222+16:37 tight glyph )
223+16:39 glyph `
224+16:40 tight str "a"
225+16:44 glyph `
226+16:45 tight str "b"
227+16:48 tight glyph )
228+17:1 NEWLINE
229+17:1 glyph ++
230+17:4 name hunt-second
231+17:16 glyph (
232+17:17 tight name hunt
233+17:22 glyph |=(
234+17:25 tight name p
235+17:26 tight glyph =
236+17:27 tight glyph [
237+17:28 tight aura @t
238+17:31 aura @t
239+17:33 tight glyph ]
240+17:35 lit %.n
241+17:38 tight glyph )
242+17:40 glyph `
243+17:41 tight str "a"
244+17:45 glyph `
245+17:46 tight str "b"
246+17:49 tight glyph )
247+18:1 NEWLINE
248+18:1 glyph ++
249+18:4 name hunt-left
250+18:14 glyph (
251+18:15 tight name hunt
252+18:20 glyph |=(
253+18:23 tight name p
254+18:24 tight glyph =
255+18:25 tight glyph [
256+18:26 tight aura @t
257+18:29 aura @t
258+18:31 tight glyph ]
259+18:33 lit %.y
260+18:36 tight glyph )
261+18:38 lit ~
262+18:40 glyph `
263+18:41 tight str "b"
264+18:44 tight glyph )
265+19:1 NEWLINE
266+19:1 glyph ++
267+19:4 name hunt-right
268+19:15 glyph (
269+19:16 tight name hunt
270+19:21 glyph |=(
271+19:24 tight name p
272+19:25 tight glyph =
273+19:26 tight glyph [
274+19:27 tight aura @t
275+19:30 aura @t
276+19:32 tight glyph ]
277+19:34 lit %.n
278+19:37 tight glyph )
279+19:39 glyph `
280+19:40 tight str "a"
281+19:44 lit ~
282+19:45 tight glyph )
283+20:1 NEWLINE
284+20:1 glyph ++
285+20:4 name hunt-bad
286+20:13 glyph (
287+20:14 tight name hunt
288+20:19 glyph |=(
289+20:22 tight name p
290+20:23 tight glyph =
291+20:24 tight glyph [
292+20:25 tight aura @t
293+20:28 aura @t
294+20:30 tight glyph ]
295+20:32 lit %.y
296+20:35 tight glyph )
297+20:37 glyph `
298+20:38 tight str "a"
299+20:42 glyph `
300+20:43 tight lit ~zod
301+20:47 tight glyph )
302+21:1 NEWLINE
303+21:1 glyph ++
304+21:4 name hunt-gate-bad
305+21:18 glyph (
306+21:19 tight name hunt
307+21:24 glyph |=(
308+21:27 tight name p
309+21:28 tight glyph =
310+21:29 tight glyph [
311+21:30 tight aura @t
312+21:33 aura @p
313+21:35 tight glyph ]
314+21:37 lit %.y
315+21:40 tight glyph )
316+21:42 glyph `
317+21:43 tight str "a"
318+21:47 glyph `
319+21:48 tight str "b"
320+21:51 tight glyph )
321+22:1 NEWLINE
322+22:1 glyph ++
323+22:4 name eq-cell
324+22:12 glyph (
325+22:13 tight name eq
326+22:16 glyph [
327+22:17 tight lit 1
328+22:19 str "a"
329+22:22 tight glyph ]
330+22:24 glyph [
331+22:25 tight lit 1
332+22:27 str "a"
333+22:30 tight glyph ]
334+22:31 tight glyph )
335+23:1 NEWLINE
336+23:1 glyph ++
337+23:4 name eq-gate
338+23:12 glyph (
339+23:13 tight name eq
340+23:16 name same
341+23:21 name same
342+23:25 tight glyph )
343+24:1 NEWLINE
344+24:1 glyph ++
345+24:4 name eq-nested-gate
346+24:19 glyph (
347+24:20 tight name eq
348+24:23 glyph [
349+24:24 tight lit 1
350+24:26 name same
351+24:30 tight glyph ]
352+24:32 glyph [
353+24:33 tight lit 1
354+24:35 name same
355+24:39 tight glyph ]
356+24:40 tight glyph )
357+25:1 NEWLINE
358+25:1 glyph ++
359+25:4 name eq-open
360+25:12 glyph |=
361+25:15 name x
362+25:16 tight glyph =
363+25:17 tight tvar A
364+25:19 glyph (
365+25:20 tight name eq
366+25:23 name x
367+25:25 name x
368+25:26 tight glyph )
369+26:1 NEWLINE
370+26:1 glyph ++
371+26:4 name mate-same
372+26:14 glyph (
373+26:15 tight name mate
374+26:20 glyph `
375+26:21 tight str "hi"
376+26:26 glyph `
377+26:27 tight str "hi"
378+26:31 tight glyph )
379+27:1 NEWLINE
380+27:1 glyph ++
381+27:4 name mate-left
382+27:14 glyph (
383+27:15 tight name mate
384+27:20 lit ~
385+27:22 glyph `
386+27:23 tight str "hi"
387+27:27 tight glyph )
388+28:1 NEWLINE
389+28:1 glyph ++
390+28:4 name mate-right
391+28:15 glyph (
392+28:16 tight name mate
393+28:21 glyph `
394+28:22 tight str "hi"
395+28:27 lit ~
396+28:28 tight glyph )
397+29:1 NEWLINE
398+29:1 glyph ++
399+29:4 name mate-crash
400+29:15 glyph (
401+29:16 tight name mate
402+29:21 glyph `
403+29:22 tight str "hi"
404+29:27 glyph `
405+29:28 tight str "there"
406+29:35 tight glyph )
407+30:1 NEWLINE
408+30:1 glyph ++
409+30:4 name mate-gate
410+30:14 glyph (
411+30:15 tight name mate
412+30:20 glyph `
413+30:21 tight name same
414+30:26 glyph `
415+30:27 tight name same
416+30:31 tight glyph )
417+31:1 NEWLINE
418+31:1 glyph ++
419+31:4 name mate-bad
420+31:13 glyph (
421+31:14 tight name mate
422+31:19 glyph `
423+31:20 tight str "hi"
424+31:25 glyph `
425+31:26 tight lit ~zod
426+31:30 tight glyph )
427+31:31 NEWLINE
tests/golden/types-prelude-unit-helpers/tree.txt+117−1
@@ -112,4 +112,120 @@
112112 (gate-wide 15:31
113113 (face 15:34 p
114114 (cell 15:36 (aura 15:37 @p) (aura 15:40 @t)))
115− (unit 15:44 (str 15:45 "ok")))))))
115+ (unit 15:44 (str 15:45 "ok"))))))
116+ (value 16:1 hunt-first
117+ (group 16:15
118+ (call 16:16
119+ (wing 16:16 hunt)
120+ (gate-wide 16:21
121+ (face 16:24 p
122+ (cell 16:26 (aura 16:27 @t) (aura 16:30 @t)))
123+ (lit 16:34 %.y))
124+ (unit 16:39 (str 16:40 "a"))
125+ (unit 16:44 (str 16:45 "b")))))
126+ (value 17:1 hunt-second
127+ (group 17:16
128+ (call 17:17
129+ (wing 17:17 hunt)
130+ (gate-wide 17:22
131+ (face 17:25 p
132+ (cell 17:27 (aura 17:28 @t) (aura 17:31 @t)))
133+ (lit 17:35 %.n))
134+ (unit 17:40 (str 17:41 "a"))
135+ (unit 17:45 (str 17:46 "b")))))
136+ (value 18:1 hunt-left
137+ (group 18:14
138+ (call 18:15
139+ (wing 18:15 hunt)
140+ (gate-wide 18:20
141+ (face 18:23 p
142+ (cell 18:25 (aura 18:26 @t) (aura 18:29 @t)))
143+ (lit 18:33 %.y))
144+ (lit 18:38 ~)
145+ (unit 18:40 (str 18:41 "b")))))
146+ (value 19:1 hunt-right
147+ (group 19:15
148+ (call 19:16
149+ (wing 19:16 hunt)
150+ (gate-wide 19:21
151+ (face 19:24 p
152+ (cell 19:26 (aura 19:27 @t) (aura 19:30 @t)))
153+ (lit 19:34 %.n))
154+ (unit 19:39 (str 19:40 "a"))
155+ (lit 19:44 ~))))
156+ (value 20:1 hunt-bad
157+ (group 20:13
158+ (call 20:14
159+ (wing 20:14 hunt)
160+ (gate-wide 20:19
161+ (face 20:22 p
162+ (cell 20:24 (aura 20:25 @t) (aura 20:28 @t)))
163+ (lit 20:32 %.y))
164+ (unit 20:37 (str 20:38 "a"))
165+ (unit 20:42 (lit 20:43 ~zod)))))
166+ (value 21:1 hunt-gate-bad
167+ (group 21:18
168+ (call 21:19
169+ (wing 21:19 hunt)
170+ (gate-wide 21:24
171+ (face 21:27 p
172+ (cell 21:29 (aura 21:30 @t) (aura 21:33 @p)))
173+ (lit 21:37 %.y))
174+ (unit 21:42 (str 21:43 "a"))
175+ (unit 21:47 (str 21:48 "b")))))
176+ (value 22:1 eq-cell
177+ (group 22:12
178+ (call 22:13
179+ (wing 22:13 eq)
180+ (tuple 22:16 (lit 22:17 1) (str 22:19 "a"))
181+ (tuple 22:24 (lit 22:25 1) (str 22:27 "a")))))
182+ (value 23:1 eq-gate
183+ (group 23:12
184+ (call 23:13 (wing 23:13 eq) (wing 23:16 same) (wing 23:21 same))))
185+ (value 24:1 eq-nested-gate
186+ (group 24:19
187+ (call 24:20
188+ (wing 24:20 eq)
189+ (tuple 24:23 (lit 24:24 1) (wing 24:26 same))
190+ (tuple 24:32 (lit 24:33 1) (wing 24:35 same)))))
191+ (value 25:1 eq-open
192+ (gate 25:12
193+ (face 25:15 x (tvar 25:17 A))
194+ (group 25:19
195+ (call 25:20 (wing 25:20 eq) (wing 25:23 x) (wing 25:25 x)))))
196+ (value 26:1 mate-same
197+ (group 26:14
198+ (call 26:15
199+ (wing 26:15 mate)
200+ (unit 26:20 (str 26:21 "hi"))
201+ (unit 26:26 (str 26:27 "hi")))))
202+ (value 27:1 mate-left
203+ (group 27:14
204+ (call 27:15
205+ (wing 27:15 mate)
206+ (lit 27:20 ~)
207+ (unit 27:22 (str 27:23 "hi")))))
208+ (value 28:1 mate-right
209+ (group 28:15
210+ (call 28:16
211+ (wing 28:16 mate)
212+ (unit 28:21 (str 28:22 "hi"))
213+ (lit 28:27 ~))))
214+ (value 29:1 mate-crash
215+ (group 29:15
216+ (call 29:16
217+ (wing 29:16 mate)
218+ (unit 29:21 (str 29:22 "hi"))
219+ (unit 29:27 (str 29:28 "there")))))
220+ (value 30:1 mate-gate
221+ (group 30:14
222+ (call 30:15
223+ (wing 30:15 mate)
224+ (unit 30:20 (wing 30:21 same))
225+ (unit 30:26 (wing 30:27 same)))))
226+ (value 31:1 mate-bad
227+ (group 31:13
228+ (call 31:14
229+ (wing 31:14 mate)
230+ (unit 31:19 (str 31:20 "hi"))
231+ (unit 31:25 (lit 31:26 ~zod))))))
tests/golden/types-prelude-unit-helpers/types.txt+52
@@ -24,3 +24,55 @@ partial inference; module not checked
2424++ clap-bad (clap `"hi" `~zod |=(p=[@t @t] "yes"))
2525 ^
2626++ clef-bad: call constraint is not supported by partial inference
27+++ hunt-first: (unit @t)
28+++ hunt-second: (unit @t)
29+++ hunt-left: (unit @t)
30+++ hunt-right: (unit @t)
31+++ hunt-bad: unit payload does not fit its expected type
32+/tests/golden/types-prelude-unit-helpers/source.jibb:20:14: expected unit payload has type @t
33+++ hunt-bad (hunt |=(p=[@t @t] %.y) `"a" `~zod)
34+ ^
35+/tests/golden/types-prelude-unit-helpers/source.jibb:20:43: payload has type @p
36+++ hunt-bad (hunt |=(p=[@t @t] %.y) `"a" `~zod)
37+ ^
38+++ hunt-gate-bad: call's sample and argument types do not unify
39+/tests/golden/types-prelude-unit-helpers/source.jibb:21:19: called gate
40+++ hunt-gate-bad (hunt |=(p=[@t @p] %.y) `"a" `"b")
41+ ^
42+/tests/golden/types-prelude-unit-helpers/source.jibb:21:24: argument has type $-([@t @p] ?)
43+++ hunt-gate-bad (hunt |=(p=[@t @p] %.y) `"a" `"b")
44+ ^
45+++ eq-cell: ?
46+++ eq-gate: call's sample and argument types do not unify
47+/tests/golden/types-prelude-unit-helpers/source.jibb:23:13: called gate has type $-([A A] ?) where A contains no gates
48+++ eq-gate (eq same same)
49+ ^
50+/tests/golden/types-prelude-unit-helpers/source.jibb:23:16: argument has type $-(A A)
51+++ eq-gate (eq same same)
52+ ^
53+++ eq-nested-gate: call's sample and argument types do not unify
54+/tests/golden/types-prelude-unit-helpers/source.jibb:24:20: called gate has type $-([A A] ?) where A contains no gates
55+++ eq-nested-gate (eq [1 same] [1 same])
56+ ^
57+/tests/golden/types-prelude-unit-helpers/source.jibb:24:23: argument
58+++ eq-nested-gate (eq [1 same] [1 same])
59+ ^
60+++ eq-open: $-(A ?) where A contains no gates
61+++ mate-same: (unit @t)
62+++ mate-left: (unit @t)
63+++ mate-right: (unit @t)
64+++ mate-crash: (unit @t)
65+++ mate-gate: unit payload does not fit its expected type
66+/tests/golden/types-prelude-unit-helpers/source.jibb:30:15: expected unit payload
67+++ mate-gate (mate `same `same)
68+ ^
69+/tests/golden/types-prelude-unit-helpers/source.jibb:30:21: payload has type $-(A A)
70+++ mate-gate (mate `same `same)
71+ ^
72+++ mate-bad: unit payload does not fit its expected type
73+/tests/golden/types-prelude-unit-helpers/source.jibb:31:14: expected unit payload has type @t
74+++ mate-bad (mate `"hi" `~zod)
75+ ^
76+/tests/golden/types-prelude-unit-helpers/source.jibb:31:26: payload has type @p
77+++ mate-bad (mate `"hi" `~zod)
78+ ^
tests/lib/jibb-doc-examples.hoonnew file+166
@@ -0,0 +1,166 @@
1+:: Full checking for doc fragments in their intended module/prelude contexts.
2+/+ jibb, jibb-import
3+/* prelude %jibb /lib/jibb/prelude/jibb
4+/* internal %jibb /lib/jibb/internal/jibb
5+/* imports %jibb /tests/golden/doc-grammar-01-imports/source/jibb
6+/* view-day %jibb /tests/golden/doc-grammar-03-view-day/source/jibb
7+/* step %jibb /tests/golden/doc-grammar-04-step/source/jibb
8+/* cmd-sub %jibb /tests/golden/doc-overview-01-cmd-sub/source/jibb
9+/* todo-sur %txt /tests/type-api-paths/todo-sur/txt
10+/* todo-action %txt /tests/type-api-paths/todo-action/txt
11+/* blog-sur %txt /tests/type-page-main/blog-sur/txt
12+/* card %txt /tests/type-page-main/card/txt
13+|%
14+++ text
15+ |= lines=wain
16+ ^- @t
17+ (rap 3 (turn lines |=(line=@t (cat 3 line '\0a'))))
18+::
19+++ doc-detailed
20+ |= [at=path src=@t externals=iexternals:jibb marks=imark-externals:jibb modules=jbundle:jibb prepared=iprelude:jibb]
21+ ^- jfile-detailed-result:jibb
22+ (infer-jibb-file-detailed:jibb at src externals marks modules ~[at] values.prepared molds.prepared ~ `iface.prepared)
23+::
24+++ doc-legacy
25+ |= [at=path src=@t externals=iexternals:jibb marks=imark-externals:jibb modules=jbundle:jibb prepared=iprelude:jibb]
26+ ^- jfile-result:jibb
27+ (infer-jibb-file:jibb at src externals marks modules ~[at] values.prepared molds.prepared ~ `iface.prepared)
28+::
29+++ doc-reader-inputs
30+ |= [sur=@t action=@t blog=@t]
31+ ^- [marks=imark-externals:jibb externals=iexternals:jibb]
32+ =/ todo=type -:(ride -:!>(..zuse) sur)
33+ =/ todo-subject=type [%cell [%face %todo todo] -:!>(..zuse)]
34+ =/ action-result=* (read-mark:jibb-import %todo-action -:(ride todo-subject action))
35+ =/ item-input=* (read-named:jibb-import %todo %item todo)
36+ =/ posts=type -:(ride -:!>(..zuse) blog)
37+ =/ post-input=* (read-named:jibb-import %blog %post posts)
38+ :_ ~[[%todo %item item-input] [%blog %post post-input]]
39+ ~[[%todo-action action-result]]
40+::
41+++ doc-value-errors
42+ |= [label=tape name=term expected=@t checked=ifile:jibb]
43+ ^- (list tape)
44+ =/ value=(unit ischeme:jibb) (ienv-lookup:jibb name values.checked)
45+ ?~ value ~[(weld label ": value is missing")]
46+ =/ printed=itype:jibb (canonical-itype:jibb typ.u.value vars.u.value)
47+ =/ actual=@t (crip (show-itype:jibb printed ~))
48+ ?. =(actual expected) ~[(weld label (weld ": type was " (trip actual)))]
49+ ~
50+::
51+++ doc-positive
52+ |= [label=tape at=path src=@t name=term expected=@t prepared=iprelude:jibb]
53+ ^- (list tape)
54+ =/ detailed=jfile-detailed-result:jibb (doc-detailed at src ~ ~ ~ prepared)
55+ ?: ?=(%| -.detailed) ~[(weld label (weld ": detailed rejected: " (trip message.p.detailed)))]
56+ =/ legacy=jfile-result:jibb (doc-legacy at src ~ ~ ~ prepared)
57+ ?: ?=(%| -.legacy) ~[(weld label (weld ": legacy rejected: " (trip p.legacy)))]
58+ =/ failures=(list tape)
59+ (doc-value-errors (weld label ": detailed") name expected iface.p.detailed)
60+ =? failures !=(values.iface.p.detailed values.iface.p.legacy)
61+ [(weld label ": detailed and legacy values differ") failures]
62+ =? failures !=(molds.iface.p.detailed molds.iface.p.legacy)
63+ [(weld label ": detailed and legacy molds differ") failures]
64+ (weld failures (doc-value-errors (weld label ": legacy") name expected iface.p.legacy))
65+::
66+++ doc-cmd-prelude
67+ |= prepared=iprelude:jibb
68+ ^- iprelude:jibb
69+ =/ excluded=(list term) ~[%cmd %sub]
70+ =/ kept=imold-types:jibb
71+ (skim molds.iface.prepared |=(m=[name=term template=ischeme:jibb] !(lien excluded |=(n=term =(n name.m)))))
72+ =/ names=(list term)
73+ (skim molds.prepared |=(n=term !(lien excluded |=(x=term =(x n)))))
74+ [iface.prepared(molds kept) values.prepared names]
75+::
76+++ doc-cmd-interface-errors
77+ |= [label=tape checked=ifile:jibb original=ifile:jibb]
78+ ^- (list tape)
79+ =/ failures=(list tape) ~
80+ =/ names=(list term) ~[%cmd %sub]
81+ |-
82+ ?~ names failures
83+ =/ actual=(unit ischeme:jibb) (find-jibb-mold:jibb i.names checked)
84+ =/ expected=(unit ischeme:jibb) (find-jibb-mold:jibb i.names original)
85+ ?~ actual $(names t.names, failures [(weld label ": mold is missing") failures])
86+ ?~ expected $(names t.names, failures [(weld label ": canonical mold is missing") failures])
87+ =/ actual-type=itype:jibb (canonical-itype:jibb typ.u.actual vars.u.actual)
88+ =/ expected-type=itype:jibb (canonical-itype:jibb typ.u.expected vars.u.expected)
89+ =/ shown=@t (crip (show-itype:jibb actual-type ~))
90+ =/ expected-shown=@t (crip (show-itype:jibb expected-type ~))
91+ ?. =(shown expected-shown)
92+ $(names t.names, failures [(weld label (weld ": mold scheme was " (trip shown))) failures])
93+ $(names t.names)
94+::
95+++ doc-cmd-errors
96+ |= [src=@t prepared=iprelude:jibb]
97+ ^- (list tape)
98+ =/ at=path /lib/jibb/prelude/jibb
99+ =/ reduced=iprelude:jibb (doc-cmd-prelude prepared)
100+ =/ detailed=jfile-detailed-result:jibb (doc-detailed at src ~ ~ ~ reduced)
101+ ?: ?=(%| -.detailed) ~[(weld "cmd/sub detailed rejected: " (trip message.p.detailed))]
102+ =/ legacy=jfile-result:jibb (doc-legacy at src ~ ~ ~ reduced)
103+ ?: ?=(%| -.legacy) ~[(weld "cmd/sub legacy rejected: " (trip p.legacy))]
104+ =/ failures=(list tape)
105+ (doc-cmd-interface-errors "cmd/sub detailed" iface.p.detailed iface.prepared)
106+ =? failures !=(molds.iface.p.detailed molds.iface.p.legacy)
107+ ["cmd/sub detailed and legacy molds differ" failures]
108+ (weld failures (doc-cmd-interface-errors "cmd/sub legacy" iface.p.legacy iface.prepared))
109+::
110+++ doc-import-errors
111+ |= [src=@t sur=@t action=@t blog=@t card-source=@t prepared=iprelude:jibb]
112+ ^- (list tape)
113+ =/ at=path /ui/imports/jibb
114+ =/ inputs=[marks=imark-externals:jibb externals=iexternals:jibb]
115+ (doc-reader-inputs sur action blog)
116+ =/ modules=jbundle:jibb ~[[/ui/components/card/jibb card-source]]
117+ =/ detailed=jfile-detailed-result:jibb
118+ (doc-detailed at src externals.inputs marks.inputs modules prepared)
119+ ?: ?=(%| -.detailed) ~[(weld "imports detailed rejected: " (trip message.p.detailed))]
120+ =/ legacy=jfile-result:jibb
121+ (doc-legacy at src externals.inputs marks.inputs modules prepared)
122+ ?: ?=(%| -.legacy) ~[(weld "imports legacy rejected: " (trip p.legacy))]
123+ =/ use-source=@t
124+ %+ rap 3
125+ :~ src
126+ '++ use-item |= i=item.todo i\0a'
127+ '++ use-action |= a=todo-action a\0a'
128+ '++ use-card card.card\0a'
129+ ==
130+ =/ used=jfile-detailed-result:jibb
131+ (doc-detailed at use-source externals.inputs marks.inputs modules prepared)
132+ ?: ?=(%| -.used) ~[(weld "import consumers rejected: " (trip message.p.used))]
133+ =/ used-legacy=jfile-result:jibb
134+ (doc-legacy at use-source externals.inputs marks.inputs modules prepared)
135+ ?: ?=(%| -.used-legacy) ~[(weld "legacy import consumers rejected: " (trip p.used-legacy))]
136+ =/ failures=(list tape) ~
137+ =/ missing-module=jfile-detailed-result:jibb
138+ (doc-detailed at use-source externals.inputs marks.inputs ~ prepared)
139+ =? failures ?=(%& -.missing-module) ["imports accepted a missing Jibb module" failures]
140+ =/ missing-mark=jfile-detailed-result:jibb
141+ (doc-detailed at use-source externals.inputs ~ modules prepared)
142+ =? failures ?=(%& -.missing-mark) ["imports accepted a missing mark" failures]
143+ =/ missing-sur=jfile-detailed-result:jibb
144+ (doc-detailed at use-source ~ marks.inputs modules prepared)
145+ =? failures ?=(%& -.missing-sur) ["imports accepted missing /sur molds" failures]
146+ failures
147+::
148+++ doc-examples-errors
149+ |= [public=@t private=@t import-source=@t view-source=@t step-source=@t cmd-source=@t sur=@t action=@t blog=@t card-source=@t]
150+ ^- (list tape)
151+ =/ prepared=(unit iprelude:jibb)
152+ (prepare-prelude-with-internal:jibb public private)
153+ ?~ prepared ~["doc-example prelude did not prepare"]
154+ ;: weld
155+ (doc-positive "view-day" /ui/view-day/jibb view-source %view '$-([day=@da n=@ud] (element A))' u.prepared)
156+ (doc-positive "step" /ui/step/jibb step-source %describe '$-(step @t)' u.prepared)
157+ (doc-cmd-errors cmd-source u.prepared)
158+ (doc-import-errors import-source sur action blog card-source u.prepared)
159+ ==
160+::
161+++ test-doc-examples
162+ ^- tang
163+ =/ failures=(list tape)
164+ (doc-examples-errors prelude internal imports view-day step cmd-sub (text todo-sur) (text todo-action) (text blog-sur) (text card))
165+ (turn failures |=(reason=tape leaf+reason))
166+--
tests/lib/jibb-gate-free-guards.hoon+64
@@ -18,6 +18,7 @@
1818 ['flag' flag 8 %yes]
1919 ['atom variable' [%avar 0] 8 %yes]
2020 ['open variable' var 8 %unknown]
21+ ['gate-free variable' [%fvar 0] 8 %yes]
2122 ['noun' noun 8 %unknown]
2223 ['raw gate' gate 8 %no]
2324 ['data item' item 30 %yes]
@@ -59,6 +60,54 @@
5960 =? errors !=(path.b `~[[%item ~]]) ['list path incorrect' errors]
6061 =/ c=igate-free:jibb (gate-free-type:jibb model 100 ~)
6162 =? errors ?=(^ path.c) ['gate-free result carries witness path' errors]
63+ =/ scheme=ischeme:jibb [[%fn [%fvar 40] [%fvar 40]] ~[40]]
64+ =/ initial=istate:jibb *istate:jibb
65+ =/ instantiated=[typ=itype:jibb state=istate:jibb]
66+ (instantiate-scheme:jibb scheme initial(next 50))
67+ =? errors !=(typ.instantiated [%fn [%fvar 50] [%fvar 50]])
68+ ['instantiation lost the gate-free constraint' errors]
69+ =? errors !=(next.state.instantiated 51)
70+ ['gate-free instantiation did not advance the fresh counter' errors]
71+ =? errors !(lien binders.state.instantiated |=(n=@ud =(n 50)))
72+ ['gate-free instantiation lost binder provenance' errors]
73+ =/ keyed=(unit [types=(list itype:jibb) sub=isub:jibb])
74+ (itype-collection-keys:jibb %map ~[[%var 60] gate] ~)
75+ =/ expected-keys=(list itype:jibb) ~[[%fvar 60] gate]
76+ =/ expected-key-sub=isub:jibb ~[[60 [%fvar 60]]]
77+ =? errors !=(keyed [~ [expected-keys expected-key-sub]])
78+ ['map key constraint or independent value changed' errors]
79+ =/ set-key=(unit [types=(list itype:jibb) sub=isub:jibb])
80+ (itype-collection-keys:jibb %set ~[[%cell [%var 61] [%var 62]]] ~)
81+ =/ expected-set=(list itype:jibb) ~[[%cell [%fvar 61] [%fvar 62]]]
82+ =/ expected-set-sub=isub:jibb ~[[62 [%fvar 62]] [61 [%fvar 61]]]
83+ =? errors !=(set-key [~ [expected-set expected-set-sub]])
84+ ['nested set key variables were not constrained' errors]
85+ =? errors ?=(^ (itype-collection-keys:jibb %map ~[gate atom] ~))
86+ ['a gate-bearing map key was accepted' errors]
87+ =? errors ?=(^ (itype-collection-keys:jibb %set ~[[%cell atom gate]] ~))
88+ ['a nested gate-bearing set key was accepted' errors]
89+ =? errors ?=(^ (itype-collection-keys:jibb %map ~[[%var 63] atom] ~[[63 gate]]))
90+ ['an existing gate substitution bypassed a map key' errors]
91+ =? errors ?=(^ (itype-unify:jibb [%var 60] gate expected-key-sub))
92+ ['a later gate substitution bypassed a map key' errors]
93+ =/ map-template=ischeme:jibb
94+ [[%collection %map ~[[%fvar 70] [%var 71]]] ~[70 71]]
95+ =? errors ?=(^ (template-apply:jibb map-template ~[gate atom]))
96+ ['template application accepted a gate map key' errors]
97+ =/ applied=(unit itype:jibb)
98+ (template-apply:jibb map-template ~[[%var 72] gate])
99+ =/ expected-applied=itype:jibb
100+ [%collection %map ~[[%fvar 72] gate]]
101+ =? errors !=(applied [~ expected-applied])
102+ ['template application lost key constraint or changed value' errors]
103+ =/ existing-sub=isub:jibb ~[[72 gate]]
104+ =? errors ?=(^ (template-apply-sub:jibb map-template ~[[%var 72] atom] existing-sub))
105+ ['an existing gate substitution bypassed template validation' errors]
106+ =/ applied-sub=(unit [typ=itype:jibb sub=isub:jibb])
107+ (template-apply-sub:jibb map-template ~[[%var 72] gate] ~)
108+ =/ expected-applied-sub=isub:jibb ~[[72 [%fvar 72]]]
109+ =? errors !=(applied-sub [~ [expected-applied expected-applied-sub]])
110+ ['template application did not retain the key substitution' errors]
62111 :: The explicit budget is shared across the entire normalized type.
63112 =/ deep
64113 |= depth=@ud
@@ -71,6 +120,21 @@
71120 =/ exceeds=igate-free:jibb (gate-free-type:jibb (deep 256) 256 ~)
72121 =? errors !=(%yes verdict.fits) ['256 node budget rejected exact fit' errors]
73122 =? errors !=(%unknown verdict.exceeds) ['257 node budget did not fail closed' errors]
123+ =/ formed-fit=(unit igf-form:jibb) (itype-gate-free-form:jibb (deep 255) ~ 256)
124+ =/ formed-exceeds=(unit igf-form:jibb) (itype-gate-free-form:jibb (deep 256) ~ 256)
125+ =? errors ?=(~ formed-fit) ['256 node constraint rejected exact fit' errors]
126+ =? errors ?=(^ formed-exceeds) ['257 node constraint did not fail closed' errors]
127+ =/ deep-free
128+ |= depth=@ud
129+ ^- itype:jibb
130+ =/ out=itype:jibb [%fvar 0]
131+ |-
132+ ?: =(0 depth) out
133+ $(depth (dec depth), out [%face %nested out])
134+ =? errors !(itype-var-is-gate-free:jibb 0 (deep-free 255))
135+ ['256 node variable scan rejected exact fit' errors]
136+ =? errors !(itype-var-is-gate-free:jibb 0 (deep-free 256))
137+ ['257 node variable scan dropped the constraint' errors]
74138 =/ errors (skim errors |=(x=@t !=(x '')))
75139 (turn errors trip)
76140++ test-gate-free-guards
tools/type-doc-examples-testnew file+49
@@ -0,0 +1,49 @@
1+#!/usr/bin/env python3
2+"""Fully check the remaining doc fragments in their intended contexts."""
3+from pathlib import Path
4+import argparse
5+import subprocess
6+import sys
7+import tempfile
8+
9+root = Path(__file__).resolve().parent.parent
10+parser = argparse.ArgumentParser(description=__doc__)
11+parser.add_argument('--lib', default=str(root / 'jibb-dev/lib/jibb.hoon'))
12+parser.add_argument('--timeout', type=float, default=300,
13+ help='seconds allowed for urbit eval (default: 300)')
14+args = parser.parse_args()
15+tests = (root / 'tests/lib/jibb-doc-examples.hoon').read_text()
16+tests = tests[tests.index('\n|%\n') + 1:]
17+tests = tests[:tests.index('\n++ test-doc-examples')] + '\n--\n'
18+program = ('=/ jibb .\n=/ jibb-import\n' +
19+ (root / 'jibb-dev/lib/jibb-import.hoon').read_text() +
20+ '=/ suite\n' + tests +
21+ '\n=/ failures=(list tape) (doc-examples-errors:suite prelude internal imports view-day step cmd-sub todo-sur todo-action blog-sur card)\n'
22+ '^- @t\n?~ failures \'documented fragments passed\'\n'
23+ '(of-wain:format (turn failures crip))\n')
24+fixtures = {
25+ 'prelude': 'jibb-dev/lib/jibb/prelude.jibb',
26+ 'internal': 'jibb-dev/lib/jibb/internal.jibb',
27+ 'imports': 'tests/golden/doc-grammar-01-imports/source.jibb',
28+ 'view-day': 'tests/golden/doc-grammar-03-view-day/source.jibb',
29+ 'step': 'tests/golden/doc-grammar-04-step/source.jibb',
30+ 'cmd-sub': 'tests/golden/doc-overview-01-cmd-sub/source.jibb',
31+ 'todo-sur': 'tests/type-api-paths/todo-sur.txt',
32+ 'todo-action': 'tests/type-api-paths/todo-action.txt',
33+ 'blog-sur': 'tests/type-page-main/blog-sur.txt',
34+ 'card': 'tests/type-page-main/card.txt',
35+}
36+with tempfile.TemporaryDirectory(prefix='jibb-doc-examples-') as tmp:
37+ path = Path(tmp) / 'doc-examples.hoon'
38+ path.write_text(program)
39+ command = [str(root / 'tools/hoon'), '--lib', args.lib, '--raw', '-f', str(path),
40+ '--timeout', str(args.timeout)]
41+ for name, filename in fixtures.items():
42+ command += ['--cord', name + '=' + str(root / filename)]
43+ result = subprocess.run(command, stdout=subprocess.PIPE)
44+if result.returncode:
45+ sys.exit(result.returncode)
46+if result.stdout != b'documented fragments passed\n':
47+ sys.stderr.buffer.write(result.stdout)
48+ sys.exit(1)
49+print('documented imports, view-day, step and cmd/sub detailed/legacy checks passed')