docs(spec): record the plugin UI slot inventory and composition rules (CTX-0042) - #79
Conversation
… (CTX-0042) Answer dimension 1 of OQ-056 (semantic UI slots) by documenting what the accepted closed slot set left implicit: per-slot purpose, multiplicity, required capability, and bounds, plus conflict resolution so overlay and status composition stop being discovered in integration. The record adds no slot and changes no accepted spelling, bound, or capability requirement. Every contribution consumes one RichBlock against the accepted budget; exclusive slots reject a second claimant with a typed error and leave the incumbent untouched; composing and layered slots enforce their aggregate bound at admission; a denied contribution changes nothing. Refs #78
…e (CTX-0042) Self-review against the accepted Plugin API v1 Lua Surface RFC found two fidelity defects: - The Required capability column read "ui.rich" for the terminal slot only and a dash for the other composing slots. The accepted text gates the whole L2 UI surface: `ui.rich` is required for bitty.ui.mount/bitty.ui.update contributions regardless of slot, and the overlay slot additionally requires `ui.overlay`. Every row now states the accepted gate. - The statusline row attributed a "8 components x 64 chars, 128 total" budget to the terminal side. The draft Status System Specification states a capped total segment count with bounded per-module lengths and no such numeric budget; the row now states what that draft states. Also replaced the "per-terminal block budget (64)" phrasing with the accepted scene limits table (SCN-1..SCN-5) so the bound names match the accepted source. No slot is added, renamed, or re-bounded; no accepted rule changes.
|
Self-review pass (before external review completed) found and fixed two fidelity defects in commit
Also replaced "per-terminal block budget (64)" phrasing with the accepted scene-limits table (SCN-1..SCN-5) so bound names match the accepted source. No slot added, renamed, or re-bounded; no accepted rule changed. All gates re-run green (metadata/links/language/hygiene, markdownlint 0 issues, prettier clean) on 69 files. |
…TX-0042) The independent review of the slot inventory asked for changes on four points (the capability column it flags first was already aligned in cb254c3, committed while the review was running): - Rule 6 asserted a plugin-facing "unmount its own handle" operation that accepted v1 does not expose; the rule now binds the accepted baseline to generation-owned disposal and marks explicit owner release as a candidate addition. - Rule 2 fixed a composition order ("manifest then mount") that the record's own Open points still lists as undecided; rules 2 and 3 now state determinism without fixing the tie-break. - The host-surface bullet paraphrased the accepted LUA-OQ-11 disposition too broadly ("when a host surface changes"); it now cites the accepted trigger (the Panel RFC redefining overlays as focusable surfaces). - extensibility/README.md: "Both pages" was stale for a four-row index. Gates re-run green.
|
Review findings addressed in
Gates re-run green (69 files, markdownlint 0 issues, prettier clean). |
|
Independent verification review returned APPROVE on |
Priority: P1 | Area: UI/docs | Labels: docs, P1, area:ui, area:plugins | Milestone: v0.1.0 | RFC: OQ-056 | Task: CTX-0042
What
Answers dimension 1 of
OQ-056(semantic UI slots) as the Plugin Roadmap records it: "a documented slot inventory with per-slot bounds and conflict resolution so overlay/status composition stops being implicit."Record is Draft: nothing accepted, nothing promoted to
Verified/Compatible, no accepted text edited beyond an index row.Closes #78 · Docs task
CTX-0042New record
extensibility/plugin-ui-slot-inventory-candidate.mdSlot inventory — per-slot purpose, multiplicity, required capability, and bounds for the accepted closed eight-slot set (
terminal | top | bottom | left | right | tabline | statusline | overlay):terminalui.richtop/bottom/left/righttablinestatuslineoverlayui.overlayComposition rules — every contribution consumes one
RichBlockagainst the accepted budget; bounds are per contributor unless stated; required capability is checked at mount, not at render; placement stays host-owned; no slot is a focus target.Conflict resolution — a second exclusive claim is denied with a typed error naming the current declarant and leaves the incumbent untouched; composing/layered aggregate bounds are enforced at admission and fail closed; layered paint order is a pure function of declared order; a denied contribution changes nothing; conflicts are never resolved by silent replacement; unmounting another plugin's handle is not authorized by any v1 capability.
Relation to host surfaces — the terminal-side chrome contract owns the rendering surfaces; this record owns only the plugin-facing admission side. The
terminalslot composes with a leaf and can never replace grid, cursor, or scrollback presentation.Modified
extensibility/README.md— index registration (prettier normalized table alignment, hence the reflow).Constraints honored
SceneNodesubset,handle/block_idmodel, andui.rich/ui.overlaygating are restated as consumed.document_type: specification.Review ask