Skip to content
zit Erratum — draft-fossil-submanifests-00 §6.3
Login

Erratum — draft-fossil-submanifests-00 §6.3

Document draft-fossil-submanifests-00
Section 6.3 — Parameter Selection and Pinning (how the three settings travel by configuration exchange)
Type Technical (the draft requires a request on every pull and a staged transaction that no implementation performs)
Status Applied in draft-fossil-submanifests-00 (2026-10-19)
Reported 2026-10-17
Submitter Dan Mestas
Found via Comparing go-libfossil's configuration exchange, written from the draft, with zit's

1. Summary

§6.3 makes submanifest-k, enable-submanifests and submanifest-auto-retune members of a /project request group, requires a supporting client to request that group on every pull and after clone authorization, and requires every receiver to stage the three entries to the end of the message and commit them atomically. zit does none of this. It requests the scalar marker /config once, in the clone's cleanup round, and adopts the returned values into the new repository; pulls never request the settings. That is enough: a clone needs the origin's k to share sub-manifests with it, and a repository that has values of its own re-tunes deliberately (§6.4), not by pull. The draft specifies an exchange no implementation performs and none needs.

2. The text in error

§6.3, second and third paragraphs, beginning "For configuration exchange under [FossilSync], Section 9.3, submanifest-k, enable-submanifests, and submanifest-auto-retune are members of the scalar /project request group" and "Every receiver of configuration exchange ... MUST stage every config /config entry for these three settings through the end of the containing reply or request", and in the fourth paragraph the words "rejected by the atomic transaction above".

3. What the implementations do

zit's client sends reqconfig /config in the clone cleanup round and in no other round (src/sync.zig, the .cleanup_round arm of the request composer; config_scalar_marker). An explicit zit config pull is the only other path that requests configuration. The three rows are stamped with MTIME 0 and applied on clone, to a repository that has no values of its own. There is no staged transaction on pull or on a pushed configuration. go-libfossil follows zit and recorded the draft text as its deviation SM-6.3-3.

4. Corrected text

Replace the second and third paragraphs of §6.3 with:

The three settings travel by configuration exchange under [FossilSync], Section 9.3, as scalar entries: a client requests them with reqconfig /config, the scalar marker of that section, not a named group. Retrieval is clone-time adoption. A client supporting this specification requests them in the clone's cleanup round, after clone authorization succeeds, and applies the returned values to the new repository, which has no values of its own. A pull does not request them; an explicit configuration pull MAY. A newly cloned repository that could not retrieve the settings MUST leave enable-submanifests false until an authorized exchange retrieves them. A supporting server answers the request with the three entries when the requester holds Read permission; pushing any of the three is subject to that section's Admin authorization.

A receiver validates the adopted state: enable-submanifests true requires a submanifest-k from 1 to 12 inclusive, and an adoption that yields any other state, or carries an invalid value, applies none of the three and leaves the repository's values unchanged. Card order does not affect the result.

In the following paragraph, replace "rejected by the atomic transaction above" with "rejected at adoption as above".

5. Observable consequence of the uncorrected text

A client following the draft requests /project on every pull. A zit server does not recognize that group and answers with no configuration cards, so the client never adopts the settings and clones with enable-submanifests false, while a zit client of the same server adopts them. The corrected text gives both the one exchange zit performs.

6. Implementations

zit already does this; no change. go-libfossil follows zit's behaviour, and its deviation record goes away.