Skip to content

Releases: natsume-777/AddressTeller

v0.6.1

Choose a tag to compare

@natsume-777 natsume-777 released this 23 Sep 04:37

Fixed

  • JUnit report: CheckCLI now attaches a <failure> to a Validation <testcase> only when its status has
    at least one IsOk=false result — matching CheckCLI's own exit code 2 criteria, so a DuplicateAddress
    notice that only involves duplicates outside this run's writes (IsOk=true) does not get a <failure>.
    ApplyAllCLI and ApplyWithValidateCLI now attach <failure> only to a status that actually blocks
    Apply, matching their own exit code 2 criteria: a DuplicateAddress that does not block the write no
    longer produces a <failure> from these two, even when reported as IsOk=false — this matches 0.6.0's
    documented exit code contract, which already excluded DuplicateAddress from aborting Apply or affecting
    its exit code. <testcase> elements are still generated for every status present, as before (unchanged);
    only the presence of the nested <failure> element changes. Direct calls to the public
    AddressTellerReportWriter.ToJUnitXml / WriteToFile overloads are unchanged: they still attach
    <failure> unconditionally to every Validation <testcase>, regardless of IsOk.
  • Snapshot auto-rotation: if Auto-snapshot retention count is manually edited in
    ProjectSettings/AddressTellerSettings.json to 0 or less, the safety snapshot CaptureAndSave had just
    saved before an apply runs could be deleted by the rotation that same call performs right after saving it
    — before Apply itself has even started — leaving Undo Last Apply unable to restore it. The count is now
    clamped to 1 on load (in-memory only; the JSON file is not re-written with the correction), and a
    Warning is logged. Values set via Project Settings UI are already constrained to 1 or more.

Changed

  • Project Settings UI: the empty-list message for "Managed Groups" now reflects the current ownership
    definition: groups targeted by enabled rules' Address() calls, not just Group() references. Added a
    note to IAddressRuleBuilder.Group()'s XML doc that Addressables replaces / and \ in a group name
    with - when the group is actually created or renamed, so a Group() name containing either character
    may not match the group Addressables ends up with; changed the Writing Rules example accordingly
    (BossAudio instead of Audio/Boss).

Documentation

  • Documented that Summary.Issues counts every entry in Issues[], including report-only notices that
    don't affect Summary.ExitCode — check Summary.ExitCode to tell whether a report represents a passing
    or failing run, not this count. The value itself is unchanged.
  • Documented that the JUnit report is built from the pre-Apply dry-run result, not the actual execution
    result an apply's exit code is based on, so a status that can only be produced by actually performing a
    write (e.g. ValidationStatus.EntryRejectedByAddressables) can affect ApplyAllCLI / ApplyWithValidateCLI's
    exit code without ever appearing in that run's JUnit output.
  • Expanded the 0.6.0 upgrade guidance for the settings-storage change into a dedicated "Upgrading from
    0.5.x" note: a fuller list of the settings that reset to their defaults, what an early automatic apply
    on import can and cannot do before you get a chance to restore your values, and safeguards that don't
    depend on that timing. Also fixed inaccurate/incomplete notes for ValidationResult.IsOk, the
    label-only rule change, and PostprocessOrder (all BREAKING), and for the TypeBasedRules sample
    (not BREAKING).

v0.6.0

Choose a tag to compare

@natsume-777 natsume-777 released this 21 Sep 16:09

Added

  • Broad-rule-overridden-by-specific-rule address authoring: AddressRuleBase.Order now also acts as a
    priority when two or more matching rules produce an address for the same asset. See
    Writing Rules: Address priority and conflicts
    for an example.
  • Cross-asset duplicate address detection: Validate / Apply All (and CheckCLI / ApplyAllCLI /
    ApplyWithValidateCLI) now report when two different assets resolve to the same address
    (ValidationStatus.DuplicateAddress), as an error or a non-blocking notice depending on whether
    AddressTeller itself would write one of the colliding addresses. See
    Design Decisions: Address Priority and Conflicts.

Changed

  • BREAKING: AddressRuleBase.Order now doubles as an address priority, not just an evaluation order.
    When two or more matching rules produce an address for the same asset, the one with the lowest Order
    wins instead of it always being a conflict; it is only a conflict when the lowest-Order matches tie.
    If your project has assets that were previously reported as ConflictingAddress (and therefore never
    written), run Preview (dry-run) before the first Apply All after upgrading — those assets will now be
    written using whichever matching rule has the lowest Order, including via auto-apply on import if that
    setting is enabled. See
    Design Decisions: Address Priority and Conflicts
    and Compatibility: Rule Authoring Behavior.
  • BREAKING: Settings now persist to ProjectSettings/AddressTellerSettings.json instead of
    ProjectSettings/AddressTellerSettings.asset. The old .asset file is no longer read. Settings reset
    to their defaults once, the first time this version runs — notably, this turns Auto-apply on import
    and Remove unmatched entries back ON if you had turned either off, since that's their default. Check
    Project Settings > AddressTeller and re-apply your values (including these two) after upgrading.
    Delete the old .asset file — it is no longer used. See
    Settings Asset.
  • BREAKING: Ownership for every deletion-related operation — CleanupStaleEntries, the invalid-path
    entry sweep, deletion follow-up for deleted assets, ClearScope.Managed (including CLI
    -addressTellerClearScope managed), and the removable-entry filter in Undo Last Apply — is now
    determined by which groups a rule declares Address() for, not by every group referenced via
    Group(). Each of these now considers a narrower set of groups "managed": a Group("X") rule that
    hasn't called Address() yet no longer makes group X eligible. See
    Design Decisions: Deletions Are Determined by Per-Asset Ownership.
  • BREAKING: Label-only rules (AnyGroup(), or a Group() rule with no Address()) now add labels
    to an asset's existing entry regardless of which group it belongs to — previously, labels were only
    added when that group was referenced by another rule's Group(). If your project has such a rule, run
    Preview (dry-run) before the first Apply All after upgrading: entries in groups the rule previously
    couldn't reach will gain labels, including via auto-apply on import if that setting is enabled. See
    Writing Rules: AnyGroup.
  • BREAKING: ApplyAllCLI / ApplyWithValidateCLI no longer exit with code 1 for a completed apply
    that had drift; a successful apply now always exits 0. See
    Compatibility: Exit Codes.
  • BREAKING: ApplyAllCLI / ApplyWithValidateCLI's JUnit report no longer reports drift as a
    <failure> on the drift testcase, matching the exit code change above (a completed apply's own
    report should not fail a CI job that ingests it). AddressTellerReportWriter.ToJUnitXml /
    WriteToFile gained an optional treatDriftAsFailure parameter for this (default true, matching
    CheckCLI's existing behavior). See
    Compatibility: Report Output.
  • BREAKING: AddressTellerCliArgs.TryParse now rejects an unrecognized -addressTeller-prefixed
    argument as a parse error instead of silently ignoring it. See
    Compatibility: Command-Line Arguments.
  • ApplyAllCLI / ApplyWithValidateCLI / ClearCLI now call AssetDatabase.SaveAssets() right before
    exiting. See Apply & Operations: CI Integration.
  • Projects with a pre-existing duplicate address may now see CheckCLI exit 2 where it previously
    exited 0 or 1. ApplyAllCLI / ApplyWithValidateCLI / Apply with Validate are unaffected by a
    duplicate either way — it is only ever logged and reported, never a reason to abort or to change
    their exit code. See
    Design Decisions: Address Priority and Conflicts.

Verified

  • EditMode test suite: 656 tests (654 pass / 0 fail / 2 skip), run on Unity 6000.3.8f1 with Addressables 2.8.1. The minimum Addressables requirement remains 2.8.1.

v0.5.0

Choose a tag to compare

@natsume-777 natsume-777 released this 17 Sep 02:49

Added

  • IAddressRuleGroupBuilder.IncludeFolders() and ILabelRuleBuilder.IncludeFolders():
    opt a rule into receiving folder assets during evaluation. Callable once per rule or group; calling
    twice throws InvalidOperationException. Without this call, folders are skipped entirely (predicate
    is never invoked).
  • AssetContext.IsFolder: true when the asset is a folder rather than a file. Useful for rules that
    opt into folder evaluation and need to distinguish between the two; also available to tests and
    tooling that construct AssetContext manually.
  • Overload of AssetContext constructor accepting isFolder parameter, in addition to the existing
    constructor. The existing constructor (without isFolder) defaults to false.
  • AddressRuleEntry.IncludesFolders: read-only property indicating whether this entry opted in to
    folder evaluation. Not settable through the public AddressRuleEntry constructor — it is only ever
    true when the entry was produced by the builder (i.e. IncludeFolders() was called). Useful for
    code that constructs its own evaluation loop over collected entries (e.g. testing helpers).
  • ValidationStatus.EntryRejectedByAddressables: reported when a rule matched, resolved an address,
    and the target group exists, but Addressables itself refused to create or move a usable entry for
    this asset (the path is not valid for an Addressables entry; Addressables returns no entry when the
    asset's main type also belongs to an editor assembly, and a read-only placeholder otherwise). This
    is distinct from ValidationStatus.GroupNotFound, which covers the target group itself not
    existing. Any read-only placeholder entry Addressables did create in this edge case is removed.

Fixed

  • Windows: AddressableAssetSettings.ConfigFolder may be returned with backslash separators. This
    meant that, on Windows, assets under the Config Folder were not actually excluded from rule
    evaluation, and AddressTellerPostprocessor's early-exit check did not recognize changes confined to
    the Config Folder, so saving Addressables settings triggered an unnecessary incremental apply for the
    changed settings assets. The path is now normalized to forward slashes at the point of retrieval,
    restoring both behaviors; any Config Folder entries created while the exclusion was ineffective are
    removed by the invalid-path cleanup described below when CleanupStaleEntries is enabled.
  • Apply no longer aborts with a NullReferenceException when Addressables' CreateOrMoveEntry returns
    null; the asset is now reported as EntryRejectedByAddressables instead.
  • Read-only placeholder entries that Addressables silently creates for a path it considers invalid
    (when the asset's main type is not from an editor assembly) are no longer left behind; Apply now
    removes them.

Changed

  • BREAKING: Folders are now opt-in via IncludeFolders(). By default, folder assets do not appear
    in rule evaluation — neither the Where() predicate nor address/label selectors are invoked for
    folders. Rules that wish to register entries for folders must explicitly call IncludeFolders() on
    the builder (once per rule / Group() / AnyGroup()). Previously, every folder path returned by
    AssetDatabase.GetAllAssetPaths() was evaluated like a file, so a broad predicate (e.g.
    Match.All() or Match.InFolder(...)) could match a folder and create an Addressables folder entry
    that implicitly covers everything beneath it. Rules that do not call IncludeFolders() can now use
    broad predicates without matching folders. If CleanupStaleEntries is enabled, a folder entry that
    only existed because such a broad rule matched it before this change is treated as unmatched once
    the rule stops seeing it, and is removed by the same stale-entry cleanup that has always applied to
    unmatched file entries — this is not a new cleanup mechanism, and follows the same scoping as file
    cleanup (only assets actually evaluated by that particular apply are affected).
  • BREAKING: Path validity checks now align with Addressables. Addressables itself rejects certain
    paths when users manually create entries via the Groups window or the Inspector "Addressable"
    checkbox: paths outside Assets/ and outside a package's own folder (e.g. ProjectSettings/,
    Library/, Temp/); a package's own package.json; a package's own root folder with nothing
    beneath it; extensions .preset and .asmdef; paths containing /Editor/ or ending in /Editor;
    the Assets root itself; and the Addressables Config Folder (see below). Such paths are now
    filtered out before rules run — no rule sees them and no result is reported for them, the same as
    any other pre-filtered path. ValidationStatus.EntryRejectedByAddressables is reported only if
    Addressables still refuses a write for a path that passed this filter (a rare case, see Added).
  • BREAKING: CleanupStaleEntries, when enabled, also removes entries in managed groups whose
    asset path is structurally invalid for an Addressables entry at all — regardless of whether any rule
    matches them — for example leftovers created by an older AddressTeller version under
    ProjectSettings/, or with a .preset/.asmdef path. Unlike the stale-entry cleanup described
    above, this check scans every entry in every managed group on every apply, including import-time
    auto-apply, independent of which assets were actually imported or changed.
  • BREAKING: Extension exclusion is now case-sensitive. File paths ending in .CS, .DLL,
    .PRESET, etc. (uppercase) are no longer automatically excluded from evaluation and will now pass
    through to rules. This matches Addressables' own behavior.
  • BREAKING: The Config Folder exclusion now uses Addressables' own boundary-less prefix match,
    reverting the boundary-aware check introduced in 0.4.0. Folders that merely share the Config
    Folder's name prefix (e.g. Assets/AddressableAssetsData_Backup) are now excluded, matching the
    Groups window and Inspector; existing entries for assets under them — files as well as folders — in
    managed groups are removed on the next apply when CleanupStaleEntries is enabled.
  • Upgrading from 0.4.x: with CleanupStaleEntries enabled (the default), the first apply after
    upgrading can delete existing entries in managed groups: folder entries (whether created by a broad
    rule or added by hand) that no rule opting in with IncludeFolders() matches; and entries whose path
    Addressables itself rejects (.preset/.asmdef, an Editor folder or anything under one, the
    Assets root, a package root or its package.json, paths outside Assets//packages such as
    ProjectSettings/, and anything under or sharing a name prefix with the Config Folder). Invalid-path
    entries are removed by any apply, including the automatic apply on import, which does not take an
    automatic snapshot. Before upgrading: save a snapshot (Tools/AddressTeller/Snapshot/Save Snapshot), or temporarily disable CleanupStaleEntries and turn off auto-apply on import; add
    IncludeFolders() to rules that are meant to register folders; then run Apply All and review the
    removal warnings in the Console.
  • RuleUnitTestHelper sample: ExampleRuleTest.FindFirst now skips a rule's Predicate for a folder
    AssetContext when the rule did not opt in via IncludeFolders(), matching the production
    evaluator's behavior; RuleTestHelper's doc comments and the sample's README explain this for
    hand-rolled evaluation loops.

Documentation

  • compatibility.md: documented that adding a method to a rule-builder interface
    (IAddressRuleBuilder, IAddressRuleGroupBuilder, ILabelRuleBuilder) is a non-breaking change,
    since these interfaces are only ever implemented internally and are meant to be consumed, not
    implemented, by rule authors. Also documented the IncludeFolders() single-call constraint, that a
    folder never reaches a rule's Where() unless the rule opts in, and the stale-entry cleanup's
    expanded scope (structurally invalid paths, not just unmatched entries).
  • design-decisions.md: documented the folder opt-in model, the rationale for aligning path validity
    checks with Addressables, and a design principle comparing AddressTeller's rule surface against what
    the Addressables Groups window allows and refuses manually.
  • operations.md: documented the new path exclusion categories, the cleanup of path-invalid entries
    in managed groups, and a pointer to the upgrade note above.
  • writing-rules.md: added guidance on IncludeFolders() use and folder context detection
    via IsFolder.

v0.4.2

Choose a tag to compare

@natsume-777 natsume-777 released this 06 Aug 17:48

Documentation

  • README.md, README.ja.md, Documentation~/writing-rules.md and .ja.md: corrected the asmdef
    reference guidance. A custom assembly that only defines rule classes needs AddressTeller.Core
    alone — the entire rule-authoring surface (AddressRuleBase, IAddressRuleBuilder, Match,
    AssetCondition, Naming, AssetContext, RuleInspector) lives there, as the
    Rule Unit Test Helper sample's own asmdef demonstrates. AddressTeller.Editor is required
    only when the assembly also calls the operational APIs (AddressTellerService,
    ValidationResult, snapshots, reports); referencing it always requires referencing
    AddressTeller.Core too, since those signatures expose Core types. The previous text told
    every rule assembly to reference both.
  • README.md and README.ja.md: documented pinning the install to a release tag and clarified
    that the Compatibility Policy takes effect only from 1.0.0
    onward; while in 0.x, breaking changes may land in minor releases, so tag pinning is strongly
    recommended. Noted that unpinned git URLs track the default branch, and that release tags exist
    only for version 0.4.0 and later.

v0.4.1

Choose a tag to compare

@natsume-777 natsume-777 released this 06 Aug 17:48

Documentation

  • README.md and README.ja.md: clarified that an asset matched by a rule is moved
    into that rule's group regardless of its current group, while deletions and
    label additions are limited to groups referenced by at least one rule.
  • README.md and README.ja.md: added an Addressables primer (address / label /
    group, initializing Addressables) and expanded Quick Start with notes on entry
    creation and moving, managed-group scoping, and auto-apply on import —
    including that auto-apply also deletes entries that no longer match any rule
    (CleanupStaleEntries).
  • Documentation~/operations.md and .ja.md: added a non-interactive CLI section
    covering the four CLI entry points' exit behavior, a batch-mode example for CI,
    and the fact that Tools/AddressTeller/Clear All Addresses & Labels... always
    shows a confirmation dialog with no dry-run gate.
  • Documentation~/operations.md and .ja.md: added the previously undocumented
    Tools/AddressTeller/Preview Group... and
    Assets/AddressTeller/Preview (Apply Preview) entries to the Apply Methods table.
  • Documentation~/operations.md and .ja.md: documented the per-rule preview
    ("Validate/Apply this rule only" button in Project Settings), including that it
    can predict Removed for entries owned by another rule targeting the same
    group, because only the selected rule is in evaluation scope.
  • AddressTellerScopedPreview.cs XML doc comment: removed an inaccurate mention of
    sub-assets from the folder-expansion note on RunGroupPreview.

v0.4.0

Choose a tag to compare

@natsume-777 natsume-777 released this 06 Aug 17:48

Added

  • ReportFormat and DistributionFormat enums: new public types representing the format choices for report and distribution exports. ReportFormat supports Json and Junit (used by AddressTellerReportWriter.WriteToFile), while DistributionFormat supports Csv and Markdown (used by BundleDistributionSerializer.WriteToFile).
  • ValidationStatus.RuleConfigureFailed: returned when a user rule's Configure() method throws an exception. The problematic rule is skipped (treated as producing no entries) and evaluation continues; this status helps identify which rule has a configuration problem.
  • Warnings displayed in Undo Last Apply dialog and Explain window when rule configuration errors exist, so users are aware that reported results are incomplete.
  • AddressTellerReport.SchemaVersion: a new field parallel to AddressTellerSnapshot.SchemaVersion, defaulting to 1 and set by AddressTellerReportBuilder.Build.
  • AddressTellerReport.CurrentSchemaVersion: a new public constant (= 1) exposing the schema version AddressTellerReport.SchemaVersion defaults to and FromJson compares against. Previously this value existed only as an internal constant on AddressTellerReportBuilder, which meant it wasn't covered by the public API approval baseline; AddressTellerReportBuilder now reads this new public constant instead of defining its own.
  • AddressTeller.Testing.RuleInspector: public API for inspecting rule configuration results without a real Addressables project. Provides Collect() to retrieve all rule entries registered by the rule, IsUnresolvedDefaultGroup() to check for unresolved GroupDefault() references, and DisplayGroupName() to format group names for display. Enables comprehensive rule unit tests; replaces the custom Fake builders previously used in RuleUnitTestHelper samples.

Fixed

  • RestoreExactWithRemoval API: Undo Last Apply now correctly deletes entries matching the confirmation dialog count, instead of leaving all entries intact.
  • Rule collection no longer stops on constructor exceptions or open generic types; problematic rules are skipped and evaluation continues.
  • Settings folder exclusion filter now includes path separators to prevent adjacent folders (e.g., AddressableAssetsData_Backup) from being mistakenly excluded.
  • Cleanup no longer incorrectly deletes entries for assets matched by label-only rules; added ValidationStatus.LabelsOnly to properly track label-only rule matches.
  • CollectManagedGroups now excludes null values and unresolved GroupDefault() sentinels from the managed groups list.
  • NullReferenceException when ApplyAll is called with paths: null.
  • Duplicate warnings and processing for the same group after AutoCreateMissingGroups.
  • Potential NullReferenceException in the result window when Context is null.
  • Snapshot file overwriting when multiple saves occur within the same second; improved error handling for write failures.
  • Snapshot file helper duplication and folder boundary detection.
  • SnapshotFolder path traversal vulnerability; added range check to restrict paths to the project directory.
  • Apply All lacking progress bar display and cancellation support; integrated EditorProgressReporter.
  • Incorrect comment in Naming class.
  • Unnecessary array allocations in AssetContext.PathSegments by caching.
  • Label-only rules incorrectly writing labels to unmanaged group entries without ownership check; labels are now restricted to managed groups.
  • Automatic safety snapshot save failures were previously ignored; Apply All / Apply with Validate now properly handle these errors by stopping the operation and notifying the user.
  • Snapshot save operation now handles Directory.CreateDirectory failures (e.g., invalid path or permission error) gracefully, preventing unhandled exceptions.
  • Snapshot restoration now tolerates duplicate group names instead of throwing an exception; duplicate groups are reported as warnings. AddressTellerSnapshotService.Restore and BundleModeReader have been updated to handle this gracefully.
  • AssetFilter.ShouldExcludeByPath: added null check before calling path.Replace() to prevent NullReferenceException.
  • Snapshot JSON loading (LoadFromFile): extended mandatory field validation to include GroupName and Entries (in addition to the existing Guid check).
  • Project Settings UI: Postprocessor order field now displays the effective clamped value (e.g., 0 becomes 1000) when the user leaves the field or presses Enter.
  • ExportDistribution: now displays an error dialog when file write fails, instead of silently suppressing the error.
  • AddressTellerSnapshotService.Restore/RestoreExactWithRemoval/Diff now throw ArgumentNullException for missing required arguments instead of an unguarded NullReferenceException, matching AddressTellerClearService.Clear's existing contract. The package's null-argument policy (explicit entry points throw; methods with default-value fallback such as AddressTellerService.* do not) is now documented in the relevant XML doc comments.
  • AddressTellerSettings.DisabledRuleClassNames now returns a defensive copy instead of the internal list instance, so mutating the returned collection can no longer affect the persisted setting.

Changed

  • BREAKING: Core domain model and evaluation engine (Editor/Core/ content) are now split into an independent assembly AddressTeller.Core. The asmdef name is AddressTeller.Core, and the namespace remains AddressTeller (unchanged). If your project has a custom asmdef that references AddressTeller.Editor, you must also add AddressTeller.Core to its references; since public APIs in AddressTeller.Editor expose Core types (e.g., ValidationResult.Context is AddressTeller.AssetContext, AddressTellerService.ApplyAll(..., rules) accepts IReadOnlyList<AddressTeller.AddressRuleBase>), the compiler requires both assemblies in references.
  • Validation notifications with IsOk=true (e.g., GroupWillBeCreated) are now logged as Warning instead of Error across all entry points (Postprocessor, Menu, ApplyFlow). This distinguishes informational status messages from actual errors.
  • AddressTellerMenu.Validate() now opens the result window (showing Issues tab) when one or more errors (IsOk=false) are detected. Previously, results were only logged to the console.
  • BREAKING: BundleModeReader.ReadBundleModes() and BundleDistributionSummarizer.Build() now include an out parameter for reporting duplicate group name warnings. Callers must accept this new parameter.
  • BREAKING: IAddressRuleBuilder.Address() now throws InvalidOperationException when called twice on the same rule, matching Where() behavior. Previously, duplicate address assignments were silently overwritten; this change ensures early detection of ambiguous address specification.
  • ApplyAll, ValidateAll, and BuildPredictedSnapshot now skip stale-entry cleanup (DeletedAssets tracking) if any rule configuration error is detected, preventing incorrect deletions of entries managed by broken rules.
  • ApplyAll / Apply with Validate menu operations now cancel instead of continuing when automatic safety snapshot save fails, matching the fail-fast design of ClearAll.
  • ClearAll menu and ClearCLI command now abort when rule configuration errors exist (CLI exits with code 3).
  • BREAKING: AddressTellerReportWriter.WriteToFile and BundleDistributionSerializer.WriteToFile now take ReportFormat / DistributionFormat enum arguments instead of raw strings ("json"/"junit" and "csv"/"markdown"). CLI text arguments (-addressTellerReportFormat) are unaffected; only the public API surface changed.
  • BREAKING: SnapshotDiff.Added/Removed/Changed are now IReadOnlyList<T> instead of List<T>. Code that mutated these collections directly must be updated.
  • BREAKING: SnapshotDiff and DryRunResult parameterless public constructors are now internal. These types are instantiated only by the library's snapshot and dry-run APIs; tests continue to construct them via InternalsVisibleTo.
  • BREAKING: ValidationResult and AddressCandidate public constructors are now internal. These types are only ever constructed by the library's own rule evaluation pipeline; tests continue to construct them via InternalsVisibleTo.
  • BREAKING: AddressTellerPostprocessor is now sealed.
  • BREAKING: AddressTellerService.RemoveEntriesForDeletedAssets now returns IReadOnlyList<ClearedEntry> (previously void), reporting the entries actually removed. This matches the convention already used by ApplyAll/ValidateAll of surfacing results instead of discarding them.
  • BREAKING: AddressTellerExplainReport, AddressTellerExplainAsset, and AddressTellerExplainRule are now internal (previously public). No supported code path constructs or exposes these types outside the package.
  • BREAKING: AddressTellerCliArgs.ReportFormat is now ReportFormat? instead of string. Code that read this property as a raw string ("json"/"junit") must be updated to compare against the ReportFormat enum.
  • RuleUnitTestHelper sample: DefaultGroupSentinel constant removed; Collect() now delegates to the package's own RuleInspector public API, ensuring the exact same builder contract (calling Where()/Address() a second time on the same group now throws InvalidOperationException). New helper methods IsUnresolvedDefaultGroup() and DisplayGroupName() added for checking and displaying unresolved default group sentinels in tests.
  • BREAKING: LogicalBundleDto renamed to BundleDistributionReportEntry. This is a C# API-only rename; the JSON report output (field names) is unchanged.
  • Enum members of ValidationStatus, ClearScope, ReportFormat, DistributionFormat, SnapshotRestoreMode, and BundleModeKind now carry explic...
Read more