9bdef449e6
## Summary Adds `upgrade:1-21:fix-message-thread-view-and-label-identifier` to retroactively apply two messageThread changes from #19351 that never propagated to existing workspaces (because `synchronizeTwentyStandardApplicationOrThrow` only runs at workspace creation): 1. **`allMessageThreads` view fields**: delete-and-recreate all view fields for the standard view from the current twenty-standard definition, which adds the new `subject` and `updatedAt` columns. Same pattern as the FIELDS_WIDGET sync in `1-21-workspace-command-1775500005000-backfill-page-layouts-and-fields-widget-view-fields`. 2. **`messageThread.labelIdentifierFieldMetadataId`**: repointed to the `subject` field via `validateBuildAndRunWorkspaceMigration`. The migration runner already resolves `labelIdentifierFieldMetadataUniversalIdentifier` → id in `update-object-action-handler`, so this goes through the standard flow and properly invalidates caches. Both fixes share a single `validateBuildAndRunWorkspaceMigration` call (one `viewField` op, one `objectMetadata` update op). Idempotent — skips if nothing to do. Depends on `upgrade:1-21:backfill-message-thread-subject` having run first (the label identifier fix needs the `subject` field to exist; it logs a warning and skips that part otherwise). ## Test plan - [ ] Legacy workspace: run \`backfill-message-thread-subject\`, then this command, then verify: - the \`allMessageThreads\` view shows the new \`subject\` and \`updatedAt\` columns - messageThread records display their \`subject\` as the record label - [ ] Re-run the command: no-op, logs \`Nothing to fix\` - [ ] \`--dry-run\` logs planned changes without applying them 🤖 Generated with [Claude Code](https://claude.com/claude-code) --------- Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>