Releases: stop-cran/namespace2xml
Release list
namespace2xml 3.0.0
Contract bundle: r118+33da7b7912fc
Specification: https://github.com/stop-cran/namespace2xml/blob/v3.0.0/docs/specification.md
Contract
contract-bundler118+33da7b7912fc.
Added
-
XML comments outside the document element are preserved as unaddressable envelope metadata.
Every XML output instance receives the complete leading/trailing envelope, destination folds
preserve stable source order without duplication, non-XML outputs coalesce all discarded XML
comments into one destination-scopedWARN003, and the original issue #24logback.xmlcorpus
now has a permanent structural regression gate.
#100. -
Specification clauses and diagnostic codes now have generated, stable links. The normative
specification carries a generated hierarchical contents block and explicitspec-*targets,
backed byspec/specification-navigation.json; the diagnostic reference links every summary code
to an explicitdiagnostic-*detail target and links Section 22, Appendix B, and occurrence-level
specexamples back to the contract. The packaged Ansible reference is rendered from the same
model with immutable collection-tag links, and CI compares the two pages after normalizing only
those approved link bases.This removes three drift-prone surfaces: ad hoc heading parsing in tests, unlinked diagnostic
tables, and a byte-copied Ansible page whose relative links escaped the collection. It was caused
by the clean-context agent report that rated specification navigation 2/5 and found agents
repeatedly downloading and grepping the 307 KB contract. #128. -
Stable publication is bound to one signed-tag candidate. The release workflow accepts only an
annotated tag signed by the pinned release key and pointing at the exact greenmastercommit,
packs once on attempt 1, retains that package and symbols with hashes and source/workflow
metadata, attests both artifacts, and reconciles partial publication without rebuilding. Public
NuGet payloads must be byte-identical except for a repository-signature entry, every GitHub
release asset must be whole-file identical, an existing public artifact is compared before its
missing counterpart can be pushed, and stable installation plus a smoke transformation pass
before GitHub release publication. CI deliberately mutates the package comparator, retained
candidate, and publication transport to prove those gates fail closed.
#25. -
Issue #24 is now a package-bound permanent acceptance gate. The release installs the exact
retained.nupkgfrom a cleared local-only source and runs the reporter's pinned 33,002-byte
logback.xmloutside the checkout. It checks process channels, diagnostics, element identity,
count and parentage, comments, and the complete output bytes, records evidence tied to the package
hash and commit, and proves the oracle red with a controlled identity mutation.
#24. -
Section 26 traceability is enforced as a generated completeness contract. Every normative
clause is mapped to implementation and conformance evidence; CI rejects missing, stale, or
non-executable links and preserves measured legacy-differential evidence separately from the
stable contract. #35.
Changed
-
Updated
Microsoft.SourceLink.GitHubto 10.0.401 after
GHSA-23fw-v26w-5fgq made the previous
transitiveMicrosoft.Build.Tasks.Gitdependency fail the repository's warning-as-error restore. -
Promoted package, CLI help, installation guidance, conformance fixtures, Ansible integration, and
security/support documentation from preview identity to stable3.0.0. Current installation no
longer requires--prerelease; historical preview evidence remains under its original release. -
Internal compiler and pipeline impossibilities now throw a narrow invariant exception instead of
creating a third public transformation result. Stable CLI outcomes are exit0or1; text mode
emits one invariant line if such a defect escapes, while JSON diagnostics remain exactly one pure
array with no leaked prose.
Removed
- Removed the preview-only
Unsupportedresult and exit70, together with stale tests and
documentation that treated implementation incompleteness as a supported runtime outcome.
stop_cran.namespace2xml 3.0.2
The stop_cran.namespace2xml Ansible collection, version 3.0.2.
ansible-galaxy collection install stop_cran.namespace2xmlThis collection renders Ansible data through the namespace2xml transformer, in
either of two topologies. The render filter runs on the controller and needs
nothing on the target nodes. The render module runs on a node, against files
that already live there, and needs the transformer installed on that node.
- Usage, including which plugin to pick and the four fidelity limits of the filter's data-to-profile mapping.
- The contract in brief, which ships inside the collection.
- The normative specification.
- Report a problem — select the Ansible collection component.
Both plugins require a namespace2xml 3.x build, which reports a contract-bundle.
They refuse a 2.x tool rather than rendering against an older contract. The 3.0
line is still on preview, so the flag is not optional:
dotnet tool install --global --prerelease namespace2xmlnamespace2xml 3.0.0-preview.5
Contract bundle: r99+bad2fa36f0a5
Specification: https://github.com/stop-cran/namespace2xml/blob/v3.0.0-preview.5/docs/specification.md
Contract
contract-bundler99+bad2fa36f0a5.
Added
-
The release now proves its symbols can reach source, rather than proving they exist. The
packaging check asserted that the.snupkgcontains a.pdb, which a.pdbfull of unresolvable
paths satisfies exactly.tools/verify-sourcelink.ps1walks the path a debugger walks instead:
read the SourceLink document map out of each PDB, resolve every document through it, fetch it, and
compare the served bytes against the checksum the compiler recorded. Documents whose source is
embedded in the PDB are settled without a fetch, and a package that embedded everything fails
rather than passing with nothing checked.Measured against the published
3.0.0-preview.4: 131 documents fetched with byte-exact checksums,
8 embedded, 0 unsettled, resolving tob4cad05— the commitv3.0.0-preview.4tags.Comparing checksums rather than accepting a 200 is what makes the check real. Between
v3.0.0-preview.3andv3.0.0-preview.490 of 131 source files were byte-identical, so a
package pinned to the wrong commit would have answered 200 for two thirds of its documents. That
is not a hypothetical: pointing the map at the earlier commit is one of the three mutations the
check was proven red against, and it left 90 documents passing.This discharges the M9 requirement that symbols and SourceLink be verified end to end rather
than assumed. #36.The check runs on every push, on Linux and on Windows, not only at release. That is not
belt-and-braces: it first ran on Linux at release and died oncurl.exe, a filename that exists
only on Windows, because its one measurement had been taken by hand on a Windows machine. The gate
fired before anything was pushed to nuget.org, which is exactly where it was designed to fail — but
a release gate that only ever runs at release is one no push can keep honest. -
The packaged-corpus gate now runs on every push, because it was the next release gate to fail
at release. The check installs the packed tool and runs the whole conformance corpus against
that artifact rather than against the build output. It had run exactly once — during the
3.0.0-preview.5release — and failed withThe installed tool carries no namespace2xml.dll.The package was fine.
dotnet tool install --tool-pathlays the payload out under.store, and a
leading dot makes that directory hidden on Unix, whichGet-ChildItem -Recurseskips unless asked.
On Windows the same name carries no such meaning, so the search worked there and could never have
worked on Linux. Measured against a real install onlinux/arm64: the old expression returns 0
matches, the same expression with-Forcereturns 1, at
.store/namespace2xml/3.0.0-preview.5/namespace2xml/3.0.0-preview.5/tools/net10.0/any/namespace2xml.dll.This is the third release-only script in one release to be wrong on the platform the release runs
on, aftercurl.exeand a version string read from a tag that a shallow checkout does not fetch.
The pattern is not three coincidences: a script whose only execution is a tagged release has no
occasion to be wrong until the moment being wrong is most expensive. The argument for keeping this
one release-only reasoned about its subject — the packed assembly, which genuinely only differs at
publication — and forgot that the instrument is ordinary code with ordinary platform bugs. It now
runs on every push to master, on Linux and on Windows. Pull requests are still spared the four
minutes, on cost rather than on correctness. -
The INI dialect now names a parser it is verified against.
docs/format-ini.mdpreviously
answered §19.6's compatibility question with "it names none", which the section permits. Measuring
the dialect against Python'sconfigparsershowed that answer was costing more than it saved:
under the parser's default settings the emitted files are misread in four ways, and three of
them are silent —Host=localhostcomes back as keyhost,a:b=1splits at the colon into key
a, and100%%is rewritten to100%. Each reports a successful parse and returns a different
document.All four disappear under a stated reader configuration, so 3.0 names
configparserwith one:
interpolation=None,delimiters=('=',),comment_prefixes=(';', '#'), andoptionxform = str.
§19.6 was amended to require that, because a bare parser name is not a claim anyone can act on —
naming a parser now means naming the reader configuration and the envelope the claim holds within,
and a conformance test for a named parser must establish that it recovers the same keys, values and
order rather than merely that it accepts the file.tools/check-ini-interop.pyenforces it in the newini-interopCI job. It re-serializes what
configparserrecovered and compares that to the emitted file's own lines, so a fold, a split or a
rewrite is a failure rather than a pass; it imports nothing from this repository, so the writer
cannot define its own oracle. The job needs no SDK and no build, and runs in about a second.Three fixtures give it something to bite on —
ini-a-key-keeps-the-letter-case-it-was-given,
ini-a-colon-inside-a-key-is-key-textandini-a-percent-sign-in-a-value-is-ordinary-text. Every
other in-envelope.inifile in the corpus is lowercase ASCII with no%and no:, so the lane
would have passed while proving almost nothing; it now fails if any of the three stops being
checked. Each pins a §19.6 rule that was stated and unenforced, and 2.4.0 agrees on all three.This discharges acceptance item 28 for the named parser. Changed in
KNOWN-LIMITS.md: §2.1 no
longer records the absence of any named parser, and records instead what the one envelope excludes
—QuoteValues,EscapeMultiline, and a written preamble — and which parsers remain untested.
#67. -
The INI dialect now names a second parser, and both dialect switches are inside an envelope.
#67 named Python'sconfigparserand left
three things verified against no external reader at all: a written preamble,QuoteValues, and
EscapeMultiline. npm'sini6 — ISC, no dependencies, and the
parser@npmcli/configreads.npmrcwith — covers the first two.Candidates were restricted to runtimes the CI job already has, because a check nobody runs is not
a check: Go, Java and PHP are absent, which ruled outgopkg.in/ini.v1,ini4jandinih
without adding a toolchain to the build.iniwas measured before it was named, and it loses
data silently in six ways of its own, every one at exit0— a global key sharing a name with a
section discards the section entirely, decimal-integer keys are enumerated ahead of the rest, an
unquoted;or#truncates the value, an unquoted value that is itself quoted text is
unquoted,__proto__disappears as a key and as a section, and a raw control character inside
quotation marks defeats theJSON.parsethat decodes them. All six are published as the envelope
indocs/format-ini.md, alongside the reader configuration §19.6 also requires —ini.parse
takes one option,bracketedArray, and the pin is its default.What it buys is coverage of the shapes the first parser could not look at:
tools/check-ini-interop.js
checks 21 of the corpus's 26 emitted.inifiles where theconfigparserlane checks 13. The
preamble exclusion alone accounts for ten of those, and it is the one a consumer meets first. The
two lanes were written separately and share no code, so a mistake in one oracle is not in the
other.Two fixtures were added for the switches §19.6 defines and nothing had ever emitted — before
them the corpus contained no.inifile written under either option.
ini-quotevalues-writes-markers-and-edge-whitespacepins thatQuoteValuesquotes every value
rather than only the ones that need it, and that edge whitespace, a leading;or#,\"and
\\all survive;ini-escapemultiline-doubles-a-backslash-with-or-without-quotingwrites two
destinations from one input to pin the clause that a literal backslash doubles "whether or not
QuoteValuesis also selected". 2.4.0 differs on both, and ignoresinioutputoptionsentirely.Fixed while adding them:
tools/check-ini-interop.pyattributedinioutputoptionsper
case, by substring match over every scheme file, so a case writing two INI files under
different options gave both files the union of the two. No corpus case had that shape until the
second fixture above, which is why it had never mattered; both lanes now attribute options per
destination, honouring the selector prefix and §16.1's rule that a later option set replaces the
earlier one completely.Changed in
KNOWN-LIMITS.md: §2.1 records two named parsers rather than one, and what stays
open is now the unnamed parsers and the five corpus files no named parser reads —
EscapeMultilinewithoutQuoteValues, which neither reader can express, and four shapesini
loses thatconfigparsernever reaches because they also write a preamble.
#98.
Fixed
- The tool could not write a single file on arm64 Linux. Found in session while standing up a
real Linux controller to measure the Ansible filter's caches; no inbound report.
PosixSecureDirectorysent one pair of numbers forO_DIRECTORYandO_NOFOLLOWto every
non-macOS host, and Linux does not agree on them acros...
stop_cran.namespace2xml 3.0.1
The stop_cran.namespace2xml Ansible collection, version 3.0.1.
ansible-galaxy collection install stop_cran.namespace2xmlThis collection renders Ansible data through the namespace2xml transformer, in
either of two topologies. The render filter runs on the controller and needs
nothing on the target nodes. The render module runs on a node, against files
that already live there, and needs the transformer installed on that node.
- Usage, including which plugin to pick and the four fidelity limits of the filter's data-to-profile mapping.
- The contract in brief, which ships inside the collection.
- The normative specification.
- Report a problem — select the Ansible collection component.
Both plugins require a namespace2xml 3.x build, which reports a contract-bundle.
They refuse a 2.x tool rather than rendering against an older contract. The 3.0
line is still on preview, so the flag is not optional:
dotnet tool install --global --prerelease namespace2xmlstop_cran.namespace2xml 3.0.0
The stop_cran.namespace2xml Ansible collection, version 3.0.0.
ansible-galaxy collection install stop_cran.namespace2xmlThis collection renders Ansible data through the namespace2xml transformer, in
either of two topologies. The render filter runs on the controller and needs
nothing on the target nodes. The render module runs on a node, against files
that already live there, and needs the transformer installed on that node.
- Usage, including which plugin to pick and the four fidelity limits of the filter's data-to-profile mapping.
- The contract in brief, which ships inside the collection.
- The normative specification.
- Report a problem — select the Ansible collection component.
Both plugins require a namespace2xml 3.x build, which reports a contract-bundle.
They refuse a 2.x tool rather than rendering against an older contract. The 3.0
line is still on preview, so the flag is not optional:
dotnet tool install --global --prerelease namespace2xmlstop_cran.namespace2xml 2.3.0
The stop_cran.namespace2xml Ansible collection, version 2.3.0.
ansible-galaxy collection install stop_cran.namespace2xmlThis collection renders Ansible data through the namespace2xml transformer, in
either of two topologies. The render filter runs on the controller and needs
nothing on the target nodes. The render module runs on a node, against files
that already live there, and needs the transformer installed on that node.
- Usage, including which plugin to pick and the four fidelity limits of the filter's data-to-profile mapping.
- The contract in brief, which ships inside the collection.
- The normative specification.
- Report a problem — select the Ansible collection component.
Both plugins require a namespace2xml 3.x build, which reports a contract-bundle.
They refuse a 2.x tool rather than rendering against an older contract. The 3.0
line is still on preview, so the flag is not optional:
dotnet tool install --global --prerelease namespace2xmlstop_cran.namespace2xml 2.2.0
The stop_cran.namespace2xml Ansible collection, version 2.2.0.
ansible-galaxy collection install stop_cran.namespace2xmlThis collection renders Ansible data through the namespace2xml transformer, in
either of two topologies. The render filter runs on the controller and needs
nothing on the target nodes. The render module runs on a node, against files
that already live there, and needs the transformer installed on that node.
- Usage, including which plugin to pick and the four fidelity limits of the filter's data-to-profile mapping.
- The contract in brief, which ships inside the collection.
- The normative specification.
- Report a problem — select the Ansible collection component.
Both plugins require a namespace2xml 3.x build, which reports a contract-bundle.
They refuse a 2.x tool rather than rendering against an older contract. The 3.0
line is still on preview, so the flag is not optional:
dotnet tool install --global --prerelease namespace2xmlstop_cran.namespace2xml 2.1.0
The stop_cran.namespace2xml Ansible collection, version 2.1.0.
ansible-galaxy collection install stop_cran.namespace2xmlThis collection renders Ansible data through the namespace2xml transformer, in
either of two topologies. The render filter runs on the controller and needs
nothing on the target nodes. The render module runs on a node, against files
that already live there, and needs the transformer installed on that node.
- Usage, including which plugin to pick and the four fidelity limits of the filter's data-to-profile mapping.
- The contract in brief, which ships inside the collection.
- The normative specification.
- Report a problem — select the Ansible collection component.
Both plugins require a namespace2xml 3.x build, which reports a contract-bundle.
They refuse a 2.x tool rather than rendering against an older contract. The 3.0
line is still on preview, so the flag is not optional:
dotnet tool install --global --prerelease namespace2xmlstop_cran.namespace2xml 2.0.0
The stop_cran.namespace2xml Ansible collection, version 2.0.0.
ansible-galaxy collection install stop_cran.namespace2xmlThis collection renders Ansible data through the namespace2xml transformer, in
either of two topologies. The render filter runs on the controller and needs
nothing on the target nodes. The render module runs on a node, against files
that already live there, and needs the transformer installed on that node.
- Usage, including which plugin to pick and the four fidelity limits of the filter's data-to-profile mapping.
- The contract in brief, which ships inside the collection.
- The normative specification.
- Report a problem — select the Ansible collection component.
Both plugins require a namespace2xml 3.x build, which reports a contract-bundle.
They refuse a 2.x tool rather than rendering against an older contract. The 3.0
line is still on preview, so the flag is not optional:
dotnet tool install --global --prerelease namespace2xmlstop_cran.namespace2xml 1.0.0
The stop_cran.namespace2xml Ansible collection, version 1.0.0.
ansible-galaxy collection install stop_cran.namespace2xmlThis collection renders Ansible data through the namespace2xml transformer. It
runs on the controller; target nodes need neither .NET nor the tool.
- Usage, including the four fidelity limits of the data-to-profile mapping.
- The contract in brief, which ships inside the collection.
- The normative specification.
- Report a problem — select the Ansible filter component.
The filter requires a namespace2xml 3.x build, which reports a contract-bundle.
It refuses a 2.x tool rather than rendering against an older contract. The 3.0
line is still on preview, so the flag is not optional:
dotnet tool install --global --prerelease namespace2xml