spec conversion - #81
aaronmbauman wants to merge 85 commits into
Conversation
The specification is an ISO Publicly Available Specification, and the rules for transposing one decide several things that would otherwise be guessed at: whether Directives conformance is mandatory, whether change bars are needed, and when the next review falls. Signed-off-by: Aaron Bauman <bauman.aaron@gmail.com>
Establishes the master document and the ISO metadata the build needs. Front matter is kept in its own file from the start. The OGF edition differs from the ISO one only there, so nothing added to the body later can become specific to one edition. Signed-off-by: Aaron Bauman <bauman.aaron@gmail.com>
The specification ships in two editions. Both use ISO formatting, and the OGF one carries OGF front matter and copyright, so section and page numbers stay identical between them (OpenGridForum#76). JTC 1 SD-9 (6th ed. 2021) §7.3.1 states the same intention from the other side, that ISO avoids divergence between a transposed PAS and the version published by the originator [1]. [1]: https://jtc1info.org/wp-content/uploads/2022/01/SD-9-Guide-to-the-Transposition-of-PAS-2021.pdf Signed-off-by: Aaron Bauman <bauman.aaron@gmail.com>
Pin metanorma-cli so local and CI builds render identically. Output is keyed by edition. The OGF and ISO editions render identically-named artifacts, so they need separate directories from the start rather than a rename once the second edition exists. Signed-off-by: Aaron Bauman <bauman.aaron@gmail.com>
ruff and black run on the host rather than in the Metanorma container, which carries neither. check runs the validators in tools/ over the build. Both targets tolerate an empty tools/. Signed-off-by: Aaron Bauman <bauman.aaron@gmail.com>
Rendering happens inside the pinned Metanorma image, so the runner installs nothing. The uploaded artifacts are how a reviewer reads the rendered spec without a local toolchain. Both editions are built, because a change can break one and not the other. There is no push or pull_request trigger. This repository has never run CI, and whether it should, and on what, is a working group decision; the workflow is here to be run from the Actions tab until that is settled. Read-only permissions and no secrets, so it behaves identically for pull requests from a fork. Signed-off-by: Aaron Bauman <bauman.aaron@gmail.com>
Separate from the build job so a lint failure and a rendering failure are distinguishable at a glance. Signed-off-by: Aaron Bauman <bauman.aaron@gmail.com>
Converting the whole document in one pass produces a diff nobody can review, so the tool addresses one top-level clause at a time. Word owns the heading numbering and switches it off for the front matter, so the specification's own clause keys are reconstructed rather than read out of the text. Signed-off-by: Aaron Bauman <bauman.aaron@gmail.com>
Word splits a logical listing across consecutive paragraphs, so a run of them collapses into one source block. Schema fragments left in body text are listings too: read as prose their quotes curl and their tags are taken for markup. Prose passes through AsciiDoc's inline markup and then Metanorma's smart formatting, and both claim sequences that are normative here. 0x55, #,##,##0, <= and ' are wrapped per sequence, so ordinary emphasis still works around them. Editors' notes live in Word's hidden text and are kept as AsciiDoc comments, where the next editor has them and no reader does. Listings the source neither numbers nor names are marked unnumbered, so they do not take figure numbers from the diagrams that carry one. Signed-off-by: Aaron Bauman <bauman.aaron@gmail.com>
Ids come from heading and caption text rather than Word's internal bookmark names, so a cross-reference reads as something in the specification and survives reconversion. Because the document is converted a clause at a time, a reference can point outside the text being emitted; those keep Word's cached result so the sentence still reads. Word writes a reference as a pair of fields, one resolving to the target's number and one to its title. Only the number is Metanorma's to regenerate, so the pair becomes one reference followed by the title. Signed-off-by: Aaron Bauman <bauman.aaron@gmail.com>
Word tolerates rows whose cells do not add up to the table grid and AsciiDoc drops the surplus silently, so every row is fitted to the grid first. Word places a caption after the object it describes; AsciiDoc wants the title in front and Metanorma numbers tables itself. Some captions are laid out as a row of the table, where a title left in place is read as cell markup and takes the cell down with it. Signed-off-by: Aaron Bauman <bauman.aaron@gmail.com>
Metanorma resolves image macros against the source tree, so the media parts of the package are written out beside the AsciiDoc. Where a drawing carries both an SVG and a raster fallback the SVG is taken, as it stays sharp in the rendered PDF and HTML. An image is rewritten only when its bytes differ, so re-running the conversion leaves the working tree alone. A footnote is a macro, so brackets in its text have to be escaped; those belonging to the passthroughs that carry technical sequences are left alone, since escaping them would undo the protection. A footnote on a heading is not carried into the rendered title, so it moves to the text the heading introduces. Signed-off-by: Aaron Bauman <bauman.aaron@gmail.com>
Word and Metanorma disagree on escaping and whitespace even where the conversion is faithful, so the two can only be compared through a normalised form. Every character folded away is one no comparison can see differ, so the default folds only what the formats must disagree about and typography folding is opt-in. Clause numbers are reconstructed from structure because neither format stores them as text, and the unnumbered front-matter regions are numbered too, so a difference there can be located. Signed-off-by: Aaron Bauman <bauman.aaron@gmail.com>
Counting occurrences of normative phrases passes while an entire property table is dropped, so the check is a differential over the whole of both documents. It compares strictly by default: fold quotes, dashes and symbols away and a target that turned every 0x55 in an encoding table into 0x55 with a multiplication sign compares identical to its source. Tokens rather than words carry the verdict, since punctuation is what means something in a regex or a number pattern. Signed-off-by: Aaron Bauman <bauman.aaron@gmail.com>
The conversion lands one clause at a time, so a run over the whole document calls lost what has simply not been written yet. The built output is the authority on what has been converted. A clause the build carries is compared whether or not it has a body, and a clause the build carries that answers to no source clause is content nobody can trace back. Both fail the run. Clauses pair by title because the ISO edition renumbers them, and repeated titles pair in document order: 25 to 28 are four siblings all titled "Removed". Signed-off-by: Aaron Bauman <bauman.aaron@gmail.com>
The cover page is the publisher's imprint rather than specification text: the title, the document status, the copyright line and the abstract are metadata each edition states in its own form, and ISO generates all of it from the document attributes in the master file. The abstract is the one part both editions print as prose, so it is carried here, in the source's own words. Signed-off-by: Aaron Bauman <bauman.aaron@gmail.com>
Verbatim output of tools/docx2adoc.py at ed1aa48. The preamble carries the source's own statement of the two-edition requirement — that section and page numbers stay identical between the OGF and ISO editions, and that sections before the Introduction are unnumbered. It is retained rather than treated as editorial scaffolding; whether the MS-Word cross-referencing instructions belong in the specification is the working group's decision, not the conversion's. The intellectual property statement, the disclaimer and the full copyright notice are the specification's own text, headed and numbered as it heads and numbers them, and both editions carry them as converted clauses rather than as wording chosen here. Everything before the Introduction is preface in both editions, so that the numbered clauses start at the same number in each. Signed-off-by: Aaron Bauman <bauman.aaron@gmail.com>
Verbatim output of tools/docx2adoc.py at ed1aa48. Signed-off-by: Aaron Bauman <bauman.aaron@gmail.com>
Metanorma reads a clause titled "Introduction" as ISO prefatory matter and leaves it unnumbered, which shifts every following clause number away from the one the specification uses for itself and cites in its own cross-references. The conversion lands one clause at a time, and a cross-reference can only be made against a target the build already carries; until then the converter leaves the text Word cached for the field. These clauses now have each other to point at. Signed-off-by: Aaron Bauman <bauman.aaron@gmail.com>
Verbatim output of tools/docx2adoc.py at ed1aa48. Signed-off-by: Aaron Bauman <bauman.aaron@gmail.com>
Clauses 1 to 5 introduce the annotation syntax and the property scoping rules by name; the sentences that do so are references now that what they name is in the build. Signed-off-by: Aaron Bauman <bauman.aaron@gmail.com>
Verbatim output of tools/docx2adoc.py at ed1aa48. The converted Clause 11 supersedes the stub that hosted a cross-reference target. Signed-off-by: Aaron Bauman <bauman.aaron@gmail.com>
The data syntax grammar and the element defaults are cited from the syntax clauses and from the overview of the representation properties, and the processing clauses cite the annotation elements back. Signed-off-by: Aaron Bauman <bauman.aaron@gmail.com>
Verbatim output of tools/docx2adoc.py at ed1aa48. Signed-off-by: Aaron Bauman <bauman.aaron@gmail.com>
The framing properties are where alignment, delimiters and length are defined, and the clauses converted before them point at all three. Signed-off-by: Aaron Bauman <bauman.aaron@gmail.com>
Verbatim output of tools/docx2adoc.py at ed1aa48. Signed-off-by: Aaron Bauman <bauman.aaron@gmail.com>
Framing cites the simple types for the binary number representations it aligns and measures, and the simple types cite framing back for the lengths they are read with. Signed-off-by: Aaron Bauman <bauman.aaron@gmail.com>
Verbatim output of tools/docx2adoc.py at ed1aa48. Signed-off-by: Aaron Bauman <bauman.aaron@gmail.com>
The model group and array properties are what the parser clause names when it resolves points of uncertainty, and what the overview lists as the shape of the property set. Signed-off-by: Aaron Bauman <bauman.aaron@gmail.com>
Verbatim output of tools/docx2adoc.py at ed1aa48. Signed-off-by: Aaron Bauman <bauman.aaron@gmail.com>
mbeckerle
left a comment
There was a problem hiding this comment.
I've completed one review pass of all of this PR. I did it by scrolling the new PDF and the old GFD.240 PDF side by side looking for differences and then adding comments to the PR about what I found.
Identified a few content issues also which I think I created tickets for all of them.
I think there are a quite small number of issues to fix before this can be merged, the remainder can be deferred until after the PR is merged and done in subsequent PRs.
I will approve and merge this once you have fixed the things that should be fixed, and parked the issue that you decide not to fix in this PR, but later.
A run can carry a character style and then cancel it: the Strong style with bold set to zero, or Emphasis with italic set to zero. The conversion read the style and missed the cancellation, so three runs came out emphasised that are plain in GFD.240. NaN in 13.10 was reported in review. Looking for others found two more: MUST in the RFC 2119 sentence in 3.1, where the capitalised keywords are plain and only the lowercase ones are italic, so the emphasis blurred the distinction the sentence is drawing; and the X.690 title in the reference list, which stood out from twenty plain entries around it. Each was checked against the published PDF as well as the Word source. Signed-off-by: Aaron Bauman <bauman.aaron@gmail.com>
GFD.240 sets a term bold italic where it is defined, and the conversion kept the bold but dropped the italic. That covers the glossary, the error classes, the sequence group notation and the grammar terminals: 164 terms, 219 spans. Only existing bold spans were changed, so short terms like Byte or N are touched only where the term is being defined. No term in the source is bold in one place and bold italic in another, so there is nothing to judge case by case. Signed-off-by: Aaron Bauman <bauman.aaron@gmail.com>
Bit position tables and encoding examples rely on characters lining up in columns. GFD.240 sets them in Courier New with explicit line breaks; the conversion dropped the font and flattened the breaks, so they came out as flowing prose and the columns no longer aligned. Four blocks restored in 13.7 and Appendix D, plus the calendar hex digits, where only the digits are monospaced in the source and the labels are not. The two bit position blocks also carry yellow highlighting on the bits of interest, which the sentence after them refers to. That is restored as well. Blocks are marked unnumbered so they do not take figure numbers. Signed-off-by: Aaron Bauman <bauman.aaron@gmail.com>
Marking the ordered lists arabic also applied to their nested items, so inner items printed 1) 2) 3) under outer items numbered the same way. GFD.240 numbers the outer level and letters the inner one. Signed-off-by: Aaron Bauman <bauman.aaron@gmail.com>
GFD.240 indents the two \w character class expressions from the margin, and the conversion set them flush left. They are body text, not code, so a borderless unnumbered table gives the indent without changing the font or taking a table number. Signed-off-by: Aaron Bauman <bauman.aaron@gmail.com>
Long property names ran into the description column; documentFinalTerminatorCanBeMissing was the worst of them. These four tables now use GFD.240's own column proportions instead of the rounded ratios the conversion produced. Signed-off-by: Aaron Bauman <bauman.aaron@gmail.com>
GFD.240 sets its body text ragged right. The ISO stylesheet justifies it, which stretches the spaces around DFDL's long property names and is worst in the deeply nested lists of Appendix F and Appendix G. There is no document attribute for this, so spec/pdf-overrides.xsl overrides the five attribute sets that hardcode justification and both masters point at it. GFD.240 is not uniformly ragged: roughly two thirds of its body paragraphs set it explicitly and the rest inherit a justified style, so this follows the majority rather than reproducing it exactly. Reflowing the body makes it likelier that a table lands across a page break, which matters for a table whose meaning is carried by merged regions spanning rows. Metanorma's keep-lines-together attribute reaches the semantic XML but the stylesheet ignores it on a table, so the override honours it there as well. Tables without it break across pages as before. Signed-off-by: Aaron Bauman <bauman.aaron@gmail.com>
Both matrices lost their cell shading, their centering and the merged regions that give the empty cells their values. All three are restored from GFD.240, along with its four header rows, and both are marked to be kept whole so a page break cannot cut a region in half. GFD.240 sets these two tables in 8pt and we do not, but the corrected column widths mean nothing overflows without it. The first column of the unparsing matrix is wider than the source, because separatorSuppressionPolicy will not break and does not fit at our size. Signed-off-by: Aaron Bauman <bauman.aaron@gmail.com>
Table 57 was breaking across a page, and the break fell inside the setVariable row span, so the continuation opened with rows whose first column was blank and nothing said which annotation they described. GFD.240 sets this table whole on one page and it still fits on one, so it is now marked to be kept together. Signed-off-by: Aaron Bauman <bauman.aaron@gmail.com>
Table 43 is taller than a page, so it has to break somewhere, and the break was landing inside the row span for 'e', day of week (local). The continuation page opened with six example rows whose Symbol, Presentation and Meaning cells were blank, because the cell carrying them had been cut. A row that does not cover every column is a continuation of a span, so it is now tied to the row above and the break falls between symbols instead. This is opt-in per table because the translation table in Appendix D has a 23-row span that would not fit on a page at all. GFD.240 has the same fault in this table, at a different symbol. Signed-off-by: Aaron Bauman <bauman.aaron@gmail.com>
These examples colour the schema declarations to match the bits they describe in the data below, and the conversion dropped all of it, leaving black text and a sentence saying the above are colorized. The data lines had also become ordinary paragraphs, so the columns no longer lined up under each other. Each block is now monospaced and the colours are restored per character, taken run by run from GFD.240. Two of the alignment examples had their trailing comment split into a paragraph of its own, away from the declaration it belongs to; they are back in the block. Note that GFD.240 colours element D gold in the schema and purple in the data, so for that one element the correspondence the colour exists to show does not hold. Both are reproduced as they are. Signed-off-by: Aaron Bauman <bauman.aaron@gmail.com>
The paragraph above these two blocks says the bits are shown in distinct colors and that each character is written below its bits in the matching colour, and the conversion had left both blocks entirely black, so the sentence described something that was not there. Colours restored run by run from GFD.240. Where the source leaves a character's bits black, as it does for the last character in each block, that is reproduced too. Signed-off-by: Aaron Bauman <bauman.aaron@gmail.com>
GFD.240 draws a thin box round its code blocks and fills it light grey: 846 of its 860 code paragraphs carry a half-point border on all four sides, and the published PDF renders the inside of the box as #F3F3F3. Neither survived the conversion, so examples ran into the surrounding prose with nothing to mark them off, which was worst for the single-line ones. Signed-off-by: Aaron Bauman <bauman.aaron@gmail.com>
GFD.240 breaks before 32 of its 46 top-level headings. The rest are front matter and the three mandatory clauses that deliberately share a page, and those three sit outside the numbered clauses here, so every clause at that level now takes a break except the first. It also breaks before four headings a level down. Nothing tells those apart from their neighbours, so they are named one by one; the encoding one needed an anchor to be named by. Metanorma's own <<< is no use for this. At the top level it splits the document into separate page sequences and the PDF collapses, which is why the break sits on the heading instead. Signed-off-by: Aaron Bauman <bauman.aaron@gmail.com>
The four BNF grammars are laid out in tables, and GFD.240 gives those a frame and nothing between the cells so the productions read as aligned text. Ours drew a full grid, which made them look like data. Marking a table class="bnf" now drops the cell borders and leaves the frame. Every other table keeps its rules. The grammar productions table also carries a rule under the last row of each group of related productions, which the source sets row by row, and those are restored too. Signed-off-by: Aaron Bauman <bauman.aaron@gmail.com>
GFD.240 puts 3pt above and below a bulleted item where a paragraph gets 6pt after, so its lists read as one group rather than a run of separate paragraphs. Ours gave list items the full paragraph spacing. Signed-off-by: Aaron Bauman <bauman.aaron@gmail.com>
The five notation lines are indented in GFD.240 and came across flush with the rest of the cell. Only the indent is restored. In the original the descriptions also line up on a tab stop, which needs the lines to become a nested table or a definition list, and either of those breaks the fidelity check: GFD.240 carries this table's caption as a sixteenth row so it can hard-code "Table 33-A", we make it a real caption, and restructuring the cell next to it exposes that difference. Left for when the caption is dealt with. Signed-off-by: Aaron Bauman <bauman.aaron@gmail.com>
The word is underlined in GFD.240 where this rule is stated, and the conversion set it plain. Signed-off-by: Aaron Bauman <bauman.aaron@gmail.com>
GFD.240 breaks between the two signatures in this cell and the conversion ran them together, so they read as one. Set out the way the timeZoneFromDateTime variants above them are. Signed-off-by: Aaron Bauman <bauman.aaron@gmail.com>
GFD.240 marks the three bullet levels differently: a filled bullet, a hollow circle, then a small square. The conversion set one marker for every level, so a nested list looked like a continuation of the list above it. The label attribute takes one marker per level, and the renderer picks by nesting depth. Signed-off-by: Aaron Bauman <bauman.aaron@gmail.com>
GFD.240 lays these out in a borderless two-column table with no caption and no number, so they read as a list of references. The conversion gave them a full grid and an auto-numbered caption, which made them look like data rather than a bibliography. Signed-off-by: Aaron Bauman <bauman.aaron@gmail.com>
The document title is set centered, bold and larger than body text in GFD.240, and came across as an ordinary paragraph. Status of This Document, Obsoletes, Copyright Notice and Abstract are underlined in the source rather than being headings, and lost the underline, so they read as stray sentences between the paragraphs they label. Signed-off-by: Aaron Bauman <bauman.aaron@gmail.com>
The abstract was written out four times: on the OGF cover page, again under Scope, and once more as the declared abstract of each edition. Nothing kept them in step. They are identical today, and now all four come from spec/abstract.adoc. The two hand-written copies had lost the double space after the first sentence that GFD.240 has; the shared copy keeps it. Signed-off-by: Aaron Bauman <bauman.aaron@gmail.com>
The OGF cover was reading "Information technology — Data Format Description Language (DFDL) v1.0 Specification". GFD.240 titles it without the prefix; that form belongs to the ISO edition. Signed-off-by: Aaron Bauman <bauman.aaron@gmail.com>
It appears on the OGF cover page and again in the ISO front matter, in different positions, so it now lives in spec/obsoletes.adoc and each edition includes it where it belongs. Only the common part is shared. The sentence after it points at the Document Change History and differs between the editions, so each keeps its own. On the OGF side that sentence said the history was on the next page, which it need not be, and now links to the section instead. Signed-off-by: Aaron Bauman <bauman.aaron@gmail.com>
The two masters were dfdl.adoc and dfdl-ogf.adoc, so the ISO one was the one without a suffix. Named for its edition now, like the other. The Makefile takes the output stem from the filename, so build/iso still holds dfdl.pdf and the rest. Signed-off-by: Aaron Bauman <bauman.aaron@gmail.com>
EDITING.md covered what to edit but not how to write it. One sentence per line, no line-length limit, and don't reflow a paragraph you aren't otherwise changing. Says that the converted text doesn't follow the sentence rule everywhere yet, so it applies to text you touch rather than calling for a sweep. Signed-off-by: Aaron Bauman <bauman.aaron@gmail.com>
… foot GFD.240 numbers every footnote in one run and prints them all at the foot of the page. Ours lettered the ones inside tables, restarted the letters for each table, and drew them in an extra row inside the table's frame. The number also carried a closing bracket the original does not have. Every footnote number in the document changes, since the table ones now take their place in the sequence. The label is rebuilt in the preprocessing pass, because that is the only one whose output the reference reads. The table keeps its footnote bodies but stops drawing them, and the reference goes through the stylesheet's own hook for a body that came from a table. Signed-off-by: Aaron Bauman <bauman.aaron@gmail.com>
There was a problem hiding this comment.
A few more minor things found, but I think we're ready to merge this.
Do you want to squash this down to a smaller more rational set of commits vs. the 85+ that this will otherwise be?
(Note: doing that and force-pushing it will lose the existing comments on the PR. If those few that we haven't parked as Issue tickets are captured elsewhere then that's ok.)
| * dfdl:initiator or dfdl:terminator other than empty string | ||
| * dfdl:alignment other than '1' | ||
| * dfdl:leadingSkip or dfdl:trailingSkip other than '0'. | ||
| * dfdl:assert, dfdl:discriminator, or dfdl:setVariable |
There was a problem hiding this comment.
Agree we can ignore for now, esp if the asciidoc has captured existing change information.
The goal is to give reviewers at OGF or ISO with something very very easy to review, so they can see just what the changes are.
| 2+| td-style:[background-color:#DBDBDB;border-bottom:none] Schema definition error | ||
| 2+| td-style:[background-color:#8EAADB;border-bottom:none] Unparse N occurrences ~ unparse (maxOccurs pass-format:straightquotes[--] N) trailing zero-length occurrences | ||
| .3+| td-style:[background-color:#DBDBDB] Schema definition error | ||
| .3+| td-style:[background-color:#8EAADB] Unparse N occurrences ~ unparse (maxOccurs pass-format:straightquotes[--] N) trailing zero-length occurrences |
There was a problem hiding this comment.
This is getting a "--" where a single minus sign is intended.
|
|
||
| | never | ||
| 2+| td-style:[background-color:#DBDBDB;border-bottom:none] Schema definition error | ||
| 2+| td-style:[background-color:#8EAADB;border-bottom:none] Unparse N occurrences ~ unparse (maxOccurs pass-format:straightquotes[--] N) trailing zero-length occurrences |
There was a problem hiding this comment.
This is getting a "--" where a single minus sign is intended.
| The following are Processing Errors: | ||
|
|
||
| * Arithmetic Errors | ||
| ** Division by zero |
There was a problem hiding this comment.
Inner bullets are too big here.
This is not true everywhere. There are some nested lists where the inner bullets are more modest size.
Convert spec from MS-Word to AsciiDoc
The specification builds to an ISO-formatted PDF, HTML and semantic XML for both
the OGF and ISO editions, from one body, on one command, in a pinned container.
Why AsciiDoc when the issue asks for XML
The XML is here. It is produced and schema-validated on every build, and it is
what the property index and the cross-reference checker read: both were built by
querying it, not by parsing prose. What differs from a literal reading of #68 is
that editors write AsciiDoc rather than angle brackets.
A 12,000-line hand-edited XML document raises the barrier to contributing,
makes merge conflicts worse, and adds a failure mode AsciiDoc does not have: a
document that is no longer well-formed. Machines still get the XML.
DFDL's own concepts are expressible too. A property written as a typed
requirement block emits name, value type, default, valid values, owning
annotation and normative constraints as separate elements. That is demonstrated
but deliberately not adopted here; see what is deferred, below.
Why the conversion reproduces the source's mistakes
The conversion is faithful, including defects.
pattern.atstays misspelled, anem dash Word autocorrected into an XML comment stays an em dash, a missing full
stop stays missing.
A conversion that improves its source cannot be verified against it. Every
difference then has to be argued about individually, and nobody can say which
were intended. Holding the line makes the whole document checkable by machine,
which is what lets the claim "nothing was lost or altered" mean anything.
Seven classes of defect the conversion surfaced are recorded rather than fixed,
including a Property Index listing 7 of the specification's 106 properties, and
six
dfdl:names in prose that match no property. Those are the working group'sto decide on.
Why there are three validators
Text can be provably intact while the document is wrong, so
make checkasksthree different questions.
A comparison that normalises typography away on both sides will report a
conversion clean while every
0x55in an encoding table has become0×55, anormative regex has lost a parenthesis, and
<=has turned into an arrow innormative grammar. Those substitutions live in exactly the characters such a
check is taught to ignore. So the fidelity check is strict by default and counts
punctuation, not only words.
Resolving is a separate question from surviving, so the link checker proves every
cross-reference and citation lands on exactly one target.
Neither of those can see a document that is internally incoherent. The structural
checker reads the rendered page and asserts it says what it means: no sentence
naming the wrong figure, no caption stranded as a body paragraph, no markup
leaking into text, nothing published that Word hides.
The link and structure checks stay useful for as long as the document is edited,
so they are what
make checkruns.spec/EDITING.mdcovers the conventions aneditor needs: how clauses are named and added, how cross-references are
anchored, why an untitled listing has to be marked unnumbered.
Coverage is 81,709 of 81,884 source words; the shortfall is the cover page, which
becomes document metadata. A clause that pairs but is not compared is an error
rather than a note, because a gate that silently compares nothing still reports
PASS.
Why the two editions share one body
The source states the requirement in its own preamble: section and page numbers
must not change between the OGF and ISO editions. JTC 1 SD-9 §7.3.1 says the same
from the other side, that ISO intends no divergence between a transposed PAS and
the originator's version 1.
One body with two front matters makes that mechanical rather than a discipline
somebody has to maintain.
spec/frontmatter/is the only thing that differs.What is deferred, and why
The DFDL property model, expressing property tables as typed requirement
blocks, is a second pull request. It re-shapes 15 tables, which is a different
review question from "is this the same specification", and mixing the two makes
both unanswerable.
Publication is untouched. Nothing here changes GitHub Pages, the README's
htmlpreviewlink, or which document is authoritative. The series is purelyadditive: it adds
spec/,tools/and aMakefile, and changes nothing thatexists, so merging it cannot break anything in use today.
Errata and ISO Directives edits change the specification's text. Neither is
conversion work.
Notes
Comparing the build against the Word source is not part of
make check. Itproves the conversion, and fails on any deliberate change to the specification,
so leaving it in the default checks would make the first erratum look like a
defect. It runs on its own as
make check-conversion.Six plain-text references were left unlinked because linking them would change
what the sentence says: Metanorma labels a top-level clause "Clause 11" where the
specification writes "Section 11".
The workflow has no push or pull request trigger, so opening this will show no
check. Whether this repository runs CI automatically, and on what, is a working
group decision rather than something a conversion should assume; the triggers to
add are commented at the top of
.github/workflows/spec.yml. Until then it runsfrom the Actions tab, and
make checkruns the same validators locally.Closes: #68
Closes: #78
Closes: #79