Repository navigation
Binder naming-wall gaps: V16, V18, V19, V22 and review riders #27
Copy link
Copy link
Open
Labels
ready-for-agentSpecified enough that the work is mechanicalSpecified enough that the work is mechanical
Milestone
Description
Source: multi-agent review of PR #26, adversarial verification verdicts (all CONFIRMED, severity 2 or 1, latent: none is reached by the current generation profile). 2026-08-14. M-anchor: M5 (full surface). Do them earlier when a change touches these walls. Riders from the second review (R2-*) and the 1ee8c30 review are in the comments below.
Each item: red-test-first refusal regression in OperationPlanBinderTests / CurationValidatorTests, then the wall.
Original items
- V16 · A path parameter named
path(orquery) collides with the locals thatRoutesEmitterdeclares inside query-composing builders (var path,var query) → CS0136. Extend the bind-time reserved-name wall to cover emitted builder locals. - V17 · Query-request property names were not checked against compiler-synthesized record members (
EqualityContract, …). Closed:ReservedNamePolicyreserves the synthesized record members. - V18 · Synthesized
{Member}Templateroute constants are absent from route-member collision validation:Get(builder, emitsGetTemplate) plus a siblingGetTemplate→ CS0102. Include synthesized names in the collision set. - V19 · The payload naming wall (
ReservedNamePolicy.PayloadNames) omits the record-reserved nameClone→ CS8859. Add it. - V22 ·
schemaAliases: [null]in curation crashesCurationValidatorwithNullReferenceExceptioninstead of a structured fail-closed curation error. Guard null rows across all curation collections.
Riders (details in the comments)
- R2-8 · The silent HTTP-verb fallback in naming. Closed by the fail-closed operation naming work (generator: fail-closed operation naming — the HTTP method is never a name source #86): the HTTP method is never a name source.
- Merged body/query collision ·
SpecBinder.AttachRequestQueryPropertiesdoes not compare query members with body member names (also a row in Close binding and emission walls for latent supported-shape combinations #52). - Synthesized names · Validate generated carrier names, route
Templatemembers, client backing members, and C# keywords for path parameters against the complete emitted symbol set. - Duplicate/dormant curation · Duplicate JSON dictionary keys are last-wins before validation, and shape-inapplicable rows are accepted but never consumed (also a row in Close binding and emission walls for latent supported-shape combinations #52).
- R2-9 ·
Pluralizemisses -o endings. - R2-10 · Property names have no reserved-member wall.
- R2-11 · Internal spine names are unwalled.
- R2-12 · A body-root claim can silently retype a shared component (PLAUSIBLE).
Status 2026-09-27: V16 (RoutesEmitter still declares the path and query locals), V18 and V19 were re-checked on master and are still open.
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
ready-for-agentSpecified enough that the work is mechanicalSpecified enough that the work is mechanical
Type
Projects
- StatusShow more project fieldsQueue
Activity
docs(agents): hand off the M2 close-out — Q91 research, fix batch, me…
Blind-Striker commentedon Aug 15, 2026
The second verified review of PR #26 adds five wall gaps to this issue's scope (all latent — none triggered by the pinned spec; each would surface as a compile error or silent misnaming in committed generated output instead of the contracted bind-time refusal):
KnownVerbSegmentsmiss (only create/get/list today) falls back to HTTP-method-prefixed names with no diagnostic and no curation lever; the pinned pending queue already holds POST verb-final operations (v2.session.fork,v2.session.compact,v2.mcp.connect,v2.generate.text) that would bind cleanly toPostForkAsync-style names. Either the verb list grows deliberately per batch with a loud miss, or curation gains a method-name hook.+s(Echos), contradicting the method's own refuse-on--es contract; add -o to the refusal list.SchemaPlanBinder) and query-record properties consult no reserved list beyond duplicates, so wireclone/equalityContractemits CS8859/CS0102 records. (The envelope-payloadClonegap was already V19 here.)ReservedSpineTypeNameslists public spine types only, while generated clients referencePipeline/MockSeam/OpenCodeJsonContextunqualified under both usings — a model with one of those names goes CS0104-ambiguous. Path parameters namedpath/query(route-builder locals) and{X}Templateroute members were already V16/V18 here.{Subject}{Verb}Requestownership claim renames the root for the whole selected closure without checking whether the root is also referenced as a nested model type elsewhere; if it is, that property's public type silently becomes{X}Request. The claim should refuse (or copy) when the root has non-body references.Trigger for the whole set: any breadth batch admitting one of these shapes fires the gap immediately; the walls are a hard gate before M5's full-surface profile. R2-8 is the most likely to fire first — the very next batch that selects a POST verb-final operation.
Blind-Striker commentedon Aug 17, 2026
The
1ee8c30review adds confirmed naming/curation riders to this existing wall batch.SpecBinder.AttachRequestQueryPropertiesappends query members without comparing them to body member names. A body and query both mapping toLocationemit duplicate members instead of a located refusal.Templatemembers, client backing members, and C# keywords for path parameters against the complete emitted symbol set. This extends the existing V16-V19/C20 family.Session.Inbox.UserPayload1equalsSession.Inbox.UserPayload, andSession.Inbox.SyntheticPayload1equalsSession.Inbox.SyntheticPayload; validated alias rows should remove unstable numeric suffixes before packaging.v2.integration.oauth.connectcurrently derivesOauthwithout a brand-spelling mechanism.v2.event.subscribeis tracked separately because it blocks M3 Arc 3b.Triggers: current Inbox aliases in M3; operation/action/brand and remaining walls on first occurrence, no later than M5 full-surface acceptance.
Blind-Striker commentedon Aug 18, 2026
Completed the current M3 alias subset in 7123627, and only that subset: Session.Inbox.SyntheticPayload1 -> Session.Inbox.SyntheticPayload and Session.Inbox.UserPayload1 -> Session.Inbox.UserPayload. Both rows pass the existing structural-equivalence wall against the pinned OpenAPI. Generator-owned regeneration renamed the two model files, updated both inbox item owners, serializer registry, generated manifest, and the reviewed PublicApi baseline. No wire shape or runtime behavior changed. Fresh-context review reported no findings. All six local gates passed with 1,240 tests, 0 failed, 0 skipped. Hosted CI run 32128587050 is green on Linux, Windows, and macOS after a diagnostic rerun of one unrelated Microsoft.OpenApi RegexMatchTimeoutException on the first Windows attempt: https://github.com/Blind-Striker/opencode-sdk-dotnet/actions/runs/32128587050. Keeping #27 open for its remaining first-occurrence/M5 naming and collision walls.
[-]M5: binder naming-wall gaps — reserved locals, record members, route Template members, Clone, null curation rows (V16-V19 V22)[/-][+]M5: binder naming-wall gaps — remaining: reserved locals (V16), route Template members (V18), Clone (V19), null curation rows (V22)[/+]Blind-Striker commentedon Sep 14, 2026
Status 2026-09-14: V17 is closed (ReservedNamePolicy reserves the compiler-synthesized record members such as EqualityContract). V16, V18, V19 and V22 remain latent walls; the ordinal-fragment naming fix that shipped with v2.0.2 (CSharpNamePolicy.ToPascalCaseFragment) is adjacent but does not cover them. Each item stays red-test-first: refusal regression in OperationPlanBinderTests/CurationValidatorTests, then the wall.
[-]M5: binder naming-wall gaps — remaining: reserved locals (V16), route Template members (V18), Clone (V19), null curation rows (V22)[/-][+]M5: binder naming-wall gaps — V16, V18, V19, V22 and review riders[/+][-]M5: binder naming-wall gaps — V16, V18, V19, V22 and review riders[/-][+]Binder naming-wall gaps: V16, V18, V19, V22 and review riders[/+]Blind-Striker commentedon Oct 14, 2026
Milestone 1.1; the retired M-series anchor in the body no longer applies. Two rows moved to milestone 1.0, because after 1.0 they would let an upstream refresh change public types or names silently:
The remaining rows (V16, V18, V19, V22, the merged body/query collision, duplicate and dormant curation, R2-9, R2-10, R2-11) are trigger-based: each lands red-test-first when a refresh first meets its shape.