Skip to content
zit Timeline
Login

Timeline

50 ancestors of 6759506ea8133aed

2026-08-16
16:00
merge frames-memo: stream through the plaintext memo (#84) check-in: 6759506ea8 user: dmestas tags: trunk
16:00
frames streams through the plaintext memo (#84)

frames was the one bulk reader still calling the uncached content(), so a delta base was reconstructed once per referencing delta rather than once per run — superlinear work against a linear stream, on corpora that are ~90% deltas after a fossil import.

libfossil (17,449 artifacts): 12.4s -> 2.34s real, 12.0s -> 2.25s user. Output byte-identical, peak RSS down 362MB -> 314MB. memoize_undeltaed stays off: the sweep reads each artifact once, and bases are memoized regardless of their own frame kind, which is the win. closed check-in: 2e3bb0b9db user: dmestas tags: frames-memo

15:04
merge record-cards: technote C/T cards and forum N card (#77) check-in: 5bea261864 user: dmestas tags: trunk
14:46
technote and forum verbs write the cards the format allows (#77)

technote add gains --comment (the C card a timeline renders as the note's title, unattachable by any later verb) and repeatable --tag, minting T +sym-NAME * sorted ascending as fossil writes it. forum post and reply gain --mimetype, matching wiki commit's spelling. Empty titles, repeated tags, and whitespace tag names are refused.

First CLI-level coverage for either verb: #76 shipped them tested only at the artifact layer. closed check-in: 21f6efdd1c user: dmestas tags: record-cards

13:52
merge tag-cards: raw-namespace tags, values, and cancel (#80) check-in: 6b4ac926e6 user: dmestas tags: trunk
13:26
tag: raw-namespace tags, values, and cancel (#80)

tag add could mint only T +sym-NAME, so a verdict like ci-pass became a symbolic check-in name and the second check-in carrying it made that name ambiguous. add and cancel now take fossil's --raw namespace choice, an optional VALUE, and --propagate; list --raw reads raw tags back, since they are deliberately outside the name space. Names under wiki-, tkt-, or event- are refused, as fossil refuses them.

The composer's arguments moved into a TagCardSpec, which hides its two precondition asserts from the release-assert scanner (a struct field is not slice-shaped), so its baseline entry goes; the asserts stay. closed check-in: 3fa532af3a user: dmestas tags: tag-cards

12:49
commit --sign: clearsigned manifests, fossil's contract (#72)

The signed text is the stored artifact, so readers strip the wrapper to reach the cards and the signature travels wherever the check-in syncs. Signer invocation matches fossil's clearsign.c: COMMAND OUTFILE INFILE, default 'gpg --clearsign -o ', ssh* basenames take the detached path with assembled armor, 'off' disables. A signer that fails or alters the manifest refuses the commit rather than storing it unsigned. artifact reports signature presence; carry is pinned through pack, verify, and the sync wire. check-in: eb2f1adeda user: dmestas tags: trunk

05:35
wiki and ticket leave the top-level command list: the four authoring verbs are machine verbs by the #76 posture (another process is their audience), each still fully documented by its own help check-in: d18a3b5589 user: dmestas tags: trunk
05:17
merge worktree-registry: the store-side worktree list and the worktrees verb (#70); verb-set union with forum/technote (#76) check-in: d88bdc5e67 user: dmestas tags: trunk
05:01
worktree registry (#70): every open and update stamps the tree's absolute path into the store's .zit-cache/worktrees (advisory tier, best-effort, self-healing — the store-cone discipline); 'zit worktrees' lists the registered trees with branch and check-in, verifies membership by the store file's inode, lazily prunes dead or re-pointed entries, and answers bare via -R closed check-in: 9d079f3009 user: dmestas tags: worktree-registry
05:01
forum and technote authoring verbs (#76)

zit forum post/reply and zit technote add record forum-thread and event artifacts under the #71 machine-verb contract: bare store via -R, hash-only stdout, exact exit codes, unlisted in the human help. A reply resolves its thread root transitively; a technote edit reuses its event id. check-in: 4317c47ed5 user: dmestas tags: trunk

04:27
D cards carry milliseconds (#75)

Every artifact-minting path writes the .SSS writer form fossil itself emits, so same-second writes keep a real-time order for latest-wins consumers. SOURCE_DATE_EPOCH pins .000; display surfaces unchanged. check-in: 0ff8e58ce8 user: dmestas tags: trunk

04:05
e2e: the import-fossil residue scans iterate a dedicated .iterate handle scoped to the scan — Linux dirRead re-seeks the fd per batch, so iterating a handle owned elsewhere is BADF there (macOS tolerates it) check-in: 68506d0e3e user: dmestas tags: trunk
02:37
sync: per-round credentials over the cookie channel (#74)

An authenticated exchange now carries a fresh credential on every round: body login until the peer's gate is known, then an x-f-l-c cookie whose nonce covers that round's own body. The transport attaches it; serve now verifies it (and refuses tampered, replayed, and duplicate logins) instead of ignoring the header its own announced version solicits. check-in: 1fd84b4327 user: dmestas tags: trunk

02:21
zig fmt check-in: f7b57a5869 user: dmestas tags: trunk
01:51
merge import-fossil: fossil history import with the compatibility consequence chosen at import time (#61) — --compatible preserves the corpus byte-exact in the origin's sync world; --submanifest re-mints history as sub-manifest trees under a new project code, gated by whole-history replay, proven file-set-equivalent pair by pair, published atomically, with the old->new provenance map shipped as a technote. Merge resolution unions the verb set with wiki/ticket (#71) and completes their top-help listing check-in: 3f1f2a257d user: dmestas tags: trunk
2026-08-15
23:20
conversion under the staged-publication discipline plus the provenance technote (#61): the bundle's atomic rename is the only commit point (a failed run leaves a sweepable .zit-tmp-*, never a half-repo), and the old->new map ships as a deterministic event artifact inside the converted repository — sorted pairs, source-tip timestamp, project-code-derived id — so external hash citations resolve by lookup closed check-in: cbbc910841 user: dmestas tags: import-fossil
23:20
wiki and ticket authoring verbs (#71)

zit wiki commit and zit ticket new/set record wiki and ticket-change artifacts on a bare store via -R, under the store write lock. Machine verbs: hash-only stdout, exact exit codes, unlisted in the human help but fully documented via their own --help. check-in: fe8d14d754 user: dmestas tags: trunk

22:49
import-fossil --submanifest converts (#61): topo-ordered re-mint of every check-in as an S-tree (text-level card rewrite — F run out, S run in sorted position, B dropped, P/Q/T chased through the old->new map, PGP stripped and counted, Z resealed), control artifacts remapped, blobs and non-referencing chains verbatim, clusters dropped; every (old,new) pair proven file-set-equivalent through the destination flattener before anything survives, counts reconciled against the census, failed runs roll back to nothing. --compatible byte-exactness is a pinned invariant: the frames census of an imported corpus equals the origin's stream, and the import still pulls from it (#73's prerequisite) check-in: 5d61c0da47 user: dmestas tags: import-fossil
20:52
fossil_convert: the corpus census and the re-mint cascade rule (#61) — classify every artifact, count the remap surface (check-ins re-mint; wiki/forum/ticket/attachment chains carry verbatim under kept content names), state the casualties (PGP signatures strip, clusters drop), and refuse an incomplete corpus; --submanifest prints the census as the conversion's reconciliation baseline check-in: ce57c94b6d user: dmestas tags: import-fossil
18:46
import-fossil verb (#61): the compatibility consequence is chosen at import time — --compatible preserves the corpus verbatim through the clone machinery and stays in the origin's sync world; --submanifest runs the whole-history replay gate (static k sweep at the tip, winner±1 replayed, refuse-if-worse without --force) ahead of the conversion pass, which lands next; fossil support lives in src/fossil/ beside src/git/ check-in: 4c24d037b7 user: dmestas tags: import-fossil
18:08
add src/ignore.zig, dropped from the #64 commit check-in: 2d981d8f85 user: dmestas tags: trunk
18:07
ignore mechanism: ignore-glob setting, .zit-settings/ignore-glob, .zitignore (#64)

extras, addremove, clean, and add's directory expansion share one exclusion point; explicitly named files still add. Fossil glob dialect for the setting and versioned file, gitignore dialect for a root .zitignore, unioned when both exist. check-in: 5c68eb4688 user: dmestas tags: trunk

17:39
the submanifest -R pin follows the analyze-mode grant check-in: dab7ec41f3 user: dmestas tags: import-fossil
17:19
submanifest analyze: -R over a bare store (tip file set, no checkout) and --replay-all for whole-history replay (#61 step 2) — the conversion gate's evidence pass and before/after table in one read-only command; settings actions refuse -R in-verb check-in: 70b7e2f06e user: dmestas tags: import-fossil
16:37
extract the staged-publication pipeline into src/publication.zig (#61 step 1): PublicationBundle's one-way stage transaction, PublicationHooks, generation names, and the atomic-rename extern move verbatim; git_import_cli re-exports the same names, so import-git behavior, tests, and callers are unchanged — history converters share one publication discipline check-in: 7eff935454 user: dmestas tags: import-fossil
16:24
gate: check zig fmt check-in: ad900494fb user: dmestas tags: trunk
16:16
zig fmt check-in: 54cdfbbfaa user: dmestas tags: trunk
16:08
mirror-export: prune closed-branch refs on every export check-in: b0fde46c32 user: dmestas tags: trunk
15:58
merge worktrees: detached checkouts, store lock, open --store re-point (#59) check-in: bcbf29d017 user: dmestas tags: trunk
15:30
merge diff-repo-override: bare-store diff --from/--to via -R (#69) check-in: 8066a7c21d user: dmestas tags: trunk
15:16
diff --from/--to honors -R (#69): the check-in pair touches no working tree, so a bare store serves it; the worktree comparison refuses -R in-verb with the works-in-a-checkout diagnostic closed check-in: 4002513eeb user: dmestas tags: diff-repo-override
15:06
open --store re-points an already-open tree (#59)

A moved store strands its satellites, and a stranded tree can hold uncommitted work. Re-open repairs the pointer in place, gated on the new store containing the tree's current check-in. closed check-in: 7ac1ec2255 user: dmestas tags: worktrees

13:39
worktrees: detached checkouts of one store (#59)

Every store writer serializes on an exclusive flock held open-to-commit (released before autosync and the drift advisory). A checkout's store_location section is resolved in one place; open --store PATH creates a detached working tree, and probeRoot accepts a checkout whose pointer resolves. Store-scoped verbs (pack, shun, serve) follow the pointer end to end. check-in: 94d4659a53 user: dmestas tags: worktrees

13:04
merge help-topics: help topics, single-source option fragments, exit-status blocks everywhere, mechanical usage-line audit (#68) check-in: 9a5ae9774b user: dmestas tags: trunk
12:50
help topics (#68): 'zit help names/sparse/repo/exit-codes'; verbs point at the names topic instead of restating the resolution litany (timestamp forms were documented in one help of six); unknown help topics refuse with exit 2; the -R/--no-cache prose and the conventional exit-status block become single spliced consts (28 helps gain the block); a unit test asserts every options-table flag reaches its usage line — it caught commit --no-sync, merge --no-sync, and the cone flags on open/update/clone closed check-in: 21fa16cc4b user: dmestas tags: help-topics
12:10
import-git: O(changes) per-commit cost and live progress (#65)

Tree edits adopt untouched sibling leaves, the tree witness digest is structural over the root S-run (flat digests unchanged), and log reads go through a primed plaintext cache. Ingest reports strided progress with pack/verify phase markers. check-in: db4b2573e7 user: dmestas tags: trunk

04:01
merge read-verbs: frames incremental artifact stream and annotate VERSION/--full (#66, #67) check-in: b41272c88c user: dmestas tags: trunk
02:52
read verbs for external consumers (#66, #67): frames streams whole raw artifacts since an opaque cursor in persisted order, with LogKey prefix validation (appends keep a cursor alive, a pack/shun rewrite fails it with exit 4; exit 3 = current) and per-artifact hash verification; annotate gains a VERSION operand resolved like cat's (bare-repo -R works) and --full for full artifact IDs closed check-in: 68eba6cd49 user: dmestas tags: read-verbs
01:03
merge sparse-cone: sparse checkouts and sparse stores per draft-fossil-sparse-cone-00 — worktree cones with exclusions, cone-scoped clone/open/update, cone/cone-not wire pragmas with graceful degradation, demand fetch, pack --drop-elided, cross-cone record merges, and the sparse-origin clone refusal check-in: 2ad75a9bea user: dmestas tags: trunk
00:39
sparse origin refuses clones it does not cover (spec 5.3): dense and uncovered-cone clone requests answer one error card and no content; the client treats a progress-free error round-0 reply as fatal (spec amended — the sync 11.1 discard tolerance is for cosmetic cards on progressing replies) and quotes the peer's refusal closed check-in: 6e064b7301 user: dmestas tags: sparse-cone
2026-08-14
23:23
cone exclusions (spec 3.2): --cone-not/'!' cone-file lines subtract a subtree, longest-match decides coverage (spec reworded from ordered last-match — order-independent, keeps canonical serialization and digests), dead rules and contradictions refused; serialized cone v2 (0x00 lead-in + flag byte, v1 bytes unchanged without exclusions); cone-not wire pragma with over-send degradation check-in: 60274756a0 user: dmestas tags: sparse-cone
22:48
import: sub-manifest memo progress line every 25k commits, and an adaptive trim target tracking each walk's touched bytes (#63 investigation — preventive; the pkgsrc slowdown reframed, see issue) check-in: aa54d6f651 user: dmestas tags: trunk
21:37
clone/open/update: --cone-file=FILE reads cone members from a file (one per line, # comments); clone help gains the missing --cone entry check-in: 9191baea4b user: dmestas tags: sparse-cone
21:16
cross-cone merge applies to the record (spec 4.4): out-of-cone paths resolve at hash level with no blob reads, theirs-only changes ride a merge_overlay container section (v4) in the pending-merge splice, commit composes and clears it one-shot, and only both-changed conflicts refuse — naming the path and the widen remedy check-in: de5e6d9dc0 user: dmestas tags: sparse-cone
20:17
merge trunk check-in: 8b3d577ec1 user: dmestas tags: sparse-cone
20:02
zit cone verb: show/add/remove drive the update --cone path, so add fetches and remove dematerializes; member cap to 255 (the count byte's range, spec 3.2 bounds sentence added); spec gains exclusions (cone-not pragma, last-match-wins) and the patterns-deliberately-absent rationale check-in: 2cd32f8a38 user: dmestas tags: sparse-cone
19:39
sync: unversioned cards tolerate-and-report (#58) — validated, counted, never an abort; sessions report N not transferred; NotImplemented retired; uv-only replies are the clean §3.7 terminal check-in: 3cf76b982e user: dmestas tags: trunk
19:07
cone lifecycle completes: update --cone/--dense demand-fetch through the saved remote with one bounded retry; store policy follows the worktree cone only on already-sparse stores (a dense store's --cone can never arm reclaim); pack --drop-elided reclaims the elide set composed with the shun filter (spec 5.4, the only deletion) check-in: f79b3e469a user: dmestas tags: sparse-cone
18:42
pull scoping on the wire: pull/sync clients carry the store cone as pragmas, and the server filters its igot advertisement so out-of-cone holdings never mint requester phantoms — the transfer narrows at its source check-in: 9abd665d70 user: dmestas tags: sparse-cone
18:27
open on a sparse store demand-fetches (spec 6.4 policy form): the requested materialization becomes the store cone, an ordinary pull aligns to it, and one bounded re-attempt resolves fresh; without a remote the refusal names the class and remedies check-in: 658ae6bf26 user: dmestas tags: sparse-cone