Skip to content

Backlog: medium/low-value findings from the 2026-07 ecosystem audit #254

Description

@Reefact

Problem

The 2026-07 ecosystem audit produced a set of medium/low-value recommendations that don't warrant individual issues yet. This backlog keeps them tracked without flooding the tracker; promote an item to its own issue when it is picked up. Section references point into the audit report.

Medium value (§14)

  • Domain-side aggregation: Outcome.Combine(envelopeFactory, …) gated on a documented envelope error, arity-capped per ADR-0015's spirit (§13.4).
  • OpenTelemetry semantic conventions, doc-first (firstclasserrors.code, .instance_id, .transience…), then a minimal Activity helper if demand confirms; Transience→Polly retry recipe (docs only) (§13.4).
  • Serialize-only JSON contract for runtime errors (rehydration explicitly out of scope — ADR first); JSON Schemas for the JSON catalog and errors-baseline.json, validated in gendoc-docs.yml (§13.4).
  • AOT/trimming support statement for the binder (promote the PropertyGetters fallback-chain knowledge into RequestBinder.en.md) (§13.4).
  • gRPC mapping table (taxonomy→StatusCode, ErrorCode+context→google.rpc.ErrorInfo); no package (§13.4).
  • CLI: unify the duplicated source-resolution/precedence logic (GenerateOptionsResolver vs CatalogSourceResolver, byte-identical messages); give the config/renderer commands the ports pattern + tests; add a CommandAppTester argv tier pinning the command tree, help output and parse-error exit code (§8.2-CLI).
  • GenDoc: extract the duplicated RFC 9457 example-rendering helpers into one internal type; introduce a process-runner seam so timeout/kill/corrupt-output branches become unit-testable; reserve group-file names in the split-Markdown slug namespace (§8.2-GenDoc).
  • Docs: document the exception→Outcome bridge idiom (catch (DiagnosableException ex) → Outcome.Failure(ex.Error)); out-of-DTO argument sample in BinderShowcase (or soften the guide's "every remaining overload" claim); reconcile sample Amount with UsagePatterns' Outcome-first derivation rule; dogfood FirstClassErrors.Testing in the sample tests (§11.3).
  • Two structural opt-in analyzers: inline error construction outside [ProvidesErrorsFor] types; interpolated/concatenated strings passed as public messages (§13.4).
  • CI: route github.head_ref through env vars in gendoc-docs.yml; reuse exported env vars in release.yml's baseline-refresh commit; document (or engineer around) the stranded-required-checks effect of the gendoc-docs bot push; fix the misleading "ready for a Sonar scan" artifact comment (§11.5).
  • ADR housekeeping: enumerate ADR-0024's affected set in the implementation reference; sharpen ADR-0017's decision sentence (freeze-on-first-read); make ADR-0022's referenced documents carry the promised content; index annotations for "refines"/"revisits" relationships; dual dates on supersession; a number-uniqueness CI guard (§6.4).
  • Tests: write down the two test-style conventions; extend property-based coverage to ErrorContext/inner-error invariants; core Outcome/Error benchmark project + comparison perf row (§8.2-Tests, §5.6).
  • A maintainer-facing supply-chain overview page consolidating the per-file policies (§11.5).

Low priority (§14)

Make ErrorCode.Unspecified public · chain the three Error constructors · fix the XML-doc drift items (never-thrown InvalidOperationException on ToException(), stale To reference, "thrown errors" wording) · PrimaryPortInnerErrors params factory/IEnumerable · BindingScope default-construction message · cached empty list on absent optional lists · solution-taxonomy tidy (Documentation csproj x64/x86 configs, samples out of the tests folder, one InternalsVisibleTo idiom) · fce config init bootstrap (detect .sln, seed serviceName) · atomic baseline/snapshot writes · normalize/document the Spectre parse-error exit code · translate or exempt the ADR rulebook · broaden thin analyzer test matrices (FCE004/005/010/012/015) · label FsCheck conjunctions · GenDoc.Worker smoke seam · converge the duplicated DocumentationFormatter · sweep the stale-pointer constellation (changelog preamble, "English only" note, tag-format example, train allowlist quote, EXCHANGE_RATE code prefix) · publication recipes (TechDocs/MkDocs/Pages) as docs · OpenAPI renderer as a documented sample plugin · bring WhenNotToUse up to the house standard (and correct its hot-loop cost description) · repair prev/next chain reciprocity · shrink the 919 KB packed icon.png · worker formatting-culture golden test · ParseMsBuildGetPropertyLine value-only tightening · enable the opt-in analyzers in the dogfood .editorconfig · consolidate duplicated metadata-name constants · Any/AnyContext mirror-completeness test.

Acceptance criteria

Items are struck through here (or moved to dedicated issues) as they land; the list shrinks, never silently grows stale.

Context

Surfaced by the 2026-07-20 architecture, design & ecosystem audit (doc/handwritten/for-maintainers/audit/2026-07-20-firstclasserrors-architecture-and-design-audit.md, §14; branch claude/firstclasserrors-audit-83gap7). Out-of-scope rejections (§13.6) are deliberately NOT tracked — the audit recommends keeping them rejected.

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions