on master help sign in
Restore raw-poke command helpers
fb6373fiko
docs/compiler.md+3−3
@@ -120,7 +120,7 @@ For a unique supported declaration, `+api-request-parts` retains that evidence w
120
120
121`+api-support-analysis-source` additionally infers supported ordinary API molds and values, resolves every declared mark, and retains their source, dependency and path evidence. Unsupported helpers or marks fail closed. An unused `/-` core is not independently validated, ordinary definitions that need derived gates remain unsupported, and this result is not a checked API interface or an exported request.
121`+api-support-analysis-source` additionally infers supported ordinary API molds and values, resolves every declared mark, and retains their source, dependency and path evidence. Unsupported helpers or marks fail closed. An unused `/-` core is not independently validated, ordinary definitions that need derived gates remain unsupported, and this result is not a checked API interface or an exported request.
122
122
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.
124
124
125A call whose direct result is a known named generic union can receive a matching same-origin, same-arity result context before its arguments are inferred. This retains the ordered generic arguments and existing capital checks; pending tags, recursive or variable-bound origins and unrestricted atom cases remain conservative. Constructor fitting reports unsupported when an unresolved or opaque case could contain the requested tagged head. It keeps definite missing-case errors for proven nonmatching cases, including an explicitly atom-only faced head. The real todo callback `|=%got` can infer when an `(ask msg)` result context fixes its message union; the uncontextualized call remains unsupported.
125A call whose direct result is a known named generic union can receive a matching same-origin, same-arity result context before its arguments are inferred. This retains the ordered generic arguments and existing capital checks; pending tags, recursive or variable-bound origins and unrestricted atom cases remain conservative. Constructor fitting reports unsupported when an unresolved or opaque case could contain the requested tagged head. It keeps definite missing-case errors for proven nonmatching cases, including an explicitly atom-only faced head. The real todo callback `|=%got` can infer when an `(ask msg)` result context fixes its message union; the uncontextualized call remains unsupported.
126
126
@@ -132,9 +132,9 @@ A full ordinary module may export a narrow checked program `main` only as a dire
132
132
133The 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.
133The same post-inference, post-request-graph kind boundary accepts a static `main` by instantiating its ordinary scheme, fitting it to canonical `(element !!)`, requiring the specialized result closed, and publishing that closed canonical scheme. Thus `main view` works when `view` is generic only in its element message. A data page must instead be a direct `(page load view)` call with simple wing arguments and a closed main type invariant against the instantiated canonical `page` mold. Its named load must be a direct gate whose transparent body is exactly `case.face reply`, with a simple wing or direct constructor reply. Page loads and direct program watches share the exact plain derived-member/request-evidence check: unique evidence in the selected interface's own graph, matching API source and inner case name, no typed path segments, diffs or scry. Page aliases, indirect or hand-built/pure/unknown requests, other main types and store paths fail closed. These are interface checks only, not rendering or runtime request claims.
134
134
135−A store `main` is recognized only as a direct, unqualified `(store init update)` call with two simple wing arguments, modulo grouping, independently of its directory. Its module must declare exactly one ordinary `state` mold and one `+$ 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.
136
136
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.
138
138
139When 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.
139When only that program's initializer and `main` are unresolved, a bounded transactional retry can derive the initializer's expected gate from the resolved update, view and subscription components. It instantiates all schemes above the greatest variable ID in the module and prelude, reuses the source-backed positional fit and stable replay, and leaves only the initializer's data variable open. The named initializer must be a direct gate whose transparent body is a tuple ending in null. Its own sample fixes data; ordinary inference, product and whole-gate fits, pending-tag and finalization checks, and a fresh ordinary `main` inference must all succeed before the ordinary kind and graph checks publish anything. Aliases, non-main libraries, simultaneous unresolved subscriptions, nonempty subscriptions and unrelated pending tags decline.
140
140
docs/development.md+1−1
@@ -98,7 +98,7 @@ git clone https://github.com/urbit/tools /root/src/tools
98| `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 |
98| `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 |
99| `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 |
99| `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 |
100| `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 |
100| `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 |
102| `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 |
102| `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 |
103| `tools/type-closed-gate-guards-test` | Checks closed gate sample labels and face uncertainty under eval and on the ship |
103| `tools/type-closed-gate-guards-test` | Checks closed gate sample labels and face uncertainty under eval and on the ship |
104| `tools/type-constructor-fit-guards-test` | Checks constructor-case uncertainty and known mismatches under eval and on the ship |
104| `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:
49
49
50## First steps
50## First steps
51
51
52−1. **Specify the prelude inventory.** The checker needs the prelude's complete exported inventory and signatures; include all names from the listed Hoon library sections except explicitly excluded groups, as `docs/open-questions.md` question 3 records. The prelude imports private helpers and low-level primitives from a separate internal module without exposing them; its public foundational gates are implemented in Jibb on those primitives. The source-backed internal module defines `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`.
53
53
54 The plan's three core-language rules were adopted: gate-free `eq` arguments and map and set keys, with gates opaque for union matching; jetted prelude functions taking gates; and rejection of a non-gate value that depends on itself even through a gate.
54 The plan's three core-language rules were adopted: gate-free `eq` arguments and map and set keys, with gates opaque for union matching; jetted prelude functions taking gates; and rejection of a non-gate value that depends on itself even through a gate.
552. **Start the importer early**, as the plan's Risks ask: first on a small `/sur` file, then on Tlon's. "Suggested design" below has a way in.
552. **Start the importer early**, as the plan's Risks ask: first on a small `/sur` file, then on Tlon's. "Suggested design" below has a way in.
@@ -70,7 +70,7 @@ The rules are scattered across the tabs. This is a map of them, not a replacemen
70- Generic molds: `+$ result |$ [V E]` with cases below, applied as `(result V E)`; `|$` goes right after a `+$`'s name, and the prelude's `cmd` and `sub` use `|$ [M]`.
70- Generic molds: `+$ result |$ [V E]` with cases below, applied as `(result V E)`; `|$` goes right after a `+$`'s name, and the prelude's `cmd` and `sub` use `|$ [M]`.
71- `!!` is the empty mold, and as an expression it has any type. `*` is the noun type, not a type variable; generic positions such as the keys in `each` and `table` use a capital. A value of a more specific noun type can be used where `*` is expected.
71- `!!` is the empty mold, and as an expression it has any type. `*` is the noun type, not a type variable; generic positions such as the keys in `each` and `table` use a capital. A value of a more specific noun type can be used where `*` is expected.
72- `_` is an inferable hole wherever a mold can appear, including an inferred path-segment aura. A hole resolved to an explicitly named generic variable is resolved; an unconstrained hole is an error. A named mold or value definition must determine its own holes without constraints from later uses.
72- `_` is an inferable hole wherever a mold can appear, including an inferred path-segment aura. A hole resolved to an explicitly named generic variable is resolved; an unconstrained hole is an error. A named mold or value definition must determine its own holes without constraints from later uses.
73−- `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.
74- The Literals table gives every other literal its type: `0x1f` a `@ux`, ships `@p`, dates `@da`, durations `@dr`, `~.knot` a `@ta`, strings `@t`, `` `x `` a `(unit A)`, `~[…]` a `(list A)`, `gap+%s2` the pair `[%gap %s2]`, `/posts/~zod` a `path`, `%/blog` a `qath`.
74- The Literals table gives every other literal its type: `0x1f` a `@ux`, ships `@p`, dates `@da`, durations `@dr`, `~.knot` a `@ta`, strings `@t`, `` `x `` a `(unit A)`, `~[…]` a `(list A)`, `gap+%s2` the pair `[%gap %s2]`, `/posts/~zod` a `path`, `%/blog` a `qath`.
75
75
76**Tags, `~`, numbers and cells wait for their context** (Grammar: Tag resolution, Literals by context)
76**Tags, `~`, numbers and cells wait for their context** (Grammar: Tag resolution, Literals by context)
@@ -93,7 +93,7 @@ The rules are scattered across the tabs. This is a map of them, not a replacemen
93
93
94**Names and modules** (Grammar: Modules, Imports, Runes, Expressions; Core language: Programs and linking)
94**Names and modules** (Grammar: Modules, Imports, Runes, Expressions; Core language: Programs and linking)
95- "No name may shadow one already in scope, imports and the prelude included": samples, local `++`s and pattern binders too. The backends rely on it (Core language, "No shadowing").
95- "No name may shadow one already in scope, imports and the prelude included": samples, local `++`s and pattern binders too. The backends rely on it (Core language, "No shadowing").
96−- Molds and values have separate namespaces, "told apart by position": `todo-action.todo` is a mold and 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.
97- Local definitions may start any body, "visible to each other and the final expression".
97- Local definitions may start any body, "visible to each other and the final expression".
98- `/- todo` gives the molds of `/sur/todo.hoon` the module uses; `/% %todo-action` gives a mark's type, named after the mark, with no face; `/= card /ui/components/card` gives a Jibb module. API modules re-export their `/%` types, "not `/-` faces or `/=` modules". Import cycles are errors.
98- `/- todo` gives the molds of `/sur/todo.hoon` the module uses; `/% %todo-action` gives a mark's type, named after the mark, with no face; `/= card /ui/components/card` gives a Jibb module. API modules re-export their `/%` types, "not `/-` faces or `/=` modules". Import cycles are errors.
99- Imports and prelude groups are records, read with `.`: `card.card`, `space.theme.theme`, `get.by`. "A module used as a whole value is a cell of its definitions, in name order."
99- Imports and prelude groups are records, read with `.`: `card.card`, `space.theme.theme`, `get.by`. "A module used as a whole value is a cell of its definitions, in name order."
@@ -110,8 +110,8 @@ The rules are scattered across the tabs. This is a map of them, not a replacemen
110
110
111**API files, stores and derived gates** (overview: Agent APIs, Effects; Grammar: Modules)
111**API files, stores and derived gates** (overview: Agent APIs, Effects; Grammar: Modules)
112- `/ui/api/<agent>.jibb` declares `+$ poke` and `+$ paths`; "`poke` and `paths` are declarations, not molds." "A path case is a request name, a path and a type", and "A case can name another scry path, as in `[%changes /updates (facts todos todo-update) scry=/todos]`, used only by pages." An island may watch a request only when the checker proves it is watchable; a separate `scry=` path or unknown watchability is a type error.
112- `/ui/api/<agent>.jibb` declares `+$ poke` and `+$ paths`; "`poke` and `paths` are declarations, not molds." "A path case is a request name, a path and a type", and "A case can name another scry path, as in `[%changes /updates (facts todos todo-update) scry=/todos]`, used only by pages." An island may watch a request only when the checker proves it is watchable; a separate `scry=` path or unknown watchability is a type error.
113−- Each 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)`.
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 `+$ 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.
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.
115
115
116**The prelude** (overview: Prelude, Layout and styling, Links and URLs, Effects)
116**The prelude** (overview: Prelude, Layout and styling, Links and URLs, Effects)
117- Hoon's standard library regrouped, "written in Jibb and vendored as `/lib/jibb/prelude`", plus `eq`, `not`, `page`, `program`, `store`, `pure`, `island`, the layout elements and molds, `attr`, `theme`, and `cmd` and `sub` as the overview's Effects block writes them.
117- Hoon's standard library regrouped, "written in Jibb and vendored as `/lib/jibb/prelude`", plus `eq`, `not`, `page`, `program`, `store`, `pure`, `island`, the layout elements and molds, `attr`, `theme`, and `cmd` and `sub` as the overview's Effects block writes them.
docs/spec/core-language.md+2−2
@@ -108,8 +108,8 @@ The todo island's `update`, from worked example 3:
108 ?- (gth (lent (tuba (trip t))) 80)
108 ?- (gth (lent (tuba (trip t))) 80)
109 %.y [m(draft=t error=`"Too long") ~]
109 %.y [m(draft=t error=`"Too long") ~]
110 %.n [m(draft=t error=~) ~]
110 %.n [m(draft=t error=~) ~]
111− %submit [m(draft="") ~[[%poke (todo-action.todo [%add draft.m]) |=%acked]]]
111+ %submit [m(draft="") ~[(poke.todo [%add draft.m] |=%acked)]]
112− [%toggled id] [m ~[[%poke (todo-action.todo [%toggle id]) |=%acked]]]
112+ [%toggled id] [m ~[(poke.todo [%toggle id] |=%acked)]]
113 [%got ts] [m(todos=ts) ~]
113 [%got ts] [m(todos=ts) ~]
114 [%acked err] [m(error=err) ~]
114 [%acked err] [m(error=err) ~]
115```
115```
docs/spec/decisions.md+4−4
@@ -31,11 +31,11 @@ The choices behind the Language tab, made on 2026-10-23; a later date marks a re
31| Equality and negation | The gates `eq` and `not`, with Hoon's bitwise `not` exposed as `not.bit`; `eq`'s arguments and map and set keys contain no gates, even nested; the checker infers and generalizes that constraint; union matching never inspects a gate to distinguish cases | Decided 2026-10-30 |
31| Equality and negation | The gates `eq` and `not`, with Hoon's bitwise `not` exposed as `not.bit`; `eq`'s arguments and map and set keys contain no gates, even nested; the checker infers and generalizes that constraint; union matching never inspects a gate to distinguish cases | Decided 2026-10-30 |
32| Special rules | No built-ins; type-directed rules are welcome, each listed in the Grammar tab | Decided 2026-10-29 |
32| Special rules | No built-ins; type-directed rules are welcome, each listed in the Grammar tab | Decided 2026-10-29 |
33| Inference | Hindley–Milner with aura variables; `@` is any atom, a specific atom fits `@` and a more specific aura fits an ancestor in its Hoon aura family, but each reverse needs a check, and repeated atom-constrained capitals give the same type; a number takes `@ud` only where its `++` isn't generic over its aura; distinct specific auras remain distinct; faces are part of record types, and an unnamed position can take a face but two different faces don't unify; principal types | Decided 2026-10-30 |
33| Inference | Hindley–Milner with aura variables; `@` is any atom, a specific atom fits `@` and a more specific aura fits an ancestor in its Hoon aura family, but each reverse needs a check, and repeated atom-constrained capitals give the same type; a number takes `@ud` only where its `++` isn't generic over its aura; distinct specific auras remain distinct; faces are part of record types, and an unnamed position can take a face but two different faces don't unify; principal types | Decided 2026-10-30 |
34−| 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 |
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 `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 |
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 |
36| Agent APIs | `/ui/api/<agent>.jibb` with `+$ poke` and `+$ paths`, over the agent's mark types; a case is a name, a path and a type, with `(facts full diff …)` for diffs, told apart by mark; an optional scry path, for pages; an island may watch a request only when the checker proves it is watchable, so a separate scry path or unknown watchability is an error; typed segments by aura | Decided 2026-10-31 |
36| Agent APIs | `/ui/api/<agent>.jibb` with `+$ poke` and `+$ paths`, over the agent's mark types; a case is a name, a path and a type, with `(facts full diff …)` for diffs, told apart by mark; an optional scry path, for pages; an island may watch a request only when the checker proves it is watchable, so a separate scry path or unknown watchability is an error; typed segments by aura | Decided 2026-10-31 |
37| Mark names | Any name: `/%` names types after marks, and constructors poke with their type's mark; no alias marks | Decided 2026-10-26 |
37| Mark names | Any name: `/%` names types after marks, and constructors poke with their type's mark; no alias marks | Decided 2026-10-26 |
38−| 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 |
39| Hoon types | A fixed translation table; `map`, `set`, `qeu`, `jar`, `jug` by name; `mop` as `(mop K V)`, read with `on`; imported `$%`, `$?` and `$^` cases must differ as nouns, and records with duplicate field names are errors where used; unused molds skipped | Decided 2026-10-30 |
39| Hoon types | A fixed translation table; `map`, `set`, `qeu`, `jar`, `jug` by name; `mop` as `(mop K V)`, read with `on`; imported `$%`, `$?` and `$^` cases must differ as nouns, and records with duplicate field names are errors where used; unused molds skipped | Decided 2026-10-30 |
40| 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 |
40| Record fields | Duplicate field names in a Jibb-written record are an error, as they are in an imported Hoon record | Decided 2026-10-31 |
41| 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 |
41| Record projection | The explicit type-directed operation `proj` takes a record and uses its expected result type to select its fields; no projection is inserted automatically. `proj` is reserved and cannot be defined or imported under that name. The result has exactly the fields declared by its type | Decided 2026-10-31 |
@@ -72,7 +72,7 @@ The choices behind the Language tab, made on 2026-10-23; a later date marks a re
72| Inputs | A message per input event, none mid-composition; controls reset to the latest view after every event; fields read-only until the island starts | Decided 2026-10-29 |
72| Inputs | A message per input event, none mid-composition; controls reset to the latest view after every event; fields read-only until the island starts | Decided 2026-10-29 |
73| Transactions | None; one poke per command | Decided |
73| Transactions | None; one poke per command | Decided |
74| Reloads | Restart from the model the page is served with | Decided 2026-10-29 |
74| Reloads | Restart from the model the page is served with | Decided 2026-10-29 |
75−| Shared state | Stores: browser agents written like API files, with `state`, `+$ poke` and `(store init update)`; the store's `+$ poke` is a declaration, not a mold; derived gates provide poke constructors and state requests; one per page | Decided 2026-10-31 |
75+| Shared state | Stores: browser agents written like API files, with `state`, a local `+$ poke` action mold and `(store init update)`; derived gates provide the generic `poke` command helper and state requests; one per page | Decided 2026-11-01 |
76| Store builder | `+$ store |$ [S] [init=S update=*]`, with `++ store |= [init=S update=$-([A S] S)] ^- (store S) [init update]`: the builder checks action `A`, while `main` exposes only state `S`; the store kind check verifies `A` against the poke declaration | Decided 2026-11-01 |
76| Store builder | `+$ store |$ [S] [init=S update=*]`, with `++ store |= [init=S update=$-([A S] S)] ^- (store S) [init update]`: the builder checks action `A`, while `main` exposes only state `S`; the store kind check verifies `A` against the poke declaration | Decided 2026-11-01 |
77| Subscriptions | By agent and path, shared per page; the first fact is full state, so no paths that need a scry path | Decided 2026-10-29 |
77| 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 |
78| Apps | One island under a catch-all route, given the path by `pure`; `%url` delivers the path on every change; in-section links act as `go`; focus moves to the first heading | Decided 2026-10-29 |
78| 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:
91/= card /ui/components/card :: a Jibb module
91/= card /ui/components/card :: a Jibb module
92```
92```
93
93
94−An imported Hoon record with duplicate field names is an error where used; imported union cases must differ as nouns. `/%` names a type after its mark, so it takes no face, and any mark name works; Hoon's `/%` binds the mark's core instead. Derived 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.
95
95
96## Modules
96## Modules
97
97
@@ -99,10 +99,10 @@ A file is a module: imports, then definitions.
99
99
100- `+$ name mold` defines a mold; `++ name expr` a value.
100- `+$ name mold` defines a mold; `++ name expr` a value.
101- Names may refer to each other in any order, and no name may shadow one already in scope, imports and the prelude included.
101- Names may refer to each other in any order, and no name may shadow one already in scope, imports and the prelude included.
102−- Molds and values have separate namespaces, told apart by position: `todo-action.todo` is a mold 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.
103- `main`'s type decides the kind: `(element !!)` a page; `(page R D)` a page with data, from parameters `R` to data `D`; `(program D X M)` an island, with data, model and messages; `(store S)` a store with state `S`. They're built by `(page load view)`, `(program init update view subs)` and `(store init update)`. A module without `main` is a library.
103- `main`'s type decides the kind: `(element !!)` a page; `(page R D)` a page with data, from parameters `R` to data `D`; `(program D X M)` an island, with data, model and messages; `(store S)` a store with state `S`. They're built by `(page load view)`, `(program init update view subs)` and `(store init update)`. A module without `main` is a library.
104- Everything is exported and read through the import's face, as `card.card`. The prelude keeps private helpers in a separate internal module; it imports them without exposing them.
104- Everything is exported and read through the import's face, as `card.card`. The prelude keeps private helpers in a separate internal module; it imports them without exposing them.
105−- An API module, `/ui/api/<agent>.jibb`, also exports derived gates: a 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.
106
106
107Names the host reads, by file:
107Names the host reads, by file:
108
108
@@ -130,8 +130,8 @@ A mold is only a type: never called on a noun, and with no default. Types are in
130- **Paths**: `/todos` is constant, `/` empty, and `/todo/[id=@ud]` typed by aura. A typed segment may use `_` for an inferred aura; it still must resolve to an aura that the path rules can print and parse. `%/blog/(slug)` is an `qath`, checked against routes and static files.
130- **Paths**: `/todos` is constant, `/` empty, and `/todo/[id=@ud]` typed by aura. A typed segment may use `_` for an inferred aura; it still must resolve to an aura that the path rules can print and parse. `%/blog/(slug)` is an `qath`, checked against routes and static files.
131- **Generic molds**: `+$ result |$ [V E]` with cases below; `|$` goes only right after a `+$`'s name.
131- **Generic molds**: `+$ result |$ [V E]` with cases below; `|$` goes only right after a `+$`'s name.
132- **Noun**: `*`, not a type variable; use a capital for a generic type. A value already known to have a more specific noun type, such as `@ud`, can be used where `*` is expected. **Empty**: `!!`.
132- **Noun**: `*`, not a type variable; use a capital for a generic type. A value already known to have a more specific noun type, such as `@ud`, can be used where `*` is expected. **Empty**: `!!`.
133−- **Pokes**: `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.
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**: `poke`, `ask` and `qath` are transparent types, defined in the internal prelude and re-exported normally; callers can construct and inspect their values. Derived gates and `pure` also construct requests, and application-path literals have type `qath`. `(facts full diff …)` appears only in an API file's `paths`.
134+- **Effect and application-path types**: `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`.
135- **Identity**: recursive molds go by name and module.
135- **Identity**: recursive molds go by name and module.
136
136
137`eq`'s arguments and map and set keys must contain no gates, even nested inside another value. The checker infers this gate-free constraint on type variables and retains it when generalizing a `++`, so a generic helper that calls `eq` stays generic over gate-free types. Printed types show the constraint as `$-([A A] ?) where A contains no gates`. An inferred atom constraint prints as `$-([A A] A) where A is an atom`; an arithmetic atom constraint that excludes loobeans prints as `where A is an atom other than ?`. Multiple clauses are comma-separated, as `where A is an atom, B contains no gates`. Union-case matching treats gates as opaque and never inspects a gate to distinguish cases.
137`eq`'s arguments and map and set keys must contain no gates, even nested inside another value. The checker infers this gate-free constraint on type variables and retains it when generalizing a `++`, so a generic helper that calls `eq` stays generic over gate-free types. Printed types show the constraint as `$-([A A] ?) where A contains no gates`. An inferred atom constraint prints as `$-([A A] A) where A is an atom`; an arithmetic atom constraint that excludes loobeans prints as `where A is an atom other than ?`. Multiple clauses are comma-separated, as `where A is an atom, B contains no gates`. Union-case matching treats gates as opaque and never inspects a gate to distinguish cases.
@@ -293,14 +293,13 @@ knot = { lower | digit | "-" | "." | "~" | "_" } ;
293```jibb
293```jibb
294:: /ui/stores/cart.jibb
294:: /ui/stores/cart.jibb
295+$ state [items=(list @t) open=?]
295+$ state [items=(list @t) open=?]
296−+$ cart-action
296++$ poke
297 [%add item=@t]
297 [%add item=@t]
298 %toggle
298 %toggle
299−+$ poke cart-action
300
299
301++ main (store init update)
300++ main (store init update)
302++ init ^- state [~ %.n]
301++ init ^- state [~ %.n]
303−++ update |= [a=cart-action s=state]
302+++ update |= [a=poke s=state]
304 ?- a
303 ?- a
305 [%add item] s(items=[item items.s])
304 [%add item] s(items=[item items.s])
306 %toggle s(open=(not open.s))
305 %toggle s(open=(not open.s))
@@ -326,8 +325,8 @@ knot = { lower | digit | "-" | "." | "~" | "_" } ;
326++ update |= [=msg m=model]
325++ update |= [=msg m=model]
327 ?- msg
326 ?- msg
328 [%noted t] [m(note=t) ~]
327 [%noted t] [m(note=t) ~]
329− %add [m(note="") ~[[%poke (cart-action.cart [%add note.m]) |=%acked]]]
328+ %add [m(note="") ~[(poke.cart [%add note.m] |=%acked)]]
330− %toggle [m ~[[%poke (cart-action.cart %toggle) |=%acked]]]
329+ %toggle [m ~[(poke.cart %toggle |=%acked)]]
331 [%got c] [m(cart=c) ~]
330 [%got c] [m(cart=c) ~]
332 [%acked err] [m ~]
331 [%acked err] [m ~]
333
332
docs/spec/overview.md+6−6
@@ -141,7 +141,7 @@ Loads and renders run in Nock.
141
141
142```jibb
142```jibb
143+$ cmd |$ [M]
143+$ cmd |$ [M]
144− [%poke p=poke reply=$-((unit @t) M)]
144+ [%poke p=raw-poke reply=$-((unit @t) M)]
145 [%go url=@t]
145 [%go url=@t]
146 [%wait gap=@dr msg=M]
146 [%wait gap=@dr msg=M]
147 [%now reply=$-(@da M)]
147 [%now reply=$-(@da M)]
@@ -154,7 +154,7 @@ Loads and renders run in Nock.
154
154
155An 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.
155An island's `update` returns `[model (list (cmd M))]`, so one message may produce several commands. The runtime processes the returned commands one at a time, in list order. A store's `update` consumes exactly one poke with the current state and returns the next state.
156
156
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.
158- A request such as `(todos.todo |=%got)` comes from a declared path or a store's `state`; its reply always gets full state. A path with diffs also takes a fold, `(changes.todo |=%got apply)`, which the runtime applies first. Facts are checked; a bad one crashes the reply, which counts as a crashed `update`.
158- A request such as `(todos.todo |=%got)` comes from a declared path or a store's `state`; its reply always gets full state. A path with diffs also takes a fold, `(changes.todo |=%got apply)`, which the runtime applies first. Facts are checked; a bad one crashes the reply, which counts as a crashed `update`.
159- Islands read agents only by watching. A watch's first fact must be full state, so watching a request whose path case has a separate `scry=` path is a type error in an island. The checker must prove a request is watchable; unknown watchability is also a type error. The runtime acks facts, rewatches after a kick or a dropped connection and reseeds from the first fact; a refused watch shows the crash notice.
159- Islands read agents only by watching. A watch's first fact must be full state, so watching a request whose path case has a separate `scry=` path is a type error in an island. The checker must prove a request is watchable; unknown watchability is also a type error. The runtime acks facts, rewatches after a kick or a dropped connection and reseeds from the first fact; a refused watch shows the crash notice.
160- Watches match by agent and path, timers by gap, and the newest reply is always used. After each `update`, `subs` is diffed to start and stop watches and timers. `%now` and `%every` give the time, `%who` the owner's `@p` from `/~/name`; `%wait` is a one-shot delay.
160- Watches match by agent and path, timers by gap, and the newest reply is always used. After each `update`, `subs` is diffed to start and stop watches and timers. `%now` and `%every` give the time, `%who` the owner's `@p` from `/~/name`; `%wait` is a one-shot delay.
@@ -165,7 +165,7 @@ Inputs send a message per `input` event, and one per IME composition, so validat
165
165
166- `init` runs on the ship with the page's data and returns only the model, jammed into the page; the browser resumes from it at start. A reload starts from the model the page is served with.
166- `init` runs on the ship with the page's data and returns only the model, jammed into the page; the browser resumes from it at start. A reload starts from the model the page is served with.
167- A crash in `update` drops the message, keeps the model and shows the standard notice.
167- 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.
169- A store runs in the browser from its `init` when its first island starts, and lasts as long as the page. Islands keep what they watch in their own models.
169- A store runs in the browser from its `init` when its first island starts, and lasts as long as the page. Islands keep what they watch in their own models.
170- An app is a page whose view is one island under a catch-all route; its `load` passes the path with `pure`. The island's `%url` subscription delivers the path at start and after every change, back and forward included. `go` pushes history, and `go` or `link` within the section changes the island without a reload. Focus then moves to the new view's first heading, which screen readers announce.
170- An app is a page whose view is one island under a catch-all route; its `load` passes the path with `pure`. The island's `%url` subscription delivers the path at start and after every change, back and forward included. `go` pushes history, and `go` or `link` within the section changes the island without a reload. Focus then moves to the new view's first heading, which screen readers announce.
171
171
@@ -282,7 +282,7 @@ The host is one Gall agent on the `%jibb` desk, serving every Jibb desk, so app
282
282
283### Agent APIs
283### Agent APIs
284
284
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.
286
286
287```jibb
287```jibb
288:: /ui/api/todo.jibb
288:: /ui/api/todo.jibb
@@ -473,8 +473,8 @@ A `page`: each request scries `%blog` and renders in Nock.
473 ?- (gth (lent (tuba (trip t))) 80)
473 ?- (gth (lent (tuba (trip t))) 80)
474 %.y [m(draft=t error=`"Too long") ~]
474 %.y [m(draft=t error=`"Too long") ~]
475 %.n [m(draft=t error=~) ~]
475 %.n [m(draft=t error=~) ~]
476− %submit [m(draft="") ~[[%poke (todo-action.todo [%add draft.m]) |=%acked]]]
476+ %submit [m(draft="") ~[(poke.todo [%add draft.m] |=%acked)]]
477− [%toggled id] [m ~[[%poke (todo-action.todo [%toggle id]) |=%acked]]]
477+ [%toggled id] [m ~[(poke.todo [%toggle id] |=%acked)]]
478 [%got ts] [m(todos=ts) ~]
478 [%got ts] [m(todos=ts) ~]
479 [%acked err] [m(error=err) ~]
479 [%acked err] [m(error=err) ~]
480
480
docs/status.md+4−4
@@ -1,6 +1,6 @@
1# Status
1# Status
2
2
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.
4
4
5| # | Milestone | Status |
5| # | Milestone | Status |
6| --- | --- | --- |
6| --- | --- | --- |
@@ -53,7 +53,7 @@ A narrow full-module path now checks direct four-wing `(program init update view
53
53
54Static 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.
54Static 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.
55
55
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.
57
57
58The 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.
58The 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.
59
59
@@ -63,7 +63,7 @@ For a unique supported path declaration, the request-parts analysis derives orde
63
63
64A 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.
64A 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.
65
65
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.
67
67
68The 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.
68The 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.
69
69
@@ -108,7 +108,7 @@ What the plan asks for, and where it is:
108Besides the plan's list:
108Besides the plan's list:
109
109
110- 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.
110- 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.
112- `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.
112- `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.
113- 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.
113- 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.
114- 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).
114- 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 @@
774:: (face 2:11 items
774:: (face 2:11 items
775:: (apply 2:17 list (aura 2:23 @t)))
775:: (apply 2:17 list (aura 2:23 @t)))
776:: (face 2:27 open (flag 2:32))))
776:: (face 2:27 open (flag 2:32))))
777−:: (mold 3:1 cart-action
777+:: (mold 3:1 poke
778:: (union 4:3
778:: (union 4:3
779:: (cell 4:3
779:: (cell 4:3
780:: (const 4:4 %add)
780:: (const 4:4 %add)
781:: (face 4:9 item (aura 4:14 @t)))
781:: (face 4:9 item (aura 4:14 @t)))
782:: (const 5:3 %toggle)))
782:: (const 5:3 %toggle)))
783−:: (mold 6:1 poke (ref 6:9 cart-action))
784−:: (value 8:1 main
783+:: (value 7:1 main
785−:: (group 8:9
784+:: (group 7:9
786−:: (call 8:10 (wing 8:10 store) (wing 8:16 init) (wing 8:21 update))))
785+:: (call 7:10 (wing 7:10 store) (wing 7:16 init) (wing 7:21 update))))
787−:: (value 9:1 init
786+:: (value 8:1 init
788−:: (cast 9:9
787+:: (cast 8:9
789−:: (ref 9:12 state)
788+:: (ref 8:12 state)
790−:: (tuple 9:18 (lit 9:19 ~) (lit 9:21 %.n))))
789+:: (tuple 8:18 (lit 8:19 ~) (lit 8:21 %.n))))
791−:: (value 10:1 update
790+:: (value 9:1 update
792−:: (gate 10:11
791+:: (gate 9:11
793−:: (cell 10:14
792+:: (cell 9:14
794−:: (face 10:15 a (ref 10:17 cart-action))
793+:: (face 9:15 a (ref 9:17 poke))
795−:: (face 10:29 s (ref 10:31 state)))
794+:: (face 9:22 s (ref 9:24 state)))
796−:: (body 11:3
795+:: (body 10:3
797−:: (branch 11:3
796+:: (branch 10:3
798−:: (wing 11:6 a)
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)))))
799:: (arm 12:5
803:: (arm 12:5
800−:: (cell 12:5 (lit 12:6 %add) (bind 12:11 item))
804+:: (lit 12:5 %toggle)
801:: (change 12:18 s
805:: (change 12:18 s
802−:: (edit 12:20 items
806+:: (edit 12:20 open
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
807+:: (group 12:25
809−:: (call 13:26 (wing 13:26 not) (wing 13:30 open.s)))))))))))
808+:: (call 12:26 (wing 12:26 not) (wing 12:30 open.s)))))))))))
810::
809::
811:: 4.3 Errors (+show-error): "<file>:<line>:<col>: <message>", then the
810:: 4.3 Errors (+show-error): "<file>:<line>:<col>: <message>", then the
812:: source line, then a caret under the column (col - 1 spaces, then ^).
811:: source line, then a caret under the column (col - 1 spaces, then ^).
@@ -11341,22 +11340,6 @@
11341 ?. (levy vals |=(n=term &((unique-value-name n vals) !(lien prelude-values |=(v=term =(n v)))))) |
11340 ?. (levy vals |=(n=term &((unique-value-name n vals) !(lien prelude-values |=(v=term =(n v)))))) |
11342 (levy mold-names |=(n=term &((unique-value-name n mold-names) !(lien prelude-molds |=(m=term =(n m))))))
11341 (levy mold-names |=(n=term &((unique-value-name n mold-names) !(lien prelude-molds |=(m=term =(n m))))))
11343::
11342::
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−::
11360:: A detailed failure is attached only to the first mold that actually
11343:: A detailed failure is attached only to the first mold that actually
11361:: failed in this check, using that module's checked source mold table.
11344:: failed in this check, using that module's checked source mold table.
11362+$ imold-failure [message=@t overlap=(unit [name=term cases=upair])]
11345+$ imold-failure [message=@t overlap=(unit [name=term cases=upair])]
@@ -12003,7 +11986,8 @@
12003 ?> ?=(%mold -.decl)
11986 ?> ?=(%mold -.decl)
12004 =/ paths=(unit (list iapi-path)) (api-path-declaration shape.decl declared)
11987 =/ paths=(unit (list iapi-path)) (api-path-declaration shape.decl declared)
12005 ?~ paths ~
11988 ?~ paths ~
11989+ =/ derived-pokes=(list term) ?~(pokes ~ ~[%poke])
12006− ?. (api-derived-names-valid u.paths u.poke-names mod prelude-values) ~
11990+ ?. (api-derived-names-valid u.paths derived-pokes mod prelude-values) ~
12007 (api-path-types u.paths externals declared)
11991 (api-path-types u.paths externals declared)
12008::
11992::
12009:: Source/graph entry for path analysis only. The returned paths retain
11993:: Source/graph entry for path analysis only. The returned paths retain
@@ -12214,16 +12198,17 @@
12214:: Value watchability remains unproved even for a watchable declaration.
12198:: Value watchability remains unproved even for a watchable declaration.
12215+$ ione-request-interface
12199+$ ione-request-interface
12216 [support=iapi-support-evidence parts=iapi-request-parts iface=ifile]
12200 [support=iapi-support-evidence parts=iapi-request-parts iface=ifile]
12217−++ store-compatible-poke
12201+++ compatible-raw-poke
12218 |= prelude=iprelude
12202 |= prelude=iprelude
12219 ^- (unit ischeme)
12203 ^- (unit ischeme)
12220 =/ public=ifile iface.prelude
12204 =/ public=ifile iface.prelude
12221 ?. =(at.public /lib/jibb/prelude/jibb) ~
12205 ?. =(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)
12223 ?~ poke ~
12207 ?~ poke ~
12224− ?. ?=(%union -.typ.u.poke) ~
12225 ?^ vars.u.poke ~
12208 ?^ vars.u.poke ~
12209+ ?. ?=(%union -.typ.u.poke) ~
12210+ ?^ args.typ.u.poke ~
12226− ?. =(origin.typ.u.poke `[/lib/jibb/internal/jibb %poke]) ~
12211+ ?. =(origin.typ.u.poke `[/lib/jibb/internal/jibb %raw-poke]) ~
12227 ?: (itype-has-tag typ.u.poke) ~
12212 ?: (itype-has-tag typ.u.poke) ~
12228 =/ private=(list iwidth-dependency)
12213 =/ private=(list iwidth-dependency)
12229 (skim dependencies.public |=(d=iwidth-dependency =(at.d /lib/jibb/internal/jibb)))
12214 (skim dependencies.public |=(d=iwidth-dependency =(at.d /lib/jibb/internal/jibb)))
@@ -12407,7 +12392,7 @@
12407 ?^ (duplicate-defs defs.mod) ~
12392 ?^ (duplicate-defs defs.mod) ~
12408 ?~ prelude ~
12393 ?~ prelude ~
12409 ?. =(at.u.prelude /lib/jibb/prelude/jibb) ~
12394 ?. =(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)
12411 ?~ poke ~
12396 ?~ poke ~
12412 ?. ?=(%union -.typ.u.poke) ~
12397 ?. ?=(%union -.typ.u.poke) ~
12413 ?^ vars.u.poke ~
12398 ?^ vars.u.poke ~
@@ -12431,8 +12416,9 @@
12431 ?: |((lien prelude-values |=(x=term =(n x))) (lien prelude-molds |=(x=term =(n x)))) ~
12416 ?: |((lien prelude-values |=(x=term =(n x))) (lien prelude-molds |=(x=term =(n x)))) ~
12432 =/ mark=(unit itype) (find-imported-mark n mark-externals marks)
12417 =/ mark=(unit itype) (find-imported-mark n mark-externals marks)
12433 ?~ mark ~
12418 ?~ mark ~
12434− =/ sc=ischeme [[%fn u.mark typ.u.poke] ~]
12419+ =/ sc=(unit ischeme) (derived-poke-command-scheme u.prelude u.mark)
12420+ ?~ sc ~
12435− `[~[[n sc]] (api-mark-exports marks marks mark-externals) at ~[[n i.t.t.at n]] ~ ~ ~ ~]
12421+ `[~[[%poke u.sc]] (api-mark-exports marks marks mark-externals) at ~[[n i.t.t.at n]] ~ ~ ~ ~]
12436::
12422::
12437:: Source-proven ordinary helpers validate each selected /sur dependency.
12423:: Source-proven ordinary helpers validate each selected /sur dependency.
12438:: Unused or less direct cores remain unsupported by this first interface.
12424:: Unused or less direct cores remain unsupported by this first interface.
@@ -12635,8 +12621,8 @@
12635 ?~ view ~
12621 ?~ view ~
12636 `[u.load u.view]
12622 `[u.load u.view]
12637::
12623::
12638−:: A store main is only the direct two-wing source call. The poke declaration
12624+:: A store main is only the direct two-wing source call. Its local poke mold
12639−:: is checked here, then removed before every ordinary mold/value inference pass.
12625+:: is checked here and remains in ordinary mold/value inference.
12640++ store-main-parts
12626++ store-main-parts
12641 |= d=def
12627 |= d=def
12642 ^- (unit [init=term update=term])
12628 ^- (unit [init=term update=term])
@@ -12671,18 +12657,10 @@
12671 =/ state=def i.states
12657 =/ state=def i.states
12672 ?> &(?=(%mold -.poke) ?=(%mold -.state))
12658 ?> &(?=(%mold -.poke) ?=(%mold -.state))
12673 ?: ?=(%generic -.shape.state) ~
12659 ?: ?=(%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) ~
12660+ ?: ?=(%generic -.shape.poke) ~
12661+ =/ action=term %poke
12683− =/ ordinary=(list def)
12662+ =/ ordinary=(list def) ds
12684− (skim ds |=(d=def !&(?=(%mold -.d) =(%poke name.d))))
12685− ?. (module-scope-valid mod(defs ordinary) prelude-values prelude-molds) ~
12663+ ?. (module-scope-valid mod prelude-values prelude-molds) ~
12686 =/ derived=(list term) ~[%state action]
12664 =/ derived=(list term) ~[%state action]
12687 ?: (lien derived |=(n=term =(n %proj))) ~
12665 ?: (lien derived |=(n=term =(n %proj))) ~
12688 =/ outer=(list term)
12666 =/ outer=(list term)
@@ -13753,6 +13731,7 @@
13753 =? inferred ?=(%| -.inferred) (infer-recursive-gate init-def env init-state)
13731 =? inferred ?=(%| -.inferred) (infer-recursive-gate init-def env init-state)
13754 ?: ?=(%| -.inferred) ~
13732 ?: ?=(%| -.inferred) ~
13755 ?. ?=(%fn -.typ.p.inferred) ~
13733 ?. ?=(%fn -.typ.p.inferred) ~
13734+ ?^ (itype-vars sample.typ.p.inferred) ~
13756 =/ data-fit=ifit
13735 =/ data-fit=ifit
13757 (itype-fit sample.typ.p.inferred sample.expected sub.state.p.inferred next.state.p.inferred)
13736 (itype-fit sample.typ.p.inferred sample.expected sub.state.p.inferred next.state.p.inferred)
13758 ?. ?=(%ok -.data-fit) ~
13737 ?. ?=(%ok -.data-fit) ~
@@ -13782,22 +13761,58 @@
13782 ?. ?=(~ (itype-vars typ.u.recovered)) ~
13761 ?. ?=(~ (itype-vars typ.u.recovered)) ~
13783 `[env.u.added grouped.resolution artifacts.u.added]
13762 `[env.u.added grouped.resolution artifacts.u.added]
13784::
13763::
13764+++ derived-poke-command-scheme
13765+ |= [prelude=ifile action=itype]
13766+ ^- (unit ischeme)
13767+ =/ prep=iprelude [prelude ~ ~]
13768+ =/ raw=(unit ischeme) (compatible-raw-poke prep)
13769+ ?~ raw ~
13770+ =/ command=(unit ischeme) (find-jibb-mold %cmd prelude)
13771+ =/ unit-template=(unit ischeme) (find-jibb-mold %unit prelude)
13772+ ?~ command ~
13773+ ?~ unit-template ~
13774+ ?. (standard-unit-template u.unit-template /lib/jibb/prelude/jibb) ~
13775+ ?. ?=([@ ~] vars.u.command) ~
13776+ ?. ?=(%union -.typ.u.command) ~
13777+ ?. =(origin.typ.u.command `[/lib/jibb/prelude/jibb %cmd]) ~
13778+ ?. (identity-union-parameters vars.u.command args.typ.u.command) ~
13779+ =/ m=@ud i.vars.u.command
13780+ ?: (itype-var-is-atom m typ.u.command) ~
13781+ ?. (levy (itype-vars typ.u.command) |=(n=@ud =(n m))) ~
13782+ ?: (itype-has-tag typ.u.command) ~
13783+ =/ error=(unit itype) (template-apply u.unit-template ~[[%atom %t]])
13784+ ?~ error ~
13785+ ?. ?=(%union -.typ.u.raw) ~
13786+ =/ poke-case=itype
13787+ [%cell [%const [%term %tas %poke '%poke']] [%cell [%face %p typ.u.raw(label `'raw-poke.internal')] [%face %reply [%fn u.error [%var m]]]]]
13788+ =/ go-case=itype
13789+ [%cell [%const [%term %tas %go '%go']] [%face %url [%atom %t]]]
13790+ =/ wait-case=itype
13791+ [%cell [%const [%term %tas %wait '%wait']] [%cell [%face %gap [%atom %dr]] [%face %msg [%var m]]]]
13792+ =/ now-case=itype
13793+ [%cell [%const [%term %tas %now '%now']] [%face %reply [%fn [%atom %da] [%var m]]]]
13794+ =/ who-case=itype
13795+ [%cell [%const [%term %tas %who '%who']] [%face %reply [%fn [%atom %p] [%var m]]]]
13796+ ?. =(cases.typ.u.command ~[poke-case go-case wait-case now-case who-case]) ~
13797+ =/ command-result=(unit itype) (template-apply u.command ~[[%var 0]])
13798+ ?~ command-result ~
13799+ `[[%fn [%cell action [%fn u.error [%var 0]]] u.command-result] ~[0]]
13800+::
13785++ store-derived-schemes
13801++ store-derived-schemes
13786 |= [prelude=ifile values=(list term) molds=(list term) state=itype action=itype]
13802 |= [prelude=ifile values=(list term) molds=(list term) state=itype action=itype]
13787 ^- (unit [state=ischeme action=ischeme])
13803 ^- (unit [state=ischeme action=ischeme])
13788 =/ prep=iprelude [prelude values molds]
13804 =/ prep=iprelude [prelude values molds]
13789 =/ ask=(unit ischeme) (request-compatible-ask prep)
13805 =/ ask=(unit ischeme) (request-compatible-ask prep)
13790 ?~ ask ~
13806 ?~ ask ~
13791− =/ poke=(unit ischeme) (store-compatible-poke prep)
13792− ?~ poke ~
13793 ?^ (itype-vars state) ~
13807 ?^ (itype-vars state) ~
13794 ?^ (itype-vars action) ~
13808 ?^ (itype-vars action) ~
13795 ?: |((itype-has-tag state) (itype-has-tag action)) ~
13809 ?: |((itype-has-tag state) (itype-has-tag action)) ~
13796 =/ result=(unit itype) (template-apply u.ask ~[[%var 0]])
13810 =/ result=(unit itype) (template-apply u.ask ~[[%var 0]])
13797 ?~ result ~
13811 ?~ result ~
13798 =/ request=ischeme [[%fn [%fn state [%var 0]] u.result] ~[0]]
13812 =/ request=ischeme [[%fn [%fn state [%var 0]] u.result] ~[0]]
13799− =/ constructor=ischeme [[%fn action typ.u.poke] ~]
13813+ =/ constructor=(unit ischeme) (derived-poke-command-scheme prelude action)
13814+ ?~ constructor ~
13800− `[request constructor]
13815+ `[request u.constructor]
13801::
13816::
13802++ program-subs-watch
13817++ program-subs-watch
13803 |= [d=def imports=ijimports graph=irequest-graph prelude=ifile]
13818 |= [d=def imports=ijimports graph=irequest-graph prelude=ifile]
@@ -14029,8 +14044,8 @@
14029 =? tail ?=(%face -.tail) body.tail
14044 =? tail ?=(%face -.tail) body.tail
14030 typ(sample [%cell head tail])
14045 typ(sample [%cell head tail])
14031::
14046::
14032−:: The builder erases the action from main. Recover it only from the direct
14047+:: The builder erases the action from main. Recover it only from the local
14033−:: local poke declaration and check both ordinary components invariantly.
14048+:: poke mold and check both ordinary components invariantly.
14034++ store-main-closed
14049++ store-main-closed
14035 |= [parts=[init=term update=term] action=term env=ienv molds=imold-types prelude=(unit ifile)]
14050 |= [parts=[init=term update=term] action=term env=ienv molds=imold-types prelude=(unit ifile)]
14036 ^- (unit ischeme)
14051 ^- (unit ischeme)
@@ -14138,8 +14153,6 @@
14138 =/ ds=(list def) ?~(declared defs.mod defs.u.declared)
14153 =/ ds=(list def) ?~(declared defs.mod defs.u.declared)
14139 =/ checking=module mod(defs ds)
14154 =/ checking=module mod(defs ds)
14140 ?. (module-scope-valid checking prelude-values prelude-molds)
14155 ?. (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)}") ~]]
14143 [%| [(crip "module has conflicting names: {(spud at)}") ~]]
14156 [%| [(crip "module has conflicting names: {(spud at)}") ~]]
14144 =/ vals=(list term) (global-value-names ds)
14157 =/ vals=(list term) (global-value-names ds)
14145 =/ js=jimports-detailed-result (resolve-jibb-imports-detailed imports.mod externals mark-externals modules active prelude-values prelude-molds cache prelude)
14158 =/ 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 @@
14376 =/ prelude-molds=(list term) molds.u.prepared
14389 =/ prelude-molds=(list term) molds.u.prepared
14377 =/ iface=(unit ifile) `iface.u.prepared
14390 =/ iface=(unit ifile) `iface.u.prepared
14378 ?. (module-scope-valid p.parsed prelude-values prelude-molds)
14391 ?. (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'
14381 'partial inference; module not checked\0amodule has conflicting names'
14392 'partial inference; module not checked\0amodule has conflicting names'
14382 =/ js=jimports-result
14393 =/ js=jimports-result
14383 (resolve-jibb-imports imports.p.parsed externals mark-externals modules ~[file] prelude-values prelude-molds ~ iface)
14394 (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 @@
3:: Representation for agent and in-process store pokes.
3:: Representation for agent and in-process store pokes.
4:: The prelude re-exports this mold; effect lowering and the runtime must
4:: The prelude re-exports this mold; effect lowering and the runtime must
5:: agree on these cells when effect execution is implemented.
5:: agree on these cells when effect execution is implemented.
6−+$ poke
6++$ raw-poke
7 [%agent agent=@tas mark=@tas payload=*]
7 [%agent agent=@tas mark=@tas payload=*]
8 [%store module=@t action=@tas payload=*]
8 [%store module=@t action=@tas payload=*]
9
9
jibb-dev/lib/jibb/prelude.jibb+2−2
@@ -1,5 +1,5 @@
1/= internal /lib/jibb/internal
1/= internal /lib/jibb/internal
2−+$ poke poke.internal
2++$ raw-poke raw-poke.internal
3+$ qath qath.internal
3+$ qath qath.internal
4
4
5:: Initial prelude functions. The rest of the inventory is still to come.
5:: Initial prelude functions. The rest of the inventory is still to come.
@@ -325,7 +325,7 @@
325 [f b] |= a=A (f a b)
325 [f b] |= a=A (f a b)
326
326
327+$ cmd |$ [M]
327+$ cmd |$ [M]
328− [%poke p=poke reply=$-((unit @t) M)]
328+ [%poke p=raw-poke reply=$-((unit @t) M)]
329 [%go url=@t]
329 [%go url=@t]
330 [%wait gap=@dr msg=M]
330 [%wait gap=@dr msg=M]
331 [%now reply=$-(@da M)]
331 [%now reply=$-(@da M)]
my-app/ui/basket.jibb+2−2
@@ -17,8 +17,8 @@
17++ update |= [=msg m=model]
17++ update |= [=msg m=model]
18 ?- msg
18 ?- msg
19 [%noted t] [m(note=t) ~]
19 [%noted t] [m(note=t) ~]
20− %add [m(note="") ~[[%poke (cart-action.cart [%add note.m]) |=%acked]]]
20+ %add [m(note="") ~[(poke.cart [%add note.m] |=%acked)]]
21− %toggle [m ~[[%poke (cart-action.cart %toggle) |=%acked]]]
21+ %toggle [m ~[(poke.cart %toggle |=%acked)]]
22 [%got c] [m(cart=c) ~]
22 [%got c] [m(cart=c) ~]
23 [%acked err] [m ~]
23 [%acked err] [m ~]
24
24
my-app/ui/stores/cart.jibb+2−3
@@ -1,13 +1,12 @@
1:: /ui/stores/cart.jibb
1:: /ui/stores/cart.jibb
2+$ state [items=(list @t) open=?]
2+$ state [items=(list @t) open=?]
3−+$ cart-action
3++$ poke
4 [%add item=@t]
4 [%add item=@t]
5 %toggle
5 %toggle
6−+$ poke cart-action
7
6
8++ main (store init update)
7++ main (store init update)
9++ init ^- state [~ %.n]
8++ init ^- state [~ %.n]
10−++ update |= [a=cart-action s=state]
9+++ update |= [a=poke s=state]
11 ?- a
10 ?- a
12 [%add item] s(items=[item items.s])
11 [%add item] s(items=[item items.s])
13 %toggle s(open=(not open.s))
12 %toggle s(open=(not open.s))
my-app/ui/todo-list.jibb+2−2
@@ -19,8 +19,8 @@
19 ?- (gth (lent (tuba (trip t))) 80)
19 ?- (gth (lent (tuba (trip t))) 80)
20 %.y [m(draft=t error=`"Too long") ~]
20 %.y [m(draft=t error=`"Too long") ~]
21 %.n [m(draft=t error=~) ~]
21 %.n [m(draft=t error=~) ~]
22− %submit [m(draft="") ~[[%poke (todo-action.todo [%add draft.m]) |=%acked]]]
22+ %submit [m(draft="") ~[(poke.todo [%add draft.m] |=%acked)]]
23− [%toggled id] [m ~[[%poke (todo-action.todo [%toggle id]) |=%acked]]]
23+ [%toggled id] [m ~[(poke.todo [%toggle id] |=%acked)]]
24 [%got ts] [m(todos=ts) ~]
24 [%got ts] [m(todos=ts) ~]
25 [%acked err] [m(error=err) ~]
25 [%acked err] [m(error=err) ~]
26
26
tests/golden/doc-core-02-update/source.jibb+2−2
@@ -4,7 +4,7 @@
4 ?- (gth (lent (tuba (trip t))) 80)
4 ?- (gth (lent (tuba (trip t))) 80)
5 %.y [m(draft=t error=`"Too long") ~]
5 %.y [m(draft=t error=`"Too long") ~]
6 %.n [m(draft=t error=~) ~]
6 %.n [m(draft=t error=~) ~]
7− %submit [m(draft="") ~[[%poke (todo-action.todo [%add draft.m]) |=%acked]]]
7+ %submit [m(draft="") ~[(poke.todo [%add draft.m] |=%acked)]]
8− [%toggled id] [m ~[[%poke (todo-action.todo [%toggle id]) |=%acked]]]
8+ [%toggled id] [m ~[(poke.todo [%toggle id] |=%acked)]]
9 [%got ts] [m(todos=ts) ~]
9 [%got ts] [m(todos=ts) ~]
10 [%acked err] [m(error=err) ~]
10 [%acked err] [m(error=err) ~]
tests/golden/doc-core-02-update/tokens.txt+22−28
@@ -73,20 +73,17 @@
737:29 tight str ""
737:29 tight str ""
747:31 tight glyph )
747:31 tight glyph )
757:33 glyph ~[
757:33 glyph ~[
76−7:35 tight glyph [
76+7:35 tight glyph (
77−7:36 tight lit %poke
77+7:36 tight wing poke.todo
78−7:42 glyph (
79−7:43 tight wing todo-action.todo
80−7:60 glyph [
78+7:46 glyph [
81−7:61 tight lit %add
79+7:47 tight lit %add
82−7:66 wing draft.m
80+7:52 wing draft.m
83−7:73 tight glyph ]
81+7:59 tight glyph ]
84−7:74 tight glyph )
85−7:76 glyph |=
82+7:61 glyph |=
86−7:78 tight lit %acked
83+7:63 tight lit %acked
87−7:84 tight glyph ]
84+7:69 tight glyph )
88−7:85 tight glyph ]
85+7:70 tight glyph ]
89−7:86 tight glyph ]
86+7:71 tight glyph ]
908:5 NEWLINE
878:5 NEWLINE
918:5 glyph [
888:5 glyph [
928:6 tight lit %toggled
898:6 tight lit %toggled
@@ -95,20 +92,17 @@
958:20 glyph [
928:20 glyph [
968:21 tight name m
938:21 tight name m
978:23 glyph ~[
948:23 glyph ~[
98−8:25 tight glyph [
95+8:25 tight glyph (
99−8:26 tight lit %poke
96+8:26 tight wing poke.todo
100−8:32 glyph (
101−8:33 tight wing todo-action.todo
102−8:50 glyph [
97+8:36 glyph [
103−8:51 tight lit %toggle
98+8:37 tight lit %toggle
104−8:59 name id
99+8:45 name id
105−8:61 tight glyph ]
100+8:47 tight glyph ]
106−8:62 tight glyph )
107−8:64 glyph |=
101+8:49 glyph |=
108−8:66 tight lit %acked
102+8:51 tight lit %acked
109−8:72 tight glyph ]
103+8:57 tight glyph )
110−8:73 tight glyph ]
104+8:58 tight glyph ]
111−8:74 tight glyph ]
105+8:59 tight glyph ]
1129:5 NEWLINE
1069:5 NEWLINE
1139:5 glyph [
1079:5 glyph [
1149:6 tight lit %got
1089:6 tight lit %got
tests/golden/doc-core-02-update/tree.txt+10−14
@@ -44,25 +44,21 @@
44 (change 7:21 m
44 (change 7:21 m
45 (edit 7:23 draft (str 7:29 "")))
45 (edit 7:23 draft (str 7:29 "")))
46 (list 7:33
46 (list 7:33
47− (tuple 7:35
47+ (group 7:35
48− (lit 7:36 %poke)
49− (group 7:42
50− (call 7:43
48+ (call 7:36
51− (wing 7:43 todo-action.todo)
49+ (wing 7:36 poke.todo)
52− (tuple 7:60 (lit 7:61 %add) (wing 7:66 draft.m))))
50+ (tuple 7:46 (lit 7:47 %add) (wing 7:52 draft.m))
53− (ctor 7:76 %acked)))))
51+ (ctor 7:61 %acked))))))
54 (arm 8:5
52 (arm 8:5
55 (cell 8:5 (lit 8:6 %toggled) (bind 8:15 id))
53 (cell 8:5 (lit 8:6 %toggled) (bind 8:15 id))
56 (tuple 8:20
54 (tuple 8:20
57 (wing 8:21 m)
55 (wing 8:21 m)
58 (list 8:23
56 (list 8:23
59− (tuple 8:25
57+ (group 8:25
60− (lit 8:26 %poke)
61− (group 8:32
62− (call 8:33
58+ (call 8:26
63− (wing 8:33 todo-action.todo)
59+ (wing 8:26 poke.todo)
64− (tuple 8:50 (lit 8:51 %toggle) (wing 8:59 id))))
60+ (tuple 8:36 (lit 8:37 %toggle) (wing 8:45 id))
65− (ctor 8:64 %acked)))))
61+ (ctor 8:49 %acked))))))
66 (arm 9:5
62 (arm 9:5
67 (cell 9:5 (lit 9:6 %got) (bind 9:11 ts))
63 (cell 9:5 (lit 9:6 %got) (bind 9:11 ts))
68 (tuple 9:20
64 (tuple 9:20
tests/golden/doc-grammar-06-cart-store/source.jibb+2−3
@@ -1,13 +1,12 @@
1:: /ui/stores/cart.jibb
1:: /ui/stores/cart.jibb
2+$ state [items=(list @t) open=?]
2+$ state [items=(list @t) open=?]
3−+$ cart-action
3++$ poke
4 [%add item=@t]
4 [%add item=@t]
5 %toggle
5 %toggle
6−+$ poke cart-action
7
6
8++ main (store init update)
7++ main (store init update)
9++ init ^- state [~ %.n]
8++ init ^- state [~ %.n]
10−++ update |= [a=cart-action s=state]
9+++ update |= [a=poke s=state]
11 ?- a
10 ?- a
12 [%add item] s(items=[item items.s])
11 [%add item] s(items=[item items.s])
13 %toggle s(open=(not open.s))
12 %toggle s(open=(not open.s))
tests/golden/doc-grammar-06-cart-store/tokens.txt+56−60
@@ -13,7 +13,7 @@
132:33 tight glyph ]
132:33 tight glyph ]
143:1 NEWLINE
143:1 NEWLINE
153:1 glyph +$
153:1 glyph +$
16−3:4 name cart-action
16+3:4 name poke
174:3 INDENT
174:3 INDENT
184:3 glyph [
184:3 glyph [
194:4 tight lit %add
194:4 tight lit %add
@@ -23,68 +23,64 @@
234:16 tight glyph ]
234:16 tight glyph ]
245:3 NEWLINE
245:3 NEWLINE
255:3 lit %toggle
255:3 lit %toggle
26−6:1 DEDENT
26+7:1 DEDENT
27−6:1 NEWLINE
27+7:1 NEWLINE
28−6:1 glyph +$
28+7:1 glyph ++
29−6:4 name poke
29+7:4 name main
30−6:9 name cart-action
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 )
318:1 NEWLINE
358:1 NEWLINE
328:1 glyph ++
368:1 glyph ++
33−8:4 name main
37+8:4 name init
34−8:9 glyph (
38+8:9 glyph ^-
35−8:10 tight name store
39+8:12 name state
36−8:16 name init
40+8:18 glyph [
37−8:21 name update
41+8:19 tight lit ~
42+8:21 lit %.n
38−8:27 tight glyph )
43+8:24 tight glyph ]
399:1 NEWLINE
449:1 NEWLINE
409:1 glyph ++
459:1 glyph ++
41−9:4 name init
46+9:4 name update
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 |=
47+9:11 glyph |=
52−10:14 glyph [
48+9:14 glyph [
53−10:15 tight name a
49+9:15 tight name a
54−10:16 tight glyph =
50+9:16 tight glyph =
55−10:17 tight name cart-action
51+9:17 tight name poke
56−10:29 name s
52+9:22 name s
53+9:23 tight glyph =
54+9:24 tight name state
57−10:30 tight glyph =
55+9:29 tight glyph ]
58−10:31 tight name state
59−10:36 tight glyph ]
60−11:3 INDENT
56+10:3 INDENT
61−11:3 glyph ?-
57+10:3 glyph ?-
62−11:6 name a
58+10:6 name a
63−12:5 INDENT
59+11:5 INDENT
64−12:5 glyph [
60+11:5 glyph [
65−12:6 tight lit %add
61+11:6 tight lit %add
66−12:11 name item
62+11:11 name item
67−12:15 tight glyph ]
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
6812:18 name s
7512:18 name s
6912:19 tight glyph (
7612:19 tight glyph (
70−12:20 tight name items
77+12:20 tight name open
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 =
78+12:24 tight glyph =
83−13:25 tight glyph (
79+12:25 tight glyph (
84−13:26 tight name not
80+12:26 tight name not
85−13:30 wing open.s
81+12:30 wing open.s
86−13:36 tight glyph )
82+12:36 tight glyph )
87−13:37 tight glyph )
83+12:37 tight glyph )
88−13:38 DEDENT
84+12:38 DEDENT
89−13:38 DEDENT
85+12:38 DEDENT
90−13:38 NEWLINE
86+12:38 NEWLINE
tests/golden/doc-grammar-06-cart-store/tree.txt+25−26
@@ -4,36 +4,35 @@
4 (face 2:11 items
4 (face 2:11 items
5 (apply 2:17 list (aura 2:23 @t)))
5 (apply 2:17 list (aura 2:23 @t)))
6 (face 2:27 open (flag 2:32))))
6 (face 2:27 open (flag 2:32))))
7− (mold 3:1 cart-action
7+ (mold 3:1 poke
8 (union 4:3
8 (union 4:3
9 (cell 4:3
9 (cell 4:3
10 (const 4:4 %add)
10 (const 4:4 %add)
11 (face 4:9 item (aura 4:14 @t)))
11 (face 4:9 item (aura 4:14 @t)))
12 (const 5:3 %toggle)))
12 (const 5:3 %toggle)))
13− (mold 6:1 poke (ref 6:9 cart-action))
14− (value 8:1 main
13+ (value 7:1 main
15− (group 8:9
14+ (group 7:9
16− (call 8:10 (wing 8:10 store) (wing 8:16 init) (wing 8:21 update))))
15+ (call 7:10 (wing 7:10 store) (wing 7:16 init) (wing 7:21 update))))
17− (value 9:1 init
16+ (value 8:1 init
18− (cast 9:9
17+ (cast 8:9
19− (ref 9:12 state)
18+ (ref 8:12 state)
20− (tuple 9:18 (lit 9:19 ~) (lit 9:21 %.n))))
19+ (tuple 8:18 (lit 8:19 ~) (lit 8:21 %.n))))
21− (value 10:1 update
20+ (value 9:1 update
22− (gate 10:11
21+ (gate 9:11
23− (cell 10:14
22+ (cell 9:14
24− (face 10:15 a (ref 10:17 cart-action))
23+ (face 9:15 a (ref 9:17 poke))
25− (face 10:29 s (ref 10:31 state)))
24+ (face 9:22 s (ref 9:24 state)))
26− (body 11:3
25+ (body 10:3
27− (branch 11:3
26+ (branch 10:3
28− (wing 11:6 a)
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)))))
29 (arm 12:5
33 (arm 12:5
30− (cell 12:5 (lit 12:6 %add) (bind 12:11 item))
34+ (lit 12:5 %toggle)
31 (change 12:18 s
35 (change 12:18 s
32− (edit 12:20 items
36+ (edit 12:20 open
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
37+ (group 12:25
39− (call 13:26 (wing 13:26 not) (wing 13:30 open.s)))))))))))
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 @@
1partial inference; module not checked
1partial 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 @@
17++ update |= [=msg m=model]
17++ update |= [=msg m=model]
18 ?- msg
18 ?- msg
19 [%noted t] [m(note=t) ~]
19 [%noted t] [m(note=t) ~]
20− %add [m(note="") ~[[%poke (cart-action.cart [%add note.m]) |=%acked]]]
20+ %add [m(note="") ~[(poke.cart [%add note.m] |=%acked)]]
21− %toggle [m ~[[%poke (cart-action.cart %toggle) |=%acked]]]
21+ %toggle [m ~[(poke.cart %toggle |=%acked)]]
22 [%got c] [m(cart=c) ~]
22 [%got c] [m(cart=c) ~]
23 [%acked err] [m ~]
23 [%acked err] [m ~]
24
24
tests/golden/doc-grammar-07-basket/tokens.txt+19−25
@@ -111,36 +111,30 @@
11120:28 tight str ""
11120:28 tight str ""
11220:30 tight glyph )
11220:30 tight glyph )
11320:32 glyph ~[
11320:32 glyph ~[
114−20:34 tight glyph [
114+20:34 tight glyph (
115−20:35 tight lit %poke
115+20:35 tight wing poke.cart
116−20:41 glyph (
117−20:42 tight wing cart-action.cart
118−20:59 glyph [
116+20:45 glyph [
119−20:60 tight lit %add
117+20:46 tight lit %add
120−20:65 wing note.m
118+20:51 wing note.m
121−20:71 tight glyph ]
119+20:57 tight glyph ]
122−20:72 tight glyph )
123−20:74 glyph |=
120+20:59 glyph |=
124−20:76 tight lit %acked
121+20:61 tight lit %acked
125−20:82 tight glyph ]
122+20:67 tight glyph )
126−20:83 tight glyph ]
123+20:68 tight glyph ]
127−20:84 tight glyph ]
124+20:69 tight glyph ]
12821:5 NEWLINE
12521:5 NEWLINE
12921:5 lit %toggle
12621:5 lit %toggle
13021:20 glyph [
12721:20 glyph [
13121:21 tight name m
12821:21 tight name m
13221:23 glyph ~[
12921:23 glyph ~[
133−21:25 tight glyph [
130+21:25 tight glyph (
134−21:26 tight lit %poke
135−21:32 glyph (
136−21:33 tight wing cart-action.cart
131+21:26 tight wing poke.cart
137−21:50 lit %toggle
132+21:36 lit %toggle
138−21:57 tight glyph )
139−21:59 glyph |=
133+21:44 glyph |=
140−21:61 tight lit %acked
134+21:46 tight lit %acked
141−21:67 tight glyph ]
135+21:52 tight glyph )
142−21:68 tight glyph ]
136+21:53 tight glyph ]
143−21:69 tight glyph ]
137+21:54 tight glyph ]
14422:5 NEWLINE
13822:5 NEWLINE
14522:5 glyph [
13922:5 glyph [
14622:6 tight lit %got
14022:6 tight lit %got
tests/golden/doc-grammar-07-basket/tree.txt+7−12
@@ -48,23 +48,18 @@
48 (change 20:21 m
48 (change 20:21 m
49 (edit 20:23 note (str 20:28 "")))
49 (edit 20:23 note (str 20:28 "")))
50 (list 20:32
50 (list 20:32
51− (tuple 20:34
51+ (group 20:34
52− (lit 20:35 %poke)
53− (group 20:41
54− (call 20:42
52+ (call 20:35
55− (wing 20:42 cart-action.cart)
53+ (wing 20:35 poke.cart)
56− (tuple 20:59 (lit 20:60 %add) (wing 20:65 note.m))))
54+ (tuple 20:45 (lit 20:46 %add) (wing 20:51 note.m))
57− (ctor 20:74 %acked)))))
55+ (ctor 20:59 %acked))))))
58 (arm 21:5
56 (arm 21:5
59 (lit 21:5 %toggle)
57 (lit 21:5 %toggle)
60 (tuple 21:20
58 (tuple 21:20
61 (wing 21:21 m)
59 (wing 21:21 m)
62 (list 21:23
60 (list 21:23
63− (tuple 21:25
64− (lit 21:26 %poke)
65− (group 21:32
61+ (group 21:25
66− (call 21:33 (wing 21:33 cart-action.cart) (lit 21:50 %toggle)))
62+ (call 21:26 (wing 21:26 poke.cart) (lit 21:36 %toggle) (ctor 21:44 %acked))))))
67− (ctor 21:59 %acked)))))
68 (arm 22:5
63 (arm 22:5
69 (cell 22:5 (lit 22:6 %got) (bind 22:11 c))
64 (cell 22:5 (lit 22:6 %got) (bind 22:11 c))
70 (tuple 22:20
65 (tuple 22:20
tests/golden/doc-overview-01-cmd-sub/source.jibb+1−1
@@ -1,5 +1,5 @@
1+$ cmd |$ [M]
1+$ cmd |$ [M]
2− [%poke p=poke reply=$-((unit @t) M)]
2+ [%poke p=raw-poke reply=$-((unit @t) M)]
3 [%go url=@t]
3 [%go url=@t]
4 [%wait gap=@dr msg=M]
4 [%wait gap=@dr msg=M]
5 [%now reply=$-(@da M)]
5 [%now reply=$-(@da M)]
tests/golden/doc-overview-01-cmd-sub/tokens.txt+11−11
@@ -9,17 +9,17 @@
92:4 tight lit %poke
92:4 tight lit %poke
102:10 name p
102:10 name p
112:11 tight glyph =
112:11 tight glyph =
12−2:12 tight name poke
12+2:12 tight name raw-poke
13−2:17 name reply
13+2:21 name reply
14−2:22 tight glyph =
14+2:26 tight glyph =
15−2:23 tight glyph $-(
15+2:27 tight glyph $-(
16−2:26 tight glyph (
16+2:30 tight glyph (
17−2:27 tight name unit
17+2:31 tight name unit
18−2:32 aura @t
18+2:36 aura @t
19−2:34 tight glyph )
19+2:38 tight glyph )
20−2:36 tvar M
20+2:40 tvar M
21−2:37 tight glyph )
21+2:41 tight glyph )
22−2:38 tight glyph ]
22+2:42 tight glyph ]
233:3 NEWLINE
233:3 NEWLINE
243:3 glyph [
243:3 glyph [
253:4 tight lit %go
253:4 tight lit %go
tests/golden/doc-overview-01-cmd-sub/tree.txt+5−5
@@ -4,11 +4,11 @@
4 (union 2:3
4 (union 2:3
5 (cell 2:3
5 (cell 2:3
6 (const 2:4 %poke)
6 (const 2:4 %poke)
7− (face 2:10 p (ref 2:12 poke))
7+ (face 2:10 p (ref 2:12 raw-poke))
8− (face 2:17 reply
8+ (face 2:21 reply
9− (fn 2:23
9+ (fn 2:27
10− (apply 2:26 unit (aura 2:32 @t))
10+ (apply 2:30 unit (aura 2:36 @t))
11− (tvar 2:36 M))))
11+ (tvar 2:40 M))))
12 (cell 3:3
12 (cell 3:3
13 (const 3:4 %go)
13 (const 3:4 %go)
14 (face 3:8 url (aura 3:12 @t)))
14 (face 3:8 url (aura 3:12 @t)))
tests/golden/doc-overview-10-todo-list/source.jibb+2−2
@@ -19,8 +19,8 @@
19 ?- (gth (lent (tuba (trip t))) 80)
19 ?- (gth (lent (tuba (trip t))) 80)
20 %.y [m(draft=t error=`"Too long") ~]
20 %.y [m(draft=t error=`"Too long") ~]
21 %.n [m(draft=t error=~) ~]
21 %.n [m(draft=t error=~) ~]
22− %submit [m(draft="") ~[[%poke (todo-action.todo [%add draft.m]) |=%acked]]]
22+ %submit [m(draft="") ~[(poke.todo [%add draft.m] |=%acked)]]
23− [%toggled id] [m ~[[%poke (todo-action.todo [%toggle id]) |=%acked]]]
23+ [%toggled id] [m ~[(poke.todo [%toggle id] |=%acked)]]
24 [%got ts] [m(todos=ts) ~]
24 [%got ts] [m(todos=ts) ~]
25 [%acked err] [m(error=err) ~]
25 [%acked err] [m(error=err) ~]
26
26
tests/golden/doc-overview-10-todo-list/tokens.txt+22−28
@@ -169,20 +169,17 @@
16922:29 tight str ""
16922:29 tight str ""
17022:31 tight glyph )
17022:31 tight glyph )
17122:33 glyph ~[
17122:33 glyph ~[
172−22:35 tight glyph [
172+22:35 tight glyph (
173−22:36 tight lit %poke
173+22:36 tight wing poke.todo
174−22:42 glyph (
175−22:43 tight wing todo-action.todo
176−22:60 glyph [
174+22:46 glyph [
177−22:61 tight lit %add
175+22:47 tight lit %add
178−22:66 wing draft.m
176+22:52 wing draft.m
179−22:73 tight glyph ]
177+22:59 tight glyph ]
180−22:74 tight glyph )
181−22:76 glyph |=
178+22:61 glyph |=
182−22:78 tight lit %acked
179+22:63 tight lit %acked
183−22:84 tight glyph ]
180+22:69 tight glyph )
184−22:85 tight glyph ]
181+22:70 tight glyph ]
185−22:86 tight glyph ]
182+22:71 tight glyph ]
18623:5 NEWLINE
18323:5 NEWLINE
18723:5 glyph [
18423:5 glyph [
18823:6 tight lit %toggled
18523:6 tight lit %toggled
@@ -191,20 +188,17 @@
19123:20 glyph [
18823:20 glyph [
19223:21 tight name m
18923:21 tight name m
19323:23 glyph ~[
19023:23 glyph ~[
194−23:25 tight glyph [
191+23:25 tight glyph (
195−23:26 tight lit %poke
192+23:26 tight wing poke.todo
196−23:32 glyph (
197−23:33 tight wing todo-action.todo
198−23:50 glyph [
193+23:36 glyph [
199−23:51 tight lit %toggle
194+23:37 tight lit %toggle
200−23:59 name id
195+23:45 name id
201−23:61 tight glyph ]
196+23:47 tight glyph ]
202−23:62 tight glyph )
203−23:64 glyph |=
197+23:49 glyph |=
204−23:66 tight lit %acked
198+23:51 tight lit %acked
205−23:72 tight glyph ]
199+23:57 tight glyph )
206−23:73 tight glyph ]
200+23:58 tight glyph ]
207−23:74 tight glyph ]
201+23:59 tight glyph ]
20824:5 NEWLINE
20224:5 NEWLINE
20924:5 glyph [
20324:5 glyph [
21024:6 tight lit %got
20424:6 tight lit %got
tests/golden/doc-overview-10-todo-list/tree.txt+10−14
@@ -78,25 +78,21 @@
78 (change 22:21 m
78 (change 22:21 m
79 (edit 22:23 draft (str 22:29 "")))
79 (edit 22:23 draft (str 22:29 "")))
80 (list 22:33
80 (list 22:33
81− (tuple 22:35
81+ (group 22:35
82− (lit 22:36 %poke)
83− (group 22:42
84− (call 22:43
82+ (call 22:36
85− (wing 22:43 todo-action.todo)
83+ (wing 22:36 poke.todo)
86− (tuple 22:60 (lit 22:61 %add) (wing 22:66 draft.m))))
84+ (tuple 22:46 (lit 22:47 %add) (wing 22:52 draft.m))
87− (ctor 22:76 %acked)))))
85+ (ctor 22:61 %acked))))))
88 (arm 23:5
86 (arm 23:5
89 (cell 23:5 (lit 23:6 %toggled) (bind 23:15 id))
87 (cell 23:5 (lit 23:6 %toggled) (bind 23:15 id))
90 (tuple 23:20
88 (tuple 23:20
91 (wing 23:21 m)
89 (wing 23:21 m)
92 (list 23:23
90 (list 23:23
93− (tuple 23:25
91+ (group 23:25
94− (lit 23:26 %poke)
95− (group 23:32
96− (call 23:33
92+ (call 23:26
97− (wing 23:33 todo-action.todo)
93+ (wing 23:26 poke.todo)
98− (tuple 23:50 (lit 23:51 %toggle) (wing 23:59 id))))
94+ (tuple 23:36 (lit 23:37 %toggle) (wing 23:45 id))
99− (ctor 23:64 %acked)))))
95+ (ctor 23:49 %acked))))))
100 (arm 24:5
96 (arm 24:5
101 (cell 24:5 (lit 24:6 %got) (bind 24:11 ts))
97 (cell 24:5 (lit 24:6 %got) (bind 24:11 ts))
102 (tuple 24:20
98 (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."
2tests: the effect and application-path types by name
2tests: the effect and application-path types by name
3expect: parses
3expect: parses
tests/golden/inline-mold-opaque/source.jibb+1−1
@@ -1,3 +1,3 @@
1−+$ a poke
1++$ a raw-poke
2+$ b ask
2+$ b ask
3+$ c qath
3+$ c qath
tests/golden/inline-mold-opaque/tokens.txt+1−1
@@ -1,6 +1,6 @@
11:1 glyph +$
11:1 glyph +$
21:4 name a
21:4 name a
3−1:6 name poke
3+1:6 name raw-poke
42:1 NEWLINE
42:1 NEWLINE
52:1 glyph +$
52:1 glyph +$
62:4 name b
62:4 name b
tests/golden/inline-mold-opaque/tree.txt+1−1
@@ -1,4 +1,4 @@
1(module
1(module
2− (mold 1:1 a (ref 1:6 poke))
2+ (mold 1:1 a (ref 1:6 raw-poke))
3 (mold 2:1 b (ref 2:6 ask))
3 (mold 2:1 b (ref 2:6 ask))
4 (mold 3:1 c (ref 3:6 qath)))
4 (mold 3:1 c (ref 3:6 qath)))
tests/golden/inline-namespaces/about.txt+1−1
@@ -1,3 +1,3 @@
1−source: Grammar tab, Modules: "Molds and values have separate namespaces, told apart by position: `todo-action.todo` is a mold 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."
2tests: the same wings in mold and in value position
2tests: the same wings in mold and in value position
3expect: parses
3expect: parses
tests/golden/inline-namespaces/source.jibb+1−1
@@ -1,4 +1,4 @@
1+$ a todo-action.todo
1+$ a todo-action.todo
2−++ b todo-action.todo
2+++ b poke.todo
3+$ c todos.todo
3+$ c todos.todo
4++ d todos.todo
4++ d todos.todo
tests/golden/inline-namespaces/tokens.txt+1−1
@@ -4,7 +4,7 @@
42:1 NEWLINE
42:1 NEWLINE
52:1 glyph ++
52:1 glyph ++
62:4 name b
62:4 name b
7−2:6 wing todo-action.todo
7+2:6 wing poke.todo
83:1 NEWLINE
83:1 NEWLINE
93:1 glyph +$
93:1 glyph +$
103:4 name c
103:4 name c
tests/golden/inline-namespaces/tree.txt+1−1
@@ -1,5 +1,5 @@
1(module
1(module
2 (mold 1:1 a (ref 1:6 todo-action.todo))
2 (mold 1:1 a (ref 1:6 todo-action.todo))
3− (value 2:1 b (wing 2:6 todo-action.todo))
3+ (value 2:1 b (wing 2:6 poke.todo))
4 (mold 3:1 c (ref 3:6 todos.todo))
4 (mold 3:1 c (ref 3:6 todos.todo))
5 (value 4:1 d (wing 4:6 todos.todo)))
5 (value 4:1 d (wing 4:6 todos.todo)))
tests/golden/inline-requests/about.txt+2−2
@@ -1,3 +1,3 @@
1−source: the first tab ("Jibb — an Elm-architecture UI language for Urbit"), The Elm architecture on Urbit, Effects: "A 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)`"
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 a cell, a constructor, and a constructor followed by a name
2+tests: derived gates called with an action and reply, a request, and a request followed by a fold
3expect: parses
3expect: 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)
2++ b (todos.todo |=%got)
2++ b (todos.todo |=%got)
3++ c (changes.todo |=%got apply)
3++ c (changes.todo |=%got apply)
tests/golden/inline-requests/tokens.txt+7−6
@@ -1,12 +1,13 @@
11:1 glyph ++
11:1 glyph ++
21:4 name a
21:4 name a
31:6 glyph (
31:6 glyph (
4−1:7 tight wing todo-action.todo
4+1:7 tight wing poke.todo
5−1:24 glyph [
5+1:17 glyph [
6−1:25 tight lit %add
6+1:18 tight lit %add
7−1:30 wing draft.m
7+1:23 wing draft.m
8−1:37 tight glyph ]
8+1:30 tight glyph ]
9+1:32 name same
9−1:38 tight glyph )
10+1:36 tight glyph )
102:1 NEWLINE
112:1 NEWLINE
112:1 glyph ++
122:1 glyph ++
122:4 name b
132:4 name b
tests/golden/inline-requests/tree.txt+3−2
@@ -2,8 +2,9 @@
2 (value 1:1 a
2 (value 1:1 a
3 (group 1:6
3 (group 1:6
4 (call 1:7
4 (call 1:7
5− (wing 1:7 todo-action.todo)
5+ (wing 1:7 poke.todo)
6− (tuple 1:24 (lit 1:25 %add) (wing 1:30 draft.m)))))
6+ (tuple 1:17 (lit 1:18 %add) (wing 1:23 draft.m))
7+ (wing 1:32 same))))
7 (value 2:1 b
8 (value 2:1 b
8 (group 2:6
9 (group 2:6
9 (call 2:7 (wing 2:7 todos.todo) (ctor 2:18 %got))))
10 (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 @@
1/= internal /lib/jibb/internal
1/= internal /lib/jibb/internal
2−+$ poke poke.internal
2++$ raw-poke raw-poke.internal
3+$ qath qath.internal
3+$ qath qath.internal
4
4
5:: Initial prelude functions. The rest of the inventory is still to come.
5:: Initial prelude functions. The rest of the inventory is still to come.
@@ -325,7 +325,7 @@
325 [f b] |= a=A (f a b)
325 [f b] |= a=A (f a b)
326
326
327+$ cmd |$ [M]
327+$ cmd |$ [M]
328− [%poke p=poke reply=$-((unit @t) M)]
328+ [%poke p=raw-poke reply=$-((unit @t) M)]
329 [%go url=@t]
329 [%go url=@t]
330 [%wait gap=@dr msg=M]
330 [%wait gap=@dr msg=M]
331 [%now reply=$-(@da M)]
331 [%now reply=$-(@da M)]
tests/golden/prelude-unit-list-transforms/tokens.txt+13−13
@@ -8,8 +8,8 @@
81:23 tight knot internal
81:23 tight knot internal
92:1 NEWLINE
92:1 NEWLINE
102:1 glyph +$
102:1 glyph +$
11−2:4 name poke
11+2:4 name raw-poke
12−2:9 wing poke.internal
12+2:13 wing raw-poke.internal
133:1 NEWLINE
133:1 NEWLINE
143:1 glyph +$
143:1 glyph +$
153:4 name qath
153:4 name qath
@@ -2116,17 +2116,17 @@
2116328:4 tight lit %poke
2116328:4 tight lit %poke
2117328:10 name p
2117328:10 name p
2118328:11 tight glyph =
2118328:11 tight glyph =
2119−328:12 tight name poke
2119+328:12 tight name raw-poke
2120−328:17 name reply
2120+328:21 name reply
2121−328:22 tight glyph =
2121+328:26 tight glyph =
2122−328:23 tight glyph $-(
2122+328:27 tight glyph $-(
2123−328:26 tight glyph (
2123+328:30 tight glyph (
2124−328:27 tight name unit
2124+328:31 tight name unit
2125−328:32 aura @t
2125+328:36 aura @t
2126−328:34 tight glyph )
2126+328:38 tight glyph )
2127−328:36 tvar M
2127+328:40 tvar M
2128−328:37 tight glyph )
2128+328:41 tight glyph )
2129−328:38 tight glyph ]
2129+328:42 tight glyph ]
2130329:3 NEWLINE
2130329:3 NEWLINE
2131329:3 glyph [
2131329:3 glyph [
2132329:4 tight lit %go
2132329:4 tight lit %go
tests/golden/prelude-unit-list-transforms/tree.txt+6−6
@@ -1,6 +1,6 @@
1(module
1(module
2 (jibb 1:1 internal /lib/jibb/internal)
2 (jibb 1:1 internal /lib/jibb/internal)
3− (mold 2:1 poke (ref 2:9 poke.internal))
3+ (mold 2:1 raw-poke (ref 2:13 raw-poke.internal))
4 (mold 3:1 qath (ref 3:9 qath.internal))
4 (mold 3:1 qath (ref 3:9 qath.internal))
5 (value 7:1 same
5 (value 7:1 same
6 (gate 7:9
6 (gate 7:9
@@ -924,11 +924,11 @@
924 (union 328:3
924 (union 328:3
925 (cell 328:3
925 (cell 328:3
926 (const 328:4 %poke)
926 (const 328:4 %poke)
927− (face 328:10 p (ref 328:12 poke))
927+ (face 328:10 p (ref 328:12 raw-poke))
928− (face 328:17 reply
928+ (face 328:21 reply
929− (fn 328:23
929+ (fn 328:27
930− (apply 328:26 unit (aura 328:32 @t))
930+ (apply 328:30 unit (aura 328:36 @t))
931− (tvar 328:36 M))))
931+ (tvar 328:40 M))))
932 (cell 329:3
932 (cell 329:3
933 (const 329:4 %go)
933 (const 329:4 %go)
934 (face 329:8 url (aura 329:12 @t)))
934 (face 329:8 url (aura 329:12 @t)))
tests/golden/prelude-unit-list-transforms/types.txt+1−1
@@ -1,5 +1,5 @@
1partial inference; module not checked
1partial inference; module not checked
2−+$ poke: not checked
2++$ raw-poke: not checked
3+$ qath: not checked
3+$ qath: not checked
4++ same: $-(A A)
4++ same: $-(A A)
5++ head: $-([A B] A)
5++ head: $-([A B] A)
tests/golden/types-arithmetic-module/types.txt+1−1
@@ -25,7 +25,7 @@ partial inference; module not checked
25++ reject-alias (alias.math %.n %.y)
25++ reject-alias (alias.math %.n %.y)
26 ^
26 ^
27++ reject-any: call constraint is not supported by partial inference
27++ reject-any: call constraint is not supported by partial inference
28−++ nested: local definitions need unsupported inference
28+++ nested: $-(A A) where A is an atom other than ?
29++ inc-decimal: @ud
29++ inc-decimal: @ud
30++ inc-hex: @ux
30++ inc-hex: @ux
31++ inc-bool: call's sample and argument types do not unify
31++ inc-bool: call's sample and argument types do not unify
tests/golden/types-generic-face-inference/types.txt+7−1
@@ -10,4 +10,10 @@ partial inference; module not checked
10/tests/golden/types-generic-face-inference/source.jibb:7:60: expression has type [left=@t rest=@ud]
10/tests/golden/types-generic-face-inference/source.jibb:7:60: expression has type [left=@t rest=@ud]
11++ mismatch |= x=[left=@t rest=@ud] ^- [right=@t rest=@ud] x
11++ mismatch |= x=[left=@t rest=@ud] ^- [right=@t rest=@ud] x
12 ^
12 ^
13−++ uncertain: 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 @@
1partial inference; module not checked
1partial inference; module not checked
2++ same: $-([a=A b=A] A)
2++ same: $-([a=A b=A] A)
3++ independent: @ud
3++ independent: @ud
4−++ first: call constraint is not supported by partial inference
4+++ first: explicit capital constraints are not supported by partial inference
5−++ second: call constraint is not supported by partial inference
5+++ second: explicit capital constraints are not supported by partial inference
6−++ capture: local definitions need unsupported 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+ ^
7++ local-independent: $-(@t @t)
10++ local-independent: $-(@t @t)
8++ unresolved-tag: tag needs context in partial inference
11++ unresolved-tag: tag needs context in partial inference
9++ discarded-number: @t
12++ 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."
2tests: Source-backed pure values at independent and generic types, agent and store constructors, missing and exhaustive union branches, prior unit state, path identity, numeric defaulting and pending constraints. Receiver mismatches and unimplemented contexts remain unsupported; no runtime or watch validation is claimed.
2tests: Source-backed pure values at independent and generic types, agent and store constructors, missing and exhaustive union branches, prior unit state, path identity, numeric defaulting and pending constraints. Receiver mismatches and unimplemented contexts remain unsupported; no runtime or watch validation is claimed.
3expect: parses
3expect: parses
4expect-types: a partial inference report
4expect-types: a partial inference report
tests/golden/types-prelude-cmd/source.jibb+2−2
@@ -3,7 +3,7 @@
3++ nav ^- (cmd @t) [%go url="/home"]
3++ nav ^- (cmd @t) [%go url="/home"]
4++ time ^- (cmd @t) [%now reply=|=(d=@da "done")]
4++ time ^- (cmd @t) [%now reply=|=(d=@da "done")]
5++ bad ^- (cmd @t) [%go url=~zod]
5++ bad ^- (cmd @t) [%go url=~zod]
6−++ send |= p=poke
6+++ send |= p=raw-poke
7 ^- (cmd @t) [%poke p |=(r=(unit @t) "done")]
7 ^- (cmd @t) [%poke p |=(r=(unit @t) "done")]
8++ wait ^- (cmd @t) [%wait ~s30 "done"]
8++ wait ^- (cmd @t) [%wait ~s30 "done"]
9++ who ^- (cmd @t) [%who |=(p=@p "done")]
9++ who ^- (cmd @t) [%who |=(p=@p "done")]
@@ -14,7 +14,7 @@
14++ wrong-reply ^- (cmd @t) [%who |=(p=@p ~zod)]
14++ wrong-reply ^- (cmd @t) [%who |=(p=@p ~zod)]
15++ commands ^- (list (cmd @t)) ~[[%go "/home"] [%wait ~s30 "done"]]
15++ commands ^- (list (cmd @t)) ~[[%go "/home"] [%wait ~s30 "done"]]
16++ commands-bad ^- (list (cmd @t)) ~[[%go "/home"] [%wait ~s30 ~zod]]
16++ commands-bad ^- (list (cmd @t)) ~[[%go "/home"] [%wait ~s30 ~zod]]
17−++ wrong-poke |= p=poke
17+++ wrong-poke |= p=raw-poke
18 ^- (cmd @t) [%poke p |=(r=@p "done")]
18 ^- (cmd @t) [%poke p |=(r=@p "done")]
19++ wrong-case ^- (cmd @t) %oops
19++ wrong-case ^- (cmd @t) %oops
20++ use-text |= x=(cmd @t) x
20++ use-text |= x=(cmd @t) x
tests/golden/types-prelude-cmd/tokens.txt+2−2
@@ -72,7 +72,7 @@
726:9 glyph |=
726:9 glyph |=
736:12 name p
736:12 name p
746:13 tight glyph =
746:13 tight glyph =
75−6:14 tight name poke
75+6:14 tight name raw-poke
767:3 INDENT
767:3 INDENT
777:3 glyph ^-
777:3 glyph ^-
787:6 glyph (
787:6 glyph (
@@ -234,7 +234,7 @@
23417:15 glyph |=
23417:15 glyph |=
23517:18 name p
23517:18 name p
23617:19 tight glyph =
23617:19 tight glyph =
237−17:20 tight name poke
237+17:20 tight name raw-poke
23818:3 INDENT
23818:3 INDENT
23918:3 glyph ^-
23918:3 glyph ^-
24018:6 glyph (
24018:6 glyph (
tests/golden/types-prelude-cmd/tree.txt+2−2
@@ -32,7 +32,7 @@
32 (face 5:25 url (lit 5:29 ~zod)))))
32 (face 5:25 url (lit 5:29 ~zod)))))
33 (value 6:1 send
33 (value 6:1 send
34 (gate 6:9
34 (gate 6:9
35− (face 6:12 p (ref 6:14 poke))
35+ (face 6:12 p (ref 6:14 raw-poke))
36 (body 7:3
36 (body 7:3
37 (cast 7:3
37 (cast 7:3
38 (apply 7:6 cmd (aura 7:11 @t))
38 (apply 7:6 cmd (aura 7:11 @t))
@@ -95,7 +95,7 @@
95 (tuple 16:52 (lit 16:53 %wait) (lit 16:59 ~s30) (lit 16:64 ~zod)))))
95 (tuple 16:52 (lit 16:53 %wait) (lit 16:59 ~s30) (lit 16:64 ~zod)))))
96 (value 17:1 wrong-poke
96 (value 17:1 wrong-poke
97 (gate 17:15
97 (gate 17:15
98− (face 17:18 p (ref 17:20 poke))
98+ (face 17:18 p (ref 17:20 raw-poke))
99 (body 18:3
99 (body 18:3
100 (cast 18:3
100 (cast 18:3
101 (apply 18:6 cmd (aura 18:11 @t))
101 (apply 18:6 cmd (aura 18:11 @t))
tests/golden/types-prelude-cmd/types.txt+1−1
@@ -10,7 +10,7 @@ partial inference; module not checked
10/tests/golden/types-prelude-cmd/source.jibb:5:20: expression
10/tests/golden/types-prelude-cmd/source.jibb:5:20: expression
11++ bad ^- (cmd @t) [%go url=~zod]
11++ bad ^- (cmd @t) [%go url=~zod]
12 ^
12 ^
13−++ send: $-(poke (cmd @t))
13+++ send: $-(raw-poke (cmd @t))
14++ wait: (cmd @t)
14++ wait: (cmd @t)
15++ who: (cmd @t)
15++ who: (cmd @t)
16++ wrong-message: cast mold and expression type do not unify
16++ wrong-message: cast mold and expression type do not unify
tests/golden/types-record-cast-context/types.txt+1−1
@@ -46,4 +46,4 @@ partial inference; module not checked
46++ forced: explicit capital constraints are not supported by partial inference
46++ forced: explicit capital constraints are not supported by partial inference
47++ pending-tag: tag needs context in partial inference
47++ pending-tag: tag needs context in partial inference
48++ pending-null: `~` needs context in partial inference
48++ 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 @@
1partial inference; module not checked
1partial 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 @@
1partial inference; module not checked
1partial 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
15++ repeated: $-([a=(choice A) b=(choice A)] (choice A))
15++ repeated: $-([a=(choice A) b=(choice A)] (choice A))
16++ mismatch: call constraint is not supported by partial inference
16++ mismatch: call constraint is not supported by partial inference
17++ face-result: $-(local-msg [field=local-msg flag=?])
17++ 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
19++ pending: tag needs context in partial inference
19++ pending: tag needs context in partial inference
20++ unresolved: tag needs context in partial inference
20++ unresolved: tag needs context in partial inference
21++ same-choice: $-([a=(choice A) b=(choice A)] (choice A))
21++ same-choice: $-([a=(choice A) b=(choice A)] (choice A))
tests/lib/jibb-deferred.hoon+1−1
@@ -111,7 +111,7 @@
111 ?~ explicit-capture ~['BAD-explicit-capture-scan']
111 ?~ explicit-capture ~['BAD-explicit-capture-scan']
112 =/ tag-lit=lit:jibb [%term %tas %watch '%watch']
112 =/ tag-lit=lit:jibb [%term %tas %watch '%watch']
113 =/ bound-tag-state=istate:jibb st(sub ~[[720 [%var 721]]])
113 =/ 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)
115 ?~ tag-check ~['BAD-tag-scan']
115 ?~ tag-check ~['BAD-tag-scan']
116 =/ 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]]
116 =/ 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]]
117 =/ cyc=(unit ischeme:jibb) (dg-generalize:jibb [%fn [%var 710] [%fn [%var 712] [%var 713]]] ~ cycle ~ ~ st 300)
117 =/ 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 @@
64 =/ d=def:jibb i.t.t.t.ds
64 =/ d=def:jibb i.t.t.t.ds
65 ?. &(?=(%value -.a) ?=(%value -.b) ?=(%value -.c) ?=(%value -.d)) 'BAD value declarations'
65 ?. &(?=(%value -.a) ?=(%value -.b) ?=(%value -.c) ?=(%value -.d)) 'BAD value declarations'
66 =/ env=ienv:jibb ~[[%text-event [[%fn [%atom %t] [%atom %t]] ~]]]
66 =/ 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]
68 =/ projection=iwprojection:jibb *iwprojection:jibb
68 =/ projection=iwprojection:jibb *iwprojection:jibb
69 =/ st=istate:jibb *istate:jibb
69 =/ st=istate:jibb *istate:jibb
70 =. st st(next 201, prelude `iface.u.prep, tags ~[tag], holes ~[[99 (span-of:jibb val.a)]], projections ~[projection])
70 =. 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 @@
77 ?. ?=(%branch -.val.p) 'BAD polymorphic branch'
77 ?. ?=(%branch -.val.p) 'BAD polymorphic branch'
78 =/ env=ienv:jibb ~[[%x [target ~]]]
78 =/ env=ienv:jibb ~[[%x [target ~]]]
79 =/ poly=ienv:jibb ~[[%x [generic ~[42]]]]
79 =/ 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]
81 =/ projection=iwprojection:jibb *iwprojection:jibb
81 =/ projection=iwprojection:jibb *iwprojection:jibb
82 =/ st=istate:jibb *istate:jibb
82 =/ st=istate:jibb *istate:jibb
83 =. st st(next 201, prelude `iface.u.prep, tags ~[tag], holes ~[[99 (span-of:jibb val.a)]], projections ~[projection])
83 =. 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 @@
78 =/ no-declaration=@t (crip "+$ poke todo-action\0a")
78 =/ no-declaration=@t (crip "+$ poke todo-action\0a")
79 =/ no-declaration-modules=(list [at=path source=@t]) ~[[/ui/api/todo/jibb no-declaration]]
79 =/ no-declaration-modules=(list [at=path source=@t]) ~[[/ui/api/todo/jibb no-declaration]]
80 =/ j (golden-types-with-prepared-prelude:jibb /ui/test/jibb client ~ marks no-declaration-modules prepared)
80 =/ 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")
82 =/ collision-modules=(list [at=path source=@t]) ~[[/ui/api/todo/jibb collision]]
82 =/ collision-modules=(list [at=path source=@t]) ~[[/ui/api/todo/jibb collision]]
83 =/ k (golden-types-with-prepared-prelude:jibb /ui/test/jibb client ~ marks collision-modules prepared)
83 =/ 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")
85 =/ wrong-path-modules=(list [at=path source=@t]) ~[[/ui/wrong/todo/jibb api]]
85 =/ wrong-path-modules=(list [at=path source=@t]) ~[[/ui/wrong/todo/jibb api]]
86 =/ l (golden-types-with-prepared-prelude:jibb /ui/test/jibb wrong-path-source ~ marks wrong-path-modules prepared)
86 =/ l (golden-types-with-prepared-prelude:jibb /ui/test/jibb wrong-path-source ~ marks wrong-path-modules prepared)
87 (of-wain:format ~[(preparation-controls prelude internal) a b c d e f g h i j k l])
87 (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 @@
74 =/ detailed=jfile-detailed-result:jibb (program-init-detailed at src ~ prepared)
74 =/ detailed=jfile-detailed-result:jibb (program-init-detailed at src ~ prepared)
75 ?: ?=(%& -.detailed) ~[(weld (trip label) ": structured check accepted")]
75 ?: ?=(%& -.detailed) ~[(weld (trip label) ": structured check accepted")]
76 ?. ?=(~ overlap.p.detailed) ~[(weld (trip label) ": unexpected overlap evidence")]
76 ?. ?=(~ overlap.p.detailed) ~[(weld (trip label) ": unexpected overlap evidence")]
77+ ?. =(message.p.detailed boundary)
77− ?. =(message.p.detailed boundary) ~[(weld (trip label) ": rejected at the wrong boundary")]
78+ ~[(weld (weld (trip label) ": rejected at the wrong boundary: ") (trip message.p.detailed))]
78 =/ legacy=jfile-result:jibb (program-init-legacy at src ~ prepared)
79 =/ legacy=jfile-result:jibb (program-init-legacy at src ~ prepared)
79 ?: ?=(%& -.legacy) ~[(weld (trip label) ": legacy check accepted")]
80 ?: ?=(%& -.legacy) ~[(weld (trip label) ": legacy check accepted")]
80 ?. =(p.legacy boundary) ~[(weld (trip label) ": legacy boundary differs")]
81 ?. =(p.legacy boundary) ~[(weld (trip label) ": legacy boundary differs")]
@@ -88,6 +89,11 @@
88 (program-init-negative label.i.cases at.i.cases src.i.cases boundary.i.cases prepared)
89 (program-init-negative label.i.cases at.i.cases src.i.cases boundary.i.cases prepared)
89 $(cases t.cases)
90 $(cases t.cases)
90::
91::
92+++ program-init-pending
93+ |= [at=path src=@t line=@ud col=@ud literal=tape]
94+ ^- @t
95+ (show-error:jibb src [at line col (weld "nothing fixes the union of " literal)])
96+::
91++ program-init-errors
97++ program-init-errors
92 |= [public=@t private=@t island=@t downstream=@t unfaced=@t negatives=(list @t)]
98 |= [public=@t private=@t island=@t downstream=@t unfaced=@t negatives=(list @t)]
93 ^- (list tape)
99 ^- (list tape)
@@ -101,15 +107,15 @@
101 ?. =(9 (lent negatives)) ~["contextual negative fixture count differs"]
107 ?. =(9 (lent negatives)) ~["contextual negative fixture count differs"]
102 =/ definitions=@t (crip "module definitions need unsupported inference: {(spud at)}")
108 =/ definitions=@t (crip "module definitions need unsupported inference: {(spud at)}")
103 =/ cases=(list [label=@t at=path src=@t boundary=@t])
109 =/ cases=(list [label=@t at=path src=@t boundary=@t])
104− :~ ['incompatible error field' at (snag 0 negatives) definitions]
110+ :~ ['incompatible error field' at (snag 0 negatives) (program-init-pending at (snag 0 negatives) 6 32 "~")]
105− ['earlier tuple mismatch' at (snag 1 negatives) definitions]
111+ ['earlier tuple mismatch' at (snag 1 negatives) (program-init-pending at (snag 1 negatives) 6 34 "~")]
106− ['inconsistent model' at (snag 2 negatives) definitions]
112+ ['inconsistent model' at (snag 2 negatives) (program-init-pending at (snag 2 negatives) 7 32 "~")]
107− ['inconsistent message' at (snag 3 negatives) definitions]
113+ ['inconsistent message' at (snag 3 negatives) (program-init-pending at (snag 3 negatives) 9 32 "~")]
108− ['missing/generic data sample' at (snag 4 negatives) definitions]
114+ ['missing/generic data sample' at (snag 4 negatives) (program-init-pending at (snag 4 negatives) 6 22 "~")]
109 ['missing initializer' at (snag 5 negatives) definitions]
115 ['missing initializer' at (snag 5 negatives) definitions]
110− ['unrelated pending tag' at (snag 6 negatives) definitions]
116+ ['unrelated pending tag' at (snag 6 negatives) (program-init-pending at (snag 6 negatives) 12 6 "%unrelated")]
111− ['non-main same source' at (snag 7 negatives) definitions]
117+ ['non-main same source' at (snag 7 negatives) (program-init-pending at (snag 7 negatives) 6 32 "~")]
112− ['init and subs unresolved' at (snag 8 negatives) definitions]
118+ ['init and subs unresolved' at (snag 8 negatives) (program-init-pending at (snag 8 negatives) 6 32 "~")]
113 :- 'API path'
119 :- 'API path'
114 [/ui/api/program-main/jibb island 'module kind needs unsupported inference: /ui/api/program-main/jibb']
120 [/ui/api/program-main/jibb island 'module kind needs unsupported inference: /ui/api/program-main/jibb']
115 :- 'store path'
121 :- 'store path'
tests/lib/jibb-program-update.hoon+3−2
@@ -74,7 +74,8 @@
74 =/ detailed=jfile-detailed-result:jibb (program-update-detailed at src ~ prepared)
74 =/ detailed=jfile-detailed-result:jibb (program-update-detailed at src ~ prepared)
75 ?: ?=(%& -.detailed) ~[(weld (trip label) ": structured check accepted")]
75 ?: ?=(%& -.detailed) ~[(weld (trip label) ": structured check accepted")]
76 ?. ?=(~ overlap.p.detailed) ~[(weld (trip label) ": unexpected overlap evidence")]
76 ?. ?=(~ overlap.p.detailed) ~[(weld (trip label) ": unexpected overlap evidence")]
77+ ?. =(message.p.detailed boundary)
77− ?. =(message.p.detailed boundary) ~[(weld (trip label) ": rejected at the wrong boundary")]
78+ ~[(weld (weld (trip label) ": rejected at the wrong boundary: ") (trip message.p.detailed))]
78 =/ legacy=jfile-result:jibb (program-update-legacy at src ~ prepared)
79 =/ legacy=jfile-result:jibb (program-update-legacy at src ~ prepared)
79 ?: ?=(%& -.legacy) ~[(weld (trip label) ": legacy check accepted")]
80 ?: ?=(%& -.legacy) ~[(weld (trip label) ": legacy check accepted")]
80 ?. =(p.legacy boundary) ~[(weld (trip label) ": legacy boundary differs")]
81 ?. =(p.legacy boundary) ~[(weld (trip label) ": legacy boundary differs")]
@@ -111,7 +112,7 @@
111 ['malformed sample' at (snag 3 negatives) definitions u.prepared]
112 ['malformed sample' at (snag 3 negatives) definitions u.prepared]
112 ['non-two-slot sample' at (snag 4 negatives) definitions u.prepared]
113 ['non-two-slot sample' at (snag 4 negatives) definitions u.prepared]
113 ['non-main same source' at (snag 5 negatives) definitions u.prepared]
114 ['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]
115 ['missing canonical cmd' at island definitions without-cmd]
116 ['missing canonical cmd' at island definitions without-cmd]
116 ['missing canonical list' at (snag 7 negatives) definitions without-list]
117 ['missing canonical list' at (snag 7 negatives) definitions without-list]
117 :- 'API path'
118 :- 'API path'
tests/lib/jibb-store.hoon+48−24
@@ -25,7 +25,6 @@
25 ^- @t
25 ^- @t
26 %+ rap 3
26 %+ rap 3
27 :~ '+$ state [items=(list @t) open=?]\0a'
27 :~ '+$ state [items=(list @t) open=?]\0a'
28− '+$ cart-action\0a [%add item=@t]\0a %toggle\0a'
29 poke main init update extra
28 poke main init update extra
30 ==
29 ==
31::
30::
@@ -48,10 +47,10 @@
48 %+ rap 3
47 %+ rap 3
49 :~ '/= cart /ui/stores/cart\0a'
48 :~ '/= cart /ui/stores/cart\0a'
50 '+$ local-state state.cart\0a'
49 '+$ local-state state.cart\0a'
51− '+$ local-action cart-action.cart\0a'
50+ '+$ local-action poke.cart\0a'
52 '++ imported-main main.cart\0a'
51 '++ imported-main main.cart\0a'
53 '++ imported-request |= reply=$-(local-state M) (state.cart reply)\0a'
52 '++ 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'
55 ==
54 ==
56::
55::
57++ store-rejections
56++ store-rejections
@@ -96,9 +95,9 @@
96 =/ forged=ifile:jibb
95 =/ forged=ifile:jibb
97 cart(values [[%state [[%fn [%atom %t] [%atom %t]] ~]] ordinary])
96 cart(values [[%state [[%fn [%atom %t] [%atom %t]] ~]] ordinary])
98 =/ without-action=ienv:jibb
97 =/ 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)))
100 =/ forged-action=ifile:jibb
99 =/ 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])
102 =/ graphs=(list [label=tape graph=irequest-graph:jibb])
101 =/ graphs=(list [label=tape graph=irequest-graph:jibb])
103 :~ ["missing store evidence" missing]
102 :~ ["missing store evidence" missing]
104 ["store source mismatch" mismatch]
103 ["store source mismatch" mismatch]
@@ -149,31 +148,56 @@
149 ?. =(actual-main '[init=[items=(list @t) open=?] update=*]') ~["cart main type differs"]
148 ?. =(actual-main '[init=[items=(list @t) open=?] update=*]') ~["cart main type differs"]
150 ?. &(?=(~ vars.u.cart-main) ?=(~ (itype-vars:jibb typ.u.cart-main))) ~["cart main is open"]
149 ?. &(?=(~ vars.u.cart-main) ?=(~ (itype-vars:jibb typ.u.cart-main))) ~["cart main is open"]
151 =/ state=(unit ischeme:jibb) (find-jibb-mold:jibb %state cart)
150 =/ 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)
153 ?~ state ~["state mold is missing"]
152 ?~ state ~["state mold is missing"]
154− ?~ action ~["cart-action mold is missing"]
153+ ?~ action ~["local poke action mold is missing"]
155− ?^ (find-jibb-mold:jibb %poke cart) ~["poke declaration leaked as an exported mold"]
156 =/ ask=(unit ischeme:jibb) (request-compatible-ask:jibb u.prepared)
154 =/ 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)
158 ?~ ask ~["canonical ask is unavailable"]
156 ?~ ask ~["canonical ask is unavailable"]
159 ?~ poke ~["canonical poke is unavailable"]
157 ?~ poke ~["canonical poke is unavailable"]
160 =/ ask-result=(unit itype:jibb) (template-apply:jibb u.ask ~[[%var 0]])
158 =/ ask-result=(unit itype:jibb) (template-apply:jibb u.ask ~[[%var 0]])
161 ?~ ask-result ~["canonical ask did not instantiate"]
159 ?~ ask-result ~["canonical ask did not instantiate"]
162 =/ expected-state=ischeme:jibb [[%fn [%fn typ.u.state [%var 0]] u.ask-result] ~[0]]
160 =/ 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"]
164 =/ state-values=(list [name=term scheme=ischeme:jibb])
188 =/ state-values=(list [name=term scheme=ischeme:jibb])
165 (skim values.cart |=(entry=[name=term scheme=ischeme:jibb] =(%state name.entry)))
189 (skim values.cart |=(entry=[name=term scheme=ischeme:jibb] =(%state name.entry)))
166 =/ action-values=(list [name=term scheme=ischeme:jibb])
190 =/ 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)))
168 ?. ?=([* ~] state-values) ~["derived state member is not unique"]
192 ?. ?=([* ~] state-values) ~["derived state member is not unique"]
169 ?. =(scheme.i.state-values expected-state) ~["derived state scheme differs"]
193 ?. =(scheme.i.state-values expected-state) ~["derived state scheme differs"]
170− ?. ?=([* ~] action-values) ~["derived cart-action member is not unique"]
194+ ?. ?=([* ~] action-values) ~["derived poke member is not unique"]
171− ?. =(scheme.i.action-values expected-action) ~["derived cart-action scheme differs"]
195+ ?. =(scheme.i.action-values u.expected-action) ~["derived poke command scheme differs"]
172 ?~ graph.cart ~["cart request graph is missing"]
196 ?~ graph.cart ~["cart request graph is missing"]
173 ?. ?=([* ~] stores.u.graph.cart) ~["cart store evidence is not unique"]
197 ?. ?=([* ~] stores.u.graph.cart) ~["cart store evidence is not unique"]
174 =/ evidence=istore-request-evidence:jibb i.stores.u.graph.cart
198 =/ evidence=istore-request-evidence:jibb i.stores.u.graph.cart
175 ?. &(=(store-at.evidence cart-at) =(source.evidence cart-source)) ~["store evidence does not retain exact path/source"]
199 ?. &(=(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"]
177 =/ basket-result=jfile-detailed-result:jibb
201 =/ basket-result=jfile-detailed-result:jibb
178 (store-detailed /ui/basket/jibb basket-source modules u.prepared)
202 (store-detailed /ui/basket/jibb basket-source modules u.prepared)
179 ?: ?=(%| -.basket-result) ~[(weld "basket was rejected: " (trip message.p.basket-result))]
203 ?: ?=(%| -.basket-result) ~[(weld "basket was rejected: " (trip message.p.basket-result))]
@@ -209,37 +233,37 @@
209 =/ direct=jfile-detailed-result:jibb
233 =/ direct=jfile-detailed-result:jibb
210 (store-detailed /tests/direct/cart/jibb cart-source ~ u.prepared)
234 (store-detailed /tests/direct/cart/jibb cart-source ~ u.prepared)
211 ?: ?=(%| -.direct) ~["direct store outside /ui/stores was rejected"]
235 ?: ?=(%| -.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' '')
213 =/ grouped-result=jfile-detailed-result:jibb
237 =/ grouped-result=jfile-detailed-result:jibb
214 (store-detailed /tests/direct/grouped/jibb grouped ~ u.prepared)
238 (store-detailed /tests/direct/grouped/jibb grouped ~ u.prepared)
215 ?: ?=(%| -.grouped-result) ~[(weld "grouped direct store main was rejected: " (trip message.p.grouped-result))]
239 ?: ?=(%| -.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'
217 =/ gate-result=jfile-detailed-result:jibb
241 =/ gate-result=jfile-detailed-result:jibb
218 (store-detailed /tests/direct/gate-state/jibb gate-state ~ u.prepared)
242 (store-detailed /tests/direct/gate-state/jibb gate-state ~ u.prepared)
219 ?: ?=(%| -.gate-result) ~["gate-bearing store state was rejected"]
243 ?: ?=(%| -.gate-result) ~["gate-bearing store state was rejected"]
220 =/ evidence-failures=(list tape) (store-evidence-failures cart basket basket-source iface.u.prepared)
244 =/ evidence-failures=(list tape) (store-evidence-failures cart basket basket-source iface.u.prepared)
221 ?^ evidence-failures evidence-failures
245 ?^ evidence-failures evidence-failures
222− =/ normal-poke=@t '+$ poke cart-action\0a'
246+ =/ normal-poke=@t '+$ poke\0a [%add item=@t]\0a %toggle\0a'
223 =/ normal-main=@t '++ main (store init update)\0a'
247 =/ normal-main=@t '++ main (store init update)\0a'
224 =/ normal-init=@t '++ init ^- state [~ %.n]\0a'
248 =/ 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'
226 =/ cart-cases=(list [label=tape at=path src=@t modules=jbundle:jibb])
250 =/ cart-cases=(list [label=tape at=path src=@t modules=jbundle:jibb])
227 :~ ["wrong init" /tests/store/wrong-init/jibb (store-cart-source normal-poke normal-main '++ init ^- state [~ "bad"]\0a' normal-update '') ~]
251 :~ ["wrong init" /tests/store/wrong-init/jibb (store-cart-source normal-poke normal-main '++ init ^- state [~ "bad"]\0a' normal-update '') ~]
228 ["wrong action" /tests/store/wrong-action/jibb (store-cart-source normal-poke normal-main normal-init '++ update |= [a=@t s=state] s\0a' '') ~]
252 ["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' '') ~]
230 ["unknown poke" /tests/store/unknown-poke/jibb (store-cart-source '+$ poke missing\0a' normal-main normal-init normal-update '') ~]
254 ["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 '') ~]
255+ ["qualified poke" /tests/store/qualified-poke/jibb (store-cart-source '+$ poke poke.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 '') ~]
256+ ["duplicate poke" /tests/store/duplicate-poke/jibb (store-cart-source '+$ poke %one\0a+$ poke %two\0a' normal-main normal-init normal-update '') ~]
233 ["duplicate state" /tests/store/duplicate-state/jibb (store-cart-source normal-poke normal-main normal-init normal-update '+$ state @t\0a') ~]
257 ["duplicate state" /tests/store/duplicate-state/jibb (store-cart-source normal-poke normal-main normal-init normal-update '+$ state @t\0a') ~]
234 ["state derived collision" /tests/store/state-collision/jibb (store-cart-source normal-poke normal-main normal-init normal-update '++ state 0\0a') ~]
258 ["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') ~]
236 ["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 '')) ~]
260 ["import derived collision" /tests/store/import-collision/jibb (cat 3 '/= state /ui/stores/other\0a' (store-cart-source normal-poke normal-main normal-init normal-update '')) ~]
237 ["alias main" /tests/store/alias-main/jibb (store-cart-source normal-poke '++ main (build init update)\0a' normal-init normal-update '++ build store\0a') ~]
261 ["alias main" /tests/store/alias-main/jibb (store-cart-source normal-poke '++ main (build init update)\0a' normal-init normal-update '++ build store\0a') ~]
238 ["hand-built main" /tests/store/hand-main/jibb (store-cart-source normal-poke '++ main [init update]\0a' normal-init normal-update '') ~]
262 ["hand-built main" /tests/store/hand-main/jibb (store-cart-source normal-poke '++ main [init update]\0a' normal-init normal-update '') ~]
239 ==
263 ==
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'
241 =/ normal-subs=@t '++ subs |= m=model\0a ~[[%watch (state.cart |=%got)]]\0a'
265 =/ 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'
243 =/ basket-cases=(list [label=tape at=path src=@t modules=jbundle:jibb])
267 =/ basket-cases=(list [label=tape at=path src=@t modules=jbundle:jibb])
244 :~ ["wrong poke payload" /ui/basket/jibb (store-basket-source wrong-payload normal-subs '') modules]
268 :~ ["wrong poke payload" /ui/basket/jibb (store-basket-source wrong-payload normal-subs '') modules]
245 ["wrong state reply" /ui/basket/jibb (store-basket-source normal-basket-update '++ subs |= m=model\0a ~[[%watch (state.cart |=%acked)]]\0a' '') modules]
269 ["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 @@
41 =/ iface=ifile:jibb iface.p.out
41 =/ iface=ifile:jibb iface.p.out
42 ?. =(source.iface `api) 'actual API source changed'
42 ?. =(source.iface `api) 'actual API source changed'
43 =/ names=(list term) (turn values.iface |=(x=[name=term scheme=ischeme:jibb] name.x))
43 =/ 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]
45 ?. (levy required-values |=(x=term (lien names |=(y=term =(x y))))) 'derived value missing'
45 ?. (levy required-values |=(x=term (lien names |=(y=term =(x y))))) 'derived value missing'
46 =/ mnames=(list term) (turn molds.iface |=(x=[name=term template=ischeme:jibb] name.x))
46 =/ mnames=(list term) (turn molds.iface |=(x=[name=term template=ischeme:jibb] name.x))
47 =/ required-molds=(list term) ~[%item %todo-action %todos %todo-update %todo-item]
47 =/ required-molds=(list term) ~[%item %todo-action %todos %todo-update %todo-item]
tests/lib/jibb-union-source.hoon+1−1
@@ -90,7 +90,7 @@
90 =/ cap256=icaps:jibb (turn (gulf 0 255) |=(n=@ud ['A' n *span:jibb]))
90 =/ cap256=icaps:jibb (turn (gulf 0 255) |=(n=@ud ['A' n *span:jibb]))
91 =/ cap257=icaps:jibb (turn (gulf 0 256) |=(n=@ud ['A' n *span:jibb]))
91 =/ cap257=icaps:jibb (turn (gulf 0 256) |=(n=@ud ['A' n *span:jibb]))
92 =/ initial=istate:jibb
92 =/ 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)
94 =/ preserved=(unit [typ=itype:jibb state=istate:jibb]) (infer-simple-shape:jibb u.chosen initial)
94 =/ preserved=(unit [typ=itype:jibb state=istate:jibb]) (infer-simple-shape:jibb u.chosen initial)
95 =/ structured=istate:jibb initial(params ~[['A' [%cell [%atom %t] [%atom %t]]]])
95 =/ structured=istate:jibb initial(params ~[['A' [%cell [%atom %t] [%atom %t]]]])
96 =/ rejected=(unit [typ=itype:jibb state=istate:jibb]) (infer-simple-shape:jibb u.chosen structured)
96 =/ 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 @@
31/* src-3 %jibb /tests/golden/doc-grammar-02-buttons/source/jibb
31/* src-3 %jibb /tests/golden/doc-grammar-02-buttons/source/jibb
32/* tok-3 %txt /tests/golden/doc-grammar-02-buttons/tokens/txt
32/* tok-3 %txt /tests/golden/doc-grammar-02-buttons/tokens/txt
33/* tre-3 %txt /tests/golden/doc-grammar-02-buttons/tree/txt
33/* tre-3 %txt /tests/golden/doc-grammar-02-buttons/tree/txt
34+/* typ-3 %txt /tests/golden/doc-grammar-02-buttons/types/txt
34/* src-4 %jibb /tests/golden/doc-grammar-03-view-day/source/jibb
35/* src-4 %jibb /tests/golden/doc-grammar-03-view-day/source/jibb
35/* tok-4 %txt /tests/golden/doc-grammar-03-view-day/tokens/txt
36/* tok-4 %txt /tests/golden/doc-grammar-03-view-day/tokens/txt
36/* tre-4 %txt /tests/golden/doc-grammar-03-view-day/tree/txt
37/* tre-4 %txt /tests/golden/doc-grammar-03-view-day/tree/txt
@@ -2467,7 +2468,7 @@
2467++ test-doc-grammar-01-imports
2468++ test-doc-grammar-01-imports
2468 (check ~.doc-grammar-01-imports src-2 `tok-2 `tre-2)
2469 (check ~.doc-grammar-01-imports src-2 `tok-2 `tre-2)
2469++ test-doc-grammar-02-buttons
2470++ 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 ~ ~ ~))
2471++ test-doc-grammar-03-view-day
2472++ test-doc-grammar-03-view-day
2472 (check ~.doc-grammar-03-view-day src-4 `tok-4 `tre-4)
2473 (check ~.doc-grammar-03-view-day src-4 `tok-4 `tre-4)
2473++ test-doc-grammar-04-step
2474++ test-doc-grammar-04-step
tests/type-api-paths/poke-clash.txt+2
@@ -10,3 +10,5 @@
10+$ paths
10+$ paths
11 [%todo-action /todos todos]
11 [%todo-action /todos todos]
12 [%todo-by-id /todo/[id=@ud] todo-item]
12 [%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 @@
19 ?- (gth (lent (tuba (trip t))) 80)
19 ?- (gth (lent (tuba (trip t))) 80)
20 %.y [m(draft=t error=`"Too long") ~]
20 %.y [m(draft=t error=`"Too long") ~]
21 %.n [m(draft=t error=~) ~]
21 %.n [m(draft=t error=~) ~]
22− %submit [m(draft="") ~[[%poke (todo-action.todo [%add draft.m]) |=%acked]]]
22+ %submit [m(draft="") ~[(poke.todo [%add draft.m] |=%acked)]]
23− [%toggled id] [m ~[[%poke (todo-action.todo [%toggle id]) |=%acked]]]
23+ [%toggled id] [m ~[(poke.todo [%toggle id] |=%acked)]]
24 [%got ts] [m(todos=ts) ~]
24 [%got ts] [m(todos=ts) ~]
25 [%acked err] [m(error=err) ~]
25 [%acked err] [m(error=err) ~]
26
26
tests/type-gate-free/todo-noun.txt+2−2
@@ -19,8 +19,8 @@
19 ?- (gth (lent (tuba (trip t))) 80)
19 ?- (gth (lent (tuba (trip t))) 80)
20 %.y [m(draft=t error=`"Too long") ~]
20 %.y [m(draft=t error=`"Too long") ~]
21 %.n [m(draft=t error=~) ~]
21 %.n [m(draft=t error=~) ~]
22− %submit [m(draft="") ~[[%poke (todo-action.todo [%add draft.m]) |=%acked]]]
22+ %submit [m(draft="") ~[(poke.todo [%add draft.m] |=%acked)]]
23− [%toggled id] [m ~[[%poke (todo-action.todo [%toggle id]) |=%acked]]]
23+ [%toggled id] [m ~[(poke.todo [%toggle id] |=%acked)]]
24 [%got ts] [m(todos=ts) ~]
24 [%got ts] [m(todos=ts) ~]
25 [%acked err] [m(error=err) ~]
25 [%acked err] [m(error=err) ~]
26
26
tests/type-gate-free/todo.txt+2−2
@@ -19,8 +19,8 @@
19 ?- (gth (lent (tuba (trip t))) 80)
19 ?- (gth (lent (tuba (trip t))) 80)
20 %.y [m(draft=t error=`"Too long") ~]
20 %.y [m(draft=t error=`"Too long") ~]
21 %.n [m(draft=t error=~) ~]
21 %.n [m(draft=t error=~) ~]
22− %submit [m(draft="") ~[[%poke (todo-action.todo [%add draft.m]) |=%acked]]]
22+ %submit [m(draft="") ~[(poke.todo [%add draft.m] |=%acked)]]
23− [%toggled id] [m ~[[%poke (todo-action.todo [%toggle id]) |=%acked]]]
23+ [%toggled id] [m ~[(poke.todo [%toggle id] |=%acked)]]
24 [%got ts] [m(todos=ts) ~]
24 [%got ts] [m(todos=ts) ~]
25 [%acked err] [m(error=err) ~]
25 [%acked err] [m(error=err) ~]
26
26
tests/type-page-main/todo-island.txt+2−2
@@ -19,8 +19,8 @@
19 ?- (gth (lent (tuba (trip t))) 80)
19 ?- (gth (lent (tuba (trip t))) 80)
20 %.y [m(draft=t error=`"Too long") ~]
20 %.y [m(draft=t error=`"Too long") ~]
21 %.n [m(draft=t error=~) ~]
21 %.n [m(draft=t error=~) ~]
22− %submit [m(draft="") ~[[%poke (todo-action.todo [%add draft.m]) |=%acked]]]
22+ %submit [m(draft="") ~[(poke.todo [%add draft.m] |=%acked)]]
23− [%toggled id] [m ~[[%poke (todo-action.todo [%toggle id]) |=%acked]]]
23+ [%toggled id] [m ~[(poke.todo [%toggle id] |=%acked)]]
24 [%got ts] [m(todos=ts) ~]
24 [%got ts] [m(todos=ts) ~]
25 [%acked err] [m(error=err) ~]
25 [%acked err] [m(error=err) ~]
26
26
tests/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
2ordinary transparent type. A real Hoon mark is compiled and read by the importer
2ordinary 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
4the constructor and mark mismatch, aliases and re-exports, ordinary construction
4the constructor and mark mismatch, aliases and re-exports, ordinary construction
5and inspection, private import boundaries, unsupported or invalid API declarations,
5and inspection, private import boundaries, unsupported or invalid API declarations,
6and preparation failures. The report remains partial; effect lowering and runtime
6and preparation failures. The report remains partial; effect lowering and runtime
tests/type-poke/alias.txt+1−1
@@ -1,2 +1,2 @@
1/= fake /ui/internal
1/= 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 @@
1/= todo /ui/api/todo
1/= todo /ui/api/todo
2−+$ copy poke
2++$ copy raw-poke
3+$ double copy
3+$ double copy
4−++ good (todo-action.todo "ok")
4+++ good (poke.todo "ok" same)
5−++ pass |= x=poke x
5+++ pass |= x=raw-poke x
6++ pass-alias |= x=copy x
6++ pass-alias |= x=copy x
7−++ direct ^- poke [%agent %todo %todo-action "x"]
7+++ direct ^- raw-poke [%agent %todo %todo-action "x"]
8++ alias ^- double [%agent %todo %todo-action "x"]
8++ alias ^- double [%agent %todo %todo-action "x"]
9−++ getter |= x=poke payload.x
9+++ getter |= x=raw-poke payload.x
10−++ inspect |= x=poke
10+++ inspect |= x=raw-poke
11 ?- x
11 ?- x
12 [%agent a b c] "agent"
12 [%agent a b c] "agent"
13 [%store a b c] "store"
13 [%store a b c] "store"
14−++ change |= x=poke x(payload="new")
14+++ change |= x=raw-poke x(payload="new")
15−++ cast-atom ^- poke 0
15+++ cast-atom ^- raw-poke 0
16++ leaked |= x=copy ^- @t x
16++ leaked |= x=copy ^- @t x
17−++ split |= x=poke
17+++ split |= x=raw-poke
18 ?- x
18 ?- x
19 [a b] a
19 [a b] a
20−++ number [(todo-action.todo "write") 1]
20+++ number ^- [(cmd (unit @t)) @ud] [(poke.todo "write" same) 1]
21−++ bad-constructor (todo-action.todo ~zod)
21+++ bad-constructor (poke.todo ~zod same)
22−++ bad-mark ^- poke [%agent %todo 0x1f "x"]
22+++ bad-mark ^- raw-poke [%agent %todo 0x1f "x"]
23−++ bad-case ^- poke [%alien %todo %todo-action "x"]
23+++ bad-case ^- raw-poke [%alien %todo %todo-action "x"]
tests/type-poke/direct.txt+1−1
@@ -1,2 +1,2 @@
1/= leak /lib/jibb/internal
1/= 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
6partial inference; module not checked
6partial inference; module not checked
7+$ copy: not checked
7+$ copy: not checked
8+$ double: not checked
8+$ double: not checked
9−++ good: poke
9+++ good: (cmd (unit @t))
10−++ pass: $-(poke poke)
10+++ pass: $-(raw-poke raw-poke)
11−++ pass-alias: $-(poke poke)
11+++ pass-alias: $-(raw-poke raw-poke)
12−++ direct: poke
12+++ direct: raw-poke
13−++ alias: poke
13+++ alias: raw-poke
14++ getter: field is not available to partial inference
14++ getter: field is not available to partial inference
15−++ inspect: $-(poke @t)
15+++ inspect: $-(raw-poke @t)
16++ change: change target needs a known record in partial inference
16++ change: change target needs a known record in partial inference
17++ cast-atom: cast constraint is not supported by partial inference
17++ cast-atom: cast constraint is not supported by partial inference
18++ leaked: cast constraint is not supported by partial inference
18++ leaked: cast constraint is not supported by partial inference
19++ split: cell pattern subject is not supported by partial inference
19++ split: cell pattern subject is not supported by partial inference
20−++ number: [poke @ud]
20+++ number: [(cmd (unit @t)) @ud]
21++ bad-constructor: call's sample and argument types do not unify
21++ bad-constructor: call's sample and argument types do not unify
22/ui/test.jibb:21:21: called gate
22/ui/test.jibb:21:21: called gate
23−++ bad-constructor (todo-action.todo ~zod)
23+++ bad-constructor (poke.todo ~zod same)
24 ^
24 ^
25−/ui/test.jibb:21:38: argument has type @p
25+/ui/test.jibb:21:31: argument has type @p
26−++ bad-constructor (todo-action.todo ~zod)
26+++ bad-constructor (poke.todo ~zod same)
27− ^
27+ ^
28++ bad-mark: cast mold and expression type do not unify
28++ bad-mark: cast mold and expression type do not unify
29/ui/test.jibb:22:16: cast mold
29/ui/test.jibb:22:16: cast mold
30−++ bad-mark ^- poke [%agent %todo 0x1f "x"]
30+++ bad-mark ^- raw-poke [%agent %todo 0x1f "x"]
31 ^
31 ^
32−/ui/test.jibb:22:21: expression
32+/ui/test.jibb:22:25: expression
33−++ bad-mark ^- poke [%agent %todo 0x1f "x"]
33+++ bad-mark ^- raw-poke [%agent %todo 0x1f "x"]
34− ^
34+ ^
35++ bad-case: cast mold and expression type do not unify
35++ bad-case: cast mold and expression type do not unify
36/ui/test.jibb:23:16: cast mold
36/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"]
38 ^
38 ^
39−/ui/test.jibb:23:21: expression
39+/ui/test.jibb:23:25: expression
40−++ bad-case ^- poke [%alien %todo %todo-action "x"]
40+++ bad-case ^- raw-poke [%alien %todo %todo-action "x"]
41− ^
41+ ^
42partial inference; module not checked
42partial inference; module not checked
43the prelude internal module is private
43the prelude internal module is private
44partial inference; module not checked
44partial inference; module not checked
45++ nope: sample mold is not supported by partial inference
45++ nope: sample mold is not supported by partial inference
46partial inference; module not checked
46partial inference; module not checked
47−++ pass: $-(poke poke)
47+++ pass: $-(raw-poke raw-poke)
48++ fake-to-real: cast constraint is not supported by partial inference
48++ fake-to-real: cast constraint is not supported by partial inference
49++ real-to-fake: cast constraint is not supported by partial inference
49++ real-to-fake: cast constraint is not supported by partial inference
50++ match-tag: union pattern is not supported by partial inference
50++ match-tag: union pattern is not supported by partial inference
@@ -63,4 +63,4 @@ API module needs unsupported inference: /ui/api/todo/jibb
63partial inference; module not checked
63partial inference; module not checked
64API module needs unsupported inference: /ui/api/todo/jibb
64API module needs unsupported inference: /ui/api/todo/jibb
65partial inference; module not checked
65partial 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 @@
1/= public /ui/public
1/= public /ui/public
2/= fake /ui/internal
2/= fake /ui/internal
3−++ pass |= x=exposed.public ^- poke x
3+++ pass |= x=exposed.public ^- raw-poke x
4−++ fake-to-real |= x=faux.fake ^- poke x
4+++ fake-to-real |= x=faux.fake ^- raw-poke x
5−++ real-to-fake |= x=poke ^- faux.fake x
5+++ real-to-fake |= x=raw-poke ^- faux.fake x
6−++ match-tag |= x=poke
6+++ match-tag |= x=raw-poke
7 ?- x
7 ?- x
8 %agent "a"
8 %agent "a"
9 * "b"
9 * "b"
tests/type-poke/inner.txt+1−1
@@ -1,2 +1,2 @@
1/= hidden /lib/jibb/internal
1/= 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
2++ carry |= x=exposed x
2++ carry |= x=exposed x
tests/type-poke/transitive.txt+1−1
@@ -1,2 +1,2 @@
1/= leaked /ui/inner
1/= 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 @@
17++ update |= [=msg m=model]
17++ update |= [=msg m=model]
18 ?- msg
18 ?- msg
19 [%noted t] [m(note=t) ~]
19 [%noted t] [m(note=t) ~]
20− %add [m(note="") ~[[%poke (cart-action.cart [%add note.m]) |=%acked]]]
20+ %add [m(note="") ~[(poke.cart [%add note.m] |=%acked)]]
21− %toggle [m ~[[%poke (cart-action.cart %toggle) |=%acked]]]
21+ %toggle [m ~[(poke.cart %toggle |=%acked)]]
22 [%got c] [m(cart=c) ~]
22 [%got c] [m(cart=c) ~]
23 [%acked err] [m ~]
23 [%acked err] [m ~]
24
24
tests/type-store/cart.txt+2−3
@@ -1,13 +1,12 @@
1:: /ui/stores/cart.jibb
1:: /ui/stores/cart.jibb
2+$ state [items=(list @t) open=?]
2+$ state [items=(list @t) open=?]
3−+$ cart-action
3++$ poke
4 [%add item=@t]
4 [%add item=@t]
5 %toggle
5 %toggle
6−+$ poke cart-action
7
6
8++ main (store init update)
7++ main (store init update)
9++ init ^- state [~ %.n]
8++ init ^- state [~ %.n]
10−++ update |= [a=cart-action s=state]
9+++ update |= [a=poke s=state]
11 ?- a
10 ?- a
12 [%add item] s(items=[item items.s])
11 [%add item] s(items=[item items.s])
13 %toggle s(open=(not open.s))
12 %toggle s(open=(not open.s))
tests/type-todo-api/expected.txt+1−1
@@ -6,7 +6,7 @@ partial inference; module not checked
6++ by-id-ship: (ask @p)
6++ by-id-ship: (ask @p)
7++ changes-cord: (ask @t)
7++ changes-cord: (ask @t)
8++ changes-ship: (ask @p)
8++ changes-ship: (ask @p)
9−++ action: poke
9+++ action: (cmd (unit @t))
10++ item-id: $-([id=@ud [done=? text=@t]] @ud)
10++ item-id: $-([id=@ud [done=? text=@t]] @ud)
11++ action-id: $-(([%add text=@t] [%toggle id=@ud]) ([%add text=@t] [%toggle id=@ud]))
11++ action-id: $-(([%add text=@t] [%toggle id=@ud]) ([%add text=@t] [%toggle id=@ud]))
12++ todos-id: $-((list [id=@ud [done=? text=@t]]) (list [id=@ud [done=? text=@t]]))
12++ 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
10++ missing-fold: call constraint is not supported by partial inference
10++ missing-fold: call constraint is not supported by partial inference
11++ bad-action: call's sample and argument types do not unify
11++ bad-action: call's sample and argument types do not unify
12/tests/type-todo-api/negative.jibb:5:16: called gate
12/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)
14 ^
14 ^
15−/tests/type-todo-api/negative.jibb:5:32: argument
15+/tests/type-todo-api/negative.jibb:5:25: argument
16−++ bad-action (todo-action.api [%typo text="hello"])
16+++ bad-action (poke.api [%typo text="hello"] same)
17− ^
17+ ^
18+$ msg: cases proven disjoint; mold not checked
18+$ msg: cases proven disjoint; mold not checked
19++ missing: call's sample and argument types do not unify
19++ missing: call's sample and argument types do not unify
20/tests/type-todo-api/negative.jibb:9:26: called gate
20/tests/type-todo-api/negative.jibb:9:26: called gate
tests/type-todo-api/negative.txt+1−1
@@ -2,7 +2,7 @@
2++ no-sur-export |= x=todo.api x
2++ no-sur-export |= x=todo.api x
3++ bad-param (todo-by-id.api ~zod |=(x=todo-item.api "ok"))
3++ bad-param (todo-by-id.api ~zod |=(x=todo-item.api "ok"))
4++ missing-fold (changes.api |=(xs=todos.api "ok"))
4++ 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)
6+$ msg
6+$ msg
7 [%got todos=(list item.api)]
7 [%got todos=(list item.api)]
8 %other
8 %other
tests/type-todo-api/source.txt+1−1
@@ -6,7 +6,7 @@
6++ by-id-ship (todo-by-id.api 2 |=(x=todo-item.api ~zod))
6++ by-id-ship (todo-by-id.api 2 |=(x=todo-item.api ~zod))
7++ changes-cord (changes.api |=(xs=todos.api "ok") fold)
7++ changes-cord (changes.api |=(xs=todos.api "ok") fold)
8++ changes-ship (changes.api |=(xs=todos.api ~zod) fold)
8++ 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)
10++ item-id |= x=item.api id.x
10++ item-id |= x=item.api id.x
11++ action-id |= x=todo-action.api x
11++ action-id |= x=todo-action.api x
12++ todos-id |= x=todos.api x
12++ todos-id |= x=todos.api x
tests/type-todo-full/alias.txt+2−2
@@ -19,8 +19,8 @@
19 ?- (gth (lent (tuba (trip t))) 80)
19 ?- (gth (lent (tuba (trip t))) 80)
20 %.y [m(draft=t error=`"Too long") ~]
20 %.y [m(draft=t error=`"Too long") ~]
21 %.n [m(draft=t error=~) ~]
21 %.n [m(draft=t error=~) ~]
22− %submit [m(draft="") ~[[%poke (todo-action.todo [%add draft.m]) |=%acked]]]
22+ %submit [m(draft="") ~[(poke.todo [%add draft.m] |=%acked)]]
23− [%toggled id] [m ~[[%poke (todo-action.todo [%toggle id]) |=%acked]]]
23+ [%toggled id] [m ~[(poke.todo [%toggle id] |=%acked)]]
24 [%got ts] [m(todos=ts) ~]
24 [%got ts] [m(todos=ts) ~]
25 [%acked err] [m(error=err) ~]
25 [%acked err] [m(error=err) ~]
26
26
tests/type-todo-full/ambiguous-mapper.txt+2−2
@@ -19,8 +19,8 @@
19 ?- (gth (lent (tuba (trip t))) 80)
19 ?- (gth (lent (tuba (trip t))) 80)
20 %.y [m(draft=t error=`"Too long") ~]
20 %.y [m(draft=t error=`"Too long") ~]
21 %.n [m(draft=t error=~) ~]
21 %.n [m(draft=t error=~) ~]
22− %submit [m(draft="") ~[[%poke (todo-action.todo [%add draft.m]) |=%acked]]]
22+ %submit [m(draft="") ~[(poke.todo [%add draft.m] |=%acked)]]
23− [%toggled id] [m ~[[%poke (todo-action.todo [%toggle id]) |=%acked]]]
23+ [%toggled id] [m ~[(poke.todo [%toggle id] |=%acked)]]
24 [%got ts] [m(todos=ts) ~]
24 [%got ts] [m(todos=ts) ~]
25 [%acked err] [m(error=err) ~]
25 [%acked err] [m(error=err) ~]
26
26
tests/type-todo-full/non-gate-view.txt+2−2
@@ -19,8 +19,8 @@
19 ?- (gth (lent (tuba (trip t))) 80)
19 ?- (gth (lent (tuba (trip t))) 80)
20 %.y [m(draft=t error=`"Too long") ~]
20 %.y [m(draft=t error=`"Too long") ~]
21 %.n [m(draft=t error=~) ~]
21 %.n [m(draft=t error=~) ~]
22− %submit [m(draft="") ~[[%poke (todo-action.todo [%add draft.m]) |=%acked]]]
22+ %submit [m(draft="") ~[(poke.todo [%add draft.m] |=%acked)]]
23− [%toggled id] [m ~[[%poke (todo-action.todo [%toggle id]) |=%acked]]]
23+ [%toggled id] [m ~[(poke.todo [%toggle id] |=%acked)]]
24 [%got ts] [m(todos=ts) ~]
24 [%got ts] [m(todos=ts) ~]
25 [%acked err] [m(error=err) ~]
25 [%acked err] [m(error=err) ~]
26
26
tests/type-todo-full/open-key.txt+2−2
@@ -19,8 +19,8 @@
19 ?- (gth (lent (tuba (trip t))) 80)
19 ?- (gth (lent (tuba (trip t))) 80)
20 %.y [m(draft=t error=`"Too long") ~]
20 %.y [m(draft=t error=`"Too long") ~]
21 %.n [m(draft=t error=~) ~]
21 %.n [m(draft=t error=~) ~]
22− %submit [m(draft="") ~[[%poke (todo-action.todo [%add draft.m]) |=%acked]]]
22+ %submit [m(draft="") ~[(poke.todo [%add draft.m] |=%acked)]]
23− [%toggled id] [m ~[[%poke (todo-action.todo [%toggle id]) |=%acked]]]
23+ [%toggled id] [m ~[(poke.todo [%toggle id] |=%acked)]]
24 [%got ts] [m(todos=ts) ~]
24 [%got ts] [m(todos=ts) ~]
25 [%acked err] [m(error=err) ~]
25 [%acked err] [m(error=err) ~]
26
26
tests/type-todo-full/wrong-message.txt+2−2
@@ -19,8 +19,8 @@
19 ?- (gth (lent (tuba (trip t))) 80)
19 ?- (gth (lent (tuba (trip t))) 80)
20 %.y [m(draft=t error=`"Too long") ~]
20 %.y [m(draft=t error=`"Too long") ~]
21 %.n [m(draft=t error=~) ~]
21 %.n [m(draft=t error=~) ~]
22− %submit [m(draft="") ~[[%poke (todo-action.todo [%add draft.m]) |=%acked]]]
22+ %submit [m(draft="") ~[(poke.todo [%add draft.m] |=%acked)]]
23− [%toggled id] [m ~[[%poke (todo-action.todo [%toggle id]) |=%acked]]]
23+ [%toggled id] [m ~[(poke.todo [%toggle id] |=%acked)]]
24 [%got ts] [m(todos=ts) ~]
24 [%got ts] [m(todos=ts) ~]
25 [%acked err] [m(error=err) ~]
25 [%acked err] [m(error=err) ~]
26
26
tests/type-todo-full/wrong-model.txt+2−2
@@ -19,8 +19,8 @@
19 ?- (gth (lent (tuba (trip t))) 80)
19 ?- (gth (lent (tuba (trip t))) 80)
20 %.y [m(draft=t error=`"Too long") ~]
20 %.y [m(draft=t error=`"Too long") ~]
21 %.n [m(draft=t error=~) ~]
21 %.n [m(draft=t error=~) ~]
22− %submit [m(draft="") ~[[%poke (todo-action.todo [%add draft.m]) |=%acked]]]
22+ %submit [m(draft="") ~[(poke.todo [%add draft.m] |=%acked)]]
23− [%toggled id] [m ~[[%poke (todo-action.todo [%toggle id]) |=%acked]]]
23+ [%toggled id] [m ~[(poke.todo [%toggle id] |=%acked)]]
24 [%got ts] [m(todos=ts) ~]
24 [%got ts] [m(todos=ts) ~]
25 [%acked err] [m(error=err) ~]
25 [%acked err] [m(error=err) ~]
26
26
tests/type-todo-full/wrong-result.txt+2−2
@@ -19,8 +19,8 @@
19 ?- (gth (lent (tuba (trip t))) 80)
19 ?- (gth (lent (tuba (trip t))) 80)
20 %.y [m(draft=t error=`"Too long") ~]
20 %.y [m(draft=t error=`"Too long") ~]
21 %.n [m(draft=t error=~) ~]
21 %.n [m(draft=t error=~) ~]
22− %submit [m(draft="") ~[[%poke (todo-action.todo [%add draft.m]) |=%acked]]]
22+ %submit [m(draft="") ~[(poke.todo [%add draft.m] |=%acked)]]
23− [%toggled id] [m ~[[%poke (todo-action.todo [%toggle id]) |=%acked]]]
23+ [%toggled id] [m ~[(poke.todo [%toggle id] |=%acked)]]
24 [%got ts] [m(todos=ts) ~]
24 [%got ts] [m(todos=ts) ~]
25 [%acked err] [m(error=err) ~]
25 [%acked err] [m(error=err) ~]
26
26
tests/type-todo-full/wrong-watch.txt+2−2
@@ -19,8 +19,8 @@
19 ?- (gth (lent (tuba (trip t))) 80)
19 ?- (gth (lent (tuba (trip t))) 80)
20 %.y [m(draft=t error=`"Too long") ~]
20 %.y [m(draft=t error=`"Too long") ~]
21 %.n [m(draft=t error=~) ~]
21 %.n [m(draft=t error=~) ~]
22− %submit [m(draft="") ~[[%poke (todo-action.todo [%add draft.m]) |=%acked]]]
22+ %submit [m(draft="") ~[(poke.todo [%add draft.m] |=%acked)]]
23− [%toggled id] [m ~[[%poke (todo-action.todo [%toggle id]) |=%acked]]]
23+ [%toggled id] [m ~[(poke.todo [%toggle id] |=%acked)]]
24 [%got ts] [m(todos=ts) ~]
24 [%got ts] [m(todos=ts) ~]
25 [%acked err] [m(error=err) ~]
25 [%acked err] [m(error=err) ~]
26
26