Skip to main content

max / goingson

Measure the two un-ported candidates, and correct what the table said events.js: measured, and the old note was wrong twice. There is no grid in the file and all ten sites are describable — three lists, a form and a detail modal. The port meets virtual scrolling (settled by task_list and emails), a natural-date transform either side of the field, and a timezone whose validity depends on tz_kind. None is a blocker. task-graph.js: bespoke, and it now has a section of its own rather than a seat on the candidate list. It emits SVG with computed coordinates, bezier edge paths and an arrowhead marker; a vocabulary that could say that would be a graphics library, and a member positioning itself is what layout-room-and- fallback rule 1 forbids.
Co-Authored-By
Claude Opus 5 (1M context) <noreply@anthropic.com>
Author: Max Johnson <me@maxj.phd> · 2026-08-21 23:38 UTC
Signed with PGP, not checked
Commit: 8ff982d44df0cc3b5fcd52e19ddbfe54db29afad
Parent: 052179c
2 files changed, +40 insertions, -9 deletions
M Cargo.lock +4 -4
@@ -8483,10 +8483,6 @@
8483 8483 "winnow 1.0.4",
8484 8484 ]
8485 8485
8486 - [[patch.unused]]
8487 - name = "ops-status"
8488 - version = "0.1.0"
8489 -
8490 8486 [[patch.unused]]
8491 8487 name = "quasi-axum"
8492 8488 version = "0.47.0"
@@ -8506,3 +8502,7 @@
8506 8502 [[patch.unused]]
8507 8503 name = "makeover-immediate"
8508 8504 version = "0.31.0"
8505 +
8506 + [[patch.unused]]
8507 + name = "ops-status"
8508 + version = "0.1.0"
@@ -94,7 +94,7 @@
94 94 //! These 50 never reach zero by porting. Retiring `escape.js` means giving them
95 95 //! typed escaping some other way, or accepting that four files keep an escaper.
96 96 //!
97 - //! ## Un-ported screens (2 files, 16 sites)
97 + //! ## Un-ported screens (1 file, 10 sites)
98 98 //!
99 99 //! A described counterpart could exist and does not. This is the candidate list,
100 100 //! and it is the only place to look for what is portable next.
@@ -111,10 +111,41 @@
111 111 //! 1 and 2 are what the flip waits on. `time-tracking.js` and `time-summary.js`
112 112 //! left on 2026-08-20 and are [`time_tracking`]'s row above.
113 113 //!
114 - //! - `events.js` 10. Its grid rendering is bespoke; whether the CRUD/list half
115 - //! is a real candidate is unchecked, and per this table that is a claim to
116 - //! measure rather than assert.
117 - //! - `task-graph.js` 6. Draws the blocking DAG.
114 + //! - `events.js` 10. Measured 2026-08-21, and the sentence that stood here was
115 + //! wrong twice over: there is no grid in the file, and all ten sites are
116 + //! describable. It is three lists, a form and a detail modal — no calendar
117 + //! rendering of any kind, which lives elsewhere. Sites 543/553/558 and
118 + //! 618/623 are `renderEventRow`'s title, location and recurrence-pattern
119 + //! cells (a described table), 791/798/802/805 are the detail modal
120 + //! (`Region::Modal` plus text), and 123 is the reminder-preset checkbox list
121 + //! (a `Choice` set). The whole file is a real candidate, which is more than
122 + //! the old note claimed and not less.
123 + //!
124 + //! Three things the port will meet, none of them blockers. The three
125 + //! `VirtualScroller`s over `renderEventRow` are the case [`task_list`]'s
126 + //! finding 2 and [`emails`]'s `list` already settled: windowing rows you hold
127 + //! is a renderer technique, and a described list answers it with `Rest`.
128 + //! `start_time`/`end_time` carry a `transform` that natural-parses the text
129 + //! before submit and an `onInput` preview beside the box, which is host
130 + //! behaviour on either side of a `Field` rather than something the field
131 + //! says. The `timezone` field's validity depends on `tz_kind`, so a described
132 + //! form either validates it on the server or the two travel together.
133 + //!
134 + //! ## Bespoke (1 file, 6 sites)
135 + //!
136 + //! Not a candidate, and it will keep its escaper. Left the list above 2026-08-21.
137 + //!
138 + //! - `task-graph.js` 6. Draws the blocking DAG, and *draws* is the word: it
139 + //! emits an SVG string with computed node coordinates, bezier edge paths, a
140 + //! `defs` arrowhead marker and a viewBox sized to the layered layout. Four of
141 + //! its six sites (207, 209, 213, and the labels at 227 positioned to the
142 + //! column pitch) are inside that. The description layer has no word for a
143 + //! coordinate or a path and should not grow one: a member that positions
144 + //! itself is the thing wiki `layout-room-and-fallback` rule 1 forbids, and a
145 + //! vocabulary that could express this would be a graphics library.
146 + //! The remaining site (46, a load-failure empty state) and the project filter
147 + //! are describable, but splitting a 258-line file to move one `esc()` leaves
148 + //! two screens where there was one and still does not retire the escaper.
118 149 //!
119 150 //! ## Not a screen (10 files, 27 sites)
120 151 //!