on master help sign in
Restore raw-poke command helpers

Keep store poke actions as ordinary molds and derive API/store helpers that take an action and reply and return commands directly. Validate the canonical raw-poke, cmd, and unit shapes, migrate the app and fixtures, and preserve closed initializer recovery.

commitfb6373f6ceae12bae3871286211fc12f92b7de6b authoriko <mail@iko.soy> dateMon 2 Nov 2026, 10:36 (3 hours ago) parent2d74861
96 files changed+560−536
docs/compiler.md+3−3 docs/development.md+1−1 docs/prompts/milestone-2.md+5−5 docs/spec/core-language.md+2−2 docs/spec/decisions.md+4−4 docs/spec/grammar.md+9−10 docs/spec/overview.md+6−6 docs/status.md+4−4 jibb-dev/lib/jibb.hoon+85−74 jibb-dev/lib/jibb/internal.jibb+1−1 jibb-dev/lib/jibb/prelude.jibb+2−2 my-app/ui/basket.jibb+2−2 my-app/ui/stores/cart.jibb+2−3 my-app/ui/todo-list.jibb+2−2 tests/golden/doc-core-02-update/source.jibb+2−2 tests/golden/doc-core-02-update/tokens.txt+22−28 tests/golden/doc-core-02-update/tree.txt+10−14 tests/golden/doc-grammar-06-cart-store/source.jibb+2−3 tests/golden/doc-grammar-06-cart-store/tokens.txt+56−60 tests/golden/doc-grammar-06-cart-store/tree.txt+25−26 tests/golden/doc-grammar-06-cart-store/types.txt+5−1 tests/golden/doc-grammar-07-basket/source.jibb+2−2 tests/golden/doc-grammar-07-basket/tokens.txt+19−25 tests/golden/doc-grammar-07-basket/tree.txt+7−12 tests/golden/doc-overview-01-cmd-sub/source.jibb+1−1 tests/golden/doc-overview-01-cmd-sub/tokens.txt+11−11 tests/golden/doc-overview-01-cmd-sub/tree.txt+5−5 tests/golden/doc-overview-10-todo-list/source.jibb+2−2 tests/golden/doc-overview-10-todo-list/tokens.txt+22−28 tests/golden/doc-overview-10-todo-list/tree.txt+10−14 tests/golden/inline-mold-opaque/about.txt+1−1 tests/golden/inline-mold-opaque/source.jibb+1−1 tests/golden/inline-mold-opaque/tokens.txt+1−1 tests/golden/inline-mold-opaque/tree.txt+1−1 tests/golden/inline-namespaces/about.txt+1−1 tests/golden/inline-namespaces/source.jibb+1−1 tests/golden/inline-namespaces/tokens.txt+1−1 tests/golden/inline-namespaces/tree.txt+1−1 tests/golden/inline-requests/about.txt+2−2 tests/golden/inline-requests/source.jibb+1−1 tests/golden/inline-requests/tokens.txt+7−6 tests/golden/inline-requests/tree.txt+3−2 tests/golden/prelude-unit-list-transforms/source.jibb+2−2 tests/golden/prelude-unit-list-transforms/tokens.txt+13−13 tests/golden/prelude-unit-list-transforms/tree.txt+6−6 tests/golden/prelude-unit-list-transforms/types.txt+1−1 tests/golden/types-arithmetic-module/types.txt+1−1 tests/golden/types-generic-face-inference/types.txt+7−1 tests/golden/types-hole-numeric-capture/types.txt+10−4 tests/golden/types-prelude-ask/about.txt+1−1 tests/golden/types-prelude-cmd/source.jibb+2−2 tests/golden/types-prelude-cmd/tokens.txt+2−2 tests/golden/types-prelude-cmd/tree.txt+2−2 tests/golden/types-prelude-cmd/types.txt+1−1 tests/golden/types-record-cast-context/types.txt+1−1 tests/golden/types-scope-library-poke/types.txt+2−1 tests/golden/types-scope-root-api/types.txt+1−1 tests/golden/types-union-polymorphic-identity/types.txt+1−1 tests/lib/jibb-deferred.hoon+1−1 tests/lib/jibb-generic-construction.hoon+1−1 tests/lib/jibb-generic-pattern.hoon+1−1 tests/lib/jibb-poke-bridge.hoon+2−2 tests/lib/jibb-program-init.hoon+15−9 tests/lib/jibb-program-update.hoon+3−2 tests/lib/jibb-store.hoon+48−24 tests/lib/jibb-todo-api.hoon+1−1 tests/lib/jibb-union-source.hoon+1−1 tests/lib/jibb.hoon+2−1 tests/type-api-paths/poke-clash.txt+2 tests/type-gate-free/todo-gate.txt+2−2 tests/type-gate-free/todo-noun.txt+2−2 tests/type-gate-free/todo.txt+2−2 tests/type-page-main/todo-island.txt+2−2 tests/type-poke/about.txt+2−2 tests/type-poke/alias.txt+1−1 tests/type-poke/client.txt+13−13 tests/type-poke/direct.txt+1−1 tests/type-poke/expected.txt+21−21 tests/type-poke/exported.txt+4−4 tests/type-poke/inner.txt+1−1 tests/type-poke/public.txt+1−1 tests/type-poke/transitive.txt+1−1 tests/type-store/basket.txt+2−2 tests/type-store/cart.txt+2−3 tests/type-todo-api/expected.txt+1−1 tests/type-todo-api/negative-expected.txt+4−4 tests/type-todo-api/negative.txt+1−1 tests/type-todo-api/source.txt+1−1 tests/type-todo-full/alias.txt+2−2 tests/type-todo-full/ambiguous-mapper.txt+2−2 tests/type-todo-full/non-gate-view.txt+2−2 tests/type-todo-full/open-key.txt+2−2 tests/type-todo-full/wrong-message.txt+2−2 tests/type-todo-full/wrong-model.txt+2−2 tests/type-todo-full/wrong-result.txt+2−2 tests/type-todo-full/wrong-watch.txt+2−2
docs/compiler.md+3−3
@@ -120,7 +120,7 @@ For a unique supported declaration, `+api-request-parts` retains that evidence w
120120
121121`+api-support-analysis-source` additionally infers supported ordinary API molds and values, resolves every declared mark, and retains their source, dependency and path evidence. Unsupported helpers or marks fail closed. An unused `/-` core is not independently validated, ordinary definitions that need derived gates remain unsupported, and this result is not a checked API interface or an exported request.
122122
123−The ordinary import resolver can infer derived request-gate types for multiple supported API paths. A case may take one typed path parameter before its reply gate, or one diff fold after the reply; a case with both, multiple parameters or diffs, or a separate scry path remains unsupported. Each reply maps the full mark type to a fresh `M` and the request result is `(ask M)`. Checked ordinary API values and molds, declared mark molds and a supported poke constructor are exported too. Every selected `/sur` core must have a directly used, successfully read mold; unselected core bindings are not independently validated, and Jibb module imports remain unsupported in this API fragment. The unchanged todo API fits this fragment.
123+The ordinary import resolver can infer derived request-gate types for multiple supported API paths. A case may take one typed path parameter before its reply gate, or one diff fold after the reply; a case with both, multiple parameters or diffs, or a separate scry path remains unsupported. Each reply maps the full mark type to a fresh `M` and the request result is `(ask M)`. Checked ordinary API values and molds, declared mark molds and a supported generic poke command helper are exported too. Every selected `/sur` core must have a directly used, successfully read mold; unselected core bindings are not independently validated, and Jibb module imports remain unsupported in this API fragment. The unchanged todo API fits this fragment.
124124
125125A call whose direct result is a known named generic union can receive a matching same-origin, same-arity result context before its arguments are inferred. This retains the ordered generic arguments and existing capital checks; pending tags, recursive or variable-bound origins and unrestricted atom cases remain conservative. Constructor fitting reports unsupported when an unresolved or opaque case could contain the requested tagged head. It keeps definite missing-case errors for proven nonmatching cases, including an explicitly atom-only faced head. The real todo callback `|=%got` can infer when an `(ask msg)` result context fixes its message union; the uncontextualized call remains unsupported.
126126
@@ -132,9 +132,9 @@ A full ordinary module may export a narrow checked program `main` only as a dire
132132
133133The same post-inference, post-request-graph kind boundary accepts a static `main` by instantiating its ordinary scheme, fitting it to canonical `(element !!)`, requiring the specialized result closed, and publishing that closed canonical scheme. Thus `main view` works when `view` is generic only in its element message. A data page must instead be a direct `(page load view)` call with simple wing arguments and a closed main type invariant against the instantiated canonical `page` mold. Its named load must be a direct gate whose transparent body is exactly `case.face reply`, with a simple wing or direct constructor reply. Page loads and direct program watches share the exact plain derived-member/request-evidence check: unique evidence in the selected interface's own graph, matching API source and inner case name, no typed path segments, diffs or scry. Page aliases, indirect or hand-built/pure/unknown requests, other main types and store paths fail closed. These are interface checks only, not rendering or runtime request claims.
134134
135−A store `main` is recognized only as a direct, unqualified `(store init update)` call with two simple wing arguments, modulo grouping, independently of its directory. Its module must declare exactly one ordinary `state` mold and one `+$ poke` whose body is one unqualified reference to a local ordinary action mold. The declaration is removed before ordinary mold/value inference and is not exported. `+store-main-closed` checks the canonical closed store main, exact init/state equality, and an invariant `$-([action state] state)` update after erasing only the two outer binder faces. It deliberately performs no gate-free-state check. The direct form can recover a missing main from checked components; aliases and hand-built records cannot.
135+A store `main` is recognized only as a direct, unqualified `(store init update)` call with two simple wing arguments, modulo grouping, independently of its directory. Its module must declare exactly one ordinary `state` mold and one ordinary, nongeneric local `+$ poke` action mold. Both remain in ordinary mold/value inference and are exported. `+store-main-closed` checks the canonical closed store main, exact init/state equality, and an invariant `$-([action state] state)` update after erasing only the two outer binder faces. It deliberately performs no gate-free-state check. The direct form can recover a missing main from checked components; aliases and hand-built records cannot.
136136
137−The store interface adds a derived `$-(action poke)` constructor and a generic `$-($-(state M) (ask M))` state request after validating the exact internal `poke` and `ask` representations. Derived names must not collide with values, imports or other derived names. Store request certificates are distinct from API certificates and retain the exact store path, source, state and action identities across graph merges. `+derived-store-request-member` requires the selected interface's unique state member and action constructor to match freshly derived canonical schemes and the same certificate to occur in both interface and consumer graphs. Store state is watchable by definition only after those checks; page loads continue to accept API evidence alone. Multi-action declarations, lowering and execution are outside this slice.
137+The store interface adds a derived `$-([action $-((unit @t) M)] (cmd M))` poke helper and a generic `$-($-(state M) (ask M))` state request after validating the exact internal `raw-poke`, canonical `cmd`, standard `unit` and `ask` representations. Derived names must not collide with values, imports or other derived names. Store request certificates are distinct from API certificates and retain the exact store path, source, state and action identities across graph merges. `+derived-store-request-member` requires the selected interface's unique state member and action constructor to match freshly derived canonical schemes and the same certificate to occur in both interface and consumer graphs. Store state is watchable by definition only after those checks; page loads continue to accept API evidence alone. Multi-action declarations, lowering and execution are outside this slice.
138138
139139When only that program's initializer and `main` are unresolved, a bounded transactional retry can derive the initializer's expected gate from the resolved update, view and subscription components. It instantiates all schemes above the greatest variable ID in the module and prelude, reuses the source-backed positional fit and stable replay, and leaves only the initializer's data variable open. The named initializer must be a direct gate whose transparent body is a tuple ending in null. Its own sample fixes data; ordinary inference, product and whole-gate fits, pending-tag and finalization checks, and a fresh ordinary `main` inference must all succeed before the ordinary kind and graph checks publish anything. Aliases, non-main libraries, simultaneous unresolved subscriptions, nonempty subscriptions and unrelated pending tags decline.
140140
docs/development.md+1−1
@@ -98,7 +98,7 @@ git clone https://github.com/urbit/tools /root/src/tools
9898| `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 |
9999| `tools/type-program-update-test` | Checks transactional direct-program update result recovery, union/boolean context, exact exported/imported types and fail-closed boundaries under eval and on the ship |
100100| `tools/type-program-watch-test` | Checks direct singleton request-value watchability against merged real-todo evidence, exact types/imports and rejection boundaries under eval and on the ship |
101−| `tools/type-store-test` | Checks the unchanged cart/basket through detailed and legacy inference, exact store/derived schemes, structural imports, source-bound state watch evidence and rejection guards under eval and on the ship |
101+| `tools/type-store-test` | Checks the unchanged cart/basket through detailed and legacy inference, exact store/derived schemes, malformed-prelude guards, structural imports, source-bound state watch evidence and rejection guards under eval and on the ship |
102102| `tools/type-todo-full-test` | Fully checks the byte-identical todo island through real readers, exact main type, structural downstream import and rejection controls under eval and on the ship |
103103| `tools/type-closed-gate-guards-test` | Checks closed gate sample labels and face uncertainty under eval and on the ship |
104104| `tools/type-constructor-fit-guards-test` | Checks constructor-case uncertainty and known mismatches under eval and on the ship |
docs/prompts/milestone-2.md+5−5
@@ -49,7 +49,7 @@ And from the plan's Risks:
4949
5050## First steps
5151
52−1. **Specify the prelude inventory.** The checker needs the prelude's complete exported inventory and signatures; include all names from the listed Hoon library sections except explicitly excluded groups, as `docs/open-questions.md` question 3 records. The prelude imports private helpers and low-level primitives from a separate internal module without exposing them; its public foundational gates are implemented in Jibb on those primitives. The source-backed internal module defines `poke`, `ask` and `qath`; the public prelude re-exports them as ordinary transparent types that modules can construct and inspect, as questions 24 and 25 record. Their current representations and partial checker support are described in `docs/compiler.md`.
52+1. **Specify the prelude inventory.** The checker needs the prelude's complete exported inventory and signatures; include all names from the listed Hoon library sections except explicitly excluded groups, as `docs/open-questions.md` question 3 records. The prelude imports private helpers and low-level primitives from a separate internal module without exposing them; its public foundational gates are implemented in Jibb on those primitives. The source-backed internal module defines `raw-poke`, `ask` and `qath`; the public prelude re-exports them as ordinary transparent types that modules can construct and inspect, as questions 24 and 25 record. Their current representations and partial checker support are described in `docs/compiler.md`.
5353
5454 The plan's three core-language rules were adopted: gate-free `eq` arguments and map and set keys, with gates opaque for union matching; jetted prelude functions taking gates; and rejection of a non-gate value that depends on itself even through a gate.
55552. **Start the importer early**, as the plan's Risks ask: first on a small `/sur` file, then on Tlon's. "Suggested design" below has a way in.
@@ -70,7 +70,7 @@ The rules are scattered across the tabs. This is a map of them, not a replacemen
7070- Generic molds: `+$ result |$ [V E]` with cases below, applied as `(result V E)`; `|$` goes right after a `+$`'s name, and the prelude's `cmd` and `sub` use `|$ [M]`.
7171- `!!` is the empty mold, and as an expression it has any type. `*` is the noun type, not a type variable; generic positions such as the keys in `each` and `table` use a capital. A value of a more specific noun type can be used where `*` is expected.
7272- `_` is an inferable hole wherever a mold can appear, including an inferred path-segment aura. A hole resolved to an explicitly named generic variable is resolved; an unconstrained hole is an error. A named mold or value definition must determine its own holes without constraints from later uses.
73−- `poke`, `ask` and `qath` are transparent types defined in the internal prelude and re-exported normally. Derived gates and `pure` also construct requests; application-path literals have type `qath`.
73+- `raw-poke`, `ask` and `qath` are transparent types defined in the internal prelude and re-exported normally. Derived gates and `pure` also construct requests; application-path literals have type `qath`. A store's local `poke` is an ordinary action mold.
7474- The Literals table gives every other literal its type: `0x1f` a `@ux`, ships `@p`, dates `@da`, durations `@dr`, `~.knot` a `@ta`, strings `@t`, `` `x `` a `(unit A)`, `~[…]` a `(list A)`, `gap+%s2` the pair `[%gap %s2]`, `/posts/~zod` a `path`, `%/blog` a `qath`.
7575
7676**Tags, `~`, numbers and cells wait for their context** (Grammar: Tag resolution, Literals by context)
@@ -93,7 +93,7 @@ The rules are scattered across the tabs. This is a map of them, not a replacemen
9393
9494**Names and modules** (Grammar: Modules, Imports, Runes, Expressions; Core language: Programs and linking)
9595- "No name may shadow one already in scope, imports and the prelude included": samples, local `++`s and pattern binders too. The backends rely on it (Core language, "No shadowing").
96−- Molds and values have separate namespaces, "told apart by position": `todo-action.todo` is a mold and its constructor.
96+- Molds and values have separate namespaces, "told apart by position": `todo-action.todo` is a mold and `poke.todo` is its derived command helper.
9797- Local definitions may start any body, "visible to each other and the final expression".
9898- `/- todo` gives the molds of `/sur/todo.hoon` the module uses; `/% %todo-action` gives a mark's type, named after the mark, with no face; `/= card /ui/components/card` gives a Jibb module. API modules re-export their `/%` types, "not `/-` faces or `/=` modules". Import cycles are errors.
9999- Imports and prelude groups are records, read with `.`: `card.card`, `space.theme.theme`, `get.by`. "A module used as a whole value is a cell of its definitions, in name order."
@@ -110,8 +110,8 @@ The rules are scattered across the tabs. This is a map of them, not a replacemen
110110
111111**API files, stores and derived gates** (overview: Agent APIs, Effects; Grammar: Modules)
112112- `/ui/api/<agent>.jibb` declares `+$ poke` and `+$ paths`; "`poke` and `paths` are declarations, not molds." "A path case is a request name, a path and a type", and "A case can name another scry path, as in `[%changes /updates (facts todos todo-update) scry=/todos]`, used only by pages." An island may watch a request only when the checker proves it is watchable; a separate `scry=` path or unknown watchability is a type error.
113−- Each poke type gives a constructor, as `todo-action.todo`, and each path case a request, as `(todos.todo |=%got)`. A path with typed segments takes them too: the overview's `(post.api slug same)` suggests they come first. A `(facts full diff …)` case's request also takes a fold, as `$-([[%todo-update todo-update] todos] todos)`.
114−- A store's `+$ poke` is a declaration, not a mold. A store exports a constructor per poke type and a `state` request. Clashing derived names are errors, including clashes with an import face. The checker must account for the fact that the type of `main` determines whether a module is a store.
113+- Each API gives a generic `poke` command helper taking an action and reply, and each path case a request, as `(todos.todo |=%got)`. A path with typed segments takes them too: the overview's `(post.api slug same)` suggests they come first. A `(facts full diff …)` case's request also takes a fold, as `$-([[%todo-update todo-update] todos] todos)`.
114+- A store's local `+$ poke` is an ordinary action mold. A store exports a generic `poke` command helper and a `state` request. Clashing derived names are errors, including clashes with an import face. The checker must account for the fact that the type of `main` determines whether a module is a store.
115115
116116**The prelude** (overview: Prelude, Layout and styling, Links and URLs, Effects)
117117- Hoon's standard library regrouped, "written in Jibb and vendored as `/lib/jibb/prelude`", plus `eq`, `not`, `page`, `program`, `store`, `pure`, `island`, the layout elements and molds, `attr`, `theme`, and `cmd` and `sub` as the overview's Effects block writes them.
docs/spec/core-language.md+2−2
@@ -108,8 +108,8 @@ The todo island's `update`, from worked example 3:
108108 ?- (gth (lent (tuba (trip t))) 80)
109109 %.y [m(draft=t error=`"Too long") ~]
110110 %.n [m(draft=t error=~) ~]
111− %submit [m(draft="") ~[[%poke (todo-action.todo [%add draft.m]) |=%acked]]]
112− [%toggled id] [m ~[[%poke (todo-action.todo [%toggle id]) |=%acked]]]
111+ %submit [m(draft="") ~[(poke.todo [%add draft.m] |=%acked)]]
112+ [%toggled id] [m ~[(poke.todo [%toggle id] |=%acked)]]
113113 [%got ts] [m(todos=ts) ~]
114114 [%acked err] [m(error=err) ~]
115115```
docs/spec/decisions.md+4−4
@@ -31,11 +31,11 @@ The choices behind the Language tab, made on 2026-10-23; a later date marks a re
3131| Equality and negation | The gates `eq` and `not`, with Hoon's bitwise `not` exposed as `not.bit`; `eq`'s arguments and map and set keys contain no gates, even nested; the checker infers and generalizes that constraint; union matching never inspects a gate to distinguish cases | Decided 2026-10-30 |
3232| Special rules | No built-ins; type-directed rules are welcome, each listed in the Grammar tab | Decided 2026-10-29 |
3333| Inference | Hindley–Milner with aura variables; `@` is any atom, a specific atom fits `@` and a more specific aura fits an ancestor in its Hoon aura family, but each reverse needs a check, and repeated atom-constrained capitals give the same type; a number takes `@ud` only where its `++` isn't generic over its aura; distinct specific auras remain distinct; faces are part of record types, and an unnamed position can take a face but two different faces don't unify; principal types | Decided 2026-10-30 |
34−| Effects | The library unions `cmd` and `sub`; `poke`, `ask` and `qath` are transparent types defined in the internal prelude and re-exported normally; derived gates and `pure` also construct requests; islands read agents only by watching; replies get full state, and diffs take a fold; timers carry the time; `%who` gives the owner's `@p`; nacks reach replies as text | Decided 2026-10-31 |
35−| Poke representation | The source-backed private internal prelude module defines `poke`, and the public prelude re-exports it as an ordinary transparent type. Ordinary modules can construct and inspect its values | Decided 2026-10-31 |
34+| Effects | The library unions `cmd` and `sub`; `raw-poke`, `ask` and `qath` are transparent types defined in the internal prelude and re-exported normally; derived gates and `pure` also construct requests; islands read agents only by watching; replies get full state, and diffs take a fold; timers carry the time; `%who` gives the owner's `@p`; nacks reach replies as text | Decided 2026-11-01 |
35+| Poke representation | The source-backed private internal prelude module defines `raw-poke`, and the public prelude re-exports it as an ordinary transparent type. A store's local `poke` action remains an ordinary mold; derived helpers produce the runtime envelope | Decided 2026-11-01 |
3636| Agent APIs | `/ui/api/<agent>.jibb` with `+$ poke` and `+$ paths`, over the agent's mark types; a case is a name, a path and a type, with `(facts full diff …)` for diffs, told apart by mark; an optional scry path, for pages; an island may watch a request only when the checker proves it is watchable, so a separate scry path or unknown watchability is an error; typed segments by aura | Decided 2026-10-31 |
3737| Mark names | Any name: `/%` names types after marks, and constructors poke with their type's mark; no alias marks | Decided 2026-10-26 |
38−| Derived gates | API files and stores give a constructor per poke type and a checked request per path or store state; clashing names are errors, including a derived name that clashes with an import face | Decided 2026-10-30 |
38+| Derived gates | API files and stores give a generic `poke` command helper taking an action and reply, and a checked request per path or store state; clashing names are errors, including a derived name that clashes with an import face | Decided 2026-11-01 |
3939| Hoon types | A fixed translation table; `map`, `set`, `qeu`, `jar`, `jug` by name; `mop` as `(mop K V)`, read with `on`; imported `$%`, `$?` and `$^` cases must differ as nouns, and records with duplicate field names are errors where used; unused molds skipped | Decided 2026-10-30 |
4040| Record fields | Duplicate field names in a Jibb-written record are an error, as they are in an imported Hoon record | Decided 2026-10-31 |
4141| Record projection | The explicit type-directed operation `proj` takes a record and uses its expected result type to select its fields; no projection is inserted automatically. `proj` is reserved and cannot be defined or imported under that name. The result has exactly the fields declared by its type | Decided 2026-10-31 |
@@ -72,7 +72,7 @@ The choices behind the Language tab, made on 2026-10-23; a later date marks a re
7272| Inputs | A message per input event, none mid-composition; controls reset to the latest view after every event; fields read-only until the island starts | Decided 2026-10-29 |
7373| Transactions | None; one poke per command | Decided |
7474| Reloads | Restart from the model the page is served with | Decided 2026-10-29 |
75−| Shared state | Stores: browser agents written like API files, with `state`, `+$ poke` and `(store init update)`; the store's `+$ poke` is a declaration, not a mold; derived gates provide poke constructors and state requests; one per page | Decided 2026-10-31 |
75+| Shared state | Stores: browser agents written like API files, with `state`, a local `+$ poke` action mold and `(store init update)`; derived gates provide the generic `poke` command helper and state requests; one per page | Decided 2026-11-01 |
7676| Store builder | `+$ store |$ [S] [init=S update=*]`, with `++ store |= [init=S update=$-([A S] S)] ^- (store S) [init update]`: the builder checks action `A`, while `main` exposes only state `S`; the store kind check verifies `A` against the poke declaration | Decided 2026-11-01 |
7777| Subscriptions | By agent and path, shared per page; the first fact is full state, so no paths that need a scry path | Decided 2026-10-29 |
7878| Apps | One island under a catch-all route, given the path by `pure`; `%url` delivers the path on every change; in-section links act as `go`; focus moves to the first heading | Decided 2026-10-29 |
docs/spec/grammar.md+9−10
@@ -91,7 +91,7 @@ Imports come first:
9191/= card /ui/components/card :: a Jibb module
9292```
9393
94−An imported Hoon record with duplicate field names is an error where used; imported union cases must differ as nouns. `/%` names a type after its mark, so it takes no face, and any mark name works; Hoon's `/%` binds the mark's core instead. Derived constructors such as `todo-action.todo` supply the agent and mark, so callers need not write those details. API modules re-export their `/%` types, not `/-` faces or `/=` modules. Import cycles are errors.
94+An imported Hoon record with duplicate field names is an error where used; imported union cases must differ as nouns. `/%` names a type after its mark, so it takes no face, and any mark name works; Hoon's `/%` binds the mark's core instead. Derived helpers such as `poke.todo` supply the agent and mark, so callers need not write those details. API modules re-export their `/%` types, not `/-` faces or `/=` modules. Import cycles are errors.
9595
9696## Modules
9797
@@ -99,10 +99,10 @@ A file is a module: imports, then definitions.
9999
100100- `+$ name mold` defines a mold; `++ name expr` a value.
101101- Names may refer to each other in any order, and no name may shadow one already in scope, imports and the prelude included.
102−- Molds and values have separate namespaces, told apart by position: `todo-action.todo` is a mold and its constructor, `todos.todo` a mold and a request.
102+- Molds and values have separate namespaces, told apart by position: `todo-action.todo` is a mold, `poke.todo` its command helper, and `todos.todo` a mold and a request.
103103- `main`'s type decides the kind: `(element !!)` a page; `(page R D)` a page with data, from parameters `R` to data `D`; `(program D X M)` an island, with data, model and messages; `(store S)` a store with state `S`. They're built by `(page load view)`, `(program init update view subs)` and `(store init update)`. A module without `main` is a library.
104104- Everything is exported and read through the import's face, as `card.card`. The prelude keeps private helpers in a separate internal module; it imports them without exposing them.
105−- An API module, `/ui/api/<agent>.jibb`, also exports derived gates: a constructor per `poke` type, adding the agent and mark, and a request per `paths` case, taking a reply over full state, plus a fold for `(facts full diff …)`. An island may watch a request only when the checker proves it is watchable. A request whose case has a separate `scry=` path, or whose watchability cannot be proved, is a type error. A store's `+$ poke` is a declaration, not a mold; a store exports a constructor per `poke` type and a `state` request. Clashing derived names are errors, including a derived name that clashes with an import face.
105+- An API module, `/ui/api/<agent>.jibb`, also exports derived gates: a generic `poke` command helper, adding the agent and mark and taking a reply, and a request per `paths` case, taking a reply over full state, plus a fold for `(facts full diff …)`. An island may watch a request only when the checker proves it is watchable. A request whose case has a separate `scry=` path, or whose watchability cannot be proved, is a type error. A store's local `+$ poke` is its ordinary action mold; a store exports a generic `poke` command helper and a `state` request. Clashing derived names are errors, including a derived name that clashes with an import face.
106106
107107Names the host reads, by file:
108108
@@ -130,8 +130,8 @@ A mold is only a type: never called on a noun, and with no default. Types are in
130130- **Paths**: `/todos` is constant, `/` empty, and `/todo/[id=@ud]` typed by aura. A typed segment may use `_` for an inferred aura; it still must resolve to an aura that the path rules can print and parse. `%/blog/(slug)` is an `qath`, checked against routes and static files.
131131- **Generic molds**: `+$ result |$ [V E]` with cases below; `|$` goes only right after a `+$`'s name.
132132- **Noun**: `*`, not a type variable; use a capital for a generic type. A value already known to have a more specific noun type, such as `@ud`, can be used where `*` is expected. **Empty**: `!!`.
133−- **Pokes**: `poke` is defined in the source-backed private internal prelude module and re-exported by the public prelude as an ordinary transparent type. Ordinary modules can construct and inspect its values.
134−- **Effect and application-path types**: `poke`, `ask` and `qath` are transparent types, defined in the internal prelude and re-exported normally; callers can construct and inspect their values. Derived gates and `pure` also construct requests, and application-path literals have type `qath`. `(facts full diff …)` appears only in an API file's `paths`.
133+- **Pokes**: `raw-poke` is defined in the source-backed private internal prelude module and re-exported by the public prelude as an ordinary transparent type. Ordinary modules can construct and inspect its values; derived `poke` helpers return commands.
134+- **Effect and application-path types**: `raw-poke`, `ask` and `qath` are transparent types, defined in the internal prelude and re-exported normally; callers can construct and inspect their values. Derived gates and `pure` also construct requests, and application-path literals have type `qath`. `(facts full diff …)` appears only in an API file's `paths`.
135135- **Identity**: recursive molds go by name and module.
136136
137137`eq`'s arguments and map and set keys must contain no gates, even nested inside another value. The checker infers this gate-free constraint on type variables and retains it when generalizing a `++`, so a generic helper that calls `eq` stays generic over gate-free types. Printed types show the constraint as `$-([A A] ?) where A contains no gates`. An inferred atom constraint prints as `$-([A A] A) where A is an atom`; an arithmetic atom constraint that excludes loobeans prints as `where A is an atom other than ?`. Multiple clauses are comma-separated, as `where A is an atom, B contains no gates`. Union-case matching treats gates as opaque and never inspects a gate to distinguish cases.
@@ -293,14 +293,13 @@ knot = { lower | digit | "-" | "." | "~" | "_" } ;
293293```jibb
294294:: /ui/stores/cart.jibb
295295+$ state [items=(list @t) open=?]
296−+$ cart-action
296++$ poke
297297 [%add item=@t]
298298 %toggle
299−+$ poke cart-action
300299
301300++ main (store init update)
302301++ init ^- state [~ %.n]
303−++ update |= [a=cart-action s=state]
302+++ update |= [a=poke s=state]
304303 ?- a
305304 [%add item] s(items=[item items.s])
306305 %toggle s(open=(not open.s))
@@ -326,8 +325,8 @@ knot = { lower | digit | "-" | "." | "~" | "_" } ;
326325++ update |= [=msg m=model]
327326 ?- msg
328327 [%noted t] [m(note=t) ~]
329− %add [m(note="") ~[[%poke (cart-action.cart [%add note.m]) |=%acked]]]
330− %toggle [m ~[[%poke (cart-action.cart %toggle) |=%acked]]]
328+ %add [m(note="") ~[(poke.cart [%add note.m] |=%acked)]]
329+ %toggle [m ~[(poke.cart %toggle |=%acked)]]
331330 [%got c] [m(cart=c) ~]
332331 [%acked err] [m ~]
333332
docs/spec/overview.md+6−6
@@ -141,7 +141,7 @@ Loads and renders run in Nock.
141141
142142```jibb
143143+$ cmd |$ [M]
144− [%poke p=poke reply=$-((unit @t) M)]
144+ [%poke p=raw-poke reply=$-((unit @t) M)]
145145 [%go url=@t]
146146 [%wait gap=@dr msg=M]
147147 [%now reply=$-(@da M)]
@@ -154,7 +154,7 @@ Loads and renders run in Nock.
154154
155155An island's `update` returns `[model (list (cmd M))]`, so one message may produce several commands. The runtime processes the returned commands one at a time, in list order. A store's `update` consumes exactly one poke with the current state and returns the next state.
156156
157−- `poke`, `ask` and `qath` are transparent types defined in the internal prelude and re-exported normally. Derived gates and `pure` also construct requests. A derived poke constructor such as `(todo-action.todo [%add draft.m])` checks its value and supplies the agent and mark, so one island can poke several agents. The agent's mark rechecks on the ship; a nack's `tang` reaches the reply as text. Store constructors poke the store in the browser.
157+- `raw-poke`, `ask` and `qath` are transparent types defined in the internal prelude and re-exported normally. Derived gates and `pure` also construct requests. A derived poke helper such as `(poke.todo [%add draft.m] |=%acked)` checks its value and supplies the agent and mark, returning a command whose reply becomes an island message, so one island can poke several agents. The agent's mark rechecks on the ship; a nack's `tang` reaches the reply as text. Store helpers poke the store in the browser.
158158- A request such as `(todos.todo |=%got)` comes from a declared path or a store's `state`; its reply always gets full state. A path with diffs also takes a fold, `(changes.todo |=%got apply)`, which the runtime applies first. Facts are checked; a bad one crashes the reply, which counts as a crashed `update`.
159159- Islands read agents only by watching. A watch's first fact must be full state, so watching a request whose path case has a separate `scry=` path is a type error in an island. The checker must prove a request is watchable; unknown watchability is also a type error. The runtime acks facts, rewatches after a kick or a dropped connection and reseeds from the first fact; a refused watch shows the crash notice.
160160- Watches match by agent and path, timers by gap, and the newest reply is always used. After each `update`, `subs` is diffed to start and stop watches and timers. `%now` and `%every` give the time, `%who` the owner's `@p` from `/~/name`; `%wait` is a one-shot delay.
@@ -165,7 +165,7 @@ Inputs send a message per `input` event, and one per IME composition, so validat
165165
166166- `init` runs on the ship with the page's data and returns only the model, jammed into the page; the browser resumes from it at start. A reload starts from the model the page is served with.
167167- A crash in `update` drops the message, keeps the model and shows the standard notice.
168−- Stores share state between a page's islands. A store module, written like an API file, has `state`, `+$ poke` and `++ main (store init update)`, where `update` applies a poke. The store's `+$ poke` is a declaration, not a mold. The builder is `+$ store |$ [S] [init=S update=*]` with `++ store |= [init=S update=$-([A S] S)] ^- (store S) [init update]`: it checks action `A`, while `main` exposes only state `S`; the store kind check verifies `A` against the declaration. Islands import it with `/=` and use its derived gates: a constructor per poke type, and `(state.cart |=%got)`, whose first fact is the current state and each later fact the next.
168+- Stores share state between a page's islands. A store module, written like an API file, has `state`, `+$ poke` and `++ main (store init update)`, where `update` applies a poke. The store's local `+$ poke` is an ordinary action mold; the runtime envelope is `raw-poke`. The builder is `+$ store |$ [S] [init=S update=*]` with `++ store |= [init=S update=$-([A S] S)] ^- (store S) [init update]`: it checks action `A`, while `main` exposes only state `S`; the store kind check verifies `A` against the declaration. Islands import it with `/=` and use its derived gates: the generic `poke` command helper, and `(state.cart |=%got)`, whose first fact is the current state and each later fact the next.
169169- A store runs in the browser from its `init` when its first island starts, and lasts as long as the page. Islands keep what they watch in their own models.
170170- An app is a page whose view is one island under a catch-all route; its `load` passes the path with `pure`. The island's `%url` subscription delivers the path at start and after every change, back and forward included. `go` pushes history, and `go` or `link` within the section changes the island without a reload. Focus then moves to the new view's first heading, which screen readers announce.
171171
@@ -282,7 +282,7 @@ The host is one Gall agent on the `%jibb` desk, serving every Jibb desk, so app
282282
283283### Agent APIs
284284
285−Each agent Jibb talks to has `/ui/api/<agent>.jibb`, declaring its pokes in `+$ poke` and its paths in `+$ paths`, over types from the agent's own marks through `/%`. Importing it gives derived gates: a constructor per poke type, which pokes with that type's mark, and a request per path, which checks what comes back. Clashing derived names are errors.
285+Each agent Jibb talks to has `/ui/api/<agent>.jibb`, declaring its pokes in `+$ poke` and its paths in `+$ paths`, over types from the agent's own marks through `/%`. Importing it gives derived gates: a generic `poke` command helper, which checks the action and reply and pokes with the action's mark, and a request per path, which checks what comes back. Clashing derived names are errors.
286286
287287```jibb
288288:: /ui/api/todo.jibb
@@ -473,8 +473,8 @@ A `page`: each request scries `%blog` and renders in Nock.
473473 ?- (gth (lent (tuba (trip t))) 80)
474474 %.y [m(draft=t error=`"Too long") ~]
475475 %.n [m(draft=t error=~) ~]
476− %submit [m(draft="") ~[[%poke (todo-action.todo [%add draft.m]) |=%acked]]]
477− [%toggled id] [m ~[[%poke (todo-action.todo [%toggle id]) |=%acked]]]
476+ %submit [m(draft="") ~[(poke.todo [%add draft.m] |=%acked)]]
477+ [%toggled id] [m ~[(poke.todo [%toggle id] |=%acked)]]
478478 [%got ts] [m(todos=ts) ~]
479479 [%acked err] [m(error=err) ~]
480480
docs/status.md+4−4
@@ -1,6 +1,6 @@
11# Status
22
3−As of 2026-11-01. The plan is [spec/implementation-plan.md](spec/implementation-plan.md); each milestone ends with its checks passing on a fake ship.
3+As of 2026-11-02. The plan is [spec/implementation-plan.md](spec/implementation-plan.md); each milestone ends with its checks passing on a fake ship.
44
55| # | Milestone | Status |
66| --- | --- | --- |
@@ -53,7 +53,7 @@ A narrow full-module path now checks direct four-wing `(program init update view
5353
5454Static and direct data-page `main` checking now completes the unchanged about page, blog index and todo index through the real Hoon readers. Static generic element mains specialize to closed canonical `(element !!)`; direct pages require a closed invariant `page` type and a direct plain derived-request load. Page loads reuse the strict source/member/evidence identity checks used by program watches, rejecting aliases, indirect/hand-built/pure/unknown requests, typed paths, diffs and store paths. The shared eval and ship fixture asserts exact main types and structural downstream imports. Rendering, runtime loading and request execution remain unimplemented.
5555
56−The prelude now has the approved `store` mold and action-checking builder. Direct two-wing store mains infer after removing the single local `+$ poke` declaration from ordinary molds and values; the final kind check requires one closed state mold, a direct local action reference, exact init/state and update relations, and no gate-free-state restriction. Stores export their ordinary state/action molds plus derived poke and state-request gates, never the poke declaration. Separate source-bound store certificates prove only the actual imported state member watchable; API evidence checks and page-load rejection remain intact. The unchanged cart and basket pass detailed and legacy checking with exact mains, derived schemes and structural imports, including non-keyed view and null-sample initializer recovery. Multi-action declarations, lowering and runtime execution remain unsupported.
56+The prelude now has the approved `store` mold and action-checking builder. The runtime envelope is the transparent `raw-poke`; a store's local `+$ poke` remains its ordinary action mold throughout inference. Direct two-wing store mains require closed state and action molds, exact init/state and update relations, and no gate-free-state restriction. Stores export those molds plus derived generic `poke` command and state-request gates. The command helper checks the canonical `raw-poke`, `cmd` and `unit` shapes, takes an action and reply, and returns `(cmd M)` directly. Separate source-bound store certificates prove only the actual imported state member watchable; API evidence checks and page-load rejection remain intact. The unchanged cart and basket pass detailed and legacy checking with exact mains, derived schemes and structural imports, including non-keyed view and null-sample initializer recovery. Multi-action declarations, lowering and runtime execution remain unsupported.
5757
5858The component-local program recovery now covers update, subscriptions, one direct keyed `each`/`turn` mapper and its view, then the existing initializer and ordinary `main` path. Each recovered scheme is closed and freshly allocated; a keyed source screen avoids repeated doomed ordinary attempts without skipping final `main`, and non-gate views decline safely. Canonical `element` recursion and exact singleton-case list fits are narrowly guarded, with successful ordinary fits taking precedence. The byte-identical unchanged todo now passes both detailed and legacy full-module checks with an exact closed `main` type and structural downstream import. Wrong models, messages, results, mappers, keys, aliases, non-gate views and watches fail closed. This is static checking only: no Jibb execution or runtime watching is claimed.
5959
@@ -63,7 +63,7 @@ For a unique supported path declaration, the request-parts analysis derives orde
6363
6464A separate supporting-definition analysis infers supported ordinary API molds and values and resolves all declared marks, retaining their source and dependency evidence. It fails closed on unsupported helpers or marks; unused `/-` cores are not independently validated, and definitions depending on derived gates remain unsupported. This does not check or export the whole API.
6565
66−Ordinary imports can infer derived request-gate types for multiple supported API paths. A case may take one typed segment before the reply or one diff fold after it; the unchanged todo API's plain, typed and diff requests infer, including a named closed fold. Checked ordinary API definitions, mark molds and a supported poke constructor are exported. Each `/sur` core must have a directly used, successfully read mold; unselected bindings are not independently validated. Jibb module imports, scry paths, multiple parameters or diffs and a parameter together with a fold remain unsupported. Source-qualified request evidence and exact trusted graph inputs survive transitive imports and cached interfaces, while stale or ambiguous evidence fails closed. This is a type-only interface: request execution, schema validation and proof that a request value is watchable remain unimplemented. In one loaded-machine run, the real-todo eval took 195.83 s wall and 67.83 s user CPU; the prior prototype took 111.81 s wall and 64.60 s user. Both include Hoon compilation and reader setup and overlapped other work, so they are not isolated checker benchmarks.
66+Ordinary imports can infer derived request-gate types for multiple supported API paths. A case may take one typed segment before the reply or one diff fold after it; the unchanged todo API's plain, typed and diff requests infer, including a named closed fold. Checked ordinary API definitions, mark molds and a supported generic poke command helper are exported. Each `/sur` core must have a directly used, successfully read mold; unselected bindings are not independently validated. Jibb module imports, scry paths, multiple parameters or diffs and a parameter together with a fold remain unsupported. Source-qualified request evidence and exact trusted graph inputs survive transitive imports and cached interfaces, while stale or ambiguous evidence fails closed. This is a type-only interface: request execution, schema validation and proof that a request value is watchable remain unimplemented. In one loaded-machine run, the real-todo eval took 195.83 s wall and 67.83 s user CPU; the prior prototype took 111.81 s wall and 64.60 s user. Both include Hoon compilation and reader setup and overlapped other work, so they are not isolated checker benchmarks.
6767
6868The Hoon reader's tagged-union source proof also handles `$~` default wrappers. A shared eval and ship golden exercises the unmodified Tlon `epic.saga` mold as a named payload in a labeled downstream extension, alongside overlap, recursive, shadow and malformed-wrapper controls. The tagged-source helper peels at most four consecutive defaults; defaults inside dependency proofs spend the existing semantic-node budget. Other unverified nested unions and dependencies remain unsupported.
6969
@@ -108,7 +108,7 @@ What the plan asks for, and where it is:
108108Besides the plan's list:
109109
110110- 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 101.8 s while other checks were running. The fake ship passed all 715 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 104.1 s while other checks were running. The importer golden compares 221 projections; `tools/clay-fixtures` builds the example Hoon fixtures through Clay, checks a recursive Ford import's origin, and passes Clay-built types through the Clay-built importer and partial checker.
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.
112112- `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.
113113- 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.
114114- 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+85−74
@@ -774,39 +774,38 @@
774774:: (face 2:11 items
775775:: (apply 2:17 list (aura 2:23 @t)))
776776:: (face 2:27 open (flag 2:32))))
777−:: (mold 3:1 cart-action
777+:: (mold 3:1 poke
778778:: (union 4:3
779779:: (cell 4:3
780780:: (const 4:4 %add)
781781:: (face 4:9 item (aura 4:14 @t)))
782782:: (const 5:3 %toggle)))
783−:: (mold 6:1 poke (ref 6:9 cart-action))
784−:: (value 8:1 main
785−:: (group 8:9
786−:: (call 8:10 (wing 8:10 store) (wing 8:16 init) (wing 8:21 update))))
787−:: (value 9:1 init
788−:: (cast 9:9
789−:: (ref 9:12 state)
790−:: (tuple 9:18 (lit 9:19 ~) (lit 9:21 %.n))))
791−:: (value 10:1 update
792−:: (gate 10:11
793−:: (cell 10:14
794−:: (face 10:15 a (ref 10:17 cart-action))
795−:: (face 10:29 s (ref 10:31 state)))
796−:: (body 11:3
797−:: (branch 11:3
798−:: (wing 11:6 a)
783+:: (value 7:1 main
784+:: (group 7:9
785+:: (call 7:10 (wing 7:10 store) (wing 7:16 init) (wing 7:21 update))))
786+:: (value 8:1 init
787+:: (cast 8:9
788+:: (ref 8:12 state)
789+:: (tuple 8:18 (lit 8:19 ~) (lit 8:21 %.n))))
790+:: (value 9:1 update
791+:: (gate 9:11
792+:: (cell 9:14
793+:: (face 9:15 a (ref 9:17 poke))
794+:: (face 9:22 s (ref 9:24 state)))
795+:: (body 10:3
796+:: (branch 10:3
797+:: (wing 10:6 a)
798+:: (arm 11:5
799+:: (cell 11:5 (lit 11:6 %add) (bind 11:11 item))
800+:: (change 11:18 s
801+:: (edit 11:20 items
802+:: (tuple 11:26 (wing 11:27 item) (wing 11:32 items.s)))))
799803:: (arm 12:5
800−:: (cell 12:5 (lit 12:6 %add) (bind 12:11 item))
804+:: (lit 12:5 %toggle)
801805:: (change 12:18 s
802−:: (edit 12:20 items
803−:: (tuple 12:26 (wing 12:27 item) (wing 12:32 items.s)))))
804−:: (arm 13:5
805−:: (lit 13:5 %toggle)
806−:: (change 13:18 s
807−:: (edit 13:20 open
808−:: (group 13:25
809−:: (call 13:26 (wing 13:26 not) (wing 13:30 open.s)))))))))))
806+:: (edit 12:20 open
807+:: (group 12:25
808+:: (call 12:26 (wing 12:26 not) (wing 12:30 open.s)))))))))))
810809::
811810:: 4.3 Errors (+show-error): "<file>:<line>:<col>: <message>", then the
812811:: source line, then a caret under the column (col - 1 spaces, then ^).
@@ -11341,22 +11340,6 @@
1134111340 ?. (levy vals |=(n=term &((unique-value-name n vals) !(lien prelude-values |=(v=term =(n v)))))) |
1134211341 (levy mold-names |=(n=term &((unique-value-name n mold-names) !(lien prelude-molds |=(m=term =(n m))))))
1134311342::
11344−:: In an API file or before main's kind is known, a lone `+$ poke`
11345−:: may be a declaration rather than a mold that shadows the prelude. Do not call
11346−:: that one collision definite, and do not hide unrelated scope errors.
11347−++ pending-declared-poke
11348− |= [at=path mod=module prelude-values=(list term) prelude-molds=(list term)]
11349− ^- ?
11350− ?. (lien prelude-molds |=(n=term =(%poke n))) |
11351− ?. |(?=([%ui %api @ %jibb ~] at) (lien defs.mod |=(d=def &(?=(%value -.d) =(%main name.d))))) |
11352− =/ pokes=(list def)
11353− (skim defs.mod |=(d=def &(?=(%mold -.d) =(%poke name.d))))
11354− ?~ pokes |
11355− ?^ t.pokes |
11356− =/ remaining=(list def)
11357− (skim defs.mod |=(d=def !&(?=(%mold -.d) =(%poke name.d))))
11358− (module-scope-valid mod(defs remaining) prelude-values prelude-molds)
11359−::
1136011343:: A detailed failure is attached only to the first mold that actually
1136111344:: failed in this check, using that module's checked source mold table.
1136211345+$ imold-failure [message=@t overlap=(unit [name=term cases=upair])]
@@ -12003,7 +11986,8 @@
1200311986 ?> ?=(%mold -.decl)
1200411987 =/ paths=(unit (list iapi-path)) (api-path-declaration shape.decl declared)
1200511988 ?~ paths ~
12006− ?. (api-derived-names-valid u.paths u.poke-names mod prelude-values) ~
11989+ =/ derived-pokes=(list term) ?~(pokes ~ ~[%poke])
11990+ ?. (api-derived-names-valid u.paths derived-pokes mod prelude-values) ~
1200711991 (api-path-types u.paths externals declared)
1200811992::
1200911993:: Source/graph entry for path analysis only. The returned paths retain
@@ -12214,16 +12198,17 @@
1221412198:: Value watchability remains unproved even for a watchable declaration.
1221512199+$ ione-request-interface
1221612200 [support=iapi-support-evidence parts=iapi-request-parts iface=ifile]
12217−++ store-compatible-poke
12201+++ compatible-raw-poke
1221812202 |= prelude=iprelude
1221912203 ^- (unit ischeme)
1222012204 =/ public=ifile iface.prelude
1222112205 ?. =(at.public /lib/jibb/prelude/jibb) ~
12222− =/ poke=(unit ischeme) (find-jibb-mold %poke public)
12206+ =/ poke=(unit ischeme) (find-jibb-mold %raw-poke public)
1222312207 ?~ poke ~
12224− ?. ?=(%union -.typ.u.poke) ~
1222512208 ?^ vars.u.poke ~
12226− ?. =(origin.typ.u.poke `[/lib/jibb/internal/jibb %poke]) ~
12209+ ?. ?=(%union -.typ.u.poke) ~
12210+ ?^ args.typ.u.poke ~
12211+ ?. =(origin.typ.u.poke `[/lib/jibb/internal/jibb %raw-poke]) ~
1222712212 ?: (itype-has-tag typ.u.poke) ~
1222812213 =/ private=(list iwidth-dependency)
1222912214 (skim dependencies.public |=(d=iwidth-dependency =(at.d /lib/jibb/internal/jibb)))
@@ -12407,7 +12392,7 @@
1240712392 ?^ (duplicate-defs defs.mod) ~
1240812393 ?~ prelude ~
1240912394 ?. =(at.u.prelude /lib/jibb/prelude/jibb) ~
12410− =/ poke=(unit ischeme) (find-jibb-mold %poke u.prelude)
12395+ =/ poke=(unit ischeme) (find-jibb-mold %raw-poke u.prelude)
1241112396 ?~ poke ~
1241212397 ?. ?=(%union -.typ.u.poke) ~
1241312398 ?^ vars.u.poke ~
@@ -12431,8 +12416,9 @@
1243112416 ?: |((lien prelude-values |=(x=term =(n x))) (lien prelude-molds |=(x=term =(n x)))) ~
1243212417 =/ mark=(unit itype) (find-imported-mark n mark-externals marks)
1243312418 ?~ mark ~
12434− =/ sc=ischeme [[%fn u.mark typ.u.poke] ~]
12435− `[~[[n sc]] (api-mark-exports marks marks mark-externals) at ~[[n i.t.t.at n]] ~ ~ ~ ~]
12419+ =/ sc=(unit ischeme) (derived-poke-command-scheme u.prelude u.mark)
12420+ ?~ sc ~
12421+ `[~[[%poke u.sc]] (api-mark-exports marks marks mark-externals) at ~[[n i.t.t.at n]] ~ ~ ~ ~]
1243612422::
1243712423:: Source-proven ordinary helpers validate each selected /sur dependency.
1243812424:: Unused or less direct cores remain unsupported by this first interface.
@@ -12635,8 +12621,8 @@
1263512621 ?~ view ~
1263612622 `[u.load u.view]
1263712623::
12638−:: A store main is only the direct two-wing source call. The poke declaration
12639−:: is checked here, then removed before every ordinary mold/value inference pass.
12624+:: A store main is only the direct two-wing source call. Its local poke mold
12625+:: is checked here and remains in ordinary mold/value inference.
1264012626++ store-main-parts
1264112627 |= d=def
1264212628 ^- (unit [init=term update=term])
@@ -12671,18 +12657,10 @@
1267112657 =/ state=def i.states
1267212658 ?> &(?=(%mold -.poke) ?=(%mold -.state))
1267312659 ?: ?=(%generic -.shape.state) ~
12674− ?. ?=(%ref -.shape.poke) ~
12675− ?. ?=([@ ~] names.shape.poke) ~
12676− =/ action=term i.names.shape.poke
12677− =/ actions=(list def)
12678− (skim ds |=(d=def &(?=(%mold -.d) =(action name.d))))
12679− ?. ?=([* ~] actions) ~
12680− =/ action-def=def i.actions
12681− ?> ?=(%mold -.action-def)
12682− ?: ?=(%generic -.shape.action-def) ~
12683− =/ ordinary=(list def)
12684− (skim ds |=(d=def !&(?=(%mold -.d) =(%poke name.d))))
12685− ?. (module-scope-valid mod(defs ordinary) prelude-values prelude-molds) ~
12660+ ?: ?=(%generic -.shape.poke) ~
12661+ =/ action=term %poke
12662+ =/ ordinary=(list def) ds
12663+ ?. (module-scope-valid mod prelude-values prelude-molds) ~
1268612664 =/ derived=(list term) ~[%state action]
1268712665 ?: (lien derived |=(n=term =(n %proj))) ~
1268812666 =/ outer=(list term)
@@ -13753,6 +13731,7 @@
1375313731 =? inferred ?=(%| -.inferred) (infer-recursive-gate init-def env init-state)
1375413732 ?: ?=(%| -.inferred) ~
1375513733 ?. ?=(%fn -.typ.p.inferred) ~
13734+ ?^ (itype-vars sample.typ.p.inferred) ~
1375613735 =/ data-fit=ifit
1375713736 (itype-fit sample.typ.p.inferred sample.expected sub.state.p.inferred next.state.p.inferred)
1375813737 ?. ?=(%ok -.data-fit) ~
@@ -13782,22 +13761,58 @@
1378213761 ?. ?=(~ (itype-vars typ.u.recovered)) ~
1378313762 `[env.u.added grouped.resolution artifacts.u.added]
1378413763::
13764+++ derived-poke-command-scheme
13765+ |= [prelude=ifile action=itype]
13766+ ^- (unit ischeme)
13767+ =/ prep=iprelude [prelude ~ ~]
13768+ =/ raw=(unit ischeme) (compatible-raw-poke prep)
13769+ ?~ raw ~
13770+ =/ command=(unit ischeme) (find-jibb-mold %cmd prelude)
13771+ =/ unit-template=(unit ischeme) (find-jibb-mold %unit prelude)
13772+ ?~ command ~
13773+ ?~ unit-template ~
13774+ ?. (standard-unit-template u.unit-template /lib/jibb/prelude/jibb) ~
13775+ ?. ?=([@ ~] vars.u.command) ~
13776+ ?. ?=(%union -.typ.u.command) ~
13777+ ?. =(origin.typ.u.command `[/lib/jibb/prelude/jibb %cmd]) ~
13778+ ?. (identity-union-parameters vars.u.command args.typ.u.command) ~
13779+ =/ m=@ud i.vars.u.command
13780+ ?: (itype-var-is-atom m typ.u.command) ~
13781+ ?. (levy (itype-vars typ.u.command) |=(n=@ud =(n m))) ~
13782+ ?: (itype-has-tag typ.u.command) ~
13783+ =/ error=(unit itype) (template-apply u.unit-template ~[[%atom %t]])
13784+ ?~ error ~
13785+ ?. ?=(%union -.typ.u.raw) ~
13786+ =/ poke-case=itype
13787+ [%cell [%const [%term %tas %poke '%poke']] [%cell [%face %p typ.u.raw(label `'raw-poke.internal')] [%face %reply [%fn u.error [%var m]]]]]
13788+ =/ go-case=itype
13789+ [%cell [%const [%term %tas %go '%go']] [%face %url [%atom %t]]]
13790+ =/ wait-case=itype
13791+ [%cell [%const [%term %tas %wait '%wait']] [%cell [%face %gap [%atom %dr]] [%face %msg [%var m]]]]
13792+ =/ now-case=itype
13793+ [%cell [%const [%term %tas %now '%now']] [%face %reply [%fn [%atom %da] [%var m]]]]
13794+ =/ who-case=itype
13795+ [%cell [%const [%term %tas %who '%who']] [%face %reply [%fn [%atom %p] [%var m]]]]
13796+ ?. =(cases.typ.u.command ~[poke-case go-case wait-case now-case who-case]) ~
13797+ =/ command-result=(unit itype) (template-apply u.command ~[[%var 0]])
13798+ ?~ command-result ~
13799+ `[[%fn [%cell action [%fn u.error [%var 0]]] u.command-result] ~[0]]
13800+::
1378513801++ store-derived-schemes
1378613802 |= [prelude=ifile values=(list term) molds=(list term) state=itype action=itype]
1378713803 ^- (unit [state=ischeme action=ischeme])
1378813804 =/ prep=iprelude [prelude values molds]
1378913805 =/ ask=(unit ischeme) (request-compatible-ask prep)
1379013806 ?~ ask ~
13791− =/ poke=(unit ischeme) (store-compatible-poke prep)
13792− ?~ poke ~
1379313807 ?^ (itype-vars state) ~
1379413808 ?^ (itype-vars action) ~
1379513809 ?: |((itype-has-tag state) (itype-has-tag action)) ~
1379613810 =/ result=(unit itype) (template-apply u.ask ~[[%var 0]])
1379713811 ?~ result ~
1379813812 =/ request=ischeme [[%fn [%fn state [%var 0]] u.result] ~[0]]
13799− =/ constructor=ischeme [[%fn action typ.u.poke] ~]
13800− `[request constructor]
13813+ =/ constructor=(unit ischeme) (derived-poke-command-scheme prelude action)
13814+ ?~ constructor ~
13815+ `[request u.constructor]
1380113816::
1380213817++ program-subs-watch
1380313818 |= [d=def imports=ijimports graph=irequest-graph prelude=ifile]
@@ -14029,8 +14044,8 @@
1402914044 =? tail ?=(%face -.tail) body.tail
1403014045 typ(sample [%cell head tail])
1403114046::
14032−:: The builder erases the action from main. Recover it only from the direct
14033−:: local poke declaration and check both ordinary components invariantly.
14047+:: The builder erases the action from main. Recover it only from the local
14048+:: poke mold and check both ordinary components invariantly.
1403414049++ store-main-closed
1403514050 |= [parts=[init=term update=term] action=term env=ienv molds=imold-types prelude=(unit ifile)]
1403614051 ^- (unit ischeme)
@@ -14138,8 +14153,6 @@
1413814153 =/ ds=(list def) ?~(declared defs.mod defs.u.declared)
1413914154 =/ checking=module mod(defs ds)
1414014155 ?. (module-scope-valid checking prelude-values prelude-molds)
14141− ?: (pending-declared-poke at mod prelude-values prelude-molds)
14142− [%| [(crip "module kind or scope needs unsupported inference: {(spud at)}") ~]]
1414314156 [%| [(crip "module has conflicting names: {(spud at)}") ~]]
1414414157 =/ vals=(list term) (global-value-names ds)
1414514158 =/ js=jimports-detailed-result (resolve-jibb-imports-detailed imports.mod externals mark-externals modules active prelude-values prelude-molds cache prelude)
@@ -14376,8 +14389,6 @@
1437614389 =/ prelude-molds=(list term) molds.u.prepared
1437714390 =/ iface=(unit ifile) `iface.u.prepared
1437814391 ?. (module-scope-valid p.parsed prelude-values prelude-molds)
14379− ?: (pending-declared-poke file p.parsed prelude-values prelude-molds)
14380− 'partial inference; module not checked\0amodule kind or scope needs unsupported inference'
1438114392 'partial inference; module not checked\0amodule has conflicting names'
1438214393 =/ js=jimports-result
1438314394 (resolve-jibb-imports imports.p.parsed externals mark-externals modules ~[file] prelude-values prelude-molds ~ iface)
jibb-dev/lib/jibb/internal.jibb+1−1
@@ -3,7 +3,7 @@
33:: Representation for agent and in-process store pokes.
44:: The prelude re-exports this mold; effect lowering and the runtime must
55:: agree on these cells when effect execution is implemented.
6−+$ poke
6++$ raw-poke
77 [%agent agent=@tas mark=@tas payload=*]
88 [%store module=@t action=@tas payload=*]
99
jibb-dev/lib/jibb/prelude.jibb+2−2
@@ -1,5 +1,5 @@
11/= internal /lib/jibb/internal
2−+$ poke poke.internal
2++$ raw-poke raw-poke.internal
33+$ qath qath.internal
44
55:: Initial prelude functions. The rest of the inventory is still to come.
@@ -325,7 +325,7 @@
325325 [f b] |= a=A (f a b)
326326
327327+$ cmd |$ [M]
328− [%poke p=poke reply=$-((unit @t) M)]
328+ [%poke p=raw-poke reply=$-((unit @t) M)]
329329 [%go url=@t]
330330 [%wait gap=@dr msg=M]
331331 [%now reply=$-(@da M)]
my-app/ui/basket.jibb+2−2
@@ -17,8 +17,8 @@
1717++ update |= [=msg m=model]
1818 ?- msg
1919 [%noted t] [m(note=t) ~]
20− %add [m(note="") ~[[%poke (cart-action.cart [%add note.m]) |=%acked]]]
21− %toggle [m ~[[%poke (cart-action.cart %toggle) |=%acked]]]
20+ %add [m(note="") ~[(poke.cart [%add note.m] |=%acked)]]
21+ %toggle [m ~[(poke.cart %toggle |=%acked)]]
2222 [%got c] [m(cart=c) ~]
2323 [%acked err] [m ~]
2424
my-app/ui/stores/cart.jibb+2−3
@@ -1,13 +1,12 @@
11:: /ui/stores/cart.jibb
22+$ state [items=(list @t) open=?]
3−+$ cart-action
3++$ poke
44 [%add item=@t]
55 %toggle
6−+$ poke cart-action
76
87++ main (store init update)
98++ init ^- state [~ %.n]
10−++ update |= [a=cart-action s=state]
9+++ update |= [a=poke s=state]
1110 ?- a
1211 [%add item] s(items=[item items.s])
1312 %toggle s(open=(not open.s))
my-app/ui/todo-list.jibb+2−2
@@ -19,8 +19,8 @@
1919 ?- (gth (lent (tuba (trip t))) 80)
2020 %.y [m(draft=t error=`"Too long") ~]
2121 %.n [m(draft=t error=~) ~]
22− %submit [m(draft="") ~[[%poke (todo-action.todo [%add draft.m]) |=%acked]]]
23− [%toggled id] [m ~[[%poke (todo-action.todo [%toggle id]) |=%acked]]]
22+ %submit [m(draft="") ~[(poke.todo [%add draft.m] |=%acked)]]
23+ [%toggled id] [m ~[(poke.todo [%toggle id] |=%acked)]]
2424 [%got ts] [m(todos=ts) ~]
2525 [%acked err] [m(error=err) ~]
2626
tests/golden/doc-core-02-update/source.jibb+2−2
@@ -4,7 +4,7 @@
44 ?- (gth (lent (tuba (trip t))) 80)
55 %.y [m(draft=t error=`"Too long") ~]
66 %.n [m(draft=t error=~) ~]
7− %submit [m(draft="") ~[[%poke (todo-action.todo [%add draft.m]) |=%acked]]]
8− [%toggled id] [m ~[[%poke (todo-action.todo [%toggle id]) |=%acked]]]
7+ %submit [m(draft="") ~[(poke.todo [%add draft.m] |=%acked)]]
8+ [%toggled id] [m ~[(poke.todo [%toggle id] |=%acked)]]
99 [%got ts] [m(todos=ts) ~]
1010 [%acked err] [m(error=err) ~]
tests/golden/doc-core-02-update/tokens.txt+22−28
@@ -73,20 +73,17 @@
73737:29 tight str ""
74747:31 tight glyph )
75757:33 glyph ~[
76−7:35 tight glyph [
77−7:36 tight lit %poke
78−7:42 glyph (
79−7:43 tight wing todo-action.todo
80−7:60 glyph [
81−7:61 tight lit %add
82−7:66 wing draft.m
83−7:73 tight glyph ]
84−7:74 tight glyph )
85−7:76 glyph |=
86−7:78 tight lit %acked
87−7:84 tight glyph ]
88−7:85 tight glyph ]
89−7:86 tight glyph ]
76+7:35 tight glyph (
77+7:36 tight wing poke.todo
78+7:46 glyph [
79+7:47 tight lit %add
80+7:52 wing draft.m
81+7:59 tight glyph ]
82+7:61 glyph |=
83+7:63 tight lit %acked
84+7:69 tight glyph )
85+7:70 tight glyph ]
86+7:71 tight glyph ]
90878:5 NEWLINE
91888:5 glyph [
92898:6 tight lit %toggled
@@ -95,20 +92,17 @@
95928:20 glyph [
96938:21 tight name m
97948:23 glyph ~[
98−8:25 tight glyph [
99−8:26 tight lit %poke
100−8:32 glyph (
101−8:33 tight wing todo-action.todo
102−8:50 glyph [
103−8:51 tight lit %toggle
104−8:59 name id
105−8:61 tight glyph ]
106−8:62 tight glyph )
107−8:64 glyph |=
108−8:66 tight lit %acked
109−8:72 tight glyph ]
110−8:73 tight glyph ]
111−8:74 tight glyph ]
95+8:25 tight glyph (
96+8:26 tight wing poke.todo
97+8:36 glyph [
98+8:37 tight lit %toggle
99+8:45 name id
100+8:47 tight glyph ]
101+8:49 glyph |=
102+8:51 tight lit %acked
103+8:57 tight glyph )
104+8:58 tight glyph ]
105+8:59 tight glyph ]
1121069:5 NEWLINE
1131079:5 glyph [
1141089:6 tight lit %got
tests/golden/doc-core-02-update/tree.txt+10−14
@@ -44,25 +44,21 @@
4444 (change 7:21 m
4545 (edit 7:23 draft (str 7:29 "")))
4646 (list 7:33
47− (tuple 7:35
48− (lit 7:36 %poke)
49− (group 7:42
50− (call 7:43
51− (wing 7:43 todo-action.todo)
52− (tuple 7:60 (lit 7:61 %add) (wing 7:66 draft.m))))
53− (ctor 7:76 %acked)))))
47+ (group 7:35
48+ (call 7:36
49+ (wing 7:36 poke.todo)
50+ (tuple 7:46 (lit 7:47 %add) (wing 7:52 draft.m))
51+ (ctor 7:61 %acked))))))
5452 (arm 8:5
5553 (cell 8:5 (lit 8:6 %toggled) (bind 8:15 id))
5654 (tuple 8:20
5755 (wing 8:21 m)
5856 (list 8:23
59− (tuple 8:25
60− (lit 8:26 %poke)
61− (group 8:32
62− (call 8:33
63− (wing 8:33 todo-action.todo)
64− (tuple 8:50 (lit 8:51 %toggle) (wing 8:59 id))))
65− (ctor 8:64 %acked)))))
57+ (group 8:25
58+ (call 8:26
59+ (wing 8:26 poke.todo)
60+ (tuple 8:36 (lit 8:37 %toggle) (wing 8:45 id))
61+ (ctor 8:49 %acked))))))
6662 (arm 9:5
6763 (cell 9:5 (lit 9:6 %got) (bind 9:11 ts))
6864 (tuple 9:20
tests/golden/doc-grammar-06-cart-store/source.jibb+2−3
@@ -1,13 +1,12 @@
11:: /ui/stores/cart.jibb
22+$ state [items=(list @t) open=?]
3−+$ cart-action
3++$ poke
44 [%add item=@t]
55 %toggle
6−+$ poke cart-action
76
87++ main (store init update)
98++ init ^- state [~ %.n]
10−++ update |= [a=cart-action s=state]
9+++ update |= [a=poke s=state]
1110 ?- a
1211 [%add item] s(items=[item items.s])
1312 %toggle s(open=(not open.s))
tests/golden/doc-grammar-06-cart-store/tokens.txt+56−60
@@ -13,7 +13,7 @@
13132:33 tight glyph ]
14143:1 NEWLINE
15153:1 glyph +$
16−3:4 name cart-action
16+3:4 name poke
17174:3 INDENT
18184:3 glyph [
19194:4 tight lit %add
@@ -23,68 +23,64 @@
23234:16 tight glyph ]
24245:3 NEWLINE
25255:3 lit %toggle
26−6:1 DEDENT
27−6:1 NEWLINE
28−6:1 glyph +$
29−6:4 name poke
30−6:9 name cart-action
26+7:1 DEDENT
27+7:1 NEWLINE
28+7:1 glyph ++
29+7:4 name main
30+7:9 glyph (
31+7:10 tight name store
32+7:16 name init
33+7:21 name update
34+7:27 tight glyph )
31358:1 NEWLINE
32368:1 glyph ++
33−8:4 name main
34−8:9 glyph (
35−8:10 tight name store
36−8:16 name init
37−8:21 name update
38−8:27 tight glyph )
37+8:4 name init
38+8:9 glyph ^-
39+8:12 name state
40+8:18 glyph [
41+8:19 tight lit ~
42+8:21 lit %.n
43+8:24 tight glyph ]
39449:1 NEWLINE
40459:1 glyph ++
41−9:4 name init
42−9:9 glyph ^-
43−9:12 name state
44−9:18 glyph [
45−9:19 tight lit ~
46−9:21 lit %.n
47−9:24 tight glyph ]
48−10:1 NEWLINE
49−10:1 glyph ++
50−10:4 name update
51−10:11 glyph |=
52−10:14 glyph [
53−10:15 tight name a
54−10:16 tight glyph =
55−10:17 tight name cart-action
56−10:29 name s
57−10:30 tight glyph =
58−10:31 tight name state
59−10:36 tight glyph ]
60−11:3 INDENT
61−11:3 glyph ?-
62−11:6 name a
63−12:5 INDENT
64−12:5 glyph [
65−12:6 tight lit %add
66−12:11 name item
67−12:15 tight glyph ]
46+9:4 name update
47+9:11 glyph |=
48+9:14 glyph [
49+9:15 tight name a
50+9:16 tight glyph =
51+9:17 tight name poke
52+9:22 name s
53+9:23 tight glyph =
54+9:24 tight name state
55+9:29 tight glyph ]
56+10:3 INDENT
57+10:3 glyph ?-
58+10:6 name a
59+11:5 INDENT
60+11:5 glyph [
61+11:6 tight lit %add
62+11:11 name item
63+11:15 tight glyph ]
64+11:18 name s
65+11:19 tight glyph (
66+11:20 tight name items
67+11:25 tight glyph =
68+11:26 tight glyph [
69+11:27 tight name item
70+11:32 wing items.s
71+11:39 tight glyph ]
72+11:40 tight glyph )
73+12:5 NEWLINE
74+12:5 lit %toggle
687512:18 name s
697612:19 tight glyph (
70−12:20 tight name items
71−12:25 tight glyph =
72−12:26 tight glyph [
73−12:27 tight name item
74−12:32 wing items.s
75−12:39 tight glyph ]
76−12:40 tight glyph )
77−13:5 NEWLINE
78−13:5 lit %toggle
79−13:18 name s
80−13:19 tight glyph (
81−13:20 tight name open
82−13:24 tight glyph =
83−13:25 tight glyph (
84−13:26 tight name not
85−13:30 wing open.s
86−13:36 tight glyph )
87−13:37 tight glyph )
88−13:38 DEDENT
89−13:38 DEDENT
90−13:38 NEWLINE
77+12:20 tight name open
78+12:24 tight glyph =
79+12:25 tight glyph (
80+12:26 tight name not
81+12:30 wing open.s
82+12:36 tight glyph )
83+12:37 tight glyph )
84+12:38 DEDENT
85+12:38 DEDENT
86+12:38 NEWLINE
tests/golden/doc-grammar-06-cart-store/tree.txt+25−26
@@ -4,36 +4,35 @@
44 (face 2:11 items
55 (apply 2:17 list (aura 2:23 @t)))
66 (face 2:27 open (flag 2:32))))
7− (mold 3:1 cart-action
7+ (mold 3:1 poke
88 (union 4:3
99 (cell 4:3
1010 (const 4:4 %add)
1111 (face 4:9 item (aura 4:14 @t)))
1212 (const 5:3 %toggle)))
13− (mold 6:1 poke (ref 6:9 cart-action))
14− (value 8:1 main
15− (group 8:9
16− (call 8:10 (wing 8:10 store) (wing 8:16 init) (wing 8:21 update))))
17− (value 9:1 init
18− (cast 9:9
19− (ref 9:12 state)
20− (tuple 9:18 (lit 9:19 ~) (lit 9:21 %.n))))
21− (value 10:1 update
22− (gate 10:11
23− (cell 10:14
24− (face 10:15 a (ref 10:17 cart-action))
25− (face 10:29 s (ref 10:31 state)))
26− (body 11:3
27− (branch 11:3
28− (wing 11:6 a)
13+ (value 7:1 main
14+ (group 7:9
15+ (call 7:10 (wing 7:10 store) (wing 7:16 init) (wing 7:21 update))))
16+ (value 8:1 init
17+ (cast 8:9
18+ (ref 8:12 state)
19+ (tuple 8:18 (lit 8:19 ~) (lit 8:21 %.n))))
20+ (value 9:1 update
21+ (gate 9:11
22+ (cell 9:14
23+ (face 9:15 a (ref 9:17 poke))
24+ (face 9:22 s (ref 9:24 state)))
25+ (body 10:3
26+ (branch 10:3
27+ (wing 10:6 a)
28+ (arm 11:5
29+ (cell 11:5 (lit 11:6 %add) (bind 11:11 item))
30+ (change 11:18 s
31+ (edit 11:20 items
32+ (tuple 11:26 (wing 11:27 item) (wing 11:32 items.s)))))
2933 (arm 12:5
30− (cell 12:5 (lit 12:6 %add) (bind 12:11 item))
34+ (lit 12:5 %toggle)
3135 (change 12:18 s
32− (edit 12:20 items
33− (tuple 12:26 (wing 12:27 item) (wing 12:32 items.s)))))
34− (arm 13:5
35− (lit 13:5 %toggle)
36− (change 13:18 s
37− (edit 13:20 open
38− (group 13:25
39− (call 13:26 (wing 13:26 not) (wing 13:30 open.s)))))))))))
36+ (edit 12:20 open
37+ (group 12:25
38+ (call 12:26 (wing 12:26 not) (wing 12:30 open.s)))))))))))
tests/golden/doc-grammar-06-cart-store/types.txt+5−1
@@ -1,2 +1,6 @@
11partial inference; module not checked
2−module kind or scope needs unsupported inference
2++$ state: not checked
3++$ poke: cases proven disjoint; mold not checked
4+++ main: [init=[items=(list @t) open=?] update=*]
5+++ init: [items=(list @t) open=?]
6+++ update: $-([a=poke s=[items=(list @t) open=?]] [items=(list @t) open=?])
tests/golden/doc-grammar-07-basket/source.jibb+2−2
@@ -17,8 +17,8 @@
1717++ update |= [=msg m=model]
1818 ?- msg
1919 [%noted t] [m(note=t) ~]
20− %add [m(note="") ~[[%poke (cart-action.cart [%add note.m]) |=%acked]]]
21− %toggle [m ~[[%poke (cart-action.cart %toggle) |=%acked]]]
20+ %add [m(note="") ~[(poke.cart [%add note.m] |=%acked)]]
21+ %toggle [m ~[(poke.cart %toggle |=%acked)]]
2222 [%got c] [m(cart=c) ~]
2323 [%acked err] [m ~]
2424
tests/golden/doc-grammar-07-basket/tokens.txt+19−25
@@ -111,36 +111,30 @@
11111120:28 tight str ""
11211220:30 tight glyph )
11311320:32 glyph ~[
114−20:34 tight glyph [
115−20:35 tight lit %poke
116−20:41 glyph (
117−20:42 tight wing cart-action.cart
118−20:59 glyph [
119−20:60 tight lit %add
120−20:65 wing note.m
121−20:71 tight glyph ]
122−20:72 tight glyph )
123−20:74 glyph |=
124−20:76 tight lit %acked
125−20:82 tight glyph ]
126−20:83 tight glyph ]
127−20:84 tight glyph ]
114+20:34 tight glyph (
115+20:35 tight wing poke.cart
116+20:45 glyph [
117+20:46 tight lit %add
118+20:51 wing note.m
119+20:57 tight glyph ]
120+20:59 glyph |=
121+20:61 tight lit %acked
122+20:67 tight glyph )
123+20:68 tight glyph ]
124+20:69 tight glyph ]
12812521:5 NEWLINE
12912621:5 lit %toggle
13012721:20 glyph [
13112821:21 tight name m
13212921:23 glyph ~[
133−21:25 tight glyph [
134−21:26 tight lit %poke
135−21:32 glyph (
136−21:33 tight wing cart-action.cart
137−21:50 lit %toggle
138−21:57 tight glyph )
139−21:59 glyph |=
140−21:61 tight lit %acked
141−21:67 tight glyph ]
142−21:68 tight glyph ]
143−21:69 tight glyph ]
130+21:25 tight glyph (
131+21:26 tight wing poke.cart
132+21:36 lit %toggle
133+21:44 glyph |=
134+21:46 tight lit %acked
135+21:52 tight glyph )
136+21:53 tight glyph ]
137+21:54 tight glyph ]
14413822:5 NEWLINE
14513922:5 glyph [
14614022:6 tight lit %got
tests/golden/doc-grammar-07-basket/tree.txt+7−12
@@ -48,23 +48,18 @@
4848 (change 20:21 m
4949 (edit 20:23 note (str 20:28 "")))
5050 (list 20:32
51− (tuple 20:34
52− (lit 20:35 %poke)
53− (group 20:41
54− (call 20:42
55− (wing 20:42 cart-action.cart)
56− (tuple 20:59 (lit 20:60 %add) (wing 20:65 note.m))))
57− (ctor 20:74 %acked)))))
51+ (group 20:34
52+ (call 20:35
53+ (wing 20:35 poke.cart)
54+ (tuple 20:45 (lit 20:46 %add) (wing 20:51 note.m))
55+ (ctor 20:59 %acked))))))
5856 (arm 21:5
5957 (lit 21:5 %toggle)
6058 (tuple 21:20
6159 (wing 21:21 m)
6260 (list 21:23
63− (tuple 21:25
64− (lit 21:26 %poke)
65− (group 21:32
66− (call 21:33 (wing 21:33 cart-action.cart) (lit 21:50 %toggle)))
67− (ctor 21:59 %acked)))))
61+ (group 21:25
62+ (call 21:26 (wing 21:26 poke.cart) (lit 21:36 %toggle) (ctor 21:44 %acked))))))
6863 (arm 22:5
6964 (cell 22:5 (lit 22:6 %got) (bind 22:11 c))
7065 (tuple 22:20
tests/golden/doc-overview-01-cmd-sub/source.jibb+1−1
@@ -1,5 +1,5 @@
11+$ cmd |$ [M]
2− [%poke p=poke reply=$-((unit @t) M)]
2+ [%poke p=raw-poke reply=$-((unit @t) M)]
33 [%go url=@t]
44 [%wait gap=@dr msg=M]
55 [%now reply=$-(@da M)]
tests/golden/doc-overview-01-cmd-sub/tokens.txt+11−11
@@ -9,17 +9,17 @@
992:4 tight lit %poke
10102:10 name p
11112:11 tight glyph =
12−2:12 tight name poke
13−2:17 name reply
14−2:22 tight glyph =
15−2:23 tight glyph $-(
16−2:26 tight glyph (
17−2:27 tight name unit
18−2:32 aura @t
19−2:34 tight glyph )
20−2:36 tvar M
21−2:37 tight glyph )
22−2:38 tight glyph ]
12+2:12 tight name raw-poke
13+2:21 name reply
14+2:26 tight glyph =
15+2:27 tight glyph $-(
16+2:30 tight glyph (
17+2:31 tight name unit
18+2:36 aura @t
19+2:38 tight glyph )
20+2:40 tvar M
21+2:41 tight glyph )
22+2:42 tight glyph ]
23233:3 NEWLINE
24243:3 glyph [
25253:4 tight lit %go
tests/golden/doc-overview-01-cmd-sub/tree.txt+5−5
@@ -4,11 +4,11 @@
44 (union 2:3
55 (cell 2:3
66 (const 2:4 %poke)
7− (face 2:10 p (ref 2:12 poke))
8− (face 2:17 reply
9− (fn 2:23
10− (apply 2:26 unit (aura 2:32 @t))
11− (tvar 2:36 M))))
7+ (face 2:10 p (ref 2:12 raw-poke))
8+ (face 2:21 reply
9+ (fn 2:27
10+ (apply 2:30 unit (aura 2:36 @t))
11+ (tvar 2:40 M))))
1212 (cell 3:3
1313 (const 3:4 %go)
1414 (face 3:8 url (aura 3:12 @t)))
tests/golden/doc-overview-10-todo-list/source.jibb+2−2
@@ -19,8 +19,8 @@
1919 ?- (gth (lent (tuba (trip t))) 80)
2020 %.y [m(draft=t error=`"Too long") ~]
2121 %.n [m(draft=t error=~) ~]
22− %submit [m(draft="") ~[[%poke (todo-action.todo [%add draft.m]) |=%acked]]]
23− [%toggled id] [m ~[[%poke (todo-action.todo [%toggle id]) |=%acked]]]
22+ %submit [m(draft="") ~[(poke.todo [%add draft.m] |=%acked)]]
23+ [%toggled id] [m ~[(poke.todo [%toggle id] |=%acked)]]
2424 [%got ts] [m(todos=ts) ~]
2525 [%acked err] [m(error=err) ~]
2626
tests/golden/doc-overview-10-todo-list/tokens.txt+22−28
@@ -169,20 +169,17 @@
16916922:29 tight str ""
17017022:31 tight glyph )
17117122:33 glyph ~[
172−22:35 tight glyph [
173−22:36 tight lit %poke
174−22:42 glyph (
175−22:43 tight wing todo-action.todo
176−22:60 glyph [
177−22:61 tight lit %add
178−22:66 wing draft.m
179−22:73 tight glyph ]
180−22:74 tight glyph )
181−22:76 glyph |=
182−22:78 tight lit %acked
183−22:84 tight glyph ]
184−22:85 tight glyph ]
185−22:86 tight glyph ]
172+22:35 tight glyph (
173+22:36 tight wing poke.todo
174+22:46 glyph [
175+22:47 tight lit %add
176+22:52 wing draft.m
177+22:59 tight glyph ]
178+22:61 glyph |=
179+22:63 tight lit %acked
180+22:69 tight glyph )
181+22:70 tight glyph ]
182+22:71 tight glyph ]
18618323:5 NEWLINE
18718423:5 glyph [
18818523:6 tight lit %toggled
@@ -191,20 +188,17 @@
19118823:20 glyph [
19218923:21 tight name m
19319023:23 glyph ~[
194−23:25 tight glyph [
195−23:26 tight lit %poke
196−23:32 glyph (
197−23:33 tight wing todo-action.todo
198−23:50 glyph [
199−23:51 tight lit %toggle
200−23:59 name id
201−23:61 tight glyph ]
202−23:62 tight glyph )
203−23:64 glyph |=
204−23:66 tight lit %acked
205−23:72 tight glyph ]
206−23:73 tight glyph ]
207−23:74 tight glyph ]
191+23:25 tight glyph (
192+23:26 tight wing poke.todo
193+23:36 glyph [
194+23:37 tight lit %toggle
195+23:45 name id
196+23:47 tight glyph ]
197+23:49 glyph |=
198+23:51 tight lit %acked
199+23:57 tight glyph )
200+23:58 tight glyph ]
201+23:59 tight glyph ]
20820224:5 NEWLINE
20920324:5 glyph [
21020424:6 tight lit %got
tests/golden/doc-overview-10-todo-list/tree.txt+10−14
@@ -78,25 +78,21 @@
7878 (change 22:21 m
7979 (edit 22:23 draft (str 22:29 "")))
8080 (list 22:33
81− (tuple 22:35
82− (lit 22:36 %poke)
83− (group 22:42
84− (call 22:43
85− (wing 22:43 todo-action.todo)
86− (tuple 22:60 (lit 22:61 %add) (wing 22:66 draft.m))))
87− (ctor 22:76 %acked)))))
81+ (group 22:35
82+ (call 22:36
83+ (wing 22:36 poke.todo)
84+ (tuple 22:46 (lit 22:47 %add) (wing 22:52 draft.m))
85+ (ctor 22:61 %acked))))))
8886 (arm 23:5
8987 (cell 23:5 (lit 23:6 %toggled) (bind 23:15 id))
9088 (tuple 23:20
9189 (wing 23:21 m)
9290 (list 23:23
93− (tuple 23:25
94− (lit 23:26 %poke)
95− (group 23:32
96− (call 23:33
97− (wing 23:33 todo-action.todo)
98− (tuple 23:50 (lit 23:51 %toggle) (wing 23:59 id))))
99− (ctor 23:64 %acked)))))
91+ (group 23:25
92+ (call 23:26
93+ (wing 23:26 poke.todo)
94+ (tuple 23:36 (lit 23:37 %toggle) (wing 23:45 id))
95+ (ctor 23:49 %acked))))))
10096 (arm 24:5
10197 (cell 24:5 (lit 24:6 %got) (bind 24:11 ts))
10298 (tuple 24:20
tests/golden/inline-mold-opaque/about.txt+1−1
@@ -1,3 +1,3 @@
1−source: Grammar tab, Molds: "`poke`, `ask` and `qath` are transparent types, defined in the internal prelude and re-exported normally; callers can construct and inspect their values."
1+source: Grammar tab, Molds: "`raw-poke`, `ask` and `qath` are transparent types, defined in the internal prelude and re-exported normally; callers can construct and inspect their values."
22tests: the effect and application-path types by name
33expect: parses
tests/golden/inline-mold-opaque/source.jibb+1−1
@@ -1,3 +1,3 @@
1−+$ a poke
1++$ a raw-poke
22+$ b ask
33+$ c qath
tests/golden/inline-mold-opaque/tokens.txt+1−1
@@ -1,6 +1,6 @@
111:1 glyph +$
221:4 name a
3−1:6 name poke
3+1:6 name raw-poke
442:1 NEWLINE
552:1 glyph +$
662:4 name b
tests/golden/inline-mold-opaque/tree.txt+1−1
@@ -1,4 +1,4 @@
11(module
2− (mold 1:1 a (ref 1:6 poke))
2+ (mold 1:1 a (ref 1:6 raw-poke))
33 (mold 2:1 b (ref 2:6 ask))
44 (mold 3:1 c (ref 3:6 qath)))
tests/golden/inline-namespaces/about.txt+1−1
@@ -1,3 +1,3 @@
1−source: Grammar tab, Modules: "Molds and values have separate namespaces, told apart by position: `todo-action.todo` is a mold and its constructor, `todos.todo` a mold and a request."
1+source: Grammar tab, Modules: "Molds and values have separate namespaces, told apart by position: `todo-action.todo` is a mold, `poke.todo` its command helper, and `todos.todo` a mold and a request."
22tests: the same wings in mold and in value position
33expect: parses
tests/golden/inline-namespaces/source.jibb+1−1
@@ -1,4 +1,4 @@
11+$ a todo-action.todo
2−++ b todo-action.todo
2+++ b poke.todo
33+$ c todos.todo
44++ d todos.todo
tests/golden/inline-namespaces/tokens.txt+1−1
@@ -4,7 +4,7 @@
442:1 NEWLINE
552:1 glyph ++
662:4 name b
7−2:6 wing todo-action.todo
7+2:6 wing poke.todo
883:1 NEWLINE
993:1 glyph +$
10103:4 name c
tests/golden/inline-namespaces/tree.txt+1−1
@@ -1,5 +1,5 @@
11(module
22 (mold 1:1 a (ref 1:6 todo-action.todo))
3− (value 2:1 b (wing 2:6 todo-action.todo))
3+ (value 2:1 b (wing 2:6 poke.todo))
44 (mold 3:1 c (ref 3:6 todos.todo))
55 (value 4:1 d (wing 4:6 todos.todo)))
tests/golden/inline-requests/about.txt+2−2
@@ -1,3 +1,3 @@
1−source: the first tab ("Jibb — an Elm-architecture UI language for Urbit"), The Elm architecture on Urbit, Effects: "A constructor such as `(todo-action.todo [%add draft.m])` checks its value", "A request such as `(todos.todo |=%got)`", and "A path with diffs also takes a fold, `(changes.todo |=%got apply)`"
2−tests: derived gates called with a cell, a constructor, and a constructor followed by a name
1+source: the first tab ("Jibb — an Elm-architecture UI language for Urbit"), The Elm architecture on Urbit, Effects: "A derived poke helper such as `(poke.todo [%add draft.m] |=%acked)` checks its value and supplies the agent and mark", "A request such as `(todos.todo |=%got)`", and "A path with diffs also takes a fold, `(changes.todo |=%got apply)`"
2+tests: derived gates called with an action and reply, a request, and a request followed by a fold
33expect: parses
tests/golden/inline-requests/source.jibb+1−1
@@ -1,3 +1,3 @@
1−++ a (todo-action.todo [%add draft.m])
1+++ a (poke.todo [%add draft.m] same)
22++ b (todos.todo |=%got)
33++ c (changes.todo |=%got apply)
tests/golden/inline-requests/tokens.txt+7−6
@@ -1,12 +1,13 @@
111:1 glyph ++
221:4 name a
331:6 glyph (
4−1:7 tight wing todo-action.todo
5−1:24 glyph [
6−1:25 tight lit %add
7−1:30 wing draft.m
8−1:37 tight glyph ]
9−1:38 tight glyph )
4+1:7 tight wing poke.todo
5+1:17 glyph [
6+1:18 tight lit %add
7+1:23 wing draft.m
8+1:30 tight glyph ]
9+1:32 name same
10+1:36 tight glyph )
10112:1 NEWLINE
11122:1 glyph ++
12132:4 name b
tests/golden/inline-requests/tree.txt+3−2
@@ -2,8 +2,9 @@
22 (value 1:1 a
33 (group 1:6
44 (call 1:7
5− (wing 1:7 todo-action.todo)
6− (tuple 1:24 (lit 1:25 %add) (wing 1:30 draft.m)))))
5+ (wing 1:7 poke.todo)
6+ (tuple 1:17 (lit 1:18 %add) (wing 1:23 draft.m))
7+ (wing 1:32 same))))
78 (value 2:1 b
89 (group 2:6
910 (call 2:7 (wing 2:7 todos.todo) (ctor 2:18 %got))))
tests/golden/prelude-unit-list-transforms/source.jibb+2−2
@@ -1,5 +1,5 @@
11/= internal /lib/jibb/internal
2−+$ poke poke.internal
2++$ raw-poke raw-poke.internal
33+$ qath qath.internal
44
55:: Initial prelude functions. The rest of the inventory is still to come.
@@ -325,7 +325,7 @@
325325 [f b] |= a=A (f a b)
326326
327327+$ cmd |$ [M]
328− [%poke p=poke reply=$-((unit @t) M)]
328+ [%poke p=raw-poke reply=$-((unit @t) M)]
329329 [%go url=@t]
330330 [%wait gap=@dr msg=M]
331331 [%now reply=$-(@da M)]
tests/golden/prelude-unit-list-transforms/tokens.txt+13−13
@@ -8,8 +8,8 @@
881:23 tight knot internal
992:1 NEWLINE
10102:1 glyph +$
11−2:4 name poke
12−2:9 wing poke.internal
11+2:4 name raw-poke
12+2:13 wing raw-poke.internal
13133:1 NEWLINE
14143:1 glyph +$
15153:4 name qath
@@ -2116,17 +2116,17 @@
21162116328:4 tight lit %poke
21172117328:10 name p
21182118328:11 tight glyph =
2119−328:12 tight name poke
2120−328:17 name reply
2121−328:22 tight glyph =
2122−328:23 tight glyph $-(
2123−328:26 tight glyph (
2124−328:27 tight name unit
2125−328:32 aura @t
2126−328:34 tight glyph )
2127−328:36 tvar M
2128−328:37 tight glyph )
2129−328:38 tight glyph ]
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 ]
21302130329:3 NEWLINE
21312131329:3 glyph [
21322132329:4 tight lit %go
tests/golden/prelude-unit-list-transforms/tree.txt+6−6
@@ -1,6 +1,6 @@
11(module
22 (jibb 1:1 internal /lib/jibb/internal)
3− (mold 2:1 poke (ref 2:9 poke.internal))
3+ (mold 2:1 raw-poke (ref 2:13 raw-poke.internal))
44 (mold 3:1 qath (ref 3:9 qath.internal))
55 (value 7:1 same
66 (gate 7:9
@@ -924,11 +924,11 @@
924924 (union 328:3
925925 (cell 328:3
926926 (const 328:4 %poke)
927− (face 328:10 p (ref 328:12 poke))
928− (face 328:17 reply
929− (fn 328:23
930− (apply 328:26 unit (aura 328:32 @t))
931− (tvar 328:36 M))))
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))))
932932 (cell 329:3
933933 (const 329:4 %go)
934934 (face 329:8 url (aura 329:12 @t)))
tests/golden/prelude-unit-list-transforms/types.txt+1−1
@@ -1,5 +1,5 @@
11partial inference; module not checked
2−+$ poke: not checked
2++$ raw-poke: not checked
33+$ qath: not checked
44++ same: $-(A A)
55++ head: $-([A B] A)
tests/golden/types-arithmetic-module/types.txt+1−1
@@ -25,7 +25,7 @@ partial inference; module not checked
2525++ reject-alias (alias.math %.n %.y)
2626 ^
2727++ reject-any: call constraint is not supported by partial inference
28−++ nested: local definitions need unsupported inference
28+++ nested: $-(A A) where A is an atom other than ?
2929++ inc-decimal: @ud
3030++ inc-hex: @ux
3131++ inc-bool: call's sample and argument types do not unify
tests/golden/types-generic-face-inference/types.txt+7−1
@@ -10,4 +10,10 @@ partial inference; module not checked
1010/tests/golden/types-generic-face-inference/source.jibb:7:60: expression has type [left=@t rest=@ud]
1111++ mismatch |= x=[left=@t rest=@ud] ^- [right=@t rest=@ud] x
1212 ^
13−++ uncertain: cast constraint is not supported by partial inference
13+++ uncertain: distinct type variables `A` and `B` must not be forced equal; use the same capital for a shared type
14+/tests/golden/types-generic-face-inference/source.jibb:8:19: first type variable
15+++ uncertain |= x=A ^- [first=B rest=@t] [x "hi"]
16+ ^
17+/tests/golden/types-generic-face-inference/source.jibb:8:31: second type variable
18+++ uncertain |= x=A ^- [first=B rest=@t] [x "hi"]
19+ ^
tests/golden/types-hole-numeric-capture/types.txt+10−4
@@ -1,10 +1,16 @@
11partial inference; module not checked
22++ same: $-([a=A b=A] A)
33++ independent: @ud
4−++ first: call constraint is not supported by partial inference
5−++ second: call constraint is not supported by partial inference
6−++ capture: local definitions need unsupported inference
4+++ first: explicit capital constraints are not supported by partial inference
5+++ second: explicit capital constraints are not supported by partial inference
6+++ capture: type hole needs unsupported inference
7+/tests/golden/types-hole-numeric-capture/source.jibb:6:15: type hole
8+ ++ local ^- _ (same x 1)
9+ ^
710++ local-independent: $-(@t @t)
811++ unresolved-tag: tag needs context in partial inference
912++ discarded-number: @t
10−++ captured-second: local definitions need unsupported inference
13+++ captured-second: type hole needs unsupported inference
14+/tests/golden/types-hole-numeric-capture/source.jibb:18:15: type hole
15+ ++ local ^- _ (same 1 x)
16+ ^
tests/golden/types-prelude-ask/about.txt+1−1
@@ -1,4 +1,4 @@
1−source: docs/spec/overview.md, Effects: "`poke`, `ask` and `qath` are transparent types defined in the internal prelude and re-exported normally. Derived gates and `pure` also construct requests."
1+source: docs/spec/overview.md, Effects: "`raw-poke`, `ask` and `qath` are transparent types defined in the internal prelude and re-exported normally. Derived gates and `pure` also construct requests."
22tests: Source-backed pure values at independent and generic types, agent and store constructors, missing and exhaustive union branches, prior unit state, path identity, numeric defaulting and pending constraints. Receiver mismatches and unimplemented contexts remain unsupported; no runtime or watch validation is claimed.
33expect: parses
44expect-types: a partial inference report
tests/golden/types-prelude-cmd/source.jibb+2−2
@@ -3,7 +3,7 @@
33++ nav ^- (cmd @t) [%go url="/home"]
44++ time ^- (cmd @t) [%now reply=|=(d=@da "done")]
55++ bad ^- (cmd @t) [%go url=~zod]
6−++ send |= p=poke
6+++ send |= p=raw-poke
77 ^- (cmd @t) [%poke p |=(r=(unit @t) "done")]
88++ wait ^- (cmd @t) [%wait ~s30 "done"]
99++ who ^- (cmd @t) [%who |=(p=@p "done")]
@@ -14,7 +14,7 @@
1414++ wrong-reply ^- (cmd @t) [%who |=(p=@p ~zod)]
1515++ commands ^- (list (cmd @t)) ~[[%go "/home"] [%wait ~s30 "done"]]
1616++ commands-bad ^- (list (cmd @t)) ~[[%go "/home"] [%wait ~s30 ~zod]]
17−++ wrong-poke |= p=poke
17+++ wrong-poke |= p=raw-poke
1818 ^- (cmd @t) [%poke p |=(r=@p "done")]
1919++ wrong-case ^- (cmd @t) %oops
2020++ use-text |= x=(cmd @t) x
tests/golden/types-prelude-cmd/tokens.txt+2−2
@@ -72,7 +72,7 @@
72726:9 glyph |=
73736:12 name p
74746:13 tight glyph =
75−6:14 tight name poke
75+6:14 tight name raw-poke
76767:3 INDENT
77777:3 glyph ^-
78787:6 glyph (
@@ -234,7 +234,7 @@
23423417:15 glyph |=
23523517:18 name p
23623617:19 tight glyph =
237−17:20 tight name poke
237+17:20 tight name raw-poke
23823818:3 INDENT
23923918:3 glyph ^-
24024018:6 glyph (
tests/golden/types-prelude-cmd/tree.txt+2−2
@@ -32,7 +32,7 @@
3232 (face 5:25 url (lit 5:29 ~zod)))))
3333 (value 6:1 send
3434 (gate 6:9
35− (face 6:12 p (ref 6:14 poke))
35+ (face 6:12 p (ref 6:14 raw-poke))
3636 (body 7:3
3737 (cast 7:3
3838 (apply 7:6 cmd (aura 7:11 @t))
@@ -95,7 +95,7 @@
9595 (tuple 16:52 (lit 16:53 %wait) (lit 16:59 ~s30) (lit 16:64 ~zod)))))
9696 (value 17:1 wrong-poke
9797 (gate 17:15
98− (face 17:18 p (ref 17:20 poke))
98+ (face 17:18 p (ref 17:20 raw-poke))
9999 (body 18:3
100100 (cast 18:3
101101 (apply 18:6 cmd (aura 18:11 @t))
tests/golden/types-prelude-cmd/types.txt+1−1
@@ -10,7 +10,7 @@ partial inference; module not checked
1010/tests/golden/types-prelude-cmd/source.jibb:5:20: expression
1111++ bad ^- (cmd @t) [%go url=~zod]
1212 ^
13−++ send: $-(poke (cmd @t))
13+++ send: $-(raw-poke (cmd @t))
1414++ wait: (cmd @t)
1515++ who: (cmd @t)
1616++ wrong-message: cast mold and expression type do not unify
tests/golden/types-record-cast-context/types.txt+1−1
@@ -46,4 +46,4 @@ partial inference; module not checked
4646++ forced: explicit capital constraints are not supported by partial inference
4747++ pending-tag: tag needs context in partial inference
4848++ pending-null: `~` needs context in partial inference
49−++ unknown: cast constraint is not supported by partial inference
49+++ unknown: $-(A [left=A right=A])
tests/golden/types-scope-library-poke/types.txt+2−1
@@ -1,2 +1,3 @@
11partial inference; module not checked
2−module has conflicting names
2++$ poke: not checked
3+++ value: @t
tests/golden/types-scope-root-api/types.txt+1−1
@@ -1,2 +1,2 @@
11partial inference; module not checked
2−module kind or scope needs unsupported inference
2++$ poke: not checked
tests/golden/types-union-polymorphic-identity/types.txt+1−1
@@ -15,7 +15,7 @@ partial inference; module not checked
1515++ repeated: $-([a=(choice A) b=(choice A)] (choice A))
1616++ mismatch: call constraint is not supported by partial inference
1717++ face-result: $-(local-msg [field=local-msg flag=?])
18−++ explicit: call constraint is not supported by partial inference
18+++ explicit: explicit capital constraints are not supported by partial inference
1919++ pending: tag needs context in partial inference
2020++ unresolved: tag needs context in partial inference
2121++ same-choice: $-([a=(choice A) b=(choice A)] (choice A))
tests/lib/jibb-deferred.hoon+1−1
@@ -111,7 +111,7 @@
111111 ?~ explicit-capture ~['BAD-explicit-capture-scan']
112112 =/ tag-lit=lit:jibb [%term %tas %watch '%watch']
113113 =/ bound-tag-state=istate:jibb st(sub ~[[720 [%var 721]]])
114− =/ tag-check=(unit ischeme:jibb) (dg-generalize:jibb [%fn [%var 721] [%var 722]] ~ ~ ~[[720 tag-lit]] ~ bound-tag-state 300)
114+ =/ tag-check=(unit ischeme:jibb) (dg-generalize:jibb [%fn [%var 721] [%var 722]] ~ ~ ~[[720 tag-lit *span:jibb]] ~ bound-tag-state 300)
115115 ?~ tag-check ~['BAD-tag-scan']
116116 =/ cycle=(list dgo:jibb) ~[[[%var 710] [%var 711] *span:jibb *span:jibb] [[%var 711] [%var 712] *span:jibb *span:jibb] [[%var 712] [%var 710] *span:jibb *span:jibb]]
117117 =/ cyc=(unit ischeme:jibb) (dg-generalize:jibb [%fn [%var 710] [%fn [%var 712] [%var 713]]] ~ cycle ~ ~ st 300)
tests/lib/jibb-generic-construction.hoon+1−1
@@ -64,7 +64,7 @@
6464 =/ d=def:jibb i.t.t.t.ds
6565 ?. &(?=(%value -.a) ?=(%value -.b) ?=(%value -.c) ?=(%value -.d)) 'BAD value declarations'
6666 =/ env=ienv:jibb ~[[%text-event [[%fn [%atom %t] [%atom %t]] ~]]]
67− =/ tag=ipending:jibb [100 [%term %tas %unrelated '%unrelated']]
67+ =/ tag=ipending:jibb [100 [%term %tas %unrelated '%unrelated'] *span:jibb]
6868 =/ projection=iwprojection:jibb *iwprojection:jibb
6969 =/ st=istate:jibb *istate:jibb
7070 =. st st(next 201, prelude `iface.u.prep, tags ~[tag], holes ~[[99 (span-of:jibb val.a)]], projections ~[projection])
tests/lib/jibb-generic-pattern.hoon+1−1
@@ -77,7 +77,7 @@
7777 ?. ?=(%branch -.val.p) 'BAD polymorphic branch'
7878 =/ env=ienv:jibb ~[[%x [target ~]]]
7979 =/ poly=ienv:jibb ~[[%x [generic ~[42]]]]
80− =/ tag=ipending:jibb [100 [%term %tas %unrelated '%unrelated']]
80+ =/ tag=ipending:jibb [100 [%term %tas %unrelated '%unrelated'] *span:jibb]
8181 =/ projection=iwprojection:jibb *iwprojection:jibb
8282 =/ st=istate:jibb *istate:jibb
8383 =. st st(next 201, prelude `iface.u.prep, tags ~[tag], holes ~[[99 (span-of:jibb val.a)]], projections ~[projection])
tests/lib/jibb-poke-bridge.hoon+2−2
@@ -78,10 +78,10 @@
7878 =/ no-declaration=@t (crip "+$ poke todo-action\0a")
7979 =/ no-declaration-modules=(list [at=path source=@t]) ~[[/ui/api/todo/jibb no-declaration]]
8080 =/ j (golden-types-with-prepared-prelude:jibb /ui/test/jibb client ~ marks no-declaration-modules prepared)
81− =/ collision=@t (crip "/% %todo-action\0a+$ poke todo-action\0a++ todo-action \"bad\"\0a")
81+ =/ collision=@t (crip "/% %todo-action\0a+$ poke todo-action\0a++ poke \"bad\"\0a")
8282 =/ collision-modules=(list [at=path source=@t]) ~[[/ui/api/todo/jibb collision]]
8383 =/ k (golden-types-with-prepared-prelude:jibb /ui/test/jibb client ~ marks collision-modules prepared)
84− =/ wrong-path-source=@t (crip "/= todo /ui/wrong/todo\0a++ test (todo-action.todo \"ok\")\0a")
84+ =/ wrong-path-source=@t (crip "/= todo /ui/wrong/todo\0a++ test (poke.todo \"ok\" same)\0a")
8585 =/ wrong-path-modules=(list [at=path source=@t]) ~[[/ui/wrong/todo/jibb api]]
8686 =/ l (golden-types-with-prepared-prelude:jibb /ui/test/jibb wrong-path-source ~ marks wrong-path-modules prepared)
8787 (of-wain:format ~[(preparation-controls prelude internal) a b c d e f g h i j k l])
tests/lib/jibb-program-init.hoon+15−9
@@ -74,7 +74,8 @@
7474 =/ detailed=jfile-detailed-result:jibb (program-init-detailed at src ~ prepared)
7575 ?: ?=(%& -.detailed) ~[(weld (trip label) ": structured check accepted")]
7676 ?. ?=(~ overlap.p.detailed) ~[(weld (trip label) ": unexpected overlap evidence")]
77− ?. =(message.p.detailed boundary) ~[(weld (trip label) ": rejected at the wrong boundary")]
77+ ?. =(message.p.detailed boundary)
78+ ~[(weld (weld (trip label) ": rejected at the wrong boundary: ") (trip message.p.detailed))]
7879 =/ legacy=jfile-result:jibb (program-init-legacy at src ~ prepared)
7980 ?: ?=(%& -.legacy) ~[(weld (trip label) ": legacy check accepted")]
8081 ?. =(p.legacy boundary) ~[(weld (trip label) ": legacy boundary differs")]
@@ -88,6 +89,11 @@
8889 (program-init-negative label.i.cases at.i.cases src.i.cases boundary.i.cases prepared)
8990 $(cases t.cases)
9091::
92+++ program-init-pending
93+ |= [at=path src=@t line=@ud col=@ud literal=tape]
94+ ^- @t
95+ (show-error:jibb src [at line col (weld "nothing fixes the union of " literal)])
96+::
9197++ program-init-errors
9298 |= [public=@t private=@t island=@t downstream=@t unfaced=@t negatives=(list @t)]
9399 ^- (list tape)
@@ -101,15 +107,15 @@
101107 ?. =(9 (lent negatives)) ~["contextual negative fixture count differs"]
102108 =/ definitions=@t (crip "module definitions need unsupported inference: {(spud at)}")
103109 =/ cases=(list [label=@t at=path src=@t boundary=@t])
104− :~ ['incompatible error field' at (snag 0 negatives) definitions]
105− ['earlier tuple mismatch' at (snag 1 negatives) definitions]
106− ['inconsistent model' at (snag 2 negatives) definitions]
107− ['inconsistent message' at (snag 3 negatives) definitions]
108− ['missing/generic data sample' at (snag 4 negatives) definitions]
110+ :~ ['incompatible error field' at (snag 0 negatives) (program-init-pending at (snag 0 negatives) 6 32 "~")]
111+ ['earlier tuple mismatch' at (snag 1 negatives) (program-init-pending at (snag 1 negatives) 6 34 "~")]
112+ ['inconsistent model' at (snag 2 negatives) (program-init-pending at (snag 2 negatives) 7 32 "~")]
113+ ['inconsistent message' at (snag 3 negatives) (program-init-pending at (snag 3 negatives) 9 32 "~")]
114+ ['missing/generic data sample' at (snag 4 negatives) (program-init-pending at (snag 4 negatives) 6 22 "~")]
109115 ['missing initializer' at (snag 5 negatives) definitions]
110− ['unrelated pending tag' at (snag 6 negatives) definitions]
111− ['non-main same source' at (snag 7 negatives) definitions]
112− ['init and subs unresolved' at (snag 8 negatives) definitions]
116+ ['unrelated pending tag' at (snag 6 negatives) (program-init-pending at (snag 6 negatives) 12 6 "%unrelated")]
117+ ['non-main same source' at (snag 7 negatives) (program-init-pending at (snag 7 negatives) 6 32 "~")]
118+ ['init and subs unresolved' at (snag 8 negatives) (program-init-pending at (snag 8 negatives) 6 32 "~")]
113119 :- 'API path'
114120 [/ui/api/program-main/jibb island 'module kind needs unsupported inference: /ui/api/program-main/jibb']
115121 :- 'store path'
tests/lib/jibb-program-update.hoon+3−2
@@ -74,7 +74,8 @@
7474 =/ detailed=jfile-detailed-result:jibb (program-update-detailed at src ~ prepared)
7575 ?: ?=(%& -.detailed) ~[(weld (trip label) ": structured check accepted")]
7676 ?. ?=(~ overlap.p.detailed) ~[(weld (trip label) ": unexpected overlap evidence")]
77− ?. =(message.p.detailed boundary) ~[(weld (trip label) ": rejected at the wrong boundary")]
77+ ?. =(message.p.detailed boundary)
78+ ~[(weld (weld (trip label) ": rejected at the wrong boundary: ") (trip message.p.detailed))]
7879 =/ legacy=jfile-result:jibb (program-update-legacy at src ~ prepared)
7980 ?: ?=(%& -.legacy) ~[(weld (trip label) ": legacy check accepted")]
8081 ?. =(p.legacy boundary) ~[(weld (trip label) ": legacy boundary differs")]
@@ -111,7 +112,7 @@
111112 ['malformed sample' at (snag 3 negatives) definitions u.prepared]
112113 ['non-two-slot sample' at (snag 4 negatives) definitions u.prepared]
113114 ['non-main same source' at (snag 5 negatives) definitions u.prepared]
114− ['unrelated pending tag' at (snag 6 negatives) definitions u.prepared]
115+ ['unrelated pending tag' at (snag 6 negatives) (show-error:jibb (snag 6 negatives) [at 16 13 "nothing fixes the union of %unrelated"]) u.prepared]
115116 ['missing canonical cmd' at island definitions without-cmd]
116117 ['missing canonical list' at (snag 7 negatives) definitions without-list]
117118 :- 'API path'
tests/lib/jibb-store.hoon+48−24
@@ -25,7 +25,6 @@
2525 ^- @t
2626 %+ rap 3
2727 :~ '+$ state [items=(list @t) open=?]\0a'
28− '+$ cart-action\0a [%add item=@t]\0a %toggle\0a'
2928 poke main init update extra
3029 ==
3130::
@@ -48,10 +47,10 @@
4847 %+ rap 3
4948 :~ '/= cart /ui/stores/cart\0a'
5049 '+$ local-state state.cart\0a'
51− '+$ local-action cart-action.cart\0a'
50+ '+$ local-action poke.cart\0a'
5251 '++ imported-main main.cart\0a'
5352 '++ imported-request |= reply=$-(local-state M) (state.cart reply)\0a'
54− '++ imported-poke |= action=local-action (cart-action.cart action)\0a'
53+ '++ imported-poke |= action=local-action (poke.cart action same)\0a'
5554 ==
5655::
5756++ store-rejections
@@ -96,9 +95,9 @@
9695 =/ forged=ifile:jibb
9796 cart(values [[%state [[%fn [%atom %t] [%atom %t]] ~]] ordinary])
9897 =/ without-action=ienv:jibb
99− (skim values.cart |=(entry=[name=term scheme=ischeme:jibb] !=(%cart-action name.entry)))
98+ (skim values.cart |=(entry=[name=term scheme=ischeme:jibb] !=(%poke name.entry)))
10099 =/ forged-action=ifile:jibb
101− cart(values [[%cart-action [[%fn [%atom %t] [%atom %t]] ~]] without-action])
100+ cart(values [[%poke [[%fn [%atom %t] [%atom %t]] ~]] without-action])
102101 =/ graphs=(list [label=tape graph=irequest-graph:jibb])
103102 :~ ["missing store evidence" missing]
104103 ["store source mismatch" mismatch]
@@ -149,31 +148,56 @@
149148 ?. =(actual-main '[init=[items=(list @t) open=?] update=*]') ~["cart main type differs"]
150149 ?. &(?=(~ vars.u.cart-main) ?=(~ (itype-vars:jibb typ.u.cart-main))) ~["cart main is open"]
151150 =/ state=(unit ischeme:jibb) (find-jibb-mold:jibb %state cart)
152− =/ action=(unit ischeme:jibb) (find-jibb-mold:jibb %cart-action cart)
151+ =/ action=(unit ischeme:jibb) (find-jibb-mold:jibb %poke cart)
153152 ?~ state ~["state mold is missing"]
154− ?~ action ~["cart-action mold is missing"]
155− ?^ (find-jibb-mold:jibb %poke cart) ~["poke declaration leaked as an exported mold"]
153+ ?~ action ~["local poke action mold is missing"]
156154 =/ ask=(unit ischeme:jibb) (request-compatible-ask:jibb u.prepared)
157− =/ poke=(unit ischeme:jibb) (store-compatible-poke:jibb u.prepared)
155+ =/ poke=(unit ischeme:jibb) (compatible-raw-poke:jibb u.prepared)
158156 ?~ ask ~["canonical ask is unavailable"]
159157 ?~ poke ~["canonical poke is unavailable"]
160158 =/ ask-result=(unit itype:jibb) (template-apply:jibb u.ask ~[[%var 0]])
161159 ?~ ask-result ~["canonical ask did not instantiate"]
162160 =/ expected-state=ischeme:jibb [[%fn [%fn typ.u.state [%var 0]] u.ask-result] ~[0]]
163− =/ expected-action=ischeme:jibb [[%fn typ.u.action typ.u.poke] ~]
161+ =/ expected-action=(unit ischeme:jibb) (derived-poke-command-scheme:jibb iface.u.prepared typ.u.action)
162+ ?~ expected-action ~["derived action scheme did not instantiate"]
163+ =/ command=(unit ischeme:jibb) (find-jibb-mold:jibb %cmd iface.u.prepared)
164+ =/ unit-template=(unit ischeme:jibb) (find-jibb-mold:jibb %unit iface.u.prepared)
165+ ?~ command ~["canonical cmd mold is missing"]
166+ ?~ unit-template ~["canonical unit mold is missing"]
167+ ?. ?=(%union -.typ.u.command) ~["canonical cmd is not a union"]
168+ =/ wrong-command=ischeme:jibb u.command(typ typ.u.command(cases ~))
169+ =/ wrong-command-prelude=ifile:jibb
170+ iface.u.prepared(molds (turn molds.iface.u.prepared |=(m=[name=term template=ischeme:jibb] ?:(=(%cmd name.m) [%cmd wrong-command] m))))
171+ ?. ?=(~ (derived-poke-command-scheme:jibb wrong-command-prelude typ.u.action))
172+ ~["derived poke accepted a noncanonical cmd"]
173+ =/ wrong-unit-prelude=ifile:jibb
174+ iface.u.prepared(molds (turn molds.iface.u.prepared |=(m=[name=term template=ischeme:jibb] ?:(=(%unit name.m) [%unit u.command] m))))
175+ ?. ?=(~ (derived-poke-command-scheme:jibb wrong-unit-prelude typ.u.action))
176+ ~["derived poke accepted a noncanonical unit"]
177+ =/ wrong-raw=ischeme:jibb u.poke(vars ~[0])
178+ =/ wrong-raw-prelude=ifile:jibb
179+ iface.u.prepared(molds (turn molds.iface.u.prepared |=(m=[name=term template=ischeme:jibb] ?:(=(%raw-poke name.m) [%raw-poke wrong-raw] m))))
180+ ?. ?=(~ (derived-poke-command-scheme:jibb wrong-raw-prelude typ.u.action))
181+ ~["derived poke accepted a generic raw-poke"]
182+ ?. ?=(%union -.typ.u.poke) ~["canonical raw-poke is not a union"]
183+ =/ wrong-raw-args=ischeme:jibb u.poke(typ typ.u.poke(args ~[[%atom %t]]))
184+ =/ wrong-raw-args-prelude=ifile:jibb
185+ iface.u.prepared(molds (turn molds.iface.u.prepared |=(m=[name=term template=ischeme:jibb] ?:(=(%raw-poke name.m) [%raw-poke wrong-raw-args] m))))
186+ ?. ?=(~ (derived-poke-command-scheme:jibb wrong-raw-args-prelude typ.u.action))
187+ ~["derived poke accepted raw-poke union arguments"]
164188 =/ state-values=(list [name=term scheme=ischeme:jibb])
165189 (skim values.cart |=(entry=[name=term scheme=ischeme:jibb] =(%state name.entry)))
166190 =/ action-values=(list [name=term scheme=ischeme:jibb])
167− (skim values.cart |=(entry=[name=term scheme=ischeme:jibb] =(%cart-action name.entry)))
191+ (skim values.cart |=(entry=[name=term scheme=ischeme:jibb] =(%poke name.entry)))
168192 ?. ?=([* ~] state-values) ~["derived state member is not unique"]
169193 ?. =(scheme.i.state-values expected-state) ~["derived state scheme differs"]
170− ?. ?=([* ~] action-values) ~["derived cart-action member is not unique"]
171− ?. =(scheme.i.action-values expected-action) ~["derived cart-action scheme differs"]
194+ ?. ?=([* ~] action-values) ~["derived poke member is not unique"]
195+ ?. =(scheme.i.action-values u.expected-action) ~["derived poke command scheme differs"]
172196 ?~ graph.cart ~["cart request graph is missing"]
173197 ?. ?=([* ~] stores.u.graph.cart) ~["cart store evidence is not unique"]
174198 =/ evidence=istore-request-evidence:jibb i.stores.u.graph.cart
175199 ?. &(=(store-at.evidence cart-at) =(source.evidence cart-source)) ~["store evidence does not retain exact path/source"]
176− ?. &(=(state.evidence typ.u.state) =(action.evidence typ.u.action) =(%cart-action action-name.evidence)) ~["store evidence types differ"]
200+ ?. &(=(state.evidence typ.u.state) =(action.evidence typ.u.action) =(%poke action-name.evidence)) ~["store evidence types differ"]
177201 =/ basket-result=jfile-detailed-result:jibb
178202 (store-detailed /ui/basket/jibb basket-source modules u.prepared)
179203 ?: ?=(%| -.basket-result) ~[(weld "basket was rejected: " (trip message.p.basket-result))]
@@ -209,37 +233,37 @@
209233 =/ direct=jfile-detailed-result:jibb
210234 (store-detailed /tests/direct/cart/jibb cart-source ~ u.prepared)
211235 ?: ?=(%| -.direct) ~["direct store outside /ui/stores was rejected"]
212− =/ grouped=@t (store-cart-source '+$ poke cart-action\0a' '++ main (store (init) (update))\0a' '++ init ^- state [~ %.n]\0a' '++ update |= [a=cart-action s=state]\0a ?- a\0a [%add item] s(items=[item items.s])\0a %toggle s(open=(not open.s))\0a' '')
236+ =/ grouped=@t (store-cart-source '+$ poke\0a [%add item=@t]\0a %toggle\0a' '++ main (store (init) (update))\0a' '++ init ^- state [~ %.n]\0a' '++ update |= [a=poke s=state]\0a ?- a\0a [%add item] s(items=[item items.s])\0a %toggle s(open=(not open.s))\0a' '')
213237 =/ grouped-result=jfile-detailed-result:jibb
214238 (store-detailed /tests/direct/grouped/jibb grouped ~ u.prepared)
215239 ?: ?=(%| -.grouped-result) ~[(weld "grouped direct store main was rejected: " (trip message.p.grouped-result))]
216− =/ gate-state=@t '+$ state [callback=$-(@t @t)]\0a+$ action %set\0a+$ poke action\0a++ main (store init update)\0a++ init ^- state [callback=same]\0a++ update |= [a=action s=state] s\0a'
240+ =/ gate-state=@t '+$ state [callback=$-(@t @t)]\0a+$ poke %set\0a++ main (store init update)\0a++ init ^- state [callback=same]\0a++ update |= [a=poke s=state] s\0a'
217241 =/ gate-result=jfile-detailed-result:jibb
218242 (store-detailed /tests/direct/gate-state/jibb gate-state ~ u.prepared)
219243 ?: ?=(%| -.gate-result) ~["gate-bearing store state was rejected"]
220244 =/ evidence-failures=(list tape) (store-evidence-failures cart basket basket-source iface.u.prepared)
221245 ?^ evidence-failures evidence-failures
222− =/ normal-poke=@t '+$ poke cart-action\0a'
246+ =/ normal-poke=@t '+$ poke\0a [%add item=@t]\0a %toggle\0a'
223247 =/ normal-main=@t '++ main (store init update)\0a'
224248 =/ normal-init=@t '++ init ^- state [~ %.n]\0a'
225− =/ normal-update=@t '++ update |= [a=cart-action s=state]\0a ?- a\0a [%add item] s(items=[item items.s])\0a %toggle s(open=(not open.s))\0a'
249+ =/ normal-update=@t '++ update |= [a=poke s=state]\0a ?- a\0a [%add item] s(items=[item items.s])\0a %toggle s(open=(not open.s))\0a'
226250 =/ cart-cases=(list [label=tape at=path src=@t modules=jbundle:jibb])
227251 :~ ["wrong init" /tests/store/wrong-init/jibb (store-cart-source normal-poke normal-main '++ init ^- state [~ "bad"]\0a' normal-update '') ~]
228252 ["wrong action" /tests/store/wrong-action/jibb (store-cart-source normal-poke normal-main normal-init '++ update |= [a=@t s=state] s\0a' '') ~]
229− ["wrong result" /tests/store/wrong-result/jibb (store-cart-source normal-poke normal-main normal-init '++ update |= [a=cart-action s=state] "bad"\0a' '') ~]
253+ ["wrong result" /tests/store/wrong-result/jibb (store-cart-source normal-poke normal-main normal-init '++ update |= [a=poke s=state] "bad"\0a' '') ~]
230254 ["unknown poke" /tests/store/unknown-poke/jibb (store-cart-source '+$ poke missing\0a' normal-main normal-init normal-update '') ~]
231− ["qualified poke" /tests/store/qualified-poke/jibb (store-cart-source '+$ poke cart-action.cart\0a' normal-main normal-init normal-update '') ~]
232− ["duplicate poke" /tests/store/duplicate-poke/jibb (store-cart-source '+$ poke cart-action\0a+$ poke cart-action\0a' normal-main normal-init normal-update '') ~]
255+ ["qualified poke" /tests/store/qualified-poke/jibb (store-cart-source '+$ poke poke.cart\0a' normal-main normal-init normal-update '') ~]
256+ ["duplicate poke" /tests/store/duplicate-poke/jibb (store-cart-source '+$ poke %one\0a+$ poke %two\0a' normal-main normal-init normal-update '') ~]
233257 ["duplicate state" /tests/store/duplicate-state/jibb (store-cart-source normal-poke normal-main normal-init normal-update '+$ state @t\0a') ~]
234258 ["state derived collision" /tests/store/state-collision/jibb (store-cart-source normal-poke normal-main normal-init normal-update '++ state 0\0a') ~]
235− ["action derived collision" /tests/store/action-collision/jibb (store-cart-source normal-poke normal-main normal-init normal-update '++ cart-action 0\0a') ~]
259+ ["action derived collision" /tests/store/action-collision/jibb (store-cart-source normal-poke normal-main normal-init normal-update '++ poke 0\0a') ~]
236260 ["import derived collision" /tests/store/import-collision/jibb (cat 3 '/= state /ui/stores/other\0a' (store-cart-source normal-poke normal-main normal-init normal-update '')) ~]
237261 ["alias main" /tests/store/alias-main/jibb (store-cart-source normal-poke '++ main (build init update)\0a' normal-init normal-update '++ build store\0a') ~]
238262 ["hand-built main" /tests/store/hand-main/jibb (store-cart-source normal-poke '++ main [init update]\0a' normal-init normal-update '') ~]
239263 ==
240− =/ normal-basket-update=@t '++ update |= [=msg m=model]\0a ?- msg\0a [%noted t] [m(note=t) ~]\0a %add [m(note="") ~[[%poke (cart-action.cart [%add note.m]) |=%acked]]]\0a %toggle [m ~[[%poke (cart-action.cart %toggle) |=%acked]]]\0a [%got c] [m(cart=c) ~]\0a [%acked err] [m ~]\0a'
264+ =/ normal-basket-update=@t '++ update |= [=msg m=model]\0a ?- msg\0a [%noted t] [m(note=t) ~]\0a %add [m(note="") ~[(poke.cart [%add note.m] |=%acked)]]\0a %toggle [m ~[(poke.cart %toggle |=%acked)]]\0a [%got c] [m(cart=c) ~]\0a [%acked err] [m ~]\0a'
241265 =/ normal-subs=@t '++ subs |= m=model\0a ~[[%watch (state.cart |=%got)]]\0a'
242− =/ wrong-payload=@t '++ update |= [=msg m=model]\0a ?- msg\0a [%noted t] [m(note=t) ~]\0a %add [m(note="") ~[[%poke (cart-action.cart [%add ~zod]) |=%acked]]]\0a %toggle [m ~[[%poke (cart-action.cart %toggle) |=%acked]]]\0a [%got c] [m(cart=c) ~]\0a [%acked err] [m ~]\0a'
266+ =/ wrong-payload=@t '++ update |= [=msg m=model]\0a ?- msg\0a [%noted t] [m(note=t) ~]\0a %add [m(note="") ~[(poke.cart [%add ~zod] |=%acked)]]\0a %toggle [m ~[(poke.cart %toggle |=%acked)]]\0a [%got c] [m(cart=c) ~]\0a [%acked err] [m ~]\0a'
243267 =/ basket-cases=(list [label=tape at=path src=@t modules=jbundle:jibb])
244268 :~ ["wrong poke payload" /ui/basket/jibb (store-basket-source wrong-payload normal-subs '') modules]
245269 ["wrong state reply" /ui/basket/jibb (store-basket-source normal-basket-update '++ subs |= m=model\0a ~[[%watch (state.cart |=%acked)]]\0a' '') modules]
tests/lib/jibb-todo-api.hoon+1−1
@@ -41,7 +41,7 @@
4141 =/ iface=ifile:jibb iface.p.out
4242 ?. =(source.iface `api) 'actual API source changed'
4343 =/ names=(list term) (turn values.iface |=(x=[name=term scheme=ischeme:jibb] name.x))
44− =/ required-values=(list term) ~[%todo-action %todos %changes %todo-by-id]
44+ =/ required-values=(list term) ~[%poke %todos %changes %todo-by-id]
4545 ?. (levy required-values |=(x=term (lien names |=(y=term =(x y))))) 'derived value missing'
4646 =/ mnames=(list term) (turn molds.iface |=(x=[name=term template=ischeme:jibb] name.x))
4747 =/ required-molds=(list term) ~[%item %todo-action %todos %todo-update %todo-item]
tests/lib/jibb-union-source.hoon+1−1
@@ -90,7 +90,7 @@
9090 =/ cap256=icaps:jibb (turn (gulf 0 255) |=(n=@ud ['A' n *span:jibb]))
9191 =/ cap257=icaps:jibb (turn (gulf 0 256) |=(n=@ud ['A' n *span:jibb]))
9292 =/ initial=istate:jibb
93− state(molds molds.u.g, at /tests/empty/jibb, active ~[%outer], caps ~[['Q' 17 *span:jibb]], tags ~[[42 [%term %tas %pending '%pending']]], sub ~[[71 [%atom %t]]], next 100)
93+ state(molds molds.u.g, at /tests/empty/jibb, active ~[%outer], caps ~[['Q' 17 *span:jibb]], tags ~[[42 [%term %tas %pending '%pending'] *span:jibb]], sub ~[[71 [%atom %t]]], next 100)
9494 =/ preserved=(unit [typ=itype:jibb state=istate:jibb]) (infer-simple-shape:jibb u.chosen initial)
9595 =/ structured=istate:jibb initial(params ~[['A' [%cell [%atom %t] [%atom %t]]]])
9696 =/ rejected=(unit [typ=itype:jibb state=istate:jibb]) (infer-simple-shape:jibb u.chosen structured)
tests/lib/jibb.hoon+2−1
@@ -31,6 +31,7 @@
3131/* src-3 %jibb /tests/golden/doc-grammar-02-buttons/source/jibb
3232/* tok-3 %txt /tests/golden/doc-grammar-02-buttons/tokens/txt
3333/* tre-3 %txt /tests/golden/doc-grammar-02-buttons/tree/txt
34+/* typ-3 %txt /tests/golden/doc-grammar-02-buttons/types/txt
3435/* src-4 %jibb /tests/golden/doc-grammar-03-view-day/source/jibb
3536/* tok-4 %txt /tests/golden/doc-grammar-03-view-day/tokens/txt
3637/* tre-4 %txt /tests/golden/doc-grammar-03-view-day/tree/txt
@@ -2467,7 +2468,7 @@
24672468++ test-doc-grammar-01-imports
24682469 (check ~.doc-grammar-01-imports src-2 `tok-2 `tre-2)
24692470++ test-doc-grammar-02-buttons
2470− (check ~.doc-grammar-02-buttons src-3 `tok-3 `tre-3)
2471+ (weld (check ~.doc-grammar-02-buttons src-3 `tok-3 `tre-3) (check-module-types ~.doc-grammar-02-buttons ~[%tests %golden ~.doc-grammar-02-buttons %source %jibb] src-3 `typ-3 ~ ~ ~))
24712472++ test-doc-grammar-03-view-day
24722473 (check ~.doc-grammar-03-view-day src-4 `tok-4 `tre-4)
24732474++ test-doc-grammar-04-step
tests/type-api-paths/poke-clash.txt+2
@@ -10,3 +10,5 @@
1010+$ paths
1111 [%todo-action /todos todos]
1212 [%todo-by-id /todo/[id=@ud] todo-item]
13+
14+++ poke "collision"
tests/type-gate-free/todo-gate.txt+2−2
@@ -19,8 +19,8 @@
1919 ?- (gth (lent (tuba (trip t))) 80)
2020 %.y [m(draft=t error=`"Too long") ~]
2121 %.n [m(draft=t error=~) ~]
22− %submit [m(draft="") ~[[%poke (todo-action.todo [%add draft.m]) |=%acked]]]
23− [%toggled id] [m ~[[%poke (todo-action.todo [%toggle id]) |=%acked]]]
22+ %submit [m(draft="") ~[(poke.todo [%add draft.m] |=%acked)]]
23+ [%toggled id] [m ~[(poke.todo [%toggle id] |=%acked)]]
2424 [%got ts] [m(todos=ts) ~]
2525 [%acked err] [m(error=err) ~]
2626
tests/type-gate-free/todo-noun.txt+2−2
@@ -19,8 +19,8 @@
1919 ?- (gth (lent (tuba (trip t))) 80)
2020 %.y [m(draft=t error=`"Too long") ~]
2121 %.n [m(draft=t error=~) ~]
22− %submit [m(draft="") ~[[%poke (todo-action.todo [%add draft.m]) |=%acked]]]
23− [%toggled id] [m ~[[%poke (todo-action.todo [%toggle id]) |=%acked]]]
22+ %submit [m(draft="") ~[(poke.todo [%add draft.m] |=%acked)]]
23+ [%toggled id] [m ~[(poke.todo [%toggle id] |=%acked)]]
2424 [%got ts] [m(todos=ts) ~]
2525 [%acked err] [m(error=err) ~]
2626
tests/type-gate-free/todo.txt+2−2
@@ -19,8 +19,8 @@
1919 ?- (gth (lent (tuba (trip t))) 80)
2020 %.y [m(draft=t error=`"Too long") ~]
2121 %.n [m(draft=t error=~) ~]
22− %submit [m(draft="") ~[[%poke (todo-action.todo [%add draft.m]) |=%acked]]]
23− [%toggled id] [m ~[[%poke (todo-action.todo [%toggle id]) |=%acked]]]
22+ %submit [m(draft="") ~[(poke.todo [%add draft.m] |=%acked)]]
23+ [%toggled id] [m ~[(poke.todo [%toggle id] |=%acked)]]
2424 [%got ts] [m(todos=ts) ~]
2525 [%acked err] [m(error=err) ~]
2626
tests/type-page-main/todo-island.txt+2−2
@@ -19,8 +19,8 @@
1919 ?- (gth (lent (tuba (trip t))) 80)
2020 %.y [m(draft=t error=`"Too long") ~]
2121 %.n [m(draft=t error=~) ~]
22− %submit [m(draft="") ~[[%poke (todo-action.todo [%add draft.m]) |=%acked]]]
23− [%toggled id] [m ~[[%poke (todo-action.todo [%toggle id]) |=%acked]]]
22+ %submit [m(draft="") ~[(poke.todo [%add draft.m] |=%acked)]]
23+ [%toggled id] [m ~[(poke.todo [%toggle id] |=%acked)]]
2424 [%got ts] [m(todos=ts) ~]
2525 [%acked err] [m(error=err) ~]
2626
tests/type-poke/about.txt+2−2
@@ -1,6 +1,6 @@
1−The internal prelude defines poke, while the public prelude re-exports it as an
1+The internal prelude defines raw-poke, while the public prelude re-exports it as an
22ordinary transparent type. A real Hoon mark is compiled and read by the importer
3−before the partial checker builds a poke-only API interface. The reports cover
3+before the partial checker builds a raw-poke-only API interface. The reports cover
44the constructor and mark mismatch, aliases and re-exports, ordinary construction
55and inspection, private import boundaries, unsupported or invalid API declarations,
66and preparation failures. The report remains partial; effect lowering and runtime
tests/type-poke/alias.txt+1−1
@@ -1,2 +1,2 @@
11/= fake /ui/internal
2−++ nope |= x=poke.fake x
2+++ nope |= x=raw-poke.fake x
tests/type-poke/client.txt+13−13
@@ -1,23 +1,23 @@
11/= todo /ui/api/todo
2−+$ copy poke
2++$ copy raw-poke
33+$ double copy
4−++ good (todo-action.todo "ok")
5−++ pass |= x=poke x
4+++ good (poke.todo "ok" same)
5+++ pass |= x=raw-poke x
66++ pass-alias |= x=copy x
7−++ direct ^- poke [%agent %todo %todo-action "x"]
7+++ direct ^- raw-poke [%agent %todo %todo-action "x"]
88++ alias ^- double [%agent %todo %todo-action "x"]
9−++ getter |= x=poke payload.x
10−++ inspect |= x=poke
9+++ getter |= x=raw-poke payload.x
10+++ inspect |= x=raw-poke
1111 ?- x
1212 [%agent a b c] "agent"
1313 [%store a b c] "store"
14−++ change |= x=poke x(payload="new")
15−++ cast-atom ^- poke 0
14+++ change |= x=raw-poke x(payload="new")
15+++ cast-atom ^- raw-poke 0
1616++ leaked |= x=copy ^- @t x
17−++ split |= x=poke
17+++ split |= x=raw-poke
1818 ?- x
1919 [a b] a
20−++ number [(todo-action.todo "write") 1]
21−++ bad-constructor (todo-action.todo ~zod)
22−++ bad-mark ^- poke [%agent %todo 0x1f "x"]
23−++ bad-case ^- poke [%alien %todo %todo-action "x"]
20+++ number ^- [(cmd (unit @t)) @ud] [(poke.todo "write" same) 1]
21+++ bad-constructor (poke.todo ~zod same)
22+++ bad-mark ^- raw-poke [%agent %todo 0x1f "x"]
23+++ bad-case ^- raw-poke [%alien %todo %todo-action "x"]
tests/type-poke/direct.txt+1−1
@@ -1,2 +1,2 @@
11/= leak /lib/jibb/internal
2−++ nope |= x=poke.leak x
2+++ nope |= x=raw-poke.leak x
tests/type-poke/expected.txt+21−21
@@ -6,45 +6,45 @@ partial inference; module not checked
66partial inference; module not checked
77+$ copy: not checked
88+$ double: not checked
9−++ good: poke
10−++ pass: $-(poke poke)
11−++ pass-alias: $-(poke poke)
12−++ direct: poke
13−++ alias: poke
9+++ good: (cmd (unit @t))
10+++ pass: $-(raw-poke raw-poke)
11+++ pass-alias: $-(raw-poke raw-poke)
12+++ direct: raw-poke
13+++ alias: raw-poke
1414++ getter: field is not available to partial inference
15−++ inspect: $-(poke @t)
15+++ inspect: $-(raw-poke @t)
1616++ change: change target needs a known record in partial inference
1717++ cast-atom: cast constraint is not supported by partial inference
1818++ leaked: cast constraint is not supported by partial inference
1919++ split: cell pattern subject is not supported by partial inference
20−++ number: [poke @ud]
20+++ number: [(cmd (unit @t)) @ud]
2121++ bad-constructor: call's sample and argument types do not unify
2222/ui/test.jibb:21:21: called gate
23−++ bad-constructor (todo-action.todo ~zod)
23+++ bad-constructor (poke.todo ~zod same)
2424 ^
25−/ui/test.jibb:21:38: argument has type @p
26−++ bad-constructor (todo-action.todo ~zod)
27− ^
25+/ui/test.jibb:21:31: argument has type @p
26+++ bad-constructor (poke.todo ~zod same)
27+ ^
2828++ bad-mark: cast mold and expression type do not unify
2929/ui/test.jibb:22:16: cast mold
30−++ bad-mark ^- poke [%agent %todo 0x1f "x"]
30+++ bad-mark ^- raw-poke [%agent %todo 0x1f "x"]
3131 ^
32−/ui/test.jibb:22:21: expression
33−++ bad-mark ^- poke [%agent %todo 0x1f "x"]
34− ^
32+/ui/test.jibb:22:25: expression
33+++ bad-mark ^- raw-poke [%agent %todo 0x1f "x"]
34+ ^
3535++ bad-case: cast mold and expression type do not unify
3636/ui/test.jibb:23:16: cast mold
37−++ bad-case ^- poke [%alien %todo %todo-action "x"]
37+++ bad-case ^- raw-poke [%alien %todo %todo-action "x"]
3838 ^
39−/ui/test.jibb:23:21: expression
40−++ bad-case ^- poke [%alien %todo %todo-action "x"]
41− ^
39+/ui/test.jibb:23:25: expression
40+++ bad-case ^- raw-poke [%alien %todo %todo-action "x"]
41+ ^
4242partial inference; module not checked
4343the prelude internal module is private
4444partial inference; module not checked
4545++ nope: sample mold is not supported by partial inference
4646partial inference; module not checked
47−++ pass: $-(poke poke)
47+++ pass: $-(raw-poke raw-poke)
4848++ fake-to-real: cast constraint is not supported by partial inference
4949++ real-to-fake: cast constraint is not supported by partial inference
5050++ match-tag: union pattern is not supported by partial inference
@@ -63,4 +63,4 @@ API module needs unsupported inference: /ui/api/todo/jibb
6363partial inference; module not checked
6464API module needs unsupported inference: /ui/api/todo/jibb
6565partial inference; module not checked
66−module has conflicting names: /ui/wrong/todo/jibb
66+++ test: module member is not available to partial inference
tests/type-poke/exported.txt+4−4
@@ -1,9 +1,9 @@
11/= public /ui/public
22/= fake /ui/internal
3−++ pass |= x=exposed.public ^- poke x
4−++ fake-to-real |= x=faux.fake ^- poke x
5−++ real-to-fake |= x=poke ^- faux.fake x
6−++ match-tag |= x=poke
3+++ pass |= x=exposed.public ^- raw-poke x
4+++ fake-to-real |= x=faux.fake ^- raw-poke x
5+++ real-to-fake |= x=raw-poke ^- faux.fake x
6+++ match-tag |= x=raw-poke
77 ?- x
88 %agent "a"
99 * "b"
tests/type-poke/inner.txt+1−1
@@ -1,2 +1,2 @@
11/= hidden /lib/jibb/internal
2−+$ exported poke.hidden
2++$ exported raw-poke.hidden
tests/type-poke/public.txt+1−1
@@ -1,2 +1,2 @@
1−+$ exposed poke
1++$ exposed raw-poke
22++ carry |= x=exposed x
tests/type-poke/transitive.txt+1−1
@@ -1,2 +1,2 @@
11/= leaked /ui/inner
2−++ nope |= x=poke.leaked x
2+++ nope |= x=raw-poke.leaked x
tests/type-store/basket.txt+2−2
@@ -17,8 +17,8 @@
1717++ update |= [=msg m=model]
1818 ?- msg
1919 [%noted t] [m(note=t) ~]
20− %add [m(note="") ~[[%poke (cart-action.cart [%add note.m]) |=%acked]]]
21− %toggle [m ~[[%poke (cart-action.cart %toggle) |=%acked]]]
20+ %add [m(note="") ~[(poke.cart [%add note.m] |=%acked)]]
21+ %toggle [m ~[(poke.cart %toggle |=%acked)]]
2222 [%got c] [m(cart=c) ~]
2323 [%acked err] [m ~]
2424
tests/type-store/cart.txt+2−3
@@ -1,13 +1,12 @@
11:: /ui/stores/cart.jibb
22+$ state [items=(list @t) open=?]
3−+$ cart-action
3++$ poke
44 [%add item=@t]
55 %toggle
6−+$ poke cart-action
76
87++ main (store init update)
98++ init ^- state [~ %.n]
10−++ update |= [a=cart-action s=state]
9+++ update |= [a=poke s=state]
1110 ?- a
1211 [%add item] s(items=[item items.s])
1312 %toggle s(open=(not open.s))
tests/type-todo-api/expected.txt+1−1
@@ -6,7 +6,7 @@ partial inference; module not checked
66++ by-id-ship: (ask @p)
77++ changes-cord: (ask @t)
88++ changes-ship: (ask @p)
9−++ action: poke
9+++ action: (cmd (unit @t))
1010++ item-id: $-([id=@ud [done=? text=@t]] @ud)
1111++ action-id: $-(([%add text=@t] [%toggle id=@ud]) ([%add text=@t] [%toggle id=@ud]))
1212++ todos-id: $-((list [id=@ud [done=? text=@t]]) (list [id=@ud [done=? text=@t]]))
tests/type-todo-api/negative-expected.txt+4−4
@@ -10,11 +10,11 @@ partial inference; module not checked
1010++ missing-fold: call constraint is not supported by partial inference
1111++ bad-action: call's sample and argument types do not unify
1212/tests/type-todo-api/negative.jibb:5:16: called gate
13−++ bad-action (todo-action.api [%typo text="hello"])
13+++ bad-action (poke.api [%typo text="hello"] same)
1414 ^
15−/tests/type-todo-api/negative.jibb:5:32: argument
16−++ bad-action (todo-action.api [%typo text="hello"])
17− ^
15+/tests/type-todo-api/negative.jibb:5:25: argument
16+++ bad-action (poke.api [%typo text="hello"] same)
17+ ^
1818+$ msg: cases proven disjoint; mold not checked
1919++ missing: call's sample and argument types do not unify
2020/tests/type-todo-api/negative.jibb:9:26: called gate
tests/type-todo-api/negative.txt+1−1
@@ -2,7 +2,7 @@
22++ no-sur-export |= x=todo.api x
33++ bad-param (todo-by-id.api ~zod |=(x=todo-item.api "ok"))
44++ missing-fold (changes.api |=(xs=todos.api "ok"))
5−++ bad-action (todo-action.api [%typo text="hello"])
5+++ bad-action (poke.api [%typo text="hello"] same)
66+$ msg
77 [%got todos=(list item.api)]
88 %other
tests/type-todo-api/source.txt+1−1
@@ -6,7 +6,7 @@
66++ by-id-ship (todo-by-id.api 2 |=(x=todo-item.api ~zod))
77++ changes-cord (changes.api |=(xs=todos.api "ok") fold)
88++ changes-ship (changes.api |=(xs=todos.api ~zod) fold)
9−++ action (todo-action.api [%add text="hello"])
9+++ action (poke.api [%add text="hello"] same)
1010++ item-id |= x=item.api id.x
1111++ action-id |= x=todo-action.api x
1212++ todos-id |= x=todos.api x
tests/type-todo-full/alias.txt+2−2
@@ -19,8 +19,8 @@
1919 ?- (gth (lent (tuba (trip t))) 80)
2020 %.y [m(draft=t error=`"Too long") ~]
2121 %.n [m(draft=t error=~) ~]
22− %submit [m(draft="") ~[[%poke (todo-action.todo [%add draft.m]) |=%acked]]]
23− [%toggled id] [m ~[[%poke (todo-action.todo [%toggle id]) |=%acked]]]
22+ %submit [m(draft="") ~[(poke.todo [%add draft.m] |=%acked)]]
23+ [%toggled id] [m ~[(poke.todo [%toggle id] |=%acked)]]
2424 [%got ts] [m(todos=ts) ~]
2525 [%acked err] [m(error=err) ~]
2626
tests/type-todo-full/ambiguous-mapper.txt+2−2
@@ -19,8 +19,8 @@
1919 ?- (gth (lent (tuba (trip t))) 80)
2020 %.y [m(draft=t error=`"Too long") ~]
2121 %.n [m(draft=t error=~) ~]
22− %submit [m(draft="") ~[[%poke (todo-action.todo [%add draft.m]) |=%acked]]]
23− [%toggled id] [m ~[[%poke (todo-action.todo [%toggle id]) |=%acked]]]
22+ %submit [m(draft="") ~[(poke.todo [%add draft.m] |=%acked)]]
23+ [%toggled id] [m ~[(poke.todo [%toggle id] |=%acked)]]
2424 [%got ts] [m(todos=ts) ~]
2525 [%acked err] [m(error=err) ~]
2626
tests/type-todo-full/non-gate-view.txt+2−2
@@ -19,8 +19,8 @@
1919 ?- (gth (lent (tuba (trip t))) 80)
2020 %.y [m(draft=t error=`"Too long") ~]
2121 %.n [m(draft=t error=~) ~]
22− %submit [m(draft="") ~[[%poke (todo-action.todo [%add draft.m]) |=%acked]]]
23− [%toggled id] [m ~[[%poke (todo-action.todo [%toggle id]) |=%acked]]]
22+ %submit [m(draft="") ~[(poke.todo [%add draft.m] |=%acked)]]
23+ [%toggled id] [m ~[(poke.todo [%toggle id] |=%acked)]]
2424 [%got ts] [m(todos=ts) ~]
2525 [%acked err] [m(error=err) ~]
2626
tests/type-todo-full/open-key.txt+2−2
@@ -19,8 +19,8 @@
1919 ?- (gth (lent (tuba (trip t))) 80)
2020 %.y [m(draft=t error=`"Too long") ~]
2121 %.n [m(draft=t error=~) ~]
22− %submit [m(draft="") ~[[%poke (todo-action.todo [%add draft.m]) |=%acked]]]
23− [%toggled id] [m ~[[%poke (todo-action.todo [%toggle id]) |=%acked]]]
22+ %submit [m(draft="") ~[(poke.todo [%add draft.m] |=%acked)]]
23+ [%toggled id] [m ~[(poke.todo [%toggle id] |=%acked)]]
2424 [%got ts] [m(todos=ts) ~]
2525 [%acked err] [m(error=err) ~]
2626
tests/type-todo-full/wrong-message.txt+2−2
@@ -19,8 +19,8 @@
1919 ?- (gth (lent (tuba (trip t))) 80)
2020 %.y [m(draft=t error=`"Too long") ~]
2121 %.n [m(draft=t error=~) ~]
22− %submit [m(draft="") ~[[%poke (todo-action.todo [%add draft.m]) |=%acked]]]
23− [%toggled id] [m ~[[%poke (todo-action.todo [%toggle id]) |=%acked]]]
22+ %submit [m(draft="") ~[(poke.todo [%add draft.m] |=%acked)]]
23+ [%toggled id] [m ~[(poke.todo [%toggle id] |=%acked)]]
2424 [%got ts] [m(todos=ts) ~]
2525 [%acked err] [m(error=err) ~]
2626
tests/type-todo-full/wrong-model.txt+2−2
@@ -19,8 +19,8 @@
1919 ?- (gth (lent (tuba (trip t))) 80)
2020 %.y [m(draft=t error=`"Too long") ~]
2121 %.n [m(draft=t error=~) ~]
22− %submit [m(draft="") ~[[%poke (todo-action.todo [%add draft.m]) |=%acked]]]
23− [%toggled id] [m ~[[%poke (todo-action.todo [%toggle id]) |=%acked]]]
22+ %submit [m(draft="") ~[(poke.todo [%add draft.m] |=%acked)]]
23+ [%toggled id] [m ~[(poke.todo [%toggle id] |=%acked)]]
2424 [%got ts] [m(todos=ts) ~]
2525 [%acked err] [m(error=err) ~]
2626
tests/type-todo-full/wrong-result.txt+2−2
@@ -19,8 +19,8 @@
1919 ?- (gth (lent (tuba (trip t))) 80)
2020 %.y [m(draft=t error=`"Too long") ~]
2121 %.n [m(draft=t error=~) ~]
22− %submit [m(draft="") ~[[%poke (todo-action.todo [%add draft.m]) |=%acked]]]
23− [%toggled id] [m ~[[%poke (todo-action.todo [%toggle id]) |=%acked]]]
22+ %submit [m(draft="") ~[(poke.todo [%add draft.m] |=%acked)]]
23+ [%toggled id] [m ~[(poke.todo [%toggle id] |=%acked)]]
2424 [%got ts] [m(todos=ts) ~]
2525 [%acked err] [m(error=err) ~]
2626
tests/type-todo-full/wrong-watch.txt+2−2
@@ -19,8 +19,8 @@
1919 ?- (gth (lent (tuba (trip t))) 80)
2020 %.y [m(draft=t error=`"Too long") ~]
2121 %.n [m(draft=t error=~) ~]
22− %submit [m(draft="") ~[[%poke (todo-action.todo [%add draft.m]) |=%acked]]]
23− [%toggled id] [m ~[[%poke (todo-action.todo [%toggle id]) |=%acked]]]
22+ %submit [m(draft="") ~[(poke.todo [%add draft.m] |=%acked)]]
23+ [%toggled id] [m ~[(poke.todo [%toggle id] |=%acked)]]
2424 [%got ts] [m(todos=ts) ~]
2525 [%acked err] [m(error=err) ~]
2626