Skip to main content

max / quasi

Let a screen's markup be derived once and compiled in The build-time half of the declaration transition (quasicoherent `793d99dd`). Three pieces, and the first two are what the third needs. `#[constant]` on a declaration. A proc macro sees one invocation and no other, so a caller cannot read a callee's flags: two `declare!`s are two expansions, often in two crates. The flag leaves behind a shim, `foo_constant`, which is the shape under a second name and exists only under the flag. A staged `include` whose arguments are all literal calls that instead of opening a scope, so the callee is evaluated once while a residual is derived rather than once per request. A shape that promised nothing has no shim and the call does not resolve, which is the whole enforcement: literal arguments do not make a callee fixed, and inlining on argument shape alone would bake one reading of a clock into a residual and serve it forever. `Residual` holds `Cow` rather than `Vec`, so one can be a `static`, and `as_rust` writes a residual out as Rust source. Source and not a serialization format: a format needs a writer, a reader, a version and a parse at startup, and the parse is what the spike's template intermediate was rejected for. The artifact is code and rustc is its only reader. `Webview::served` writes the document around regions this renderer already wrote. A screen's regions are fixed whenever nothing in them reads a request; the document around them is not, because a shell carries whoever is looking. That is the seam, and it is where the request stops mattering. `Residual::settled` answers `Some` when a residual is one literal, which is phase 2's sharp test spelled as a method.
Co-Authored-By
Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session
https://claude.ai/code/session_01P8ostB2UmZJGj5WjSHRSot
Author: Max Johnson <me@maxj.phd> · 2026-09-07 20:07 UTC
Signed with PGP, not checked
Commit: d99e7636afe8b32505e75c6702a2bde659f76930
Parent: a7d46b9
25 files changed, +595 insertions, -82 deletions
M Cargo.lock +18 -18
@@ -3474,11 +3474,11 @@
3474 3474
3475 3475 [[package]]
3476 3476 name = "quasi"
3477 - version = "0.102.0"
3477 + version = "0.103.0"
3478 3478
3479 3479 [[package]]
3480 3480 name = "quasi-axum"
3481 - version = "0.102.0"
3481 + version = "0.103.0"
3482 3482 dependencies = [
3483 3483 "axum",
3484 3484 "http",
@@ -3492,7 +3492,7 @@
3492 3492
3493 3493 [[package]]
3494 3494 name = "quasi-basics"
3495 - version = "0.102.0"
3495 + version = "0.103.0"
3496 3496 dependencies = [
3497 3497 "makeover-layout",
3498 3498 "quasi-declare",
@@ -3503,7 +3503,7 @@
3503 3503
3504 3504 [[package]]
3505 3505 name = "quasi-bench"
3506 - version = "0.102.0"
3506 + version = "0.103.0"
3507 3507 dependencies = [
3508 3508 "askama",
3509 3509 "dhat",
@@ -3524,7 +3524,7 @@
3524 3524
3525 3525 [[package]]
3526 3526 name = "quasi-declare"
3527 - version = "0.1.10"
3527 + version = "0.1.11"
3528 3528 dependencies = [
3529 3529 "proc-macro2",
3530 3530 "quasi-router",
@@ -3536,7 +3536,7 @@
3536 3536
3537 3537 [[package]]
3538 3538 name = "quasi-http"
3539 - version = "0.102.0"
3539 + version = "0.103.0"
3540 3540 dependencies = [
3541 3541 "form_urlencoded",
3542 3542 "http",
@@ -3545,7 +3545,7 @@
3545 3545
3546 3546 [[package]]
3547 3547 name = "quasi-immediate"
3548 - version = "0.102.0"
3548 + version = "0.103.0"
3549 3549 dependencies = [
3550 3550 "docengine",
3551 3551 "egui",
@@ -3556,7 +3556,7 @@
3556 3556
3557 3557 [[package]]
3558 3558 name = "quasi-notifs"
3559 - version = "0.102.0"
3559 + version = "0.103.0"
3560 3560 dependencies = [
3561 3561 "quasi-router",
3562 3562 "synckit-config",
@@ -3566,7 +3566,7 @@
3566 3566
3567 3567 [[package]]
3568 3568 name = "quasi-router"
3569 - version = "0.102.0"
3569 + version = "0.103.0"
3570 3570 dependencies = [
3571 3571 "makeover-layout",
3572 3572 ]
@@ -3583,7 +3583,7 @@
3583 3583
3584 3584 [[package]]
3585 3585 name = "quasi-tauri"
3586 - version = "0.102.0"
3586 + version = "0.103.0"
3587 3587 dependencies = [
3588 3588 "http",
3589 3589 "quasi-http",
@@ -3594,7 +3594,7 @@
3594 3594
3595 3595 [[package]]
3596 3596 name = "quasi-tui"
3597 - version = "0.102.0"
3597 + version = "0.103.0"
3598 3598 dependencies = [
3599 3599 "docengine",
3600 3600 "makeover",
@@ -3607,7 +3607,7 @@
3607 3607
3608 3608 [[package]]
3609 3609 name = "quasi-webview"
3610 - version = "0.102.0"
3610 + version = "0.103.0"
3611 3611 dependencies = [
3612 3612 "docengine",
3613 3613 "makeover-layout",
@@ -6312,6 +6312,10 @@
6312 6312 "winnow 1.0.4",
6313 6313 ]
6314 6314
6315 + [[patch.unused]]
6316 + name = "synckit-client"
6317 + version = "0.10.0"
6318 +
6315 6319 [[patch.unused]]
6316 6320 name = "kberg"
6317 6321 version = "0.1.0"
@@ -6329,13 +6333,9 @@
6329 6333 version = "0.4.1"
6330 6334
6331 6335 [[patch.unused]]
6332 - name = "synckit-client"
6333 - version = "0.10.0"
6336 + name = "makeover-build"
6337 + version = "0.67.0"
6334 6338
6335 6339 [[patch.unused]]
6336 6340 name = "quasi-type"
6337 6341 version = "0.1.3"
6338 -
6339 - [[patch.unused]]
6340 - name = "makeover-build"
6341 - version = "0.67.0"
@@ -1,6 +1,6 @@
1 1 [package]
2 2 name = "quasi-axum"
3 - version = "0.102.0"
3 + version = "0.103.0"
4 4 description = "The axum host adapter for quasi-router: an HTTP request in, a rendered description out"
5 5 edition.workspace = true
6 6 rust-version.workspace = true
@@ -13,14 +13,14 @@
13 13 workspace = true
14 14
15 15 [dependencies]
16 - quasi-router = { path = "../quasi-router", version = "0.102" }
17 - quasi-http = { path = "../quasi-http", version = "0.102" }
16 + quasi-router = { path = "../quasi-router", version = "0.103" }
17 + quasi-http = { path = "../quasi-http", version = "0.103" }
18 18 axum = "0.8.8"
19 19 http = "1.3.1"
20 20 tokio = { version = "1.50.0", features = ["rt"] }
21 21
22 22 [dev-dependencies]
23 - quasi-webview = { path = "../quasi-webview", version = "0.102" }
23 + quasi-webview = { path = "../quasi-webview", version = "0.103" }
24 24 tokio = { version = "1.50.0", features = ["macros", "rt-multi-thread"] }
25 25 tower = { version = "0.5.3", features = ["util"] }
26 26 http-body-util = "0.1.3"
@@ -1,6 +1,6 @@
1 1 [package]
2 2 name = "quasi-basics"
3 - version = "0.102.0"
3 + version = "0.103.0"
4 4 description = "The first-party widget set: named assemblies of primitives, shared across our apps"
5 5 edition.workspace = true
6 6 rust-version.workspace = true
@@ -13,7 +13,7 @@
13 13 workspace = true
14 14
15 15 [dependencies]
16 - quasi-router = { path = "../quasi-router", version = "0.102" }
16 + quasi-router = { path = "../quasi-router", version = "0.103" }
17 17 quasi-declare = { path = "../quasi-declare", version = "0.1" }
18 18 makeover-layout = "0.44"
19 19
@@ -21,5 +21,5 @@
21 21 # A widget's guarantees are claims about what a renderer draws, so they are
22 22 # tested against a real one rather than by walking the tree the assembly just
23 23 # built. The webview is the renderer that recognises names today.
24 - quasi-webview = { path = "../quasi-webview", version = "0.102" }
25 - quasi-http = { path = "../quasi-http", version = "0.102" }
24 + quasi-webview = { path = "../quasi-webview", version = "0.103" }
25 + quasi-http = { path = "../quasi-http", version = "0.103" }
@@ -1,6 +1,6 @@
1 1 [package]
2 2 name = "quasi-bench"
3 - version = "0.102.0"
3 + version = "0.103.0"
4 4 description = "What a described screen costs to render, in time and in allocations"
5 5 edition.workspace = true
6 6 rust-version.workspace = true
@@ -26,14 +26,14 @@
26 26 askama = ["dep:askama"]
27 27
28 28 [dependencies]
29 - quasi-router = { path = "../quasi-router", version = "0.102" }
30 - quasi-webview = { path = "../quasi-webview", version = "0.102" }
31 - quasi-tui = { path = "../quasi-tui", version = "0.102" }
32 - quasi-immediate = { path = "../quasi-immediate", version = "0.102" }
29 + quasi-router = { path = "../quasi-router", version = "0.103" }
30 + quasi-webview = { path = "../quasi-webview", version = "0.103" }
31 + quasi-tui = { path = "../quasi-tui", version = "0.103" }
32 + quasi-immediate = { path = "../quasi-immediate", version = "0.103" }
33 33 # `Serves` is the trait carrying `screen` and `fragment`, which is what the
34 34 # webview is measured through. Taken directly rather than through quasi-webview
35 35 # because a bench calling a trait method should name the trait it calls.
36 - quasi-http = { path = "../quasi-http", version = "0.102" }
36 + quasi-http = { path = "../quasi-http", version = "0.103" }
37 37 # The macro under measurement. The bench holds the declared copy of the same
38 38 # screen `staging.rs` writes by hand, so the staged column measures what the
39 39 # server actually serves rather than a shape written for a benchmark.
@@ -1,6 +1,6 @@
1 1 [package]
2 2 name = "quasi-declare"
3 - version = "0.1.10"
3 + version = "0.1.11"
4 4 description = "The declare! form: a screen description compiled to Rust at build time."
5 5 edition.workspace = true
6 6 rust-version.workspace = true
@@ -31,4 +31,4 @@
31 31 trybuild = "1"
32 32 # The generated code names the vocabulary, so a case that is meant to COMPILE
33 33 # needs it. A proc-macro crate cannot depend on it outside dev.
34 - quasi-router = { path = "../quasi-router", version = "0.102" }
34 + quasi-router = { path = "../quasi-router", version = "0.103" }