# Erratum — draft-fossil-submanifests-00 §7.2 / §8.1
| | |
|---|---|
| **Document** | `draft-fossil-submanifests-00` |
| **Section** | 7.2 — Peer Capability Gate (the client's duty after avoid-submanifests); 8.1 — Emission Gate (the same duty) |
| **Type** | Technical ("commits created during the session" names a situation neither implementation produces) |
| **Status** | Applied in `draft-fossil-submanifests-00` (2026-10-19) |
| **Reported** | 2026-10-18 |
| **Submitter** | Dan Mestas |
| **Found via** | Implementing the pragma in go-libfossil and finding no code path the rule could apply to |
## 1. Summary
§7.2 says a client that received avoid-submanifests "MUST NOT emit S
cards in commits created during the session", and §8.1 repeats the rule
as "in a commit against a server from which it has received the
avoid-submanifests pragma in the current sync session". Neither zit nor
go-libfossil creates a commit inside a sync session: a commit is made,
and then autosync pushes it in a separate exchange. The rule as written
never applies, and the draft does not say what "session" means across a
commit-then-push, so an implementer cannot tell whether a pragma received
on yesterday's push binds today's commit. The text should define the
session and say plainly what the pragma binds.
## 2. The text in error
§7.2: "A client receiving it MUST NOT emit S cards in commits created
during the session (Section 8.1)."
§8.1: "and MUST NOT emit one in a commit against a server from which it
has received the avoid-submanifests pragma in the current sync session
(Section 7.2)."
## 3. What the implementations do
zit records the pragma in a per-session, one-way latch
(`Client.avoid_submanifests` in `src/sync.zig`) that a new session starts
clear, and reads it together with the setting in `clientMayEmitSCards`.
Its commit path runs outside any session, so the latch never reaches a
commit; emission is governed by the repository's own setting. A zit
server whose setting is false still stores an S-bearing artifact pushed
to it, because the setting gates emission, not receipt. go-libfossil
behaves the same way and recorded the rule as partially met (SM-7.2-3).
## 4. Corrected text
§7.2, replace the sentence with:
> A sync session is one exchange between a client and a server, from its
> first request to its last reply. A client that receives the pragma
> MUST NOT emit S cards in a commit it creates during that session. A
> commit created outside a session is governed by the client's own
> enable-submanifests setting alone (Section 8.1); an implementation
> that commits first and pushes afterwards therefore never creates a
> commit the pragma binds, and the pragma informs it that the server's
> operator has not enabled emission there. The pragma does not gate
> receipt: a server stores an S-bearing artifact pushed to it whatever
> its setting, as Section 8.1 says of existing artifacts.
§8.1, replace "and MUST NOT emit one in a commit against a server from
which it has received the avoid-submanifests pragma in the current sync
session (Section 7.2)" with "and MUST NOT emit one in a commit created
during a sync session in which it has received the avoid-submanifests
pragma (Section 7.2)".
## 5. Observable consequence of the uncorrected text
An implementer can read the rule as binding every commit made while a
server that sent the pragma is the autosync target, and build a writer
that falls flat after one push to such a server, while zit and
go-libfossil keep writing trees. The corrected text makes the two
implementations' behaviour the specified one.
## 6. Implementations
zit and go-libfossil already behave this way; no change.