73230a42c5
Inspect parsed the TagConfig blob once itself (root kind + the present-but-discarded changeTriggered/timerIntervalMs checks) and then called TryReadTagConfig(reference, out _), which parsed the same string from scratch again for the scriptId rule. The field-by-field read is now TryReadRoot(JsonElement), which both entry points share, so Inspect consults the one authority over the root it already has. The public string-based TryReadTagConfig signature other modules consume is unchanged. Pure refactor: added CalculationTagDefinitionFactoryInspectTests (17 cases pinning the exact wording, the rejection-vs-advisory split and their order, and the never-stricter-than-the-runtime-read invariant). They pass unchanged against the pre-refactor code — verified by stashing the production change.