Skip to content
quarry Today In History
Login

Today In History

This Day In History For 2027-09-23

1 Year Ago (more context)

2026-09-23
23:28 • Edit [ab6a1a60f6]: Add "ci-pass" with value "8a475bc38f796bcb86ee7e005d476dbf". artifact: 01b6e0c6ad user: quarry
23:27 • Edit [e2ac247c7e]: Add "ci-pass" with value "ddcebda76e52732e5915b5ffb959ae37". artifact: d3f30da655 user: quarry
23:27
land the-forges-own-accept-is-not-a-bypass check-in: ab6a1a60f6 user: dmestas tags: trunk
23:27 • Edit [ab6a1a60f6]: Add "landing" with value "8385d2013eb0fb5370508e8ca9f1a330d352c0e437d1360f5b3410bf3070e94d". artifact: ffec35a63b user: quarry
23:27 • Reply: Accepted landings were flagged as pushes past the gate artifact: 07bc8e103b user: dmestas
23:27 • Edit [634b2667ed]: Mark "Closed". artifact: 2dd82c12b2 user: quarry
23:27
land pages-say-only-what-they-have check-in: e2ac247c7e user: dmestas tags: trunk
23:27 • Edit [e2ac247c7e]: Add "landing" with value "4839d5f92c3c1538b778aa5a485c3cad54c8c3301e040814d4f2db2bd4768827". artifact: 0c388aea22 user: quarry
23:27 • Reply: Stray separators, broken lines and shouted branch names artifact: 959eb4dc80 user: dmestas
23:27 • Edit [6b8660eefc]: Mark "Closed". artifact: ce7b1e2b2c user: quarry
23:14 • Edit [634b2667ed]: Add "ci-pass" with value "3ed2f714bb362e3ee10481bc3da7cb92". artifact: 5fc3f9d4e0 user: quarry
23:13 • Post: Accepted landings were flagged as pushes past the gate artifact: 8385d2013e user: zeitgeist
23:13
The forge's own accept is not a bypass: record it before closing tickets, and let the gate wait a minute before flagging closed check-in: 634b2667ed user: zeitgeist tags: the-forges-own-accept-is-not-a-bypass
23:10 • Edit [6b8660eefc]: Add "ci-pass" with value "50d2a630aec52c9ef416b0a84e5250b8". artifact: 450535957f user: quarry
23:09 • Post: Stray separators, broken lines and shouted branch names artifact: 4839d5f92c user: zeitgeist
23:09
Pages say only what they have: no stray separators, forms out of paragraphs, branch names keep their case closed check-in: 6b8660eefc user: zeitgeist tags: pages-say-only-what-they-have
22:29 • Edit [4c9b5a951d]: Add "ci-pass" with value "9b149b8472800d306c1224ed4388f231". artifact: 49cc361944 user: quarry
22:20
land margins-on-the-same-scale check-in: 4c9b5a951d user: dmestas tags: trunk
22:20 • Edit [4c9b5a951d]: Add "landing" with value "31d074cf81f51b7182f4e793e20dd30c95e22cff607f27f9b82f7d7bfa3c4452". artifact: 9876415b56 user: quarry
22:20 • Reply: Design pass, fourth landing. Margins were the last spacing property off the scale: 351 values move to their nearest --sp step (ties to the tighter), negatives, auto and calc/min/max/clamp untouched; TestSpaceStaysOnTheScale now covers margins too. Also a fix to the first landing: the Plex fonts were appended to the 'Third-party components' list, which says quarry LINKS those modules and counted them as one; they now have their own short 'Served to your browser' section with the OFL text, and the module count is back to 35. Compared old vs new builds on quarry's data, 21 pages, light/dark, desktop/phone: no layout moved beyond headings stepping down as the type scale intends. artifact: da1f7bf923 user: dmestas
22:20 • Edit [d793ddefe1]: Mark "Closed". artifact: 61521dc6cf user: quarry
22:20
land space-and-corners-on-one-scale check-in: 3074a45dd3 user: dmestas tags: trunk
22:20 • Edit [3074a45dd3]: Add "landing" with value "93df4fc0edf7fa0de6418629e97c6e50caf10506be6f03578f5532a0112fcd3b". artifact: 87ca76cd6b user: quarry
22:20 • Reply: Design pass, third landing. The stylesheet had 187 distinct paddings and 32 radii. Every padding and gap (840 values) now uses the existing --sp scale plus two new steps (--sp-0 2px for chip and code-span padding, --sp-7 48px), and every radius (123) the existing --r scale; each value went to its nearest step, ties to the tighter one, so nothing got roomier by accident; calc(), 0, % and em values are untouched. TestSpaceStaysOnTheScale keeps it there. Two fixes found by comparing screenshots: the home dashboard's 'Your recent work' sat flush under the New repository button (.dash h2 outranked .dash-mine-h), and Settings > 'Anyone signed in may also' ran its four checkboxes together as one sentence on a phone; each is now its own line. Compared old vs new builds on quarry's data: 11 anonymous + 10 signed-in pages, light and dark, desktop and phone; layouts unchanged apart from those two. Margins are the remaining unscaled property and come next. artifact: e1a7a27219 user: dmestas
22:20 • Edit [996443d88c]: Mark "Closed". artifact: 042517ab0b user: quarry
22:20 • Reply: Design pass, fourth landing. Margins were the last spacing property off the scale: 351 values move to their nearest --sp step (ties to the tighter), negatives, auto and calc/min/max/clamp untouched; TestSpaceStaysOnTheScale now covers margins too. Also a fix to the first landing: the Plex fonts were appended to the 'Third-party components' list, which says quarry LINKS those modules and counted them as one; they now have their own short 'Served to your browser' section with the OFL text, and the module count is back to 35. Compared old vs new builds on quarry's data, 21 pages, light/dark, desktop/phone: no layout moved beyond headings stepping down as the type scale intends. artifact: 3e5539ddda user: dmestas
22:20
land the-ticket-list-reads-evenly check-in: 8262ceb2f9 user: dmestas tags: trunk
22:20 • Edit [8262ceb2f9]: Add "landing" with value "eba4ee20328e5cbfc64af869404b347468acb20a2d816e456ac2c26edb70072b". artifact: 21f4f44fb4 user: quarry
22:20 • Reply: Design pass, the ticket list. (1) Regression from today's new-ticket form: its .chip rule (2.15rem touch height, 0.8rem padding, pointer cursor) was unscoped, so every static label chip on the site grew to 36px, taller than the ticket title beside it. The form's chip rules now live under .tn-chips; TestOnlyTheFormsChipsAreControls keeps the site-wide .chip a label. (2) Chips show field values as words: Feature_Request reads Feature Request, Code_Defect Code Defect. Display only; filters keep stored values. (3) The filter field and the six filter selects were 32 and 24 px tall with ad-hoc padding; both are now 2.25rem, radius --r-2, spacing on the --sp scale. Checked in a local build on quarry's own data, desktop, both themes. Stacked on one-typeface-and-a-type-scale. artifact: 4674622e6c user: dmestas
22:20 • Edit [596ad1aa3b]: Mark "Closed". artifact: ed06c104b4 user: quarry
22:20 • Reply: Design pass, third landing. The stylesheet had 187 distinct paddings and 32 radii. Every padding and gap (840 values) now uses the existing --sp scale plus two new steps (--sp-0 2px for chip and code-span padding, --sp-7 48px), and every radius (123) the existing --r scale; each value went to its nearest step, ties to the tighter one, so nothing got roomier by accident; calc(), 0, % and em values are untouched. TestSpaceStaysOnTheScale keeps it there. Two fixes found by comparing screenshots: the home dashboard's 'Your recent work' sat flush under the New repository button (.dash h2 outranked .dash-mine-h), and Settings > 'Anyone signed in may also' ran its four checkboxes together as one sentence on a phone; each is now its own line. Compared old vs new builds on quarry's data: 11 anonymous + 10 signed-in pages, light and dark, desktop and phone; layouts unchanged apart from those two. Margins are the remaining unscaled property and come next. artifact: 265e4c1601 user: dmestas
22:20 • Edit [784cce40da]: Add "ci-pass" with value "48fc97081b23cc4dcaf956e89b010dc8". artifact: b880d0a20a user: quarry
22:20
land one-typeface-and-a-type-scale check-in: d49a499d09 user: dmestas tags: trunk
22:20 • Edit [d49a499d09]: Add "landing" with value "4e6182e7e3e36e41a658277efe09cb2ac2046872564cd89131387f148023e48d". artifact: c911c934e2 user: quarry
22:20 • Reply: First landing of the design pass dmestas approved. quarry is now set in IBM Plex Sans and Plex Mono (OFL-1.1, Latin-1 subsets, six files, ~120 KB), served from this origin under content-hashed URLs, cached a year, font-display swap; the licenses page credits them. The stylesheet had 68 distinct font sizes; every size is now one of seven tokens (--fs-xs 12, sm 13, md 14, body 15, base 16, lg 20, xl 28 px) or an em. Mapping kept each size within a pixel or two, so no layout moves. Headings get steps (h1 lg..xl clamp, h2 lg, h3 base); buttons and inputs take the page face; code/kbd/samp/pre the mono face; --mono, used by three rules but never defined, now is; weights 550/560/650 (no face) snap to 500/600. New tests: TestTypeStaysOnTheScale, TestFontFamiliesAreTokens, TestWeightsHaveAFace. The iOS zoom guard now checks the same threshold through the tokens. Compared old vs new builds on identical data, 11 pages x light/dark x desktop/phone: same layout, new face. Spacing, radii and page-by-page polish follow in their own landings. artifact: 6f31775062 user: dmestas
22:20 • Edit [dd751e78f2]: Mark "Closed". artifact: a88486caf5 user: quarry
22:20 • Reply: Design pass, the ticket list. (1) Regression from today's new-ticket form: its .chip rule (2.15rem touch height, 0.8rem padding, pointer cursor) was unscoped, so every static label chip on the site grew to 36px, taller than the ticket title beside it. The form's chip rules now live under .tn-chips; TestOnlyTheFormsChipsAreControls keeps the site-wide .chip a label. (2) Chips show field values as words: Feature_Request reads Feature Request, Code_Defect Code Defect. Display only; filters keep stored values. (3) The filter field and the six filter selects were 32 and 24 px tall with ad-hoc padding; both are now 2.25rem, radius --r-2, spacing on the --sp scale. Checked in a local build on quarry's own data, desktop, both themes. Stacked on one-typeface-and-a-type-scale. artifact: b7650d9d6b user: dmestas
22:19
land a-rejected-branch-is-answered-until-it-moves check-in: 784cce40da user: dmestas tags: trunk
22:19 • Edit [784cce40da]: Add "landing" with value "8f90d5906c31d7a3246003de3e1cfebdb6e4be839db3fc56d6806e5ab18821fb". artifact: 69367f7f53 user: quarry
22:19 • Reply: The landings page listed three rejected probe branches under 'work nobody has proposed'. branch.unproposed counted a rejected branch as unproposed again, so turned-down work read as work nobody had looked at. Now a branch whose newest landing was rejected is skipped while its tip is no newer than the rejecting reply; a check-in after the rejection is new work and lists it again. The index answers RejectedAt from the landing records and the settling post's date (the landing's newest landing has the last word: rejected then re-proposed reads open). Tested in the index; make check green. artifact: 70089ae6a4 user: dmestas
22:19 • Edit [148c44c917]: Mark "Closed". artifact: 8c5bb19a5d user: quarry
22:10 • Edit [d793ddefe1]: Add "ci-pass" with value "9ebec5735c6e55dae921a803977e11dc". artifact: 1f3ed75490 user: quarry
22:09 • Post: Design pass, fourth landing. Margins were the last spacing property off the scale: 351 values move to their nearest --sp step (ties to the tighter), negatives, auto and calc/min/max/clamp untouched; TestSpaceStaysOnTheScale now covers margins too. Also a fix to the first landing: the Plex fonts were appended to the 'Third-party components' list, which says quarry LINKS those modules and counted them as one; they now have their own short 'Served to your browser' section with the OFL text, and the module count is back to 35. Compared old vs new builds on quarry's data, 21 pages, light/dark, desktop/phone: no layout moved beyond headings stepping down as the type scale intends. artifact: 31d074cf81 user: zeitgeist
22:09
Margins on the same scale, and the fonts credited in their own licenses section closed check-in: d793ddefe1 user: zeitgeist tags: margins-on-the-same-scale
22:02 • Edit [996443d88c]: Add "ci-pass" with value "a72afa376daaa06575ea953c45b1b544". artifact: 0335e6c23d user: quarry
22:01 • Post: Design pass, third landing. The stylesheet had 187 distinct paddings and 32 radii. Every padding and gap (840 values) now uses the existing --sp scale plus two new steps (--sp-0 2px for chip and code-span padding, --sp-7 48px), and every radius (123) the existing --r scale; each value went to its nearest step, ties to the tighter one, so nothing got roomier by accident; calc(), 0, % and em values are untouched. TestSpaceStaysOnTheScale keeps it there. Two fixes found by comparing screenshots: the home dashboard's 'Your recent work' sat flush under the New repository button (.dash h2 outranked .dash-mine-h), and Settings > 'Anyone signed in may also' ran its four checkboxes together as one sentence on a phone; each is now its own line. Compared old vs new builds on quarry's data: 11 anonymous + 10 signed-in pages, light and dark, desktop and phone; layouts unchanged apart from those two. Margins are the remaining unscaled property and come next. artifact: 93df4fc0ed user: zeitgeist
22:01
Space and corners on one scale: every padding, gap and radius a token, and two layout fixes found by looking closed check-in: 996443d88c user: zeitgeist tags: space-and-corners-on-one-scale
21:55 • Edit [214eed92e3]: Add "ci-pass" with value "0434c4b4a20e6e3c5d043d9b7811181b". artifact: f531f3a1d9 user: quarry
21:54 • Post: A shared ticket number offers a choice artifact: 689767d7d2 user: dmestas
21:54
A shared ticket number offers a choice check-in: 214eed92e3 user: dmestas tags: a-shared-number-offers-a-choice
21:52 • Edit [e18ea18995]: Add "ci-pass" with value "1cc82f80714fc132dfbc45cedc275011". artifact: dc023ad331 user: quarry
21:52 • Edit [dc34ef3447]: Add "ci-pass" with value "edaf0122818295d1cd147f2ae8295cb0". artifact: 5bad0230b0 user: quarry
21:51
Create new branch named "a-shared-number-offers-a-choice" check-in: e18ea18995 user: dmestas tags: a-shared-number-offers-a-choice
21:51 • Edit [596ad1aa3b]: Add "ci-pass" with value "9e7e95e54dc15754f7979fe8019cec99". artifact: 53fae6390d user: quarry
21:50 • Post: A ticket is named by its number in prose artifact: 9fbf7ef2e0 user: dmestas
21:50
A ticket is named by its number in prose closed check-in: dc34ef3447 user: dmestas tags: a-ticket-is-named-by-its-number
21:50 • Post: Design pass, the ticket list. (1) Regression from today's new-ticket form: its .chip rule (2.15rem touch height, 0.8rem padding, pointer cursor) was unscoped, so every static label chip on the site grew to 36px, taller than the ticket title beside it. The form's chip rules now live under .tn-chips; TestOnlyTheFormsChipsAreControls keeps the site-wide .chip a label. (2) Chips show field values as words: Feature_Request reads Feature Request, Code_Defect Code Defect. Display only; filters keep stored values. (3) The filter field and the six filter selects were 32 and 24 px tall with ad-hoc padding; both are now 2.25rem, radius --r-2, spacing on the --sp scale. Checked in a local build on quarry's own data, desktop, both themes. Stacked on one-typeface-and-a-type-scale. artifact: eba4ee2032 user: zeitgeist
21:49
The ticket list reads evenly: label chips back to label size, field values as words, one height for the filter strip closed check-in: 596ad1aa3b user: zeitgeist tags: the-ticket-list-reads-evenly
21:47 • Edit [67204e6714]: Add "ci-pass" with value "c898dc52bc8c7678c50ed1616bc73725". artifact: 8a9032639e user: quarry
21:46
Create new branch named "a-ticket-is-named-by-its-number" check-in: 67204e6714 user: dmestas tags: a-ticket-is-named-by-its-number
21:45 • Edit [c7f1c6021a]: Add "ci-pass" with value "f5f423c060bb6546b24e6d22e6af2411". artifact: b8fc4b40a8 user: quarry
21:45 • Edit [dd751e78f2]: Add "ci-pass" with value "4744b393633ea50478d2047f6918ae75". artifact: 1241b8f1d4 user: quarry
21:44 • Post: Tickets carry their number artifact: 822bb44aa1 user: dmestas
21:44
Tickets carry their number closed check-in: c7f1c6021a user: dmestas tags: tickets-carry-their-number
21:43 • Post: First landing of the design pass dmestas approved. quarry is now set in IBM Plex Sans and Plex Mono (OFL-1.1, Latin-1 subsets, six files, ~120 KB), served from this origin under content-hashed URLs, cached a year, font-display swap; the licenses page credits them. The stylesheet had 68 distinct font sizes; every size is now one of seven tokens (--fs-xs 12, sm 13, md 14, body 15, base 16, lg 20, xl 28 px) or an em. Mapping kept each size within a pixel or two, so no layout moves. Headings get steps (h1 lg..xl clamp, h2 lg, h3 base); buttons and inputs take the page face; code/kbd/samp/pre the mono face; --mono, used by three rules but never defined, now is; weights 550/560/650 (no face) snap to 500/600. New tests: TestTypeStaysOnTheScale, TestFontFamiliesAreTokens, TestWeightsHaveAFace. The iOS zoom guard now checks the same threshold through the tokens. Compared old vs new builds on identical data, 11 pages x light/dark x desktop/phone: same layout, new face. Spacing, radii and page-by-page polish follow in their own landings. artifact: 4e6182e7e3 user: zeitgeist
21:43
One typeface and a seven-step type scale: IBM Plex served from the forge, every size a token, tests that keep it so closed check-in: dd751e78f2 user: zeitgeist tags: one-typeface-and-a-type-scale
21:40 • Edit [27a2e89233]: Add "ci-pass" with value "e7c59dc5f8d2567b9a1023cb6bc263b5". artifact: 392ca15cbe user: quarry
21:40
Create new branch named "tickets-carry-their-number" check-in: 27a2e89233 user: dmestas tags: tickets-carry-their-number
21:40 • Edit [354e0ceac5]: Add "ci-pass" with value "e3070aac14aa012f8dd8d69395a9b9f7". artifact: a570c8edb9 user: quarry
21:39 • Post: Tickets show their number artifact: 58432a60c7 user: dmestas
21:39
Tickets show their number closed check-in: 354e0ceac5 user: dmestas tags: tickets-show-their-number
21:35 • Edit [848ea107b2]: Add "ci-pass" with value "f530b0a99cc3a92f2789161fd88c324d". artifact: a8685a8724 user: quarry
21:34 • Edit [3361932cbc]: Add "ci-pass" with value "f10991bc57a895bcc8de69ddb30913af". artifact: 5eb7e7e18f user: quarry
21:34
Create new branch named "tickets-show-their-number" check-in: 848ea107b2 user: dmestas tags: tickets-show-their-number
21:33 • Post: Tickets are numbered artifact: eecd744e0d user: dmestas
21:33
Tickets are numbered closed check-in: 3361932cbc user: dmestas tags: tickets-are-numbered
21:28 • Edit [e6b3a6c834]: Add "ci-pass" with value "9b87e6c26b155f9f4756a06b7828193c". artifact: 46be3baea3 user: quarry
21:28
Create new branch named "tickets-are-numbered" check-in: e6b3a6c834 user: dmestas tags: tickets-are-numbered
21:26 • Edit [148c44c917]: Add "ci-pass" with value "dd1d9b434e53c2dbdf58b5a2d740d6a9". artifact: 1b3342e2b6 user: quarry
21:25 • Post: The landings page listed three rejected probe branches under 'work nobody has proposed'. branch.unproposed counted a rejected branch as unproposed again, so turned-down work read as work nobody had looked at. Now a branch whose newest landing was rejected is skipped while its tip is no newer than the rejecting reply; a check-in after the rejection is new work and lists it again. The index answers RejectedAt from the landing records and the settling post's date (the landing's newest landing has the last word: rejected then re-proposed reads open). Tested in the index; make check green. artifact: 8f90d5906c user: zeitgeist
21:25
A branch whose landing was rejected is not listed as unproposed until it gets new work closed check-in: 148c44c917 user: zeitgeist tags: a-rejected-branch-is-answered-until-it-moves
21:21 • Edit [7aec1e46e7]: Mark "Closed". artifact: 7b789c2406 user: dmestas
21:21 • Edit [6647182b21]: Mark "Closed". artifact: 60f3899eeb user: dmestas
21:21 • Edit [fb22c54754]: Mark "Closed". artifact: 4eaee7d9f7 user: dmestas
21:19 • Edit [287eee3060]: Add "ci-pass" with value "f4794337f7bf05c3514d4ba51bd6d1dd". artifact: 2a63be3f18 user: quarry
21:18 • Ticket [54c5175f90] Readable ticket identifiers: research complete, decision shelved status still Open with 2 other changes artifact: f0555f011c user: zeitgeist
21:18
land ticket-templates-read-once-per-tip check-in: 287eee3060 user: dmestas tags: trunk
21:18 • Edit [287eee3060]: Add "landing" with value "434cbcacb366e8ecc73ece3ce4181b4258214b092bb854976997106c4d25f232". artifact: 7f2c74fb76 user: quarry
21:18 • Reply: Ticket templates are read once per tip artifact: 135d29a9f9 user: dmestas
21:18 • Edit [2e5c5ffde4]: Mark "Closed". artifact: e3b4a5024c user: quarry
21:17
land a-strata-rung-is-one-line check-in: 403266a7ea user: dmestas tags: trunk
21:17 • Edit [403266a7ea]: Add "landing" with value "fca83e614f65e7468490322c869ae2a295192d1a13b878e509cedb6f9513d5af". artifact: 39d700e7d0 user: quarry
21:17 • Reply: A strata rung is one line artifact: ad482a45a4 user: dmestas
21:17 • Edit [3d3ee2903e]: Mark "Closed". artifact: 84a906296e user: quarry
21:15 • Edit [4636541417]: Add "ci-pass" with value "b4204456c8c371679ccb65acd9745f8f". artifact: 4ad4e0ac71 user: quarry
21:15 • Edit [2e5c5ffde4]: Add "ci-pass" with value "3596c62721843e2cf1b1ab935dc24e48". artifact: d4f3dd4d3f user: quarry
21:14 • Post: Ticket templates are read once per tip artifact: 434cbcacb3 user: dmestas
21:14
Ticket templates are read once per tip closed check-in: 2e5c5ffde4 user: dmestas tags: ticket-templates-read-once-per-tip
21:13 • Edit [c92c4c505b]: Add "ci-pass" with value "2248124e2c82bcd1bae11efee8980e4a". artifact: 30d82dda03 user: quarry
21:12
Create new branch named "ticket-templates-read-once-per-tip" check-in: c92c4c505b user: dmestas tags: ticket-templates-read-once-per-tip
21:11 • Edit [3d3ee2903e]: Add "ci-pass" with value "564c9a0a072774feace650769cd37a0e". artifact: 945e8b7aa1 user: quarry
21:10 • Post: A strata rung is one line artifact: fca83e614f user: dmestas
21:10
A strata rung is one line closed check-in: 3d3ee2903e user: dmestas tags: a-strata-rung-is-one-line
21:07
Create new branch named "a-strata-rung-is-one-line" check-in: 4a32396ec3 user: dmestas tags: a-strata-rung-is-one-line
21:06
land a-ticket-knows-its-likely-twins check-in: 4636541417 user: dmestas tags: trunk
21:06 • Edit [4636541417]: Add "landing" with value "3ce73a9981ff7d4b1d40349149636cb90ed4936ffbbb0a502245446d9cbd47c0". artifact: c9db7cfba5 user: quarry
21:06 • Reply: Slice 4, the last of the new-ticket form rework. (1) Likely duplicates: ticket.similar (GET /api/v1/r/{repo}/ticket/similar, anonymous, r) takes a title and answers up to 3 tickets whose titles share its significant words — two, or one for a one- or two-word title — across both tiers (the index via a new SearchAny, words OR'd and bm25-ranked; local tickets not yet promoted), open ones first, each with its url; private tickets are never offered. The form's title asks for them as you type (debounced) and shows them under it ("Might already be filed. Open one to add to it instead."), and a prefilled title shows them on arrival. Agents get the same check before filing. (2) Field commands: a whole line of the description reading /type, /status, /severity, /priority, /subsystem or /foundin plus a value sets that field (matched to the vocabulary's own spelling in any case, else kept as typed) and leaves the text; never inside a code fence or mid-sentence; a command wins over the chip. The composer's / menu takes per-textarea entries (data-slash-extra), so the filing form offers "Set severity" and the rest there. Tests: similar finds the open then the closed export ticket and not the chat one, and nothing for an unrelated title; the fragment links a match and patches empty on none; quick actions set fields in vocabulary spelling and leave fenced and inline text; /severity Critical beats a Minor chip. Looked at in a browser. artifact: 843d109ce1 user: dmestas
21:06 • Edit [9311dce403]: Mark "Closed". artifact: a863158d1e user: quarry
21:06
land a-ticket-is-filed-once-and-found check-in: 55c5b38ce9 user: dmestas tags: trunk
21:06 • Edit [55c5b38ce9]: Add "landing" with value "83bbb2ab1a8f47d07cd4a92544c31ba6b77ea3bb217ac7415271a74f54c22d85". artifact: becfcc455e user: quarry
21:06 • Reply: Slice 3 of the new-ticket form rework: fully agent capable. (1) Retry safety: ticket.new and ticket.intake take idempotencyKey, and the router maps the conventional Idempotency-Key header onto any op that declares it. The first answer is remembered a day (oltp idempotency table), scoped to op + repository + caller; the same key again returns the first ticket, the same key with a different request is refused (400) rather than answered with a ticket that is not the one asked for, and a keyed lock makes two simultaneous retries file one. The filing form sends a fresh key per render, so a double click or a re-posted form files once too. (2) The answer carries url (Deps.link to the ticket page) beside id on both ops. (3) ticket.config returns inputs: each filing field with kind (text, markdown, choice, boolean), required, words, default (status Open), maxLength and a note, plus the tracker's own columns as fields.<name> (append-syntax names excluded) — Jira's create metadata in one call. The form's side column now names the key and the url. Tests: a retried key files one ticket and answers its url; a different request with the key is refused; another caller and no key file afresh; the header through Router files once for two posts; ticket.config describes title, type, status default, comment, fossil and the key; the form carries and forwards its key. artifact: b1405a95f1 user: dmestas
21:06 • Edit [6652312e34]: Mark "Closed". artifact: 2fcf06340d user: quarry
21:06 • Reply: Slice 4, the last of the new-ticket form rework. (1) Likely duplicates: ticket.similar (GET /api/v1/r/{repo}/ticket/similar, anonymous, r) takes a title and answers up to 3 tickets whose titles share its significant words — two, or one for a one- or two-word title — across both tiers (the index via a new SearchAny, words OR'd and bm25-ranked; local tickets not yet promoted), open ones first, each with its url; private tickets are never offered. The form's title asks for them as you type (debounced) and shows them under it ("Might already be filed. Open one to add to it instead."), and a prefilled title shows them on arrival. Agents get the same check before filing. (2) Field commands: a whole line of the description reading /type, /status, /severity, /priority, /subsystem or /foundin plus a value sets that field (matched to the vocabulary's own spelling in any case, else kept as typed) and leaves the text; never inside a code fence or mid-sentence; a command wins over the chip. The composer's / menu takes per-textarea entries (data-slash-extra), so the filing form offers "Set severity" and the rest there. Tests: similar finds the open then the closed export ticket and not the chat one, and nothing for an unrelated title; the fragment links a match and patches empty on none; quick actions set fields in vocabulary spelling and leave fenced and inline text; /severity Critical beats a Minor chip. Looked at in a browser. artifact: ff59242bbd user: dmestas
21:06
land a-ticket-type-brings-its-template check-in: 80916456f8 user: dmestas tags: trunk
21:06 • Edit [80916456f8]: Add "landing" with value "4a3d91793307539f6577a1613573a680021bc78cb32fe06b372e9b258e703d73". artifact: 8cadefe041 user: quarry
21:06 • Reply: Slice 2 of the new-ticket form rework, stacked on slice 1 (e7a2dee8). Templates are Markdown files, one per type word, under .quarry/ticket-templates/ (Code_Defect.md …; default.md for a ticket with no type), read at the tip of trunk like tickets.json — GitLab's issue_templates shape, not strings in tickets.json, which an older quarry would refuse whole. ticket.config gains templates=true, returning {type, body} for the types that have a file; off by default so lists and boards do not pay one file read per type. The form: an empty description starts from the chosen type's template (or default.md); a comment handed in is never replaced; every template rides the page as <template data-tn-template>, and ticketnew.js swaps the new type's template in when the type changes, only while the box is empty or still exactly a template — typed words are never replaced. Quarry's own four templates are committed. Tests: ticket.config with a real store returns Code_Defect and default only when asked; the form starts from the chosen type's template, the default without one, keeps a handed-in comment, and carries the templates. The swap itself was exercised in a browser: Defect → Feature swaps, typed words survive a switch back. artifact: 97c9e553c9 user: dmestas
21:06 • Edit [b2b4ab6396]: Mark "Closed". artifact: 5a2f167854 user: quarry
21:06 • Reply: Slice 3 of the new-ticket form rework: fully agent capable. (1) Retry safety: ticket.new and ticket.intake take idempotencyKey, and the router maps the conventional Idempotency-Key header onto any op that declares it. The first answer is remembered a day (oltp idempotency table), scoped to op + repository + caller; the same key again returns the first ticket, the same key with a different request is refused (400) rather than answered with a ticket that is not the one asked for, and a keyed lock makes two simultaneous retries file one. The filing form sends a fresh key per render, so a double click or a re-posted form files once too. (2) The answer carries url (Deps.link to the ticket page) beside id on both ops. (3) ticket.config returns inputs: each filing field with kind (text, markdown, choice, boolean), required, words, default (status Open), maxLength and a note, plus the tracker's own columns as fields.<name> (append-syntax names excluded) — Jira's create metadata in one call. The form's side column now names the key and the url. Tests: a retried key files one ticket and answers its url; a different request with the key is refused; another caller and no key file afresh; the header through Router files once for two posts; ticket.config describes title, type, status default, comment, fossil and the key; the form carries and forwards its key. artifact: 3d33c15f22 user: dmestas
21:06
land a-ticket-is-quick-to-file check-in: 06f737c075 user: dmestas tags: trunk
21:06 • Edit [06f737c075]: Add "landing" with value "e7a2dee8fb7283ab4a07b941d55dc0d35422b856a081952df3f4775ddfe74d7f". artifact: bdfe3c0dc2 user: quarry
21:06 • Reply: Slice 1 of the new-ticket form rework (the mockup dmestas approved). Layout: type first as pills from the tracker's own words (Code_Defect reads "Code defect"; the value sent is unchanged); a large title; the description is the forum's Markdown composer (Write | Preview on the production renderer, / blocks, attachments inside the box); status, severity, priority and subsystem as chips, each still a native select with Other… (an unset chip reads "+ Priority", dashed); Found in as a text chip; the tracker's extra columns folded under "+ Field". The bug button now sends seen=<page> instead of typing "Seen on …" into the body: the form shows it as a ticked context row (plus zit version) and files it as a footer under what was written, left out when unticked. Footer: "Goes to" (this forge / permanent history, admins only) replaces the checkbox; "Create another" files and returns to a fresh form keeping type/status/severity/priority/subsystem/found-in and saying the last one landed; a primary Open ticket button. ticketnew.js: Cmd/Ctrl+Enter submits, with Shift also creates another; S V P U focus the chips; 1-9 pick inside a focused chip. A side column lists the keys and the API request with a copyable curl. Fixes: fossil's "+comment" append syntax recorded as a field no longer grows a box (offeredField); the empty upload bar under every composer is gone (.attach-progress honoured hidden). Tests: the form's structure; the append filter; context filed only while ticked, create another keeps fields and says what opened. Existing tests updated for the destination select and the seen= link. Looked at in a browser (dark, desktop filled and empty, phone). artifact: e4c50eef57 user: dmestas
21:06 • Edit [4b9b241220]: Mark "Closed". artifact: 4107df466c user: quarry
21:06 • Reply: Slice 2 of the new-ticket form rework, stacked on slice 1 (e7a2dee8). Templates are Markdown files, one per type word, under .quarry/ticket-templates/ (Code_Defect.md …; default.md for a ticket with no type), read at the tip of trunk like tickets.json — GitLab's issue_templates shape, not strings in tickets.json, which an older quarry would refuse whole. ticket.config gains templates=true, returning {type, body} for the types that have a file; off by default so lists and boards do not pay one file read per type. The form: an empty description starts from the chosen type's template (or default.md); a comment handed in is never replaced; every template rides the page as <template data-tn-template>, and ticketnew.js swaps the new type's template in when the type changes, only while the box is empty or still exactly a template — typed words are never replaced. Quarry's own four templates are committed. Tests: ticket.config with a real store returns Code_Defect and default only when asked; the form starts from the chosen type's template, the default without one, keeps a handed-in comment, and carries the templates. The swap itself was exercised in a browser: Defect → Feature swaps, typed words survive a switch back. artifact: a20a53a7c0 user: dmestas
20:10 • Edit [9311dce403]: Add "ci-pass" with value "fff1b86ef13c299c024b81806aad1cbe". artifact: 80b5803e78 user: quarry
20:09 • Post: Slice 4, the last of the new-ticket form rework. (1) Likely duplicates: ticket.similar (GET /api/v1/r/{repo}/ticket/similar, anonymous, r) takes a title and answers up to 3 tickets whose titles share its significant words — two, or one for a one- or two-word title — across both tiers (the index via a new SearchAny, words OR'd and bm25-ranked; local tickets not yet promoted), open ones first, each with its url; private tickets are never offered. The form's title asks for them as you type (debounced) and shows them under it ("Might already be filed. Open one to add to it instead."), and a prefilled title shows them on arrival. Agents get the same check before filing. (2) Field commands: a whole line of the description reading /type, /status, /severity, /priority, /subsystem or /foundin plus a value sets that field (matched to the vocabulary's own spelling in any case, else kept as typed) and leaves the text; never inside a code fence or mid-sentence; a command wins over the chip. The composer's / menu takes per-textarea entries (data-slash-extra), so the filing form offers "Set severity" and the rest there. Tests: similar finds the open then the closed export ticket and not the chat one, and nothing for an unrelated title; the fragment links a match and patches empty on none; quick actions set fields in vocabulary spelling and leave fenced and inline text; /severity Critical beats a Minor chip. Looked at in a browser. artifact: 3ce73a9981 user: dmestas
20:09
A ticket knows its likely twins: ticket.similar under the title as you type, and /severity-style field commands in the description closed check-in: 9311dce403 user: dmestas tags: a-ticket-knows-its-likely-twins
20:05 • Edit [7c5254f656]: Add "ci-pass" with value "6c0f0eb30917f8d4acba2aef7b5bc715". artifact: aa3280d359 user: quarry
20:04 • Edit [6652312e34]: Add "ci-pass" with value "f9ead1c8d3e2626b18f86924507b5d65". artifact: 90b87214a7 user: quarry
20:04
Create new branch named "a-ticket-knows-its-likely-twins" check-in: 7c5254f656 user: dmestas tags: a-ticket-knows-its-likely-twins
20:03 • Post: Slice 3 of the new-ticket form rework: fully agent capable. (1) Retry safety: ticket.new and ticket.intake take idempotencyKey, and the router maps the conventional Idempotency-Key header onto any op that declares it. The first answer is remembered a day (oltp idempotency table), scoped to op + repository + caller; the same key again returns the first ticket, the same key with a different request is refused (400) rather than answered with a ticket that is not the one asked for, and a keyed lock makes two simultaneous retries file one. The filing form sends a fresh key per render, so a double click or a re-posted form files once too. (2) The answer carries url (Deps.link to the ticket page) beside id on both ops. (3) ticket.config returns inputs: each filing field with kind (text, markdown, choice, boolean), required, words, default (status Open), maxLength and a note, plus the tracker's own columns as fields.<name> (append-syntax names excluded) — Jira's create metadata in one call. The form's side column now names the key and the url. Tests: a retried key files one ticket and answers its url; a different request with the key is refused; another caller and no key file afresh; the header through Router files once for two posts; ticket.config describes title, type, status default, comment, fossil and the key; the form carries and forwards its key. artifact: 83bbb2ab1a user: dmestas
20:03
A ticket is filed once and found: Idempotency-Key on filing, the url in the answer, and ticket.config describes the form field by field closed check-in: 6652312e34 user: dmestas tags: a-ticket-is-filed-once-and-found
20:00 • Edit [d33dfef06f]: Add "ci-pass" with value "acc464e9333c9fe322a9b3a0a902a00b". artifact: 2f8d8b37c8 user: quarry
19:59 • Edit [353b8469f2]: Add "ci-pass" with value "ebdc6fb2ca7ea0f93bb5ea8add4e7ec9". artifact: 814262d9fa user: quarry
19:59
land a-feed-says-what-a-ticket-change-did check-in: d33dfef06f user: dmestas tags: trunk
19:59 • Edit [d33dfef06f]: Add "landing" with value "a291284aa01b4ff80972744ee2d624ea580959a45cb2522e0bc35cd6d557a8bc". artifact: e219464bb0 user: quarry
19:59 • Reply: jva (sandbox #1160) found two changes to one ticket appear in timeline.atom as identical entries; on the live quarry feed 11 of the last 50 ticket entries repeat a title and summary. Every ticket row carries the ticket's title, and nothing said what the change was. The timeline now attaches a short change summary to ticket rows: 'opened' for the first change, otherwise the fields it set ('status Closed, resolution Fixed') and the first line of any comment. The Atom entry appends it to the title and uses it as the summary. Two indexed lookups per returned ticket row (checked on tcl's 51,759 ticket changes). The HTML timeline is unchanged; the field is there if we want it there too. artifact: cb9a6d876e user: dmestas
19:59 • Edit [0d8a187e02]: Mark "Closed". artifact: 806cc4f9e4 user: quarry
19:59
land a-runner-download-you-can-check check-in: 353b8469f2 user: dmestas tags: trunk
19:59 • Edit [353b8469f2]: Add "landing" with value "a53c9e994e59f6136c7eb16c9b353728e56c215bc7e40b6d9a98829496233c4f". artifact: f042155534 user: quarry
19:59 • Reply: From jva's measurement of the downloaded runner on Jan's own machine (sandbox #1182, PASS). Two gaps: (1) the runner learns its task types from ci/runner.json on trunk and exits without it, so a repository adopting CI on a landing could not start one from the page's command; the page now says to pass --tasks <group>.<name>,... until the file has landed, with the repository's own group filled in. (2) no checksums: deploy now publishes SHA256SUMS beside the builds (sha256sum's format), served at /runner/SHA256SUMS as text, and the page links it with the verify command. Deploy marks only the programs executable. Tests cover the served checksum file and both new page hooks. artifact: f4dc6b9457 user: dmestas
19:59 • Edit [1bb9f2c672]: Mark "Closed". artifact: 1ea4a4b084 user: quarry
19:58 • Edit [11fac75591]: Add "ci-pass" with value "7357fbb809cf81f790e19c5e865959e8". artifact: ca6c6718a7 user: quarry
19:58 • Edit [b2b4ab6396]: Add "ci-pass" with value "7a1225c33f6d03df06bd9bac8616d487". artifact: 9173a92cf7 user: quarry
19:58
Create new branch named "a-ticket-is-filed-once-and-found" check-in: 11fac75591 user: dmestas tags: a-ticket-is-filed-once-and-found
19:57 • Post: Slice 2 of the new-ticket form rework, stacked on slice 1 (e7a2dee8). Templates are Markdown files, one per type word, under .quarry/ticket-templates/ (Code_Defect.md …; default.md for a ticket with no type), read at the tip of trunk like tickets.json — GitLab's issue_templates shape, not strings in tickets.json, which an older quarry would refuse whole. ticket.config gains templates=true, returning {type, body} for the types that have a file; off by default so lists and boards do not pay one file read per type. The form: an empty description starts from the chosen type's template (or default.md); a comment handed in is never replaced; every template rides the page as <template data-tn-template>, and ticketnew.js swaps the new type's template in when the type changes, only while the box is empty or still exactly a template — typed words are never replaced. Quarry's own four templates are committed. Tests: ticket.config with a real store returns Code_Defect and default only when asked; the form starts from the chosen type's template, the default without one, keeps a handed-in comment, and carries the templates. The swap itself was exercised in a browser: Defect → Feature swaps, typed words survive a switch back. artifact: 4a3d917933 user: dmestas
19:57
A ticket type brings its template: .quarry/ticket-templates/<Type>.md, served by ticket.config on request and swapped into an untouched description closed check-in: b2b4ab6396 user: dmestas tags: a-ticket-type-brings-its-template
19:54 • Edit [f2df128cf8]: Add "ci-pass" with value "952ff7c1a4464cc07bda972a354d5722". artifact: aca18078d6 user: quarry
19:53 • Edit [4b9b241220]: Add "ci-pass" with value "07a11252d012cd0cd257622f38b381dc". artifact: 2c1337e8b0 user: quarry
19:53
Create new branch named "a-ticket-type-brings-its-template" check-in: f2df128cf8 user: dmestas tags: a-ticket-type-brings-its-template
19:52 • Post: Slice 1 of the new-ticket form rework (the mockup dmestas approved). Layout: type first as pills from the tracker's own words (Code_Defect reads "Code defect"; the value sent is unchanged); a large title; the description is the forum's Markdown composer (Write | Preview on the production renderer, / blocks, attachments inside the box); status, severity, priority and subsystem as chips, each still a native select with Other… (an unset chip reads "+ Priority", dashed); Found in as a text chip; the tracker's extra columns folded under "+ Field". The bug button now sends seen=<page> instead of typing "Seen on …" into the body: the form shows it as a ticked context row (plus zit version) and files it as a footer under what was written, left out when unticked. Footer: "Goes to" (this forge / permanent history, admins only) replaces the checkbox; "Create another" files and returns to a fresh form keeping type/status/severity/priority/subsystem/found-in and saying the last one landed; a primary Open ticket button. ticketnew.js: Cmd/Ctrl+Enter submits, with Shift also creates another; S V P U focus the chips; 1-9 pick inside a focused chip. A side column lists the keys and the API request with a copyable curl. Fixes: fossil's "+comment" append syntax recorded as a field no longer grows a box (offeredField); the empty upload bar under every composer is gone (.attach-progress honoured hidden). Tests: the form's structure; the append filter; context filed only while ticked, create another keeps fields and says what opened. Existing tests updated for the destination select and the seen= link. Looked at in a browser (dark, desktop filled and empty, phone). artifact: e7a2dee8fb user: dmestas
19:52
The new-ticket form is quick to file: type pills, a large title, the Markdown composer, triage fields as chips, context kept beside the body, and the keyboard closed check-in: 4b9b241220 user: dmestas tags: a-ticket-is-quick-to-file
19:49 • Edit [0d8a187e02]: Add "ci-pass" with value "7c177cd9740dd81e099c044993d3d71e". artifact: c80f6e8ae6 user: quarry
19:48 • Post: jva (sandbox #1160) found two changes to one ticket appear in timeline.atom as identical entries; on the live quarry feed 11 of the last 50 ticket entries repeat a title and summary. Every ticket row carries the ticket's title, and nothing said what the change was. The timeline now attaches a short change summary to ticket rows: 'opened' for the first change, otherwise the fields it set ('status Closed, resolution Fixed') and the first line of any comment. The Atom entry appends it to the title and uses it as the summary. Two indexed lookups per returned ticket row (checked on tcl's 51,759 ticket changes). The HTML timeline is unchanged; the field is there if we want it there too. artifact: a291284aa0 user: zeitgeist
19:48
A ticket's feed entry says what its change did, so two changes to one ticket no longer read alike closed check-in: 0d8a187e02 user: zeitgeist tags: a-feed-says-what-a-ticket-change-did
19:43 • Edit [1bb9f2c672]: Add "ci-pass" with value "2430960a8b2ebea0dde3e68acd82e3b3". artifact: ba596d31da user: quarry
19:42 • Post: From jva's measurement of the downloaded runner on Jan's own machine (sandbox #1182, PASS). Two gaps: (1) the runner learns its task types from ci/runner.json on trunk and exits without it, so a repository adopting CI on a landing could not start one from the page's command; the page now says to pass --tasks <group>.<name>,... until the file has landed, with the repository's own group filled in. (2) no checksums: deploy now publishes SHA256SUMS beside the builds (sha256sum's format), served at /runner/SHA256SUMS as text, and the page links it with the verify command. Deploy marks only the programs executable. Tests cover the served checksum file and both new page hooks. artifact: a53c9e994e user: zeitgeist
19:42
Runner downloads publish SHA256SUMS, and the Runners page says how to name task types before ci/runner.json is on trunk closed check-in: 1bb9f2c672 user: zeitgeist tags: a-runner-download-you-can-check
19:42 • Edit [f877c815ea]: Add "ci-pass" with value "ece8411bca62b0218fd762e1d7ddfce1". artifact: 7604f5493a user: quarry
19:42
Create new branch named "a-ticket-is-quick-to-file" check-in: f877c815ea user: dmestas tags: a-ticket-is-quick-to-file
19:22 • Edit [2dede871bd]: Add "ci-pass" with value "30be2b4f58d607d29d5787747e0108d1". artifact: b4ba8061b7 user: quarry
19:22
land a-repository-sees-its-runners check-in: 2dede871bd user: dmestas tags: trunk
19:22 • Edit [2dede871bd]: Add "landing" with value "a7ef12f0c9d5c342f705639f78571332b30f1cb0b16e43b3f4968b6460184d18". artifact: 8f43a8b868 user: quarry
19:22 • Reply: Settings -> Runners said no runner was attached while quarry's own runner passed every run: the engine recorded no group for any registration. dagnats v0.0.20 (danmestas/dagnats#719) records worker_groups at connect and reports them in /v1/workers; it also fixes #721, grouped retries that were never claimed, which is already live (engine upgraded on hetzner-big-eu at 18:03). Here: quarry's dagnats pin moves to v0.0.20; the CI bridge pins worker_group on connect exactly as it does on poll, and refuses a connect naming another repository's group; ci.Worker reads worker_groups, and a worker is listed under every group it drains and counted ungrouped only when it names none. Tests prove the connect pin fails without the change. Measured on the upgraded engine: quarry's runner already registers with worker_groups quarry. artifact: fd1f8e463b user: dmestas
19:22 • Edit [2150338007]: Mark "Closed". artifact: cb5d22ffa0 user: quarry
18:09 • Edit [2150338007]: Add "ci-pass" with value "812ff7fe071e3492d53e2a015d7f4b43". artifact: 43a3f694c2 user: quarry
18:08 • Post: Settings -> Runners said no runner was attached while quarry's own runner passed every run: the engine recorded no group for any registration. dagnats v0.0.20 (danmestas/dagnats#719) records worker_groups at connect and reports them in /v1/workers; it also fixes #721, grouped retries that were never claimed, which is already live (engine upgraded on hetzner-big-eu at 18:03). Here: quarry's dagnats pin moves to v0.0.20; the CI bridge pins worker_group on connect exactly as it does on poll, and refuses a connect naming another repository's group; ci.Worker reads worker_groups, and a worker is listed under every group it drains and counted ungrouped only when it names none. Tests prove the connect pin fails without the change. Measured on the upgraded engine: quarry's runner already registers with worker_groups quarry. artifact: a7ef12f0c9 user: zeitgeist
18:08
A repository sees its runners: the bridge pins the group on connect and Settings reads the engine's worker_groups (dagnats v0.0.20) closed check-in: 2150338007 user: zeitgeist tags: a-repository-sees-its-runners
17:34 • Edit [cdacb932f2]: Add "ci-pass" with value "9a0eb2d4bf10a75ad8275b81833453b3". artifact: 49d65a6f2a user: quarry
17:28 • Closed ticket [4b8508f3b0]: Settings: configuration export, and mirror controls on the repository page plus 3 other changes artifact: 0ab29d52b4 user: zeitgeist
17:25 • Edit [cdacb932f2]: Add "ci-pass" with value "aca653ce4875bfa623c845be298c4e1d". artifact: 3468524f61 user: quarry
17:24
land a-runner-you-download check-in: cdacb932f2 user: dmestas tags: trunk
17:24 • Edit [cdacb932f2]: Add "landing" with value "b4b7032bb61b4ea30438ae3c2806a6aff08a48ecd8c0055708f92963c024ba41". artifact: 2eac1d6a82 user: quarry
17:24 • Reply: Running a repository's CI no longer means building quarry. quarry-runner is one stdlib-only program, cross-compiled at deploy for Linux (x86-64, ARM64), macOS (Apple silicon, Intel) and Windows, and served by the forge at /runner/<file>; Settings -> Runners and the CI setup steps link one download per platform and name the command with the repository's URL. By default the runner fetches each check-in as the forge's archive and unpacks it (paths and links that leave the tree are refused), so it needs no zit; --checkout zit keeps the clone for suites that need a repository. ci/runner.json entries may now set env and dir. quarry runner is the same program. 'runner' joins the reserved names. Measured: the macOS build, run with only a worker token, claimed a probe repository's task through Cloudflare, fetched its archive, ran in the manifest's dir with its env, and the run page showed the output; quarry's full suite passes from an archive tree, so quarry's own CI moves to archive checkout with this. artifact: c34cfcf5e3 user: dmestas
17:24 • Edit [8a0ba3d480]: Mark "Closed". artifact: 45804d7b99 user: quarry
17:18 • Edit [8a0ba3d480]: Add "ci-pass" with value "fa1502bcf10836a71a37e6e228bf4e2f". artifact: 7bb1e2e115 user: quarry
17:17 • Post: Running a repository's CI no longer means building quarry. quarry-runner is one stdlib-only program, cross-compiled at deploy for Linux (x86-64, ARM64), macOS (Apple silicon, Intel) and Windows, and served by the forge at /runner/<file>; Settings -> Runners and the CI setup steps link one download per platform and name the command with the repository's URL. By default the runner fetches each check-in as the forge's archive and unpacks it (paths and links that leave the tree are refused), so it needs no zit; --checkout zit keeps the clone for suites that need a repository. ci/runner.json entries may now set env and dir. quarry runner is the same program. 'runner' joins the reserved names. Measured: the macOS build, run with only a worker token, claimed a probe repository's task through Cloudflare, fetched its archive, ran in the manifest's dir with its env, and the run page showed the output; quarry's full suite passes from an archive tree, so quarry's own CI moves to archive checkout with this. artifact: b4b7032bb6 user: zeitgeist
17:17
Runners are downloaded, not built: quarry-runner is one program per platform served at /runner/, fetching each check-in as an archive closed check-in: 8a0ba3d480 user: zeitgeist tags: a-runner-you-download
17:14 • Edit [b152e89fbd]: Add "ci-pass" with value "573048986544e6c38d8cb93d606ec130". artifact: 08bc4c34fd user: quarry
17:13
land a-mirror-is-run-from-its-own-settings check-in: b152e89fbd user: dmestas tags: trunk
17:13 • Edit [b152e89fbd]: Add "landing" with value "32d2b298b653bb236ccd07feeced031eea9c513ff98ace67b0bbc6c21db2228f". artifact: db2de5901d user: quarry
17:13 • Reply: 4b8508f3, the second half: mirror controls on the repository. A tracking mirror's settings gain a Mirror section (rail entry after Repository, data-hook mirror-settings): the upstream and its interval in words ("every hour"); the last pull and how it went (data-hook mirror-last, data-state), with the failure cause and streak and the last success when it is failing; a line when the copy has diverged, pointing at Make canonical. A repository admin gets Pull now (POST /r/{repo}/settings/mirror/run → mirror.run; the outcome shows in the last-pull line, which every run updates) and an Accept local writes switch (POST /r/{repo}/settings/mirror/writes → mirror.writes). The upstream address, interval and credentials stay on the fleet page, linked for site admins only, since they reach another server. Both routes are gated on a, like the ops. Tests: the section with a failing hourly mirror carries the cause, streak, both controls and no fleet link for a repository admin; a site admin gets the fleet link and a checked switch; a non-admin gets no controls; a native repository has no section; with a mirror the rail and the sections still agree in order. artifact: 0204c778ae user: dmestas
17:13 • Edit [55b58542cc]: Mark "Closed". artifact: 12028cb564 user: quarry
17:13 • Edit [55b58542cc]: Add "ci-pass" with value "a8849a02b6617cf6d648e1ceb89c33bf". artifact: ce275324e8 user: quarry
17:12 • Post: 4b8508f3, the second half: mirror controls on the repository. A tracking mirror's settings gain a Mirror section (rail entry after Repository, data-hook mirror-settings): the upstream and its interval in words ("every hour"); the last pull and how it went (data-hook mirror-last, data-state), with the failure cause and streak and the last success when it is failing; a line when the copy has diverged, pointing at Make canonical. A repository admin gets Pull now (POST /r/{repo}/settings/mirror/run → mirror.run; the outcome shows in the last-pull line, which every run updates) and an Accept local writes switch (POST /r/{repo}/settings/mirror/writes → mirror.writes). The upstream address, interval and credentials stay on the fleet page, linked for site admins only, since they reach another server. Both routes are gated on a, like the ops. Tests: the section with a failing hourly mirror carries the cause, streak, both controls and no fleet link for a repository admin; a site admin gets the fleet link and a checked switch; a non-admin gets no controls; a native repository has no section; with a mirror the rail and the sections still agree in order. artifact: 32d2b298b6 user: dmestas
17:12
A mirror is run from its own settings: upstream, last pull and its outcome, Pull now, and the write switch (4b8508f3) closed check-in: 55b58542cc user: dmestas tags: a-mirror-is-run-from-its-own-settings
17:08
Create new branch named "a-mirror-is-run-from-its-own-settings" check-in: f9572ded16 user: dmestas tags: a-mirror-is-run-from-its-own-settings
17:06 • Edit [c799f0cc46]: Add "ci-pass" with value "76d12324bde3e31151dbd1d3f41226aa". artifact: 2fa2e1e876 user: quarry
17:06 • Edit [c799f0cc46]: Add "landing" with value "4326c4bdd04949a09a486d000a50f1432a1622678bcff47dfcb46bcbf4d2176f". artifact: fe74048a89 user: quarry
17:06 • Reply: Fixes config.export as deployed on 83abb4e2: both GET /api/v1/r/{repo}/config/export/user and /shun, and the settings Export links, answered 400 "field area must be one of user shun". The validate tag read oneof=user shun, but the list is |-separated, so the one accepted value was the string "user shun". My tests invoked the op directly and never went through the router where input is validated, so they passed. Fix: oneof=user|shun. Guard: parseRules now refuses whitespace in a oneof list, so the typo fails at op registration, which every test run does, instead of at a caller. Test: config.export through Router answers 200 with alpha-user.txt / alpha-shun.txt and 400 for ticket; with the old tag the test fails naming the separator. Only this tag in the tree had the mistake. artifact: 50b798bffa user: dmestas
17:06 • Edit [41712d13bd]: Mark "Closed". artifact: 4e139e7804 user: quarry
17:06 • Edit [41712d13bd]: Add "ci-pass" with value "a86bc79b191604d4f736e1c319a83ade". artifact: d80058f039 user: quarry
17:06
land an-export-accepts-its-own-areas check-in: c799f0cc46 user: dmestas tags: trunk
17:06 • Edit [c799f0cc46]: Add "landing" with value "4326c4bdd04949a09a486d000a50f1432a1622678bcff47dfcb46bcbf4d2176f". artifact: 6ef987e3cc user: quarry
17:06 • Reply: Fixes config.export as deployed on 83abb4e2: both GET /api/v1/r/{repo}/config/export/user and /shun, and the settings Export links, answered 400 "field area must be one of user shun". The validate tag read oneof=user shun, but the list is |-separated, so the one accepted value was the string "user shun". My tests invoked the op directly and never went through the router where input is validated, so they passed. Fix: oneof=user|shun. Guard: parseRules now refuses whitespace in a oneof list, so the typo fails at op registration, which every test run does, instead of at a caller. Test: config.export through Router answers 200 with alpha-user.txt / alpha-shun.txt and 400 for ticket; with the old tag the test fails naming the separator. Only this tag in the tree had the mistake. artifact: c640195e26 user: dmestas
17:06 • Edit [41712d13bd]: Mark "Closed". artifact: 0265ac28c2 user: quarry
17:04
update an-export-accepts-its-own-areas from trunk closed check-in: 41712d13bd user: dmestas tags: an-export-accepts-its-own-areas
17:04 • Reply: Fixes config.export as deployed on 83abb4e2: both GET /api/v1/r/{repo}/config/export/user and /shun, and the settings Export links, answered 400 "field area must be one of user shun". The validate tag read oneof=user shun, but the list is |-separated, so the one accepted value was the string "user shun". My tests invoked the op directly and never went through the router where input is validated, so they passed. Fix: oneof=user|shun. Guard: parseRules now refuses whitespace in a oneof list, so the typo fails at op registration, which every test run does, instead of at a caller. Test: config.export through Router answers 200 with alpha-user.txt / alpha-shun.txt and 400 for ticket; with the old tag the test fails naming the separator. Only this tag in the tree had the mistake. artifact: e46c4d3d21 user: dmestas
17:02 • Edit [a4d207d8d0]: Add "ci-pass" with value "7daf464c3b78a9c131d648e655cebd0c". artifact: 0ec5684072 user: quarry
16:49 • Closed ticket [1f8c41483d]: strata: pre-flight the walk — probe each rung against the trunk it would land on plus 3 other changes artifact: 9fa8153cb0 user: zeitgeist
16:48 • Reply: probe for 1f8c4148: measuring the strata pre-flight on 54a7cd00; rejected after rung 1 artifact: 096e2f03f8 user: zeitgeist
16:48 • Reply: probe for 1f8c4148: measuring the strata pre-flight on 54a7cd00; rejected after rung 2 artifact: b665118425 user: zeitgeist
16:48 • Reply: probe for 1f8c4148: measuring the strata pre-flight on 54a7cd00; rejected after rung 3 artifact: 90ede1ade0 user: zeitgeist
16:44 • Edit [54a7cd0094]: Add "ci-pass" with value "7151adf5f089c4443c45233507c5639e". artifact: a4f5f0b0f0 user: quarry
16:42 • Edit [7aec1e46e7]: Add "ci-pass" with value "45d4539717bd58be2a6733c0ab8a073c". artifact: 9e9c48d6e6 user: quarry
16:42 • Edit [6647182b21]: Add "ci-pass" with value "aa86cda9c9e08c1fc9fb2480ed76c5e8". artifact: 57e1535090 user: quarry
16:42 • Edit [fb22c54754]: Add "ci-pass" with value "a12355f7853758cb952cc7a60d988bc7". artifact: 40e549bcdf user: quarry
16:40 • Post: probe for 1f8c4148: measuring the strata pre-flight on 54a7cd00; rejected after rung 3 artifact: 820dae472b user: dmestas
16:40 • Post: probe for 1f8c4148: measuring the strata pre-flight on 54a7cd00; rejected after rung 2 artifact: 10b6974626 user: dmestas
16:40 • Post: probe for 1f8c4148: measuring the strata pre-flight on 54a7cd00; rejected after rung 1 artifact: ae579106ab user: dmestas
16:40
Create new branch named "probe-1f8c4148-r3" closed check-in: 7aec1e46e7 user: dmestas tags: probe-1f8c4148-r3
16:40
Create new branch named "probe-1f8c4148-r2" closed check-in: 6647182b21 user: dmestas tags: probe-1f8c4148-r2
16:40
Create new branch named "probe-1f8c4148-r1" closed check-in: fb22c54754 user: dmestas tags: probe-1f8c4148-r1
16:39 • Post: Fixes config.export as deployed on 83abb4e2: both GET /api/v1/r/{repo}/config/export/user and /shun, and the settings Export links, answered 400 "field area must be one of user shun". The validate tag read oneof=user shun, but the list is |-separated, so the one accepted value was the string "user shun". My tests invoked the op directly and never went through the router where input is validated, so they passed. Fix: oneof=user|shun. Guard: parseRules now refuses whitespace in a oneof list, so the typo fails at op registration, which every test run does, instead of at a caller. Test: config.export through Router answers 200 with alpha-user.txt / alpha-shun.txt and 400 for ticket; with the old tag the test fails naming the separator. Only this tag in the tree had the mistake. artifact: 4326c4bdd0 user: dmestas
16:39
config.export accepts user and shun: the oneof list is |-separated, and a spaced one now fails at registration (4b8508f3) check-in: a4d207d8d0 user: dmestas tags: an-export-accepts-its-own-areas
16:37
land a-strata-says-where-it-would-stop check-in: 54a7cd0094 user: dmestas tags: trunk
16:37 • Edit [54a7cd0094]: Add "landing" with value "2f65faa63bc52ff519faf10e5ef727ce9e33ac2b8ba46b3be74301a9b38a736b". artifact: d634d27be3 user: quarry
16:37 • Reply: 1f8c4148, the strata pre-flight, on zit 0.3.28 stack probe (zit#211). Before anything is accepted, landing.get probes every open rung onto the target the bottom rung will meet, each with the rungs below it merged first, in memory, once per stack and memoised on the tips (zitcli.StackProbe). The strata carries preflight (lands/stops), stopsAt, landTo, landCount; each segment carries its own verdict and conflict paths. The map says "would land all N" or "would stop at k/N" (data-hook strata-preflight, data-stops), each rung says would land / would stop: conflict PATH / not reached; an upper rung's Stacked row says what the pre-flight found for it. When the walk would stop, the whole-strata control is replaced by "Land up to k-1/N" pointed at the last rung that would land (data-hook land-up-to); a strata that lands whole keeps "Land strata (N)". The old "probed against the rung below" caveat shows only when the pre-flight could not run. Tests: parseStackProbe reads rungs in order with paths under the stopper, one tip unnamed, a miscount refused; harness with real zit, three rungs whose middle edits the line trunk moved: the base page says would stop at 2/3 with clean / conflict f.txt / not reached, and landing.get answers stops at 2, land 1 up to the base; web: a stop at 2 offers up to 1 and not the whole strata, a clean stack offers the whole. The "What a strata does not do" docs page is not in the tree and still says the walk can only find out by stopping. artifact: 743a304b74 user: dmestas
16:37 • Edit [bad2c9ba6d]: Mark "Closed". artifact: 02ada25617 user: quarry
16:37
land quarry-builds-with-the-latest-go check-in: 447007388a user: dmestas tags: trunk
16:37 • Edit [447007388a]: Add "landing" with value "b64aeab49235ec3932ced2672dd547305d8be8f83977a1d01ad47b85464190a0". artifact: b284557b45 user: quarry
16:37 • Reply: Fixes e3dfc93f. go.mod moves from go 1.26.5 to 1.27.1, the latest stable. Deploy builds in golang:<go.mod's version> instead of a hard-coded golang:1.26, so production has been building with 1.26 while every other path had 1.27. The Dockerfile takes the same version as ARG GO_VERSION, and TestGoPinsAgree fails if its default drifts from go.mod (it fails with the old value). Keeping current: every deploy checks go.dev and prints a WARNING naming the bump command when a newer stable Go is out; it warns, never fails. make check, gofmt and docs are clean under 1.27.1. artifact: f01563bfcf user: dmestas
16:37 • Edit [088f2587ac]: Mark "Closed". artifact: 49abeb9844 user: quarry
16:36 • Edit [51b83b9e7f]: Add "ci-pass" with value "64085743eb1ab606a315df42d8984c13". artifact: 26014eb369 user: quarry
16:36
Create new branch named "an-export-accepts-its-own-areas" check-in: 51b83b9e7f user: dmestas tags: an-export-accepts-its-own-areas
16:22 • Edit [83abb4e27f]: Add "ci-pass" with value "3ded6ec4a96d4bde8d5d487375902588". artifact: 60ae1f4fd8 user: quarry
16:22 • Edit [088f2587ac]: Add "ci-pass" with value "0299f708ff0e378b492e4d3b2f7208fe". artifact: 0d9ff844eb user: quarry
16:21 • Post: 1f8c4148, the strata pre-flight, on zit 0.3.28 stack probe (zit#211). Before anything is accepted, landing.get probes every open rung onto the target the bottom rung will meet, each with the rungs below it merged first, in memory, once per stack and memoised on the tips (zitcli.StackProbe). The strata carries preflight (lands/stops), stopsAt, landTo, landCount; each segment carries its own verdict and conflict paths. The map says "would land all N" or "would stop at k/N" (data-hook strata-preflight, data-stops), each rung says would land / would stop: conflict PATH / not reached; an upper rung's Stacked row says what the pre-flight found for it. When the walk would stop, the whole-strata control is replaced by "Land up to k-1/N" pointed at the last rung that would land (data-hook land-up-to); a strata that lands whole keeps "Land strata (N)". The old "probed against the rung below" caveat shows only when the pre-flight could not run. Tests: parseStackProbe reads rungs in order with paths under the stopper, one tip unnamed, a miscount refused; harness with real zit, three rungs whose middle edits the line trunk moved: the base page says would stop at 2/3 with clean / conflict f.txt / not reached, and landing.get answers stops at 2, land 1 up to the base; web: a stop at 2 offers up to 1 and not the whole strata, a clean stack offers the whole. The "What a strata does not do" docs page is not in the tree and still says the walk can only find out by stopping. artifact: 2f65faa63b user: dmestas
16:20 • Post: Fixes e3dfc93f. go.mod moves from go 1.26.5 to 1.27.1, the latest stable. Deploy builds in golang:<go.mod's version> instead of a hard-coded golang:1.26, so production has been building with 1.26 while every other path had 1.27. The Dockerfile takes the same version as ARG GO_VERSION, and TestGoPinsAgree fails if its default drifts from go.mod (it fails with the old value). Keeping current: every deploy checks go.dev and prints a WARNING naming the bump command when a newer stable Go is out; it warns, never fails. make check, gofmt and docs are clean under 1.27.1. artifact: b64aeab492 user: zeitgeist
16:20 • Edit [bdf7e27a36]: Add "ci-pass" with value "2a0e3a72c849be8de6cfefc49e9870fb". artifact: 02f1da8dff user: quarry
16:20
land configuration-exports check-in: 83abb4e27f user: dmestas tags: trunk
16:20 • Edit [83abb4e27f]: Add "landing" with value "c1aea6edf45de50f8229b496400808edb6b7e032a2f20efbf7c03c226e1a12ad". artifact: f2814e465c user: quarry
16:20 • Reply: 4b8508f3, the export half, on zit 0.3.28 config export (zit#210). NEEDS 48edfad9 (zit-0328) deployed first: on 0.3.27 the verb does not exist and the op answers an error. zitcli.ExportConfig(area) runs zit config -R STORE export AREA; config.export (GET /api/v1/r/{repo}/config/export/{area}, caps a, token) answers it as a download, REPO-AREA.txt, text/plain, no ETag, not immutable, private because the request carries a credential (the user area holds password hashes). Settings, Configuration areas: Export user / Export shun links beside Import (data-hook config-export), shown only where Import is, plus a line that restoring user is exact and shun only adds. Web route GET /r/{repo}/settings/config/export/{area} gated on a. Tests: back up alice, merge bob in, restore the backup, and the table is alice alone (exact restore); shun exports; an unknown area is refused; the op answers a file that imports back and a storeless repository is unavailable; the settings page offers both links and none when unsupported. The mirror-controls half of this ticket is not in this landing. artifact: d1cd02c123 user: dmestas
16:20 • Edit [bdf7e27a36]: Mark "Closed". artifact: 16cbbf5161 user: quarry
16:20
Build with Go 1.27.1: go.mod is the one Go pin, deploy builds in that image and warns when a newer Go is out closed check-in: 088f2587ac user: zeitgeist tags: quarry-builds-with-the-latest-go
16:18 • Edit [bad2c9ba6d]: Add "ci-pass" with value "dc81d6a8e89ddd2c864c406059aae2bd". artifact: 7723b19ee0 user: quarry
16:17
A strata says where a walk would stop before anything is pressed: one stack probe onto the target, land-up-to offered as such (1f8c4148) closed check-in: bad2c9ba6d user: dmestas tags: a-strata-says-where-it-would-stop
16:15 • Closed ticket [f24d78d96e]: ci: quarry-native runner — generic 'quarry runner' + ci/runner.json manifest plus 3 other changes artifact: 958ac91e26 user: zeitgeist
16:13 • Edit [1e95928a09]: Add "ci-pass" with value "9cec0daa5bf6e95a494bf9c1f5d092ed". artifact: a7f5facfc1 user: quarry
16:13 • Edit [86b6e7a4a5]: Add "ci-pass" with value "6879800d52948762f7d3a6ef9c884063". artifact: 8a84067781 user: quarry
16:13
land retire-the-nats-ci-worker check-in: 1e95928a09 user: dmestas tags: trunk
16:13 • Edit [1e95928a09]: Add "landing" with value "514f7f34b9a677d975ca990ac0661a9efa2166f8a81cff1b376c0812194daa48". artifact: efe7745d43 user: quarry
16:13 • Reply: Retires the NATS CI worker now that quarry's CI runs on quarry runner (f24d78d9 step 3). Removes ci/worker, its build step in build-linux.sh, and deploy's install block; deploy restarts quarry-runner.service after the forge is ready instead. Trunk f611ada5 and branch zit-0328 already passed all three steps on the runner. Touches build-linux.sh away from the ZIT_VERSION line that landing 48edfad9 bumps. artifact: 91d7eb7957 user: dmestas
16:13 • Edit [c4929261bd]: Mark "Closed". artifact: 0bf351cec6 user: quarry
16:13
land zit-0328 check-in: 86b6e7a4a5 user: dmestas tags: trunk
16:13 • Edit [86b6e7a4a5]: Add "landing" with value "48edfad9fc299c19cc254e07c133e53601c0d62affa3e03b80b62c8a36b85d52". artifact: b22d20eb8f user: quarry
16:13 • Reply: Bump the zit bundled by scripts/build-linux.sh to 0.3.28 (danmestas/zit release version-0.3.28): config export (zit#210) for 4b8508f3 and the stack form of merge --probe (zit#211) for 1f8c4148. No quarry code changes; the full suite passes against 0.3.28 locally. The linux-x86_64 tarball is staged in /home/dmestas/zit-release on hetzner-big-eu with its line appended to SHA256SUMS (checksum verified against the release), so deploy.sh builds it with no token. artifact: 420df99747 user: dmestas
16:13 • Edit [8b26f9c50b]: Mark "Closed". artifact: 77ae9e05f1 user: quarry
16:12 • Edit [46df9f96d6]: Add "ci-pass" with value "f7939d471d6442af82af6c4fbdf80492". artifact: a7dbe7d8ae user: quarry
16:11
Create new branch named "a-strata-says-where-it-would-stop" check-in: 46df9f96d6 user: dmestas tags: a-strata-says-where-it-would-stop
16:09 • Post: 4b8508f3, the export half, on zit 0.3.28 config export (zit#210). NEEDS 48edfad9 (zit-0328) deployed first: on 0.3.27 the verb does not exist and the op answers an error. zitcli.ExportConfig(area) runs zit config -R STORE export AREA; config.export (GET /api/v1/r/{repo}/config/export/{area}, caps a, token) answers it as a download, REPO-AREA.txt, text/plain, no ETag, not immutable, private because the request carries a credential (the user area holds password hashes). Settings, Configuration areas: Export user / Export shun links beside Import (data-hook config-export), shown only where Import is, plus a line that restoring user is exact and shun only adds. Web route GET /r/{repo}/settings/config/export/{area} gated on a. Tests: back up alice, merge bob in, restore the backup, and the table is alice alone (exact restore); shun exports; an unknown area is refused; the op answers a file that imports back and a storeless repository is unavailable; the settings page offers both links and none when unsupported. The mirror-controls half of this ticket is not in this landing. artifact: c1aea6edf4 user: dmestas
16:09
Export a configuration area beside Import, so a user table can be backed up before it is replaced (4b8508f3) closed check-in: bdf7e27a36 user: dmestas tags: configuration-exports
16:05 • Edit [df4e37cfac]: Add "ci-pass" with value "c97260e3fbaf4e3bbf150b280e8e5444". artifact: c58bd981d3 user: quarry
16:05
Create new branch named "configuration-exports" check-in: df4e37cfac user: dmestas tags: configuration-exports
16:04 • Edit [c4929261bd]: Add "ci-pass" with value "bf78c6fb6dc372536ffffb79ce8b92fb". artifact: 126d29b3b2 user: quarry
16:04 • Post: Retires the NATS CI worker now that quarry's CI runs on quarry runner (f24d78d9 step 3). Removes ci/worker, its build step in build-linux.sh, and deploy's install block; deploy restarts quarry-runner.service after the forge is ready instead. Trunk f611ada5 and branch zit-0328 already passed all three steps on the runner. Touches build-linux.sh away from the ZIT_VERSION line that landing 48edfad9 bumps. artifact: 514f7f34b9 user: zeitgeist
16:04
Retire the NATS CI worker: quarry's CI runs on quarry runner, and deploy restarts the runner instead of rebuilding the worker closed check-in: c4929261bd user: zeitgeist tags: retire-the-nats-ci-worker
16:04 • Edit [8b26f9c50b]: Add "ci-pass" with value "6f3f515cb0737e627154a7e48dbbd2a4". artifact: 241f1da86a user: quarry
16:04 • Post: Bump the zit bundled by scripts/build-linux.sh to 0.3.28 (danmestas/zit release version-0.3.28): config export (zit#210) for 4b8508f3 and the stack form of merge --probe (zit#211) for 1f8c4148. No quarry code changes; the full suite passes against 0.3.28 locally. The linux-x86_64 tarball is staged in /home/dmestas/zit-release on hetzner-big-eu with its line appended to SHA256SUMS (checksum verified against the release), so deploy.sh builds it with no token. artifact: 48edfad9fc user: dmestas
16:03
Build against zit 0.3.28: config export and the stack merge probe closed check-in: 8b26f9c50b user: dmestas tags: zit-0328
16:02 • Edit [b1640de520]: Add "ci-pass" with value "dc9c25a85f31d57ecc2b5c99e0afc0a1". artifact: e33af0b052 user: quarry
16:02
Create new branch named "zit-0328" check-in: b1640de520 user: dmestas tags: zit-0328
15:59 • Edit [f611ada5cd]: Add "ci-pass" with value "5a60e2b78a55e061d44c1348ea4a8054". artifact: 14f3b2c8c1 user: quarry
15:58 • Edit [7709af6041]: Add "ci-pass" with value "f0fa26b6b7e35f37d6a7ae7546faa50e". artifact: d29f5fa965 user: quarry
15:57
land quarry-ci-runs-on-its-own-runner check-in: f611ada5cd user: dmestas tags: trunk
15:57 • Edit [f611ada5cd]: Add "landing" with value "b932d27c1902bc19b7955f4ccd8024f76ed2f691b7a1abadce27de8f2830dd78". artifact: f2dd973a61 user: quarry
15:57 • Reply: quarry's own CI moves onto the runner (step 3 of f24d78d9). Pipeline steps become quarry.test, quarry.fmt and quarry.build in worker group quarry; ci/runner.json names what each runs, read at the check-in under test. A quarry runner service on the box already claims them through the forge bridge with a token scoped to the quarry group. The old NATS worker stays until this lands and a few runs pass on the runner. artifact: ae64ead304 user: dmestas
15:57 • Edit [43b73b4c90]: Mark "Closed". artifact: 1ff2f9270e user: quarry
15:57 • Reply: A repository's settings page listed every worker token on the forge and would revoke any of them. It now lists and revokes only tokens scoped to its own worker group; tokens with no group are shown and revocable only by a site admin. Tests prove the revoke refuses another repository's token and a fleet token without the check. artifact: 1f14ed9295 user: dmestas
15:57 • Edit [8cff76caed]: Mark "Closed". artifact: 5f25b89066 user: quarry
15:57
land a-repository-manages-only-its-own-worker-tokens check-in: 7709af6041 user: dmestas tags: trunk
15:57 • Edit [7709af6041]: Add "landing" with value "ad4050a9bd54c65adc6f1e2af5628284b3c3c5bb1654dfc36d253e107c604063". artifact: e2c6c919db user: quarry
14:17 • Edit [43b73b4c90]: Add "ci-pass" with value "82f0228fd469c1c20460578c5267002c". artifact: d59cb488e3 user: quarry
14:15 • Post: quarry's own CI moves onto the runner (step 3 of f24d78d9). Pipeline steps become quarry.test, quarry.fmt and quarry.build in worker group quarry; ci/runner.json names what each runs, read at the check-in under test. A quarry runner service on the box already claims them through the forge bridge with a token scoped to the quarry group. The old NATS worker stays until this lands and a few runs pass on the runner. artifact: b932d27c19 user: zeitgeist
14:15
quarry's CI runs on quarry runner: steps publish to worker group quarry and ci/runner.json names their commands closed check-in: 43b73b4c90 user: zeitgeist tags: quarry-ci-runs-on-its-own-runner
14:13 • Edit [8cff76caed]: Add "ci-pass" with value "ef205ea7893527603b6b3f3e8c08194a". artifact: 8b1d7bf5f9 user: quarry
14:12 • Post: A repository's settings page listed every worker token on the forge and would revoke any of them. It now lists and revokes only tokens scoped to its own worker group; tokens with no group are shown and revocable only by a site admin. Tests prove the revoke refuses another repository's token and a fleet token without the check. artifact: ad4050a9bd user: zeitgeist
14:12
A repository's settings list and revoke only its own worker tokens; fleet tokens are a site admin's closed check-in: 8cff76caed user: zeitgeist tags: a-repository-manages-only-its-own-worker-tokens
13:45 • Edit [d22679dd5f]: Add "ci-pass" with value "afb76394bd387912b7de85abeb4d75bb". artifact: 8a74312912 user: quarry
13:44
land the-runner-log-reaches-the-run-page check-in: d22679dd5f user: dmestas tags: trunk
13:44 • Edit [d22679dd5f]: Add "landing" with value "99546f0e560dbe38c2ed227d534cc7edf13b255d75c469c64ce3b791e2e74cc5". artifact: 17829c715f user: quarry
13:44 • Reply: Two defects found running quarry runner live on runner-probe (f24d78d9). (1) The run passed but its page showed no output: the runner sent log chunks as stream "stdout" and the engine accepts only "out" and "err", refusing each batch 400; the runner dropped the error silently. It now sends stdout as out and stderr as err, and logs once per task when a batch cannot be sent. (2) ci/runner.json sits in ci/ and every ci/*.json counted as a pipeline, so every trigger tried to register the manifest and failed "pipeline has no name" (the Re-run request answered 400 though the real pipeline ran). IsPipeline now excludes it. Tests: the fake bridge refuses unknown streams as the engine does and the runner test fails with the old name; the manifest-is-not-a-pipeline test. artifact: 395f5d136e user: dmestas
13:44 • Edit [98a6ee1eb7]: Mark "Closed". artifact: c6abd1ce14 user: quarry
13:37 • Edit [98a6ee1eb7]: Add "ci-pass" with value "65694c0fe80a5bb5826038f8dd5a5692". artifact: 61c3206e81 user: quarry
13:36 • Post: Two defects found running quarry runner live on runner-probe (f24d78d9). (1) The run passed but its page showed no output: the runner sent log chunks as stream "stdout" and the engine accepts only "out" and "err", refusing each batch 400; the runner dropped the error silently. It now sends stdout as out and stderr as err, and logs once per task when a batch cannot be sent. (2) ci/runner.json sits in ci/ and every ci/*.json counted as a pipeline, so every trigger tried to register the manifest and failed "pipeline has no name" (the Re-run request answered 400 though the real pipeline ran). IsPipeline now excludes it. Tests: the fake bridge refuses unknown streams as the engine does and the runner test fails with the old name; the manifest-is-not-a-pipeline test. artifact: 99546f0e56 user: zeitgeist
13:36
quarry runner sends its output as the engine out and err streams, says when a log batch is lost, and ci/runner.json is no longer taken for a pipeline closed check-in: 98a6ee1eb7 user: dmestas tags: the-runner-log-reaches-the-run-page
13:33 • Edit [d42f94e2cc]: Add "ci-pass" with value "b0c6bfc76d274dcf425b94235c9535da". artifact: e451ec0df9 user: quarry
13:33
land a-feed-item-names-its-kind-once check-in: d42f94e2cc user: dmestas tags: trunk
13:33 • Edit [d42f94e2cc]: Add "landing" with value "2551bd2bb62d21ee1fd5055cb304bcbc3e7c80fe6d8027fc580fd708d566c9fa". artifact: d53923b2b1 user: quarry
13:33 • Reply: Follow-up to 7a608b5b found measuring it on 0cccfda9b217: ticket items read "Ticket: Ticket [bf5fbed5d6] …" and landing items "Landing: Landing accepted: …", because those stored comments already begin with their kind. feedTitle adds the label only when the comment does not already start with the kind word; wiki, notes and forum keep it, check-ins stay bare. Test: a table over every kind. artifact: a527fe2090 user: dmestas
13:33 • Edit [07bfb50f77]: Mark "Closed". artifact: 5e5e3ab1d0 user: quarry
13:30 • Edit [07bfb50f77]: Add "ci-pass" with value "38d7779317739caca202a4dcab179ff3". artifact: 062d16bfa0 user: quarry
13:29 • Post: Follow-up to 7a608b5b found measuring it on 0cccfda9b217: ticket items read "Ticket: Ticket [bf5fbed5d6] …" and landing items "Landing: Landing accepted: …", because those stored comments already begin with their kind. feedTitle adds the label only when the comment does not already start with the kind word; wiki, notes and forum keep it, check-ins stay bare. Test: a table over every kind. artifact: 2551bd2bb6 user: dmestas
13:29
A feed item names its kind once: tickets and landings already start with the word closed check-in: 07bfb50f77 user: dmestas tags: a-feed-item-names-its-kind-once
13:28 • Edit [fef6108c6f]: Add "ci-pass" with value "05189f8fd2b7924cffd32c9b21a67bb4". artifact: c2f0ed6adf user: quarry
13:27
Create new branch named "a-feed-item-names-its-kind-once" check-in: fef6108c6f user: dmestas tags: a-feed-item-names-its-kind-once
13:27 • Closed ticket [bf5fbed5d6]: Mirror admin: edit in place, clear stale errors on URL change, name the failure cause plus 3 other changes artifact: 05f032dd5c user: zeitgeist
13:24
land a-visitor-can-follow-a-repository check-in: 0cccfda9b2 user: dmestas tags: trunk
13:24 • Edit [0cccfda9b2]: Add "landing" with value "66e7c425591673d73d9d80d31fe45b9526463b75767cbe5427b2c1004387661a". artifact: 3714b37c5d user: quarry
13:24 • Reply: 7a608b5b, the last open item: a way for a visitor who cannot sign in to follow a project. GET /r/{repo}/timeline.atom serves the timeline as Atom from the same timeline.list op the page uses, so visibility is the page's: a feed reader carries no session and sees what any stranger sees. branch, tag, user and y filters are honoured; a bare feed follows everything (y=all), as fossil's timeline.rss does. Items link where a click on the row goes: the per-kind link rule moved out of buildTimeline into eventPath, which both now call. Entry ids are tag URIs per event, since several landing posts share one page. Every repository page announces the feed with <link rel="alternate" type="application/atom+xml">, and the timeline filter row gains a "feed" link (data-hook timeline-feed) carrying the current filters; .tl-controls grows a fourth column for it. Test: four check-ins give four entries with absolute check-in links, named authors, unique ids and the newest time; a branch feed narrows and names itself; the page head and the filter row carry the feed. artifact: bcb19710e3 user: dmestas
13:24 • Edit [92f2e6d825]: Mark "Closed". artifact: 8c51073e23 user: quarry
13:24 • Edit [92f2e6d825]: Add "ci-pass" with value "b7ee2814f5ca1bfc096c9bb50863ebd8". artifact: c64cce90ce user: quarry
13:23
land a-runner-token-can-claim-its-own-tasks check-in: c0abbc49a8 user: dmestas tags: trunk
13:23 • Edit [c0abbc49a8]: Add "landing" with value "1cb1e3515386903b4ec185a0a142ffa2207b21245a21d8b80ef864bd58bbb56c". artifact: 93618cc6ed user: quarry
13:23 • Reply: Found measuring f24d78d9 live on 4e9761988144: quarry runner connected through the forge bridge and the engine checked its token, then refused every poll with "this token is scoped to no task types at all, so it can never claim work". Tokens minted in Settings > Runners carried the repository group and an EMPTY task-type scope, which dagnats reads as nothing; so no repository runner token has ever been able to claim a step. The mint now sets the task-type scope to the group own name, so the token claims <group> and <group>.<anything>, still only inside its group. The test that asserted the empty scope is corrected and fails without the fix. The CI setup page says how to name steps for a repository runner. Tokens minted before this stay useless and need re-minting. artifact: 489300b04a user: dmestas
13:23 • Edit [a75895df5f]: Mark "Closed". artifact: 9c04d47b8e user: quarry
13:23 • Post: 7a608b5b, the last open item: a way for a visitor who cannot sign in to follow a project. GET /r/{repo}/timeline.atom serves the timeline as Atom from the same timeline.list op the page uses, so visibility is the page's: a feed reader carries no session and sees what any stranger sees. branch, tag, user and y filters are honoured; a bare feed follows everything (y=all), as fossil's timeline.rss does. Items link where a click on the row goes: the per-kind link rule moved out of buildTimeline into eventPath, which both now call. Entry ids are tag URIs per event, since several landing posts share one page. Every repository page announces the feed with <link rel="alternate" type="application/atom+xml">, and the timeline filter row gains a "feed" link (data-hook timeline-feed) carrying the current filters; .tl-controls grows a fourth column for it. Test: four check-ins give four entries with absolute check-in links, named authors, unique ids and the newest time; a branch feed narrows and names itself; the page head and the filter row carry the feed. artifact: 66e7c42559 user: dmestas
13:23
A visitor can follow a repository: its timeline as an Atom feed, filters kept, announced in the head and linked beside the filters (7a608b5b) closed check-in: 92f2e6d825 user: dmestas tags: a-visitor-can-follow-a-repository
13:21 • Edit [a75895df5f]: Add "ci-pass" with value "1f0e073cffcb319434e816c46b7f7427". artifact: c6bb384f64 user: quarry
13:20 • Post: Found measuring f24d78d9 live on 4e9761988144: quarry runner connected through the forge bridge and the engine checked its token, then refused every poll with "this token is scoped to no task types at all, so it can never claim work". Tokens minted in Settings > Runners carried the repository group and an EMPTY task-type scope, which dagnats reads as nothing; so no repository runner token has ever been able to claim a step. The mint now sets the task-type scope to the group own name, so the token claims <group> and <group>.<anything>, still only inside its group. The test that asserted the empty scope is corrected and fails without the fix. The CI setup page says how to name steps for a repository runner. Tokens minted before this stay useless and need re-minting. artifact: 1cb1e35153 user: zeitgeist
13:20
a worker token minted in Settings > Runners is scoped to its group own task types, so it can claim work at all closed check-in: a75895df5f user: dmestas tags: a-runner-token-can-claim-its-own-tasks
13:19 • Edit [fb0c87c7dd]: Add "ci-pass" with value "051b0b1f7db2c5948b9fda4529356a09". artifact: e098753551 user: quarry
13:19
Create new branch named "a-visitor-can-follow-a-repository" check-in: fb0c87c7dd user: dmestas tags: a-visitor-can-follow-a-repository
13:18 • Edit [765d457fcd]: Add "ci-pass" with value "d3edd13f76401c0dcaffaebf5688b6f2". artifact: 433276cef9 user: quarry
13:18 • Edit [11c5936f22]: Add "ci-pass" with value "bf5a67cad2394cfc695450e42e3e1ee3". artifact: cd9a4682e3 user: quarry
13:18
land a-dead-mirror-says-why check-in: 765d457fcd user: dmestas tags: trunk
13:18 • Edit [765d457fcd]: Add "landing" with value "7fe97160e5021b2ee8b62ad4dbe98eaec0bbe8a323d9af53e4443fc744a48e60". artifact: 763c9a5286 user: quarry
13:18 • Reply: bf5fbed5, the last open item: name the failure cause. zit 0.3.27 already names HTTP statuses ("the peer answered HTTP 404") but says "cannot connect" alike for a host that no longer resolves, a server that refuses, and a certificate that fails. When a pull fails with that message, PullMirror now probes the upstream the way the pull began (resolve, dial, TLS handshake, 10s bound) and prefixes the first failing step to the stored error, so the fleet row, mirror.list lastErr and the streak alert read e.g. "host wapp.tcl.tk does not resolve — the project may have moved (zit pull: cannot connect …)". Reachable upstreams, HTTP-status failures and successes get no prefix. Quarry-side only, no zit change. Test: hermetic cases for DNS (.invalid), refused (closed local port), TLS (self-signed httptest), reachable, HTTP status, no error. artifact: 8c4fb83ea0 user: dmestas
13:18 • Edit [11c5936f22]: Mark "Closed". artifact: 43a3571fc3 user: quarry
13:17 • Post: bf5fbed5, the last open item: name the failure cause. zit 0.3.27 already names HTTP statuses ("the peer answered HTTP 404") but says "cannot connect" alike for a host that no longer resolves, a server that refuses, and a certificate that fails. When a pull fails with that message, PullMirror now probes the upstream the way the pull began (resolve, dial, TLS handshake, 10s bound) and prefixes the first failing step to the stored error, so the fleet row, mirror.list lastErr and the streak alert read e.g. "host wapp.tcl.tk does not resolve — the project may have moved (zit pull: cannot connect …)". Reachable upstreams, HTTP-status failures and successes get no prefix. Quarry-side only, no zit change. Test: hermetic cases for DNS (.invalid), refused (closed local port), TLS (self-signed httptest), reachable, HTTP status, no error. artifact: 7fe97160e5 user: dmestas
13:17
A mirror that cannot connect says why: host does not resolve, connection refused, or TLS failed (bf5fbed5) closed check-in: 11c5936f22 user: dmestas tags: a-dead-mirror-says-why
13:14 • Edit [d12a16df7e]: Add "ci-pass" with value "deeaecd657e230f9788798b6d251d7fd". artifact: 2970ad8bfc user: quarry
13:14
Create new branch named "a-dead-mirror-says-why" check-in: d12a16df7e user: dmestas tags: a-dead-mirror-says-why
13:07 • Edit [4e97619881]: Add "ci-pass" with value "c12857ae7905bbea54f70e2e4f846b7c". artifact: d58ebb6a0f user: quarry
13:06
land quarry-runner check-in: 4e97619881 user: dmestas tags: trunk
13:06 • Edit [4e97619881]: Add "landing" with value "3d5f1695dd12e860036caadeae66d76ae1a5cfcc3182507c1d94235bb11d65cf". artifact: 63fa0d8fa2 user: quarry
13:06 • Reply: f24d78d9, step 2 of 3. New internal/runner and `quarry runner <forge>/r/<repo>` (token from QUARRY_RUNNER_TOKEN, never a flag). It holds the engine registration stream open through the forge bridge (cdd44c3b), long-polls one task type per request because a poll answer does not say which type it is, takes a slot before claiming, checks out the check-in under test with zit (from the forge URL; the engine hands workers a loopback clone URL), reads ci/runner.json AT that check-in, runs the argv for the task type, streams output to the run log in half-second batches, heartbeats the claim, and resolves complete or fail. Manifest entries are an argv array or {argv, fail_on_output}; a type the check-in does not name fails saying which it does. Task names default to the manifest on trunk. The CI setup page now names the command. Tests: a fake bridge drives pass, fail, fail_on_output and a missing type under -race; manifest parsing. Step 3 moves quarrys own CI onto it. artifact: c7de73290f user: dmestas
13:06 • Edit [52bb2960ed]: Mark "Closed". artifact: 326f86b31a user: quarry
13:06
land runners-reach-the-engine-through-the-forge check-in: d1278d8737 user: dmestas tags: trunk
13:06 • Edit [d1278d8737]: Add "landing" with value "cdd44c3be0f21352f2c8955606c9fa3e300a3c9e4359e6633fcd364a4e9fa403". artifact: 3ca835f3a5 user: quarry
13:06 • Reply: f24d78d9, step 1 of 3 (the transport). dagnats has an HTTP worker protocol, connect/poll/resolve/logs, authenticated by worker tokens scoped to task-type prefixes and one group; it listens only on the box. New internal/cibridge forwards exactly those four routes at POST /r/{repo}/ci/bridge/v1/..., mounted beside the sync routes when an engine is configured. A poll is pinned to ci.GroupFor(repo) and a poll naming another group is refused before the engine; the engine admin bearer is refused on this path (403); no token is 401; an unknown repository is 404; the connect SSE stream is flushed as written. Tokens remain the engines to check. Next: the quarry runner that speaks this, then quarrys own CI moved onto it. artifact: e29633aeef user: dmestas
13:06 • Edit [e306ae31fe]: Mark "Closed". artifact: 6f51957089 user: quarry
12:45 • Edit [52bb2960ed]: Add "ci-pass" with value "e412a76536301aaed36e050e5d3bcf02". artifact: ce7be34d12 user: quarry
12:44 • Post: f24d78d9, step 2 of 3. New internal/runner and `quarry runner <forge>/r/<repo>` (token from QUARRY_RUNNER_TOKEN, never a flag). It holds the engine registration stream open through the forge bridge (cdd44c3b), long-polls one task type per request because a poll answer does not say which type it is, takes a slot before claiming, checks out the check-in under test with zit (from the forge URL; the engine hands workers a loopback clone URL), reads ci/runner.json AT that check-in, runs the argv for the task type, streams output to the run log in half-second batches, heartbeats the claim, and resolves complete or fail. Manifest entries are an argv array or {argv, fail_on_output}; a type the check-in does not name fails saying which it does. Task names default to the manifest on trunk. The CI setup page now names the command. Tests: a fake bridge drives pass, fail, fail_on_output and a missing type under -race; manifest parsing. Step 3 moves quarrys own CI onto it. artifact: 3d5f1695dd user: zeitgeist
12:44
quarry runner: a CI worker an owner runs on their own machine, running what ci/runner.json names at the check-in under test closed check-in: 52bb2960ed user: dmestas tags: quarry-runner
12:33 • Edit [e306ae31fe]: Add "ci-pass" with value "cbe7852bbd9f6e9b6a67042b266824ef". artifact: 31ccc1e4f1 user: quarry
12:32 • Post: f24d78d9, step 1 of 3 (the transport). dagnats has an HTTP worker protocol, connect/poll/resolve/logs, authenticated by worker tokens scoped to task-type prefixes and one group; it listens only on the box. New internal/cibridge forwards exactly those four routes at POST /r/{repo}/ci/bridge/v1/..., mounted beside the sync routes when an engine is configured. A poll is pinned to ci.GroupFor(repo) and a poll naming another group is refused before the engine; the engine admin bearer is refused on this path (403); no token is 401; an unknown repository is 404; the connect SSE stream is flushed as written. Tokens remain the engines to check. Next: the quarry runner that speaks this, then quarrys own CI moved onto it. artifact: cdd44c3be0 user: zeitgeist
12:32
a runner on its owner machine reaches the CI engine worker routes through the repository URL, pinned to its group, admin bearer refused closed check-in: e306ae31fe user: dmestas tags: runners-reach-the-engine-through-the-forge
12:29 • Ticket [f24d78d96e] ci: quarry-native runner — generic 'quarry runner' + ci/runner.json manifest status still Open with 2 other changes artifact: a7fa63a5cb user: zeitgeist
12:29 • Ticket [b73c6408da] ci: offload drained run logs to S3, local dir as hot cache status still Open with 2 other changes artifact: 4b60e3c325 user: zeitgeist
12:18 • Closed ticket [029c4730c0]: ci: throttle the worker — max concurrent tasks, and a queueing story beyond it plus 3 other changes artifact: 5bba13838d user: zeitgeist
12:18 • Edit [3854ba15f6]: Mark "Closed". artifact: ea33730602 user: dmestas
12:18 • Edit [b134474af9]: Mark "Closed". artifact: daed2687df user: dmestas
12:18 • Edit [0e062d9446]: Mark "Closed". artifact: c3638a8dbf user: dmestas
12:18 • Edit [fbe430a1ea]: Mark "Closed". artifact: 47bf37a1d4 user: dmestas
12:17 • Edit [3854ba15f6]: Add "ci-pass" with value "29ed63a59ebbc5622dc21b3ef9bb8acc". artifact: 4796c0a044 user: quarry
12:17 • Edit [b134474af9]: Add "ci-pass" with value "8471e7667db1fab5bdc0284b30f27a35". artifact: c4d7414be7 user: quarry
12:17 • Edit [0e062d9446]: Add "ci-pass" with value "078c193ef88f44214818f2fb4f1bedca". artifact: 6ca7e93715 user: quarry
12:17 • Edit [fbe430a1ea]: Add "ci-pass" with value "b39ef5b579d8dec42b349e5b4dcf83c5". artifact: c8a7e14354 user: quarry
12:17
burst2 probe 4 (029c4730) closed check-in: 3854ba15f6 user: dmestas tags: burst2-probe-4
12:17
burst2 probe 3 (029c4730) closed check-in: b134474af9 user: dmestas tags: burst2-probe-3
12:17
burst2 probe 2 (029c4730) closed check-in: 0e062d9446 user: dmestas tags: burst2-probe-2
12:17
burst2 probe 1 (029c4730) closed check-in: fbe430a1ea user: dmestas tags: burst2-probe-1
12:15 • Edit [eea48c5747]: Add "ci-pass" with value "e294dfc7d2ac4cd440dc1991a7efdadc". artifact: b30453de57 user: quarry
12:15
land a-drain-fills-the-worker-by-steps check-in: eea48c5747 user: dmestas tags: trunk
12:15 • Edit [eea48c5747]: Add "landing" with value "3227928923a26c84ec41e952e695b338036144fd80e7f56a80de735cb35e17c4". artifact: 34a33856f1 user: quarry
12:15 • Reply: Third fix for 029c4730, measured on 7ead79c34e8f: the four waiting probe branches drained, but all four started in the same second into a worker with three slots. Each launch reserved one slot while a quarry run holds three steps, and after the deploy restart the engine can list the worker twice. Now take() re-asks the engine for occupancy after every launch (the new run already lists its steps as queued), and capacity counts only worker registrations heard from in the last 90s. Test: four waiting branches, capacity 3, runs of three steps, a stale second registration: only the longest wait starts; it fails under the old one-slot-per-run accounting. artifact: dcce7a9fd6 user: dmestas
12:15 • Edit [06eb60b53e]: Mark "Closed". artifact: 95655ab6d8 user: quarry
12:13 • Edit [06eb60b53e]: Add "ci-pass" with value "61c919d21909ef335ff615895944e7fc". artifact: cda14c4ab6 user: quarry
12:13 • Edit [429e1332d0]: Mark "Closed". artifact: 3a31b9a829 user: dmestas
12:13 • Edit [13f918f4cd]: Mark "Closed". artifact: 11d2db06ca user: dmestas
12:13 • Edit [5ba201ffc0]: Mark "Closed". artifact: fe4d161c37 user: dmestas
12:13 • Edit [991dadf002]: Mark "Closed". artifact: 1bd9bf9508 user: dmestas
12:13 • Edit [9eb6e6d9fa]: Mark "Closed". artifact: 287e7033e3 user: dmestas
12:12 • Post: Third fix for 029c4730, measured on 7ead79c34e8f: the four waiting probe branches drained, but all four started in the same second into a worker with three slots. Each launch reserved one slot while a quarry run holds three steps, and after the deploy restart the engine can list the worker twice. Now take() re-asks the engine for occupancy after every launch (the new run already lists its steps as queued), and capacity counts only worker registrations heard from in the last 90s. Test: four waiting branches, capacity 3, runs of three steps, a stale second registration: only the longest wait starts; it fails under the old one-slot-per-run accounting. artifact: 3227928923 user: zeitgeist
12:12
the CI deferral re-measures the worker after each launch and ignores worker registrations that have gone quiet closed check-in: 06eb60b53e user: dmestas tags: a-drain-fills-the-worker-by-steps
12:09 • Edit [13f918f4cd]: Add "ci-pass" with value "3d4053552d1bdf064df8409cc2e08a29". artifact: e503556ab1 user: quarry
12:09 • Edit [5ba201ffc0]: Add "ci-pass" with value "c8c83f7b78b8770e8978cb050c2bd152". artifact: 69e2d9f558 user: quarry
12:09 • Edit [991dadf002]: Add "ci-pass" with value "dc4d2a6dab8063f718c5c2ac0fa3b9db". artifact: 154592bd7c user: quarry
12:09 • Edit [9eb6e6d9fa]: Add "ci-pass" with value "7199e35cbec1d8d0b1ee35474cae4ba2". artifact: cbfbfa30e9 user: quarry
12:07 • Edit [7ead79c34e]: Add "ci-pass" with value "123e5ef7746984f4849513f4e94341d8". artifact: 48f0de598a user: quarry
12:07
land only-ci-runs-hold-a-ci-worker check-in: 7ead79c34e user: dmestas tags: trunk
12:07 • Edit [7ead79c34e]: Add "landing" with value "33df8ef5eb6ee2a4e36d9c94316d88464b0aeab7cf1610892bdc6c6f99ce8871". artifact: 88cfe566a4 user: quarry
12:07 • Reply: Second fix for 029c4730, measured on 6db5c9d71693: four probe branches pushed in 13s all waited and none drained in nine minutes. The engine is shared with the notification service, whose quarry-activity digest workflows sit running for hours with a step running; five of them counted as five occupied slots of three. Occupancy now counts only runs carrying a pipeline label, which every run quarry launches has and nothing else does. The test engine now lists a non-CI digest run beside the zombie; the zombie test fails without the filter. artifact: 525ede63ba user: dmestas
12:07 • Edit [515778ee55]: Mark "Closed". artifact: a7c03fb55f user: quarry
12:04 • Edit [515778ee55]: Add "ci-pass" with value "fc6f17e2ed60eefa6503a0ac1ac06c28". artifact: 670014aee4 user: quarry
12:02 • Post: Second fix for 029c4730, measured on 6db5c9d71693: four probe branches pushed in 13s all waited and none drained in nine minutes. The engine is shared with the notification service, whose quarry-activity digest workflows sit running for hours with a step running; five of them counted as five occupied slots of three. Occupancy now counts only runs carrying a pipeline label, which every run quarry launches has and nothing else does. The test engine now lists a non-CI digest run beside the zombie; the zombie test fails without the filter. artifact: 33df8ef5eb user: zeitgeist
12:02
the CI deferral counts only CI runs; the notification digests on the same engine hold no CI worker closed check-in: 515778ee55 user: dmestas tags: only-ci-runs-hold-a-ci-worker
11:55 • Closed ticket [5d40f1515d]: Detect and surface divergence between a mirror and its upstream plus 3 other changes artifact: d76f1615e2 user: zeitgeist
11:51
burst probe 4 (029c4730) closed check-in: 13f918f4cd user: dmestas tags: burst-probe-4
11:51
burst probe 3 (029c4730) closed check-in: 5ba201ffc0 user: dmestas tags: burst-probe-3
11:51
burst probe 2 (029c4730) closed check-in: 991dadf002 user: dmestas tags: burst-probe-2
11:51
burst probe 1 (029c4730) closed check-in: 9eb6e6d9fa user: dmestas tags: burst-probe-1
11:50 • Edit [6db5c9d716]: Add "ci-pass" with value "0d3a4c703c8a561c6bb56e8eab297b1d". artifact: 1d9ee19e08 user: quarry
11:49
land the-worker-is-full-when-its-steps-are check-in: 6db5c9d716 user: dmestas tags: trunk
11:49 • Edit [6db5c9d716]: Add "landing" with value "cf5ec537e63b73502c49b4cd928392bb5d0845d87339bd72b1f284e792694152". artifact: 811417fe51 user: quarry
11:49 • Reply: Fix for cb627331 (029c4730), found measuring it on 7a5d179697db: the deferral compared worker capacity (3) with the forge ci_run rows marked running (13), and the engine agreed there were 13 running runs, but twelve are dantest-sandbox runs queued since 18-22 September for html/puzzles task types no worker serves; one step was actually running. So every unproposed branch would wait forever. Occupancy now comes from the engine as STEPS: every running step, plus queued steps on runs created in the last 15 minutes; steps queued longer are waiting for a worker that does not exist and take no slot. The store count (RunningCIRuns) is removed. Tests: the fake engine lists a zombie run in every answer; a new test proves a worker with nothing running and a zombie present launches the branch, and fails when stale queued steps count. artifact: b671d7bcab user: dmestas
11:49 • Edit [f210055869]: Mark "Closed". artifact: 410fb673e4 user: quarry
11:49
land a-push-onto-a-mirror-is-recorded check-in: c72c5291b6 user: dmestas tags: trunk
11:49 • Edit [c72c5291b6]: Add "landing" with value "f9f87716f229afb9b32539d381804277d3c210b4eaa5c38d5ef963beba3afb25". artifact: 6d9165b1f0 user: quarry
11:49 • Reply: 5d40f151, the gate half of the peer landing 3f0776bc: the fronter gains a push listener (SetPushed), fired once per round carrying a push that this forge admitted and the store answered 200 with no error card; a clone, a pull, a posture-refused push and a store-refused push are never heard. main.go wires it to deps.MirrorDiverged(repo, ""), which stamps diverged_at on an enabled tracking mirror and is a no-op for everything else. The round widens the fronter scan condition only when a listener is installed. Test drives a real zit clone, pull, push and posture-refused push through the fronter. artifact: 0bc81a2306 user: dmestas
11:49 • Edit [0169caf825]: Mark "Closed". artifact: 77a2024951 user: quarry
11:49 • Edit [f210055869]: Add "ci-pass" with value "df5402928046ced5dfbecf1fe7d6af20". artifact: ba4d4391af user: quarry
11:48 • Ticket [029c4730c0] ci: throttle the worker — max concurrent tasks, and a queueing story beyond it status still Open with 2 other changes artifact: fd588ebb21 user: zeitgeist
11:47 • Post: Fix for cb627331 (029c4730), found measuring it on 7a5d179697db: the deferral compared worker capacity (3) with the forge ci_run rows marked running (13), and the engine agreed there were 13 running runs, but twelve are dantest-sandbox runs queued since 18-22 September for html/puzzles task types no worker serves; one step was actually running. So every unproposed branch would wait forever. Occupancy now comes from the engine as STEPS: every running step, plus queued steps on runs created in the last 15 minutes; steps queued longer are waiting for a worker that does not exist and take no slot. The store count (RunningCIRuns) is removed. Tests: the fake engine lists a zombie run in every answer; a new test proves a worker with nothing running and a zombie present launches the branch, and fails when stale queued steps count. artifact: cf5ec537e6 user: zeitgeist
11:47
the CI deferral measures the worker by the steps occupying it, not by runs the engine will never schedule closed check-in: f210055869 user: dmestas tags: the-worker-is-full-when-its-steps-are
11:44 • Edit [0169caf825]: Add "ci-pass" with value "973475d70ed0492a5001f3e8a0b451b4". artifact: 6f48e1bf02 user: quarry
11:43 • Post: 5d40f151, the gate half of the peer landing 3f0776bc: the fronter gains a push listener (SetPushed), fired once per round carrying a push that this forge admitted and the store answered 200 with no error card; a clone, a pull, a posture-refused push and a store-refused push are never heard. main.go wires it to deps.MirrorDiverged(repo, ""), which stamps diverged_at on an enabled tracking mirror and is a no-op for everything else. The round widens the fronter scan condition only when a listener is installed. Test drives a real zit clone, pull, push and posture-refused push through the fronter. artifact: f9f87716f2 user: zeitgeist
11:43
the sync gate tells the mirror store when a push lands on a tracking store closed check-in: 0169caf825 user: dmestas tags: a-push-onto-a-mirror-is-recorded
11:36 • Edit [7a5d179697]: Add "ci-pass" with value "dbc17dd3fe3d81b45961cf69cfbecadf". artifact: 293f5dbed8 user: quarry
11:35
land a-mirror-counts-what-its-upstream-lacks check-in: 7a5d179697 user: dmestas tags: trunk
11:35 • Edit [7a5d179697]: Add "landing" with value "3f0776bc15981fe3126c564df7c1c13a1a560150ddc84cf1bd358f5ae1c6b229". artifact: fb25b099ed user: quarry
11:35 • Reply: 5d40f151 (oltp/API half). zit has no probe for "leaves the upstream lacks", so the honest divergence signal is quarry's own: a push admitted onto a tracking store. Deps.MirrorDiverged(repo, checkin) is the one call the sync gate makes at the point it admits the push; it is a no-op for a forge without a mirror store, a native repository, or a detached one, so the gate never asks first. mirror rows gain diverged (count) and diverged_last (newest hash); detach clears both. Shown as a chip on the fleet summary line (data-hook mirror-diverged, data-count), a badge on the fleet tile, and "N local check-ins upstream lacks" in the repository header posture; carried on mirror.list and repo.get. The xfer call itself is the peer's (029c4730 branch), not here. Tests: oltp count + newest + detach clears; Deps.MirrorDiverged records only for a tracking mirror; the fleet summary carries exactly one chip per diverged mirror. artifact: 805824d44f user: dmestas
11:35 • Edit [259327d758]: Mark "Closed". artifact: e05b8f49ca user: quarry
11:34
land branch-churn-waits-when-the-worker-is-full check-in: b3c73bc650 user: dmestas tags: trunk
11:34 • Edit [b3c73bc650]: Add "landing" with value "cb6273319c29b0b2ad89544e911dd624f3f293cdbb66de9d4ae5e0b04ac514ef". artifact: d683ea29e7 user: quarry
11:34 • Reply: 029c4730 as dmestas chose: quarry-side deferral. The trigger asks the engine for capacity (the sum of every worker max_tasks) and the store for what is in flight, only once a launch is on the table; when full, a fresh check-in on a branch nobody has proposed is recorded in a new ci_deferred table instead of started (trunk and any branch with an open landing start regardless), the watermark still advances, and each round drains the waiting list longest-wait first as room appears, or at once for a branch that has since been proposed. Any start (fold, re-run, landing open) forgets the wait. checksOn shows a waiting row (status deferred, no run to link) so the check-in and landing pages never show nothing, withoutVerdict does not count it as a verdict so a landing opened over it asks, and the page says the worker is full and when it will run. Unknown capacity (an engine that does not list workers) never defers. Tests: full worker defers churn but not trunk or a proposed branch, drains when a slot frees, starts a waiting branch once proposed, unknown capacity never defers; oltp round trip; the checks row and verdict rule. artifact: e24ec4f377 user: dmestas
11:34 • Edit [6837d72390]: Mark "Closed". artifact: 25a9ecba38 user: quarry
03:00 • Edit [259327d758]: Add "ci-pass" with value "8116ea601d4779fa8a61834770215a6b". artifact: 48caed733f user: quarry
02:58 • Reply: 5d40f151 (oltp/API half). zit has no probe for "leaves the upstream lacks", so the honest divergence signal is quarry's own: a push admitted onto a tracking store. Deps.MirrorDiverged(repo, checkin) is the one call the sync gate makes at the point it admits the push; it is a no-op for a forge without a mirror store, a native repository, or a detached one, so the gate never asks first. mirror rows gain diverged (count) and diverged_last (newest hash); detach clears both. Shown as a chip on the fleet summary line (data-hook mirror-diverged, data-count), a badge on the fleet tile, and "N local check-ins upstream lacks" in the repository header posture; carried on mirror.list and repo.get. The xfer call itself is the peer's (029c4730 branch), not here. Tests: oltp count + newest + detach clears; Deps.MirrorDiverged records only for a tracking mirror; the fleet summary carries exactly one chip per diverged mirror. artifact: d3cfe68451 user: dmestas
02:58
Divergence is a time, not a count: MirrorDiverged(repo, checkin, at) records the last admitted push, a hash only when the gate had one closed check-in: 259327d758 user: dmestas tags: a-mirror-counts-what-its-upstream-lacks
02:54 • Closed ticket [a06c9ad33f]: Mirror health: dashboard summary, notify after N consecutive failures, per-mirror pull history plus 3 other changes artifact: bb503231cd user: zeitgeist
02:52 • Post: 5d40f151 (oltp/API half). zit has no probe for "leaves the upstream lacks", so the honest divergence signal is quarry's own: a push admitted onto a tracking store. Deps.MirrorDiverged(repo, checkin) is the one call the sync gate makes at the point it admits the push; it is a no-op for a forge without a mirror store, a native repository, or a detached one, so the gate never asks first. mirror rows gain diverged (count) and diverged_last (newest hash); detach clears both. Shown as a chip on the fleet summary line (data-hook mirror-diverged, data-count), a badge on the fleet tile, and "N local check-ins upstream lacks" in the repository header posture; carried on mirror.list and repo.get. The xfer call itself is the peer's (029c4730 branch), not here. Tests: oltp count + newest + detach clears; Deps.MirrorDiverged records only for a tracking mirror; the fleet summary carries exactly one chip per diverged mirror. artifact: 3f0776bc15 user: dmestas
02:52 • Edit [fbb85ba415]: Add "ci-pass" with value "03535f1079ab02df34f1c728d363f98f". artifact: f683c35442 user: quarry
02:51 • Edit [fbb85ba415]: Edit check-in comment. artifact: e08ae5e5e2 user: dmestas
02:51
A tracking mirror counts the check-ins its upstream lacks (5d40f151): MirrorDiverged(repo, checkin) at the gate, shown on the fleet summary and the repository header, cleared by detach check-in: fbb85ba415 user: dmestas tags: a-mirror-counts-what-its-upstream-lacks
02:51 • Edit [6837d72390]: Add "ci-pass" with value "c91df72c6f89e6b85982fbd4bd2acb65". artifact: ad0da096a7 user: quarry
02:50 • Ticket [029c4730c0] ci: throttle the worker — max concurrent tasks, and a queueing story beyond it status still Open with 2 other changes artifact: 33ee748720 user: zeitgeist
02:49 • Post: 029c4730 as dmestas chose: quarry-side deferral. The trigger asks the engine for capacity (the sum of every worker max_tasks) and the store for what is in flight, only once a launch is on the table; when full, a fresh check-in on a branch nobody has proposed is recorded in a new ci_deferred table instead of started (trunk and any branch with an open landing start regardless), the watermark still advances, and each round drains the waiting list longest-wait first as room appears, or at once for a branch that has since been proposed. Any start (fold, re-run, landing open) forgets the wait. checksOn shows a waiting row (status deferred, no run to link) so the check-in and landing pages never show nothing, withoutVerdict does not count it as a verdict so a landing opened over it asks, and the page says the worker is full and when it will run. Unknown capacity (an engine that does not list workers) never defers. Tests: full worker defers churn but not trunk or a proposed branch, drains when a slot frees, starts a waiting branch once proposed, unknown capacity never defers; oltp round trip; the checks row and verdict rule. artifact: cb6273319c user: zeitgeist
02:49
when the workers are full a check-in on an unproposed branch waits in the forge and runs when a slot frees or a landing opens closed check-in: 6837d72390 user: dmestas tags: branch-churn-waits-when-the-worker-is-full
02:44 • Edit [5bbe5f1910]: Add "ci-pass" with value "d1be81db996c014165607aaf30453f18". artifact: 7796b50941 user: quarry
02:43
land a-mirror-says-when-it-stopped check-in: 5bbe5f1910 user: dmestas tags: trunk
02:43 • Edit [5bbe5f1910]: Add "landing" with value "80d908ab5cf86d7719589479b0b3de08b37eda17ab3f7c7215be0e1a4dfa1227". artifact: e598df8bfd user: quarry
02:43 • Reply: a mirror keeps its last twenty pulls, tells an admin at chosen failure streaks and on recovery, and the fleet page says so in one line artifact: 9620a9b5b1 user: dmestas
02:43 • Edit [22d9ebddac]: Mark "Closed". artifact: 15cacea713 user: quarry
02:41 • Edit [22d9ebddac]: Add "ci-pass" with value "f763e547dc08a1e8df48362a1aded9af". artifact: 1ee4ee5a51 user: quarry
02:40 • Post: a mirror keeps its last twenty pulls, tells an admin at chosen failure streaks and on recovery, and the fleet page says so in one line artifact: 80d908ab5c user: dmestas
02:40 • Edit [22d9ebddac]: Edit check-in comment. artifact: b29fe66b9d user: dmestas
02:39
a mirror keeps its last twenty pulls, tells an admin at chosen failure streaks and on recovery, and the fleet page says so in one line closed check-in: 22d9ebddac user: dmestas tags: a-mirror-says-when-it-stopped
02:36 • Edit [71e709557f]: Add "ci-pass" with value "19f66d1ede52e2dfa29ce31700942fc3". artifact: e00c9b4c36 user: quarry
02:36
land the-owner-hint-fires-only-for-a-real-route check-in: 71e709557f user: dmestas tags: trunk
02:36 • Edit [71e709557f]: Add "landing" with value "f191eb1c0f36cb75124a5ea1aaf48549136d4b64a33d78588dd498570f2f3d16". artifact: 06c3568518 user: quarry
02:36 • Reply: the owner-prefix hint fires only when the path minus the owner is a route this API has artifact: 3e8d343182 user: dmestas
02:36 • Edit [74223db3c3]: Mark "Closed". artifact: b853d43c7d user: quarry
02:35
land repositories-register-a-few-at-a-time check-in: aadbc5b6d5 user: dmestas tags: trunk
02:35 • Edit [aadbc5b6d5]: Add "landing" with value "fa346f219ec203aac0b041c06361295de4ecc5e2824f8455b2b3c1406053bb58". artifact: 7c0a2ea9f8 user: quarry
02:35 • Reply: repositories register four at a time at startup, so the window is the slowest store, not the sum artifact: 843a0b157f user: dmestas
02:35 • Edit [68cb7d6481]: Mark "Closed". artifact: a6ec899bfe user: quarry
02:33 • Edit [74223db3c3]: Add "ci-pass" with value "44a0a3ffa0ca4a9f75e295f52eba5f16". artifact: 3394f3f603 user: quarry
02:31 • Post: the owner-prefix hint fires only when the path minus the owner is a route this API has artifact: f191eb1c0f user: dmestas
02:31 • Edit [74223db3c3]: Edit check-in comment. artifact: d76d801df6 user: dmestas
02:31
the owner-prefix hint fires only when the path minus the owner is a route this API has closed check-in: 74223db3c3 user: dmestas tags: the-owner-hint-fires-only-for-a-real-route
02:29 • Edit [68cb7d6481]: Add "ci-pass" with value "428d0d78746aeb8a74606b8ddc6ee872". artifact: 93451cf196 user: quarry
02:28 • Post: repositories register four at a time at startup, so the window is the slowest store, not the sum artifact: fa346f219e user: dmestas
02:28 • Edit [68cb7d6481]: Edit check-in comment. artifact: 0008fcf9d0 user: dmestas
02:28
repositories register four at a time at startup, so the window is the slowest store, not the sum closed check-in: 68cb7d6481 user: dmestas tags: repositories-register-a-few-at-a-time
02:26 • Edit [a4b935115a]: Add "ci-pass" with value "a380a80aeea156671388ac6f286b01ce". artifact: cec524a93a user: quarry
02:26 • Edit [429e1332d0]: Add "ci-pass" with value "bc78b35e56af91c1d84f557df1aa614f". artifact: 85c28a59ee user: quarry
02:26 • Closed ticket [49323c3374]: ci: fire a run when a landing opens and its tip has none plus 3 other changes artifact: b0a98371eb user: zeitgeist
02:26 • Reply: probe landing 2 for 49323c33; reject after measuring artifact: ecd1e414db user: zeitgeist
02:25
land clean-is-not-will-land check-in: a4b935115a user: dmestas tags: trunk
02:25 • Edit [a4b935115a]: Add "landing" with value "feade3f1fedd5122c404a8f9bd0191468dc4b7a54c9e97cbadf11aa711216e56". artifact: 3074221046 user: quarry
02:25 • Reply: a stacked rung says its probe was against the rung below, not the trunk it will meet artifact: 91c27ef376 user: dmestas
02:25 • Edit [ea0b76f049]: Mark "Closed". artifact: 895f31c902 user: quarry
02:25 • Edit [ea0b76f049]: Add "ci-pass" with value "a6fe9318a72e7996495873ed1b305a1f". artifact: 0965a7675d user: quarry
02:25 • Post: probe landing 2 for 49323c33; reject after measuring artifact: c961e66714 user: zeitgeist
02:25
probe 2: cancel the run, then open the landing by push closed check-in: 429e1332d0 user: dmestas tags: ci-probe-49323c33
02:24 • Post: a stacked rung says its probe was against the rung below, not the trunk it will meet artifact: feade3f1fe user: dmestas
02:24 • Edit [1b8de9c8eb]: Add "ci-pass" with value "81c078ff9fed00318064a96ee844aa1d". artifact: 18d3ff80c5 user: quarry
02:24 • Edit [ea0b76f049]: Edit check-in comment. artifact: 7dc9a6b24f user: dmestas
02:24
a stacked rung says its probe was against the rung below, not the trunk it will meet closed check-in: ea0b76f049 user: dmestas tags: clean-is-not-will-land
02:24 • Reply: probe landing for 49323c33; reject after measuring artifact: 8ff85114a7 user: zeitgeist
02:24
land ci-probe-49323c33 check-in: 1b8de9c8eb user: dmestas tags: trunk
02:24 • Edit [1b8de9c8eb]: Add "landing" with value "c148e662d0aa111ea1e65696b4411e47785ddd46ab34f0de7e37587f0625f030". artifact: 282c11cea4 user: quarry
02:24 • Reply: probe landing for 49323c33; reject after measuring artifact: d5b61e68d0 user: dmestas
02:24 • Edit [4c08437225]: Mark "Closed". artifact: fdaad074de user: quarry
02:24 • Edit [4c08437225]: Add "ci-pass" with value "ed1c521ad4e60c0ccb90b7dc3c74753d". artifact: 0393afa251 user: quarry
02:24 • Post: probe landing for 49323c33; reject after measuring artifact: c148e662d0 user: zeitgeist
02:24
probe: a pushed landing asks for its run (49323c33) check-in: 4c08437225 user: dmestas tags: ci-probe-49323c33
02:21 • Edit [0c568a642f]: Add "ci-pass" with value "fb89ef2929e9a7f208d7c238e6668ada". artifact: 01c1949feb user: quarry
02:20
land a-pushed-landing-asks-for-its-run check-in: 0c568a642f user: dmestas tags: trunk
02:20 • Edit [0c568a642f]: Add "landing" with value "562188a3ac5ad51c2feccaac236a7fabb1641d8e0c782134556778f6143acd0a". artifact: 237009fb65 user: quarry
02:20 • Reply: 49323c33: landing.open already asked CI for a run when a required check had no verdict at the branch tip, but zit opens every landing by push, which never passes through that op, so a landing at a check-in whose run was pruned or cancelled waited at "Waiting for 1 required check" until somebody found Re-run. The ask is now one exported producer, Deps.RunForOpenedLanding, called by landing.open and by a landingSweep after every fold: the sweep seeds the open landings on its first pass without asking (a restart is not a thousand landings opening), then asks once for each landing a fold adds. A pass, a failure or a run in flight is left alone; a cancelled run counts as no verdict; a premerge subject is left to quarry-premerge. Tests: the producer across five cases; the sweep seeding, asking once, and not asking twice. artifact: 3bc432c74c user: dmestas
02:20 • Edit [27f1da3b5b]: Mark "Closed". artifact: f44bcdce59 user: quarry
02:20 • Edit [27f1da3b5b]: Add "ci-pass" with value "394456f2add279478edc2802e34a899d". artifact: 0e9ea2afa1 user: quarry
02:19 • Post: 49323c33: landing.open already asked CI for a run when a required check had no verdict at the branch tip, but zit opens every landing by push, which never passes through that op, so a landing at a check-in whose run was pruned or cancelled waited at "Waiting for 1 required check" until somebody found Re-run. The ask is now one exported producer, Deps.RunForOpenedLanding, called by landing.open and by a landingSweep after every fold: the sweep seeds the open landings on its first pass without asking (a restart is not a thousand landings opening), then asks once for each landing a fold adds. A pass, a failure or a run in flight is left alone; a cancelled run counts as no verdict; a premerge subject is left to quarry-premerge. Tests: the producer across five cases; the sweep seeding, asking once, and not asking twice. artifact: 562188a3ac user: zeitgeist
02:19
a landing that arrives by push asks CI for the run its tip lacks, from the same producer landing.open uses closed check-in: 27f1da3b5b user: dmestas tags: a-pushed-landing-asks-for-its-run
02:13 • Ticket [4b8508f3b0] Settings: configuration export, and mirror controls on the repository page status still Open with 2 other changes artifact: f96e9654c2 user: zeitgeist
00:33 • Ticket [4b8508f3b0]: 2 changes artifact: dccd1dbc38 user: zeitgeist
00:33 • Ticket [a78a1bd913] Repository lifecycle: edit, seed, list, settings, delete status still Open with 2 other changes artifact: fce49ed992 user: zeitgeist
00:33 • Closed ticket [8318bd2819]: Teams: organisations that own repositories and carry grants plus 3 other changes artifact: 7a8e4fc132 user: zeitgeist
00:32 • Closed ticket [66925a7add]: Quarry-managed tickets: keep triage out of the DAG, promote what belongs in it plus 3 other changes artifact: 10edf7fe64 user: zeitgeist
00:11 • Edit [e538362949]: Add "ci-pass" with value "2a93d76a384aab4146103c294107a371". artifact: e55b1f71fb user: quarry
00:11
land immutable-follows-the-url-not-the-etag check-in: e538362949 user: dmestas tags: trunk
00:11 • Edit [e538362949]: Add "landing" with value "a23d89dea0e3fabf53773d2640c982c82d7c1f4df85a53cd1689742eaa3bc659". artifact: a393e4a33e user: quarry
00:11 • Reply: an archive URL is immutable only when it names a hash; a branch archive keeps its ETag and revalidates artifact: 571c4e56e4 user: dmestas
00:11 • Edit [e9488f3870]: Mark "Closed". artifact: 95bb4f7091 user: quarry
00:08 • Edit [e9488f3870]: Add "ci-pass" with value "752347d94d2f9526deecb6d7632a3d83". artifact: a5241cae43 user: quarry
00:07 • Post: an archive URL is immutable only when it names a hash; a branch archive keeps its ETag and revalidates artifact: a23d89dea0 user: dmestas
00:07 • Edit [e9488f3870]: Edit check-in comment. artifact: 88632d8620 user: dmestas
00:07
an archive URL is immutable only when it names a hash; a branch archive keeps its ETag and revalidates closed check-in: e9488f3870 user: dmestas tags: immutable-follows-the-url-not-the-etag
00:00 • Edit [33a96e72c3]: Add "ci-pass" with value "fc26f1970f066aa0558af969b335f5d1". artifact: 3a0912a51b user: quarry