50 descendants and 50 ancestors of 3f4408371226858c
|
2026-08-31
| ||
| 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 | |
| 15:17 |
warm the default branch too, so ops minus zit means what it says
A subprocess on a render path is latency one reader pays for everybody, and one on a detached context is invisible in the footer while still counting toward the total — which is what sent the last investigation chasing SQL for an hour. check-in: 8c5b6e5392 user: quarry tags: trunk | |
| 13:25 |
leaf set keys on zit's abbreviation, not one subprocess per leaf
Leaves expanded every twelve-character hash zit printed into a full one with a zit info call each: 473 leaves on sqlite meant 357 spawns and 6.1s in a single page-load window. The one consumer asks a membership question, which a twelve-hex-character key answers. Contract test now pins the prefix contract and that a full hash finds its leaf. check-in: 00e90b88cc user: quarry tags: trunk | |
| 13:16 |
warm the leaf set instead of making a reader pay for it
zit leaves is 6.4s on sqlite, not the ~10ms this comment claimed, and the first reader paid it: 10.8s cold against 0.5s warm. Invisible in the footer too, since a detached context carries no timer. Warmed at registration and after each ingest; a reader arriving early gets no leaf marks rather than a six-second wait. check-in: e16d738900 user: quarry tags: trunk | |
| 13:14 |
prefix lookups seek instead of scanning; sqlite tuned for this workload
col LIKE ? || '%' cannot use an index: the pattern is not a literal when the statement is prepared, so finding ONE check-in by its full hash read all 36,853 rows of sqlite's tree. That was 10s on a first timeline render and 40ms after, which reads as cold I/O and is not. Half-open hex ranges seek. Also sets cache_size, mmap_size and temp_store, none of which were configured. check-in: 22346a81a7 user: quarry tags: trunk | |
| 12:57 |
name the slow op in the log
A ten-second page said 'ops 11.09s x8' and stopped there: the container is timed, its contents are not, so the slow one cannot be identified. Anything past 250ms now says which op it was. check-in: 3f926fafe8 user: quarry tags: trunk | |
| 12:55 |
branch pickers ask for a picker, not every branch
The repository home fetched all 1,759 of sqlite's branches to draw a selector of twenty-five: 478ms of a 520ms page, spent building and marshalling rows nobody saw. branch.list gains limit and open, applied in SQL — the filter cannot follow the limit, or an old repository's first rows are all closed and the picker comes back empty. check-in: 1fc5dd6ba2 user: quarry tags: trunk | |
| 12:46 |
file pages draw a window, not the whole file
Chroma emits a span per token, so whole-file renders built DOMs nobody asked for: 198KB of build.c became 40,083 nodes and 137ms of parse. Lexing still starts at byte zero — a window opening inside a block comment cannot colour itself — but the iterator stops at the window's last line, so the tail is never tokenised. 103ms to 2.7ms for a first screen. Scroll fetches the next window; no-script gets a link. check-in: c517ec9464 user: quarry tags: trunk | |
| 12:35 | licences: x/sync is now a direct dependency check-in: 335c4703c3 user: quarry tags: trunk | |
| 12:34 |
collapse concurrent highlight misses into one tokenisation
A read-through memo only helps once a value exists: ten cold readers of sqlite's where.c each took 0.95s against 0.42s for one, all tokenising the same immutable bytes. Safe because the value is a pure function of its key. x/sync was already in the module graph. check-in: 05dbba300d user: quarry tags: trunk | |
| 12:25 |
the highlight gate is a safety valve, not a policy
256KB turned ten of sqlite's src files permanently grey, which trades the feature for the fix. Raised to 2MB; the per-blob cache carries the cost until windowing removes the need for a threshold at all. check-in: 937b10d6de user: quarry tags: trunk | |
| 12:18 |
large files arrive: size-gate the highlighter and cache it by content
Highlighting was paid on every request with no cache, and its cost tracks token density: sqlite's btree.c, 407KB of dense C, took 490ms and rendered 2.3MB of HTML. Past 256KB the lexer is skipped and the page says so; below it, identical content is highlighted once. check-in: f4e226e5a4 user: quarry tags: trunk | |
|
2026-08-30
| ||
| 15:50 | land landing-ping check-in: c53a183de9 user: dmestas tags: trunk | |
| 14:19 | notify the opener and branch owners when a landing settles closed check-in: ac8bd4b194 user: dmestas tags: landing-ping | |
| 13:24 |
selected reads as the accent, not a grey wash
nav.seg-box (the tickets tabs) filled a.here with --surface, which is one value for both themes by design and so lands heavy on the light paper — and hover used the same value, making a hovered tab and the current one identical. Tabs now carry an accent rule, rails an accent edge, matching the ink underline the repobar and explore tabs already use. check-in: abe111b60e user: dmestas tags: trunk | |
| 13:18 |
imports are visible: a cloning repository exists from the first second
repo.add registers the row, returns, and copies behind it. State is cloning until the store lands, failed with the reason if it does not, and a restart settles rows it interrupted rather than leaving them claiming to clone forever. The fleet page grows an Importing section. check-in: 58c34af8f6 user: dmestas tags: trunk | |
| 13:02 | record the branch-closed-tags merge: 84b8fed1 carried the content but not the merge edge check-in: 89a654bfba user: dmestas tags: trunk | |
| 12:53 | land ops-durability-1 check-in: 4af8540cf1 user: dmestas tags: trunk | |
| 11:40 | land branch-closed-tags: closed branches honour propagating and inherited tags check-in: 84b8fed157 user: dmestas tags: trunk | |
| 11:38 | docs: scratch-tree deploys, what survives a reboot, two more multi-agent rules closed check-in: 8d5610cacb user: dmestas tags: ops-durability-1 | |
| 11:33 | land ci-live-sse check-in: 97dd341966 user: dmestas tags: trunk | |
| 11:33 | land attention-dedupe check-in: 62731b2cac user: dmestas tags: trunk | |
| 11:07 | merge trunk into attention-dedupe closed check-in: 3f44083712 user: dmestas tags: attention-dedupe | |
| 10:25 | land clonebase-1 check-in: 2cc5ebef9b user: dmestas tags: trunk | |
| 10:24 | also normalise 0.0.0.0 and [::] to a dialable host closed check-in: 168321a74f user: dmestas tags: clonebase-1 | |
| 10:23 | ci: a hostless --addr must not become an invalid clone URL check-in: a0c008e728 user: dmestas tags: clonebase-1 | |
| 10:09 | merge trunk into attention-dedupe check-in: 6ba137a7bf user: dmestas tags: attention-dedupe | |
| 04:22 | land local-tickets-4 check-in: 235347de0e user: dmestas tags: trunk | |
| 04:04 | ticket door: no local tier degrades to the fossil door for identified filers closed check-in: 30629d31c6 user: dmestas tags: local-tickets-4 | |
| 03:55 | exceptions: shrink the trace panel on a phone, salvaged from the abandoned fleet-tabs-1 check-in: 37cb3e3c71 user: dmestas tags: trunk | |
| 03:52 | merge trunk into attention-dedupe check-in: d7d0f65fe0 user: dmestas tags: attention-dedupe | |
| 03:48 | inbox: pair a mention's notify message with its attention event on the idempotency key, so one event is one row and one count check-in: 7251d16114 user: dmestas tags: attention-dedupe | |
| 03:35 | land local-tickets-3 check-in: 26df9de56a user: dmestas tags: trunk | |
| 03:11 | fleet nav: only the page holding the panel may prevent its own clicks, so operations can reach stores and mirrors check-in: 8613942dbc user: dmestas tags: trunk | |
| 03:08 | dashboard: minmax(0,1fr) so the grid track can shrink, and clamp feed entries to two lines check-in: b84cb135ce user: dmestas tags: trunk | |
| 02:58 | land attention-4 check-in: 48328f288f user: dmestas tags: trunk | |
| 02:55 | dashboard: scroll the filter strip instead of widening the page, halve the feed, and stop bolding every line check-in: 5ce8d9506e user: dmestas tags: trunk | |
| 02:53 | local tickets: web tier — intake door, chips, banner, promote/discard closed check-in: b96fa20a10 user: dmestas tags: local-tickets-3 | |
| 02:44 | chat bridge: hold outbound messages until sent, pin the validated dial address closed check-in: 62459caab0 user: dmestas tags: attention-4 | |
| 02:44 | fleet: one nav across stores, mirrors, operations and exceptions instead of a tab that duplicated a page check-in: b7915e938f user: dmestas tags: trunk | |
| 02:36 | land attention-305 check-in: 607329b136 user: dmestas tags: trunk | |
| 02:36 | merge trunk into attention-305 closed check-in: 86a5d2f287 user: dmestas tags: attention-305 | |
| 02:34 | local tickets: intake, promote, discard ops; list/get/set serve both tiers closed check-in: 7dc08531c1 user: dmestas tags: local-tickets-2 | |
| 02:31 | land local-tickets-1 check-in: b4d393c974 user: dmestas tags: trunk | |
| 02:30 | notify: reconcile the inbox client with notify#305's shipped preferences, per-device delete and message workflow identifier check-in: 87bc0496b1 user: dmestas tags: attention-305 | |
| 02:25 | chat bridge: never lose a message on a failed post; dedupe, redact and guard the fetcher check-in: a7e2fb7f1b user: dmestas tags: attention-4 | |
| 02:24 | local tickets: oltp staging tier + design doc closed check-in: 10a0a49447 user: dmestas tags: local-tickets-1 | |
| 01:59 | robot polish and bridge docs; drop chat.promote per owner scope change check-in: 544175fad1 user: dmestas tags: attention-4 | |
| 01:51 | mirror.chatbridge: opt-in Fossil chat bridge, both directions check-in: 2a6cfa37b6 user: dmestas tags: attention-4 | |
| 01:48 | ci: live pages wait on the event plane instead of each keeping a 3s timer check-in: 3d01196d0d user: dmestas tags: trunk | |
| 01:29 | chat.promote: fold a run of chat into a durable forum thread check-in: 68c87b63b3 user: dmestas tags: attention-4 | |
| 01:08 | land attention-3b check-in: 87fb2bd03d user: dmestas tags: trunk | |
| 01:07 | merge trunk into attention-3b closed check-in: fc8fae785a user: dmestas tags: attention-3b | |
| 01:03 | web: honest inbox marking, unwritable unknown preferences, guarded push control check-in: b25fe57cc0 user: dmestas tags: attention-3b | |
| 00:49 | Accepted: the CI list row on a phone. check-in: 4ab202fa5c user: dmestas tags: trunk | |
| 00:48 | regenerate docs/api.md after the trunk merge closed check-in: 51f44e70f9 user: dmestas tags: ci-rows | |
| 00:47 | merge trunk into ci-rows check-in: 23a7ede9fe user: dmestas tags: ci-rows | |
| 00:39 | notify: upsert workflows with onConflict=keep now notify#303 has shipped check-in: 6c3bcec7c4 user: dmestas tags: attention-3b | |
| 00:34 | land tripwire-1 check-in: dd05aaf941 user: dmestas tags: trunk | |
| 00:33 | Accepted: the fleet's exceptions surface. check-in: ed382f1148 user: dmestas tags: trunk | |
| 00:32 | land agreements-1 check-in: f7285ec6e9 user: dmestas tags: trunk | |
| 00:31 | land throttle-1 check-in: c244c64be6 user: dmestas tags: trunk | |
| 00:31 | ci list: stack the row on narrow screens so the title is not squeezed mid-word check-in: 29aa10dc8b user: dmestas tags: ci-rows | |
| 00:28 | update tripwire-1 from trunk closed check-in: bc1781ccd2 user: dmestas tags: tripwire-1 | |
| 00:28 | update agreements-1 from trunk closed check-in: aa9358b576 user: dmestas tags: agreements-1 | |
| 00:27 | update throttle-1 from trunk closed check-in: 0aa2ca5402 user: dmestas tags: throttle-1 | |
| 00:26 | harness: web push, preferences form and inbox Done end to end; running.md push section check-in: 0963f23d8d user: dmestas tags: attention-3b | |
| 00:22 | web: inbox through inbox.list/mark, notification preferences page, push control check-in: 167e5005da user: dmestas tags: attention-3b | |
| 00:04 | land attention-3a check-in: b68b9538be user: dmestas tags: trunk | |
| 00:03 | merge trunk into attention-3a closed check-in: 6c44e8acd8 user: dmestas tags: attention-3a | |
| 00:00 | gofmt cmd/quarry/main.go closed check-in: a528e67f94 user: dmestas tags: exceptions | |
|
2026-08-29
| ||
| 23:59 | gate: the bypass tripwire — a protected branch moved past its checks is named check-in: a537f39f53 user: dmestas tags: tripwire-1 | |
| 23:58 | inbox: rebase the paging cursor on notify's own pages, clamp it, tri-state unknown prefs check-in: 81fd758cdf user: dmestas tags: attention-3a | |