{
  "schemaVersion": 1,
  "baselineId": "managed-rc1",
  "baselineRevision": 44,
  "status": "frozen",
  "workItem": "QA-07",
  "packageVersion": "0.8.3",
  "assembly": "CStructSharp.dll",
  "exportedTypes": 85,
  "generator": {
    "package": "PublicApiGenerator.Tool",
    "version": "11.5.4",
    "command": "generate-public-api"
  },
  "canonical": {
    "path": "contracts/api/managed-rc1/CStructSharp.public-api.txt",
    "lines": 1058,
    "normalizedSha256": "28D28484013E720EE67926E95C731AF1E2A7D6CE338E9E2AE8A0B2A1985BC3A8"
  },
  "frameworks": [
    {
      "tfm": "net8.0",
      "targetFramework": ".NETCoreApp,Version=v8.0",
      "frameworkDisplayName": ".NET 8.0",
      "normalizedSha256": "1358792A798CF2A86AC0579F099FE7391231BD564E86FE9B9AC42E840CD32DCA",
      "aotCompatible": false
    },
    {
      "tfm": "net10.0",
      "targetFramework": ".NETCoreApp,Version=v10.0",
      "frameworkDisplayName": ".NET 10.0",
      "normalizedSha256": "7AE5CFB8BD728EA03C2EB6F5A7562A7B44BDD05E1320C2971CA6F6DA608B3347",
      "aotCompatible": true
    }
  ],
  "history": [
    {
      "revision": 1,
      "kind": "freeze",
      "date": "2026-07-26",
      "packageVersion": "0.2.0-preview",
      "combinedSha256": "77A43017F644467A68C5D8BA23D092E83CFDB279385B971B046BF7774627ACD7",
      "rationale": "Freeze the reviewed 20-type, 227-line managed release-candidate API after all planned public redesign packages.",
      "releaseImpact": "Any later public addition, removal, signature/default/nullability/attribute change must fail CI until the baseline revision, review history, version impact, changelog, and migration decision are updated deliberately."
    },
    {
      "revision": 2,
      "kind": "additive",
      "date": "2026-09-07",
      "packageVersion": "0.2.11",
      "combinedSha256": "9E737ED34E38701F1E5391E7023337ECF09B9BAD2695F803A596A3EA93A27440",
      "rationale": "Product review item 4: add exactly four byte-array read overloads, retaining all prior signatures and annotations. Each rejects null and forwards without copying to the existing span path. Both C# 12 and current compiler consumers are checked.",
      "releaseImpact": "Unreleased source addition on the 0.2.11 development version; the next publication must receive a new version through the release process. No existing binary signature changes. Explicitly typed null byte arrays now throw ArgumentNullException rather than being converted to empty memory; use empty arrays for empty input."
    },
    {
      "revision": 3,
      "kind": "additive",
      "date": "2026-09-09",
      "packageVersion": "0.2.12",
      "combinedSha256": "FE394A2AAED6E5B99190B5E977C3754184EC69AE9640E12406F6666A112A7DF5",
      "rationale": "Architecture-improvement AP-2.1 converted WriteOptions and (sealed, derived) UpdateOptions from plain classes to records, both now implementing System.IEquatable<T>, to replace a hand-maintained property-by-property snapshot with the record's own 'with' expression (closing a class of silently-dropped-new-property bugs). Records synthesize public/protected ToString, PrintMembers, GetHashCode, Equals(object), Equals(T), the equality operators, and (WriteOptions only, since it is unsealed) a protected copy constructor, plus a protected EqualityContract property - the same compiler-generated shape as any C# record. AP-2.3 separately added the new UpdateOptions.MaxTraversalArrayElements property (a dedicated update-path array-traversal limit, previously silently reusing WriteOptions.MaxArrayElements) in the same development cycle. No existing member's signature, default, nullability, or attribute changed.",
      "releaseImpact": "Unreleased source addition on the 0.2.12 development version; the next publication must receive a new version through the release process. No existing binary signature changes; every addition is purely additive (new interface implementation, new synthesized members, one new property) and source/binary compatible for existing callers. Callers that already compared WriteOptions/UpdateOptions instances by reference now get value-equality semantics via the new Equals overloads and operators, which is additive behavior, not a breaking change to any documented contract."
    },
    {
      "revision": 4,
      "kind": "breaking",
      "date": "2026-09-09",
      "packageVersion": "0.3.0",
      "combinedSha256": "041A46DF3FD32D682B70098914F2188CBB27DF56C17F08CF1069F92B2F0C5E1F",
      "rationale": "Product review item 1 (the architecture improvement plan's Phase 5): UpdateOptions.AllowPointerDereference renamed to DereferencePointers, matching ReadOptions.DereferencePointers - both collapse into the identical ReadOperationSettings.DereferencePointers field internally, so the two names for the same concept were a genuine 'not obvious from the name' mismatch. Treated as a clean, immediate rename rather than a deprecate-and-bridge migration: the package is still pre-1.0, and this project's own convention (per this baseline's own review discipline) is to make breaking API changes deliberately and visibly rather than accrue compatibility shims before a stable release.",
      "releaseImpact": "Breaking source change: any caller using the object-initializer syntax `new UpdateOptions { AllowPointerDereference = ... }` will fail to compile against the next published version and must switch to `DereferencePointers`. No [Obsolete] bridge is provided. The WASM browser bridge's InteropOptionsDto and JSON wire option key were renamed identically in the same commit (the previously-separate 'allowPointerDereference' JSON key no longer exists; use 'dereferencePointers' for both parse and update operations)."
    },
    {
      "revision": 5,
      "kind": "additive",
      "date": "2026-09-12",
      "packageVersion": "0.3.0",
      "combinedSha256": "B4D9EECDC3F403222143ED3382DC4A479D4B2172268BBAFFB5923388948750C5",
      "rationale": "Performance plan E3.2/E1.1: add the static CStruct.GetOrCompile(...) factory (same parameters and defaults as the constructor) backed by a process-wide bounded most-recently-used cache keyed by every constructor input, and CStruct.ClearCompiledCache(). Phase 0 measurements showed per-call schema compilation is 70-85 % of the public JavaScript parse; the WASM bridge now routes through the same cache, and native callers that compile per message can opt in. No existing member changed; the 20-type surface is unchanged.",
      "releaseImpact": "Unreleased additive source change on the current development version; the next publication must receive a new version through the release process. No existing binary signature changes. GetOrCompile returns shared immutable instances; callers must not rely on reference identity between separately constructed layouts."
    },
    {
      "revision": 6,
      "kind": "breaking",
      "date": "2026-09-13",
      "packageVersion": "0.3.0",
      "combinedSha256": "7325E054A1803D54C05175CD1C4335B9254C2E91C40B72F0F766936AF44F4A25",
      "rationale": "Performance plan E2.2 (typed result model): parsed structs are the new sealed CStructSharp.StructValue (DynamicObject + IDictionary<string, object?> + IReadOnlyDictionary<string, object?>) instead of System.Dynamic.ExpandoObject. Every parse of one compiled composite shares a member table, so a parsed struct allocates one slot array instead of growing a DLR class chain; nested-struct parses run 25-45 % faster with 20-35 % less allocation, and dynamic member access binds to the slot index at the call site at the same per-access cost as ExpandoObject. Also records the Phase 1 E3.3 change already published in CHANGELOG.md but missed by this baseline: DebugData.Buffer is byte[] (previously int[]). StructValue.Enumerator (a nested public struct, the allocation-free foreach enumerator in the Dictionary<,>.Enumerator style) is the 22nd exported type. The surface is otherwise unchanged.",
      "releaseImpact": "Breaking source change for callers that declared or cast parse results as ExpandoObject (use StructValue or dynamic) and for callers reading DebugData.Buffer as int[]. dynamic member access, IDictionary<string, object?> casts, enumeration order, mutation, and passing parsed values back to Serialize/UpdateStream are unchanged. The next publication must receive a new version through the release process."
    },
    {
      "revision": 7,
      "kind": "breaking",
      "date": "2026-09-13",
      "packageVersion": "0.3.0",
      "combinedSha256": "49BDF192E39CD208547B6048F12251D80F2B81981B1D537555BDAE5E3F57355D",
      "rationale": "Performance plan E2.3 stage 2 (typed primitive arrays): a one-dimensional array of a fixed-width numeric primitive or bool parses to the new sealed CStructSharp.PrimitiveArray<T> (IList<object?> + IReadOnlyList<object?> + non-generic IList, fixed size, typed Span/Memory/ToArray) instead of a List<object?> of boxed values. The bulk reader decodes host-order data with one copy and the other byte order with the vectorized ReverseEndianness span overloads: numeric arrays parse 80-500x faster with 80-97 % less allocation. 23 exported types.",
      "releaseImpact": "Breaking source change only for callers that cast such array values to List<object?> (use IList<object?> or PrimitiveArray<T>) or that added/removed elements of a parsed numeric array in place (copy to a List first). Enumeration, indexing, Count, element replacement through the indexer, boxed element types, JSON projection and write-back through Serialize/UpdateStream are unchanged. The next publication must receive a new version through the release process."
    },
    {
      "revision": 8,
      "kind": "additive",
      "date": "2026-09-16",
      "packageVersion": "0.4.0",
      "combinedSha256": "0804A9A4BE302F887D06B84CF7783C1B2283691BD74D2D066AB4C31698F6D77D",
      "rationale": "dissect.cstruct parity (docs/guides/migrating-from-dissect.md): adds the layout introspection surface (LayoutInfo, LayoutDeclarationInfo, LayoutFieldInfo, LayoutEnumMemberInfo, LayoutConstant and their kind enums; CStruct.Layout/Constants/Includes/CompilationOptions, WithEndianness/WithPointerSize/WithAlignment, ToDefinition), FlagValueResult (derived from EnumValueResult, which is therefore no longer sealed - unsealing adds no member and breaks no caller), ICustomCodec, BitfieldAllocation, and the CStructCompilationOptions members CLongWidth, DefaultEnumStorage, Defined, Codecs, Prelude, BitfieldAllocation. No existing member's signature, default, nullability, or attribute changed.",
      "releaseImpact": "Unreleased source addition on the 0.4.0 development version; the next publication must receive a new minor version through the release process. Language-level behaviour changes (alias spellings, enum default storage, `_` padding fields, data-sized arrays) are documented in the CHANGELOG and docs/language and are not API-surface changes."
    },
    {
      "revision": 9,
      "kind": "additive",
      "date": "2026-09-17",
      "packageVersion": "0.4.3",
      "combinedSha256": "48DC5B3E46A542E95FF6C437C362DC6526EDDAF04E6E1C7A7C3F4BA49C5D6A14",
      "rationale": "Reviewed managed API for binary structures, memory address spaces, metadata import, traversal, and offline updates.",
      "releaseImpact": "Pre-publication API contract."
    },
    {
      "revision": 10,
      "kind": "breaking",
      "date": "2026-09-17",
      "packageVersion": "0.5.0",
      "combinedSha256": "B9EF5E27F9C98949A2CB5A5886E3C73939E37B582E1BFE8D4B8D014920155A4C",
      "rationale": "Reorganize the library into folders whose names match their namespaces. Public types leave the root namespace for CStructSharp.Diagnostics (exceptions, error codes, DebugData), CStructSharp.Values (StructValue, UnionValue, EnumValueResult, FlagValueResult, Pointer, PrimitiveArray), CStructSharp.Introspection (LayoutInfo and the Layout* records), and CStructSharp.Codecs (ICustomCodec). CStruct, its options, and the memory namespaces are unchanged; no member signature changed.",
      "releaseImpact": "Source-breaking namespace move on the 0.5.0 development version; the next publication must be a new version through the release process. Consumers add using directives for the new namespaces (or update fully qualified names); no binary member signature changed and no behavior changed."
    },
    {
      "revision": 11,
      "kind": "breaking",
      "date": "2026-09-18",
      "packageVersion": "0.5.0",
      "combinedSha256": "5B861D6179FA2764BF342FAF4A84A746A8764057441F5E52512DFF00C985C40A",
      "rationale": "DebugData becomes an immutable readonly record struct with Start, End, Path, TypeName, Value, Bytes, and Length; the JSON attributes and the per-field byte copy are gone. CStructReadLimitException and CStructWriteLimitException gain the parameterless constructor their siblings have.",
      "releaseImpact": "Consumers of debug records use Start/End/Path instead of CurPos/EndPos/DebugStackString and select bytes from their own input; debug reads spend the same read budget as plain reads."
    },
    {
      "revision": 12,
      "kind": "additive",
      "date": "2026-09-18",
      "packageVersion": "0.5.0",
      "combinedSha256": "D23765D99C515B24DE83E696BDAA99862AE596F03F9F7C41095764AAD4496693",
      "rationale": "CStructLayoutException gains Line and Column (one-based source position of the failing declaration) and its Message ends with the position when known.",
      "releaseImpact": "Additive; consumers may read Line/Column to place editor markers."
    },
    {
      "revision": 13,
      "kind": "additive",
      "date": "2026-09-18",
      "packageVersion": "0.5.0",
      "combinedSha256": "B5BD3C904170C079A88547E458A1C3D0FA278FE0AB7DCC84A5F5AB5D88931903",
      "rationale": "CStructException gains Member and MemberType (the innermost field a read/write failure belongs to and its layout type); Message is composed from the known facts.",
      "releaseImpact": "Additive; messages now end with a parenthesized context clause."
    },
    {
      "revision": 14,
      "kind": "breaking",
      "date": "2026-09-18",
      "packageVersion": "0.5.0",
      "combinedSha256": "71070C6210222586388B248F44AB550DAC5F46706E4A1B9C39BCE860C1A5D6AA",
      "rationale": "4.1: one operation vocabulary for every input kind. Parse returns StructValue (struct roots only); ParseWithDebug returns ParseResult; ReadValue/ReadValueWithDebug cover every selection; ResolveAddress, GetArrayLength (was GetDynamicArrayLength), Serialize, Write, Update share one parameter order for Stream, span, memory, and byte[]. ParseStream*, ParseMemory*, ReadMemoryValue, SerializeToMemory, UpdateStream, WriteStream removed. CStruct.DefaultRoot added.",
      "releaseImpact": "Callers rename methods and take StructValue/ParseResult instead of dynamic and (List<DebugData>, dynamic) tuples; union roots move from Parse to ReadValue."
    },
    {
      "revision": 15,
      "kind": "additive",
      "date": "2026-09-18",
      "packageVersion": "0.5.0",
      "combinedSha256": "42E4F9971F694ECFDD79327DD76CF79132C5C22C4FEA5563CC4A9A7533340FE1",
      "rationale": "4.2: StructValue.Get<T>/TryGet<T> and UnionValue.Get<T>/TryGet<T> read a member or a nested path with the ReadValue<T> conversion; UnionValue.ToString() renders name, selection, members, and raw length.",
      "releaseImpact": "Additive; no existing signature changed."
    },
    {
      "revision": 16,
      "kind": "additive",
      "date": "2026-09-18",
      "packageVersion": "0.5.0",
      "combinedSha256": "16D21A4BA0465710F7C1B872D6C491A23DC63232898F6A609DA8146AD7D94E8B",
      "rationale": "4.3: ReadOptions.TrimFixedText (default false) drops trailing NUL padding from fixed-capacity text; WriteOptions.UnknownMembers (UnknownMemberPolicy.Ignore | Reject, default Ignore) rejects members the composite does not declare.",
      "releaseImpact": "Additive options with the historical behaviour as default."
    },
    {
      "revision": 17,
      "kind": "breaking",
      "date": "2026-09-18",
      "packageVersion": "0.5.0",
      "combinedSha256": "1D108658C9B50BEEA2F772EC1674930F3366F47B005F933A93BD3A2EC8658A5F",
      "rationale": "4.4: StructValue and UnionValue implement IDynamicMetaObjectProvider directly instead of deriving from DynamicObject (whose constructor requires dynamic code); the DynamicObject overrides (GetMetaObject, TryGetMember, TrySetMember, TryDeleteMember, GetDynamicMemberNames) are no longer public. The assembly declares IsTrimmable (both frameworks) and IsAotCompatible (net10.0).",
      "releaseImpact": "dynamic member access is unchanged; code that called the DynamicObject overrides directly uses the dictionary members or Get<T> instead."
    },
    {
      "revision": 18,
      "kind": "breaking",
      "date": "2026-09-18",
      "packageVersion": "0.5.0",
      "combinedSha256": "3B24040DB399A1ADD64BC04CE9CCF15E50D13736E3654E5A1E1DD1C8862E6E1F",
      "rationale": "5.4: ICustomCodec reads and writes spans - OperationStatus Read(ReadOnlySpan<byte>, out object?, out int bytesConsumed) and OperationStatus Write(Span<byte>, object, out int bytesWritten) - instead of Stream methods; the library supplies the remaining input or a growing window and charges the budgets.",
      "releaseImpact": "Custom codec implementations change their two methods; layouts, options, and registration are unchanged."
    },
    {
      "revision": 19,
      "kind": "additive",
      "date": "2026-09-18",
      "packageVersion": "0.5.0",
      "combinedSha256": "BAF55AF79A6B923DA6B35CD291D29A5C4977043FDF40CEC1F35736894E636BD5",
      "rationale": "6.1: CStructCompilationOptions.BitfieldPacking (BitfieldPacking.SysV default, Msvc) selects the compiler family's bitfield placement rule; unnamed zero-width declarators are accepted as separators.",
      "releaseImpact": "Additive API; default placement of mixed-size bitfield runs now follows GCC/Clang (behaviour change documented in the changelog)."
    },
    {
      "revision": 20,
      "kind": "breaking",
      "date": "2026-09-20",
      "packageVersion": "0.6.0",
      "combinedSha256": "7746FA679175FBE8A9EE7A73E07FFC644D65F200BEBA0E2A42FE1B946333E1B2",
      "rationale": "Reflection-based POCO mapping is removed: typed reads and writes go through ICStructMapped<T> and MappedTypes; PocoBindingMode and WriteOptions/UpdateOptions.BindingMode are gone; the DynamicallyAccessedMembers annotations that existed only for reflection are dropped from ReadValue<T>/TryReadValue<T>/Get<T>/TryGet<T>.",
      "releaseImpact": "Code that read into plain classes or wrote anonymous objects or plain classes must implement ICStructMapped<T> (or use the [CStructMapped] generator) and register the type; collection-interface and List<T> targets become arrays; BindingMode settings are removed."
    },
    {
      "revision": 21,
      "kind": "additive",
      "date": "2026-09-20",
      "packageVersion": "0.6.0",
      "combinedSha256": "F160EDF834FCFF182D9454FF6551581BE7CD0361B38915B03BDD75F44371572A",
      "rationale": "CStructSharp.Generated support types for generated code: Codec (the span-level primitive rules the runtime now calls), ReadCursor/WriteCursor (the runtime's accounting and failure texts over spans), Pointer<T>, Expressions (the runtime's Int32 operator semantics).",
      "releaseImpact": "Additive; no existing member changes."
    },
    {
      "revision": 22,
      "kind": "breaking",
      "date": "2026-09-20",
      "packageVersion": "0.6.0",
      "combinedSha256": "BE86561BD57C89CB2003CF1948181CD9BE2EC10D8EBD0A1EC1A363C97D56C5B3",
      "rationale": "CStructSharp.Generated cursors (added in the previous commit, unreleased) take the innermost field name and type spelling instead of a member path, carry the operation path from construction, and gain FailExpression/FailUnwritable so generated code reports the runtime's exact context; Expressions.RequireInt32 raises the evaluator's InvalidOperationException.",
      "releaseImpact": "Only the unreleased CStructSharp.Generated surface changes."
    },
    {
      "revision": 23,
      "kind": "additive",
      "date": "2026-09-20",
      "packageVersion": "0.6.0",
      "combinedSha256": "861947875F69C7FAC6078110CAD1BA1519714548B170B5DB60BE3E5C97D32EA3",
      "rationale": "CStructLayoutAttribute, CStructMappedAttribute, CStructMemberAttribute, and ICStructGenerated<TSelf>: the attributes the source generator recognizes and the interface generated root classes implement.",
      "releaseImpact": "Additive."
    },
    {
      "revision": 24,
      "kind": "additive",
      "date": "2026-09-20",
      "packageVersion": "0.6.0",
      "combinedSha256": "F86FA97A71954FF63A2A5089F942D7D277BFACEF8E13390A0B9CE29F794F66C6",
      "rationale": "CStructLayoutAttribute.DefaultEnumStorage mirrors CStructCompilationOptions.DefaultEnumStorage for generated layouts.",
      "releaseImpact": "Additive."
    },
    {
      "revision": 25,
      "kind": "additive",
      "date": "2026-09-20",
      "packageVersion": "0.6.0",
      "combinedSha256": "66F163D48516349B1EB064C46572CF483667AFFB642678E1BE5877D552ABA896",
      "rationale": "Generated readers (plan 3.3/3.4/3.6): ReadCursor gains the per-kind Take methods, union/pointer bookkeeping, Seek, Complete, and Fail overloads; CompositeCursor/BitfieldSlot and TerminatedTextEncoding are new. EnterPointer, unreleased since revision 24, takes the depth, target size, and target type the cycle check keys on.",
      "releaseImpact": "Additive to the released 0.6.0 surface; the CStructSharp.Generated namespace has not shipped yet."
    },
    {
      "revision": 26,
      "kind": "additive",
      "date": "2026-09-20",
      "packageVersion": "0.6.0",
      "combinedSha256": "58E4452AAB9F82330F244057398BF0E50F91B15BD37DB4210CD1A06E327D5BB2",
      "rationale": "Generated conditionals (plan 3.5): Expressions gains Variable(variables, name, value) and TryVariable (a caller variable overrides a layout constant, as at runtime), Undefined (a conditional composite's unread or unselected local), and Overflow (a constant past the Int32 range).",
      "releaseImpact": "Additive to the released 0.6.0 surface; the CStructSharp.Generated namespace has not shipped yet."
    },
    {
      "revision": 27,
      "kind": "additive",
      "date": "2026-09-20",
      "packageVersion": "0.6.0",
      "combinedSha256": "6A5ED34AE083F40DE603FE656FEDE2EB009BF1450F539DDB08D41E254306C897",
      "rationale": "Generated custom codecs (plan 3.7): CStructLayoutAttribute.Codecs declares each codec's name, fixed size, and alignment for build-time placement; ReadCursor.TakeCustom runs an ICustomCodec on the remaining bytes as the runtime's memory path does.",
      "releaseImpact": "Additive to the released 0.6.0 surface; the attribute and the Generated namespace have not shipped yet."
    },
    {
      "revision": 28,
      "kind": "additive",
      "date": "2026-09-20",
      "packageVersion": "0.6.0",
      "combinedSha256": "5AE54C74F3C6D7527D67BE04ABC2E936AAFDB37BB9D983ECD9DD17C58D6AF93E",
      "rationale": "Generated writers (plan 3.8): WriteCursor gains a growable constructor, ToArray/Written/Dispose, Seek, Unit, WithMember, Complete, ForUpdate, and the per-kind Write* helpers (terminated, fixed and bounded text, pointer addresses, custom codecs, bitfields); Reserve/Pad take a nullable member; Codec.ToNarrowCharacter(char).",
      "releaseImpact": "Additive to the released 0.6.0 surface; the CStructSharp.Generated namespace has not shipped yet."
    },
    {
      "revision": 29,
      "kind": "additive",
      "date": "2026-09-20",
      "packageVersion": "0.6.0",
      "combinedSha256": "76DEF6E2B1ADE5D2492773BAA8C04C4AC1A92FFA88D3A4F1714B3AE506198784",
      "rationale": "Generated views and stream parsing (plan 3.3/3.4 follow-up): ReadCursor.ShortReadText and BufferStream, Codec.TrimsFixedText and DecodeWideText, the helpers a view's accessors and a generated Parse(Stream) call.",
      "releaseImpact": "Additive to the released 0.6.0 surface; the CStructSharp.Generated namespace has not shipped yet."
    },
    {
      "revision": 30,
      "kind": "additive",
      "date": "2026-09-20",
      "packageVersion": "0.6.0",
      "combinedSha256": "1B9E5B1C4C498C25C085CF68ED4079C0C96309229E3A7F1DE3A75218C6EBFB64",
      "rationale": "Generated mappers (plan 4.1): MappedTypes.MemberName (the mapper's run-time name match: exact, case-insensitive, underscores ignored) and ConvertValue<T> (Get<T>'s conversion for a pointer target).",
      "releaseImpact": "Additive to the released 0.6.0 surface; MappedTypes has not shipped yet."
    },
    {
      "revision": 31,
      "kind": "additive",
      "date": "2026-09-20",
      "packageVersion": "0.6.0",
      "combinedSha256": "0996E9DF89323892B8DE59F01A2DB099992157FA71C912A4ED2EA0A4F8EB60D1",
      "rationale": "Mapped bridge (plan 4.2): StructValue.ToMapped<T>() maps a parsed struct through a mapped class's ReadFrom.",
      "releaseImpact": "Additive to the released 0.6.0 surface."
    },
    {
      "revision": 32,
      "kind": "additive",
      "date": "2026-09-21",
      "packageVersion": "0.7.0",
      "combinedSha256": "9834105870D66666EA0C0FCC44732A71C6B84FCCBCACCAEEFEF1C556722B8971",
      "rationale": "Convenience plan 1.1: ReadOptions and CStructCompilationOptions become sealed records like WriteOptions/UpdateOptions already were, so 'with' expressions copy every other member; the baseline shows only the IEquatable<T> implementation (the generator omits the synthesized Equals/GetHashCode/ToString/PrintMembers/EqualityContract/clone members). Behaviour: two instances with the same members are now equal; the collection-typed members Codecs and Defined compare by reference.",
      "releaseImpact": "Additive: no signature changes; equality of option instances is member-wise instead of reference, which no documented contract relied on."
    },
    {
      "revision": 33,
      "kind": "additive",
      "date": "2026-09-21",
      "packageVersion": "0.7.0",
      "combinedSha256": "87068A17BD0A95A53842EF5C33A4B11522221FFB0D3B06077DA0692F213E1538",
      "rationale": "Convenience plan 1.2: ReadOptions.CancellationToken and WriteOptions.CancellationToken (inherited by UpdateOptions) let a caller stop a long read or write; the token is observed at composite, pointer, block, element, and chunk boundaries in the runtime and in the generated cursors, and surfaces as OperationCanceledException, never as a CStructException and never as false from TryReadValue<T>.",
      "releaseImpact": "Additive: two init properties with the none token as default; no existing signature changes."
    },
    {
      "revision": 34,
      "kind": "additive",
      "date": "2026-09-21",
      "packageVersion": "0.7.0",
      "combinedSha256": "CCCB4675F2845CF6240AC4251DDE098A5B7B48618FA13C21EC0B0442531B3528",
      "rationale": "Convenience plan 2.1: ReadOnlySequence<byte> overloads of Parse, ParseWithDebug, ReadValue, ReadValue<T>, ReadValueWithDebug, TryReadValue<T>, ResolveAddress, and GetArrayLength (a single segment reads in place, several are copied into a pooled buffer bounded by MaxTotalBytesRead + 1), and ReadCursor.CopySequence, the copy the runtime and generated code share.",
      "releaseImpact": "Additive overloads; coordinates are zero-based at the sequence's start, like the span forms."
    },
    {
      "revision": 35,
      "kind": "additive",
      "date": "2026-09-21",
      "packageVersion": "0.7.0",
      "combinedSha256": "E1B5D0D0FE0AA91DFCE70DBFA749B43231201FFD60BCEBF2E4AB4881ED6B6776",
      "rationale": "Convenience plan 2.2: ReadCursor.BufferStreamAsync, the awaitable twin of BufferStream (ReadAsync into a pooled array bounded by MaxTotalBytesRead + 1), shared by the generated ParseAsync forms and the runtime's async operations; BufferStream itself now forwards to the same internal helper.",
      "releaseImpact": "Additive: one static method on the generated-support cursor."
    },
    {
      "revision": 36,
      "kind": "additive",
      "date": "2026-09-21",
      "packageVersion": "0.7.0",
      "combinedSha256": "AA5106BAC83DA856575FCA3D2A67AF22840D784F47E2994D1B7EF18E2FA14EBD",
      "rationale": "Convenience plan 3.1: awaitable reads - ParseAsync, ParseWithDebugAsync, ReadValueAsync, ReadValueAsync<T>, ReadValueWithDebugAsync, TryReadValueAsync<T> (returning the new Values.ReadAttempt<T>), ResolveAddressAsync, GetArrayLengthAsync - each buffering the stream with ReadAsync (a MemoryStream that exposes its buffer is read in place) and running the synchronous span reader; ValueTask results, ConfigureAwait(false), a CancellationToken parameter linked with the options' token.",
      "releaseImpact": "Additive: new methods and one new record struct; the synchronous forms are unchanged."
    },
    {
      "revision": 37,
      "kind": "additive",
      "date": "2026-09-21",
      "packageVersion": "0.7.0",
      "combinedSha256": "8D2300E2BEDC1B887D3B01B492506F35743F01D8FBF9732338EA200D9DB63621",
      "rationale": "Convenience plan 3.2: WriteAsync (serialize first, one WriteAsync, nothing written on a validation failure) and UpdateAsync (a seekable stream's region read into a buffer, the in-place update over it, only the changed byte runs written back, the position restored), each with a CancellationToken linked with the options' token.",
      "releaseImpact": "Additive: two methods; the synchronous forms are unchanged. The fix to terminated-value updates (a replacement of another encoded length is now rejected) changes behaviour only where bytes were silently corrupted before."
    },
    {
      "revision": 38,
      "kind": "additive",
      "date": "2026-09-21",
      "packageVersion": "0.7.0",
      "combinedSha256": "E7F7FC5E9228593A588DD22B67EF4031AEBCB09ED700BC6150F3438FE9EE4799",
      "rationale": "Convenience plan 3.3: ReadCursor.WithCancellation and WriteCursor.WithCancellation give the generated ParseAsync/WriteAsync forms the options carrying the linked token (the options' token, the method's token, or a source linked from both); the generated classes gain Parse<Name>Async/ParseAsync and Write<Name>Async/WriteAsync over BufferStreamAsync and one WriteAsync.",
      "releaseImpact": "Additive: two static helpers on the generated-support cursors; the generated Parse(Stream) now restores a seekable stream to its origin on failure (it used to leave it where the buffering stopped)."
    },
    {
      "revision": 39,
      "kind": "breaking",
      "date": "2026-09-21",
      "packageVersion": "0.7.0",
      "combinedSha256": "04DB8D36CAC948600CD114CB1976F7EA2B572191E74A96D8DE16AC29353311A0",
      "rationale": "Convenience plan 4.1: ICStructGenerated<TSelf> gains the static abstract TryParse(ReadOnlySpan<byte>, out TSelf, out CStructException?, ReadOptions?) that every generated root implements; generated classes gain TryParse<Name>/TryParse for every input kind (two overloads each: with and without the failure). Breaking only for a hand-written implementation of an interface the documentation describes as implemented by the generator; the generator-emitted roots pick the member up on rebuild.",
      "releaseImpact": "A class that implements ICStructGenerated<TSelf> by hand must add TryParse; generated roots need no change beyond rebuilding with the 0.8.0 generator."
    },
    {
      "revision": 40,
      "kind": "additive",
      "date": "2026-09-21",
      "packageVersion": "0.7.0",
      "combinedSha256": "26C3C00121C9B9C0EA910F662AF65E89021A626B299630780B91BB347788393E",
      "rationale": "Convenience plan 4.2: StructValue.TryGet<T>(path, out value, out CStructException? failure) and UnionValue.TryGet<T>(...) hand back the path or read exception Get<T> would have thrown without throwing it, so an absent member and an unconvertible one can be told apart; StructValue.GetOrDefault<T>(path, fallback) and UnionValue.GetOrDefault<T>(path, fallback) return the fallback for both.",
      "releaseImpact": "Additive: four methods; the existing two-argument TryGet<T> is unchanged."
    },
    {
      "revision": 41,
      "kind": "additive",
      "date": "2026-09-21",
      "packageVersion": "0.7.0",
      "combinedSha256": "DCEF94F3F13FE05534581F7AC22910CA7D530204C2F0ED921FA48066171B364A",
      "rationale": "Convenience plan 5.1: ParseMany over memory, a ReadOnlySequence, or a seekable stream and ParseManyAsync over any stream - lazy record sequences (D6)",
      "releaseImpact": "New members on CStruct; nothing removed or changed"
    },
    {
      "revision": 42,
      "kind": "additive",
      "date": "2026-09-21",
      "packageVersion": "0.7.0",
      "combinedSha256": "66A4B4DA7DEDA37CCD01EFA2B6F9736DA97B7D5C3C58222734AFB8B7B515C798",
      "rationale": "Convenience plan 5.2: RecordSequence and RecordReader<T> in CStructSharp.Generated, the shared record-sequence enumerators the generated Records forms and ParseMany run on (D6)",
      "releaseImpact": "New public support types in CStructSharp.Generated; the runtime's ParseMany signatures are unchanged"
    },
    {
      "revision": 43,
      "kind": "additive",
      "date": "2026-09-24",
      "packageVersion": "0.8.3",
      "combinedSha256": "1C46F118E6F59ED1137D5B94D08C919343C828AF276A1A50CCB249331AAEEE0B",
      "rationale": "Add BtfMetadata.Describe(id) for shallow, non-recursive type introspection",
      "releaseImpact": "New public types (BtfKind, BtfMemberDescription, BtfTypeDescription) and one new method (BtfMetadata.Describe); no existing member changed"
    },
    {
      "revision": 44,
      "kind": "additive",
      "date": "2026-09-24",
      "packageVersion": "0.8.3",
      "combinedSha256": "AC6EB3861ADCC81F443FD12F962D9A4B8800A8ABE3E2C022AB78B5EF1BD3C403",
      "rationale": "Best-effort Import: a same-sized Opaque placeholder for a definition whose recorded placement does not hold up, instead of failing the whole schema",
      "releaseImpact": "Adds MemoryTypeKind.Opaque, MemorySchema.Diagnostics, and an opt-in bestEffort parameter on MemorySchema's constructor and BtfMetadata.Import; every existing call site is unaffected since bestEffort defaults to false"
    }
  ]
}
