Residual TagConfig gate-coverage gaps found by the #549 survey #551
Reference in New Issue
Block a user
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Four residuals from the #549 fleet survey, none fixed there (each is a different rule than value-validity):
RawCsvImportModalnever callsTagConfigValidator— its typed columns are strictly parsed, but the free-formTagConfigJsoncolumn is unvalidated at authoring and meets only the deploy gate. Wiring it needs care: it could reject previously-importable files, and a rejected row must be an ERROR, not a skip.dataTypeto be PRESENT (S7TagDefinitionFactoryrejects an absent key — unique in the fleet), but neither itsInspectnor the AdminUI model warns about absence — a hand-authored S7 blob without one passes both gates and dies at the driver.dataTypeand ModbusstringByteOrderare strict at runtime but checked by neitherInspectnor any editor.InspectXML summaries (andEquipmentTagConfigInspectorclass remarks) still say invalid enums are "silently defaulted by the lenient runtime" — false since R2-11 Phase C made the runtime reads strict (TryReadEnumStrictrejects the tag). The warnings are now describing rejections, not silent defaults.FIXED — merged to master as
333ea488(branch commits05b42478+1ce6e8b1). All four items, plus the structural upgrade:RawTreeServicerunsTagConfigValidatorinCreateTagAsync,UpdateTagAsyncANDImportTagsAsync(the issue's premise that manual entry rides the import was wrong — it commits row-by-row viaCreateTagAsync, which is why the gate landed on all three). The CSV review grid additionally surfaces per-row errors at the parse stage (RawTagCsvMapper). A rejected row is a named ERROR in the all-or-nothing result, never a skip. Falsified: removing the service check reddens exactly the service test while every mapper test stays green — the service is the guarantee, not the form.dataTypenow rejects at authoring (_dataTypeMissingInSourcecapture — judged on the KEY like the runtime'sDeclaresDataType; a browse-commit-built model and any load→save round-trip stay clean) and warns at the deploy gate.members[](non-object entry / missing name / typo'd memberdataType, indexed) and ModbusstringByteOrdernow checked at authoring and deploy.EquipmentTagConfigInspectorremarks andAdminOperationsActor.Structural: all seven pre-#549
Inspects (Modbus/S7/AbCip/AbLegacy/TwinCAT/FOCAS/Mqtt — an unnamed sibling with the same gap) converted to accept-gate-first — parse accepts ⇒ silent; parse rejects ⇒ a warning must name why. That closed the three named gaps AND every unnamed one (absent/blank address keys fleet-wide, TwinCAT's valid-name-but-refusedStructure, Mqtt's union-of-both-mappers gate), with a structural invariant test per factory: a blob the parse rejects can never draw zero warnings. Never-stricter preserved (Modbus's narrowing casts mirrored; AbLegacy's clamp deliberately not warned; FOCAS's accepted-blob advisories kept as a distinct class).Verified on the merged tree: 12 suites / 5,098 tests green. Two findings filed as their own issues: Sql browse-commit emits a config the gate rejects (#552), and the CSV typed-column merge silently rewrites typo'd enums before any gate sees them (#553).