Skip to content

Releases: stop-cran/namespace2xml

namespace2xml 3.0.0

Choose a tag to compare

@github-actions github-actions released this 12 Sep 02:59
7f0f9ae

Contract bundle: r118+33da7b7912fc

Specification: https://github.com/stop-cran/namespace2xml/blob/v3.0.0/docs/specification.md

Contract

  • contract-bundle r118+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-scoped WARN003, and the original issue #24 logback.xml corpus
    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 explicit spec-* targets,
    backed by spec/specification-navigation.json; the diagnostic reference links every summary code
    to an explicit diagnostic-* detail target and links Section 22, Appendix B, and occurrence-level
    spec examples 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 green master commit,
    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 .nupkg from a cleared local-only source and runs the reporter's pinned 33,002-byte
    logback.xml outside 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.GitHub to 10.0.401 after
    GHSA-23fw-v26w-5fgq made the previous
    transitive Microsoft.Build.Tasks.Git dependency 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 stable 3.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 exit 0 or 1; 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 Unsupported result and exit 70, together with stale tests and
    documentation that treated implementation incompleteness as a supported runtime outcome.

stop_cran.namespace2xml 3.0.2

Choose a tag to compare

@github-actions github-actions released this 10 Sep 07:24
2cbf311

The stop_cran.namespace2xml Ansible collection, version 3.0.2.

ansible-galaxy collection install stop_cran.namespace2xml

This 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.

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 namespace2xml

namespace2xml 3.0.0-preview.5

Pre-release

Choose a tag to compare

@github-actions github-actions released this 21 Aug 00:19

Contract bundle: r99+bad2fa36f0a5

Specification: https://github.com/stop-cran/namespace2xml/blob/v3.0.0-preview.5/docs/specification.md

Contract

  • contract-bundle r99+bad2fa36f0a5.

Added

  • The release now proves its symbols can reach source, rather than proving they exist. The
    packaging check asserted that the .snupkg contains a .pdb, which a .pdb full of unresolvable
    paths satisfies exactly. tools/verify-sourcelink.ps1 walks 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 to b4cad05 — the commit v3.0.0-preview.4 tags.

    Comparing checksums rather than accepting a 200 is what makes the check real. Between
    v3.0.0-preview.3 and v3.0.0-preview.4 90 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 on curl.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.5 release — and failed with The installed tool carries no namespace2xml.dll.

    The package was fine. dotnet tool install --tool-path lays the payload out under .store, and a
    leading dot makes that directory hidden on Unix, which Get-ChildItem -Recurse skips 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 on linux/arm64: the old expression returns 0
    matches, the same expression with -Force returns 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, after curl.exe and 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.md previously
    answered §19.6's compatibility question with "it names none", which the section permits. Measuring
    the dialect against Python's configparser showed 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=localhost comes back as key host, a:b=1 splits at the colon into key
    a, and 100%% is rewritten to 100%. Each reports a successful parse and returns a different
    document.

    All four disappear under a stated reader configuration, so 3.0 names configparser with one:
    interpolation=None, delimiters=('=',), comment_prefixes=(';', '#'), and optionxform = 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.py enforces it in the new ini-interop CI job. It re-serializes what
    configparser recovered 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-text and ini-a-percent-sign-in-a-value-is-ordinary-text. Every
    other in-envelope .ini file 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's configparser and left
    three things verified against no external reader at all: a written preamble, QuoteValues, and
    EscapeMultiline. npm's ini 6 — ISC, no dependencies, and the
    parser @npmcli/config reads .npmrc with — 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 out gopkg.in/ini.v1, ini4j and inih
    without adding a toolchain to the build. ini was measured before it was named, and it loses
    data silently in six ways of its own, every one at exit 0 — 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 the JSON.parse that decodes them. All six are published as the envelope
    in docs/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 .ini files where the configparser lane 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 .ini file written under either option.
    ini-quotevalues-writes-markers-and-edge-whitespace pins that QuoteValues quotes 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-quoting writes two
    destinations from one input to pin the clause that a literal backslash doubles "whether or not
    QuoteValues is also selected". 2.4.0 differs on both, and ignores inioutputoptions entirely.

    Fixed while adding them: tools/check-ini-interop.py attributed inioutputoptions per
    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 —
    EscapeMultiline without QuoteValues, which neither reader can express, and four shapes ini
    loses that configparser never 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.
    PosixSecureDirectory sent one pair of numbers for O_DIRECTORY and O_NOFOLLOW to every
    non-macOS host, and Linux does not agree on them acros...
Read more

stop_cran.namespace2xml 3.0.1

Choose a tag to compare

@github-actions github-actions released this 21 Aug 15:29
94cffaf

The stop_cran.namespace2xml Ansible collection, version 3.0.1.

ansible-galaxy collection install stop_cran.namespace2xml

This 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.

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 namespace2xml

stop_cran.namespace2xml 3.0.0

Choose a tag to compare

@github-actions github-actions released this 21 Aug 12:01

The stop_cran.namespace2xml Ansible collection, version 3.0.0.

ansible-galaxy collection install stop_cran.namespace2xml

This 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.

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 namespace2xml

stop_cran.namespace2xml 2.3.0

Choose a tag to compare

@github-actions github-actions released this 20 Aug 19:32

The stop_cran.namespace2xml Ansible collection, version 2.3.0.

ansible-galaxy collection install stop_cran.namespace2xml

This 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.

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 namespace2xml

stop_cran.namespace2xml 2.2.0

Choose a tag to compare

@github-actions github-actions released this 20 Aug 16:53

The stop_cran.namespace2xml Ansible collection, version 2.2.0.

ansible-galaxy collection install stop_cran.namespace2xml

This 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.

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 namespace2xml

stop_cran.namespace2xml 2.1.0

Choose a tag to compare

@github-actions github-actions released this 20 Aug 15:26

The stop_cran.namespace2xml Ansible collection, version 2.1.0.

ansible-galaxy collection install stop_cran.namespace2xml

This 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.

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 namespace2xml

stop_cran.namespace2xml 2.0.0

Choose a tag to compare

@github-actions github-actions released this 20 Aug 06:54
2c8faed

The stop_cran.namespace2xml Ansible collection, version 2.0.0.

ansible-galaxy collection install stop_cran.namespace2xml

This 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.

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 namespace2xml

stop_cran.namespace2xml 1.0.0

Choose a tag to compare

@github-actions github-actions released this 19 Aug 19:44

The stop_cran.namespace2xml Ansible collection, version 1.0.0.

ansible-galaxy collection install stop_cran.namespace2xml

This collection renders Ansible data through the namespace2xml transformer. It
runs on the controller; target nodes need neither .NET nor the tool.

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