Skip to content
quarry Today In History
Login

Today In History

This Day In History For 2027-08-29

1 Year Ago (more context)

2026-08-29
23:59 • Post: A stock zit client can accept against the shared store and the store cannot refuse it — twice on 2026-08-29, red-checked and unformatted work reached trunk that way, discovered by archaeology. The store's openness stays (RFC 0007 owns it honestly); NOTICING becomes the forge's half: every forge accept is remembered, each protected branch's tip is swept on the fold, and a check-in that moved one without a forge accept behind it is named — one loud log line, and a banner at the top of the CI page ('trunk moved past its gate at <checkin> — no forge accept behind it'). First sight baselines at the tip, so history is not retroactively flagged; glob rules are skipped for now and say so in the code. Closes ticket 44867745. artifact: c3839c2126 user: dmestas
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
23:57 • Edit [395e40d54d]: Add "ci-fail" with value "58884adfbcf782c1d4f44e9943fb96bf". artifact: da2edafd82 user: dmestas
23:53 • Post: The working agreement for several agents on one store, written into the run book with the why for every rule — each one bought on 2026-08-29. And tools/quarry-land, the script that makes the gated path the easy path: accept through the forge, or arm auto-land with --when-green. Closes ticket 3fd986d9. artifact: 15e467b514 user: dmestas
23:52
docs: the multi-agent working agreement; tools/quarry-land check-in: 15f9128280 user: dmestas tags: agreements-1
23:52 • Post: An exceptions surface for the fleet, with traces and a webhook artifact: 06182dd94c user: dmestas
23:52
merge trunk into exceptions check-in: 395e40d54d user: dmestas tags: exceptions
23:50 • Ticket [029c4730c0] ci: throttle the worker — max concurrent tasks, and a queueing story beyond it status still Open with 1 other change artifact: 5aebf90ff3 user: dmestas
23:49 • Post: The worker ran every dispatched task at once, so two agents' pipelines plus a landing turned 2-minute steps into 14 and pushed timing tests into flake territory (2026-08-29, all afternoon). A -max-tasks semaphore (default 3 — roughly one full run's steps) now gates handler entry: the engine's dispatch stays greedy, the box's capacity is the worker's own truth. A real wait is SAID — 'waiting for a slot (N busy)' — so a slow run reads as queued, never as mystery latency. The wider queueing story (per-repo concurrency at the trigger, priority for landing runs) stays open on ticket 029c4730; this is its near-term knob. artifact: 3251dc15a8 user: dmestas
23:48
worker: -max-tasks gates concurrency; queued waits are said check-in: b438483f23 user: dmestas tags: throttle-1
23:40 • Edit [30744ed6ed]: Add "ci-pass" with value "69a8a85c643a0b8d2af17a4972928cee". artifact: 865568f431 user: dmestas
23:34
inbox: composite paging cursor, workflow-id reasons, explicit prefs, degraded notify routes check-in: 30744ed6ed user: dmestas tags: attention-3a
23:27 • Edit [b644d4d37d]: Add "ci-pass" with value "2716794eeaaa0fd81ecf0730abcfdd21". artifact: 4bc35d90cd user: dmestas
23:13 • Edit [dcadacc88b]: Add "ci-fail" with value "1110ada4d872ef4960ac34c3035e85fe". artifact: e60a03d629 user: dmestas
23:10 • Edit [d834d704bb]: Add "ci-pass" with value "c81466f61e029ea73bc2180cfa26d791". artifact: 0e71ed08ca user: dmestas
23:09 • Edit [d13fe9308f]: Add "ci-fail" with value "150b3e12809583738629bc84f40fa404". artifact: 1400b891e3 user: dmestas
23:06 • New ticket [2c9255e959] flaky: internal/webhook TestFansOutPerSubscription fails under full-suite load. artifact: 627fa7b3a0 user: dan
23:00 • Edit [c7c071ba11]: Add "ci-fail" with value "e1a36aad3a84479fff6ed5d7448601e1". artifact: 88f600dc74 user: dmestas
22:58
land attention-polish check-in: b644d4d37d user: dmestas tags: trunk
22:58 • Edit [b644d4d37d]: Add "landing" with value "450ac23ad0641938e658b872795aaf7b5a5558e102aca3ed1095de5280942cea". artifact: ca4973dd20 user: dmestas
22:58 • Reply: Chat and inbox visual polish after Phase 2 review: 32px rounded identicons in a 44px gutter, collapsed continuation rows with hover clock, group hue rail, row hover wash + floating reply/#seq/edit/delete toolbar (inline on touch), rounded auto-growing composer with docked note/mark-read/hint/Send pill, Slack-style quote cards, accent NEW line + date pills, jump-to-latest, chat-scoped code and mention chips, inbox rows with dot/chip/tabular time/pill Done, spacing-radius-shadow tokens. Both themes; JS-off intact. Research: Campfire CSS + Slack/Discord/Linear conventions. Screens: https://claude.ai/code/artifact/fae9c9b3-59cf-4609-8d67-e21a933be702 artifact: f3fa3b7f91 user: dmestas
22:58 • Edit [dcadacc88b]: Mark "Closed". artifact: d270abe656 user: dmestas
22:57 • Edit [db208ad1a8]: Add "ci-fail" with value "d51d8dac625ceb368198572b322b20ff". artifact: 53eb2a12f9 user: dmestas
22:57 • Post: Chat and inbox visual polish after Phase 2 review: 32px rounded identicons in a 44px gutter, collapsed continuation rows with hover clock, group hue rail, row hover wash + floating reply/#seq/edit/delete toolbar (inline on touch), rounded auto-growing composer with docked note/mark-read/hint/Send pill, Slack-style quote cards, accent NEW line + date pills, jump-to-latest, chat-scoped code and mention chips, inbox rows with dot/chip/tabular time/pill Done, spacing-radius-shadow tokens. Both themes; JS-off intact. Research: Campfire CSS + Slack/Discord/Linear conventions. Screens: https://claude.ai/code/artifact/fae9c9b3-59cf-4609-8d67-e21a933be702 artifact: 450ac23ad0 user: dmestas
22:56
merge trunk into attention-polish closed check-in: dcadacc88b user: dmestas tags: attention-polish
22:56 • Fixed ticket [998c5d2718]: zitcli: a contract canary for every parsed zit verb, and a pinned worker zit plus 1 other change artifact: f2b6977012 user: dmestas
22:54 • Edit [d13fe9308f]: Add "ci-fail" with value "211b33665391c94258bf0b6714187589". artifact: b911edfa38 user: dmestas
22:54 • Fixed ticket [13c853243c]: ci: the trigger must not advance the watermark past silent failures plus 1 other change artifact: 73107f5de2 user: dmestas
22:51
events: error.raised fires once per failure signature, onto the existing webhook plane check-in: d13fe9308f user: dmestas tags: exceptions
22:51
api: service worker route test, mute list accessor, upgrade note in running.md check-in: d834d704bb user: dmestas tags: attention-3a
22:50
chat and inbox visual polish: avatar gutter, floating toolbar, rounded composer, quote cards, date separators, spacing scale check-in: db208ad1a8 user: dmestas tags: attention-polish
22:49
land resilience-2 check-in: c7c071ba11 user: dmestas tags: trunk
22:49 • Edit [c7c071ba11]: Add "landing" with value "e5eeb971864382de4a33c59895e0018b6d4bbb48a3479b159f94f548554ae0ff". artifact: ad10fa093d user: dmestas
22:49 • Reply: Every text-output verb zitcli parses, exercised against a scratch store in one file, each subtest named for its verb: the next zit upgrade that changes an output shape fails HERE, loudly, naming the seam — instead of going quietly wrong the way 0.2.0 and 0.3.0 did. Assertions are deliberately shallow (the parser still extracts something sane), never exact wording, so routine zit releases pass. The unknown-pull-wording case is pinned as an error, never a guess. The CI worker grows -zit: pin a binary and an upgrade on PATH cannot blind CI mid-flight; the ready line says which zit it runs. Closes ticket 998c5d27. artifact: a27dba1e5f user: dmestas
22:49 • Edit [e12fc79839]: Mark "Closed". artifact: 1743e9f52b user: dmestas
22:45 • Edit [7b8e6cd212]: Add "ci-fail" with value "79f0b2c2b2fa3d8a25a96cc444fb0b17". artifact: 3d42838e15 user: dmestas
22:45
api: inbox.list/mark, me.prefs, me.push, /sw.js, per-repo mute check-in: a37b13f647 user: dmestas tags: attention-3a
22:36
fleet: an exceptions panel with traces, fed by the background workers too check-in: 6020700930 user: dmestas tags: exceptions
22:34
land resilience-1 check-in: 9d5cb61173 user: dmestas tags: trunk
22:34 • Edit [9d5cb61173]: Add "landing" with value "498adbd14e41ed4735d1d38fcde08bd6f6fcb88566c22f217b43205c4a52be89". artifact: bbc69bf27c user: dmestas
22:34 • Reply: The trigger now tells a bad MOMENT from a bad CHECK-IN. A store that answers no files at all (a check-in always has files — 2026-08-29's drifted parser read exactly like this), an unreachable engine, a failed read, or a launched-but-unrecorded run all hold the watermark and stop the round: the next one retries from the same place, in order, losing nothing, with one loud line saying so. A pipeline the engine REFUSED still advances — retrying a bad definition forever would wedge the watermark, which was the original rationale and is kept. Closes ticket 13c85324. artifact: a593bfd34e user: dmestas
22:34 • Edit [8d50246065]: Mark "Closed". artifact: 61f6a574f0 user: dmestas
22:34 • Reply: Every text-output verb zitcli parses, exercised against a scratch store in one file, each subtest named for its verb: the next zit upgrade that changes an output shape fails HERE, loudly, naming the seam — instead of going quietly wrong the way 0.2.0 and 0.3.0 did. Assertions are deliberately shallow (the parser still extracts something sane), never exact wording, so routine zit releases pass. The unknown-pull-wording case is pinned as an error, never a guess. The CI worker grows -zit: pin a binary and an upgrade on PATH cannot blind CI mid-flight; the ready line says which zit it runs. Closes ticket 998c5d27. artifact: 7c6a38e1cb user: dmestas
22:34 • Edit [8d50246065]: Add "ci-pass" with value "7cdd67603d5cf33a88b361923643b30d". artifact: 596d9dfd5f user: dmestas
22:31 • Edit [7b8e6cd212]: Move to branch attention-3a. artifact: 80913fd23d user: dmestas
22:30
notify: mark, page, count, web-push credentials and preferences; push and digest steps check-in: 7b8e6cd212 user: dmestas tags: attention-3a
22:15 • New ticket [029c4730c0] ci: throttle the worker — max concurrent tasks, and a queueing story beyond it. artifact: f2c5d2fa57 user: dmestas
22:09
land attention-2 check-in: 9eb8e48c21 user: dmestas tags: trunk
22:09 • Edit [9eb8e48c21]: Add "landing" with value "fcc254edd2d3710ee60a0f37f8ea233e0df7399ee7f085dfc8368b3f8f951d0a". artifact: 845bd7cdf1 user: dmestas
22:09 • Reply: RFC 0012 Phase 2: attention in the open tab. QUARRYATTN per-account stream (attn.<account>, 30d/1000) published before notify on every person-addressed event, off the write path; me.attention SSE op with id:/Last-Event-ID + gap; attention.read pointer (attn_read); inbox.count/inbox.recent (works with no notify); /me.sse drives the inbox badge + tab-title count on every page (--attention-everywhere; repo pages by default on HTTP/1.1). Desktop notifications and in-page banners are opt-in account prefs, both off by default (badge + title are the signal). Inbox rebuilt: filter tabs, reason-first rows, unread dots, hover Done/Unfollow, settings folded away. Activity robot (chat.robot, webhook pattern syntax, fleet-wide durable consumer, robot lines never count as unread via chat_robot_line bounded by the window). Chat UX: forum-style author hue rail + identicon, author/minute grouping, hover-revealed reply/#seq/edit/delete row, compact reply quotes and diminished quotes for inline #seq refs, one renderer for page/live/permalink, mark-read as a small control. Three review rounds; blockers fixed: sync attention publish on the op path, unbounded unread scan, RecentAttention unused, robot hot-spin, robot-count over-subtraction, live/page grouping divergence. Follow-ups: quotes only for messages in the loaded window; Attend has no ctx; keyboard nav on inbox. Screens: https://claude.ai/code/artifact/fae9c9b3-59cf-4609-8d67-e21a933be702 artifact: 2631da367e user: dmestas
22:09 • Edit [81239b3941]: Mark "Closed". artifact: 1aafbe0083 user: dmestas
22:05 • Post: RFC 0012 Phase 2: attention in the open tab. QUARRYATTN per-account stream (attn.<account>, 30d/1000) published before notify on every person-addressed event, off the write path; me.attention SSE op with id:/Last-Event-ID + gap; attention.read pointer (attn_read); inbox.count/inbox.recent (works with no notify); /me.sse drives the inbox badge + tab-title count on every page (--attention-everywhere; repo pages by default on HTTP/1.1). Desktop notifications and in-page banners are opt-in account prefs, both off by default (badge + title are the signal). Inbox rebuilt: filter tabs, reason-first rows, unread dots, hover Done/Unfollow, settings folded away. Activity robot (chat.robot, webhook pattern syntax, fleet-wide durable consumer, robot lines never count as unread via chat_robot_line bounded by the window). Chat UX: forum-style author hue rail + identicon, author/minute grouping, hover-revealed reply/#seq/edit/delete row, compact reply quotes and diminished quotes for inline #seq refs, one renderer for page/live/permalink, mark-read as a small control. Three review rounds; blockers fixed: sync attention publish on the op path, unbounded unread scan, RecentAttention unused, robot hot-spin, robot-count over-subtraction, live/page grouping divergence. Follow-ups: quotes only for messages in the loaded window; Attend has no ctx; keyboard nav on inbox. Screens: https://claude.ai/code/artifact/fae9c9b3-59cf-4609-8d67-e21a933be702 artifact: fcc254edd2 user: dmestas
22:05
merge trunk into attention-2 closed check-in: 81239b3941 user: dmestas tags: attention-2
22:02 • Edit [1c3ed0f2a5]: Add "ci-fail" with value "6183156d0c69ab48785c76fdd9cf98e9". artifact: 409815f59a user: dmestas
22:01 • Post: Every text-output verb zitcli parses, exercised against a scratch store in one file, each subtest named for its verb: the next zit upgrade that changes an output shape fails HERE, loudly, naming the seam — instead of going quietly wrong the way 0.2.0 and 0.3.0 did. Assertions are deliberately shallow (the parser still extracts something sane), never exact wording, so routine zit releases pass. The unknown-pull-wording case is pinned as an error, never a guess. The CI worker grows -zit: pin a binary and an upgrade on PATH cannot blind CI mid-flight; the ready line says which zit it runs. Closes ticket 998c5d27. artifact: e5eeb97186 user: dmestas
22:01
zitcli: the zit contract canary; worker pins its zit closed check-in: e12fc79839 user: dmestas tags: resilience-2
21:56 • Post: The trigger now tells a bad MOMENT from a bad CHECK-IN. A store that answers no files at all (a check-in always has files — 2026-08-29's drifted parser read exactly like this), an unreachable engine, a failed read, or a launched-but-unrecorded run all hold the watermark and stop the round: the next one retries from the same place, in order, losing nothing, with one loud line saying so. A pipeline the engine REFUSED still advances — retrying a bad definition forever would wedge the watermark, which was the original rationale and is kept. Closes ticket 13c85324. artifact: 498adbd14e user: dmestas
21:56
ci: hold the watermark through transient faults closed check-in: 8d50246065 user: dmestas tags: resilience-1
21:50
Chat author groups with hued rails, inline #seq quotes, and an inbox triage queue check-in: 1c3ed0f2a5 user: dmestas tags: attention-2
21:39 • Fixed ticket [0f46cbf88b]: harness: firstHash scrapes zit status and now yields empty (2 tests fail via zit update "") plus 1 other change artifact: 087a109a41 user: dmestas
21:39 • Fixed ticket [03486b6125]: zitcli: adapt to 2026-08-29 zit CLI changes (shun, diff time names, ls with spaces) - 6 tests red plus 1 other change artifact: a3481bfe47 user: dmestas
21:37 • Edit [609a683614]: Add "ci-pass" with value "76d21cffc0f98938e30b38ed44d38dae". artifact: a4d6f5d59d user: dmestas
21:34 • New ticket [3fd986d99e] multi-agent working agreement: land through the forge, plus a 'quarry land' one-liner. artifact: f4749a08b7 user: dmestas
21:34 • New ticket [45d9424a32] deploy: build from a scratch tree, append to a dated log. artifact: 798be81092 user: dmestas
21:34 • New ticket [998c5d2718] zitcli: a contract canary for every parsed zit verb, and a pinned worker zit. artifact: ca23bb8693 user: dmestas
21:34 • New ticket [13c853243c] ci: the trigger must not advance the watermark past silent failures. artifact: c8c8831770 user: dmestas
21:34 • New ticket [448677458c] ci: gate-bypass tripwire — say when a protected branch moved past its checks. artifact: 16db022eca user: dmestas
21:28 • Edit [ad7ded34a6]: Add "ci-fail" with value "02d18ea51b3ed11d3b0332061516b2c3". artifact: 947a26056d user: dmestas
21:23
land fmtfix-2 check-in: 609a683614 user: dmestas tags: trunk
21:23 • Edit [609a683614]: Add "landing" with value "856bd09c036df468a7fb35892b65a196cebfb87789353948e5a510c35ff2c75e". artifact: f797f45d37 user: dmestas
21:23 • Reply: Two files landed unformatted past the fmt gate — CLI accepts do not consult the forge's required checks, which is the orchestration gap on today's list. Formatted here; the freshly-restored CI gates this landing itself. artifact: bf54bc29ce user: dmestas
21:23 • Edit [eb84f9798c]: Mark "Closed". artifact: f05ed325b0 user: dmestas
21:22 • Edit [eb84f9798c]: Add "ci-pass" with value "6b9253a7a6efa85c6bd2110d85091c47". artifact: 4edc858959 user: dmestas
21:21
quiet the chat row: grouped headers, one inline action row, chip mentions check-in: ad7ded34a6 user: dmestas tags: attention-2
21:18 • Post: Two files landed unformatted past the fmt gate — CLI accepts do not consult the forge's required checks, which is the orchestration gap on today's list. Formatted here; the freshly-restored CI gates this landing itself. artifact: 856bd09c03 user: dmestas
21:18
gofmt the stragglers closed check-in: eb84f9798c user: dmestas tags: fmtfix-2
21:16 • Edit [b1e3e4f387]: Add "ci-fail" with value "44563c603449c3c2741cb2ec6181151d". artifact: ca4b9ac6a0 user: dmestas
21:11 • Edit [323736149b]: Add "ci-fail" with value "694ae35560ae94d0c9590dca0f561227". artifact: 6aafbf99c7 user: dmestas
21:10
take attention delivery off the write path and count unread without scanning the window check-in: b1e3e4f387 user: dmestas tags: attention-2
21:07
land zitdrift-1 check-in: 323736149b user: dmestas tags: trunk
21:07 • Edit [323736149b]: Add "landing" with value "b6a82dee90ea4c59892fb19d3527127e50ea2e4161c9831fdebf3a00e35b6b36". artifact: b3b1b5dfaa user: dmestas
21:07 • Reply: zit 0.3.0 changed several output shapes and every shell-out seam that parsed the old ones went quietly wrong: bare ls prints names only (so LsNames dropped every entry and the CI trigger saw no pipelines — CI has been silently blind since midday), leaves prints Fossil's timeline line with a twelve-character hash (so leaf marks emptied), and pull says 'already in sync' (so mirrors read as errors). The parsers now read both generations; the leaves prefix is resolved to the full hash every consumer keys by; four tests that shelled the old forms are taught the new ones. Accepted over the waiting check, reason recorded: the deployed forge cannot launch the very run this change restores — the definition of a bootstrap override. artifact: f04e6977ae user: dmestas
21:07 • Edit [db4e4547c5]: Mark "Closed". artifact: ff88240352 user: dmestas
21:07 • Reply: zit 0.3.0 changed several output shapes and every shell-out seam that parsed the old ones went quietly wrong: bare ls prints names only (so LsNames dropped every entry and the CI trigger saw no pipelines — CI has been silently blind since midday), leaves prints Fossil's timeline line with a twelve-character hash (so leaf marks emptied), and pull says 'already in sync' (so mirrors read as errors). The parsers now read both generations; the leaves prefix is resolved to the full hash every consumer keys by; four tests that shelled the old forms are taught the new ones. Accepted over the waiting check, reason recorded: the deployed forge cannot launch the very run this change restores — the definition of a bootstrap override. artifact: 836b456589 user: dmestas
21:06 • Post: zit 0.3.0 changed several output shapes and every shell-out seam that parsed the old ones went quietly wrong: bare ls prints names only (so LsNames dropped every entry and the CI trigger saw no pipelines — CI has been silently blind since midday), leaves prints Fossil's timeline line with a twelve-character hash (so leaf marks emptied), and pull says 'already in sync' (so mirrors read as errors). The parsers now read both generations; the leaves prefix is resolved to the full hash every consumer keys by; four tests that shelled the old forms are taught the new ones. Accepted over the waiting check, reason recorded: the deployed forge cannot launch the very run this change restores — the definition of a bootstrap override. artifact: b6a82dee90 user: dmestas
21:06
zitcli: read zit 0.3.0's new output shapes closed check-in: db4e4547c5 user: dmestas tags: zitdrift-1
20:46
Accepted: a verdict a reader can follow, and the right verdict after a landing. check-in: 5a6dd9916c user: dmestas tags: trunk
20:46 • Edit [5a6dd9916c]: Add "landing" with value "1a92c35c68723053a1323e6ee4bf14ae2b0b13436b24f19e4f368eba9deac6bc". artifact: 4ac12c1e7a user: dmestas
20:46 • Reply: CI verdicts you can follow, and the right verdict after a landing artifact: a35f749eb1 user: dmestas
20:46 • Edit [135cf1a1e7]: Mark "Closed". artifact: d15906d583 user: dmestas
20:44
merge trunk into ci-signal closed check-in: 135cf1a1e7 user: dmestas tags: ci-signal
20:38
wire the attention plane and the robot into serve, with the h2 note check-in: d66333bfb1 user: dmestas tags: attention-2
20:31
land attention-1b check-in: f253f41585 user: dmestas tags: trunk
20:31 • Edit [f253f41585]: Add "landing" with value "eb219d5c894e17c2f2b462c222bb533c12f5ad007e9a4bbc36a8bf3261004b4a". artifact: 9520c9fafe user: dmestas
20:31 • Reply: RFC 0012 Phase 1b: references, reply-quotes, previews, chat backlinks (RFC 0011 §14). One resolver on every surface: #seq, repo:#seq, hash/bare hash, repo:hash, @handle, pasted quarry URLs; cross-repo only when the reader can see the target; every reference is a plain link with data-ref, and ONE delegated Datastar handler set on <body> adds hover/focus previews and tap-to-open into a single native popover, anchor-positioned with a measured fallback (0 bytes per anchor, ~1.8 KB per page). Ops: ref.resolve (cap-checked per resolved kind, incl. hash spellings that name tickets/forum posts), people.mention (h + token); chat.get gains replies/refs. Cards per kind incl. person (h-gated, never an address); ref.frag with CRC ETag. Reply-quotes above replies, N replies on originals, @ autocomplete. Backlinks: chat_ref keyed by canonical id, chat_reply for counts (startup backfill over the window, pruned by a stoppable 5-min sweep), window-bounded chat row (data-chat-refs) on ticket/checkin/landing/thread pages. Existence checks: unknown targets stay text. Three review rounds: cap bypass via addressed repo and via hash spelling, unbounded channel read per hover, prefix-keyed backlinks, anonymous person-card oracle, per-anchor attribute bloat — all fixed. Follow-ups: @mentions carry no preview hook (person card needs h); backfill reads each window once per boot. artifact: e0b9b7bc1f user: dmestas
20:31 • Edit [a84f8f3501]: Mark "Closed". artifact: 49f2081e1c user: dmestas
20:30
land attention-1 check-in: e3089414d3 user: dmestas tags: trunk
20:30 • Edit [e3089414d3]: Add "landing" with value "ea11b075d6c4cc851e5f28870708082d4dbd5d9b29423dba57294aa7e6eb2146". artifact: c2b31c8017 user: dmestas
20:30 • Reply: RFC 0012 Phase 1a: a chat that cannot lose a message. Messages are JetStream-seq addressed (kind msg/edit/del, ref for reply-to); Tail is a never-drop ordered consumer; chat.stream / chat.sse carry id: seq and resume from Last-Event-ID, with a gap event + full re-render when the resume point aged out of the window; per-channel unread/history/bounds via subject-filtered consumers (one stream, many repos); chat_read in oltp with forward-only marks; ops: chat.history(before,limit) chat.get chat.edit(own,5min) chat.delete(own|a) chat.read chat.unread chat.stream; first streaming op kind in the registry (~70 lines), documented in docs/api.md. Web: grouped rendering via one renderer for page and live rows, markdown through markup, unread divider, Datastar composer additive on the plain form, permalink page incl. aged-out state, nav unread count; .sse gated like the page. Two review rounds: 4 blockers fixed (Tail goroutine leak, stream-wide seq arithmetic, ungated .sse replay, delete-then-edit resurrection). Follow-ups recorded: Bounds/Unread create an ephemeral consumer per call (cache candidate); gap test compares to the channel first seq while NATS clamps to the stream's; gap re-render drops the divider for the session; markup.preview runs per message per connection on live rows; chatAdapter done-path untested. Environment: 8 tests red on every branch from the 2026-08-29 zit build (zit#171, tickets 0f46cbf8 / 03486b61). artifact: 187af21044 user: dmestas
20:30 • Edit [b6652c331d]: Mark "Closed". artifact: 99e973f599 user: dmestas
20:30 • Reply: RFC 0012 Phase 1b: references, reply-quotes, previews, chat backlinks (RFC 0011 §14). One resolver on every surface: #seq, repo:#seq, hash/bare hash, repo:hash, @handle, pasted quarry URLs; cross-repo only when the reader can see the target; every reference is a plain link with data-ref, and ONE delegated Datastar handler set on <body> adds hover/focus previews and tap-to-open into a single native popover, anchor-positioned with a measured fallback (0 bytes per anchor, ~1.8 KB per page). Ops: ref.resolve (cap-checked per resolved kind, incl. hash spellings that name tickets/forum posts), people.mention (h + token); chat.get gains replies/refs. Cards per kind incl. person (h-gated, never an address); ref.frag with CRC ETag. Reply-quotes above replies, N replies on originals, @ autocomplete. Backlinks: chat_ref keyed by canonical id, chat_reply for counts (startup backfill over the window, pruned by a stoppable 5-min sweep), window-bounded chat row (data-chat-refs) on ticket/checkin/landing/thread pages. Existence checks: unknown targets stay text. Three review rounds: cap bypass via addressed repo and via hash spelling, unbounded channel read per hover, prefix-keyed backlinks, anonymous person-card oracle, per-anchor attribute bloat — all fixed. Follow-ups: @mentions carry no preview hook (person card needs h); backfill reads each window once per boot. artifact: a2125022da user: dmestas
20:30
the attention stream in the open tab: toasts, the badge, the title, the inbox controls check-in: 325cbd5f2f user: dmestas tags: attention-2
20:30
merge trunk into attention-1 closed check-in: b6652c331d user: dmestas tags: attention-1
20:27
land attention-0 check-in: 9dd5bb5d3d user: dmestas tags: trunk
20:27 • Edit [9dd5bb5d3d]: Add "landing" with value "e05426717d7c425de9df0927bbdcb461a94ca0f6701d8b1e6026c2e8b7dca9dd". artifact: 26605b6388 user: dmestas
20:27 • Reply: RFC 0012 Phase 0: what exists reaches people. quarry provisions notify subscribers (account.add, login, grant), repo-<name> topic membership (grant/revoke/subscribe), and the six workflows at startup (async, never blocks). Mentions resolve only to real accounts with an effective cap on the repo and are recorded in oltp mention; chat.post is Token + C with address-based TxnIDs. running.md curl ritual removed. Harness: fake notify incl. the 422 subscriber-not-found path; pre-existing account grant; @unknown fires nothing; anonymous chat refused. Review: two blockers found and fixed (existing accounts never subscribed; startup blocked on notify). Deferred: chat.quarry fleet channel (no consuming surface yet); shared-harness withCaps option (too invasive for this stratum). artifact: 6dcd982c5c user: dmestas
20:27 • Edit [e903eba277]: Mark "Closed". artifact: a9cd4154cc user: dmestas
20:27 • Reply: RFC 0012 Phase 1a: a chat that cannot lose a message. Messages are JetStream-seq addressed (kind msg/edit/del, ref for reply-to); Tail is a never-drop ordered consumer; chat.stream / chat.sse carry id: seq and resume from Last-Event-ID, with a gap event + full re-render when the resume point aged out of the window; per-channel unread/history/bounds via subject-filtered consumers (one stream, many repos); chat_read in oltp with forward-only marks; ops: chat.history(before,limit) chat.get chat.edit(own,5min) chat.delete(own|a) chat.read chat.unread chat.stream; first streaming op kind in the registry (~70 lines), documented in docs/api.md. Web: grouped rendering via one renderer for page and live rows, markdown through markup, unread divider, Datastar composer additive on the plain form, permalink page incl. aged-out state, nav unread count; .sse gated like the page. Two review rounds: 4 blockers fixed (Tail goroutine leak, stream-wide seq arithmetic, ungated .sse replay, delete-then-edit resurrection). Follow-ups recorded: Bounds/Unread create an ephemeral consumer per call (cache candidate); gap test compares to the channel first seq while NATS clamps to the stream's; gap re-render drops the divider for the session; markup.preview runs per message per connection on live rows; chatAdapter done-path untested. Environment: 8 tests red on every branch from the 2026-08-29 zit build (zit#171, tickets 0f46cbf8 / 03486b61). artifact: 338cb6726b user: dmestas
20:27
merge trunk into attention-0 closed check-in: e903eba277 user: dmestas tags: attention-0
20:22
an attention stream, the ops that read it, and the activity robot check-in: 24aa859ca1 user: dmestas tags: attention-2
20:08 • Post: RFC 0012 Phase 1b: references, reply-quotes, previews, chat backlinks (RFC 0011 §14). One resolver on every surface: #seq, repo:#seq, hash/bare hash, repo:hash, @handle, pasted quarry URLs; cross-repo only when the reader can see the target; every reference is a plain link with data-ref, and ONE delegated Datastar handler set on <body> adds hover/focus previews and tap-to-open into a single native popover, anchor-positioned with a measured fallback (0 bytes per anchor, ~1.8 KB per page). Ops: ref.resolve (cap-checked per resolved kind, incl. hash spellings that name tickets/forum posts), people.mention (h + token); chat.get gains replies/refs. Cards per kind incl. person (h-gated, never an address); ref.frag with CRC ETag. Reply-quotes above replies, N replies on originals, @ autocomplete. Backlinks: chat_ref keyed by canonical id, chat_reply for counts (startup backfill over the window, pruned by a stoppable 5-min sweep), window-bounded chat row (data-chat-refs) on ticket/checkin/landing/thread pages. Existence checks: unknown targets stay text. Three review rounds: cap bypass via addressed repo and via hash spelling, unbounded channel read per hover, prefix-keyed backlinks, anonymous person-card oracle, per-anchor attribute bloat — all fixed. Follow-ups: @mentions carry no preview hook (person card needs h); backfill reads each window once per boot. artifact: eb219d5c89 user: dmestas
20:05
gate a bracketed hash on the kind it actually resolves to closed check-in: a84f8f3501 user: dmestas tags: attention-1b
19:45
delegate reference previews from the layout instead of arming every anchor check-in: c8c5a1189c user: dmestas tags: attention-1b
19:33 • Post: CI verdicts you can follow, and the right verdict after a landing artifact: 1a92c35c68 user: dmestas
19:27
enforce reference caps and existence on every branch; hover previews on every surface check-in: 45f143d5bf user: dmestas tags: attention-1b
18:55
chat backlink rows on ticket, check-in, landing and thread pages check-in: d0e8102539 user: dmestas tags: attention-1b
18:47
reference previews, reply-quotes and mention completion on the web check-in: 0083d53d99 user: dmestas tags: attention-1b
18:42
reference resolver, ref.resolve and people.mention, chat_ref store check-in: 1ce4dc0309 user: dmestas tags: attention-1b
18:28 • Post: RFC 0012 Phase 1a: a chat that cannot lose a message. Messages are JetStream-seq addressed (kind msg/edit/del, ref for reply-to); Tail is a never-drop ordered consumer; chat.stream / chat.sse carry id: seq and resume from Last-Event-ID, with a gap event + full re-render when the resume point aged out of the window; per-channel unread/history/bounds via subject-filtered consumers (one stream, many repos); chat_read in oltp with forward-only marks; ops: chat.history(before,limit) chat.get chat.edit(own,5min) chat.delete(own|a) chat.read chat.unread chat.stream; first streaming op kind in the registry (~70 lines), documented in docs/api.md. Web: grouped rendering via one renderer for page and live rows, markdown through markup, unread divider, Datastar composer additive on the plain form, permalink page incl. aged-out state, nav unread count; .sse gated like the page. Two review rounds: 4 blockers fixed (Tail goroutine leak, stream-wide seq arithmetic, ungated .sse replay, delete-then-edit resurrection). Follow-ups recorded: Bounds/Unread create an ephemeral consumer per call (cache candidate); gap test compares to the channel first seq while NATS clamps to the stream's; gap re-render drops the divider for the session; markup.preview runs per message per connection on live rows; chatAdapter done-path untested. Environment: 8 tests red on every branch from the 2026-08-29 zit build (zit#171, tickets 0f46cbf8 / 03486b61). artifact: ea11b075d6 user: dmestas
18:28
merge trunk into attention-1 check-in: 18109e552a user: dmestas tags: attention-1
18:26
chat: check the edit window before the tombstone scan; unread reports broker errors check-in: 1a6d71bd1c user: dmestas tags: attention-1
18:21 • New ticket [03486b6125] zitcli: adapt to 2026-08-29 zit CLI changes (shun, diff time names, ls with spaces) - 6 tests red. artifact: 57fa45b815 user: dan
18:18
web: gate chat.sse like the page, re-render on gap, keep the row's own author on tombstones check-in: e308673e41 user: dmestas tags: attention-1
18:18
chat: per-channel sequence views, terminal deletes, gap-aware Tail that closes on cancel check-in: 7a68c2958a user: dmestas tags: attention-1
17:51 • New ticket [0f46cbf88b] harness: firstHash scrapes zit status and now yields empty (2 tests fail via zit update ""). artifact: ed141b249a user: dan
17:49
docs: chat ops in docs/api.md via a doc-only ChatPlane stub; chatMsgOut flattened for correct schema check-in: 1a03010e16 user: dmestas tags: attention-1
17:45 • Edit [d537523566]: Add "ci-fail" with value "2648f7b67acb04dfbbeff1848bff6783". artifact: 061358d50e user: dmestas
17:45
landings: a settled record reports the merge's verdict, not the branch tip's check-in: d537523566 user: dmestas tags: ci-signal
17:36 • Edit [82c4d6ac52]: Add "ci-fail" with value "a1e98704616391f48b9d48a385b680ee". artifact: 039841648c user: dmestas
17:35
chat web: rendered log, composer, edit/delete forms, permalink, unread nav badge, resumable SSE; main.go Tail adapter; harness proofs check-in: 82c4d6ac52 user: dmestas tags: attention-1
17:16 • Edit [bf20439bd7]: Add "ci-fail" with value "246375a21a3190116e0ea7a8a7f711e8". artifact: d7fa37c72e user: dmestas
17:16
checkins: the CI badge links to the run behind it check-in: bf20439bd7 user: dmestas tags: ci-signal
17:00 • Edit [70bdb44650]: Add "ci-fail" with value "375902118d8123a12ecb859c8d7644a8". artifact: 9630a811a7 user: dmestas
16:59
chat plane: seq identity, paged history, never-drop tail, fold; chat_read; ops streaming seam; chat.edit/delete/read/unread/get check-in: 70bdb44650 user: dmestas tags: attention-1
16:56 • Edit [d6e53a940b]: Add "ci-pass" with value "86f2ae34c0794a4aaeaf9dfa7dd99180". artifact: d39cb49297 user: dmestas
16:55
land cieditor-1 check-in: d6e53a940b user: dmestas tags: trunk
16:55 • Edit [d6e53a940b]: Add "landing" with value "bc57c160b9f57d53a919102bb694fbcb0c3f40ba8e3b0326c1a570ff9f51a275". artifact: 0b91cffc7b user: dmestas
16:55 • Reply: The CI page grows its write half: every pipeline gets an Edit link and a New pipeline door, into a plain editor with two verbs. Validate asks the engine (/v1/ci/validate, its diagnostics worded with line numbers) or checks the JSON shape locally; Save commits the file to a fresh ci-edit-* branch through a scratch checkout against the repository's own store — the serving tree untouched, nothing on the network — and opens a landing targeted at the main branch, so a pipeline edit lands like any change, gated by the very checks it defines. There is deliberately no way to write to trunk from the editor. Path writes are fenced to single-segment ci/*.{json,yml,yaml}. Proven on the rig end to end: edit saved, branch minted, landing opened waiting on its required check. artifact: 9547c4bbd8 user: dmestas
16:55 • Edit [260e3fbed6]: Mark "Closed". artifact: 640b90817c user: dmestas
16:55 • Edit [260e3fbed6]: Add "ci-pass" with value "c5da7ad0dfef635b97b100510a9f54e5". artifact: 0dd5bb3bc8 user: dmestas
16:53 • Post: The CI page grows its write half: every pipeline gets an Edit link and a New pipeline door, into a plain editor with two verbs. Validate asks the engine (/v1/ci/validate, its diagnostics worded with line numbers) or checks the JSON shape locally; Save commits the file to a fresh ci-edit-* branch through a scratch checkout against the repository's own store — the serving tree untouched, nothing on the network — and opens a landing targeted at the main branch, so a pipeline edit lands like any change, gated by the very checks it defines. There is deliberately no way to write to trunk from the editor. Path writes are fenced to single-segment ci/*.{json,yml,yaml}. Proven on the rig end to end: edit saved, branch minted, landing opened waiting on its required check. artifact: bc57c160b9 user: dmestas
16:53
ci: add and edit pipelines from the forge closed check-in: 260e3fbed6 user: dmestas tags: cieditor-1
16:42 • Edit [45774534b5]: Add "ci-pass" with value "18641ea11e41f752fb5acaccc3b2c4d3". artifact: be0c131fea user: dmestas
16:41 • Post: RFC 0012 Phase 0: what exists reaches people. quarry provisions notify subscribers (account.add, login, grant), repo-<name> topic membership (grant/revoke/subscribe), and the six workflows at startup (async, never blocks). Mentions resolve only to real accounts with an effective cap on the repo and are recorded in oltp mention; chat.post is Token + C with address-based TxnIDs. running.md curl ritual removed. Harness: fake notify incl. the 422 subscriber-not-found path; pre-existing account grant; @unknown fires nothing; anonymous chat refused. Review: two blockers found and fixed (existing accounts never subscribed; startup blocked on notify). Deferred: chat.quarry fleet channel (no consuming surface yet); shared-harness withCaps option (too invasive for this stratum). artifact: e05426717d user: dmestas
16:41
merge trunk into attention-0 check-in: 45774534b5 user: dmestas tags: attention-0
16:40 • Edit [d6663dae9c]: Add "ci-pass" with value "be0727a978ac9ae87afd8ba658e67a3e". artifact: 0e919d9d08 user: dmestas
16:39
Fix RFC 0011 Phase 0 review findings: preexisting-account provisioning, async startup and workflow-count docs check-in: d6663dae9c user: dmestas tags: attention-0
16:38 • Edit [f1dc085598]: Add "ci-pass" with value "ea1891466aeef8d917fb6673752e4f8e". artifact: dd8000f361 user: dmestas
16:37
land cilist-1 check-in: f1dc085598 user: dmestas tags: trunk
16:37 • Edit [f1dc085598]: Add "landing" with value "f07af377f1fc5376065baf0d92773bad356ed74dfc0c766b333f082baa726324". artifact: 33c8659949 user: dmestas
16:37 • Reply: The CI list answered none of the questions it exists for: a gray word, a link to the check-in (not the run), a raw timestamp. Now every row is the run's story — a colored verdict chip and the commit title both open the run; a red row names the failing step and quotes the first FAIL line from the drained record; hash, branch, author, pipeline and duration ride along, with Re-run at that check-in one button away. Above the rows: a health strip per pipeline — trunk verdict as a banner when red, pass rate and median duration over the recent window — and filters (status, branch, pipeline) that narrow the list without rewriting the strip. Durations come from a new completed stamp the poller writes at the terminal transition; the check-in join is one IN query at the ci.list op. The live stream now carries the reader's filters so a patch draws what a reload would. artifact: b53c3e2f13 user: dmestas
16:37 • Edit [2b2a60d495]: Mark "Closed". artifact: c1b661a463 user: dmestas
16:37 • Edit [2b2a60d495]: Add "ci-pass" with value "500ee5a14e71f44edd9036f75e3220fe". artifact: d3f7f44d27 user: dmestas
16:36 • Post: The CI list answered none of the questions it exists for: a gray word, a link to the check-in (not the run), a raw timestamp. Now every row is the run's story — a colored verdict chip and the commit title both open the run; a red row names the failing step and quotes the first FAIL line from the drained record; hash, branch, author, pipeline and duration ride along, with Re-run at that check-in one button away. Above the rows: a health strip per pipeline — trunk verdict as a banner when red, pass rate and median duration over the recent window — and filters (status, branch, pipeline) that narrow the list without rewriting the strip. Durations come from a new completed stamp the poller writes at the terminal transition; the check-in join is one IN query at the ci.list op. The live stream now carries the reader's filters so a patch draws what a reload would. artifact: f07af377f1 user: dmestas
16:36
ci: a list where every row answers what happened closed check-in: 2b2a60d495 user: dmestas tags: cilist-1
16:27 • Edit [788472b04b]: Add "ci-pass" with value "9d9c6d86caa4dc55d6d8ffdd9655a1b2". artifact: 47124fc50c user: dmestas
16:26
land flakefix-2 check-in: 788472b04b user: dmestas tags: trunk
16:26 • Edit [788472b04b]: Add "landing" with value "3c1b4554e8940eaacecaf2dab61c08ddf58ecb1aad5900af3d1477804b4a3dce". artifact: de6d226710 user: dmestas
16:26 • Reply: TestPausedSubscriptionStopsDelivery raced its own subject: Raise queues, the test flips Active off, and on a loaded host the delivery worker looked up the subscription before the pause landed (run 31dea4ff). The product is fine — deliver() re-checks Active at delivery time — so the fix is the test's: the fake's lookup now holds on a gate until the pause is in, the ordering under test won by construction. The 6-second sleep becomes a bounded wait for the lookup plus a short grace. artifact: c2c1a9a928 user: dmestas
16:26 • Edit [4c1bc2d5b6]: Mark "Closed". artifact: 08820667e4 user: dmestas
16:26 • Edit [4c1bc2d5b6]: Add "ci-pass" with value "e799ce130a1e989e694a9b46f670d748". artifact: 60d0d67752 user: dmestas
16:25 • Post: TestPausedSubscriptionStopsDelivery raced its own subject: Raise queues, the test flips Active off, and on a loaded host the delivery worker looked up the subscription before the pause landed (run 31dea4ff). The product is fine — deliver() re-checks Active at delivery time — so the fix is the test's: the fake's lookup now holds on a gate until the pause is in, the ordering under test won by construction. The 6-second sleep becomes a bounded wait for the lookup plus a short grace. artifact: 3c1b4554e8 user: dmestas
16:25
webhook: win the pause race by construction, not by sleep closed check-in: 4c1bc2d5b6 user: dmestas tags: flakefix-2
16:20 • Edit [6bd99493ab]: Add "ci-pass" with value "7eb77c940eadff74c65c49bd4d5a2795". artifact: f2d6b83239 user: dmestas
16:19
RFC 0011 Phase 0: notify provisioning, mention filtering, chat auth check-in: 6bd99493ab user: dmestas tags: attention-0
16:06 • Edit [2af3dab4b9]: Add "ci-pass" with value "0c0b01a91610f7fbb8511589c0c3db40". artifact: ee0f7dd2a7 user: dmestas
16:04
land redcard-1 check-in: 2af3dab4b9 user: dmestas tags: trunk
16:04 • Edit [2af3dab4b9]: Add "landing" with value "48601c8046766ff3b43aeefe558ac7be06fe481f1e7a8447e68d4f99ceb119c9". artifact: c6c64cd3ab user: dmestas
16:04 • Reply: Red is where the decision needs the WHY. A failed check row on the decision card now opens with the failing step's log tail — drained record first, engine second, capped at 40 chunks with the run page as the door out — so the reader learns what broke without leaving the decision. Green rows stay one line, their link now honestly worded 'logs · run …'. Absences stay worded: an engine that serves no logs says so on the card. artifact: 1d794ed13f user: dmestas
16:04 • Edit [c1470b1109]: Mark "Closed". artifact: 4aa08ef48e user: dmestas
16:04 • Edit [c1470b1109]: Add "ci-pass" with value "68a7a93908c2fc50cbf9d16e7ba85ad0". artifact: bda5a38888 user: dmestas
16:02 • Post: Red is where the decision needs the WHY. A failed check row on the decision card now opens with the failing step's log tail — drained record first, engine second, capped at 40 chunks with the run page as the door out — so the reader learns what broke without leaving the decision. Green rows stay one line, their link now honestly worded 'logs · run …'. Absences stay worded: an engine that serves no logs says so on the card. artifact: 48601c8046 user: dmestas
16:02
landings: a red check carries its failing log on the card closed check-in: c1470b1109 user: dmestas tags: redcard-1
15:57 • Edit [a0446d189a]: Add "ci-fail" with value "31dea4fffd7f61ccfbe6cd16d089c9ab". artifact: cb2a84ad76 user: dmestas
15:54
land ticket-refs check-in: a0446d189a user: dmestas tags: trunk
15:54 • Edit [a0446d189a]: Add "landing" with value "ff129245db964bf1b1a6050e704a459c6d76d31f6683712a4be16235a328c92d". artifact: 8cd22d6f6b user: dmestas
15:54 • Reply: Tickets show the landings that reference them artifact: dfef10ae95 user: dmestas
15:54 • Edit [6908457496]: Mark "Closed". artifact: c8abc93e12 user: dmestas
15:48 • Edit [6908457496]: Add "ci-pass" with value "5b0b42e0502bd9e8b2ab2187bc566364". artifact: 2df59ff220 user: dmestas
15:47 • Post: Tickets show the landings that reference them artifact: ff129245db user: dmestas
15:46
merge trunk into ticket-refs closed check-in: 6908457496 user: dmestas tags: ticket-refs
15:36 • Edit [42040b8d17]: Add "ci-pass" with value "37629202466367e6bc5efde4f6a06954". artifact: 0d10bf17fb user: dmestas
15:34
land attention-rfc check-in: 42040b8d17 user: dmestas tags: trunk
15:34 • Edit [42040b8d17]: Add "landing" with value "8b886b2cd84d71a6ac4552a6dddf7f8c65de5790ed8347324adb6e84136c3446". artifact: 4da4547a3e user: dmestas
15:34 • Reply: RFC 0011 attention: resumable chat with unread and resolved mentions, an attention stream per tab, Web Push via notify, quarry-owned provisioning, opt-in Fossil bridge. RFC 0012: the five-stratum plan. Research: https://claude.ai/code/artifact/ed3bb5ca-d523-4e99-8446-3c48ffd82f2a Mockups: https://claude.ai/code/artifact/98591c30-56b9-472c-8368-76930d7a1314 Upstream: notify#300-#304 filed; dagnats needs nothing. artifact: 02003aefff user: dmestas
15:34 • Edit [88bd060725]: Mark "Closed". artifact: ef94d6f844 user: dmestas
15:28 • Edit [88bd060725]: Add "ci-pass" with value "0958f9ae375b12af4e45f04b29ecfdf1". artifact: 3cedb3101d user: dmestas
15:27 • Reply: RFC 0011 attention: resumable chat with unread and resolved mentions, an attention stream per tab, Web Push via notify, quarry-owned provisioning, opt-in Fossil bridge. RFC 0012: the five-stratum plan. Research: https://claude.ai/code/artifact/ed3bb5ca-d523-4e99-8446-3c48ffd82f2a Mockups: https://claude.ai/code/artifact/98591c30-56b9-472c-8368-76930d7a1314 Upstream: notify#300-#304 filed; dagnats needs nothing. artifact: e0b7c9387d user: dmestas
15:27
rfcs: 0011 §14 references, reply-quotes, previews; 0012 phase 1 work closed check-in: 88bd060725 user: dmestas tags: attention-rfc
15:08 • Edit [84e5b13cba]: Add "ci-pass" with value "d8a1fdd03a58abf38c0686dded1ed4ab". artifact: ca2451be88 user: dmestas
15:08 • Post: RFC 0011 attention: resumable chat with unread and resolved mentions, an attention stream per tab, Web Push via notify, quarry-owned provisioning, opt-in Fossil bridge. RFC 0012: the five-stratum plan. Research: https://claude.ai/code/artifact/ed3bb5ca-d523-4e99-8446-3c48ffd82f2a Mockups: https://claude.ai/code/artifact/98591c30-56b9-472c-8368-76930d7a1314 Upstream: notify#300-#304 filed; dagnats needs nothing. artifact: 8b886b2cd8 user: dmestas
15:07
rfcs: 0011 attention (chat, push, provisioning) and 0012 its plan check-in: 84e5b13cba user: dmestas tags: attention-rfc
14:58
tickets: badge each row with the landings that reference it check-in: 87f2bde741 user: dmestas tags: ticket-refs
14:27
tickets: show the landings and threads that reference a ticket check-in: b154bd874e user: dmestas tags: ticket-refs
13:57 • New ticket [f24d78d96e] ci: quarry-native runner — generic 'quarry runner' + ci/runner.json manifest. artifact: ce82e70db3 user: dmestas
13:39 • Edit [8461245df2]: Add "ci-pass" with value "c14d19f7023adfc99b2a9228e4614cc1". artifact: a8f96a15e8 user: dmestas
13:38
land flakefix-1 check-in: 8461245df2 user: dmestas tags: trunk
13:38 • Edit [8461245df2]: Add "landing" with value "d0a893fb86457c17e41fe6b04d7b10177e60123c9d96b5ec85a60b0f2512ad43". artifact: 74800175b9 user: dmestas
13:38 • Reply: quarry's own CI caught this on its first week: fossil server forks per-connection children, the helper killed only the parent, and a straggler still touching the repository when t.TempDir's RemoveAll swept turned into 'directory not empty'. The peer now runs in its own process group (the kill reaches the children) and in its own directory with a patient, tolerant cleanup. artifact: d3169a6389 user: dmestas
13:38 • Edit [ac7ffd0fa8]: Mark "Closed". artifact: 72735ea019 user: dmestas
13:31 • Edit [ac7ffd0fa8]: Add "ci-pass" with value "085456dc515be0f9ed33a448f2dd4ad2". artifact: 89f9894781 user: dmestas
13:30 • Post: quarry's own CI caught this on its first week: fossil server forks per-connection children, the helper killed only the parent, and a straggler still touching the repository when t.TempDir's RemoveAll swept turned into 'directory not empty'. The peer now runs in its own process group (the kill reaches the children) and in its own directory with a patient, tolerant cleanup. artifact: d0a893fb86 user: dmestas
13:30
xfer: fossil peer teardown raced TempDir cleanup closed check-in: ac7ffd0fa8 user: dmestas tags: flakefix-1
12:30 • Edit [3a0c119e43]: Add "ci-pass" with value "8c7eac80099dd94a5637a15eb0dc9e44". artifact: aa74582be3 user: dmestas
12:29
land fmtgate-1 check-in: 3a0c119e43 user: dmestas tags: trunk
12:29 • Edit [3a0c119e43]: Add "landing" with value "9848c4f1840139888de8439b2f77063e73a11329d8f81e372ab7dbd19e703d7e". artifact: be06d06736 user: dmestas
12:29 • Reply: Three web files were committed unformatted and would have held a gofmt gate permanently red; they are formatted here, and the pipeline gains the fmt step (gofmt -l over cmd and internal — the step fails on any output). From this landing on, formatting is machine policy on trunk like the tests and the build. artifact: 2536fe2a25 user: dmestas
12:29 • Edit [04431474d1]: Mark "Closed". artifact: 4a937c9e69 user: dmestas
12:29 • Edit [04431474d1]: Add "ci-pass" with value "5bde7c27c8b50109d1aa0d21dca3606c". artifact: 702af8a0af user: dmestas
12:23 • Edit [04431474d1]: Add "ci-fail" with value "ad61336ce8f16bcfe0b348639ab8053c". artifact: 044066315f user: dmestas
12:22 • Post: Three web files were committed unformatted and would have held a gofmt gate permanently red; they are formatted here, and the pipeline gains the fmt step (gofmt -l over cmd and internal — the step fails on any output). From this landing on, formatting is machine policy on trunk like the tests and the build. artifact: 9848c4f184 user: dmestas
12:22
ci: gofmt the stragglers, gate formatting closed check-in: 04431474d1 user: dmestas tags: fmtgate-1
11:51 • Edit [acbfefd43b]: Add "ci-pass" with value "f0cea6f2b2267dba9ba528885ee0f106". artifact: 827774db96 user: dmestas
11:45
land selfci-1 check-in: acbfefd43b user: dmestas tags: trunk
11:45 • Edit [acbfefd43b]: Add "landing" with value "8ff82cb1017a034b0e7010634290466fae46dc91b483935b7bfe08e2ccd21b9e". artifact: d987b40438 user: dmestas
11:45 • Reply: quarry gating quarry: ci/quarry.json runs the test suite and the build on every check-in, through the same trigger, labels, log lane and decision card every hosted repository gets. The worker (ci/worker, its own module) clones the check-in under test fresh, runs go test ./... and go build ./..., and streams tool output to the engine's log lane; one stdout line per task says what happened and how long it took. A quarry-fmt task exists in the worker but is not in the pipeline yet — trunk carries three unformatted web files that would hold the gate permanently red. Smoke-proven before this landing: full suite green in 1m46s from a fresh clone of the live repository. artifact: 86ff7b8ad5 user: dmestas
11:45 • Edit [758bdf668c]: Mark "Closed". artifact: fce65fbdb9 user: dmestas
11:44 • Edit [758bdf668c]: Add "ci-pass" with value "5a31878cd91e3fc112f4ae49c36dbc80". artifact: 291eff9611 user: dmestas
11:42 • Edit [758bdf668c]: Add "ci-fail" with value "015c28d0210feeef20b59160e42c1352". artifact: 2b39649e30 user: dmestas
11:40 • Post: quarry gating quarry: ci/quarry.json runs the test suite and the build on every check-in, through the same trigger, labels, log lane and decision card every hosted repository gets. The worker (ci/worker, its own module) clones the check-in under test fresh, runs go test ./... and go build ./..., and streams tool output to the engine's log lane; one stdout line per task says what happened and how long it took. A quarry-fmt task exists in the worker but is not in the pipeline yet — trunk carries three unformatted web files that would hold the gate permanently red. Smoke-proven before this landing: full suite green in 1m46s from a fresh clone of the live repository. artifact: 8ff82cb101 user: dmestas
11:40
ci: quarry's own pipeline and worker (dogfood) closed check-in: 758bdf668c user: dmestas tags: selfci-1
10:38 • New ticket [d815803381] ci: light up worker tokens on the live engine (DAGNATS_BRIDGE_TOKEN). artifact: 58b6fea3ec user: dmestas
10:38 • New ticket [b906985a30] ci: supersede and label queries are exact only below the engine's scan ceiling (dagnats#659). artifact: 894a19dff4 user: dmestas
10:38 • New ticket [b73c6408da] ci: offload drained run logs to S3, local dir as hot cache. artifact: 6787b80673 user: dmestas
10:31
land workertokens-1 check-in: 03b9b136c9 user: dmestas tags: trunk
10:31 • Edit [03b9b136c9]: Add "landing" with value "dfee2438b6aab794ca0c8e3bf337f410c7ced2728129f39255931293ba0f3381". artifact: 11df74b0a6 user: dmestas
10:31 • Reply: The Runners section grows its credential half: worker tokens (dagnats#627) minted, listed and revoked from Settings, scoped to task-type prefixes, the bearer shown exactly once. They are the engine's, fleet-wide, and the page says so. quarry authenticates with --dagnats-token (default $DAGNATS_BRIDGE_TOKEN); an engine with no admin credential configured, a wrong one here, and an engine predating #627 each refuse in their own words, and the page shows them instead of a broken form. Proven against a real engine: mint, list, revoke, revoked_at, and the wrong-bearer refusal. artifact: 225dbc0361 user: dmestas
10:31 • Edit [01b8f2847b]: Mark "Closed". artifact: 9f7d6c0743 user: dmestas
10:31 • Post: The Runners section grows its credential half: worker tokens (dagnats#627) minted, listed and revoked from Settings, scoped to task-type prefixes, the bearer shown exactly once. They are the engine's, fleet-wide, and the page says so. quarry authenticates with --dagnats-token (default $DAGNATS_BRIDGE_TOKEN); an engine with no admin credential configured, a wrong one here, and an engine predating #627 each refuse in their own words, and the page shows them instead of a broken form. Proven against a real engine: mint, list, revoke, revoked_at, and the wrong-bearer refusal. artifact: dfee2438b6 user: dmestas
10:31
settings: mint and revoke worker tokens at the engine (dagnats#627) closed check-in: 01b8f2847b user: dmestas tags: workertokens-1
10:25
land ymlci-1 check-in: 9961552b6c user: dmestas tags: trunk
10:25 • Edit [9961552b6c]: Add "landing" with value "5565ba15f855ae219477659ba1077eac6e9367be8b13dfbc9ddd65847099a7e6". artifact: fb0694c266 user: dmestas
10:25 • Reply: ci/*.yml and ci/*.yaml are pipelines now, beside the native JSON. A yml pipeline goes through the engine's CI door — POST /v1/ci/compile, register in the same call (dagnats#633, shipped) — never POST /workflows, so core dagnats stays spec-agnostic and the engine stays the schema authority: its diagnostics come back worded as it wrote them, with line numbers. Named by file stem, since the spec language has no name field; an engine predating #633 is named honestly rather than mistaken for a bad spec. Proven live: ci/check.yml compiled, registered, ran green beside ci/test.json on the same check-in. artifact: 718d5e16a9 user: dmestas
10:25 • Edit [9393440642]: Mark "Closed". artifact: 3ee8c908a8 user: dmestas
10:24 • Post: ci/*.yml and ci/*.yaml are pipelines now, beside the native JSON. A yml pipeline goes through the engine's CI door — POST /v1/ci/compile, register in the same call (dagnats#633, shipped) — never POST /workflows, so core dagnats stays spec-agnostic and the engine stays the schema authority: its diagnostics come back worded as it wrote them, with line numbers. Named by file stem, since the spec language has no name field; an engine predating #633 is named honestly rather than mistaken for a bad spec. Proven live: ci/check.yml compiled, registered, ran green beside ci/test.json on the same check-in. artifact: 5565ba15f8 user: dmestas
10:24
ci: ci.yml pipelines through the engine's CI door (dagnats#633) closed check-in: 9393440642 user: dmestas tags: ymlci-1
10:19
land autoland-1 check-in: 3034dcbd86 user: dmestas tags: trunk
10:19 • Edit [3034dcbd86]: Add "landing" with value "9009db21802de8fb1c3e7fda1f0b8826d1248a84604993a6bcfd27970652d70e". artifact: 8835e00928 user: dmestas
10:19 • Reply: Auto-land: a decider with the check-in capability can arm an open landing to accept itself once every required check on its target is green — the decision made now, executed when the machine agrees. The armed set is forge-local OLTP beside the check rules; a 30s sweep tries each armed record through landing.accept's one write path AS the arming account, so protection and the required set gate at fire time exactly as a button press would. Red checks, conflicts, or lost protection leave the arm in place and the page says why; a record settled by another hand disarms quietly. Proven live: red check, armed, fix pushed, landed itself on the next sweep. artifact: 0ae87110c5 user: dmestas
10:19 • Edit [9310962151]: Mark "Closed". artifact: 87455bd69a user: dmestas
10:19 • Post: Auto-land: a decider with the check-in capability can arm an open landing to accept itself once every required check on its target is green — the decision made now, executed when the machine agrees. The armed set is forge-local OLTP beside the check rules; a 30s sweep tries each armed record through landing.accept's one write path AS the arming account, so protection and the required set gate at fire time exactly as a button press would. Red checks, conflicts, or lost protection leave the arm in place and the page says why; a record settled by another hand disarms quietly. Proven live: red check, armed, fix pushed, landed itself on the next sweep. artifact: 9009db2180 user: dmestas
10:19
landings: land when green (RFC 0009 verdicts follow-through) closed check-in: 9310962151 user: dmestas tags: autoland-1
10:06
land loglane-1 check-in: 4ee4629aee user: dmestas tags: trunk
10:06 • Edit [4ee4629aee]: Add "landing" with value "bad2e27a94b7b41af6c473f79305ea7d9deb00d36c1b5ef8a0c2add4485f5f2f". artifact: 1b882f1c24 user: dmestas
10:06 • Reply: dagnats#624 shipped a different tail API than the interim guess: {chunks, next_cursor, eof} with base64 data, cursor paging, and a strict from=failure that 404s when the attempt has no failure marker. The engine client now reads all three generations — shipped wrapper, interim bare array, pre-#624 run-document catch-all — and falls back from the strict 404 to the whole step. Proven live end to end: worker log writers stream real suite output, the poller drains it beside the verdict, the failure page shows tinted stderr and the failure marker. Polish from that run: a step an earlier failure kept from dispatching reads 'not run' and sinks below the executed steps instead of claiming 'pending' forever, and the Runners note reflects #627 shipping. artifact: 761adf4e82 user: dmestas
10:06 • Edit [3ef35f90dd]: Mark "Closed". artifact: 831e845b18 user: dmestas
10:06 • Post: dagnats#624 shipped a different tail API than the interim guess: {chunks, next_cursor, eof} with base64 data, cursor paging, and a strict from=failure that 404s when the attempt has no failure marker. The engine client now reads all three generations — shipped wrapper, interim bare array, pre-#624 run-document catch-all — and falls back from the strict 404 to the whole step. Proven live end to end: worker log writers stream real suite output, the poller drains it beside the verdict, the failure page shows tinted stderr and the failure marker. Polish from that run: a step an earlier failure kept from dispatching reads 'not run' and sinks below the executed steps instead of claiming 'pending' forever, and the Runners note reflects #627 shipping. artifact: bad2e27a94 user: dmestas
10:06
ci: read the shipped #624 log lane; not-run steps say so closed check-in: 3ef35f90dd user: dmestas tags: loglane-1
09:34
land premerge-zit020 check-in: e9ef3c0943 user: dmestas tags: trunk
09:34 • Edit [e9ef3c0943]: Add "landing" with value "869b54ffcc30e07002569674ac6ea723946dbbca600a4a001cd6d94fb3524b52". artifact: ffb78bb085 user: dmestas
09:34 • Reply: zit 0.2.0 opens the working tree during clone, so premerge's explicit open of the target tip now fails with 'already open'. Fall back to zit update when open refuses; older zits keep the open path. Restores TestPrepareMergesWithoutTouchingTheLedger. artifact: 9dd208efc8 user: dmestas
09:34 • Edit [9fdc152c20]: Mark "Closed". artifact: 08542477a6 user: dmestas
09:34 • Post: zit 0.2.0 opens the working tree during clone, so premerge's explicit open of the target tip now fails with 'already open'. Fall back to zit update when open refuses; older zits keep the open path. Restores TestPrepareMergesWithoutTouchingTheLedger. artifact: 869b54ffcc user: dmestas
09:34
premerge: zit 0.2.0 clone auto-opens; update to target closed check-in: 9fdc152c20 user: dmestas tags: premerge-zit020
09:32
land logview-4 check-in: e0b676c7d4 user: dmestas tags: trunk
09:32 • Edit [e0b676c7d4]: Add "landing" with value "f1eb0e3410c41c5f2334ab1474650cd8642c477dfc905943caf3d72dc51b7f0c". artifact: 3d0aed5856 user: dmestas
09:32 • Reply: Log viewer rung 4: runs carry labels (repo, checkin, branch, pipeline — dagnats#629), and a new check-in on a branch cancels the branch's still-running builds before launching its own. Cancellation is label-verified per run against the run's own document, so an engine that predates #629 — or one whose bounded list scan drops the labeled runs (filed as dagnats#659) — supersedes nothing rather than cancelling the wrong thing. Proven live: paused worker, two check-ins, first run cancelled, second completed. artifact: 8a1b65479d user: dmestas
09:32 • Edit [c811b34538]: Mark "Closed". artifact: 95102d4fe3 user: dmestas
09:32
land logview-3 check-in: 1e10e311f2 user: dmestas tags: trunk
09:32 • Edit [1e10e311f2]: Add "landing" with value "4d9b1e4733f50dc33efc19fe1a71c1371e991bd1662a5e4df5373333a9070dd0". artifact: f737f6d5fd user: dmestas
09:32 • Reply: Log viewer rung 3: a running run's page follows itself — Datastar polls a frag that morphs the step region, the no-script baseline stays a plain reload (RFC 0001 Principle 3); the drained record now carries the page even when the engine has forgotten the run (steps rebuilt from chunks, failure markers honoured); Settings gains a read-only Runners table from GET /v1/workers (dagnats#628), with registration tokens noted as pending #627. artifact: 654f7e9617 user: dmestas
09:32 • Edit [9e1d3d220b]: Mark "Closed". artifact: 1297e2b3cc user: dmestas
09:32 • Reply: Log viewer rung 4: runs carry labels (repo, checkin, branch, pipeline — dagnats#629), and a new check-in on a branch cancels the branch's still-running builds before launching its own. Cancellation is label-verified per run against the run's own document, so an engine that predates #629 — or one whose bounded list scan drops the labeled runs (filed as dagnats#659) — supersedes nothing rather than cancelling the wrong thing. Proven live: paused worker, two check-ins, first run cancelled, second completed. artifact: f246a60623 user: dmestas
09:32
land logview-2 check-in: 76cb624a71 user: dmestas tags: trunk
09:32 • Edit [76cb624a71]: Add "landing" with value "d4f2d607d8dd70fa36064a53024cfd051c506ef42bb1bf91c39ffa3b646e458a". artifact: 553693c759 user: dmestas
09:32 • Reply: Log viewer rung 2: retention is the forge's (RFC 0009 §logs as amended) — on a run's terminal transition the poller drains every step's chunks into one object beside the verdict (data/<repo>/ci-logs/<runID>.json), and the run page reads the drained record FIRST, engine second: a run whose hot lane expired, or whose engine is gone, still shows its logs. Engines predating dagnats#624 leave nothing to drain, silently. artifact: bf1ab2544d user: dmestas
09:32 • Edit [500cbc37ec]: Mark "Closed". artifact: 7403d4eb2d user: dmestas
09:32 • Reply: Log viewer rung 3: a running run's page follows itself — Datastar polls a frag that morphs the step region, the no-script baseline stays a plain reload (RFC 0001 Principle 3); the drained record now carries the page even when the engine has forgotten the run (steps rebuilt from chunks, failure markers honoured); Settings gains a read-only Runners table from GET /v1/workers (dagnats#628), with registration tokens noted as pending #627. artifact: a387e90e6a user: dmestas
09:32
land logview-1 check-in: 65392b20c8 user: dmestas tags: trunk
09:32 • Edit [65392b20c8]: Add "landing" with value "6ef6d8b667611b8d46200cc5e704827f8416e8703f34b054be89ece98e0117bc". artifact: 521bdefc05 user: dmestas
09:32 • Reply: Log viewer rung 1: /r/{repo}/ci/run/{id} — step list in dispatch order with #626 durations, failed steps open with their chunks (stderr tinted, failure markers recorded), line permalinks, a printed repro line, and every absence said in words (no engine · engine predates dagnats#624 · no output). The engine client speaks the #624 contract and reads pre-#624 binaries as 'no logs yet'. Checks-panel run links land here. artifact: 36d509e14a user: dmestas
09:32 • Edit [8ba9079b8a]: Mark "Closed". artifact: 3dcf076424 user: dmestas
09:32 • Reply: Log viewer rung 2: retention is the forge's (RFC 0009 §logs as amended) — on a run's terminal transition the poller drains every step's chunks into one object beside the verdict (data/<repo>/ci-logs/<runID>.json), and the run page reads the drained record FIRST, engine second: a run whose hot lane expired, or whose engine is gone, still shows its logs. Engines predating dagnats#624 leave nothing to drain, silently. artifact: d4d35d1af9 user: dmestas
09:31
ci: cancelled is stopped, not broken closed check-in: c811b34538 user: dmestas tags: logview-4
09:27 • Post: Log viewer rung 4: runs carry labels (repo, checkin, branch, pipeline — dagnats#629), and a new check-in on a branch cancels the branch's still-running builds before launching its own. Cancellation is label-verified per run against the run's own document, so an engine that predates #629 — or one whose bounded list scan drops the labeled runs (filed as dagnats#659) — supersedes nothing rather than cancelling the wrong thing. Proven live: paused worker, two check-ins, first run cancelled, second completed. artifact: f1eb0e3410 user: dmestas
09:27
ci: label runs, cancel superseded builds (dagnats#629) check-in: d2254065fd user: dmestas tags: logview-4
09:10
rfc 0010: local mode — quarry ui behind zit ui check-in: 2770cb7a21 user: dmestas tags: trunk
02:27
oltp: guard that an existing store still opens — schema indexes must not name a migrated column check-in: 160b95601d user: dmestas tags: trunk
02:18
ci: run page audit fixes — honest step words, tight lines, drained repro closed check-in: 9e1d3d220b user: dmestas tags: logview-3
02:16
ci: create the pair index after the migration adds the column, not beside CREATE TABLE check-in: 16f8e171bc user: dmestas tags: trunk
02:15 • Post: Log viewer rung 3: a running run's page follows itself — Datastar polls a frag that morphs the step region, the no-script baseline stays a plain reload (RFC 0001 Principle 3); the drained record now carries the page even when the engine has forgotten the run (steps rebuilt from chunks, failure markers honoured); Settings gains a read-only Runners table from GET /v1/workers (dagnats#628), with registration tokens noted as pending #627. artifact: 4d9b1e4733 user: dmestas
02:15
ci: live-follow the running run; drained record outlives the engine; runners listed check-in: 6738b4579f user: dmestas tags: logview-3
02:11 • Post: Log viewer rung 2: retention is the forge's (RFC 0009 §logs as amended) — on a run's terminal transition the poller drains every step's chunks into one object beside the verdict (data/<repo>/ci-logs/<runID>.json), and the run page reads the drained record FIRST, engine second: a run whose hot lane expired, or whose engine is gone, still shows its logs. Engines predating dagnats#624 leave nothing to drain, silently. artifact: d4f2d607d8 user: dmestas
02:11
ci: drain finished runs' logs beside the verdict closed check-in: 500cbc37ec user: dmestas tags: logview-2
02:08
ci: run page — one no-logs answer per render; no 'took 0s' closed check-in: 8ba9079b8a user: dmestas tags: logview-1
02:06 • Post: Log viewer rung 1: /r/{repo}/ci/run/{id} — step list in dispatch order with #626 durations, failed steps open with their chunks (stderr tinted, failure markers recorded), line permalinks, a printed repro line, and every absence said in words (no engine · engine predates dagnats#624 · no output). The engine client speaks the #624 contract and reads pre-#624 binaries as 'no logs yet'. Checks-panel run links land here. artifact: 6ef6d8b667 user: dmestas
02:06
ci: the run page — steps, durations, logs, repro check-in: 8efa1b4744 user: dmestas tags: logview-1
01:56
land rfc-logs check-in: f49807c00a user: dmestas tags: trunk
01:56 • Edit [f49807c00a]: Add "landing" with value "97265eafb79b27f80871fc86262a108afb39fab378d9da173a7a71fcaed99c74". artifact: 0a1da69191 user: dmestas
01:56 • Reply: RFC 0009 §logs amendment: dagnats owns the hot lane and the contract (BUILD_LOGS, chunk schema, tail API, failure markers, drain-on-terminal-event); retention is quarry's — logs stored beside the verdict, S3 target as configuration. Records dagnats#624's rescope; notes #626 shipped. artifact: 176eec38e0 user: dmestas
01:56 • Edit [d477ca4620]: Mark "Closed". artifact: 1ddbc84c55 user: dmestas
01:56 • Post: RFC 0009 §logs amendment: dagnats owns the hot lane and the contract (BUILD_LOGS, chunk schema, tail API, failure markers, drain-on-terminal-event); retention is quarry's — logs stored beside the verdict, S3 target as configuration. Records dagnats#624's rescope; notes #626 shipped. artifact: 97265eafb7 user: dmestas
01:56
rfc 0009: logs split at the engine's edge (dagnats#624 rescope) closed check-in: d477ca4620 user: dmestas tags: rfc-logs
01:50
land ci-7 check-in: 572f7dcbf4 user: dmestas tags: trunk
01:50 • Edit [572f7dcbf4]: Add "landing" with value "306fff06ed4cbe9a072a34746b463b65fa02bf6b4eff4be1a7ac29f151f6e39b". artifact: abdd92f877 user: dmestas
01:50 • Reply: Rung 7: the card answers 'should I update?' — a 'trunk has moved' row counts the check-ins this branch has not seen (index.Behind walks the DAG), and Update from trunk is offered only when clean AND behind: a verb that would do nothing is not offered, and one that would conflict never was. artifact: acc87d4c53 user: dmestas
01:50 • Edit [c9fd67b3b7]: Mark "Closed". artifact: 4929c810c5 user: dmestas
01:50
land ci-6 check-in: 6284e87495 user: dmestas tags: trunk
01:50 • Edit [6284e87495]: Add "landing" with value "52b7f544062351f82b1c6e469fe387846a0d87f00d178db80c3e9ebbeedecded". artifact: dc74aeb048 user: dmestas
01:50 • Reply: Rung 6: the decision card — checks roll-up, mergeability, protection and the verbs in one merge-box card; folded when green, open when not. Details: wiki checkin/b3ad657cf8eb. artifact: 7c405c0faf user: dmestas
01:50 • Edit [b3ad657cf8]: Mark "Closed". artifact: d6b1e13f93 user: dmestas
01:50 • Reply: Rung 7: the card answers 'should I update?' — a 'trunk has moved' row counts the check-ins this branch has not seen (index.Behind walks the DAG), and Update from trunk is offered only when clean AND behind: a verb that would do nothing is not offered, and one that would conflict never was. artifact: 57aaf88536 user: dmestas
01:50
land ci-5 check-in: 3c7db7e536 user: dmestas tags: trunk
01:50 • Edit [3c7db7e536]: Add "landing" with value "813310c1a5a888e6e037503594d1cd3d1f997bcaf8dc4a0c2a563f73b709aced". artifact: 12000d99ed user: dmestas
01:50 • Reply: Rung 5: verdict tags are a per-repo setting (fleet default via --ci-verdicts); premerge pair verdicts carry onto the accept's merge check-in via the fold hook, once, tags-mode gated. Details: wiki checkin/d36be0ef0283. artifact: f0a0326c03 user: dmestas
01:50 • Edit [92233fd802]: Mark "Closed". artifact: ce60a8848c user: dmestas
01:50 • Reply: Rung 6: the decision card — checks roll-up, mergeability, protection and the verbs in one merge-box card; folded when green, open when not. Details: wiki checkin/b3ad657cf8eb. artifact: 8383188b11 user: dmestas
01:50
merge trunk closed check-in: 92233fd802 user: dmestas tags: ci-5
01:49
land ci-4 check-in: 7932145520 user: dmestas tags: trunk
01:49 • Edit [7932145520]: Add "landing" with value "1768777e3a0646cc0be58c8277441b824e60e57cd6cf588222639415cd2dfbc6". artifact: 6aa47a0def user: dmestas
01:49 • Reply: Rung 4: premerge — checkout helper (never commits, autosync off, ledger-invariant tested), pair-keyed runs and reports, per-branch premerge mode gating panel and accept. Details: wiki checkin/2dfd42319fc0. artifact: 629a7c5c64 user: dmestas
01:49 • Edit [2dfd42319f]: Mark "Closed". artifact: e57774f280 user: dmestas
01:49 • Reply: Rung 5: verdict tags are a per-repo setting (fleet default via --ci-verdicts); premerge pair verdicts carry onto the accept's merge check-in via the fold hook, once, tags-mode gated. Details: wiki checkin/d36be0ef0283. artifact: 7b46443fc0 user: dmestas
01:49
land ci-3 check-in: 60726f18bb user: dmestas tags: trunk
01:49 • Edit [60726f18bb]: Add "landing" with value "6e89eb916f4ca77f09c812478903851dc7aa2d01ef8221c25b288e40db7edf9d". artifact: 89653a190f user: dmestas
01:49 • Reply: Rung 3 of RFC 0009: the doors. artifact: 12362beadf user: dmestas
01:49 • Edit [d4621cf095]: Mark "Closed". artifact: 0b89204134 user: dmestas
01:49 • Reply: Rung 4: premerge — checkout helper (never commits, autosync off, ledger-invariant tested), pair-keyed runs and reports, per-branch premerge mode gating panel and accept. Details: wiki checkin/2dfd42319fc0. artifact: e3de63e553 user: dmestas
01:49
merge trunk closed check-in: d4621cf095 user: dmestas tags: ci-3
01:48
land ci-2 check-in: 6ce967a4db user: dmestas tags: trunk
01:48 • Edit [6ce967a4db]: Add "landing" with value "26fe00771a3323ad067cbf4ae783aff5d150950a8273f5e97d43348dd0f0a031". artifact: 4a5a66bfc8 user: dmestas
01:48 • Reply: Rung 2 of RFC 0009: the accept gets its evidence. artifact: fc21fd7523 user: dmestas
01:48 • Edit [4e8bb73332]: Mark "Closed". artifact: 1479e0a74b user: dmestas
01:48 • Reply: Rung 3 of RFC 0009: the doors. artifact: 7160633a0b user: dmestas
01:48
merge trunk closed check-in: 4e8bb73332 user: dmestas tags: ci-2
01:46
land ci-rfc check-in: 75c0ffe751 user: dmestas tags: trunk
01:46 • Edit [75c0ffe751]: Add "landing" with value "5f53d12574407c2436654ea928e5503a3bd49bb991306e7289737f5768b169c3". artifact: f5703c6178 user: dmestas
01:46 • Reply: RFC 0009: CI for quarry. artifact: a84da214fe user: dmestas
01:46 • Edit [56d87626d9]: Mark "Closed". artifact: b657649a3e user: dmestas
01:46 • Reply: Rung 2 of RFC 0009: the accept gets its evidence. artifact: 72099b7f54 user: dmestas
01:44 • Post: Rung 7: the card answers 'should I update?' — a 'trunk has moved' row counts the check-ins this branch has not seen (index.Behind walks the DAG), and Update from trunk is offered only when clean AND behind: a verb that would do nothing is not offered, and one that would conflict never was. artifact: 306fff06ed user: dmestas
01:44
ci: say when the target moved; offer update only then closed check-in: c9fd67b3b7 user: dmestas tags: ci-7
01:29 • Post: Rung 6: the decision card — checks roll-up, mergeability, protection and the verbs in one merge-box card; folded when green, open when not. Details: wiki checkin/b3ad657cf8eb. artifact: 52b7f54406 user: dmestas
01:29 • Added wiki page "checkin/b3ad657cf8eb9747a1e867a55aead92712f7aed3dc2d13de59aee93d89b88097" artifact: 704de304de user: dmestas
01:29
ci: the decision card closed check-in: b3ad657cf8 user: dmestas tags: ci-6
01:22
ci: checks panel wraps and orders for attention check-in: 36b81060d6 user: dmestas tags: ci-5
01:14
settings: every panel confirms the same way, in the palette's green

The description form got a Save/Saved swap; the other panels still said nothing at all. Worse, three of them redirected to ?saved=1, which had quietly stopped meaning anything when the flash cookie replaced it — a regression I left behind an hour ago. Six exit paths across five handlers were still writing it.

They all set a named flash now. The name matters: a page carries six Save buttons, and a bare boolean would light every one of them for a single save, telling the reader that everything was written when one thing was.

Green comes from --add, the token that already marks a passing run and an open glyph, so 'it worked' is one colour across the forge.

Webhooks is deliberately untouched: it is a LIST with Save, Pause and Delete per row, so lighting 'the' Save would need to know which row. Different shape, not this pattern.

The visibility test pinned ?saved=1; it now asserts the flash, which is the contract rather than the spelling of a mechanism. check-in: 2f0c4fcb50 user: dmestas tags: trunk

01:09 • Post: Rung 5: verdict tags are a per-repo setting (fleet default via --ci-verdicts); premerge pair verdicts carry onto the accept's merge check-in via the fold hook, once, tags-mode gated. Details: wiki checkin/d36be0ef0283. artifact: 813310c1a5 user: dmestas
01:09 • Added wiki page "checkin/d36be0ef02834d05a8c654bb0ab90985619dd3593e2d09b1e49930fa8af014f0" artifact: a7c9320467 user: dmestas
01:09
ci: verdict tags opt-in per repo; premerge verdicts carry onto the merge check-in: d36be0ef02 user: dmestas tags: ci-5
01:04 • Post: Rung 4: premerge — checkout helper (never commits, autosync off, ledger-invariant tested), pair-keyed runs and reports, per-branch premerge mode gating panel and accept. Details: wiki checkin/2dfd42319fc0. artifact: 1768777e3a user: dmestas
01:04 • Added wiki page "checkin/2dfd42319fc08f68643dbf0c24e8a315269281f47632320f15574ac18fea2391" artifact: 433c2b11c6 user: dmestas
01:04
ci: premerge — checkout helper, pair-keyed runs, per-branch mode closed check-in: 2dfd42319f user: dmestas tags: ci-4
01:01
settings: the save confirms on the button, not in the page

The inline word had to appear and then leave, which is two layout shifts around the control just pressed. On the button there are none: both labels share one grid cell, so it is sized by the wider of them and nothing moves when they swap.

The revert is CSS on the same four-second beat, because without script the label must still find its way back to Save. The announcement stays — sr-only, role=status — since a screen reader cannot read a button relabelling itself as an event. Reduced motion keeps the word and drops the movement. check-in: d28f1388fe user: dmestas tags: trunk

00:55 • Post: Rung 3 of RFC 0009: the doors. artifact: 6e89eb916f user: dmestas
00:55
ci: check.report, reporter tokens, ci.trigger check-in: 28eeb18515 user: dmestas tags: ci-3
00:54
settings: the save's confirmation has a lifetime, and is spent once

Three faults in one paragraph. It never left: a confirmation is an EVENT, and rendering it as page content claims the page CONTAINS the fact of having been saved, which is only true for a moment. A reload replayed it: ?saved=1 stays in the address bar, so a refresh — or a bookmark — congratulated the reader for a save from hours ago. And it shifted the layout under the button just pressed.

A one-shot cookie now carries the word across the redirect and is spent on arrival, so the URL stays clean and the second render is silent. The lifetime is CSS: it holds four seconds, then fades AND collapses, so no empty paragraph is left behind. Not script — this page must behave the same without JavaScript, and an animation costs nothing when the script is absent. role=status announces it on insert, before any of that runs.

Reduced motion keeps the message and drops the animation: someone asking for less movement is not asking to be told less. check-in: 563eb933dd user: dmestas tags: trunk

00:45
drop unrelated formatting churn from three web files check-in: 67a13adccf user: dmestas tags: ci-2
00:44 • Post: Rung 2 of RFC 0009: the accept gets its evidence. artifact: 26fe00771a user: dmestas
00:44
ci: checks panel, required checks, override with a reason check-in: 5d0f1de4c6 user: dmestas tags: ci-2
00:35
settings: save the description in place when Datastar is present

The form keeps its method and action, so without the script it posts and redirects exactly as before — the data-on:submit attribute is inert (0001 Principle 3). With the script it posts to the SAME endpoint, which answers a Datastar-Request with a patch of the panel instead of a page: the same discrimination the board's move already uses.

The panel is one template block, drawn by the page and re-drawn by the save, so the two cannot drift — the fault this page had an hour ago. Its 'Saved.' now sits beside the control that saved, not at the top of a page the reader has scrolled away from, and the refusal travels with the panel as PanelError rather than as the page-wide Error.

The URL is deliberately left alone on the patched path. ?saved=1 exists to carry a word across a navigation; there is no navigation here, and putting it in the address bar would make a later reload announce a save that already happened. check-in: bbd1663825 user: dmestas tags: trunk

00:26 • Post: RFC 0009: CI for quarry. artifact: 5f53d12574 user: dmestas
00:26
rfc 0009: CI — verdicts on landings, spec, premerge, runners closed check-in: 56d87626d9 user: dmestas tags: ci-rfc
00:07
settings: saving no longer empties the page

The description form rendered the settings page from seven fields of its own while the GET built a dozen panels, so Save returned a page with everything below the form gone — and a stray h1, because the POST also missed HideH1. Two symptoms, one cause: the same page assembled in two places.

There is one builder now, and the successful save REDIRECTS, as every other settings POST already did. That leaves the saved state in one place, so the two cannot disagree again and a reload does not re-submit. The refusal path still comes back holding what the reader typed — now over the whole page rather than a fragment of it.

Verified: after a save the page is byte-equivalent to the GET but for the Saved flash, with all nine panels present. check-in: d2368f6a92 user: dmestas tags: trunk