Artifact a5d9ec761d8c44bea833882ee98bd931eccd009f55eccb127abda98b3b4b3695:
- File
conformance/rfcs/erratum/repo-state-00-s5.4-cancel-halt.md
— part of check-in
[57a558fcbf]
at
2026-10-10 23:52:34
on branch trunk
— test(conformance): harness for an RFC conformance suite (#262) (#264)
Adds the conformance package that the per-draft suites build on. Nothing in the repository has yet checked go-libfossil against the Fossil drafts requirement by requirement.
- A Case names its requirement. A Gap (an issue) or Deviation (a reason) marks a known difference. A marked case still runs: while it fails it is skipped, and once it conforms it fails until the mark is removed, so the list of known failures cannot go stale. - Requirements tables pin the SHA-256 of the drafts and errata they were written against. Those are copied unmodified into conformance/rfcs by scripts/refresh-conformance-rfcs.sh. A changed draft fails the coverage test until its table has been re-read and its pin moved. - Coverage is derived from the cases rather than recorded: - COVERED: every case conforms. - PARTIAL: the table's row says what its cases leave out. - DEVIATION: a case is marked as a deliberate difference. - FAILING: a case is marked with an open gap. - GAP: no case yet.
CONFORMANCE_REPORT=<path> writes the requirement-by-requirement report as Markdown. - fossil(1) is run on every case's input, through test-parse-manifest, so a case's expectation is checked against fossil each time the suite runs. withZ appends the Z card, so a case that edits one card never also breaks the checksum.
The harness's own rules are tested in harness_self_test.go. No suites are registered yet; the artifact-format suite is next (#263). (user: [email protected], size: 2373) [annotate] [blame] [check-ins using]
# Technical erratum — draft-fossil-repo-state-00 §5.4 step 3 | | | |---|---| | **Document** | `draft-fossil-repo-state-00` | | **Section** | 5.4 — Tag propagation, step 3 (qualification) | | **Type** | Technical (the text diverges from Fossil's implemented behavior) | | **Status** | Reported | | **Reported** | 2026-08-13 | | **Submitter** | Dan Mestas | | **Found via** | Editorial cross-check of two divergent draft copies against Fossil C (`tag.c`) | ## 1. Summary §5.4 step 3 says a child with no same-tag entry "always qualifies" for propagation. That is true only for PROPAGATING tags. For a cancel-type propagation, Fossil's walk halts at a child with no same-tag row: there is nothing to cancel there, and the walk does not continue past it. ## 2. The text in error Page 15 (§5.4 step 3): > A child that currently has no same-tag entry always qualifies. ## 3. What Fossil implements `tag.c` (the propagation query and its queue gate): ``` tag.c:55-61 doit = coalesce(srcid=0 AND tagxref.mtime<:mtime, tagType==2) tag.c:88-93 pqueuex_insert(...) runs only if( doit ) ``` The qualification is computed over a LEFT JOIN. When the child has no `tagxref` row, the first `coalesce` argument is NULL and `doit` falls back to `tagType==2` — true for a propagating tag (tagtype 2), FALSE for a cancel (tagtype 0). Because `pqueuex_insert` is gated on `doit`, a cancel-type walk genuinely stops at a childless-of-that-tag node. ## 4. Corrected text > A child that currently has no same-tag entry qualifies only when the > propagating tag is of propagate type; a cancel-type propagation does not > qualify at such a child — it has no entry to cancel — and the walk does > not continue past it. ## 5. Observable consequence of the uncorrected text On a chain carrying a gap — a descendant that never had the tag — an implementation of the literal text walks a cancel through the gap and can cancel same-tag entries further down than Fossil would, so the derived tagxref-equivalent state diverges from what Fossil computes for the same artifact sequence. ## 6. Provenance note The wording traces to one of two divergent working copies of the draft; the other copy did not generalize "always qualifies" beyond propagating tags. The zit reference implementation had followed the wrong copy (fixed, with the halt pinned by a step-count test).