Artifact b7df2bbca6e16c80efddad00e5a3114217db693e03dad47fcb73d12ecf7e7e1d:
- File docs/rfcs/erratum/submanifests-00-s6.3-config-adoption-at-clone.md — part of check-in [7836d69f6a] at 2026-10-19 17:07:20 on branch trunk — submanifests §6.3: the three settings are adopted once at clone through reqconfig /config; no per-pull request, no staged transaction (user: dmestas, size: 4317) [annotate] [blame] [check-ins using]
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.