fix(modules): core offers a contribution, never a slot name #160
Reference in New Issue
Block a user
No description provided.
Delete Branch "feature/teams-slot-contributions"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
The inverted slot direction reached exactly one module. Core filled three literal names —
uo.guild.detail,uo.guild.forum,uo.guild.header— matched by exact name inapplyCoreFills. A second game declaring a place under its own id got an empty page and no error, because "a fill for a slot nobody declared is not an error" is the rule that makes an unknown name invisible. That rule is right; what was wrong is core knowing a slot's name at all.It also put a module identifier inside core, in three string literals
scripts/checkModuleIdentifiers.jsmasks by construction and could never have caught (§5.2).Found by the integration kit (Teams phase 11) while writing the chapter that teaches this shape to an audience outside this org — which is what that phase is for.
The change
CORE_CONTRIBUTIONS—team.activity,team.forum,team.notify— is exported and fixed at build time, so asking for one core does not offer throws at the declaration. The asymmetry with an unfilled slot is deliberate: an unknown contribution is always a typo or a version skew (the module'scoreApirange has already been checked), and the failure it would otherwise produce is a page that renders empty forever with nothing logged.options.coreis optional — a slot that asks for nothing stays empty, which is what a module declaring a place it fills itself wants. More than one slot may ask for the same contribution and each gets it: how many places a module wants its feed in is a layout decision on a page core does not own.Amends MODULE_API 1.6.0 in place rather than adding 1.7.0, the same rule the eighth and ninth members were given — 1.6.0 has only ever been on
edge.Also: the UI kit is nine exports, not eight.
Slotmade it nine in phase 3 and the comment beside it still said eighth.Companions
RunicGateway/Module-uo#…— the three declarations name their contributionRunicGateway/docs#…— §3.7a, the contribution table, and the kit countChecks
288 client tests · 1162 server tests ·
checkModuleIdentifiersOK · client builds.AI disclosure
Written with Claude Code (Opus 5). Commits carry the
Co-Authored-Bytrailer.The inverted slot direction reached exactly one module. Core filled three literal names - uo.guild.detail, uo.guild.forum, uo.guild.header - matched by exact name in applyCoreFills, so a second game declaring a place under its own id got an empty page and no error. "A fill for a slot nobody declared is not an error" is the rule that made the miss invisible, and it is the right rule; what was wrong was core knowing a slot's name at all. It also put a module identifier inside core, in three string literals scripts/checkModuleIdentifiers.js masks by construction and could never catch. Found by the integration kit while writing the chapter that teaches this shape to an audience outside this org - which is what that phase is for. So the module says WHERE, in its own vocabulary, and WHICH of core's contributions goes there: declareModuleSlot(ID, 'uo.guild.detail', { core: 'team.activity' }) and core offers into the catalogue rather than into a name: offerCoreFill('team.activity', TeamActivityFeed) CORE_CONTRIBUTIONS is exported and fixed at build time, so asking for one core does not offer THROWS at the declaration. That asymmetry with an unfilled slot is deliberate: an unknown contribution is always a typo or a version skew - the module's coreApi range has already been checked - and the failure it would otherwise produce is a page that renders empty forever with nothing logged. options.core is optional; a slot that asks for nothing stays empty, which is what a module declaring a place it fills itself wants. More than one slot may ask for the same contribution and each gets it: how many places a module wants its feed in is a layout decision on a page core does not own. Amends MODULE_API 1.6.0 in place rather than adding 1.7.0 - the same rule the eighth and ninth members were given, and 1.6.0 has only ever been on edge. Also: the UI kit is nine exports, not eight. Slot made it nine in phase 3 and the comment beside it still said eighth. 288 client tests, 1162 server tests. Co-Authored-By: Claude <noreply@anthropic.com>