Skip to main content

max / makenotwork

Fail the build when a rule takes a property the generated sheet already sets look-wave-2 F3 specified this guard on 2026-08-09 and it was never built, which is why the server's hand-rolled sort carets were found by audit rather than by a build. It is on now, for all three hand-written stylesheets. Ten overlaps, nine of them legitimate and recorded with their reasons: makeover draws the tone and disabled arms of a badge and a card while the server draws the base and its own variants; the caret's reserved gap sits on the unsorted arm on purpose; `.table-row` is a grid here against makeover's table-row, which is the same build-time grid story goingson is on; and the media scrubber's `.progress-fill` is a name collision under a different parent, which its own `respec-ok` comment already said. The tenth is real and is filed rather than fixed here. `.tab.is-selected` sets `--surface-raised` and `--bevel-raised`, byte for byte what the generated `.tab.chosen` sets, so the server carries a second name for makeover's own state. Removing it means changing every tab strip's markup, which is visible on screen, so it is its own change.
Co-Authored-By
Claude Opus 5 (1M context) <noreply@anthropic.com>
Author: Max Johnson <me@maxj.phd> · 2026-08-12 01:51 UTC
Commit: 6ac794c191a9115dc88a9790864ac4d23743df9e
Parent: 0ab4528
3 files changed, +65 insertions, -13 deletions
M server/Cargo.lock +12 -12
@@ -5311,9 +5311,9 @@
5311 5311
5312 5312 [[package]]
5313 5313 name = "makeover-build"
5314 - version = "0.21.0"
5314 + version = "0.23.1"
5315 5315 source = "registry+https://github.com/rust-lang/crates.io-index"
5316 - checksum = "1b2484a18b0a0355762c4c5feaaaa8165b38ec33ce55fd2df6092dd0887b4a49"
5316 + checksum = "09326dad8b7fdbf1ae4359f866e8f4432a86c837f5a8bf1576bf0c298afcd41b"
5317 5317 dependencies = [
5318 5318 "makeover",
5319 5319 "makeover-geometry",
@@ -5344,9 +5344,9 @@
5344 5344
5345 5345 [[package]]
5346 5346 name = "makeover-webview"
5347 - version = "0.28.0"
5347 + version = "0.30.1"
5348 5348 source = "registry+https://github.com/rust-lang/crates.io-index"
5349 - checksum = "d2402af6249ca10f0a7ddbad2b5eb81725676ffca84093cb86bc1cadfa5b2272"
5349 + checksum = "d6f86fc082c5fc0d73192a3f3f5f74840848ba2cc815154ab207b1fc707f7c64"
5350 5350 dependencies = [
5351 5351 "makeover-geometry",
5352 5352 "makeover-layout",
@@ -10690,14 +10690,6 @@
10690 10690 name = "quasi-tauri"
10691 10691 version = "0.1.0"
10692 10692
10693 - [[patch.unused]]
10694 - name = "kberg"
10695 - version = "0.1.0"
10696 -
10697 - [[patch.unused]]
10698 - name = "painhours"
10699 - version = "0.1.0"
10700 -
10701 10693 [[patch.unused]]
10702 10694 name = "synckit-client"
10703 10695 version = "0.8.0"
@@ -10705,3 +10697,11 @@
10705 10697 [[patch.unused]]
10706 10698 name = "synckit-config"
10707 10699 version = "0.2.0"
10700 +
10701 + [[patch.unused]]
10702 + name = "kberg"
10703 + version = "0.1.0"
10704 +
10705 + [[patch.unused]]
10706 + name = "painhours"
10707 + version = "0.1.0"
@@ -236,7 +236,7 @@
236 236 # Emits static/geometry.css (makeover-geometry) and static/layout.css
237 237 # (makeover-webview). The same generator GO and BB run; only the output paths
238 238 # differ, since the server serves its stylesheets rather than bundling them.
239 - makeover-build = "0.21.0"
239 + makeover-build = "0.23.1"
240 240 # Read directly for the embeds' own copy of the spacing layer, which they need
241 241 # because an iframe cannot link a stylesheet. makeover-build does not re-export
242 242 # it, so the pin lives here and has to track the one makeover-build resolves.
@@ -54,6 +54,11 @@
54 54 // the hand-written ones, so there is no directory to scan. No tuning
55 55 // widths -- every threshold here is a shell boundary.
56 56 makeover_build::check_breakpoints_files(&HAND_WRITTEN_CSS, &[]);
57 + makeover_build::check_vocabulary_files(
58 + &HAND_WRITTEN_CSS,
59 + &makeover_build::Emit::default(),
60 + REVIEWED_OVERLAPS,
61 + );
57 62
58 63 // --- Static asset fingerprinting ---
59 64 // Hash the content of key static files to produce a version suffix.
@@ -229,3 +234,50 @@
229 234 }
230 235 }
231 236 }
237 +
238 + /// Class-and-property overlaps with the generated stylesheet that have been
239 + /// read and kept.
240 + ///
241 + /// Three kinds, and only the first is what the check is really for.
242 + ///
243 + /// **Different selector arms.** `.badge { color }` and `.card { color }`:
244 + /// makeover colours the tone and disabled arms, the server colours the base and
245 + /// its own variants (`.badge.ai-tier-*`, `.badge--founder-*`). Neither touches
246 + /// the other's arm. The check collapses arms, because separating them would
247 + /// need a selector matcher and a checker that guesses wrong about specificity
248 + /// fails correct builds, so the judgement is recorded here.
249 + ///
250 + /// **A deliberate pairing.** `.table-heading { content }` is the sort caret's
251 + /// reserved gap, declared on the unsorted arm precisely so it cannot blank the
252 + /// generated caret on the sorted one; `.table-heading { display }` and
253 + /// `.progress-fill { background }` are different elements rather than different
254 + /// arms -- the caret pseudo-element, and the media scrubber's fill, which lives
255 + /// inside `.progress-bar` and never matches the generated
256 + /// `.progress > .progress-fill`. That last one already carried a `respec-ok`
257 + /// comment saying so.
258 + ///
259 + /// **A divergence taken on purpose.** `.table-row { display }` is `grid` here
260 + /// against makeover's `table-row`, which is the same build-time grid story
261 + /// goingson is on.
262 + ///
263 + /// `.tab { background }` and `.tab { box-shadow }` are none of the above and
264 + /// should not stay. `.tab.is-selected` sets `--surface-raised` and
265 + /// `--bevel-raised`, which is byte for byte what the generated `.tab.chosen`
266 + /// sets: a second name for makeover's own state, which is the defect
267 + /// makeover-webview 0.27.0 exists to prevent. Removing it is a template change
268 + /// rather than a stylesheet one, so it is filed rather than done here.
269 + ///
270 + /// An entry that stops colliding fails the build, so this list cannot outlive
271 + /// what it describes.
272 + const REVIEWED_OVERLAPS: &[(&str, &str)] = &[
273 + ("badge", "color"),
274 + ("card", "color"),
275 + ("progress-fill", "background"),
276 + ("tab", "background"),
277 + ("tab", "box-shadow"),
278 + ("tab", "color"),
279 + ("tab", "cursor"),
280 + ("table-heading", "content"),
281 + ("table-heading", "display"),
282 + ("table-row", "display"),
283 + ];