elsa-core/specs/012-output-converters/checklists/completion.md
Sipke Schoorstra dff7d9f987
Harden output converter contracts
(cherry picked from commit 0737def83d)
2026-08-21 22:22:47 +02:00

6.8 KiB

Output Converter Completion Audit

This checklist maps the approved requirements to implementation and automated evidence. A checked item means the requirement is represented in production code and covered by the cited test or review evidence.

Functional requirements

Status Requirement Evidence
[x] FR-001: zero or one explicit converter Output.Converter; output JSON and Studio round-trip tests
[x] FR-002: stable ID plus optional JSON settings OutputConverterConfiguration; serialization tests
[x] FR-003: unchanged omitted shape and assignment OutputJsonConverterTests; no-converter runtime tests
[x] FR-004: no implementation details persisted serialization and descriptor-redaction tests
[x] FR-005: native output, converted bound value activity-execution-context and component tests
[x] FR-006: native observation surfaces native output-register assertions and unchanged journal path
[x] FR-007: synchronous boundary conversion IOutputConverter.Convert; ActivityExecutionContext.Set
[x] FR-008: native null bypasses invocation invoker/runtime null-bypass tests
[x] FR-009: converter null obeys destination nullability destination and invoker nullability tests
[x] FR-010: validate before destination write invoker atomicity tests
[x] FR-011: failure preserves destination and native output unit atomicity and missing-registration component scenario
[x] FR-012: stable ordinal case-sensitive IDs registry tests
[x] FR-013: reject duplicate and case-only IDs registry tests
[x] FR-014: behavioral versions use new IDs public extension documentation and ADR 0012
[x] FR-015: no inferred selection explicit configuration path and registry tests
[x] FR-016: declared source and result types OutputConverterDescriptor
[x] FR-017: source assignability registry and invoker compatibility tests
[x] FR-018: declared/runtime result assignability destination resolver and invoker tests
[x] FR-019: reject unknown destination; allow object destination resolver and management validation tests
[x] FR-020: no open generics or chains registration rejection tests; single configuration model
[x] FR-021: narrow immutable invocation context OutputConversionContext
[x] FR-022: no mutable workflow state or service locator public converter contract review
[x] FR-023: active-scope dependency resolution keyed registration and multi-scope tests
[x] FR-024: descriptors do not retain scoped instances registry design and lifetime tests
[x] FR-025: deterministic, side-effect-free contract XML/public documentation and reference converter tests
[x] FR-026: definition-time validation ValidateOutputConvertersTests
[x] FR-027: runtime drift validation missing-registration component scenario
[x] FR-028: schema plus custom settings validation settings-validator tests
[x] FR-029: dedicated normal-pipeline fault, no custom retry OutputConversionException; fault component scenario
[x] FR-030: structured contextual metadata exception-state tests and component incident assertions
[x] FR-031: originating exception retained at runtime invoker exception-cause tests
[x] FR-032: values/settings excluded from default errors privacy and exception-state tests
[x] FR-033: server registry/query capability OutputConverterRegistry; descriptor endpoint
[x] FR-034: API filtering by declared types endpoint tests
[x] FR-035: safe descriptor response endpoint redaction test
[x] FR-036: Studio uses API discovery RemoteOutputConverterService and tests
[x] FR-037: Studio filters by declared binding types Outputs-tab tests, including arrays
[x] FR-038: Studio select/configure/clear/reopen/validate Outputs-tab and settings-editor tests
[x] FR-039: schema-driven editor with raw JSON fallback settings-editor tests
[x] FR-040: no Core production catalog repository review; reference converter exists only in tests
[x] FR-041: inputs/expression coercion unchanged change-scope review
[x] FR-042: cross-cutting automated coverage Core, Management, API, client, component, and Studio suites listed below

Success criteria

Status Criterion Evidence
[x] SC-001: existing no-converter serialization/assignment behavior omitted-shape and no-converter-path tests
[x] SC-002: no lookup/allocation and no regression over 2% zero-infrastructure-call test; fixed-count benchmark measured 1.275 µs versus 1.294 µs with overlapping confidence intervals
[x] SC-003: static invalid configurations rejected 3 management validation tests
[x] SC-004: all failure stages yield safe dedicated faults invoker, privacy, and exception-state tests
[x] SC-005: complete Studio authoring flow automated component flow; the two-minute threshold is a manual UX acceptance measure
[x] SC-006: configuration survives every round trip Core serialization, API client, and Studio tests
[x] SC-007: native and converted values independently correct variable and workflow-output scenarios
[x] SC-008: extension-only converter registration/discovery registration-usage and API discovery tests

Verification log

  • Core output-converter and serialization tests: 47 passed on net10.0.
  • Management definition-validation tests: 3 passed on net10.0.
  • API endpoint tests: 6 passed on net10.0.
  • API-client component tests: 2 passed on net10.0.
  • Runtime component tests: 3 passed on net10.0 (workflow-output scenario plus the corrected variable and missing-registration scenarios).
  • Studio output-converter tests: 9 passed on net10.0 against this Core worktree.
  • Core project build: passed on net10.0 with zero warnings and errors.
  • Core, Management, API, and API-client projects built successfully for net8.0, net9.0, and net10.0 during the solution build.
  • The complete solution build could not finish with --no-restore because unrelated projects had no project.assets.json in this worktree (Elsa.Workflows.IntegrationTests, Elsa.Hosting.Management, and Elsa.Workflows.Runtime.UnitTests).
  • The final fixed-count BenchmarkDotNet run measured the no-converter path at 1.275 µs versus 1.294 µs for the legacy-equivalent path, with strongly overlapping confidence intervals and no statistically significant regression. Code review confirms that the added null property check does not allocate, while unit tests confirm zero converter-registry, resolver, validator, or invoker calls.

All functional requirements and measurable success criteria have implementation evidence. SC-005's two-minute threshold remains a release-level manual UX confirmation in addition to its automated Studio flow coverage.