Skip to content

Generator: DescriptionTargetCatalog misses the stream-cause marker rule, so a dead descriptions row passes #405

Open

Description

@Blind-Striker

What

DescriptionTargetCatalog.DeclaresMarker (tools/OpenCode.Sdk.Tools/Generator/Binding/DescriptionTargetCatalog.cs:91-104) decides whether a union declares its marker member, so it can tell whether a descriptions row targeting that member is valid. It walks BaseTypeName through the generated unions only.

The emitter's twin, UnionEmitter.InheritsMarker (Generator/Emission/UnionEmitter.cs:129-146), has one more rule. A chain that ends at the hand-written IOpenCodeStreamFailureCause inherits the _tag string marker from it. That is D-A4, merged in #398: Tag lives on the hand-written marker.

So for IStreamFailureCause:

  • the catalog reports the marker as declared;
  • the emitter declares nothing: src/OpenCode.Sdk/Common/Errors/IStreamFailureCause.cs has an empty body.

Why it matters

A descriptions row for IStreamFailureCause.Tag passes validation and emits nothing. That is a silently dead curation row, which GEN-E2's contract exists to refuse. Nothing at the pin has such a row, so today's output is unaffected.

Proposed fix

There should be one owner for the chain question. GEN-E4 step 1 puts the resolved chain on the plan (U7-27), and both the catalog and the emitters read it there, with the stream-cause terminal base represented in the chain. Until then, the minimal fix is the same terminal check in DeclaresMarker, plus a test row that a descriptions row for that member is refused.

Found by the GEN-E4 facts survey (2026-10-17, faz4/GEN-E4/gen-e4-facts.md §3.6). It belongs to GEN-E4.

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions