Skip to content

Prepare the stable release 0.1.0 - #2

Merged
mahach666 merged 8 commits into
mainfrom
prepare-0.1.0
Nov 12, 2026
Merged

mahach666 merged 8 commits into
mainfrom
prepare-0.1.0

Conversation

@mahach666

Copy link
Copy Markdown
Contributor

What changes and why

Prepares the first stable release, 0.1.0. The code is the same as 0.1.0-preview.2, which IfcIO.Scene, RvtIO.Scene and IOViewer were built and tested against: only texts, comments, XML docs, tests and the artwork change.

  • Release texts (they ship inside the package and cannot change after publication): Version 0.1.0; a ## [0.1.0] section above the preview.2 one; README status "stable (0.1)", install without --prerelease, the NU5104 advice with its real cause (the 0.2.0-0 upper bound), and one line that packages outside IOExtend are supported from 1.0; the contract status line; SECURITY.md; CONTRIBUTING example tags. The patch rule reads "a patch adds or fixes; a breaking change waits for 0.2.0", in the contract (section 5) as well.
  • Texts that contradicted the code, now matching it and pinned by tests:
    • an explicit null reads as the default for text, lists, SceneTexture.Data, objects and ? members; for a number, an enum, a math value, a date-time or a property value SceneJson.Read rejects it with InvalidDataException (through CreateOptions the serializer's JsonException);
    • for a topology this version does not know, Validate() skips only vertex-count and index-count; index-range, normal-count and uv-count apply to every topology.
  • Rules decided for the freeze (contract and XML docs):
    • winding: the glTF rule (counter-clockwise front, normals to the front, a negative-determinant transform reverses it);
    • a PlannedStart/PlannedEnd at the default 0001-01-01T00:00:00+00:00 means "not given", and a consumer leaves such a task out of time-based views;
    • date-times carry an offset; SceneModel.Producer is <package id> <NuGet version>; an instance colour also replaces the material colour as the texture factor; a key lookup takes the first property of the first set that has it; JSON nests at most 128 levels (62 levels of tasks); RgbaColor.Rf/Gf/Bf are still sRGB.
  • docs/keys.md: revit: and ifc: are registered, their formats fixed from the first releases of RvtIO.Scene 0.4.0 and IfcIO.Scene 0.11.0; shared, project and family parameters have no key yet.
  • Artwork: logo, banner, social preview and a package icon of its own (the icon was a copy of IOViewer's), from the LogoEngine preset in IOExtend/LogoEngine#3; the README shows the banner as a Markdown image, because nuget.org does not render raw HTML.

Deferred to 0.1.1, with package validation against 0.1.0 (plan step C3): two SceneJson.CreateOptions edge cases found in the audit (a wrapped exception on runtimes without dynamic code, and a holder's IJsonOnDeserialized callback that is not called).

Checks

  • dotnet build IOScene.slnx -c Release: 0 warnings, 0 errors. dotnet test: 236/236 on net8.0 and net10.0 (225 before, 11 new tests pin the texts above).
  • git diff 3d2c6cd..prepare-0.1.0 -- src: only /// and // lines change in the library source (plus icon.png).
  • Packed in a scratch clone: the public API dump and the IL of lib/net8.0 and lib/net10.0/IOScene.dll equal those of the published preview.2; the DLLs differ only in the PE timestamp, MVID, PDB id and checksum and the informational version. The packed README renders through nuget.org's Markdown pipeline (raw HTML disabled) with the banner as an image.
  • The notes step of release.yml, run on this CHANGELOG with v0.1.0, extracts the 0.1.0 section only.
  • Two independent reviews (contract against code and producers; shipped texts and binary) and one fix round; both approve.
  • Not checked: release.yml under pwsh 7 (not installed here; checked with Windows PowerShell 5.1 and a C# copy).

Notes

  • Merge before tagging: the README banner loads from main. Then tag v0.1.0 on the merge commit; release.yml publishes the package.
  • The CHANGELOG date is 2026-11-13; if the tag goes out on another day, the date changes in the same step.
  • After 0.1.0 is on nuget.org, IfcIO, RvtIO and IOViewer move their range to [0.1.0, 0.2.0-0) and release (plan steps C1 and C2).

The package icon was a copy of the IOViewer icon. The artwork is drawn in
the style of the other IOExtend repositories: "IO" in cyan as in IOViewer,
"Scene" in emerald. The README shows the banner and the NuGet and release
badges.
The contract and the CreateOptions documentation said that an explicit
null always reads as a missing member. The reader does that only for text,
lists, objects and nullable members; a null for a number, an id, an enum,
a math value, a date-time or a property value is rejected. The text now
says so, and a test pins the rejection for SceneJson.Read and for the
options of SceneJson.

The contract said that a geometry of an unknown topology is not checked
for counts, but Validate skips only vertex-count and index-count:
index-range, normal-count and uv-count apply to every topology. The text
and the comment now say so, and a test pins it.

No code changes.
The contract and the XML documentation now state rules that were left
open or only implied:

- A triangle's front is the side from which its vertices run
  counter-clockwise, normals point to the front, and an instance transform
  with a negative determinant reverses the winding (the glTF rule).
- A PlannedStart or PlannedEnd at its default 0001-01-01T00:00:00+00:00
  means "not given", and a consumer leaves such a task out of time-based
  views.
- Date-times are written with an offset; SceneJson reads a value without
  one in the local time zone of the machine.
- SceneModel.Producer is the package id and the NuGet version without
  build metadata, separated by one space.
- An instance colour replaces the material colour, also as the factor of
  the material's texture.
- A lookup by key takes the first property with the key in the first set
  that has it.
- SceneJson writes and reads JSON nested at most 128 levels deep, which
  holds 62 levels of tasks.
- RgbaColor.Rf, Gf and Bf are still sRGB-encoded.

docs/keys.md registers the namespaces revit: and ifc: with the first
releases of their producers, and says that shared, project and family
parameters have no key yet.

Tests pin the date-time encoding and the nesting limits. No code changes.
The first stable release. The API, the file format (kind ioscene, format
1) and the validation codes are those of 0.1.0-preview.2; from now on a
patch only adds and every other change waits for 0.2.0.

README, docs/contract.md and SECURITY.md no longer describe a preview.
The install command has no --prerelease, the README gives the right
reason for NU5104 with the range [0.1.0, 0.2.0-0), and says that packages
outside IOExtend are supported from IOScene 1.0. CONTRIBUTING uses tags
that can still be released as examples.
nuget.org renders package readmes with raw HTML turned off, so the HTML banner
would show as escaped markup on the package page. A Markdown image renders on
both GitHub and nuget.org.
"Only adds" ruled out a bug fix or a security fix in a 0.1.x patch, which
contradicted the security policy's own next sentence. A patch adds or fixes,
and a breaking change, as contract section 5 defines it, waits for 0.2.0.
Match README and SECURITY.md: a 0.1.x patch may fix as well as add, and only a
breaking change waits for 0.2.0.
@mahach666
mahach666 merged commit 38be835 into main Nov 12, 2026
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant