50 ancestors of 6677853a3da865ac
|
2026-08-16
| ||
| 18:04 | settings: hazard-tiered model with a global tier and provenance (#83) check-in: 6677853a3d user: dmestas tags: trunk | |
| 17:44 |
smoke S9: require the carried shun row, not a phantom (#73)
Carrying the /shun config group means a fossil clone records the artifact as suppressed instead of holding a phantom for it. That is the better end state: a phantom is something fossil goes looking for, so the next sync with any third party would undo the takedown. S9 asked for the phantom specifically and so went red. It now asks fossil's own shun table and REQUIRES the row — tolerating the phantom would leave the scenario unable to notice the carriage regressing. The phantom probe stays as a diagnostic that tells a lost row apart from a served artifact. check-in: 7c656e4718 user: dmestas tags: trunk | |
| 17:33 | merge frames-parallel: verify a batch across workers (#84) check-in: c36e9952c2 user: dmestas tags: trunk | |
| 17:28 |
frames verifies a batch across workers (#84)
Profiling the post-memo stream put 59% in artifact.verify and 38% in reconstruction, so the parallel target is verification, not reconstruction: reconstruction is what the plaintext memo made sequential-friendly, and fanning it out would contend on that cache. Reconstruction stays single-threaded; a bounded batch is hashed by workers walking disjoint strides, then emitted in order. Workers touch no store, no cache and no allocator, so there is no queue, lock or atomic — join supplies the ordering. libfossil 2.35s -> 1.37s wall, byte-identical output. closed check-in: 4b2fceeacd user: dmestas tags: frames-parallel | |
| 16:30 |
local signing settings, and the shun table over the /shun config group (#72, #73, #83)
clearsign and pgp-command join zit settings as repo-local values fossil never propagates: pgp-command is a command line this machine executes, which fossil classifies sensitive for that reason. Config frame gains shape v4 for the command string; clearsign rides the existing flags byte. Precedence is ZIT_PGP_COMMAND, then the setting, then fossil's default. zit serve now answers reqconfig for a named group, and clone requests and adopts /shun. A clone that dropped the table would re-accept content its origin was ordered to remove on the next sync with any peer; the #73 scale run also traced 12 spurious phantoms to the same loss. Verified both directions against stock fossil 2.28. scripts/roundtrip-fossil.sh is the fossil -> zit -> fossil differential, run in CI on a built corpus: zig build e2e can only spawn zit, so nothing in the Zig suite can assert a stock fossil accepts what zit served. check-in: 57a9e0fc6b user: dmestas tags: trunk | |
| 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 | |