--- name: mas-schema-naming description: Define canonical naming for future backend schema domains. Use when creating new specialized schema models or extending Pydantic contracts in app/models/schema.py, standardizing shared Info/Data/Notify/Run semantics, and avoiding new naming drift without forcing retroactive changes on legacy modules. --- # MAS Schema Naming ## Objective Standardize naming for future specialized backend schema implementations. This skill constrains new domain work by default. It does not require retroactive renaming of existing legacy modules unless explicitly requested. ## Global Constraints Apply these constraints while using this skill. 1. Make minimal necessary changes first; avoid broad refactors unless explicitly requested. 2. Align with current code style and existing project conventions in the touched module. 3. Avoid over-engineering, over-abstraction, and defensive programming that does not match existing code patterns. 4. Study similar existing implementations deeply before coding and follow established local patterns. ## Apply Workflow 1. Determine whether the field is shared semantic or domain-specific semantic. 2. For shared semantic, use the canonical name from this skill. 3. For domain-specific semantic, keep naming local to the domain block. 4. Keep public config-model field style consistent: `PascalCase`. 5. When touching legacy modules, prefer compatibility-first edits and avoid broad rename-only refactors. ## Canonical Structure For New Domains Use this top-level structure for new script/user schema models. ```python class XxxConfig(BaseModel): Info: XxxConfig_Info | None Run: XxxConfig_Run | None Emulator: XxxConfig_Emulator | None # only if emulator semantics exist class XxxUserConfig(BaseModel): Info: XxxUserConfig_Info | None Data: XxxUserConfig_Data | None Notify: XxxUserConfig_Notify | None # optional domain blocks, e.g. Task/Stage/Game ``` ## Shared Naming Matrix Use these names when semantics are the same. | Semantic | Canonical name | Block | | --- | --- | --- | | Script display name | `Name` | `Info` | | Script runtime path | `Path` | `Info` | | Emulator id | `Id` | `Emulator` | | Emulator index | `Index` | `Emulator` | | Transition strategy | `TaskTransitionMethod` | `Run` | | Daily proxy limit | `ProxyTimesLimit` | `Run` | | Retry limit | `RunTimesLimit` | `Run` | | Runtime timeout | `RunTimeLimit` | `Run` | | User display name | `Name` | `User.Info` | | User id | `Id` | `User.Info` | | User enabled status | `Status` | `User.Info` | | Remaining day budget | `RemainedDay` | `User.Info` | | User note | `Notes` | `User.Info` | | User tag payload | `Tag` | `User.Info` | | Last proxy date | `LastProxyDate` | `User.Data` | | Proxy run count | `ProxyTimes` | `User.Data` | | Manual-check result | `IfPassCheck` | `User.Data` | | Notify enabled | `Enabled` | `User.Notify` | | Send statistic | `IfSendStatistic` | `User.Notify` | | Send mail | `IfSendMail` | `User.Notify` | | Mail receiver | `ToAddress` | `User.Notify` | | ServerChan enabled | `IfServerChan` | `User.Notify` | | ServerChan key | `ServerChanKey` | `User.Notify` | ## Boundary For Domain-Specific Names 1. Keep domain-specific semantics inside dedicated domain blocks. 2. Do not force shared naming when semantics differ. 3. Do not add synonym fields for the same semantic in one block. ## Drift To Avoid In New Work 1. Same semantic, different names (`Path` vs `RootPath`). 2. Same semantic, different block placement (`Data` vs `Info`). 3. Same semantic, mixed boolean style in the same block. ## Compatibility Rule When canonicalizing an existing public field: 1. Keep read compatibility for legacy payloads during migration. 2. Prefer writing canonical names in new responses. 3. Remove legacy names only after consumer migration is complete. ## PR Checklist 1. New specialized schema models follow this canonical matrix for shared semantics. 2. Domain-specific fields stay in domain-specific blocks. 3. No new synonym names are introduced for existing shared semantics. 4. Legacy modules are not renamed in bulk unless explicitly in scope.