Accepted (2026-07-03)
Executes architecture-audit items MC-H1 and MC-H2 as one Class C change under explicit operator consent.
The module-anatomy contract (.agents/10-contracts/specs/module-anatomy-contract.md) mandates that
module configuration uses exactly three aspects — Selection, Data, Processing — surfaced through
IModule.Contract / IModuleContract, and declares Scope/Extensions legacy. Architecture audit
items MC-H1 and MC-H2 (analysis/archcheck/triage.json) found the contract surface unimplemented and
WorkItemsModuleOptions still shaped as Scope/Extensions. Both items are change-class C: they widen
IModule and replace the public configuration contract (migration.schema.json).
Implement MC-H1 and MC-H2 together as one clean break:
- New canonical interfaces
IModuleContract,ISelectionDefinition,IDataDefinition,IProcessingDefinition(inDevOpsMigrationPlatform.Abstractions.Agent/Modules/IModuleContract.cs);IModulegains a platform-owned, non-user-editableContractproperty implemented by all four modules. - All four modules (WorkItems, Teams, Nodes, Identities) restructure their options into
Selection/Data/Processing. Every v1 property maps 1:1 to a v2 home (see the aspect-mapping table indocs/superpowers/plans/2026-07-03-module-config-contract.md). Work-item Links and Attachments are intrinsic required Data entries — always carried, not configurable. MigrationPlatform.ConfigVersionbumps"1.0"→"2.0". There is NO legacy shim and NO dual-read path: v1 files are rejected at load (ConfigurationService.LoadConfigurationAsync) and at ValidateOnStart (MigrationPlatformOptionsValidator) with a step-by-step rewrite message, and stray legacyScope/Extensionskeys under ConfigVersion 2.0 are rejected by name.migration.schema.jsonis regenerated from the new types; the config wizard (SaveConfigurationAsync) emits"2.0".
Explicit operator ruling (2026-07-01 session): one clean break, no legacy config support, no deprecation shim; hard cutover with a ConfigVersion bump and precise validation errors. MC-H2's triage note "optionally keep legacy keys behind a deprecation shim" is explicitly rejected.
- Every existing user
migration.jsonbreaks loudly (never silently) until upgraded; the error text contains the full rewrite recipe and points todocs/configuration-reference.md("Module configuration anatomy"). - All scenario configs, test fixtures, and docs migrated in the same change. The dead
Modules.WorkItems.Extensions.FieldTransformentry (unconsumedFieldTransformExtensionOptions) is dropped during migration — the field-transform tool remains configured atMigrationPlatform.Tools.FieldTransform. - Future modules must declare their anatomy via
IModuleContract;Scope/Extensionsmust not reappear. - Capability seams referenced by Processing entries (
FieldTransform,NodeTranslation,IdentityLookup) remain singular and canonical (contract rule 7). - Contract-compatibility evidence:
TfsExportConfigVersionTestsproves a v1 config fails with the actionable message and a v2 config runs end-to-end on the Simulated connector;ConfigVersionGateTestscovers the validator and load-time gates. Known follow-up:Resolved by the 2026-07-03 amendment below.BoardConfigExtensionOptionsstill bindsMigrationPlatform:Modules:Teams:Extensions:BoardConfig(spec 039 scope); JSON configuration of that section conflicts with the legacy-key rejection and must be re-homed under the Teams anatomy.
Class C consent granted by the operator to complete the v2 cutover; nothing may remain on the v1 config surface.
BoardConfigExtensionOptionsis re-homed toMigrationPlatform:Modules:Teams:Processing:BoardConfig. Rationale: the section governs how board-config import executes (uniformImportModemerge/replace/skip policy plus per-type carry toggles gated by connector capability), which is a Processing concern; the previousExtensionspath was rejected by the v2 gate, leaving board config unconfigurable via file.docs/capabilities-guide.mdandmigration.schema.jsonfollow the new path.- Deleted dead v1 option types with stale
Extensionssection names:TeamSettingsExtensionOptions(zero consumers — team settings folded into the core Teams pipeline underData.TeamSettingsin the v2 migration),TeamIterationsExtensionOptions,TeamMembersExtensionOptions,TeamCapacityExtensionOptions— each carried onlyEnabled; the extensions now gate on the canonicalTeamsDataOptionstoggles (Data.TeamIterations/TeamMembers/TeamCapacity) viaIOptions<TeamsModuleOptions>,TeamAreaPathsExtensionOptions— the extension has no v2 data toggle; it is gated solely by the connector'sTeamAreaPathscapability, with path translation governed by theNodeTranslationProcessing seam,FieldTransformExtensionOptions(unconsumed; the field-transform tool remains configured atMigrationPlatform.Tools.FieldTransform).
CommentsExtensionOptions(the runtime carrier derived fromData.Comments) no longer declares a config section or schema entry — its staleModules:WorkItems:Extensions:Commentspath advertised a section the gate rejects.
Operator ruling refining the re-home above. Placing the whole of
BoardConfigExtensionOptions under Processing misclassified the payload-carry toggles: per the
module-anatomy contract (.agents/10-contracts/specs/module-anatomy-contract.md), "Data:
canonical package payload for selected entities" — and Enabled/Columns/SwimLanes/
CardRules/Backlogs/TaskboardColumns select which board-config payloads are carried in the
package. Only ImportMode (merge/replace/skip — how import executes) is a Processing concern.
BoardConfigExtensionOptionsis deleted and split into:BoardConfigDataOptions→MigrationPlatform:Modules:Teams:Data:BoardConfig(carry toggles:Enabled,Columns,SwimLanes,CardRules,Backlogs,TaskboardColumns),BoardConfigProcessingOptions→MigrationPlatform:Modules:Teams:Processing:BoardConfig(ImportModeonly).
TeamsModule.ContractdeclaresBoardConfigin both its Data and Processing definitions;migration.schema.json,docs/capabilities-guide.mdanddocs/execution-model.mdfollow.