Skip to content
zit Timeline
Login

Timeline

50 ancestors of 4b1be918ab15f101

2026-07-18
16:58
info: render the cherrypick/backout provenance from the Q card (B-merge-41)

zit info on a cherrypick or backout check-in now shows a provenance line derived from the parsed 4.7.14 Q card: a 'cherrypick:' line for Q plus and a 'backout:' line for Q minus, each carrying the full REV hash, placed right after the parent and merge lines with the value column aligned. It reads through the shipped artifact parse path (repo.manifest then artifact.parse then parseQCard, iterating manifest.q) — no bespoke re-parse. A check-in with no Q card prints no such line and is byte-identical to before.

Also fixes an allocator-symmetry bug uncovered here: renderInfo now threads gpa (was arena) so info's manifest frees against the same allocator, ending an Invalid free panic at repo.deinit on every info call. Closes the last deferred clause of the cli-verbs-2 slice. 1678 unit + 376 e2e green. check-in: 4b1be918ab user: dmestas tags: cli

16:44
annotate: order the version chain by topology, not mtime

An adversarial review found zit annotate could charge a line to the too-recent CHILD when a parent and child check-in share an identical (or non-monotone) event mtime — the chain was ordered (mtime asc, hash). Fossil orders its annotate walk by pure topology (generation number, descendants.c/diff.c), so a parent is ALWAYS processed before its child. Match that.

New repostate.ancestryLinearized runs Kahn's over the reversed (child->parent) ancestry edges within the file's ancestor set, emitting newest->oldest with a (mtime desc, hash) ready-queue among topologically-INCOMPARABLE nodes, then reverses to the engine's oldest-first order — topology is now the PRIMARY key, mtime/hash only orders incomparable versions. annotateFile consumes it in place of the old sort; the attribute engine (primary-parent pass-through, oldest origin, binary refusal, layout) is unchanged. Amends the RESOLVED annotate-attribution rule. Linear/monotone history is byte-identical (degenerates to mtime-ascending); new tests (same-mtime parent-first, non-monotone, merge primary-parent) fail against the old order. 1678 unit + 376 e2e green. check-in: ff9662dfee user: dmestas tags: cli

16:23
Add the addremove command: one sweep, add every extra and drop every missing

zit addremove [--dry-run] — checkout-layer convenience (fossil/hg parity; git add -A). ONE scan via the shipped extras.sweep (the exact untracked/exclusion walk zit extras and zit clean use) is the ADD set; every managed file absent from disk (no-follow stat, as status checks) is the REMOVE set. Both mutate the managed set through the shipped ManagedSet.insert/remove/write (write-temp + fsync + rename) — no second walker, no ad-hoc mutation. A present-but-modified file is never touched; control/never-tracked names are never added. --dry-run leaves .zit-managed byte-identical and prints the same report (ADDED block then REMOVED block, each ascending, root-relative). 1675 unit + 374 e2e green. check-in: f0dc5f4e2a user: dmestas tags: cli

15:59
Add merge --cherrypick / --backout as special merges (no new verbs)

Both are alternate-baseline choices inside the shipped merge machinery, per merge-flags contract B-merge-30..40 (which lifts merge.md's v1 non-goal); the flagless zit merge NAME surface is byte-identical (B-merge-31 re-asserts it).

- --cherrypick REV: three-way with base = REV's primary parent, other = REV, current = checkout (apply REV's own changes). --backout REV: base = REV, other = REV's primary parent (reverse REV). Same classifyFile/applyMerge engine; a root REV yields an empty side; zero entries refuse (B-merge-39). Flags are mutually exclusive and reject an extra positional / dirty tree. - A cherrypick/backout commit stays SINGLE-parent (REV is never a merge parent) and mints exactly one artifact 4.7.14 Q card (Q +rev / Q -rev), cleared one-shot; a plain merge keeps its two-token P card and empty Q. - The pending op is a new checkout special_op field (4th TLV, no default, threaded everywhere); undo serializes it (journal fmt v1->2) so undo unwinds a pending cherrypick/backout (B-merge-35).

B-merge-1..29 e2e all still pass. 1675 unit + 362 e2e green; fmt clean. Follow-up: B-merge-41 (zit info Q-card render line) deferred — its pinned text was absent from the plan; the Q card is already readable via zit artifact. check-in: 20bf0a31c6 user: dmestas tags: cli

15:17
Add the annotate command: per-line provenance over the version chain

zit annotate PATH — which check-in introduced each line of one tracked file at the current checkout, and when. One canonical spelling (no blame/praise). The engine walks the file's full-ancestry version chain (repostate.ancestorsOf, the same 3.3 walk merge-base/bisect use; per-version content via Repository.fileAt, the one 8 effective-set query), diffs adjacent versions with the one house line-diff core (merge3.matchLines), and pushes each line's origin back to the OLDEST version carrying it. Across a merge, a line in ANY parent side is charged to that parent (primary first, repo-state 3.2), never to the merge; the merge is charged only for lines in no parent version. Output: 10-char hash, ISO date from event mtime, the line verbatim; a binary file refuses exit 1. Reviewed adversarially (merge attribution hand-traced correct). 1673 unit + 352 e2e green. check-in: f774a1a2a7 user: dmestas tags: cli

15:10
Track src/bisect.zig — omitted from the bisect commit 343d41b2f3

The bisect check-in landed every edited file but not the new bisect.zig itself (committed without a prior add), so that check-in would not build from a clean checkout. Add the file; no code change. check-in: b937bca55b user: dmestas tags: cli

14:40
Deepen log with an optional PATH: fold finfo into one verb

zit log CHECKIN [PATH]. With no PATH, behavior is byte-identical to today. With PATH, the ancestry walk emits only the check-ins that CHANGE that path: a check-in K changes PATH iff PATH's effective content (via Repository.fileAt, the one artifact 8 effective-set query — no CLI-side F-card re-derivation) differs from PATH's content in K's PRIMARY parent (first-listed P card, repo-state 3.2). Presence flips count (root add, delete, rename departure/arrival as delete+add, no old-name following); equal hashes are no change; a phantom parent reads as absent. walkLog gained an optional filter; the null path preserves the shipped DFS verbatim. The finfo/log split was historical accident, not design — one deep log replaces a shallow sibling, no new verb. 1661 unit + 343 e2e green; fmt clean. check-in: 6a360f33ff user: dmestas tags: cli

14:22
Add the bisect command: DAG binary search for a defect-introducing check-in

zit bisect bad NAME | good NAME | next | status | reset. Marking bad/good moves the checkout to the next probe automatically (fossil parity); next re-announces it; reset restores. The candidate set (full-ancestry ancestors of bad minus the good ancestor-sets minus skipped), the lower-median probe by ascending event-mtime with hash tiebreak, and the culprit are ONE general-purpose repostate query RepoState.bisectSpan, composed from collectAncestors / mergeBaseOf / isAncestorOf / mtimeOf / hashOf per the RESOLVED bisect-midpoint rule (repo-state 2/3.2/3.3/8.3) — the CLI never walks ancestry. Bisection state is checkout-local in .zit-bisect on the undo.zig state-file tier (atomic write + fsync, magic/CRC frame, corrupt -> exit 1), in the never-tracked/extras set; probe/culprit/reset moves go through the journal-armed update.applyCheckin behind requireCleanTree. Refusals (inverted marks, unrelated histories) exit 1. 1661 unit + 339 e2e green; fmt clean. check-in: 343d41b2f3 user: dmestas tags: cli

13:45
Add the artifact command: the plumbing window over the one parser

zit artifact HASH [--raw] — zit's cat-file/whatis. No flag: a whatis summary (hash, structural type per artifact 5.1/5.3, size, one line per A..W card in stored order, and the 6.2 Z self-checksum verdict). A blob reports type file, size, and binary-or-not. --raw emits the verbatim stored bytes. Resolves a 4-64 hex prefix over the LogStore (ambiguous -> exit 1), reads via the existing 7.2 blob path. Everything shown comes from the ONE existing artifact parser — refactored into frameNoZ/frame/assemble with a Z-tolerant parseWindow — never a CLI-side re-parse. 1649 unit + 335 e2e (13 new B-artifact) green; fmt clean. check-in: f477c3bf19 user: dmestas tags: cli

13:19
Add the amend command: mint display-metadata tags, never rewrite history

zit amend NAME [--comment TEXT] [--user NAME] [--date ISO] [--branch NAME] mints ONE control artifact whose T cards change how the target check-in displays — comment, user, date, and the repo-state 6.2 branch-move set — retargeted at the check-in hash, never '*'. History stays append-only: the original manifest is untouched and a new control artifact is crosslinked in (artifact 4.7.16 T / 4.7.5 D / 4.7.17 U / 4.7.19 Z; repo-state 4/5 crosslink, 5 tag propagation). Display is honored through a new general RepoState.activeTagValue / Repository.override consumed by timeline and info.

Also removes amend from the git-reflex rejection table: teaching against fossil-semantics amend with the immutability lesson conflated it with git's history-rewriting amend — amend is in fact the proof of zit's immutability, not a violation. 1643 unit + 322 e2e (15 new B-amend) green; fmt clean. check-in: 6c6d1babc2 user: dmestas tags: cli

11:15
Resume the cli integration branch at trunk c2c837c5

The prior cli leaf was a closed integration point from before the recent slice; this reopens cli development at current trunk (timeline, mv, undo/redo, extras, clean, merge all present). The next verb slice — bisect, annotate, amend, artifact, addremove per the VCS verb survey — builds here and converges on cli, then one merge cli -> trunk. check-in: 9b5605ad79 user: dmestas tags: cli

02:53
Merge merge-verb: the zit merge command (three-way merge + two-token P card)

Completes the checkout-and-history CLI slice — merge is the sixth and final verb (after timeline, mv, undo/redo, extras, clean). Line-based three-way merge into the working tree with fossil-style conflict markers, a mtime-independent up-to-date/ancestry gate, and a commit that mints the primary-first two-token P card and refuses while any marker remains. 1629 unit + 307 e2e green; dst 6x1000. check-in: c2c837c5e1 user: dmestas tags: trunk

02:51
Add the merge command: line-based three-way merge into the working tree

zit merge NAME computes a three-way merge of NAME (other) into the current checkout and records the merge parent; commit then mints the two-token P card. Built from the RFC oracle + the RESOLVED merge-base and conflict-model rules.

- merge3.zig: a pure diff3 line engine + per-path classifier (no I/O, injected allocator, error{OutOfMemory}). Both-modified binary, add-vs-add, and modify-vs-delete are whole-file conflicts by construction, never laundered through the line merger (artifact §8.2; B-merge-21). Seeded-deterministic fuzz. - repostate.mergeBaseOf: the merge base over full ancestry (§3.3, merge parents included) — greatest event.mtime, ties by least artifact hash (§2/§8.3, the RESOLVED merge-base rule). repostate.isAncestorOf: a pure, mtime-independent full-ancestry membership test — the authoritative up-to-date gate, so a same-mtime ancestor can never slip the refusal. - merge verb: resolve NAME (§8, one resolver), refuse (exit 1, nothing mutated) a dirty tree / a pending merge / an up-to-date or unrelated NAME; else classify each §8.2 merge-walk path and materialize transactionally via update.applyMerge (journal + checkout written before the first byte moves). Conflicts write fossil-style markers, name each path on stderr, exit 1, and still record the pending merge; zit undo unwinds it (B-merge-13). - commit: with a merge pending, scan the committed set for the conflict sentinel and refuse until resolved (no override); otherwise emit the primary-first two-token P card and clear the merge one-shot (§4.7.13; B-merge-8/9).

v1 non-goals held: no rename-aware, binary-content, cherrypick, or octopus merge. 1629 unit + 307 e2e green; dst 6x1000; fossil interop unaffected. closed check-in: 6bdb918f18 user: dmestas tags: merge-verb

01:22
Create new branch named "merge-verb" check-in: 8404f79a7b user: dmestas tags: merge-verb
00:52
Merge next-verbs-2: extras and clean

Two untracked-file management verbs over one shared control-name/sweep module (artifact §8 never-tracked superset; the .zit control files and derived sidecars are the exclusion set):

- extras: list files present in the working tree but not in the managed set and not control/derived files — the untracked surface, one path per line. - clean: remove those extras from the working tree, refusing to touch any tracked or control file; the sweep propagates allocation failure without leaking and never crashes on a hostile tree (fuzzed).

Slice tail: merge remains unshipped (its plan/implement agent repeatedly lost its API connection mid-response this session). Full unit + e2e (290/290) green on the merged trunk. check-in: bbfa0715f0 user: dmestas tags: trunk

00:15
Add the extras and clean commands over one shared untracked-file sweep: extras lists every checkout file zit is not tracking, and clean deletes exactly that set behind a --force gate, otherwise refusing non-interactively with a count because the deletion is irreversible and outside undo's shelter, per B-extras and B-clean-1/-5/-18. closed check-in: 7367551a07 user: dmestas tags: next-verbs-2
2026-07-17
22:11
Create new branch named "next-verbs-2" check-in: 9d7df286a6 user: dmestas tags: next-verbs-2
22:08
Merge next-verbs: timeline, mv, and undo/redo

Three checkout-and-history CLI verbs, each built to its B-verb contract and RFC oracle, each gated green (unit + e2e) before commit:

- timeline: list every check-in newest-first by event.mtime with an ascending full-hash tiebreak (repo-state §2, §8.3 item 7), merge check-ins marked M (§3.2), each on its branch with the configured main-branch fallback (§6.1/§6.4). - mv OLD NEW: rename a tracked file, moving it on disk and swapping the managed entry atomically; refuses (exit 1) an untracked OLD, an existing/tracked NEW, or a self-move; the rename records a one-shot NEW three-token on the next commit. - undo / redo: journal each sheltered mutation's pre-image (fsynced before the mutation) so update/revert are reversible; a corrupt or empty journal is a clean exit 1 with no partial restore.

Slice partial: extras, clean, and merge were not completed this run. Full unit + e2e green on the merged trunk. check-in: 89ef496c3b user: dmestas tags: trunk

21:12
Add the undo and redo commands, journaling each sheltered mutator's pre-image into .zit-undo before its first working-file byte moves so undo restores the last update or revert byte-for-byte and redo reapplies it, keeping one undo slot and one redo slot for fossil-parity single-level undo per contract B-undo-1..21 and fsyncing the journal ahead of the mutation for the B-commit-15 checkout-layer durability order. closed check-in: 14789e1409 user: dmestas tags: next-verbs
19:54
Add the mv command, renaming a tracked file by moving the working copy from OLD to NEW, swapping the tracked-name entry, and recording the rename so the next commit emits NEW carrying OLD as its fourth old-name token per artifact section 4.7.6, persisting the managed set before the file moves to keep the tree recoverable under the B-commit-15 durability order. check-in: b9149b15e1 user: dmestas tags: next-verbs
16:58
Add the timeline command, listing every check-in most recent first by event.mtime with an ascending full-hash tiebreak per repo-state section 2 and section 8.3 item 7, marking a check-in that joins two lines of development with M per section 3.2 and showing each on its own branch with the configured main-branch fallback per section 6.1 and section 6.4. check-in: b3a18a8ff0 user: dmestas tags: next-verbs
15:58
Create new branch named "next-verbs" check-in: cd5b6e94ed user: dmestas tags: next-verbs
15:20
Merge recover-inflight: root-URL sync serving + the log one-verb surface

Two independent slices recovered from an interrupted session, each gated green.

- Sync now dispatches on method + Content-Type at any URL path (§4 L759-764), so a stock 'fossil clone http://host:port/' at the bare root interoperates; the /xfer-only requirement and its 404 are gone. - 'zit log' is reduced to the signed one-verb surface: one check-in ID, help only, no -n windowing; usage errors exit 2, a bad ID exits 1.

Unit + e2e (209/209) green; fmt clean; dst 6x1000 ok. check-in: dbb2735bff user: dmestas tags: trunk

15:17
Reduce 'zit log' to the signed one-verb surface (drop -n windowing)

'zit log' carried a -n K windowed-log flag: an extra grammar mode (a state machine with a positional-only '--' separator and a -n value token in either order) and a bad_count offense, for a bound no other query verb exposes. Its sibling 'update' already documents the target shape — one full check-in ID, help only, no windowing.

Collapse log onto that same one-positional grammar. parseLogArgs is now the plain scan parseUpdateArgs uses: -h/--help wins; -n, --all, and a bare '--' are all unknown options (log has no positional-only separator); a second positional is an extra argument. Drop LogArgs.count, the bad_count variant, parseLogCount, and walkLog's max_count / window early-exit — the ancestry walk is unconditionally unbounded again.

Usage errors (missing check-in, unknown option, extra argument) now exit 2 via cli.usageError; a well-formed-but-non-canonical ID stays a validation failure at exit 1. Help and 'zit help log' print the trimmed single-verb text. Net -110 lines. Unit + e2e (209/209) green; fmt clean; dst 6x1000 ok. closed check-in: 0973cf7e9e user: dmestas tags: recover-inflight

15:15
Dispatch sync on method + Content-Type at any URL path, not just /xfer

A conformant Fossil client POSTs sync to the repository URL path unchanged and MUST NOT append /xfer (sync §4 L759-764): a bare 'fossil clone http://host:port/' POSTs to "/". The server previously required the /xfer path and answered 404 for anything else, so a root-URL clone from a stock client failed.

Drop the path from the dispatch decision entirely. classifyXfer now keys only on method (POST) and a request-valid, outer-compressed Content-Type (application/x-fossil); the URL path is accepted but unused. Remove xfer_path, requestPath, and the not_found/404 disposition; Disposition collapses to ok / method_not_allowed / unsupported_media_type. A non-POST stays 405 rather than a home redirect this sync-only server can't honor (and a 302 to "/" would loop now that "/" is a valid endpoint).

The over-real-HTTP e2e clone now targets the bare root "/" to prove a root-URL client interoperates. Unit + e2e green; fmt clean. check-in: 9636157a85 user: dmestas tags: recover-inflight

13:46
Merge clone-w4: skip the receive-side inflate for full-form clone content, cutting clone peak RSS ~13% (651 -> 568 MB). Reconciles held()/content() across the pull .raw basis and push upload paths so a corrupt wire-backed container degrades gracefully instead of tripping an unreachable. 1538 tests pass; fossil interop smoke green. check-in: 19af0f2de7 user: dmestas tags: trunk
13:43
Skip the receive-side inflate for full-form clone content

The clone/sync receive path inflated every stored cfile container to prove the RFC1950 stream was intact (§3.9), then threw the result away: the store keeps the container verbatim and reconstructs lazily, and the persist commit hook runs the §7.7 integrity check on the reconstructed bytes. For the full form that inflate was pure waste. Move the decode into the delta branch (which genuinely needs the plaintext to reconstruct) so a full-form cfile is interned and retained without inflating.

Retaining an unvalidated container means a held artifact is no longer guaranteed reconstructable: content() can be null for a corrupt wire-backed container, so held() no longer implies content(). Reconcile the consumers that assumed it did. The pull .raw delta basis and the push upload path both degrade gracefully (round abort / silent skip) instead of tripping an unreachable or assert on hostile input; the read/derivation path keeps the decompression-bomb cap, and the eager clone-end image treats a corrupt container as an error.

Cuts clone peak RSS ~13% (651 -> 568 MB) on the fossil corpus by dropping the discarded plaintext allocation. Instruction count and wall are flat, since full-form cfiles are the minority of clone content. 1538 tests pass; fossil interop smoke green. closed check-in: d91a3cfe42 user: dmestas tags: clone-w4

12:00
Merge clone-w3: halve clone compute (-53% instructions, 2.3x faster wall) via a bounded persist-time plaintext memo, byte-identical store + trunk hash preserved. check-in: fbfef2b649 user: dmestas tags: trunk
11:58
Halve the clone compute by memoising the persist-time plaintext: a bounded PlaintextCache reuses each frame's section 7.7-verify plaintext as the basis for the reverse-deltas built on it, killing the delta-chain reconstruction read-amplification (persist no longer re-inflates + re-applies a basis chain per dependent). libfossil clone: 138.2B -> 64.7B instructions (-53%), wall 13.4s -> 5.7s, RSS 550 -> 371 MB, trunk hash identical, store byte-identical (proven by test). The target's section 7.7 hash is still verified unconditionally after every reconstruction, so a stale basis is caught, never returned. closed check-in: 1bcbee0f86 user: dmestas tags: clone-w3
11:30
Create new branch named "clone-w3" check-in: 57438f967c user: dmestas tags: clone-w3
03:44
Merge windowed-log: 'zit log -n K' bounds the ancestry walk to K check-ins (early-exit before descending), fixing zit's slowest read for the common case. check-in: b2d89cb634 user: dmestas tags: trunk
03:42
Add a windowed 'zit log -n K' that early-exits the ancestry walk after K check-ins: walkLog returns before descending into the K-th node's parents, so only K manifests are reconstructed instead of the whole DAG (full log → -n 20 scales linearly, the signature of a true bound). Opt-in — unbounded default unchanged; -n K accepted in either order; 0/non-numeric/overflow rejected. Documented as the K nearest ancestors in DFS order (not fossil's mtime timeline). closed check-in: ed93685e89 user: dmestas tags: windowed-log
03:24
Create new branch named "windowed-log" check-in: f0e2cd8720 user: dmestas tags: windowed-log
02:55
Merge eager-image: warm the derivation cache at clone-end so the first read after a clone is the zero-parse image path (cold first-read leaves 26s → 0.03s), best-effort and clone-only. check-in: bf8b63f32c user: dmestas tags: trunk
02:52
Warm the derivation cache at clone-end so the first read isn't a cold derive: runClone now calls Repository.warmCache after the final log append, which runs open's own miss path (derive → serialize the zero-parse image → store .zit-cache) so the first leaves/branch/name-resolution read takes the image fast path. Measured on a real clone: cold first-read leaves 26.0s → 0.03s, byte-identical. Best-effort — a warm failure leaves the clone correct with the old lazy first-read, never fails the clone (repostate §7.3 rebuild fallback). closed check-in: 85d8080ec8 user: dmestas tags: eager-image
02:27
Create new branch named "eager-image" check-in: 5b2ba7331c user: dmestas tags: eager-image
01:57
Merge zerocache: materialized-image warm reads (84x faster leaves load) with load-time-validated fallback, closing the read-path perf gap. Phase B (full SoA image) not warranted — the image load is under 1% of the derivation it replaced. check-in: 13cfa27494 user: dmestas tags: trunk
01:54
Serve warm reads from a materialized column image instead of re-deriving RepoState, cutting a warm leaves load 178.6us to 2.12us (84x). At cache write, dense integer-addressed columns for the mtime index, leaf image, and symbolic-name table are appended to the versioned .zit-cache; on a fast_read open the freed queries (mtimeOf/isLeaf/isOpenLeaf/leaves/branchOf/resolveName per repostate 7.1/7.4/7.5/8.2) answer from those columns with zero derivation. Load-time span validation range-checks every column, CSR span, and stored id and returns a miss (fall back to derive) on any violation or CRC/layout/log-tail mismatch, so a corrupt or stale image is never a wrong answer. RepoState's public API is unchanged; only leaves opts in, cold verbs keep the derive path. Technique: on-disk zero-parse caching after Richard Feldman's Roc and Andrew Kelley's Zig compiler (common in game engines per Casey Muratori); typed enum(u32) index families after the compact_arena crate. closed check-in: ae242f5563 user: dmestas tags: zerocache
00:54
Create new branch named "zerocache" check-in: 6542332151 user: dmestas tags: zerocache
00:38
Merge warmprobe: land the warm-read timing bench that gates read-path perf work on measured re-derivation share (98% of warm load on althttpd). check-in: 8ccef5b6bd user: dmestas tags: trunk
00:36
Add a warm-read timing bench (zig build bench) that splits a cache-warm read into cache-body I/O, RepoState re-derivation, and formatting, so read-path perf work is gated on measured phase shares. On the althttpd store re-derivation is 98% of warm load. closed check-in: b93d0f9dd6 user: dmestas tags: warmprobe
00:23
Create new branch named "warmprobe" check-in: a9a7b2cf4d user: dmestas tags: warmprobe
00:22
Merge cli onto trunk: land the zit.Repository facade and the ls, cat, commit --branch/--close, revert, and sync-with-persisted-remote verbs (CLI milestones M0-M4), each built plan-review-commit against the artifact, repostate, and sync RFCs. check-in: 96784cbe6f user: dmestas tags: trunk
00:19
Merge trunk into cli: integrate the T-card sign-ordering fix, the F-card read-lenient import shim, and the streaming-clone memory fix ahead of landing the CLI verbs. Unify the duplicated sign->byte helper onto TSign.byte() (dropping the parallel signByte free function) and keep both branches' §4.7.16 ordering tests. closed check-in: 41aeb64521 user: dmestas tags: cli
2026-07-16
23:59
Add a bidirectional sync verb and a persisted default remote so pull, push, and sync can omit the URL and resolve it from a new local config field per sync §4/§6 check-in: b5a9919379 user: dmestas tags: cli
23:06
Add commit --branch/--close to start or close a branch by emitting the repostate §6.2 branch and sym tags while cancelling inherited parent syms, plus a revert verb restoring managed files to their artifact §8.4 effective check-in blobs check-in: 9f08c51525 user: dmestas tags: cli
22:18
Merge fcard-import: read-lenient import path lets zit parse fossil's legacy trailing-space F cards (interop with pre-2009 history) while the strict parser, writer, and RFC stay pure and artifact identity is unchanged. check-in: f98cb9177c user: dmestas tags: trunk
22:16
Add a read-lenient import path so zit can read fossil's own pre-2009 history: parseForImport tolerates the single legacy trailing space on fossil F cards (a cvs2fossil quirk, non-conforming per artifact-format 4.2) by stripping one dangling separator per F card ONLY after the strict parse rejects and the original Z self-checksum validates, re-sealing Z on an ephemeral copy that never touches storage, serve, or identity. The strict parser, the writer, and the RFC stay unchanged; artifacts keep their original hash. closed check-in: cca7dc06a2 user: dmestas tags: fcard-import
21:39
Add a zit cat verb emitting one file's uncompressed content at a resolved check-in through the Repository facade, per artifact-format §8.4 single-name lookup and §7.2 hash-verified blob reconstruction check-in: d0ef5067bb user: dmestas tags: cli
21:38
Create new branch named "fcard-import" check-in: d3be8fe4ac user: dmestas tags: fcard-import
21:10
Merge stream-clone: cut clone peak memory 14.2 GB -> 291 MB (fossil parity) by storing received frames wire-backed instead of buffering the whole repo's reconstructed plaintext, with section 7.7 verification moved onto the log-basis reconstruction path (a stronger round-trip parity guard). check-in: 77e2541742 user: dmestas tags: trunk