Commit Graph
100 Commits
Author SHA1 Message Date
mokhtar c65d92d8f8 admin: title-only information becomes visible text
the client address follows its name as visible muted text in the query tables, the config lock indicator prints its reason beside the tag except in table rows where a page-level note explains the lock instead, and the locked delete buttons describe themselves through that one visible note. the chart legend tooltip is deleted because a named client is deliberately not addressed in the chart, and the dead series address field went with it. titles that merely repeat visible copyable text stay.
2026-08-29 13:03:30 +02:00
mokhtar 207252acee admin: enable toggles become rac switches
the upstream, blocklist source, and safe search enable controls mutate the row the moment they move, so they now carry the switch role via a shared drawn rac switch with a 44px hit area, a focus-visible ring, and naming modes made exclusive by a discriminated union. safe search supersedes its one-commit-old checkbox form, and the file-authority guard now names the switch role instead of relying on the bare input selector.
2026-08-29 12:40:01 +02:00
mokhtar f1de80477a admin: group sources and safe search become rac checkboxes
the assigned sources list is a rac checkboxgroup and safe search uses the same drawn checkbox, extracted to a shared ui component with grouped and standalone modes enforced by a discriminated union. the label carries a 44px pointer-target floor on both axes, the focus ring is driven from rac's focus-visible state and guarded by a test, and toggleSource is gone because the group hands back the whole set.
2026-08-29 12:33:00 +02:00
mokhtar 3c674966be admin: the mobile drawer becomes a rac disclosure, asset budget raised to 850,000 bytes
the drawer is inline flow content, so disclosure is the honest semantic: rac now owns aria-expanded, aria-controls, and the panel hidden state, while the open guard still unmounts the drawer contents so a closed drawer keeps no second pause control or health poll alive. the disclosure modules cost 3,669 bytes and the assets gate had 1,998 of headroom, so the budget moves from 800,000 to 850,000.
2026-08-29 12:20:07 +02:00
mokhtar 59d6be98f8 admin: associate inline field errors with their inputs
network assignment rows, activity filters, and the settings password pair now mark the offending input with aria-invalid and point it at the error text with aria-describedby. the prefix validator returns the row and field it is about, and any row mutation clears a message that named a position. settings numeric fields carry aria-invalid on an unparseable value.
2026-08-29 12:08:19 +02:00
mokhtar 317d5dd4f8 admin: live query detail becomes a modal, live/history and period pickers become tabs and radios, client delete confirms in a dialog
the streamed-query detail panel is now a rac modal dialog with focus containment and restore. the live/history switch is rac tabs driven by the url, the overview period picker is a rac radio group, and the clients delete flow uses the shared confirm dialog; an authority turn keeps the dialog open and withdraws only the destructive action.
2026-08-29 11:55:24 +02:00
mokhtar 79578e1d2a admin: reclaim the desktop header, move pause and log out to the sidebar
the header row survives only on narrow screens; on desktop its lone occupant, log out, joins pause in the sidebar footer, both full width. pause leaves the query detail page's related actions, where a global control had no business, and its hand-rolled duration dropdown becomes a react-aria menu with real keyboard navigation, dismissal and positioning.
2026-08-29 11:23:17 +02:00
mokhtar d5613ee718 admin: pointer cursor on every button
the shared button variants set no cursor, so only components with local one-off styles showed pointer. all nine variants and the six buttons styled outside them now carry pointer, with not-allowed when disabled.
2026-08-29 01:29:11 +02:00
mokhtar 09932b2d84 build: bump version to 0.0.14
Release / guard (push) Successful in 36s
Gates / frontend (push) Successful in 1m46s
Gates / test (push) Successful in 2m30s
Gates / test-aarch64 (push) Successful in 7m37s
Gates / package (push) Successful in 4m27s
Gates / container (push) Successful in 14s
Release / gates (push) Successful in 14m50s
Release / publish (push) Failing after 6m17s
2026-08-28 17:57:09 +02:00
mokhtar 272655f60c storage: version querylog.db and migrate it in place, never reset a healthy file
querylog.db carries a schema version; migrations run at startup as one transaction after a vacuumed 0600 backup, and every failure refuses startup (exit 2, no systemd restart loop) instead of starting empty. corruption is the only automatic recreate left. the cut gate now requires a fixture-proven migration or an explicit versioned break with restore instructions, and locks shipped migration files and fixtures byte-for-byte.
2026-08-28 17:56:19 +02:00
mokhtar dd5a9f6ab8 build: bump version to 0.0.13
Release / guard (push) Canceled after 0s
Release / gates (push) Canceled after 0s
Release / publish (push) Canceled after 0s
2026-08-27 21:46:08 +02:00
mokhtar 72cdbbd113 upstream: one absolute per-query budget across queueing and failover
waiting for a slot now spends the query budget; truncated attempts that
expire fault the budget, not the upstream, and are never attributed.
admission sweeps in priority order before blocking. forward zones spend
read_timeout_ms once across udp, truncation and tcp. adds
nxdns_upstream_budget_exhausted_total and a 64-upstream validation limit.
2026-08-27 21:10:43 +02:00
mokhtar 6170571d23 build: bump version to 0.0.12
Release / guard (push) Canceled after 0s
Release / gates (push) Canceled after 0s
Release / publish (push) Canceled after 0s
2026-08-27 17:49:06 +02:00
mokhtar c8470724ce overview: one endpoint, live projections and a response cache (m36) 2026-08-27 17:48:20 +02:00
mokhtar 7cdb74ec17 build: bump version to 0.0.11
Release / guard (push) Canceled after 0s
Release / gates (push) Canceled after 0s
Release / publish (push) Canceled after 0s
2026-08-24 18:41:46 +02:00
mokhtar 4367003788 changelog: 0.0.11 2026-08-24 18:40:29 +02:00
mokhtar 728b8d64e1 admin: draw the overview charts with visx
the hand-written scale, tick, stacking and arc math is replaced by visx 4.0.0
primitives; rendering, colours and themes stay the app's own. all four charts
share one hover treatment: the client chart gains the tooltip and dimming the
query timeline had, the donuts gain both, an open tooltip follows a data
refresh instead of going stale, and it retires when the window rolls. the
timeline's third series is named allowed instead of other, and the client
chart's other aggregate disappears from a window where it counted nothing.
licenses gain the isc text for the bundled d3 modules.
2026-08-24 18:40:17 +02:00
mokhtar 091962a996 build: bump version to 0.0.10
Release / guard (push) Canceled after 0s
Release / gates (push) Canceled after 0s
Release / publish (push) Canceled after 0s
2026-08-24 00:05:33 +02:00
mokhtar 4fcbd0ac12 changelog: 0.0.10 2026-08-24 00:05:21 +02:00
mokhtar d961b152a3 db-mode config changes apply live in-process
settings and upstream writes now follow a prepare, commit, publish, retire
contract: candidates are built and validated before the database transaction,
published as infallible pointer swaps, and old generations retire after their
readers drain. per-query policy values snapshot once per query; upstream pool,
cache, rate limiter, sessions, api limiter, log sink, blocklist scheduler and
the query-log queue each gained one named live operation. restart_required
shrinks from every scalar key to the bind keys and web.enabled; the admin ui
drops its restart notices for everything else. file mode is unchanged.
2026-08-24 00:04:28 +02:00
mokhtar 17e6e93ce1 admin: only the content region scrolls on wide screens
the shell grid grew past the viewport and scrolled the document,
carrying the sidebar with it. the shell is now viewport-height at the
wide breakpoint with main as the sole scroll container; the nav list
scrolls inside the pinned rail; router scroll restoration targets the
inner scroller so navigation resets it and back/forward restores it.
2026-08-23 15:17:51 +02:00
mokhtar 8a44d901d9 cut: schema gate — refuse to release an undisclosed querylog schema change
the gate recomputes the previous release tag's ddl fingerprint from the
remote peeled object and compares it against the tree's; a change must
be disclosed by 'resets your query history' in the version's changelog
section. the 0.0.9 reset shipped with an announcement claiming no
schema change; this makes the impact mechanical instead of remembered.
2026-08-23 15:07:27 +02:00
mokhtar 03149b5d65 ci: drop the one-insn-per-tb workaround, the qemu panic is an 11.1.0-only regression
Release / guard (push) Canceled after 0s
Release / gates (push) Canceled after 0s
Release / publish (push) Canceled after 0s
the bisect proved the runner image's qemu 8.2 was never affected; the
hangs this masked were the logger deadlock fixed in f1a85d3. the 10x
slowdown it cost also broke the full-batch flush timing test in run 592.
2026-08-23 13:55:22 +02:00
mokhtar a972c8db4d logger tests: join every writer future before its database closes, fix the gate-open race 2026-08-23 12:26:09 +02:00
mokhtar 78d688a40f ci: run the aarch64 suite with one qemu insn per tb, tcg optimization falsely trips the ubsan pointer check 2026-08-23 12:26:05 +02:00
mokhtar fe5bd967ca admin: live ring capacity is injectable, eviction test no longer timing-bound 2026-08-23 09:04:18 +02:00
mokhtar 1f215ac623 build: bump version to 0.0.9 2026-08-22 23:32:47 +02:00
mokhtar 2f86cd72fd changelog: 0.0.9 releases today 2026-08-22 23:32:36 +02:00
mokhtar 51cda8b8cb milestone 33: contract closure — samples, file-authority enumeration, dead code, bundle ceiling 2026-08-22 23:31:37 +02:00
mokhtar e5f23d5466 querylog: return to the default checkpoint cadence 2026-08-22 23:10:17 +02:00
mokhtar 24521ab9a9 milestone 32: task-shaped configuration, file mode as a rendering, config status api 2026-08-22 22:42:50 +02:00
mokhtar c99a37d170 milestone 31: concurrent upstream exchanges, dot session reuse, queue metrics 2026-08-22 19:54:02 +02:00
mokhtar 623667e475 milestone 30: overview as a dashboard, explicit health contract, period aggregations 2026-08-22 16:45:15 +02:00
mokhtar 0e83477d80 agents: move opus-coder to the global scope
The routing rule is global, so the agent it names lives next to it now
(~/.claude/agents/opus-coder.md), at medium effort and without the
milestone-spec wording that only fit this repository.
2026-08-22 10:53:19 +02:00
mokhtar fa323c7ed4 milestone 29: activity — history, live and policy simulation on one surface
Gates / test (push) Successful in 1m40s
Gates / package (push) Successful in 3m58s
Gates / container (push) Successful in 14s
CI / gates (push) Successful in 12m51s
Gates / frontend (push) Successful in 1m18s
Gates / test-aarch64 (push) Successful in 6m57s
query log, live and lookup merge into /activity. history filters live
in the url, so a pasted link or back/forward reproduces the exact
view; the result column separates servfail and nxdomain from success
in the list. live is follow-by-default with freeze, and a streamed
row opens its in-memory provenance detail — no correlation invented
for rows sqlite has not written. lookup survives as the current
policy simulation under /activity/test. investigation links carry
absolute bounds, and the diagnostics page now honors since/until
instead of ignoring them. the old routes are gone without aliases.
2026-08-22 10:52:56 +02:00
mokhtar 0fd6bbd312 milestone 28: query provenance — every logged query is exactly explainable
Gates / frontend (push) Successful in 1m36s
Gates / test (push) Successful in 1m56s
Gates / test-aarch64 (push) Successful in 7m37s
Gates / package (push) Successful in 9m12s
Gates / container (push) Successful in 13s
CI / gates (push) Successful in 19m4s
query rows gain qclass, rcode, group, policy action and reason, the
matched rule or list entry with its source, cname and safe-search
targets, route kind, forward zone, and the resolver that actually
answered — the pool and local markers die. servfails are logged and
name the resolver that lost; post-parse protocol refusals become rows.
a detail page at /queries/:id renders the ordered explanation, and
coverage watermarks distinguish an empty history from a missing one.

the schema fingerprint changes: existing query history is recreated
with the old file kept aside and the reset filed as a resolved
diagnostic. fixes an oversized udp reply being rebuilt as noerror,
which handed clients a truncated nxdomain as success.
2026-08-22 09:16:40 +02:00
mokhtar 7e6cb507d2 release cut: bump-kind justfile recipe and a compiled, tested cut tool
Gates / frontend (push) Successful in 1m11s
Gates / test (push) Successful in 1m38s
Gates / test-aarch64 (push) Successful in 6m31s
Gates / container (push) Successful in 9s
CI / gates (push) Successful in 26m52s
Gates / package (push) Successful in 5m27s
2026-08-21 23:34:13 +02:00
mokhtar 8a17e9ed21 admin: fix dashboard phantom scroll, drop last-failure column from upstream table
Gates / frontend (push) Successful in 1m11s
Gates / test (push) Successful in 1m40s
Gates / test-aarch64 (push) Successful in 6m38s
Gates / package (push) Successful in 5m42s
Gates / container (push) Successful in 17s
CI / gates (push) Successful in 27m54s
the chart's screen-reader table wore srOnly directly; overflow and
height do not apply to a table box, so it laid out 1200px tall below
the page while clip-path hid the paint. wrap it in a hidden div, which
clips properly and keeps the table role. failure detail is the
diagnostics page's job since milestone 27; the column and the now
dead formatAge go.
2026-08-21 23:33:32 +02:00
mokhtar 0107df5f99 spec: measurement window is the deployment side's call
Gates / frontend (push) Successful in 1m13s
Gates / test (push) Successful in 1m37s
Gates / test-aarch64 (push) Successful in 6m35s
Gates / package (push) Successful in 5m40s
Gates / container (push) Successful in 9s
CI / gates (push) Successful in 22m27s
2026-08-21 18:49:05 +02:00
mokhtar b6cea3f539 build: bump version to 0.0.8
Gates / frontend (push) Successful in 1m34s
Gates / test (push) Successful in 1m53s
Gates / test-aarch64 (push) Successful in 6m34s
Gates / package (push) Successful in 43s
Gates / test-aarch64 (push) Successful in 7m23s
Gates / package (push) Successful in 4m11s
Gates / container (push) Successful in 18s
CI / gates (push) Successful in 27m37s
Release / guard (push) Successful in 18s
Gates / frontend (push) Successful in 1m9s
Gates / test (push) Successful in 1m36s
Gates / container (push) Successful in 10s
Release / gates (push) Successful in 9m6s
Release / publish (push) Successful in 4m33s
2026-08-21 18:43:49 +02:00
mokhtar 9b0b7c19f4 querylog: checkpoint every 8192 wal pages instead of 1000 2026-08-21 18:43:45 +02:00
mokhtar 324704b53f build: bump version to 0.0.7
Gates / package (push) Successful in 41s
Gates / test (push) Successful in 1m35s
Gates / test-aarch64 (push) Successful in 6m48s
Gates / frontend (push) Successful in 1m22s
Gates / container (push) Successful in 9s
CI / gates (push) Successful in 23m18s
Gates / frontend (push) Successful in 1m8s
Gates / package (push) Successful in 40s
Release / guard (push) Successful in 17s
Gates / test (push) Successful in 1m35s
Gates / test-aarch64 (push) Successful in 6m55s
Gates / container (push) Successful in 9s
Release / gates (push) Successful in 9m23s
Release / publish (push) Successful in 4m26s
2026-08-20 22:34:13 +02:00
mokhtar addf24f92c query log batching: one transaction per flush interval, not per query
Gates / frontend (push) Successful in 1m18s
Gates / test (push) Successful in 2m46s
Gates / test-aarch64 (push) Successful in 7m33s
Gates / package (push) Successful in 5m34s
Gates / container (push) Successful in 17s
CI / gates (push) Successful in 16m16s
Gates / frontend (push) Successful in 1m8s
Gates / container (push) Successful in 9s
Release / gates (push) Successful in 9m15s
Release / guard (push) Successful in 19s
Gates / test (push) Successful in 1m34s
Gates / test-aarch64 (push) Successful in 6m46s
Gates / package (push) Successful in 39s
Release / publish (push) Failing after 4m7s
2026-08-20 20:57:11 +02:00
mokhtar 037f209179 milestone 27: diagnostics — operational failures land in one curated log, resolved history purgeable
Gates / frontend (push) Successful in 1m33s
Gates / test (push) Successful in 1m48s
Gates / test-aarch64 (push) Successful in 7m10s
Gates / package (push) Successful in 5m31s
Gates / container (push) Successful in 15s
CI / gates (push) Successful in 14m51s
2026-08-20 20:05:59 +02:00
mokhtar 3dd8214ef2 dashboard: a success rate never rounds up to 100.0% while failures stand
Gates / frontend (push) Successful in 1m27s
Gates / test (push) Successful in 1m53s
Gates / test-aarch64 (push) Successful in 7m7s
Gates / package (push) Successful in 3m57s
Gates / container (push) Successful in 15s
CI / gates (push) Successful in 13m15s
2026-08-19 17:54:02 +02:00
mokhtar 64c0d723a6 querylog: the aside file's name says why, so a schema change is not called corrupt 2026-08-17 20:24:21 +02:00
mokhtar 377f00a35f changelog: 0.0.6 releases today
Release / guard (push) Successful in 22s
Gates / frontend (push) Successful in 1m30s
Gates / test (push) Successful in 1m50s
Gates / frontend (push) Successful in 1m9s
Gates / test-aarch64 (push) Successful in 6m55s
Gates / test (push) Successful in 1m34s
Gates / test-aarch64 (push) Successful in 6m9s
Gates / package (push) Successful in 3m49s
Gates / package (push) Successful in 32s
Gates / container (push) Successful in 15s
CI / gates (push) Successful in 21m28s
Gates / container (push) Successful in 9s
Release / gates (push) Successful in 20m7s
Release / publish (push) Successful in 4m26s
2026-08-17 18:22:54 +02:00
mokhtar e0a7cd8a6b milestone 26: upstream health answers for the selected period 2026-08-17 18:21:56 +02:00
mokhtar 3ed9a57822 changelog: 0.0.5 releases today
Gates / test (push) Successful in 1m44s
Gates / frontend (push) Successful in 1m2s
Gates / test-aarch64 (push) Successful in 5m55s
Gates / package (push) Successful in 28s
Gates / container (push) Successful in 16s
CI / gates (push) Successful in 20m25s
Release / guard (push) Successful in 18s
Gates / frontend (push) Successful in 1m5s
Gates / test-aarch64 (push) Successful in 6m33s
Gates / test (push) Successful in 1m31s
Gates / package (push) Successful in 3m41s
Gates / container (push) Successful in 9s
Release / gates (push) Successful in 19m27s
Release / publish (push) Successful in 5m43s
2026-08-16 23:55:19 +02:00
mokhtar 0601098ab0 admin: drop the learned tag from the query tables 2026-08-16 23:55:10 +02:00
mokhtar 49c7da2381 changelog: 0.0.4 releases today
Release / guard (push) Successful in 26s
Gates / frontend (push) Successful in 1m26s
Gates / test (push) Successful in 1m44s
Gates / frontend (push) Successful in 1m6s
Gates / test-aarch64 (push) Successful in 6m36s
Gates / test (push) Successful in 1m33s
Gates / test-aarch64 (push) Successful in 5m50s
Gates / package (push) Successful in 5m5s
Gates / package (push) Successful in 30s
Gates / container (push) Successful in 15s
CI / gates (push) Successful in 21m58s
Gates / container (push) Successful in 10s
Release / gates (push) Successful in 20m42s
Release / publish (push) Successful in 4m41s
2026-08-16 23:00:41 +02:00
mokhtar 794ea6541f admin: live and query log pages show client names 2026-08-16 23:00:31 +02:00
mokhtar ba037c5958 website: plan for the nxdns.sh marketing and docs site
Gates / frontend (push) Successful in 1m8s
Gates / test (push) Successful in 2m5s
Gates / test-aarch64 (push) Successful in 7m1s
Gates / package (push) Successful in 4m3s
Gates / container (push) Successful in 15s
CI / gates (push) Successful in 13m28s
2026-08-16 00:17:58 +02:00
mokhtar 1e97c80f6b rename web/ to admin/, along with the web-named build and cli identifiers 2026-08-16 00:17:58 +02:00
mokhtar 5b3d1cd65c docs: unwrap hand-wrapped prose repo-wide
Gates / frontend (push) Successful in 1m2s
Gates / test (push) Successful in 1m38s
Gates / package (push) Successful in 5m5s
Gates / test-aarch64 (push) Successful in 6m30s
Gates / container (push) Successful in 15s
CI / gates (push) Successful in 13m30s
2026-08-15 16:27:36 +02:00
mokhtar 50b8fd5c61 changelog: unwrap hand-wrapped lines, release bodies render newlines as breaks
Gates / frontend (push) Successful in 1m2s
Gates / test (push) Successful in 1m31s
Gates / package (push) Successful in 3m36s
Gates / container (push) Successful in 15s
CI / gates (push) Successful in 11m21s
Gates / test-aarch64 (push) Successful in 5m54s
2026-08-15 13:06:44 +02:00
mokhtar efbe355070 changelog: 0.0.3 releases today
Gates / frontend (push) Successful in 1m3s
Gates / test (push) Successful in 1m39s
Gates / test-aarch64 (push) Successful in 6m28s
Gates / container (push) Successful in 18s
Release / guard (push) Successful in 1m30s
Gates / test-aarch64 (push) Successful in 5m45s
Gates / package (push) Successful in 24s
Release / gates (push) Successful in 7m54s
Gates / package (push) Successful in 5m34s
CI / gates (push) Successful in 14m5s
Gates / frontend (push) Successful in 58s
Gates / test (push) Successful in 1m29s
Gates / container (push) Successful in 10s
Release / publish (push) Successful in 9m12s
2026-08-15 12:24:05 +02:00
mokhtar fc60214b3e ci: the container gate and the version parse move into a compiled tool 2026-08-15 12:24:05 +02:00
mokhtar 3c794b645b milestone 25: client names learned over reverse dns
Gates / test (push) Successful in 2m58s
Gates / frontend (push) Successful in 3m57s
Gates / test-aarch64 (push) Successful in 8m20s
Gates / package (push) Successful in 7m27s
Gates / container (push) Successful in 17s
CI / gates (push) Successful in 19m9s
2026-08-15 11:18:44 +02:00
mokhtar c428bc2398 ci: allow dispatching the gate set, a replaced runner pod kills the job it holds
Gates / frontend (push) Successful in 1m18s
Gates / test (push) Successful in 2m27s
Gates / test-aarch64 (push) Successful in 5m39s
Gates / package (push) Successful in 3m34s
Gates / container (push) Successful in 13s
CI / gates (push) Successful in 11m57s
Release / guard (push) Successful in 1m30s
Gates / frontend (push) Successful in 1m6s
Gates / test (push) Successful in 1m28s
Gates / test-aarch64 (push) Successful in 5m41s
Gates / package (push) Successful in 28s
Gates / container (push) Successful in 16s
Release / gates (push) Successful in 7m55s
Release / publish (push) Successful in 10m37s
2026-08-14 02:34:06 +02:00
mokhtar c7c1e21267 changelog: 0.0.2 releases today
Gates / frontend (push) Successful in 1m9s
Gates / test (push) Failing after 12m32s
Gates / test-aarch64 (push) Successful in 9m14s
Gates / package (push) Successful in 7m27s
Gates / container (push) Successful in 18s
CI / gates (push) Failing after 22m41s
2026-08-14 02:10:45 +02:00
mokhtar 21c5ce1f36 filter: separate the compiled bodies in the checksum, a name moving between them was invisible 2026-08-14 02:09:25 +02:00
mokhtar 1bce81eea0 milestone 24: persist and surface the unsupported-line count 2026-08-13 20:44:27 +02:00
mokhtar 21571e448e schema: collapse config.db to a single baseline, ddl_v1 stays editable until v0.1 2026-08-13 19:14:54 +02:00
mokhtar 2ab7c1f1de milestone 21: abp list exceptions and a regex rule kind 2026-08-13 19:14:47 +02:00
mokhtar b340521716 web tests: raise the async query budget, ci contention timed out a suspended page
Gates / test (push) Successful in 1m35s
Gates / test-aarch64 (push) Successful in 6m0s
Gates / frontend (push) Successful in 1m12s
Gates / package (push) Successful in 5m17s
Gates / container (push) Successful in 16s
CI / gates (push) Successful in 13m10s
2026-08-13 00:20:08 +02:00
mokhtar 13458a980e ci: run the frontend gate on the light runner
Gates / test (push) Successful in 1m37s
Gates / frontend (push) Failing after 3m23s
Gates / package (push) Skipped
Gates / container (push) Skipped
Gates / test-aarch64 (push) Successful in 6m2s
CI / gates (push) Failing after 7m41s
2026-08-12 23:46:07 +02:00
mokhtar e576704fad spec milestone 23: record the readme and conversion-order findings as closed by decision 2026-08-12 23:45:34 +02:00
mokhtar 4aaf6d3815 milestone 23: close the remaining codex findings
the vitest "something prevents Vite server from exiting" warning was
@stylexjs/unplugin, not our code: configureServer starts a 150ms polling
interval for HMR and clears it from server.httpServer's close event, which
vitest resolves to null in middleware mode. drop that one hook under VITEST
and keep the transform.

textMuted was swept rather than judged. measured against their grounds, the
39 flat text-zinc-500 sites went 4.12:1 -> 7.56:1 in dark mode, repairing a
WCAG AA failure, so that stands; the 4 already-adaptive sites went 7.40:1 ->
4.62:1 in light mode for nothing, so a textSecondary token restores their
original zinc-600/zinc-400 pair.

append the symbol families to the reset's font stack: Select renders U+25BE
and Segoe UI does not carry it.

correct two acceptance criteria that were literally false: both greps match
only comments.
2026-08-12 23:43:22 +02:00
mokhtar 0ea2e2905a milestone 23: restore the focus ring on select options, check layer order, close preflight gaps 2026-08-12 23:27:28 +02:00
mokhtar 9d5120cbad milestone 23: put the reset in a cascade layer, guard that it stays there 2026-08-12 23:06:26 +02:00
mokhtar 65f76d4427 milestone 23 s3: plan names stylex and react aria 2026-08-12 22:50:34 +02:00
mokhtar be12587b87 milestone 23 s3: remove tailwind, replace its preflight with an explicit reset 2026-08-12 22:50:25 +02:00
mokhtar 122044e6af milestone 23 s3: delete ui/classes.ts, its last importer is gone 2026-08-12 22:46:29 +02:00
mokhtar 0e9433d53b milestone 23 s3: convert features/queries/QueryLogPage.tsx to stylex 2026-08-12 22:45:53 +02:00
mokhtar ae9f7fb9f3 milestone 23 s3: convert features/lookup/LookupPage.tsx to stylex 2026-08-12 22:44:23 +02:00
mokhtar 1cd8f71a9b milestone 23 s3: convert features/dashboard/TimeseriesChart.tsx to stylex 2026-08-12 22:42:11 +02:00
mokhtar 15c895e180 milestone 23 s3: convert features/settings/SettingsPage.tsx to stylex 2026-08-12 22:40:50 +02:00
mokhtar 3b33d7afee milestone 23 s3: convert features/dashboard/UpstreamHealthTable.tsx to stylex 2026-08-12 22:38:15 +02:00
mokhtar f2b4582c0a milestone 23 s3: convert shell/AppShell.tsx to stylex 2026-08-12 22:37:16 +02:00
mokhtar 02bf1ca310 milestone 23 s3: convert features/live/LiveLogPage.tsx to stylex 2026-08-12 22:36:09 +02:00
mokhtar 4379d7599b milestone 23 s3: convert features/groups/GroupsPage.tsx to stylex 2026-08-12 22:33:58 +02:00
mokhtar 1246791fe1 milestone 23 s3: convert features/dashboard/DiskCard.tsx to stylex 2026-08-12 22:32:56 +02:00
mokhtar 2f3115117f milestone 23 s3: convert features/blocklists/SourceStatusSection.tsx to stylex 2026-08-12 22:31:14 +02:00
mokhtar e98896fc0a milestone 23 s3: convert features/dashboard/DashboardPage.tsx to stylex 2026-08-12 22:30:25 +02:00
mokhtar 1de608f9bc milestone 23 s3: convert auth/LoginPage.tsx to stylex 2026-08-12 22:28:56 +02:00
mokhtar 38d34453bb milestone 23 s3: convert features/groups/GroupSourcesEditor.tsx to stylex 2026-08-12 22:28:01 +02:00
mokhtar 368149a358 milestone 23 s3: convert features/blocklists/BlocklistForm.tsx to stylex 2026-08-12 22:27:00 +02:00
mokhtar ac0699faa1 milestone 23: amend two rulings the s2 review found the code in breach of 2026-08-12 22:26:42 +02:00
mokhtar d5b351d7fe milestone 23 s3: convert routes.tsx to stylex 2026-08-12 22:25:56 +02:00
mokhtar cddefa87e4 milestone 23 s3: convert features/pause/PauseWidget.tsx to stylex 2026-08-12 22:25:08 +02:00
mokhtar 9e12683acf milestone 23 s3: convert features/dashboard/StatCards.tsx to stylex 2026-08-12 22:23:16 +02:00
mokhtar 0fdbe25f7a milestone 23 s3: convert features/settings/RestartBanner.tsx to stylex 2026-08-12 22:21:53 +02:00
mokhtar 7e7358b3c2 milestone 23 s3: convert features/settings/ReadOnlyConfigBanner.tsx to stylex 2026-08-12 22:21:13 +02:00
mokhtar d5c4a8d978 milestone 23 s3: convert lib/InlineError.tsx to stylex 2026-08-12 22:19:59 +02:00
mokhtar 73bc180c67 milestone 23 s3: convert features/dashboard/HealthBanners.tsx to stylex 2026-08-12 22:18:23 +02:00
mokhtar 0f58966b31 milestone 23 s3: move srOnly into the shared style vocabulary 2026-08-12 22:16:58 +02:00
mokhtar bb39539fdf milestone 23: correct three comments the s1 review found inaccurate 2026-08-12 22:13:49 +02:00
mokhtar 01e455c8af milestone 23 s2: react aria primitives and their cluster 2026-08-12 22:12:18 +02:00
mokhtar 994bbf922c milestone 23 s1: stylex build integration, tokens and shared styles 2026-08-12 21:41:32 +02:00