6.8 KiB
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.0against this Core worktree. - Core project build: passed on
net10.0with zero warnings and errors. - Core, Management, API, and API-client projects built successfully for
net8.0,net9.0, andnet10.0during the solution build. - The complete solution build could not finish with
--no-restorebecause unrelated projects had noproject.assets.jsonin this worktree (Elsa.Workflows.IntegrationTests,Elsa.Hosting.Management, andElsa.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.