max / goingson
- Co-Authored-By
- Claude Opus 5 (1M context) <noreply@anthropic.com>
- Claude-Session
- https://claude.ai/code/session_01WHu5vBgpCULUFXsEJBHryC
5 files changed,
+59 insertions,
-83 deletions
| @@ -1387,7 +1387,7 @@ | |||
| 1387 | 1387 | "libc", | |
| 1388 | 1388 | "option-ext", | |
| 1389 | 1389 | "redox_users", | |
| 1390 | - | "windows-sys 0.61.2", | |
| 1390 | + | "windows-sys 0.60.2", | |
| 1391 | 1391 | ] | |
| 1392 | 1392 | ||
| 1393 | 1393 | [[package]] | |
| @@ -1628,7 +1628,7 @@ | |||
| 1628 | 1628 | checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" | |
| 1629 | 1629 | dependencies = [ | |
| 1630 | 1630 | "libc", | |
| 1631 | - | "windows-sys 0.61.2", | |
| 1631 | + | "windows-sys 0.60.2", | |
| 1632 | 1632 | ] | |
| 1633 | 1633 | ||
| 1634 | 1634 | [[package]] | |
| @@ -3650,7 +3650,7 @@ | |||
| 3650 | 3650 | "png 0.18.1", | |
| 3651 | 3651 | "serde", | |
| 3652 | 3652 | "thiserror 2.0.20", | |
| 3653 | - | "windows-sys 0.61.2", | |
| 3653 | + | "windows-sys 0.60.2", | |
| 3654 | 3654 | ] | |
| 3655 | 3655 | ||
| 3656 | 3656 | [[package]] | |
| @@ -3783,7 +3783,7 @@ | |||
| 3783 | 3783 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
| 3784 | 3784 | checksum = "7957b9740744892f114936ab4a57b3f487491bbeafaf8083688b16841a4240e5" | |
| 3785 | 3785 | dependencies = [ | |
| 3786 | - | "windows-sys 0.61.2", | |
| 3786 | + | "windows-sys 0.60.2", | |
| 3787 | 3787 | ] | |
| 3788 | 3788 | ||
| 3789 | 3789 | [[package]] | |
| @@ -4717,7 +4717,7 @@ | |||
| 4717 | 4717 | ||
| 4718 | 4718 | [[package]] | |
| 4719 | 4719 | name = "quasi-http" | |
| 4720 | - | version = "0.92.0" | |
| 4720 | + | version = "0.93.0" | |
| 4721 | 4721 | dependencies = [ | |
| 4722 | 4722 | "form_urlencoded", | |
| 4723 | 4723 | "http", | |
| @@ -4726,7 +4726,7 @@ | |||
| 4726 | 4726 | ||
| 4727 | 4727 | [[package]] | |
| 4728 | 4728 | name = "quasi-notifs" | |
| 4729 | - | version = "0.92.0" | |
| 4729 | + | version = "0.93.0" | |
| 4730 | 4730 | dependencies = [ | |
| 4731 | 4731 | "quasi-router", | |
| 4732 | 4732 | "synckit-config", | |
| @@ -4736,14 +4736,14 @@ | |||
| 4736 | 4736 | ||
| 4737 | 4737 | [[package]] | |
| 4738 | 4738 | name = "quasi-router" | |
| 4739 | - | version = "0.92.0" | |
| 4739 | + | version = "0.93.0" | |
| 4740 | 4740 | dependencies = [ | |
| 4741 | 4741 | "makeover-layout", | |
| 4742 | 4742 | ] | |
| 4743 | 4743 | ||
| 4744 | 4744 | [[package]] | |
| 4745 | 4745 | name = "quasi-tauri" | |
| 4746 | - | version = "0.92.0" | |
| 4746 | + | version = "0.93.0" | |
| 4747 | 4747 | dependencies = [ | |
| 4748 | 4748 | "http", | |
| 4749 | 4749 | "quasi-http", | |
| @@ -4769,7 +4769,7 @@ | |||
| 4769 | 4769 | ||
| 4770 | 4770 | [[package]] | |
| 4771 | 4771 | name = "quasi-webview" | |
| 4772 | - | version = "0.92.0" | |
| 4772 | + | version = "0.93.0" | |
| 4773 | 4773 | dependencies = [ | |
| 4774 | 4774 | "docengine", | |
| 4775 | 4775 | "makeover-layout", | |
| @@ -5208,7 +5208,7 @@ | |||
| 5208 | 5208 | "errno", | |
| 5209 | 5209 | "libc", | |
| 5210 | 5210 | "linux-raw-sys", | |
| 5211 | - | "windows-sys 0.61.2", | |
| 5211 | + | "windows-sys 0.60.2", | |
| 5212 | 5212 | ] | |
| 5213 | 5213 | ||
| 5214 | 5214 | [[package]] | |
| @@ -5265,7 +5265,7 @@ | |||
| 5265 | 5265 | "security-framework", | |
| 5266 | 5266 | "security-framework-sys", | |
| 5267 | 5267 | "webpki-root-certs", | |
| 5268 | - | "windows-sys 0.61.2", | |
| 5268 | + | "windows-sys 0.60.2", | |
| 5269 | 5269 | ] | |
| 5270 | 5270 | ||
| 5271 | 5271 | [[package]] | |
| @@ -5805,7 +5805,7 @@ | |||
| 5805 | 5805 | checksum = "c3d1e2c7f27f8d4cb10542a02c49005dbd6e93095799d6f3be745fae9f8fedd4" | |
| 5806 | 5806 | dependencies = [ | |
| 5807 | 5807 | "libc", | |
| 5808 | - | "windows-sys 0.61.2", | |
| 5808 | + | "windows-sys 0.60.2", | |
| 5809 | 5809 | ] | |
| 5810 | 5810 | ||
| 5811 | 5811 | [[package]] | |
| @@ -6565,7 +6565,7 @@ | |||
| 6565 | 6565 | "getrandom 0.4.3", | |
| 6566 | 6566 | "once_cell", | |
| 6567 | 6567 | "rustix", | |
| 6568 | - | "windows-sys 0.61.2", | |
| 6568 | + | "windows-sys 0.60.2", | |
| 6569 | 6569 | ] | |
| 6570 | 6570 | ||
| 6571 | 6571 | [[package]] | |
| @@ -6587,7 +6587,7 @@ | |||
| 6587 | 6587 | "parking_lot", | |
| 6588 | 6588 | "rustix", | |
| 6589 | 6589 | "signal-hook", | |
| 6590 | - | "windows-sys 0.61.2", | |
| 6590 | + | "windows-sys 0.60.2", | |
| 6591 | 6591 | ] | |
| 6592 | 6592 | ||
| 6593 | 6593 | [[package]] | |
| @@ -7069,7 +7069,7 @@ | |||
| 7069 | 7069 | "png 0.18.1", | |
| 7070 | 7070 | "serde", | |
| 7071 | 7071 | "thiserror 2.0.20", | |
| 7072 | - | "windows-sys 0.61.2", | |
| 7072 | + | "windows-sys 0.60.2", | |
| 7073 | 7073 | ] | |
| 7074 | 7074 | ||
| 7075 | 7075 | [[package]] | |
| @@ -7104,7 +7104,7 @@ | |||
| 7104 | 7104 | dependencies = [ | |
| 7105 | 7105 | "memoffset", | |
| 7106 | 7106 | "tempfile", | |
| 7107 | - | "windows-sys 0.61.2", | |
| 7107 | + | "windows-sys 0.60.2", | |
| 7108 | 7108 | ] | |
| 7109 | 7109 | ||
| 7110 | 7110 | [[package]] | |
| @@ -7634,7 +7634,7 @@ | |||
| 7634 | 7634 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
| 7635 | 7635 | checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" | |
| 7636 | 7636 | dependencies = [ | |
| 7637 | - | "windows-sys 0.61.2", | |
| 7637 | + | "windows-sys 0.60.2", | |
| 7638 | 7638 | ] | |
| 7639 | 7639 | ||
| 7640 | 7640 | [[package]] | |
| @@ -8491,22 +8491,22 @@ | |||
| 8491 | 8491 | "winnow 1.0.4", | |
| 8492 | 8492 | ] | |
| 8493 | 8493 | ||
| 8494 | - | [[patch.unused]] | |
| 8495 | - | name = "ops-status" | |
| 8496 | - | version = "0.1.0" | |
| 8497 | - | ||
| 8498 | 8494 | [[patch.unused]] | |
| 8499 | 8495 | name = "quasi-axum" | |
| 8500 | - | version = "0.92.0" | |
| 8496 | + | version = "0.93.0" | |
| 8501 | 8497 | ||
| 8502 | 8498 | [[patch.unused]] | |
| 8503 | 8499 | name = "quasi-basics" | |
| 8504 | - | version = "0.92.0" | |
| 8500 | + | version = "0.93.0" | |
| 8505 | 8501 | ||
| 8506 | 8502 | [[patch.unused]] | |
| 8507 | 8503 | name = "quasi-immediate" | |
| 8508 | - | version = "0.92.0" | |
| 8504 | + | version = "0.93.0" | |
| 8509 | 8505 | ||
| 8510 | 8506 | [[patch.unused]] | |
| 8511 | 8507 | name = "quasi-store" | |
| 8512 | 8508 | version = "0.1.0" | |
| 8509 | + | ||
| 8510 | + | [[patch.unused]] | |
| 8511 | + | name = "ops-status" | |
| 8512 | + | version = "0.1.0" |
| @@ -52,7 +52,7 @@ | |||
| 52 | 52 | │ └── got/ # Terminal cockpit over the same goingson.db | |
| 53 | 53 | ├── src-tauri/ # Tauri desktop app, and the described screens | |
| 54 | 54 | └── migrations/ | |
| 55 | - | └── sqlite/ # SQLite schema migrations (69 files) | |
| 55 | + | └── sqlite/ # SQLite schema migrations | |
| 56 | 56 | ``` | |
| 57 | 57 | ||
| 58 | 58 | `go-mcp` and `got` open the same SQLite file as peer readers and write through | |
| @@ -76,7 +76,7 @@ | |||
| 76 | 76 | ||
| 77 | 77 | | Module | Purpose | | |
| 78 | 78 | |--------|---------| | |
| 79 | - | | `models/` | Domain types (19 model files) | | |
| 79 | + | | `models/` | Domain types | | |
| 80 | 80 | | `repository/` | Repository traits, one module per area | | |
| 81 | 81 | | `urgency.rs` | TaskWarrior-inspired urgency calculation algorithm | | |
| 82 | 82 | | `parser.rs`, `search_parser.rs`, `date_parser.rs` | Quick-add, search and date parsing | | |
| @@ -129,13 +129,11 @@ | |||
| 129 | 129 | ||
| 130 | 130 | ## Database Layer (`crates/db-sqlite/`) | |
| 131 | 131 | ||
| 132 | - | SQLite persistence, single-user and local. 69 migrations in `migrations/sqlite/`. | |
| 132 | + | SQLite persistence, single-user and local. Migrations in `migrations/sqlite/`. | |
| 133 | 133 | ||
| 134 | 134 | `rusqlite` behind an `r2d2` pool. **The repositories are synchronous**: an async | |
| 135 | - | caller reaches them through `tokio::task::spawn_blocking`. The tree moved off | |
| 136 | - | sqlx-sqlite on 2026-08-07 and the repository traits went sync in the same pass, | |
| 137 | - | because the async had come from sqlx rather than from anything the app wanted. | |
| 138 | - | Wiki: `sql-library-standard`. | |
| 135 | + | caller reaches them through `tokio::task::spawn_blocking`. Wiki: | |
| 136 | + | `sql-library-standard`. | |
| 139 | 137 | ||
| 140 | 138 | ``` | |
| 141 | 139 | src/ | |
| @@ -204,25 +202,16 @@ | |||
| 204 | 202 | } | |
| 205 | 203 | ``` | |
| 206 | 204 | ||
| 207 | - | **Commands have two callers now, and only one of them is IPC.** A described | |
| 208 | - | screen calls the command as a plain Rust function (67 sites), which is why the | |
| 209 | - | command layer survived the swap intact rather than being absorbed into the | |
| 210 | - | screens. The 261 registered commands are still reachable over IPC, which is what | |
| 211 | - | the mobile entry point and the handful of host jobs in `frontend/js/host.js` use. | |
| 205 | + | **Commands have two callers, and only one of them is IPC.** A described screen | |
| 206 | + | calls the command as a plain Rust function. The registered commands are also | |
| 207 | + | reachable over IPC, which is what the mobile entry point and the host jobs in | |
| 208 | + | `frontend/js/host.js` use. | |
| 212 | 209 | ||
| 213 | 210 | ## The Frontend: described screens | |
| 214 | 211 | ||
| 215 | 212 | There is no hand-written frontend. The window opens on `quasi://localhost/tasks` | |
| 216 | - | and there is no other document. `index.html` and the 84 scripts under | |
| 217 | - | `frontend/js/` were deleted on 2026-08-22. | |
| 218 | - | ||
| 219 | - | ### What it was for | |
| 220 | - | ||
| 221 | - | Not porting screens for its own sake. `escape.js` and its 332 `esc()` call sites | |
| 222 | - | existed because screens were built by concatenating strings in JavaScript, and | |
| 223 | - | every one of them had to remember to escape. Escaping is typed in Rust at the | |
| 224 | - | renderer now, so the escapers and the CHRONIC-XSS gate that policed them are both | |
| 225 | - | gone, in that order and not the other one. | |
| 213 | + | and there is no other document. Escaping is typed in Rust at the renderer, so no | |
| 214 | + | call site can forget it. | |
| 226 | 215 | ||
| 227 | 216 | ### The shape | |
| 228 | 217 | ||
| @@ -245,10 +234,9 @@ | |||
| 245 | 234 | ``` | |
| 246 | 235 | ||
| 247 | 236 | A screen module reads `AppState` repositories directly, or calls a command as a | |
| 248 | - | plain function, and returns a description. Each module also carries its own | |
| 249 | - | findings about what a real screen needed that the description layer could not | |
| 250 | - | say, because a finding that lives only in a commit message is a finding nobody | |
| 251 | - | acts on. | |
| 237 | + | plain function, and returns a description. Record in the module itself anything a | |
| 238 | + | screen needed that the description layer could not say; a finding that lives only | |
| 239 | + | in a commit message is a finding nobody acts on. | |
| 252 | 240 | ||
| 253 | 241 | ### The five surviving scripts | |
| 254 | 242 | ||
| @@ -267,9 +255,8 @@ | |||
| 267 | 255 | ||
| 268 | 256 | ### Pre-computed response fields | |
| 269 | 257 | ||
| 270 | - | Response types still carry pre-computed display values, so nothing downstream | |
| 271 | - | calculates dates, formatting or derived state. The consumer changed from a JS | |
| 272 | - | render function to a description, and the reason did not. | |
| 258 | + | Response types carry pre-computed display values, so nothing downstream | |
| 259 | + | calculates dates, formatting or derived state. | |
| 273 | 260 | ||
| 274 | 261 | | Response Type | Pre-computed Fields | | |
| 275 | 262 | |--------------|---------------------| | |
| @@ -278,18 +265,15 @@ | |||
| 278 | 265 | | EmailResponse | `receivedFormatted` | | |
| 279 | 266 | | EmailAccountResponse | `lastSyncFormatted` | | |
| 280 | 267 | ||
| 281 | - | ### What the swap left behind | |
| 268 | + | ### Not yet described | |
| 282 | 269 | ||
| 283 | - | Six features went out with `index.html` and come back as each is described. Max | |
| 284 | - | ruled (b) on goingson `da48cb6d`: no build ships until the flip is finished, so | |
| 285 | - | the interval where they are missing is an interval nobody is in. Compose, | |
| 286 | - | Settings > Sync and Settings > About are back. Settings > Sharing, Create Backup, | |
| 287 | - | the search box and the blocking graph are not, and the last two are refused | |
| 270 | + | No build ships until every screen is described. Settings > Sharing and Create | |
| 271 | + | Backup are still to come. The search box and the blocking graph are refused | |
| 288 | 272 | rather than pending: they are things a host draws, not things a description says. | |
| 289 | 273 | ||
| 290 | - | `check_vocabulary_use` is a real hole rather than an obsolete check. It asked | |
| 291 | - | which generated classes no markup emits, and the markup is `quasi-webview`'s | |
| 292 | - | emitter now, in another crate. goingson `43a682b0`. | |
| 274 | + | `check_vocabulary_use` is an open hole: it asked which generated classes no | |
| 275 | + | markup emits, and the markup is `quasi-webview`'s emitter, in another crate. | |
| 276 | + | goingson `43a682b0`. | |
| 293 | 277 | ||
| 294 | 278 | For the stylesheets and what may be written by hand, see `design-system.md`. | |
| 295 | 279 |
| @@ -58,7 +58,7 @@ | |||
| 58 | 58 | Depth, fill, edge, focus ring and disabled colour are not here. They come from | |
| 59 | 59 | `layout.css`, and a rule that restates one is a bug. | |
| 60 | 60 | ||
| 61 | - | Seventeen classes are styled today: `.badge`, `.button`, `.card`, `.chrome-nav`, | |
| 61 | + | The styled classes: `.badge`, `.button`, `.card`, `.chrome-nav`, | |
| 62 | 62 | `.chrome-panel`, `.chrome-place`, `.field`, `.form-checkbox-label`, | |
| 63 | 63 | `.form-error`, `.form-group`, `.form-hint`, `.form-label`, `.progress`, | |
| 64 | 64 | `.progress-fill`, `.tab`, `.table-heading`, `.toast`. Every one of them is the | |
| @@ -92,13 +92,11 @@ | |||
| 92 | 92 | - the intent check refuses a rule that reads a `--token` the fallback block does | |
| 93 | 93 | not declare, since the declaration would be invalid until a theme lands. | |
| 94 | 94 | ||
| 95 | - | `check_vocabulary_use` is not among them. It went with the swap and nothing | |
| 96 | - | replaces it: goingson `43a682b0`. | |
| 95 | + | `check_vocabulary_use` is not among them. The gap is open: goingson `43a682b0`. | |
| 97 | 96 | ||
| 98 | 97 | `scripts/lint-frontend.sh` holds the three rules that police a stylesheet rather | |
| 99 | 98 | than a script: `no-var-fallback-hex`, `no-deprecated-empty-states`, | |
| 100 | - | `described-members-in-flow`. Its header records the seven rules the swap | |
| 101 | - | retired and why each one stopped having anything to read. | |
| 99 | + | `described-members-in-flow`. | |
| 102 | 100 | ||
| 103 | 101 | ## Two standing rules | |
| 104 | 102 |
| @@ -9,15 +9,9 @@ | |||
| 9 | 9 | Mac OS 8 Platinum, informed rather than copied. Two-tone bevels, square corners, | |
| 10 | 10 | a neutral ramp, instant state changes, native window chrome. | |
| 11 | 11 | ||
| 12 | - | It grew out of the neobrutalist system it replaces, which is why the token shapes | |
| 13 | - | carry over intact: the same border width, the same radius scale, the same offset | |
| 14 | - | shadow. What changed is what they resolve to. A raised object is now read by its | |
| 15 | - | bevel rather than by a heavy black edge and a 4px drop, and only a floating | |
| 16 | - | surface casts a shadow. | |
| 17 | - | ||
| 18 | - | - Depth is a fill and an edge together. Naming them apart is what let them | |
| 19 | - | disagree, so `makeover-layout` states them as one thing and this app states | |
| 20 | - | neither. | |
| 12 | + | - Depth is a fill and an edge together. `makeover-layout` states them as one | |
| 13 | + | thing and this app states neither. A raised object is read by its bevel; only | |
| 14 | + | a floating surface casts a shadow. | |
| 21 | 15 | - State changes are instant. There is no transition token in this app. | |
| 22 | 16 | - A card answers a click. If a thing does not answer a click it is a panel. | |
| 23 | 17 | ||
| @@ -97,7 +91,7 @@ | |||
| 97 | 91 | | `--font-size-3xl` | 1.5rem | page titles | | |
| 98 | 92 | | `--font-size-4xl` | 1.75rem | main headings | | |
| 99 | 93 | ||
| 100 | - | `--line-height-normal` is 1.5 and is the only line-height token left. | |
| 94 | + | `--line-height-normal` is 1.5 and is the only line-height token. | |
| 101 | 95 | ||
| 102 | 96 | ## Spacing | |
| 103 | 97 |
| @@ -36,7 +36,7 @@ | |||
| 36 | 36 | makeover-geometry = "0.7" | |
| 37 | 37 | # Only to write its selection and clock scripts into the frontend. Those two are | |
| 38 | 38 | # the whole of `frontend/js/` since the swap. | |
| 39 | - | quasi-webview = { git = "https://makenot.work/git/max/quasi.git", version = "0.92" } | |
| 39 | + | quasi-webview = { git = "https://makenot.work/git/max/quasi.git", version = "0.93" } | |
| 40 | 40 | ||
| 41 | 41 | [dependencies] | |
| 42 | 42 | goingson-core = { workspace = true } | |
| @@ -54,10 +54,10 @@ | |||
| 54 | 54 | # dependency's source even with the feature off -- so a public clone could not | |
| 55 | 55 | # build at all against a URL it could not reach. quasi went public that day and | |
| 56 | 56 | # the URL moved here with it. | |
| 57 | - | quasi-router = { git = "https://makenot.work/git/max/quasi.git", version = "0.92" } | |
| 58 | - | quasi-http = { git = "https://makenot.work/git/max/quasi.git", version = "0.92" } | |
| 59 | - | quasi-webview = { git = "https://makenot.work/git/max/quasi.git", version = "0.92" } | |
| 60 | - | quasi-tauri = { git = "https://makenot.work/git/max/quasi.git", version = "0.92" } | |
| 57 | + | quasi-router = { git = "https://makenot.work/git/max/quasi.git", version = "0.93" } | |
| 58 | + | quasi-http = { git = "https://makenot.work/git/max/quasi.git", version = "0.93" } | |
| 59 | + | quasi-webview = { git = "https://makenot.work/git/max/quasi.git", version = "0.93" } | |
| 60 | + | quasi-tauri = { git = "https://makenot.work/git/max/quasi.git", version = "0.93" } | |
| 61 | 61 | ||
| 62 | 62 | # The notification declaration, and it is NOT behind the `quasi` feature: the | |
| 63 | 63 | # watcher is desktop app behaviour rather than a described screen, and the | |
| @@ -69,7 +69,7 @@ | |||
| 69 | 69 | # so an app wanting eight lines over `tauri-plugin-notification` had to link the | |
| 70 | 70 | # whole description stack for them. quasicoherent `c231ff13` moved it here, | |
| 71 | 71 | # where the `Deliver` trait it implements already lives. | |
| 72 | - | quasi-notifs = { git = "https://makenot.work/git/max/quasi.git", version = "0.92", features = ["synckit", "describe", "tauri"] } | |
| 72 | + | quasi-notifs = { git = "https://makenot.work/git/max/quasi.git", version = "0.93", features = ["synckit", "describe", "tauri"] } | |
| 73 | 73 | ||
| 74 | 74 | # Tauri | |
| 75 | 75 | tauri = { workspace = true, features = ["image-png", "devtools"] } |