Next generation iOS and Android apps for Mattermost in React Native
This report summarizes scanner evidence for mattermost/mattermost-mobile, a TypeScript project with 2,743 GitHub stars. SynthScan examined 638,139 lines of code across 3920 source files, recording 712 pattern matches distributed across 14 syntactic categories. The legacy adjusted pattern signal is 1.6 (Low pattern signal); it is not an authorship estimate.
Use the findings to ask whether maintainers can explain intent, verify dependencies, simplify unnecessary scaffolding, and focus review effort. Risk Payload v1 adds ownership, supply-chain, over-engineering, and review-effort vectors when available. These are prompts for human verification, not probabilities, security findings, or measured maintenance costs.
Use each vector to guide manual verification of the underlying findings.
Payload schema: 1.0.0 · Engine: 2.0.0 · Scoring: heuristic-density-v1 · Scan date: 2026-10-31.
Can maintainers explain intent, assumptions, and trade-offs? 664 finding(s).
Are imports declared and package/API names verified? 35 finding(s).
Are wrappers, guards, and repeated structures necessary? 408 finding(s).
Which changes need focused human review? 712 finding(s).
This chart tracks the legacy adjusted pattern score across scan runs. Changes can reflect source changes, scan coverage, or detector/scoring versions; they do not measure AI adoption or prove that a team refactored code. Compare runs only when their scoring versions are compatible. The dashed line tracks the raw pattern-hit count.
Groups findings by configured severity weight. Severity is not a confidence estimate, security rating, or proof that a package is missing. Verify imports against the project's manifests and inspect each finding in its local design context.
This horizontal bar chart shows where configured pattern scores accumulate across directories. Treat the bars as locations to inspect, not as evidence of authorship or code quality. Use the file-level findings to decide whether a directory needs a focused ownership, dependency, complexity, or review check.
The scanner identified 712 distinct pattern matches across 14 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a detector match to inspect in context. Expand any category row to inspect the individual file paths, line numbers, code snippets, and the lexical context (CODE, COMMENT, or STRING) in which each match was detected.
Reading the findings table: The Severity column indicates the configured finding weight (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — legacy comment-context matches receive a ×1.5 score weight. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier under the legacy scoring model.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | app/init/credentials_migration.ts | 15 | export async function migrateLegacyPreauthSecret(serverUrls: string[]): Promise<void> { | CODE |
| LOW | app/init/launch.ts | 46 | export async function determineInitialExpoRoute(): Promise<ExpoRouterLaunchResult> { | CODE |
| LOW | app/init/launch.ts | 84 | async function determineRouteFromDeeplink(deepLinkUrl: string): Promise<ExpoRouterLaunchResult> { | CODE |
| LOW | app/init/launch.ts | 89 | async function determineRouteFromNotification(notification: NotificationWithData): Promise<ExpoRouterLaunchResult> { | CODE |
| LOW | app/init/launch.ts | 186 | export async function determineRouteFromLaunchProps(props: LaunchProps): Promise<ExpoRouterLaunchResult> { | CODE |
| LOW | app/init/launch.ts | 226 | async function determineAuthenticatedRoute(props: LaunchProps): Promise<ExpoRouterLaunchResult> { | CODE |
| LOW | app/database/recovery/index.ts | 43 | export function resetDatabaseRecoveryStateForTests(): void { | CODE |
| LOW | app/database/recovery/index.ts | 52 | export async function attemptServerDatabaseRecovery( | CODE |
| LOW | …tor/server_data_operator/comparators/scheduled_post.ts | 6 | export function shouldUpdateScheduledPostRecord(e: ScheduledPostModel, n: ScheduledPost) { | CODE |
| LOW | …atabase/operator/server_data_operator/handlers/post.ts | 143 | function isNewerRedactionGeneration(e: PostModel, n: Post): boolean { | CODE |
| LOW | …atabase/operator/server_data_operator/handlers/post.ts | 226 | async function resetEpochForUnstampedRedactionChanges(database: Database, posts: Post[]) { | CODE |
| LOW | app/products/agents/utils.ts | 42 | export function isAgentMentionReminderPost(post: PostModel | Post): boolean { | CODE |
| LOW | app/products/agents/turn_content.ts | 50 | export function getResponseAnchorSequence(conversation: ConversationResponse, postId: string): number { | CODE |
| LOW | app/products/agents/turn_content.ts | 123 | export function extractAnnotationsFromTurn(turn: Turn | undefined): Annotation[] { | CODE |
| LOW | app/products/agents/turn_content.ts | 185 | export function deriveApprovalStageForPost(conversation: ConversationResponse, postId: string): ToolApprovalStage { | CODE |
| LOW | app/products/agents/database/queries/version.ts | 20 | function isAgentsEnabledFromSystemModel(systems: SystemModel[]) { | CODE |
| LOW | app/products/agents/database/queries/thread.ts | 33 | export function queryAIThreadsByChannelId(database: Database, channelId: string) { | CODE |
| LOW | app/products/agents/database/queries/thread.ts | 43 | export function observeAIThreadsByChannelId(database: Database, channelId: string) { | CODE |
| LOW | app/products/agents/actions/websocket/index.ts | 106 | export function handleAgentConversationUpdated( | CODE |
| LOW | app/products/agents/actions/websocket/version.ts | 7 | export async function handleAgentsPluginEnabled(serverUrl: string, manifest: ClientPluginManifest) { | CODE |
| LOW | app/products/agents/actions/websocket/version.ts | 14 | export async function handleAgentsPluginDisabled(serverUrl: string, manifest: ClientPluginManifest) { | CODE |
| LOW | app/products/agents/actions/remote/agents_status.ts | 8 | export async function checkIsAgentsPluginEnabled(serverUrl: string): Promise<{data?: boolean; error?: unknown}> { | CODE |
| LOW | app/products/agents/actions/remote/conversation.ts | 39 | function normalizeConversationResponse(raw: ConversationResponse): ConversationResponse { | CODE |
| LOW | app/products/agents/actions/remote/conversation.ts | 146 | export function clearConversationCacheForServer(serverUrl: string): void { | CODE |
| LOW⚡ | app/products/playbooks/database/queries/settings.ts | 12 | function queryTaskRequirementsEnabled(database: Database) { | CODE |
| LOW⚡ | app/products/playbooks/database/queries/settings.ts | 18 | export function observeIsTaskRequirementsEnabled(database: Database) { | CODE |
| LOW⚡ | app/products/playbooks/database/queries/settings.ts | 26 | export async function fetchIsTaskRequirementsEnabled(database: Database) { | CODE |
| LOW | app/products/playbooks/database/queries/version.ts | 27 | function isPlaybooksEnabledFromSystemModel(systems: SystemModel[]) { | CODE |
| LOW | app/products/playbooks/database/queries/version.ts | 41 | export function observeIsPlaybooksEnabled(database: Database) { | CODE |
| LOW | app/products/playbooks/database/queries/version.ts | 51 | function isSummaryEditEnabledFromSystemModel(systems: SystemModel[]) { | CODE |
| LOW | app/products/playbooks/database/queries/version.ts | 65 | export async function fetchIsSummaryEditEnabled(database: Database) { | CODE |
| LOW | app/products/playbooks/database/queries/version.ts | 70 | export function observeIsSummaryEditEnabled(database: Database) { | CODE |
| LOW | …s/playbooks/database/models/playbook_checklist_item.ts | 11 | function safeParseTaskRequirements(raw: unknown): TaskRequirement[] { | CODE |
| LOW | app/products/playbooks/screens/navigation.ts | 42 | export async function goToPlaybookRunWithChannelSwitch(intl: IntlShape, serverUrl: string, playbookRun: PlaybookRun | Pl | CODE |
| LOW | app/products/playbooks/actions/websocket/settings.ts | 10 | export async function handlePlaybooksSettingsChanged(serverUrl: string, msg: WebSocketMessage) { | CODE |
| LOW | app/products/playbooks/actions/websocket/version.ts | 7 | export async function handlePlaybookPluginEnabled(serverUrl: string, manifest: ClientPluginManifest) { | CODE |
| LOW | app/products/playbooks/actions/websocket/version.ts | 14 | export async function handlePlaybookPluginDisabled(serverUrl: string, manifest: ClientPluginManifest) { | CODE |
| LOW | app/products/playbooks/actions/local/property_fields.ts | 16 | export async function handlePlaybookRunPropertyFields( | CODE |
| LOW | app/products/playbooks/actions/local/channel.ts | 8 | export async function updateLastPlaybookRunsFetchAt(serverUrl: string, channelId: string, lastPlaybookRunsFetchAt: numbe | CODE |
| LOW | app/products/playbooks/actions/local/checklist.ts | 160 | export async function updateChecklistItemTitleAndDescription(serverUrl: string, itemId: string, title: string, descripti | CODE |
| LOW | app/context/theme/index.tsx | 27 | export function getDefaultThemeByAppearance(): Theme { | CODE |
| LOW | app/context/theme/index.tsx | 128 | export function useThemeByAppearanceWithDefault(themeProp?: Theme): Theme { | CODE |
| LOW | app/queries/servers/entry.ts | 53 | export async function prepareEntryModelsForDeletion({serverUrl, operator, teamData, chData}: PrepareModelsForDeletionArg | CODE |
| LOW | app/queries/servers/entry.ts | 193 | export async function processEntryModelsForDeletion({ | CODE |
| LOW | app/queries/servers/role.ts | 41 | export function observePermissionForChannel(database: Database, channel: ChannelModel | null | undefined, user: UserMode | CODE |
| LOW | app/queries/servers/role.ts | 92 | export function observeCanManageChannelMembers(database: Database, channelId: string, user: UserModel) { | CODE |
| LOW | app/queries/servers/role.ts | 106 | export function observeCanManageChannelSettings(database: Database, channelId: string, user: UserModel) { | CODE |
| LOW | app/queries/servers/role.ts | 120 | export function observeCanManageChannelAutotranslations(database: Database, channelId: string, user: UserModel) { | CODE |
| LOW | app/queries/servers/role.ts | 165 | export function observeCanManageSharedChannel(database: Database, channelId: string, user: UserModel) { | CODE |
| LOW | app/queries/servers/channel.ts | 58 | export function prepareMissingChannelsForAllTeams(operator: ServerDataOperator, channels: Channel[], channelMembers: Cha | CODE |
| LOW | app/queries/servers/channel.ts | 566 | export function observeMyChannelMentionCount(database: Database, teamId?: string, columns = ['mentions_count', 'is_unrea | CODE |
| LOW | app/queries/servers/categories.ts | 41 | export async function prepareCategoriesAndCategoriesChannels(operator: ServerDataOperator, categories: CategoryWithChann | CODE |
| LOW | app/queries/servers/thread.ts | 226 | export function observeThreadMentionCount(database: Database, { | CODE |
| LOW | app/queries/servers/system.ts | 437 | export async function prepareCommonSystemValues( | CODE |
| LOW | app/queries/servers/system.ts | 536 | export async function setCurrentTeamAndChannelId(operator: ServerDataOperator, teamId?: string, channelId?: string) { | CODE |
| LOW | app/queries/servers/scheduled_post.ts | 38 | export function observeFirstScheduledPost(v: ScheduledPostModel[]) { | CODE |
| LOW | app/utils/helpers.ts | 162 | export function getCurrentMomentForTimezone(timezone: string | null) { | CODE |
| LOW | app/utils/dialog_utils.ts | 51 | export function mapDialogTypeToAppFieldType(dialogType: InteractiveDialogElementType, dataSource?: string): AppFieldType | CODE |
| LOW | app/utils/dialog_utils.ts | 86 | export function mapAppFieldTypeToDialogType(appFieldType: AppFieldType): InteractiveDialogElementType { | CODE |
| LOW | app/utils/dialog_utils.ts | 113 | export function getDataSourceForAppFieldType(appFieldType: AppFieldType): string | undefined { | CODE |
| 335 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | detox/e2e/test/products/agents/agent_mention.e2e.ts | 129 | // # Create a regular bot (not an agent) for comparison testing | COMMENT |
| MEDIUM⚡ | …e2e/test/products/agents/tool_calls_in_channels.e2e.ts | 213 | // # Create a second user and add to the test channel | COMMENT |
| MEDIUM⚡ | …e2e/test/products/agents/tool_calls_in_channels.e2e.ts | 218 | // # Create a pending tool call | COMMENT |
| MEDIUM⚡ | …e2e/test/products/agents/tool_calls_in_channels.e2e.ts | 221 | // # Create an agent post where the OTHER user is the requester (not the logged-in user) | COMMENT |
| MEDIUM⚡ | …e2e/test/products/agents/tool_calls_in_channels.e2e.ts | 393 | // # Create a DM channel between admin and the test user | COMMENT |
| MEDIUM⚡ | …e2e/test/products/agents/tool_calls_in_channels.e2e.ts | 396 | // # Create a pending tool call with known arguments | COMMENT |
| MEDIUM⚡ | …e2e/test/products/agents/tool_calls_in_channels.e2e.ts | 402 | // # Create an agent post in the DM channel | COMMENT |
| MEDIUM | …e2e/test/products/agents/tool_calls_in_channels.e2e.ts | 166 | // # Create a tool call with a known name | COMMENT |
| MEDIUM | …e2e/test/products/agents/tool_calls_in_channels.e2e.ts | 169 | // # Create an agent post with pending tool calls (Phase 1) | COMMENT |
| MEDIUM | …e2e/test/products/agents/tool_calls_in_channels.e2e.ts | 190 | // # Create a pending tool call | COMMENT |
| MEDIUM | …e2e/test/products/agents/tool_calls_in_channels.e2e.ts | 193 | // # Create an agent post where the test user is the requester | COMMENT |
| MEDIUM | …e2e/test/products/agents/tool_calls_in_channels.e2e.ts | 242 | // # Create a successful tool call with a result | COMMENT |
| MEDIUM | …e2e/test/products/agents/tool_calls_in_channels.e2e.ts | 249 | // # Create an agent post with the completed tool call | COMMENT |
| MEDIUM | …e2e/test/products/agents/tool_calls_in_channels.e2e.ts | 269 | // # Create a rejected tool call | COMMENT |
| MEDIUM | …e2e/test/products/agents/tool_calls_in_channels.e2e.ts | 275 | // # Create an agent post with the rejected tool call | COMMENT |
| MEDIUM | …e2e/test/products/agents/tool_calls_in_channels.e2e.ts | 301 | // # Create a successful tool call (tool has executed) | COMMENT |
| MEDIUM | …e2e/test/products/agents/tool_calls_in_channels.e2e.ts | 308 | // # Create an agent post in Phase 2 (pending_tool_result = 'true') | COMMENT |
| MEDIUM | …e2e/test/products/agents/tool_calls_in_channels.e2e.ts | 332 | // # Create a successful tool call with result | COMMENT |
| MEDIUM | …e2e/test/products/agents/tool_calls_in_channels.e2e.ts | 339 | // # Create an agent post in Phase 2 (result approval) | COMMENT |
| MEDIUM | …e2e/test/products/agents/tool_calls_in_channels.e2e.ts | 367 | // # Create an agent post with multiple tool calls | COMMENT |
| MEDIUM | …e2e/test/products/agents/tool_calls_in_channels.e2e.ts | 434 | // # Create a mix of tool calls in different states | COMMENT |
| MEDIUM | …e2e/test/products/agents/tool_calls_in_channels.e2e.ts | 449 | // # Create an agent post with mixed tool call states | COMMENT |
| MEDIUM | …x/e2e/test/products/channels/smoke_test/threads.e2e.ts | 70 | // # Create a thread and unfollow thread via thread navigation | COMMENT |
| MEDIUM | …x/e2e/test/products/channels/smoke_test/threads.e2e.ts | 157 | // # Create a thread, go back to channel list screen, then go to global threads screen, open thread options for | COMMENT |
| MEDIUM | …s/channels/autocomplete/at_mention_user_filters.e2e.ts | 70 | // # Create a new user, add to team/channel, then deactivate | COMMENT |
| MEDIUM | …s/channels/autocomplete/at_mention_user_filters.e2e.ts | 93 | // # Create a user with a known nickname (password 16+ chars for server's 14-char minimum). | COMMENT |
| MEDIUM | …annels/autocomplete/at_mention_user_suggestions.e2e.ts | 303 | // # Create a team member not in the channel, tap "@" to activate at-mention autocomplete | COMMENT |
| MEDIUM | …/test/products/channels/search/search_modifiers.e2e.ts | 73 | // # Create a second user, create a DM channel with that user, and post a message | COMMENT |
| MEDIUM | …/test/products/channels/search/search_modifiers.e2e.ts | 195 | // # Create a user with a username containing special characters | COMMENT |
| MEDIUM | …/e2e/test/products/channels/search/search_cycle.e2e.ts | 174 | // # Create a new user with known first name, last name, and nickname | COMMENT |
| MEDIUM | …2e/test/products/channels/search/hashtag_search.e2e.ts | 60 | // # Create a unique hashtag and post a message containing it | COMMENT |
| MEDIUM | …2e/test/products/channels/search/hashtag_search.e2e.ts | 108 | // # Create a unique hashtag and post a message containing it | COMMENT |
| MEDIUM | …cts/channels/threads/follow_and_unfollow_thread.e2e.ts | 66 | // # Create a thread | COMMENT |
| MEDIUM | …cts/channels/threads/follow_and_unfollow_thread.e2e.ts | 101 | // # Create a thread and go back to channel screen | COMMENT |
| MEDIUM | …cts/channels/threads/follow_and_unfollow_thread.e2e.ts | 139 | // # Create a thread, go back to channel screen, and open post options for thread | COMMENT |
| MEDIUM | …cts/channels/threads/follow_and_unfollow_thread.e2e.ts | 195 | // # Create a thread, go back to channel list screen, then go to global threads screen, and tap on all your thre | COMMENT |
| MEDIUM | …channels/threads/mark_thread_as_read_and_unread.e2e.ts | 64 | // # Create a thread started by the current user which another user replied to, go back to channel list screen, | COMMENT |
| MEDIUM | …channels/threads/mark_thread_as_read_and_unread.e2e.ts | 102 | // # Create a thread started by the current user which another user replied to, go back to channel list screen, | COMMENT |
| MEDIUM | …channels/threads/mark_thread_as_read_and_unread.e2e.ts | 149 | // # Create a thread started by the current user which another user replied to, go back to channel list screen, | COMMENT |
| MEDIUM | …e/test/products/channels/threads/global_threads.e2e.ts | 80 | // # Create a thread started by the current user which current user replied to | COMMENT |
| MEDIUM | …e/test/products/channels/threads/global_threads.e2e.ts | 126 | // # Create a thread started by the current user and current user unfollows the thread | COMMENT |
| MEDIUM | …e/test/products/channels/threads/global_threads.e2e.ts | 153 | // # Create a thread started by another user which the current user replied to | COMMENT |
| MEDIUM | …e/test/products/channels/threads/global_threads.e2e.ts | 194 | // # Create a thread started by another user which the current user replied to and current user unfollows the th | COMMENT |
| MEDIUM | …roducts/channels/threads/save_and_unsave_thread.e2e.ts | 65 | // # Create a thread, go back to channel list screen, and then go to global threads screen | COMMENT |
| MEDIUM | …roducts/channels/threads/save_and_unsave_thread.e2e.ts | 111 | // # Create a thread, go back to channel list screen, and then go to global threads screen | COMMENT |
| MEDIUM | …roducts/channels/threads/open_thread_in_channel.e2e.ts | 63 | // # Create a thread, go back to channel list screen, and then go to global threads screen | COMMENT |
| MEDIUM | …roducts/channels/threads/open_thread_in_channel.e2e.ts | 103 | // # Create a thread, go back to channel list screen, and then go to global threads screen | COMMENT |
| MEDIUM | …/test/products/channels/threads/reply_to_thread.e2e.ts | 66 | // # Create a thread, go back to channel list screen, and then go to global threads screen | COMMENT |
| MEDIUM | …/test/products/channels/threads/reply_to_thread.e2e.ts | 108 | // # Create a thread, go back to channel list screen, and then go to global threads screen | COMMENT |
| MEDIUM | …ts/channels/threads/dm_from_thread_user_profile.e2e.ts | 59 | // # Create a second user and add to team/channel | COMMENT |
| MEDIUM | …ts/channels/threads/dm_from_thread_user_profile.e2e.ts | 64 | // # Create a root post and a reply from the other user | COMMENT |
| MEDIUM | …/channels/channel_attributes/channel_attributes.e2e.ts | 116 | // # Create a header-designated attribute field. | COMMENT |
| MEDIUM | …/channels/channel_attributes/channel_attributes.e2e.ts | 126 | // # Create the channel with the attribute value supplied at creation time, mirroring | COMMENT |
| MEDIUM | …/channels/channel_attributes/channel_attributes.e2e.ts | 149 | // # Create an optional header-designated field. | COMMENT |
| MEDIUM | …/channels/channel_attributes/channel_attributes.e2e.ts | 170 | // # Create the channel with only the control value set — TEST_FIELD_NAME stays unset. | COMMENT |
| MEDIUM | …/channels/channel_attributes/channel_attributes.e2e.ts | 212 | // # Create the channel with both values set at creation time. | COMMENT |
| MEDIUM | …/channels/channel_attributes/channel_attributes.e2e.ts | 250 | // # Create a second user for the DM. DMs are server-global; no shared team needed. | COMMENT |
| MEDIUM | …/channels/channel_attributes/channel_attributes.e2e.ts | 253 | // # Create the DM and post a message so it appears in the sidebar. | COMMENT |
| MEDIUM | …/channels/channel_attributes/channel_attributes.e2e.ts | 288 | // # Create the channel with the attribute value at creation time. | COMMENT |
| MEDIUM | …/channels/channel_attributes/channel_attributes.e2e.ts | 313 | // # Create an optional info-designated field. | COMMENT |
| 34 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | types/api/mm_blocks.d.ts | 1 | // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. | COMMENT |
| LOW | app/products/calls/alerts.ts | 181 | const enabled = getCallsState(serverUrl).enabled[channelId]; | COMMENT |
| LOW | app/context/keyboard_state/index.tsx | 221 | const onScroll = useAnimatedScrollHandler({ | COMMENT |
| LOW | app/constants/classification.ts | 1 | // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. | COMMENT |
| LOW | app/constants/channel_attributes.ts | 1 | // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. | COMMENT |
| LOW | app/constants/channel_attributes.ts | 41 | COMMENT | |
| LOW | app/utils/classification.ts | 61 | // The per-channel banner is no longer classification's: any attribute designated | COMMENT |
| LOW | app/utils/url/path.ts | 1 | // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. | COMMENT |
| LOW | app/utils/url/latin_map.ts | 381 | Ż: 'Z', // LATIN CAPITAL LETTER Z WITH DOT ABOVE | COMMENT |
| LOW | app/utils/url/latin_map.ts | 581 | // CANNOT FIND APPROXIMATION FOR 'LATIN SMALL LETTER ESH' (ʃ) | COMMENT |
| LOW | app/screens/browse_channels/browse_channels.tsx | 121 | // For archived channels, skip `joinChannel`: the server returns a 400 from | COMMENT |
| LOW | app/screens/server/index.tsx | 421 | } | COMMENT |
| LOW | app/screens/channel/header/index.ts | 81 | const isUserLanguageSupported = observeIsUserLanguageSupportedByAutotranslation(database); | COMMENT |
| LOW | app/components/markdown/transform.test.ts | 3901 | COMMENT | |
| LOW | app/components/channel_attribute_editor/utils.ts | 81 | // smaller than the second once that addition lands, leaving Gorhom an | COMMENT |
| LOW | …tion_banner/global_classification_banner_container.tsx | 41 | // is on. So visibility has to re-check the classification flag here: without | COMMENT |
| LOW | app/components/channel_attribute_form/index.ts | 1 | // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. | COMMENT |
| LOW | app/keyboard/state_machine/actions.ts | 281 | postInputTranslateY: {value: 0, animated: false}, | COMMENT |
| LOW | app/store/ephemeral_store.ts | 61 | COMMENT | |
| LOW | …ermost/secure-pdf-viewer/ios/SecurePDFViewerManager.mm | 1 | #import "SecurePDFViewerManager.h" | COMMENT |
| LOW | …cure-pdf-viewer/ios/RCTSecurePDFViewerComponentView.mm | 1 | #ifdef RCT_NEW_ARCH_ENABLED | COMMENT |
| LOW | …ecure-pdf-viewer/ios/SecurePDFViewer-Bridging-Header.h | 1 | // SecurePDFViewer-Bridging-Header.h | COMMENT |
| LOW | …s/@mattermost/calls-native/ios/Source/MMCallsNative.mm | 1 | // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. | COMMENT |
| LOW | …es/@mattermost/calls-native/ios/Source/MMCallsNative.h | 1 | // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. | COMMENT |
| LOW | …ost/calls-native/ios/Source/Managers/CallsBridge.swift | 1 | // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. | COMMENT |
| LOW | …s-native/ios/Source/Managers/AudioSessionManager.swift | 41 | /// proxy setter requires: they open with a `checkLock:` and fail with | COMMENT |
| LOW | …s-native/ios/Source/Managers/AudioSessionManager.swift | 121 | COMMENT | |
| LOW | …s-native/ios/Source/Managers/AudioSessionManager.swift | 241 | // MARK: - CallKit lifecycle forwarding | COMMENT |
| LOW | …ou/Tests/GekidouTests/DatabaseSafeIterationTests.swift | 1 | // DatabaseSafeIterationTests.swift | COMMENT |
| LOW | ios/Mattermost/Mattermost-Bridging-Header.h | 1 | // | COMMENT |
| LOW | …MattermostShare/Views/FontIconViews/FontIconView.swift | 1 | // | COMMENT |
| LOW | detox/maestro/GUIDELINES.md | 21 | ## 2. Flow file header contract | COMMENT |
| LOW | detox/maestro/subflows/calls/join_channel_call.yml | 1 | # Sub-flow: Start/join a call from the channel quick-actions sheet. | COMMENT |
| LOW | detox/maestro/subflows/auth/logout.yml | 21 | COMMENT | |
| LOW | detox/maestro/subflows/auth/login.yml | 1 | # Sub-flow: Login to Mattermost | COMMENT |
| LOW | …o/subflows/navigation/open_settings_report_problem.yml | 1 | # Sub-flow: from the Account screen, open Settings and reveal "Report a Problem". | COMMENT |
| LOW | …o/subflows/navigation/open_settings_report_problem.yml | 21 | # - Account screen is open (see open_account.yml) | COMMENT |
| LOW | …tro/subflows/navigation/open_channel_quick_actions.yml | 1 | # Open the channel header quick-actions sheet (three-dots). | COMMENT |
| LOW | …ox/maestro/subflows/navigation/navigate_to_channel.yml | 1 | # Sub-flow: Navigate to a channel | COMMENT |
| LOW | …estro/subflows/navigation/expand_channels_category.yml | 1 | # Expand the Channels sidebar category when collapsed (chevron points right). | COMMENT |
| LOW | …tox/maestro/subflows/server/_enter_url_and_connect.yml | 1 | # Sub-flow (iOS): enter SITE_1_URL + display name and submit the server form ONCE. | COMMENT |
| LOW | detox/maestro/subflows/server/connect_server_ios.yml | 1 | # Sub-flow (iOS only): connect to the Mattermost server from the server form. | COMMENT |
| LOW | …estro/subflows/browser/dismiss_chrome_interstitial.yml | 1 | # Subflow: Dismiss Chrome first-run / ads interstitials on a fresh API 35 emulator. | COMMENT |
| LOW | …ro/subflows/waits/wait_for_server_connect_complete.yml | 1 | # Sub-flow: Wait for server connect to finish navigating off the server form. | COMMENT |
| LOW | detox/maestro/scripts/write_maestro_failure_stub.sh | 1 | #!/bin/bash | COMMENT |
| LOW | detox/maestro/scripts/reset_ios_app.sh | 1 | #!/bin/bash | COMMENT |
| LOW | detox/maestro/scripts/apply_client_config_value.sh | 1 | #!/bin/bash | COMMENT |
| LOW | detox/maestro/scripts/apply_client_config_value.sh | 21 | # not hold it, and no wait here could prove that it will. | COMMENT |
| LOW | detox/maestro/scripts/setup_local.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | detox/maestro/scripts/setup_local.sh | 21 | # What this script does: | COMMENT |
| LOW | detox/maestro/scripts/run_calls_two_device.sh | 1 | #!/bin/bash | COMMENT |
| LOW | detox/maestro/scripts/write_maestro_skip_stub.sh | 1 | #!/bin/bash | COMMENT |
| LOW | detox/maestro/scripts/run_ci_batches.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | detox/maestro/scripts/run_timezone_test.sh | 1 | #!/bin/bash | COMMENT |
| LOW | detox/maestro/flows/calls/leave_call.yml | 1 | # MM-T4833: User can leave a call from the call screen or the minimized call bar. | COMMENT |
| LOW | detox/maestro/flows/calls/call_ui_permission.yml | 1 | # MM-T1411: Starting a call shows the permission dialog and call screen UI. | COMMENT |
| LOW | detox/maestro/flows/calls/mute_unmute.yml | 1 | # MM-T4832: User can mute and unmute the microphone during an active call. | COMMENT |
| LOW | detox/maestro/flows/calls/start_call.yml | 1 | # MM-T4829: User can start a call from channel quick actions and see the call screen. | COMMENT |
| LOW | detox/maestro/flows/timezone/clock_display.yml | 1 | # MM-T1325: Timezone display settings reflect the device timezone after app restart. | COMMENT |
| LOW | detox/maestro/flows/account/attach_logs.yml | 1 | # MM-T67856: Tapping Report a Problem opens the report screen and you can get back to Settings. | COMMENT |
| 67 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | …products/agents/screens/agent_chat/agent_chat.test.tsx | 66 | createDirectChannel: jest.fn(() => Promise.resolve({data: {id: 'placeholder'}})), | CODE |
| LOW | …laybooks/database/operators/transformers/index.test.ts | 1005 | attrs: '{"placeholder": "Enter value"}', | CODE |
| LOW | …laybooks/database/operators/transformers/index.test.ts | 1032 | record.attrs = '{"placeholder": "Original placeholder"}'; | CODE |
| LOW | …laybooks/database/operators/transformers/index.test.ts | 1051 | attrs: '{"placeholder": "Updated placeholder"}', | CODE |
| LOW | …laybooks/database/operators/transformers/index.test.ts | 1109 | record.attrs = '{"placeholder": "Original"}'; | CODE |
| LOW | …laybooks/database/operators/transformers/index.test.ts | 1144 | expect(preparedRecord.attrs).toBe('{"placeholder": "Original"}'); | CODE |
| LOW | …aybooks/database/models/playbook_run_attribute.test.ts | 29 | attribute.attrs = '{"placeholder": "Enter value"}'; | CODE |
| LOW | …aybooks/database/models/playbook_run_attribute.test.ts | 69 | expect(playbook_run_attribute.attrs).toBe('{"placeholder": "Enter value"}'); | CODE |
| LOW | …cts/playbooks/screens/select_user/select_user.test.tsx | 76 | expect(searchBar).toHaveProp('placeholder', 'Search'); | CODE |
| LOW | …cts/playbooks/screens/post_update/post_update.test.tsx | 182 | expect(input).toHaveProp('placeholder', 'Enter your update message'); | CODE |
| LOW | app/managers/intune_manager/index.test.ts | 118 | identity: {upn: 'user@example.com', tid: 'tenant_id', oid: 'object_id'}, | CODE |
| LOW | app/managers/intune_manager/index.test.ts | 139 | upn: 'user@example.com', | CODE |
| LOW | app/utils/dialog_conversion.test.ts | 1288 | name: 'Jane Doe', | CODE |
| LOW | app/utils/dialog_conversion.test.ts | 1298 | name: 'Jane Doe', | CODE |
| LOW | app/utils/user/index.test.ts | 65 | expect(result).toBe('John Doe'); | CODE |
| LOW | app/utils/user/index.test.ts | 159 | expect(result).toBe('John Doe'); | CODE |
| LOW | app/utils/user/index.test.ts | 165 | expect(result).toBe('John Doe'); | CODE |
| LOW | app/screens/edit_profile/components/form.test.tsx | 33 | email: 'test@test.com', | CODE |
| LOW | app/screens/edit_profile/components/form.test.tsx | 49 | email: 'test@test.com', | CODE |
| LOW | app/screens/invite/actions.test.ts | 111 | const email = 'user@example.com'; | CODE |
| LOW | app/screens/invite/actions.test.ts | 294 | const email = 'user@example.com'; | CODE |
| LOW | app/screens/invite/actions.test.ts | 350 | const email = 'user@example.com'; | CODE |
| LOW | app/screens/invite/actions.test.ts | 382 | const email = 'user@example.com'; | CODE |
| LOW | app/screens/component_library/mm_blocks_editor_utils.ts | 395 | {key: 'placeholder', label: 'placeholder', type: 'string'}, | CODE |
| LOW | …ist/post/system_message/system_message_helpers.test.js | 175 | workspace_name: 'Acme Corp', | CODE |
| LOW | …ist/post/system_message/system_message_helpers.test.js | 191 | workspace_name: 'Acme Corp', | CODE |
| LOW | app/components/block_renderer/translation/mm_block.ts | 14 | const STATIC_SELECT_REQUIRED_KEYS = ['type', 'action_id', 'placeholder']; | CODE |
| LOW | detox/utils/webhook_utils.js | 20 | placeholder: 'placeholder', | CODE |
| LOW | detox/utils/webhook_utils.js | 64 | placeholder: 'placeholder', | CODE |
| LOW | detox/utils/webhook_utils.js | 79 | placeholder: 'placeholder', | CODE |
| LOW | detox/utils/webhook_utils.js | 306 | placeholder: 'user@example.com', | CODE |
| LOW | detox/e2e/support/utils/index.ts | 45 | const phrase = 'lorem ipsum dolor sit amet '; | CODE |
| LOW | detox/e2e/support/utils/index.ts | 45 | const phrase = 'lorem ipsum dolor sit amet '; | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | detox/scripts/preboot_ios_simulator.sh | 199 | # ─── Main ──────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | detox/e2e/test/setup.ts | 106 | // ─── Admin API login ───────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | detox/e2e/test/setup.ts | 208 | // ─── Global beforeAll ──────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …st/products/channels/channels/channel_bookmarks.e2e.ts | 151 | // ── Create all test channels ────────────────────────────────────────── | COMMENT |
| MEDIUM | …st/products/channels/channels/channel_bookmarks.e2e.ts | 169 | // ── Pre-create bookmarks ────────────────────────────────────────────── | COMMENT |
| MEDIUM | …channels/channels/channel_bookmarks_permissions.e2e.ts | 83 | // ── Create all test channels ────────────────────────────────────────── | COMMENT |
| MEDIUM | …ucts/channels/channels/channel_bookmarks_search.e2e.ts | 72 | // ── Create all test channels ────────────────────────────────────────── | COMMENT |
| MEDIUM | …ucts/channels/channels/channel_bookmarks_search.e2e.ts | 82 | // ── Pre-create bookmarks ────────────────────────────────────────────── | COMMENT |
| MEDIUM | .github/workflows/e2e-label-manager.yml | 533 | # ── Honor E2E/Override: strip run labels, then cancel in-flight E2E ───── | COMMENT |
| MEDIUM | .github/workflows/e2e-ios-template.yml | 1068 | # ── Spec durations for the next run's shard packing ──────────────────── | COMMENT |
| MEDIUM | .github/workflows/e2e-android-template.yml | 649 | # ── Spec durations for the next run's shard packing ──────────────────── | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | CLAUDE-IOS-SIMULATOR.md | 23 | ## Step 1: iOS Simulator Runtime | COMMENT |
| LOW | CLAUDE-IOS-SIMULATOR.md | 39 | ## Step 2: CocoaPods Installation | COMMENT |
| LOW | CLAUDE-IOS-SIMULATOR.md | 86 | ## Step 3: Start Metro Bundler (if not already running) | COMMENT |
| LOW | CLAUDE-IOS-SIMULATOR.md | 94 | ## Step 4: Run iOS App (if not already built) | COMMENT |
| LOW⚡ | app/managers/security_manager/index.ts | 628 | // Step 1: Acquire MSAL tokens via native login | COMMENT |
| LOW⚡ | app/managers/security_manager/index.ts | 631 | // Step 2: Enroll in MAM (NO token sent to server - session exists) | COMMENT |
| LOW⚡ | app/actions/remote/session.ts | 358 | // Step 1: Acquire MSAL tokens with IntuneScope | COMMENT |
| LOW⚡ | app/actions/remote/session.ts | 362 | // Step 2: POST accessToken to /oauth/intune to exchange for session token | COMMENT |
| LOW⚡ | app/actions/remote/session.ts | 397 | // Step 3: Complete SSO login flow (sets up database, etc.) | COMMENT |
| LOW⚡ | app/actions/remote/session.ts | 400 | // Step 4: Enroll in MAM if not already enrolled (if 412 was not triggered) | COMMENT |
| LOW⚡ | app/client/rest/tracking.ts | 248 | // Step 1: Calculate total data size in bits | COMMENT |
| LOW⚡ | app/client/rest/tracking.ts | 253 | // Step 2: Calculate effective latency (in ms) | COMMENT |
| LOW⚡ | app/client/rest/tracking.ts | 256 | // Step 3: Calculate data transfer time | COMMENT |
| LOW⚡ | app/client/rest/tracking.ts | 264 | // Step 4: Calculate average speed | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | detox/maestro/scripts/run_two_device.sh | 2 | # Two-device orchestration for MM-T3055/MM-T3056 multi-device sync tests | COMMENT |
| MEDIUM | detox/maestro/scripts/run_channel_sync_two_device.sh | 2 | # Two-device orchestration for MM-T837 channel-creation-sync test | COMMENT |
| MEDIUM | detox/maestro/scripts/run_calls_two_device.sh | 2 | # Two-device orchestration for Calls E2E tests (MM-T4830 / MM-T4831) | COMMENT |
| MEDIUM | …estro/flows/multi_device/device_b_verifies_channel.yml | 14 | # - SYNC_TOKEN, TEST_TEAM_ID, ADMIN_TOKEN (orchestration / API polling) | COMMENT |
| MEDIUM | …tox/maestro/flows/multi_device/device_a_start_call.yml | 13 | # - SYNC_TOKEN, TEST_CHANNEL_ID, ADMIN_TOKEN (orchestration / API polling) | COMMENT |
| MEDIUM | detox/maestro/flows/multi_device/device_b_join_call.yml | 75 | # Leave intentionally omitted here for two-device orchestration: | COMMENT |
| MEDIUM | .github/workflows/e2e-detox-pr.yml | 862 | # Maestro orchestration lives in e2e-maestro-pr.yml so Detox and Maestro CI | COMMENT |
| MEDIUM | .github/workflows/e2e-maestro-pr.yml | 1 | # Maestro E2E orchestration — reusable workflow only. | COMMENT |
| MEDIUM | …ithub/actions/compute-e2e-build-fingerprint/action.yml | 39 | # build steps with unrelated orchestration (TSIO, statuses, provisioning), | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | app/managers/security_manager/index.ts | 628 | // Step 1: Acquire MSAL tokens via native login | COMMENT |
| LOW⚡ | app/managers/security_manager/index.ts | 631 | // Step 2: Enroll in MAM (NO token sent to server - session exists) | COMMENT |
| LOW⚡ | app/actions/remote/session.ts | 358 | // Step 1: Acquire MSAL tokens with IntuneScope | COMMENT |
| LOW⚡ | app/actions/remote/session.ts | 362 | // Step 2: POST accessToken to /oauth/intune to exchange for session token | COMMENT |
| LOW⚡ | app/actions/remote/session.ts | 397 | // Step 3: Complete SSO login flow (sets up database, etc.) | COMMENT |
| LOW⚡ | app/actions/remote/session.ts | 400 | // Step 4: Enroll in MAM if not already enrolled (if 412 was not triggered) | COMMENT |
| LOW⚡ | app/client/rest/tracking.ts | 248 | // Step 1: Calculate total data size in bits | COMMENT |
| LOW⚡ | app/client/rest/tracking.ts | 253 | // Step 2: Calculate effective latency (in ms) | COMMENT |
| LOW⚡ | app/client/rest/tracking.ts | 256 | // Step 3: Calculate data transfer time | COMMENT |
| LOW⚡ | app/client/rest/tracking.ts | 264 | // Step 4: Calculate average speed | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | detox/e2e/test/products/agents/agent_mention.e2e.ts | 125 | // # Check if agents plugin is active | COMMENT |
| LOW | scripts/read-coverage.sh | 5 | # Check if an argument is provided | COMMENT |
| LOW | scripts/read-coverage.sh | 14 | # Check if the coverage file exists | COMMENT |
| LOW | scripts/intune-init.sh | 10 | # Check if submodule is initialized | COMMENT |
| LOW | .github/workflows/github-release.yml | 168 | # Check if required SBOM files are available | COMMENT |
| LOW | .github/workflows/e2e-ios-template.yml | 633 | # Check if simulator is still responsive | COMMENT |
| LOW | .github/workflows/e2e-android-template.yml | 412 | # Check if "All SDK package licenses accepted" appears in output | COMMENT |
| LOW | .github/actions/setup-intune/action.yaml | 26 | # Check if submodule is already initialized | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | …hannel_settings/share_with_connected_workspaces.e2e.ts | 260 | // We leave this condition here to be more robust in the future. | COMMENT |
| MEDIUM | …oducts/channels/messaging/pending_posts_offline.e2e.ts | 72 | // # Restore network access (harness polls until the server is reachable) | COMMENT |
| MEDIUM | detox/e2e/support/ui/screen/edit_profile.ts | 119 | // robust against iOS-26 Detox's inconsistent visibility computation | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | app/components/post_list/post/index.ts | 141 | // Same for AI-generated posts so the sparkle indicator is always visible. | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | .cursor/scripts/cloud-agent-smoke.sh | 5 | # Usage: | COMMENT |
| LOW | detox/maestro/scripts/setup_local.sh | 13 | # Usage: | COMMENT |
| LOW | detox/maestro/scripts/run_calls_two_device.sh | 6 | # Usage: | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | …/secure-pdf-viewer/ios/Utils/PDFErrorDiagnostics.swift | 199 | print("Error diagnosing PDF: \(error.localizedDescription)") | CODE |
| MEDIUM | ios/MattermostShare/Utils/LocalFileManager.swift | 55 | print("Error deleting file \(path)") | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | scripts/mitmdump-flow-parsing.py | 1 | CODE | |
| LOW | scripts/mitmdump-flow-parsing.py | 1 | CODE |