on master help sign in
Add a milestone 2 review and a brief to finish it
322c3d4Claude
docs/README.md+2
@@ -17,6 +17,8 @@ The current full-module checker also has a narrow static/data-page slice, docume
17| [reviews/2026-11-02-repo-review.md](reviews/2026-11-02-repo-review.md) | A review of the whole repository on 2026-11-02: bugs, gaps and simplifications, each checked by a second reviewer |
17| [reviews/2026-11-02-repo-review.md](reviews/2026-11-02-repo-review.md) | A review of the whole repository on 2026-11-02: bugs, gaps and simplifications, each checked by a second reviewer |
18| [reviews/2026-11-02-questions.md](reviews/2026-11-02-questions.md) | The 45 decisions that review raises, with options and recommendations |
18| [reviews/2026-11-02-questions.md](reviews/2026-11-02-questions.md) | The 45 decisions that review raises, with options and recommendations |
19| [reviews/2026-11-02-syntax-review.md](reviews/2026-11-02-syntax-review.md) | A review of Jibb's syntax on 2026-11-02: 15 verified proposals with before and after examples, what to keep, and questions for @iko |
19| [reviews/2026-11-02-syntax-review.md](reviews/2026-11-02-syntax-review.md) | A review of Jibb's syntax on 2026-11-02: 15 verified proposals with before and after examples, what to keep, and questions for @iko |
20+| [reviews/2026-11-03-milestone-2-review.md](reviews/2026-11-03-milestone-2-review.md) | A review of milestone 2 against the plan on 2026-11-03: the done-criteria, the errors the spec describes, findings M1 to M17, with its [probes](reviews/2026-11-03-milestone-2-probes/) |
21+| [prompts/milestone-2-finish.md](prompts/milestone-2-finish.md) | A brief for finishing milestone 2: the general checker core, diagnostics, patterns, kinds, imports, tests and docs that the milestone 2 review found missing |
20
22
21## The spec
23## The spec
22
24
docs/prompts/milestone-2-finish.mdnew file+96
@@ -0,0 +1,96 @@
1+# Finishing milestone 2
2+
3+A brief for the developer who finishes milestone 2 of Jibb, types and prelude. Paste it as the first message of a session, or hand it to a person; it assumes the repo `iko-soy/jibb`. Written 2026-11-03, at commit `f84a29e`, from the [milestone 2 review](../reviews/2026-11-03-milestone-2-review.md) of the same day. That review was still running in seven of its nine areas when this was written; where a section below depends on them it says so, and both files will be updated when they finish.
4+
5+---
6+
7+You are finishing milestone 2 of Jibb, a UI language for Urbit: a Hoon dialect with an indentation layout, whose compiler is a Hoon library, `jibb-dev/lib/jibb.hoon`. Milestone 1 built the layout pass and the parser. Milestone 2 has built a large partial type checker, a Hoon type importer and most of the prelude; every check passes, under `urbit eval` and on a fake ship, and the doc's 14 `jibb` blocks check as written. What is missing is a checker that is general rather than fitted to those examples, and that tells the user what is wrong.
8+
9+## Read first
10+
11+1. [docs/reviews/2026-11-03-milestone-2-review.md](../reviews/2026-11-03-milestone-2-review.md): the verdict, findings M1 to M17, and the table of the 33 errors the spec describes. This brief is its to-do list.
12+2. [docs/prompts/milestone-2.md](milestone-2.md): the original brief. Its "What the doc asks of the checker", "Suggested design" and "Tests" sections still hold, and this brief doesn't repeat them.
13+3. [docs/spec/implementation-plan.md](../spec/implementation-plan.md), milestone 2, and the spec tabs it points at, closely Grammar's Tag resolution, Literals by context, Patterns, Modules and Imports.
14+4. [docs/reviews/2026-11-02-questions.md](../reviews/2026-11-02-questions.md): the owner's answers, marked *(chosen)*. Q5 and Q6 set the direction below. Q16 to Q28 are proposals waiting for @iko, not spec.
15+5. [docs/development.md](../development.md): setting up (`nix develop`), the tools, the test suites, and the checks before pushing (`tools/check` or `nix flake check`).
16+6. `git log origin/master`: @iko works in `jibb.hoon` in parallel, and another thread is implementing syntax-review proposals S1, S2, S4 to S7, S11 to S13 and S15 ([syntax review](../reviews/2026-11-02-syntax-review.md)). Rebase often and keep your changes out of theirs where you can.
17+
18+## Ground rules
19+
20+The original brief's rules hold: the spec wins, language questions go to @iko and are recorded in Decisions first, no built-ins, everything is a golden test that passes under eval and on the fake ship, push straight to `master` in commits that each leave every check passing, and keep `docs/` current. Two more:
21+
22+- **Fail closed, but say why.** A program the checker can't yet handle must be rejected, never accepted, and its message must name the construct and its site. "module definitions need unsupported inference: <path>: ++ x" is not an acceptable message for an error the spec describes.
23+- **Delete what the core replaces.** When the general core covers a recovery path or a "source-proven" slice, delete the slice and keep its tests. The milestone is done when the slices are gone, not when they are joined by a core.
24+
25+## What is left
26+
27+In order. Steps 1 and 2 can start at once; the rest build on step 2.
28+
29+### 1. Keep the diagnostics the checker already finds (M1, M12, M17)
30+
31+The full checker, `infer-jibb-file-detailed`, drops every per-definition reason in `add-supported-result` (`jibb.hoon` 10670-10689), so almost every error reaches the user as the generic message. The partial report already computes most of them. Thread a diagnostic, an `idiag` with its sites, through `add-supported-defs-core` for each unresolved definition, mold and kind check, and render the first in dependency order where the generic text is built today (14820-14857). Keep the generic text only for real checker limits, and make those name the construct. Make `module-scope-valid` return the shadowed name and both sites, with its own wording for `proj`. This plumbing carries over to the core of step 2.
32+
33+### 2. The general checker core (Q5)
34+
35+The owner chose this on 2026-11-02: union-find bindings with levels, a queue of deferred constraints, and a usefulness check for matches, built before more recovery paths. It is a long piece of work, so first write its design as a new section of the library's design notes, and share it in the project chat for @iko before replacing code.
36+
37+- **Unification**: union-find over type variables, with levels for generalization instead of environment scans; an occurs check; aura variables and the "is an atom" and "contains no gates" constraints carried on the variable, as `0858191` already does for gate-freedom.
38+- **Deferred constraints**: tags, `~`, numbers and cells, wing access, changes and `?-` on a type not yet known each wait in one queue, retried as variables are bound, as the Grammar's Tag resolution says. A tag-constrained variable does not generalize and stays open until something in the module fixes it. At the end of the module, each still-open constraint is an error at its source: "nothing fixes the union of %add; add a `^-`".
39+- **Order**: infer `++`s by the strongly connected components `839f6b0` already computes, a group of mutually recursive gates together; reject a non-gate value that depends on itself, naming the cycle.
40+- **Kinds by type**: check `main` as an ordinary expression. `(program init update view subs)`, `(page load view)` and `(store init update)` are calls whose unification fixes their components' types, messages included, so a tag in `view` is resolved by `main`. Then read the kind from `main`'s type, as the Grammar says, and run each kind's own checks after inference: gate-free island data and models, naming the field; for islands, a walk of the `(list (sub M))` that asks for a watchability proof only for `%watch`; for pages, a load that is any gate to `(ask D)`, `pure` and typed paths included.
41+- **Then delete** the program, page and store recovery chain, the deferred transactions, the prepared-tuple route and the other example-shaped slices as the core covers their tests (the earlier review counts about 1,180 lines of program recovery alone).
42+
43+When this is done, M2 to M5 are gone: every valid variant in the review's [probe corpus](../reviews/2026-11-03-milestone-2-probes/) checks, and each error in an island is reported where it is, as `button "Add" %submitt` giving "msg has no case `%submitt`" at the tag, with the union's site.
44+
45+### 3. Patterns by a usefulness check (M10)
46+
47+Replace the per-case coverage loops with Maranget's usefulness check over nouns: constants and cells, a loobean as its two constants, lists and units as their unions, nested patterns, literal patterns, `*` and bare names. It gives the missing-case error with a witness, at the `?-` and its subject, and the dead-arm error naming the arm that covers it, for the Grammar's `[%move * *]` example too. Keep the matrix reusable: milestone 3 lowers `?-` with it.
48+
49+### 4. One types pipeline (Q6, M14, M15)
50+
51+Render `types.txt` from the full checker: each definition's type, the module's kind, or the error with its excerpts. Retire the partial report, or make it a view of the full result. Give every `doc-*` case a `types.txt`, with the buttons error for `doc-grammar-02-buttons`.
52+
53+### 5. Every error the spec describes (done-criterion 2)
54+
55+Work down the review's [error table](../reviews/2026-11-03-milestone-2-review.md#appendix-the-errors-the-spec-describes) until every row says Met: a golden case with the spec's message, from the full checker, naming both conflicting sites with excerpts. The rows with no message anywhere today: a capital made `@ud` or a list, `~[text "hi"]` with its suggestion, `(facts …)` outside an API's `paths`, a gate in island data or a model with the field named, `[]`, a generic aura in `{…}` or a path's `(…)`, an imported vase or repeated record face, and a repeated attribute in a literal list, which today is accepted (M9).
56+
57+### 6. Kinds, APIs and the prelude in general (M4, M7, M9)
58+
59+- Pages: the overview's route-parameter page, `(post.api slug same)`, and its catch-all page, `(pure p)`, check.
60+- Islands: `|=(m ~)` for no subscriptions, several watches, `%every`, and a watch with a fold, `(changes.todo |=%got apply)`, check.
61+- Stores: a `poke` with several cases checks.
62+- APIs: an API other than the todo one checks as a module, with typed segments, several parameters, `scry=` paths and folds; `(facts …)` outside `paths` is an error.
63+- `element` can't be built by hand: `^- (element !!) [%island 5]` is rejected, so island data is always checked against `init`.
64+- The prelude: every name in the overview's Prelude and Layout tables is usable with its signature, or listed as deliberately left out. `max` is missing today, so the Grammar's `clamp` example fails. The inventory and its gaps are still being reviewed.
65+- The inline Grammar examples in M7 check: `|=(p title.p)`, `"{(add 1 2)}"`, path and unit literals, and every row of the Patterns table.
66+
67+### 7. The Hoon import table (done-criterion 3)
68+
69+A test `/sur` file with `$%`, `$@`, a map and a recursive mold, imported, printed in Jibb's notation and used from a Jibb module through the full checker, under eval and on the ship. Each row of the overview's import table works or gives the table's error where used. Known gaps from the earlier review: only `%tas` head tags (`%&`, `%|`, `%0` and `(each a b)` fail, A50) and no bare `@` or `@uw` (A14). The review's import area is still running and will add to this list.
70+
71+### 8. Tests (M6, M8, M16)
72+
73+- A ship check of the `my-app` desk as the original brief asks: build each `/sur` and mark through Clay, run the full checker over every `/ui/**.jibb` in dependency order, expect exactly one failure, `buttons.jibb` at 3:16, and record the time in `status.md`.
74+- Turn the spec-valid negatives (two `each` sites, a mapper alias, a page alias, an indirect or `pure` load, a store alias, a hand-built main) into positive cases. Fix `tests/type-page-main/hand-built-load.txt`, which doesn't parse. Make every negative assert its message and place, not only "rejected".
75+- Turn the review's [probe corpus](../reviews/2026-11-03-milestone-2-probes/) into a regression suite: its about 90 valid one-edit variants of the doc modules check, and its wrong variants and error probes fail with their own error at their own site.
76+- Guard the copies: the Core language block as a slice of `todo-list.jibb`, and `tests/type-buttons/valid.txt` as the buttons block without `add-button`.
77+
78+### 9. Speed
79+
80+The original brief asks that "a 2,000-line module should check in seconds, not minutes". Measure the full check of generated modules, written bottom-up and top-down, and of the `my-app` desk, with `tools/hoon --no-debug`, and record the numbers in `status.md`. The review's speed area is still running and will add its measurements here.
81+
82+### 10. Docs
83+
84+`status.md` becomes the capability table that Q41 asked for, then shows milestone 2 done with counts and timings. `compiler.md` and the library's header stop saying milestone 1, and describe the core. `open-questions.md` lists what is still open, and `decisions.md` records any new decision.
85+
86+## Out of scope
87+
88+As in the original brief: lowering and the backends (milestone 3), routes, static files, the theme's contrast check and the host (milestone 4), `load`'s per-request behaviour (milestone 5), the JavaScript runtime (milestone 6) and the formatter (milestone 7). Also the syntax-review changes another thread is making.
89+
90+## When you're done
91+
92+- The plan's three "Done when" items hold, but for the route check: the doc's examples and the review's valid variants check; every row of the error table is Met; the `/sur` import test passes.
93+- Every check passes, under eval and on the ship (`nix flake check`), and the `my-app` desk checks on the ship with its types read through Clay.
94+- The recovery paths and slices the core replaced are deleted.
95+- `docs/status.md` shows milestone 2 done, with counts and timings, and the other docs describe the checker as it is.
96+- Everything is pushed to `master`, and a few lines go to @iko in the project chat: what changed, the counts and timings, the decisions needed, and what is still open.
docs/reviews/2026-11-03-milestone-2-probes/README.mdnew file+23
@@ -0,0 +1,23 @@
1+# Probes for the milestone 2 review
2+
3+The Jibb sources the [milestone 2 review](../2026-11-03-milestone-2-review.md) ran through the full module checker, `infer-jibb-file-detailed`, at `f84a29e`, with what the checker printed then. They are evidence for the review and a ready regression corpus for [finishing milestone 2](../../prompts/milestone-2-finish.md). No check runs them: they are not tests, and several outputs record what is wrong today.
4+
5+Each `.jibb` file holds sections, each starting with a line `#### <label>`; each section is checked as a module on its own. A `.out` file is the output of its `.jibb`: per section, `CHECKED` and the exported molds and values with their types, or `REJECTED:` and the message.
6+
7+| Files | What they hold | Run with |
8+| --- | --- | --- |
9+| `variants/p1.jibb` to `p10.jibb` | The `my-app` modules and the doc blocks as written (`p1`), then about 90 spec-valid one-edit variants of them (`p2` to `p8`: reordered, renamed, extra helpers, a second watch, `\|=(m ~)` subscriptions, aliases, typed and `pure` loads) and wrong variants that must fail with their own error (`p9`, `p10`, labels starting `BAD-`). A label is the module's path, then a name | `run app` |
10+| `errors/p1.jibb` to `p5.jibb` | One or more probes for each error the spec describes, labelled as in the review's error table (`E01` an aura mismatch, `S2` the Grammar's `[%move * *]`, `C1` `%submitt` in an island, `W1` to `W4` island initializers) | `run plain` |
11+| `errors/import-check.hoon` | Invalid Hoon imports (`I1` to `I9`), module-graph errors (`M1` to `M5`) and the raw reader results | `run imports` |
12+
13+`variants/p1.jibb` has no saved output; every section in it checks, except `buttons`, which fails with "nothing fixes the union of %add".
14+
15+From the repo root, with `urbit` on `PATH` (`nix develop`):
16+
17+```
18+docs/reviews/2026-11-03-milestone-2-probes/run app docs/reviews/2026-11-03-milestone-2-probes/variants/p9.jibb
19+docs/reviews/2026-11-03-milestone-2-probes/run plain docs/reviews/2026-11-03-milestone-2-probes/errors/p1.jibb
20+docs/reviews/2026-11-03-milestone-2-probes/run imports
21+```
22+
23+`run plain` checks each section as `/ui/probe/jibb` against the real prelude (`check.hoon`). `run app` checks each section at the path its label names, with `my-app`'s todo and blog `/sur` files and marks compiled by `ride` (marks without their `/-` lines, as the `tests/lib` suites do) and a bundle of `api/todo`, `todo-list`, `api/blog`, `card` and `cart`, the section's own path left out (`app-check.hoon`). A label of the form `<path> module <name>` adds that section to the bundle instead. Each run takes 30 to 80 s, most of it building the libraries.
docs/reviews/2026-11-03-milestone-2-probes/app-check.hoonnew file+67
@@ -0,0 +1,67 @@
1+=/ prepared=iprelude (need (prepare-prelude-with-internal prelude internal))
2+=/ todo=type -:(ride -:!>(..zuse) sur)
3+=/ subject=type [%cell [%face %todo todo] -:!>(..zuse)]
4+=/ ma=* (read-mark:imp %todo-action -:(ride subject action))
5+=/ mt=* (read-mark:imp %todos -:(ride subject todos))
6+=/ mu=* (read-mark:imp %todo-update -:(ride subject update))
7+=/ mi=* (read-mark:imp %todo-item -:(ride subject item))
8+=/ blog=type -:(ride -:!>(..zuse) blogsur)
9+=/ blog-subject=type [%cell [%face %blog blog] -:!>(..zuse)]
10+=/ mp=* (read-mark:imp %posts -:(ride blog-subject posts))
11+=/ item-input=* (read-named:imp %todo %item todo)
12+=/ post-input=* (read-named:imp %blog %post blog)
13+=/ marks=imark-externals ~[[%todo-action ma] [%todos mt] [%todo-update mu] [%todo-item mi] [%posts mp]]
14+=/ externals=iexternals ~[[%todo %item item-input] [%blog %post post-input]]
15+=/ all-modules=jbundle
16+ :~ [/ui/api/todo/jibb todoapi]
17+ [/ui/todo-list/jibb todolist]
18+ [/ui/api/blog/jibb blogapi]
19+ [/ui/components/card/jibb card]
20+ [/ui/stores/cart/jibb cart]
21+ ==
22+=/ lines=wain (to-wain:format src)
23+=| out=(list [label=@t body=wain])
24+=| cur=(unit [label=@t body=wain])
25+=/ sections=(list [label=@t body=wain])
26+ |-
27+ ?~ lines
28+ (flop ?~(cur out [[label.u.cur (flop body.u.cur)] out]))
29+ ?: =('#### ' (end [3 5] i.lines))
30+ =? out ?=(^ cur) [[label.u.cur (flop body.u.cur)] out]
31+ $(lines t.lines, cur `[(rsh [3 5] i.lines) ~])
32+ ?~ cur $(lines t.lines)
33+ $(lines t.lines, body.u.cur [i.lines body.u.cur])
34+=/ extra=jbundle
35+ %+ murn sections
36+ |= [label=@t body=wain]
37+ ^- (unit jsource)
38+ =/ words=(list tape) (rash label (more ace (star ;~(less ace next))))
39+ ?. (gte (lent words) 3) ~
40+ ?. =('module' (crip (snag 1 words))) ~
41+ `[(stab (crip (snag 0 words))) (of-wain:format body)]
42+=/ base=jbundle
43+ %+ weld extra
44+ (skip all-modules |=(j=jsource (lien extra |=(e=jsource =(at.e at.j)))))
45+^- tape
46+%- zing
47+%+ turn sections
48+|= [label=@t body=wain]
49+^- tape
50+=/ words=(list tape) (rash label (more ace (star ;~(less ace next))))
51+=/ at=path (stab (crip (snag 0 words)))
52+=/ text=@t (of-wain:format body)
53+=/ modules=jbundle (skip base |=(j=jsource =(at.j at)))
54+=/ r=jfile-detailed-result
55+ (infer-jibb-file-detailed at text externals marks modules ~[at] values.prepared molds.prepared ~ `iface.prepared)
56+=/ head=tape "#### {(trip label)}\0a"
57+?: ?=(%| -.r) `tape`(zing `(list tape)`~[head "REJECTED: " (trip message.p.r) "\0a"])
58+=/ ms=(list tape)
59+ %+ turn molds.iface.p.r
60+ |= [name=term s=ischeme]
61+ "+$ {(trip name)}: {(show-itype (canonical-itype typ.s vars.s) ~)}\0a"
62+=/ vals=(list tape)
63+ %+ turn values.iface.p.r
64+ |= [name=term s=ischeme]
65+ =/ c=itype (canonical-itype typ.s vars.s)
66+ "++ {(trip name)}: {(show-itype c ~)}{(show-atom-constraint c)}\0a"
67+`tape`(zing `(list tape)`~[head "CHECKED\0a" `tape`(zing ms) `tape`(zing vals)])
docs/reviews/2026-11-03-milestone-2-probes/check.hoonnew file+37
@@ -0,0 +1,37 @@
1+:: Full-module check of several sources in one eval. Bind `src` to a
2+:: file whose sections each start with a line "#### <label>"; each
3+:: section is checked on its own as /ui/probe/jibb against the real
4+:: prelude. Bind: prelude, internal, src.
5+=/ prepared=iprelude (need (prepare-prelude-with-internal prelude internal))
6+=/ at=path /ui/probe/jibb
7+=/ lines=wain (to-wain:format src)
8+=| out=(list [label=@t body=wain])
9+=| cur=(unit [label=@t body=wain])
10+=/ sections=(list [label=@t body=wain])
11+ |-
12+ ?~ lines
13+ (flop ?~(cur out [[label.u.cur (flop body.u.cur)] out]))
14+ ?: =('#### ' (end [3 5] i.lines))
15+ =? out ?=(^ cur) [[label.u.cur (flop body.u.cur)] out]
16+ $(lines t.lines, cur `[(rsh [3 5] i.lines) ~])
17+ ?~ cur $(lines t.lines)
18+ $(lines t.lines, body.u.cur [i.lines body.u.cur])
19+^- tape
20+%- zing
21+%+ turn sections
22+|= [label=@t body=wain]
23+^- tape
24+=/ text=@t (of-wain:format body)
25+=/ r=jfile-detailed-result
26+ (infer-jibb-file-detailed at text ~ ~ ~ ~[at] values.prepared molds.prepared ~ `iface.prepared)
27+=/ head=tape "#### {(trip label)}\0a"
28+?: ?=(%| -.r) `tape`(zing `(list tape)`~[head "REJECTED: " (trip message.p.r) "\0a"])
29+=/ ms=(list tape)
30+ %+ turn molds.iface.p.r
31+ |= [name=term s=ischeme]
32+ "+$ {(trip name)}: {(show-itype (canonical-itype typ.s vars.s) ~)}\0a"
33+=/ vals=(list tape)
34+ %+ turn values.iface.p.r
35+ |= [name=term s=ischeme]
36+ "++ {(trip name)}: {(show-itype (canonical-itype typ.s vars.s) ~)}\0a"
37+`tape`(zing `(list tape)`~[head "CHECKED\0a" `tape`(zing ms) `tape`(zing vals)])
docs/reviews/2026-11-03-milestone-2-probes/errors/import-check.hoonnew file+101
@@ -0,0 +1,101 @@
1+=> [lib=jibb-lib reader=reader prelude=prelude internal=internal ..zuse]
2+=/ prepared=iprelude:lib (need (prepare-prelude-with-internal:lib prelude internal))
3+=/ sur=@t
4+ '''
5+ |%
6+ +$ signed @sd
7+ +$ flt @rd
8+ +$ gat $-(@t @t)
9+ +$ vas vase
10+ +$ dup [a=@ud a=@t]
11+ +$ ovl $%([%a @t] [%a @ud])
12+ +$ ovl2 $?(@t @ud)
13+ +$ cel $^([@t @t] [@ud @ud])
14+ +$ good @t
15+ +$ cor _^|(|=(a=@ a))
16+ --
17+ '''
18+=/ cor=type -:(ride -:!>(..zuse) sur)
19+=/ conv
20+ |= d=import-diagnostic:reader
21+ ^- *
22+ ?- -.d
23+ %ok [%& value.d]
24+ %invalid d
25+ %unsupported [%| message.d]
26+ ==
27+=/ names=(list term) ~[%signed %flt %gat %vas %dup %ovl %ovl2 %cel %good %cor]
28+=/ ext=(list [module=term name=term result=*])
29+ %+ turn names
30+ |= n=term
31+ =/ r (mule |.((read-named-diagnostic:reader %fix n cor)))
32+ ?: ?=(%| -.r) [%fix n [%| 'reader crashed']]
33+ [%fix n (conv p.r)]
34+=/ raw=(list [term *])
35+ %+ turn names
36+ |= n=term
37+ =/ r (mule |.((read-named-diagnostic:reader %fix n cor)))
38+ ?: ?=(%| -.r) [n %crash]
39+ [n p.r]
40+=/ mark-src=@t
41+ '''
42+ |_ a=@t
43+ ++ grab |% ++ noun @t --
44+ ++ grow |% ++ noun a --
45+ ++ grad %noun
46+ --
47+ '''
48+=/ mcor=type -:(ride -:!>(..zuse) mark-src)
49+=/ full-mark=* (read-mark:reader %full mcor)
50+=/ marks=(list [mark=term result=*]) ~[[%full full-mark]]
51+=/ probes=(list [label=@t at=path src=@t mods=jbundle:lib])
52+ :~ ['I1-signed' /ui/probe/jibb '/- fix\0a++ a |= x=signed.fix x\0a' ~]
53+ ['I2-float' /ui/probe/jibb '/- fix\0a++ a |= x=flt.fix x\0a' ~]
54+ ['I3-gate' /ui/probe/jibb '/- fix\0a++ a |= x=gat.fix x\0a' ~]
55+ ['I3b-core' /ui/probe/jibb '/- fix\0a++ a |= x=cor.fix x\0a' ~]
56+ ['I4-vase' /ui/probe/jibb '/- fix\0a++ a |= x=vas.fix x\0a' ~]
57+ ['I5-dupfields' /ui/probe/jibb '/- fix\0a++ a |= x=dup.fix x\0a' ~]
58+ ['I6-overlap-cen' /ui/probe/jibb '/- fix\0a++ a |= x=ovl.fix x\0a' ~]
59+ ['I7-overlap-wut' /ui/probe/jibb '/- fix\0a++ a |= x=ovl2.fix x\0a' ~]
60+ ['I8-overlap-ket' /ui/probe/jibb '/- fix\0a++ a |= x=cel.fix x\0a' ~]
61+ ['I9-good-unused-bad' /ui/probe/jibb '/- fix\0a++ a |= x=good.fix x\0a' ~]
62+ ['M1-cycle' /ui/probe/jibb '/= a /ui/a\0a++ v (identity.a "hi")\0a' ~[[/ui/a/jibb '/= b /ui/b\0a++ identity |=(x (identity.b x))\0a'] [/ui/b/jibb '/= a /ui/a\0a++ identity |=(x (identity.a x))\0a']]]
63+ ['M1b-root-cycle' /ui/probe/jibb '/= a /ui/a\0a++ v 1\0a' ~[[/ui/a/jibb '/= p /ui/probe\0a++ w 2\0a']]]
64+ ['M2-derived-clash' /ui/probe/jibb '/= api /ui/api/demo\0a++ x 1\0a' ~[[/ui/api/demo/jibb '/% %full\0a+$ paths\0a [%plain /plain full]\0a [%other /other full]\0a++ plain 5\0a']]]
65+ ['M2b-derived-clash-root' /ui/api/demo/jibb '/% %full\0a+$ paths\0a [%plain /plain full]\0a [%other /other full]\0a++ plain 5\0a' ~]
66+ ['M2c-derived-face-clash' /ui/api/demo/jibb '/% %full\0a/- plain\0a+$ paths\0a [%plain /plain full]\0a' ~]
67+ ['M2d-poke-clash' /ui/api/demo/jibb '/% %full\0a+$ poke full\0a++ poke "bad"\0a' ~]
68+ ['M3-facts-in-library' /ui/probe/jibb '/% %full\0a+$ x (facts full full)\0a' ~]
69+ ['M3b-facts-in-api-other-mold' /ui/api/demo/jibb '/% %full\0a+$ paths\0a [%plain /plain full]\0a+$ x (facts full full)\0a' ~]
70+ ['M4-shadow-import-face' /ui/probe/jibb '/= lib /ui/lib\0a++ f |= lib=@t lib\0a' ~[[/ui/lib/jibb '++ identity |=(x x)\0a']]]
71+ ['M4b-shadow-import-value' /ui/probe/jibb '/= lib /ui/lib\0a++ lib 1\0a' ~[[/ui/lib/jibb '++ identity |=(x x)\0a']]]
72+ ['M5-api-ok' /ui/api/demo/jibb '/% %full\0a+$ paths\0a [%plain /plain full]\0a' ~]
73+ ==
74+=/ out=(list tape)
75+ %+ turn probes
76+ |= [label=@t at=path src=@t mods=jbundle:lib]
77+ ^- tape
78+ =/ r (mule |.((infer-jibb-file-detailed:lib at src ext marks mods ~[at] values.prepared molds.prepared ~ `iface.prepared)))
79+ =/ head=tape "#### {(trip label)}\0a"
80+ ?: ?=(%| -.r) `tape`(weld head "CRASH\0a")
81+ =/ res p.r
82+ ?: ?=(%| -.res) `tape`(zing `(list tape)`~[head "REJECTED: " (trip message.p.res) "\0a"])
83+ =/ vals=(list tape)
84+ %+ turn values.iface.p.res
85+ |= [name=term s=ischeme:lib]
86+ ^- tape
87+ "++ {(trip name)}: {(show-itype:lib (canonical-itype:lib typ.s vars.s) ~)}\0a"
88+ `tape`(zing `(list tape)`~[head "CHECKED\0a" `tape`(zing vals)])
89+=/ rawt=tape
90+ %- zing
91+ %+ turn raw
92+ |= [n=term v=*]
93+ ^- tape
94+ =/ desc=tape
95+ ?@ v "atom"
96+ ?: ?=([%invalid @ @] v) "invalid {(trip ;;(@t +<.v))}: {(trip ;;(@t +>.v))}"
97+ ?: ?=([%unsupported @] v) "unsupported: {(trip ;;(@t +.v))}"
98+ ?: ?=([%ok *] v) "ok"
99+ "other"
100+ "{(trip n)}: {desc}\0a"
101+^- tape (zing `(list tape)`~[`tape`(zing out) "#### RAW\0a" rawt])
docs/reviews/2026-11-03-milestone-2-probes/errors/import-check.outnew file+82
@@ -0,0 +1,82 @@
1+#### I1-signed
2+REJECTED: module definitions need unsupported inference: /ui/probe/jibb: ++ a
3+#### I2-float
4+REJECTED: module definitions need unsupported inference: /ui/probe/jibb: ++ a
5+#### I3-gate
6+REJECTED: module definitions need unsupported inference: /ui/probe/jibb: ++ a
7+#### I3b-core
8+REJECTED: module definitions need unsupported inference: /ui/probe/jibb: ++ a
9+#### I4-vase
10+REJECTED: module definitions need unsupported inference: /ui/probe/jibb: ++ a
11+#### I5-dupfields
12+REJECTED: module definitions need unsupported inference: /ui/probe/jibb: ++ a
13+#### I6-overlap-cen
14+REJECTED: module definitions need unsupported inference: /ui/probe/jibb: ++ a
15+#### I7-overlap-wut
16+REJECTED: module definitions need unsupported inference: /ui/probe/jibb: ++ a
17+#### I8-overlap-ket
18+REJECTED: module definitions need unsupported inference: /ui/probe/jibb: ++ a
19+#### I9-good-unused-bad
20+CHECKED
21+++ a: $-(@t @t)
22+#### M1-cycle
23+REJECTED: import cycle at /ui/a/jibb
24+#### M1b-root-cycle
25+REJECTED: import cycle at /ui/probe/jibb
26+#### M2-derived-clash
27+REJECTED: API derived name `plain` clashes with a definition
28+/ui/api/demo.jibb:3:3: `plain` is derived from this path case
29+ [%plain /plain full]
30+ ^
31+/ui/api/demo.jibb:5:1: clashing definition
32+++ plain 5
33+^
34+#### M2b-derived-clash-root
35+REJECTED: API derived name `plain` clashes with a definition
36+/ui/api/demo.jibb:3:3: `plain` is derived from this path case
37+ [%plain /plain full]
38+ ^
39+/ui/api/demo.jibb:5:1: clashing definition
40+++ plain 5
41+^
42+#### M2c-derived-face-clash
43+REJECTED: API derived name `plain` clashes with an import face
44+/ui/api/demo.jibb:4:3: `plain` is derived from this path case
45+ [%plain /plain full]
46+ ^
47+/ui/api/demo.jibb:2:1: clashing import face
48+/- plain
49+^
50+#### M2d-poke-clash
51+REJECTED: API derived name `poke` clashes with a definition
52+/ui/api/demo.jibb:2:1: `poke` is derived from this mold
53++$ poke full
54+^
55+/ui/api/demo.jibb:3:1: clashing definition
56+++ poke "bad"
57+^
58+#### M3-facts-in-library
59+REJECTED: module mold needs unsupported inference: /ui/probe/jibb
60+#### M3b-facts-in-api-other-mold
61+REJECTED: API module needs unsupported inference: /ui/api/demo/jibb: module mold needs unsupported inference
62+#### M4-shadow-import-face
63+REJECTED: /ui/probe.jibb:2:9: sample `lib` shadows a name already in scope
64+++ f |= lib=@t lib
65+ ^
66+#### M4b-shadow-import-value
67+REJECTED: module has conflicting names: /ui/probe/jibb
68+#### M5-api-ok
69+CHECKED
70+++ plain: $-($-(@t A) (ask A))
71+#### RAW
72+signed: invalid aura: signed and float auras cannot be imported
73+flt: invalid aura: signed and float auras cannot be imported
74+gat: invalid core: cores and gates cannot be imported
75+vas: unsupported: vases cannot be imported
76+dup: ok
77+ovl: unsupported: Hoon union disjointness could not be verified
78+ovl2: unsupported: Hoon union disjointness could not be verified
79+cel: unsupported: Hoon $^ union disjointness could not be verified
80+good: ok
81+cor: invalid core: cores and gates cannot be imported
82+
docs/reviews/2026-11-03-milestone-2-probes/errors/p1.jibbnew file+155
@@ -0,0 +1,155 @@
1+#### ok-control
2+++ inc |= n=@ud (add n 1)
3+#### E01-aura-call
4+++ inc |= n=@ud (add n 1)
5+++ x (inc "hi")
6+#### E01b-aura-cast
7+++ x ^- @ud "hi"
8+#### E01c-aura-sample-only
9+++ f |= x=@t ^- @ud x
10+#### E01d-at-to-ud
11+++ f |= x=@ ^- @ud x
12+#### E02-faces-call
13+++ f |= p=[a=@ud b=@ud] a.p
14+++ g |= q=[x=@ud y=@ud] (f q)
15+#### E02b-faces-cast
16++$ ab [a=@ud b=@ud]
17++$ xy [x=@ud y=@ud]
18+++ v ^- ab [1 2]
19+++ w ^- xy v
20+#### E03-submitt-cast
21++$ msg
22+ [%typed text=@t]
23+ %submit
24+++ bad ^- msg %submitt
25+#### E03b-submitt-call
26++$ msg
27+ [%typed text=@t]
28+ %submit
29+++ take |= m=msg "ok"
30+++ call (take %submitt)
31+#### E04-unresolved-tag
32+++ absent %submitt
33+#### E04b-add-button
34+++ add-button |= label=@t
35+ button label %add
36+#### E05-open-null
37+++ loose ~
38+#### E06-ctor-no-case
39++$ msg
40+ [%typed text=@t]
41+ %submit
42+++ f ^- $-(@t msg) |=%other
43+#### E07-overlap
44++$ overlap
45+ @t
46+ @ud
47+++ identity |=(x x)
48+#### E07b-overlap-records
49++$ pt
50+ [a=@ud b=@ud]
51+ [x=@ud y=@ud]
52+#### E08-missing-case
53++$ choice
54+ [%a value=@t]
55+ %b
56+ %c
57+++ missing |= v=choice
58+ ?- v
59+ [%a payload] payload
60+ %b "b"
61+#### E08b-missing-loobean
62+++ f |= b=?
63+ ?- b
64+ %.y "yes"
65+#### E09-covered-arm
66++$ choice
67+ [%a value=@t]
68+ %b
69+ %c
70+++ duplicate |= v=choice
71+ ?- v
72+ [%a payload] payload
73+ %b "b"
74+ %b "again"
75+ %c "c"
76+#### E09b-covered-after-wild
77++$ choice
78+ %b
79+ %c
80+++ covered |= v=choice
81+ ?- v
82+ * "all"
83+ %c "never"
84+#### E10-self-ref-doc
85+++ title (trim title)
86+#### E10b-self-ref-cast
87+++ title ^- @t title
88+#### E10c-through-gate
89+++ maker |= x=@t value
90+++ value ^- @t (maker "hi")
91+#### E11-shadow-prelude-sample
92+++ f |= add=@ud add
93+#### E11b-shadow-global-sample
94+++ x 1
95+++ f |= x=@ud x
96+#### E11c-shadow-local
97+++ y 1
98+++ f |= z=@ud
99+ ++ y 2
100+ z
101+#### E11d-shadow-pattern
102++$ choice
103+ [%a value=@t]
104+ %b
105+++ complete "c"
106+++ shadow |= v=choice
107+ ?- v
108+ [%a complete] complete
109+ %b "b"
110+#### E11e-shadow-prelude-top
111+++ add 1
112+#### E11f-shadow-prelude-mold
113++$ list @ud
114+#### E12-cell-printer
115+++ record |= x=[@t @ud] "{x}"
116+#### E13-generic-aura-interp
117+++ show |= n=A "{(add n 1)}"
118+#### E13b-generic-aura-path
119+++ link-to |= n=A %/blog/(add n 1)
120+#### E14-capital-ud
121+++ concrete |= x=A ^- @t x
122+#### E14b-capital-ud-arith
123+++ c |= x=A ^- @ud (add x 1)
124+#### E14c-capital-list
125+++ l |= x=A (lent x)
126+#### E15-text-hi
127+++ v ^- (list (element !!)) ~[text "hi"]
128+#### E16-empty-change
129+++ f |= m=[a=@ud b=@ud] m()
130+#### E17-dup-fields-mold
131++$ r [a=@ud a=@t]
132+++ v ^- r [1 "x"]
133+#### E17b-dup-fields-expr
134+++ v [a=1 a=2]
135+#### E18-proj-defined
136+++ proj 1
137+#### E19-loobean-arith
138+++ v (add %.y %.n)
139+#### E20-capitals-forced
140+++ repeat |= p=[A A] p
141+++ bad |= p=[A B] (repeat p)
142+#### E21-hole-unconstrained
143+++ id |= x=_ x
144+#### E21b-hole-mold
145++$ box [item=_]
146+#### E22-eq-gate
147+++ f |= g=$-(@ud @ud) (eq g g)
148+#### E22b-map-key-gate
149+++ m |= [g=$-(@ud @ud) mp=(map $-(@ud @ud) @ud)] (put.by mp g 1)
150+#### E23-facts-outside
151++$ x (facts @t @t)
152+#### E24-repeat-attr
153+++ v (el ~[pad+%s1 pad+%s2] (text "x"))
154+#### E25-empty-cell
155+++ v []
docs/reviews/2026-11-03-milestone-2-probes/errors/p1.outnew file+133
@@ -0,0 +1,133 @@
1+#### ok-control
2+CHECKED
3+++ inc: $-(@ud @ud)
4+#### E01-aura-call
5+REJECTED: module definitions need unsupported inference: /ui/probe/jibb: ++ x
6+#### E01b-aura-cast
7+REJECTED: module definitions need unsupported inference: /ui/probe/jibb: ++ x
8+#### E01c-aura-sample-only
9+REJECTED: module definitions need unsupported inference: /ui/probe/jibb: ++ f
10+#### E01d-at-to-ud
11+REJECTED: module definitions need unsupported inference: /ui/probe/jibb: ++ f
12+#### E02-faces-call
13+REJECTED: module definitions need unsupported inference: /ui/probe/jibb: ++ g
14+#### E02b-faces-cast
15+REJECTED: module definitions need unsupported inference: /ui/probe/jibb: ++ w
16+#### E03-submitt-cast
17+REJECTED: module definitions need unsupported inference: /ui/probe/jibb: ++ bad
18+#### E03b-submitt-call
19+REJECTED: module definitions need unsupported inference: /ui/probe/jibb: ++ call
20+#### E04-unresolved-tag
21+REJECTED: /ui/probe.jibb:1:11: nothing fixes the union of %submitt
22+++ absent %submitt
23+ ^
24+#### E04b-add-button
25+REJECTED: /ui/probe.jibb:2:16: nothing fixes the union of %add
26+ button label %add
27+ ^
28+#### E05-open-null
29+REJECTED: /ui/probe.jibb:1:10: nothing fixes the union of ~
30+++ loose ~
31+ ^
32+#### E06-ctor-no-case
33+REJECTED: module definitions need unsupported inference: /ui/probe/jibb: ++ f
34+#### E07-overlap
35+REJECTED: module mold overlap has overlapping cases
36+/ui/probe.jibb:2:3: first union case
37+ @t
38+ ^
39+/ui/probe.jibb:3:3: overlapping case
40+ @ud
41+ ^
42+#### E07b-overlap-records
43+REJECTED: module mold pt has overlapping cases
44+/ui/probe.jibb:2:3: first union case
45+ [a=@ud b=@ud]
46+ ^
47+/ui/probe.jibb:3:3: overlapping case
48+ [x=@ud y=@ud]
49+ ^
50+#### E08-missing-case
51+REJECTED: module definitions need unsupported inference: /ui/probe/jibb: ++ missing
52+#### E08b-missing-loobean
53+REJECTED: module definitions need unsupported inference: /ui/probe/jibb: ++ f
54+#### E09-covered-arm
55+REJECTED: module definitions need unsupported inference: /ui/probe/jibb: ++ duplicate
56+#### E09b-covered-after-wild
57+REJECTED: module definitions need unsupported inference: /ui/probe/jibb: ++ covered
58+#### E10-self-ref-doc
59+REJECTED: module definitions need unsupported inference: /ui/probe/jibb: ++ title
60+#### E10b-self-ref-cast
61+REJECTED: module definitions need unsupported inference: /ui/probe/jibb: ++ title
62+#### E10c-through-gate
63+REJECTED: module definitions need unsupported inference: /ui/probe/jibb: ++ maker
64+#### E11-shadow-prelude-sample
65+REJECTED: /ui/probe.jibb:1:9: sample `add` shadows a name already in scope
66+++ f |= add=@ud add
67+ ^
68+#### E11b-shadow-global-sample
69+REJECTED: /ui/probe.jibb:2:9: sample `x` shadows a name already in scope
70+++ f |= x=@ud x
71+ ^
72+#### E11c-shadow-local
73+REJECTED: module definitions need unsupported inference: /ui/probe/jibb: ++ f
74+#### E11d-shadow-pattern
75+REJECTED: module definitions need unsupported inference: /ui/probe/jibb: ++ shadow
76+#### E11e-shadow-prelude-top
77+REJECTED: module has conflicting names: /ui/probe/jibb
78+#### E11f-shadow-prelude-mold
79+REJECTED: module has conflicting names: /ui/probe/jibb
80+#### E12-cell-printer
81+REJECTED: module definitions need unsupported inference: /ui/probe/jibb: ++ record
82+#### E13-generic-aura-interp
83+REJECTED: module definitions need unsupported inference: /ui/probe/jibb: ++ show
84+#### E13b-generic-aura-path
85+REJECTED: module definitions need unsupported inference: /ui/probe/jibb: ++ link-to
86+#### E14-capital-ud
87+REJECTED: module definitions need unsupported inference: /ui/probe/jibb: ++ concrete
88+#### E14b-capital-ud-arith
89+REJECTED: module definitions need unsupported inference: /ui/probe/jibb: ++ c
90+#### E14c-capital-list
91+REJECTED: module definitions need unsupported inference: /ui/probe/jibb: ++ l
92+#### E15-text-hi
93+REJECTED: module definitions need unsupported inference: /ui/probe/jibb: ++ v
94+#### E16-empty-change
95+REJECTED: module definitions need unsupported inference: /ui/probe/jibb: ++ f
96+#### E17-dup-fields-mold
97+REJECTED: record field `a` is repeated
98+/ui/probe.jibb:1:7: first field
99++$ r [a=@ud a=@t]
100+ ^
101+/ui/probe.jibb:1:13: repeated field
102++$ r [a=@ud a=@t]
103+ ^
104+#### E17b-dup-fields-expr
105+REJECTED: record field `a` is repeated
106+/ui/probe.jibb:1:7: first field
107+++ v [a=1 a=2]
108+ ^
109+/ui/probe.jibb:1:11: repeated field
110+++ v [a=1 a=2]
111+ ^
112+#### E18-proj-defined
113+REJECTED: module has conflicting names: /ui/probe/jibb
114+#### E19-loobean-arith
115+REJECTED: module definitions need unsupported inference: /ui/probe/jibb: ++ v
116+#### E20-capitals-forced
117+REJECTED: module definitions need unsupported inference: /ui/probe/jibb: ++ bad
118+#### E21-hole-unconstrained
119+REJECTED: module definitions need unsupported inference: /ui/probe/jibb: ++ id
120+#### E21b-hole-mold
121+REJECTED: module mold needs unsupported inference: /ui/probe/jibb
122+#### E22-eq-gate
123+REJECTED: module definitions need unsupported inference: /ui/probe/jibb: ++ f
124+#### E22b-map-key-gate
125+REJECTED: module definitions need unsupported inference: /ui/probe/jibb: ++ m
126+#### E23-facts-outside
127+REJECTED: module mold needs unsupported inference: /ui/probe/jibb
128+#### E24-repeat-attr
129+CHECKED
130+++ v: (element A)
131+#### E25-empty-cell
132+REJECTED: module definitions need unsupported inference: /ui/probe/jibb: ++ v
133+
docs/reviews/2026-11-03-milestone-2-probes/errors/p2.jibbnew file+106
@@ -0,0 +1,106 @@
1+#### G1-gate-model
2++$ message
3+ %start
4+ %stop
5++$ model [count=@ud callback=$-(@t @t)]
6+++ main (program init update view subs)
7+++ init |= input=@t ^- model [count=0 callback=echo]
8+++ update |= [msg=message state=model]
9+ ^- [model (list (cmd message))] [state ~]
10+++ view |= state=model ^- (element message) (text "view")
11+++ subs |= state=model ^- (list (sub message)) ~
12+++ echo |= input=@t input
13+#### G2-gate-data
14++$ message
15+ %start
16+ %stop
17++$ model [count=@ud]
18+++ main (program init update view subs)
19+++ init |= input=$-(@t @t) ^- model [count=0]
20+++ update |= [msg=message state=model]
21+ ^- [model (list (cmd message))] [state ~]
22+++ view |= state=model ^- (element message) (text "view")
23+++ subs |= state=model ^- (list (sub message)) ~
24+#### G3-gate-model-nested
25++$ message
26+ %start
27+ %stop
28++$ model [count=@ud inner=[cb=(list $-(@t @t))]]
29+++ main (program init update view subs)
30+++ init |= input=@t ^- model [count=0 inner=[cb=~]]
31+++ update |= [msg=message state=model]
32+ ^- [model (list (cmd message))] [state ~]
33+++ view |= state=model ^- (element message) (text "view")
34+++ subs |= state=model ^- (list (sub message)) ~
35+#### S1-step-missing-stop
36++$ step
37+ [%move %left n=@ud]
38+ [%move %right n=@ud]
39+ [text=@t %draft]
40+ [text=@t %sent at=@da]
41+ %stop
42+++ describe |= s=step
43+ ?- s
44+ [%move %left n] "left {n}"
45+ [%move %right n] "right {n}"
46+ [t %draft] t
47+ [t %sent sent-at] t
48+#### S2-move-any-covered
49++$ step
50+ [%move dir=@tas n=@ud]
51+ %stop
52+++ describe |= s=step
53+ ?- s
54+ [%move * *] "move"
55+ [%move %left n] "left"
56+ %stop "stop"
57+#### S3-loobean-repeated
58+++ f |= flag=? ^- ?
59+ ?- flag
60+ %.y %.y
61+ %.y %.n
62+#### S4-list-missing
63+++ f |= xs=(list @t) ^- ?
64+ ?- xs
65+ ~ %.y
66+#### S5-pattern-no-case
67++$ choice
68+ %a
69+ %b
70+++ f |= v=choice
71+ ?- v
72+ %a "a"
73+ %b "b"
74+ %c "c"
75+#### T1-local-aura
76+++ inc |= n=@ud n
77+++ f |= x=@t
78+ ++ bad (inc %.y)
79+ x
80+#### T2-change-bad-tag
81++$ actions
82+ %start
83+ %stop
84++$ model [mode=actions data=(unit @t)]
85+++ bad-tag |= m=model m(mode=%missing)
86+#### T3-hole-path
87+++ p /todo/[id=_]
88+#### T4-unit-inner
89+++ v ^- (unit @ud) `"x"
90+#### T5-list-item
91+++ v ^- (list @ud) ~[1 "x"]
92+#### T6-repeat-attr-column
93+++ v (column ~[gap+%s1 gap+%s2] ~[(text "x")])
94+#### T7-msg-mismatch-element
95++$ msg
96+ %a
97+ %b
98+++ v ^- (element msg) (button "x" %c)
99+#### T8-generic-aura-path-sample
100+++ link-to |= n=A
101+ ++ m (add n 1)
102+ %/blog/(m)
103+#### T9-wing-unknown-field
104+++ f |= p=[a=@ud b=@ud] c.p
105+#### T10-unknown-name
106+++ f missing
docs/reviews/2026-11-03-milestone-2-probes/errors/p2.outnew file+38
@@ -0,0 +1,38 @@
1+#### G1-gate-model
2+REJECTED: module kind needs unsupported inference: /ui/probe/jibb
3+#### G2-gate-data
4+REJECTED: module kind needs unsupported inference: /ui/probe/jibb
5+#### G3-gate-model-nested
6+REJECTED: module definitions need unsupported inference: /ui/probe/jibb: ++ init
7+#### S1-step-missing-stop
8+REJECTED: module definitions need unsupported inference: /ui/probe/jibb: ++ describe
9+#### S2-move-any-covered
10+REJECTED: module definitions need unsupported inference: /ui/probe/jibb: ++ describe
11+#### S3-loobean-repeated
12+REJECTED: module definitions need unsupported inference: /ui/probe/jibb: ++ f
13+#### S4-list-missing
14+REJECTED: module definitions need unsupported inference: /ui/probe/jibb: ++ f
15+#### S5-pattern-no-case
16+REJECTED: module definitions need unsupported inference: /ui/probe/jibb: ++ f
17+#### T1-local-aura
18+REJECTED: module definitions need unsupported inference: /ui/probe/jibb: ++ f
19+#### T2-change-bad-tag
20+REJECTED: module definitions need unsupported inference: /ui/probe/jibb: ++ bad-tag
21+#### T3-hole-path
22+REJECTED: module source does not parse: /ui/probe/jibb
23+#### T4-unit-inner
24+REJECTED: module definitions need unsupported inference: /ui/probe/jibb: ++ v
25+#### T5-list-item
26+REJECTED: module definitions need unsupported inference: /ui/probe/jibb: ++ v
27+#### T6-repeat-attr-column
28+CHECKED
29+++ v: (element A)
30+#### T7-msg-mismatch-element
31+REJECTED: module definitions need unsupported inference: /ui/probe/jibb: ++ v
32+#### T8-generic-aura-path-sample
33+REJECTED: module definitions need unsupported inference: /ui/probe/jibb: ++ link-to
34+#### T9-wing-unknown-field
35+REJECTED: module definitions need unsupported inference: /ui/probe/jibb: ++ f
36+#### T10-unknown-name
37+REJECTED: module definitions need unsupported inference: /ui/probe/jibb: ++ f
38+
docs/reviews/2026-11-03-milestone-2-probes/errors/p3.jibbnew file+68
@@ -0,0 +1,68 @@
1+#### C0-island-ok
2++$ msg
3+ [%typed text=@t]
4+ %submit
5++$ model [draft=@t]
6+++ main (program init update view subs)
7+++ init |= input=@t ^- model [draft=input]
8+++ update |= [=msg m=model]
9+ ^- [model (list (cmd msg))]
10+ ?- msg
11+ [%typed t] [m(draft=t) ~]
12+ %submit [m(draft="") ~]
13+++ view |= m=model ^- (element msg)
14+ row ~[gap+%s1] ~[
15+ (field "New todo" draft.m |=%typed)
16+ button "Add" %submit
17+++ subs |= m=model ^- (list (sub msg)) ~
18+#### C1-island-submitt-view
19++$ msg
20+ [%typed text=@t]
21+ %submit
22++$ model [draft=@t]
23+++ main (program init update view subs)
24+++ init |= input=@t ^- model [draft=input]
25+++ update |= [=msg m=model]
26+ ^- [model (list (cmd msg))]
27+ ?- msg
28+ [%typed t] [m(draft=t) ~]
29+ %submit [m(draft="") ~]
30+++ view |= m=model ^- (element msg)
31+ row ~[gap+%s1] ~[
32+ (field "New todo" draft.m |=%typed)
33+ button "Add" %submitt
34+++ subs |= m=model ^- (list (sub msg)) ~
35+#### C2-island-submitt-noview-cast
36++$ msg
37+ [%typed text=@t]
38+ %submit
39++$ model [draft=@t]
40+++ main (program init update view subs)
41+++ init |= input=@t ^- model [draft=input]
42+++ update |= [=msg m=model]
43+ ^- [model (list (cmd msg))]
44+ ?- msg
45+ [%typed t] [m(draft=t) ~]
46+ %submit [m(draft="") ~]
47+++ view |= m=model
48+ row ~[gap+%s1] ~[
49+ (field "New todo" draft.m |=%typed)
50+ button "Add" %submitt
51+++ subs |= m=model ^- (list (sub msg)) ~
52+#### C3-island-ctor-typo
53++$ msg
54+ [%typed text=@t]
55+ %submit
56++$ model [draft=@t]
57+++ main (program init update view subs)
58+++ init |= input=@t ^- model [draft=input]
59+++ update |= [=msg m=model]
60+ ^- [model (list (cmd msg))]
61+ ?- msg
62+ [%typed t] [m(draft=t) ~]
63+ %submit [m(draft="") ~]
64+++ view |= m=model ^- (element msg)
65+ row ~[gap+%s1] ~[
66+ (field "New todo" draft.m |=%typd)
67+ button "Add" %submit
68+++ subs |= m=model ^- (list (sub msg)) ~
docs/reviews/2026-11-03-milestone-2-probes/errors/p3.outnew file+16
@@ -0,0 +1,16 @@
1+#### C0-island-ok
2+CHECKED
3++$ msg: msg
4++$ model: [draft=@t]
5+++ main: [init=$-(@t [draft=@t]) [update=$-([msg draft=@t] [draft=@t (list (cmd msg))]) [view=$-([draft=@t] (element msg)) subs=$-([draft=@t] (list (sub msg)))]]]
6+++ subs: $-([draft=@t] (list (sub msg)))
7+++ view: $-([draft=@t] (element msg))
8+++ update: $-([msg=msg m=[draft=@t]] [draft=@t (list (cmd msg))])
9+++ init: $-(@t [draft=@t])
10+#### C1-island-submitt-view
11+REJECTED: module definitions need unsupported inference: /ui/probe/jibb: ++ view
12+#### C2-island-submitt-noview-cast
13+REJECTED: module definitions need unsupported inference: /ui/probe/jibb: ++ view
14+#### C3-island-ctor-typo
15+REJECTED: module definitions need unsupported inference: /ui/probe/jibb: ++ view
16+
docs/reviews/2026-11-03-milestone-2-probes/errors/p4.jibbnew file+30
@@ -0,0 +1,30 @@
1+#### X1-multiarg-site
2+++ v (add 1 "x")
3+#### X2-pt-valid
4++$ pt
5+ @t
6+ [@ud @ud]
7+++ a ^- pt "x"
8+#### X3-pt-faced-cases
9++$ pt
10+ x=@ud
11+ y=@ud
12+#### X4-pt-tuple-meant
13++$ pt
14+ @ud
15+ @ud
16+#### X5-step-doc-missing-stop
17++$ step
18+ [%move %left n=@ud]
19+ [%move %right n=@ud]
20+ [text=@t %draft]
21+ [text=@t %sent at=@da]
22+ %stop
23+++ describe |= s=step
24+ ?- s
25+ [%move %left n] "left {n}"
26+ [%move %right n] "right {n}"
27+ [t %draft] t
28+ [t %sent sent-at] t
29+#### X6-title-trim-annotated
30+++ title ^- @t (trim title)
docs/reviews/2026-11-03-milestone-2-probes/errors/p4.outnew file+22
@@ -0,0 +1,22 @@
1+#### X1-multiarg-site
2+CHECKED
3+++ v: @t
4+#### X2-pt-valid
5+CHECKED
6++$ pt: pt
7+++ a: pt
8+#### X3-pt-faced-cases
9+REJECTED: module source does not parse: /ui/probe/jibb
10+#### X4-pt-tuple-meant
11+REJECTED: module mold pt has overlapping cases
12+/ui/probe.jibb:2:3: first union case
13+ @ud
14+ ^
15+/ui/probe.jibb:3:3: overlapping case
16+ @ud
17+ ^
18+#### X5-step-doc-missing-stop
19+REJECTED: module definitions need unsupported inference: /ui/probe/jibb: ++ describe
20+#### X6-title-trim-annotated
21+REJECTED: module definitions need unsupported inference: /ui/probe/jibb: ++ title
22+
docs/reviews/2026-11-03-milestone-2-probes/errors/p5.jibbnew file+45
@@ -0,0 +1,45 @@
1+#### W1-initializer-error
2++$ model [xs=(list @t) draft=@t error=@t]
3++$ message
4+ %start
5+ %stop
6+++ main (program init update view subs)
7+++ init |= ts=(list @t) [ts "" ~]
8+++ update |= [msg=message state=model]
9+ ^- [model (list (cmd message))] [state ~]
10+++ view |= state=model ^- (element message) (text "view")
11+++ subs |= state=model ^- (list (sub message)) ~
12+#### W2-initializer-earlier
13++$ model [xs=(list @t) draft=@t error=(unit @t)]
14++$ message
15+ %start
16+ %stop
17+++ main (program init update view subs)
18+++ init |= ts=(list @t) [ts ~zod ~]
19+++ update |= [msg=message state=model]
20+ ^- [model (list (cmd message))] [state ~]
21+++ view |= state=model ^- (element message) (text "view")
22+++ subs |= state=model ^- (list (sub message)) ~
23+#### W3-initializer-model
24++$ model [xs=(list @t) draft=@t error=(unit @t)]
25++$ other [xs=(list @t) draft=@t error=(unit @t) extra=@ud]
26++$ message
27+ %start
28+ %stop
29+++ main (program init update view subs)
30+++ init |= ts=(list @t) [ts "" ~]
31+++ update |= [msg=message state=other]
32+ ^- [other (list (cmd message))] [state ~]
33+++ view |= state=model ^- (element message) (text "view")
34+++ subs |= state=model ^- (list (sub message)) ~
35+#### W4-earlier-annotated
36++$ model [xs=(list @t) draft=@t error=(unit @t)]
37++$ message
38+ %start
39+ %stop
40+++ main (program init update view subs)
41+++ init |= ts=(list @t) ^- model [ts ~zod ~]
42+++ update |= [msg=message state=model]
43+ ^- [model (list (cmd message))] [state ~]
44+++ view |= state=model ^- (element message) (text "view")
45+++ subs |= state=model ^- (list (sub message)) ~
docs/reviews/2026-11-03-milestone-2-probes/runnew file+46
@@ -0,0 +1,46 @@
1+#!/bin/sh
2+# Rerun the milestone 2 review's probes through the full module checker,
3+# infer-jibb-file-detailed, from the repo root:
4+#
5+# docs/reviews/2026-11-03-milestone-2-probes/run plain FILE one module per section
6+# docs/reviews/2026-11-03-milestone-2-probes/run app FILE sections at my-app paths, with its imports
7+# docs/reviews/2026-11-03-milestone-2-probes/run imports the Hoon import errors
8+#
9+# FILE holds sections, each starting with a line "#### <label>"; see README.md.
10+set -e
11+HERE=$(cd "$(dirname "$0")" && pwd)
12+ROOT=$(cd "$HERE/../../.." && pwd)
13+cd "$ROOT"
14+TMP=$(mktemp -d)
15+trap 'rm -rf "$TMP"' EXIT
16+PRELUDE="--cord prelude=jibb-dev/lib/jibb/prelude.jibb --cord internal=jibb-dev/lib/jibb/internal.jibb"
17+case "$1" in
18+ plain)
19+ tools/hoon --raw $PRELUDE --cord src="$2" -f "$HERE/check.hoon"
20+ ;;
21+ app)
22+ # Marks without their /- lines, which ride can't parse; the check binds
23+ # the /sur face by hand, as the tests/lib suites do.
24+ for m in todo-action todos todo-update todo-item posts; do
25+ grep -v '^/-' "my-app/mar/$m.hoon" > "$TMP/$m.hoon"
26+ done
27+ { printf '=/ imp\n => ..zuse\n'; cat jibb-dev/lib/jibb-import.hoon; cat "$HERE/app-check.hoon"; } > "$TMP/check.hoon"
28+ tools/hoon --raw $PRELUDE \
29+ --cord sur=my-app/sur/todo.hoon --cord blogsur=my-app/sur/blog.hoon \
30+ --cord action="$TMP/todo-action.hoon" --cord todos="$TMP/todos.hoon" \
31+ --cord update="$TMP/todo-update.hoon" --cord item="$TMP/todo-item.hoon" \
32+ --cord posts="$TMP/posts.hoon" \
33+ --cord todoapi=my-app/ui/api/todo.jibb --cord todolist=my-app/ui/todo-list.jibb \
34+ --cord blogapi=my-app/ui/api/blog.jibb --cord card=my-app/ui/components/card.jibb \
35+ --cord cart=my-app/ui/stores/cart.jibb \
36+ --cord src="$2" -f "$TMP/check.hoon"
37+ ;;
38+ imports)
39+ { printf '=/ jibb-lib .\n=/ reader\n'; cat jibb-dev/lib/jibb-import.hoon; printf '\n'; cat "$HERE/errors/import-check.hoon"; } > "$TMP/check.hoon"
40+ tools/hoon --raw $PRELUDE -f "$TMP/check.hoon"
41+ ;;
42+ *)
43+ sed -n '2,10p' "$0"
44+ exit 2
45+ ;;
46+esac
docs/reviews/2026-11-03-milestone-2-probes/variants/p1.jibbnew file+194
@@ -0,0 +1,194 @@
1+#### /ui/api/todo/jibb api-todo
2+:: /ui/api/todo.jibb
3+/- todo
4+/% %todo-action
5+/% %todos
6+/% %todo-update
7+/% %todo-item
8+
9++$ item item.todo
10++$ poke todo-action
11++$ paths
12+ [%todos /todos todos]
13+ [%changes /changes (facts todos todo-update)]
14+ [%todo-by-id /todo/[id=@ud] todo-item]
15+#### /ui/api/blog/jibb api-blog
16+:: Fixture for the documented examples; not supplied by the design doc.
17+/% %posts
18+
19++$ paths
20+ [%posts /posts posts]
21+#### /ui/components/card/jibb card
22+:: Fixture for the documented examples; not supplied by the design doc.
23+/- blog
24+
25+++ card |= p=post.blog
26+ text title.p
27+#### /ui/components/buttons/jibb buttons
28+:: /ui/components/buttons.jibb, a library with no main
29+++ add-button |= label=@t
30+ button label %add :: error: nothing fixes the union of %add
31+++ labelled |= [label=@t msg=M]
32+ button label msg :: fine: the caller's union
33+++ wide ^- (list attr)
34+ ~[width+[%fill 1] pad+%s2] :: fine: the cast fixes the tags
35+#### /ui/theme/jibb theme
36+++ theme ^- theme
37+ [ space=[s1="4px" s2="8px" s3="16px"]
38+ tones=[normal="#222" background="#fff" accent="#17734f" danger="#b3261e" muted="#5f5f5f"]
39+ wide="60rem"
40+ lang="en"
41+ zone="UTC"
42+ font=`%/static/fonts/inter.woff2
43+ dark=`[tones=[normal="#eee" background="#111" accent="#4c9" danger="#f28b82" muted="#aaa"]]
44+#### /ui/stores/cart/jibb cart
45+:: /ui/stores/cart.jibb
46++$ state [items=(list @t) open=?]
47++$ poke
48+ [%add item=@t]
49+ %toggle
50+
51+++ main (store init update)
52+++ init ^- state [items=~ open=%.n]
53+++ update |= [a=poke s=state]
54+ ?- a
55+ [%add item] s(items=[item items.s])
56+ %toggle s(open=(not open.s))
57+#### /ui/basket/jibb basket
58+:: /ui/basket.jibb
59+/= cart /ui/stores/cart
60+
61+++ main (program init update view subs)
62+
63++$ model [cart=state.cart note=@t]
64++$ msg
65+ [%noted text=@t]
66+ %add
67+ %toggle
68+ [%got cart=state.cart]
69+ [%acked err=(unit @t)]
70+
71+++ init |= ~
72+ [cart=[items=~ open=%.n] note=""]
73+
74+++ update |= [=msg m=model]
75+ ?- msg
76+ [%noted t] [m(note=t) ~]
77+ %add [m(note="") ~[(poke.cart [%add note.m] |=%acked)]]
78+ %toggle [m ~[(poke.cart %toggle |=%acked)]]
79+ [%got c] [m(cart=c) ~]
80+ [%acked err] [m ~]
81+
82+++ subs |= m=model
83+ ~[[%watch (state.cart |=%got)]]
84+
85+++ view |= m=model
86+ column ~[gap+%s1] ~[
87+ (text "{(lent items.cart.m)} items")
88+ field "Item" note.m |=%noted
89+ button "Add" %add
90+#### /ui/todo-list/jibb todo-list
91+/= todo /ui/api/todo
92+
93+++ main (program init update view subs)
94+
95++$ model [todos=(list item.todo) draft=@t error=(unit @t)]
96++$ msg
97+ [%typed text=@t]
98+ %submit
99+ [%toggled id=@ud]
100+ [%got todos=(list item.todo)]
101+ [%acked err=(unit @t)]
102+
103+++ init |= ts=(list item.todo)
104+ [todos=ts draft="" error=~]
105+
106+++ update |= [=msg m=model]
107+ ?- msg
108+ [%typed t]
109+ ?- (gth (lent (tuba (trip t))) 80)
110+ %.y [m(draft=t error=`"Too long") ~]
111+ %.n [m(draft=t error=~) ~]
112+ %submit [m(draft="") ~[(poke.todo [%add draft.m] |=%acked)]]
113+ [%toggled id] [m ~[(poke.todo [%toggle id] |=%acked)]]
114+ [%got ts] [m(todos=ts) ~]
115+ [%acked err] [m(error=err) ~]
116+
117+++ subs |= m=model
118+ ~[[%watch (todos.todo |=%got)]]
119+
120+++ view |= m=model
121+ column ~[gap+%s2] ~[
122+ heading 2 "Todos"
123+ each (turn todos.m row-of)
124+ row ~[gap+%s1] ~[
125+ el ~[width+[%fill 1]] (field "New todo" draft.m |=%typed)
126+ button "Add" %submit
127+ el ~[tone+%danger] (text (fall error.m ""))
128+
129+++ row-of |= t=item.todo
130+ [id.t (toggle done.t text.t [%toggled id.t])]
131+#### /ui/index/jibb index
132+/= todo /ui/api/todo
133+/= todo-list /ui/todo-list
134+
135+++ main (page load view)
136+++ load |=(~ (todos.todo same))
137+
138+++ view |= ts=(list item.todo)
139+ column ~[pad+%s3] ~[
140+ heading 1 "My ship"
141+ island main.todo-list ts
142+#### /ui/about/jibb about
143+++ main view
144+
145+++ view
146+ column ~[width+[%fill 1] pad+%s3 gap+%s2] ~[
147+ heading 1 "About this ship"
148+ para ~[(text "Hosted on Urbit. This page ships no JavaScript.")]
149+ el ~[tone+%accent] (link %/blog "Read the blog")
150+#### /ui/blog/index/jibb blog-index
151+/- blog
152+/= api /ui/api/blog
153+/= card /ui/components/card
154+
155+++ main (page load view)
156+++ load |=(~ (posts.api same))
157+
158+++ view |= ps=(list post.blog)
159+ column ~[gap+%s2] (turn ps card.card)
160+#### /ui/imports/jibb imports
161+/- todo :: the molds from /sur/todo.hoon this module uses
162+/% %todo-action :: a mark's type, named todo-action
163+/= card /ui/components/card :: a Jibb module
164+#### /ui/view-day/jibb view-day
165+++ view |= [day=@da n=@ud]
166+ column ~[gap+%s1] ~[
167+ (text "Updated {day}") :: day printed as a date
168+ (text "{n} items") :: n printed as @ud
169+#### /ui/step/jibb step
170++$ step
171+ [%move %left n=@ud]
172+ [%move %right n=@ud]
173+ [text=@t %draft]
174+ [text=@t %sent at=@da]
175+ %stop
176+
177+++ describe |= s=step
178+ ?- s
179+ [%move %left n] "left {n}"
180+ [%move %right n] "right {n}"
181+ [t %draft] t
182+ [t %sent sent-at] t
183+ %stop "stop"
184+#### /ui/update/jibb core-update-alone
185+++ update |= [=msg m=model]
186+ ?- msg
187+ [%typed t]
188+ ?- (gth (lent (tuba (trip t))) 80)
189+ %.y [m(draft=t error=`"Too long") ~]
190+ %.n [m(draft=t error=~) ~]
191+ %submit [m(draft="") ~[(poke.todo [%add draft.m] |=%acked)]]
192+ [%toggled id] [m ~[(poke.todo [%toggle id] |=%acked)]]
193+ [%got ts] [m(todos=ts) ~]
194+ [%acked err] [m(error=err) ~]
docs/reviews/2026-11-03-milestone-2-probes/variants/p10.jibbnew file+324
@@ -0,0 +1,324 @@
1+#### /ui/index/jibb BAD-island-data-atom
2+/= todo /ui/api/todo
3+/= todo-list /ui/todo-list
4+
5+++ main (page load view)
6+++ load |=(~ (todos.todo same))
7+
8+++ view |= ts=(list item.todo)
9+ column ~[pad+%s3] ~[
10+ heading 1 "My ship"
11+ island main.todo-list 5
12+#### /ui/index/jibb BAD-view-sample
13+/= todo /ui/api/todo
14+/= todo-list /ui/todo-list
15+
16+++ main (page load view)
17+++ load |=(~ (todos.todo same))
18+
19+++ view |= ts=(list @t)
20+ column ~[pad+%s3] ~[
21+ heading 1 "My ship"
22+ text "x"
23+#### /ui/todo-list/jibb BAD-cmd-bare-tag
24+/= todo /ui/api/todo
25+
26+++ main (program init update view subs)
27+
28++$ model [todos=(list item.todo) draft=@t error=(unit @t)]
29++$ msg
30+ [%typed text=@t]
31+ %submit
32+ [%toggled id=@ud]
33+ [%got todos=(list item.todo)]
34+ [%acked err=(unit @t)]
35+
36+++ init |= ts=(list item.todo)
37+ [todos=ts draft="" error=~]
38+
39+++ update |= [=msg m=model]
40+ ?- msg
41+ [%typed t]
42+ ?- (gth (lent (tuba (trip t))) 80)
43+ %.y [m(draft=t error=`"Too long") ~]
44+ %.n [m(draft=t error=~) ~]
45+ %submit [m(draft="") ~[(poke.todo [%add draft.m] |=%acked)]]
46+ [%toggled id] [m ~[(poke.todo [%toggle id] |=%acked)]]
47+ [%got ts] [m(todos=ts) ~[%submit]]
48+ [%acked err] [m(error=err) ~]
49+
50+++ subs |= m=model
51+ ~[[%watch (todos.todo |=%got)]]
52+
53+++ view |= m=model
54+ column ~[gap+%s2] ~[
55+ heading 2 "Todos"
56+ each (turn todos.m row-of)
57+ row ~[gap+%s1] ~[
58+ el ~[width+[%fill 1]] (field "New todo" draft.m |=%typed)
59+ button "Add" %submit
60+ el ~[tone+%danger] (text (fall error.m ""))
61+
62+++ row-of |= t=item.todo
63+ [id.t (toggle done.t text.t [%toggled id.t])]
64+#### /ui/basket/jibb BAD-cart-poke-case
65+:: /ui/basket.jibb
66+/= cart /ui/stores/cart
67+
68+++ main (program init update view subs)
69+
70++$ model [cart=state.cart note=@t]
71++$ msg
72+ [%noted text=@t]
73+ %add
74+ %toggle
75+ [%got cart=state.cart]
76+ [%acked err=(unit @t)]
77+
78+++ init |= ~
79+ [cart=[items=~ open=%.n] note=""]
80+
81+++ update |= [=msg m=model]
82+ ?- msg
83+ [%noted t] [m(note=t) ~]
84+ %add [m(note="") ~[(poke.cart [%remove note.m] |=%acked)]]
85+ %toggle [m ~[(poke.cart %toggle |=%acked)]]
86+ [%got c] [m(cart=c) ~]
87+ [%acked err] [m ~]
88+
89+++ subs |= m=model
90+ ~[[%watch (state.cart |=%got)]]
91+
92+++ view |= m=model
93+ column ~[gap+%s1] ~[
94+ (text "{(lent items.cart.m)} items")
95+ field "Item" note.m |=%noted
96+ button "Add" %add
97+#### /ui/todo-list/jibb BAD-watch-reply
98+/= todo /ui/api/todo
99+
100+++ main (program init update view subs)
101+
102++$ model [todos=(list item.todo) draft=@t error=(unit @t)]
103++$ msg
104+ [%typed text=@t]
105+ %submit
106+ [%toggled id=@ud]
107+ [%got todos=(list item.todo)]
108+ [%acked err=(unit @t)]
109+
110+++ init |= ts=(list item.todo)
111+ [todos=ts draft="" error=~]
112+
113+++ update |= [=msg m=model]
114+ ?- msg
115+ [%typed t]
116+ ?- (gth (lent (tuba (trip t))) 80)
117+ %.y [m(draft=t error=`"Too long") ~]
118+ %.n [m(draft=t error=~) ~]
119+ %submit [m(draft="") ~[(poke.todo [%add draft.m] |=%acked)]]
120+ [%toggled id] [m ~[(poke.todo [%toggle id] |=%acked)]]
121+ [%got ts] [m(todos=ts) ~]
122+ [%acked err] [m(error=err) ~]
123+
124+++ subs |= m=model
125+ ~[[%watch (todos.todo |=%acked)]]
126+
127+++ view |= m=model
128+ column ~[gap+%s2] ~[
129+ heading 2 "Todos"
130+ each (turn todos.m row-of)
131+ row ~[gap+%s1] ~[
132+ el ~[width+[%fill 1]] (field "New todo" draft.m |=%typed)
133+ button "Add" %submit
134+ el ~[tone+%danger] (text (fall error.m ""))
135+
136+++ row-of |= t=item.todo
137+ [id.t (toggle done.t text.t [%toggled id.t])]
138+#### /ui/stores/cart/jibb BAD-cart-open-num
139+:: /ui/stores/cart.jibb
140++$ state [items=(list @t) open=?]
141++$ poke
142+ [%add item=@t]
143+ %toggle
144+
145+++ main (store init update)
146+++ init ^- state [items=~ open=%.n]
147+++ update |= [a=poke s=state]
148+ ?- a
149+ [%add item] s(items=[item items.s])
150+ %toggle s(open=5)
151+#### /ui/todo-list/jibb BAD-init-error-cord
152+/= todo /ui/api/todo
153+
154+++ main (program init update view subs)
155+
156++$ model [todos=(list item.todo) draft=@t error=(unit @t)]
157++$ msg
158+ [%typed text=@t]
159+ %submit
160+ [%toggled id=@ud]
161+ [%got todos=(list item.todo)]
162+ [%acked err=(unit @t)]
163+
164+++ init |= ts=(list item.todo)
165+ [todos=ts draft="" error="x"]
166+
167+++ update |= [=msg m=model]
168+ ?- msg
169+ [%typed t]
170+ ?- (gth (lent (tuba (trip t))) 80)
171+ %.y [m(draft=t error=`"Too long") ~]
172+ %.n [m(draft=t error=~) ~]
173+ %submit [m(draft="") ~[(poke.todo [%add draft.m] |=%acked)]]
174+ [%toggled id] [m ~[(poke.todo [%toggle id] |=%acked)]]
175+ [%got ts] [m(todos=ts) ~]
176+ [%acked err] [m(error=err) ~]
177+
178+++ subs |= m=model
179+ ~[[%watch (todos.todo |=%got)]]
180+
181+++ view |= m=model
182+ column ~[gap+%s2] ~[
183+ heading 2 "Todos"
184+ each (turn todos.m row-of)
185+ row ~[gap+%s1] ~[
186+ el ~[width+[%fill 1]] (field "New todo" draft.m |=%typed)
187+ button "Add" %submit
188+ el ~[tone+%danger] (text (fall error.m ""))
189+
190+++ row-of |= t=item.todo
191+ [id.t (toggle done.t text.t [%toggled id.t])]
192+#### /ui/todo-list/jibb BAD-model-gate
193+/= todo /ui/api/todo
194+
195+++ main (program init update view subs)
196+
197++$ model [todos=(list item.todo) draft=@t error=(unit @t) f=$-(@t @t)]
198++$ msg
199+ [%typed text=@t]
200+ %submit
201+ [%toggled id=@ud]
202+ [%got todos=(list item.todo)]
203+ [%acked err=(unit @t)]
204+
205+++ init |= ts=(list item.todo)
206+ [todos=ts draft="" error=~ f=same]
207+
208+++ update |= [=msg m=model]
209+ ?- msg
210+ [%typed t]
211+ ?- (gth (lent (tuba (trip t))) 80)
212+ %.y [m(draft=t error=`"Too long") ~]
213+ %.n [m(draft=t error=~) ~]
214+ %submit [m(draft="") ~[(poke.todo [%add draft.m] |=%acked)]]
215+ [%toggled id] [m ~[(poke.todo [%toggle id] |=%acked)]]
216+ [%got ts] [m(todos=ts) ~]
217+ [%acked err] [m(error=err) ~]
218+
219+++ subs |= m=model
220+ ~[[%watch (todos.todo |=%got)]]
221+
222+++ view |= m=model
223+ column ~[gap+%s2] ~[
224+ heading 2 "Todos"
225+ each (turn todos.m row-of)
226+ row ~[gap+%s1] ~[
227+ el ~[width+[%fill 1]] (field "New todo" draft.m |=%typed)
228+ button "Add" %submit
229+ el ~[tone+%danger] (text (fall error.m ""))
230+
231+++ row-of |= t=item.todo
232+ [id.t (toggle done.t text.t [%toggled id.t])]
233+#### /ui/blog/index/jibb BAD-card-wrong
234+/- blog
235+/= api /ui/api/blog
236+/= card /ui/components/card
237+
238+++ main (page load view)
239+++ load |=(~ (posts.api same))
240+
241+++ view |= ps=(list post.blog)
242+ column ~[gap+%s2] (turn ps |=(p=post.blog p))
243+#### /ui/todo-list/jibb BAD-poke-payload
244+/= todo /ui/api/todo
245+
246+++ main (program init update view subs)
247+
248++$ model [todos=(list item.todo) draft=@t error=(unit @t)]
249++$ msg
250+ [%typed text=@t]
251+ %submit
252+ [%toggled id=@ud]
253+ [%got todos=(list item.todo)]
254+ [%acked err=(unit @t)]
255+
256+++ init |= ts=(list item.todo)
257+ [todos=ts draft="" error=~]
258+
259+++ update |= [=msg m=model]
260+ ?- msg
261+ [%typed t]
262+ ?- (gth (lent (tuba (trip t))) 80)
263+ %.y [m(draft=t error=`"Too long") ~]
264+ %.n [m(draft=t error=~) ~]
265+ %submit [m(draft="") ~[(poke.todo [%add draft.m] |=%acked)]]
266+ [%toggled id] [m ~[(poke.todo [%toggle "x"] |=%acked)]]
267+ [%got ts] [m(todos=ts) ~]
268+ [%acked err] [m(error=err) ~]
269+
270+++ subs |= m=model
271+ ~[[%watch (todos.todo |=%got)]]
272+
273+++ view |= m=model
274+ column ~[gap+%s2] ~[
275+ heading 2 "Todos"
276+ each (turn todos.m row-of)
277+ row ~[gap+%s1] ~[
278+ el ~[width+[%fill 1]] (field "New todo" draft.m |=%typed)
279+ button "Add" %submit
280+ el ~[tone+%danger] (text (fall error.m ""))
281+
282+++ row-of |= t=item.todo
283+ [id.t (toggle done.t text.t [%toggled id.t])]
284+#### /ui/todo-list/jibb BAD-row-key-gate
285+/= todo /ui/api/todo
286+
287+++ main (program init update view subs)
288+
289++$ model [todos=(list item.todo) draft=@t error=(unit @t)]
290++$ msg
291+ [%typed text=@t]
292+ %submit
293+ [%toggled id=@ud]
294+ [%got todos=(list item.todo)]
295+ [%acked err=(unit @t)]
296+
297+++ init |= ts=(list item.todo)
298+ [todos=ts draft="" error=~]
299+
300+++ update |= [=msg m=model]
301+ ?- msg
302+ [%typed t]
303+ ?- (gth (lent (tuba (trip t))) 80)
304+ %.y [m(draft=t error=`"Too long") ~]
305+ %.n [m(draft=t error=~) ~]
306+ %submit [m(draft="") ~[(poke.todo [%add draft.m] |=%acked)]]
307+ [%toggled id] [m ~[(poke.todo [%toggle id] |=%acked)]]
308+ [%got ts] [m(todos=ts) ~]
309+ [%acked err] [m(error=err) ~]
310+
311+++ subs |= m=model
312+ ~[[%watch (todos.todo |=%got)]]
313+
314+++ view |= m=model
315+ column ~[gap+%s2] ~[
316+ heading 2 "Todos"
317+ each (turn todos.m row-of)
318+ row ~[gap+%s1] ~[
319+ el ~[width+[%fill 1]] (field "New todo" draft.m |=%typed)
320+ button "Add" %submit
321+ el ~[tone+%danger] (text (fall error.m ""))
322+
323+++ row-of |= t=item.todo
324+ [same (toggle done.t text.t [%toggled id.t])]
docs/reviews/2026-11-03-milestone-2-probes/variants/p10.outnew file+33
@@ -0,0 +1,33 @@
1+#### /ui/index/jibb BAD-island-data-atom
2+REJECTED: module definitions need unsupported inference: /ui/index/jibb: ++ view
3+#### /ui/index/jibb BAD-view-sample
4+REJECTED: module definitions need unsupported inference: /ui/index/jibb: ++ main
5+#### /ui/todo-list/jibb BAD-cmd-bare-tag
6+REJECTED: /ui/todo-list.jibb:14:28: nothing fixes the union of ~
7+ [todos=ts draft="" error=~]
8+ ^
9+#### /ui/basket/jibb BAD-cart-poke-case
10+REJECTED: /ui/basket.jibb:15:16: nothing fixes the union of ~
11+ [cart=[items=~ open=%.n] note=""]
12+ ^
13+#### /ui/todo-list/jibb BAD-watch-reply
14+REJECTED: /ui/todo-list.jibb:14:28: nothing fixes the union of ~
15+ [todos=ts draft="" error=~]
16+ ^
17+#### /ui/stores/cart/jibb BAD-cart-open-num
18+REJECTED: module definitions need unsupported inference: /ui/stores/cart/jibb: ++ update
19+#### /ui/todo-list/jibb BAD-init-error-cord
20+REJECTED: module definitions need unsupported inference: /ui/todo-list/jibb: ++ main
21+#### /ui/todo-list/jibb BAD-model-gate
22+REJECTED: module kind needs unsupported inference: /ui/todo-list/jibb
23+#### /ui/blog/index/jibb BAD-card-wrong
24+REJECTED: module definitions need unsupported inference: /ui/blog/index/jibb: ++ view
25+#### /ui/todo-list/jibb BAD-poke-payload
26+REJECTED: /ui/todo-list.jibb:14:28: nothing fixes the union of ~
27+ [todos=ts draft="" error=~]
28+ ^
29+#### /ui/todo-list/jibb BAD-row-key-gate
30+REJECTED: /ui/todo-list.jibb:14:28: nothing fixes the union of ~
31+ [todos=ts draft="" error=~]
32+ ^
33+
docs/reviews/2026-11-03-milestone-2-probes/variants/p2.jibbnew file+919
@@ -0,0 +1,919 @@
1+#### /ui/todo-list/jibb control
2+/= todo /ui/api/todo
3+
4+++ main (program init update view subs)
5+
6++$ model [todos=(list item.todo) draft=@t error=(unit @t)]
7++$ msg
8+ [%typed text=@t]
9+ %submit
10+ [%toggled id=@ud]
11+ [%got todos=(list item.todo)]
12+ [%acked err=(unit @t)]
13+
14+++ init |= ts=(list item.todo)
15+ [todos=ts draft="" error=~]
16+
17+++ update |= [=msg m=model]
18+ ?- msg
19+ [%typed t]
20+ ?- (gth (lent (tuba (trip t))) 80)
21+ %.y [m(draft=t error=`"Too long") ~]
22+ %.n [m(draft=t error=~) ~]
23+ %submit [m(draft="") ~[(poke.todo [%add draft.m] |=%acked)]]
24+ [%toggled id] [m ~[(poke.todo [%toggle id] |=%acked)]]
25+ [%got ts] [m(todos=ts) ~]
26+ [%acked err] [m(error=err) ~]
27+
28+++ subs |= m=model
29+ ~[[%watch (todos.todo |=%got)]]
30+
31+++ view |= m=model
32+ column ~[gap+%s2] ~[
33+ heading 2 "Todos"
34+ each (turn todos.m row-of)
35+ row ~[gap+%s1] ~[
36+ el ~[width+[%fill 1]] (field "New todo" draft.m |=%typed)
37+ button "Add" %submit
38+ el ~[tone+%danger] (text (fall error.m ""))
39+
40+++ row-of |= t=item.todo
41+ [id.t (toggle done.t text.t [%toggled id.t])]
42+#### /ui/todo-list/jibb reorder
43+/= todo /ui/api/todo
44+
45+++ row-of |= t=item.todo
46+ [id.t (toggle done.t text.t [%toggled id.t])]
47+
48+++ view |= m=model
49+ column ~[gap+%s2] ~[
50+ heading 2 "Todos"
51+ each (turn todos.m row-of)
52+ row ~[gap+%s1] ~[
53+ el ~[width+[%fill 1]] (field "New todo" draft.m |=%typed)
54+ button "Add" %submit
55+ el ~[tone+%danger] (text (fall error.m ""))
56+
57+++ subs |= m=model
58+ ~[[%watch (todos.todo |=%got)]]
59+
60+++ update |= [=msg m=model]
61+ ?- msg
62+ [%typed t]
63+ ?- (gth (lent (tuba (trip t))) 80)
64+ %.y [m(draft=t error=`"Too long") ~]
65+ %.n [m(draft=t error=~) ~]
66+ %submit [m(draft="") ~[(poke.todo [%add draft.m] |=%acked)]]
67+ [%toggled id] [m ~[(poke.todo [%toggle id] |=%acked)]]
68+ [%got ts] [m(todos=ts) ~]
69+ [%acked err] [m(error=err) ~]
70+
71+++ init |= ts=(list item.todo)
72+ [todos=ts draft="" error=~]
73+
74++$ model [todos=(list item.todo) draft=@t error=(unit @t)]
75++$ msg
76+ [%typed text=@t]
77+ %submit
78+ [%toggled id=@ud]
79+ [%got todos=(list item.todo)]
80+ [%acked err=(unit @t)]
81+
82+++ main (program init update view subs)
83+#### /ui/todo-list/jibb rename-view-sample
84+/= todo /ui/api/todo
85+
86+++ main (program init update view subs)
87+
88++$ model [todos=(list item.todo) draft=@t error=(unit @t)]
89++$ msg
90+ [%typed text=@t]
91+ %submit
92+ [%toggled id=@ud]
93+ [%got todos=(list item.todo)]
94+ [%acked err=(unit @t)]
95+
96+++ init |= ts=(list item.todo)
97+ [todos=ts draft="" error=~]
98+
99+++ update |= [=msg m=model]
100+ ?- msg
101+ [%typed t]
102+ ?- (gth (lent (tuba (trip t))) 80)
103+ %.y [m(draft=t error=`"Too long") ~]
104+ %.n [m(draft=t error=~) ~]
105+ %submit [m(draft="") ~[(poke.todo [%add draft.m] |=%acked)]]
106+ [%toggled id] [m ~[(poke.todo [%toggle id] |=%acked)]]
107+ [%got ts] [m(todos=ts) ~]
108+ [%acked err] [m(error=err) ~]
109+
110+++ subs |= m=model
111+ ~[[%watch (todos.todo |=%got)]]
112+
113+++ view |= mdl=model
114+ column ~[gap+%s2] ~[
115+ heading 2 "Todos"
116+ each (turn todos.mdl row-of)
117+ row ~[gap+%s1] ~[
118+ el ~[width+[%fill 1]] (field "New todo" draft.mdl |=%typed)
119+ button "Add" %submit
120+ el ~[tone+%danger] (text (fall error.mdl ""))
121+
122+++ row-of |= t=item.todo
123+ [id.t (toggle done.t text.t [%toggled id.t])]
124+#### /ui/todo-list/jibb rename-row-sample
125+/= todo /ui/api/todo
126+
127+++ main (program init update view subs)
128+
129++$ model [todos=(list item.todo) draft=@t error=(unit @t)]
130++$ msg
131+ [%typed text=@t]
132+ %submit
133+ [%toggled id=@ud]
134+ [%got todos=(list item.todo)]
135+ [%acked err=(unit @t)]
136+
137+++ init |= ts=(list item.todo)
138+ [todos=ts draft="" error=~]
139+
140+++ update |= [=msg m=model]
141+ ?- msg
142+ [%typed t]
143+ ?- (gth (lent (tuba (trip t))) 80)
144+ %.y [m(draft=t error=`"Too long") ~]
145+ %.n [m(draft=t error=~) ~]
146+ %submit [m(draft="") ~[(poke.todo [%add draft.m] |=%acked)]]
147+ [%toggled id] [m ~[(poke.todo [%toggle id] |=%acked)]]
148+ [%got ts] [m(todos=ts) ~]
149+ [%acked err] [m(error=err) ~]
150+
151+++ subs |= m=model
152+ ~[[%watch (todos.todo |=%got)]]
153+
154+++ view |= m=model
155+ column ~[gap+%s2] ~[
156+ heading 2 "Todos"
157+ each (turn todos.m row-of)
158+ row ~[gap+%s1] ~[
159+ el ~[width+[%fill 1]] (field "New todo" draft.m |=%typed)
160+ button "Add" %submit
161+ el ~[tone+%danger] (text (fall error.m ""))
162+
163+++ row-of |= it=item.todo
164+ [id.it (toggle done.it text.it [%toggled id.it])]
165+#### /ui/todo-list/jibb rename-init-sample
166+/= todo /ui/api/todo
167+
168+++ main (program init update view subs)
169+
170++$ model [todos=(list item.todo) draft=@t error=(unit @t)]
171++$ msg
172+ [%typed text=@t]
173+ %submit
174+ [%toggled id=@ud]
175+ [%got todos=(list item.todo)]
176+ [%acked err=(unit @t)]
177+
178+++ init |= items=(list item.todo)
179+ [todos=items draft="" error=~]
180+
181+++ update |= [=msg m=model]
182+ ?- msg
183+ [%typed t]
184+ ?- (gth (lent (tuba (trip t))) 80)
185+ %.y [m(draft=t error=`"Too long") ~]
186+ %.n [m(draft=t error=~) ~]
187+ %submit [m(draft="") ~[(poke.todo [%add draft.m] |=%acked)]]
188+ [%toggled id] [m ~[(poke.todo [%toggle id] |=%acked)]]
189+ [%got ts] [m(todos=ts) ~]
190+ [%acked err] [m(error=err) ~]
191+
192+++ subs |= m=model
193+ ~[[%watch (todos.todo |=%got)]]
194+
195+++ view |= m=model
196+ column ~[gap+%s2] ~[
197+ heading 2 "Todos"
198+ each (turn todos.m row-of)
199+ row ~[gap+%s1] ~[
200+ el ~[width+[%fill 1]] (field "New todo" draft.m |=%typed)
201+ button "Add" %submit
202+ el ~[tone+%danger] (text (fall error.m ""))
203+
204+++ row-of |= t=item.todo
205+ [id.t (toggle done.t text.t [%toggled id.t])]
206+#### /ui/todo-list/jibb rename-subs-sample
207+/= todo /ui/api/todo
208+
209+++ main (program init update view subs)
210+
211++$ model [todos=(list item.todo) draft=@t error=(unit @t)]
212++$ msg
213+ [%typed text=@t]
214+ %submit
215+ [%toggled id=@ud]
216+ [%got todos=(list item.todo)]
217+ [%acked err=(unit @t)]
218+
219+++ init |= ts=(list item.todo)
220+ [todos=ts draft="" error=~]
221+
222+++ update |= [=msg m=model]
223+ ?- msg
224+ [%typed t]
225+ ?- (gth (lent (tuba (trip t))) 80)
226+ %.y [m(draft=t error=`"Too long") ~]
227+ %.n [m(draft=t error=~) ~]
228+ %submit [m(draft="") ~[(poke.todo [%add draft.m] |=%acked)]]
229+ [%toggled id] [m ~[(poke.todo [%toggle id] |=%acked)]]
230+ [%got ts] [m(todos=ts) ~]
231+ [%acked err] [m(error=err) ~]
232+
233+++ subs |= mdl=model
234+ ~[[%watch (todos.todo |=%got)]]
235+
236+++ view |= m=model
237+ column ~[gap+%s2] ~[
238+ heading 2 "Todos"
239+ each (turn todos.m row-of)
240+ row ~[gap+%s1] ~[
241+ el ~[width+[%fill 1]] (field "New todo" draft.m |=%typed)
242+ button "Add" %submit
243+ el ~[tone+%danger] (text (fall error.m ""))
244+
245+++ row-of |= t=item.todo
246+ [id.t (toggle done.t text.t [%toggled id.t])]
247+#### /ui/todo-list/jibb unused-helper
248+/= todo /ui/api/todo
249+
250+++ main (program init update view subs)
251+
252++$ model [todos=(list item.todo) draft=@t error=(unit @t)]
253++$ msg
254+ [%typed text=@t]
255+ %submit
256+ [%toggled id=@ud]
257+ [%got todos=(list item.todo)]
258+ [%acked err=(unit @t)]
259+
260+++ init |= ts=(list item.todo)
261+ [todos=ts draft="" error=~]
262+
263+++ update |= [=msg m=model]
264+ ?- msg
265+ [%typed t]
266+ ?- (gth (lent (tuba (trip t))) 80)
267+ %.y [m(draft=t error=`"Too long") ~]
268+ %.n [m(draft=t error=~) ~]
269+ %submit [m(draft="") ~[(poke.todo [%add draft.m] |=%acked)]]
270+ [%toggled id] [m ~[(poke.todo [%toggle id] |=%acked)]]
271+ [%got ts] [m(todos=ts) ~]
272+ [%acked err] [m(error=err) ~]
273+
274+++ subs |= m=model
275+ ~[[%watch (todos.todo |=%got)]]
276+
277+++ view |= m=model
278+ column ~[gap+%s2] ~[
279+ heading 2 "Todos"
280+ each (turn todos.m row-of)
281+ row ~[gap+%s1] ~[
282+ el ~[width+[%fill 1]] (field "New todo" draft.m |=%typed)
283+ button "Add" %submit
284+ el ~[tone+%danger] (text (fall error.m ""))
285+
286+++ row-of |= t=item.todo
287+ [id.t (toggle done.t text.t [%toggled id.t])]
288+
289+++ count |= m=model
290+ (lent todos.m)
291+#### /ui/todo-list/jibb unused-helper-mold
292+/= todo /ui/api/todo
293+
294+++ main (program init update view subs)
295+
296++$ model [todos=(list item.todo) draft=@t error=(unit @t)]
297++$ msg
298+ [%typed text=@t]
299+ %submit
300+ [%toggled id=@ud]
301+ [%got todos=(list item.todo)]
302+ [%acked err=(unit @t)]
303+
304+++ init |= ts=(list item.todo)
305+ [todos=ts draft="" error=~]
306+
307+++ update |= [=msg m=model]
308+ ?- msg
309+ [%typed t]
310+ ?- (gth (lent (tuba (trip t))) 80)
311+ %.y [m(draft=t error=`"Too long") ~]
312+ %.n [m(draft=t error=~) ~]
313+ %submit [m(draft="") ~[(poke.todo [%add draft.m] |=%acked)]]
314+ [%toggled id] [m ~[(poke.todo [%toggle id] |=%acked)]]
315+ [%got ts] [m(todos=ts) ~]
316+ [%acked err] [m(error=err) ~]
317+
318+++ subs |= m=model
319+ ~[[%watch (todos.todo |=%got)]]
320+
321+++ view |= m=model
322+ column ~[gap+%s2] ~[
323+ heading 2 "Todos"
324+ each (turn todos.m row-of)
325+ row ~[gap+%s1] ~[
326+ el ~[width+[%fill 1]] (field "New todo" draft.m |=%typed)
327+ button "Add" %submit
328+ el ~[tone+%danger] (text (fall error.m ""))
329+
330+++ row-of |= t=item.todo
331+ [id.t (toggle done.t text.t [%toggled id.t])]
332+
333++$ flag ?
334+#### /ui/todo-list/jibb swap-model-fields
335+/= todo /ui/api/todo
336+
337+++ main (program init update view subs)
338+
339++$ model [draft=@t todos=(list item.todo) error=(unit @t)]
340++$ msg
341+ [%typed text=@t]
342+ %submit
343+ [%toggled id=@ud]
344+ [%got todos=(list item.todo)]
345+ [%acked err=(unit @t)]
346+
347+++ init |= ts=(list item.todo)
348+ [draft="" todos=ts error=~]
349+
350+++ update |= [=msg m=model]
351+ ?- msg
352+ [%typed t]
353+ ?- (gth (lent (tuba (trip t))) 80)
354+ %.y [m(draft=t error=`"Too long") ~]
355+ %.n [m(draft=t error=~) ~]
356+ %submit [m(draft="") ~[(poke.todo [%add draft.m] |=%acked)]]
357+ [%toggled id] [m ~[(poke.todo [%toggle id] |=%acked)]]
358+ [%got ts] [m(todos=ts) ~]
359+ [%acked err] [m(error=err) ~]
360+
361+++ subs |= m=model
362+ ~[[%watch (todos.todo |=%got)]]
363+
364+++ view |= m=model
365+ column ~[gap+%s2] ~[
366+ heading 2 "Todos"
367+ each (turn todos.m row-of)
368+ row ~[gap+%s1] ~[
369+ el ~[width+[%fill 1]] (field "New todo" draft.m |=%typed)
370+ button "Add" %submit
371+ el ~[tone+%danger] (text (fall error.m ""))
372+
373+++ row-of |= t=item.todo
374+ [id.t (toggle done.t text.t [%toggled id.t])]
375+#### /ui/todo-list/jibb init-cast-body
376+/= todo /ui/api/todo
377+
378+++ main (program init update view subs)
379+
380++$ model [todos=(list item.todo) draft=@t error=(unit @t)]
381++$ msg
382+ [%typed text=@t]
383+ %submit
384+ [%toggled id=@ud]
385+ [%got todos=(list item.todo)]
386+ [%acked err=(unit @t)]
387+
388+++ init |= ts=(list item.todo)
389+ ^- model [ts "" ~]
390+
391+++ update |= [=msg m=model]
392+ ?- msg
393+ [%typed t]
394+ ?- (gth (lent (tuba (trip t))) 80)
395+ %.y [m(draft=t error=`"Too long") ~]
396+ %.n [m(draft=t error=~) ~]
397+ %submit [m(draft="") ~[(poke.todo [%add draft.m] |=%acked)]]
398+ [%toggled id] [m ~[(poke.todo [%toggle id] |=%acked)]]
399+ [%got ts] [m(todos=ts) ~]
400+ [%acked err] [m(error=err) ~]
401+
402+++ subs |= m=model
403+ ~[[%watch (todos.todo |=%got)]]
404+
405+++ view |= m=model
406+ column ~[gap+%s2] ~[
407+ heading 2 "Todos"
408+ each (turn todos.m row-of)
409+ row ~[gap+%s1] ~[
410+ el ~[width+[%fill 1]] (field "New todo" draft.m |=%typed)
411+ button "Add" %submit
412+ el ~[tone+%danger] (text (fall error.m ""))
413+
414+++ row-of |= t=item.todo
415+ [id.t (toggle done.t text.t [%toggled id.t])]
416+#### /ui/todo-list/jibb init-positional
417+/= todo /ui/api/todo
418+
419+++ main (program init update view subs)
420+
421++$ model [todos=(list item.todo) draft=@t error=(unit @t)]
422++$ msg
423+ [%typed text=@t]
424+ %submit
425+ [%toggled id=@ud]
426+ [%got todos=(list item.todo)]
427+ [%acked err=(unit @t)]
428+
429+++ init |= ts=(list item.todo)
430+ [ts "" ~]
431+
432+++ update |= [=msg m=model]
433+ ?- msg
434+ [%typed t]
435+ ?- (gth (lent (tuba (trip t))) 80)
436+ %.y [m(draft=t error=`"Too long") ~]
437+ %.n [m(draft=t error=~) ~]
438+ %submit [m(draft="") ~[(poke.todo [%add draft.m] |=%acked)]]
439+ [%toggled id] [m ~[(poke.todo [%toggle id] |=%acked)]]
440+ [%got ts] [m(todos=ts) ~]
441+ [%acked err] [m(error=err) ~]
442+
443+++ subs |= m=model
444+ ~[[%watch (todos.todo |=%got)]]
445+
446+++ view |= m=model
447+ column ~[gap+%s2] ~[
448+ heading 2 "Todos"
449+ each (turn todos.m row-of)
450+ row ~[gap+%s1] ~[
451+ el ~[width+[%fill 1]] (field "New todo" draft.m |=%typed)
452+ button "Add" %submit
453+ el ~[tone+%danger] (text (fall error.m ""))
454+
455+++ row-of |= t=item.todo
456+ [id.t (toggle done.t text.t [%toggled id.t])]
457+#### /ui/todo-list/jibb second-sub-every
458+/= todo /ui/api/todo
459+
460+++ main (program init update view subs)
461+
462++$ model [todos=(list item.todo) draft=@t error=(unit @t)]
463++$ msg
464+ [%typed text=@t]
465+ %submit
466+ [%toggled id=@ud]
467+ [%got todos=(list item.todo)]
468+ [%acked err=(unit @t)]
469+ [%tick at=@da]
470+
471+++ init |= ts=(list item.todo)
472+ [todos=ts draft="" error=~]
473+
474+++ update |= [=msg m=model]
475+ ?- msg
476+ [%typed t]
477+ ?- (gth (lent (tuba (trip t))) 80)
478+ %.y [m(draft=t error=`"Too long") ~]
479+ %.n [m(draft=t error=~) ~]
480+ %submit [m(draft="") ~[(poke.todo [%add draft.m] |=%acked)]]
481+ [%toggled id] [m ~[(poke.todo [%toggle id] |=%acked)]]
482+ [%got ts] [m(todos=ts) ~]
483+ [%acked err] [m(error=err) ~]
484+ [%tick at] [m ~]
485+
486+++ subs |= m=model
487+ ~[[%watch (todos.todo |=%got)] [%every ~s30 |=%tick]]
488+
489+++ view |= m=model
490+ column ~[gap+%s2] ~[
491+ heading 2 "Todos"
492+ each (turn todos.m row-of)
493+ row ~[gap+%s1] ~[
494+ el ~[width+[%fill 1]] (field "New todo" draft.m |=%typed)
495+ button "Add" %submit
496+ el ~[tone+%danger] (text (fall error.m ""))
497+
498+++ row-of |= t=item.todo
499+ [id.t (toggle done.t text.t [%toggled id.t])]
500+#### /ui/todo-list/jibb second-sub-watch
501+/= todo /ui/api/todo
502+
503+++ main (program init update view subs)
504+
505++$ model [todos=(list item.todo) draft=@t error=(unit @t)]
506++$ msg
507+ [%typed text=@t]
508+ %submit
509+ [%toggled id=@ud]
510+ [%got todos=(list item.todo)]
511+ [%acked err=(unit @t)]
512+
513+++ init |= ts=(list item.todo)
514+ [todos=ts draft="" error=~]
515+
516+++ update |= [=msg m=model]
517+ ?- msg
518+ [%typed t]
519+ ?- (gth (lent (tuba (trip t))) 80)
520+ %.y [m(draft=t error=`"Too long") ~]
521+ %.n [m(draft=t error=~) ~]
522+ %submit [m(draft="") ~[(poke.todo [%add draft.m] |=%acked)]]
523+ [%toggled id] [m ~[(poke.todo [%toggle id] |=%acked)]]
524+ [%got ts] [m(todos=ts) ~]
525+ [%acked err] [m(error=err) ~]
526+
527+++ subs |= m=model
528+ ~[[%watch (todos.todo |=%got)] [%watch (todos.todo |=%got)]]
529+
530+++ view |= m=model
531+ column ~[gap+%s2] ~[
532+ heading 2 "Todos"
533+ each (turn todos.m row-of)
534+ row ~[gap+%s1] ~[
535+ el ~[width+[%fill 1]] (field "New todo" draft.m |=%typed)
536+ button "Add" %submit
537+ el ~[tone+%danger] (text (fall error.m ""))
538+
539+++ row-of |= t=item.todo
540+ [id.t (toggle done.t text.t [%toggled id.t])]
541+#### /ui/todo-list/jibb subs-none
542+/= todo /ui/api/todo
543+
544+++ main (program init update view subs)
545+
546++$ model [todos=(list item.todo) draft=@t error=(unit @t)]
547++$ msg
548+ [%typed text=@t]
549+ %submit
550+ [%toggled id=@ud]
551+ [%got todos=(list item.todo)]
552+ [%acked err=(unit @t)]
553+
554+++ init |= ts=(list item.todo)
555+ [todos=ts draft="" error=~]
556+
557+++ update |= [=msg m=model]
558+ ?- msg
559+ [%typed t]
560+ ?- (gth (lent (tuba (trip t))) 80)
561+ %.y [m(draft=t error=`"Too long") ~]
562+ %.n [m(draft=t error=~) ~]
563+ %submit [m(draft="") ~[(poke.todo [%add draft.m] |=%acked)]]
564+ [%toggled id] [m ~[(poke.todo [%toggle id] |=%acked)]]
565+ [%got ts] [m(todos=ts) ~]
566+ [%acked err] [m(error=err) ~]
567+
568+++ subs |=(m ~)
569+
570+++ view |= m=model
571+ column ~[gap+%s2] ~[
572+ heading 2 "Todos"
573+ each (turn todos.m row-of)
574+ row ~[gap+%s1] ~[
575+ el ~[width+[%fill 1]] (field "New todo" draft.m |=%typed)
576+ button "Add" %submit
577+ el ~[tone+%danger] (text (fall error.m ""))
578+
579+++ row-of |= t=item.todo
580+ [id.t (toggle done.t text.t [%toggled id.t])]
581+#### /ui/todo-list/jibb sixth-msg
582+/= todo /ui/api/todo
583+
584+++ main (program init update view subs)
585+
586++$ model [todos=(list item.todo) draft=@t error=(unit @t)]
587++$ msg
588+ [%typed text=@t]
589+ %submit
590+ [%toggled id=@ud]
591+ [%got todos=(list item.todo)]
592+ [%acked err=(unit @t)]
593+ %clear
594+
595+++ init |= ts=(list item.todo)
596+ [todos=ts draft="" error=~]
597+
598+++ update |= [=msg m=model]
599+ ?- msg
600+ [%typed t]
601+ ?- (gth (lent (tuba (trip t))) 80)
602+ %.y [m(draft=t error=`"Too long") ~]
603+ %.n [m(draft=t error=~) ~]
604+ %submit [m(draft="") ~[(poke.todo [%add draft.m] |=%acked)]]
605+ [%toggled id] [m ~[(poke.todo [%toggle id] |=%acked)]]
606+ [%got ts] [m(todos=ts) ~]
607+ [%acked err] [m(error=err) ~]
608+ %clear [m(todos=~) ~]
609+
610+++ subs |= m=model
611+ ~[[%watch (todos.todo |=%got)]]
612+
613+++ view |= m=model
614+ column ~[gap+%s2] ~[
615+ heading 2 "Todos"
616+ each (turn todos.m row-of)
617+ row ~[gap+%s1] ~[
618+ el ~[width+[%fill 1]] (field "New todo" draft.m |=%typed)
619+ button "Add" %submit
620+ el ~[tone+%danger] (text (fall error.m ""))
621+
622+++ row-of |= t=item.todo
623+ [id.t (toggle done.t text.t [%toggled id.t])]
624+#### /ui/todo-list/jibb sixth-msg-button
625+/= todo /ui/api/todo
626+
627+++ main (program init update view subs)
628+
629++$ model [todos=(list item.todo) draft=@t error=(unit @t)]
630++$ msg
631+ [%typed text=@t]
632+ %submit
633+ [%toggled id=@ud]
634+ [%got todos=(list item.todo)]
635+ [%acked err=(unit @t)]
636+ %clear
637+
638+++ init |= ts=(list item.todo)
639+ [todos=ts draft="" error=~]
640+
641+++ update |= [=msg m=model]
642+ ?- msg
643+ [%typed t]
644+ ?- (gth (lent (tuba (trip t))) 80)
645+ %.y [m(draft=t error=`"Too long") ~]
646+ %.n [m(draft=t error=~) ~]
647+ %submit [m(draft="") ~[(poke.todo [%add draft.m] |=%acked)]]
648+ [%toggled id] [m ~[(poke.todo [%toggle id] |=%acked)]]
649+ [%got ts] [m(todos=ts) ~]
650+ [%acked err] [m(error=err) ~]
651+ %clear [m(todos=~) ~]
652+
653+++ subs |= m=model
654+ ~[[%watch (todos.todo |=%got)]]
655+
656+++ view |= m=model
657+ column ~[gap+%s2] ~[
658+ heading 2 "Todos"
659+ each (turn todos.m row-of)
660+ row ~[gap+%s1] ~[
661+ el ~[width+[%fill 1]] (field "New todo" draft.m |=%typed)
662+ button "Add" %submit
663+ button "Clear" %clear
664+ el ~[tone+%danger] (text (fall error.m ""))
665+
666+++ row-of |= t=item.todo
667+ [id.t (toggle done.t text.t [%toggled id.t])]
668+#### /ui/todo-list/jibb view-helper-title
669+/= todo /ui/api/todo
670+
671+++ main (program init update view subs)
672+
673++$ model [todos=(list item.todo) draft=@t error=(unit @t)]
674++$ msg
675+ [%typed text=@t]
676+ %submit
677+ [%toggled id=@ud]
678+ [%got todos=(list item.todo)]
679+ [%acked err=(unit @t)]
680+
681+++ init |= ts=(list item.todo)
682+ [todos=ts draft="" error=~]
683+
684+++ update |= [=msg m=model]
685+ ?- msg
686+ [%typed t]
687+ ?- (gth (lent (tuba (trip t))) 80)
688+ %.y [m(draft=t error=`"Too long") ~]
689+ %.n [m(draft=t error=~) ~]
690+ %submit [m(draft="") ~[(poke.todo [%add draft.m] |=%acked)]]
691+ [%toggled id] [m ~[(poke.todo [%toggle id] |=%acked)]]
692+ [%got ts] [m(todos=ts) ~]
693+ [%acked err] [m(error=err) ~]
694+
695+++ subs |= m=model
696+ ~[[%watch (todos.todo |=%got)]]
697+
698+++ view |= m=model
699+ column ~[gap+%s2] ~[
700+ (title "Todos")
701+ each (turn todos.m row-of)
702+ row ~[gap+%s1] ~[
703+ el ~[width+[%fill 1]] (field "New todo" draft.m |=%typed)
704+ button "Add" %submit
705+ el ~[tone+%danger] (text (fall error.m ""))
706+
707+++ row-of |= t=item.todo
708+ [id.t (toggle done.t text.t [%toggled id.t])]
709+
710+++ title |= words=@t
711+ heading 2 words
712+#### /ui/todo-list/jibb view-helper-error
713+/= todo /ui/api/todo
714+
715+++ main (program init update view subs)
716+
717++$ model [todos=(list item.todo) draft=@t error=(unit @t)]
718++$ msg
719+ [%typed text=@t]
720+ %submit
721+ [%toggled id=@ud]
722+ [%got todos=(list item.todo)]
723+ [%acked err=(unit @t)]
724+
725+++ init |= ts=(list item.todo)
726+ [todos=ts draft="" error=~]
727+
728+++ update |= [=msg m=model]
729+ ?- msg
730+ [%typed t]
731+ ?- (gth (lent (tuba (trip t))) 80)
732+ %.y [m(draft=t error=`"Too long") ~]
733+ %.n [m(draft=t error=~) ~]
734+ %submit [m(draft="") ~[(poke.todo [%add draft.m] |=%acked)]]
735+ [%toggled id] [m ~[(poke.todo [%toggle id] |=%acked)]]
736+ [%got ts] [m(todos=ts) ~]
737+ [%acked err] [m(error=err) ~]
738+
739+++ subs |= m=model
740+ ~[[%watch (todos.todo |=%got)]]
741+
742+++ view |= m=model
743+ column ~[gap+%s2] ~[
744+ heading 2 "Todos"
745+ each (turn todos.m row-of)
746+ row ~[gap+%s1] ~[
747+ el ~[width+[%fill 1]] (field "New todo" draft.m |=%typed)
748+ button "Add" %submit
749+ (error-line m)
750+
751+++ row-of |= t=item.todo
752+ [id.t (toggle done.t text.t [%toggled id.t])]
753+
754+++ error-line |= m=model
755+ el ~[tone+%danger] (text (fall error.m ""))
756+#### /ui/todo-list/jibb inline-row-of
757+/= todo /ui/api/todo
758+
759+++ main (program init update view subs)
760+
761++$ model [todos=(list item.todo) draft=@t error=(unit @t)]
762++$ msg
763+ [%typed text=@t]
764+ %submit
765+ [%toggled id=@ud]
766+ [%got todos=(list item.todo)]
767+ [%acked err=(unit @t)]
768+
769+++ init |= ts=(list item.todo)
770+ [todos=ts draft="" error=~]
771+
772+++ update |= [=msg m=model]
773+ ?- msg
774+ [%typed t]
775+ ?- (gth (lent (tuba (trip t))) 80)
776+ %.y [m(draft=t error=`"Too long") ~]
777+ %.n [m(draft=t error=~) ~]
778+ %submit [m(draft="") ~[(poke.todo [%add draft.m] |=%acked)]]
779+ [%toggled id] [m ~[(poke.todo [%toggle id] |=%acked)]]
780+ [%got ts] [m(todos=ts) ~]
781+ [%acked err] [m(error=err) ~]
782+
783+++ subs |= m=model
784+ ~[[%watch (todos.todo |=%got)]]
785+
786+++ view |= m=model
787+ column ~[gap+%s2] ~[
788+ heading 2 "Todos"
789+ each (turn todos.m |=(t=item.todo [id.t (toggle done.t text.t [%toggled id.t])]))
790+ row ~[gap+%s1] ~[
791+ el ~[width+[%fill 1]] (field "New todo" draft.m |=%typed)
792+ button "Add" %submit
793+ el ~[tone+%danger] (text (fall error.m ""))
794+#### /ui/todo-list/jibb view-local-rows
795+/= todo /ui/api/todo
796+
797+++ main (program init update view subs)
798+
799++$ model [todos=(list item.todo) draft=@t error=(unit @t)]
800++$ msg
801+ [%typed text=@t]
802+ %submit
803+ [%toggled id=@ud]
804+ [%got todos=(list item.todo)]
805+ [%acked err=(unit @t)]
806+
807+++ init |= ts=(list item.todo)
808+ [todos=ts draft="" error=~]
809+
810+++ update |= [=msg m=model]
811+ ?- msg
812+ [%typed t]
813+ ?- (gth (lent (tuba (trip t))) 80)
814+ %.y [m(draft=t error=`"Too long") ~]
815+ %.n [m(draft=t error=~) ~]
816+ %submit [m(draft="") ~[(poke.todo [%add draft.m] |=%acked)]]
817+ [%toggled id] [m ~[(poke.todo [%toggle id] |=%acked)]]
818+ [%got ts] [m(todos=ts) ~]
819+ [%acked err] [m(error=err) ~]
820+
821+++ subs |= m=model
822+ ~[[%watch (todos.todo |=%got)]]
823+
824+++ view |= m=model
825+ ++ rows (turn todos.m row-of)
826+ column ~[gap+%s2] ~[
827+ heading 2 "Todos"
828+ each rows
829+ row ~[gap+%s1] ~[
830+ el ~[width+[%fill 1]] (field "New todo" draft.m |=%typed)
831+ button "Add" %submit
832+ el ~[tone+%danger] (text (fall error.m ""))
833+
834+++ row-of |= t=item.todo
835+ [id.t (toggle done.t text.t [%toggled id.t])]
836+#### /ui/todo-list/jibb drop-each
837+/= todo /ui/api/todo
838+
839+++ main (program init update view subs)
840+
841++$ model [todos=(list item.todo) draft=@t error=(unit @t)]
842++$ msg
843+ [%typed text=@t]
844+ %submit
845+ [%toggled id=@ud]
846+ [%got todos=(list item.todo)]
847+ [%acked err=(unit @t)]
848+
849+++ init |= ts=(list item.todo)
850+ [todos=ts draft="" error=~]
851+
852+++ update |= [=msg m=model]
853+ ?- msg
854+ [%typed t]
855+ ?- (gth (lent (tuba (trip t))) 80)
856+ %.y [m(draft=t error=`"Too long") ~]
857+ %.n [m(draft=t error=~) ~]
858+ %submit [m(draft="") ~[(poke.todo [%add draft.m] |=%acked)]]
859+ [%toggled id] [m ~[(poke.todo [%toggle id] |=%acked)]]
860+ [%got ts] [m(todos=ts) ~]
861+ [%acked err] [m(error=err) ~]
862+
863+++ subs |= m=model
864+ ~[[%watch (todos.todo |=%got)]]
865+
866+++ view |= m=model
867+ column ~[gap+%s2] ~[
868+ heading 2 "Todos"
869+ row ~[gap+%s1] ~[
870+ el ~[width+[%fill 1]] (field "New todo" draft.m |=%typed)
871+ button "Add" %submit
872+ el ~[tone+%danger] (text (fall error.m ""))
873+
874+++ row-of |= t=item.todo
875+ [id.t (toggle done.t text.t [%toggled id.t])]
876+#### /ui/todo-list/jibb update-helper-cmd
877+/= todo /ui/api/todo
878+
879+++ main (program init update view subs)
880+
881++$ model [todos=(list item.todo) draft=@t error=(unit @t)]
882++$ msg
883+ [%typed text=@t]
884+ %submit
885+ [%toggled id=@ud]
886+ [%got todos=(list item.todo)]
887+ [%acked err=(unit @t)]
888+
889+++ init |= ts=(list item.todo)
890+ [todos=ts draft="" error=~]
891+
892+++ update |= [=msg m=model]
893+ ?- msg
894+ [%typed t]
895+ ?- (gth (lent (tuba (trip t))) 80)
896+ %.y [m(draft=t error=`"Too long") ~]
897+ %.n [m(draft=t error=~) ~]
898+ %submit [m(draft="") ~[(add-cmd draft.m)]]
899+ [%toggled id] [m ~[(poke.todo [%toggle id] |=%acked)]]
900+ [%got ts] [m(todos=ts) ~]
901+ [%acked err] [m(error=err) ~]
902+
903+++ subs |= m=model
904+ ~[[%watch (todos.todo |=%got)]]
905+
906+++ view |= m=model
907+ column ~[gap+%s2] ~[
908+ heading 2 "Todos"
909+ each (turn todos.m row-of)
910+ row ~[gap+%s1] ~[
911+ el ~[width+[%fill 1]] (field "New todo" draft.m |=%typed)
912+ button "Add" %submit
913+ el ~[tone+%danger] (text (fall error.m ""))
914+
915+++ row-of |= t=item.todo
916+ [id.t (toggle done.t text.t [%toggled id.t])]
917+
918+++ add-cmd |= d=@t
919+ (poke.todo [%add d] |=%acked)
docs/reviews/2026-11-03-milestone-2-probes/variants/p2.outnew file+185
@@ -0,0 +1,185 @@
1+#### /ui/todo-list/jibb control
2+CHECKED
3++$ model: [todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]]
4++$ msg: msg
5+++ main: [init=$-((list [id=@ud [done=? text=@t]]) [todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]]) [update=$-([msg [todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]]] [[todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]] (list (cmd msg))]) [view=$-([todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]] (element msg)) subs=$-([todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]] (list (sub msg)))]]]
6+++ init: $-((list [id=@ud [done=? text=@t]]) [todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]])
7+++ view: $-([todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]] (element msg))
8+++ row-of: $-([id=@ud [done=? text=@t]] [key=@ud el=(element msg)])
9+++ subs: $-([todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]] (list (sub msg)))
10+++ update: $-([msg=msg m=[todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]]] [[todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]] (list (cmd msg))])
11+#### /ui/todo-list/jibb reorder
12+CHECKED
13++$ model: [todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]]
14++$ msg: msg
15+++ main: [init=$-((list [id=@ud [done=? text=@t]]) [todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]]) [update=$-([msg [todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]]] [[todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]] (list (cmd msg))]) [view=$-([todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]] (element msg)) subs=$-([todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]] (list (sub msg)))]]]
16+++ init: $-((list [id=@ud [done=? text=@t]]) [todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]])
17+++ view: $-([todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]] (element msg))
18+++ row-of: $-([id=@ud [done=? text=@t]] [key=@ud el=(element msg)])
19+++ subs: $-([todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]] (list (sub msg)))
20+++ update: $-([msg=msg m=[todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]]] [[todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]] (list (cmd msg))])
21+#### /ui/todo-list/jibb rename-view-sample
22+CHECKED
23++$ model: [todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]]
24++$ msg: msg
25+++ main: [init=$-((list [id=@ud [done=? text=@t]]) [todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]]) [update=$-([msg [todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]]] [[todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]] (list (cmd msg))]) [view=$-([todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]] (element msg)) subs=$-([todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]] (list (sub msg)))]]]
26+++ init: $-((list [id=@ud [done=? text=@t]]) [todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]])
27+++ view: $-([todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]] (element msg))
28+++ row-of: $-([id=@ud [done=? text=@t]] [key=@ud el=(element msg)])
29+++ subs: $-([todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]] (list (sub msg)))
30+++ update: $-([msg=msg m=[todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]]] [[todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]] (list (cmd msg))])
31+#### /ui/todo-list/jibb rename-row-sample
32+CHECKED
33++$ model: [todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]]
34++$ msg: msg
35+++ main: [init=$-((list [id=@ud [done=? text=@t]]) [todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]]) [update=$-([msg [todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]]] [[todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]] (list (cmd msg))]) [view=$-([todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]] (element msg)) subs=$-([todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]] (list (sub msg)))]]]
36+++ init: $-((list [id=@ud [done=? text=@t]]) [todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]])
37+++ view: $-([todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]] (element msg))
38+++ row-of: $-([id=@ud [done=? text=@t]] [key=@ud el=(element msg)])
39+++ subs: $-([todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]] (list (sub msg)))
40+++ update: $-([msg=msg m=[todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]]] [[todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]] (list (cmd msg))])
41+#### /ui/todo-list/jibb rename-init-sample
42+CHECKED
43++$ model: [todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]]
44++$ msg: msg
45+++ main: [init=$-((list [id=@ud [done=? text=@t]]) [todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]]) [update=$-([msg [todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]]] [[todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]] (list (cmd msg))]) [view=$-([todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]] (element msg)) subs=$-([todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]] (list (sub msg)))]]]
46+++ init: $-((list [id=@ud [done=? text=@t]]) [todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]])
47+++ view: $-([todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]] (element msg))
48+++ row-of: $-([id=@ud [done=? text=@t]] [key=@ud el=(element msg)])
49+++ subs: $-([todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]] (list (sub msg)))
50+++ update: $-([msg=msg m=[todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]]] [[todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]] (list (cmd msg))])
51+#### /ui/todo-list/jibb rename-subs-sample
52+CHECKED
53++$ model: [todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]]
54++$ msg: msg
55+++ main: [init=$-((list [id=@ud [done=? text=@t]]) [todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]]) [update=$-([msg [todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]]] [[todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]] (list (cmd msg))]) [view=$-([todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]] (element msg)) subs=$-([todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]] (list (sub msg)))]]]
56+++ init: $-((list [id=@ud [done=? text=@t]]) [todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]])
57+++ view: $-([todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]] (element msg))
58+++ row-of: $-([id=@ud [done=? text=@t]] [key=@ud el=(element msg)])
59+++ subs: $-([todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]] (list (sub msg)))
60+++ update: $-([msg=msg m=[todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]]] [[todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]] (list (cmd msg))])
61+#### /ui/todo-list/jibb unused-helper
62+CHECKED
63++$ model: [todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]]
64++$ msg: msg
65+++ main: [init=$-((list [id=@ud [done=? text=@t]]) [todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]]) [update=$-([msg [todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]]] [[todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]] (list (cmd msg))]) [view=$-([todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]] (element msg)) subs=$-([todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]] (list (sub msg)))]]]
66+++ init: $-((list [id=@ud [done=? text=@t]]) [todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]])
67+++ view: $-([todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]] (element msg))
68+++ row-of: $-([id=@ud [done=? text=@t]] [key=@ud el=(element msg)])
69+++ subs: $-([todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]] (list (sub msg)))
70+++ update: $-([msg=msg m=[todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]]] [[todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]] (list (cmd msg))])
71+++ count: $-([todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]] @ud)
72+#### /ui/todo-list/jibb unused-helper-mold
73+CHECKED
74++$ model: [todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]]
75++$ msg: msg
76++$ flag: ?
77+++ main: [init=$-((list [id=@ud [done=? text=@t]]) [todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]]) [update=$-([msg [todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]]] [[todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]] (list (cmd msg))]) [view=$-([todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]] (element msg)) subs=$-([todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]] (list (sub msg)))]]]
78+++ init: $-((list [id=@ud [done=? text=@t]]) [todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]])
79+++ view: $-([todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]] (element msg))
80+++ row-of: $-([id=@ud [done=? text=@t]] [key=@ud el=(element msg)])
81+++ subs: $-([todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]] (list (sub msg)))
82+++ update: $-([msg=msg m=[todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]]] [[todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]] (list (cmd msg))])
83+#### /ui/todo-list/jibb swap-model-fields
84+CHECKED
85++$ model: [draft=@t [todos=(list [id=@ud [done=? text=@t]]) error=(unit @t)]]
86++$ msg: msg
87+++ main: [init=$-((list [id=@ud [done=? text=@t]]) [draft=@t [todos=(list [id=@ud [done=? text=@t]]) error=(unit @t)]]) [update=$-([msg [draft=@t [todos=(list [id=@ud [done=? text=@t]]) error=(unit @t)]]] [[draft=@t [todos=(list [id=@ud [done=? text=@t]]) error=(unit @t)]] (list (cmd msg))]) [view=$-([draft=@t [todos=(list [id=@ud [done=? text=@t]]) error=(unit @t)]] (element msg)) subs=$-([draft=@t [todos=(list [id=@ud [done=? text=@t]]) error=(unit @t)]] (list (sub msg)))]]]
88+++ init: $-((list [id=@ud [done=? text=@t]]) [draft=@t [todos=(list [id=@ud [done=? text=@t]]) error=(unit @t)]])
89+++ view: $-([draft=@t [todos=(list [id=@ud [done=? text=@t]]) error=(unit @t)]] (element msg))
90+++ row-of: $-([id=@ud [done=? text=@t]] [key=@ud el=(element msg)])
91+++ subs: $-([draft=@t [todos=(list [id=@ud [done=? text=@t]]) error=(unit @t)]] (list (sub msg)))
92+++ update: $-([msg=msg m=[draft=@t [todos=(list [id=@ud [done=? text=@t]]) error=(unit @t)]]] [[draft=@t [todos=(list [id=@ud [done=? text=@t]]) error=(unit @t)]] (list (cmd msg))])
93+#### /ui/todo-list/jibb init-cast-body
94+CHECKED
95++$ model: [todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]]
96++$ msg: msg
97+++ main: [init=$-((list [id=@ud [done=? text=@t]]) [todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]]) [update=$-([msg [todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]]] [[todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]] (list (cmd msg))]) [view=$-([todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]] (element msg)) subs=$-([todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]] (list (sub msg)))]]]
98+++ view: $-([todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]] (element msg))
99+++ row-of: $-([id=@ud [done=? text=@t]] [key=@ud el=(element msg)])
100+++ subs: $-([todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]] (list (sub msg)))
101+++ update: $-([msg=msg m=[todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]]] [[todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]] (list (cmd msg))])
102+++ init: $-((list [id=@ud [done=? text=@t]]) [todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]])
103+#### /ui/todo-list/jibb init-positional
104+CHECKED
105++$ model: [todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]]
106++$ msg: msg
107+++ main: [init=$-((list [id=@ud [done=? text=@t]]) [todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]]) [update=$-([msg [todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]]] [[todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]] (list (cmd msg))]) [view=$-([todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]] (element msg)) subs=$-([todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]] (list (sub msg)))]]]
108+++ init: $-((list [id=@ud [done=? text=@t]]) [todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]])
109+++ view: $-([todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]] (element msg))
110+++ row-of: $-([id=@ud [done=? text=@t]] [key=@ud el=(element msg)])
111+++ subs: $-([todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]] (list (sub msg)))
112+++ update: $-([msg=msg m=[todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]]] [[todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]] (list (cmd msg))])
113+#### /ui/todo-list/jibb second-sub-every
114+REJECTED: module kind needs unsupported inference: /ui/todo-list/jibb
115+#### /ui/todo-list/jibb second-sub-watch
116+REJECTED: /ui/todo-list.jibb:14:28: nothing fixes the union of ~
117+ [todos=ts draft="" error=~]
118+ ^
119+#### /ui/todo-list/jibb subs-none
120+REJECTED: /ui/todo-list.jibb:14:28: nothing fixes the union of ~
121+ [todos=ts draft="" error=~]
122+ ^
123+#### /ui/todo-list/jibb sixth-msg
124+CHECKED
125++$ model: [todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]]
126++$ msg: msg
127+++ main: [init=$-((list [id=@ud [done=? text=@t]]) [todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]]) [update=$-([msg [todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]]] [[todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]] (list (cmd msg))]) [view=$-([todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]] (element msg)) subs=$-([todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]] (list (sub msg)))]]]
128+++ init: $-((list [id=@ud [done=? text=@t]]) [todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]])
129+++ view: $-([todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]] (element msg))
130+++ row-of: $-([id=@ud [done=? text=@t]] [key=@ud el=(element msg)])
131+++ subs: $-([todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]] (list (sub msg)))
132+++ update: $-([msg=msg m=[todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]]] [[todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]] (list (cmd msg))])
133+#### /ui/todo-list/jibb sixth-msg-button
134+CHECKED
135++$ model: [todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]]
136++$ msg: msg
137+++ main: [init=$-((list [id=@ud [done=? text=@t]]) [todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]]) [update=$-([msg [todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]]] [[todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]] (list (cmd msg))]) [view=$-([todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]] (element msg)) subs=$-([todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]] (list (sub msg)))]]]
138+++ init: $-((list [id=@ud [done=? text=@t]]) [todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]])
139+++ view: $-([todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]] (element msg))
140+++ row-of: $-([id=@ud [done=? text=@t]] [key=@ud el=(element msg)])
141+++ subs: $-([todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]] (list (sub msg)))
142+++ update: $-([msg=msg m=[todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]]] [[todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]] (list (cmd msg))])
143+#### /ui/todo-list/jibb view-helper-title
144+CHECKED
145++$ model: [todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]]
146++$ msg: msg
147+++ main: [init=$-((list [id=@ud [done=? text=@t]]) [todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]]) [update=$-([msg [todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]]] [[todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]] (list (cmd msg))]) [view=$-([todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]] (element msg)) subs=$-([todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]] (list (sub msg)))]]]
148+++ init: $-((list [id=@ud [done=? text=@t]]) [todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]])
149+++ view: $-([todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]] (element msg))
150+++ row-of: $-([id=@ud [done=? text=@t]] [key=@ud el=(element msg)])
151+++ subs: $-([todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]] (list (sub msg)))
152+++ update: $-([msg=msg m=[todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]]] [[todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]] (list (cmd msg))])
153+++ title: $-(@t (element A))
154+#### /ui/todo-list/jibb view-helper-error
155+CHECKED
156++$ model: [todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]]
157++$ msg: msg
158+++ main: [init=$-((list [id=@ud [done=? text=@t]]) [todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]]) [update=$-([msg [todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]]] [[todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]] (list (cmd msg))]) [view=$-([todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]] (element msg)) subs=$-([todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]] (list (sub msg)))]]]
159+++ init: $-((list [id=@ud [done=? text=@t]]) [todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]])
160+++ view: $-([todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]] (element msg))
161+++ row-of: $-([id=@ud [done=? text=@t]] [key=@ud el=(element msg)])
162+++ subs: $-([todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]] (list (sub msg)))
163+++ update: $-([msg=msg m=[todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]]] [[todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]] (list (cmd msg))])
164+++ error-line: $-([todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]] (element A))
165+#### /ui/todo-list/jibb inline-row-of
166+REJECTED: /ui/todo-list.jibb:14:28: nothing fixes the union of ~
167+ [todos=ts draft="" error=~]
168+ ^
169+#### /ui/todo-list/jibb view-local-rows
170+REJECTED: /ui/todo-list.jibb:14:28: nothing fixes the union of ~
171+ [todos=ts draft="" error=~]
172+ ^
173+#### /ui/todo-list/jibb drop-each
174+REJECTED: /ui/todo-list.jibb:39:32: nothing fixes the union of %toggled
175+ [id.t (toggle done.t text.t [%toggled id.t])]
176+ ^
177+#### /ui/todo-list/jibb update-helper-cmd
178+REJECTED: /ui/todo-list.jibb:14:28: nothing fixes the union of ~
179+ [todos=ts draft="" error=~]
180+ ^
181+
182+
183+real 1m14.273s
184+user 1m13.404s
185+sys 0m0.129s
docs/reviews/2026-11-03-milestone-2-probes/variants/p3.jibbnew file+712
@@ -0,0 +1,712 @@
1+#### /ui/stores/cart/jibb cart-reorder
2++$ poke
3+ [%add item=@t]
4+ %toggle
5+++ update |= [a=poke s=state]
6+ ?- a
7+ [%add item] s(items=[item items.s])
8+ %toggle s(open=(not open.s))
9+++ init ^- state [items=~ open=%.n]
10+++ main (store init update)
11++$ state [items=(list @t) open=?]
12+#### /ui/stores/cart/jibb cart-init-uncast
13+:: /ui/stores/cart.jibb
14++$ state [items=(list @t) open=?]
15++$ poke
16+ [%add item=@t]
17+ %toggle
18+
19+++ main (store init update)
20+++ init [items=~ open=%.n]
21+++ update |= [a=poke s=state]
22+ ?- a
23+ [%add item] s(items=[item items.s])
24+ %toggle s(open=(not open.s))
25+#### /ui/stores/cart/jibb cart-rename
26+:: /ui/stores/cart.jibb
27++$ state [items=(list @t) open=?]
28++$ poke
29+ [%add item=@t]
30+ %toggle
31+
32+++ main (store init update)
33+++ init ^- state [items=~ open=%.n]
34+++ update |= [p=poke st=state]
35+ ?- p
36+ [%add item] st(items=[item items.st])
37+ %toggle st(open=(not open.st))
38+#### /ui/stores/cart/jibb cart-third-case
39+:: /ui/stores/cart.jibb
40++$ state [items=(list @t) open=?]
41++$ poke
42+ [%add item=@t]
43+ %toggle
44+ %clear
45+
46+++ main (store init update)
47+++ init ^- state [items=~ open=%.n]
48+++ update |= [a=poke s=state]
49+ ?- a
50+ [%add item] s(items=[item items.s])
51+ %toggle s(open=(not open.s))
52+ %clear s(items=~)
53+#### /ui/stores/cart/jibb cart-unused-helper
54+:: /ui/stores/cart.jibb
55++$ state [items=(list @t) open=?]
56++$ poke
57+ [%add item=@t]
58+ %toggle
59+
60+++ main (store init update)
61+++ init ^- state [items=~ open=%.n]
62+++ update |= [a=poke s=state]
63+ ?- a
64+ [%add item] s(items=[item items.s])
65+ %toggle s(open=(not open.s))
66+++ size |= s=state
67+ (lent items.s)
68+#### /ui/stores/cart/jibb cart-swap-fields
69+:: /ui/stores/cart.jibb
70++$ state [open=? items=(list @t)]
71++$ poke
72+ [%add item=@t]
73+ %toggle
74+
75+++ main (store init update)
76+++ init ^- state [open=%.n items=~]
77+++ update |= [a=poke s=state]
78+ ?- a
79+ [%add item] s(items=[item items.s])
80+ %toggle s(open=(not open.s))
81+#### /ui/stores/cart/jibb cart-update-helper
82+:: /ui/stores/cart.jibb
83++$ state [items=(list @t) open=?]
84++$ poke
85+ [%add item=@t]
86+ %toggle
87+
88+++ main (store init update)
89+++ init ^- state [items=~ open=%.n]
90+++ update |= [a=poke s=state]
91+ ?- a
92+ [%add item] s(items=[item items.s])
93+ %toggle (flip s)
94+++ flip |= s=state
95+ s(open=(not open.s))
96+#### /ui/basket/jibb basket-control
97+:: /ui/basket.jibb
98+/= cart /ui/stores/cart
99+
100+++ main (program init update view subs)
101+
102++$ model [cart=state.cart note=@t]
103++$ msg
104+ [%noted text=@t]
105+ %add
106+ %toggle
107+ [%got cart=state.cart]
108+ [%acked err=(unit @t)]
109+
110+++ init |= ~
111+ [cart=[items=~ open=%.n] note=""]
112+
113+++ update |= [=msg m=model]
114+ ?- msg
115+ [%noted t] [m(note=t) ~]
116+ %add [m(note="") ~[(poke.cart [%add note.m] |=%acked)]]
117+ %toggle [m ~[(poke.cart %toggle |=%acked)]]
118+ [%got c] [m(cart=c) ~]
119+ [%acked err] [m ~]
120+
121+++ subs |= m=model
122+ ~[[%watch (state.cart |=%got)]]
123+
124+++ view |= m=model
125+ column ~[gap+%s1] ~[
126+ (text "{(lent items.cart.m)} items")
127+ field "Item" note.m |=%noted
128+ button "Add" %add
129+#### /ui/basket/jibb basket-init-cast
130+:: /ui/basket.jibb
131+/= cart /ui/stores/cart
132+
133+++ main (program init update view subs)
134+
135++$ model [cart=state.cart note=@t]
136++$ msg
137+ [%noted text=@t]
138+ %add
139+ %toggle
140+ [%got cart=state.cart]
141+ [%acked err=(unit @t)]
142+
143+++ init |= ~
144+ ^- model [[~ %.n] ""]
145+
146+++ update |= [=msg m=model]
147+ ?- msg
148+ [%noted t] [m(note=t) ~]
149+ %add [m(note="") ~[(poke.cart [%add note.m] |=%acked)]]
150+ %toggle [m ~[(poke.cart %toggle |=%acked)]]
151+ [%got c] [m(cart=c) ~]
152+ [%acked err] [m ~]
153+
154+++ subs |= m=model
155+ ~[[%watch (state.cart |=%got)]]
156+
157+++ view |= m=model
158+ column ~[gap+%s1] ~[
159+ (text "{(lent items.cart.m)} items")
160+ field "Item" note.m |=%noted
161+ button "Add" %add
162+#### /ui/basket/jibb basket-rename-view
163+:: /ui/basket.jibb
164+/= cart /ui/stores/cart
165+
166+++ main (program init update view subs)
167+
168++$ model [cart=state.cart note=@t]
169++$ msg
170+ [%noted text=@t]
171+ %add
172+ %toggle
173+ [%got cart=state.cart]
174+ [%acked err=(unit @t)]
175+
176+++ init |= ~
177+ [cart=[items=~ open=%.n] note=""]
178+
179+++ update |= [=msg m=model]
180+ ?- msg
181+ [%noted t] [m(note=t) ~]
182+ %add [m(note="") ~[(poke.cart [%add note.m] |=%acked)]]
183+ %toggle [m ~[(poke.cart %toggle |=%acked)]]
184+ [%got c] [m(cart=c) ~]
185+ [%acked err] [m ~]
186+
187+++ subs |= m=model
188+ ~[[%watch (state.cart |=%got)]]
189+
190+++ view |= mdl=model
191+ column ~[gap+%s1] ~[
192+ (text "{(lent items.cart.mdl)} items")
193+ field "Item" note.mdl |=%noted
194+ button "Add" %add
195+#### /ui/basket/jibb basket-sixth-msg
196+:: /ui/basket.jibb
197+/= cart /ui/stores/cart
198+
199+++ main (program init update view subs)
200+
201++$ model [cart=state.cart note=@t]
202++$ msg
203+ [%noted text=@t]
204+ %add
205+ %toggle
206+ [%got cart=state.cart]
207+ [%acked err=(unit @t)]
208+ %clear
209+
210+++ init |= ~
211+ [cart=[items=~ open=%.n] note=""]
212+
213+++ update |= [=msg m=model]
214+ ?- msg
215+ [%noted t] [m(note=t) ~]
216+ %add [m(note="") ~[(poke.cart [%add note.m] |=%acked)]]
217+ %toggle [m ~[(poke.cart %toggle |=%acked)]]
218+ [%got c] [m(cart=c) ~]
219+ [%acked err] [m ~]
220+ %clear [m(note="") ~]
221+
222+++ subs |= m=model
223+ ~[[%watch (state.cart |=%got)]]
224+
225+++ view |= m=model
226+ column ~[gap+%s1] ~[
227+ (text "{(lent items.cart.m)} items")
228+ field "Item" note.m |=%noted
229+ button "Add" %add
230+ button "Clear" %clear
231+#### /ui/basket/jibb basket-second-sub
232+:: /ui/basket.jibb
233+/= cart /ui/stores/cart
234+
235+++ main (program init update view subs)
236+
237++$ model [cart=state.cart note=@t]
238++$ msg
239+ [%noted text=@t]
240+ %add
241+ %toggle
242+ [%got cart=state.cart]
243+ [%acked err=(unit @t)]
244+ [%tick at=@da]
245+
246+++ init |= ~
247+ [cart=[items=~ open=%.n] note=""]
248+
249+++ update |= [=msg m=model]
250+ ?- msg
251+ [%noted t] [m(note=t) ~]
252+ %add [m(note="") ~[(poke.cart [%add note.m] |=%acked)]]
253+ %toggle [m ~[(poke.cart %toggle |=%acked)]]
254+ [%got c] [m(cart=c) ~]
255+ [%acked err] [m ~]
256+ [%tick at] [m ~]
257+
258+++ subs |= m=model
259+ ~[[%watch (state.cart |=%got)] [%every ~s30 |=%tick]]
260+
261+++ view |= m=model
262+ column ~[gap+%s1] ~[
263+ (text "{(lent items.cart.m)} items")
264+ field "Item" note.m |=%noted
265+ button "Add" %add
266+#### /ui/basket/jibb basket-view-helper
267+:: /ui/basket.jibb
268+/= cart /ui/stores/cart
269+
270+++ main (program init update view subs)
271+
272++$ model [cart=state.cart note=@t]
273++$ msg
274+ [%noted text=@t]
275+ %add
276+ %toggle
277+ [%got cart=state.cart]
278+ [%acked err=(unit @t)]
279+
280+++ init |= ~
281+ [cart=[items=~ open=%.n] note=""]
282+
283+++ update |= [=msg m=model]
284+ ?- msg
285+ [%noted t] [m(note=t) ~]
286+ %add [m(note="") ~[(poke.cart [%add note.m] |=%acked)]]
287+ %toggle [m ~[(poke.cart %toggle |=%acked)]]
288+ [%got c] [m(cart=c) ~]
289+ [%acked err] [m ~]
290+
291+++ subs |= m=model
292+ ~[[%watch (state.cart |=%got)]]
293+
294+++ view |= m=model
295+ column ~[gap+%s1] ~[
296+ (count-line m)
297+ field "Item" note.m |=%noted
298+ button "Add" %add
299+
300+++ count-line |= m=model
301+ text "{(lent items.cart.m)} items"
302+#### /ui/basket/jibb basket-swap-fields
303+:: /ui/basket.jibb
304+/= cart /ui/stores/cart
305+
306+++ main (program init update view subs)
307+
308++$ model [note=@t cart=state.cart]
309++$ msg
310+ [%noted text=@t]
311+ %add
312+ %toggle
313+ [%got cart=state.cart]
314+ [%acked err=(unit @t)]
315+
316+++ init |= ~
317+ [note="" cart=[items=~ open=%.n]]
318+
319+++ update |= [=msg m=model]
320+ ?- msg
321+ [%noted t] [m(note=t) ~]
322+ %add [m(note="") ~[(poke.cart [%add note.m] |=%acked)]]
323+ %toggle [m ~[(poke.cart %toggle |=%acked)]]
324+ [%got c] [m(cart=c) ~]
325+ [%acked err] [m ~]
326+
327+++ subs |= m=model
328+ ~[[%watch (state.cart |=%got)]]
329+
330+++ view |= m=model
331+ column ~[gap+%s1] ~[
332+ (text "{(lent items.cart.m)} items")
333+ field "Item" note.m |=%noted
334+ button "Add" %add
335+#### /ui/basket/jibb basket-unused-helper
336+:: /ui/basket.jibb
337+/= cart /ui/stores/cart
338+
339+++ main (program init update view subs)
340+
341++$ model [cart=state.cart note=@t]
342++$ msg
343+ [%noted text=@t]
344+ %add
345+ %toggle
346+ [%got cart=state.cart]
347+ [%acked err=(unit @t)]
348+
349+++ init |= ~
350+ [cart=[items=~ open=%.n] note=""]
351+
352+++ update |= [=msg m=model]
353+ ?- msg
354+ [%noted t] [m(note=t) ~]
355+ %add [m(note="") ~[(poke.cart [%add note.m] |=%acked)]]
356+ %toggle [m ~[(poke.cart %toggle |=%acked)]]
357+ [%got c] [m(cart=c) ~]
358+ [%acked err] [m ~]
359+
360+++ subs |= m=model
361+ ~[[%watch (state.cart |=%got)]]
362+
363+++ view |= m=model
364+ column ~[gap+%s1] ~[
365+ (text "{(lent items.cart.m)} items")
366+ field "Item" note.m |=%noted
367+ button "Add" %add
368+
369+++ empty |= m=model
370+ (eq items.cart.m ~)
371+#### /ui/index/jibb index-reorder
372+/= todo /ui/api/todo
373+/= todo-list /ui/todo-list
374+
375+++ view |= ts=(list item.todo)
376+ column ~[pad+%s3] ~[
377+ heading 1 "My ship"
378+ island main.todo-list ts
379+
380+++ load |=(~ (todos.todo same))
381+++ main (page load view)
382+#### /ui/index/jibb index-rename
383+/= todo /ui/api/todo
384+/= todo-list /ui/todo-list
385+
386+++ main (page load view)
387+++ load |=(~ (todos.todo same))
388+
389+++ view |= items=(list item.todo)
390+ column ~[pad+%s3] ~[
391+ heading 1 "My ship"
392+ island main.todo-list items
393+#### /ui/index/jibb index-tall-load
394+/= todo /ui/api/todo
395+/= todo-list /ui/todo-list
396+
397+++ main (page load view)
398+++ load |= ~
399+ (todos.todo same)
400+
401+++ view |= ts=(list item.todo)
402+ column ~[pad+%s3] ~[
403+ heading 1 "My ship"
404+ island main.todo-list ts
405+#### /ui/index/jibb index-cast-load
406+/= todo /ui/api/todo
407+/= todo-list /ui/todo-list
408+
409+++ main (page load view)
410+++ load |= ~
411+ ^- (ask (list item.todo)) (todos.todo same)
412+
413+++ view |= ts=(list item.todo)
414+ column ~[pad+%s3] ~[
415+ heading 1 "My ship"
416+ island main.todo-list ts
417+#### /ui/index/jibb index-view-helper
418+/= todo /ui/api/todo
419+/= todo-list /ui/todo-list
420+
421+++ main (page load view)
422+++ load |=(~ (todos.todo same))
423+
424+++ view |= ts=(list item.todo)
425+ column ~[pad+%s3] ~[
426+ (title "My ship")
427+ island main.todo-list ts
428+
429+++ title |= words=@t
430+ heading 1 words
431+#### /ui/index/jibb index-unused-helper
432+/= todo /ui/api/todo
433+/= todo-list /ui/todo-list
434+
435+++ main (page load view)
436+++ load |=(~ (todos.todo same))
437+
438+++ view |= ts=(list item.todo)
439+ column ~[pad+%s3] ~[
440+ heading 1 "My ship"
441+ island main.todo-list ts
442+
443+++ count |= ts=(list item.todo)
444+ (lent ts)
445+#### /ui/index/jibb index-pure-load
446+/= todo /ui/api/todo
447+/= todo-list /ui/todo-list
448+
449+++ main (page load view)
450+++ load |=(~ (pure ~))
451+
452+++ view |= ts=(list item.todo)
453+ column ~[pad+%s3] ~[
454+ heading 1 "My ship"
455+ island main.todo-list ts
456+#### /ui/index/jibb index-mapped-reply
457+/= todo /ui/api/todo
458+
459+++ main (page load view)
460+++ load |=(~ (todos.todo lent))
461+
462+++ view |= n=@ud
463+ text "{n} todos"
464+#### /ui/index/jibb index-typed-load
465+/= todo /ui/api/todo
466+
467+++ main (page load view)
468+++ load |=(~ (todo-by-id.todo 1 same))
469+
470+++ view |= t=item.todo
471+ text text.t
472+#### /ui/about/jibb about-reorder
473+++ view
474+ column ~[width+[%fill 1] pad+%s3 gap+%s2] ~[
475+ heading 1 "About this ship"
476+ para ~[(text "Hosted on Urbit. This page ships no JavaScript.")]
477+ el ~[tone+%accent] (link %/blog "Read the blog")
478+
479+++ main view
480+#### /ui/about/jibb about-inline
481+++ main
482+ column ~[width+[%fill 1] pad+%s3 gap+%s2] ~[
483+ heading 1 "About this ship"
484+ para ~[(text "Hosted on Urbit. This page ships no JavaScript.")]
485+ el ~[tone+%accent] (link %/blog "Read the blog")
486+#### /ui/about/jibb about-helper
487+++ main view
488+
489+++ view
490+ column ~[width+[%fill 1] pad+%s3 gap+%s2] ~[
491+ heading 1 "About this ship"
492+ intro
493+ el ~[tone+%accent] (link %/blog "Read the blog")
494+
495+++ intro
496+ para ~[(text "Hosted on Urbit. This page ships no JavaScript.")]
497+#### /ui/about/jibb about-rename
498+++ main body
499+
500+++ body
501+ column ~[width+[%fill 1] pad+%s3 gap+%s2] ~[
502+ heading 1 "About this ship"
503+ para ~[(text "Hosted on Urbit. This page ships no JavaScript.")]
504+ el ~[tone+%accent] (link %/blog "Read the blog")
505+#### /ui/blog/index/jibb blog-reorder
506+/- blog
507+/= api /ui/api/blog
508+/= card /ui/components/card
509+
510+++ view |= ps=(list post.blog)
511+ column ~[gap+%s2] (turn ps card.card)
512+
513+++ load |=(~ (posts.api same))
514+++ main (page load view)
515+#### /ui/blog/index/jibb blog-rename
516+/- blog
517+/= api /ui/api/blog
518+/= card /ui/components/card
519+
520+++ main (page load view)
521+++ load |=(~ (posts.api same))
522+
523+++ view |= items=(list post.blog)
524+ column ~[gap+%s2] (turn items card.card)
525+#### /ui/blog/index/jibb blog-inline-card
526+/- blog
527+/= api /ui/api/blog
528+/= card /ui/components/card
529+
530+++ main (page load view)
531+++ load |=(~ (posts.api same))
532+
533+++ view |= ps=(list post.blog)
534+ column ~[gap+%s2] (turn ps |=(p=post.blog (text title.p)))
535+#### /ui/blog/index/jibb blog-inline-card-bare
536+/- blog
537+/= api /ui/api/blog
538+/= card /ui/components/card
539+
540+++ main (page load view)
541+++ load |=(~ (posts.api same))
542+
543+++ view |= ps=(list post.blog)
544+ column ~[gap+%s2] (turn ps |=(p (text title.p)))
545+#### /ui/blog/index/jibb blog-local-helper
546+/- blog
547+/= api /ui/api/blog
548+/= card /ui/components/card
549+
550+++ main (page load view)
551+++ load |=(~ (posts.api same))
552+
553+++ view |= ps=(list post.blog)
554+ column ~[gap+%s2] (turn ps show)
555+
556+++ show |= p=post.blog
557+ (card.card p)
558+#### /ui/theme/jibb theme-no-font
559+++ theme ^- theme
560+ [ space=[s1="4px" s2="8px" s3="16px"]
561+ tones=[normal="#222" background="#fff" accent="#17734f" danger="#b3261e" muted="#5f5f5f"]
562+ wide="60rem"
563+ lang="en"
564+ zone="UTC"
565+ font=~
566+ dark=`[tones=[normal="#eee" background="#111" accent="#4c9" danger="#f28b82" muted="#aaa"]]
567+#### /ui/theme/jibb theme-helper-value
568+++ theme ^- theme
569+ [ space=[s1="4px" s2="8px" s3="16px"]
570+ tones=[normal="#222" background="#fff" accent=accent danger="#b3261e" muted="#5f5f5f"]
571+ wide="60rem"
572+ lang="en"
573+ zone="UTC"
574+ font=`%/static/fonts/inter.woff2
575+ dark=`[tones=[normal="#eee" background="#111" accent="#4c9" danger="#f28b82" muted="#aaa"]]
576+
577+++ accent "#17734f"
578+#### /ui/components/buttons/jibb buttons-reorder
579+++ wide ^- (list attr)
580+ ~[width+[%fill 1] pad+%s2]
581+++ labelled |= [label=@t msg=M]
582+ button label msg
583+++ add-button |= label=@t
584+ button label %add
585+#### /ui/components/buttons/jibb buttons-fixed
586++$ add-msg %add
587+++ add-button |= label=@t
588+ ^- (element add-msg) (button label %add)
589+++ labelled |= [label=@t msg=M]
590+ button label msg
591+++ wide ^- (list attr)
592+ ~[width+[%fill 1] pad+%s2]
593+#### /ui/components/buttons/jibb buttons-labelled-use
594+++ labelled |= [label=@t msg=M]
595+ button label msg
596+++ wide ^- (list attr)
597+ ~[width+[%fill 1] pad+%s2]
598++$ go-msg %go
599+++ go-button ^- (element go-msg) (labelled "Go" %go)
600+#### /ui/step/jibb step-reorder
601+++ describe |= s=step
602+ ?- s
603+ [%move %left n] "left {n}"
604+ [%move %right n] "right {n}"
605+ [t %draft] t
606+ [t %sent sent-at] t
607+ %stop "stop"
608+
609++$ step
610+ [%move %left n=@ud]
611+ [%move %right n=@ud]
612+ [text=@t %draft]
613+ [text=@t %sent at=@da]
614+ %stop
615+#### /ui/step/jibb step-arm-order
616++$ step
617+ [%move %left n=@ud]
618+ [%move %right n=@ud]
619+ [text=@t %draft]
620+ [text=@t %sent at=@da]
621+ %stop
622+
623+++ describe |= s=step
624+ ?- s
625+ [%move %right n] "right {n}"
626+ [t %draft] t
627+ [t %sent sent-at] t
628+ %stop "stop"
629+ [%move %left n] "left {n}"
630+#### /ui/step/jibb step-catch-all
631++$ step
632+ [%move %left n=@ud]
633+ [%move %right n=@ud]
634+ [text=@t %draft]
635+ [text=@t %sent at=@da]
636+ %stop
637+
638+++ describe |= s=step
639+ ?- s
640+ [%move %left n] "left {n}"
641+ [%move %right n] "right {n}"
642+ [t %draft] t
643+ [t %sent sent-at] t
644+ * "other"
645+#### /ui/step/jibb step-rename
646++$ step
647+ [%move %left n=@ud]
648+ [%move %right n=@ud]
649+ [text=@t %draft]
650+ [text=@t %sent at=@da]
651+ %stop
652+
653+++ describe |= x=step
654+ ?- x
655+ [%move %left n] "left {n}"
656+ [%move %right n] "right {n}"
657+ [t %draft] t
658+ [t %sent sent-at] t
659+ %stop "stop"
660+#### /ui/step/jibb step-sent-star
661++$ step
662+ [%move %left n=@ud]
663+ [%move %right n=@ud]
664+ [text=@t %draft]
665+ [text=@t %sent at=@da]
666+ %stop
667+
668+++ describe |= s=step
669+ ?- s
670+ [%move %left n] "left {n}"
671+ [%move %right n] "right {n}"
672+ [t %draft] t
673+ [t %sent *] t
674+ %stop "stop"
675+#### /ui/step/jibb step-stop-crash
676++$ step
677+ [%move %left n=@ud]
678+ [%move %right n=@ud]
679+ [text=@t %draft]
680+ [text=@t %sent at=@da]
681+ %stop
682+
683+++ describe |= s=step
684+ ?- s
685+ [%move %left n] "left {n}"
686+ [%move %right n] "right {n}"
687+ [t %draft] t
688+ [t %sent sent-at] t
689+ %stop !!
690+#### /ui/view-day/jibb viewday-swap
691+++ view |= [n=@ud day=@da]
692+ column ~[gap+%s1] ~[
693+ (text "Updated {day}") :: day printed as a date
694+ (text "{n} items") :: n printed as @ud
695+#### /ui/view-day/jibb viewday-add
696+++ view |= [day=@da n=@ud]
697+ column ~[gap+%s1] ~[
698+ (text "Updated {day}") :: day printed as a date
699+ (text "{n} items")
700+ (text "{(add n 1)} next") :: n printed as @ud
701+#### /ui/view-day/jibb viewday-generic-sum
702+++ total
703+ text "{(add 1 2)}"
704+#### /ui/imports/jibb imports-use
705+/- todo :: the molds from /sur/todo.hoon this module uses
706+/% %todo-action :: a mark's type, named todo-action
707+/= card /ui/components/card :: a Jibb module
708+
709+++ first |= i=item.todo
710+ text.i
711+++ show card.card
712+++ act |= a=todo-action a
docs/reviews/2026-11-03-milestone-2-probes/variants/p3.outnew file+262
@@ -0,0 +1,262 @@
1+#### /ui/stores/cart/jibb cart-reorder
2+CHECKED
3++$ poke: poke
4++$ state: [items=(list @t) open=?]
5+++ state: $-($-([items=(list @t) open=?] A) (ask A))
6+++ poke: $-([poke $-((unit @t) A)] (cmd A))
7+++ main: [init=[items=(list @t) open=?] update=*]
8+++ init: [items=(list @t) open=?]
9+++ update: $-([a=poke s=[items=(list @t) open=?]] [items=(list @t) open=?])
10+#### /ui/stores/cart/jibb cart-init-uncast
11+REJECTED: /ui/stores/cart.jibb:8:16: nothing fixes the union of ~
12+++ init [items=~ open=%.n]
13+ ^
14+#### /ui/stores/cart/jibb cart-rename
15+CHECKED
16++$ state: [items=(list @t) open=?]
17++$ poke: poke
18+++ state: $-($-([items=(list @t) open=?] A) (ask A))
19+++ poke: $-([poke $-((unit @t) A)] (cmd A))
20+++ main: [init=[items=(list @t) open=?] update=*]
21+++ update: $-([p=poke st=[items=(list @t) open=?]] [items=(list @t) open=?])
22+++ init: [items=(list @t) open=?]
23+#### /ui/stores/cart/jibb cart-third-case
24+CHECKED
25++$ state: [items=(list @t) open=?]
26++$ poke: poke
27+++ state: $-($-([items=(list @t) open=?] A) (ask A))
28+++ poke: $-([poke $-((unit @t) A)] (cmd A))
29+++ main: [init=[items=(list @t) open=?] update=*]
30+++ update: $-([a=poke s=[items=(list @t) open=?]] [items=(list @t) open=?])
31+++ init: [items=(list @t) open=?]
32+#### /ui/stores/cart/jibb cart-unused-helper
33+CHECKED
34++$ state: [items=(list @t) open=?]
35++$ poke: poke
36+++ state: $-($-([items=(list @t) open=?] A) (ask A))
37+++ poke: $-([poke $-((unit @t) A)] (cmd A))
38+++ main: [init=[items=(list @t) open=?] update=*]
39+++ size: $-([items=(list @t) open=?] @ud)
40+++ update: $-([a=poke s=[items=(list @t) open=?]] [items=(list @t) open=?])
41+++ init: [items=(list @t) open=?]
42+#### /ui/stores/cart/jibb cart-swap-fields
43+CHECKED
44++$ state: [open=? items=(list @t)]
45++$ poke: poke
46+++ state: $-($-([open=? items=(list @t)] A) (ask A))
47+++ poke: $-([poke $-((unit @t) A)] (cmd A))
48+++ main: [init=[open=? items=(list @t)] update=*]
49+++ update: $-([a=poke s=[open=? items=(list @t)]] [open=? items=(list @t)])
50+++ init: [open=? items=(list @t)]
51+#### /ui/stores/cart/jibb cart-update-helper
52+CHECKED
53++$ state: [items=(list @t) open=?]
54++$ poke: poke
55+++ state: $-($-([items=(list @t) open=?] A) (ask A))
56+++ poke: $-([poke $-((unit @t) A)] (cmd A))
57+++ main: [init=[items=(list @t) open=?] update=*]
58+++ update: $-([a=poke s=[items=(list @t) open=?]] [items=(list @t) open=?])
59+++ flip: $-([items=(list @t) open=?] [items=(list @t) open=?])
60+++ init: [items=(list @t) open=?]
61+#### /ui/basket/jibb basket-control
62+CHECKED
63++$ model: [cart=[items=(list @t) open=?] note=@t]
64++$ msg: msg
65+++ main: [init=$-(~ [cart=[items=(list @t) open=?] note=@t]) [update=$-([msg [cart=[items=(list @t) open=?] note=@t]] [[cart=[items=(list @t) open=?] note=@t] (list (cmd msg))]) [view=$-([cart=[items=(list @t) open=?] note=@t] (element msg)) subs=$-([cart=[items=(list @t) open=?] note=@t] (list (sub msg)))]]]
66+++ init: $-(~ [cart=[items=(list @t) open=?] note=@t])
67+++ view: $-([cart=[items=(list @t) open=?] note=@t] (element msg))
68+++ subs: $-([cart=[items=(list @t) open=?] note=@t] (list (sub msg)))
69+++ update: $-([msg=msg m=[cart=[items=(list @t) open=?] note=@t]] [[cart=[items=(list @t) open=?] note=@t] (list (cmd msg))])
70+#### /ui/basket/jibb basket-init-cast
71+CHECKED
72++$ model: [cart=[items=(list @t) open=?] note=@t]
73++$ msg: msg
74+++ main: [init=$-(~ [cart=[items=(list @t) open=?] note=@t]) [update=$-([msg [cart=[items=(list @t) open=?] note=@t]] [[cart=[items=(list @t) open=?] note=@t] (list (cmd msg))]) [view=$-([cart=[items=(list @t) open=?] note=@t] (element msg)) subs=$-([cart=[items=(list @t) open=?] note=@t] (list (sub msg)))]]]
75+++ view: $-([cart=[items=(list @t) open=?] note=@t] (element msg))
76+++ subs: $-([cart=[items=(list @t) open=?] note=@t] (list (sub msg)))
77+++ update: $-([msg=msg m=[cart=[items=(list @t) open=?] note=@t]] [[cart=[items=(list @t) open=?] note=@t] (list (cmd msg))])
78+++ init: $-(~ [cart=[items=(list @t) open=?] note=@t])
79+#### /ui/basket/jibb basket-rename-view
80+CHECKED
81++$ model: [cart=[items=(list @t) open=?] note=@t]
82++$ msg: msg
83+++ main: [init=$-(~ [cart=[items=(list @t) open=?] note=@t]) [update=$-([msg [cart=[items=(list @t) open=?] note=@t]] [[cart=[items=(list @t) open=?] note=@t] (list (cmd msg))]) [view=$-([cart=[items=(list @t) open=?] note=@t] (element msg)) subs=$-([cart=[items=(list @t) open=?] note=@t] (list (sub msg)))]]]
84+++ init: $-(~ [cart=[items=(list @t) open=?] note=@t])
85+++ view: $-([cart=[items=(list @t) open=?] note=@t] (element msg))
86+++ subs: $-([cart=[items=(list @t) open=?] note=@t] (list (sub msg)))
87+++ update: $-([msg=msg m=[cart=[items=(list @t) open=?] note=@t]] [[cart=[items=(list @t) open=?] note=@t] (list (cmd msg))])
88+#### /ui/basket/jibb basket-sixth-msg
89+CHECKED
90++$ model: [cart=[items=(list @t) open=?] note=@t]
91++$ msg: msg
92+++ main: [init=$-(~ [cart=[items=(list @t) open=?] note=@t]) [update=$-([msg [cart=[items=(list @t) open=?] note=@t]] [[cart=[items=(list @t) open=?] note=@t] (list (cmd msg))]) [view=$-([cart=[items=(list @t) open=?] note=@t] (element msg)) subs=$-([cart=[items=(list @t) open=?] note=@t] (list (sub msg)))]]]
93+++ init: $-(~ [cart=[items=(list @t) open=?] note=@t])
94+++ view: $-([cart=[items=(list @t) open=?] note=@t] (element msg))
95+++ subs: $-([cart=[items=(list @t) open=?] note=@t] (list (sub msg)))
96+++ update: $-([msg=msg m=[cart=[items=(list @t) open=?] note=@t]] [[cart=[items=(list @t) open=?] note=@t] (list (cmd msg))])
97+#### /ui/basket/jibb basket-second-sub
98+REJECTED: module kind needs unsupported inference: /ui/basket/jibb
99+#### /ui/basket/jibb basket-view-helper
100+CHECKED
101++$ model: [cart=[items=(list @t) open=?] note=@t]
102++$ msg: msg
103+++ main: [init=$-(~ [cart=[items=(list @t) open=?] note=@t]) [update=$-([msg [cart=[items=(list @t) open=?] note=@t]] [[cart=[items=(list @t) open=?] note=@t] (list (cmd msg))]) [view=$-([cart=[items=(list @t) open=?] note=@t] (element msg)) subs=$-([cart=[items=(list @t) open=?] note=@t] (list (sub msg)))]]]
104+++ init: $-(~ [cart=[items=(list @t) open=?] note=@t])
105+++ view: $-([cart=[items=(list @t) open=?] note=@t] (element msg))
106+++ subs: $-([cart=[items=(list @t) open=?] note=@t] (list (sub msg)))
107+++ update: $-([msg=msg m=[cart=[items=(list @t) open=?] note=@t]] [[cart=[items=(list @t) open=?] note=@t] (list (cmd msg))])
108+++ count-line: $-([cart=[items=(list @t) open=?] note=@t] (element A))
109+#### /ui/basket/jibb basket-swap-fields
110+CHECKED
111++$ model: [note=@t cart=[items=(list @t) open=?]]
112++$ msg: msg
113+++ main: [init=$-(~ [note=@t cart=[items=(list @t) open=?]]) [update=$-([msg [note=@t cart=[items=(list @t) open=?]]] [[note=@t cart=[items=(list @t) open=?]] (list (cmd msg))]) [view=$-([note=@t cart=[items=(list @t) open=?]] (element msg)) subs=$-([note=@t cart=[items=(list @t) open=?]] (list (sub msg)))]]]
114+++ init: $-(~ [note=@t cart=[items=(list @t) open=?]])
115+++ view: $-([note=@t cart=[items=(list @t) open=?]] (element msg))
116+++ subs: $-([note=@t cart=[items=(list @t) open=?]] (list (sub msg)))
117+++ update: $-([msg=msg m=[note=@t cart=[items=(list @t) open=?]]] [[note=@t cart=[items=(list @t) open=?]] (list (cmd msg))])
118+#### /ui/basket/jibb basket-unused-helper
119+REJECTED: module definitions need unsupported inference: /ui/basket/jibb: ++ empty
120+#### /ui/index/jibb index-reorder
121+CHECKED
122+++ main: [load=$-(~ (ask (list [id=@ud [done=? text=@t]]))) view=$-((list [id=@ud [done=? text=@t]]) (element !!))]
123+++ load: $-(~ (ask (list [id=@ud [done=? text=@t]])))
124+++ view: $-((list [id=@ud [done=? text=@t]]) (element !!))
125+#### /ui/index/jibb index-rename
126+CHECKED
127+++ main: [load=$-(~ (ask (list [id=@ud [done=? text=@t]]))) view=$-((list [id=@ud [done=? text=@t]]) (element !!))]
128+++ view: $-((list [id=@ud [done=? text=@t]]) (element !!))
129+++ load: $-(~ (ask (list [id=@ud [done=? text=@t]])))
130+#### /ui/index/jibb index-tall-load
131+CHECKED
132+++ main: [load=$-(~ (ask (list [id=@ud [done=? text=@t]]))) view=$-((list [id=@ud [done=? text=@t]]) (element !!))]
133+++ view: $-((list [id=@ud [done=? text=@t]]) (element !!))
134+++ load: $-(~ (ask (list [id=@ud [done=? text=@t]])))
135+#### /ui/index/jibb index-cast-load
136+CHECKED
137+++ main: [load=$-(~ (ask (list [id=@ud [done=? text=@t]]))) view=$-((list [id=@ud [done=? text=@t]]) (element !!))]
138+++ view: $-((list [id=@ud [done=? text=@t]]) (element !!))
139+++ load: $-(~ (ask (list [id=@ud [done=? text=@t]])))
140+#### /ui/index/jibb index-view-helper
141+CHECKED
142+++ main: [load=$-(~ (ask (list [id=@ud [done=? text=@t]]))) view=$-((list [id=@ud [done=? text=@t]]) (element !!))]
143+++ view: $-((list [id=@ud [done=? text=@t]]) (element !!))
144+++ title: $-(@t (element A))
145+++ load: $-(~ (ask (list [id=@ud [done=? text=@t]])))
146+#### /ui/index/jibb index-unused-helper
147+CHECKED
148+++ count: $-((list [id=@ud [done=? text=@t]]) @ud)
149+++ main: [load=$-(~ (ask (list [id=@ud [done=? text=@t]]))) view=$-((list [id=@ud [done=? text=@t]]) (element !!))]
150+++ view: $-((list [id=@ud [done=? text=@t]]) (element !!))
151+++ load: $-(~ (ask (list [id=@ud [done=? text=@t]])))
152+#### /ui/index/jibb index-pure-load
153+REJECTED: /ui/index.jibb:5:20: nothing fixes the union of ~
154+++ load |=(~ (pure ~))
155+ ^
156+#### /ui/index/jibb index-mapped-reply
157+CHECKED
158+++ main: [load=$-(~ (ask @ud)) view=$-(@ud (element !!))]
159+++ view: $-(@ud (element A))
160+++ load: $-(~ (ask @ud))
161+#### /ui/index/jibb index-typed-load
162+REJECTED: module kind needs unsupported inference: /ui/index/jibb
163+#### /ui/about/jibb about-reorder
164+CHECKED
165+++ main: (element !!)
166+++ view: (element A)
167+#### /ui/about/jibb about-inline
168+CHECKED
169+++ main: (element !!)
170+#### /ui/about/jibb about-helper
171+CHECKED
172+++ main: (element !!)
173+++ view: (element A)
174+++ intro: (element A)
175+#### /ui/about/jibb about-rename
176+CHECKED
177+++ main: (element !!)
178+++ body: (element A)
179+#### /ui/blog/index/jibb blog-reorder
180+CHECKED
181+++ main: [load=$-(~ (ask (list [title=@t slug=@ta]))) view=$-((list [title=@t slug=@ta]) (element !!))]
182+++ load: $-(~ (ask (list [title=@t slug=@ta])))
183+++ view: $-((list [title=@t slug=@ta]) (element A))
184+#### /ui/blog/index/jibb blog-rename
185+CHECKED
186+++ main: [load=$-(~ (ask (list [title=@t slug=@ta]))) view=$-((list [title=@t slug=@ta]) (element !!))]
187+++ view: $-((list [title=@t slug=@ta]) (element A))
188+++ load: $-(~ (ask (list [title=@t slug=@ta])))
189+#### /ui/blog/index/jibb blog-inline-card
190+CHECKED
191+++ main: [load=$-(~ (ask (list [title=@t slug=@ta]))) view=$-((list [title=@t slug=@ta]) (element !!))]
192+++ view: $-((list [title=@t slug=@ta]) (element A))
193+++ load: $-(~ (ask (list [title=@t slug=@ta])))
194+#### /ui/blog/index/jibb blog-inline-card-bare
195+REJECTED: module definitions need unsupported inference: /ui/blog/index/jibb: ++ view
196+#### /ui/blog/index/jibb blog-local-helper
197+CHECKED
198+++ main: [load=$-(~ (ask (list [title=@t slug=@ta]))) view=$-((list [title=@t slug=@ta]) (element !!))]
199+++ view: $-((list [title=@t slug=@ta]) (element A))
200+++ show: $-([title=@t slug=@ta] (element A))
201+++ load: $-(~ (ask (list [title=@t slug=@ta])))
202+#### /ui/theme/jibb theme-no-font
203+CHECKED
204+++ theme: [space=[s1=@t [s2=@t s3=@t]] [tones=[normal=@t [background=@t [accent=@t [danger=@t muted=@t]]]] [wide=@t [lang=@t [zone=@t [font=(unit qath) dark=(unit [tones=[normal=@t [background=@t [accent=@t [danger=@t muted=@t]]]]])]]]]]]
205+#### /ui/theme/jibb theme-helper-value
206+CHECKED
207+++ theme: [space=[s1=@t [s2=@t s3=@t]] [tones=[normal=@t [background=@t [accent=@t [danger=@t muted=@t]]]] [wide=@t [lang=@t [zone=@t [font=(unit qath) dark=(unit [tones=[normal=@t [background=@t [accent=@t [danger=@t muted=@t]]]]])]]]]]]
208+++ accent: @t
209+#### /ui/components/buttons/jibb buttons-reorder
210+REJECTED: /ui/components/buttons.jibb:6:16: nothing fixes the union of %add
211+ button label %add
212+ ^
213+#### /ui/components/buttons/jibb buttons-fixed
214+CHECKED
215++$ add-msg: %add
216+++ wide: (list attr)
217+++ labelled: $-([label=@t msg=A] (element A))
218+++ add-button: $-(@t (element %add))
219+#### /ui/components/buttons/jibb buttons-labelled-use
220+CHECKED
221++$ go-msg: %go
222+++ go-button: (element %go)
223+++ wide: (list attr)
224+++ labelled: $-([label=@t msg=A] (element A))
225+#### /ui/step/jibb step-reorder
226+CHECKED
227++$ step: step
228+++ describe: $-(step @t)
229+#### /ui/step/jibb step-arm-order
230+CHECKED
231++$ step: step
232+++ describe: $-(step @t)
233+#### /ui/step/jibb step-catch-all
234+CHECKED
235++$ step: step
236+++ describe: $-(step @t)
237+#### /ui/step/jibb step-rename
238+CHECKED
239++$ step: step
240+++ describe: $-(step @t)
241+#### /ui/step/jibb step-sent-star
242+CHECKED
243++$ step: step
244+++ describe: $-(step @t)
245+#### /ui/step/jibb step-stop-crash
246+CHECKED
247++$ step: step
248+++ describe: $-(step @t)
249+#### /ui/view-day/jibb viewday-swap
250+CHECKED
251+++ view: $-([n=@ud day=@da] (element A))
252+#### /ui/view-day/jibb viewday-add
253+CHECKED
254+++ view: $-([day=@da n=@ud] (element A))
255+#### /ui/view-day/jibb viewday-generic-sum
256+REJECTED: module definitions need unsupported inference: /ui/view-day/jibb: ++ total
257+#### /ui/imports/jibb imports-use
258+CHECKED
259+++ act: $-(([%add text=@t] [%toggle id=@ud]) ([%add text=@t] [%toggle id=@ud]))
260+++ show: $-([title=@t slug=@ta] (element A))
261+++ first: $-([id=@ud [done=? text=@t]] @t)
262+
docs/reviews/2026-11-03-milestone-2-probes/variants/p4.jibbnew file+196
@@ -0,0 +1,196 @@
1+#### /ui/probe/jibb inc-generic
2+++ inc |= n=A (add n 1)
3+#### /ui/probe/jibb inc-ud
4+++ inc |= n=@ud (add n 1)
5+++ two (inc 1)
6+#### /ui/probe/jibb clamp-max
7+++ clamp |= [lo=A hi=A n=A]
8+ ?- (gth n hi)
9+ %.y hi
10+ %.n (max lo n)
11+#### /ui/probe/jibb clamp-no-max
12+++ clamp |= [lo=A hi=A n=A]
13+ ?- (gth n hi)
14+ %.y hi
15+ %.n
16+ ?- (gth lo n)
17+ %.y lo
18+ %.n n
19+++ use (clamp 1 10 5)
20+#### /ui/probe/jibb sum-print
21+++ shown "{(add 1 2)}"
22+#### /ui/probe/jibb literals-atoms
23+++ a 0x1f
24+++ b 0v5.fdf99
25+++ c ~zod
26+++ c2 ~sampel-palnet
27+++ d ~2026.10.23
28+++ d2 ~2026.10.23..14.30.00
29+++ e ~s30
30+++ e2 ~h1.m30
31+++ f ~.my-post
32+++ g "milk"
33+++ h %.y
34+++ i 1.000
35+++ j /posts/~zod
36+++ k %/blog
37+#### /ui/probe/jibb literals-containers
38+++ u `5
39+++ l ~[1 2 3]
40+++ t [1 "a"]
41+++ r [text="milk" done=%.n]
42+++ n ^- (unit @ud) ~
43+++ term ^- @tas %add
44+++ pair ^- attr gap+%s2
45+#### /ui/probe/jibb hole-id
46+++ id |= x=A ^- _ x
47+#### /ui/probe/jibb one-case-union
48++$ go [%go url=@t]
49+++ g ^- go [%go "x"]
50+#### /ui/probe/jibb ctor-one-case
51++$ typed [%typed text=@t]
52+++ mk ^- $-(@t typed) |=%typed
53+#### /ui/probe/jibb proj
54+++ wider ^- [x=@ud y=@ud z=@ud] [1 2 3]
55+++ narrow ^- [x=@ud y=@ud] (proj wider)
56+#### /ui/probe/jibb unnamed-takes-face
57+++ pt ^- [x=@ud y=@ud] [0 0]
58+#### /ui/probe/jibb widen-to-bare-atom
59+++ f |= a=@ a
60+++ g (f 5)
61+#### /ui/probe/jibb widen-aura-family
62+++ f |= a=@u a
63+++ five ^- @ud 5
64+++ g (f five)
65+#### /ui/probe/jibb pattern-unit
66+++ show |= u=(unit @ud)
67+ ?- u
68+ ~ 0
69+ [~ x] x
70+#### /ui/probe/jibb pattern-pair-units
71+++ both |= p=[(unit @ud) (unit @ud)]
72+ ?- p
73+ [[~ a] [~ b]] (add a b)
74+ * 0
75+#### /ui/probe/jibb pattern-list-one
76+++ one |= xs=(list @ud)
77+ ?- xs
78+ [x ~] x
79+ * 0
80+#### /ui/probe/jibb pattern-literals
81+++ lit |= n=@ud
82+ ?- n
83+ 1.000 %.y
84+ * %.n
85+++ who |= s=@p
86+ ?- s
87+ ~zod "zod"
88+ * "other"
89+++ milk |= t=@t
90+ ?- t
91+ "milk" %.y
92+ * %.n
93+#### /ui/probe/jibb pattern-eq
94+++ same-ud |= [a=@ud b=@ud]
95+ ?- (eq a b)
96+ %.y "same"
97+ %.n "different"
98+#### /ui/probe/jibb gate-free-generic
99+++ same-as |= [a=A b=A] (eq a b)
100+#### /ui/probe/jibb cons-where-list
101+++ cons |= xs=(list @ud)
102+ ^- (list @ud) [1 xs]
103+#### /ui/probe/jibb shared-capital
104+++ outer |= x=A
105+ ++ inner |= y=A y
106+ (inner x)
107+#### /ui/probe/jibb bind-any-depth
108+++ f |= [a=@ b]
109+ a
110+++ g (f 1 "x")
111+#### /ui/probe/jibb roll
112+++ total |= xs=(list @ud) (roll xs 0 add)
113+#### /ui/probe/jibb clap
114+++ both (clap `1 `2 add)
115+#### /ui/probe/jibb bare-sample-inline
116+++ titles |= ps=(list [title=@t n=@ud])
117+ (turn ps |=(p title.p))
118+#### /ui/probe/jibb typed-sample-inline
119+++ titles |= ps=(list [title=@t n=@ud])
120+ (turn ps |=(p=[title=@t n=@ud] title.p))
121+#### /ui/probe/jibb image-element
122+++ logo ^- (element !!) (image %/static/img/logo.png "The logo")
123+#### /ui/probe/jibb get-by
124+++ look |= [m=(map @t @ud) k=@t] (get.by m k)
125+#### /ui/probe/jibb items-count
126+++ show |= n=@ud
127+ text "{n} items"
128+#### /ui/probe/jibb add-cmd-helper-lib
129++$ msg
130+ [%acked err=(unit @t)]
131+ %go
132+++ wait-cmd |= gap=@dr
133+ ^- (cmd msg) [%wait gap %go]
134+#### /ui/probe/jibb eq-list-null
135+++ empty |= xs=(list @t) (eq xs ~)
136+#### /ui/probe/jibb fall-literal
137+++ f |= e=(unit @t) (fall e "")
138+#### /ui/probe/jibb lent-tuba-trip
139+++ long |= t=@t (gth (lent (tuba (trip t))) 80)
140+#### /ui/api/journal/jibb module journal-api
141+/% %posts
142+
143++$ paths
144+ [%posts /posts posts]
145+ [%post /post/[slug=@ta] posts]
146+#### /ui/blog/_slug/jibb slug-page
147+/= api /ui/api/journal
148+
149+++ main (page load view)
150+++ load |=([slug=@ta] (post.api slug same))
151+
152+++ view |= ps=posts.api
153+ text "post"
154+#### /ui/settings/__rest/jibb catch-all-page
155+++ main (page load view)
156+++ load |=(p=path (pure p))
157+
158+++ view |= p=path
159+ text "settings"
160+#### /ui/todo-list/jibb island-changes-fold
161+/= todo /ui/api/todo
162+
163+++ main (program init update view subs)
164+
165++$ model [todos=(list item.todo) draft=@t error=(unit @t)]
166++$ msg
167+ [%typed text=@t]
168+ %submit
169+ [%toggled id=@ud]
170+ [%got todos=(list item.todo)]
171+ [%acked err=(unit @t)]
172+
173+++ init |= ts=(list item.todo)
174+ [todos=ts draft="" error=~]
175+
176+++ update |= [=msg m=model]
177+ ?- msg
178+ [%typed t] [m(draft=t) ~]
179+ %submit [m(draft="") ~[(poke.todo [%add draft.m] |=%acked)]]
180+ [%toggled id] [m ~[(poke.todo [%toggle id] |=%acked)]]
181+ [%got ts] [m(todos=ts) ~]
182+ [%acked err] [m(error=err) ~]
183+
184+++ apply |= [d=[%todo-update todo-update.todo] s=todos.todo]
185+ s
186+
187+++ subs |= m=model
188+ ~[[%watch (changes.todo |=%got apply)]]
189+
190+++ view |= m=model
191+ column ~[gap+%s2] ~[
192+ heading 2 "Todos"
193+ each (turn todos.m row-of)
194+
195+++ row-of |= t=item.todo
196+ [id.t (toggle done.t text.t [%toggled id.t])]
docs/reviews/2026-11-03-milestone-2-probes/variants/p4.outnew file+113
@@ -0,0 +1,113 @@
1+#### /ui/probe/jibb inc-generic
2+CHECKED
3+++ inc: $-(A A)
4+#### /ui/probe/jibb inc-ud
5+CHECKED
6+++ two: @ud
7+++ inc: $-(@ud @ud)
8+#### /ui/probe/jibb clamp-max
9+REJECTED: module definitions need unsupported inference: /ui/probe/jibb: ++ clamp
10+#### /ui/probe/jibb clamp-no-max
11+CHECKED
12+++ use: @ud
13+++ clamp: $-([lo=A [hi=A n=A]] A)
14+#### /ui/probe/jibb sum-print
15+REJECTED: module definitions need unsupported inference: /ui/probe/jibb: ++ shown
16+#### /ui/probe/jibb literals-atoms
17+REJECTED: module definitions need unsupported inference: /ui/probe/jibb: ++ j
18+#### /ui/probe/jibb literals-containers
19+REJECTED: module definitions need unsupported inference: /ui/probe/jibb: ++ u
20+#### /ui/probe/jibb hole-id
21+CHECKED
22+++ id: $-(A A)
23+#### /ui/probe/jibb one-case-union
24+CHECKED
25++$ go: [%go url=@t]
26+++ g: [%go url=@t]
27+#### /ui/probe/jibb ctor-one-case
28+CHECKED
29++$ typed: [%typed text=@t]
30+++ mk: $-(@t [%typed text=@t])
31+#### /ui/probe/jibb proj
32+CHECKED
33+++ narrow: [x=@ud y=@ud]
34+++ wider: [x=@ud [y=@ud z=@ud]]
35+#### /ui/probe/jibb unnamed-takes-face
36+CHECKED
37+++ pt: [x=@ud y=@ud]
38+#### /ui/probe/jibb widen-to-bare-atom
39+CHECKED
40+++ g: @
41+++ f: $-(@ @)
42+#### /ui/probe/jibb widen-aura-family
43+CHECKED
44+++ g: @u
45+++ five: @ud
46+++ f: $-(@u @u)
47+#### /ui/probe/jibb pattern-unit
48+CHECKED
49+++ show: $-((unit @ud) @ud)
50+#### /ui/probe/jibb pattern-pair-units
51+REJECTED: module has conflicting names: /ui/probe/jibb
52+#### /ui/probe/jibb pattern-list-one
53+REJECTED: module definitions need unsupported inference: /ui/probe/jibb: ++ one
54+#### /ui/probe/jibb pattern-literals
55+REJECTED: module definitions need unsupported inference: /ui/probe/jibb: ++ lit
56+#### /ui/probe/jibb pattern-eq
57+CHECKED
58+++ same-ud: $-([a=@ud b=@ud] @t)
59+#### /ui/probe/jibb gate-free-generic
60+CHECKED
61+++ same-as: $-([a=A b=A] ?)
62+#### /ui/probe/jibb cons-where-list
63+CHECKED
64+++ cons: $-((list @ud) (list @ud))
65+#### /ui/probe/jibb shared-capital
66+CHECKED
67+++ outer: $-(A A)
68+#### /ui/probe/jibb bind-any-depth
69+CHECKED
70+++ g: @
71+++ f: $-([a=@ b=A] @)
72+#### /ui/probe/jibb roll
73+CHECKED
74+++ total: $-((list @ud) @ud)
75+#### /ui/probe/jibb clap
76+REJECTED: module has conflicting names: /ui/probe/jibb
77+#### /ui/probe/jibb bare-sample-inline
78+REJECTED: module definitions need unsupported inference: /ui/probe/jibb: ++ titles
79+#### /ui/probe/jibb typed-sample-inline
80+CHECKED
81+++ titles: $-((list [title=@t n=@ud]) (list @t))
82+#### /ui/probe/jibb image-element
83+CHECKED
84+++ logo: (element !!)
85+#### /ui/probe/jibb get-by
86+REJECTED: module definitions need unsupported inference: /ui/probe/jibb: ++ look
87+#### /ui/probe/jibb items-count
88+CHECKED
89+++ show: $-(@ud (element A))
90+#### /ui/probe/jibb add-cmd-helper-lib
91+CHECKED
92++$ msg: msg
93+++ wait-cmd: $-(@dr (cmd msg))
94+#### /ui/probe/jibb eq-list-null
95+REJECTED: module definitions need unsupported inference: /ui/probe/jibb: ++ empty
96+#### /ui/probe/jibb fall-literal
97+CHECKED
98+++ f: $-((unit @t) @t)
99+#### /ui/probe/jibb lent-tuba-trip
100+CHECKED
101+++ long: $-(@t ?)
102+#### /ui/api/journal/jibb module journal-api
103+CHECKED
104++$ posts: (list [title=@t slug=@ta])
105+++ posts: $-($-((list [title=@t slug=@ta]) A) (ask A))
106+++ post: $-([@ta $-((list [title=@t slug=@ta]) A)] (ask A))
107+#### /ui/blog/_slug/jibb slug-page
108+REJECTED: module kind needs unsupported inference: /ui/blog/_slug/jibb
109+#### /ui/settings/__rest/jibb catch-all-page
110+REJECTED: module kind needs unsupported inference: /ui/settings/__rest/jibb
111+#### /ui/todo-list/jibb island-changes-fold
112+REJECTED: module kind needs unsupported inference: /ui/todo-list/jibb
113+
docs/reviews/2026-11-03-milestone-2-probes/variants/p5.jibbnew file+130
@@ -0,0 +1,130 @@
1+#### /ui/probe/jibb lit-hex
2+++ x 0x1f
3+#### /ui/probe/jibb lit-b32
4+++ x 0v5.fdf99
5+#### /ui/probe/jibb lit-ship
6+++ x ~zod
7+#### /ui/probe/jibb lit-ship2
8+++ x ~sampel-palnet
9+#### /ui/probe/jibb lit-date
10+++ x ~2026.10.23
11+#### /ui/probe/jibb lit-date2
12+++ x ~2026.10.23..14.30.00
13+#### /ui/probe/jibb lit-dur
14+++ x ~s30
15+#### /ui/probe/jibb lit-dur2
16+++ x ~h1.m30
17+#### /ui/probe/jibb lit-knot
18+++ x ~.my-post
19+#### /ui/probe/jibb lit-str
20+++ x "milk"
21+#### /ui/probe/jibb lit-loob
22+++ x %.y
23+#### /ui/probe/jibb lit-dec
24+++ x 1.000
25+#### /ui/probe/jibb lit-path
26+++ x /posts/~zod
27+#### /ui/probe/jibb lit-qath
28+++ x %/blog
29+#### /ui/probe/jibb lit-unit
30+++ x `5
31+#### /ui/probe/jibb lit-list
32+++ x ~[1 2 3]
33+#### /ui/probe/jibb lit-tuple
34+++ x [1 "a"]
35+#### /ui/probe/jibb lit-record
36+++ x [text="milk" done=%.n]
37+#### /ui/probe/jibb lit-null-cast
38+++ x ^- (unit @ud) ~
39+#### /ui/probe/jibb lit-term-cast
40+++ x ^- @tas %add
41+#### /ui/probe/jibb lit-pair-cast
42+++ x ^- attr gap+%s2
43+#### /ui/probe/jibb lit-num-term-cast
44+++ x ^- @ %1.000
45+#### /ui/probe/jibb lit-empty-path
46+++ x /
47+#### /ui/probe/jibb lit-unit-cast
48+++ x ^- (unit @ud) `5
49+#### /ui/probe/jibb lit-list-cast
50+++ x ^- (list @ud) ~[1 2 3]
51+#### /ui/probe/jibb lit-path-cast
52+++ x ^- path /posts/~zod
53+#### /ui/probe/jibb lit-interp-day
54+++ x "Since {~2026.10.23}"
55+#### /ui/probe/jibb inc-cell-unsound?
56+++ inc |= n=A (add n 1)
57+++ bad (inc [1 2])
58+#### /ui/probe/jibb inc-loobean
59+++ inc |= n=A (add n 1)
60+++ bad (inc %.y)
61+#### /ui/probe/jibb inc-generic-print
62+++ inc |= n=A (add n 1)
63+#### /ui/probe/jibb eq-gates-unsound?
64+++ same-as |= [a=A b=A] (eq a b)
65+++ bad (same-as same same)
66+#### /ui/probe/jibb eq-generic-print
67+++ same-as |= [a=A b=A] (eq a b)
68+#### /ui/probe/jibb clamp-print
69+++ clamp |= [lo=A hi=A n=A]
70+ ?- (gth n hi)
71+ %.y hi
72+ %.n
73+ ?- (gth lo n)
74+ %.y lo
75+ %.n n
76+#### /ui/probe/jibb unknown-name
77+++ x (nosuch 1)
78+#### /ui/probe/jibb pattern-pair-units
79+++ pair-sum |= p=[(unit @ud) (unit @ud)]
80+ ?- p
81+ [[~ a] [~ b]] (add a b)
82+ * 0
83+#### /ui/probe/jibb clap-units
84+++ summed (clap `1 `2 add)
85+#### /ui/probe/jibb pattern-lit-ud
86+++ lit |= n=@ud
87+ ?- n
88+ 1.000 %.y
89+ * %.n
90+#### /ui/probe/jibb pattern-lit-ship
91+++ who |= s=@p
92+ ?- s
93+ ~zod "zod"
94+ * "other"
95+#### /ui/probe/jibb pattern-lit-cord
96+++ milk |= t=@t
97+ ?- t
98+ "milk" %.y
99+ * %.n
100+#### /ui/probe/jibb pattern-list-cons
101+++ first |= xs=(list @ud)
102+ ?- xs
103+ ~ 0
104+ [x xs2] x
105+#### /ui/probe/jibb pattern-list-one-catch
106+++ one |= xs=(list @ud)
107+ ?- xs
108+ [x ~] x
109+ * 0
110+#### /ui/probe/jibb pattern-trailing-rest
111+++ second |= p=[(unit @ud) (unit @ud)]
112+ ?- p
113+ [~ b] b
114+ * ~
115+#### /ui/probe/jibb print-sum-annotated
116+++ shown ^- @t "{(add 1 2)}"
117+#### /ui/probe/jibb print-ud-var
118+++ shown |= n=@ud "{n} items"
119+#### /ui/probe/jibb print-generic-error
120+++ shown |= n=A
121+ "{(add n 1)}"
122+#### /ui/probe/jibb eq-list-null
123+++ empty |= xs=(list @t) (eq xs ~)
124+#### /ui/probe/jibb eq-list-null-cast
125+++ empty |= xs=(list @t) (eq xs ^-((list @t) ~))
126+#### /ui/probe/jibb self-ref-error
127+++ title (lent title)
128+#### /ui/probe/jibb capital-made-ud
129+++ f |= x=A (add x ^- @ud 1)
130+
docs/reviews/2026-11-03-milestone-2-probes/variants/p5.outnew file+127
@@ -0,0 +1,127 @@
1+#### /ui/probe/jibb lit-hex
2+CHECKED
3+++ x: @ux
4+#### /ui/probe/jibb lit-b32
5+CHECKED
6+++ x: @uv
7+#### /ui/probe/jibb lit-ship
8+CHECKED
9+++ x: @p
10+#### /ui/probe/jibb lit-ship2
11+CHECKED
12+++ x: @p
13+#### /ui/probe/jibb lit-date
14+CHECKED
15+++ x: @da
16+#### /ui/probe/jibb lit-date2
17+CHECKED
18+++ x: @da
19+#### /ui/probe/jibb lit-dur
20+CHECKED
21+++ x: @dr
22+#### /ui/probe/jibb lit-dur2
23+CHECKED
24+++ x: @dr
25+#### /ui/probe/jibb lit-knot
26+CHECKED
27+++ x: @ta
28+#### /ui/probe/jibb lit-str
29+CHECKED
30+++ x: @t
31+#### /ui/probe/jibb lit-loob
32+CHECKED
33+++ x: ?
34+#### /ui/probe/jibb lit-dec
35+CHECKED
36+++ x: @ud
37+#### /ui/probe/jibb lit-path
38+REJECTED: module definitions need unsupported inference: /ui/probe/jibb: ++ x
39+#### /ui/probe/jibb lit-qath
40+CHECKED
41+++ x: qath
42+#### /ui/probe/jibb lit-unit
43+REJECTED: module definitions need unsupported inference: /ui/probe/jibb: ++ x
44+#### /ui/probe/jibb lit-list
45+CHECKED
46+++ x: (list @ud)
47+#### /ui/probe/jibb lit-tuple
48+CHECKED
49+++ x: [@ud @t]
50+#### /ui/probe/jibb lit-record
51+CHECKED
52+++ x: [text=@t done=?]
53+#### /ui/probe/jibb lit-null-cast
54+CHECKED
55+++ x: (unit @ud)
56+#### /ui/probe/jibb lit-term-cast
57+CHECKED
58+++ x: @tas
59+#### /ui/probe/jibb lit-pair-cast
60+CHECKED
61+++ x: attr
62+#### /ui/probe/jibb lit-num-term-cast
63+CHECKED
64+++ x: @
65+#### /ui/probe/jibb lit-empty-path
66+REJECTED: module definitions need unsupported inference: /ui/probe/jibb: ++ x
67+#### /ui/probe/jibb lit-unit-cast
68+CHECKED
69+++ x: (unit @ud)
70+#### /ui/probe/jibb lit-list-cast
71+CHECKED
72+++ x: (list @ud)
73+#### /ui/probe/jibb lit-path-cast
74+REJECTED: module definitions need unsupported inference: /ui/probe/jibb: ++ x
75+#### /ui/probe/jibb lit-interp-day
76+CHECKED
77+++ x: @t
78+#### /ui/probe/jibb inc-cell-unsound?
79+REJECTED: module definitions need unsupported inference: /ui/probe/jibb: ++ bad
80+#### /ui/probe/jibb inc-loobean
81+REJECTED: module definitions need unsupported inference: /ui/probe/jibb: ++ bad
82+#### /ui/probe/jibb inc-generic-print
83+CHECKED
84+++ inc: $-(A A) where A is an atom other than ?
85+#### /ui/probe/jibb eq-gates-unsound?
86+REJECTED: module definitions need unsupported inference: /ui/probe/jibb: ++ bad
87+#### /ui/probe/jibb eq-generic-print
88+CHECKED
89+++ same-as: $-([a=A b=A] ?) where A contains no gates
90+#### /ui/probe/jibb clamp-print
91+CHECKED
92+++ clamp: $-([lo=A [hi=A n=A]] A) where A is an atom
93+#### /ui/probe/jibb unknown-name
94+REJECTED: module definitions need unsupported inference: /ui/probe/jibb: ++ x
95+#### /ui/probe/jibb pattern-pair-units
96+REJECTED: module definitions need unsupported inference: /ui/probe/jibb: ++ pair-sum
97+#### /ui/probe/jibb clap-units
98+REJECTED: module definitions need unsupported inference: /ui/probe/jibb: ++ summed
99+#### /ui/probe/jibb pattern-lit-ud
100+REJECTED: module definitions need unsupported inference: /ui/probe/jibb: ++ lit
101+#### /ui/probe/jibb pattern-lit-ship
102+REJECTED: module definitions need unsupported inference: /ui/probe/jibb: ++ who
103+#### /ui/probe/jibb pattern-lit-cord
104+REJECTED: module definitions need unsupported inference: /ui/probe/jibb: ++ milk
105+#### /ui/probe/jibb pattern-list-cons
106+CHECKED
107+++ first: $-((list @ud) @ud)
108+#### /ui/probe/jibb pattern-list-one-catch
109+REJECTED: module definitions need unsupported inference: /ui/probe/jibb: ++ one
110+#### /ui/probe/jibb pattern-trailing-rest
111+REJECTED: module definitions need unsupported inference: /ui/probe/jibb: ++ second
112+#### /ui/probe/jibb print-sum-annotated
113+REJECTED: module definitions need unsupported inference: /ui/probe/jibb: ++ shown
114+#### /ui/probe/jibb print-ud-var
115+CHECKED
116+++ shown: $-(@ud @t)
117+#### /ui/probe/jibb print-generic-error
118+REJECTED: module definitions need unsupported inference: /ui/probe/jibb: ++ shown
119+#### /ui/probe/jibb eq-list-null
120+REJECTED: module definitions need unsupported inference: /ui/probe/jibb: ++ empty
121+#### /ui/probe/jibb eq-list-null-cast
122+REJECTED: module source does not parse: /ui/probe/jibb
123+#### /ui/probe/jibb self-ref-error
124+REJECTED: module definitions need unsupported inference: /ui/probe/jibb: ++ title
125+#### /ui/probe/jibb capital-made-ud
126+REJECTED: module source does not parse: /ui/probe/jibb
127+
docs/reviews/2026-11-03-milestone-2-probes/variants/p6.jibbnew file+498
@@ -0,0 +1,498 @@
1+#### /ui/todo-list/jibb todo-full-alias
2+/= todo /ui/api/todo
3+
4+++ main (program init update view subs)
5+
6++$ model [todos=(list item.todo) draft=@t error=(unit @t)]
7++$ msg
8+ [%typed text=@t]
9+ %submit
10+ [%toggled id=@ud]
11+ [%got todos=(list item.todo)]
12+ [%acked err=(unit @t)]
13+
14+++ init |= ts=(list item.todo)
15+ [ts "" ~]
16+
17+++ update |= [=msg m=model]
18+ ?- msg
19+ [%typed t]
20+ ?- (gth (lent (tuba (trip t))) 80)
21+ %.y [m(draft=t error=`"Too long") ~]
22+ %.n [m(draft=t error=~) ~]
23+ %submit [m(draft="") ~[(poke.todo [%add draft.m] |=%acked)]]
24+ [%toggled id] [m ~[(poke.todo [%toggle id] |=%acked)]]
25+ [%got ts] [m(todos=ts) ~]
26+ [%acked err] [m(error=err) ~]
27+
28+++ subs |= m=model
29+ ~[[%watch (todos.todo |=%got)]]
30+
31+++ view |= m=model
32+ column ~[gap+%s2] ~[
33+ heading 2 "Todos"
34+ each (turn todos.m row-alias)
35+ row ~[gap+%s1] ~[
36+ el ~[width+[%fill 1]] (field "New todo" draft.m |=%typed)
37+ button "Add" %submit
38+ el ~[tone+%danger] (text (fall error.m ""))
39+
40+++ row-of |= t=item.todo
41+ [id.t (toggle done.t text.t [%toggled id.t])]
42+
43+++ row-alias row-of
44+#### /ui/todo-list/jibb todo-full-ambiguous-mapper
45+/= todo /ui/api/todo
46+
47+++ main (program init update view subs)
48+
49++$ model [todos=(list item.todo) draft=@t error=(unit @t)]
50++$ msg
51+ [%typed text=@t]
52+ %submit
53+ [%toggled id=@ud]
54+ [%got todos=(list item.todo)]
55+ [%acked err=(unit @t)]
56+
57+++ init |= ts=(list item.todo)
58+ [ts "" ~]
59+
60+++ update |= [=msg m=model]
61+ ?- msg
62+ [%typed t]
63+ ?- (gth (lent (tuba (trip t))) 80)
64+ %.y [m(draft=t error=`"Too long") ~]
65+ %.n [m(draft=t error=~) ~]
66+ %submit [m(draft="") ~[(poke.todo [%add draft.m] |=%acked)]]
67+ [%toggled id] [m ~[(poke.todo [%toggle id] |=%acked)]]
68+ [%got ts] [m(todos=ts) ~]
69+ [%acked err] [m(error=err) ~]
70+
71+++ subs |= m=model
72+ ~[[%watch (todos.todo |=%got)]]
73+
74+++ view |= m=model
75+ column ~[gap+%s2] ~[
76+ heading 2 "Todos"
77+ each (turn todos.m row-of)
78+ each (turn todos.m row-of)
79+ row ~[gap+%s1] ~[
80+ el ~[width+[%fill 1]] (field "New todo" draft.m |=%typed)
81+ button "Add" %submit
82+ el ~[tone+%danger] (text (fall error.m ""))
83+
84+++ row-of |= t=item.todo
85+ [id.t (toggle done.t text.t [%toggled id.t])]
86+#### /ui/index/jibb page-main-page-alias
87+/= todo /ui/api/todo
88+/= todo-list /ui/todo-list
89+
90+++ make-page page
91+++ main (make-page load view)
92+++ load |=(~ (todos.todo same))
93+
94+++ view |= ts=(list item.todo)
95+ column ~[pad+%s3] ~[
96+ heading 1 "My ship"
97+ island main.todo-list ts
98+#### /ui/index/jibb page-main-indirect-load
99+/= todo /ui/api/todo
100+/= todo-list /ui/todo-list
101+
102+++ main (page load view)
103+++ request |=(~ (todos.todo same))
104+++ load |=(~ (request ~))
105+
106+++ view |= ts=(list item.todo)
107+ column ~[pad+%s3] ~[
108+ heading 1 "My ship"
109+ island main.todo-list ts
110+#### /ui/index/jibb page-main-pure-load
111+/= todo /ui/api/todo
112+/= todo-list /ui/todo-list
113+
114+++ main (page load view)
115+++ load |=(~ (pure ~))
116+
117+++ view |= ts=(list item.todo)
118+ column ~[pad+%s3] ~[
119+ heading 1 "My ship"
120+ island main.todo-list ts
121+#### /ui/index/jibb page-main-hand-built-load
122+/= todo /ui/api/todo
123+/= todo-list /ui/todo-list
124+
125+++ main (page load view)
126+++ load |=(~
127+ ^- (ask (list item.todo))
128+ [%agent api="/ui/api/todo" case=%todos agent=%todo path=~[%todos] scry=~ receive=receive])
129+++ receive |= input=[mark=@tas state=(unit *) fact=*]
130+ ^- [state=* message=(list item.todo)] [state=0 message=~]
131+
132+++ view |= ts=(list item.todo)
133+ column ~[pad+%s3] ~[
134+ heading 1 "My ship"
135+ island main.todo-list ts
136+#### /ui/index/jibb page-main-typed-load
137+/= todo /ui/api/todo
138+/= todo-list /ui/todo-list
139+
140+++ main (page load view)
141+++ load |=(~ (todo-by-id.todo 1 |=%one))
142+
143+++ view |= item=todo-item.todo
144+ text "One todo"
145+#### /ui/index/jibb page-main-diff-load
146+/= todo /ui/api/todo
147+/= todo-list /ui/todo-list
148+
149+++ main (page load view)
150+++ fold |= [d=[%todo-update todo-update.todo] s=todos.todo] s
151+++ load |=(~ (changes.todo same fold))
152+
153+++ view |= ts=(list item.todo)
154+ column ~[pad+%s3] ~[
155+ heading 1 "My ship"
156+ island main.todo-list ts
157+#### /ui/stores/cart/jibb store-alias-main
158+:: /ui/stores/cart.jibb
159++$ state [items=(list @t) open=?]
160++$ poke
161+ [%add item=@t]
162+ %toggle
163+
164+++ main (build init update)
165+++ init ^- state [items=~ open=%.n]
166+++ update |= [a=poke s=state]
167+ ?- a
168+ [%add item] s(items=[item items.s])
169+ %toggle s(open=(not open.s))
170+++ build store
171+#### /ui/stores/cart/jibb store-hand-main
172+:: /ui/stores/cart.jibb
173++$ state [items=(list @t) open=?]
174++$ poke
175+ [%add item=@t]
176+ %toggle
177+
178+++ main [init update]
179+++ init ^- state [items=~ open=%.n]
180+++ update |= [a=poke s=state]
181+ ?- a
182+ [%add item] s(items=[item items.s])
183+ %toggle s(open=(not open.s))
184+#### /ui/todo-list/jibb castinit-second-watch
185+/= todo /ui/api/todo
186+
187+++ main (program init update view subs)
188+
189++$ model [todos=(list item.todo) draft=@t error=(unit @t)]
190++$ msg
191+ [%typed text=@t]
192+ %submit
193+ [%toggled id=@ud]
194+ [%got todos=(list item.todo)]
195+ [%acked err=(unit @t)]
196+
197+++ init |= ts=(list item.todo)
198+ ^- model [ts "" ~]
199+
200+++ update |= [=msg m=model]
201+ ?- msg
202+ [%typed t]
203+ ?- (gth (lent (tuba (trip t))) 80)
204+ %.y [m(draft=t error=`"Too long") ~]
205+ %.n [m(draft=t error=~) ~]
206+ %submit [m(draft="") ~[(poke.todo [%add draft.m] |=%acked)]]
207+ [%toggled id] [m ~[(poke.todo [%toggle id] |=%acked)]]
208+ [%got ts] [m(todos=ts) ~]
209+ [%acked err] [m(error=err) ~]
210+
211+++ subs |= m=model
212+ ~[[%watch (todos.todo |=%got)] [%watch (todos.todo |=%got)]]
213+
214+++ view |= m=model
215+ column ~[gap+%s2] ~[
216+ heading 2 "Todos"
217+ each (turn todos.m row-of)
218+ row ~[gap+%s1] ~[
219+ el ~[width+[%fill 1]] (field "New todo" draft.m |=%typed)
220+ button "Add" %submit
221+ el ~[tone+%danger] (text (fall error.m ""))
222+
223+++ row-of |= t=item.todo
224+ [id.t (toggle done.t text.t [%toggled id.t])]
225+#### /ui/todo-list/jibb castinit-subs-none
226+/= todo /ui/api/todo
227+
228+++ main (program init update view subs)
229+
230++$ model [todos=(list item.todo) draft=@t error=(unit @t)]
231++$ msg
232+ [%typed text=@t]
233+ %submit
234+ [%toggled id=@ud]
235+ [%got todos=(list item.todo)]
236+ [%acked err=(unit @t)]
237+
238+++ init |= ts=(list item.todo)
239+ ^- model [ts "" ~]
240+
241+++ update |= [=msg m=model]
242+ ?- msg
243+ [%typed t]
244+ ?- (gth (lent (tuba (trip t))) 80)
245+ %.y [m(draft=t error=`"Too long") ~]
246+ %.n [m(draft=t error=~) ~]
247+ %submit [m(draft="") ~[(poke.todo [%add draft.m] |=%acked)]]
248+ [%toggled id] [m ~[(poke.todo [%toggle id] |=%acked)]]
249+ [%got ts] [m(todos=ts) ~]
250+ [%acked err] [m(error=err) ~]
251+
252+++ subs |=(m ~)
253+
254+++ view |= m=model
255+ column ~[gap+%s2] ~[
256+ heading 2 "Todos"
257+ each (turn todos.m row-of)
258+ row ~[gap+%s1] ~[
259+ el ~[width+[%fill 1]] (field "New todo" draft.m |=%typed)
260+ button "Add" %submit
261+ el ~[tone+%danger] (text (fall error.m ""))
262+
263+++ row-of |= t=item.todo
264+ [id.t (toggle done.t text.t [%toggled id.t])]
265+#### /ui/todo-list/jibb castinit-subs-none-typed
266+/= todo /ui/api/todo
267+
268+++ main (program init update view subs)
269+
270++$ model [todos=(list item.todo) draft=@t error=(unit @t)]
271++$ msg
272+ [%typed text=@t]
273+ %submit
274+ [%toggled id=@ud]
275+ [%got todos=(list item.todo)]
276+ [%acked err=(unit @t)]
277+
278+++ init |= ts=(list item.todo)
279+ ^- model [ts "" ~]
280+
281+++ update |= [=msg m=model]
282+ ?- msg
283+ [%typed t]
284+ ?- (gth (lent (tuba (trip t))) 80)
285+ %.y [m(draft=t error=`"Too long") ~]
286+ %.n [m(draft=t error=~) ~]
287+ %submit [m(draft="") ~[(poke.todo [%add draft.m] |=%acked)]]
288+ [%toggled id] [m ~[(poke.todo [%toggle id] |=%acked)]]
289+ [%got ts] [m(todos=ts) ~]
290+ [%acked err] [m(error=err) ~]
291+
292+++ subs |=(m=model ~)
293+
294+++ view |= m=model
295+ column ~[gap+%s2] ~[
296+ heading 2 "Todos"
297+ each (turn todos.m row-of)
298+ row ~[gap+%s1] ~[
299+ el ~[width+[%fill 1]] (field "New todo" draft.m |=%typed)
300+ button "Add" %submit
301+ el ~[tone+%danger] (text (fall error.m ""))
302+
303+++ row-of |= t=item.todo
304+ [id.t (toggle done.t text.t [%toggled id.t])]
305+#### /ui/todo-list/jibb castinit-inline-row
306+/= todo /ui/api/todo
307+
308+++ main (program init update view subs)
309+
310++$ model [todos=(list item.todo) draft=@t error=(unit @t)]
311++$ msg
312+ [%typed text=@t]
313+ %submit
314+ [%toggled id=@ud]
315+ [%got todos=(list item.todo)]
316+ [%acked err=(unit @t)]
317+
318+++ init |= ts=(list item.todo)
319+ ^- model [ts "" ~]
320+
321+++ update |= [=msg m=model]
322+ ?- msg
323+ [%typed t]
324+ ?- (gth (lent (tuba (trip t))) 80)
325+ %.y [m(draft=t error=`"Too long") ~]
326+ %.n [m(draft=t error=~) ~]
327+ %submit [m(draft="") ~[(poke.todo [%add draft.m] |=%acked)]]
328+ [%toggled id] [m ~[(poke.todo [%toggle id] |=%acked)]]
329+ [%got ts] [m(todos=ts) ~]
330+ [%acked err] [m(error=err) ~]
331+
332+++ subs |= m=model
333+ ~[[%watch (todos.todo |=%got)]]
334+
335+++ view |= m=model
336+ column ~[gap+%s2] ~[
337+ heading 2 "Todos"
338+ each (turn todos.m |=(t=item.todo [id.t (toggle done.t text.t [%toggled id.t])]))
339+ row ~[gap+%s1] ~[
340+ el ~[width+[%fill 1]] (field "New todo" draft.m |=%typed)
341+ button "Add" %submit
342+ el ~[tone+%danger] (text (fall error.m ""))
343+#### /ui/todo-list/jibb castinit-update-helper
344+/= todo /ui/api/todo
345+
346+++ main (program init update view subs)
347+
348++$ model [todos=(list item.todo) draft=@t error=(unit @t)]
349++$ msg
350+ [%typed text=@t]
351+ %submit
352+ [%toggled id=@ud]
353+ [%got todos=(list item.todo)]
354+ [%acked err=(unit @t)]
355+
356+++ init |= ts=(list item.todo)
357+ ^- model [ts "" ~]
358+
359+++ update |= [=msg m=model]
360+ ?- msg
361+ [%typed t]
362+ ?- (gth (lent (tuba (trip t))) 80)
363+ %.y [m(draft=t error=`"Too long") ~]
364+ %.n [m(draft=t error=~) ~]
365+ %submit [m(draft="") ~[(add-cmd draft.m)]]
366+ [%toggled id] [m ~[(poke.todo [%toggle id] |=%acked)]]
367+ [%got ts] [m(todos=ts) ~]
368+ [%acked err] [m(error=err) ~]
369+
370+++ subs |= m=model
371+ ~[[%watch (todos.todo |=%got)]]
372+
373+++ view |= m=model
374+ column ~[gap+%s2] ~[
375+ heading 2 "Todos"
376+ each (turn todos.m row-of)
377+ row ~[gap+%s1] ~[
378+ el ~[width+[%fill 1]] (field "New todo" draft.m |=%typed)
379+ button "Add" %submit
380+ el ~[tone+%danger] (text (fall error.m ""))
381+
382+++ row-of |= t=item.todo
383+ [id.t (toggle done.t text.t [%toggled id.t])]
384+
385+++ add-cmd |= d=@t
386+ (poke.todo [%add d] |=%acked)
387+#### /ui/todo-list/jibb castinit-second-sub-every
388+/= todo /ui/api/todo
389+
390+++ main (program init update view subs)
391+
392++$ model [todos=(list item.todo) draft=@t error=(unit @t)]
393++$ msg
394+ [%typed text=@t]
395+ %submit
396+ [%toggled id=@ud]
397+ [%got todos=(list item.todo)]
398+ [%acked err=(unit @t)]
399+ [%tick at=@da]
400+
401+++ init |= ts=(list item.todo)
402+ ^- model [ts "" ~]
403+
404+++ update |= [=msg m=model]
405+ ?- msg
406+ [%typed t]
407+ ?- (gth (lent (tuba (trip t))) 80)
408+ %.y [m(draft=t error=`"Too long") ~]
409+ %.n [m(draft=t error=~) ~]
410+ %submit [m(draft="") ~[(poke.todo [%add draft.m] |=%acked)]]
411+ [%toggled id] [m ~[(poke.todo [%toggle id] |=%acked)]]
412+ [%got ts] [m(todos=ts) ~]
413+ [%acked err] [m(error=err) ~]
414+ [%tick at] [m ~]
415+
416+++ subs |= m=model
417+ ~[[%watch (todos.todo |=%got)] [%every ~s30 |=%tick]]
418+
419+++ view |= m=model
420+ column ~[gap+%s2] ~[
421+ heading 2 "Todos"
422+ each (turn todos.m row-of)
423+ row ~[gap+%s1] ~[
424+ el ~[width+[%fill 1]] (field "New todo" draft.m |=%typed)
425+ button "Add" %submit
426+ el ~[tone+%danger] (text (fall error.m ""))
427+
428+++ row-of |= t=item.todo
429+ [id.t (toggle done.t text.t [%toggled id.t])]
430+#### /ui/todo-list/jibb castinit-every-only
431+/= todo /ui/api/todo
432+
433+++ main (program init update view subs)
434+
435++$ model [todos=(list item.todo) draft=@t error=(unit @t)]
436++$ msg
437+ [%typed text=@t]
438+ %submit
439+ [%toggled id=@ud]
440+ [%got todos=(list item.todo)]
441+ [%acked err=(unit @t)]
442+ [%tick at=@da]
443+
444+++ init |= ts=(list item.todo)
445+ ^- model [ts "" ~]
446+
447+++ update |= [=msg m=model]
448+ ?- msg
449+ [%typed t]
450+ ?- (gth (lent (tuba (trip t))) 80)
451+ %.y [m(draft=t error=`"Too long") ~]
452+ %.n [m(draft=t error=~) ~]
453+ %submit [m(draft="") ~[(poke.todo [%add draft.m] |=%acked)]]
454+ [%toggled id] [m ~[(poke.todo [%toggle id] |=%acked)]]
455+ [%got ts] [m(todos=ts) ~]
456+ [%acked err] [m(error=err) ~]
457+ [%tick at] [m ~]
458+
459+++ subs |= m=model
460+ ~[[%every ~s30 |=%tick]]
461+
462+++ view |= m=model
463+ column ~[gap+%s2] ~[
464+ heading 2 "Todos"
465+ each (turn todos.m row-of)
466+ row ~[gap+%s1] ~[
467+ el ~[width+[%fill 1]] (field "New todo" draft.m |=%typed)
468+ button "Add" %submit
469+ el ~[tone+%danger] (text (fall error.m ""))
470+
471+++ row-of |= t=item.todo
472+ [id.t (toggle done.t text.t [%toggled id.t])]
473+#### /ui/stores/cart/jibb cart-init-uncast-tuple
474+:: /ui/stores/cart.jibb
475++$ state [items=(list @t) open=?]
476++$ poke
477+ [%add item=@t]
478+ %toggle
479+
480+++ main (store init update)
481+++ init [~ %.n]
482+++ update |= [a=poke s=state]
483+ ?- a
484+ [%add item] s(items=[item items.s])
485+ %toggle s(open=(not open.s))
486+#### /ui/stores/cart/jibb cart-init-uncast-nonull
487+:: /ui/stores/cart.jibb
488++$ state [count=@ud open=?]
489++$ poke
490+ [%add item=@t]
491+ %toggle
492+
493+++ main (store init update)
494+++ init [count=0 open=%.n]
495+++ update |= [a=poke s=state]
496+ ?- a
497+ [%add item] s(count=(add 1 count.s))
498+ %toggle s(open=(not open.s))
docs/reviews/2026-11-03-milestone-2-probes/variants/p6.outnew file+66
@@ -0,0 +1,66 @@
1+#### /ui/todo-list/jibb todo-full-alias
2+REJECTED: /ui/todo-list.jibb:14:10: nothing fixes the union of ~
3+ [ts "" ~]
4+ ^
5+#### /ui/todo-list/jibb todo-full-ambiguous-mapper
6+REJECTED: /ui/todo-list.jibb:14:10: nothing fixes the union of ~
7+ [ts "" ~]
8+ ^
9+#### /ui/index/jibb page-main-page-alias
10+REJECTED: module kind needs unsupported inference: /ui/index/jibb
11+#### /ui/index/jibb page-main-indirect-load
12+REJECTED: module kind needs unsupported inference: /ui/index/jibb
13+#### /ui/index/jibb page-main-pure-load
14+REJECTED: /ui/index.jibb:5:20: nothing fixes the union of ~
15+++ load |=(~ (pure ~))
16+ ^
17+#### /ui/index/jibb page-main-hand-built-load
18+REJECTED: module source does not parse: /ui/index/jibb
19+#### /ui/index/jibb page-main-typed-load
20+REJECTED: module definitions need unsupported inference: /ui/index/jibb: ++ load
21+#### /ui/index/jibb page-main-diff-load
22+REJECTED: module kind needs unsupported inference: /ui/index/jibb
23+#### /ui/stores/cart/jibb store-alias-main
24+REJECTED: module kind needs unsupported inference: /ui/stores/cart/jibb
25+#### /ui/stores/cart/jibb store-hand-main
26+REJECTED: module kind needs unsupported inference: /ui/stores/cart/jibb
27+#### /ui/todo-list/jibb castinit-second-watch
28+REJECTED: module definitions need unsupported inference: /ui/todo-list/jibb: ++ subs
29+#### /ui/todo-list/jibb castinit-subs-none
30+REJECTED: /ui/todo-list.jibb:27:14: nothing fixes the union of ~
31+++ subs |=(m ~)
32+ ^
33+#### /ui/todo-list/jibb castinit-subs-none-typed
34+CHECKED
35++$ model: [todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]]
36++$ msg: msg
37+++ main: [init=$-((list [id=@ud [done=? text=@t]]) [todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]]) [update=$-([msg [todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]]] [[todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]] (list (cmd msg))]) [view=$-([todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]] (element msg)) subs=$-([todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]] (list (sub msg)))]]]
38+++ view: $-([todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]] (element msg))
39+++ row-of: $-([id=@ud [done=? text=@t]] [key=@ud el=(element msg)])
40+++ subs: $-([todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]] (list (sub msg)))
41+++ update: $-([msg=msg m=[todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]]] [[todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]] (list (cmd msg))])
42+++ init: $-((list [id=@ud [done=? text=@t]]) [todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]])
43+#### /ui/todo-list/jibb castinit-inline-row
44+REJECTED: module definitions need unsupported inference: /ui/todo-list/jibb: ++ view
45+#### /ui/todo-list/jibb castinit-update-helper
46+REJECTED: /ui/todo-list.jibb:40:32: nothing fixes the union of %toggled
47+ [id.t (toggle done.t text.t [%toggled id.t])]
48+ ^
49+#### /ui/todo-list/jibb castinit-second-sub-every
50+REJECTED: module kind needs unsupported inference: /ui/todo-list/jibb
51+#### /ui/todo-list/jibb castinit-every-only
52+REJECTED: module kind needs unsupported inference: /ui/todo-list/jibb
53+#### /ui/stores/cart/jibb cart-init-uncast-tuple
54+REJECTED: /ui/stores/cart.jibb:8:10: nothing fixes the union of ~
55+++ init [~ %.n]
56+ ^
57+#### /ui/stores/cart/jibb cart-init-uncast-nonull
58+CHECKED
59++$ state: [count=@ud open=?]
60++$ poke: poke
61+++ state: $-($-([count=@ud open=?] A) (ask A))
62+++ poke: $-([poke $-((unit @t) A)] (cmd A))
63+++ main: [init=[count=@ud open=?] update=*]
64+++ update: $-([a=poke s=[count=@ud open=?]] [count=@ud open=?])
65+++ init: [count=@ud open=?]
66+
docs/reviews/2026-11-03-milestone-2-probes/variants/p7.jibbnew file+389
@@ -0,0 +1,389 @@
1+#### /ui/todo-list/jibb castinit-two-each
2+/= todo /ui/api/todo
3+
4+++ main (program init update view subs)
5+
6++$ model [todos=(list item.todo) draft=@t error=(unit @t)]
7++$ msg
8+ [%typed text=@t]
9+ %submit
10+ [%toggled id=@ud]
11+ [%got todos=(list item.todo)]
12+ [%acked err=(unit @t)]
13+
14+++ init |= ts=(list item.todo)
15+ ^- model [ts "" ~]
16+
17+++ update |= [=msg m=model]
18+ ?- msg
19+ [%typed t]
20+ ?- (gth (lent (tuba (trip t))) 80)
21+ %.y [m(draft=t error=`"Too long") ~]
22+ %.n [m(draft=t error=~) ~]
23+ %submit [m(draft="") ~[(poke.todo [%add draft.m] |=%acked)]]
24+ [%toggled id] [m ~[(poke.todo [%toggle id] |=%acked)]]
25+ [%got ts] [m(todos=ts) ~]
26+ [%acked err] [m(error=err) ~]
27+
28+++ subs |= m=model
29+ ~[[%watch (todos.todo |=%got)]]
30+
31+++ view |= m=model
32+ column ~[gap+%s2] ~[
33+ heading 2 "Todos"
34+ each (turn todos.m row-of)
35+ each (turn todos.m row-of)
36+ row ~[gap+%s1] ~[
37+ el ~[width+[%fill 1]] (field "New todo" draft.m |=%typed)
38+ button "Add" %submit
39+ el ~[tone+%danger] (text (fall error.m ""))
40+
41+++ row-of |= t=item.todo
42+ [id.t (toggle done.t text.t [%toggled id.t])]
43+#### /ui/todo-list/jibb two-each-orig-init
44+/= todo /ui/api/todo
45+
46+++ main (program init update view subs)
47+
48++$ model [todos=(list item.todo) draft=@t error=(unit @t)]
49++$ msg
50+ [%typed text=@t]
51+ %submit
52+ [%toggled id=@ud]
53+ [%got todos=(list item.todo)]
54+ [%acked err=(unit @t)]
55+
56+++ init |= ts=(list item.todo)
57+ [todos=ts draft="" error=~]
58+
59+++ update |= [=msg m=model]
60+ ?- msg
61+ [%typed t]
62+ ?- (gth (lent (tuba (trip t))) 80)
63+ %.y [m(draft=t error=`"Too long") ~]
64+ %.n [m(draft=t error=~) ~]
65+ %submit [m(draft="") ~[(poke.todo [%add draft.m] |=%acked)]]
66+ [%toggled id] [m ~[(poke.todo [%toggle id] |=%acked)]]
67+ [%got ts] [m(todos=ts) ~]
68+ [%acked err] [m(error=err) ~]
69+
70+++ subs |= m=model
71+ ~[[%watch (todos.todo |=%got)]]
72+
73+++ view |= m=model
74+ column ~[gap+%s2] ~[
75+ heading 2 "Todos"
76+ each (turn todos.m row-of)
77+ each (turn todos.m row-of)
78+ row ~[gap+%s1] ~[
79+ el ~[width+[%fill 1]] (field "New todo" draft.m |=%typed)
80+ button "Add" %submit
81+ el ~[tone+%danger] (text (fall error.m ""))
82+
83+++ row-of |= t=item.todo
84+ [id.t (toggle done.t text.t [%toggled id.t])]
85+#### /ui/todo-list/jibb update-catch-all
86+/= todo /ui/api/todo
87+
88+++ main (program init update view subs)
89+
90++$ model [todos=(list item.todo) draft=@t error=(unit @t)]
91++$ msg
92+ [%typed text=@t]
93+ %submit
94+ [%toggled id=@ud]
95+ [%got todos=(list item.todo)]
96+ [%acked err=(unit @t)]
97+
98+++ init |= ts=(list item.todo)
99+ [todos=ts draft="" error=~]
100+
101+++ update |= [=msg m=model]
102+ ?- msg
103+ [%typed t]
104+ ?- (gth (lent (tuba (trip t))) 80)
105+ %.y [m(draft=t error=`"Too long") ~]
106+ %.n [m(draft=t error=~) ~]
107+ %submit [m(draft="") ~[(poke.todo [%add draft.m] |=%acked)]]
108+ [%toggled id] [m ~[(poke.todo [%toggle id] |=%acked)]]
109+ [%got ts] [m(todos=ts) ~]
110+ * [m ~]
111+
112+++ subs |= m=model
113+ ~[[%watch (todos.todo |=%got)]]
114+
115+++ view |= m=model
116+ column ~[gap+%s2] ~[
117+ heading 2 "Todos"
118+ each (turn todos.m row-of)
119+ row ~[gap+%s1] ~[
120+ el ~[width+[%fill 1]] (field "New todo" draft.m |=%typed)
121+ button "Add" %submit
122+ el ~[tone+%danger] (text (fall error.m ""))
123+
124+++ row-of |= t=item.todo
125+ [id.t (toggle done.t text.t [%toggled id.t])]
126+#### /ui/todo-list/jibb update-arms-reordered
127+/= todo /ui/api/todo
128+
129+++ main (program init update view subs)
130+
131++$ model [todos=(list item.todo) draft=@t error=(unit @t)]
132++$ msg
133+ [%typed text=@t]
134+ %submit
135+ [%toggled id=@ud]
136+ [%got todos=(list item.todo)]
137+ [%acked err=(unit @t)]
138+
139+++ init |= ts=(list item.todo)
140+ [todos=ts draft="" error=~]
141+
142+++ update |= [=msg m=model]
143+ ?- msg
144+ [%typed t]
145+ ?- (gth (lent (tuba (trip t))) 80)
146+ %.y [m(draft=t error=`"Too long") ~]
147+ %.n [m(draft=t error=~) ~]
148+ [%got ts] [m(todos=ts) ~]
149+ %submit [m(draft="") ~[(poke.todo [%add draft.m] |=%acked)]]
150+ [%toggled id] [m ~[(poke.todo [%toggle id] |=%acked)]]
151+ [%acked err] [m(error=err) ~]
152+
153+++ subs |= m=model
154+ ~[[%watch (todos.todo |=%got)]]
155+
156+++ view |= m=model
157+ column ~[gap+%s2] ~[
158+ heading 2 "Todos"
159+ each (turn todos.m row-of)
160+ row ~[gap+%s1] ~[
161+ el ~[width+[%fill 1]] (field "New todo" draft.m |=%typed)
162+ button "Add" %submit
163+ el ~[tone+%danger] (text (fall error.m ""))
164+
165+++ row-of |= t=item.todo
166+ [id.t (toggle done.t text.t [%toggled id.t])]
167+#### /ui/todo-list/jibb model-extra-field
168+/= todo /ui/api/todo
169+
170+++ main (program init update view subs)
171+
172++$ model [todos=(list item.todo) draft=@t error=(unit @t) count=@ud]
173++$ msg
174+ [%typed text=@t]
175+ %submit
176+ [%toggled id=@ud]
177+ [%got todos=(list item.todo)]
178+ [%acked err=(unit @t)]
179+
180+++ init |= ts=(list item.todo)
181+ [todos=ts draft="" error=~ count=0]
182+
183+++ update |= [=msg m=model]
184+ ?- msg
185+ [%typed t]
186+ ?- (gth (lent (tuba (trip t))) 80)
187+ %.y [m(draft=t error=`"Too long") ~]
188+ %.n [m(draft=t error=~) ~]
189+ %submit [m(draft="") ~[(poke.todo [%add draft.m] |=%acked)]]
190+ [%toggled id] [m ~[(poke.todo [%toggle id] |=%acked)]]
191+ [%got ts] [m(todos=ts) ~]
192+ [%acked err] [m(error=err) ~]
193+
194+++ subs |= m=model
195+ ~[[%watch (todos.todo |=%got)]]
196+
197+++ view |= m=model
198+ column ~[gap+%s2] ~[
199+ heading 2 "Todos"
200+ each (turn todos.m row-of)
201+ row ~[gap+%s1] ~[
202+ el ~[width+[%fill 1]] (field "New todo" draft.m |=%typed)
203+ button "Add" %submit
204+ el ~[tone+%danger] (text (fall error.m ""))
205+
206+++ row-of |= t=item.todo
207+ [id.t (toggle done.t text.t [%toggled id.t])]
208+#### /ui/todo-list/jibb main-open-paren
209+/= todo /ui/api/todo
210+
211+++ main (program init update
212+ view
213+ subs
214+
215++$ model [todos=(list item.todo) draft=@t error=(unit @t)]
216++$ msg
217+ [%typed text=@t]
218+ %submit
219+ [%toggled id=@ud]
220+ [%got todos=(list item.todo)]
221+ [%acked err=(unit @t)]
222+
223+++ init |= ts=(list item.todo)
224+ [todos=ts draft="" error=~]
225+
226+++ update |= [=msg m=model]
227+ ?- msg
228+ [%typed t]
229+ ?- (gth (lent (tuba (trip t))) 80)
230+ %.y [m(draft=t error=`"Too long") ~]
231+ %.n [m(draft=t error=~) ~]
232+ %submit [m(draft="") ~[(poke.todo [%add draft.m] |=%acked)]]
233+ [%toggled id] [m ~[(poke.todo [%toggle id] |=%acked)]]
234+ [%got ts] [m(todos=ts) ~]
235+ [%acked err] [m(error=err) ~]
236+
237+++ subs |= m=model
238+ ~[[%watch (todos.todo |=%got)]]
239+
240+++ view |= m=model
241+ column ~[gap+%s2] ~[
242+ heading 2 "Todos"
243+ each (turn todos.m row-of)
244+ row ~[gap+%s1] ~[
245+ el ~[width+[%fill 1]] (field "New todo" draft.m |=%typed)
246+ button "Add" %submit
247+ el ~[tone+%danger] (text (fall error.m ""))
248+
249+++ row-of |= t=item.todo
250+ [id.t (toggle done.t text.t [%toggled id.t])]
251+#### /ui/index/jibb index-two-islands
252+/= todo /ui/api/todo
253+/= todo-list /ui/todo-list
254+
255+++ main (page load view)
256+++ load |=(~ (todos.todo same))
257+
258+++ view |= ts=(list item.todo)
259+ column ~[pad+%s3] ~[
260+ heading 1 "My ship"
261+ island main.todo-list ts
262+ island main.todo-list ts
263+#### /ui/index/jibb index-island-flop
264+/= todo /ui/api/todo
265+/= todo-list /ui/todo-list
266+
267+++ main (page load view)
268+++ load |=(~ (todos.todo same))
269+
270+++ view |= ts=(list item.todo)
271+ column ~[pad+%s3] ~[
272+ heading 1 "My ship"
273+ island main.todo-list (flop ts)
274+#### /ui/index/jibb index-hand-built-tall
275+/= todo /ui/api/todo
276+/= todo-list /ui/todo-list
277+
278+++ main (page load view)
279+++ load |= ~
280+ ^- (ask (list item.todo))
281+ [%pure ~]
282+
283+++ view |= ts=(list item.todo)
284+ column ~[pad+%s3] ~[
285+ heading 1 "My ship"
286+ island main.todo-list ts
287+#### /ui/basket/jibb basket-unused-size
288+:: /ui/basket.jibb
289+/= cart /ui/stores/cart
290+
291+++ main (program init update view subs)
292+
293++$ model [cart=state.cart note=@t]
294++$ msg
295+ [%noted text=@t]
296+ %add
297+ %toggle
298+ [%got cart=state.cart]
299+ [%acked err=(unit @t)]
300+
301+++ init |= ~
302+ [cart=[items=~ open=%.n] note=""]
303+
304+++ update |= [=msg m=model]
305+ ?- msg
306+ [%noted t] [m(note=t) ~]
307+ %add [m(note="") ~[(poke.cart [%add note.m] |=%acked)]]
308+ %toggle [m ~[(poke.cart %toggle |=%acked)]]
309+ [%got c] [m(cart=c) ~]
310+ [%acked err] [m ~]
311+
312+++ subs |= m=model
313+ ~[[%watch (state.cart |=%got)]]
314+
315+++ view |= m=model
316+ column ~[gap+%s1] ~[
317+ (text "{(lent items.cart.m)} items")
318+ field "Item" note.m |=%noted
319+ button "Add" %add
320+
321+++ size |= m=model
322+ (lent items.cart.m)
323+#### /ui/basket/jibb basket-update-helper
324+:: /ui/basket.jibb
325+/= cart /ui/stores/cart
326+
327+++ main (program init update view subs)
328+
329++$ model [cart=state.cart note=@t]
330++$ msg
331+ [%noted text=@t]
332+ %add
333+ %toggle
334+ [%got cart=state.cart]
335+ [%acked err=(unit @t)]
336+
337+++ init |= ~
338+ [cart=[items=~ open=%.n] note=""]
339+
340+++ update |= [=msg m=model]
341+ ?- msg
342+ [%noted t] [m(note=t) ~]
343+ %add [m(note="") ~[(poke.cart [%add note.m] |=%acked)]]
344+ %toggle [m ~[flip]]
345+ [%got c] [m(cart=c) ~]
346+ [%acked err] [m ~]
347+
348+++ subs |= m=model
349+ ~[[%watch (state.cart |=%got)]]
350+
351+++ view |= m=model
352+ column ~[gap+%s1] ~[
353+ (text "{(lent items.cart.m)} items")
354+ field "Item" note.m |=%noted
355+ button "Add" %add
356+
357+++ flip ^- (cmd msg) (poke.cart %toggle |=%acked)
358+#### /ui/basket/jibb basket-subs-none
359+:: /ui/basket.jibb
360+/= cart /ui/stores/cart
361+
362+++ main (program init update view subs)
363+
364++$ model [cart=state.cart note=@t]
365++$ msg
366+ [%noted text=@t]
367+ %add
368+ %toggle
369+ [%got cart=state.cart]
370+ [%acked err=(unit @t)]
371+
372+++ init |= ~
373+ [cart=[items=~ open=%.n] note=""]
374+
375+++ update |= [=msg m=model]
376+ ?- msg
377+ [%noted t] [m(note=t) ~]
378+ %add [m(note="") ~[(poke.cart [%add note.m] |=%acked)]]
379+ %toggle [m ~[(poke.cart %toggle |=%acked)]]
380+ [%got c] [m(cart=c) ~]
381+ [%acked err] [m ~]
382+
383+++ subs |=(m ~)
384+
385+++ view |= m=model
386+ column ~[gap+%s1] ~[
387+ (text "{(lent items.cart.m)} items")
388+ field "Item" note.m |=%noted
389+ button "Add" %add
docs/reviews/2026-11-03-milestone-2-probes/variants/p7.outnew file+85
@@ -0,0 +1,85 @@
1+#### /ui/todo-list/jibb castinit-two-each
2+REJECTED: /ui/todo-list.jibb:41:32: nothing fixes the union of %toggled
3+ [id.t (toggle done.t text.t [%toggled id.t])]
4+ ^
5+#### /ui/todo-list/jibb two-each-orig-init
6+REJECTED: /ui/todo-list.jibb:14:28: nothing fixes the union of ~
7+ [todos=ts draft="" error=~]
8+ ^
9+#### /ui/todo-list/jibb update-catch-all
10+CHECKED
11++$ model: [todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]]
12++$ msg: msg
13+++ main: [init=$-((list [id=@ud [done=? text=@t]]) [todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]]) [update=$-([msg [todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]]] [[todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]] (list (cmd msg))]) [view=$-([todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]] (element msg)) subs=$-([todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]] (list (sub msg)))]]]
14+++ init: $-((list [id=@ud [done=? text=@t]]) [todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]])
15+++ view: $-([todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]] (element msg))
16+++ row-of: $-([id=@ud [done=? text=@t]] [key=@ud el=(element msg)])
17+++ subs: $-([todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]] (list (sub msg)))
18+++ update: $-([msg=msg m=[todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]]] [[todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]] (list (cmd msg))])
19+#### /ui/todo-list/jibb update-arms-reordered
20+CHECKED
21++$ model: [todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]]
22++$ msg: msg
23+++ main: [init=$-((list [id=@ud [done=? text=@t]]) [todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]]) [update=$-([msg [todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]]] [[todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]] (list (cmd msg))]) [view=$-([todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]] (element msg)) subs=$-([todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]] (list (sub msg)))]]]
24+++ init: $-((list [id=@ud [done=? text=@t]]) [todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]])
25+++ view: $-([todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]] (element msg))
26+++ row-of: $-([id=@ud [done=? text=@t]] [key=@ud el=(element msg)])
27+++ subs: $-([todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]] (list (sub msg)))
28+++ update: $-([msg=msg m=[todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]]] [[todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]] (list (cmd msg))])
29+#### /ui/todo-list/jibb model-extra-field
30+CHECKED
31++$ model: [todos=(list [id=@ud [done=? text=@t]]) [draft=@t [error=(unit @t) count=@ud]]]
32++$ msg: msg
33+++ main: [init=$-((list [id=@ud [done=? text=@t]]) [todos=(list [id=@ud [done=? text=@t]]) [draft=@t [error=(unit @t) count=@ud]]]) [update=$-([msg [todos=(list [id=@ud [done=? text=@t]]) [draft=@t [error=(unit @t) count=@ud]]]] [[todos=(list [id=@ud [done=? text=@t]]) [draft=@t [error=(unit @t) count=@ud]]] (list (cmd msg))]) [view=$-([todos=(list [id=@ud [done=? text=@t]]) [draft=@t [error=(unit @t) count=@ud]]] (element msg)) subs=$-([todos=(list [id=@ud [done=? text=@t]]) [draft=@t [error=(unit @t) count=@ud]]] (list (sub msg)))]]]
34+++ init: $-((list [id=@ud [done=? text=@t]]) [todos=(list [id=@ud [done=? text=@t]]) [draft=@t [error=(unit @t) count=@ud]]])
35+++ view: $-([todos=(list [id=@ud [done=? text=@t]]) [draft=@t [error=(unit @t) count=@ud]]] (element msg))
36+++ row-of: $-([id=@ud [done=? text=@t]] [key=@ud el=(element msg)])
37+++ subs: $-([todos=(list [id=@ud [done=? text=@t]]) [draft=@t [error=(unit @t) count=@ud]]] (list (sub msg)))
38+++ update: $-([msg=msg m=[todos=(list [id=@ud [done=? text=@t]]) [draft=@t [error=(unit @t) count=@ud]]]] [[todos=(list [id=@ud [done=? text=@t]]) [draft=@t [error=(unit @t) count=@ud]]] (list (cmd msg))])
39+#### /ui/todo-list/jibb main-open-paren
40+CHECKED
41++$ model: [todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]]
42++$ msg: msg
43+++ main: [init=$-((list [id=@ud [done=? text=@t]]) [todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]]) [update=$-([msg [todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]]] [[todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]] (list (cmd msg))]) [view=$-([todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]] (element msg)) subs=$-([todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]] (list (sub msg)))]]]
44+++ init: $-((list [id=@ud [done=? text=@t]]) [todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]])
45+++ view: $-([todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]] (element msg))
46+++ row-of: $-([id=@ud [done=? text=@t]] [key=@ud el=(element msg)])
47+++ subs: $-([todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]] (list (sub msg)))
48+++ update: $-([msg=msg m=[todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]]] [[todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]] (list (cmd msg))])
49+#### /ui/index/jibb index-two-islands
50+CHECKED
51+++ main: [load=$-(~ (ask (list [id=@ud [done=? text=@t]]))) view=$-((list [id=@ud [done=? text=@t]]) (element !!))]
52+++ view: $-((list [id=@ud [done=? text=@t]]) (element !!))
53+++ load: $-(~ (ask (list [id=@ud [done=? text=@t]])))
54+#### /ui/index/jibb index-island-flop
55+CHECKED
56+++ main: [load=$-(~ (ask (list [id=@ud [done=? text=@t]]))) view=$-((list [id=@ud [done=? text=@t]]) (element !!))]
57+++ view: $-((list [id=@ud [done=? text=@t]]) (element !!))
58+++ load: $-(~ (ask (list [id=@ud [done=? text=@t]])))
59+#### /ui/index/jibb index-hand-built-tall
60+REJECTED: module source does not parse: /ui/index/jibb
61+#### /ui/basket/jibb basket-unused-size
62+CHECKED
63++$ model: [cart=[items=(list @t) open=?] note=@t]
64++$ msg: msg
65+++ main: [init=$-(~ [cart=[items=(list @t) open=?] note=@t]) [update=$-([msg [cart=[items=(list @t) open=?] note=@t]] [[cart=[items=(list @t) open=?] note=@t] (list (cmd msg))]) [view=$-([cart=[items=(list @t) open=?] note=@t] (element msg)) subs=$-([cart=[items=(list @t) open=?] note=@t] (list (sub msg)))]]]
66+++ init: $-(~ [cart=[items=(list @t) open=?] note=@t])
67+++ view: $-([cart=[items=(list @t) open=?] note=@t] (element msg))
68+++ subs: $-([cart=[items=(list @t) open=?] note=@t] (list (sub msg)))
69+++ update: $-([msg=msg m=[cart=[items=(list @t) open=?] note=@t]] [[cart=[items=(list @t) open=?] note=@t] (list (cmd msg))])
70+++ size: $-([cart=[items=(list @t) open=?] note=@t] @ud)
71+#### /ui/basket/jibb basket-update-helper
72+CHECKED
73++$ model: [cart=[items=(list @t) open=?] note=@t]
74++$ msg: msg
75+++ main: [init=$-(~ [cart=[items=(list @t) open=?] note=@t]) [update=$-([msg [cart=[items=(list @t) open=?] note=@t]] [[cart=[items=(list @t) open=?] note=@t] (list (cmd msg))]) [view=$-([cart=[items=(list @t) open=?] note=@t] (element msg)) subs=$-([cart=[items=(list @t) open=?] note=@t] (list (sub msg)))]]]
76+++ init: $-(~ [cart=[items=(list @t) open=?] note=@t])
77+++ view: $-([cart=[items=(list @t) open=?] note=@t] (element msg))
78+++ subs: $-([cart=[items=(list @t) open=?] note=@t] (list (sub msg)))
79+++ update: $-([msg=msg m=[cart=[items=(list @t) open=?] note=@t]] [[cart=[items=(list @t) open=?] note=@t] (list (cmd msg))])
80+++ flip: (cmd msg)
81+#### /ui/basket/jibb basket-subs-none
82+REJECTED: /ui/basket.jibb:15:16: nothing fixes the union of ~
83+ [cart=[items=~ open=%.n] note=""]
84+ ^
85+
docs/reviews/2026-11-03-milestone-2-probes/variants/p8.jibbnew file+342
@@ -0,0 +1,342 @@
1+#### /ui/todo-list/jibb todo-full-wrong-model
2+/= todo /ui/api/todo
3+
4+++ main (program init update view subs)
5+
6++$ model [todos=(list item.todo) draft=@t error=(unit @t)]
7++$ msg
8+ [%typed text=@t]
9+ %submit
10+ [%toggled id=@ud]
11+ [%got todos=(list item.todo)]
12+ [%acked err=(unit @t)]
13+
14+++ init |= ts=(list item.todo)
15+ [ts "" ~]
16+
17+++ update |= [=msg m=model]
18+ ?- msg
19+ [%typed t]
20+ ?- (gth (lent (tuba (trip t))) 80)
21+ %.y [m(draft=t error=`"Too long") ~]
22+ %.n [m(draft=t error=~) ~]
23+ %submit [m(draft="") ~[(poke.todo [%add draft.m] |=%acked)]]
24+ [%toggled id] [m ~[(poke.todo [%toggle id] |=%acked)]]
25+ [%got ts] [m(todos=ts) ~]
26+ [%acked err] [m(error=err) ~]
27+
28+++ subs |= m=[count=@ud]
29+ ~[[%watch (todos.todo |=%got)]]
30+
31+++ view |= m=model
32+ column ~[gap+%s2] ~[
33+ heading 2 "Todos"
34+ each (turn todos.m row-of)
35+ row ~[gap+%s1] ~[
36+ el ~[width+[%fill 1]] (field "New todo" draft.m |=%typed)
37+ button "Add" %submit
38+ el ~[tone+%danger] (text (fall error.m ""))
39+
40+++ row-of |= t=item.todo
41+ [id.t (toggle done.t text.t [%toggled id.t])]
42+#### /ui/todo-list/jibb todo-full-wrong-message
43+/= todo /ui/api/todo
44+
45+++ main (program init update view subs)
46+
47++$ model [todos=(list item.todo) draft=@t error=(unit @t)]
48++$ msg
49+ [%typed text=@t]
50+ %submit
51+ [%toggled id=@ud]
52+ [%got todos=(list item.todo)]
53+ [%acked err=(unit @t)]
54+
55+++ init |= ts=(list item.todo)
56+ [ts "" ~]
57+
58+++ update |= [=msg m=model]
59+ ?- msg
60+ [%typed t]
61+ ?- (gth (lent (tuba (trip t))) 80)
62+ %.y [m(draft=t error=`"Too long") ~]
63+ %.n [m(draft=t error=~) ~]
64+ %submit [m(draft="") ~[(poke.todo [%add draft.m] |=%acked)]]
65+ [%toggled id] [m ~[(poke.todo [%toggle id] |=%acked)]]
66+ [%got ts] [m(todos=ts) ~]
67+ [%acked err] [m(error=err) ~]
68+
69+++ subs |= m=model
70+ ~[[%watch (todos.todo |=%got)]]
71+
72+++ view |= m=model
73+ column ~[gap+%s2] ~[
74+ heading 2 "Todos"
75+ each (turn todos.m row-of)
76+ row ~[gap+%s1] ~[
77+ el ~[width+[%fill 1]] (field "New todo" draft.m |=%typed)
78+ button "Add" %submit
79+ el ~[tone+%danger] (text (fall error.m ""))
80+
81+++ row-of |= t=item.todo
82+ [id.t (toggle done.t text.t [%other])]
83+#### /ui/todo-list/jibb todo-full-wrong-result
84+/= todo /ui/api/todo
85+
86+++ main (program init update view subs)
87+
88++$ model [todos=(list item.todo) draft=@t error=(unit @t)]
89++$ msg
90+ [%typed text=@t]
91+ %submit
92+ [%toggled id=@ud]
93+ [%got todos=(list item.todo)]
94+ [%acked err=(unit @t)]
95+
96+++ init |= ts=(list item.todo)
97+ [ts "" ~]
98+
99+++ update |= [=msg m=model]
100+ ?- msg
101+ [%typed t]
102+ ?- (gth (lent (tuba (trip t))) 80)
103+ %.y [m(draft=t error=`"Too long") ~]
104+ %.n [m(draft=t error=~) ~]
105+ %submit [m(draft="") ~[(poke.todo [%add draft.m] |=%acked)]]
106+ [%toggled id] [m ~[(poke.todo [%toggle id] |=%acked)]]
107+ [%got ts] [m(todos=ts) ~]
108+ [%acked err] [m(error=err) ~]
109+
110+++ subs |= m=model
111+ ~[[%watch (todos.todo |=%got)]]
112+
113+++ view |= m=model
114+ column ~[gap+%s2] ~[
115+ heading 2 "Todos"
116+ each (turn todos.m row-of)
117+ row ~[gap+%s1] ~[
118+ el ~[width+[%fill 1]] (field "New todo" draft.m |=%typed)
119+ button "Add" %submit
120+ el ~[tone+%danger] (text (fall error.m ""))
121+
122+++ row-of |= t=item.todo
123+ text.t
124+#### /ui/todo-list/jibb todo-full-open-key
125+/= todo /ui/api/todo
126+
127+++ main (program init update view subs)
128+
129++$ model [todos=(list item.todo) draft=@t error=(unit @t)]
130++$ msg
131+ [%typed text=@t]
132+ %submit
133+ [%toggled id=@ud]
134+ [%got todos=(list item.todo)]
135+ [%acked err=(unit @t)]
136+
137+++ init |= ts=(list item.todo)
138+ [ts "" ~]
139+
140+++ update |= [=msg m=model]
141+ ?- msg
142+ [%typed t]
143+ ?- (gth (lent (tuba (trip t))) 80)
144+ %.y [m(draft=t error=`"Too long") ~]
145+ %.n [m(draft=t error=~) ~]
146+ %submit [m(draft="") ~[(poke.todo [%add draft.m] |=%acked)]]
147+ [%toggled id] [m ~[(poke.todo [%toggle id] |=%acked)]]
148+ [%got ts] [m(todos=ts) ~]
149+ [%acked err] [m(error=err) ~]
150+
151+++ subs |= m=model
152+ ~[[%watch (todos.todo |=%got)]]
153+
154+++ view |= m=model
155+ column ~[gap+%s2] ~[
156+ heading 2 "Todos"
157+ each (turn todos.m row-of)
158+ row ~[gap+%s1] ~[
159+ el ~[width+[%fill 1]] (field "New todo" draft.m |=%typed)
160+ button "Add" %submit
161+ el ~[tone+%danger] (text (fall error.m ""))
162+
163+++ row-of |= t=item.todo
164+ [!! (toggle done.t text.t [%toggled id.t])]
165+#### /ui/todo-list/jibb todo-full-wrong-watch
166+/= todo /ui/api/todo
167+
168+++ main (program init update view subs)
169+
170++$ model [todos=(list item.todo) draft=@t error=(unit @t)]
171++$ msg
172+ [%typed text=@t]
173+ %submit
174+ [%toggled id=@ud]
175+ [%got todos=(list item.todo)]
176+ [%acked err=(unit @t)]
177+
178+++ init |= ts=(list item.todo)
179+ [ts "" ~]
180+
181+++ update |= [=msg m=model]
182+ ?- msg
183+ [%typed t]
184+ ?- (gth (lent (tuba (trip t))) 80)
185+ %.y [m(draft=t error=`"Too long") ~]
186+ %.n [m(draft=t error=~) ~]
187+ %submit [m(draft="") ~[(poke.todo [%add draft.m] |=%acked)]]
188+ [%toggled id] [m ~[(poke.todo [%toggle id] |=%acked)]]
189+ [%got ts] [m(todos=ts) ~]
190+ [%acked err] [m(error=err) ~]
191+
192+++ subs |= m=model
193+ ~[[%watch (pure %submit)]]
194+
195+++ view |= m=model
196+ column ~[gap+%s2] ~[
197+ heading 2 "Todos"
198+ each (turn todos.m row-of)
199+ row ~[gap+%s1] ~[
200+ el ~[width+[%fill 1]] (field "New todo" draft.m |=%typed)
201+ button "Add" %submit
202+ el ~[tone+%danger] (text (fall error.m ""))
203+
204+++ row-of |= t=item.todo
205+ [id.t (toggle done.t text.t [%toggled id.t])]
206+#### /ui/todo-list/jibb todo-full-non-gate-view
207+/= todo /ui/api/todo
208+
209+++ main (program init update view subs)
210+
211++$ model [todos=(list item.todo) draft=@t error=(unit @t)]
212++$ msg
213+ [%typed text=@t]
214+ %submit
215+ [%toggled id=@ud]
216+ [%got todos=(list item.todo)]
217+ [%acked err=(unit @t)]
218+
219+++ init |= ts=(list item.todo)
220+ [ts "" ~]
221+
222+++ update |= [=msg m=model]
223+ ?- msg
224+ [%typed t]
225+ ?- (gth (lent (tuba (trip t))) 80)
226+ %.y [m(draft=t error=`"Too long") ~]
227+ %.n [m(draft=t error=~) ~]
228+ %submit [m(draft="") ~[(poke.todo [%add draft.m] |=%acked)]]
229+ [%toggled id] [m ~[(poke.todo [%toggle id] |=%acked)]]
230+ [%got ts] [m(todos=ts) ~]
231+ [%acked err] [m(error=err) ~]
232+
233+++ subs |= m=model
234+ ~[[%watch (todos.todo |=%got)]]
235+
236+++ view init
237+
238+++ row-of |= t=item.todo
239+ [id.t (toggle done.t text.t [%toggled id.t])]
240+#### /ui/todo-list/jibb todo-full-cast-init
241+/= todo /ui/api/todo
242+
243+++ main (program init update view subs)
244+
245++$ model [todos=(list item.todo) draft=@t error=(unit @t)]
246++$ msg
247+ [%typed text=@t]
248+ %submit
249+ [%toggled id=@ud]
250+ [%got todos=(list item.todo)]
251+ [%acked err=(unit @t)]
252+
253+++ make-model |= ts=(list item.todo)
254+ ^- model [ts "" ~]
255+
256+++ init ^- $-((list item.todo) model)
257+ |= ts=(list item.todo) (make-model ts)
258+
259+++ update |= [=msg m=model]
260+ ?- msg
261+ [%typed t]
262+ ?- (gth (lent (tuba (trip t))) 80)
263+ %.y [m(draft=t error=`"Too long") ~]
264+ %.n [m(draft=t error=~) ~]
265+ %submit [m(draft="") ~[(poke.todo [%add draft.m] |=%acked)]]
266+ [%toggled id] [m ~[(poke.todo [%toggle id] |=%acked)]]
267+ [%got ts] [m(todos=ts) ~]
268+ [%acked err] [m(error=err) ~]
269+
270+++ subs |= m=model
271+ ~[[%watch (todos.todo |=%got)]]
272+
273+++ view |= m=model
274+ column ~[gap+%s2] ~[
275+ heading 2 "Todos"
276+ each (turn todos.m row-of)
277+ row ~[gap+%s1] ~[
278+ el ~[width+[%fill 1]] (field "New todo" draft.m |=%typed)
279+ button "Add" %submit
280+ el ~[tone+%danger] (text (fall error.m ""))
281+
282+++ row-of |= t=item.todo
283+ [id.t (toggle done.t text.t [%toggled id.t])]
284+#### /ui/theme/jibb theme-dark-absent
285+++ theme ^- theme
286+ [ space=[s1="4px" s2="8px" s3="16px"]
287+ tones=[normal="#222" background="#fff" accent="#17734f" danger="#b3261e" muted="#5f5f5f"]
288+ wide="60rem"
289+ lang="en"
290+ zone="UTC"
291+ font=`%/static/fonts/inter.woff2
292+ dark=~
293+#### /ui/theme/jibb theme-wrong-nested-aura
294+++ theme ^- theme
295+ [ space=[s1="4px" s2="8px" s3="16px"]
296+ tones=[normal=~zod background="#fff" accent="#17734f" danger="#b3261e" muted="#5f5f5f"]
297+ wide="60rem"
298+ lang="en"
299+ zone="UTC"
300+ font=`%/static/fonts/inter.woff2
301+ dark=[tones=[normal="#eee" background="#111" accent="#4c9" danger="#f28b82" muted="#aaa"]]
302+#### /ui/theme/jibb theme-missing-field
303+++ theme ^- theme
304+ [ space=[s1="4px" s2="8px" s3="16px"]
305+ tones=[normal="#222" background="#fff" accent="#17734f" danger="#b3261e" muted="#5f5f5f"]
306+ wide="60rem"
307+ lang="en"
308+ font=`%/static/fonts/inter.woff2
309+ dark=[tones=[normal="#eee" background="#111" accent="#4c9" danger="#f28b82" muted="#aaa"]]
310+#### /ui/theme/jibb theme-wrong-font
311+++ theme ^- theme
312+ [ space=[s1="4px" s2="8px" s3="16px"]
313+ tones=[normal="#222" background="#fff" accent="#17734f" danger="#b3261e" muted="#5f5f5f"]
314+ wide="60rem"
315+ lang="en"
316+ zone="UTC"
317+ font=`"/static/fonts/inter.woff2"
318+ dark=[tones=[normal="#eee" background="#111" accent="#4c9" danger="#f28b82" muted="#aaa"]]
319+#### /ui/theme/jibb theme-wrong-dark
320+++ theme ^- theme
321+ [ space=[s1="4px" s2="8px" s3="16px"]
322+ tones=[normal="#222" background="#fff" accent="#17734f" danger="#b3261e" muted="#5f5f5f"]
323+ wide="60rem"
324+ lang="en"
325+ zone="UTC"
326+ font=`%/static/fonts/inter.woff2
327+ dark="dark"
328+#### /ui/index/jibb page-main-wrong-static
329+++ main (button "Go" %go)
330+#### /ui/index/jibb page-main-arbitrary-main
331+++ main 42
332+#### /tests/page-main/ctor/jibb page-main-ctor-page
333+/= todo /ui/api/todo
334+
335++$ msg
336+ [%got todos=(list item.todo)]
337+++ main (page load view)
338+++ load |= ~
339+ ^- (ask msg) (todos.todo |=%got)
340+
341+++ view |= m=msg
342+ text "Todos loaded"
docs/reviews/2026-11-03-milestone-2-probes/variants/p8.outnew file+57
@@ -0,0 +1,57 @@
1+#### /ui/todo-list/jibb todo-full-wrong-model
2+REJECTED: /ui/todo-list.jibb:14:10: nothing fixes the union of ~
3+ [ts "" ~]
4+ ^
5+#### /ui/todo-list/jibb todo-full-wrong-message
6+REJECTED: /ui/todo-list.jibb:14:10: nothing fixes the union of ~
7+ [ts "" ~]
8+ ^
9+#### /ui/todo-list/jibb todo-full-wrong-result
10+REJECTED: /ui/todo-list.jibb:14:10: nothing fixes the union of ~
11+ [ts "" ~]
12+ ^
13+#### /ui/todo-list/jibb todo-full-open-key
14+REJECTED: /ui/todo-list.jibb:14:10: nothing fixes the union of ~
15+ [ts "" ~]
16+ ^
17+#### /ui/todo-list/jibb todo-full-wrong-watch
18+REJECTED: module kind needs unsupported inference: /ui/todo-list/jibb
19+#### /ui/todo-list/jibb todo-full-non-gate-view
20+REJECTED: /ui/todo-list.jibb:14:10: nothing fixes the union of ~
21+ [ts "" ~]
22+ ^
23+#### /ui/todo-list/jibb todo-full-cast-init
24+CHECKED
25++$ model: [todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]]
26++$ msg: msg
27+++ main: [init=$-((list [id=@ud [done=? text=@t]]) [todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]]) [update=$-([msg [todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]]] [[todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]] (list (cmd msg))]) [view=$-([todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]] (element msg)) subs=$-([todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]] (list (sub msg)))]]]
28+++ view: $-([todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]] (element msg))
29+++ row-of: $-([id=@ud [done=? text=@t]] [key=@ud el=(element msg)])
30+++ subs: $-([todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]] (list (sub msg)))
31+++ update: $-([msg=msg m=[todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]]] [[todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]] (list (cmd msg))])
32+++ init: $-((list [id=@ud [done=? text=@t]]) [todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]])
33+++ make-model: $-((list [id=@ud [done=? text=@t]]) [todos=(list [id=@ud [done=? text=@t]]) [draft=@t error=(unit @t)]])
34+#### /ui/theme/jibb theme-dark-absent
35+CHECKED
36+++ theme: [space=[s1=@t [s2=@t s3=@t]] [tones=[normal=@t [background=@t [accent=@t [danger=@t muted=@t]]]] [wide=@t [lang=@t [zone=@t [font=(unit qath) dark=(unit [tones=[normal=@t [background=@t [accent=@t [danger=@t muted=@t]]]]])]]]]]]
37+#### /ui/theme/jibb theme-wrong-nested-aura
38+REJECTED: module definitions need unsupported inference: /ui/theme/jibb: ++ theme
39+#### /ui/theme/jibb theme-missing-field
40+REJECTED: module definitions need unsupported inference: /ui/theme/jibb: ++ theme
41+#### /ui/theme/jibb theme-wrong-font
42+REJECTED: module definitions need unsupported inference: /ui/theme/jibb: ++ theme
43+#### /ui/theme/jibb theme-wrong-dark
44+REJECTED: module definitions need unsupported inference: /ui/theme/jibb: ++ theme
45+#### /ui/index/jibb page-main-wrong-static
46+REJECTED: /ui/index.jibb:1:22: nothing fixes the union of %go
47+++ main (button "Go" %go)
48+ ^
49+#### /ui/index/jibb page-main-arbitrary-main
50+REJECTED: module kind needs unsupported inference: /ui/index/jibb
51+#### /tests/page-main/ctor/jibb page-main-ctor-page
52+CHECKED
53++$ msg: [%got todos=(list [id=@ud [done=? text=@t]])]
54+++ main: [load=$-(~ (ask [%got todos=(list [id=@ud [done=? text=@t]])])) view=$-([%got todos=(list [id=@ud [done=? text=@t]])] (element !!))]
55+++ view: $-([%got todos=(list [id=@ud [done=? text=@t]])] (element A))
56+++ load: $-(~ (ask [%got todos=(list [id=@ud [done=? text=@t]])]))
57+
docs/reviews/2026-11-03-milestone-2-probes/variants/p9.jibbnew file+311
@@ -0,0 +1,311 @@
1+#### /ui/todo-list/jibb typo-submitt-view
2+/= todo /ui/api/todo
3+
4+++ main (program init update view subs)
5+
6++$ model [todos=(list item.todo) draft=@t error=(unit @t)]
7++$ msg
8+ [%typed text=@t]
9+ %submit
10+ [%toggled id=@ud]
11+ [%got todos=(list item.todo)]
12+ [%acked err=(unit @t)]
13+
14+++ init |= ts=(list item.todo)
15+ [todos=ts draft="" error=~]
16+
17+++ update |= [=msg m=model]
18+ ?- msg
19+ [%typed t]
20+ ?- (gth (lent (tuba (trip t))) 80)
21+ %.y [m(draft=t error=`"Too long") ~]
22+ %.n [m(draft=t error=~) ~]
23+ %submit [m(draft="") ~[(poke.todo [%add draft.m] |=%acked)]]
24+ [%toggled id] [m ~[(poke.todo [%toggle id] |=%acked)]]
25+ [%got ts] [m(todos=ts) ~]
26+ [%acked err] [m(error=err) ~]
27+
28+++ subs |= m=model
29+ ~[[%watch (todos.todo |=%got)]]
30+
31+++ view |= m=model
32+ column ~[gap+%s2] ~[
33+ heading 2 "Todos"
34+ each (turn todos.m row-of)
35+ row ~[gap+%s1] ~[
36+ el ~[width+[%fill 1]] (field "New todo" draft.m |=%typed)
37+ button "Add" %submitt
38+ el ~[tone+%danger] (text (fall error.m ""))
39+
40+++ row-of |= t=item.todo
41+ [id.t (toggle done.t text.t [%toggled id.t])]
42+#### /ui/todo-list/jibb typo-typd-ctor
43+/= todo /ui/api/todo
44+
45+++ main (program init update view subs)
46+
47++$ model [todos=(list item.todo) draft=@t error=(unit @t)]
48++$ msg
49+ [%typed text=@t]
50+ %submit
51+ [%toggled id=@ud]
52+ [%got todos=(list item.todo)]
53+ [%acked err=(unit @t)]
54+
55+++ init |= ts=(list item.todo)
56+ [todos=ts draft="" error=~]
57+
58+++ update |= [=msg m=model]
59+ ?- msg
60+ [%typed t]
61+ ?- (gth (lent (tuba (trip t))) 80)
62+ %.y [m(draft=t error=`"Too long") ~]
63+ %.n [m(draft=t error=~) ~]
64+ %submit [m(draft="") ~[(poke.todo [%add draft.m] |=%acked)]]
65+ [%toggled id] [m ~[(poke.todo [%toggle id] |=%acked)]]
66+ [%got ts] [m(todos=ts) ~]
67+ [%acked err] [m(error=err) ~]
68+
69+++ subs |= m=model
70+ ~[[%watch (todos.todo |=%got)]]
71+
72+++ view |= m=model
73+ column ~[gap+%s2] ~[
74+ heading 2 "Todos"
75+ each (turn todos.m row-of)
76+ row ~[gap+%s1] ~[
77+ el ~[width+[%fill 1]] (field "New todo" draft.m |=%typd)
78+ button "Add" %submit
79+ el ~[tone+%danger] (text (fall error.m ""))
80+
81+++ row-of |= t=item.todo
82+ [id.t (toggle done.t text.t [%toggled id.t])]
83+#### /ui/todo-list/jibb typo-in-update-pattern
84+/= todo /ui/api/todo
85+
86+++ main (program init update view subs)
87+
88++$ model [todos=(list item.todo) draft=@t error=(unit @t)]
89++$ msg
90+ [%typed text=@t]
91+ %submit
92+ [%toggled id=@ud]
93+ [%got todos=(list item.todo)]
94+ [%acked err=(unit @t)]
95+
96+++ init |= ts=(list item.todo)
97+ [todos=ts draft="" error=~]
98+
99+++ update |= [=msg m=model]
100+ ?- msg
101+ [%typed t]
102+ ?- (gth (lent (tuba (trip t))) 80)
103+ %.y [m(draft=t error=`"Too long") ~]
104+ %.n [m(draft=t error=~) ~]
105+ %submitt [m(draft="") ~[(poke.todo [%add draft.m] |=%acked)]]
106+ [%toggled id] [m ~[(poke.todo [%toggle id] |=%acked)]]
107+ [%got ts] [m(todos=ts) ~]
108+ [%acked err] [m(error=err) ~]
109+
110+++ subs |= m=model
111+ ~[[%watch (todos.todo |=%got)]]
112+
113+++ view |= m=model
114+ column ~[gap+%s2] ~[
115+ heading 2 "Todos"
116+ each (turn todos.m row-of)
117+ row ~[gap+%s1] ~[
118+ el ~[width+[%fill 1]] (field "New todo" draft.m |=%typed)
119+ button "Add" %submit
120+ el ~[tone+%danger] (text (fall error.m ""))
121+
122+++ row-of |= t=item.todo
123+ [id.t (toggle done.t text.t [%toggled id.t])]
124+#### /ui/todo-list/jibb missing-case-in-update
125+/= todo /ui/api/todo
126+
127+++ main (program init update view subs)
128+
129++$ model [todos=(list item.todo) draft=@t error=(unit @t)]
130++$ msg
131+ [%typed text=@t]
132+ %submit
133+ [%toggled id=@ud]
134+ [%got todos=(list item.todo)]
135+ [%acked err=(unit @t)]
136+
137+++ init |= ts=(list item.todo)
138+ [todos=ts draft="" error=~]
139+
140+++ update |= [=msg m=model]
141+ ?- msg
142+ [%typed t]
143+ ?- (gth (lent (tuba (trip t))) 80)
144+ %.y [m(draft=t error=`"Too long") ~]
145+ %.n [m(draft=t error=~) ~]
146+ %submit [m(draft="") ~[(poke.todo [%add draft.m] |=%acked)]]
147+ [%toggled id] [m ~[(poke.todo [%toggle id] |=%acked)]]
148+ [%got ts] [m(todos=ts) ~]
149+
150+++ subs |= m=model
151+ ~[[%watch (todos.todo |=%got)]]
152+
153+++ view |= m=model
154+ column ~[gap+%s2] ~[
155+ heading 2 "Todos"
156+ each (turn todos.m row-of)
157+ row ~[gap+%s1] ~[
158+ el ~[width+[%fill 1]] (field "New todo" draft.m |=%typed)
159+ button "Add" %submit
160+ el ~[tone+%danger] (text (fall error.m ""))
161+
162+++ row-of |= t=item.todo
163+ [id.t (toggle done.t text.t [%toggled id.t])]
164+#### /ui/todo-list/jibb aura-mismatch-update
165+/= todo /ui/api/todo
166+
167+++ main (program init update view subs)
168+
169++$ model [todos=(list item.todo) draft=@t error=(unit @t)]
170++$ msg
171+ [%typed text=@t]
172+ %submit
173+ [%toggled id=@ud]
174+ [%got todos=(list item.todo)]
175+ [%acked err=(unit @t)]
176+
177+++ init |= ts=(list item.todo)
178+ [todos=ts draft="" error=~]
179+
180+++ update |= [=msg m=model]
181+ ?- msg
182+ [%typed t]
183+ ?- (gth (lent (tuba (trip t))) 80)
184+ %.y [m(draft=t error=`"Too long") ~]
185+ %.n [m(draft=~zod error=~) ~]
186+ %submit [m(draft="") ~[(poke.todo [%add draft.m] |=%acked)]]
187+ [%toggled id] [m ~[(poke.todo [%toggle id] |=%acked)]]
188+ [%got ts] [m(todos=ts) ~]
189+ [%acked err] [m(error=err) ~]
190+
191+++ subs |= m=model
192+ ~[[%watch (todos.todo |=%got)]]
193+
194+++ view |= m=model
195+ column ~[gap+%s2] ~[
196+ heading 2 "Todos"
197+ each (turn todos.m row-of)
198+ row ~[gap+%s1] ~[
199+ el ~[width+[%fill 1]] (field "New todo" draft.m |=%typed)
200+ button "Add" %submit
201+ el ~[tone+%danger] (text (fall error.m ""))
202+
203+++ row-of |= t=item.todo
204+ [id.t (toggle done.t text.t [%toggled id.t])]
205+#### /ui/todo-list/jibb dead-arm-update
206+/= todo /ui/api/todo
207+
208+++ main (program init update view subs)
209+
210++$ model [todos=(list item.todo) draft=@t error=(unit @t)]
211++$ msg
212+ [%typed text=@t]
213+ %submit
214+ [%toggled id=@ud]
215+ [%got todos=(list item.todo)]
216+ [%acked err=(unit @t)]
217+
218+++ init |= ts=(list item.todo)
219+ [todos=ts draft="" error=~]
220+
221+++ update |= [=msg m=model]
222+ ?- msg
223+ [%typed t]
224+ ?- (gth (lent (tuba (trip t))) 80)
225+ %.y [m(draft=t error=`"Too long") ~]
226+ %.n [m(draft=t error=~) ~]
227+ %submit [m(draft="") ~[(poke.todo [%add draft.m] |=%acked)]]
228+ [%toggled id] [m ~[(poke.todo [%toggle id] |=%acked)]]
229+ [%got ts] [m(todos=ts) ~]
230+ [%acked err] [m(error=err) ~]
231+ %submit [m ~]
232+
233+++ subs |= m=model
234+ ~[[%watch (todos.todo |=%got)]]
235+
236+++ view |= m=model
237+ column ~[gap+%s2] ~[
238+ heading 2 "Todos"
239+ each (turn todos.m row-of)
240+ row ~[gap+%s1] ~[
241+ el ~[width+[%fill 1]] (field "New todo" draft.m |=%typed)
242+ button "Add" %submit
243+ el ~[tone+%danger] (text (fall error.m ""))
244+
245+++ row-of |= t=item.todo
246+ [id.t (toggle done.t text.t [%toggled id.t])]
247+#### /ui/basket/jibb basket-typo-addd
248+:: /ui/basket.jibb
249+/= cart /ui/stores/cart
250+
251+++ main (program init update view subs)
252+
253++$ model [cart=state.cart note=@t]
254++$ msg
255+ [%noted text=@t]
256+ %add
257+ %toggle
258+ [%got cart=state.cart]
259+ [%acked err=(unit @t)]
260+
261+++ init |= ~
262+ [cart=[items=~ open=%.n] note=""]
263+
264+++ update |= [=msg m=model]
265+ ?- msg
266+ [%noted t] [m(note=t) ~]
267+ %add [m(note="") ~[(poke.cart [%add note.m] |=%acked)]]
268+ %toggle [m ~[(poke.cart %toggle |=%acked)]]
269+ [%got c] [m(cart=c) ~]
270+ [%acked err] [m ~]
271+
272+++ subs |= m=model
273+ ~[[%watch (state.cart |=%got)]]
274+
275+++ view |= m=model
276+ column ~[gap+%s1] ~[
277+ (text "{(lent items.cart.m)} items")
278+ field "Item" note.m |=%noted
279+ button "Add" %addd
280+#### /ui/basket/jibb basket-missing-case
281+:: /ui/basket.jibb
282+/= cart /ui/stores/cart
283+
284+++ main (program init update view subs)
285+
286++$ model [cart=state.cart note=@t]
287++$ msg
288+ [%noted text=@t]
289+ %add
290+ %toggle
291+ [%got cart=state.cart]
292+ [%acked err=(unit @t)]
293+
294+++ init |= ~
295+ [cart=[items=~ open=%.n] note=""]
296+
297+++ update |= [=msg m=model]
298+ ?- msg
299+ [%noted t] [m(note=t) ~]
300+ %add [m(note="") ~[(poke.cart [%add note.m] |=%acked)]]
301+ %toggle [m ~[(poke.cart %toggle |=%acked)]]
302+ [%got c] [m(cart=c) ~]
303+
304+++ subs |= m=model
305+ ~[[%watch (state.cart |=%got)]]
306+
307+++ view |= m=model
308+ column ~[gap+%s1] ~[
309+ (text "{(lent items.cart.m)} items")
310+ field "Item" note.m |=%noted
311+ button "Add" %add
docs/reviews/2026-11-03-milestone-2-probes/variants/p9.outnew file+33
@@ -0,0 +1,33 @@
1+#### /ui/todo-list/jibb typo-submitt-view
2+REJECTED: /ui/todo-list.jibb:14:28: nothing fixes the union of ~
3+ [todos=ts draft="" error=~]
4+ ^
5+#### /ui/todo-list/jibb typo-typd-ctor
6+REJECTED: /ui/todo-list.jibb:14:28: nothing fixes the union of ~
7+ [todos=ts draft="" error=~]
8+ ^
9+#### /ui/todo-list/jibb typo-in-update-pattern
10+REJECTED: /ui/todo-list.jibb:14:28: nothing fixes the union of ~
11+ [todos=ts draft="" error=~]
12+ ^
13+#### /ui/todo-list/jibb missing-case-in-update
14+REJECTED: /ui/todo-list.jibb:14:28: nothing fixes the union of ~
15+ [todos=ts draft="" error=~]
16+ ^
17+#### /ui/todo-list/jibb aura-mismatch-update
18+REJECTED: /ui/todo-list.jibb:14:28: nothing fixes the union of ~
19+ [todos=ts draft="" error=~]
20+ ^
21+#### /ui/todo-list/jibb dead-arm-update
22+REJECTED: /ui/todo-list.jibb:14:28: nothing fixes the union of ~
23+ [todos=ts draft="" error=~]
24+ ^
25+#### /ui/basket/jibb basket-typo-addd
26+REJECTED: /ui/basket.jibb:15:16: nothing fixes the union of ~
27+ [cart=[items=~ open=%.n] note=""]
28+ ^
29+#### /ui/basket/jibb basket-missing-case
30+REJECTED: /ui/basket.jibb:15:16: nothing fixes the union of ~
31+ [cart=[items=~ open=%.n] note=""]
32+ ^
33+
docs/reviews/2026-11-03-milestone-2-review.mdnew file+115
@@ -0,0 +1,115 @@
1+# Milestone 2 review, 2026-11-03
2+
3+A review of milestone 2, "Types and prelude", at [`f84a29e`](https://github.com/iko-soy/jibb/commit/f84a29e1a0af663afdb77e793c933470b59a249b), asked for in the project chat. It judges the combined result of the milestone's commits, from `1dd92a6` ("Start type inference and Hoon imports", 2026-10-30) to `f84a29e`, about 150 of them, against the plan in [implementation-plan.md](../spec/implementation-plan.md) and the brief in [prompts/milestone-2.md](../prompts/milestone-2.md). It builds on the [repository review of 2026-11-02](2026-11-02-repo-review.md) (findings A1 to A137, at `4bf477e`) and does not repeat what that review settled.
4+
5+**This is a first version.** The review runs in nine areas. Two have finished: whether the doc's examples typecheck (done-criterion 1) and whether every error the spec describes has a test with its message (done-criterion 2). The other seven are still running: the Hoon import table (done-criterion 3), inference soundness, unions and `?-`, modules, APIs and the prelude, what became of the earlier review's findings, tests and docs, and architecture and speed. Their results, and a second reviewer's check of every finding, will be added to this file. The findings below had one reviewer each, who reproduced them with probes; the headline ones (M1, M2, M3 and M9) were reproduced again for this write-up.
6+
7+What is left to build is briefed in [prompts/milestone-2-finish.md](../prompts/milestone-2-finish.md). The probe sources behind the findings, with the checker's output for each, are in [2026-11-03-milestone-2-probes/](2026-11-03-milestone-2-probes/), with a script to rerun them.
8+
9+Line numbers are links into `f84a29e`.
10+
11+## Verdict
12+
13+**Milestone 2 is not done by its own "Done when" list.** Every check passes, the 14 `jibb` blocks of the doc check as written, and nothing wrong that the core probes tried was accepted. But the checker that a build will run, the full module checker, reports almost every error in the spec as "module definitions need unsupported inference: <path>: ++ name", with no line, column or excerpt. And the island, page and store checks are fitted to the examples' exact shapes, so small valid edits are rejected, often with a wrong error. `docs/status.md` still says "In progress", which matches; its rewrite as a capability table (`e97aebe`) landed while this review ran.
14+
15+| Plan item | Status | Evidence |
16+| --- | --- | --- |
17+| Done when: the doc's examples typecheck, except those written as errors | **Met as written, fragile** | All 14 blocks check with exact types (`jibb-doc-examples`, `jibb-todo-full`, `jibb-store`, `jibb-page-main`, `jibb-theme`, `jibb-buttons`), and `add-button` fails with "nothing fixes the union of %add". Of about 90 spec-valid one-edit variants of those modules, about 27 are rejected (M2, M4) |
18+| Done when: each error the Grammar tab describes has a test with its message | **Not met** | Of the 33 errors the spec describes, 4 have a test and get their message from the full checker. 28 don't get their message from the full checker, most of them only the generic "needs unsupported inference"; the partial report, which no build runs, has a message for most of those. One, a repeated attribute, is accepted (M1, M3, the [error table](#appendix-the-errors-the-spec-describes)) |
19+| Done when: a `/sur` file with `$%`, `$@`, maps and a recursive mold imports as the table says | Not yet reviewed | Still running. The earlier review's A50 (only `%tas` head tags, no `each` or `json`) and A14 (bare `@`, `@uw`) were open at `4bf477e` |
20+| Each milestone ends with its checks passing on a fake ship | **Met** | `nix flake check`: 11 of 11 checks pass, the ship group on a fresh fake `~zod` ([Check run](#check-run)) |
21+| Brief: on the ship, the `my-app` desk checked with its Hoon types read through Clay, every module but `buttons.jibb` checking | **Not met** | No check walks `my-app/ui`. The suites compile `/sur` and mark text themselves with `ride`; Clay-built types reach only the partial report (M8) |
22+| Builds: exhaustive `?-` with dead-arm errors | Partly | Flat whole-case unions only; the Grammar's own `[%move * *]` example is "not supported" (M10) |
23+| Builds: the prelude's types | Partly | `max`, which the Grammar's `clamp` example calls, is missing; a repeated attribute is accepted; a hand-built element checks (M9). The full inventory review is still running |
24+| Builds: Hindley–Milner inference, deferred constraints, union disjointness, imports, API files | Still running | Early probe results are under [Early results](#early-results-from-the-areas-still-running) |
25+
26+## Check run
27+
28+`nix flake check` at `f84a29e`, on 4 CPUs, took 471 s and passed every check:
29+
30+| Group | Checks | Result | Time |
31+| --- | --- | --- | --- |
32+| eval | `selftest`, `golden`, `arms-1` to `arms-4`, `doc-blocks` | 7 of 7 pass | 225 s |
33+| ship, on a fake `~zod` booted in the sandbox | `ship-selftest`, `ship-test`, `check-commit`, `clay-fixtures` | 4 of 4 pass | 414 s |
34+
35+The corpus has 691 golden cases, 304 of them with a `types.txt`, and 58 suites in `tests/lib` with 62 test arms. All 304 `types.txt` files are partial reports that begin "partial inference; module not checked".
36+
37+## What works
38+
39+- The 14 doc blocks check with exact, closed types, including the todo island, the cart store and basket, the theme, the three pages and the imports example, and the `cmd`/`sub` block as prelude source.
40+- About 64 of 90 valid edits to those modules still check: reordering and renaming, unused helpers, consistent field swaps, an `init` written as a cast, a sixth message, helpers in `view`, two islands on a page.
41+- Overlapping union cases, a repeated field in a Jibb record, and derived-name clashes get good errors from the full checker, with both sites and excerpts. The unresolved-tag error of the Grammar's buttons example is exact, and moves with the code when the block is reordered.
42+- None of the wrong programs probed in this version was accepted, apart from the two in M9.
43+
44+## Findings so far
45+
46+Severity follows the earlier review's scale: high means unsound, or a done-criterion clearly not met, or a false error on common valid code.
47+
48+| # | Finding | Severity | Evidence | Fix | Prior |
49+| --- | --- | --- | --- | --- | --- |
50+| M1 | **The full checker throws away every per-definition diagnostic.** An aura mismatch, mismatched faces, `msg has no case %submitt`, a missing `?-` case, a covered arm, `++ title (trim title)`, a shadowed local, a cell in `{…}`, a capital made `@ud`, `m()`, `[]`, `(add %.y %.n)`, a gate in `eq`, an unknown name and every invalid Hoon import all give only "module definitions need unsupported inference: /ui/probe/jibb: ++ x". The partial report has a definite message with sites for most of them | High | [`add-supported-result`](https://github.com/iko-soy/jibb/blob/f84a29e1a0af663afdb77e793c933470b59a249b/jibb-dev/lib/jibb.hoon#L10670-L10689) returns `~` on a failed result and on hole, capital, pending-tag and atom-variable failures, dropping the reason. Only the pending-tag and sample-shadow retries rebuild an error ([14820-14832](https://github.com/iko-soy/jibb/blob/f84a29e1a0af663afdb77e793c933470b59a249b/jibb-dev/lib/jibb.hoon#L14820-L14832)); mold and kind failures go the same way ([14856-14857](https://github.com/iko-soy/jibb/blob/f84a29e1a0af663afdb77e793c933470b59a249b/jibb-dev/lib/jibb.hoon#L14856-L14857)) | Keep the first definite diagnostic per unresolved definition and render it at 14830, in dependency order; keep the generic text for real checker limits. Same for molds and kinds | A40, A12 still open |
51+| M2 | **Valid one-edit variants of the doc's islands are rejected, mostly with a false error at a correct line.** `++ subs \|=(m ~)`, which the overview gives for "no subscriptions", a second watch, an inline or local mapper, two `each` sites, and an update helper that returns a poke command each give "todo-list.jibb:14:28: nothing fixes the union of ~", pointing at `error=~` in a correct `init`. Any `%every` subscription, and a watch with a fold (`(changes.todo \|=%got apply)`, from the overview), give "module kind needs unsupported inference" | High | `main` is not checked as an application: a fixed chain of program recoveries fits each component, and a definition the chain can't resolve falls to the pending-tag retry, which reports whatever tag is still open ([10711-10735](https://github.com/iko-soy/jibb/blob/f84a29e1a0af663afdb77e793c933470b59a249b/jibb-dev/lib/jibb.hoon#L10711-L10735)). The Grammar says such a constraint "stays open until something in the module fixes it. An island's `main` fixes its messages" | The general core of Q5: check `main = (program init update view subs)` as an ordinary application whose unification fixes the components, with module-wide deferred tag constraints. Walk the `(list (sub M))` and ask for a watchability proof only for `%watch` | A121, fix-first 1 in a new form |
52+| M3 | **In an island, every error is reported as "nothing fixes the union of ~" at `init`.** The criterion's own example, `button "Add" %submitt` in the todo view, gives "todo-list.jibb:14:28: nothing fixes the union of ~". So do `\|=%typd`, a pattern typo, a missing `[%acked err]` arm, a second `%submit` arm, an aura mismatch in `update`, and a gate as a row key. Outside an island, the partial report puts the caret under `"Add"`, the wrong argument | High | Probes of the unchanged island with one edit each, reproduced for this write-up. The same in the basket: "basket.jibb:15:16: nothing fixes the union of ~". A gate in the model gives "module kind needs unsupported inference" and names no field, though the overview says "the checker names the field" | Report a pending tag only when the definition otherwise checks in its module context. For a call whose sample fit fails, re-fit each argument and report the first failing one, as "msg has no case `%submitt`" when it is a tag | A121 |
53+| M4 | **Page and store kinds are recognised by syntax**, so the overview's route-parameter page (`(post.api slug same)`), its catch-all page (`(pure p)`), a typed-path load, `(pure ~)`, a page or store alias, and the cart's `init` without its cast are rejected | Medium | [`page-main-parts`, `store-main-parts`](https://github.com/iko-soy/jibb/blob/f84a29e1a0af663afdb77e793c933470b59a249b/jibb-dev/lib/jibb.hoon#L13200-L13240) match the literal `(page w w)` and `(store w w)`; [`page-load-derived`](https://github.com/iko-soy/jibb/blob/f84a29e1a0af663afdb77e793c933470b59a249b/jibb-dev/lib/jibb.hoon#L14510-L14538) takes only a gate whose body is one derived request. The Grammar says "`main`'s type decides a module's kind" | Decide the kind from `main`'s inferred type. Check a load as a gate to `(ask D)`, `pure` and typed paths included; pages need no watchability | A121 |
54+| M5 | **An island `init` mismatch is blamed on a correct `~`.** In `[ts ~zod ~]` against `draft=@t`, the error is `~zod`, but the checker says "nothing fixes the union of ~" at the last `~`. `jibb-program-init` locks three such messages | Medium | `tests/type-program-main/initializer-earlier.txt` and two siblings; [`jibb-program-init.hoon:129-131`](https://github.com/iko-soy/jibb/blob/f84a29e1a0af663afdb77e793c933470b59a249b/tests/lib/jibb-program-init.hoon#L129-L131) | As M3, then update the three expected strings | |
55+| M6 | **Negative tests lock in rejections of valid programs, one fixture doesn't parse, and negatives check only "rejected".** Two `each` sites and a mapper alias (`jibb-todo-full`), a page alias, an indirect and a `pure` load (`jibb-page-main`), an alias and a hand-built main (`jibb-store`) are all spec-valid. `tests/type-page-main/hand-built-load.txt` fails to parse, so its case passes on a parse error. Every `jibb-todo-full` negative, "wrong message" included, fails with the same `~` error and the arm compares only "<label>: rejected" | Medium | [`jibb-todo-full.hoon:121-168`](https://github.com/iko-soy/jibb/blob/f84a29e1a0af663afdb77e793c933470b59a249b/tests/lib/jibb-todo-full.hoon#L121-L168), [`jibb-page-main.hoon:164-167`](https://github.com/iko-soy/jibb/blob/f84a29e1a0af663afdb77e793c933470b59a249b/tests/lib/jibb-page-main.hoon#L164-L167), [`jibb-store.hoon:261-262`](https://github.com/iko-soy/jibb/blob/f84a29e1a0af663afdb77e793c933470b59a249b/tests/lib/jibb-store.hoon#L261-L262). The fixtures also still use the positional `[ts "" ~]` that `44e3324` replaced in the doc | Move the valid cases to positive expectations, marked as known gaps until they pass. Fix the fixture. Make each negative assert its message and place | |
56+| M7 | **Inline Grammar examples meant to check are rejected**: `(turn ps \|=(p title.p))`, `"{(add 1 2)}"`, `/posts/~zod` (even under `^- path`), `` `5 `` without a cast, the Patterns rows `1.000`, `~zod`, `"milk"`, `[x ~]`, `[[~ a] [~ b]]` and `[~ b]`, `(eq xs ~)`, `(clap `1 `2 add)`. `clamp` fails because the prelude has no `max`, and the unknown name is reported as "unsupported", not as unknown | Medium | Probes, one module each. `inline-pattern-literals` and `inline-pattern-nested` have no `types.txt`, so nothing tests them | Add a typed case for each, and support them in the general core | |
57+| M8 | **No check runs the `my-app` desk with its Hoon types read through Clay**, as the brief asks, or asserts that every module but `buttons.jibb` checks. `card.jibb` and `api/blog.jibb` are checked only as imports, with no asserted type. No `my-app` timing is recorded | Medium | The suites read `/sur` and mark text with `/*` and `ride` it after dropping `/-` lines ([`jibb-todo-full.hoon:29-53`](https://github.com/iko-soy/jibb/blob/f84a29e1a0af663afdb77e793c933470b59a249b/tests/lib/jibb-todo-full.hoon#L29-L53)). `tools/clay-fixtures` builds types with `.^(vase %ca …)` but feeds only the partial report | A ship check that builds each `/sur` and mark through Clay, runs the full checker over every `/ui/**.jibb` in dependency order and expects exactly one failure, `buttons.jibb` at 3:16, timed | |
58+| M9 | **Two wrong programs are accepted.** A repeated attribute, `(column ~[gap+%s1 gap+%s2] ~[(text "x")])`, checks as `(element A)`, though the overview makes it an error. A hand-built element, `^- (element !!) [%island 5]`, checks as `(element !!)`, bypassing the island's check of its data against `init` | Medium | Both reproduced with the full checker. [status.md](../status.md) lists raw-constructor encapsulation and duplicate-attribute checks as missing; nothing tests either error | Report a repeated head tag in a literal `(list attr)` with both sites. Make `element`'s constructors the only way to build one, or check its payloads | |
59+| M10 | **`?-` exhaustiveness and dead arms cover only flat whole-case unions.** A missing case has no site ("missing union case %c"); a covered arm doesn't name the arm that covers it; the Grammar's `[%move * *]` then `[%move %left n]` is "union pattern is not supported"; a loobean without `%.n` and a list without `[i t]` are "branch pattern is not supported"; a repeated `%.y` says "branch does not cover both loobeans" | Medium | Partial report; the full checker is generic for all (M1). The loop matches arms to whole cases ([8225-8311](https://github.com/iko-soy/jibb/blob/f84a29e1a0af663afdb77e793c933470b59a249b/jibb-dev/lib/jibb.hoon#L8225-L8311)) | The usefulness check Q5 chose (Maranget): a missing-case witness at the `?-`, and a dead-arm error naming the covering arm, for loobeans, lists, units and nested cells | A15 still open |
60+| M11 | **Errors in imported Hoon types are generic in the full checker**, and a vase, a record with a repeated face, and most overlapping `$%`, `$?` and `$^` have no definite message in either pipeline | Medium | The reader is definite for signed and float auras and for cores and gates, and the partial report shows them at a use site. A vase is only `%unsupported` ([`jibb-import.hoon:1560`](https://github.com/iko-soy/jibb/blob/f84a29e1a0af663afdb77e793c933470b59a249b/jibb-dev/lib/jibb-import.hoon#L1560)); `[a=@ud a=@t]` reads as ok and the bridge drops it silently | Reuse the partial path's import diagnostics through M1. Give vases and repeated faces `%invalid` codes. Extend the overlap witness | A56 |
61+| M12 | **Shadowing and `proj` errors name neither the name nor its sites.** `++ add 1`, `+$ list @ud`, `++ proj 1` and a definition named like an import face all give "module has conflicting names: /ui/probe/jibb". A shadowing local or pattern binder is generic in the full checker | Medium | [`module-scope-valid`](https://github.com/iko-soy/jibb/blob/f84a29e1a0af663afdb77e793c933470b59a249b/jibb-dev/lib/jibb.hoon#L11760-L11773) returns a bare `?`. Only a gate sample gets a definite error | Return a diagnostic naming the binding and what it shadows, with a separate wording for `proj` | A43 partly |
62+| M13 | **Several errors the spec describes have no definite message anywhere**: a capital that a body makes `@ud` or a list, `~[text "hi"]` with its suggestion, `(facts …)` outside an API's `paths`, a gate in island data or a model naming the field, `[]`, and a generic aura in `{…}` or a path's `(…)` | Medium | Each probed in both pipelines: "explicit capital constraints are not supported", "list item constraint is not supported", "module mold needs unsupported inference", "module kind needs unsupported inference". No code suggests `~[(text "hi")]` | One definite diagnostic each, with a golden case | A6, A100 for `[]` |
63+| M14 | **Message tests lock the partial report, which no build produces.** For about 20 of the 33 errors, the only test asserts a message the real checker never gives | Medium | `tools/golden` calls only the `golden-types-*` entry points ([`tools/golden:248-262`](https://github.com/iko-soy/jibb/blob/f84a29e1a0af663afdb77e793c933470b59a249b/tools/golden#L248-L262)). The program suites lock the generic strings themselves, as at [`jibb-program-watch.hoon:178`](https://github.com/iko-soy/jibb/blob/f84a29e1a0af663afdb77e793c933470b59a249b/tests/lib/jibb-program-watch.hoon#L178) | Q6: render `types.txt` from the full checker, and add one case per error in the catalogue, with the doc's own examples | A122 still open |
64+| M15 | **The goldens never show a doc example checking.** 11 of the 14 `doc-*` cases have no `types.txt`; the other 3 are partial reports, and `doc-grammar-04-step` says "+$ step: cases proven disjoint; mold not checked" although the full checker accepts it | Low | `grep -L '^partial inference' tests/golden/*/types.txt` finds none | As M14 | A122 |
65+| M16 | **Two fragment checks rest on unguarded copies.** The Core language block is "checked inside the todo island" only because `todo-list.jibb` lines 16-25 equal `tests/golden/doc-core-02-update/source.jibb`, which nothing compares. `tests/type-buttons/valid.txt` is a hand copy of the buttons block | Low | `sed -n 16,25p my-app/ui/todo-list.jibb \| diff - tests/golden/doc-core-02-update/source.jibb` is empty today; no tool references `doc-core-02` | Assert the slice in `tools/doc-blocks` or `jibb-todo-full`; derive `valid.txt` from the doc block | |
66+| M17 | **Message polish**: an import cycle names one path, with no `/=` line or chain; "nothing fixes the union of %add" doesn't ask for a `^-` as the Grammar says; an overlap doesn't suggest an open `[`; some mismatch sites print no types; an imported union is named by its cases | Low | [12303-12304](https://github.com/iko-soy/jibb/blob/f84a29e1a0af663afdb77e793c933470b59a249b/jibb-dev/lib/jibb.hoon#L12303-L12304), [5363](https://github.com/iko-soy/jibb/blob/f84a29e1a0af663afdb77e793c933470b59a249b/jibb-dev/lib/jibb.hoon#L5363) | Report the cycle as a chain; append "; add a `^-`"; add the hint; print types at every site | A136 |
67+
68+## Early results from the areas still running
69+
70+These come from probes the inference reviewer had run when this version was written. They have not been through that reviewer's own write-up or a second reviewer, so treat them as leads:
71+
72+- Every wrong program in about 40 soundness probes was rejected, except the two in M9 and a gate passed where `*` is expected (A23, known).
73+- Common valid code is rejected as "unsupported": a sum with `roll`, a pair of mutually recursive top-level gates, list reverse, factorial, a recursive count, a pattern binding the rest of a list, wing access on a union or list, and patterns over atoms with number or string literals.
74+- `~[1 "a"]` checks as `(list @t)`: a bare decimal takes the aura `@t`. The spec allows that today; syntax-review proposal S4 would forbid it.
75+
76+## Appendix: the errors the spec describes
77+
78+From [grammar.md](../spec/grammar.md), [overview.md](../spec/overview.md), [core-language.md](../spec/core-language.md) and [decisions.md](../spec/decisions.md), leaving out milestone 1's parse errors and the route, static-file and contrast checks that the brief leaves to milestone 4. "Full" is what `infer-jibb-file-detailed`, the checker a build runs, reports; "generic" is "module definitions need unsupported inference: <path>: ++ name". "Partial" is the report `types.txt` shows.
79+
80+| Error | Test with its message | Full checker | Status |
81+| --- | --- | --- | --- |
82+| Aura mismatch | Partial only (`types-local-error-call`) | Generic | Partly |
83+| Mismatched faces | Partial only (`types-record-faces`) | Generic | Partly |
84+| `msg has no case %submitt` | Partial only (`types-missing-tag-named`) | Generic; in an island, the `~` error of M3 | Partly |
85+| Unresolved tag, "nothing fixes the union of %add" | `jibb-buttons` | Exact, one site | Met |
86+| `~` still pending at the end of a module | None | Exact, one site | Partly |
87+| `\|=%tag` with no case of an equal head | Partial, as a generic unify failure | Generic | Partly |
88+| Overlapping union cases | `jibb-full-overlap-basic`, `types-union-overlap` | Exact, both sites | Met |
89+| Missing `?-` case, named | Partial, no site | Generic | Partly |
90+| Arm that earlier arms cover | Partial, one site; `[%move * *]` unsupported | Generic | Partly |
91+| Value that depends on itself | Partial, annotated values only | Generic | Partly |
92+| Shadowing, prelude and imports included | Gate samples only | Exact for samples; "module has conflicting names" or generic otherwise | Partly |
93+| Cell in `{…}` with no printer | Partial | Generic | Partly |
94+| Generic aura in `{…}` or a path's `(…)` | Partial, one narrow form | Generic | Partly |
95+| Capital that a body makes `@ud` or a list | None; partial says "not supported" | Generic | Partly |
96+| `~[text "hi"]`, suggesting `~[(text "hi")]` | None | Generic | Partly |
97+| Clashing derived names, import faces included | `module-import-api-derived-clash` and three more | Exact, both sites | Met |
98+| Import cycle | `module-import-cycle`, `module-import-root-cycle` | One path, no site | Partly |
99+| Imported signed or float aura | Partial (`type-import-diagnostic`) | Generic | Partly |
100+| Imported core, gate or vase | Partial for cores and gates; vases "unsupported" | Generic | Partly |
101+| Imported `$%`, `$?`, `$^` whose cases overlap | Partial for one form | Generic | Partly |
102+| Imported record with a repeated field | None; silently dropped | Generic | Partly |
103+| `(facts …)` outside an API's `paths` | None; partial accepts it | "module mold needs unsupported inference" | Partly |
104+| Gate in island data or a model, naming the field | Rejection only | "module kind needs unsupported inference", no field | Partly |
105+| Repeated attribute in a literal list | None | Accepted | Not met |
106+| Repeated field in a Jibb record | `types-record-field-expr-duplicate` and two more | Exact, both sites | Met |
107+| `proj` is reserved | "module has conflicting names" | Same, no name | Partly |
108+| `m()` | Partial | Generic | Partly |
109+| `[]` | None; partial says "not supported" | Generic | Partly |
110+| Loobean operands to arithmetic | Partial | Generic | Partly |
111+| Two distinct capitals forced equal | Partial, both sites | Generic | Partly |
112+| Unconstrained hole, or one fixed only by a later use | Partial | Generic; a mold's hole names neither | Partly |
113+| Gates in `eq` arguments and map or set keys | Partial | Generic | Partly |
114+| Watching an unwatchable request, or one with `scry=` | The generic kind message is the expected value | "module kind needs unsupported inference" | Partly |
115+| Each error names both conflicting sites, with excerpts | | Two sites only for overlaps, repeated fields and derived clashes | Partly |
docs/status.md+1−1
@@ -7,7 +7,7 @@ As of 2026-11-03. This file lists what Jibb does now, whether each part is done,
7| # | Milestone | Status |
7| # | Milestone | Status |
8| --- | --- | --- |
8| --- | --- | --- |
9| 1 | Parser and mark | Done (7c739b7; the doc's grammar decisions of 2026-10-30 in ab797a9) |
9| 1 | Parser and mark | Done (7c739b7; the doc's grammar decisions of 2026-10-30 in ab797a9) |
10−| 2 | Types and prelude | In progress: the checker and the Hoon importer are partial. [prompts/milestone-2.md](prompts/milestone-2.md) briefs it |
10+| 2 | Types and prelude | In progress: the checker and the Hoon importer are partial. [prompts/milestone-2.md](prompts/milestone-2.md) briefs it. The [milestone 2 review](reviews/2026-11-03-milestone-2-review.md) of 2026-11-03 lists what the done-criteria still need, briefed in [prompts/milestone-2-finish.md](prompts/milestone-2-finish.md) |
11| 3 | Core language | Not started |
11| 3 | Core language | Not started |
12| 4 | Host and static pages: the first release | Not started |
12| 4 | Host and static pages: the first release | Not started |
13| 5 | Published pages | Not started |
13| 5 | Published pages | Not started |