50 ancestors of a18be6d78d110a0b
|
2026-08-23
| ||
| 23:14 |
a person is a link: identicon and name go to their timeline
Fossil routes every surface through one helper (hyperlink_to_user); quarry had thirty-two places rendering a name and none of them clickable. One 'who' helper now, applied to the twenty that name an author — the account button and participant stacks stay decorative. timeline.list gains user=, paired with y=all: what someone did includes their wiki edits and ticket changes, not just check-ins. check-in: a18be6d78d user: dmestas tags: trunk | |
| 23:08 |
timeline: internal nodes match the leaf's painted size
The ring is stroked 2.2, so it paints to r+1.1; a 4.8 disc beside it read a fifth smaller. Internals are the ring's outer edge, filled. check-in: e1f3ed4bac user: dmestas tags: trunk | |
| 22:37 |
markdown: a mention reads like a byline
Mark then name, in the page's colour, orange on hover. The sigil is syntax and the mark already says this is a person; a name that is orange everywhere stops meaning clickable anywhere. check-in: dda6810776 user: dmestas tags: trunk | |
| 22:31 |
markdown: mentions carry the identity mark, quotes are visible
An @mention now renders the same glyph as the person's byline, through the resolver seam so markup still knows nothing about accounts. The identicon moved to internal/idn — web and api each hashed the name separately and agreed by luck. Blockquotes had no rule at all. check-in: 0ba22dea9e user: dmestas tags: trunk | |
| 22:19 |
landings: the forum's post card, and the tracker's list
f-post-h and f-post-b are where the padding lives; naming the wrapper alone gets a border round unpadded text. Check-ins use the same bordered list every other listing in the forge uses. check-in: 20373a1806 user: dmestas tags: trunk | |
| 22:13 |
landings: use the shared composer frame, collapse the diff
The composer's textarea has no border of its own — it is built for the f-reply wrapper the ticket page and forum use, and without it the tabs and text floated unframed. The diff is a details now: this page is where a decision is made, and 600 lines between the proposal and the buttons means scrolling past the change to reach them. check-in: 59d7d8fa4c user: dmestas tags: trunk | |
| 22:04 |
merge trunk: landings
Textually clean, but branchTipOf called Timeline with the old positional signature — ported to TimelineFilter. check-in: dae2180a89 user: dmestas tags: trunk | |
| 22:03 |
check-in page: tag history, branch diff, manifest view
Fossil lets an author correct a check-in comment after the fact; quarry showed the superseded C card as if it were current, on 697 fossil check-ins. The correction is now applied at read, batched in AttachCI, with the original kept beside it — the stored card is an artifact fact and stays untouched. hidden and closed surface too. Branch diff is the branch against its fork point, which is not the landing page's base (the target's current tip). Offered only where a fork point exists. The manifest view renders the eight cards that are not the file list and counts the other 980, linking the tree. Also: unified/side-by-side now swaps in place via datastar, keeping the window and correcting the URL; the wiki note panel lets blocks use the full width while prose keeps its measure. check-in: ff7f5d3d69 user: dmestas tags: trunk | |
| 22:01 |
landings: a way to open one, and the lifecycle written down
docs/landings.md covers the whole loop and says plainly that a landing is a forum thread plus branch tags. Writing it found the gap: there was no create control at all. A mirror offers its upstream instead. check-in: c6aa693938 user: dmestas tags: trunk | |
| 21:50 |
landings: prove the lifecycle end to end
open, comment, reject, accept through the forge against a real store — accept merges to trunk via zit#131's bare-store path. Also checks the record still reads as an ordinary forum thread. check-in: 9a84a5d962 user: dmestas tags: trunk | |
| 21:43 |
landings: memoise the mergeability probe on the tip pair
The probe is a full-store scan by design and measures 2.0s here, paid on every view. Keyed on the two check-ins, so a push invalidates it by making a different key rather than by anyone clearing a cache. 1.9s cold, 50ms warm. check-in: 21d510a5bd user: dmestas tags: trunk | |
| 21:38 |
landings: list the branch's check-ins
A proposal is changes with reasons attached; a diff keeps the changes and throws the reasons away. zit#133's display half, from our own index. check-in: 120277efc7 user: dmestas tags: trunk | |
| 21:35 | merge landing mergeability with trunk check-in: 537889b661 user: dmestas tags: trunk | |
| 21:35 |
landings: read mergeability from the store, never from an attempt
zit#131 landed the probe and exit 5. A conflicted landing renders as blocked with its paths named and accept disabled; a refused accept is a state to show, not a fault to report. Unknown is never treated as clean. check-in: e0f59b6abf user: dmestas tags: trunk | |
| 21:06 |
check-in page: patch link, full hash + copy, tags, change stats
Stats are tallied at parse time so a windowed diff reports the whole file, and sit on the file header as well as the summary line. Tags come from checkin_tag, newest word per name winning. Copy falls back through execCommand to selection: navigator.clipboard is undefined on the plain-HTTP origins quarry is usually served from. check-in: ac056aaa1d user: dmestas tags: trunk | |
| 20:11 | merge idn-open: identicons everywhere, About note expanded check-in: ff7c8babbe user: dmestas tags: trunk | |
| 20:11 |
web: identicons on every name, and the About note opens by default
The timeline already had them; the ticket list did not — its row uses .Created and my earlier pass patched a different template that uses .Opened. Also added to ticket timeline entries and the forum queue. The note is no longer folded when long. It was folded past ~1200 bytes because fossil's auto-toc note runs three screens and pushed a timeline below the fold, but a note written about this artifact is the context you came for. The summary stays, so it can still be collapsed; the threshold and the NoteLong field it fed are gone rather than left dead. closed check-in: eb1f126e04 user: dmestas tags: idn-open | |
| 20:02 | merge ci-context: context panel, graph nodes, identicons check-in: f78fd539af user: dmestas tags: trunk | |
| 20:01 |
check-in: context panel, graph nodes, identicons on every name
Fossil's Context panel: the check-in among its neighbours in time, which is the question somebody bisecting a regression is asking. Two bounded index walks, no store read. Needed a new index — every index on checkin led with branch, so ordering by date alone was a full scan of 20,928 rows plus a sort, twice a page. checkin_by_date puts the panel back at ~10ms. Nodes reuse the timeline's palette so a branch is one colour across the forge. One lane deliberately: three neighbours are a slice of time, not a graph. On a phone the row stacks and the drawn rail becomes a border, since an SVG node cannot stretch without distorting its circle. Identicons now appear wherever a person is named — check-in metadata, context rows, timeline, technotes, chat, attachments, wiki history. closed check-in: f73b5b9f05 user: dmestas tags: ci-context | |
| 19:19 | merge landings with trunk check-in: 8a034b58c7 user: dmestas tags: trunk | |
| 19:17 |
landings: the decision surface
A list of what awaits a decision and a page per record: proposal, diff against target computed at view time, discussion, and the controls. accept rides `i` because it merges; everything else is a forum cap. Transitions render as events — zit stores them as replies, which is encoding the interface exists to hide. check-in: 7d2a820f65 user: dmestas tags: trunk | |
| 14:28 | merge checkin-page: comment links, About placement, diff payload check-in: 071724226f user: dmestas tags: trunk | |
| 14:28 |
check-in: link comment routes, move About, stop shipping a dead patch
Comment links resolved only hashes and http URLs, so fossil's own Markdown and limitations rendered as raw markup. They now go through the same route table the wiki renderer uses, and an unmapped one degrades to its label instead of showing brackets. About moves below the comment and metadata — fossil's order. Above the title it was an empty bar floating over the page name. checkin.diff returned the raw patch on every call and nothing read it: ~78KB of duplicate serialised and parsed back per view. Now opt-in. Diffs are also memoised per immutable pair, like listings already are. closed check-in: 7a2510835d user: dmestas tags: checkin-page | |
| 13:50 | merge struct-links: wanted and unlinked reachable from the filter row check-in: c9c04092a9 user: dmestas tags: trunk | |
| 13:49 |
docs: surface the structure lists where they can be found
They were reachable only from a panel at the foot of the page — 36 rows down on a small wiki, a hundred on fossil. That is where you put something a reader already knows about, not where they discover it. Counts now sit in the filter row: wanted 1, unlinked 7. closed check-in: 6554752b15 user: dmestas tags: struct-links | |
| 13:42 |
index: fold landing records into a queryable surface
A landing (zit#127) is a reading of forum_post, not a new artifact kind, so the table is derived and recomputed whenever any post in its thread folds -- which is what makes a reply indexed before its root converge on the same row. Backfilled once at open for indexes whose posts predate the table. check-in: 3c6bee847a user: dmestas tags: trunk | |
| 12:31 |
timeline: the mainline claims rail 0 only when it is free
A merge whose two parents are both on trunk puts two chains in front of one column. Claiming rail 0 anyway stopped drawing the line that was already travelling there — the gap — and overwrote the commit it was heading to. Test asserts every head resumes its predecessor's tail. check-in: 6f34d948a0 user: dmestas tags: trunk | |
| 11:08 |
caps: private tickets exist for holders of e
The edge resolved a CapSet and threw it away; it now rides the context, so an op can ask which letters the caller holds. Private tickets list, count and resolve for e, and for nobody else. One privacyWhere() so a fourth read path cannot silently ship without the clause. check-in: 9b2b188ece user: dmestas tags: trunk | |
| 11:02 |
caps: gate private ticket fields on e instead of dropping them
The capability exists now (RFC 0004), so private_contact and contact are withheld by default and rendered to a holder of e. Default deny with no ungated-forge exemption: that rule would publish them. check-in: 86fadebbab user: dmestas tags: trunk | |
| 10:37 | merge ticket field writes with trunk check-in: 616766e048 user: dmestas tags: trunk | |
| 10:36 |
tickets: write every field the schema defines
The new-ticket form rendered type/severity/priority/subsystem and the handler forwarded none of them. foundin was readable and writable nowhere. The sidebar editor listed six of nine fields. check-in: a83e03f2f3 user: dmestas tags: trunk | |
| 10:36 | merge wiki-struct: structure lists get pages and name their askers check-in: 27828eeadd user: dmestas tags: trunk | |
| 10:36 |
docs: the structure lists get their own pages, and their askers
Three things the panel could not do. The lists were capped at twelve with "and 66 more" in plain text, which is a dead end wearing a summary's clothes — both now have a page, paged like everything else, reachable from the heading and from the count. A wanted page named nobody. It links to the create form, which is the right action, but said nothing about WHO reached for the name — a to-do item with no brief. The index now records the asking pages and the page lists them. Links counted link occurrences while its own doc and the tooltip both said pages; a page linking one absent name twice counted twice. Counts pages now. Layout: the count sat 496px from its label in a 595px row, because space-between flung it to the far edge. closed check-in: af8678e35b user: dmestas tags: wiki-struct | |
| 10:05 |
feed chips name events, not artifacts
One ticket changed nine times is nine rows here. "tickets 93,649" against 17,000 tickets had the right number and the wrong noun. check-in: bcdf35bcef user: dmestas tags: trunk | |
| 09:58 | merge feed kind fix with trunk check-in: 220dfcc70a user: dmestas tags: trunk | |
| 09:58 |
feed: ask the index for the kind, don't filter after
A chip counted its kind across the repository but paged a window of the whole timeline, so 234 tickets among thousands of check-ins gave ten pages with rows on almost none. Timeline takes a kind; event_by_kind covers it. check-in: 0238002099 user: dmestas tags: trunk | |
| 02:46 | merge idn-base: identicons are sized by default; doc grid aligns left check-in: 720cb2b07d user: dmestas tags: trunk | |
| 02:46 |
web: give the identicon a base size, and align the doc grid left
Every .idn rule was scoped to a parent — .avatar, .ft-meta, .f-post-h — so an identicon used anywhere new inherited no size, and an SVG with no size fills its container. The wiki history page rendered one person's mark at the width of the screen. A helper meant to be usable wherever a person is named has to be safe by default; the scoped rules are more specific and still win. Also drops the centring from the doc grid. It indented the block away from the page title, which sits outside the grid: on a doc page the heading started at 392px and its first paragraph at 495px. closed check-in: 717dbf0f20 user: dmestas tags: idn-base | |
| 02:39 | merge doc-reserve: the contents track is always reserved check-in: e210624077 user: dmestas tags: trunk | |
| 02:39 |
docs: reserve the contents track whether or not a page has contents
Sizing the grid to what each page happened to hold made the prose jump sideways every time a reader clicked from a page with headings to one without. The text should sit where it sat: the contents track is now always reserved, and an empty one costs nothing but space it was going to occupy anyway. The left rail still follows :has — a doc page has no siblings to list, and reserving a gutter for nothing is a different mistake. closed check-in: 6d2a12980e user: dmestas tags: doc-reserve | |
| 02:34 | merge numbered paging with trunk check-in: a4a27d1e77 user: dmestas tags: trunk | |
| 02:34 |
paging: numbered pages, GitHub's shape
Infinite scroll out, a real pager in: page numbers with both ends pinned, position, and every page a bookmarkable URL. The feed pages by offset now (a page is a position, not a place you arrived from) and says how far it reaches — 264K events is not a pager, it is an archive, and that lives on each repository's timeline. check-in: 98f77c8273 user: dmestas tags: trunk | |
| 02:29 | merge doc-links-abs: absolute fossil doc links render check-in: 9900339bd6 user: dmestas tags: trunk | |
| 02:29 |
doc: fossil's own /doc/ links land on the rendered page
fossil content links its documentation absolutely — the Cookbook has importing from Git — and the route mapping sent those to the file view. That was right when the file view was the only thing there was; since doc.get exists it has been putting readers in a source listing of a page quarry can render. Leaves /uv/ dropped: unversioned content is a fossil feature neither quarry nor zit has, and that is why Download renders as plain text rather than as a link to a 404. closed check-in: d53f14d5b5 user: dmestas tags: doc-links-abs | |
| 02:25 | merge doc-dirs: directory documents resolve to their index check-in: 9848396ba4 user: dmestas tags: trunk | |
| 02:25 |
doc: a directory serves its index, and falls back to the tree
Fossil's own docs link directories with a trailing slash — index.wiki carries a variety of techniques — and those all 404'd: the doc route found no renderable extension, redirected to the file view, and the file view cannot serve a directory. A real page was sitting behind the error the whole time (www/caps/index.md). A directory now serves its index document, preferring the formats that render into the page, found with one listing rather than a probe per candidate. A directory with no index goes to the TREE view; only an actual file falls back to source. closed check-in: ff17aa2517 user: dmestas tags: doc-dirs | |
| 02:18 | merge feed paging with trunk check-in: 0b79646346 user: dmestas tags: trunk | |
| 02:18 |
dashboard: the feed pages
A fixed window is a dead end for anyone whose repositories are busy. Cursor is date~hash, so the merged stream cannot repeat or skip where two events share a timestamp. Sentinel
| |
| 02:17 | merge doc-measure: prose at the measure, wide content at the column check-in: 9426c24e62 user: dmestas tags: trunk | |
| 02:17 |
docs: two widths — prose at the measure, wide content at the column
At 1800px the article ended 391 pixels short of the contents rail. That was not breathing room, it was a hole: the column took 1fr while the article capped at the measure, so the leftover sat between them. The column now sizes to its content and the block centres. Running text still caps at the measure — 73 characters a line, where reading wants 45-75 — but a code block, a table or a diagram gets the whole column, because wrapping those to prose width is what makes people scroll sideways. Measured on fossil's th1.md: prose 625px, code up to 1216. closed check-in: d11bec1130 user: dmestas tags: doc-measure | |
| 02:04 | merge assoc-notes: associated wiki pages appear on their artifact check-in: 440aa464bf user: dmestas tags: trunk | |