50 descendants of d6bf4e65b33940f5
|
2026-09-01
| ||
| 01:58 | tickets: one picker for every triage field, select plus a new-word box check-in: bcb4bba6a5 user: dmestas tags: trunk | |
| 01:49 | new ticket: subsystem is a select with an Other field, working without script check-in: 52941e6f32 user: dmestas tags: trunk | |
| 01:42 | new ticket: triage fields are selects; wide width follows the toggle check-in: 61b1aecc1d user: dmestas tags: trunk | |
| 01:34 | a two-state toggle announces itself with aria-pressed, not aria-current check-in: 88fc824fd4 user: dmestas tags: trunk | |
| 01:33 | board: order cards by the sort the reader chose; fix gofmt check-in: 9b8fbebfd0 user: dmestas tags: trunk | |
| 01:26 | tickets: morph view switches, pushing the same URL a click would load check-in: d9e0b43f48 user: dmestas tags: trunk | |
| 01:18 | tickets: sort works in every view; wide is a click; tabs hide zero counts check-in: c731025661 user: dmestas tags: trunk | |
| 01:01 | ci worker: reuse a workspace per repo+task instead of a 94s clone per step check-in: 2d4b032823 user: dmestas tags: trunk | |
| 00:46 | ci: honest run states — stalled, running vs queued, step timeouts check-in: d732f7b7ee user: dmestas tags: trunk | |
| 00:39 | ci: stream a running step's logs instead of waiting for it to finish check-in: b127bafd1e user: dmestas tags: trunk | |
| 00:27 | ci: 5s/15s/45s retry ladder with an explicit multiplier check-in: 06b6e1de88 user: dmestas tags: trunk | |
| 00:12 | ci: retry each step; one transient clone failure should not red a run check-in: 854d0765c6 user: dmestas tags: trunk | |
|
2026-08-31
| ||
| 23:48 | chat: Range from zero means DeliverAll, not StartSequence(0) check-in: 967c0a4c92 user: dmestas tags: trunk | |
| 23:20 | web: rename fleetPage to explorePage; it is the public index, not the fleet check-in: b12d9b381a user: dmestas tags: trunk | |
| 23:17 | health: fix the banner's duration call; pin it with a render test check-in: 575a4301d7 user: dmestas tags: trunk | |
| 23:14 | health: watch dagnats and notify, journal outages, banner the fleet page check-in: ee62d06275 user: dmestas tags: trunk | |
| 23:03 | exceptions: persist the journal so it survives restarts check-in: 1f6aaeac2d user: dmestas tags: trunk | |
| 22:45 | exceptions: journal background job failures, not just log them check-in: 769040d377 user: dmestas tags: trunk | |
| 22:41 | exceptions: register client-error on the outer mux, under the api subtree check-in: d79a667532 user: dmestas tags: trunk | |
| 22:39 | exceptions: capture browser errors too, journal template failures, list layout check-in: 7126e45e7e user: dmestas tags: trunk | |
| 22:27 | fleet: anchor the fold drawer to its own button check-in: 20b0ab77cc user: dmestas tags: trunk | |
| 22:24 | fleet: title-case the name; fold Mirrors then Operations into a popover check-in: 637ba530a4 user: dmestas tags: trunk | |
| 22:22 | fleet: fix settings page template error; $.SavedPanel inside the with-block check-in: e6502c71a8 user: dmestas tags: trunk | |
| 22:18 | fleet: drop OwnH1 where the content no longer draws the heading check-in: 0712c3a786 user: dmestas tags: trunk | |
| 22:17 | fleet: wear the repository bar — one name, plain tabs, no per-page h1 check-in: ccd9b10fc0 user: dmestas tags: trunk | |
| 22:08 | dash: give the repository selector room above the feed check-in: ae3b86683c user: dmestas tags: trunk | |
| 21:58 | web: one .list-card component; every row list wears the ticket listing's shape check-in: 98c3078224 user: dmestas tags: trunk | |
| 21:51 | dash: read the repository facet from the query and keep it while paging check-in: 0cd361116e user: dmestas tags: trunk | |
| 21:49 | dash: chip thresholds match each form's measured width check-in: 05ad2976e1 user: dmestas tags: trunk | |
| 21:47 | dash: set the chip thresholds from measured column widths check-in: 98edfd7da1 user: dmestas tags: trunk | |
| 21:45 | dash: tighten chip spacing so the count tier fits the column check-in: 994cb96578 user: dmestas tags: trunk | |
| 21:44 | dash: key the chip ladder to the feed column, not the viewport check-in: 05689ed46d user: dmestas tags: trunk | |
| 21:42 | dash: chips shed count, then icon, then wording as the screen narrows check-in: abeb8276b1 user: dmestas tags: trunk | |
| 21:36 | dash: drop unselected chip counts on small phones check-in: 0ac19e0ebe user: dmestas tags: trunk | |
| 21:35 | dash: on a phone only the selected activity chip keeps its label check-in: 809e6e9ce0 user: dmestas tags: trunk | |
| 21:33 | dash: short chip labels and truncated hashes on narrow screens; repository facet check-in: 42d9e776de user: dmestas tags: trunk | |
| 21:24 | fix the stray backslash from the previous commit check-in: 6723b7ea99 user: quarry tags: trunk | |
| 21:22 | dashboard fragment renders from its own template check-in: e99997b8c1 user: quarry tags: trunk | |
| 21:19 | dashboard: activity rows match the tracker, chips stop shrinking, tabs and paging morph check-in: e56c5ac558 user: quarry tags: trunk | |
| 21:02 | warm four repositories at once, not two check-in: 7a4e0fcfc7 user: quarry tags: trunk | |
| 21:00 | reap orphaned zit serve children at startup check-in: 0cb8f48a5f user: quarry tags: trunk | |
| 20:49 |
selection: underline means tab; toggles wear the button chip
See the wiki page [Selected states] for the states and the reasoning. check-in: baecdf8460 user: quarry tags: trunk | |
| 20:33 | pin the nonce alphabet: a + in the attribute silently kills CSP mode check-in: 47064a1033 user: quarry tags: trunk | |
| 20:30 | url-safe nonce: no + to escape in the attribute check-in: ce8dcd1ae6 user: quarry tags: trunk | |
| 20:02 |
a strict CSP: nonces, no unsafe-eval, no inline handlers
quarry served no page policy at all. The blocker was never the data-on:* attributes — script-src does not govern data attributes — it was unsafe-eval, because datastar compiled expressions with Function(). 1.0.3 takes a nonce instead. Removed all 14 inline handlers: 11 identical onchange=this.form.submit() became data-on:change with requestSubmit (which validates, unlike submit), two selection handlers became expressions, and the copy-hash button moved to a delegated assets/copy.js. Scripts now carry content-hashed immutable URLs instead of revalidating daily. The audit found the expressions already safe, for a reason worth pinning: html/template strips a data- prefix before classifying, so data-on:drop gets the JAVASCRIPT escaper. That matters because an HTML-escaped quote decodes back to a quote before any script reads the attribute, and a board column status comes from .quarry/tickets.json — upstream content on a mirror. check-in: ef352402f6 user: quarry tags: trunk | |
| 17:10 |
datastar 1.0.0-RC.7 to 1.0.3
A release candidate was shipping in production. No breaking changes across the three patch releases; two fix things quarry leans on — select signal typing and dynamic multiple (the ticket sidebar and board are native selects) — and 1.0.3 adds the CSP mode that would let the forge drop unsafe-eval. check-in: e13cb74667 user: quarry tags: trunk | |
| 16:08 |
gzip what benefits, never the event streams
Nothing was compressed: a request carrying Accept-Encoding got byte-identical bytes back. Measured here, the timeline page is 309,584 to 36,599 (88%), a ticket list 84%, a highlighted source page 92%. gzip rather than brotli deliberately — brotli q5 beat gzip 6 on both size and time, but that is a dependency for ~7% on a page already 88% smaller. SSE is excluded by content type: 22 stream writers, and a buffered stream is a live update that never arrives. check-in: d598ecafa3 user: quarry tags: trunk | |
| 15:49 |
serve the stylesheet instead of inlining it in every page
112,118 bytes of <style> rode on every response — 40% of a 309,584-byte timeline page, byte-identical each time and uncacheable because it had no URL, while the JS assets already carried Cache-Control. Now one hashed asset served immutable: a rule change mints a new URL, so a stale cache is impossible without anyone revalidating. check-in: eb4793ee8e user: quarry tags: trunk | |
| 15:39 |
the zit figure's count suffix is two bytes, not one
The multiplication sign in 'zit 34.1ms×2' never matched a byte compare, so the duration parsed as zero and the store note appeared beside an identical zit figure — claiming a wait already accounted for. check-in: 433a022052 user: quarry tags: trunk | |
| 15:37 |
the footer names store wait the timing context missed
A call on context.Background() carries no timer, so a page blocking six seconds on a warm pass reported 'ops 11.09s, zit 32.9ms' — and the ops panel's claim that ops minus zit is index work was false while it did. Overlap catches what attribution misses: subprocess busy time inside the render window, unioned, reported only when it exceeds what was already attributed. check-in: 17454ef71f user: quarry tags: trunk | |
| 15:24 |
fold the branch summary instead of deriving it per request
branch.list grouped every check-in in the repository on every request: ~150ms in sqlite on tcl, 460-850ms through the driver, on a page whose budget is 500ms. A LIMIT could not help — the grouping happens before the limit applies. Same remedy as the ticket table: fold once when the shape changes, read by index. Refreshed in both fold paths, which the parity test insisted on. check-in: d6bf4e65b3 user: quarry tags: trunk | |