Skip to content

[GEN-E6] curated interface documentation reaches its implementing members; 26 moved rows return narrowed (PR 2b) - #455

Merged
Blind-Striker merged 1 commit into
masterfrom
docs/gen-e6-pr2b
Oct 17, 2026
Merged

Blind-Striker merged 1 commit into
masterfrom
docs/gen-e6-pr2b

Conversation

@Blind-Striker

@Blind-Striker Blind-Striker commented Oct 17, 2026 •

Copy link
Copy Markdown
Collaborator

Curated interface documentation now reaches the public members that implement it, and 26 of the 33 rows #445 moved to the upstream draft return narrowed to what upstream declares.

Closes: GEN-E6 PR 2b (plan amendments 13–17). PR 2a is #445. It was developed in parallel with GEN-E3 PR 3 (in review), with disjoint write sets; whichever lands second rebases.

What changes

  • The inheritdoc overlay (plan §7).
    • What it emits: a public implementing property with a curated interface owner and no row of its own emits /// <inheritdoc cref="Owner.Member" />.
    • How owners are found: through the bound relationships only: carrier ImplementedBy, ImplementedHoistedInterfaceNames, union membership and base chains, and explicit bridges' PropertyName. Never by name.
    • It reaches exactly the 105 public destinations §7 lists: IDurableEnvelope.Seq and .Version on 45 records each, the three IMcpTimeout members ×2, IMcp.Codemode ×2, ISessionInboxInfoTime.Created ×4 and ISessionMessageCompactionTime.Created ×3.
    • What it leaves alone: explicit bridges and unknown carriers get nothing.
  • Precedence and conflicts.
    • A direct row wins over an inherited owner, and a property with a direct row is never part of an owner conflict.
    • Two different curated owners for one property refuse generation by name, naming the ordinally sorted crefs. Identical owners take the ordinal-first cref.
  • 8 owner rows, each with sources.
  • Canon: one clause beside the descriptions bullet in protocol-and-generation.md, covering the inheritdoc reach and the conflict refusal. The CHANGELOG gets a new entry under [Unreleased], a delta from 0.9.0-preview.12. The published preview.12 section is untouched: this PR was rebased past the cut (docs: cut the changelog for 0.9.0-preview.12 #454), and the diff against master adds only that entry.

The 33 moved rows, revisited (amendment 16)

The narrowing rule: a row keeps only the half its excerpts state. The narrowed sentence must be true on its own and must not imply the dropped half (for example, "last match wins" must not read as the full permission semantics). On extensible enums, value lists say "the pinned values are …", so they don't read as exhaustive.

Returned narrowed: 26 rows. Old (before #445) → new, with sources at pin 042d0832:

Row Old summary New summary Sources
ExperimentalSessionStatsRequest.From The start of the range, inclusive, in milliseconds since the Unix epoch. Unset, the range starts at the earliest message. The start of the aggregated time range. packages/protocol/src/groups/session.ts:204
packages/protocol/src/groups/session.ts:216
ExperimentalSessionStatsRequest.To The end of the range, exclusive, in milliseconds since the Unix epoch. Unset, the range ends now. The end of the aggregated time range. packages/protocol/src/groups/session.ts:205
packages/protocol/src/groups/session.ts:216
SessionCreateRequest A new session, or, when Id names an existing one, that session returned unchanged. A request to create a session at the requested location; ParentId links a child at its parent's location. packages/protocol/src/groups/session.ts:239
SessionCreateRequest.Id An optional session id of your own; when a session with it exists, that session is returned and the other members are ignored. An optional session identifier starting with ses. packages/schema/src/session-id.ts:5
packages/protocol/src/groups/session.ts:223
SessionCreateRequest.Location The directory the session works in; the server's working directory when absent. It is ignored when ParentId is set. The requested location for a session; ParentId places a child at its parent's location. packages/protocol/src/groups/session.ts:239
SessionCreateRequest.Model The model to use. When it is absent, the server chooses its default model each time the session runs a step; an unavailable model is reported only when the session runs. A model reference identifying the provider, model and optional variant. packages/protocol/src/groups/session.ts:227
packages/schema/src/model.ts:19
packages/schema/src/model.ts:21
packages/schema/src/model.ts:22
SessionCreateRequest.ParentId Makes this a child session, such as a subagent's, of an existing parent. The child always works in the parent's location and inherits its metadata and permissions unless you set them. Links a child session to its parent at the parent's location. packages/protocol/src/groups/session.ts:239
SessionCreateRequest.Permissions Session permission rules, checked after the agent's own; the last rule that matches wins, so they override the agent. Anything no rule matches asks. When at least one rule matches, the last matching rule wins; session rules are evaluated after the agent's rules. packages/schema/src/session.ts:56
packages/protocol/src/groups/session.ts:230
SessionExecutionFailed The session stopped on an error and went idle; its Data.Error says why. Reports an execution failure with its error in Data.Error. packages/schema/src/session-event.ts:247
packages/schema/src/session-event.ts:249
SessionExecutionInterrupted The session's work stopped before it finished; its Data.Reason says why. Reports interrupted execution; the pinned Data.Reason values are user, shutdown, superseded and inactivity. packages/schema/src/session-event.ts:254
packages/schema/src/session-event.ts:256
SessionMessageAssistant One model step's response within a turn. A single prompt can produce several, for example one per round of tool calls; a step that failed keeps its message, with Error set and any partial content. An assistant message with text, reasoning or tool-call output parts. packages/schema/src/session-message.ts:215
packages/schema/src/session-message.ts:218
packages/schema/src/session-message.ts:195
SessionMessageAssistant.Content The step's output parts in the order they streamed: text, reasoning and tool calls. Assistant output parts: text, reasoning and tool calls. packages/schema/src/session-message.ts:218
packages/schema/src/session-message.ts:195
SessionMessageAssistant.Cost The cost in US dollars of this step alone, computed by the server from the model's configured prices; null until the step finishes, and it may stay null when the step fails. Cost in US dollars recorded on the assistant message. packages/schema/src/session-message.ts:227
packages/schema/src/money.ts:7
SessionMessageAssistant.Finish Why the step ended: stop, length, tool-calls, content-filter, error or unknown; null while the step is still running. The finish reason; the pinned values are stop, length, tool-calls, content-filter, error and unknown. packages/schema/src/session-message.ts:224
packages/schema/src/llm.ts:5
SessionMessageAssistant.Retry Set while a retry of this step is scheduled after a retryable provider error: the attempt number (the first retry is 2), when it runs, and the error that caused it. Retry information containing an attempt number, time and error. packages/schema/src/session-message.ts:230
packages/schema/src/session-message.ts:207
packages/schema/src/session-message.ts:208
packages/schema/src/session-message.ts:209
SessionMessageAssistant.Tokens The token usage of this step alone; null until the step finishes, and it may stay null when the step fails. Token usage with input, output, reasoning and cache read/write parts. packages/schema/src/session-message.ts:228
packages/schema/src/token-usage.ts:6
packages/schema/src/token-usage.ts:10
SessionPromptRequest A prompt for the session's inbox. The call returns as soon as the prompt is stored, before the model runs; follow the turn on the event bus or with the experimental wait. A session input durably admitted to the inbox, scheduling agent-loop execution unless Resume is false. packages/protocol/src/groups/session.ts:405
packages/protocol/src/groups/session.ts:413
SessionPromptRequest.Delivery Steer, the default, puts the prompt into the running turn at its next step; Queue waits for the current turn to end and starts a new turn with it. The input delivery mode; the pinned values are steer and queue. packages/protocol/src/groups/session.ts:402
packages/schema/src/session-inbox.ts:11
SessionPromptRequest.Files Attachments as data: URIs, or file: URIs on the server's own file system, read when the prompt is submitted; at most 20 MiB each. File attachments, each referencing a file by its Uri member. packages/schema/src/prompt-input.ts:31
packages/schema/src/prompt-input.ts:10
SessionPromptRequest.Id An optional message id of your own, starting with msg_, which makes the call idempotent: resending it returns the stored item and ignores the new content. An optional message identifier starting with msg_. packages/protocol/src/groups/session.ts:399
packages/schema/src/session-message.ts:23
SessionPromptRequest.Resume False stores the prompt without waking the session for it: an idle session leaves it pending until something else wakes it, while a session already running can still take it at its next boundary. The default is true. Controls scheduling of agent-loop execution after durable admission: false omits that scheduling. packages/protocol/src/groups/session.ts:413
SessionPromptRequest.Skills Skills to attach by id; the server puts each skill's text before the prompt, and an unknown id is refused (400). Skills to attach by identifier. packages/schema/src/prompt-input.ts:33
packages/schema/src/prompt-input.ts:25
SessionTextDeltaData.Delta The new text to append; it may batch several provider chunks. A live-only text fragment. packages/schema/src/session-event.ts:403
packages/schema/src/session-event.ts:410
SessionTextDeltaData.Ordinal The zero-based index of this text part among the text parts of its assistant message; the started, delta and ended events of one part share it. A non-negative ordinal for this text part. packages/schema/src/session-event.ts:405
packages/schema/src/session-event.ts:409
packages/schema/src/schema.ts:4
SessionTextEndedData.State Opaque provider metadata for the part, kept so it can be sent back to the provider; do not interpret it. Opaque provider state for the text part. packages/schema/src/session-event.ts:423
packages/schema/src/session-message.ts:39
SessionTextEndedData.Text The complete text of the part; it replaces whatever was built up from deltas. The complete text of the part at the replayable full-value boundary. packages/schema/src/session-event.ts:403
packages/schema/src/session-event.ts:422

New owner rows: 8: IDurableEnvelope.Seq, IDurableEnvelope.Version, IMcp.Codemode, IMcpTimeout.Catalog, IMcpTimeout.Execution, IMcpTimeout.Startup, ISessionInboxInfoTime.Created, ISessionMessageCompactionTime.Created

Still upstream-only: 7: PtyCreateRequest.Args, PtyCreateRequest.Command, SessionCreateRequest.Agent, SessionExecutionStarted, SessionExecutionSucceeded, SessionMessageAssistant.Error, SessionMessageAssistant.RawFinish (each with its reason in the internal upstream draft).

Review

Both reviews were done by two families: the coordinator's Claude review and a fresh cross-family review (Sol).

  • The overlay: 105 of 105 destinations, with no extras or misses. Both reviews counted them from the generated diff.
  • The generated diff: documentation-only. Every changed src/ line is a /// line.
  • All 19 first-pass narrowed rows were judged against amendment 16's condition. Sol passed 18 and Claude 19. Fixed here:
    • SessionCreateRequest.Permissions, scoped to "when at least one rule matches";
    • three value sets on extensible enums;
    • .Files' wording.
  • 7 missed narrowings were found and returned (both reviews): SessionCreateRequest.Id, whose declared prefix is ses, not ses_; .Tokens; .Retry; SessionTextDeltaData.Ordinal; SessionCreateRequest.Model; and the Stats From/To.
  • A real bug (cross-family): the binder checked owner conflicts even for a property with a direct row. That blocked generation although neither owner was used. It was fixed red-first with a combined row.
  • Known limitation, Hoisted-member optional remark is unconditional; HoistedMemberPlan carries no requiredness #453: the optional-member remark is unconditional, because HoistedMemberPlan carries no requiredness. It is correct today, since IMcp.Codemode is the only member and it is optional. A guard ships here: a pinned-plan test that fails if any remarked member is required in any variant. Its permanent red-proof row flips Codemode's source to required, and an always-empty mutant turned that row red. The real fix belongs in the binding model, tracked in Hoisted-member optional remark is unconditional; HoistedMemberPlan carries no requiredness #453.

Tests

  • Red first:
  • Mutation: compiling true no-op mutants, all killed:
    • an overlay that never emits inheritdoc;
    • an overlay that lets inherited docs beat a direct row;
    • a conflict check that resolves before checking the direct row;
    • the guard's always-empty helper.
  • Existing-test edits: none beyond the plan's measured-ceiling update in GeneratedDocumentationTests.

Budget (against the merge-base)

Local check

At this head, on dev-01, after a root Release build, on a quiet host: slopwatch 0 issues; the Release build with 0 warnings; both format passes; verify-clones passing; --help; generate --verify current; the whole Tools.Tests project (guards included) at 2070/0. Bun 1.4.3, off the 1.4.2 pin. CI is the full gate.

Provenance: Generator lane / opencode dispatch harness (openai/gpt-6.1-sol-1m), Sol guide pilot task 3. Coordinated, reviewed and finished in Claude Code. The full narrowing ledger and implementer reports are held internally.

@Blind-Striker Blind-Striker added this to the 1.0 milestone Oct 17, 2026
…ting members, and partly declared rows return narrowed

A public implementing property with a curated interface owner and no row of its own now emits
`<inheritdoc cref="Owner.Member"/>`, resolved through the bound relationships (carrier and union
membership, base chains, explicit bridges), never names. A direct row wins over an inherited
owner, and two different curated owners for one property refuse generation by name. This reaches
105 public members: the durable envelopes' Seq and Version, the MCP timeouts and Codemode, and
the inbox and compaction Created times.

Earlier rows whose qualification was only partly declared return narrowed to their declared half,
each with its own sources, worded so the sentence is true on its own and implies nothing about
the dropped half. A guard keeps every curated hoisted member that carries the "ordinary optional
property" remark optional in every variant, until the plan carries requiredness (#453).
@Blind-Striker
Blind-Striker added this pull request to the merge queue Oct 17, 2026
Merged via the queue into master with commit 953f073 Oct 17, 2026
12 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant