Skip to content
zit Today In History
Login

Today In History

This Day In History For 2027-08-16

1 Year Ago (more context)

2026-08-16
21:47
binary-glob and crlf-glob: declarative content policy (#81)

Both are opt-in: an unset glob is no opinion, not refuse-everything, so a repository that never set one commits exactly as before. Set binary-glob to *.png and PNGs are the binaries the project expects, so a stray .o is refused. Neither runs code, so unlike before-commit they bind a fresh clone with no consent step -- that asymmetry is why they exist.

The check gates what a commit INTRODUCES: an all-files commit re-captures every managed path, so classifying unchanged content would make declaring a glob block every later commit until the whole tree already conformed. Comparing against the parent's blob grandfathers inherited files, per content rather than per path, so editing one re-checks it.

--no-checks waives it, the same flag that waives before-commit. check-in: 2711adbb03 user: dmestas tags: trunk

21:28
merge project-code: read a repository's identity without a checkout (#85) check-in: 1fc9e67f22 user: dmestas tags: trunk
21:18
stat: read a repository's identity without a checkout (#85)

project-code and hash-policy join stat's fields, and stat joins the -R family it was refused for a plumbing reason rather than a policy one. A consumer needing the project code had to find a free port, spawn zit serve, poll for readiness, POST a clone container and scrape the push card -- a subprocess and a listening socket per repository -- because the value was reachable only by speaking the sync protocol to a server you started yourself.

The no-checkout diagnostic said 'no .zit found' in directories where .zit was sitting right there; discovery looks for .zit-checkout, so it now says that and names -R as the way in. closed check-in: cd748a57c2 user: dmestas tags: project-code

19:28
Create new branch named "project-code" check-in: e77f1e196a user: dmestas tags: project-code
18:57
settings: keep-glob, manifest, before-commit consent, config pull (#82, #83)

keep-glob protects files clean must never delete while extras still lists them; manifest becomes a project setting driving build stamps. Both resolve across the tier chain, so a tracked .zit-settings file clones with the code.

before-commit splits declaration from consent (#82): the project ships the check as a tracked file, zit trust records the SHA-256 this checkout agreed to run. Cloning executes nothing, and an edit revokes consent by itself because the record pins content, not a flag. Non-zero exit aborts before anything is minted.

zit config pull shun is fossil's explicit request side; carriage stays clone-time otherwise so no peer can suppress content here on its own say-so.

Storage gains one keyed-string block: unknown keys are skipped by length, so the next string setting needs a key rather than another shape tag. Existing frames are unchanged.

clean-glob is deliberately absent: it means never-prompt and no-undo, which zit clean already is. check-in: 998dbf9d43 user: dmestas tags: trunk

18:45 • Edit [5ccb138e6d]: Mark "Closed". artifact: d92b31d1e4 user: dmestas
18:45
merge empty-trailing-token: C and J accept an empty trailing token (#86) check-in: b4893b3fee user: dmestas tags: trunk
18:30
C and J accept an empty trailing token (#86)

Fossil distinguishes an absent token from an empty one positionally: `C` LF has none and is rejected, `C` SP LF has one empty token and is a present, empty comment. zit implemented §4.2's `token = 1*tchar` literally and rejected the empty form on C and J, which drops the whole artifact — every ticket change with an empty field, every check-in with an empty comment. T and U were already right.

Two tests asserted the old behaviour and now assert the corrected one; a third pins the writer, since --submanifest re-mints every manifest. The RFC text is unchanged; docs/rfcs/erratum/ carries the correction. closed check-in: 5ccb138e6d user: dmestas tags: empty-trailing-token

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:34 • Edit [4b2fceeacd]: Mark "Closed". artifact: 097e263339 user: dmestas
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 • Edit [2e3bb0b9db]: Mark "Closed". artifact: 4b1c0947f6 user: dmestas
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 • Edit [21f6efdd1c]: Mark "Closed". artifact: f9f4e097b3 user: dmestas
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:53 • Edit [3fa532af3a]: Mark "Closed". artifact: 4772cb3988 user: dmestas
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

10:44 • New ticket [84b9bb5475] cat, annotate, and log reject -- before hyphen-leading paths. artifact: 467249285e user: dmestas
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 • Edit [9d079f3009]: Mark "Closed". Edit check-in comment. artifact: 0f3a82f693 user: dmestas
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 • Edit [cbbc910841]: Mark "Closed". Edit check-in comment. artifact: 9d1cc9bbab user: dmestas
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