<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Mattermost Engineering Knowledge Base</title><link>https://mmworkbrain.pages.dev/</link><description>Recent content on Mattermost Engineering Knowledge Base</description><generator>Hugo</generator><language>en-us</language><atom:link href="https://mmworkbrain.pages.dev/index.xml" rel="self" type="application/rss+xml"/><item><title>PR Status Tracker</title><link>https://mmworkbrain.pages.dev/docs/trackers/pr-status/</link><pubDate>Fri, 23 Oct 2026 00:00:00 +0000</pubDate><guid>https://mmworkbrain.pages.dev/docs/trackers/pr-status/</guid><description>&lt;p>Running status of all active PRs across Mattermost repos. &lt;em>Last updated: 2026-10-23 17:10 UTC&lt;/em>&lt;/p>
&lt;h2 id="sentry-fix-prs">Sentry Fix PRs&lt;/h2>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>#&lt;/th>
 &lt;th>Sentry ID&lt;/th>
 &lt;th>Repo&lt;/th>
 &lt;th>Title&lt;/th>
 &lt;th>PR&lt;/th>
 &lt;th>Status&lt;/th>
 &lt;th>Events&lt;/th>
 &lt;th>Users&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>1&lt;/td>
 &lt;td>SERVER-VF&lt;/td>
 &lt;td>mattermost&lt;/td>
 &lt;td>Nil pointer in UpdateUser&lt;/td>
 &lt;td>&lt;a href="https://github.com/mattermost/mattermost/pull/35717">#35717&lt;/a>&lt;/td>
 &lt;td>✅ Merged&lt;/td>
 &lt;td>14&lt;/td>
 &lt;td>TBD&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>2&lt;/td>
 &lt;td>SERVER-W9&lt;/td>
 &lt;td>gosaml2&lt;/td>
 &lt;td>SAML decrypt panic + expired test cert&lt;/td>
 &lt;td>&lt;a href="https://github.com/mattermost/gosaml2/pull/9">#9&lt;/a>&lt;/td>
 &lt;td>✅ Merged&lt;/td>
 &lt;td>11&lt;/td>
 &lt;td>1&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>3&lt;/td>
 &lt;td>MOBILE-IOS-YND+YNE&lt;/td>
 &lt;td>mobile&lt;/td>
 &lt;td>Fatal SQLite crashes from concurrent DB access&lt;/td>
 &lt;td>&lt;a href="https://github.com/mattermost/mattermost-mobile/pull/9610">#9610&lt;/a>&lt;/td>
 &lt;td>✅ Merged&lt;/td>
 &lt;td>46,000+&lt;/td>
 &lt;td>36,000+&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>4&lt;/td>
 &lt;td>MOBILE-ANDROID-AX68&lt;/td>
 &lt;td>mobile&lt;/td>
 &lt;td>RNN race condition crash during activity destroy&lt;/td>
 &lt;td>&lt;a href="https://github.com/mattermost/mattermost-mobile/pull/9617">#9617&lt;/a>&lt;/td>
 &lt;td>✅ Merged&lt;/td>
 &lt;td>9,150&lt;/td>
 &lt;td>1,580&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>5&lt;/td>
 &lt;td>MOBILE-ANDROID-AZ02+AYPW&lt;/td>
 &lt;td>rn-network-client&lt;/td>
 &lt;td>OkHttp header crashes from non-ASCII chars&lt;/td>
 &lt;td>&lt;a href="https://github.com/mattermost/react-native-network-client/pull/160">#160&lt;/a>&lt;/td>
 &lt;td>✅ Merged&lt;/td>
 &lt;td>1,395&lt;/td>
 &lt;td>654&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>6&lt;/td>
 &lt;td>SERVER-W1&lt;/td>
 &lt;td>mattermost&lt;/td>
 &lt;td>&lt;code>createProfileImage&lt;/code> panic on empty username&lt;/td>
 &lt;td>&lt;a href="https://github.com/mattermost/mattermost/pull/35722">#35722&lt;/a>&lt;/td>
 &lt;td>⚠️ CR (Draft)&lt;/td>
 &lt;td>1,793&lt;/td>
 &lt;td>167&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>7&lt;/td>
 &lt;td>SERVER-TY&lt;/td>
 &lt;td>mattermost&lt;/td>
 &lt;td>Nil License().IsCloud() sweep — 33 call sites&lt;/td>
 &lt;td>&lt;a href="https://github.com/mattermost/mattermost/pull/35718">#35718&lt;/a>&lt;/td>
 &lt;td>🟡 Draft ❌&lt;/td>
 &lt;td>1,497&lt;/td>
 &lt;td>1&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>8&lt;/td>
 &lt;td>MOBILE-ANDROID-AWY6&lt;/td>
 &lt;td>mobile&lt;/td>
 &lt;td>Push notification crash on non-Map error data&lt;/td>
 &lt;td>&lt;a href="https://github.com/mattermost/mattermost-mobile/pull/9618">#9618&lt;/a>&lt;/td>
 &lt;td>✅ Merged&lt;/td>
 &lt;td>4,806&lt;/td>
 &lt;td>574&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>&lt;strong>Total user impact addressed: ~39,000+ users across 8 PRs.&lt;/strong>&lt;/p></description></item><item><title>Paid Search Attribution: Findings and Best Practices</title><link>https://mmworkbrain.pages.dev/docs/marketing/best-practices/</link><pubDate>Thu, 15 Oct 2026 00:00:00 +0000</pubDate><guid>https://mmworkbrain.pages.dev/docs/marketing/best-practices/</guid><description>&lt;p>Source data: &lt;code>UTM_Raw_Data_Sept_1_to_Oct_15.csv&lt;/code> (Marketo export, 5,125 unique people created 2026-09-01 to 2026-10-15) and &lt;code>how_lead_source_is_set_in_marketo.docx&lt;/code>/&lt;code>.html&lt;/code> (Person Source rules, audit of Oct 15, 2026).&lt;/p>
&lt;h2 id="1-scope">1. Scope&lt;/h2>
&lt;p>List imports (3,632 rows, 71% of the export) can be ignored for web campaign attribution. None of them has any &lt;code>utm_*&lt;/code>, &lt;code>ft_*&lt;/code>, &lt;code>gclid&lt;/code> or &lt;code>FT Referrer&lt;/code> value, and &lt;code>Most Recent Lead Source&lt;/code> is blank on all of them. Their Person Source was set by hand (3,468 &amp;ldquo;Unknown&amp;rdquo;, 150 &amp;ldquo;Live Event&amp;rdquo;, 12 &amp;ldquo;Paid Social&amp;rdquo;, 2 other). They are mostly ABM and event lists.&lt;/p></description></item><item><title>From 62 Minutes to 14: How We Sharded Our Go Test Suite</title><link>https://mmworkbrain.pages.dev/docs/blog-drafts/ci-test-sharding-blog-post/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://mmworkbrain.pages.dev/docs/blog-drafts/ci-test-sharding-blog-post/</guid><description>&lt;p>At Mattermost, our server test suite had a problem: it took about 62 minutes to run on every pull request. For master builds with the race detector enabled, that number climbed to over 90 minutes. We recently shipped test-level sharding (&lt;a href="https://github.com/mattermost/mattermost/pull/35739">#35739&lt;/a>) that brings PR runs down to &lt;strong>~14 minutes&lt;/strong> — a &lt;strong>77% improvement&lt;/strong>.&lt;/p>
&lt;p>Thanks to Jesse (lieut-data), Doug (wiggin77), and Eva (esarafianou) for a thorough code review that caught real issues and made the implementation significantly better.&lt;/p></description></item><item><title>Server Test Coverage Strategy</title><link>https://mmworkbrain.pages.dev/docs/ci/server-test-coverage-strategy/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://mmworkbrain.pages.dev/docs/ci/server-test-coverage-strategy/</guid><description>&lt;p>&lt;strong>Date:&lt;/strong> 2026-03-23&lt;br>
&lt;strong>Baseline:&lt;/strong> 33.84% (201,671 lines across 853 files)&lt;br>
&lt;strong>Source:&lt;/strong> &lt;a href="https://app.codecov.io/github/mattermost/mattermost/commit/7c643b2248d436f681d6419d0502fc7ae3895a87">Codecov commit report&lt;/a>&lt;/p>
&lt;h2 id="current-state">Current State&lt;/h2>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Metric&lt;/th>
 &lt;th>Value&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>Production Go files&lt;/td>
 &lt;td>1,287&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Files with coverage data&lt;/td>
 &lt;td>853&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Total statements instrumented&lt;/td>
 &lt;td>146,513&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Statements covered&lt;/td>
 &lt;td>53,132 (36.3%)&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Statements uncovered&lt;/td>
 &lt;td>93,381&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>The 33.84% figure is &lt;strong>real production coverage&lt;/strong> — generated code (retrylayer, timerlayer), mocks, and test utilities are correctly excluded from the denominator. The gap between 1,287 total files and 853 instrumented files is mostly generated layers and mock code that Go&amp;rsquo;s coverage tool correctly ignores.&lt;/p></description></item><item><title>Website Forms and Tracking Audit</title><link>https://mmworkbrain.pages.dev/docs/marketing/website-forms-audit/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://mmworkbrain.pages.dev/docs/marketing/website-forms-audit/</guid><description>&lt;p>&lt;strong>Repo audited:&lt;/strong> &lt;code>/Users/pavelzeman/projects/mattermost/mattermost-website&lt;/code> (Astro, deployed through Cloudflare Workers; commit &lt;code>4aeda543&lt;/code>).&lt;/p>
&lt;p>Severity: &lt;strong>High&lt;/strong> = loses or corrupts attribution today. &lt;strong>Medium&lt;/strong> = inconsistent or a risk. &lt;strong>Low&lt;/strong> = hygiene.&lt;/p>
&lt;hr>
&lt;h2 id="1-summary">1. Summary&lt;/h2>
&lt;p>All lead capture goes through &lt;strong>one adapter&lt;/strong>, &lt;code>src/components/utils/marketo-forms.ts&lt;/code> (1,087 lines).
That is good news for the rebuild, because there is one place to change. But the adapter is entirely Marketo-specific, so it has to be replaced for Pardot, not just reconfigured.&lt;/p></description></item><item><title>Workstream Tracker</title><link>https://mmworkbrain.pages.dev/docs/trackers/workstreams/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://mmworkbrain.pages.dev/docs/trackers/workstreams/</guid><description>&lt;p>&lt;em>Last updated: 2026-03-20&lt;/em>&lt;/p>
&lt;h2 id="1-sentry-issue-triage--fix">1. Sentry Issue Triage &amp;amp; Fix&lt;/h2>
&lt;p>Goal: Identify, fix, and PR low-hanging-fruit Sentry issues across Mattermost projects.&lt;/p>
&lt;p>Full log: &lt;a href="https://mmworkbrain.pages.dev/docs/trackers/pr-status/">Sentry Fixes Log&lt;/a>&lt;/p>
&lt;h3 id="summary-as-of-2026-03-20">Summary (as of 2026-03-20)&lt;/h3>
&lt;ul>
&lt;li>&lt;strong>11 issues triaged&lt;/strong> across server, mobile (iOS + Android), and supporting libraries&lt;/li>
&lt;li>&lt;strong>8 draft PRs&lt;/strong> created with tests&lt;/li>
&lt;li>&lt;strong>~39,000+ users&lt;/strong> impacted across all fixes&lt;/li>
&lt;li>&lt;strong>1 upgrade advisory&lt;/strong> published (QC cluster panic, fixed in v11.0.1+)&lt;/li>
&lt;li>&lt;strong>1 skipped&lt;/strong> (single modified fork)&lt;/li>
&lt;li>&lt;strong>1 in progress&lt;/strong> (VF — nil pointer in patchUser/UpdateUser)&lt;/li>
&lt;/ul>
&lt;h3 id="biggest-wins-by-user-impact">Biggest wins by user impact&lt;/h3>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Issue&lt;/th>
 &lt;th>Platform&lt;/th>
 &lt;th>Users&lt;/th>
 &lt;th>PR&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>YND+YNE — SQLite concurrent access&lt;/td>
 &lt;td>iOS&lt;/td>
 &lt;td>36,000+&lt;/td>
 &lt;td>&lt;a href="https://github.com/mattermost/mattermost-mobile/pull/9610">#9610&lt;/a>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>AX68 — RNN activity destroy race&lt;/td>
 &lt;td>Android&lt;/td>
 &lt;td>1,580&lt;/td>
 &lt;td>&lt;a href="https://github.com/mattermost/mattermost-mobile/pull/9611">#9611&lt;/a>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>AZ02+AYPW — OkHttp header crashes&lt;/td>
 &lt;td>Android&lt;/td>
 &lt;td>654&lt;/td>
 &lt;td>&lt;a href="https://github.com/mattermost/react-native-network-client/pull/155">#155&lt;/a>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>AWY6 — Push notification type cast&lt;/td>
 &lt;td>Android&lt;/td>
 &lt;td>574&lt;/td>
 &lt;td>&lt;a href="https://github.com/mattermost/mattermost-mobile/pull/9609">#9609&lt;/a>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>W1 — Empty username panic&lt;/td>
 &lt;td>Server&lt;/td>
 &lt;td>167 instances&lt;/td>
 &lt;td>&lt;a href="https://github.com/mattermost/mattermost/pull/35700">#35700&lt;/a>&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;h3 id="next-steps">Next Steps&lt;/h3>
&lt;ul>
&lt;li>Complete VF investigation (nil pointer in patchUser/UpdateUser, 14 events)&lt;/li>
&lt;li>Get reviewer assignments on green PRs&lt;/li>
&lt;li>Pavel: build/test #9610 (iOS SQLite) on M4 MacBook Air&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="2-ci-improvements">2. CI Improvements&lt;/h2>
&lt;p>Goal: Faster CI pipelines for &lt;code>mattermost/mattermost&lt;/code> server.&lt;/p></description></item><item><title>Marketo and Salesforce Configuration Issues</title><link>https://mmworkbrain.pages.dev/docs/marketing/marketo-sfdc-configuration-issues/</link><pubDate>Thu, 15 Oct 2026 00:00:00 +0000</pubDate><guid>https://mmworkbrain.pages.dev/docs/marketing/marketo-sfdc-configuration-issues/</guid><description>&lt;p>Issues found in how UTM and attribution data is captured and stored across Marketo and Salesforce, based on the campaign-by-year analysis in &lt;code>sfdc-utm-campaigns-over-the-years.md&lt;/code>.&lt;/p>
&lt;p>&lt;strong>Provenance:&lt;/strong> The findings below came from a separate analysis that was pasted in. I did not run the Salesforce queries and have not verified the claims. Items that are diagnoses or guesses, not observed facts, are marked &lt;strong>Hypothesis&lt;/strong>. Where the Marketo CSV I analyzed supports or contradicts a claim, that is noted.&lt;/p></description></item><item><title>CI Coverage Persistence — Current State &amp; Options</title><link>https://mmworkbrain.pages.dev/docs/ci/ci-coverage-persistence/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://mmworkbrain.pages.dev/docs/ci/ci-coverage-persistence/</guid><description>&lt;p>&lt;strong>Date:&lt;/strong> 2026-03-23 (updated)&lt;br>
&lt;strong>Context:&lt;/strong> PR #35743 re-enabled server test coverage with 4-shard parallelism. Coverage uploads to Codecov succeed, but the developer experience is incomplete.&lt;/p>
&lt;h2 id="where-we-are">Where We Are&lt;/h2>
&lt;p>&lt;strong>What works:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>4-shard coverage run completes without OOM (6-8 min per shard)&lt;/li>
&lt;li>Merged &lt;code>cover.out&lt;/code> uploads to Codecov successfully (3.5MB, 853 files)&lt;/li>
&lt;li>Codecov commit report exists: &lt;a href="https://app.codecov.io/github/mattermost/mattermost/commit/7c643b2248d436f681d6419d0502fc7ae3895a87">link&lt;/a>&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>What doesn&amp;rsquo;t work:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>No PR comments from Codecov showing coverage diff&lt;/li>
&lt;li>No &lt;code>codecov.yml&lt;/code> — everything runs on Codecov defaults&lt;/li>
&lt;li>Generated code inflates the denominator (see below)&lt;/li>
&lt;li>No &lt;code>cover.out&lt;/code> artifact saved for historical analysis&lt;/li>
&lt;li>No baseline on &lt;code>master&lt;/code> yet — Codecov can&amp;rsquo;t compute diffs without a reference point&lt;/li>
&lt;/ul>
&lt;h2 id="the-numbers-problem">The Numbers Problem&lt;/h2>
&lt;p>Go&amp;rsquo;s coverage tool instruments everything compiled into the test binary, including generated wrappers, mocks, and test infrastructure. This inflates the denominator:&lt;/p></description></item><item><title>CI Pipeline Analysis v2: mattermost/mattermost</title><link>https://mmworkbrain.pages.dev/docs/ci/ci-analysis-mattermost-server-v2/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://mmworkbrain.pages.dev/docs/ci/ci-analysis-mattermost-server-v2/</guid><description>&lt;p>&lt;em>Last updated: 2026-04-09 — based on master run &lt;a href="https://github.com/mattermost/mattermost/actions/runs/24166497256">24166497256&lt;/a>. Follow-up to &lt;a href="../ci-analysis-mattermost-server/">v1 analysis&lt;/a> from 2026-03-20.&lt;/em>&lt;/p>
&lt;h2 id="progress-summary">Progress Summary&lt;/h2>
&lt;p>Three weeks of CI improvements have &lt;strong>reduced the PR critical path from ~60min to ~11min&lt;/strong> — a &lt;strong>5.5x speedup&lt;/strong>.&lt;/p>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Metric&lt;/th>
 &lt;th>v1 (2026-03-20)&lt;/th>
 &lt;th>v2 (2026-04-09)&lt;/th>
 &lt;th>Change&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>&lt;strong>PR critical path (wall-clock)&lt;/strong>&lt;/td>
 &lt;td>~60min&lt;/td>
 &lt;td>&lt;strong>~11min&lt;/strong>&lt;/td>
 &lt;td>&lt;strong>-82%&lt;/strong>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>Master critical path&lt;/strong>&lt;/td>
 &lt;td>~93min (with -race)&lt;/td>
 &lt;td>&lt;strong>~11min&lt;/strong> (no race)&lt;/td>
 &lt;td>&lt;strong>-88%&lt;/strong>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Postgres (PR, longest shard)&lt;/td>
 &lt;td>~60min (1 runner)&lt;/td>
 &lt;td>~8m 42s (4 shards)&lt;/td>
 &lt;td>-85%&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Postgres FIPS (PR, longest shard)&lt;/td>
 &lt;td>~60min (1 runner)&lt;/td>
 &lt;td>~9m 01s (4 shards)&lt;/td>
 &lt;td>-85%&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>mmctl&lt;/td>
 &lt;td>~8min&lt;/td>
 &lt;td>~10min&lt;/td>
 &lt;td>unchanged&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Build&lt;/td>
 &lt;td>~10min&lt;/td>
 &lt;td>~10m 40s&lt;/td>
 &lt;td>unchanged&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Binary parameters (master)&lt;/td>
 &lt;td>~87min&lt;/td>
 &lt;td>15m 47s ❌ (killed)&lt;/td>
 &lt;td>broken&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Race detection (master)&lt;/td>
 &lt;td>every push (~93min)&lt;/td>
 &lt;td>effectively disabled&lt;/td>
 &lt;td>⚠️&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Test coverage&lt;/td>
 &lt;td>disabled (OOM)&lt;/td>
 &lt;td>in progress (PR #35743)&lt;/td>
 &lt;td>🔄&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;h3 id="what-shipped">What Shipped&lt;/h3>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Phase&lt;/th>
 &lt;th>PR&lt;/th>
 &lt;th>Status&lt;/th>
 &lt;th>Impact&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>Phase 4: Server test sharding&lt;/td>
 &lt;td>&lt;a href="https://github.com/mattermost/mattermost/pull/35739">#35739&lt;/a>&lt;/td>
 &lt;td>✅ Merged&lt;/td>
 &lt;td>4 parallel shards per test matrix&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Fullyparallel mode&lt;/td>
 &lt;td>&lt;a href="https://github.com/mattermost/mattermost/pull/35816">#35816&lt;/a>&lt;/td>
 &lt;td>✅ Merged&lt;/td>
 &lt;td>&lt;code>t.Parallel()&lt;/code> within each shard&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Phase 5: Test coverage&lt;/td>
 &lt;td>&lt;a href="https://github.com/mattermost/mattermost/pull/35743">#35743&lt;/a>&lt;/td>
 &lt;td>🔄 In progress&lt;/td>
 &lt;td>4 coverage shards, codecov.yml consolidated&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Phase 6: Race detector&lt;/td>
 &lt;td>—&lt;/td>
 &lt;td>⚠️ Changed&lt;/td>
 &lt;td>Effectively disabled; nightly workflow needed&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;h3 id="new-issues-discovered">New Issues Discovered&lt;/h3>
&lt;ol>
&lt;li>&lt;strong>Binary parameters mode hangs&lt;/strong> — running with fullyparallel causes runner kills (PR &lt;a href="https://github.com/mattermost/mattermost/pull/35992">#35992&lt;/a> investigating)&lt;/li>
&lt;li>&lt;strong>Race detector effectively disabled&lt;/strong> — condition &lt;code>if [[ github.ref_name == 'master' &amp;amp;&amp;amp; fullyparallel != true ]]&lt;/code> never fires since fullyparallel defaults to true&lt;/li>
&lt;li>&lt;strong>Build is now the bottleneck&lt;/strong> — at ~11min, it&amp;rsquo;s the longest job on the critical path (previously dwarfed by 60min tests)&lt;/li>
&lt;/ol>
&lt;h2 id="1-workflow-inventory">1. Workflow Inventory&lt;/h2>
&lt;p>No changes to the workflow inventory since v1. The repository still contains &lt;strong>31 workflow YAML files&lt;/strong>. See &lt;a href="../ci-analysis-mattermost-server/#1-workflow-inventory">v1 analysis&lt;/a> for the full list.&lt;/p></description></item><item><title>PR Daily Status</title><link>https://mmworkbrain.pages.dev/docs/trackers/pr-daily-status/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://mmworkbrain.pages.dev/docs/trackers/pr-daily-status/</guid><description>&lt;p>Running daily log of PR status updates. Newest entries at top.&lt;/p>
&lt;hr>
&lt;h2 id="2026-10-30-friday">2026-10-30 (Friday)&lt;/h2>
&lt;p>&lt;strong>27 open PRs.&lt;/strong> Since 2026-10-29: no merges, no new PRs, no new unresolved threads, no new reviews. Only change: mattermost#35722 (draft) is now MERGEABLE/BLOCKED (was reported unknown yesterday).&lt;/p>
&lt;p>🟢 &lt;strong>Near-Ready (approved, CI green, MERGEABLE):&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>mattermost#36181&lt;/strong> — Strip debug symbols — APPROVED ✅, CI green (61 checks, 0 failing), MERGEABLE/CLEAN. ⚠️ 2 unresolved threads (JulienTant, gate stripping on &lt;code>MM_DEBUG&lt;/code>).&lt;/li>
&lt;/ul>
&lt;p>🟡 &lt;strong>Awaiting Review (CI green):&lt;/strong>&lt;/p></description></item><item><title>What Not to Do: Writing Go Tests That Survive Parallel Execution</title><link>https://mmworkbrain.pages.dev/docs/blog-drafts/go-parallel-test-pitfalls/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://mmworkbrain.pages.dev/docs/blog-drafts/go-parallel-test-pitfalls/</guid><description>&lt;p>When we set out to &lt;a href="https://mattermost.atlassian.net/wiki/spaces/pde/pages/4413882370/Why+Server+CI+Is+4x+Faster+Now+and+What+Broke+Along+the+Way">re-enable test coverage with sharding&lt;/a> on our server CI, we hit a wall within minutes: 45 tests crashed — not failed, &lt;em>crashed&lt;/em> — taking down the entire test binary for the package. The culprit was a single line of code that&amp;rsquo;s perfectly fine in serial tests but lethal under parallel execution.&lt;/p>
&lt;p>This post catalogues what we learned about writing Go tests that work in parallel mode, drawn from debugging real failures across our 16,000-test codebase.&lt;/p></description></item><item><title>Salesforce UTM Campaigns Over the Years</title><link>https://mmworkbrain.pages.dev/docs/marketing/sfdc-utm-campaigns-over-the-years/</link><pubDate>Thu, 15 Oct 2026 00:00:00 +0000</pubDate><guid>https://mmworkbrain.pages.dev/docs/marketing/sfdc-utm-campaigns-over-the-years/</guid><description>&lt;p>Lead counts by UTM campaign value, grouped by year, from Salesforce. 23,809 leads across 11 years (2016 to 2026).&lt;/p>
&lt;p>&lt;strong>Provenance:&lt;/strong> These figures were pasted in from a separate analysis. I did not run the query and have not verified the numbers. The Salesforce field used for the campaign value, the field used to assign the year (likely created date), and the query date are not stated. Only the per-year lead totals were checked: they sum to 23,809.&lt;/p></description></item><item><title>CI Pipeline Analysis: mattermost/mattermost</title><link>https://mmworkbrain.pages.dev/docs/ci/ci-analysis-mattermost-server/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://mmworkbrain.pages.dev/docs/ci/ci-analysis-mattermost-server/</guid><description>&lt;p>&lt;em>Last updated: 2026-03-20 — based on actual YAML files from the mattermost/mattermost repository and real timing data from GitHub Actions API.&lt;/em>&lt;/p>
&lt;h2 id="1-workflow-inventory">1. Workflow Inventory&lt;/h2>
&lt;p>The repository contains &lt;strong>31 workflow YAML files&lt;/strong> in &lt;code>.github/workflows/&lt;/code>. Here is a complete inventory:&lt;/p>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>#&lt;/th>
 &lt;th>File&lt;/th>
 &lt;th>Name&lt;/th>
 &lt;th>Triggers&lt;/th>
 &lt;th>Purpose&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>1&lt;/td>
 &lt;td>&lt;code>api.yml&lt;/code>&lt;/td>
 &lt;td>API&lt;/td>
 &lt;td>push(master), pull_request&lt;/td>
 &lt;td>Builds OpenAPI spec in &lt;code>api/&lt;/code> dir&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>2&lt;/td>
 &lt;td>&lt;code>build-opensearch-image.yml&lt;/code>&lt;/td>
 &lt;td>Opensearch Docker Image&lt;/td>
 &lt;td>push(master) when Dockerfile changes&lt;/td>
 &lt;td>Builds/pushes opensearch 2.7.0 image&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>3&lt;/td>
 &lt;td>&lt;code>build-server-image.yml&lt;/code>&lt;/td>
 &lt;td>BuildEnv Docker Image&lt;/td>
 &lt;td>push(master), PR, workflow_dispatch when Dockerfiles change&lt;/td>
 &lt;td>Builds/tests/pushes build-server and build-server-fips Docker images&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>4&lt;/td>
 &lt;td>&lt;code>claude.yml&lt;/code>&lt;/td>
 &lt;td>Claude Code&lt;/td>
 &lt;td>issue_comment, PR review comment, issues, PR review&lt;/td>
 &lt;td>AI assistant for @claude mentions&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>5&lt;/td>
 &lt;td>&lt;code>codeql-analysis.yml&lt;/code>&lt;/td>
 &lt;td>CodeQL&lt;/td>
 &lt;td>PR(master), schedule(30 5,17 * * *)&lt;/td>
 &lt;td>Security scanning for Go and JavaScript&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>6&lt;/td>
 &lt;td>&lt;code>docker-push-mirrored.yml&lt;/code>&lt;/td>
 &lt;td>Push mirrored docker images&lt;/td>
 &lt;td>push(master) when mirror scripts change&lt;/td>
 &lt;td>Mirrors Docker images&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>7&lt;/td>
 &lt;td>&lt;code>docs-impact-review.yml&lt;/code>&lt;/td>
 &lt;td>Docs Impact Review&lt;/td>
 &lt;td>pull_request&lt;/td>
 &lt;td>AI-powered docs impact analysis via Claude&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>8&lt;/td>
 &lt;td>&lt;code>e2e-fulltests-ci.yml&lt;/code>&lt;/td>
 &lt;td>E2E Tests&lt;/td>
 &lt;td>workflow_dispatch&lt;/td>
 &lt;td>Full E2E test orchestrator (Cypress + Playwright), triggered by Argo Events&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>9&lt;/td>
 &lt;td>&lt;code>e2e-tests-check.yml&lt;/code>&lt;/td>
 &lt;td>E2E Tests Check&lt;/td>
 &lt;td>PR when e2e-tests/&lt;strong>, webapp/platform/client/&lt;/strong>, etc. change&lt;/td>
 &lt;td>Lint/typecheck E2E tests, trigger E2E runs for E2E-only PRs&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>10&lt;/td>
 &lt;td>&lt;code>e2e-tests-ci-template.yml&lt;/code>&lt;/td>
 &lt;td>E2E Tests Template&lt;/td>
 &lt;td>workflow_call&lt;/td>
 &lt;td>&lt;strong>Legacy&lt;/strong> reusable E2E template (used by e2e-fulltests-ci.yml)&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>11&lt;/td>
 &lt;td>&lt;code>e2e-tests-ci.yml&lt;/code>&lt;/td>
 &lt;td>E2E Tests (pull request)&lt;/td>
 &lt;td>workflow_dispatch&lt;/td>
 &lt;td>PR E2E test orchestrator — resolves PR, checks file changes, calls Cypress + Playwright&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>12&lt;/td>
 &lt;td>&lt;code>e2e-tests-cypress-template.yml&lt;/code>&lt;/td>
 &lt;td>E2E Tests - Cypress Template&lt;/td>
 &lt;td>workflow_call&lt;/td>
 &lt;td>Reusable Cypress E2E template with retries, reporting, sharding&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>13&lt;/td>
 &lt;td>&lt;code>e2e-tests-cypress.yml&lt;/code>&lt;/td>
 &lt;td>E2E Tests - Cypress&lt;/td>
 &lt;td>workflow_call&lt;/td>
 &lt;td>Cypress E2E entry point — runs &amp;ldquo;full&amp;rdquo; tests with 40 workers&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>14&lt;/td>
 &lt;td>&lt;code>e2e-tests-on-merge.yml&lt;/code>&lt;/td>
 &lt;td>E2E Tests (master/release - merge)&lt;/td>
 &lt;td>workflow_dispatch&lt;/td>
 &lt;td>Post-merge E2E: enterprise + FIPS editions, Cypress + Playwright&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>15&lt;/td>
 &lt;td>&lt;code>e2e-tests-on-release.yml&lt;/code>&lt;/td>
 &lt;td>E2E Tests (release cut)&lt;/td>
 &lt;td>workflow_dispatch&lt;/td>
 &lt;td>Release E2E: enterprise + FIPS editions from &lt;code>mattermost/&lt;/code> registry&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>16&lt;/td>
 &lt;td>&lt;code>e2e-tests-override-status.yml&lt;/code>&lt;/td>
 &lt;td>E2E Tests - Override Status&lt;/td>
 &lt;td>workflow_dispatch&lt;/td>
 &lt;td>Manual override of failed E2E status checks&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>17&lt;/td>
 &lt;td>&lt;code>e2e-tests-playwright-template.yml&lt;/code>&lt;/td>
 &lt;td>E2E Tests - Playwright Template&lt;/td>
 &lt;td>workflow_call&lt;/td>
 &lt;td>Reusable Playwright template with sharding, S3 upload, retries&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>18&lt;/td>
 &lt;td>&lt;code>e2e-tests-playwright.yml&lt;/code>&lt;/td>
 &lt;td>E2E Tests - Playwright&lt;/td>
 &lt;td>workflow_call&lt;/td>
 &lt;td>Playwright E2E entry point — runs &amp;ldquo;full&amp;rdquo; tests with 4 shards&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>19&lt;/td>
 &lt;td>&lt;code>e2e-tests-verified-label.yml&lt;/code>&lt;/td>
 &lt;td>E2E Tests/verified&lt;/td>
 &lt;td>PR labeled&lt;/td>
 &lt;td>Override failed E2E checks via &lt;code>E2E Tests/verified&lt;/code> label&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>20&lt;/td>
 &lt;td>&lt;code>i18n-ci-pr.yml&lt;/code>&lt;/td>
 &lt;td>i18n CI PR&lt;/td>
 &lt;td>PR when i18n files change&lt;/td>
 &lt;td>Checks only English translation files changed (non-weblate PRs)&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>21&lt;/td>
 &lt;td>&lt;code>i18n-ci-template.yml&lt;/code>&lt;/td>
 &lt;td>i18n CI Template&lt;/td>
 &lt;td>workflow_call&lt;/td>
 &lt;td>Template for i18n checks&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>22&lt;/td>
 &lt;td>&lt;code>mmctl-test-template.yml&lt;/code>&lt;/td>
 &lt;td>mmctl CI&lt;/td>
 &lt;td>workflow_call&lt;/td>
 &lt;td>Reusable mmctl test template (docker-based)&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>23&lt;/td>
 &lt;td>&lt;code>scorecards-analysis.yml&lt;/code>&lt;/td>
 &lt;td>Scorecards&lt;/td>
 &lt;td>branch_protection_rule, schedule(44 6 * * *)&lt;/td>
 &lt;td>OSSF Scorecard supply-chain security&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>24&lt;/td>
 &lt;td>&lt;code>sentry.yaml&lt;/code>&lt;/td>
 &lt;td>Sentry Upload&lt;/td>
 &lt;td>workflow_run(Server CI completed)&lt;/td>
 &lt;td>Creates Sentry release on Server CI completion&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>25&lt;/td>
 &lt;td>&lt;code>server-ci-artifacts.yml&lt;/code>&lt;/td>
 &lt;td>Server CI Artifacts&lt;/td>
 &lt;td>workflow_run(Server CI completed)&lt;/td>
 &lt;td>Uploads artifacts to S3, builds Docker image, Wiz security scan&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>26&lt;/td>
 &lt;td>&lt;code>server-ci-report.yml&lt;/code>&lt;/td>
 &lt;td>Server CI Report&lt;/td>
 &lt;td>workflow_run(Server CI completed)&lt;/td>
 &lt;td>Publishes JUnit test reports, comments flaky tests on PRs&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>27&lt;/td>
 &lt;td>&lt;strong>&lt;code>server-ci.yml&lt;/code>&lt;/strong>&lt;/td>
 &lt;td>&lt;strong>Server CI&lt;/strong>&lt;/td>
 &lt;td>&lt;strong>push(master, release-*), PR(server/&lt;/strong>)**&lt;/td>
 &lt;td>&lt;strong>Main server CI: lint, tests, build — THE critical workflow&lt;/strong>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>28&lt;/td>
 &lt;td>&lt;code>server-test-template.yml&lt;/code>&lt;/td>
 &lt;td>Server Test Template&lt;/td>
 &lt;td>workflow_call&lt;/td>
 &lt;td>Reusable server Go test template&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>29&lt;/td>
 &lt;td>&lt;code>tag-public-module.yaml&lt;/code>&lt;/td>
 &lt;td>Tag Public Module&lt;/td>
 &lt;td>workflow_dispatch&lt;/td>
 &lt;td>Tags &lt;code>server/public&lt;/code> module with semver&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>30&lt;/td>
 &lt;td>&lt;code>webapp-ci.yml&lt;/code>&lt;/td>
 &lt;td>Web App CI&lt;/td>
 &lt;td>push(master, release-*), PR(webapp/**)&lt;/td>
 &lt;td>Webapp lint, typecheck, tests (sharded), build, coverage&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;h2 id="2-job-catalog">2. Job Catalog&lt;/h2>
&lt;h3 id="21-server-ci-server-ciyml--the-critical-path">2.1 Server CI (&lt;code>server-ci.yml&lt;/code>) — The Critical Path&lt;/h3>
&lt;p>&lt;strong>Triggers:&lt;/strong> &lt;code>push&lt;/code> to master/release-*, &lt;code>pull_request&lt;/code> on server/** paths.&lt;/p></description></item><item><title>Code Review Checklist</title><link>https://mmworkbrain.pages.dev/docs/processes/code-review-checklist/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://mmworkbrain.pages.dev/docs/processes/code-review-checklist/</guid><description>&lt;h2 id="before-writing-code">Before Writing Code&lt;/h2>
&lt;ul>
&lt;li>&lt;input disabled="" type="checkbox"> &lt;code>grep -rn&lt;/code> the codebase for the pattern you&amp;rsquo;re fixing — fix ALL occurrences, not just the one you found&lt;/li>
&lt;li>&lt;input disabled="" type="checkbox"> Check real API contracts for every input: does it throw, return null, coerce, or silently succeed?&lt;/li>
&lt;li>&lt;input disabled="" type="checkbox"> Understand the type system: identify all enum variants and type union members before writing logic&lt;/li>
&lt;/ul>
&lt;h2 id="production-code">Production Code&lt;/h2>
&lt;ul>
&lt;li>&lt;input disabled="" type="checkbox"> Use exhaustive &lt;code>when&lt;/code>/&lt;code>switch&lt;/code> on enums and type unions — no &lt;code>else&lt;/code> catch-alls that assume a type&lt;/li>
&lt;li>&lt;input disabled="" type="checkbox"> Every error return/throw gets a &lt;strong>unique&lt;/strong> detail string — never reuse the same message for different failure modes&lt;/li>
&lt;li>&lt;input disabled="" type="checkbox"> Defensive nil/null checks at trust boundaries&lt;/li>
&lt;li>&lt;input disabled="" type="checkbox"> No silent swallowing of unexpected cases&lt;/li>
&lt;/ul>
&lt;h2 id="tests">Tests&lt;/h2>
&lt;ul>
&lt;li>&lt;input disabled="" type="checkbox"> Test the &lt;strong>actual function&lt;/strong>, not a copy of its logic&lt;/li>
&lt;li>&lt;input disabled="" type="checkbox"> If a test helper mirrors production code (e.g., coroutine callback), document it and note it must stay in sync&lt;/li>
&lt;li>&lt;input disabled="" type="checkbox"> Mocks match real behavior: verify what the real API does for each input before mocking&lt;/li>
&lt;li>&lt;input disabled="" type="checkbox"> Cover &lt;strong>all&lt;/strong> type/enum variants, not just the happy path&lt;/li>
&lt;/ul>
&lt;h2 id="ci--shell-scripts">CI / Shell Scripts&lt;/h2>
&lt;ul>
&lt;li>&lt;input disabled="" type="checkbox"> Run the full script locally under &lt;code>set -euo pipefail&lt;/code> before pushing — no experimenting in CI&lt;/li>
&lt;li>&lt;input disabled="" type="checkbox"> Initialize all arrays with &lt;code>=()&lt;/code> to avoid &amp;ldquo;unbound variable&amp;rdquo; under &lt;code>set -u&lt;/code>&lt;/li>
&lt;li>&lt;input disabled="" type="checkbox"> Test with empty inputs and empty arrays&lt;/li>
&lt;li>&lt;input disabled="" type="checkbox"> Escape shell metacharacters in variables&lt;/li>
&lt;li>&lt;input disabled="" type="checkbox"> YAML-parse workflow files — don&amp;rsquo;t hand-edit complex YAML blindly&lt;/li>
&lt;/ul>
&lt;h2 id="pr-submission">PR Submission&lt;/h2>
&lt;ul>
&lt;li>&lt;input disabled="" type="checkbox"> Sentry impact summary at the top of the PR description&lt;/li>
&lt;li>&lt;input disabled="" type="checkbox"> Include a &lt;code>release-note:&lt;/code> block where required&lt;/li>
&lt;li>&lt;input disabled="" type="checkbox"> No fork migration mentions — employees push to org branches&lt;/li>
&lt;li>&lt;input disabled="" type="checkbox"> No internal/private URLs in public-facing text&lt;/li>
&lt;/ul></description></item><item><title>Proposed Plan: Rebooting Advertising, Lead Capture and Attribution</title><link>https://mmworkbrain.pages.dev/docs/marketing/proposed-plan-going-forward/</link><pubDate>Thu, 15 Oct 2026 00:00:00 +0000</pubDate><guid>https://mmworkbrain.pages.dev/docs/marketing/proposed-plan-going-forward/</guid><description>&lt;p>&lt;strong>Status:&lt;/strong> Proposal for review. Draft dated 2026-10-15.
&lt;strong>Scope:&lt;/strong> Google Ads and Microsoft (Bing) Ads, the mattermost.com website and landing pages, Marketo (migrating to Pardot by December 2026), Salesforce, and the reporting layer.
&lt;strong>Premise:&lt;/strong> We are willing to discard the current setup and rebuild it. Historical data is archived, not migrated as-is.&lt;/p>
&lt;p>Pardot is now sold as Marketing Cloud Account Engagement. This document says &amp;ldquo;Pardot&amp;rdquo; throughout, as the team does.&lt;/p>
&lt;hr>
&lt;h2 id="1-why-we-are-doing-this">1. Why we are doing this&lt;/h2>
&lt;p>Evidence from the three analyses in this folder (&lt;code>best-practices.md&lt;/code>, &lt;code>sfdc-utm-campaigns-over-the-years.md&lt;/code>, &lt;code>marketo-sfdc-configuration-issues.md&lt;/code>). The Marketo export figures cover Sept 1 to Oct 15, 2026. The Salesforce findings come from a pasted analysis I could not verify.&lt;/p></description></item><item><title>Server Test Sharding Analysis</title><link>https://mmworkbrain.pages.dev/docs/ci/ci-test-sharding-analysis/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://mmworkbrain.pages.dev/docs/ci/ci-test-sharding-analysis/</guid><description>&lt;p>&lt;em>Last updated: 2026-03-23 — includes benchmark results from live CI runs with per-test sharding.&lt;/em>&lt;/p>
&lt;h2 id="context-why-are-we-back-at-60-minutes">Context: Why Are We Back at 60 Minutes?&lt;/h2>
&lt;p>In late 2025, Claudio&amp;rsquo;s team shipped &lt;a href="https://mattermost.com/blog/cutting-test-runtime-by-60-with-selective-parallelism-in-go/">selective parallelism&lt;/a> — enabling &lt;code>t.Parallel()&lt;/code> within the heaviest packages (&lt;code>api4&lt;/code>, &lt;code>app&lt;/code>) and adding a DB connection pool to support concurrent test execution. This cut test runtime from ~40 min to ~15 min.&lt;/p>
&lt;p>&lt;strong>However, that improvement was only applied to the coverage job&lt;/strong> (&lt;code>test-coverage&lt;/code> with &lt;code>fullyparallel: true&lt;/code> and &lt;code>continue-on-error: true&lt;/code>). The main PR-blocking test job (&lt;code>test-postgres-normal&lt;/code>) still runs with &lt;code>fullyparallel: false&lt;/code> — meaning all tests within a package execute serially, and we&amp;rsquo;re back at ~60 min.&lt;/p></description></item><item><title>mmworkbrain Workflow — Full Setup Guide</title><link>https://mmworkbrain.pages.dev/docs/shared/mmworkbrain-workflow/</link><pubDate>Tue, 06 Oct 2026 00:00:00 +0000</pubDate><guid>https://mmworkbrain.pages.dev/docs/shared/mmworkbrain-workflow/</guid><description>&lt;p>This documents every piece of the mmworkbrain knowledge base — from repo structure to deployment — so anyone can replicate it from scratch.&lt;/p>
&lt;h2 id="overview">Overview&lt;/h2>
&lt;p>mmworkbrain is a Hugo static site using the Google Docsy theme, deployed automatically to Cloudflare Pages on every push to &lt;code>main&lt;/code>. The site is optionally protected by Cloudflare Zero Trust (Access) for controlled visibility.&lt;/p>
&lt;p>&lt;strong>Stack:&lt;/strong> GitHub (source) → Cloudflare Pages (build + host) → Cloudflare Access (auth)&lt;/p></description></item><item><title>Code Coverage Investment Strategy</title><link>https://mmworkbrain.pages.dev/docs/ci/code-coverage-investment-strategy/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://mmworkbrain.pages.dev/docs/ci/code-coverage-investment-strategy/</guid><description>&lt;p>Analysis of server test coverage data from PR #35743, identifying the highest-impact opportunities to improve coverage with the least effort.&lt;/p>
&lt;h2 id="current-state">Current State&lt;/h2>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Metric&lt;/th>
 &lt;th>Value&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>&lt;strong>Total statements (after exclusions)&lt;/strong>&lt;/td>
 &lt;td>228,191&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>Covered statements&lt;/strong>&lt;/td>
 &lt;td>69,628&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>Overall coverage&lt;/strong>&lt;/td>
 &lt;td>&lt;strong>30.5%&lt;/strong>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>Excluded (generated/test infra)&lt;/strong>&lt;/td>
 &lt;td>49,908 statements&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>Exclusions: &lt;code>store/retrylayer&lt;/code>, &lt;code>store/timerlayer&lt;/code>, &lt;code>store/storetest&lt;/code>, &lt;code>**/mocks&lt;/code>, &lt;code>*_serial_gen.go&lt;/code>, &lt;code>plugin/plugintest&lt;/code>, &lt;code>mmctl/mocks&lt;/code>, &lt;code>model/client4.go&lt;/code>.&lt;/p>
&lt;h2 id="the-big-picture">The Big Picture&lt;/h2>
&lt;p>Two packages alone — &lt;code>channels/app&lt;/code> and &lt;code>channels/api4&lt;/code> — account for &lt;strong>134,808 uncovered statements&lt;/strong>, or &lt;strong>85%&lt;/strong> of the gap between 30.5% and 100%. Getting just these two packages to 50% coverage would push the overall number from 30.5% to &lt;strong>52.2%&lt;/strong>.&lt;/p></description></item><item><title>Go 1.25 Race Condition: Deep Analysis</title><link>https://mmworkbrain.pages.dev/docs/investigations/go125-race-condition-analysis/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://mmworkbrain.pages.dev/docs/investigations/go125-race-condition-analysis/</guid><description>&lt;p>Technical analysis of the master CI breakage caused by Go 1.25, why the first fix failed, and why the second fix should work.&lt;/p>
&lt;h2 id="timeline">Timeline&lt;/h2>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Time (UTC)&lt;/th>
 &lt;th>Event&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>Mar 27 19:34&lt;/td>
 &lt;td>Last green master CI (run 23664056808)&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Mar 27 20:11&lt;/td>
 &lt;td>&lt;strong>PR #35817 merges&lt;/strong> — Go 1.24 → 1.25.8&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Mar 27 20:11&lt;/td>
 &lt;td>First failed master CI (run 23665493896)&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Mar 27–31&lt;/td>
 &lt;td>&lt;strong>9 consecutive failures&lt;/strong>, 0% pass rate&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Mar 31 15:32&lt;/td>
 &lt;td>PR #35881 merges — first fix attempt&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Mar 31 15:32&lt;/td>
 &lt;td>Master CI still fails (run 23805732245)&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Mar 31 16:49&lt;/td>
 &lt;td>&lt;strong>PR #35891 opened&lt;/strong> — second fix attempt&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>Before Go 1.25: 22/23 green runs (96% pass rate) over 3 days.&lt;/p></description></item><item><title>Security Issue: GitHub Actions persist-credentials</title><link>https://mmworkbrain.pages.dev/docs/security/security-persist-credentials/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://mmworkbrain.pages.dev/docs/security/security-persist-credentials/</guid><description>&lt;h2 id="summary">Summary&lt;/h2>
&lt;p>The &lt;code>mattermost/mattermost&lt;/code> repository&amp;rsquo;s GitHub Actions workflows leave the &lt;code>GITHUB_TOKEN&lt;/code> persisted in the Git configuration (&lt;code>.git/config&lt;/code>) throughout workflow runs. This is the default behavior of &lt;code>actions/checkout&lt;/code> and represents a &lt;strong>supply-chain attack surface&lt;/strong> — any step running after checkout (including third-party actions) can read and exfiltrate the token.&lt;/p>
&lt;p>&lt;strong>Severity:&lt;/strong> Medium (credential exposure via supply-chain compromise)
&lt;strong>Effort to fix:&lt;/strong> Low (one-line change per checkout step)
&lt;strong>Risk of fix:&lt;/strong> Very low (no functional change unless a step explicitly needs Git push access)&lt;/p></description></item><item><title>mm-certification-platform: Security Findings Response</title><link>https://mmworkbrain.pages.dev/docs/security/mm-cert-security-findings/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://mmworkbrain.pages.dev/docs/security/mm-cert-security-findings/</guid><description>&lt;p>&lt;strong>Review date:&lt;/strong> 2026-03-25
&lt;strong>Reviewer:&lt;/strong> External security team
&lt;strong>Platform:&lt;/strong> mm-certification-platform (Mattermost Certification Lab)
&lt;strong>Commits:&lt;/strong> &lt;a href="https://github.com/mattermost/mm-certification-platform/commit/81dbb50">81dbb50&lt;/a> · &lt;a href="https://github.com/mattermost/mm-certification-platform/commit/5e1008d">5e1008d&lt;/a>&lt;/p>
&lt;hr>
&lt;h2 id="summary">Summary&lt;/h2>
&lt;p>The security review identified &lt;strong>31 findings&lt;/strong> across four severity levels.&lt;/p>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Severity&lt;/th>
 &lt;th>Count&lt;/th>
 &lt;th>Fixed&lt;/th>
 &lt;th>Pending decision / manual&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>Critical&lt;/td>
 &lt;td>5&lt;/td>
 &lt;td>4&lt;/td>
 &lt;td>1&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>High&lt;/td>
 &lt;td>5&lt;/td>
 &lt;td>4&lt;/td>
 &lt;td>1&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Medium&lt;/td>
 &lt;td>15&lt;/td>
 &lt;td>13&lt;/td>
 &lt;td>2&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Low&lt;/td>
 &lt;td>6&lt;/td>
 &lt;td>3&lt;/td>
 &lt;td>3&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;blockquote>
&lt;p>&lt;strong>Fix complexity (per finding):&lt;/strong> 🟢 Simple (&amp;lt; 10 lines, single file) · 🟡 Medium (multi-file or logic change) · 🔴 Complex (cross-module refactor or design change)&lt;/p></description></item><item><title>Mobile Observability Audit &amp; Strategy v2</title><link>https://mmworkbrain.pages.dev/docs/shared/mobile-observability-audit-2026-09-v2/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://mmworkbrain.pages.dev/docs/shared/mobile-observability-audit-2026-09-v2/</guid><description>&lt;p>&lt;em>September 20, 2026 · Updated after reviewing Sentry Mobile Vitals + Grafana/Prometheus data&lt;/em>&lt;/p>
&lt;p>&lt;em>Previous version: &lt;a href="../mobile-observability-audit-2026-09/">v1&lt;/a> (September 19, 2026)&lt;/em>&lt;/p>
&lt;h2 id="what-changed-since-v1">What Changed Since v1&lt;/h2>
&lt;p>v1 was based on code analysis and API queries. v2 incorporates &lt;strong>hands-on review of actual dashboards&lt;/strong>:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Grafana/Prometheus&lt;/strong> — Server-side client performance metrics (&lt;code>/api/v4/client_perf&lt;/code> pipeline)&lt;/li>
&lt;li>&lt;strong>Sentry Mobile Vitals&lt;/strong> — Native app start times, frame rates, crash-free rates (90-day window)&lt;/li>
&lt;/ol>
&lt;p>The core thesis of v1 is confirmed: &lt;strong>we have a massive instrumentation gap between what Sentry measures and what users experience.&lt;/strong> But now we can quantify it.&lt;/p></description></item><item><title>Mobile Observability Audit &amp; Strategy v3</title><link>https://mmworkbrain.pages.dev/docs/shared/mobile-observability-audit-2026-09-v3/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://mmworkbrain.pages.dev/docs/shared/mobile-observability-audit-2026-09-v3/</guid><description>&lt;p>&lt;em>September 20, 2026 · Updated with contributor attribution, Grafana coverage analysis, and fast-iteration strategy&lt;/em>&lt;/p>
&lt;p>&lt;em>Previous versions: &lt;a href="../mobile-observability-audit-2026-09/">v1&lt;/a> · &lt;a href="../mobile-observability-audit-2026-09-v2/">v2&lt;/a>&lt;/em>&lt;/p>
&lt;h2 id="what-changed-since-v2">What Changed Since v2&lt;/h2>
&lt;p>v3 addresses three questions:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Who built the homegrown telemetry?&lt;/strong> — Full contributor attribution for the Prometheus/Grafana pipeline&lt;/li>
&lt;li>&lt;strong>Is the Grafana dashboard showing everything?&lt;/strong> — Analysis of what&amp;rsquo;s actually collected vs. what&amp;rsquo;s displayed&lt;/li>
&lt;li>&lt;strong>How to iterate faster than the monthly release cycle?&lt;/strong> — Beta/TestFlight strategy for rapid validation&lt;/li>
&lt;/ol>
&lt;hr>
&lt;h2 id="1-who-built-the-homegrown-telemetry-infrastructure">1. Who Built the Homegrown Telemetry Infrastructure&lt;/h2>
&lt;p>The custom performance telemetry pipeline (mobile → &lt;code>/api/v4/client_perf&lt;/code> → Prometheus → Grafana) was built by a small group across server, webapp, and mobile. Here&amp;rsquo;s the full attribution:&lt;/p></description></item><item><title>Large Scope PRs</title><link>https://mmworkbrain.pages.dev/docs/reviews/large-scope-prs/</link><pubDate>Thu, 24 Sep 2026 00:00:00 +0000</pubDate><guid>https://mmworkbrain.pages.dev/docs/reviews/large-scope-prs/</guid><description>&lt;p>&lt;strong>Author:&lt;/strong> harshilsharma63
&lt;strong>Date:&lt;/strong> September 24, 2026
&lt;strong>Prepared by:&lt;/strong> Tommy ⚙️&lt;/p>
&lt;hr>
&lt;h2 id="executive-summary">Executive Summary&lt;/h2>
&lt;p>Harshil has &lt;strong>11 open PRs&lt;/strong> across 5 repos implementing ABAC (Attribute-Based Access Control) channel permissions. The work spans two features — &lt;strong>Channel Read Access&lt;/strong> (earlier) and &lt;strong>Channel Write Access&lt;/strong> (newer) — delivered in two iterations each, with the earlier iterations appearing superseded but not closed. The largest PR touches &lt;strong>83 files with ~4,400 changed lines&lt;/strong>.&lt;/p>
&lt;p>The core concern: the implementation spreads enforcement checks across dozens of individual API handlers rather than using middleware, creating a large review surface and ongoing maintenance burden.&lt;/p></description></item><item><title>iOS SQLite Background Crash Analysis (0xdead10cc)</title><link>https://mmworkbrain.pages.dev/docs/investigations/ios-sqlite-background-crashes-2026-09/</link><pubDate>Thu, 10 Sep 2026 00:00:00 +0000</pubDate><guid>https://mmworkbrain.pages.dev/docs/investigations/ios-sqlite-background-crashes-2026-09/</guid><description>&lt;h2 id="summary">Summary&lt;/h2>
&lt;p>The Mattermost iOS app suffers from ~188,000 crash events across Sentry related to SQLite database lock contention during iOS background/suspension transitions. PR &lt;a href="https://github.com/mattermost/mattermost-mobile/pull/10110">mattermost-mobile#10110&lt;/a> fixes the main app process, but the &lt;strong>Notification Service Extension (Gekidou)&lt;/strong> accounts for ~94% of these crashes and remains unprotected.&lt;/p>
&lt;h2 id="the-crash-mechanism-0xdead10cc">The Crash Mechanism: &lt;code>0xdead10cc&lt;/code>&lt;/h2>
&lt;p>When iOS suspends an app (or extension), it checks whether the process holds any file locks. If a SQLite WAL/shared lock is held on the App Group database at the moment of suspension, iOS terminates the process with exception code &lt;code>0xdead10cc&lt;/code> (&amp;ldquo;dead lock&amp;rdquo;) via the RUNNINGBOARD subsystem.&lt;/p></description></item><item><title>GitHub Actions Cache &amp; Queue Time Analysis</title><link>https://mmworkbrain.pages.dev/docs/infrastructure/github-actions-cache-queue-analysis/</link><pubDate>Fri, 10 Apr 2026 00:00:00 +0000</pubDate><guid>https://mmworkbrain.pages.dev/docs/infrastructure/github-actions-cache-queue-analysis/</guid><description>&lt;p>Analysis of GitHub Actions cache utilization and job queue delays across Mattermost repositories, conducted April 10, 2026.&lt;/p>
&lt;h2 id="executive-summary">Executive Summary&lt;/h2>
&lt;ul>
&lt;li>&lt;strong>Cache pressure&lt;/strong>: Both &lt;code>mattermost/mattermost&lt;/code> (10.3 GB) and &lt;code>mattermost/mattermost-mobile&lt;/code> (10.0 GB) are near or at their per-repo 10 GB cache limits. Org-level 50 GB limit likely saturated across all repos.&lt;/li>
&lt;li>&lt;strong>Queue delays&lt;/strong>: Standard 2-core runners show zero queuing. &lt;strong>8-core runners (&lt;code>ubuntu-latest-8-cores&lt;/code>) regularly queue for 5-22 minutes&lt;/strong> when Server CI runs overlap.&lt;/li>
&lt;li>&lt;strong>Root causes&lt;/strong>: Per-branch cache duplication, stale build branches (168 in mobile), tag caches that are never reused, and limited 8-core runner concurrency.&lt;/li>
&lt;/ul>
&lt;h2 id="cache-analysis">Cache Analysis&lt;/h2>
&lt;h3 id="mattermostmattermost">mattermost/mattermost&lt;/h3>
&lt;p>&lt;strong>10.3 GB across 48 caches&lt;/strong>&lt;/p></description></item><item><title>Playbooks Improvements POC — PR #2222 Analysis</title><link>https://mmworkbrain.pages.dev/docs/investigations/playbooks-improvements-poc-pr-2222/</link><pubDate>Fri, 10 Apr 2026 00:00:00 +0000</pubDate><guid>https://mmworkbrain.pages.dev/docs/investigations/playbooks-improvements-poc-pr-2222/</guid><description>&lt;p>Analysis of &lt;a href="https://github.com/mattermost/mattermost-plugin-playbooks/pull/2222">PR #2222&lt;/a> — &amp;ldquo;Playbooks Improvements - POC&amp;rdquo; by @catalintomai. &lt;em>Analyzed: 2026-04-10&lt;/em>&lt;/p>
&lt;h2 id="size">Size&lt;/h2>
&lt;ul>
&lt;li>&lt;strong>41,259 additions / 2,557 deletions across 264 files&lt;/strong>&lt;/li>
&lt;li>89 new files, 175 modified&lt;/li>
&lt;li>Created Mar 30, 2026 — 11 days old, actively updated (last: Apr 9)&lt;/li>
&lt;/ul>
&lt;h2 id="component-breakdown">Component Breakdown&lt;/h2>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Layer&lt;/th>
 &lt;th>Files&lt;/th>
 &lt;th>Notes&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>&lt;strong>webapp&lt;/strong>&lt;/td>
 &lt;td>119&lt;/td>
 &lt;td>UI components: checklists, backstage, modals, RHS, profile&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>server&lt;/strong>&lt;/td>
 &lt;td>77&lt;/td>
 &lt;td>App logic (47), API handlers (12), SQL store (8), tests&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>e2e-tests&lt;/strong>&lt;/td>
 &lt;td>62&lt;/td>
 &lt;td>Cypress integration tests&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>client&lt;/strong>&lt;/td>
 &lt;td>5&lt;/td>
 &lt;td>Go client library&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;h2 id="key-feature-areas">Key Feature Areas&lt;/h2>
&lt;ul>
&lt;li>&lt;strong>Condition-based actions&lt;/strong> — &lt;code>condition_service.go&lt;/code>, &lt;code>condition_actions_spec.js&lt;/code>&lt;/li>
&lt;li>&lt;strong>Task lockdown&lt;/strong> — &lt;code>task_lockdown.go&lt;/code>, &lt;code>task_lockdown_test.go&lt;/code>, &lt;code>task_lockdown_spec.js&lt;/code>&lt;/li>
&lt;li>&lt;strong>Creation rules&lt;/strong> — &lt;code>creation_rules.go&lt;/code>, &lt;code>creation_rules_test.go&lt;/code>&lt;/li>
&lt;li>&lt;strong>Role-based assignment&lt;/strong> — &lt;code>role_based_assignment_spec.js&lt;/code>&lt;/li>
&lt;li>&lt;strong>Playbook events&lt;/strong> — &lt;code>playbook_events.tsx&lt;/code> (1,058 lines new)&lt;/li>
&lt;li>&lt;strong>Template engine&lt;/strong> — &lt;code>template_engine_test.go&lt;/code> (729 lines new)&lt;/li>
&lt;li>&lt;strong>Property service improvements&lt;/strong> — &lt;code>property_service.go&lt;/code>, field rename cascade&lt;/li>
&lt;li>&lt;strong>Permissions overhaul&lt;/strong> — &lt;code>permissions_service.go&lt;/code> (+273/-16), &lt;code>permissions_service_test.go&lt;/code> (1,829 lines new)&lt;/li>
&lt;li>&lt;strong>Run creation enforcement&lt;/strong> — new validation and rules&lt;/li>
&lt;/ul>
&lt;h2 id="hotspots-largest-files">Hotspots (largest files)&lt;/h2>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>File&lt;/th>
 &lt;th>+Lines&lt;/th>
 &lt;th>Type&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>&lt;code>permissions_service_test.go&lt;/code>&lt;/td>
 &lt;td>1,829&lt;/td>
 &lt;td>New test file&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>playbook_run_service.go&lt;/code>&lt;/td>
 &lt;td>+1,756/-220&lt;/td>
 &lt;td>Core business logic, heavily modified&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>playbook_events.tsx&lt;/code>&lt;/td>
 &lt;td>1,058&lt;/td>
 &lt;td>New UI component&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>run_playbook_modal.test.tsx&lt;/code>&lt;/td>
 &lt;td>933&lt;/td>
 &lt;td>New webapp test&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>condition_actions_spec.js&lt;/code>&lt;/td>
 &lt;td>868&lt;/td>
 &lt;td>New E2E test&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;h2 id="test-coverage">Test Coverage&lt;/h2>
&lt;p>Significantly better than the Wiki POC. This PR has tests at every layer:&lt;/p></description></item><item><title>Wiki/Pages POC — PR #34607 Analysis</title><link>https://mmworkbrain.pages.dev/docs/investigations/wiki-pages-poc-pr-34607/</link><pubDate>Fri, 10 Apr 2026 00:00:00 +0000</pubDate><guid>https://mmworkbrain.pages.dev/docs/investigations/wiki-pages-poc-pr-34607/</guid><description>&lt;p>Analysis of &lt;a href="https://github.com/mattermost/mattermost/pull/34607">PR #34607&lt;/a> — &amp;ldquo;[Fast Futures] Wiki/Pages POC&amp;rdquo; by @catalintomai. &lt;em>Analyzed: 2026-04-10&lt;/em>&lt;/p>
&lt;h2 id="size">Size&lt;/h2>
&lt;ul>
&lt;li>&lt;strong>170,410 additions / 7,296 deletions across 704 files&lt;/strong> — one of the largest PRs in the repo&lt;/li>
&lt;li>Created Nov 27, 2025 — 4.5 months old at time of analysis&lt;/li>
&lt;/ul>
&lt;h2 id="component-breakdown">Component Breakdown&lt;/h2>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Area&lt;/th>
 &lt;th>Files&lt;/th>
 &lt;th>Notes&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>&lt;code>webapp/channels&lt;/code>&lt;/td>
 &lt;td>424&lt;/td>
 &lt;td>Bulk of the PR — full React UI for wiki/pages&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>e2e-tests/playwright&lt;/code>&lt;/td>
 &lt;td>78&lt;/td>
 &lt;td>Comprehensive E2E test suite&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>server/channels/app&lt;/code>&lt;/td>
 &lt;td>55&lt;/td>
 &lt;td>Business logic layer&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>server/channels/store&lt;/code>&lt;/td>
 &lt;td>34&lt;/td>
 &lt;td>Database layer (store interfaces + SQL)&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>server/public/model&lt;/code>&lt;/td>
 &lt;td>19&lt;/td>
 &lt;td>Data models&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>server/channels/db/migrations&lt;/code>&lt;/td>
 &lt;td>19&lt;/td>
 &lt;td>Database migrations&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>server/channels/api4&lt;/code>&lt;/td>
 &lt;td>17&lt;/td>
 &lt;td>REST API endpoints&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>webapp/platform&lt;/code>&lt;/td>
 &lt;td>13&lt;/td>
 &lt;td>Platform-level webapp changes&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>server/cmd/mmctl&lt;/code>&lt;/td>
 &lt;td>6&lt;/td>
 &lt;td>CLI support&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>e2e-tests/cypress&lt;/code>&lt;/td>
 &lt;td>5&lt;/td>
 &lt;td>Cypress E2E tests&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>api/&lt;/code>&lt;/td>
 &lt;td>4&lt;/td>
 &lt;td>OpenAPI spec (new &lt;code>wikis.yaml&lt;/code>)&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Other&lt;/td>
 &lt;td>30&lt;/td>
 &lt;td>Plugin API, metrics, Grafana dashboards, i18n, build scripts&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>This touches &lt;strong>every layer&lt;/strong> of the stack: API spec → REST handlers → app logic → store/SQL → migrations → models → plugin API → webapp UI → E2E tests → metrics/Grafana dashboards.&lt;/p></description></item><item><title>ARM64 Docker Image Feasibility Analysis</title><link>https://mmworkbrain.pages.dev/docs/infrastructure/arm64-docker-feasibility/</link><pubDate>Wed, 01 Apr 2026 00:00:00 +0000</pubDate><guid>https://mmworkbrain.pages.dev/docs/infrastructure/arm64-docker-feasibility/</guid><description>&lt;p>This document analyzes the feasibility and required work to add ARM64 support to Mattermost&amp;rsquo;s official Docker images, based on examination of the actual build infrastructure as of April 2026.&lt;/p>
&lt;h2 id="executive-summary">Executive Summary&lt;/h2>
&lt;p>&lt;strong>Feasibility: High — most of the groundwork already exists.&lt;/strong> The Mattermost server already builds and ships linux/arm64 binaries. The main Dockerfile uses multi-arch base images. Plugins already build for arm64. The primary work is in the Docker image build/push pipeline (adding &lt;code>--platform linux/arm64,linux/amd64&lt;/code> to buildx) and ensuring the &lt;code>MM_PACKAGE&lt;/code> URL resolves correctly for each architecture.&lt;/p></description></item><item><title>Team Email API Behavior Analysis</title><link>https://mmworkbrain.pages.dev/docs/investigations/team-email-api-behavior/</link><pubDate>Wed, 01 Apr 2026 00:00:00 +0000</pubDate><guid>https://mmworkbrain.pages.dev/docs/investigations/team-email-api-behavior/</guid><description>&lt;h2 id="summary">Summary&lt;/h2>
&lt;p>The team &lt;code>email&lt;/code> field is &lt;strong>silently server-controlled&lt;/strong> on both create and update. On create, it&amp;rsquo;s overridden with the creating user&amp;rsquo;s email. On update, it&amp;rsquo;s excluded from the sanitized allowlist. On read, it&amp;rsquo;s stripped entirely via &lt;code>Sanitize()&lt;/code>. The API accepts &lt;code>email&lt;/code> in the request body but ignores it — the worst possible behavior from an API design perspective.&lt;/p>
&lt;h2 id="create-path">Create Path&lt;/h2>
&lt;h3 id="api-handler--app--store">API Handler → App → Store&lt;/h3>
&lt;ol>
&lt;li>
&lt;p>&lt;strong>&lt;code>server/channels/api4/team.go:78&lt;/code>&lt;/strong> — &lt;code>createTeam&lt;/code> handler decodes the request body (including &lt;code>email&lt;/code>) and lowercases it (line 84: &lt;code>team.Email = strings.ToLower(team.Email)&lt;/code>). Then calls &lt;code>c.App.CreateTeamWithUser()&lt;/code>.&lt;/p></description></item><item><title>AWS Domain Inventory</title><link>https://mmworkbrain.pages.dev/docs/security/aws-domain-inventory/</link><pubDate>Tue, 24 Mar 2026 00:00:00 +0000</pubDate><guid>https://mmworkbrain.pages.dev/docs/security/aws-domain-inventory/</guid><description>&lt;p>Scan of all Route53 hosted zones across the Mattermost AWS org. Covers DNS resolution, HTTP liveness, subdomain counts, and cleanup recommendations. Raw data and script at &lt;a href="https://github.com/pavelzeman/aws-domains">pavelzeman/aws-domains&lt;/a>.&lt;/p>
&lt;h2 id="access-methodology">Access Methodology&lt;/h2>
&lt;p>This scan used two access paths due to IAM permission constraints:&lt;/p>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Layer&lt;/th>
 &lt;th>Method Used&lt;/th>
 &lt;th>Ideal Method&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>List org accounts&lt;/td>
 &lt;td>&lt;code>organizations:ListAccounts&lt;/code> from management account&lt;/td>
 &lt;td>Same — only root account can enumerate&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Cross-account Route53&lt;/td>
 &lt;td>&lt;strong>AWS Config aggregator&lt;/strong> (fallback)&lt;/td>
 &lt;td>Assume &lt;code>OrganizationAccountAccessRole&lt;/code> per member account from management account&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Registered domains&lt;/td>
 &lt;td>&lt;code>route53domains:ListDomains&lt;/code> from management account&lt;/td>
 &lt;td>Same — SCP blocks this on member accounts&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>&lt;strong>Why the ideal path failed:&lt;/strong> &lt;code>mattermost-mgmt-ro&lt;/code> (ReadOnlyAccess) lacks &lt;code>sts:AssumeRole&lt;/code>. &lt;code>122059300807_AWSAdministratorAccess&lt;/code> is a member account — it cannot enumerate the org or assume roles in sibling accounts.&lt;/p></description></item><item><title>CI Supply Chain Risk Analysis</title><link>https://mmworkbrain.pages.dev/docs/ci/ci-supply-chain-risk-analysis/</link><pubDate>Mon, 23 Mar 2026 00:00:00 +0000</pubDate><guid>https://mmworkbrain.pages.dev/docs/ci/ci-supply-chain-risk-analysis/</guid><description>&lt;p>Analysis of supply chain attack vectors in CI workflows across &lt;code>mattermost/mattermost&lt;/code> and &lt;code>mattermost/mattermost-mobile&lt;/code> repositories. Triggered by &lt;a href="https://github.com/mattermost/mattermost/pull/35738">a review comment&lt;/a> identifying that &lt;code>npx junit-report-merger@7&lt;/code> executes unverified code from npm at CI runtime.&lt;/p>
&lt;h2 id="executive-summary">Executive Summary&lt;/h2>
&lt;p>The &lt;strong>mattermost server repo&lt;/strong> has excellent GitHub Actions hygiene — all external actions are SHA-pinned — but introduces supply chain risk through &lt;strong>3 unpinned &lt;code>npx&lt;/code> calls&lt;/strong> that fetch and execute npm packages at CI runtime with no integrity verification.&lt;/p></description></item><item><title>CI Analysis: mattermost-mobile</title><link>https://mmworkbrain.pages.dev/docs/ci/ci-analysis-mattermost-mobile/</link><pubDate>Fri, 20 Mar 2026 00:00:00 +0000</pubDate><guid>https://mmworkbrain.pages.dev/docs/ci/ci-analysis-mattermost-mobile/</guid><description>&lt;p>&lt;strong>Run analyzed:&lt;/strong> &lt;a href="https://github.com/mattermost/mattermost-mobile/actions/runs/23360024337/job/67960616921?pr=9616">#23360024337&lt;/a> (PR #9616)&lt;br>
&lt;strong>Total wall time:&lt;/strong> ~11 minutes (19:51:19 → 20:02:28 UTC)&lt;br>
&lt;strong>Single job, fully sequential&lt;/strong> — no parallelism at all.&lt;/p>
&lt;h2 id="current-state-step-by-step-timing-breakdown">Current State: Step-by-Step Timing Breakdown&lt;/h2>
&lt;p>The workflow has &lt;strong>one job&lt;/strong> (&lt;code>test&lt;/code>) with two composite action steps running sequentially:&lt;/p>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Step&lt;/th>
 &lt;th>Duration&lt;/th>
 &lt;th>What it does&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>Set up job&lt;/td>
 &lt;td>~0.5s&lt;/td>
 &lt;td>Runner provisioning (Ubuntu 22.04)&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>ci/checkout-repo&lt;/td>
 &lt;td>~3s&lt;/td>
 &lt;td>Shallow clone (&lt;code>depth=1&lt;/code>) — fast ✅&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>ci/test&lt;/strong>&lt;/td>
 &lt;td>&lt;strong>2m 38s&lt;/strong>&lt;/td>
 &lt;td>Lint + typecheck (see breakdown below)&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>ci/test-coverage&lt;/strong>&lt;/td>
 &lt;td>&lt;strong>8m 9s&lt;/strong>&lt;/td>
 &lt;td>Jest with coverage (see breakdown below)&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Post steps&lt;/td>
 &lt;td>~14s&lt;/td>
 &lt;td>Cache save, cleanup&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;h3 id="citest-breakdown-2m-38s">ci/test breakdown (2m 38s)&lt;/h3>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Sub-step&lt;/th>
 &lt;th>Duration&lt;/th>
 &lt;th>Notes&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>setup-node&lt;/td>
 &lt;td>~4s&lt;/td>
 &lt;td>Downloads Node 22.14.0&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>npm cache restore&lt;/td>
 &lt;td>~18s&lt;/td>
 &lt;td>818 MB cache download + decompress&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>npm ci --ignore-scripts&lt;/code>&lt;/td>
 &lt;td>~58s&lt;/td>
 &lt;td>Full install from lockfile&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>patch-npm-deps (Sentry CLI)&lt;/td>
 &lt;td>~6s&lt;/td>
 &lt;td>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>&lt;code>npm run check&lt;/code> (lint + tsc)&lt;/strong>&lt;/td>
 &lt;td>&lt;strong>~75s&lt;/strong>&lt;/td>
 &lt;td>ESLint ~75s, tsc runs after but seems fast or included&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>check-i18n&lt;/td>
 &lt;td>~6s&lt;/td>
 &lt;td>&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;h3 id="citest-coverage-breakdown-8m-9s">ci/test-coverage breakdown (8m 9s)&lt;/h3>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Sub-step&lt;/th>
 &lt;th>Duration&lt;/th>
 &lt;th>Notes&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>setup-node&lt;/td>
 &lt;td>~0.5s&lt;/td>
 &lt;td>Already cached from previous step&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>npm cache restore&lt;/td>
 &lt;td>~9s&lt;/td>
 &lt;td>Cache hit (same job)&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>&lt;code>npm ci --ignore-scripts&lt;/code> (again!)&lt;/strong>&lt;/td>
 &lt;td>&lt;strong>~48s&lt;/strong>&lt;/td>
 &lt;td>Redundant — deps already installed&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>patch-npm-deps (again!)&lt;/td>
 &lt;td>~0.5s&lt;/td>
 &lt;td>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Download main coverage artifact&lt;/td>
 &lt;td>~1s&lt;/td>
 &lt;td>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>&lt;code>npm run test:ci:coverage&lt;/code>&lt;/strong>&lt;/td>
 &lt;td>&lt;strong>~6m 57s&lt;/strong>&lt;/td>
 &lt;td>Jest &lt;code>--runInBand --coverage&lt;/code>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Compare + post coverage&lt;/td>
 &lt;td>~2s&lt;/td>
 &lt;td>&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;h2 id="bottlenecks-identified">Bottlenecks Identified&lt;/h2>
&lt;h3 id="-critical-jest-runs-with---runinband-6m-57s">🔴 Critical: Jest runs with &lt;code>--runInBand&lt;/code> (6m 57s)&lt;/h3>
&lt;p>The test command uses &lt;code>--runInBand&lt;/code> which forces &lt;strong>serial test execution on a single core&lt;/strong>. GitHub-hosted &lt;code>ubuntu-22.04&lt;/code> runners have 2 cores. This is the single biggest bottleneck.&lt;/p></description></item><item><title>Hugo Theme Deployment Troubleshooting</title><link>https://mmworkbrain.pages.dev/docs/learning/hugo-theme-deployment/</link><pubDate>Thu, 19 Mar 2026 00:47:00 +0000</pubDate><guid>https://mmworkbrain.pages.dev/docs/learning/hugo-theme-deployment/</guid><description>&lt;p>&lt;strong>Meta Note:&lt;/strong> This was our first real engineering challenge captured in this knowledge base - troubleshooting the Hugo Book theme setup that powers this very site!&lt;/p>
&lt;h2 id="problem-statement">Problem Statement&lt;/h2>
&lt;p>&lt;strong>Symptom:&lt;/strong> Hugo builds complete successfully on Cloudflare Pages, but the deployed site returns 404 for all pages.&lt;/p>
&lt;p>&lt;strong>Investigation:&lt;/strong> Build logs show no errors, deployment completes with &amp;ldquo;success&amp;rdquo; status, but only RSS/XML files are generated - no HTML pages.&lt;/p>
&lt;h2 id="environment">Environment&lt;/h2>
&lt;ul>
&lt;li>&lt;strong>Platform:&lt;/strong> Cloudflare Pages&lt;/li>
&lt;li>&lt;strong>Hugo Version:&lt;/strong> 0.146.0 (pinned)&lt;/li>
&lt;li>&lt;strong>Theme:&lt;/strong> Hugo Book (alex-shpak/hugo-book)&lt;/li>
&lt;li>&lt;strong>Build Command:&lt;/strong> &lt;code>hugo --minify&lt;/code>&lt;/li>
&lt;li>&lt;strong>Repository:&lt;/strong> GitHub with auto-deployment&lt;/li>
&lt;/ul>
&lt;h2 id="root-causes-identified">Root Causes Identified&lt;/h2>
&lt;h3 id="1-configuration-file-precedence-issue">1. Configuration File Precedence Issue&lt;/h3>
&lt;p>&lt;strong>Problem:&lt;/strong> Hugo configuration split between &lt;code>config.yaml&lt;/code> and &lt;code>hugo.toml&lt;/code>&lt;/p></description></item><item><title>Android Bearer Token Corruption (AYPW)</title><link>https://mmworkbrain.pages.dev/docs/investigations/android-bearer-token-corruption/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://mmworkbrain.pages.dev/docs/investigations/android-bearer-token-corruption/</guid><description>&lt;p>Investigation into why the Mattermost mobile JS layer sends a corrupted bearer token containing control character &lt;code>0x02&lt;/code> to the Android native network client, causing OkHttp crashes.&lt;/p>
&lt;h2 id="sentry-issue-summary">Sentry Issue Summary&lt;/h2>
&lt;ul>
&lt;li>&lt;strong>Issue:&lt;/strong> MATTERMOST-MOBILE-ANDROID-AYPW&lt;/li>
&lt;li>&lt;strong>Error:&lt;/strong> &lt;code>IllegalArgumentException: Unexpected char 0x02 at 9 in Authorization value&lt;/code>&lt;/li>
&lt;li>&lt;strong>Location:&lt;/strong> &lt;code>okhttp3.Headers$Companion.checkValue&lt;/code> → called from &lt;code>Extensions.kt:applyHeaders&lt;/code>&lt;/li>
&lt;li>&lt;strong>Crash path:&lt;/strong> &lt;code>upload&lt;/code> → &lt;code>buildUploadCall&lt;/code> → &lt;code>buildRequest&lt;/code> → &lt;code>applyHeaders&lt;/code>&lt;/li>
&lt;li>&lt;strong>Count:&lt;/strong> 20 events, first seen 2025-12-01, last seen 2026-03-19&lt;/li>
&lt;li>&lt;strong>Severity:&lt;/strong> Unhandled (UncaughtExceptionHandler) — app crashes&lt;/li>
&lt;li>&lt;strong>Device:&lt;/strong> Samsung SM-F766N (Galaxy Z Flip 3)&lt;/li>
&lt;/ul>
&lt;h2 id="the-0x02-at-position-9-clue">The &amp;ldquo;0x02 at position 9&amp;rdquo; Clue&lt;/h2>
&lt;p>The Authorization header value is &lt;code>BEARER &amp;lt;token&amp;gt;&lt;/code>. Position 9 (0-indexed) is the 2nd character of the actual token (after &lt;code>&amp;quot;BEARER &amp;quot;&lt;/code> = 8 chars). The &lt;strong>token itself&lt;/strong> contains a &lt;code>0x02&lt;/code> (STX control character) near the beginning.&lt;/p></description></item><item><title>Enterprise CI Cross-Repo Failure Analysis - March 26, 2026</title><link>https://mmworkbrain.pages.dev/docs/investigations/enterprise-ci-cross-repo-failure-2026-03-26/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://mmworkbrain.pages.dev/docs/investigations/enterprise-ci-cross-repo-failure-2026-03-26/</guid><description>&lt;h2 id="executive-summary">Executive Summary&lt;/h2>
&lt;p>On March 26, 2026, a cross-repository dependency break caused all server PRs branched before 07:54 UTC to fail Enterprise CI. The root cause was a &lt;strong>timing/ordering issue&lt;/strong> — the server-side methods were merged first (#35157 at 07:54 UTC), enterprise code was updated to use them (#2088 at 08:31 UTC), but any server PR that didn&amp;rsquo;t include #35157&amp;rsquo;s changes would fail when tested against the updated enterprise code. The fix was simply rebasing affected server PRs onto current master.&lt;/p></description></item><item><title>i18n Cross-Repo Coordination Problem</title><link>https://mmworkbrain.pages.dev/docs/platform/i18n-cross-repo-coordination/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://mmworkbrain.pages.dev/docs/platform/i18n-cross-repo-coordination/</guid><description>&lt;h2 id="how-it-works-today">How It Works Today&lt;/h2>
&lt;h3 id="the-pipeline">The Pipeline&lt;/h3>
&lt;ol>
&lt;li>
&lt;p>&lt;strong>&lt;code>mmgotool i18n extract&lt;/code>&lt;/strong> (in &lt;code>mattermost/tools/mmgotool/commands/i18n.go&lt;/code>) walks Go source files across multiple directories:&lt;/p>
&lt;ul>
&lt;li>&lt;code>server/&lt;/code> (mattermost server code)&lt;/li>
&lt;li>&lt;code>../../enterprise/&lt;/code> (enterprise code, relative to &lt;code>server/&lt;/code>)&lt;/li>
&lt;li>&lt;code>../model/&lt;/code>, &lt;code>../plugin/&lt;/code> (shared packages)&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>It parses Go AST looking for calls to &lt;code>NewAppError()&lt;/code>, &lt;code>T()&lt;/code>, &lt;code>NewUserFacingError()&lt;/code>, &lt;code>translateFunc()&lt;/code>, etc., extracting string literal IDs.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>It merges extracted IDs with existing &lt;code>server/i18n/en.json&lt;/code> — adding new keys (with empty translation), removing stale keys.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Enterprise CI&lt;/strong> (&lt;code>ci-template.yml&lt;/code>) checks out both repos side-by-side, then:&lt;/p></description></item><item><title>Mattermost Integrations Marketplace Roadmap — 2026 and Beyond</title><link>https://mmworkbrain.pages.dev/docs/platform/marketplace-roadmap/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://mmworkbrain.pages.dev/docs/platform/marketplace-roadmap/</guid><description>&lt;h2 id="context">Context&lt;/h2>
&lt;p>Mattermost&amp;rsquo;s current marketplace is a &lt;strong>read-only catalog&lt;/strong> — a stateless Go service (&lt;code>mattermost/mattermost-marketplace&lt;/code>) serving a manually curated &lt;code>plugins.json&lt;/code> file via AWS Lambda + S3 + CloudFront at &lt;code>api.integrations.mattermost.com&lt;/code>. The public website at &lt;code>mattermost.com/marketplace&lt;/code> is a separate CMS frontend (likely WordPress). There is no developer portal, no self-service submission pipeline, no monetization infrastructure, and no automated code review. Every plugin listing is manually managed by the Mattermost team.&lt;/p>
&lt;p>The goal is to evolve this into a &lt;strong>living platform ecosystem&lt;/strong>: open to 3rd-party developers, capable of hosting paid/free integrations, with Mattermost retaining quality and security control — ideally augmented by AI review — delivered in incremental, shippable stages.&lt;/p></description></item><item><title>MATTERMOST-SERVER-QC / QK / QH / WF — Nil pointer in channel permission check</title><link>https://mmworkbrain.pages.dev/docs/investigations/upgrade-advisories/mattermost-server-qc/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://mmworkbrain.pages.dev/docs/investigations/upgrade-advisories/mattermost-server-qc/</guid><description>&lt;h2 id="issue">Issue&lt;/h2>
&lt;p>Nil pointer dereference panic in &lt;code>isChannelArchivedAndHidden&lt;/code> during channel permission checks. Occurs when accessing a deleted or non-existent channel through various API endpoints (get channel stats, create post, upload file, search files).&lt;/p>
&lt;p>&lt;strong>Impact:&lt;/strong> Server crashes (panic/fatal) when users interact with deleted channels or channels that fail to load from the database.&lt;/p>
&lt;h2 id="status-fixed">Status: Fixed&lt;/h2>
&lt;ul>
&lt;li>&lt;strong>Fixed in:&lt;/strong> PR &lt;a href="https://github.com/mattermost/mattermost/pull/30628">#30628&lt;/a> (&lt;code>[MM-63624] Fix potential nil dereference in app.isChannelArchivedAndHidden&lt;/code>)&lt;/li>
&lt;li>&lt;strong>Merged:&lt;/strong> 2025-04-03 by @streamer45&lt;/li>
&lt;li>&lt;strong>Available in:&lt;/strong> v11.0.1 and later&lt;/li>
&lt;li>&lt;strong>Jira:&lt;/strong> &lt;a href="https://mattermost.atlassian.net/browse/MM-63624">MM-63624&lt;/a>&lt;/li>
&lt;/ul>
&lt;h2 id="affected-instances-still-hitting-this-as-of-2026-03-19">Affected Instances (still hitting this as of 2026-03-19)&lt;/h2>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Instance&lt;/th>
 &lt;th>Sentry Issue&lt;/th>
 &lt;th>Events&lt;/th>
 &lt;th>Last Seen&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>chat-matter.com&lt;/td>
 &lt;td>QC&lt;/td>
 &lt;td>~122&lt;/td>
 &lt;td>2026-03-19&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>chat.unilox.com&lt;/td>
 &lt;td>QC&lt;/td>
 &lt;td>~66&lt;/td>
 &lt;td>2026-03-19&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>chat.stil.dk&lt;/td>
 &lt;td>QC&lt;/td>
 &lt;td>~35&lt;/td>
 &lt;td>recent&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>mattermost.ilabt.imec.be&lt;/td>
 &lt;td>QC&lt;/td>
 &lt;td>~3&lt;/td>
 &lt;td>recent&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>mm.common.fk.dks.lanit.ru&lt;/td>
 &lt;td>QC&lt;/td>
 &lt;td>~2&lt;/td>
 &lt;td>recent&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>mm-kocho.madhermit.net&lt;/td>
 &lt;td>QK&lt;/td>
 &lt;td>71&lt;/td>
 &lt;td>2026-01-03&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>mattermost.demetio.com&lt;/td>
 &lt;td>QH&lt;/td>
 &lt;td>40&lt;/td>
 &lt;td>2026-01-13&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>chat.gebit.local&lt;/td>
 &lt;td>WF&lt;/td>
 &lt;td>8&lt;/td>
 &lt;td>2026-03-06&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>&lt;strong>Note:&lt;/strong> These instances are running custom/forked builds (Sentry release tags are commit hashes, not version tags), predating the April 2025 fix.&lt;/p></description></item><item><title>Mobile Observability Audit &amp; Strategy</title><link>https://mmworkbrain.pages.dev/docs/shared/mobile-observability-audit-2026-09/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://mmworkbrain.pages.dev/docs/shared/mobile-observability-audit-2026-09/</guid><description>&lt;p>&lt;em>September 2026 · Authored for the Mobile Platform Team&lt;/em>&lt;/p>
&lt;h2 id="executive-summary">Executive Summary&lt;/h2>
&lt;p>On September 19, 2026, Jason Blais reported degraded mobile app performance on iOS — slow channel switches, dropped reactions, truncated messages, and mark-unread failures. All symptoms worsened on degraded cellular networks and disappeared on good WiFi. The engineering team&amp;rsquo;s response was to ask Jason to test in airplane mode and provide screen recordings — a classic &amp;ldquo;works on my end&amp;rdquo; anti-pattern that shifts the burden of instrumentation onto the user.&lt;/p></description></item><item><title>PRFAQ - Mattermost Terraform Provider</title><link>https://mmworkbrain.pages.dev/docs/platform/terraform-provider-prfaq/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://mmworkbrain.pages.dev/docs/platform/terraform-provider-prfaq/</guid><description>&lt;h1 id="prfaq-mattermost-terraform-provider">PRFAQ: Mattermost Terraform Provider&lt;/h1>
&lt;p>&lt;strong>Document Status:&lt;/strong> Draft
&lt;strong>Author:&lt;/strong> Pavel, SVP Engineering
&lt;strong>Date:&lt;/strong> April 2026&lt;/p>
&lt;hr>
&lt;h2 id="press-release">Press Release&lt;/h2>
&lt;h3 id="mattermost-launches-official-terraform-provider-enabling-infrastructure-as-code-for-mission-critical-collaboration">Mattermost Launches Official Terraform Provider, Enabling Infrastructure-as-Code for Mission-Critical Collaboration&lt;/h3>
&lt;p>&lt;strong>Palo Alto, CA — Mattermost, the leading open-source platform for secure, mission-critical collaboration, today announced the general availability of its official Terraform Provider. The provider enables engineering and platform teams to declare, version-control, and automatically enforce their entire Mattermost configuration as code — bringing the same operational rigor used for cloud infrastructure to the collaboration layer.&lt;/strong>&lt;/p></description></item><item><title>Schalla Cursor Workflow</title><link>https://mmworkbrain.pages.dev/docs/engineering/schalla-cursor-workflow/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://mmworkbrain.pages.dev/docs/engineering/schalla-cursor-workflow/</guid><description>&lt;p>The Oxide AI-Assisted Development Workflow&lt;/p>
&lt;h2 id="what-this-is">What this is&lt;/h2>
&lt;p>A structured method for building non-trivial software with an AI coding agent (Cursor, Claude Code, or similar) where architectural integrity is non-negotiable and multiple engineers or sessions need to pick up where another left off without drift.&lt;/p>
&lt;hr>
&lt;h2 id="phase-0-problem-definition-human-only-no-ai">Phase 0: Problem Definition (human only, no AI)&lt;/h2>
&lt;p>Do this before opening any tool.&lt;/p>
&lt;p>Write a single document that answers four questions with precision:&lt;/p>
&lt;h3 id="1-what-is-the-one-sentence-demo">1. What is the one-sentence demo?&lt;/h3>
&lt;p>Not goals, not features — the exact scenario you would screen-record in 90 seconds to prove the thing works.&lt;/p></description></item><item><title>Sentry Issue Triage &amp; Fix Workflow</title><link>https://mmworkbrain.pages.dev/docs/processes/sentry-triage-workflow/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://mmworkbrain.pages.dev/docs/processes/sentry-triage-workflow/</guid><description>&lt;p>This document describes the end-to-end process for triaging Sentry issues, creating fixes, and getting them through code review. It is designed for both human engineers and AI agents working on Mattermost codebases.&lt;/p>
&lt;h2 id="overview">Overview&lt;/h2>
&lt;pre tabindex="0">&lt;code>Sentry Issue → Investigate → Check if already fixed → Find Source Code → Write Failing Test
→ Validate test fails → Create Fix → Validate test passes (+ all other tests)
→ Draft PR (with customer impact) → Human Review → Merge → Update Sentry
&lt;/code>&lt;/pre>&lt;h2 id="step-1-identify-the-issue">Step 1: Identify the Issue&lt;/h2>
&lt;h3 id="sources">Sources&lt;/h3>
&lt;ul>
&lt;li>&lt;strong>Sentry Dashboard:&lt;/strong> &lt;a href="https://mattermost-mr.sentry.io">mattermost-mr.sentry.io&lt;/a>&lt;/li>
&lt;li>&lt;strong>API:&lt;/strong> &lt;code>GET /api/0/projects/mattermost-mr/{project}/issues/?query=is:unresolved&amp;amp;sort=freq&lt;/code>&lt;/li>
&lt;/ul>
&lt;h3 id="active-projects-skip--test-projects">Active Projects (skip &lt;code>-test&lt;/code> projects)&lt;/h3>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Project&lt;/th>
 &lt;th>Platform&lt;/th>
 &lt;th>Repository&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>&lt;code>mattermost-server&lt;/code>&lt;/td>
 &lt;td>Go&lt;/td>
 &lt;td>&lt;a href="https://github.com/mattermost/mattermost">mattermost/mattermost&lt;/a> (server/v8)&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>mattermost-desktop&lt;/code>&lt;/td>
 &lt;td>Electron&lt;/td>
 &lt;td>&lt;a href="https://github.com/mattermost/desktop">mattermost/desktop&lt;/a>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>mattermost-mobile-ios&lt;/code>&lt;/td>
 &lt;td>React Native / Swift&lt;/td>
 &lt;td>&lt;a href="https://github.com/mattermost/mattermost-mobile">mattermost/mattermost-mobile&lt;/a>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>mattermost-mobile-android&lt;/code>&lt;/td>
 &lt;td>React Native / Java/Kotlin&lt;/td>
 &lt;td>&lt;a href="https://github.com/mattermost/mattermost-mobile">mattermost/mattermost-mobile&lt;/a>&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;h3 id="prioritization-criteria">Prioritization Criteria&lt;/h3>
&lt;ol>
&lt;li>&lt;strong>Quick wins first:&lt;/strong> Simple, clearly identifiable root cause with a narrow fix&lt;/li>
&lt;li>&lt;strong>Customer impact:&lt;/strong> Number of distinct instances/domains affected (extract from &lt;code>url&lt;/code> tag)&lt;/li>
&lt;li>&lt;strong>User impact:&lt;/strong> High &lt;code>userCount&lt;/code> in Sentry = more users affected&lt;/li>
&lt;li>&lt;strong>Frequency:&lt;/strong> High &lt;code>count&lt;/code> = happening often (but check if it&amp;rsquo;s one instance or many)&lt;/li>
&lt;li>&lt;strong>Recency:&lt;/strong> &lt;code>lastSeen&lt;/code> today means it&amp;rsquo;s actively happening&lt;/li>
&lt;/ol>
&lt;h3 id="what-makes-a-good-quick-win">What Makes a Good Quick Win&lt;/h3>
&lt;ul>
&lt;li>Missing nil/null checks (Go nil pointer, JS undefined)&lt;/li>
&lt;li>Missing bounds checks before array/slice access&lt;/li>
&lt;li>Type assertion without checking (Go &lt;code>interface{}&lt;/code> cast)&lt;/li>
&lt;li>Input validation gaps (malformed data from external sources)&lt;/li>
&lt;li>Off-by-one errors&lt;/li>
&lt;/ul>
&lt;h2 id="step-2-investigate-the-stacktrace">Step 2: Investigate the Stacktrace&lt;/h2>
&lt;h3 id="via-sentry-api">Via Sentry API&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#57606a"># Get issue details&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>curl -H &lt;span style="color:#0a3069">&amp;#34;Authorization: Bearer &lt;/span>&lt;span style="color:#953800">$SENTRY_AUTH_TOKEN&lt;/span>&lt;span style="color:#0a3069">&amp;#34;&lt;/span> &lt;span style="color:#0a3069">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069">&lt;/span> &lt;span style="color:#0a3069">&amp;#34;https://us.sentry.io/api/0/issues/{issue_id}/events/latest/&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#57606a"># Get customer domains from url tag&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>curl -H &lt;span style="color:#0a3069">&amp;#34;Authorization: Bearer &lt;/span>&lt;span style="color:#953800">$SENTRY_AUTH_TOKEN&lt;/span>&lt;span style="color:#0a3069">&amp;#34;&lt;/span> &lt;span style="color:#0a3069">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069">&lt;/span> &lt;span style="color:#0a3069">&amp;#34;https://us.sentry.io/api/0/issues/{issue_id}/tags/url/?per_page=100&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#57606a"># Look at the exception entries for:&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#57606a"># - Exception type and value&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#57606a"># - Stack frames (focus on inApp=true frames)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#57606a"># - Tags (release version, OS, device, url)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="key-information-to-extract">Key Information to Extract&lt;/h3>
&lt;ul>
&lt;li>&lt;strong>Exact file and line number&lt;/strong> where the crash occurs&lt;/li>
&lt;li>&lt;strong>Call chain&lt;/strong> leading to the crash (what triggered it)&lt;/li>
&lt;li>&lt;strong>Release version&lt;/strong> (is this in latest? or old version only?)&lt;/li>
&lt;li>&lt;strong>Frequency pattern&lt;/strong> (increasing, stable, declining?)&lt;/li>
&lt;li>&lt;strong>Customer domains&lt;/strong> (deduplicated from &lt;code>url&lt;/code> tag — who is affected?)&lt;/li>
&lt;/ul>
&lt;h2 id="step-3-check-if-already-fixed">Step 3: Check if Already Fixed&lt;/h2>
&lt;p>&lt;strong>Before writing any code, check if the bug exists on the latest &lt;code>main&lt;/code>/&lt;code>master&lt;/code> branch.&lt;/strong>&lt;/p></description></item><item><title>Sentry Low-Hanging Fruit</title><link>https://mmworkbrain.pages.dev/docs/trackers/sentry-low-hanging-fruit/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://mmworkbrain.pages.dev/docs/trackers/sentry-low-hanging-fruit/</guid><description>&lt;p>Identified 2026-03-19. Categorized by actionability after verifying each issue against current &lt;code>master&lt;/code> and checking whether release commits exist in the upstream repository.&lt;/p>
&lt;p>&lt;strong>Key finding:&lt;/strong> The majority of server-side Sentry issues originate from &lt;strong>customer forks&lt;/strong> with custom code not present in upstream Mattermost. Several others are &lt;strong>already fixed&lt;/strong> in newer releases.&lt;/p>
&lt;hr>
&lt;h2 id="category-1-current--reproducible-on-master">Category 1: Current — Reproducible on Master&lt;/h2>
&lt;p>Issues that exist in the current upstream codebase and can be fixed with a PR.&lt;/p></description></item><item><title>Sustained Engineering Bug Triage Process</title><link>https://mmworkbrain.pages.dev/docs/engineering/set-bug-triage-process/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://mmworkbrain.pages.dev/docs/engineering/set-bug-triage-process/</guid><description>&lt;p>&lt;strong>SET&lt;/strong> (Sustained Engineering Tool) is a Go CLI that automates how we triage, prioritize, and manage incoming Jira bugs for the Sustained Engineering team. It runs as scheduled GitHub Actions workflows against our Jira instance, with all decisions posted to Mattermost channels for visibility. The tool uses Claude (Anthropic API) for AI-assisted classification and an Atlassian Compass integration to map issues to the correct owning team via component ownership.&lt;/p>
&lt;p>Source: &lt;a href="https://github.com/mattermost/set">mattermost/set&lt;/a>&lt;/p></description></item><item><title>Test time.Sleep Audit</title><link>https://mmworkbrain.pages.dev/docs/ci/test-time-sleep-audit/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://mmworkbrain.pages.dev/docs/ci/test-time-sleep-audit/</guid><description>&lt;p>Audit of &lt;code>time.Sleep&lt;/code> calls in &lt;code>server/&lt;/code> test files in &lt;code>mattermost/mattermost&lt;/code>. These are fragile timing dependencies that break under the race detector (which slows execution 2-10x) and contribute to flaky tests.&lt;/p>
&lt;p>&lt;strong>Total: 191 occurrences&lt;/strong> across test files.&lt;/p>
&lt;p>&lt;strong>Recommended replacement:&lt;/strong> &lt;code>require.Eventually(t, func() bool { ... }, timeout, interval)&lt;/code> or channel/sync-based signaling.&lt;/p>
&lt;h2 id="high-risk-1s--66-occurrences">High Risk (≥1s) — 66 occurrences&lt;/h2>
&lt;p>These are both slow AND fragile. Each adds seconds to test runtime while still being too short under &lt;code>-race&lt;/code>.&lt;/p></description></item><item><title>Mattermost Integrations Marketplace — Execution Plan</title><link>https://mmworkbrain.pages.dev/docs/platform/marketplace-roadmap-technical-v2/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://mmworkbrain.pages.dev/docs/platform/marketplace-roadmap-technical-v2/</guid><description>&lt;blockquote>
&lt;p>Iteration of &lt;code>iterative-bouncing-nest.md&lt;/code> with operational constraints, repo structure, infrastructure, telemetry, GitHub milestones, and GitHub issues.&lt;/p>&lt;/blockquote>
&lt;hr>
&lt;h2 id="context">Context&lt;/h2>
&lt;p>The existing marketplace is a &lt;strong>stateless read-only Lambda&lt;/strong> (&lt;code>mattermost/mattermost-marketplace&lt;/code>) serving a compiled &lt;code>plugins.json&lt;/code> with no database, no auth, no telemetry, and no developer self-service.&lt;/p>
&lt;p>The goal is to evolve it into a living platform ecosystem — open submissions, AI review, monetization, private enterprise registries — in incremental shippable stages that &lt;strong>never destabilize production&lt;/strong>.&lt;/p></description></item><item><title>Android Development Setup</title><link>https://mmworkbrain.pages.dev/docs/infrastructure/android-dev-setup/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://mmworkbrain.pages.dev/docs/infrastructure/android-dev-setup/</guid><description>&lt;p>Minimal setup for running Kotlin unit tests in the OpenClaw container. Not a full Android build environment — just enough for &lt;code>./gradlew test&lt;/code> (JVM unit tests).&lt;/p>
&lt;h2 id="install-jdk-17">Install JDK 17&lt;/h2>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>curl -sL https://download.oracle.com/java/17/archive/jdk-17.0.12_linux-x64_bin.tar.gz &lt;span style="color:#1f2328">|&lt;/span> tar -xz -C &lt;span style="color:#953800">$HOME&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#6639ba">export&lt;/span> &lt;span style="color:#953800">JAVA_HOME&lt;/span>&lt;span style="color:#0550ae">=&lt;/span>&lt;span style="color:#953800">$HOME&lt;/span>/jdk-17.0.12
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#6639ba">export&lt;/span> &lt;span style="color:#953800">PATH&lt;/span>&lt;span style="color:#0550ae">=&lt;/span>&lt;span style="color:#953800">$JAVA_HOME&lt;/span>/bin:&lt;span style="color:#953800">$PATH&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="install-android-sdk-minimal">Install Android SDK (minimal)&lt;/h2>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#57606a"># Command-line tools&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>mkdir -p &lt;span style="color:#953800">$HOME&lt;/span>/android-sdk/cmdline-tools
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#6639ba">cd&lt;/span> &lt;span style="color:#953800">$HOME&lt;/span>/android-sdk/cmdline-tools
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>curl -sL https://dl.google.com/android/repository/commandlinetools-linux-11076708_latest.zip -o tools.zip
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#953800">$JAVA_HOME&lt;/span>/bin/jar xf tools.zip &lt;span style="color:#57606a"># unzip not available in container&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>mv cmdline-tools latest
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>rm tools.zip
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>chmod +x latest/bin/*
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#57606a"># Accept licenses + install platform&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#6639ba">export&lt;/span> &lt;span style="color:#953800">ANDROID_HOME&lt;/span>&lt;span style="color:#0550ae">=&lt;/span>&lt;span style="color:#953800">$HOME&lt;/span>/android-sdk
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>yes &lt;span style="color:#1f2328">|&lt;/span> &lt;span style="color:#953800">$ANDROID_HOME&lt;/span>/cmdline-tools/latest/bin/sdkmanager --licenses
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#953800">$ANDROID_HOME&lt;/span>/cmdline-tools/latest/bin/sdkmanager &lt;span style="color:#0a3069">&amp;#34;platforms;android-34&amp;#34;&lt;/span> &lt;span style="color:#0a3069">&amp;#34;build-tools;34.0.0&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="disk-usage">Disk usage&lt;/h2>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Component&lt;/th>
 &lt;th>Size&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>JDK 17&lt;/td>
 &lt;td>~305 MB&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Android SDK (minimal)&lt;/td>
 &lt;td>~437 MB&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>Total&lt;/strong>&lt;/td>
 &lt;td>&lt;strong>~740 MB&lt;/strong>&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;h2 id="running-kotlin-unit-tests">Running Kotlin unit tests&lt;/h2>
&lt;p>For libraries without a Gradle wrapper (like &lt;code>react-native-network-client&lt;/code>), use the standalone test-runner pattern:&lt;/p></description></item><item><title>Microsoft Intune SDK Crashes — iOS</title><link>https://mmworkbrain.pages.dev/docs/investigations/intune-sdk-crashes/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://mmworkbrain.pages.dev/docs/investigations/intune-sdk-crashes/</guid><description>&lt;p>&lt;strong>Date:&lt;/strong> 2026-03-20&lt;br>
&lt;strong>Status:&lt;/strong> Research complete — upstream issue filing recommended&lt;/p>
&lt;h2 id="executive-summary">Executive Summary&lt;/h2>
&lt;p>Two crashes in the Microsoft Intune SDK (&lt;code>IntuneMAMSwift.framework&lt;/code>) are collectively affecting &lt;strong>~12,400 unique users&lt;/strong> of Mattermost iOS. Both crashes originate entirely within SDK code — Mattermost cannot fix them directly. The SDK is &lt;strong>closed-source&lt;/strong> (binary-only xcframeworks), so code contributions are not possible. The recommended path is filing detailed issues on the SDK&amp;rsquo;s GitHub repo and upgrading to the latest SDK version (21.5.1), which includes a launch-time crash fix.&lt;/p></description></item><item><title>Debugging Stripped Mattermost Binaries with Delve</title><link>https://mmworkbrain.pages.dev/docs/engineering/dlv-mattermost-guide/</link><pubDate>Thu, 23 Apr 2026 00:00:00 +0000</pubDate><guid>https://mmworkbrain.pages.dev/docs/engineering/dlv-mattermost-guide/</guid><description>&lt;p>When Mattermost ships production binaries built with &lt;code>go build -ldflags='-s -w'&lt;/code>, DWARF debug info and the symbol table are stripped to reduce binary size. This guide covers how to preserve that debug information separately and use &lt;a href="https://github.com/go-delve/delve">Delve&lt;/a> to debug stripped binaries effectively.&lt;/p>
&lt;h2 id="prerequisites">Prerequisites&lt;/h2>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Tool&lt;/th>
 &lt;th>Minimum Version&lt;/th>
 &lt;th>Purpose&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>&lt;code>dlv&lt;/code>&lt;/td>
 &lt;td>1.21+&lt;/td>
 &lt;td>Go debugger with &lt;code>--debug-info&lt;/code> flag and debuginfod support&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>go&lt;/code>&lt;/td>
 &lt;td>1.21+&lt;/td>
 &lt;td>Match the version used to build the binary&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>objcopy&lt;/code>&lt;/td>
 &lt;td>any (binutils)&lt;/td>
 &lt;td>Extract and reattach debug sections&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>file&lt;/code>&lt;/td>
 &lt;td>any&lt;/td>
 &lt;td>Quick check: stripped vs. not stripped&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>readelf&lt;/code>&lt;/td>
 &lt;td>any&lt;/td>
 &lt;td>Inspect ELF sections, build IDs&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>Install Delve:&lt;/p></description></item><item><title>Playwright E2E Sleep vs Wait Pattern Analysis</title><link>https://mmworkbrain.pages.dev/docs/ci/playwright-sleep-analysis/</link><pubDate>Thu, 23 Apr 2026 00:00:00 +0000</pubDate><guid>https://mmworkbrain.pages.dev/docs/ci/playwright-sleep-analysis/</guid><description>&lt;p>&lt;strong>Analysis date:&lt;/strong> 2026-04-23 · &lt;strong>Source:&lt;/strong> &lt;code>mattermost/mattermost&lt;/code> HEAD · &lt;strong>Directory:&lt;/strong> &lt;code>e2e-tests/playwright/&lt;/code>&lt;/p>
&lt;h2 id="executive-summary">Executive Summary&lt;/h2>
&lt;p>The Playwright E2E test suite contains &lt;strong>229 fixed-delay sleeps&lt;/strong> totaling &lt;strong>245.6 seconds&lt;/strong> (4+ minutes) of unconditional waiting. Over &lt;strong>93% of this sleep time is concentrated in the ABAC (Attribute-Based Access Control) test files&lt;/strong> under &lt;code>system_console/abac/&lt;/code>. The single worst file (&lt;code>abac/support.ts&lt;/code>) is a shared helper used by multiple ABAC tests, meaning its sleeps multiply across test runs.&lt;/p>
&lt;p>While the suite also uses &lt;strong>2,340 proper async waits&lt;/strong> (a 10:1 ratio of good waits to sleeps), the fixed delays are significant contributors to slow shard execution times — especially since ABAC tests also set extended timeouts (up to 5 minutes per test).&lt;/p></description></item><item><title>GitHub Actions Workflow Audit</title><link>https://mmworkbrain.pages.dev/docs/security/github-actions-workflow-audit/</link><pubDate>Tue, 31 Mar 2026 00:00:00 +0000</pubDate><guid>https://mmworkbrain.pages.dev/docs/security/github-actions-workflow-audit/</guid><description>&lt;p>Audit performed on 2026-03-31. The repository contains &lt;strong>65 total workflows&lt;/strong> (64 active, 1 disabled).&lt;/p>
&lt;h2 id="summary">Summary&lt;/h2>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Category&lt;/th>
 &lt;th>Count&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>✅ Active &amp;amp; healthy&lt;/td>
 &lt;td>29&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>⚠️ Active but failing&lt;/td>
 &lt;td>7&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>🔇 Disabled&lt;/td>
 &lt;td>1&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>💀 Stale (no runs in 30+ days)&lt;/td>
 &lt;td>20&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>❓ Manual/rare&lt;/td>
 &lt;td>3&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>🔁 Potentially redundant&lt;/td>
 &lt;td>5&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>&lt;strong>Key finding:&lt;/strong> There are &lt;strong>20+ E2E-related workflows&lt;/strong>, many stale or superseded. This is the biggest cleanup opportunity.&lt;/p>
&lt;h2 id="all-workflows">All Workflows&lt;/h2>
&lt;h3 id="core-ci-server--web-app">Core CI (Server &amp;amp; Web App)&lt;/h3>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Workflow&lt;/th>
 &lt;th>Path&lt;/th>
 &lt;th>Last Run&lt;/th>
 &lt;th>Result&lt;/th>
 &lt;th>Trigger&lt;/th>
 &lt;th>Status&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>Server CI&lt;/td>
 &lt;td>server-ci.yml&lt;/td>
 &lt;td>2026-03-31&lt;/td>
 &lt;td>✅ success&lt;/td>
 &lt;td>PR&lt;/td>
 &lt;td>✅ Active&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Server CI PR&lt;/td>
 &lt;td>server-ci-pr.yml&lt;/td>
 &lt;td>2026-03-30&lt;/td>
 &lt;td>✅ success&lt;/td>
 &lt;td>PR&lt;/td>
 &lt;td>✅ Active&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Server CI Master&lt;/td>
 &lt;td>server-ci-master.yml&lt;/td>
 &lt;td>2026-03-27&lt;/td>
 &lt;td>✅ success&lt;/td>
 &lt;td>push&lt;/td>
 &lt;td>✅ Active&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Server Test Template&lt;/td>
 &lt;td>server-test-template.yml&lt;/td>
 &lt;td>2026-03-20&lt;/td>
 &lt;td>❌ failure&lt;/td>
 &lt;td>push&lt;/td>
 &lt;td>⚠️ Failing&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Server CI Artifacts&lt;/td>
 &lt;td>server-ci-artifacts.yml&lt;/td>
 &lt;td>2026-03-31&lt;/td>
 &lt;td>🔄 running&lt;/td>
 &lt;td>workflow_run&lt;/td>
 &lt;td>✅ Active&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Server CI Report&lt;/td>
 &lt;td>server-ci-report.yml&lt;/td>
 &lt;td>2026-03-31&lt;/td>
 &lt;td>✅ success&lt;/td>
 &lt;td>workflow_run&lt;/td>
 &lt;td>✅ Active&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Web App CI&lt;/td>
 &lt;td>webapp-ci.yml&lt;/td>
 &lt;td>2026-03-31&lt;/td>
 &lt;td>✅ success&lt;/td>
 &lt;td>PR&lt;/td>
 &lt;td>✅ Active&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Web App CI PR&lt;/td>
 &lt;td>webapp-ci-pr.yml&lt;/td>
 &lt;td>2026-03-26&lt;/td>
 &lt;td>✅ success&lt;/td>
 &lt;td>PR&lt;/td>
 &lt;td>✅ Active&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Web App CI Master&lt;/td>
 &lt;td>webapp-ci-master.yml&lt;/td>
 &lt;td>2026-03-27&lt;/td>
 &lt;td>✅ success&lt;/td>
 &lt;td>push&lt;/td>
 &lt;td>✅ Active&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>mmctl CI&lt;/td>
 &lt;td>mmctl-test-template.yml&lt;/td>
 &lt;td>2025-04-28&lt;/td>
 &lt;td>❌ failure&lt;/td>
 &lt;td>push&lt;/td>
 &lt;td>💀 &lt;strong>11 months stale&lt;/strong>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>i18n CI PR&lt;/td>
 &lt;td>i18n-ci-pr.yml&lt;/td>
 &lt;td>2026-03-31&lt;/td>
 &lt;td>✅ success&lt;/td>
 &lt;td>PR&lt;/td>
 &lt;td>✅ Active&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>i18n CI Template&lt;/td>
 &lt;td>i18n-ci-template.yml&lt;/td>
 &lt;td>—&lt;/td>
 &lt;td>—&lt;/td>
 &lt;td>(template)&lt;/td>
 &lt;td>💀 Never run&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>API&lt;/td>
 &lt;td>api.yml&lt;/td>
 &lt;td>2026-03-31&lt;/td>
 &lt;td>✅ success&lt;/td>
 &lt;td>PR&lt;/td>
 &lt;td>✅ Active&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Playbooks CI&lt;/td>
 &lt;td>playbooks-ci.yml&lt;/td>
 &lt;td>2026-03-20&lt;/td>
 &lt;td>❌ failure&lt;/td>
 &lt;td>PR&lt;/td>
 &lt;td>⚠️ Failing&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Playbooks CodeQL&lt;/td>
 &lt;td>playbooks-codeql.yml&lt;/td>
 &lt;td>2026-03-20&lt;/td>
 &lt;td>✅ success&lt;/td>
 &lt;td>PR&lt;/td>
 &lt;td>✅ Active&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Tools CI&lt;/td>
 &lt;td>tools-ci.yml&lt;/td>
 &lt;td>2026-03-31&lt;/td>
 &lt;td>✅ success&lt;/td>
 &lt;td>PR&lt;/td>
 &lt;td>✅ Active&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;h3 id="e2e-testing--current-generation">E2E Testing — Current Generation&lt;/h3>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Workflow&lt;/th>
 &lt;th>Path&lt;/th>
 &lt;th>Last Run&lt;/th>
 &lt;th>Result&lt;/th>
 &lt;th>Trigger&lt;/th>
 &lt;th>Status&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>E2E Tests (pull request)&lt;/td>
 &lt;td>e2e-tests-ci.yml&lt;/td>
 &lt;td>2026-03-31&lt;/td>
 &lt;td>✅ success&lt;/td>
 &lt;td>dispatch&lt;/td>
 &lt;td>✅ Active&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>E2E Tests&lt;/td>
 &lt;td>e2e-fulltests-ci.yml&lt;/td>
 &lt;td>2026-03-31&lt;/td>
 &lt;td>🔄 running&lt;/td>
 &lt;td>dispatch&lt;/td>
 &lt;td>✅ Active&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>E2E Tests Check&lt;/td>
 &lt;td>e2e-tests-check.yml&lt;/td>
 &lt;td>2026-03-31&lt;/td>
 &lt;td>✅ success&lt;/td>
 &lt;td>PR&lt;/td>
 &lt;td>✅ Active&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>E2E Tests/verified&lt;/td>
 &lt;td>e2e-tests-verified-label.yml&lt;/td>
 &lt;td>2026-03-31&lt;/td>
 &lt;td>⏭️ skipped&lt;/td>
 &lt;td>PR&lt;/td>
 &lt;td>✅ Active&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>E2E Tests (master/release - merge)&lt;/td>
 &lt;td>e2e-tests-on-merge.yml&lt;/td>
 &lt;td>2026-03-31&lt;/td>
 &lt;td>✅ success&lt;/td>
 &lt;td>dispatch&lt;/td>
 &lt;td>✅ Active&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>E2E Tests (release cut)&lt;/td>
 &lt;td>e2e-tests-on-release.yml&lt;/td>
 &lt;td>2026-03-27&lt;/td>
 &lt;td>❌ failure&lt;/td>
 &lt;td>dispatch&lt;/td>
 &lt;td>⚠️ Failing&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>E2E Coverage Gate&lt;/td>
 &lt;td>e2e-coverage-gate.yml&lt;/td>
 &lt;td>2026-03-23&lt;/td>
 &lt;td>✅ success&lt;/td>
 &lt;td>PR&lt;/td>
 &lt;td>✅ Active&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;h3 id="e2e-testing--stale--superseded">E2E Testing — Stale / Superseded&lt;/h3>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Workflow&lt;/th>
 &lt;th>Path&lt;/th>
 &lt;th>Last Run&lt;/th>
 &lt;th>Result&lt;/th>
 &lt;th>Status&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>E2E Tests Template&lt;/td>
 &lt;td>e2e-tests-ci-template.yml&lt;/td>
 &lt;td>2025-05-21&lt;/td>
 &lt;td>❌ failure&lt;/td>
 &lt;td>💀 &lt;strong>10 months stale&lt;/strong>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>E2E Tests (PR)&lt;/td>
 &lt;td>e2e-tests-pr.yml&lt;/td>
 &lt;td>2026-01-31&lt;/td>
 &lt;td>✅ success&lt;/td>
 &lt;td>💀 59 days stale&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>E2E Tests - Cypress Template&lt;/td>
 &lt;td>e2e-tests-cypress-template.yml&lt;/td>
 &lt;td>2026-01-31&lt;/td>
 &lt;td>❌ failure&lt;/td>
 &lt;td>💀 Stale + failing&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>E2E Tests - Playwright Template&lt;/td>
 &lt;td>e2e-tests-playwright-template.yml&lt;/td>
 &lt;td>2026-02-13&lt;/td>
 &lt;td>❌ failure&lt;/td>
 &lt;td>💀 Stale + failing&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>E2E Tests - Playwright&lt;/td>
 &lt;td>e2e-tests-playwright.yml&lt;/td>
 &lt;td>2026-01-08&lt;/td>
 &lt;td>❌ failure&lt;/td>
 &lt;td>💀 Stale + failing&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>E2E Tests - Cypress&lt;/td>
 &lt;td>e2e-tests-cypress.yml&lt;/td>
 &lt;td>—&lt;/td>
 &lt;td>—&lt;/td>
 &lt;td>💀 Never run&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>E2E Tests - Override Status&lt;/td>
 &lt;td>e2e-tests-override-status.yml&lt;/td>
 &lt;td>—&lt;/td>
 &lt;td>—&lt;/td>
 &lt;td>💀 Never run&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>[TM0] E2E Tests (on merge)&lt;/td>
 &lt;td>test-e2e-on-merge.yml&lt;/td>
 &lt;td>2026-02-08&lt;/td>
 &lt;td>❌ failure&lt;/td>
 &lt;td>💀 Stale + failing&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>[A3] E2E Tests (on release)&lt;/td>
 &lt;td>test-e2e-on-release.yml&lt;/td>
 &lt;td>2026-02-09&lt;/td>
 &lt;td>❌ cancelled&lt;/td>
 &lt;td>💀 Stale&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>[A2] E2E Tests (on merge - release)&lt;/td>
 &lt;td>test-e2e-on-merge-release.yml&lt;/td>
 &lt;td>2026-02-09&lt;/td>
 &lt;td>❌ cancelled&lt;/td>
 &lt;td>💀 Stale&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>[A1] E2E Tests (on merge - master)&lt;/td>
 &lt;td>test-e2e-on-merge-master.yml&lt;/td>
 &lt;td>2026-02-09&lt;/td>
 &lt;td>✅ success&lt;/td>
 &lt;td>💀 Stale&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>E2E Tests (Testcontainers)&lt;/td>
 &lt;td>e2e-tests-testcontainers.yml&lt;/td>
 &lt;td>2026-02-08&lt;/td>
 &lt;td>❌ failure&lt;/td>
 &lt;td>💀 Stale + failing&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>@mattermost/testcontainers&lt;/td>
 &lt;td>e2e-tests-testcontainers-check.yml&lt;/td>
 &lt;td>2026-02-20&lt;/td>
 &lt;td>✅ success&lt;/td>
 &lt;td>💀 39 days stale&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;h3 id="e2e-ai-agents-experimental">E2E AI Agents (Experimental)&lt;/h3>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Workflow&lt;/th>
 &lt;th>Path&lt;/th>
 &lt;th>Last Run&lt;/th>
 &lt;th>Result&lt;/th>
 &lt;th>Status&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>e2e-ai-test-generation&lt;/td>
 &lt;td>e2e-ai-test-generation.yml&lt;/td>
 &lt;td>2026-02-18&lt;/td>
 &lt;td>❌ failure&lt;/td>
 &lt;td>💀 Stale + failing&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>e2e-test-execution&lt;/td>
 &lt;td>e2e-test-execution.yml&lt;/td>
 &lt;td>2026-02-18&lt;/td>
 &lt;td>❌ failure&lt;/td>
 &lt;td>💀 Stale + failing&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>E2E-Agents Impact Analysis&lt;/td>
 &lt;td>e2e-ai-impact-analysis.yml&lt;/td>
 &lt;td>2026-02-18&lt;/td>
 &lt;td>✅ success&lt;/td>
 &lt;td>💀 41 days stale&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>E2E-Agents Gap Analysis&lt;/td>
 &lt;td>e2e-ai-gap-check.yml&lt;/td>
 &lt;td>2026-02-18&lt;/td>
 &lt;td>✅ success&lt;/td>
 &lt;td>💀 41 days stale&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;h3 id="security--supply-chain">Security &amp;amp; Supply Chain&lt;/h3>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Workflow&lt;/th>
 &lt;th>Path&lt;/th>
 &lt;th>Last Run&lt;/th>
 &lt;th>Result&lt;/th>
 &lt;th>Trigger&lt;/th>
 &lt;th>Status&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>CodeQL&lt;/td>
 &lt;td>codeql-analysis.yml&lt;/td>
 &lt;td>2026-03-31&lt;/td>
 &lt;td>✅ success&lt;/td>
 &lt;td>PR&lt;/td>
 &lt;td>✅ Active&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Scorecards supply-chain security&lt;/td>
 &lt;td>scorecards-analysis.yml&lt;/td>
 &lt;td>2026-03-31&lt;/td>
 &lt;td>✅ success&lt;/td>
 &lt;td>schedule&lt;/td>
 &lt;td>✅ Active&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Snyk SBOM&lt;/td>
 &lt;td>snyk-sbom.yml&lt;/td>
 &lt;td>2025-10-30&lt;/td>
 &lt;td>❌ failure&lt;/td>
 &lt;td>release&lt;/td>
 &lt;td>💀 &lt;strong>5 months stale&lt;/strong>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Detect GHRC Typosquatting&lt;/td>
 &lt;td>detect-ghrc-typosquatting.yml&lt;/td>
 &lt;td>2025-08-26&lt;/td>
 &lt;td>✅ success&lt;/td>
 &lt;td>PR&lt;/td>
 &lt;td>💀 &lt;strong>7 months stale&lt;/strong>&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;h3 id="infrastructure--build">Infrastructure &amp;amp; Build&lt;/h3>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Workflow&lt;/th>
 &lt;th>Path&lt;/th>
 &lt;th>Last Run&lt;/th>
 &lt;th>Result&lt;/th>
 &lt;th>Trigger&lt;/th>
 &lt;th>Status&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>BuildEnv Docker Image&lt;/td>
 &lt;td>build-server-image.yml&lt;/td>
 &lt;td>2026-03-30&lt;/td>
 &lt;td>❌ failure&lt;/td>
 &lt;td>PR&lt;/td>
 &lt;td>⚠️ Failing&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Opensearch Docker Image&lt;/td>
 &lt;td>build-opensearch-image.yml&lt;/td>
 &lt;td>2026-03-07&lt;/td>
 &lt;td>✅ success&lt;/td>
 &lt;td>push&lt;/td>
 &lt;td>✅ Active&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Push mirrored docker images&lt;/td>
 &lt;td>docker-push-mirrored.yml&lt;/td>
 &lt;td>2026-01-20&lt;/td>
 &lt;td>✅ success&lt;/td>
 &lt;td>push&lt;/td>
 &lt;td>💀 70 days stale&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Sentry Upload&lt;/td>
 &lt;td>sentry.yaml&lt;/td>
 &lt;td>2026-03-31&lt;/td>
 &lt;td>✅ success&lt;/td>
 &lt;td>workflow_run&lt;/td>
 &lt;td>✅ Active&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;h3 id="ai-assistants--code-review">AI Assistants &amp;amp; Code Review&lt;/h3>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Workflow&lt;/th>
 &lt;th>Path&lt;/th>
 &lt;th>Last Run&lt;/th>
 &lt;th>Result&lt;/th>
 &lt;th>Trigger&lt;/th>
 &lt;th>Status&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>Claude Code&lt;/td>
 &lt;td>claude.yml&lt;/td>
 &lt;td>2026-03-31&lt;/td>
 &lt;td>⏭️ skipped&lt;/td>
 &lt;td>issue_comment&lt;/td>
 &lt;td>✅ Active&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Copilot code review&lt;/td>
 &lt;td>(dynamic)&lt;/td>
 &lt;td>2026-03-17&lt;/td>
 &lt;td>✅ success&lt;/td>
 &lt;td>dynamic&lt;/td>
 &lt;td>✅ Active&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Copilot coding agent&lt;/td>
 &lt;td>(dynamic)&lt;/td>
 &lt;td>2025-11-12&lt;/td>
 &lt;td>❌ cancelled&lt;/td>
 &lt;td>dynamic&lt;/td>
 &lt;td>💀 &lt;strong>4.5 months stale&lt;/strong>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Documentation Impact Review&lt;/td>
 &lt;td>docs-impact-review.yml&lt;/td>
 &lt;td>2026-03-31&lt;/td>
 &lt;td>❌ failure&lt;/td>
 &lt;td>PR&lt;/td>
 &lt;td>⚠️ Failing&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;h3 id="developer-docs">Developer Docs&lt;/h3>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Workflow&lt;/th>
 &lt;th>Path&lt;/th>
 &lt;th>Last Run&lt;/th>
 &lt;th>Result&lt;/th>
 &lt;th>Trigger&lt;/th>
 &lt;th>Status&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>Developer Docs Build&lt;/td>
 &lt;td>dev-docs-build.yml&lt;/td>
 &lt;td>2026-03-06&lt;/td>
 &lt;td>✅ success&lt;/td>
 &lt;td>PR&lt;/td>
 &lt;td>✅ Active&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Developer Docs Preview&lt;/td>
 &lt;td>dev-docs-preview-env.yml&lt;/td>
 &lt;td>2026-03-06&lt;/td>
 &lt;td>❌ failure&lt;/td>
 &lt;td>PR&lt;/td>
 &lt;td>⚠️ Failing&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>dev-docs-check-label-preview-env&lt;/td>
 &lt;td>dev-docs-check-label.yml&lt;/td>
 &lt;td>2026-03-05&lt;/td>
 &lt;td>⏭️ skipped&lt;/td>
 &lt;td>PR&lt;/td>
 &lt;td>✅ Active&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;h3 id="pr-analysis--testing">PR Analysis &amp;amp; Testing&lt;/h3>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Workflow&lt;/th>
 &lt;th>Path&lt;/th>
 &lt;th>Last Run&lt;/th>
 &lt;th>Result&lt;/th>
 &lt;th>Trigger&lt;/th>
 &lt;th>Status&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>PR Test Analysis&lt;/td>
 &lt;td>pr-test-analysis.yml&lt;/td>
 &lt;td>2026-03-31&lt;/td>
 &lt;td>✅ success&lt;/td>
 &lt;td>PR&lt;/td>
 &lt;td>✅ Active&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Tests/included&lt;/td>
 &lt;td>pr-test-analyzer.yml&lt;/td>
 &lt;td>2026-03-10&lt;/td>
 &lt;td>❌ cancelled&lt;/td>
 &lt;td>PR&lt;/td>
 &lt;td>✅ Active&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Tests/verified&lt;/td>
 &lt;td>pr-test-analysis-verified.yml&lt;/td>
 &lt;td>2026-03-11&lt;/td>
 &lt;td>⏭️ skipped&lt;/td>
 &lt;td>PR&lt;/td>
 &lt;td>✅ Active&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>PR Test Analysis Override&lt;/td>
 &lt;td>pr-test-analysis-override.yml&lt;/td>
 &lt;td>2026-03-31&lt;/td>
 &lt;td>⏭️ skipped&lt;/td>
 &lt;td>issue_comment&lt;/td>
 &lt;td>✅ Active&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;h3 id="dependency-management--misc">Dependency Management &amp;amp; Misc&lt;/h3>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Workflow&lt;/th>
 &lt;th>Path&lt;/th>
 &lt;th>Last Run&lt;/th>
 &lt;th>Result&lt;/th>
 &lt;th>Trigger&lt;/th>
 &lt;th>Status&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>Dependabot Updates&lt;/td>
 &lt;td>(dynamic)&lt;/td>
 &lt;td>2026-03-30&lt;/td>
 &lt;td>✅ success&lt;/td>
 &lt;td>dynamic&lt;/td>
 &lt;td>✅ Active&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Dependency Graph&lt;/td>
 &lt;td>(dynamic)&lt;/td>
 &lt;td>2026-03-27&lt;/td>
 &lt;td>✅ success&lt;/td>
 &lt;td>dynamic&lt;/td>
 &lt;td>✅ Active&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Tag Public Module&lt;/td>
 &lt;td>tag-public-module.yaml&lt;/td>
 &lt;td>2026-03-10&lt;/td>
 &lt;td>✅ success&lt;/td>
 &lt;td>dispatch&lt;/td>
 &lt;td>❓ Manual&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Lighthouse Metrics&lt;/td>
 &lt;td>lighthouse.yml&lt;/td>
 &lt;td>2025-12-16&lt;/td>
 &lt;td>✅ success&lt;/td>
 &lt;td>dispatch&lt;/td>
 &lt;td>💀 &lt;strong>3.5 months stale&lt;/strong>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>ESR Upgrade&lt;/td>
 &lt;td>esrupgrade.yml&lt;/td>
 &lt;td>2025-07-23&lt;/td>
 &lt;td>❌ failure&lt;/td>
 &lt;td>push&lt;/td>
 &lt;td>🔇 &lt;strong>Disabled&lt;/strong>&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;h2 id="cleanup-recommendations">Cleanup Recommendations&lt;/h2>
&lt;h3 id="-priority-1--delete-immediately-stale-failing-never-run">🔴 Priority 1 — Delete Immediately (stale, failing, never run)&lt;/h3>
&lt;p>These workflows provide zero value and clutter the Actions tab.&lt;/p></description></item><item><title>AWS Self-Hosted GitHub Runners</title><link>https://mmworkbrain.pages.dev/docs/infrastructure/aws-github-runners/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://mmworkbrain.pages.dev/docs/infrastructure/aws-github-runners/</guid><description>&lt;p>Evaluation of complementing GitHub-hosted runners with self-hosted runners on AWS to reduce CI queue times and costs.&lt;/p>
&lt;h2 id="background">Background&lt;/h2>
&lt;p>After enabling test sharding and fullyparallel mode, each merge to &lt;code>mattermost/mattermost&lt;/code> spawns ~50+ concurrent jobs (4 test shards, 4 FIPS shards, 4 coverage shards, 40 Cypress E2E workers, 4 Playwright workers, plus lint/build/checks). Individual jobs complete faster (7-9 min vs 25-30 min), but peak concurrency is much higher, causing queue delays when multiple merges land close together.&lt;/p></description></item><item><title>Config Pending Restart / Reload API</title><link>https://mmworkbrain.pages.dev/docs/investigations/config-pending-restart-api/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://mmworkbrain.pages.dev/docs/investigations/config-pending-restart-api/</guid><description>&lt;h2 id="current-config-change-architecture">Current Config Change Architecture&lt;/h2>
&lt;h3 id="config-store-serverconfigstorego">Config Store (&lt;code>server/config/store.go&lt;/code>)&lt;/h3>
&lt;p>The &lt;code>Store&lt;/code> struct wraps a backing store (file or database) and manages config state:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>&lt;code>Set()&lt;/code> (line 168)&lt;/strong> — Validates new config, persists via backing store, compares old/new, and if changed calls &lt;code>invokeConfigListeners(oldCfg, newCfg)&lt;/code>.&lt;/li>
&lt;li>&lt;strong>&lt;code>Load()&lt;/code> (line 244)&lt;/strong> — Reads config from backing store, applies defaults/env overrides, invokes listeners if changed.&lt;/li>
&lt;/ul>
&lt;h3 id="api-layer-serverchannelsapi4configgo">API Layer (&lt;code>server/channels/api4/config.go&lt;/code>)&lt;/h3>
&lt;p>Routes registered in &lt;code>InitConfig()&lt;/code> (line 33):&lt;/p>
&lt;ul>
&lt;li>&lt;code>PUT /config&lt;/code> → &lt;code>updateConfig&lt;/code> (line 120) — Full config replacement&lt;/li>
&lt;li>&lt;code>PUT /config/patch&lt;/code> → &lt;code>patchConfig&lt;/code> (line 279) — Partial update&lt;/li>
&lt;li>&lt;strong>&lt;code>POST /config/reload&lt;/code> → &lt;code>configReload&lt;/code> (line 100)&lt;/strong> — Already exists! Calls &lt;code>ReloadConfig()&lt;/code> which calls &lt;code>configStore.Load()&lt;/code>&lt;/li>
&lt;/ul>
&lt;h3 id="save-flow">Save Flow&lt;/h3>
&lt;ol>
&lt;li>API handler calls &lt;code>App.SaveConfig()&lt;/code> → &lt;code>PlatformService.SaveConfig()&lt;/code> (line 91 in &lt;code>server/channels/app/platform/config.go&lt;/code>)&lt;/li>
&lt;li>Plugin hook &lt;code>ConfigurationWillBeSaved&lt;/code> fires&lt;/li>
&lt;li>&lt;code>configStore.Set(newCfg)&lt;/code> persists and invokes listeners&lt;/li>
&lt;li>Cluster notification via &lt;code>clusterIFace.ConfigChanged()&lt;/code>&lt;/li>
&lt;/ol>
&lt;h3 id="config-listener-system">Config Listener System&lt;/h3>
&lt;p>&lt;code>AddConfigListener(func(old, new *model.Config))&lt;/code> registers callbacks invoked on every config change. Key registrations:&lt;/p></description></item><item><title>Nick Misasi — Human–Agent Teaming with Cursor</title><link>https://mmworkbrain.pages.dev/docs/engineering/nick-misasi-cursor-workflow/</link><pubDate>Mon, 14 Sep 2026 00:00:00 +0000</pubDate><guid>https://mmworkbrain.pages.dev/docs/engineering/nick-misasi-cursor-workflow/</guid><description>&lt;p>Analysis of Nick Misasi&amp;rsquo;s writeup on 60 days of human–agent teaming using Cursor and Cursor Cloud Agents, posted to Private Core on September 14, 2026.&lt;/p>
&lt;h2 id="core-philosophy">Core Philosophy&lt;/h2>
&lt;p>The human stays the architect, agents are the labor force. Nick plans, decides what&amp;rsquo;s done, merges, and owns what gets said publicly. Agents implement, unstick blocked work, and do first-pass review.&lt;/p>
&lt;h2 id="toolchain">Toolchain&lt;/h2>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Tool&lt;/th>
 &lt;th>Role&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>&lt;strong>Cursor IDE&lt;/strong>&lt;/td>
 &lt;td>Local &amp;ldquo;control plane&amp;rdquo; — planning, spawning agents, deciding when work is done&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>Cursor Cloud Agents&lt;/strong>&lt;/td>
 &lt;td>Remote sandboxed agents that clone repos and open PRs without touching the laptop&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>cursorctl&lt;/strong>&lt;/td>
 &lt;td>CLI to spawn/follow-up/inspect cloud agents programmatically (&lt;a href="https://github.com/nickmisasi/cursor-utils/pull/1">cursor-utils#1&lt;/a>, &lt;a href="https://github.com/mattermost/mattermost-ai-marketplace/pull/26">ai-marketplace#26&lt;/a>)&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>Cloud Agent Environments&lt;/strong>&lt;/td>
 &lt;td>Pre-configured remote workspaces with repo access, tools, credentials&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>GitHub Cursor Webhook&lt;/strong>&lt;/td>
 &lt;td>Triggers agents automatically from GitHub events (CI failure, review comment)&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;h2 id="key-workflow-patterns">Key Workflow Patterns&lt;/h2>
&lt;h3 id="1-follow-up-is-the-default-not-a-restart">1. Follow-up is the default, not a restart&lt;/h3>
&lt;p>When a cloud agent finishes a task, Nick sends it &lt;em>back&lt;/em> to the same agent for the next step (fix CI, address review). 75% of his agents had 2+ runs. This preserves context — the agent already knows the code, the PR, the intent.&lt;/p></description></item><item><title>CodeRabbit: Full Repository Review</title><link>https://mmworkbrain.pages.dev/docs/platform/coderabbit-full-repo-review/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://mmworkbrain.pages.dev/docs/platform/coderabbit-full-repo-review/</guid><description>&lt;p>CodeRabbit only reviews PR diffs — there&amp;rsquo;s no &amp;ldquo;scan entire repo&amp;rdquo; button. But you can trick it by constructing a PR where every file appears as a new addition.&lt;/p>
&lt;h2 id="the-working-approach">The Working Approach&lt;/h2>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#57606a"># 1. Clone the repo&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>gh repo clone org/repo &lt;span style="color:#0550ae">&amp;amp;&amp;amp;&lt;/span> &lt;span style="color:#6639ba">cd&lt;/span> repo
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#57606a"># 2. Create a branch that deletes everything&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>git checkout -b empty-base
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>git rm -rf .
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>git commit --allow-empty -m &lt;span style="color:#0a3069">&amp;#34;empty base for full repo review&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>git push origin empty-base
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#57606a"># 3. Branch off that, restore all files from main&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>git checkout -b restore-all-files
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>git checkout main -- .
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>git add -A
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>git commit -m &lt;span style="color:#0a3069">&amp;#34;restore all files for review&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>git push origin restore-all-files
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#57606a"># 4. Open PR: restore-all-files → empty-base&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#57606a"># (all files show as additions, shared history with main)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>gh pr create --base empty-base --head restore-all-files &lt;span style="color:#0a3069">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069">&lt;/span> --title &lt;span style="color:#0a3069">&amp;#34;chore: CodeRabbit full repository review&amp;#34;&lt;/span> &lt;span style="color:#0a3069">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069">&lt;/span> --body &lt;span style="color:#0a3069">&amp;#34;Temporary PR for full CodeRabbit analysis. Do not merge.&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#57606a"># 5. If CodeRabbit doesn&amp;#39;t auto-trigger (non-default base branch),&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#57606a"># summon it manually:&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>gh api repos/org/repo/issues/NUMBER/comments &lt;span style="color:#0a3069">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069">&lt;/span> -f &lt;span style="color:#953800">body&lt;/span>&lt;span style="color:#0550ae">=&lt;/span>&lt;span style="color:#0a3069">&amp;#34;@coderabbitai full review&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="why-this-works">Why This Works&lt;/h2>
&lt;ul>
&lt;li>&lt;code>empty-base&lt;/code> branches off &lt;code>main&lt;/code> (shared history → GitHub allows the PR)&lt;/li>
&lt;li>Then deletes all files (empty tree)&lt;/li>
&lt;li>&lt;code>restore-all-files&lt;/code> branches off &lt;code>empty-base&lt;/code> and restores everything from &lt;code>main&lt;/code>&lt;/li>
&lt;li>The PR diff: 0 deletions, all files as additions → CodeRabbit reviews everything&lt;/li>
&lt;/ul>
&lt;h2 id="what-doesnt-work">What Doesn&amp;rsquo;t Work&lt;/h2>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Approach&lt;/th>
 &lt;th>Why it fails&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>Delete-all → restore-all on same branch, PR into main&lt;/td>
 &lt;td>GitHub computes net diff = zero files changed&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Orphan branch (no common history)&lt;/td>
 &lt;td>GitHub rejects: &amp;ldquo;no history in common&amp;rdquo;&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Branch that deletes everything, PR into main&lt;/td>
 &lt;td>All files show as deletions — CodeRabbit ignores removed code&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>Trigger file + &lt;code>@coderabbitai full review&lt;/code>&lt;/td>
 &lt;td>&lt;code>full review&lt;/code> only reviews files in the PR diff, not the whole repo&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;h2 id="after-review">After Review&lt;/h2>
&lt;ul>
&lt;li>Address findings via separate PRs on &lt;code>main&lt;/code>&lt;/li>
&lt;li>Close the review PR (don&amp;rsquo;t merge)&lt;/li>
&lt;li>Delete both branches: &lt;code>empty-base&lt;/code> and &lt;code>restore-all-files&lt;/code>&lt;/li>
&lt;/ul>
&lt;h2 id="notes">Notes&lt;/h2>
&lt;ul>
&lt;li>CodeRabbit may not auto-trigger on PRs targeting non-default branches — use &lt;code>@coderabbitai full review&lt;/code> to summon it&lt;/li>
&lt;li>For large repos, CodeRabbit may cap at ~300 files per review&lt;/li>
&lt;li>This is a one-time trick for onboarding repos; ongoing reviews happen naturally via normal PRs&lt;/li>
&lt;/ul>
&lt;h2 id="first-used">First Used&lt;/h2>
&lt;ul>
&lt;li>&lt;strong>April 2, 2026&lt;/strong> on &lt;code>mattermost/terraform-provider-mattermost&lt;/code> → &lt;a href="https://github.com/mattermost/terraform-provider-mattermost/pull/51">PR #51&lt;/a>&lt;/li>
&lt;li>Found 11 issues across Go provider code, dependency security, and documentation&lt;/li>
&lt;li>Took 5 attempts to get the git trick right (PRs #47–#51)&lt;/li>
&lt;/ul></description></item><item><title>Salesforce Org History — How We Got Here</title><link>https://mmworkbrain.pages.dev/docs/engineering/sfdc-org-timeline/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://mmworkbrain.pages.dev/docs/engineering/sfdc-org-timeline/</guid><description>&lt;p>Chronological timeline of the Mattermost Salesforce org, reconstructed from
user creation dates, trigger installation dates, validation rule creation dates,
and Apex class metadata. Data sourced from partial sandbox (&lt;code>mattermost--partialsb&lt;/code>).&lt;/p>
&lt;hr>
&lt;h2 id="2016--org-creation">2016 — Org Creation&lt;/h2>
&lt;ul>
&lt;li>&lt;strong>May 2016:&lt;/strong> Steve Green (pSales profile) — first user, likely the founding sales rep&lt;/li>
&lt;li>&lt;strong>Aug 2016:&lt;/strong> Hanna Park joins as first admin/ops person
&lt;ul>
&lt;li>Creates first validation rule: &lt;code>CLOSE_LOST_REQ_Loss_Reason&lt;/code> on Opportunity&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;h2 id="2017--early-growth">2017 — Early Growth&lt;/h2>
&lt;ul>
&lt;li>&lt;strong>Mar–Jul 2017:&lt;/strong> Wave of Minimum Access users added (Niall McCarthy, Niamh Merritt, Nirmalya De, Omar Zaibak, Samiksha Khanna) — early engineering/product team getting read-only access&lt;/li>
&lt;li>&lt;strong>May 2017:&lt;/strong> Gavin Beeman — first sales hire still active today&lt;/li>
&lt;li>&lt;strong>Jul 2017:&lt;/strong> Hanna Park installs &lt;strong>ClearBit (cbit)&lt;/strong> — first managed package, used for data enrichment. Adds triggers on Account, Contact, Lead&lt;/li>
&lt;li>&lt;strong>Aug 2017:&lt;/strong> Hanna Park creates &lt;code>NDA_Expiration_Date&lt;/code> validation rule on Account&lt;/li>
&lt;/ul>
&lt;h2 id="2018--first-integrations">2018 — First Integrations&lt;/h2>
&lt;ul>
&lt;li>&lt;strong>Apr 2018:&lt;/strong> Eric Mowery installs &lt;strong>DiscoverOrg (DSCORGPKG)&lt;/strong> — B2B contact data enrichment. 6 triggers added to Account, Contact, Lead&lt;/li>
&lt;li>&lt;strong>Jul 2018:&lt;/strong> Marianne Lynch writes first custom Apex code — territory management triggers (&lt;code>FindTerritoryID&lt;/code>, &lt;code>UpdateAccountTerritoryIDv1&lt;/code>). These are still active today, 8 years later.&lt;/li>
&lt;/ul>
&lt;h2 id="2019--the-aorta-systems-era">2019 — The Aorta Systems Era&lt;/h2>
&lt;p>A Salesforce consulting firm is brought in to build out the core sales operations workflow. This is the most consequential period in the org&amp;rsquo;s history.&lt;/p></description></item><item><title>Website Link Checking Scripts</title><link>https://mmworkbrain.pages.dev/docs/engineering/website-link-checking-scripts/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://mmworkbrain.pages.dev/docs/engineering/website-link-checking-scripts/</guid><description>&lt;p>Two Python scripts for validating links on the Mattermost website (production or staging). Both are async, use &lt;code>aiohttp&lt;/code>, and are designed for CI or ad-hoc use.&lt;/p>
&lt;h2 id="1-redirect-target-validator">1. Redirect Target Validator&lt;/h2>
&lt;p>Tests that all redirect target URLs in the explicit redirects CSV actually resolve (not 404). Pulls the CSV directly from GitHub via &lt;code>gh&lt;/code> CLI, or accepts a local file.&lt;/p>
&lt;p>&lt;strong>Requirements:&lt;/strong> &lt;code>pip install aiohttp&lt;/code>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-python" data-lang="python">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#57606a">#!/usr/bin/env python3&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069">&amp;#34;&amp;#34;&amp;#34;Test that all redirect target URLs in the explicit redirects CSV resolve (not 404).
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069">Usage:
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069"> python test-redirect-targets.py # staging (default)
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069"> python test-redirect-targets.py --base https://mattermost.com # production
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069"> python test-redirect-targets.py --csv path/to/local.csv # local CSV file
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069">Requirements: pip install aiohttp
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069">&amp;#34;&amp;#34;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#cf222e">import&lt;/span> &lt;span style="color:#24292e">argparse&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#cf222e">import&lt;/span> &lt;span style="color:#24292e">asyncio&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#cf222e">import&lt;/span> &lt;span style="color:#24292e">csv&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#cf222e">import&lt;/span> &lt;span style="color:#24292e">io&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#cf222e">import&lt;/span> &lt;span style="color:#24292e">subprocess&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#cf222e">import&lt;/span> &lt;span style="color:#24292e">sys&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#cf222e">from&lt;/span> &lt;span style="color:#24292e">dataclasses&lt;/span> &lt;span style="color:#cf222e">import&lt;/span> dataclass
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#cf222e">import&lt;/span> &lt;span style="color:#24292e">aiohttp&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>DEFAULT_BASE &lt;span style="color:#0550ae">=&lt;/span> &lt;span style="color:#0a3069">&amp;#34;https://web.mattermost.workers.dev&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>GH_CSV_PATH &lt;span style="color:#0550ae">=&lt;/span> &lt;span style="color:#0a3069">&amp;#34;repos/mattermost/mattermost-website/contents/docs/cloudflare-redirects/1-explicit-redirects.csv&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>CONCURRENCY &lt;span style="color:#0550ae">=&lt;/span> &lt;span style="color:#0550ae">5&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>TIMEOUT &lt;span style="color:#0550ae">=&lt;/span> &lt;span style="color:#0550ae">15&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>DELAY &lt;span style="color:#0550ae">=&lt;/span> &lt;span style="color:#0550ae">0.2&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0550ae">@dataclass&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#cf222e">class&lt;/span> &lt;span style="color:#1f2328">Result&lt;/span>&lt;span style="color:#1f2328">:&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> source&lt;span style="color:#1f2328">:&lt;/span> &lt;span style="color:#6639ba">str&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> target&lt;span style="color:#1f2328">:&lt;/span> &lt;span style="color:#6639ba">str&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> test_url&lt;span style="color:#1f2328">:&lt;/span> &lt;span style="color:#6639ba">str&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> status&lt;span style="color:#1f2328">:&lt;/span> &lt;span style="color:#6639ba">int&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ok&lt;span style="color:#1f2328">:&lt;/span> &lt;span style="color:#6639ba">bool&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#cf222e">def&lt;/span> &lt;span style="color:#6639ba">fetch_csv_from_github&lt;/span>&lt;span style="color:#1f2328">()&lt;/span> &lt;span style="color:#0550ae">-&amp;gt;&lt;/span> &lt;span style="color:#6639ba">str&lt;/span>&lt;span style="color:#1f2328">:&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#0a3069">&amp;#34;&amp;#34;&amp;#34;Pull the CSV content via gh CLI.&amp;#34;&amp;#34;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> result &lt;span style="color:#0550ae">=&lt;/span> subprocess&lt;span style="color:#0550ae">.&lt;/span>run&lt;span style="color:#1f2328">(&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#1f2328">[&lt;/span>&lt;span style="color:#0a3069">&amp;#34;gh&amp;#34;&lt;/span>&lt;span style="color:#1f2328">,&lt;/span> &lt;span style="color:#0a3069">&amp;#34;api&amp;#34;&lt;/span>&lt;span style="color:#1f2328">,&lt;/span> GH_CSV_PATH&lt;span style="color:#1f2328">,&lt;/span> &lt;span style="color:#0a3069">&amp;#34;--jq&amp;#34;&lt;/span>&lt;span style="color:#1f2328">,&lt;/span> &lt;span style="color:#0a3069">&amp;#34;.content&amp;#34;&lt;/span>&lt;span style="color:#1f2328">],&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> capture_output&lt;span style="color:#0550ae">=&lt;/span>&lt;span style="color:#cf222e">True&lt;/span>&lt;span style="color:#1f2328">,&lt;/span> text&lt;span style="color:#0550ae">=&lt;/span>&lt;span style="color:#cf222e">True&lt;/span>&lt;span style="color:#1f2328">,&lt;/span> check&lt;span style="color:#0550ae">=&lt;/span>&lt;span style="color:#cf222e">True&lt;/span>&lt;span style="color:#1f2328">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#1f2328">)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#cf222e">import&lt;/span> &lt;span style="color:#24292e">base64&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#cf222e">return&lt;/span> base64&lt;span style="color:#0550ae">.&lt;/span>b64decode&lt;span style="color:#1f2328">(&lt;/span>result&lt;span style="color:#0550ae">.&lt;/span>stdout&lt;span style="color:#0550ae">.&lt;/span>strip&lt;span style="color:#1f2328">())&lt;/span>&lt;span style="color:#0550ae">.&lt;/span>decode&lt;span style="color:#1f2328">()&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#cf222e">def&lt;/span> &lt;span style="color:#6639ba">load_rows&lt;/span>&lt;span style="color:#1f2328">(&lt;/span>csv_path&lt;span style="color:#1f2328">:&lt;/span> &lt;span style="color:#6639ba">str&lt;/span> &lt;span style="color:#0550ae">|&lt;/span> &lt;span style="color:#cf222e">None&lt;/span>&lt;span style="color:#1f2328">)&lt;/span> &lt;span style="color:#0550ae">-&amp;gt;&lt;/span> &lt;span style="color:#6639ba">list&lt;/span>&lt;span style="color:#1f2328">[&lt;/span>&lt;span style="color:#6639ba">dict&lt;/span>&lt;span style="color:#1f2328">]:&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#cf222e">if&lt;/span> csv_path&lt;span style="color:#1f2328">:&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#cf222e">with&lt;/span> &lt;span style="color:#6639ba">open&lt;/span>&lt;span style="color:#1f2328">(&lt;/span>csv_path&lt;span style="color:#1f2328">)&lt;/span> &lt;span style="color:#cf222e">as&lt;/span> f&lt;span style="color:#1f2328">:&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#cf222e">return&lt;/span> &lt;span style="color:#6639ba">list&lt;/span>&lt;span style="color:#1f2328">(&lt;/span>csv&lt;span style="color:#0550ae">.&lt;/span>DictReader&lt;span style="color:#1f2328">(&lt;/span>f&lt;span style="color:#1f2328">))&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#cf222e">else&lt;/span>&lt;span style="color:#1f2328">:&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#cf222e">return&lt;/span> &lt;span style="color:#6639ba">list&lt;/span>&lt;span style="color:#1f2328">(&lt;/span>csv&lt;span style="color:#0550ae">.&lt;/span>DictReader&lt;span style="color:#1f2328">(&lt;/span>io&lt;span style="color:#0550ae">.&lt;/span>StringIO&lt;span style="color:#1f2328">(&lt;/span>fetch_csv_from_github&lt;span style="color:#1f2328">())))&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#cf222e">def&lt;/span> &lt;span style="color:#6639ba">rewrite_url&lt;/span>&lt;span style="color:#1f2328">(&lt;/span>target&lt;span style="color:#1f2328">:&lt;/span> &lt;span style="color:#6639ba">str&lt;/span>&lt;span style="color:#1f2328">,&lt;/span> base&lt;span style="color:#1f2328">:&lt;/span> &lt;span style="color:#6639ba">str&lt;/span>&lt;span style="color:#1f2328">)&lt;/span> &lt;span style="color:#0550ae">-&amp;gt;&lt;/span> &lt;span style="color:#6639ba">str&lt;/span>&lt;span style="color:#1f2328">:&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#cf222e">if&lt;/span> target&lt;span style="color:#0550ae">.&lt;/span>startswith&lt;span style="color:#1f2328">(&lt;/span>&lt;span style="color:#0a3069">&amp;#34;https://mattermost.com&amp;#34;&lt;/span>&lt;span style="color:#1f2328">):&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#cf222e">return&lt;/span> target&lt;span style="color:#0550ae">.&lt;/span>replace&lt;span style="color:#1f2328">(&lt;/span>&lt;span style="color:#0a3069">&amp;#34;https://mattermost.com&amp;#34;&lt;/span>&lt;span style="color:#1f2328">,&lt;/span> base&lt;span style="color:#1f2328">,&lt;/span> &lt;span style="color:#0550ae">1&lt;/span>&lt;span style="color:#1f2328">)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#cf222e">return&lt;/span> target
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#cf222e">async&lt;/span> &lt;span style="color:#cf222e">def&lt;/span> &lt;span style="color:#6639ba">check_url&lt;/span>&lt;span style="color:#1f2328">(&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> sem&lt;span style="color:#1f2328">:&lt;/span> asyncio&lt;span style="color:#0550ae">.&lt;/span>Semaphore&lt;span style="color:#1f2328">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> session&lt;span style="color:#1f2328">:&lt;/span> aiohttp&lt;span style="color:#0550ae">.&lt;/span>ClientSession&lt;span style="color:#1f2328">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> source&lt;span style="color:#1f2328">:&lt;/span> &lt;span style="color:#6639ba">str&lt;/span>&lt;span style="color:#1f2328">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> target&lt;span style="color:#1f2328">:&lt;/span> &lt;span style="color:#6639ba">str&lt;/span>&lt;span style="color:#1f2328">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> base&lt;span style="color:#1f2328">:&lt;/span> &lt;span style="color:#6639ba">str&lt;/span>&lt;span style="color:#1f2328">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#1f2328">)&lt;/span> &lt;span style="color:#0550ae">-&amp;gt;&lt;/span> Result&lt;span style="color:#1f2328">:&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> test_url &lt;span style="color:#0550ae">=&lt;/span> rewrite_url&lt;span style="color:#1f2328">(&lt;/span>target&lt;span style="color:#1f2328">,&lt;/span> base&lt;span style="color:#1f2328">)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#cf222e">async&lt;/span> &lt;span style="color:#cf222e">with&lt;/span> sem&lt;span style="color:#1f2328">:&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#cf222e">try&lt;/span>&lt;span style="color:#1f2328">:&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#cf222e">async&lt;/span> &lt;span style="color:#cf222e">with&lt;/span> session&lt;span style="color:#0550ae">.&lt;/span>head&lt;span style="color:#1f2328">(&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> test_url&lt;span style="color:#1f2328">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> timeout&lt;span style="color:#0550ae">=&lt;/span>aiohttp&lt;span style="color:#0550ae">.&lt;/span>ClientTimeout&lt;span style="color:#1f2328">(&lt;/span>total&lt;span style="color:#0550ae">=&lt;/span>TIMEOUT&lt;span style="color:#1f2328">),&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> allow_redirects&lt;span style="color:#0550ae">=&lt;/span>&lt;span style="color:#cf222e">False&lt;/span>&lt;span style="color:#1f2328">,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#1f2328">)&lt;/span> &lt;span style="color:#cf222e">as&lt;/span> resp&lt;span style="color:#1f2328">:&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> status &lt;span style="color:#0550ae">=&lt;/span> resp&lt;span style="color:#0550ae">.&lt;/span>status
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#cf222e">except&lt;/span> Exception&lt;span style="color:#1f2328">:&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> status &lt;span style="color:#0550ae">=&lt;/span> &lt;span style="color:#0550ae">0&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#cf222e">await&lt;/span> asyncio&lt;span style="color:#0550ae">.&lt;/span>sleep&lt;span style="color:#1f2328">(&lt;/span>DELAY&lt;span style="color:#1f2328">)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ok &lt;span style="color:#0550ae">=&lt;/span> status &lt;span style="color:#0550ae">in&lt;/span> &lt;span style="color:#1f2328">(&lt;/span>&lt;span style="color:#0550ae">200&lt;/span>&lt;span style="color:#1f2328">,&lt;/span> &lt;span style="color:#0550ae">301&lt;/span>&lt;span style="color:#1f2328">,&lt;/span> &lt;span style="color:#0550ae">302&lt;/span>&lt;span style="color:#1f2328">)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#cf222e">return&lt;/span> Result&lt;span style="color:#1f2328">(&lt;/span>source&lt;span style="color:#0550ae">=&lt;/span>source&lt;span style="color:#1f2328">,&lt;/span> target&lt;span style="color:#0550ae">=&lt;/span>target&lt;span style="color:#1f2328">,&lt;/span> test_url&lt;span style="color:#0550ae">=&lt;/span>test_url&lt;span style="color:#1f2328">,&lt;/span> status&lt;span style="color:#0550ae">=&lt;/span>status&lt;span style="color:#1f2328">,&lt;/span> ok&lt;span style="color:#0550ae">=&lt;/span>ok&lt;span style="color:#1f2328">)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#cf222e">async&lt;/span> &lt;span style="color:#cf222e">def&lt;/span> &lt;span style="color:#6639ba">main&lt;/span>&lt;span style="color:#1f2328">(&lt;/span>base&lt;span style="color:#1f2328">:&lt;/span> &lt;span style="color:#6639ba">str&lt;/span>&lt;span style="color:#1f2328">,&lt;/span> csv_path&lt;span style="color:#1f2328">:&lt;/span> &lt;span style="color:#6639ba">str&lt;/span> &lt;span style="color:#0550ae">|&lt;/span> &lt;span style="color:#cf222e">None&lt;/span>&lt;span style="color:#1f2328">):&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> rows &lt;span style="color:#0550ae">=&lt;/span> load_rows&lt;span style="color:#1f2328">(&lt;/span>csv_path&lt;span style="color:#1f2328">)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#6639ba">print&lt;/span>&lt;span style="color:#1f2328">(&lt;/span>&lt;span style="color:#0a3069">f&lt;/span>&lt;span style="color:#0a3069">&amp;#34;Testing &lt;/span>&lt;span style="color:#0a3069">{&lt;/span>&lt;span style="color:#6639ba">len&lt;/span>&lt;span style="color:#1f2328">(&lt;/span>rows&lt;span style="color:#1f2328">)&lt;/span>&lt;span style="color:#0a3069">}&lt;/span>&lt;span style="color:#0a3069"> redirect targets against &lt;/span>&lt;span style="color:#0a3069">{&lt;/span>base&lt;span style="color:#0a3069">}&lt;/span>&lt;span style="color:#0a3069">&amp;#34;&lt;/span>&lt;span style="color:#1f2328">)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#6639ba">print&lt;/span>&lt;span style="color:#1f2328">(&lt;/span>&lt;span style="color:#0a3069">f&lt;/span>&lt;span style="color:#0a3069">&amp;#34;Concurrency: &lt;/span>&lt;span style="color:#0a3069">{&lt;/span>CONCURRENCY&lt;span style="color:#0a3069">}&lt;/span>&lt;span style="color:#0a3069"> | Timeout: &lt;/span>&lt;span style="color:#0a3069">{&lt;/span>TIMEOUT&lt;span style="color:#0a3069">}&lt;/span>&lt;span style="color:#0a3069">s | Delay: &lt;/span>&lt;span style="color:#0a3069">{&lt;/span>DELAY&lt;span style="color:#0a3069">}&lt;/span>&lt;span style="color:#0a3069">s&lt;/span>&lt;span style="color:#0a3069">\n&lt;/span>&lt;span style="color:#0a3069">&amp;#34;&lt;/span>&lt;span style="color:#1f2328">)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> sem &lt;span style="color:#0550ae">=&lt;/span> asyncio&lt;span style="color:#0550ae">.&lt;/span>Semaphore&lt;span style="color:#1f2328">(&lt;/span>CONCURRENCY&lt;span style="color:#1f2328">)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#cf222e">async&lt;/span> &lt;span style="color:#cf222e">with&lt;/span> aiohttp&lt;span style="color:#0550ae">.&lt;/span>ClientSession&lt;span style="color:#1f2328">()&lt;/span> &lt;span style="color:#cf222e">as&lt;/span> session&lt;span style="color:#1f2328">:&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> tasks &lt;span style="color:#0550ae">=&lt;/span> &lt;span style="color:#1f2328">[&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> check_url&lt;span style="color:#1f2328">(&lt;/span>sem&lt;span style="color:#1f2328">,&lt;/span> session&lt;span style="color:#1f2328">,&lt;/span> row&lt;span style="color:#1f2328">[&lt;/span>&lt;span style="color:#0a3069">&amp;#34;source_url&amp;#34;&lt;/span>&lt;span style="color:#1f2328">],&lt;/span> row&lt;span style="color:#1f2328">[&lt;/span>&lt;span style="color:#0a3069">&amp;#34;target_url&amp;#34;&lt;/span>&lt;span style="color:#1f2328">],&lt;/span> base&lt;span style="color:#1f2328">)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#cf222e">for&lt;/span> row &lt;span style="color:#0550ae">in&lt;/span> rows
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#1f2328">]&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> results &lt;span style="color:#0550ae">=&lt;/span> &lt;span style="color:#cf222e">await&lt;/span> asyncio&lt;span style="color:#0550ae">.&lt;/span>gather&lt;span style="color:#1f2328">(&lt;/span>&lt;span style="color:#0550ae">*&lt;/span>tasks&lt;span style="color:#1f2328">)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> passed &lt;span style="color:#0550ae">=&lt;/span> &lt;span style="color:#1f2328">[&lt;/span>r &lt;span style="color:#cf222e">for&lt;/span> r &lt;span style="color:#0550ae">in&lt;/span> results &lt;span style="color:#cf222e">if&lt;/span> r&lt;span style="color:#0550ae">.&lt;/span>ok&lt;span style="color:#1f2328">]&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> failed &lt;span style="color:#0550ae">=&lt;/span> &lt;span style="color:#1f2328">[&lt;/span>r &lt;span style="color:#cf222e">for&lt;/span> r &lt;span style="color:#0550ae">in&lt;/span> results &lt;span style="color:#cf222e">if&lt;/span> &lt;span style="color:#0550ae">not&lt;/span> r&lt;span style="color:#0550ae">.&lt;/span>ok&lt;span style="color:#1f2328">]&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#6639ba">print&lt;/span>&lt;span style="color:#1f2328">(&lt;/span>&lt;span style="color:#0a3069">f&lt;/span>&lt;span style="color:#0a3069">&amp;#34;=== RESULTS ===&amp;#34;&lt;/span>&lt;span style="color:#1f2328">)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#6639ba">print&lt;/span>&lt;span style="color:#1f2328">(&lt;/span>&lt;span style="color:#0a3069">f&lt;/span>&lt;span style="color:#0a3069">&amp;#34;✅ &lt;/span>&lt;span style="color:#0a3069">{&lt;/span>&lt;span style="color:#6639ba">len&lt;/span>&lt;span style="color:#1f2328">(&lt;/span>passed&lt;span style="color:#1f2328">)&lt;/span>&lt;span style="color:#0a3069">}&lt;/span>&lt;span style="color:#0a3069"> ❌ &lt;/span>&lt;span style="color:#0a3069">{&lt;/span>&lt;span style="color:#6639ba">len&lt;/span>&lt;span style="color:#1f2328">(&lt;/span>failed&lt;span style="color:#1f2328">)&lt;/span>&lt;span style="color:#0a3069">}&lt;/span>&lt;span style="color:#0a3069"> (out of &lt;/span>&lt;span style="color:#0a3069">{&lt;/span>&lt;span style="color:#6639ba">len&lt;/span>&lt;span style="color:#1f2328">(&lt;/span>results&lt;span style="color:#1f2328">)&lt;/span>&lt;span style="color:#0a3069">}&lt;/span>&lt;span style="color:#0a3069">)&lt;/span>&lt;span style="color:#0a3069">\n&lt;/span>&lt;span style="color:#0a3069">&amp;#34;&lt;/span>&lt;span style="color:#1f2328">)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#cf222e">if&lt;/span> failed&lt;span style="color:#1f2328">:&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#6639ba">print&lt;/span>&lt;span style="color:#1f2328">(&lt;/span>&lt;span style="color:#0a3069">&amp;#34;--- BROKEN TARGETS ---&amp;#34;&lt;/span>&lt;span style="color:#1f2328">)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#cf222e">for&lt;/span> r &lt;span style="color:#0550ae">in&lt;/span> failed&lt;span style="color:#1f2328">:&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#6639ba">print&lt;/span>&lt;span style="color:#1f2328">(&lt;/span>&lt;span style="color:#0a3069">f&lt;/span>&lt;span style="color:#0a3069">&amp;#34; &lt;/span>&lt;span style="color:#0a3069">{&lt;/span>r&lt;span style="color:#0550ae">.&lt;/span>status&lt;span style="color:#0a3069">}&lt;/span>&lt;span style="color:#0a3069"> | &lt;/span>&lt;span style="color:#0a3069">{&lt;/span>r&lt;span style="color:#0550ae">.&lt;/span>source&lt;span style="color:#0a3069">}&lt;/span>&lt;span style="color:#0a3069"> → &lt;/span>&lt;span style="color:#0a3069">{&lt;/span>r&lt;span style="color:#0550ae">.&lt;/span>target&lt;span style="color:#0a3069">}&lt;/span>&lt;span style="color:#0a3069">&amp;#34;&lt;/span>&lt;span style="color:#1f2328">)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#6639ba">print&lt;/span>&lt;span style="color:#1f2328">()&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> sys&lt;span style="color:#0550ae">.&lt;/span>exit&lt;span style="color:#1f2328">(&lt;/span>&lt;span style="color:#0550ae">1&lt;/span>&lt;span style="color:#1f2328">)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#cf222e">else&lt;/span>&lt;span style="color:#1f2328">:&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#6639ba">print&lt;/span>&lt;span style="color:#1f2328">(&lt;/span>&lt;span style="color:#0a3069">&amp;#34;All targets OK.&amp;#34;&lt;/span>&lt;span style="color:#1f2328">)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#cf222e">if&lt;/span> __name__ &lt;span style="color:#0550ae">==&lt;/span> &lt;span style="color:#0a3069">&amp;#34;__main__&amp;#34;&lt;/span>&lt;span style="color:#1f2328">:&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> parser &lt;span style="color:#0550ae">=&lt;/span> argparse&lt;span style="color:#0550ae">.&lt;/span>ArgumentParser&lt;span style="color:#1f2328">(&lt;/span>description&lt;span style="color:#0550ae">=&lt;/span>__doc__&lt;span style="color:#1f2328">)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> parser&lt;span style="color:#0550ae">.&lt;/span>add_argument&lt;span style="color:#1f2328">(&lt;/span>&lt;span style="color:#0a3069">&amp;#34;--base&amp;#34;&lt;/span>&lt;span style="color:#1f2328">,&lt;/span> default&lt;span style="color:#0550ae">=&lt;/span>DEFAULT_BASE&lt;span style="color:#1f2328">,&lt;/span> help&lt;span style="color:#0550ae">=&lt;/span>&lt;span style="color:#0a3069">&amp;#34;Base URL to test against&amp;#34;&lt;/span>&lt;span style="color:#1f2328">)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> parser&lt;span style="color:#0550ae">.&lt;/span>add_argument&lt;span style="color:#1f2328">(&lt;/span>&lt;span style="color:#0a3069">&amp;#34;--csv&amp;#34;&lt;/span>&lt;span style="color:#1f2328">,&lt;/span> default&lt;span style="color:#0550ae">=&lt;/span>&lt;span style="color:#cf222e">None&lt;/span>&lt;span style="color:#1f2328">,&lt;/span> help&lt;span style="color:#0550ae">=&lt;/span>&lt;span style="color:#0a3069">&amp;#34;Local CSV path (skips GitHub fetch)&amp;#34;&lt;/span>&lt;span style="color:#1f2328">)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> args &lt;span style="color:#0550ae">=&lt;/span> parser&lt;span style="color:#0550ae">.&lt;/span>parse_args&lt;span style="color:#1f2328">()&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> asyncio&lt;span style="color:#0550ae">.&lt;/span>run&lt;span style="color:#1f2328">(&lt;/span>main&lt;span style="color:#1f2328">(&lt;/span>args&lt;span style="color:#0550ae">.&lt;/span>base&lt;span style="color:#1f2328">,&lt;/span> args&lt;span style="color:#0550ae">.&lt;/span>csv&lt;span style="color:#1f2328">))&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>Key details:&lt;/strong>&lt;/p></description></item><item><title>OpenClaw vs Cursor — Pavel vs Nick Workflow</title><link>https://mmworkbrain.pages.dev/docs/engineering/openclaw-vs-cursor-workflow/</link><pubDate>Mon, 14 Sep 2026 00:00:00 +0000</pubDate><guid>https://mmworkbrain.pages.dev/docs/engineering/openclaw-vs-cursor-workflow/</guid><description>&lt;p>Comparison of two human–agent teaming approaches used at Mattermost engineering, based on Nick Misasi&amp;rsquo;s &lt;a href="https://mmworkbrain.pages.dev/docs/engineering/nick-misasi-cursor-workflow/">60-day Cursor writeup&lt;/a> and Pavel Zeman&amp;rsquo;s OpenClaw setup.&lt;/p>
&lt;h2 id="the-two-setups">The Two Setups&lt;/h2>
&lt;p>&lt;strong>Pavel (OpenClaw + Claude Code):&lt;/strong> One persistent AI agent (Tommy) running on an EC2 instance, always on, with long-term memory, cron-based PR monitoring, and sub-agent dispatch for parallel work. Connected via SSH + webchat + Telegram.&lt;/p>
&lt;p>&lt;strong>Nick (Cursor + Cloud Agents):&lt;/strong> Cursor IDE as the control plane, spawning ephemeral cloud agent VMs per task. 100+ agents in 60 days, each isolated, disposable, and repo-scoped. Dispatch via &lt;code>cursorctl&lt;/code> CLI and GitHub webhooks.&lt;/p></description></item><item><title>Celigo / NetSuite Connector Removal Plan</title><link>https://mmworkbrain.pages.dev/docs/engineering/deprecate-celigo-and-netsuite/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://mmworkbrain.pages.dev/docs/engineering/deprecate-celigo-and-netsuite/</guid><description>&lt;p>Plan to safely uninstall the two dormant Celigo managed packages from the
Salesforce org. These packages have not been licensed since October 28, 2024
but their triggers still fire on every Account, Contact, and Opportunity update.&lt;/p>
&lt;hr>
&lt;h2 id="background">Background&lt;/h2>
&lt;p>Celigo (integrator.io) was the integration middleware managing two flows:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Salesforce ↔ NetSuite&lt;/strong> — the &amp;ldquo;SFV2-SFNSIO&amp;rdquo; connector, migrated to the
integrator.io model in early 2023&lt;/li>
&lt;li>&lt;strong>BambooHR ↔ NetSuite&lt;/strong> — employee/department data sync&lt;/li>
&lt;/ol>
&lt;p>Both flows were made redundant by:&lt;/p></description></item><item><title>Parallel Test Global State Trade-offs</title><link>https://mmworkbrain.pages.dev/docs/testing/parallel-test-global-state-tradeoffs/</link><pubDate>Fri, 27 Mar 2026 01:30:00 +0000</pubDate><guid>https://mmworkbrain.pages.dev/docs/testing/parallel-test-global-state-tradeoffs/</guid><description>&lt;h2 id="the-problem">The Problem&lt;/h2>
&lt;p>When running Go tests with &lt;code>t.Parallel()&lt;/code>, global mutable state becomes a race condition hazard. The Mattermost server codebase introduced &lt;code>TestOverrideLogRootPath&lt;/code>, a global string variable used by tests to override the log root directory for security validation. This creates data races when multiple parallel tests modify the same global variable.&lt;/p>
&lt;p>The immediate trigger for addressing this was Go 1.24&amp;rsquo;s new incompatibility between &lt;code>t.Setenv()&lt;/code> and &lt;code>t.Parallel()&lt;/code>, which forced us to find alternative approaches to environment variable manipulation in parallel tests.&lt;/p></description></item><item><title>Race-Safe Mock Assertions in Parallel Tests</title><link>https://mmworkbrain.pages.dev/docs/testing/parallel-test-race-safe-mock-assertions/</link><pubDate>Tue, 31 Mar 2026 14:50:00 +0000</pubDate><guid>https://mmworkbrain.pages.dev/docs/testing/parallel-test-race-safe-mock-assertions/</guid><description>&lt;p>&lt;em>This is v2 of the parallel test safety series. See also: &lt;a href="../parallel-test-global-state-tradeoffs/">Parallel Test Global State Trade-offs&lt;/a> (v1).&lt;/em>&lt;/p>
&lt;h2 id="the-problem">The Problem&lt;/h2>
&lt;p>Go 1.25 ships a stricter race detector that catches a class of races invisible to Go 1.24. One critical pattern: &lt;strong>testify mock assertions on arguments that reference live objects with background goroutines&lt;/strong>.&lt;/p>
&lt;p>This pattern broke three tests on every Mattermost master build for 4+ days after the Go 1.24→1.25 upgrade (&lt;a href="https://github.com/mattermost/mattermost/pull/35817">#35817&lt;/a>):&lt;/p>
&lt;ul>
&lt;li>&lt;code>TestReplicaLagQuery&lt;/code>&lt;/li>
&lt;li>&lt;code>TestInvalidReplicaLagDataSource&lt;/code>&lt;/li>
&lt;li>&lt;code>TestMetrics/ensure_advanced_metrics_have_database_metrics&lt;/code>&lt;/li>
&lt;/ul>
&lt;p>The failures only appeared on master because &lt;strong>PR CI does not run with &lt;code>-race&lt;/code>&lt;/strong> — the race was invisible during the Go 1.25 PR review.&lt;/p></description></item><item><title>CI Queue Time Report — April 10, 2026</title><link>https://mmworkbrain.pages.dev/docs/reports/ci-queue-time-2026-04-10/</link><pubDate>Fri, 10 Apr 2026 00:00:00 +0000</pubDate><guid>https://mmworkbrain.pages.dev/docs/reports/ci-queue-time-2026-04-10/</guid><description>&lt;p>Daily report on GitHub Actions job queue delays and cache utilization for &lt;code>mattermost/mattermost&lt;/code>.&lt;/p>
&lt;h2 id="how-this-report-was-generated">How This Report Was Generated&lt;/h2>
&lt;p>Data collected via GitHub Actions REST API, querying jobs from three Server CI workflows:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#57606a"># Queue times: for each of the last 5 completed runs per workflow,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#57606a"># compute started_at - created_at per job&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#cf222e">for&lt;/span> workflow_id in &lt;span style="color:#0550ae">56372552&lt;/span> &lt;span style="color:#0550ae">56742408&lt;/span> 56627862&lt;span style="color:#1f2328">;&lt;/span> &lt;span style="color:#cf222e">do&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#57606a"># 56372552 = Server CI (push to master — primary, 14 jobs on 8-core)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#57606a"># 56742408 = Server CI Master (reporting/coverage)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#57606a"># 56627862 = Server CI PR (pull request CI)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#cf222e">for&lt;/span> run_id in &lt;span style="color:#cf222e">$(&lt;/span>curl -s -H &lt;span style="color:#0a3069">&amp;#34;Authorization: Bearer &lt;/span>&lt;span style="color:#953800">$GH_TOKEN&lt;/span>&lt;span style="color:#0a3069">&amp;#34;&lt;/span> &lt;span style="color:#0a3069">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069">&lt;/span> -H &lt;span style="color:#0a3069">&amp;#34;Accept: application/vnd.github+json&amp;#34;&lt;/span> &lt;span style="color:#0a3069">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069">&lt;/span> &lt;span style="color:#0a3069">&amp;#34;https://api.github.com/repos/mattermost/mattermost/actions/workflows/&lt;/span>&lt;span style="color:#0a3069">${&lt;/span>&lt;span style="color:#953800">workflow_id&lt;/span>&lt;span style="color:#0a3069">}&lt;/span>&lt;span style="color:#0a3069">/runs?per_page=5&amp;amp;status=completed&amp;#34;&lt;/span> &lt;span style="color:#0a3069">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069">&lt;/span> &lt;span style="color:#1f2328">|&lt;/span> jq -r &lt;span style="color:#0a3069">&amp;#39;.workflow_runs[].id&amp;#39;&lt;/span>&lt;span style="color:#cf222e">)&lt;/span>&lt;span style="color:#1f2328">;&lt;/span> &lt;span style="color:#cf222e">do&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> curl -s -H &lt;span style="color:#0a3069">&amp;#34;Authorization: Bearer &lt;/span>&lt;span style="color:#953800">$GH_TOKEN&lt;/span>&lt;span style="color:#0a3069">&amp;#34;&lt;/span> &lt;span style="color:#0a3069">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069">&lt;/span> -H &lt;span style="color:#0a3069">&amp;#34;Accept: application/vnd.github+json&amp;#34;&lt;/span> &lt;span style="color:#0a3069">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069">&lt;/span> &lt;span style="color:#0a3069">&amp;#34;https://api.github.com/repos/mattermost/mattermost/actions/runs/&lt;/span>&lt;span style="color:#0a3069">${&lt;/span>&lt;span style="color:#953800">run_id&lt;/span>&lt;span style="color:#0a3069">}&lt;/span>&lt;span style="color:#0a3069">/jobs?per_page=100&amp;#34;&lt;/span> &lt;span style="color:#0a3069">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069">&lt;/span> &lt;span style="color:#1f2328">|&lt;/span> jq &lt;span style="color:#0a3069">&amp;#39;.jobs[] | {name, started_at, created_at, labels,
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069"> queue_seconds: (((.started_at | fromdateiso8601) - (.created_at | fromdateiso8601)))}&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#cf222e">done&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#cf222e">done&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#57606a"># Cache usage&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>curl -s &lt;span style="color:#0a3069">&amp;#34;https://api.github.com/repos/mattermost/mattermost/actions/cache/usage&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>curl -s &lt;span style="color:#0a3069">&amp;#34;https://api.github.com/repos/mattermost/mattermost-mobile/actions/cache/usage&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="cache-utilization">Cache Utilization&lt;/h2>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Repository&lt;/th>
 &lt;th>Caches&lt;/th>
 &lt;th>Size&lt;/th>
 &lt;th>Limit&lt;/th>
 &lt;th>Utilization&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>&lt;code>mattermost/mattermost&lt;/code>&lt;/td>
 &lt;td>49&lt;/td>
 &lt;td>&lt;strong>10.3 GB&lt;/strong>&lt;/td>
 &lt;td>10 GB&lt;/td>
 &lt;td>⚠️ &lt;strong>103%&lt;/strong>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>mattermost/mattermost-mobile&lt;/code>&lt;/td>
 &lt;td>14&lt;/td>
 &lt;td>&lt;strong>5.9 GB&lt;/strong>&lt;/td>
 &lt;td>10 GB&lt;/td>
 &lt;td>✅ 59%&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>Mobile was at 10.0 GB earlier today; manual cleanup of tag caches and stale build branch caches freed ~4 GB.&lt;/p></description></item><item><title>CI Queue Time Report — April 13, 2026</title><link>https://mmworkbrain.pages.dev/docs/reports/ci-queue-time-2026-04-13/</link><pubDate>Mon, 13 Apr 2026 00:00:00 +0000</pubDate><guid>https://mmworkbrain.pages.dev/docs/reports/ci-queue-time-2026-04-13/</guid><description>&lt;p>Daily report on GitHub Actions job queue delays and cache utilization for &lt;code>mattermost/mattermost&lt;/code>.&lt;/p>
&lt;h2 id="how-this-report-was-generated">How This Report Was Generated&lt;/h2>
&lt;p>Data collected via GitHub Actions REST API, querying jobs from three Server CI workflows:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#57606a"># Queue times: for each of the last 5 completed runs per workflow,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#57606a"># compute started_at - created_at per job&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#6639ba">export&lt;/span> &lt;span style="color:#953800">GH_TOKEN&lt;/span>&lt;span style="color:#0550ae">=&lt;/span>&lt;span style="color:#cf222e">$(&lt;/span>cat .tokens/github-mattermost&lt;span style="color:#cf222e">)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#cf222e">for&lt;/span> workflow_id in &lt;span style="color:#0550ae">56372552&lt;/span> &lt;span style="color:#0550ae">56742408&lt;/span> 56627862&lt;span style="color:#1f2328">;&lt;/span> &lt;span style="color:#cf222e">do&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#57606a"># 56372552 = Server CI (push to master — primary, 14 jobs on 8-core)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#57606a"># 56742408 = Server CI Master (reporting/coverage)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#57606a"># 56627862 = Server CI PR (pull request CI)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#cf222e">for&lt;/span> run_id in &lt;span style="color:#cf222e">$(&lt;/span>curl -s -H &lt;span style="color:#0a3069">&amp;#34;Authorization: Bearer &lt;/span>&lt;span style="color:#953800">$GH_TOKEN&lt;/span>&lt;span style="color:#0a3069">&amp;#34;&lt;/span> &lt;span style="color:#0a3069">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069">&lt;/span> -H &lt;span style="color:#0a3069">&amp;#34;Accept: application/vnd.github+json&amp;#34;&lt;/span> &lt;span style="color:#0a3069">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069">&lt;/span> &lt;span style="color:#0a3069">&amp;#34;https://api.github.com/repos/mattermost/mattermost/actions/workflows/&lt;/span>&lt;span style="color:#0a3069">${&lt;/span>&lt;span style="color:#953800">workflow_id&lt;/span>&lt;span style="color:#0a3069">}&lt;/span>&lt;span style="color:#0a3069">/runs?per_page=5&amp;amp;status=completed&amp;#34;&lt;/span> &lt;span style="color:#0a3069">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069">&lt;/span> &lt;span style="color:#1f2328">|&lt;/span> jq -r &lt;span style="color:#0a3069">&amp;#39;.workflow_runs[].id&amp;#39;&lt;/span>&lt;span style="color:#cf222e">)&lt;/span>&lt;span style="color:#1f2328">;&lt;/span> &lt;span style="color:#cf222e">do&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> sleep &lt;span style="color:#0550ae">1&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> curl -s -H &lt;span style="color:#0a3069">&amp;#34;Authorization: Bearer &lt;/span>&lt;span style="color:#953800">$GH_TOKEN&lt;/span>&lt;span style="color:#0a3069">&amp;#34;&lt;/span> &lt;span style="color:#0a3069">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069">&lt;/span> -H &lt;span style="color:#0a3069">&amp;#34;Accept: application/vnd.github+json&amp;#34;&lt;/span> &lt;span style="color:#0a3069">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069">&lt;/span> &lt;span style="color:#0a3069">&amp;#34;https://api.github.com/repos/mattermost/mattermost/actions/runs/&lt;/span>&lt;span style="color:#0a3069">${&lt;/span>&lt;span style="color:#953800">run_id&lt;/span>&lt;span style="color:#0a3069">}&lt;/span>&lt;span style="color:#0a3069">/jobs?per_page=100&amp;#34;&lt;/span> &lt;span style="color:#0a3069">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069">&lt;/span> &lt;span style="color:#1f2328">|&lt;/span> jq &lt;span style="color:#0a3069">&amp;#39;.jobs[] | {name, started_at, created_at, labels,
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069"> queue_seconds: (((.started_at | fromdateiso8601) - (.created_at | fromdateiso8601)))}&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#cf222e">done&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#cf222e">done&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#57606a"># Cache usage&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>curl -s -H &lt;span style="color:#0a3069">&amp;#34;Authorization: Bearer &lt;/span>&lt;span style="color:#953800">$GH_TOKEN&lt;/span>&lt;span style="color:#0a3069">&amp;#34;&lt;/span> &lt;span style="color:#0a3069">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069">&lt;/span> &lt;span style="color:#0a3069">&amp;#34;https://api.github.com/repos/mattermost/mattermost/actions/cache/usage&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>curl -s -H &lt;span style="color:#0a3069">&amp;#34;Authorization: Bearer &lt;/span>&lt;span style="color:#953800">$GH_TOKEN&lt;/span>&lt;span style="color:#0a3069">&amp;#34;&lt;/span> &lt;span style="color:#0a3069">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069">&lt;/span> &lt;span style="color:#0a3069">&amp;#34;https://api.github.com/repos/mattermost/mattermost-mobile/actions/cache/usage&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="cache-utilization">Cache Utilization&lt;/h2>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Repository&lt;/th>
 &lt;th>Caches&lt;/th>
 &lt;th>Size&lt;/th>
 &lt;th>Limit&lt;/th>
 &lt;th>Utilization&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>&lt;code>mattermost/mattermost&lt;/code>&lt;/td>
 &lt;td>45&lt;/td>
 &lt;td>&lt;strong>10.5 GB&lt;/strong>&lt;/td>
 &lt;td>10 GB&lt;/td>
 &lt;td>⚠️ &lt;strong>105%&lt;/strong>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>mattermost/mattermost-mobile&lt;/code>&lt;/td>
 &lt;td>18&lt;/td>
 &lt;td>&lt;strong>6.0 GB&lt;/strong>&lt;/td>
 &lt;td>10 GB&lt;/td>
 &lt;td>✅ 60%&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>The monorepo remains over capacity (105%, up from 103% on Apr 10). Mobile is stable at ~60%.&lt;/p></description></item><item><title>CI Queue Time Report — April 14, 2026</title><link>https://mmworkbrain.pages.dev/docs/reports/ci-queue-time-2026-04-14/</link><pubDate>Tue, 14 Apr 2026 00:00:00 +0000</pubDate><guid>https://mmworkbrain.pages.dev/docs/reports/ci-queue-time-2026-04-14/</guid><description>&lt;p>Daily report on GitHub Actions job queue delays and cache utilization for &lt;code>mattermost/mattermost&lt;/code>.&lt;/p>
&lt;h2 id="how-this-report-was-generated">How This Report Was Generated&lt;/h2>
&lt;p>Data collected via GitHub Actions REST API, querying jobs from three Server CI workflows:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#57606a"># Queue times: for each of the last 5 completed runs per workflow,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#57606a"># compute started_at - created_at per job&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#6639ba">export&lt;/span> &lt;span style="color:#953800">GH_TOKEN&lt;/span>&lt;span style="color:#0550ae">=&lt;/span>&lt;span style="color:#cf222e">$(&lt;/span>cat .tokens/github-mattermost&lt;span style="color:#cf222e">)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#cf222e">for&lt;/span> workflow_id in &lt;span style="color:#0550ae">56372552&lt;/span> &lt;span style="color:#0550ae">56742408&lt;/span> 56627862&lt;span style="color:#1f2328">;&lt;/span> &lt;span style="color:#cf222e">do&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#57606a"># 56372552 = Server CI (push to master — primary, 14 jobs on 8-core)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#57606a"># 56742408 = Server CI Master (reporting/coverage)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#57606a"># 56627862 = Server CI PR (pull request CI)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#cf222e">for&lt;/span> run_id in &lt;span style="color:#cf222e">$(&lt;/span>curl -s -H &lt;span style="color:#0a3069">&amp;#34;Authorization: Bearer &lt;/span>&lt;span style="color:#953800">$GH_TOKEN&lt;/span>&lt;span style="color:#0a3069">&amp;#34;&lt;/span> &lt;span style="color:#0a3069">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069">&lt;/span> -H &lt;span style="color:#0a3069">&amp;#34;Accept: application/vnd.github+json&amp;#34;&lt;/span> &lt;span style="color:#0a3069">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069">&lt;/span> &lt;span style="color:#0a3069">&amp;#34;https://api.github.com/repos/mattermost/mattermost/actions/workflows/&lt;/span>&lt;span style="color:#0a3069">${&lt;/span>&lt;span style="color:#953800">workflow_id&lt;/span>&lt;span style="color:#0a3069">}&lt;/span>&lt;span style="color:#0a3069">/runs?per_page=5&amp;amp;status=completed&amp;#34;&lt;/span> &lt;span style="color:#0a3069">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069">&lt;/span> &lt;span style="color:#1f2328">|&lt;/span> jq -r &lt;span style="color:#0a3069">&amp;#39;.workflow_runs[].id&amp;#39;&lt;/span>&lt;span style="color:#cf222e">)&lt;/span>&lt;span style="color:#1f2328">;&lt;/span> &lt;span style="color:#cf222e">do&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> sleep &lt;span style="color:#0550ae">1&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> curl -s -H &lt;span style="color:#0a3069">&amp;#34;Authorization: Bearer &lt;/span>&lt;span style="color:#953800">$GH_TOKEN&lt;/span>&lt;span style="color:#0a3069">&amp;#34;&lt;/span> &lt;span style="color:#0a3069">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069">&lt;/span> -H &lt;span style="color:#0a3069">&amp;#34;Accept: application/vnd.github+json&amp;#34;&lt;/span> &lt;span style="color:#0a3069">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069">&lt;/span> &lt;span style="color:#0a3069">&amp;#34;https://api.github.com/repos/mattermost/mattermost/actions/runs/&lt;/span>&lt;span style="color:#0a3069">${&lt;/span>&lt;span style="color:#953800">run_id&lt;/span>&lt;span style="color:#0a3069">}&lt;/span>&lt;span style="color:#0a3069">/jobs?per_page=100&amp;#34;&lt;/span> &lt;span style="color:#0a3069">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069">&lt;/span> &lt;span style="color:#1f2328">|&lt;/span> jq &lt;span style="color:#0a3069">&amp;#39;.jobs[] | {name, started_at, created_at, labels,
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069"> queue_seconds: (((.started_at | fromdateiso8601) - (.created_at | fromdateiso8601)))}&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#cf222e">done&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#cf222e">done&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#57606a"># Cache usage&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>curl -s -H &lt;span style="color:#0a3069">&amp;#34;Authorization: Bearer &lt;/span>&lt;span style="color:#953800">$GH_TOKEN&lt;/span>&lt;span style="color:#0a3069">&amp;#34;&lt;/span> &lt;span style="color:#0a3069">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069">&lt;/span> &lt;span style="color:#0a3069">&amp;#34;https://api.github.com/repos/mattermost/mattermost/actions/cache/usage&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>curl -s -H &lt;span style="color:#0a3069">&amp;#34;Authorization: Bearer &lt;/span>&lt;span style="color:#953800">$GH_TOKEN&lt;/span>&lt;span style="color:#0a3069">&amp;#34;&lt;/span> &lt;span style="color:#0a3069">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069">&lt;/span> &lt;span style="color:#0a3069">&amp;#34;https://api.github.com/repos/mattermost/mattermost-mobile/actions/cache/usage&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="cache-utilization">Cache Utilization&lt;/h2>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Repository&lt;/th>
 &lt;th>Caches&lt;/th>
 &lt;th>Size&lt;/th>
 &lt;th>Limit&lt;/th>
 &lt;th>Utilization&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>&lt;code>mattermost/mattermost&lt;/code>&lt;/td>
 &lt;td>36&lt;/td>
 &lt;td>&lt;strong>9.8 GB&lt;/strong>&lt;/td>
 &lt;td>10 GB&lt;/td>
 &lt;td>⚠️ &lt;strong>98%&lt;/strong>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>mattermost/mattermost-mobile&lt;/code>&lt;/td>
 &lt;td>22&lt;/td>
 &lt;td>&lt;strong>6.1 GB&lt;/strong>&lt;/td>
 &lt;td>10 GB&lt;/td>
 &lt;td>✅ 61%&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>The monorepo dropped from 45 caches (105%) on Apr 13 to 36 caches (98%) — back under the 10 GB limit for the first time in weeks. Likely due to cache eviction catching up. Mobile stable at ~61%.&lt;/p></description></item><item><title>CI Queue Time Report — April 15, 2026</title><link>https://mmworkbrain.pages.dev/docs/reports/ci-queue-time-2026-04-15/</link><pubDate>Wed, 15 Apr 2026 00:00:00 +0000</pubDate><guid>https://mmworkbrain.pages.dev/docs/reports/ci-queue-time-2026-04-15/</guid><description>&lt;p>Daily report on GitHub Actions job queue delays and cache utilization for &lt;code>mattermost/mattermost&lt;/code>.&lt;/p>
&lt;h2 id="how-this-report-was-generated">How This Report Was Generated&lt;/h2>
&lt;p>Data collected via GitHub Actions REST API, querying jobs from three Server CI workflows:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#57606a"># Queue times: for each of the last 5 completed runs per workflow,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#57606a"># compute started_at - created_at per job&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#6639ba">export&lt;/span> &lt;span style="color:#953800">GH_TOKEN&lt;/span>&lt;span style="color:#0550ae">=&lt;/span>&lt;span style="color:#cf222e">$(&lt;/span>cat .tokens/github-mattermost&lt;span style="color:#cf222e">)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#cf222e">for&lt;/span> workflow_id in &lt;span style="color:#0550ae">56372552&lt;/span> &lt;span style="color:#0550ae">56742408&lt;/span> 56627862&lt;span style="color:#1f2328">;&lt;/span> &lt;span style="color:#cf222e">do&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#57606a"># 56372552 = Server CI (push to master — primary, 14 jobs on 8-core)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#57606a"># 56742408 = Server CI Master (reporting/coverage)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#57606a"># 56627862 = Server CI PR (pull request CI)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#cf222e">for&lt;/span> run_id in &lt;span style="color:#cf222e">$(&lt;/span>curl -s -H &lt;span style="color:#0a3069">&amp;#34;Authorization: Bearer &lt;/span>&lt;span style="color:#953800">$GH_TOKEN&lt;/span>&lt;span style="color:#0a3069">&amp;#34;&lt;/span> &lt;span style="color:#0a3069">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069">&lt;/span> -H &lt;span style="color:#0a3069">&amp;#34;Accept: application/vnd.github+json&amp;#34;&lt;/span> &lt;span style="color:#0a3069">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069">&lt;/span> &lt;span style="color:#0a3069">&amp;#34;https://api.github.com/repos/mattermost/mattermost/actions/workflows/&lt;/span>&lt;span style="color:#0a3069">${&lt;/span>&lt;span style="color:#953800">workflow_id&lt;/span>&lt;span style="color:#0a3069">}&lt;/span>&lt;span style="color:#0a3069">/runs?per_page=5&amp;amp;status=completed&amp;#34;&lt;/span> &lt;span style="color:#0a3069">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069">&lt;/span> &lt;span style="color:#1f2328">|&lt;/span> jq -r &lt;span style="color:#0a3069">&amp;#39;.workflow_runs[].id&amp;#39;&lt;/span>&lt;span style="color:#cf222e">)&lt;/span>&lt;span style="color:#1f2328">;&lt;/span> &lt;span style="color:#cf222e">do&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> sleep &lt;span style="color:#0550ae">1&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> curl -s -H &lt;span style="color:#0a3069">&amp;#34;Authorization: Bearer &lt;/span>&lt;span style="color:#953800">$GH_TOKEN&lt;/span>&lt;span style="color:#0a3069">&amp;#34;&lt;/span> &lt;span style="color:#0a3069">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069">&lt;/span> -H &lt;span style="color:#0a3069">&amp;#34;Accept: application/vnd.github+json&amp;#34;&lt;/span> &lt;span style="color:#0a3069">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069">&lt;/span> &lt;span style="color:#0a3069">&amp;#34;https://api.github.com/repos/mattermost/mattermost/actions/runs/&lt;/span>&lt;span style="color:#0a3069">${&lt;/span>&lt;span style="color:#953800">run_id&lt;/span>&lt;span style="color:#0a3069">}&lt;/span>&lt;span style="color:#0a3069">/jobs?per_page=100&amp;#34;&lt;/span> &lt;span style="color:#0a3069">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069">&lt;/span> &lt;span style="color:#1f2328">|&lt;/span> jq &lt;span style="color:#0a3069">&amp;#39;.jobs[] | {name, started_at, created_at, labels,
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069"> queue_seconds: (((.started_at | fromdateiso8601) - (.created_at | fromdateiso8601)))}&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#cf222e">done&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#cf222e">done&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#57606a"># Cache usage&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>curl -s -H &lt;span style="color:#0a3069">&amp;#34;Authorization: Bearer &lt;/span>&lt;span style="color:#953800">$GH_TOKEN&lt;/span>&lt;span style="color:#0a3069">&amp;#34;&lt;/span> &lt;span style="color:#0a3069">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069">&lt;/span> &lt;span style="color:#0a3069">&amp;#34;https://api.github.com/repos/mattermost/mattermost/actions/cache/usage&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>curl -s -H &lt;span style="color:#0a3069">&amp;#34;Authorization: Bearer &lt;/span>&lt;span style="color:#953800">$GH_TOKEN&lt;/span>&lt;span style="color:#0a3069">&amp;#34;&lt;/span> &lt;span style="color:#0a3069">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069">&lt;/span> &lt;span style="color:#0a3069">&amp;#34;https://api.github.com/repos/mattermost/mattermost-mobile/actions/cache/usage&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="cache-utilization">Cache Utilization&lt;/h2>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Repository&lt;/th>
 &lt;th>Caches&lt;/th>
 &lt;th>Size&lt;/th>
 &lt;th>Limit&lt;/th>
 &lt;th>Utilization&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>&lt;code>mattermost/mattermost&lt;/code>&lt;/td>
 &lt;td>63&lt;/td>
 &lt;td>&lt;strong>9.9 GB&lt;/strong>&lt;/td>
 &lt;td>10 GB&lt;/td>
 &lt;td>⚠️ &lt;strong>99%&lt;/strong>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>mattermost/mattermost-mobile&lt;/code>&lt;/td>
 &lt;td>24&lt;/td>
 &lt;td>&lt;strong>6.1 GB&lt;/strong>&lt;/td>
 &lt;td>10 GB&lt;/td>
 &lt;td>✅ 61%&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>The monorepo surged from 36 caches (98%) yesterday to &lt;strong>63 caches (99%)&lt;/strong> today — nearly doubling the cache count while staying just under the 10 GB limit. This is the highest cache count we&amp;rsquo;ve observed. Mobile remains stable at ~61%.&lt;/p></description></item><item><title>CI Queue Time Report — April 16, 2026</title><link>https://mmworkbrain.pages.dev/docs/reports/ci-queue-time-2026-04-16/</link><pubDate>Thu, 16 Apr 2026 00:00:00 +0000</pubDate><guid>https://mmworkbrain.pages.dev/docs/reports/ci-queue-time-2026-04-16/</guid><description>&lt;p>Daily report on GitHub Actions job queue delays and cache utilization for &lt;code>mattermost/mattermost&lt;/code>.&lt;/p>
&lt;h2 id="how-this-report-was-generated">How This Report Was Generated&lt;/h2>
&lt;p>Data collected via GitHub Actions REST API, querying jobs from three Server CI workflows:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#57606a"># Queue times: for each of the last 5 completed runs per workflow,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#57606a"># compute started_at - created_at per job&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#6639ba">export&lt;/span> &lt;span style="color:#953800">GH_TOKEN&lt;/span>&lt;span style="color:#0550ae">=&lt;/span>&lt;span style="color:#cf222e">$(&lt;/span>cat .tokens/github-mattermost&lt;span style="color:#cf222e">)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#cf222e">for&lt;/span> workflow_id in &lt;span style="color:#0550ae">56372552&lt;/span> &lt;span style="color:#0550ae">56742408&lt;/span> 56627862&lt;span style="color:#1f2328">;&lt;/span> &lt;span style="color:#cf222e">do&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#57606a"># 56372552 = Server CI (primary, 14 jobs on 8-core when fully enabled)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#57606a"># 56742408 = Server CI Master (reporting/coverage)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#57606a"># 56627862 = Server CI PR (pull request CI)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#cf222e">for&lt;/span> run_id in &lt;span style="color:#cf222e">$(&lt;/span>curl -s -H &lt;span style="color:#0a3069">&amp;#34;Authorization: Bearer &lt;/span>&lt;span style="color:#953800">$GH_TOKEN&lt;/span>&lt;span style="color:#0a3069">&amp;#34;&lt;/span> &lt;span style="color:#0a3069">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069">&lt;/span> -H &lt;span style="color:#0a3069">&amp;#34;Accept: application/vnd.github+json&amp;#34;&lt;/span> &lt;span style="color:#0a3069">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069">&lt;/span> &lt;span style="color:#0a3069">&amp;#34;https://api.github.com/repos/mattermost/mattermost/actions/workflows/&lt;/span>&lt;span style="color:#0a3069">${&lt;/span>&lt;span style="color:#953800">workflow_id&lt;/span>&lt;span style="color:#0a3069">}&lt;/span>&lt;span style="color:#0a3069">/runs?per_page=5&amp;amp;status=completed&amp;#34;&lt;/span> &lt;span style="color:#0a3069">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069">&lt;/span> &lt;span style="color:#1f2328">|&lt;/span> jq -r &lt;span style="color:#0a3069">&amp;#39;.workflow_runs[].id&amp;#39;&lt;/span>&lt;span style="color:#cf222e">)&lt;/span>&lt;span style="color:#1f2328">;&lt;/span> &lt;span style="color:#cf222e">do&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> sleep &lt;span style="color:#0550ae">1&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> curl -s -H &lt;span style="color:#0a3069">&amp;#34;Authorization: Bearer &lt;/span>&lt;span style="color:#953800">$GH_TOKEN&lt;/span>&lt;span style="color:#0a3069">&amp;#34;&lt;/span> &lt;span style="color:#0a3069">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069">&lt;/span> -H &lt;span style="color:#0a3069">&amp;#34;Accept: application/vnd.github+json&amp;#34;&lt;/span> &lt;span style="color:#0a3069">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069">&lt;/span> &lt;span style="color:#0a3069">&amp;#34;https://api.github.com/repos/mattermost/mattermost/actions/runs/&lt;/span>&lt;span style="color:#0a3069">${&lt;/span>&lt;span style="color:#953800">run_id&lt;/span>&lt;span style="color:#0a3069">}&lt;/span>&lt;span style="color:#0a3069">/jobs?per_page=100&amp;#34;&lt;/span> &lt;span style="color:#0a3069">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069">&lt;/span> &lt;span style="color:#1f2328">|&lt;/span> jq &lt;span style="color:#0a3069">&amp;#39;.jobs[] | {name, started_at, created_at, labels,
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069"> queue_seconds: (((.started_at | fromdateiso8601) - (.created_at | fromdateiso8601)))}&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#cf222e">done&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#cf222e">done&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#57606a"># Cache usage&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>curl -s -H &lt;span style="color:#0a3069">&amp;#34;Authorization: Bearer &lt;/span>&lt;span style="color:#953800">$GH_TOKEN&lt;/span>&lt;span style="color:#0a3069">&amp;#34;&lt;/span> &lt;span style="color:#0a3069">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069">&lt;/span> &lt;span style="color:#0a3069">&amp;#34;https://api.github.com/repos/mattermost/mattermost/actions/cache/usage&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>curl -s -H &lt;span style="color:#0a3069">&amp;#34;Authorization: Bearer &lt;/span>&lt;span style="color:#953800">$GH_TOKEN&lt;/span>&lt;span style="color:#0a3069">&amp;#34;&lt;/span> &lt;span style="color:#0a3069">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069">&lt;/span> &lt;span style="color:#0a3069">&amp;#34;https://api.github.com/repos/mattermost/mattermost-mobile/actions/cache/usage&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="cache-utilization">Cache Utilization&lt;/h2>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Repository&lt;/th>
 &lt;th>Caches&lt;/th>
 &lt;th>Size&lt;/th>
 &lt;th>Limit&lt;/th>
 &lt;th>Utilization&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>&lt;code>mattermost/mattermost&lt;/code>&lt;/td>
 &lt;td>52&lt;/td>
 &lt;td>&lt;strong>9.9 GB&lt;/strong>&lt;/td>
 &lt;td>10 GB&lt;/td>
 &lt;td>⚠️ &lt;strong>99%&lt;/strong>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>mattermost/mattermost-mobile&lt;/code>&lt;/td>
 &lt;td>42&lt;/td>
 &lt;td>&lt;strong>10.1 GB&lt;/strong>&lt;/td>
 &lt;td>10 GB&lt;/td>
 &lt;td>🔴 &lt;strong>101%&lt;/strong>&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>The monorepo dropped from 63 caches yesterday to &lt;strong>52 caches&lt;/strong> today while staying at 99% utilization — cache eviction is working. &lt;strong>Mobile has crossed the 10 GB limit&lt;/strong> for the first time, surging from 24 caches (6.1 GB, 61%) yesterday to &lt;strong>42 caches (10.1 GB, 101%)&lt;/strong> today. This is a significant spike that likely triggers aggressive eviction.&lt;/p></description></item><item><title>CI Queue Time Report — April 17, 2026</title><link>https://mmworkbrain.pages.dev/docs/reports/ci-queue-time-2026-04-17/</link><pubDate>Fri, 17 Apr 2026 00:00:00 +0000</pubDate><guid>https://mmworkbrain.pages.dev/docs/reports/ci-queue-time-2026-04-17/</guid><description>&lt;p>Daily report on GitHub Actions job queue delays and cache utilization for &lt;code>mattermost/mattermost&lt;/code>.&lt;/p>
&lt;h2 id="how-this-report-was-generated">How This Report Was Generated&lt;/h2>
&lt;p>Data collected via GitHub Actions REST API, querying jobs from three Server CI workflows:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#57606a"># Queue times: for each of the last 5 completed runs per workflow,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#57606a"># compute started_at - created_at per job&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#6639ba">export&lt;/span> &lt;span style="color:#953800">GH_TOKEN&lt;/span>&lt;span style="color:#0550ae">=&lt;/span>&lt;span style="color:#cf222e">$(&lt;/span>cat .tokens/github-mattermost&lt;span style="color:#cf222e">)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#cf222e">for&lt;/span> workflow_id in &lt;span style="color:#0550ae">56372552&lt;/span> &lt;span style="color:#0550ae">56742408&lt;/span> 56627862&lt;span style="color:#1f2328">;&lt;/span> &lt;span style="color:#cf222e">do&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#57606a"># 56372552 = Server CI (primary, 14 jobs on 8-core when fully enabled)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#57606a"># 56742408 = Server CI Master (reporting/coverage)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#57606a"># 56627862 = Server CI PR (pull request CI)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#cf222e">for&lt;/span> run_id in &lt;span style="color:#cf222e">$(&lt;/span>curl -s -H &lt;span style="color:#0a3069">&amp;#34;Authorization: Bearer &lt;/span>&lt;span style="color:#953800">$GH_TOKEN&lt;/span>&lt;span style="color:#0a3069">&amp;#34;&lt;/span> &lt;span style="color:#0a3069">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069">&lt;/span> -H &lt;span style="color:#0a3069">&amp;#34;Accept: application/vnd.github+json&amp;#34;&lt;/span> &lt;span style="color:#0a3069">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069">&lt;/span> &lt;span style="color:#0a3069">&amp;#34;https://api.github.com/repos/mattermost/mattermost/actions/workflows/&lt;/span>&lt;span style="color:#0a3069">${&lt;/span>&lt;span style="color:#953800">workflow_id&lt;/span>&lt;span style="color:#0a3069">}&lt;/span>&lt;span style="color:#0a3069">/runs?per_page=5&amp;amp;status=completed&amp;#34;&lt;/span> &lt;span style="color:#0a3069">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069">&lt;/span> &lt;span style="color:#1f2328">|&lt;/span> jq -r &lt;span style="color:#0a3069">&amp;#39;.workflow_runs[].id&amp;#39;&lt;/span>&lt;span style="color:#cf222e">)&lt;/span>&lt;span style="color:#1f2328">;&lt;/span> &lt;span style="color:#cf222e">do&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> sleep &lt;span style="color:#0550ae">1&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> curl -s -H &lt;span style="color:#0a3069">&amp;#34;Authorization: Bearer &lt;/span>&lt;span style="color:#953800">$GH_TOKEN&lt;/span>&lt;span style="color:#0a3069">&amp;#34;&lt;/span> &lt;span style="color:#0a3069">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069">&lt;/span> -H &lt;span style="color:#0a3069">&amp;#34;Accept: application/vnd.github+json&amp;#34;&lt;/span> &lt;span style="color:#0a3069">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069">&lt;/span> &lt;span style="color:#0a3069">&amp;#34;https://api.github.com/repos/mattermost/mattermost/actions/runs/&lt;/span>&lt;span style="color:#0a3069">${&lt;/span>&lt;span style="color:#953800">run_id&lt;/span>&lt;span style="color:#0a3069">}&lt;/span>&lt;span style="color:#0a3069">/jobs?per_page=100&amp;#34;&lt;/span> &lt;span style="color:#0a3069">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069">&lt;/span> &lt;span style="color:#1f2328">|&lt;/span> jq &lt;span style="color:#0a3069">&amp;#39;.jobs[] | {name, started_at, created_at, labels,
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069"> queue_seconds: (((.started_at | fromdateiso8601) - (.created_at | fromdateiso8601)))}&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#cf222e">done&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#cf222e">done&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#57606a"># Cache usage&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>curl -s -H &lt;span style="color:#0a3069">&amp;#34;Authorization: Bearer &lt;/span>&lt;span style="color:#953800">$GH_TOKEN&lt;/span>&lt;span style="color:#0a3069">&amp;#34;&lt;/span> &lt;span style="color:#0a3069">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069">&lt;/span> &lt;span style="color:#0a3069">&amp;#34;https://api.github.com/repos/mattermost/mattermost/actions/cache/usage&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>curl -s -H &lt;span style="color:#0a3069">&amp;#34;Authorization: Bearer &lt;/span>&lt;span style="color:#953800">$GH_TOKEN&lt;/span>&lt;span style="color:#0a3069">&amp;#34;&lt;/span> &lt;span style="color:#0a3069">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069">&lt;/span> &lt;span style="color:#0a3069">&amp;#34;https://api.github.com/repos/mattermost/mattermost-mobile/actions/cache/usage&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="cache-utilization">Cache Utilization&lt;/h2>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Repository&lt;/th>
 &lt;th>Caches&lt;/th>
 &lt;th>Size&lt;/th>
 &lt;th>Limit&lt;/th>
 &lt;th>Utilization&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>&lt;code>mattermost/mattermost&lt;/code>&lt;/td>
 &lt;td>43&lt;/td>
 &lt;td>&lt;strong>9.9 GB&lt;/strong>&lt;/td>
 &lt;td>10 GB&lt;/td>
 &lt;td>🔴 &lt;strong>99%&lt;/strong>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>mattermost/mattermost-mobile&lt;/code>&lt;/td>
 &lt;td>32&lt;/td>
 &lt;td>&lt;strong>9.6 GB&lt;/strong>&lt;/td>
 &lt;td>10 GB&lt;/td>
 &lt;td>⚠️ &lt;strong>96%&lt;/strong>&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>The monorepo dropped from 52 caches yesterday to &lt;strong>43 caches&lt;/strong> today, continuing the downward trend (63 → 52 → 43), while utilization holds steady at 99%. Mobile pulled back from 101% to &lt;strong>96%&lt;/strong> (42 → 32 caches, 10.1 → 9.6 GB) — eviction cleaned up the overshoot from yesterday.&lt;/p></description></item><item><title>CI Queue Time Report — April 20, 2026</title><link>https://mmworkbrain.pages.dev/docs/reports/ci-queue-time-2026-04-20/</link><pubDate>Mon, 20 Apr 2026 00:00:00 +0000</pubDate><guid>https://mmworkbrain.pages.dev/docs/reports/ci-queue-time-2026-04-20/</guid><description>&lt;p>Daily report on GitHub Actions job queue delays and cache utilization for &lt;code>mattermost/mattermost&lt;/code>.&lt;/p>
&lt;h2 id="how-this-report-was-generated">How This Report Was Generated&lt;/h2>
&lt;p>Data collected via GitHub Actions REST API, querying jobs from three Server CI workflows:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#57606a"># Queue times: for each of the last 5 completed runs per workflow,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#57606a"># compute started_at - created_at per job&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#6639ba">export&lt;/span> &lt;span style="color:#953800">GH_TOKEN&lt;/span>&lt;span style="color:#0550ae">=&lt;/span>&lt;span style="color:#cf222e">$(&lt;/span>cat .tokens/github-mattermost&lt;span style="color:#cf222e">)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#cf222e">for&lt;/span> workflow_id in &lt;span style="color:#0550ae">56372552&lt;/span> &lt;span style="color:#0550ae">56742408&lt;/span> 56627862&lt;span style="color:#1f2328">;&lt;/span> &lt;span style="color:#cf222e">do&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#57606a"># 56372552 = Server CI (primary, 14 jobs on 8-core when fully enabled)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#57606a"># 56742408 = Server CI Master (reporting/coverage)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#57606a"># 56627862 = Server CI PR (pull request CI)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#cf222e">for&lt;/span> run_id in &lt;span style="color:#cf222e">$(&lt;/span>curl -s -H &lt;span style="color:#0a3069">&amp;#34;Authorization: Bearer &lt;/span>&lt;span style="color:#953800">$GH_TOKEN&lt;/span>&lt;span style="color:#0a3069">&amp;#34;&lt;/span> &lt;span style="color:#0a3069">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069">&lt;/span> -H &lt;span style="color:#0a3069">&amp;#34;Accept: application/vnd.github+json&amp;#34;&lt;/span> &lt;span style="color:#0a3069">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069">&lt;/span> &lt;span style="color:#0a3069">&amp;#34;https://api.github.com/repos/mattermost/mattermost/actions/workflows/&lt;/span>&lt;span style="color:#0a3069">${&lt;/span>&lt;span style="color:#953800">workflow_id&lt;/span>&lt;span style="color:#0a3069">}&lt;/span>&lt;span style="color:#0a3069">/runs?per_page=5&amp;amp;status=completed&amp;#34;&lt;/span> &lt;span style="color:#0a3069">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069">&lt;/span> &lt;span style="color:#1f2328">|&lt;/span> jq -r &lt;span style="color:#0a3069">&amp;#39;.workflow_runs[].id&amp;#39;&lt;/span>&lt;span style="color:#cf222e">)&lt;/span>&lt;span style="color:#1f2328">;&lt;/span> &lt;span style="color:#cf222e">do&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> sleep &lt;span style="color:#0550ae">1&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> curl -s -H &lt;span style="color:#0a3069">&amp;#34;Authorization: Bearer &lt;/span>&lt;span style="color:#953800">$GH_TOKEN&lt;/span>&lt;span style="color:#0a3069">&amp;#34;&lt;/span> &lt;span style="color:#0a3069">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069">&lt;/span> -H &lt;span style="color:#0a3069">&amp;#34;Accept: application/vnd.github+json&amp;#34;&lt;/span> &lt;span style="color:#0a3069">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069">&lt;/span> &lt;span style="color:#0a3069">&amp;#34;https://api.github.com/repos/mattermost/mattermost/actions/runs/&lt;/span>&lt;span style="color:#0a3069">${&lt;/span>&lt;span style="color:#953800">run_id&lt;/span>&lt;span style="color:#0a3069">}&lt;/span>&lt;span style="color:#0a3069">/jobs?per_page=100&amp;#34;&lt;/span> &lt;span style="color:#0a3069">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069">&lt;/span> &lt;span style="color:#1f2328">|&lt;/span> jq &lt;span style="color:#0a3069">&amp;#39;.jobs[] | {name, started_at, created_at, labels,
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069"> queue_seconds: (((.started_at | fromdateiso8601) - (.created_at | fromdateiso8601)))}&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#cf222e">done&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#cf222e">done&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#57606a"># Cache usage&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>curl -s -H &lt;span style="color:#0a3069">&amp;#34;Authorization: Bearer &lt;/span>&lt;span style="color:#953800">$GH_TOKEN&lt;/span>&lt;span style="color:#0a3069">&amp;#34;&lt;/span> &lt;span style="color:#0a3069">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069">&lt;/span> &lt;span style="color:#0a3069">&amp;#34;https://api.github.com/repos/mattermost/mattermost/actions/cache/usage&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>curl -s -H &lt;span style="color:#0a3069">&amp;#34;Authorization: Bearer &lt;/span>&lt;span style="color:#953800">$GH_TOKEN&lt;/span>&lt;span style="color:#0a3069">&amp;#34;&lt;/span> &lt;span style="color:#0a3069">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069">&lt;/span> &lt;span style="color:#0a3069">&amp;#34;https://api.github.com/repos/mattermost/mattermost-mobile/actions/cache/usage&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="cache-utilization">Cache Utilization&lt;/h2>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Repository&lt;/th>
 &lt;th>Caches&lt;/th>
 &lt;th>Size&lt;/th>
 &lt;th>Limit&lt;/th>
 &lt;th>Utilization&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>&lt;code>mattermost/mattermost&lt;/code>&lt;/td>
 &lt;td>59&lt;/td>
 &lt;td>&lt;strong>9.7 GB&lt;/strong>&lt;/td>
 &lt;td>10 GB&lt;/td>
 &lt;td>🔴 &lt;strong>97%&lt;/strong>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>mattermost/mattermost-mobile&lt;/code>&lt;/td>
 &lt;td>26&lt;/td>
 &lt;td>&lt;strong>9.7 GB&lt;/strong>&lt;/td>
 &lt;td>10 GB&lt;/td>
 &lt;td>🔴 &lt;strong>97%&lt;/strong>&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>The monorepo cache count jumped from 43 (Apr 17) to &lt;strong>59 caches&lt;/strong> today — a significant increase likely driven by weekend branch activity. Utilization remains high at 97%. Mobile dropped further to &lt;strong>26 caches&lt;/strong> (from 32 on Apr 17) while staying at 97% utilization — fewer caches but each is larger on average.&lt;/p></description></item><item><title>CI Queue Time Report — April 21, 2026</title><link>https://mmworkbrain.pages.dev/docs/reports/ci-queue-time-2026-04-21/</link><pubDate>Tue, 21 Apr 2026 00:00:00 +0000</pubDate><guid>https://mmworkbrain.pages.dev/docs/reports/ci-queue-time-2026-04-21/</guid><description>&lt;p>Daily report on GitHub Actions job queue delays and cache utilization for &lt;code>mattermost/mattermost&lt;/code>.&lt;/p>
&lt;h2 id="how-this-report-was-generated">How This Report Was Generated&lt;/h2>
&lt;p>Data collected via GitHub Actions REST API, querying jobs from three Server CI workflows:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#57606a"># Queue times: for each of the last 5 completed runs per workflow,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#57606a"># compute started_at - created_at per job&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#6639ba">export&lt;/span> &lt;span style="color:#953800">GH_TOKEN&lt;/span>&lt;span style="color:#0550ae">=&lt;/span>&lt;span style="color:#cf222e">$(&lt;/span>cat .tokens/github-mattermost&lt;span style="color:#cf222e">)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#cf222e">for&lt;/span> workflow_id in &lt;span style="color:#0550ae">56372552&lt;/span> &lt;span style="color:#0550ae">56742408&lt;/span> 56627862&lt;span style="color:#1f2328">;&lt;/span> &lt;span style="color:#cf222e">do&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#57606a"># 56372552 = Server CI (primary, 14 jobs on 8-core when fully enabled)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#57606a"># 56742408 = Server CI Master (reporting/coverage)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#57606a"># 56627862 = Server CI PR (pull request CI)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#cf222e">for&lt;/span> run_id in &lt;span style="color:#cf222e">$(&lt;/span>curl -s -H &lt;span style="color:#0a3069">&amp;#34;Authorization: Bearer &lt;/span>&lt;span style="color:#953800">$GH_TOKEN&lt;/span>&lt;span style="color:#0a3069">&amp;#34;&lt;/span> &lt;span style="color:#0a3069">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069">&lt;/span> -H &lt;span style="color:#0a3069">&amp;#34;Accept: application/vnd.github+json&amp;#34;&lt;/span> &lt;span style="color:#0a3069">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069">&lt;/span> &lt;span style="color:#0a3069">&amp;#34;https://api.github.com/repos/mattermost/mattermost/actions/workflows/&lt;/span>&lt;span style="color:#0a3069">${&lt;/span>&lt;span style="color:#953800">workflow_id&lt;/span>&lt;span style="color:#0a3069">}&lt;/span>&lt;span style="color:#0a3069">/runs?per_page=5&amp;amp;status=completed&amp;#34;&lt;/span> &lt;span style="color:#0a3069">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069">&lt;/span> &lt;span style="color:#1f2328">|&lt;/span> jq -r &lt;span style="color:#0a3069">&amp;#39;.workflow_runs[].id&amp;#39;&lt;/span>&lt;span style="color:#cf222e">)&lt;/span>&lt;span style="color:#1f2328">;&lt;/span> &lt;span style="color:#cf222e">do&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> sleep &lt;span style="color:#0550ae">1&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> curl -s -H &lt;span style="color:#0a3069">&amp;#34;Authorization: Bearer &lt;/span>&lt;span style="color:#953800">$GH_TOKEN&lt;/span>&lt;span style="color:#0a3069">&amp;#34;&lt;/span> &lt;span style="color:#0a3069">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069">&lt;/span> -H &lt;span style="color:#0a3069">&amp;#34;Accept: application/vnd.github+json&amp;#34;&lt;/span> &lt;span style="color:#0a3069">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069">&lt;/span> &lt;span style="color:#0a3069">&amp;#34;https://api.github.com/repos/mattermost/mattermost/actions/runs/&lt;/span>&lt;span style="color:#0a3069">${&lt;/span>&lt;span style="color:#953800">run_id&lt;/span>&lt;span style="color:#0a3069">}&lt;/span>&lt;span style="color:#0a3069">/jobs?per_page=100&amp;#34;&lt;/span> &lt;span style="color:#0a3069">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069">&lt;/span> &lt;span style="color:#1f2328">|&lt;/span> jq &lt;span style="color:#0a3069">&amp;#39;.jobs[] | {name, started_at, created_at, labels,
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069"> queue_seconds: (((.started_at | fromdateiso8601) - (.created_at | fromdateiso8601)))}&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#cf222e">done&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#cf222e">done&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#57606a"># Cache usage&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>curl -s -H &lt;span style="color:#0a3069">&amp;#34;Authorization: Bearer &lt;/span>&lt;span style="color:#953800">$GH_TOKEN&lt;/span>&lt;span style="color:#0a3069">&amp;#34;&lt;/span> &lt;span style="color:#0a3069">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069">&lt;/span> &lt;span style="color:#0a3069">&amp;#34;https://api.github.com/repos/mattermost/mattermost/actions/cache/usage&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>curl -s -H &lt;span style="color:#0a3069">&amp;#34;Authorization: Bearer &lt;/span>&lt;span style="color:#953800">$GH_TOKEN&lt;/span>&lt;span style="color:#0a3069">&amp;#34;&lt;/span> &lt;span style="color:#0a3069">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069">&lt;/span> &lt;span style="color:#0a3069">&amp;#34;https://api.github.com/repos/mattermost/mattermost-mobile/actions/cache/usage&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="cache-utilization">Cache Utilization&lt;/h2>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Repository&lt;/th>
 &lt;th>Caches&lt;/th>
 &lt;th>Size&lt;/th>
 &lt;th>Limit&lt;/th>
 &lt;th>Utilization&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>&lt;code>mattermost/mattermost&lt;/code>&lt;/td>
 &lt;td>42&lt;/td>
 &lt;td>&lt;strong>10.0 GB&lt;/strong>&lt;/td>
 &lt;td>10 GB&lt;/td>
 &lt;td>🔴 &lt;strong>100%&lt;/strong>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>mattermost/mattermost-mobile&lt;/code>&lt;/td>
 &lt;td>28&lt;/td>
 &lt;td>&lt;strong>9.7 GB&lt;/strong>&lt;/td>
 &lt;td>10 GB&lt;/td>
 &lt;td>🔴 &lt;strong>97%&lt;/strong>&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>Monorepo cache count dropped from 59 (Apr 20) to &lt;strong>42 caches&lt;/strong> — likely eviction pressure from hitting the 10 GB limit. Utilization has reached &lt;strong>100%&lt;/strong>, up from 97% yesterday. Mobile slightly increased to &lt;strong>28 caches&lt;/strong> (from 26) while staying at 97%.&lt;/p></description></item><item><title>CI Queue Time Report — April 22, 2026</title><link>https://mmworkbrain.pages.dev/docs/reports/ci-queue-time-2026-04-22/</link><pubDate>Wed, 22 Apr 2026 00:00:00 +0000</pubDate><guid>https://mmworkbrain.pages.dev/docs/reports/ci-queue-time-2026-04-22/</guid><description>&lt;p>Daily report on GitHub Actions job queue delays and cache utilization for &lt;code>mattermost/mattermost&lt;/code>.&lt;/p>
&lt;h2 id="how-this-report-was-generated">How This Report Was Generated&lt;/h2>
&lt;p>Data collected via GitHub Actions REST API, querying jobs from three Server CI workflows:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#57606a"># Queue times: for each of the last 5 completed runs per workflow,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#57606a"># compute started_at - created_at per job&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#6639ba">export&lt;/span> &lt;span style="color:#953800">GH_TOKEN&lt;/span>&lt;span style="color:#0550ae">=&lt;/span>&lt;span style="color:#cf222e">$(&lt;/span>cat .tokens/github-mattermost&lt;span style="color:#cf222e">)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#cf222e">for&lt;/span> workflow_id in &lt;span style="color:#0550ae">56372552&lt;/span> &lt;span style="color:#0550ae">56742408&lt;/span> 56627862&lt;span style="color:#1f2328">;&lt;/span> &lt;span style="color:#cf222e">do&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#57606a"># 56372552 = Server CI (primary, 14 jobs on 8-core when fully enabled)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#57606a"># 56742408 = Server CI Master (reporting/coverage)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#57606a"># 56627862 = Server CI PR (pull request CI)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#cf222e">for&lt;/span> run_id in &lt;span style="color:#cf222e">$(&lt;/span>curl -s -H &lt;span style="color:#0a3069">&amp;#34;Authorization: Bearer &lt;/span>&lt;span style="color:#953800">$GH_TOKEN&lt;/span>&lt;span style="color:#0a3069">&amp;#34;&lt;/span> &lt;span style="color:#0a3069">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069">&lt;/span> -H &lt;span style="color:#0a3069">&amp;#34;Accept: application/vnd.github+json&amp;#34;&lt;/span> &lt;span style="color:#0a3069">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069">&lt;/span> &lt;span style="color:#0a3069">&amp;#34;https://api.github.com/repos/mattermost/mattermost/actions/workflows/&lt;/span>&lt;span style="color:#0a3069">${&lt;/span>&lt;span style="color:#953800">workflow_id&lt;/span>&lt;span style="color:#0a3069">}&lt;/span>&lt;span style="color:#0a3069">/runs?per_page=5&amp;amp;status=completed&amp;#34;&lt;/span> &lt;span style="color:#0a3069">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069">&lt;/span> &lt;span style="color:#1f2328">|&lt;/span> jq -r &lt;span style="color:#0a3069">&amp;#39;.workflow_runs[].id&amp;#39;&lt;/span>&lt;span style="color:#cf222e">)&lt;/span>&lt;span style="color:#1f2328">;&lt;/span> &lt;span style="color:#cf222e">do&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> sleep &lt;span style="color:#0550ae">1&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> curl -s -H &lt;span style="color:#0a3069">&amp;#34;Authorization: Bearer &lt;/span>&lt;span style="color:#953800">$GH_TOKEN&lt;/span>&lt;span style="color:#0a3069">&amp;#34;&lt;/span> &lt;span style="color:#0a3069">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069">&lt;/span> -H &lt;span style="color:#0a3069">&amp;#34;Accept: application/vnd.github+json&amp;#34;&lt;/span> &lt;span style="color:#0a3069">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069">&lt;/span> &lt;span style="color:#0a3069">&amp;#34;https://api.github.com/repos/mattermost/mattermost/actions/runs/&lt;/span>&lt;span style="color:#0a3069">${&lt;/span>&lt;span style="color:#953800">run_id&lt;/span>&lt;span style="color:#0a3069">}&lt;/span>&lt;span style="color:#0a3069">/jobs?per_page=100&amp;#34;&lt;/span> &lt;span style="color:#0a3069">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069">&lt;/span> &lt;span style="color:#1f2328">|&lt;/span> jq &lt;span style="color:#0a3069">&amp;#39;.jobs[] | {name, started_at, created_at, labels,
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069"> queue_seconds: (((.started_at | fromdateiso8601) - (.created_at | fromdateiso8601)))}&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#cf222e">done&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#cf222e">done&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#57606a"># Cache usage&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>curl -s -H &lt;span style="color:#0a3069">&amp;#34;Authorization: Bearer &lt;/span>&lt;span style="color:#953800">$GH_TOKEN&lt;/span>&lt;span style="color:#0a3069">&amp;#34;&lt;/span> &lt;span style="color:#0a3069">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069">&lt;/span> &lt;span style="color:#0a3069">&amp;#34;https://api.github.com/repos/mattermost/mattermost/actions/cache/usage&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>curl -s -H &lt;span style="color:#0a3069">&amp;#34;Authorization: Bearer &lt;/span>&lt;span style="color:#953800">$GH_TOKEN&lt;/span>&lt;span style="color:#0a3069">&amp;#34;&lt;/span> &lt;span style="color:#0a3069">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069">&lt;/span> &lt;span style="color:#0a3069">&amp;#34;https://api.github.com/repos/mattermost/mattermost-mobile/actions/cache/usage&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="cache-utilization">Cache Utilization&lt;/h2>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Repository&lt;/th>
 &lt;th>Caches&lt;/th>
 &lt;th>Size&lt;/th>
 &lt;th>Limit&lt;/th>
 &lt;th>Utilization&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>&lt;code>mattermost/mattermost&lt;/code>&lt;/td>
 &lt;td>54&lt;/td>
 &lt;td>&lt;strong>10.2 GB&lt;/strong>&lt;/td>
 &lt;td>10 GB&lt;/td>
 &lt;td>🔴 &lt;strong>102%&lt;/strong>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>mattermost/mattermost-mobile&lt;/code>&lt;/td>
 &lt;td>32&lt;/td>
 &lt;td>&lt;strong>9.5 GB&lt;/strong>&lt;/td>
 &lt;td>10 GB&lt;/td>
 &lt;td>🟡 &lt;strong>95%&lt;/strong>&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>Monorepo cache count jumped from 42 (Apr 21) to &lt;strong>54 caches&lt;/strong>, and size has exceeded the nominal 10 GB limit at &lt;strong>10.2 GB&lt;/strong> (10,947 MB). GitHub allows brief overages before enforcing eviction. Mobile increased to &lt;strong>32 caches&lt;/strong> (from 28) while dropping slightly to 95%.&lt;/p></description></item><item><title>CI Queue Time Report — April 23, 2026</title><link>https://mmworkbrain.pages.dev/docs/reports/ci-queue-time-2026-04-23/</link><pubDate>Thu, 23 Apr 2026 00:00:00 +0000</pubDate><guid>https://mmworkbrain.pages.dev/docs/reports/ci-queue-time-2026-04-23/</guid><description>&lt;p>Daily report on GitHub Actions job queue delays and cache utilization for &lt;code>mattermost/mattermost&lt;/code>.&lt;/p>
&lt;h2 id="how-this-report-was-generated">How This Report Was Generated&lt;/h2>
&lt;p>Data collected via GitHub Actions REST API, querying jobs from three Server CI workflows:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#57606a"># Queue times: for each of the last 5 completed runs per workflow,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#57606a"># compute started_at - created_at per job&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#6639ba">export&lt;/span> &lt;span style="color:#953800">GH_TOKEN&lt;/span>&lt;span style="color:#0550ae">=&lt;/span>&lt;span style="color:#cf222e">$(&lt;/span>cat .tokens/github-mattermost&lt;span style="color:#cf222e">)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#cf222e">for&lt;/span> workflow_id in &lt;span style="color:#0550ae">56372552&lt;/span> &lt;span style="color:#0550ae">56742408&lt;/span> 56627862&lt;span style="color:#1f2328">;&lt;/span> &lt;span style="color:#cf222e">do&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#57606a"># 56372552 = Server CI (primary, 14 jobs on 8-core when fully enabled)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#57606a"># 56742408 = Server CI Master (reporting/coverage)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#57606a"># 56627862 = Server CI PR (pull request CI)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#cf222e">for&lt;/span> run_id in &lt;span style="color:#cf222e">$(&lt;/span>curl -s -H &lt;span style="color:#0a3069">&amp;#34;Authorization: Bearer &lt;/span>&lt;span style="color:#953800">$GH_TOKEN&lt;/span>&lt;span style="color:#0a3069">&amp;#34;&lt;/span> &lt;span style="color:#0a3069">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069">&lt;/span> -H &lt;span style="color:#0a3069">&amp;#34;Accept: application/vnd.github+json&amp;#34;&lt;/span> &lt;span style="color:#0a3069">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069">&lt;/span> &lt;span style="color:#0a3069">&amp;#34;https://api.github.com/repos/mattermost/mattermost/actions/workflows/&lt;/span>&lt;span style="color:#0a3069">${&lt;/span>&lt;span style="color:#953800">workflow_id&lt;/span>&lt;span style="color:#0a3069">}&lt;/span>&lt;span style="color:#0a3069">/runs?per_page=5&amp;amp;status=completed&amp;#34;&lt;/span> &lt;span style="color:#0a3069">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069">&lt;/span> &lt;span style="color:#1f2328">|&lt;/span> jq -r &lt;span style="color:#0a3069">&amp;#39;.workflow_runs[].id&amp;#39;&lt;/span>&lt;span style="color:#cf222e">)&lt;/span>&lt;span style="color:#1f2328">;&lt;/span> &lt;span style="color:#cf222e">do&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> sleep &lt;span style="color:#0550ae">1&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> curl -s -H &lt;span style="color:#0a3069">&amp;#34;Authorization: Bearer &lt;/span>&lt;span style="color:#953800">$GH_TOKEN&lt;/span>&lt;span style="color:#0a3069">&amp;#34;&lt;/span> &lt;span style="color:#0a3069">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069">&lt;/span> -H &lt;span style="color:#0a3069">&amp;#34;Accept: application/vnd.github+json&amp;#34;&lt;/span> &lt;span style="color:#0a3069">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069">&lt;/span> &lt;span style="color:#0a3069">&amp;#34;https://api.github.com/repos/mattermost/mattermost/actions/runs/&lt;/span>&lt;span style="color:#0a3069">${&lt;/span>&lt;span style="color:#953800">run_id&lt;/span>&lt;span style="color:#0a3069">}&lt;/span>&lt;span style="color:#0a3069">/jobs?per_page=100&amp;#34;&lt;/span> &lt;span style="color:#0a3069">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069">&lt;/span> &lt;span style="color:#1f2328">|&lt;/span> jq &lt;span style="color:#0a3069">&amp;#39;.jobs[] | {name, started_at, created_at, labels,
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069"> queue_seconds: (((.started_at | fromdateiso8601) - (.created_at | fromdateiso8601)))}&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#cf222e">done&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#cf222e">done&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#57606a"># Cache usage&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>curl -s -H &lt;span style="color:#0a3069">&amp;#34;Authorization: Bearer &lt;/span>&lt;span style="color:#953800">$GH_TOKEN&lt;/span>&lt;span style="color:#0a3069">&amp;#34;&lt;/span> &lt;span style="color:#0a3069">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069">&lt;/span> &lt;span style="color:#0a3069">&amp;#34;https://api.github.com/repos/mattermost/mattermost/actions/cache/usage&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>curl -s -H &lt;span style="color:#0a3069">&amp;#34;Authorization: Bearer &lt;/span>&lt;span style="color:#953800">$GH_TOKEN&lt;/span>&lt;span style="color:#0a3069">&amp;#34;&lt;/span> &lt;span style="color:#0a3069">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069">&lt;/span> &lt;span style="color:#0a3069">&amp;#34;https://api.github.com/repos/mattermost/mattermost-mobile/actions/cache/usage&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="cache-utilization">Cache Utilization&lt;/h2>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Repository&lt;/th>
 &lt;th>Caches&lt;/th>
 &lt;th>Size&lt;/th>
 &lt;th>Limit&lt;/th>
 &lt;th>Utilization&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>&lt;code>mattermost/mattermost&lt;/code>&lt;/td>
 &lt;td>53&lt;/td>
 &lt;td>&lt;strong>10.2 GB&lt;/strong>&lt;/td>
 &lt;td>10 GB&lt;/td>
 &lt;td>🔴 &lt;strong>102%&lt;/strong>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>mattermost/mattermost-mobile&lt;/code>&lt;/td>
 &lt;td>36&lt;/td>
 &lt;td>&lt;strong>9.5 GB&lt;/strong>&lt;/td>
 &lt;td>10 GB&lt;/td>
 &lt;td>🟡 &lt;strong>95%&lt;/strong>&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>Monorepo cache count dropped slightly from 54 (Apr 22) to &lt;strong>53&lt;/strong>, while size remains at &lt;strong>10.2 GB&lt;/strong> (10,967 MB) — still over the nominal 10 GB limit. Mobile jumped from 32 to &lt;strong>36 caches&lt;/strong> while size held at &lt;strong>9.5 GB&lt;/strong> (10,264 MB).&lt;/p></description></item><item><title>CI Queue Time Report — April 24, 2026</title><link>https://mmworkbrain.pages.dev/docs/reports/ci-queue-time-2026-04-24/</link><pubDate>Fri, 24 Apr 2026 00:00:00 +0000</pubDate><guid>https://mmworkbrain.pages.dev/docs/reports/ci-queue-time-2026-04-24/</guid><description>&lt;p>Daily report on GitHub Actions job queue delays and cache utilization for &lt;code>mattermost/mattermost&lt;/code>.&lt;/p>
&lt;h2 id="how-this-report-was-generated">How This Report Was Generated&lt;/h2>
&lt;p>Data collected via GitHub Actions REST API, querying jobs from three Server CI workflows:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#57606a"># Queue times: for each of the last 5 completed runs per workflow,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#57606a"># compute started_at - created_at per job&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#6639ba">export&lt;/span> &lt;span style="color:#953800">GH_TOKEN&lt;/span>&lt;span style="color:#0550ae">=&lt;/span>&lt;span style="color:#cf222e">$(&lt;/span>cat .tokens/github-mattermost&lt;span style="color:#cf222e">)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#cf222e">for&lt;/span> workflow_id in &lt;span style="color:#0550ae">56372552&lt;/span> &lt;span style="color:#0550ae">56742408&lt;/span> 56627862&lt;span style="color:#1f2328">;&lt;/span> &lt;span style="color:#cf222e">do&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#57606a"># 56372552 = Server CI (primary, 14 jobs on 8-core when fully enabled)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#57606a"># 56742408 = Server CI Master (reporting/coverage)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#57606a"># 56627862 = Server CI PR (pull request CI)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#cf222e">for&lt;/span> run_id in &lt;span style="color:#cf222e">$(&lt;/span>curl -s -H &lt;span style="color:#0a3069">&amp;#34;Authorization: Bearer &lt;/span>&lt;span style="color:#953800">$GH_TOKEN&lt;/span>&lt;span style="color:#0a3069">&amp;#34;&lt;/span> &lt;span style="color:#0a3069">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069">&lt;/span> -H &lt;span style="color:#0a3069">&amp;#34;Accept: application/vnd.github+json&amp;#34;&lt;/span> &lt;span style="color:#0a3069">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069">&lt;/span> &lt;span style="color:#0a3069">&amp;#34;https://api.github.com/repos/mattermost/mattermost/actions/workflows/&lt;/span>&lt;span style="color:#0a3069">${&lt;/span>&lt;span style="color:#953800">workflow_id&lt;/span>&lt;span style="color:#0a3069">}&lt;/span>&lt;span style="color:#0a3069">/runs?per_page=5&amp;amp;status=completed&amp;#34;&lt;/span> &lt;span style="color:#0a3069">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069">&lt;/span> &lt;span style="color:#1f2328">|&lt;/span> jq -r &lt;span style="color:#0a3069">&amp;#39;.workflow_runs[].id&amp;#39;&lt;/span>&lt;span style="color:#cf222e">)&lt;/span>&lt;span style="color:#1f2328">;&lt;/span> &lt;span style="color:#cf222e">do&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> sleep &lt;span style="color:#0550ae">1&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> curl -s -H &lt;span style="color:#0a3069">&amp;#34;Authorization: Bearer &lt;/span>&lt;span style="color:#953800">$GH_TOKEN&lt;/span>&lt;span style="color:#0a3069">&amp;#34;&lt;/span> &lt;span style="color:#0a3069">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069">&lt;/span> -H &lt;span style="color:#0a3069">&amp;#34;Accept: application/vnd.github+json&amp;#34;&lt;/span> &lt;span style="color:#0a3069">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069">&lt;/span> &lt;span style="color:#0a3069">&amp;#34;https://api.github.com/repos/mattermost/mattermost/actions/runs/&lt;/span>&lt;span style="color:#0a3069">${&lt;/span>&lt;span style="color:#953800">run_id&lt;/span>&lt;span style="color:#0a3069">}&lt;/span>&lt;span style="color:#0a3069">/jobs?per_page=100&amp;#34;&lt;/span> &lt;span style="color:#0a3069">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069">&lt;/span> &lt;span style="color:#1f2328">|&lt;/span> jq &lt;span style="color:#0a3069">&amp;#39;.jobs[] | {name, started_at, created_at, labels,
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069"> queue_seconds: (((.started_at | fromdateiso8601) - (.created_at | fromdateiso8601)))}&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#cf222e">done&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#cf222e">done&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#57606a"># Cache usage&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>curl -s -H &lt;span style="color:#0a3069">&amp;#34;Authorization: Bearer &lt;/span>&lt;span style="color:#953800">$GH_TOKEN&lt;/span>&lt;span style="color:#0a3069">&amp;#34;&lt;/span> &lt;span style="color:#0a3069">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069">&lt;/span> &lt;span style="color:#0a3069">&amp;#34;https://api.github.com/repos/mattermost/mattermost/actions/cache/usage&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>curl -s -H &lt;span style="color:#0a3069">&amp;#34;Authorization: Bearer &lt;/span>&lt;span style="color:#953800">$GH_TOKEN&lt;/span>&lt;span style="color:#0a3069">&amp;#34;&lt;/span> &lt;span style="color:#0a3069">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069">&lt;/span> &lt;span style="color:#0a3069">&amp;#34;https://api.github.com/repos/mattermost/mattermost-mobile/actions/cache/usage&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="cache-utilization">Cache Utilization&lt;/h2>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Repository&lt;/th>
 &lt;th>Caches&lt;/th>
 &lt;th>Size&lt;/th>
 &lt;th>Limit&lt;/th>
 &lt;th>Utilization&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>&lt;code>mattermost/mattermost&lt;/code>&lt;/td>
 &lt;td>42&lt;/td>
 &lt;td>&lt;strong>9.7 GB&lt;/strong>&lt;/td>
 &lt;td>10 GB&lt;/td>
 &lt;td>🟡 &lt;strong>97%&lt;/strong>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>mattermost/mattermost-mobile&lt;/code>&lt;/td>
 &lt;td>28&lt;/td>
 &lt;td>&lt;strong>10.0 GB&lt;/strong>&lt;/td>
 &lt;td>10 GB&lt;/td>
 &lt;td>🔴 &lt;strong>100%&lt;/strong>&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>Monorepo dropped significantly from 53 caches (Apr 23) to &lt;strong>42&lt;/strong>, and size fell from 10.2 GB to &lt;strong>9.7 GB&lt;/strong> (10,425 MB) — finally back under the 10 GB limit. Mobile went the opposite direction: down from 36 to &lt;strong>28 caches&lt;/strong> but size stayed at &lt;strong>10.0 GB&lt;/strong> (10,726 MB), now hitting the limit.&lt;/p></description></item><item><title>CI Queue Time Report — April 27, 2026</title><link>https://mmworkbrain.pages.dev/docs/reports/ci-queue-time-2026-04-27/</link><pubDate>Mon, 27 Apr 2026 00:00:00 +0000</pubDate><guid>https://mmworkbrain.pages.dev/docs/reports/ci-queue-time-2026-04-27/</guid><description>&lt;p>Daily report on GitHub Actions job queue delays and cache utilization for &lt;code>mattermost/mattermost&lt;/code>.&lt;/p>
&lt;h2 id="how-this-report-was-generated">How This Report Was Generated&lt;/h2>
&lt;p>Data collected via GitHub Actions REST API, querying jobs from three Server CI workflows:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#57606a"># Queue times: for each of the last 5 completed runs per workflow,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#57606a"># compute started_at - created_at per job&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#6639ba">export&lt;/span> &lt;span style="color:#953800">GH_TOKEN&lt;/span>&lt;span style="color:#0550ae">=&lt;/span>&lt;span style="color:#cf222e">$(&lt;/span>cat .tokens/github-mattermost&lt;span style="color:#cf222e">)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#cf222e">for&lt;/span> workflow_id in &lt;span style="color:#0550ae">56372552&lt;/span> &lt;span style="color:#0550ae">56742408&lt;/span> 56627862&lt;span style="color:#1f2328">;&lt;/span> &lt;span style="color:#cf222e">do&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#57606a"># 56372552 = Server CI (primary, 14 jobs on 8-core when fully enabled)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#57606a"># 56742408 = Server CI Master (reporting/coverage)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#57606a"># 56627862 = Server CI PR (pull request CI)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#cf222e">for&lt;/span> run_id in &lt;span style="color:#cf222e">$(&lt;/span>curl -s -H &lt;span style="color:#0a3069">&amp;#34;Authorization: Bearer &lt;/span>&lt;span style="color:#953800">$GH_TOKEN&lt;/span>&lt;span style="color:#0a3069">&amp;#34;&lt;/span> &lt;span style="color:#0a3069">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069">&lt;/span> -H &lt;span style="color:#0a3069">&amp;#34;Accept: application/vnd.github+json&amp;#34;&lt;/span> &lt;span style="color:#0a3069">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069">&lt;/span> &lt;span style="color:#0a3069">&amp;#34;https://api.github.com/repos/mattermost/mattermost/actions/workflows/&lt;/span>&lt;span style="color:#0a3069">${&lt;/span>&lt;span style="color:#953800">workflow_id&lt;/span>&lt;span style="color:#0a3069">}&lt;/span>&lt;span style="color:#0a3069">/runs?per_page=5&amp;amp;status=completed&amp;#34;&lt;/span> &lt;span style="color:#0a3069">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069">&lt;/span> &lt;span style="color:#1f2328">|&lt;/span> jq -r &lt;span style="color:#0a3069">&amp;#39;.workflow_runs[].id&amp;#39;&lt;/span>&lt;span style="color:#cf222e">)&lt;/span>&lt;span style="color:#1f2328">;&lt;/span> &lt;span style="color:#cf222e">do&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> sleep &lt;span style="color:#0550ae">1&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> curl -s -H &lt;span style="color:#0a3069">&amp;#34;Authorization: Bearer &lt;/span>&lt;span style="color:#953800">$GH_TOKEN&lt;/span>&lt;span style="color:#0a3069">&amp;#34;&lt;/span> &lt;span style="color:#0a3069">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069">&lt;/span> -H &lt;span style="color:#0a3069">&amp;#34;Accept: application/vnd.github+json&amp;#34;&lt;/span> &lt;span style="color:#0a3069">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069">&lt;/span> &lt;span style="color:#0a3069">&amp;#34;https://api.github.com/repos/mattermost/mattermost/actions/runs/&lt;/span>&lt;span style="color:#0a3069">${&lt;/span>&lt;span style="color:#953800">run_id&lt;/span>&lt;span style="color:#0a3069">}&lt;/span>&lt;span style="color:#0a3069">/jobs?per_page=100&amp;#34;&lt;/span> &lt;span style="color:#0a3069">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069">&lt;/span> &lt;span style="color:#1f2328">|&lt;/span> jq &lt;span style="color:#0a3069">&amp;#39;.jobs[] | {name, started_at, created_at, labels,
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069"> queue_seconds: (((.started_at | fromdateiso8601) - (.created_at | fromdateiso8601)))}&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#cf222e">done&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#cf222e">done&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#57606a"># Cache usage&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>curl -s -H &lt;span style="color:#0a3069">&amp;#34;Authorization: Bearer &lt;/span>&lt;span style="color:#953800">$GH_TOKEN&lt;/span>&lt;span style="color:#0a3069">&amp;#34;&lt;/span> &lt;span style="color:#0a3069">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069">&lt;/span> &lt;span style="color:#0a3069">&amp;#34;https://api.github.com/repos/mattermost/mattermost/actions/cache/usage&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>curl -s -H &lt;span style="color:#0a3069">&amp;#34;Authorization: Bearer &lt;/span>&lt;span style="color:#953800">$GH_TOKEN&lt;/span>&lt;span style="color:#0a3069">&amp;#34;&lt;/span> &lt;span style="color:#0a3069">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069">&lt;/span> &lt;span style="color:#0a3069">&amp;#34;https://api.github.com/repos/mattermost/mattermost-mobile/actions/cache/usage&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="cache-utilization">Cache Utilization&lt;/h2>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Repository&lt;/th>
 &lt;th>Caches&lt;/th>
 &lt;th>Size&lt;/th>
 &lt;th>Limit&lt;/th>
 &lt;th>Utilization&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>&lt;code>mattermost/mattermost&lt;/code>&lt;/td>
 &lt;td>46&lt;/td>
 &lt;td>&lt;strong>10.3 GB&lt;/strong>&lt;/td>
 &lt;td>10 GB&lt;/td>
 &lt;td>🔴 &lt;strong>103%&lt;/strong>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>mattermost/mattermost-mobile&lt;/code>&lt;/td>
 &lt;td>29&lt;/td>
 &lt;td>&lt;strong>9.9 GB&lt;/strong>&lt;/td>
 &lt;td>10 GB&lt;/td>
 &lt;td>🟡 &lt;strong>99%&lt;/strong>&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>Monorepo bounced back over the limit — up from 42 caches / 9.7 GB (Apr 24) to &lt;strong>46 caches / 10.3 GB&lt;/strong> (11,103 MB). The weekend&amp;rsquo;s Server CI activity on multiple branches (MM-68196, MM-68457, remove-property-fields-protected-index) created new caches that pushed it over. Mobile held steady at 29 caches (was 28) and &lt;strong>9.9 GB&lt;/strong> (10,579 MB), slightly down from the 10.0 GB limit hit on Apr 24.&lt;/p></description></item><item><title>CI Queue Time Report — April 28, 2026</title><link>https://mmworkbrain.pages.dev/docs/reports/ci-queue-time-2026-04-28/</link><pubDate>Tue, 28 Apr 2026 00:00:00 +0000</pubDate><guid>https://mmworkbrain.pages.dev/docs/reports/ci-queue-time-2026-04-28/</guid><description>&lt;p>Daily report on GitHub Actions job queue delays and cache utilization for &lt;code>mattermost/mattermost&lt;/code>.&lt;/p>
&lt;h2 id="how-this-report-was-generated">How This Report Was Generated&lt;/h2>
&lt;p>Data collected via GitHub Actions REST API, querying jobs from three Server CI workflows:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#57606a"># Queue times: for each of the last 5 completed runs per workflow,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#57606a"># compute started_at - created_at per job&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#6639ba">export&lt;/span> &lt;span style="color:#953800">GH_TOKEN&lt;/span>&lt;span style="color:#0550ae">=&lt;/span>&lt;span style="color:#cf222e">$(&lt;/span>cat .tokens/github-mattermost&lt;span style="color:#cf222e">)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#cf222e">for&lt;/span> workflow_id in &lt;span style="color:#0550ae">56372552&lt;/span> &lt;span style="color:#0550ae">56742408&lt;/span> 56627862&lt;span style="color:#1f2328">;&lt;/span> &lt;span style="color:#cf222e">do&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#57606a"># 56372552 = Server CI (primary, up to 9 jobs on 8-core with coverage shards)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#57606a"># 56742408 = Server CI Master (reporting/coverage)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#57606a"># 56627862 = Server CI PR (pull request CI)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#cf222e">for&lt;/span> run_id in &lt;span style="color:#cf222e">$(&lt;/span>curl -s -H &lt;span style="color:#0a3069">&amp;#34;Authorization: Bearer &lt;/span>&lt;span style="color:#953800">$GH_TOKEN&lt;/span>&lt;span style="color:#0a3069">&amp;#34;&lt;/span> &lt;span style="color:#0a3069">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069">&lt;/span> -H &lt;span style="color:#0a3069">&amp;#34;Accept: application/vnd.github+json&amp;#34;&lt;/span> &lt;span style="color:#0a3069">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069">&lt;/span> &lt;span style="color:#0a3069">&amp;#34;https://api.github.com/repos/mattermost/mattermost/actions/workflows/&lt;/span>&lt;span style="color:#0a3069">${&lt;/span>&lt;span style="color:#953800">workflow_id&lt;/span>&lt;span style="color:#0a3069">}&lt;/span>&lt;span style="color:#0a3069">/runs?per_page=5&amp;amp;status=completed&amp;#34;&lt;/span> &lt;span style="color:#0a3069">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069">&lt;/span> &lt;span style="color:#1f2328">|&lt;/span> jq -r &lt;span style="color:#0a3069">&amp;#39;.workflow_runs[].id&amp;#39;&lt;/span>&lt;span style="color:#cf222e">)&lt;/span>&lt;span style="color:#1f2328">;&lt;/span> &lt;span style="color:#cf222e">do&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> sleep &lt;span style="color:#0550ae">1&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> curl -s -H &lt;span style="color:#0a3069">&amp;#34;Authorization: Bearer &lt;/span>&lt;span style="color:#953800">$GH_TOKEN&lt;/span>&lt;span style="color:#0a3069">&amp;#34;&lt;/span> &lt;span style="color:#0a3069">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069">&lt;/span> -H &lt;span style="color:#0a3069">&amp;#34;Accept: application/vnd.github+json&amp;#34;&lt;/span> &lt;span style="color:#0a3069">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069">&lt;/span> &lt;span style="color:#0a3069">&amp;#34;https://api.github.com/repos/mattermost/mattermost/actions/runs/&lt;/span>&lt;span style="color:#0a3069">${&lt;/span>&lt;span style="color:#953800">run_id&lt;/span>&lt;span style="color:#0a3069">}&lt;/span>&lt;span style="color:#0a3069">/jobs?per_page=100&amp;#34;&lt;/span> &lt;span style="color:#0a3069">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069">&lt;/span> &lt;span style="color:#1f2328">|&lt;/span> jq &lt;span style="color:#0a3069">&amp;#39;.jobs[] | {name, started_at, created_at, labels,
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069"> queue_seconds: (((.started_at | fromdateiso8601) - (.created_at | fromdateiso8601)))}&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#cf222e">done&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#cf222e">done&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#57606a"># Cache usage&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>curl -s -H &lt;span style="color:#0a3069">&amp;#34;Authorization: Bearer &lt;/span>&lt;span style="color:#953800">$GH_TOKEN&lt;/span>&lt;span style="color:#0a3069">&amp;#34;&lt;/span> &lt;span style="color:#0a3069">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069">&lt;/span> &lt;span style="color:#0a3069">&amp;#34;https://api.github.com/repos/mattermost/mattermost/actions/cache/usage&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>curl -s -H &lt;span style="color:#0a3069">&amp;#34;Authorization: Bearer &lt;/span>&lt;span style="color:#953800">$GH_TOKEN&lt;/span>&lt;span style="color:#0a3069">&amp;#34;&lt;/span> &lt;span style="color:#0a3069">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069">&lt;/span> &lt;span style="color:#0a3069">&amp;#34;https://api.github.com/repos/mattermost/mattermost-mobile/actions/cache/usage&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="cache-utilization">Cache Utilization&lt;/h2>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Repository&lt;/th>
 &lt;th>Caches&lt;/th>
 &lt;th>Size&lt;/th>
 &lt;th>Limit&lt;/th>
 &lt;th>Utilization&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>&lt;code>mattermost/mattermost&lt;/code>&lt;/td>
 &lt;td>45&lt;/td>
 &lt;td>&lt;strong>10.4 GB&lt;/strong>&lt;/td>
 &lt;td>10 GB&lt;/td>
 &lt;td>🔴 &lt;strong>104%&lt;/strong>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>mattermost/mattermost-mobile&lt;/code>&lt;/td>
 &lt;td>30&lt;/td>
 &lt;td>&lt;strong>9.5 GB&lt;/strong>&lt;/td>
 &lt;td>10 GB&lt;/td>
 &lt;td>🟡 &lt;strong>95%&lt;/strong>&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>Monorepo remains over the 10 GB limit — 45 caches / 10.4 GB (10,351 MB), down 1 cache from yesterday&amp;rsquo;s 46 but size essentially unchanged. Mobile improved slightly: 30 caches (was 29) at &lt;strong>9.5 GB&lt;/strong> (9,476 MB), down from 9.9 GB on Apr 27.&lt;/p></description></item><item><title>CI Queue Time Report — April 29, 2026</title><link>https://mmworkbrain.pages.dev/docs/reports/ci-queue-time-2026-04-29/</link><pubDate>Wed, 29 Apr 2026 00:00:00 +0000</pubDate><guid>https://mmworkbrain.pages.dev/docs/reports/ci-queue-time-2026-04-29/</guid><description>&lt;p>Daily report on GitHub Actions job queue delays and cache utilization for &lt;code>mattermost/mattermost&lt;/code>.&lt;/p>
&lt;h2 id="how-this-report-was-generated">How This Report Was Generated&lt;/h2>
&lt;p>Data collected via GitHub Actions REST API, querying jobs from three Server CI workflows:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#57606a"># Queue times: for each of the last 5 completed runs per workflow,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#57606a"># compute started_at - created_at per job&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#6639ba">export&lt;/span> &lt;span style="color:#953800">GH_TOKEN&lt;/span>&lt;span style="color:#0550ae">=&lt;/span>&lt;span style="color:#cf222e">$(&lt;/span>cat .tokens/github-mattermost&lt;span style="color:#cf222e">)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#cf222e">for&lt;/span> workflow_id in &lt;span style="color:#0550ae">56372552&lt;/span> &lt;span style="color:#0550ae">56742408&lt;/span> 56627862&lt;span style="color:#1f2328">;&lt;/span> &lt;span style="color:#cf222e">do&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#57606a"># 56372552 = Server CI (primary, up to 14 jobs on 8-core with all shards + FIPS)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#57606a"># 56742408 = Server CI Master (reporting/coverage)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#57606a"># 56627862 = Server CI PR (pull request CI)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#cf222e">for&lt;/span> run_id in &lt;span style="color:#cf222e">$(&lt;/span>curl -s -H &lt;span style="color:#0a3069">&amp;#34;Authorization: Bearer &lt;/span>&lt;span style="color:#953800">$GH_TOKEN&lt;/span>&lt;span style="color:#0a3069">&amp;#34;&lt;/span> &lt;span style="color:#0a3069">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069">&lt;/span> -H &lt;span style="color:#0a3069">&amp;#34;Accept: application/vnd.github+json&amp;#34;&lt;/span> &lt;span style="color:#0a3069">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069">&lt;/span> &lt;span style="color:#0a3069">&amp;#34;https://api.github.com/repos/mattermost/mattermost/actions/workflows/&lt;/span>&lt;span style="color:#0a3069">${&lt;/span>&lt;span style="color:#953800">workflow_id&lt;/span>&lt;span style="color:#0a3069">}&lt;/span>&lt;span style="color:#0a3069">/runs?per_page=5&amp;amp;status=completed&amp;#34;&lt;/span> &lt;span style="color:#0a3069">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069">&lt;/span> &lt;span style="color:#1f2328">|&lt;/span> jq -r &lt;span style="color:#0a3069">&amp;#39;.workflow_runs[].id&amp;#39;&lt;/span>&lt;span style="color:#cf222e">)&lt;/span>&lt;span style="color:#1f2328">;&lt;/span> &lt;span style="color:#cf222e">do&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> sleep &lt;span style="color:#0550ae">1&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> curl -s -H &lt;span style="color:#0a3069">&amp;#34;Authorization: Bearer &lt;/span>&lt;span style="color:#953800">$GH_TOKEN&lt;/span>&lt;span style="color:#0a3069">&amp;#34;&lt;/span> &lt;span style="color:#0a3069">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069">&lt;/span> -H &lt;span style="color:#0a3069">&amp;#34;Accept: application/vnd.github+json&amp;#34;&lt;/span> &lt;span style="color:#0a3069">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069">&lt;/span> &lt;span style="color:#0a3069">&amp;#34;https://api.github.com/repos/mattermost/mattermost/actions/runs/&lt;/span>&lt;span style="color:#0a3069">${&lt;/span>&lt;span style="color:#953800">run_id&lt;/span>&lt;span style="color:#0a3069">}&lt;/span>&lt;span style="color:#0a3069">/jobs?per_page=100&amp;#34;&lt;/span> &lt;span style="color:#0a3069">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069">&lt;/span> &lt;span style="color:#1f2328">|&lt;/span> jq &lt;span style="color:#0a3069">&amp;#39;.jobs[] | {name, started_at, created_at, labels,
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069"> queue_seconds: (((.started_at | fromdateiso8601) - (.created_at | fromdateiso8601)))}&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#cf222e">done&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#cf222e">done&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#57606a"># Cache usage&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>curl -s -H &lt;span style="color:#0a3069">&amp;#34;Authorization: Bearer &lt;/span>&lt;span style="color:#953800">$GH_TOKEN&lt;/span>&lt;span style="color:#0a3069">&amp;#34;&lt;/span> &lt;span style="color:#0a3069">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069">&lt;/span> &lt;span style="color:#0a3069">&amp;#34;https://api.github.com/repos/mattermost/mattermost/actions/cache/usage&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>curl -s -H &lt;span style="color:#0a3069">&amp;#34;Authorization: Bearer &lt;/span>&lt;span style="color:#953800">$GH_TOKEN&lt;/span>&lt;span style="color:#0a3069">&amp;#34;&lt;/span> &lt;span style="color:#0a3069">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069">&lt;/span> &lt;span style="color:#0a3069">&amp;#34;https://api.github.com/repos/mattermost/mattermost-mobile/actions/cache/usage&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="cache-utilization">Cache Utilization&lt;/h2>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Repository&lt;/th>
 &lt;th>Caches&lt;/th>
 &lt;th>Size&lt;/th>
 &lt;th>Limit&lt;/th>
 &lt;th>Utilization&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>&lt;code>mattermost/mattermost&lt;/code>&lt;/td>
 &lt;td>44&lt;/td>
 &lt;td>&lt;strong>10.3 GB&lt;/strong>&lt;/td>
 &lt;td>10 GB&lt;/td>
 &lt;td>🔴 &lt;strong>103%&lt;/strong>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>mattermost/mattermost-mobile&lt;/code>&lt;/td>
 &lt;td>34&lt;/td>
 &lt;td>&lt;strong>9.0 GB&lt;/strong>&lt;/td>
 &lt;td>10 GB&lt;/td>
 &lt;td>🟡 &lt;strong>90%&lt;/strong>&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>Monorepo: 44 caches / 10.3 GB (11,083 MB), down 1 cache from yesterday&amp;rsquo;s 45 but still over the 10 GB limit. Mobile improved significantly: 34 caches (was 30) at &lt;strong>9.0 GB&lt;/strong> (9,617 MB), down from 9.5 GB yesterday — heading in the right direction.&lt;/p></description></item><item><title>CI Queue Time Report — April 30, 2026</title><link>https://mmworkbrain.pages.dev/docs/reports/ci-queue-time-2026-04-30/</link><pubDate>Thu, 30 Apr 2026 00:00:00 +0000</pubDate><guid>https://mmworkbrain.pages.dev/docs/reports/ci-queue-time-2026-04-30/</guid><description>&lt;p>Daily report on GitHub Actions job queue delays and cache utilization for &lt;code>mattermost/mattermost&lt;/code>.&lt;/p>
&lt;h2 id="how-this-report-was-generated">How This Report Was Generated&lt;/h2>
&lt;p>Data collected via GitHub Actions REST API, querying jobs from three Server CI workflows:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#57606a"># Queue times: for each of the last 5 completed runs per workflow,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#57606a"># compute started_at - created_at per job&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#6639ba">export&lt;/span> &lt;span style="color:#953800">GH_TOKEN&lt;/span>&lt;span style="color:#0550ae">=&lt;/span>&lt;span style="color:#cf222e">$(&lt;/span>cat .tokens/github-mattermost&lt;span style="color:#cf222e">)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#cf222e">for&lt;/span> workflow_id in &lt;span style="color:#0550ae">56372552&lt;/span> &lt;span style="color:#0550ae">56742408&lt;/span> 56627862&lt;span style="color:#1f2328">;&lt;/span> &lt;span style="color:#cf222e">do&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#57606a"># 56372552 = Server CI (primary, up to 14 jobs on 8-core with all shards + FIPS)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#57606a"># 56742408 = Server CI Master (reporting/coverage)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#57606a"># 56627862 = Server CI PR (pull request CI)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#cf222e">for&lt;/span> run_id in &lt;span style="color:#cf222e">$(&lt;/span>curl -s -H &lt;span style="color:#0a3069">&amp;#34;Authorization: Bearer &lt;/span>&lt;span style="color:#953800">$GH_TOKEN&lt;/span>&lt;span style="color:#0a3069">&amp;#34;&lt;/span> &lt;span style="color:#0a3069">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069">&lt;/span> -H &lt;span style="color:#0a3069">&amp;#34;Accept: application/vnd.github+json&amp;#34;&lt;/span> &lt;span style="color:#0a3069">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069">&lt;/span> &lt;span style="color:#0a3069">&amp;#34;https://api.github.com/repos/mattermost/mattermost/actions/workflows/&lt;/span>&lt;span style="color:#0a3069">${&lt;/span>&lt;span style="color:#953800">workflow_id&lt;/span>&lt;span style="color:#0a3069">}&lt;/span>&lt;span style="color:#0a3069">/runs?per_page=5&amp;amp;status=completed&amp;#34;&lt;/span> &lt;span style="color:#0a3069">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069">&lt;/span> &lt;span style="color:#1f2328">|&lt;/span> jq -r &lt;span style="color:#0a3069">&amp;#39;.workflow_runs[].id&amp;#39;&lt;/span>&lt;span style="color:#cf222e">)&lt;/span>&lt;span style="color:#1f2328">;&lt;/span> &lt;span style="color:#cf222e">do&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> sleep &lt;span style="color:#0550ae">1&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> curl -s -H &lt;span style="color:#0a3069">&amp;#34;Authorization: Bearer &lt;/span>&lt;span style="color:#953800">$GH_TOKEN&lt;/span>&lt;span style="color:#0a3069">&amp;#34;&lt;/span> &lt;span style="color:#0a3069">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069">&lt;/span> -H &lt;span style="color:#0a3069">&amp;#34;Accept: application/vnd.github+json&amp;#34;&lt;/span> &lt;span style="color:#0a3069">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069">&lt;/span> &lt;span style="color:#0a3069">&amp;#34;https://api.github.com/repos/mattermost/mattermost/actions/runs/&lt;/span>&lt;span style="color:#0a3069">${&lt;/span>&lt;span style="color:#953800">run_id&lt;/span>&lt;span style="color:#0a3069">}&lt;/span>&lt;span style="color:#0a3069">/jobs?per_page=100&amp;#34;&lt;/span> &lt;span style="color:#0a3069">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069">&lt;/span> &lt;span style="color:#1f2328">|&lt;/span> jq &lt;span style="color:#0a3069">&amp;#39;.jobs[] | {name, started_at, created_at, labels,
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069"> queue_seconds: (((.started_at | fromdateiso8601) - (.created_at | fromdateiso8601)))}&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#cf222e">done&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#cf222e">done&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#57606a"># Cache usage&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>curl -s -H &lt;span style="color:#0a3069">&amp;#34;Authorization: Bearer &lt;/span>&lt;span style="color:#953800">$GH_TOKEN&lt;/span>&lt;span style="color:#0a3069">&amp;#34;&lt;/span> &lt;span style="color:#0a3069">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069">&lt;/span> &lt;span style="color:#0a3069">&amp;#34;https://api.github.com/repos/mattermost/mattermost/actions/cache/usage&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>curl -s -H &lt;span style="color:#0a3069">&amp;#34;Authorization: Bearer &lt;/span>&lt;span style="color:#953800">$GH_TOKEN&lt;/span>&lt;span style="color:#0a3069">&amp;#34;&lt;/span> &lt;span style="color:#0a3069">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069">&lt;/span> &lt;span style="color:#0a3069">&amp;#34;https://api.github.com/repos/mattermost/mattermost-mobile/actions/cache/usage&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="cache-utilization">Cache Utilization&lt;/h2>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Repository&lt;/th>
 &lt;th>Caches&lt;/th>
 &lt;th>Size&lt;/th>
 &lt;th>Limit&lt;/th>
 &lt;th>Utilization&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>&lt;code>mattermost/mattermost&lt;/code>&lt;/td>
 &lt;td>40&lt;/td>
 &lt;td>&lt;strong>9.7 GB&lt;/strong>&lt;/td>
 &lt;td>10 GB&lt;/td>
 &lt;td>🟡 &lt;strong>97%&lt;/strong>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>mattermost/mattermost-mobile&lt;/code>&lt;/td>
 &lt;td>38&lt;/td>
 &lt;td>&lt;strong>10.0 GB&lt;/strong>&lt;/td>
 &lt;td>10 GB&lt;/td>
 &lt;td>🔴 &lt;strong>100%&lt;/strong>&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>Monorepo: 40 caches / 9.7 GB (10,422 MB), down from 44 caches / 10.3 GB yesterday — finally dropped below the 10 GB limit. Mobile reversed course: 38 caches at &lt;strong>10.0 GB&lt;/strong> (10,777 MB), up from 34 caches / 9.0 GB yesterday — now at the limit.&lt;/p></description></item><item><title>CI Queue Time Report — May 1, 2026</title><link>https://mmworkbrain.pages.dev/docs/reports/ci-queue-time-2026-05-01/</link><pubDate>Fri, 01 May 2026 00:00:00 +0000</pubDate><guid>https://mmworkbrain.pages.dev/docs/reports/ci-queue-time-2026-05-01/</guid><description>&lt;p>Daily report on GitHub Actions job queue delays and cache utilization for &lt;code>mattermost/mattermost&lt;/code>.&lt;/p>
&lt;h2 id="how-this-report-was-generated">How This Report Was Generated&lt;/h2>
&lt;p>Data collected via GitHub Actions REST API, querying jobs from three Server CI workflows:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#57606a"># Queue times: for each of the last 5 completed runs per workflow,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#57606a"># compute started_at - created_at per job&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#6639ba">export&lt;/span> &lt;span style="color:#953800">GH_TOKEN&lt;/span>&lt;span style="color:#0550ae">=&lt;/span>&lt;span style="color:#cf222e">$(&lt;/span>cat .tokens/github-mattermost&lt;span style="color:#cf222e">)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#cf222e">for&lt;/span> workflow_id in &lt;span style="color:#0550ae">56372552&lt;/span> &lt;span style="color:#0550ae">56742408&lt;/span> 56627862&lt;span style="color:#1f2328">;&lt;/span> &lt;span style="color:#cf222e">do&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#57606a"># 56372552 = Server CI (primary, up to 14 jobs on 8-core with all shards + FIPS)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#57606a"># 56742408 = Server CI Master (reporting/coverage)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#57606a"># 56627862 = Server CI PR (pull request CI)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#cf222e">for&lt;/span> run_id in &lt;span style="color:#cf222e">$(&lt;/span>curl -s -H &lt;span style="color:#0a3069">&amp;#34;Authorization: Bearer &lt;/span>&lt;span style="color:#953800">$GH_TOKEN&lt;/span>&lt;span style="color:#0a3069">&amp;#34;&lt;/span> &lt;span style="color:#0a3069">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069">&lt;/span> -H &lt;span style="color:#0a3069">&amp;#34;Accept: application/vnd.github+json&amp;#34;&lt;/span> &lt;span style="color:#0a3069">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069">&lt;/span> &lt;span style="color:#0a3069">&amp;#34;https://api.github.com/repos/mattermost/mattermost/actions/workflows/&lt;/span>&lt;span style="color:#0a3069">${&lt;/span>&lt;span style="color:#953800">workflow_id&lt;/span>&lt;span style="color:#0a3069">}&lt;/span>&lt;span style="color:#0a3069">/runs?per_page=5&amp;amp;status=completed&amp;#34;&lt;/span> &lt;span style="color:#0a3069">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069">&lt;/span> &lt;span style="color:#1f2328">|&lt;/span> jq -r &lt;span style="color:#0a3069">&amp;#39;.workflow_runs[].id&amp;#39;&lt;/span>&lt;span style="color:#cf222e">)&lt;/span>&lt;span style="color:#1f2328">;&lt;/span> &lt;span style="color:#cf222e">do&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> sleep &lt;span style="color:#0550ae">1&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> curl -s -H &lt;span style="color:#0a3069">&amp;#34;Authorization: Bearer &lt;/span>&lt;span style="color:#953800">$GH_TOKEN&lt;/span>&lt;span style="color:#0a3069">&amp;#34;&lt;/span> &lt;span style="color:#0a3069">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069">&lt;/span> -H &lt;span style="color:#0a3069">&amp;#34;Accept: application/vnd.github+json&amp;#34;&lt;/span> &lt;span style="color:#0a3069">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069">&lt;/span> &lt;span style="color:#0a3069">&amp;#34;https://api.github.com/repos/mattermost/mattermost/actions/runs/&lt;/span>&lt;span style="color:#0a3069">${&lt;/span>&lt;span style="color:#953800">run_id&lt;/span>&lt;span style="color:#0a3069">}&lt;/span>&lt;span style="color:#0a3069">/jobs?per_page=100&amp;#34;&lt;/span> &lt;span style="color:#0a3069">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069">&lt;/span> &lt;span style="color:#1f2328">|&lt;/span> jq &lt;span style="color:#0a3069">&amp;#39;.jobs[] | {name, started_at, created_at, labels,
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069"> queue_seconds: (((.started_at | fromdateiso8601) - (.created_at | fromdateiso8601)))}&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#cf222e">done&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#cf222e">done&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#57606a"># Cache usage&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>curl -s -H &lt;span style="color:#0a3069">&amp;#34;Authorization: Bearer &lt;/span>&lt;span style="color:#953800">$GH_TOKEN&lt;/span>&lt;span style="color:#0a3069">&amp;#34;&lt;/span> &lt;span style="color:#0a3069">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069">&lt;/span> &lt;span style="color:#0a3069">&amp;#34;https://api.github.com/repos/mattermost/mattermost/actions/cache/usage&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>curl -s -H &lt;span style="color:#0a3069">&amp;#34;Authorization: Bearer &lt;/span>&lt;span style="color:#953800">$GH_TOKEN&lt;/span>&lt;span style="color:#0a3069">&amp;#34;&lt;/span> &lt;span style="color:#0a3069">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069">&lt;/span> &lt;span style="color:#0a3069">&amp;#34;https://api.github.com/repos/mattermost/mattermost-mobile/actions/cache/usage&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="cache-utilization">Cache Utilization&lt;/h2>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Repository&lt;/th>
 &lt;th>Caches&lt;/th>
 &lt;th>Size&lt;/th>
 &lt;th>Limit&lt;/th>
 &lt;th>Utilization&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>&lt;code>mattermost/mattermost&lt;/code>&lt;/td>
 &lt;td>54&lt;/td>
 &lt;td>&lt;strong>9.8 GB&lt;/strong>&lt;/td>
 &lt;td>10 GB&lt;/td>
 &lt;td>🟡 &lt;strong>98%&lt;/strong>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>mattermost/mattermost-mobile&lt;/code>&lt;/td>
 &lt;td>39&lt;/td>
 &lt;td>&lt;strong>9.8 GB&lt;/strong>&lt;/td>
 &lt;td>10 GB&lt;/td>
 &lt;td>🟡 &lt;strong>98%&lt;/strong>&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>Monorepo jumped from 40→54 caches and from 97%→98% utilization — back near the limit after yesterday&amp;rsquo;s dip below 10 GB. Mobile eased slightly: 39 caches at 9.8 GB (down from 38 caches / 10.0 GB yesterday). Both repos now converge at ~98%.&lt;/p></description></item><item><title>CI Queue Time Report — May 4, 2026</title><link>https://mmworkbrain.pages.dev/docs/reports/ci-queue-time-2026-05-04/</link><pubDate>Mon, 04 May 2026 00:00:00 +0000</pubDate><guid>https://mmworkbrain.pages.dev/docs/reports/ci-queue-time-2026-05-04/</guid><description>&lt;p>Daily report on GitHub Actions job queue delays and cache utilization for &lt;code>mattermost/mattermost&lt;/code>.&lt;/p>
&lt;h2 id="how-this-report-was-generated">How This Report Was Generated&lt;/h2>
&lt;p>Data collected via GitHub Actions REST API, querying jobs from three Server CI workflows:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#57606a"># Queue times: for each of the last 5 completed runs per workflow,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#57606a"># compute started_at - created_at per job&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#6639ba">export&lt;/span> &lt;span style="color:#953800">GH_TOKEN&lt;/span>&lt;span style="color:#0550ae">=&lt;/span>&lt;span style="color:#cf222e">$(&lt;/span>cat .tokens/github-mattermost&lt;span style="color:#cf222e">)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#cf222e">for&lt;/span> workflow_id in &lt;span style="color:#0550ae">56372552&lt;/span> &lt;span style="color:#0550ae">56742408&lt;/span> 56627862&lt;span style="color:#1f2328">;&lt;/span> &lt;span style="color:#cf222e">do&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#57606a"># 56372552 = Server CI (primary, up to 14 jobs on 8-core with all shards + FIPS)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#57606a"># 56742408 = Server CI Master (reporting/coverage)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#57606a"># 56627862 = Server CI PR (pull request CI)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#cf222e">for&lt;/span> run_id in &lt;span style="color:#cf222e">$(&lt;/span>curl -s -H &lt;span style="color:#0a3069">&amp;#34;Authorization: Bearer &lt;/span>&lt;span style="color:#953800">$GH_TOKEN&lt;/span>&lt;span style="color:#0a3069">&amp;#34;&lt;/span> &lt;span style="color:#0a3069">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069">&lt;/span> -H &lt;span style="color:#0a3069">&amp;#34;Accept: application/vnd.github+json&amp;#34;&lt;/span> &lt;span style="color:#0a3069">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069">&lt;/span> &lt;span style="color:#0a3069">&amp;#34;https://api.github.com/repos/mattermost/mattermost/actions/workflows/&lt;/span>&lt;span style="color:#0a3069">${&lt;/span>&lt;span style="color:#953800">workflow_id&lt;/span>&lt;span style="color:#0a3069">}&lt;/span>&lt;span style="color:#0a3069">/runs?per_page=5&amp;amp;status=completed&amp;#34;&lt;/span> &lt;span style="color:#0a3069">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069">&lt;/span> &lt;span style="color:#1f2328">|&lt;/span> jq -r &lt;span style="color:#0a3069">&amp;#39;.workflow_runs[].id&amp;#39;&lt;/span>&lt;span style="color:#cf222e">)&lt;/span>&lt;span style="color:#1f2328">;&lt;/span> &lt;span style="color:#cf222e">do&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> sleep &lt;span style="color:#0550ae">1&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> curl -s -H &lt;span style="color:#0a3069">&amp;#34;Authorization: Bearer &lt;/span>&lt;span style="color:#953800">$GH_TOKEN&lt;/span>&lt;span style="color:#0a3069">&amp;#34;&lt;/span> &lt;span style="color:#0a3069">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069">&lt;/span> -H &lt;span style="color:#0a3069">&amp;#34;Accept: application/vnd.github+json&amp;#34;&lt;/span> &lt;span style="color:#0a3069">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069">&lt;/span> &lt;span style="color:#0a3069">&amp;#34;https://api.github.com/repos/mattermost/mattermost/actions/runs/&lt;/span>&lt;span style="color:#0a3069">${&lt;/span>&lt;span style="color:#953800">run_id&lt;/span>&lt;span style="color:#0a3069">}&lt;/span>&lt;span style="color:#0a3069">/jobs?per_page=100&amp;#34;&lt;/span> &lt;span style="color:#0a3069">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069">&lt;/span> &lt;span style="color:#1f2328">|&lt;/span> jq &lt;span style="color:#0a3069">&amp;#39;.jobs[] | {name, started_at, created_at, labels,
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069"> queue_seconds: (((.started_at | fromdateiso8601) - (.created_at | fromdateiso8601)))}&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#cf222e">done&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#cf222e">done&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#57606a"># Cache usage&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>curl -s -H &lt;span style="color:#0a3069">&amp;#34;Authorization: Bearer &lt;/span>&lt;span style="color:#953800">$GH_TOKEN&lt;/span>&lt;span style="color:#0a3069">&amp;#34;&lt;/span> &lt;span style="color:#0a3069">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069">&lt;/span> &lt;span style="color:#0a3069">&amp;#34;https://api.github.com/repos/mattermost/mattermost/actions/cache/usage&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>curl -s -H &lt;span style="color:#0a3069">&amp;#34;Authorization: Bearer &lt;/span>&lt;span style="color:#953800">$GH_TOKEN&lt;/span>&lt;span style="color:#0a3069">&amp;#34;&lt;/span> &lt;span style="color:#0a3069">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069">&lt;/span> &lt;span style="color:#0a3069">&amp;#34;https://api.github.com/repos/mattermost/mattermost-mobile/actions/cache/usage&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="cache-utilization">Cache Utilization&lt;/h2>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Repository&lt;/th>
 &lt;th>Caches&lt;/th>
 &lt;th>Size&lt;/th>
 &lt;th>Limit&lt;/th>
 &lt;th>Utilization&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>&lt;code>mattermost/mattermost&lt;/code>&lt;/td>
 &lt;td>46&lt;/td>
 &lt;td>&lt;strong>9.9 GB&lt;/strong>&lt;/td>
 &lt;td>10 GB&lt;/td>
 &lt;td>🔴 &lt;strong>99%&lt;/strong>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>mattermost/mattermost-mobile&lt;/code>&lt;/td>
 &lt;td>34&lt;/td>
 &lt;td>&lt;strong>9.7 GB&lt;/strong>&lt;/td>
 &lt;td>10 GB&lt;/td>
 &lt;td>🟡 &lt;strong>97%&lt;/strong>&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>Monorepo dropped from 54→46 caches but size crept up to 9.9 GB (99%), the highest observed level. Mobile continued its decline: 39→34 caches, 9.8→9.7 GB. Both repos remain under pressure but mobile is trending slightly better.&lt;/p></description></item><item><title>CI Queue Time Report — May 5, 2026</title><link>https://mmworkbrain.pages.dev/docs/reports/ci-queue-time-2026-05-05/</link><pubDate>Tue, 05 May 2026 00:00:00 +0000</pubDate><guid>https://mmworkbrain.pages.dev/docs/reports/ci-queue-time-2026-05-05/</guid><description>&lt;p>Daily report on GitHub Actions job queue delays and cache utilization for &lt;code>mattermost/mattermost&lt;/code>.&lt;/p>
&lt;h2 id="how-this-report-was-generated">How This Report Was Generated&lt;/h2>
&lt;p>Data collected via GitHub Actions REST API, querying jobs from three Server CI workflows:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#57606a"># Queue times: for each of the last 5 completed runs per workflow,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#57606a"># compute started_at - created_at per job&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#6639ba">export&lt;/span> &lt;span style="color:#953800">GH_TOKEN&lt;/span>&lt;span style="color:#0550ae">=&lt;/span>&lt;span style="color:#cf222e">$(&lt;/span>cat .tokens/github-mattermost&lt;span style="color:#cf222e">)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#cf222e">for&lt;/span> workflow_id in &lt;span style="color:#0550ae">56372552&lt;/span> &lt;span style="color:#0550ae">56742408&lt;/span> 56627862&lt;span style="color:#1f2328">;&lt;/span> &lt;span style="color:#cf222e">do&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#57606a"># 56372552 = Server CI (primary, up to 14 jobs on 8-core with all shards + FIPS)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#57606a"># 56742408 = Server CI Master (reporting/coverage)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#57606a"># 56627862 = Server CI PR (pull request CI)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#cf222e">for&lt;/span> run_id in &lt;span style="color:#cf222e">$(&lt;/span>curl -s -H &lt;span style="color:#0a3069">&amp;#34;Authorization: Bearer &lt;/span>&lt;span style="color:#953800">$GH_TOKEN&lt;/span>&lt;span style="color:#0a3069">&amp;#34;&lt;/span> &lt;span style="color:#0a3069">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069">&lt;/span> -H &lt;span style="color:#0a3069">&amp;#34;Accept: application/vnd.github+json&amp;#34;&lt;/span> &lt;span style="color:#0a3069">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069">&lt;/span> &lt;span style="color:#0a3069">&amp;#34;https://api.github.com/repos/mattermost/mattermost/actions/workflows/&lt;/span>&lt;span style="color:#0a3069">${&lt;/span>&lt;span style="color:#953800">workflow_id&lt;/span>&lt;span style="color:#0a3069">}&lt;/span>&lt;span style="color:#0a3069">/runs?per_page=5&amp;amp;status=completed&amp;#34;&lt;/span> &lt;span style="color:#0a3069">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069">&lt;/span> &lt;span style="color:#1f2328">|&lt;/span> jq -r &lt;span style="color:#0a3069">&amp;#39;.workflow_runs[].id&amp;#39;&lt;/span>&lt;span style="color:#cf222e">)&lt;/span>&lt;span style="color:#1f2328">;&lt;/span> &lt;span style="color:#cf222e">do&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> sleep &lt;span style="color:#0550ae">1&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> curl -s -H &lt;span style="color:#0a3069">&amp;#34;Authorization: Bearer &lt;/span>&lt;span style="color:#953800">$GH_TOKEN&lt;/span>&lt;span style="color:#0a3069">&amp;#34;&lt;/span> &lt;span style="color:#0a3069">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069">&lt;/span> -H &lt;span style="color:#0a3069">&amp;#34;Accept: application/vnd.github+json&amp;#34;&lt;/span> &lt;span style="color:#0a3069">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069">&lt;/span> &lt;span style="color:#0a3069">&amp;#34;https://api.github.com/repos/mattermost/mattermost/actions/runs/&lt;/span>&lt;span style="color:#0a3069">${&lt;/span>&lt;span style="color:#953800">run_id&lt;/span>&lt;span style="color:#0a3069">}&lt;/span>&lt;span style="color:#0a3069">/jobs?per_page=100&amp;#34;&lt;/span> &lt;span style="color:#0a3069">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069">&lt;/span> &lt;span style="color:#1f2328">|&lt;/span> jq &lt;span style="color:#0a3069">&amp;#39;.jobs[] | {name, started_at, created_at, labels,
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069"> queue_seconds: (((.started_at | fromdateiso8601) - (.created_at | fromdateiso8601)))}&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#cf222e">done&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#cf222e">done&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#57606a"># Cache usage&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>curl -s -H &lt;span style="color:#0a3069">&amp;#34;Authorization: Bearer &lt;/span>&lt;span style="color:#953800">$GH_TOKEN&lt;/span>&lt;span style="color:#0a3069">&amp;#34;&lt;/span> &lt;span style="color:#0a3069">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069">&lt;/span> &lt;span style="color:#0a3069">&amp;#34;https://api.github.com/repos/mattermost/mattermost/actions/cache/usage&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>curl -s -H &lt;span style="color:#0a3069">&amp;#34;Authorization: Bearer &lt;/span>&lt;span style="color:#953800">$GH_TOKEN&lt;/span>&lt;span style="color:#0a3069">&amp;#34;&lt;/span> &lt;span style="color:#0a3069">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069">&lt;/span> &lt;span style="color:#0a3069">&amp;#34;https://api.github.com/repos/mattermost/mattermost-mobile/actions/cache/usage&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="cache-utilization">Cache Utilization&lt;/h2>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Repository&lt;/th>
 &lt;th>Caches&lt;/th>
 &lt;th>Size&lt;/th>
 &lt;th>Limit&lt;/th>
 &lt;th>Utilization&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>&lt;code>mattermost/mattermost&lt;/code>&lt;/td>
 &lt;td>36&lt;/td>
 &lt;td>&lt;strong>9.8 GB&lt;/strong>&lt;/td>
 &lt;td>10 GB&lt;/td>
 &lt;td>🔴 &lt;strong>98%&lt;/strong>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>mattermost/mattermost-mobile&lt;/code>&lt;/td>
 &lt;td>28&lt;/td>
 &lt;td>&lt;strong>9.9 GB&lt;/strong>&lt;/td>
 &lt;td>10 GB&lt;/td>
 &lt;td>🔴 &lt;strong>99%&lt;/strong>&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>Monorepo dropped from 46→36 caches and 9.9→9.8 GB — modest improvement, still critically high. Mobile reversed its prior trend: 34→28 caches but size &lt;em>increased&lt;/em> to 9.9 GB (99%), surpassing the monorepo for the first time. Both repos remain under extreme pressure.&lt;/p></description></item><item><title>CI Queue Time Report — May 6, 2026</title><link>https://mmworkbrain.pages.dev/docs/reports/ci-queue-time-2026-05-06/</link><pubDate>Wed, 06 May 2026 00:00:00 +0000</pubDate><guid>https://mmworkbrain.pages.dev/docs/reports/ci-queue-time-2026-05-06/</guid><description>&lt;p>Daily report on GitHub Actions job queue delays and cache utilization for &lt;code>mattermost/mattermost&lt;/code>.&lt;/p>
&lt;h2 id="how-this-report-was-generated">How This Report Was Generated&lt;/h2>
&lt;p>Data collected via GitHub Actions REST API, querying jobs from three Server CI workflows:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#57606a"># Queue times: for each of the last 5 completed runs per workflow,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#57606a"># compute started_at - created_at per job&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#6639ba">export&lt;/span> &lt;span style="color:#953800">GH_TOKEN&lt;/span>&lt;span style="color:#0550ae">=&lt;/span>&lt;span style="color:#cf222e">$(&lt;/span>cat .tokens/github-mattermost&lt;span style="color:#cf222e">)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#cf222e">for&lt;/span> workflow_id in &lt;span style="color:#0550ae">56372552&lt;/span> &lt;span style="color:#0550ae">56742408&lt;/span> 56627862&lt;span style="color:#1f2328">;&lt;/span> &lt;span style="color:#cf222e">do&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#57606a"># 56372552 = Server CI (primary, up to 14 jobs on 8-core with all shards + FIPS)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#57606a"># 56742408 = Server CI Master (reporting/coverage)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#57606a"># 56627862 = Server CI PR (pull request CI)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#cf222e">for&lt;/span> run_id in &lt;span style="color:#cf222e">$(&lt;/span>curl -s -H &lt;span style="color:#0a3069">&amp;#34;Authorization: Bearer &lt;/span>&lt;span style="color:#953800">$GH_TOKEN&lt;/span>&lt;span style="color:#0a3069">&amp;#34;&lt;/span> &lt;span style="color:#0a3069">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069">&lt;/span> -H &lt;span style="color:#0a3069">&amp;#34;Accept: application/vnd.github+json&amp;#34;&lt;/span> &lt;span style="color:#0a3069">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069">&lt;/span> &lt;span style="color:#0a3069">&amp;#34;https://api.github.com/repos/mattermost/mattermost/actions/workflows/&lt;/span>&lt;span style="color:#0a3069">${&lt;/span>&lt;span style="color:#953800">workflow_id&lt;/span>&lt;span style="color:#0a3069">}&lt;/span>&lt;span style="color:#0a3069">/runs?per_page=5&amp;amp;status=completed&amp;#34;&lt;/span> &lt;span style="color:#0a3069">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069">&lt;/span> &lt;span style="color:#1f2328">|&lt;/span> jq -r &lt;span style="color:#0a3069">&amp;#39;.workflow_runs[].id&amp;#39;&lt;/span>&lt;span style="color:#cf222e">)&lt;/span>&lt;span style="color:#1f2328">;&lt;/span> &lt;span style="color:#cf222e">do&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> sleep &lt;span style="color:#0550ae">1&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> curl -s -H &lt;span style="color:#0a3069">&amp;#34;Authorization: Bearer &lt;/span>&lt;span style="color:#953800">$GH_TOKEN&lt;/span>&lt;span style="color:#0a3069">&amp;#34;&lt;/span> &lt;span style="color:#0a3069">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069">&lt;/span> -H &lt;span style="color:#0a3069">&amp;#34;Accept: application/vnd.github+json&amp;#34;&lt;/span> &lt;span style="color:#0a3069">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069">&lt;/span> &lt;span style="color:#0a3069">&amp;#34;https://api.github.com/repos/mattermost/mattermost/actions/runs/&lt;/span>&lt;span style="color:#0a3069">${&lt;/span>&lt;span style="color:#953800">run_id&lt;/span>&lt;span style="color:#0a3069">}&lt;/span>&lt;span style="color:#0a3069">/jobs?per_page=100&amp;#34;&lt;/span> &lt;span style="color:#0a3069">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069">&lt;/span> &lt;span style="color:#1f2328">|&lt;/span> jq &lt;span style="color:#0a3069">&amp;#39;.jobs[] | {name, started_at, created_at, labels,
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069"> queue_seconds: (((.started_at | fromdateiso8601) - (.created_at | fromdateiso8601)))}&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#cf222e">done&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#cf222e">done&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#57606a"># Cache usage&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>curl -s -H &lt;span style="color:#0a3069">&amp;#34;Authorization: Bearer &lt;/span>&lt;span style="color:#953800">$GH_TOKEN&lt;/span>&lt;span style="color:#0a3069">&amp;#34;&lt;/span> &lt;span style="color:#0a3069">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069">&lt;/span> &lt;span style="color:#0a3069">&amp;#34;https://api.github.com/repos/mattermost/mattermost/actions/cache/usage&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>curl -s -H &lt;span style="color:#0a3069">&amp;#34;Authorization: Bearer &lt;/span>&lt;span style="color:#953800">$GH_TOKEN&lt;/span>&lt;span style="color:#0a3069">&amp;#34;&lt;/span> &lt;span style="color:#0a3069">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069">&lt;/span> &lt;span style="color:#0a3069">&amp;#34;https://api.github.com/repos/mattermost/mattermost-mobile/actions/cache/usage&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="cache-utilization">Cache Utilization&lt;/h2>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Repository&lt;/th>
 &lt;th>Caches&lt;/th>
 &lt;th>Size&lt;/th>
 &lt;th>Limit&lt;/th>
 &lt;th>Utilization&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>&lt;code>mattermost/mattermost&lt;/code>&lt;/td>
 &lt;td>41&lt;/td>
 &lt;td>&lt;strong>9.8 GB&lt;/strong>&lt;/td>
 &lt;td>10 GB&lt;/td>
 &lt;td>🔴 &lt;strong>98%&lt;/strong>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>mattermost/mattermost-mobile&lt;/code>&lt;/td>
 &lt;td>32&lt;/td>
 &lt;td>&lt;strong>9.8 GB&lt;/strong>&lt;/td>
 &lt;td>10 GB&lt;/td>
 &lt;td>🔴 &lt;strong>98%&lt;/strong>&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>Both repos remain at critical 98% utilization. Monorepo caches ticked up from 36→41, while mobile dropped from 32 caches at 9.8 GB — down slightly from yesterday&amp;rsquo;s 99%. Still deep in the danger zone.&lt;/p></description></item><item><title>CI Queue Time Report — May 7, 2026</title><link>https://mmworkbrain.pages.dev/docs/reports/ci-queue-time-2026-05-07/</link><pubDate>Thu, 07 May 2026 00:00:00 +0000</pubDate><guid>https://mmworkbrain.pages.dev/docs/reports/ci-queue-time-2026-05-07/</guid><description>&lt;p>Daily report on GitHub Actions job queue delays and cache utilization for &lt;code>mattermost/mattermost&lt;/code>.&lt;/p>
&lt;h2 id="how-this-report-was-generated">How This Report Was Generated&lt;/h2>
&lt;p>Data collected via GitHub Actions REST API, querying jobs from three Server CI workflows:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#57606a"># Queue times: for each of the last 5 completed runs per workflow,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#57606a"># compute started_at - created_at per job&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#6639ba">export&lt;/span> &lt;span style="color:#953800">GH_TOKEN&lt;/span>&lt;span style="color:#0550ae">=&lt;/span>&lt;span style="color:#cf222e">$(&lt;/span>cat .tokens/github-mattermost&lt;span style="color:#cf222e">)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#cf222e">for&lt;/span> workflow_id in &lt;span style="color:#0550ae">56372552&lt;/span> &lt;span style="color:#0550ae">56742408&lt;/span> 56627862&lt;span style="color:#1f2328">;&lt;/span> &lt;span style="color:#cf222e">do&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#57606a"># 56372552 = Server CI (primary, up to 14 jobs on 8-core with all shards + FIPS)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#57606a"># 56742408 = Server CI Master (reporting/coverage)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#57606a"># 56627862 = Server CI PR (pull request CI)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#cf222e">for&lt;/span> run_id in &lt;span style="color:#cf222e">$(&lt;/span>curl -s -H &lt;span style="color:#0a3069">&amp;#34;Authorization: Bearer &lt;/span>&lt;span style="color:#953800">$GH_TOKEN&lt;/span>&lt;span style="color:#0a3069">&amp;#34;&lt;/span> &lt;span style="color:#0a3069">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069">&lt;/span> -H &lt;span style="color:#0a3069">&amp;#34;Accept: application/vnd.github+json&amp;#34;&lt;/span> &lt;span style="color:#0a3069">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069">&lt;/span> &lt;span style="color:#0a3069">&amp;#34;https://api.github.com/repos/mattermost/mattermost/actions/workflows/&lt;/span>&lt;span style="color:#0a3069">${&lt;/span>&lt;span style="color:#953800">workflow_id&lt;/span>&lt;span style="color:#0a3069">}&lt;/span>&lt;span style="color:#0a3069">/runs?per_page=5&amp;amp;status=completed&amp;#34;&lt;/span> &lt;span style="color:#0a3069">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069">&lt;/span> &lt;span style="color:#1f2328">|&lt;/span> jq -r &lt;span style="color:#0a3069">&amp;#39;.workflow_runs[].id&amp;#39;&lt;/span>&lt;span style="color:#cf222e">)&lt;/span>&lt;span style="color:#1f2328">;&lt;/span> &lt;span style="color:#cf222e">do&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> sleep &lt;span style="color:#0550ae">1&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> curl -s -H &lt;span style="color:#0a3069">&amp;#34;Authorization: Bearer &lt;/span>&lt;span style="color:#953800">$GH_TOKEN&lt;/span>&lt;span style="color:#0a3069">&amp;#34;&lt;/span> &lt;span style="color:#0a3069">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069">&lt;/span> -H &lt;span style="color:#0a3069">&amp;#34;Accept: application/vnd.github+json&amp;#34;&lt;/span> &lt;span style="color:#0a3069">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069">&lt;/span> &lt;span style="color:#0a3069">&amp;#34;https://api.github.com/repos/mattermost/mattermost/actions/runs/&lt;/span>&lt;span style="color:#0a3069">${&lt;/span>&lt;span style="color:#953800">run_id&lt;/span>&lt;span style="color:#0a3069">}&lt;/span>&lt;span style="color:#0a3069">/jobs?per_page=100&amp;#34;&lt;/span> &lt;span style="color:#0a3069">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069">&lt;/span> &lt;span style="color:#1f2328">|&lt;/span> jq &lt;span style="color:#0a3069">&amp;#39;.jobs[] | {name, started_at, created_at, labels,
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069"> queue_seconds: (((.started_at | fromdateiso8601) - (.created_at | fromdateiso8601)))}&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#cf222e">done&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#cf222e">done&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#57606a"># Cache usage&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>curl -s -H &lt;span style="color:#0a3069">&amp;#34;Authorization: Bearer &lt;/span>&lt;span style="color:#953800">$GH_TOKEN&lt;/span>&lt;span style="color:#0a3069">&amp;#34;&lt;/span> &lt;span style="color:#0a3069">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069">&lt;/span> &lt;span style="color:#0a3069">&amp;#34;https://api.github.com/repos/mattermost/mattermost/actions/cache/usage&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>curl -s -H &lt;span style="color:#0a3069">&amp;#34;Authorization: Bearer &lt;/span>&lt;span style="color:#953800">$GH_TOKEN&lt;/span>&lt;span style="color:#0a3069">&amp;#34;&lt;/span> &lt;span style="color:#0a3069">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069">&lt;/span> &lt;span style="color:#0a3069">&amp;#34;https://api.github.com/repos/mattermost/mattermost-mobile/actions/cache/usage&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="cache-utilization">Cache Utilization&lt;/h2>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Repository&lt;/th>
 &lt;th>Caches&lt;/th>
 &lt;th>Size&lt;/th>
 &lt;th>Limit&lt;/th>
 &lt;th>Utilization&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>&lt;code>mattermost/mattermost&lt;/code>&lt;/td>
 &lt;td>36&lt;/td>
 &lt;td>&lt;strong>10.0 GB&lt;/strong>&lt;/td>
 &lt;td>10 GB&lt;/td>
 &lt;td>🔴 &lt;strong>100%&lt;/strong>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>mattermost/mattermost-mobile&lt;/code>&lt;/td>
 &lt;td>32&lt;/td>
 &lt;td>&lt;strong>9.8 GB&lt;/strong>&lt;/td>
 &lt;td>10 GB&lt;/td>
 &lt;td>🔴 &lt;strong>98%&lt;/strong>&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>Monorepo hit the full 10 GB ceiling — up from 9.8 GB / 41 caches yesterday to 10.0 GB / 36 caches today. Fewer caches but larger average size (278 MB vs 239 MB). LRU eviction is actively culling smaller caches while bigger ones persist. Mobile is stable at 32 caches / 9.8 GB.&lt;/p></description></item><item><title>CI Queue Time Report — May 8, 2026</title><link>https://mmworkbrain.pages.dev/docs/reports/ci-queue-time-2026-05-08/</link><pubDate>Fri, 08 May 2026 00:00:00 +0000</pubDate><guid>https://mmworkbrain.pages.dev/docs/reports/ci-queue-time-2026-05-08/</guid><description>&lt;p>Daily report on GitHub Actions job queue delays and cache utilization for &lt;code>mattermost/mattermost&lt;/code>.&lt;/p>
&lt;h2 id="how-this-report-was-generated">How This Report Was Generated&lt;/h2>
&lt;p>Data collected via GitHub Actions REST API, querying jobs from three Server CI workflows:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#57606a"># Queue times: for each of the last 5 completed runs per workflow,&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#57606a"># compute started_at - created_at per job&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#6639ba">export&lt;/span> &lt;span style="color:#953800">GH_TOKEN&lt;/span>&lt;span style="color:#0550ae">=&lt;/span>&lt;span style="color:#cf222e">$(&lt;/span>cat .tokens/github-mattermost&lt;span style="color:#cf222e">)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#cf222e">for&lt;/span> workflow_id in &lt;span style="color:#0550ae">56372552&lt;/span> &lt;span style="color:#0550ae">56742408&lt;/span> 56627862&lt;span style="color:#1f2328">;&lt;/span> &lt;span style="color:#cf222e">do&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#57606a"># 56372552 = Server CI (primary, up to 14 jobs on 8-core with all shards + FIPS)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#57606a"># 56742408 = Server CI Master (reporting/coverage)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#57606a"># 56627862 = Server CI PR (pull request CI)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#cf222e">for&lt;/span> run_id in &lt;span style="color:#cf222e">$(&lt;/span>curl -s -H &lt;span style="color:#0a3069">&amp;#34;Authorization: Bearer &lt;/span>&lt;span style="color:#953800">$GH_TOKEN&lt;/span>&lt;span style="color:#0a3069">&amp;#34;&lt;/span> &lt;span style="color:#0a3069">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069">&lt;/span> -H &lt;span style="color:#0a3069">&amp;#34;Accept: application/vnd.github+json&amp;#34;&lt;/span> &lt;span style="color:#0a3069">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069">&lt;/span> &lt;span style="color:#0a3069">&amp;#34;https://api.github.com/repos/mattermost/mattermost/actions/workflows/&lt;/span>&lt;span style="color:#0a3069">${&lt;/span>&lt;span style="color:#953800">workflow_id&lt;/span>&lt;span style="color:#0a3069">}&lt;/span>&lt;span style="color:#0a3069">/runs?per_page=5&amp;amp;status=completed&amp;#34;&lt;/span> &lt;span style="color:#0a3069">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069">&lt;/span> &lt;span style="color:#1f2328">|&lt;/span> jq -r &lt;span style="color:#0a3069">&amp;#39;.workflow_runs[].id&amp;#39;&lt;/span>&lt;span style="color:#cf222e">)&lt;/span>&lt;span style="color:#1f2328">;&lt;/span> &lt;span style="color:#cf222e">do&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> sleep &lt;span style="color:#0550ae">1&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> curl -s -H &lt;span style="color:#0a3069">&amp;#34;Authorization: Bearer &lt;/span>&lt;span style="color:#953800">$GH_TOKEN&lt;/span>&lt;span style="color:#0a3069">&amp;#34;&lt;/span> &lt;span style="color:#0a3069">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069">&lt;/span> -H &lt;span style="color:#0a3069">&amp;#34;Accept: application/vnd.github+json&amp;#34;&lt;/span> &lt;span style="color:#0a3069">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069">&lt;/span> &lt;span style="color:#0a3069">&amp;#34;https://api.github.com/repos/mattermost/mattermost/actions/runs/&lt;/span>&lt;span style="color:#0a3069">${&lt;/span>&lt;span style="color:#953800">run_id&lt;/span>&lt;span style="color:#0a3069">}&lt;/span>&lt;span style="color:#0a3069">/jobs?per_page=100&amp;#34;&lt;/span> &lt;span style="color:#0a3069">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069">&lt;/span> &lt;span style="color:#1f2328">|&lt;/span> jq &lt;span style="color:#0a3069">&amp;#39;.jobs[] | {name, started_at, created_at, labels,
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069"> queue_seconds: (((.started_at | fromdateiso8601) - (.created_at | fromdateiso8601)))}&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#cf222e">done&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#cf222e">done&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#57606a"># Cache usage&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>curl -s -H &lt;span style="color:#0a3069">&amp;#34;Authorization: Bearer &lt;/span>&lt;span style="color:#953800">$GH_TOKEN&lt;/span>&lt;span style="color:#0a3069">&amp;#34;&lt;/span> &lt;span style="color:#0a3069">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069">&lt;/span> &lt;span style="color:#0a3069">&amp;#34;https://api.github.com/repos/mattermost/mattermost/actions/cache/usage&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>curl -s -H &lt;span style="color:#0a3069">&amp;#34;Authorization: Bearer &lt;/span>&lt;span style="color:#953800">$GH_TOKEN&lt;/span>&lt;span style="color:#0a3069">&amp;#34;&lt;/span> &lt;span style="color:#0a3069">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#0a3069">&lt;/span> &lt;span style="color:#0a3069">&amp;#34;https://api.github.com/repos/mattermost/mattermost-mobile/actions/cache/usage&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="cache-utilization">Cache Utilization&lt;/h2>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Repository&lt;/th>
 &lt;th>Caches&lt;/th>
 &lt;th>Size&lt;/th>
 &lt;th>Limit&lt;/th>
 &lt;th>Utilization&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>&lt;code>mattermost/mattermost&lt;/code>&lt;/td>
 &lt;td>36&lt;/td>
 &lt;td>&lt;strong>9.8 GB&lt;/strong>&lt;/td>
 &lt;td>10 GB&lt;/td>
 &lt;td>🔴 &lt;strong>98%&lt;/strong>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>mattermost/mattermost-mobile&lt;/code>&lt;/td>
 &lt;td>31&lt;/td>
 &lt;td>&lt;strong>9.9 GB&lt;/strong>&lt;/td>
 &lt;td>10 GB&lt;/td>
 &lt;td>🔴 &lt;strong>99%&lt;/strong>&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>Monorepo dropped slightly from yesterday&amp;rsquo;s 100% ceiling (10.0 GB / 36 caches) to 9.8 GB / 36 caches — LRU eviction freed ~200 MB while maintaining the same cache count. Mobile ticked up from 9.8 GB / 32 caches to 9.9 GB / 31 caches, approaching the ceiling. Both repos remain critically close to the 10 GB limit.&lt;/p></description></item><item><title>Senior Full-Stack Engineer — new in top 50</title><link>https://mmworkbrain.pages.dev/docs/shared/reports/2026-10-22/new-since-2026-10-16_0921/senior-full-stack-engineer-new-in-top-50/</link><pubDate>Thu, 22 Oct 2026 00:00:00 +0000</pubDate><guid>https://mmworkbrain.pages.dev/docs/shared/reports/2026-10-22/new-since-2026-10-16_0921/senior-full-stack-engineer-new-in-top-50/</guid><description>&lt;p>&lt;em>2026-10-22 · first seen since 2026-10-16 09:21 · rank is within the role&amp;rsquo;s overall top 50&lt;/em>&lt;/p>
&lt;h2 id="1-new--kevin-smyth--austin-texas-united-states--staff-software-engineer--turo--score-0852">#1 ★NEW · Kevin Smyth · Austin, Texas, United States · Staff Software Engineer · Turo · score: 0.852&lt;/h2>
&lt;p>&lt;a href="https://app8.greenhouse.io/people/78483007008/applications/85596728008/redesign">Greenhouse&lt;/a> · &lt;a href="https://www.linkedin.com/in/kevinmichaelsmyth">LinkedIn&lt;/a> | AI: 0.07 | GH fraud: weak (+4 weak: country mismatch, proxy, bot-like IP, new email) | ⚠ Potential duplicate&lt;/p>
&lt;p>This candidate shows genuine technical depth in exactly the stack Mattermost needs: Go/TypeScript full-stack work on a production ChatGPT App integration, PostgreSQL query optimization with measured before/after latency, and REST/WebSocket API design at meaningful scale (4,200 concurrent sessions, 300K-vehicle inventory). The AI-agent answer is concrete and credible — daily Claude Code/Cursor use for test scaffolding and refactor candidates, reviewed in weekly code review, with a quantified zero-regression claim and evidence of mentoring others on the workflow, which directly matches the role&amp;rsquo;s &amp;lsquo;core required skill&amp;rsquo; bar rather than just checking a box. Career trajectory (Barclays -&amp;gt; Tailor Brands -&amp;gt; WeWork -&amp;gt; Turo, Staff-level) shows steady seniority growth and some enterprise/compliance exposure (encryption at rest/in transit, SOC 2 mentioned on resume), which is a plus for the regulated-environment nice-to-have.
Two things worth flagging before an outreach: the stated &amp;lsquo;8+ years&amp;rsquo; self-reported experience doesn&amp;rsquo;t reconcile with a resume spanning 2011-present (13+ years) and a resume summary claiming &amp;lsquo;15+ years&amp;rsquo; — worth clarifying in a screen, as it&amp;rsquo;s a moderate inconsistency rather than a disqualifier. More importantly, there&amp;rsquo;s no evidence in the application of US government clearance eligibility, ITAR/EAR status, or defense/intelligence domain exposure, all of which are hard requirements here — this should be confirmed early since it could be a gating issue regardless of technical fit. Net: strong technical and AI-workflow match, recommend a screen focused on clearance/citizenship eligibility and experience-timeline clarification.&lt;/p></description></item><item><title>Senior Full-Stack Engineer — top 50</title><link>https://mmworkbrain.pages.dev/docs/shared/reports/2026-10-22/new-since-2026-10-16_0921/senior-full-stack-engineer-all-top-50/</link><pubDate>Thu, 22 Oct 2026 00:00:00 +0000</pubDate><guid>https://mmworkbrain.pages.dev/docs/shared/reports/2026-10-22/new-since-2026-10-16_0921/senior-full-stack-engineer-all-top-50/</guid><description>&lt;p>&lt;em>2026-10-22 · ranked by composite score · ★NEW = first seen since 2026-10-16 09:21&lt;/em>&lt;/p>
&lt;h2 id="1-new--kevin-smyth--austin-texas-united-states--staff-software-engineer--turo--score-0852">#1 ★NEW · Kevin Smyth · Austin, Texas, United States · Staff Software Engineer · Turo · score: 0.852&lt;/h2>
&lt;p>&lt;a href="https://app8.greenhouse.io/people/78483007008/applications/85596728008/redesign">Greenhouse&lt;/a> · &lt;a href="https://www.linkedin.com/in/kevinmichaelsmyth">LinkedIn&lt;/a> | AI: 0.07 | GH fraud: weak (+4 weak: country mismatch, proxy, bot-like IP, new email) | ⚠ Potential duplicate&lt;/p>
&lt;p>This candidate shows genuine technical depth in exactly the stack Mattermost needs: Go/TypeScript full-stack work on a production ChatGPT App integration, PostgreSQL query optimization with measured before/after latency, and REST/WebSocket API design at meaningful scale (4,200 concurrent sessions, 300K-vehicle inventory). The AI-agent answer is concrete and credible — daily Claude Code/Cursor use for test scaffolding and refactor candidates, reviewed in weekly code review, with a quantified zero-regression claim and evidence of mentoring others on the workflow, which directly matches the role&amp;rsquo;s &amp;lsquo;core required skill&amp;rsquo; bar rather than just checking a box. Career trajectory (Barclays -&amp;gt; Tailor Brands -&amp;gt; WeWork -&amp;gt; Turo, Staff-level) shows steady seniority growth and some enterprise/compliance exposure (encryption at rest/in transit, SOC 2 mentioned on resume), which is a plus for the regulated-environment nice-to-have.
Two things worth flagging before an outreach: the stated &amp;lsquo;8+ years&amp;rsquo; self-reported experience doesn&amp;rsquo;t reconcile with a resume spanning 2011-present (13+ years) and a resume summary claiming &amp;lsquo;15+ years&amp;rsquo; — worth clarifying in a screen, as it&amp;rsquo;s a moderate inconsistency rather than a disqualifier. More importantly, there&amp;rsquo;s no evidence in the application of US government clearance eligibility, ITAR/EAR status, or defense/intelligence domain exposure, all of which are hard requirements here — this should be confirmed early since it could be a gating issue regardless of technical fit. Net: strong technical and AI-workflow match, recommend a screen focused on clearance/citizenship eligibility and experience-timeline clarification.&lt;/p></description></item><item><title>Senior Mobile Engineer — new in top 50</title><link>https://mmworkbrain.pages.dev/docs/shared/reports/2026-10-22/new-since-2026-10-16_0921/senior-mobile-engineer-new-in-top-50/</link><pubDate>Thu, 22 Oct 2026 00:00:00 +0000</pubDate><guid>https://mmworkbrain.pages.dev/docs/shared/reports/2026-10-22/new-since-2026-10-16_0921/senior-mobile-engineer-new-in-top-50/</guid><description>&lt;p>&lt;em>2026-10-22 · first seen since 2026-10-16 09:21 · rank is within the role&amp;rsquo;s overall top 50&lt;/em>&lt;/p>
&lt;h2 id="8-new--james-jackson--miami-florida-united-states--senior-staff-software-engineer--franshares--score-0777">#8 ★NEW · James Jackson · Miami, Florida, United States · Senior Staff Software Engineer · FranShares · score: 0.777&lt;/h2>
&lt;p>&lt;a href="https://app8.greenhouse.io/people/78586479008/applications/85700567008/redesign">Greenhouse&lt;/a> | AI: 0.22 | GH fraud: strong — VOIP phone (+5 weak: country mismatch, proxy, bot-like IP, IP history, new email) | ⚠ Potential duplicate&lt;/p>
&lt;p>This candidate has strong, well-evidenced mobile reliability experience: offline-capable workflows with SQLite persistence, idempotent background sync, exponential backoff/retry logic, and native integration work (Keychain/Keystore, push notifications) in a React Native + TypeScript codebase at FranShares, plus a long prior tenure at iRobot suggesting real embedded/mobile systems depth. The profiling detail (Instruments, Android Perfetto, cold-start optimization) and testing discipline (XCTest, Espresso) match the role&amp;rsquo;s emphasis on production debugging and DDIL-style reliability work closely.&lt;/p></description></item><item><title>Senior Mobile Engineer — top 50</title><link>https://mmworkbrain.pages.dev/docs/shared/reports/2026-10-22/new-since-2026-10-16_0921/senior-mobile-engineer-all-top-50/</link><pubDate>Thu, 22 Oct 2026 00:00:00 +0000</pubDate><guid>https://mmworkbrain.pages.dev/docs/shared/reports/2026-10-22/new-since-2026-10-16_0921/senior-mobile-engineer-all-top-50/</guid><description>&lt;p>&lt;em>2026-10-22 · ranked by composite score · ★NEW = first seen since 2026-10-16 09:21&lt;/em>&lt;/p>
&lt;h2 id="1--joshua-lytle--issaquah-washington-united-states--principal-software-engineer--nomadgo-inc--score-0871">#1 · Joshua Lytle · Issaquah, Washington, United States · Principal Software Engineer · NomadGo, Inc. · score: 0.871&lt;/h2>
&lt;p>&lt;a href="https://app8.greenhouse.io/people/75224729008/applications/82276606008/redesign">Greenhouse&lt;/a> · &lt;a href="https://www.linkedin.com/in/joshlytle1">LinkedIn&lt;/a> | AI: 0.14 | GH fraud: strong — datacenter IP (+3 weak: proxy, bot-like IP, IP history)&lt;/p>
&lt;p>This is a strong technical match: the candidate has shipped iOS since 2008 and cross-platform (including React Native SDK work) since 2011, with recent hands-on experience building connectivity-loss handling (startup, sign-in, count submission) and MDM/managed-app-configuration support for store devices at NomadGo — essentially a dry run for the DDIL and enterprise-distribution requirements in this role. They also show real performance engineering chops (adaptive inference throttling and OCR interval gating to cut AR scanner battery drain) and testing/CI discipline (1,000 unit tests, 100 automated UI tests, built partly with agentic tooling), plus prior SDK work integrated by major retail engineering teams (Target, Lowe&amp;rsquo;s, Staples, Macy&amp;rsquo;s), evidencing experience shipping code others depend on.&lt;/p></description></item><item><title>Staff Full Stack Engineer — new in top 50</title><link>https://mmworkbrain.pages.dev/docs/shared/reports/2026-10-22/new-since-2026-10-16_0921/staff-full-stack-engineer-new-in-top-50/</link><pubDate>Thu, 22 Oct 2026 00:00:00 +0000</pubDate><guid>https://mmworkbrain.pages.dev/docs/shared/reports/2026-10-22/new-since-2026-10-16_0921/staff-full-stack-engineer-new-in-top-50/</guid><description>&lt;p>&lt;em>2026-10-22 · first seen since 2026-10-16 09:21 · rank is within the role&amp;rsquo;s overall top 50&lt;/em>&lt;/p>
&lt;h2 id="1-new--pierre-cabell--cuyahoga-falls-ohio-united-states--staff-full-stack-engineer--uveye--score-0889">#1 ★NEW · Pierre Cabell · Cuyahoga Falls, Ohio, United States · Staff Full-Stack Engineer · UVeye · score: 0.889&lt;/h2>
&lt;p>&lt;a href="https://app8.greenhouse.io/people/78520287008/applications/85634071008/redesign">Greenhouse&lt;/a> · &lt;a href="https://www.linkedin.com/in/pierre-cabell-a024b1203">LinkedIn&lt;/a> | AI: 0.12 | GH fraud: strong — datacenter IP, VOIP phone (+5 weak: TZ mismatch, proxy, bot-like IP, IP history, new email)&lt;/p>
&lt;p>This candidate is a strong match on paper: current Staff title at UVeye doing exactly the described work — Go/React/TypeScript/PostgreSQL/Redis, architecture ownership across four product teams, a real-time WebSocket layer with explicit reconnect/ordering/backpressure design, and a documented testing overhaul (48min to 14min pipeline). The AI-agent story is specific and credible rather than buzzword-y: shared Claude Code skills, MCP servers for internal APIs, a CI review agent adopted org-wide, and explicit written guardrails for where agents shouldn&amp;rsquo;t touch auth/payments/security — this is genuinely above-average AI-tooling maturity for a staff-level hire. Mentoring and informal-influence answers are concrete (named outcomes: one engineer now leads API redesign, another runs a testing guild) rather than vague self-praise, and the regulated-environment experience (ITAR, FedRAMP-aligned controls, air-gapped military deployment) is a near-exact match to the &amp;lsquo;regulated/high-compliance&amp;rsquo; and EAR/ITAR requirements.&lt;/p></description></item><item><title>Staff Full Stack Engineer — top 50</title><link>https://mmworkbrain.pages.dev/docs/shared/reports/2026-10-22/new-since-2026-10-16_0921/staff-full-stack-engineer-all-top-50/</link><pubDate>Thu, 22 Oct 2026 00:00:00 +0000</pubDate><guid>https://mmworkbrain.pages.dev/docs/shared/reports/2026-10-22/new-since-2026-10-16_0921/staff-full-stack-engineer-all-top-50/</guid><description>&lt;p>&lt;em>2026-10-22 · ranked by composite score · ★NEW = first seen since 2026-10-16 09:21&lt;/em>&lt;/p>
&lt;h2 id="1-new--pierre-cabell--cuyahoga-falls-ohio-united-states--staff-full-stack-engineer--uveye--score-0889">#1 ★NEW · Pierre Cabell · Cuyahoga Falls, Ohio, United States · Staff Full-Stack Engineer · UVeye · score: 0.889&lt;/h2>
&lt;p>&lt;a href="https://app8.greenhouse.io/people/78520287008/applications/85634071008/redesign">Greenhouse&lt;/a> · &lt;a href="https://www.linkedin.com/in/pierre-cabell-a024b1203">LinkedIn&lt;/a> | AI: 0.12 | GH fraud: strong — datacenter IP, VOIP phone (+5 weak: TZ mismatch, proxy, bot-like IP, IP history, new email)&lt;/p>
&lt;p>This candidate is a strong match on paper: current Staff title at UVeye doing exactly the described work — Go/React/TypeScript/PostgreSQL/Redis, architecture ownership across four product teams, a real-time WebSocket layer with explicit reconnect/ordering/backpressure design, and a documented testing overhaul (48min to 14min pipeline). The AI-agent story is specific and credible rather than buzzword-y: shared Claude Code skills, MCP servers for internal APIs, a CI review agent adopted org-wide, and explicit written guardrails for where agents shouldn&amp;rsquo;t touch auth/payments/security — this is genuinely above-average AI-tooling maturity for a staff-level hire. Mentoring and informal-influence answers are concrete (named outcomes: one engineer now leads API redesign, another runs a testing guild) rather than vague self-praise, and the regulated-environment experience (ITAR, FedRAMP-aligned controls, air-gapped military deployment) is a near-exact match to the &amp;lsquo;regulated/high-compliance&amp;rsquo; and EAR/ITAR requirements.&lt;/p></description></item><item><title>Senior Full-Stack Engineer — new in top 50</title><link>https://mmworkbrain.pages.dev/docs/shared/reports/2026-10-16/new-since-2026-10-13_0919/senior-full-stack-engineer-new-in-top-50/</link><pubDate>Fri, 16 Oct 2026 00:00:00 +0000</pubDate><guid>https://mmworkbrain.pages.dev/docs/shared/reports/2026-10-16/new-since-2026-10-13_0919/senior-full-stack-engineer-new-in-top-50/</guid><description>&lt;p>&lt;em>2026-10-16 · first seen since 2026-10-13 09:19 · rank is within the role&amp;rsquo;s overall top 50&lt;/em>&lt;/p>
&lt;p>&lt;em>No candidates.&lt;/em>&lt;/p></description></item><item><title>Senior Full-Stack Engineer — top 50</title><link>https://mmworkbrain.pages.dev/docs/shared/reports/2026-10-16/new-since-2026-10-13_0919/senior-full-stack-engineer-all-top-50/</link><pubDate>Fri, 16 Oct 2026 00:00:00 +0000</pubDate><guid>https://mmworkbrain.pages.dev/docs/shared/reports/2026-10-16/new-since-2026-10-13_0919/senior-full-stack-engineer-all-top-50/</guid><description>&lt;p>&lt;em>2026-10-16 · ranked by composite score · ★NEW = first seen since 2026-10-13 09:19&lt;/em>&lt;/p>
&lt;h2 id="1--kevin-wathen--hilliard-florida-united-states--senior-software-engineer--airbnb--score-0843">#1 · Kevin Wathen · Hilliard, Florida, United States · Senior Software Engineer · Airbnb · score: 0.843&lt;/h2>
&lt;p>&lt;a href="https://app8.greenhouse.io/people/73218063008/applications/80227639008/redesign">Greenhouse&lt;/a> · &lt;a href="https://www.linkedin.com/in/tiabas">LinkedIn&lt;/a> | AI: 0.13 | GH fraud: strong — datacenter IP (+4 weak: proxy, bot-like IP, IP history, new email) | ⚠ Potential duplicate&lt;/p>
&lt;p>This candidate presents a strong technical match for the role: current hands-on experience with Go, React/TypeScript, PostgreSQL, WebSockets, and Redis, plus explicit daily use of Claude Code and Cursor for test generation, refactoring, and even building custom MCP servers for agentic workflows — directly matching the &amp;lsquo;AI-forward&amp;rsquo; requirement rather than just checking a box. The resume also shows relevant enterprise/security-adjacent work (tenant isolation, role-based access control, compliance hardening) which aligns well with Mattermost&amp;rsquo;s regulated-environment context, even though there&amp;rsquo;s no explicit defense/intelligence domain experience or mention of security clearance status, which should be confirmed directly.&lt;/p></description></item><item><title>Senior Mobile Engineer — new in top 50</title><link>https://mmworkbrain.pages.dev/docs/shared/reports/2026-10-16/new-since-2026-10-13_0919/senior-mobile-engineer-new-in-top-50/</link><pubDate>Fri, 16 Oct 2026 00:00:00 +0000</pubDate><guid>https://mmworkbrain.pages.dev/docs/shared/reports/2026-10-16/new-since-2026-10-13_0919/senior-mobile-engineer-new-in-top-50/</guid><description>&lt;p>&lt;em>2026-10-16 · first seen since 2026-10-13 09:19 · rank is within the role&amp;rsquo;s overall top 50&lt;/em>&lt;/p>
&lt;h2 id="26-new--hammoud-hammoud--palos-verdes-peninsula-california-united-states--senior-mobile-engineer-contract--honda--score-0684">#26 ★NEW · Hammoud Hammoud · Palos Verdes Peninsula, California, United States · Senior Mobile Engineer (Contract) · Honda · score: 0.684&lt;/h2>
&lt;p>&lt;a href="https://app8.greenhouse.io/people/78273600008/applications/85382807008/redesign">Greenhouse&lt;/a> · &lt;a href="https://www.linkedin.com/in/hammoud-hammoud">LinkedIn&lt;/a> | AI: 0.12 | GH fraud: ok&lt;/p>
&lt;p>This candidate has strong, well-evidenced native mobile depth: six years on Tandem&amp;rsquo;s t:slim app building and maintaining a BLE communication layer for a Bluetooth medical device, diagnosing race conditions in a concurrent upload pipeline and rearchitecting it around a synchronized operation queue, using Crashlytics/Datadog and Xcode Instruments for production debugging, and driving unit test coverage from under 40% to 75-80% across a 16-person team. The current Honda contract adds more BLE/offline-connectivity work (an internet-free camper control app) and a concrete, specific example of agentic AI coding workflow — using Jira tickets, Figma specs, and a BLE protocol doc as agent context, shipped as small stacked PRs — which is a credible, non-generic AI usage story.&lt;/p></description></item><item><title>Senior Mobile Engineer — top 50</title><link>https://mmworkbrain.pages.dev/docs/shared/reports/2026-10-16/new-since-2026-10-13_0919/senior-mobile-engineer-all-top-50/</link><pubDate>Fri, 16 Oct 2026 00:00:00 +0000</pubDate><guid>https://mmworkbrain.pages.dev/docs/shared/reports/2026-10-16/new-since-2026-10-13_0919/senior-mobile-engineer-all-top-50/</guid><description>&lt;p>&lt;em>2026-10-16 · ranked by composite score · ★NEW = first seen since 2026-10-13 09:19&lt;/em>&lt;/p>
&lt;h2 id="1--joshua-lytle--issaquah-washington-united-states--principal-software-engineer--nomadgo-inc--score-0871">#1 · Joshua Lytle · Issaquah, Washington, United States · Principal Software Engineer · NomadGo, Inc. · score: 0.871&lt;/h2>
&lt;p>&lt;a href="https://app8.greenhouse.io/people/75224729008/applications/82276606008/redesign">Greenhouse&lt;/a> · &lt;a href="https://www.linkedin.com/in/joshlytle1">LinkedIn&lt;/a> | AI: 0.14 | GH fraud: strong — datacenter IP (+3 weak: proxy, bot-like IP, IP history)&lt;/p>
&lt;p>This is a strong technical match: the candidate has shipped iOS since 2008 and cross-platform (including React Native SDK work) since 2011, with recent hands-on experience building connectivity-loss handling (startup, sign-in, count submission) and MDM/managed-app-configuration support for store devices at NomadGo — essentially a dry run for the DDIL and enterprise-distribution requirements in this role. They also show real performance engineering chops (adaptive inference throttling and OCR interval gating to cut AR scanner battery drain) and testing/CI discipline (1,000 unit tests, 100 automated UI tests, built partly with agentic tooling), plus prior SDK work integrated by major retail engineering teams (Target, Lowe&amp;rsquo;s, Staples, Macy&amp;rsquo;s), evidencing experience shipping code others depend on.&lt;/p></description></item><item><title>Staff Full Stack Engineer — new in top 50</title><link>https://mmworkbrain.pages.dev/docs/shared/reports/2026-10-16/new-since-2026-10-13_0919/staff-full-stack-engineer-new-in-top-50/</link><pubDate>Fri, 16 Oct 2026 00:00:00 +0000</pubDate><guid>https://mmworkbrain.pages.dev/docs/shared/reports/2026-10-16/new-since-2026-10-13_0919/staff-full-stack-engineer-new-in-top-50/</guid><description>&lt;p>&lt;em>2026-10-16 · first seen since 2026-10-13 09:19 · rank is within the role&amp;rsquo;s overall top 50&lt;/em>&lt;/p>
&lt;h2 id="16-new--preston-matheson--portland-oregon-united-states--lead-software-engineer--lightspeed-systems--score-0738">#16 ★NEW · Preston Matheson · Portland, Oregon, United States · Lead Software Engineer · Lightspeed Systems · score: 0.738&lt;/h2>
&lt;p>&lt;a href="https://app8.greenhouse.io/people/78039010008/applications/85143620008/redesign">Greenhouse&lt;/a> · &lt;a href="https://www.linkedin.com/in/preston-matheson">LinkedIn&lt;/a> | AI: 0.20 | GH fraud: weak (+1 weak: new email)&lt;/p>
&lt;p>This candidate shows strong staff-level technical substance: production Go and React/TypeScript experience, distributed systems work at meaningful scale (tens of millions of requests/day, 6.67M devices), and a track record of leading architecture decisions like unifying a split data model used across five services and redesigning a hot-path policy resolution system. Compliance-adjacent experience is present and relevant — a DoD contract enabled by their feature work and resolving MOE audit/security findings in Singapore — which maps reasonably well to the regulated-environment requirement, though explicit clearance/ITAR eligibility isn&amp;rsquo;t confirmed in the text. Mentoring and informal-authority influence are well evidenced: leading a team of all-senior engineers, mentoring a staff engineer, and driving org-wide adoption of agentic AI workflows against initial resistance, with a structured mechanism (weekly show-and-tell) for spreading practices — this is a genuinely strong signal for the &amp;lsquo;AI-agentic standards&amp;rsquo; and &amp;lsquo;influence without authority&amp;rsquo; requirements.&lt;/p></description></item><item><title>Staff Full Stack Engineer — top 50</title><link>https://mmworkbrain.pages.dev/docs/shared/reports/2026-10-16/new-since-2026-10-13_0919/staff-full-stack-engineer-all-top-50/</link><pubDate>Fri, 16 Oct 2026 00:00:00 +0000</pubDate><guid>https://mmworkbrain.pages.dev/docs/shared/reports/2026-10-16/new-since-2026-10-13_0919/staff-full-stack-engineer-all-top-50/</guid><description>&lt;p>&lt;em>2026-10-16 · ranked by composite score · ★NEW = first seen since 2026-10-13 09:19&lt;/em>&lt;/p>
&lt;h2 id="1--jonathan-pyers--troutman-north-carolina-united-states--solution-architect-and-team-lead---senior-software-engineer-full-stack--rts-labs--score-0859">#1 · Jonathan Pyers · Troutman, North Carolina, United States · Solution Architect and Team Lead - Senior Software Engineer, Full-Stack · RTS Labs · score: 0.859&lt;/h2>
&lt;p>&lt;a href="https://app8.greenhouse.io/people/77183045008/applications/84270025008/redesign">Greenhouse&lt;/a> · &lt;a href="https://www.linkedin.com/in/jonathanpyers">LinkedIn&lt;/a> | AI: 0.07 | GH fraud: ok&lt;/p>
&lt;p>This is a strong match on paper: genuine Go + React/TypeScript production experience, PostgreSQL, a track record of end-to-end ownership (solution architect scoping and delivering client systems, MCP server for company-wide estimating), and real regulated-environment exposure — five years at Lawrence Livermore National Laboratory supporting mission-critical National Ignition Facility operations, plus HHS government consulting at Ad Hoc. The LLNL background strongly suggests clearance/ITAR eligibility even though not explicitly stated, which directly addresses a required qualification many candidates can&amp;rsquo;t meet. The AI-agent fluency signal is unusually credible — they didn&amp;rsquo;t just name a tool, they built their own agent harness (public repo) and actively maintain standards artifacts for agents across projects, which is close to the &amp;lsquo;org-wide AI-agentic engineering standards&amp;rsquo; this role wants someone to establish.&lt;/p></description></item><item><title>Senior Full-Stack Engineer — new in top 50</title><link>https://mmworkbrain.pages.dev/docs/shared/reports/2026-10-14/new-since-2026-10-01_0000/senior-full-stack-engineer-new-in-top-50/</link><pubDate>Wed, 14 Oct 2026 00:00:00 +0000</pubDate><guid>https://mmworkbrain.pages.dev/docs/shared/reports/2026-10-14/new-since-2026-10-01_0000/senior-full-stack-engineer-new-in-top-50/</guid><description>&lt;p>&lt;em>2026-10-14 · first seen since 2026-10-01 00:00 · rank is within the role&amp;rsquo;s overall top 50&lt;/em>&lt;/p>
&lt;h2 id="8-new--david-mullins--durango-colorado-united-states--data-engineer--mill-creek-renewables-epc--score-0785">#8 ★NEW · David Mullins · Durango, Colorado, United States · Data Engineer · Mill Creek Renewables (EPC) · score: 0.785&lt;/h2>
&lt;p>&lt;a href="https://app8.greenhouse.io/people/77928748008/applications/85031530008/redesign">Greenhouse&lt;/a> | AI: 0.04 | GH fraud: ok&lt;/p>
&lt;p>This is a strong full-stack engineer with genuine depth: schema design, query/index tuning, dimensional modeling, CI-gated testing, and a track record of owning systems end-to-end (the Mill Creek ETL/orchestrator rebuild scaling from 5 to 30+ projects is a concrete, verifiable outcome). The AI-agent answer is a clear positive signal — it describes a specific failure mode (plausible-looking wrong mappings) and a specific mitigation (tests against real data plus human sign-off), which is more substantive than most applicants offer. The defense/export-control networking background (5G, DOCSIS, precision timing, Lockheed/Qualcomm lab work) is a genuine nice-to-have match for Mattermost&amp;rsquo;s defense/intel customer base and suggests clearance eligibility, though it isn&amp;rsquo;t stated explicitly.&lt;/p></description></item><item><title>Senior Full-Stack Engineer — new in top 50</title><link>https://mmworkbrain.pages.dev/docs/shared/reports/2026-10-14/new-since-2026-10-12_0000/senior-full-stack-engineer-new-in-top-50/</link><pubDate>Wed, 14 Oct 2026 00:00:00 +0000</pubDate><guid>https://mmworkbrain.pages.dev/docs/shared/reports/2026-10-14/new-since-2026-10-12_0000/senior-full-stack-engineer-new-in-top-50/</guid><description>&lt;p>&lt;em>2026-10-14 · first seen since 2026-10-12 00:00 · rank is within the role&amp;rsquo;s overall top 50&lt;/em>&lt;/p>
&lt;h2 id="8-new--david-mullins--durango-colorado-united-states--data-engineer--mill-creek-renewables-epc--score-0785">#8 ★NEW · David Mullins · Durango, Colorado, United States · Data Engineer · Mill Creek Renewables (EPC) · score: 0.785&lt;/h2>
&lt;p>&lt;a href="https://app8.greenhouse.io/people/77928748008/applications/85031530008/redesign">Greenhouse&lt;/a> | AI: 0.04 | GH fraud: ok&lt;/p>
&lt;p>This is a strong full-stack engineer with genuine depth: schema design, query/index tuning, dimensional modeling, CI-gated testing, and a track record of owning systems end-to-end (the Mill Creek ETL/orchestrator rebuild scaling from 5 to 30+ projects is a concrete, verifiable outcome). The AI-agent answer is a clear positive signal — it describes a specific failure mode (plausible-looking wrong mappings) and a specific mitigation (tests against real data plus human sign-off), which is more substantive than most applicants offer. The defense/export-control networking background (5G, DOCSIS, precision timing, Lockheed/Qualcomm lab work) is a genuine nice-to-have match for Mattermost&amp;rsquo;s defense/intel customer base and suggests clearance eligibility, though it isn&amp;rsquo;t stated explicitly.&lt;/p></description></item><item><title>Senior Full-Stack Engineer — top 50</title><link>https://mmworkbrain.pages.dev/docs/shared/reports/2026-10-14/new-since-2026-10-01_0000/senior-full-stack-engineer-all-top-50/</link><pubDate>Wed, 14 Oct 2026 00:00:00 +0000</pubDate><guid>https://mmworkbrain.pages.dev/docs/shared/reports/2026-10-14/new-since-2026-10-01_0000/senior-full-stack-engineer-all-top-50/</guid><description>&lt;p>&lt;em>2026-10-14 · ranked by composite score · ★NEW = first seen since 2026-10-01 00:00&lt;/em>&lt;/p>
&lt;h2 id="1--kevin-wathen--hilliard-florida-united-states--senior-software-engineer--airbnb--score-0843">#1 · Kevin Wathen · Hilliard, Florida, United States · Senior Software Engineer · Airbnb · score: 0.843&lt;/h2>
&lt;p>&lt;a href="https://app8.greenhouse.io/people/73218063008/applications/80227639008/redesign">Greenhouse&lt;/a> · &lt;a href="https://www.linkedin.com/in/tiabas">LinkedIn&lt;/a> | AI: 0.13 | GH fraud: strong — datacenter IP (+4 weak: proxy, bot-like IP, IP history, new email) | ⚠ Potential duplicate&lt;/p>
&lt;p>This candidate presents a strong technical match for the role: current hands-on experience with Go, React/TypeScript, PostgreSQL, WebSockets, and Redis, plus explicit daily use of Claude Code and Cursor for test generation, refactoring, and even building custom MCP servers for agentic workflows — directly matching the &amp;lsquo;AI-forward&amp;rsquo; requirement rather than just checking a box. The resume also shows relevant enterprise/security-adjacent work (tenant isolation, role-based access control, compliance hardening) which aligns well with Mattermost&amp;rsquo;s regulated-environment context, even though there&amp;rsquo;s no explicit defense/intelligence domain experience or mention of security clearance status, which should be confirmed directly.&lt;/p></description></item><item><title>Senior Full-Stack Engineer — top 50</title><link>https://mmworkbrain.pages.dev/docs/shared/reports/2026-10-14/new-since-2026-10-12_0000/senior-full-stack-engineer-all-top-50/</link><pubDate>Wed, 14 Oct 2026 00:00:00 +0000</pubDate><guid>https://mmworkbrain.pages.dev/docs/shared/reports/2026-10-14/new-since-2026-10-12_0000/senior-full-stack-engineer-all-top-50/</guid><description>&lt;p>&lt;em>2026-10-14 · ranked by composite score · ★NEW = first seen since 2026-10-12 00:00&lt;/em>&lt;/p>
&lt;h2 id="1--kevin-wathen--hilliard-florida-united-states--senior-software-engineer--airbnb--score-0843">#1 · Kevin Wathen · Hilliard, Florida, United States · Senior Software Engineer · Airbnb · score: 0.843&lt;/h2>
&lt;p>&lt;a href="https://app8.greenhouse.io/people/73218063008/applications/80227639008/redesign">Greenhouse&lt;/a> · &lt;a href="https://www.linkedin.com/in/tiabas">LinkedIn&lt;/a> | AI: 0.13 | GH fraud: strong — datacenter IP (+4 weak: proxy, bot-like IP, IP history, new email) | ⚠ Potential duplicate&lt;/p>
&lt;p>This candidate presents a strong technical match for the role: current hands-on experience with Go, React/TypeScript, PostgreSQL, WebSockets, and Redis, plus explicit daily use of Claude Code and Cursor for test generation, refactoring, and even building custom MCP servers for agentic workflows — directly matching the &amp;lsquo;AI-forward&amp;rsquo; requirement rather than just checking a box. The resume also shows relevant enterprise/security-adjacent work (tenant isolation, role-based access control, compliance hardening) which aligns well with Mattermost&amp;rsquo;s regulated-environment context, even though there&amp;rsquo;s no explicit defense/intelligence domain experience or mention of security clearance status, which should be confirmed directly.&lt;/p></description></item><item><title>Senior Mobile Engineer — new in top 50</title><link>https://mmworkbrain.pages.dev/docs/shared/reports/2026-10-14/new-since-2026-10-01_0000/senior-mobile-engineer-new-in-top-50/</link><pubDate>Wed, 14 Oct 2026 00:00:00 +0000</pubDate><guid>https://mmworkbrain.pages.dev/docs/shared/reports/2026-10-14/new-since-2026-10-01_0000/senior-mobile-engineer-new-in-top-50/</guid><description>&lt;p>&lt;em>2026-10-14 · first seen since 2026-10-01 00:00 · rank is within the role&amp;rsquo;s overall top 50&lt;/em>&lt;/p>
&lt;h2 id="1-new--joshua-lytle--issaquah-washington-united-states--principal-software-engineer--nomadgo-inc--score-0871">#1 ★NEW · Joshua Lytle · Issaquah, Washington, United States · Principal Software Engineer · NomadGo, Inc. · score: 0.871&lt;/h2>
&lt;p>&lt;a href="https://app8.greenhouse.io/people/75224729008/applications/82276606008/redesign">Greenhouse&lt;/a> · &lt;a href="https://www.linkedin.com/in/joshlytle1">LinkedIn&lt;/a> | AI: 0.14 | GH fraud: strong — datacenter IP (+3 weak: proxy, bot-like IP, IP history)&lt;/p>
&lt;p>This is a strong technical match: the candidate has shipped iOS since 2008 and cross-platform (including React Native SDK work) since 2011, with recent hands-on experience building connectivity-loss handling (startup, sign-in, count submission) and MDM/managed-app-configuration support for store devices at NomadGo — essentially a dry run for the DDIL and enterprise-distribution requirements in this role. They also show real performance engineering chops (adaptive inference throttling and OCR interval gating to cut AR scanner battery drain) and testing/CI discipline (1,000 unit tests, 100 automated UI tests, built partly with agentic tooling), plus prior SDK work integrated by major retail engineering teams (Target, Lowe&amp;rsquo;s, Staples, Macy&amp;rsquo;s), evidencing experience shipping code others depend on.&lt;/p></description></item><item><title>Senior Mobile Engineer — new in top 50</title><link>https://mmworkbrain.pages.dev/docs/shared/reports/2026-10-14/new-since-2026-10-12_0000/senior-mobile-engineer-new-in-top-50/</link><pubDate>Wed, 14 Oct 2026 00:00:00 +0000</pubDate><guid>https://mmworkbrain.pages.dev/docs/shared/reports/2026-10-14/new-since-2026-10-12_0000/senior-mobile-engineer-new-in-top-50/</guid><description>&lt;p>&lt;em>2026-10-14 · first seen since 2026-10-12 00:00 · rank is within the role&amp;rsquo;s overall top 50&lt;/em>&lt;/p>
&lt;h2 id="3-new--william-mccaffrey--tampa-florida-united-states--senior-software-engineer-technical-lead--jetblue--score-0853">#3 ★NEW · William Mccaffrey · Tampa, Florida, United States · Senior Software Engineer, Technical Lead · JetBlue · score: 0.853&lt;/h2>
&lt;p>&lt;a href="https://app8.greenhouse.io/people/77420013008/applications/84515616008/redesign">Greenhouse&lt;/a> · &lt;a href="https://www.linkedin.com/in/william-mccaffrey-a6e124ca">LinkedIn&lt;/a> | AI: 0.12 | GH fraud: strong — VOIP phone (+2 weak: TZ mismatch, new email) | ⚠ Potential duplicate&lt;/p>
&lt;p>This candidate is a strong technical match: current React Native/TypeScript work at JetBlue includes an offline-first data layer with queued writes, idempotent sync, and conflict handling built specifically to survive intermittent connectivity and app restarts — essentially a dry run for DDIL requirements. They also cite native-layer profiling (Instruments/Android profilers) for startup and jank fixes, crash-analytics-driven production debugging, and networking resilience work (retry/backoff, lifecycle-aware background tasks), all of which map closely to the role&amp;rsquo;s required skills. Skills list also name-checks MDM/AppConfig/Intune MAM, Keychain/Keystore secure storage, and AI coding agent usage (Cursor, Copilot, Claude Code) with some specificity around LLM-assisted debugging and test generation.&lt;/p></description></item><item><title>Senior Mobile Engineer — top 50</title><link>https://mmworkbrain.pages.dev/docs/shared/reports/2026-10-14/new-since-2026-10-01_0000/senior-mobile-engineer-all-top-50/</link><pubDate>Wed, 14 Oct 2026 00:00:00 +0000</pubDate><guid>https://mmworkbrain.pages.dev/docs/shared/reports/2026-10-14/new-since-2026-10-01_0000/senior-mobile-engineer-all-top-50/</guid><description>&lt;p>&lt;em>2026-10-14 · ranked by composite score · ★NEW = first seen since 2026-10-01 00:00&lt;/em>&lt;/p>
&lt;h2 id="1-new--joshua-lytle--issaquah-washington-united-states--principal-software-engineer--nomadgo-inc--score-0871">#1 ★NEW · Joshua Lytle · Issaquah, Washington, United States · Principal Software Engineer · NomadGo, Inc. · score: 0.871&lt;/h2>
&lt;p>&lt;a href="https://app8.greenhouse.io/people/75224729008/applications/82276606008/redesign">Greenhouse&lt;/a> · &lt;a href="https://www.linkedin.com/in/joshlytle1">LinkedIn&lt;/a> | AI: 0.14 | GH fraud: strong — datacenter IP (+3 weak: proxy, bot-like IP, IP history)&lt;/p>
&lt;p>This is a strong technical match: the candidate has shipped iOS since 2008 and cross-platform (including React Native SDK work) since 2011, with recent hands-on experience building connectivity-loss handling (startup, sign-in, count submission) and MDM/managed-app-configuration support for store devices at NomadGo — essentially a dry run for the DDIL and enterprise-distribution requirements in this role. They also show real performance engineering chops (adaptive inference throttling and OCR interval gating to cut AR scanner battery drain) and testing/CI discipline (1,000 unit tests, 100 automated UI tests, built partly with agentic tooling), plus prior SDK work integrated by major retail engineering teams (Target, Lowe&amp;rsquo;s, Staples, Macy&amp;rsquo;s), evidencing experience shipping code others depend on.&lt;/p></description></item><item><title>Senior Mobile Engineer — top 50</title><link>https://mmworkbrain.pages.dev/docs/shared/reports/2026-10-14/new-since-2026-10-12_0000/senior-mobile-engineer-all-top-50/</link><pubDate>Wed, 14 Oct 2026 00:00:00 +0000</pubDate><guid>https://mmworkbrain.pages.dev/docs/shared/reports/2026-10-14/new-since-2026-10-12_0000/senior-mobile-engineer-all-top-50/</guid><description>&lt;p>&lt;em>2026-10-14 · ranked by composite score · ★NEW = first seen since 2026-10-12 00:00&lt;/em>&lt;/p>
&lt;h2 id="1--joshua-lytle--issaquah-washington-united-states--principal-software-engineer--nomadgo-inc--score-0871">#1 · Joshua Lytle · Issaquah, Washington, United States · Principal Software Engineer · NomadGo, Inc. · score: 0.871&lt;/h2>
&lt;p>&lt;a href="https://app8.greenhouse.io/people/75224729008/applications/82276606008/redesign">Greenhouse&lt;/a> · &lt;a href="https://www.linkedin.com/in/joshlytle1">LinkedIn&lt;/a> | AI: 0.14 | GH fraud: strong — datacenter IP (+3 weak: proxy, bot-like IP, IP history)&lt;/p>
&lt;p>This is a strong technical match: the candidate has shipped iOS since 2008 and cross-platform (including React Native SDK work) since 2011, with recent hands-on experience building connectivity-loss handling (startup, sign-in, count submission) and MDM/managed-app-configuration support for store devices at NomadGo — essentially a dry run for the DDIL and enterprise-distribution requirements in this role. They also show real performance engineering chops (adaptive inference throttling and OCR interval gating to cut AR scanner battery drain) and testing/CI discipline (1,000 unit tests, 100 automated UI tests, built partly with agentic tooling), plus prior SDK work integrated by major retail engineering teams (Target, Lowe&amp;rsquo;s, Staples, Macy&amp;rsquo;s), evidencing experience shipping code others depend on.&lt;/p></description></item><item><title>Staff Full Stack Engineer — new in top 50</title><link>https://mmworkbrain.pages.dev/docs/shared/reports/2026-10-14/new-since-2026-10-01_0000/staff-full-stack-engineer-new-in-top-50/</link><pubDate>Wed, 14 Oct 2026 00:00:00 +0000</pubDate><guid>https://mmworkbrain.pages.dev/docs/shared/reports/2026-10-14/new-since-2026-10-01_0000/staff-full-stack-engineer-new-in-top-50/</guid><description>&lt;p>&lt;em>2026-10-14 · first seen since 2026-10-01 00:00 · rank is within the role&amp;rsquo;s overall top 50&lt;/em>&lt;/p>
&lt;h2 id="1-new--jonathan-pyers--troutman-north-carolina-united-states--solution-architect-and-team-lead---senior-software-engineer-full-stack--rts-labs--score-0859">#1 ★NEW · Jonathan Pyers · Troutman, North Carolina, United States · Solution Architect and Team Lead - Senior Software Engineer, Full-Stack · RTS Labs · score: 0.859&lt;/h2>
&lt;p>&lt;a href="https://app8.greenhouse.io/people/77183045008/applications/84270025008/redesign">Greenhouse&lt;/a> · &lt;a href="https://www.linkedin.com/in/jonathanpyers">LinkedIn&lt;/a> | AI: 0.07 | GH fraud: ok&lt;/p>
&lt;p>This is a strong match on paper: genuine Go + React/TypeScript production experience, PostgreSQL, a track record of end-to-end ownership (solution architect scoping and delivering client systems, MCP server for company-wide estimating), and real regulated-environment exposure — five years at Lawrence Livermore National Laboratory supporting mission-critical National Ignition Facility operations, plus HHS government consulting at Ad Hoc. The LLNL background strongly suggests clearance/ITAR eligibility even though not explicitly stated, which directly addresses a required qualification many candidates can&amp;rsquo;t meet. The AI-agent fluency signal is unusually credible — they didn&amp;rsquo;t just name a tool, they built their own agent harness (public repo) and actively maintain standards artifacts for agents across projects, which is close to the &amp;lsquo;org-wide AI-agentic engineering standards&amp;rsquo; this role wants someone to establish.&lt;/p></description></item><item><title>Staff Full Stack Engineer — new in top 50</title><link>https://mmworkbrain.pages.dev/docs/shared/reports/2026-10-14/new-since-2026-10-12_0000/staff-full-stack-engineer-new-in-top-50/</link><pubDate>Wed, 14 Oct 2026 00:00:00 +0000</pubDate><guid>https://mmworkbrain.pages.dev/docs/shared/reports/2026-10-14/new-since-2026-10-12_0000/staff-full-stack-engineer-new-in-top-50/</guid><description>&lt;p>&lt;em>2026-10-14 · first seen since 2026-10-12 00:00 · rank is within the role&amp;rsquo;s overall top 50&lt;/em>&lt;/p>
&lt;h2 id="1-new--jonathan-pyers--troutman-north-carolina-united-states--solution-architect-and-team-lead---senior-software-engineer-full-stack--rts-labs--score-0859">#1 ★NEW · Jonathan Pyers · Troutman, North Carolina, United States · Solution Architect and Team Lead - Senior Software Engineer, Full-Stack · RTS Labs · score: 0.859&lt;/h2>
&lt;p>&lt;a href="https://app8.greenhouse.io/people/77183045008/applications/84270025008/redesign">Greenhouse&lt;/a> · &lt;a href="https://www.linkedin.com/in/jonathanpyers">LinkedIn&lt;/a> | AI: 0.07 | GH fraud: ok&lt;/p>
&lt;p>This is a strong match on paper: genuine Go + React/TypeScript production experience, PostgreSQL, a track record of end-to-end ownership (solution architect scoping and delivering client systems, MCP server for company-wide estimating), and real regulated-environment exposure — five years at Lawrence Livermore National Laboratory supporting mission-critical National Ignition Facility operations, plus HHS government consulting at Ad Hoc. The LLNL background strongly suggests clearance/ITAR eligibility even though not explicitly stated, which directly addresses a required qualification many candidates can&amp;rsquo;t meet. The AI-agent fluency signal is unusually credible — they didn&amp;rsquo;t just name a tool, they built their own agent harness (public repo) and actively maintain standards artifacts for agents across projects, which is close to the &amp;lsquo;org-wide AI-agentic engineering standards&amp;rsquo; this role wants someone to establish.&lt;/p></description></item><item><title>Staff Full Stack Engineer — top 50</title><link>https://mmworkbrain.pages.dev/docs/shared/reports/2026-10-14/new-since-2026-10-01_0000/staff-full-stack-engineer-all-top-50/</link><pubDate>Wed, 14 Oct 2026 00:00:00 +0000</pubDate><guid>https://mmworkbrain.pages.dev/docs/shared/reports/2026-10-14/new-since-2026-10-01_0000/staff-full-stack-engineer-all-top-50/</guid><description>&lt;p>&lt;em>2026-10-14 · ranked by composite score · ★NEW = first seen since 2026-10-01 00:00&lt;/em>&lt;/p>
&lt;h2 id="1-new--jonathan-pyers--troutman-north-carolina-united-states--solution-architect-and-team-lead---senior-software-engineer-full-stack--rts-labs--score-0859">#1 ★NEW · Jonathan Pyers · Troutman, North Carolina, United States · Solution Architect and Team Lead - Senior Software Engineer, Full-Stack · RTS Labs · score: 0.859&lt;/h2>
&lt;p>&lt;a href="https://app8.greenhouse.io/people/77183045008/applications/84270025008/redesign">Greenhouse&lt;/a> · &lt;a href="https://www.linkedin.com/in/jonathanpyers">LinkedIn&lt;/a> | AI: 0.07 | GH fraud: ok&lt;/p>
&lt;p>This is a strong match on paper: genuine Go + React/TypeScript production experience, PostgreSQL, a track record of end-to-end ownership (solution architect scoping and delivering client systems, MCP server for company-wide estimating), and real regulated-environment exposure — five years at Lawrence Livermore National Laboratory supporting mission-critical National Ignition Facility operations, plus HHS government consulting at Ad Hoc. The LLNL background strongly suggests clearance/ITAR eligibility even though not explicitly stated, which directly addresses a required qualification many candidates can&amp;rsquo;t meet. The AI-agent fluency signal is unusually credible — they didn&amp;rsquo;t just name a tool, they built their own agent harness (public repo) and actively maintain standards artifacts for agents across projects, which is close to the &amp;lsquo;org-wide AI-agentic engineering standards&amp;rsquo; this role wants someone to establish.&lt;/p></description></item><item><title>Staff Full Stack Engineer — top 50</title><link>https://mmworkbrain.pages.dev/docs/shared/reports/2026-10-14/new-since-2026-10-12_0000/staff-full-stack-engineer-all-top-50/</link><pubDate>Wed, 14 Oct 2026 00:00:00 +0000</pubDate><guid>https://mmworkbrain.pages.dev/docs/shared/reports/2026-10-14/new-since-2026-10-12_0000/staff-full-stack-engineer-all-top-50/</guid><description>&lt;p>&lt;em>2026-10-14 · ranked by composite score · ★NEW = first seen since 2026-10-12 00:00&lt;/em>&lt;/p>
&lt;h2 id="1-new--jonathan-pyers--troutman-north-carolina-united-states--solution-architect-and-team-lead---senior-software-engineer-full-stack--rts-labs--score-0859">#1 ★NEW · Jonathan Pyers · Troutman, North Carolina, United States · Solution Architect and Team Lead - Senior Software Engineer, Full-Stack · RTS Labs · score: 0.859&lt;/h2>
&lt;p>&lt;a href="https://app8.greenhouse.io/people/77183045008/applications/84270025008/redesign">Greenhouse&lt;/a> · &lt;a href="https://www.linkedin.com/in/jonathanpyers">LinkedIn&lt;/a> | AI: 0.07 | GH fraud: ok&lt;/p>
&lt;p>This is a strong match on paper: genuine Go + React/TypeScript production experience, PostgreSQL, a track record of end-to-end ownership (solution architect scoping and delivering client systems, MCP server for company-wide estimating), and real regulated-environment exposure — five years at Lawrence Livermore National Laboratory supporting mission-critical National Ignition Facility operations, plus HHS government consulting at Ad Hoc. The LLNL background strongly suggests clearance/ITAR eligibility even though not explicitly stated, which directly addresses a required qualification many candidates can&amp;rsquo;t meet. The AI-agent fluency signal is unusually credible — they didn&amp;rsquo;t just name a tool, they built their own agent harness (public repo) and actively maintain standards artifacts for agents across projects, which is close to the &amp;lsquo;org-wide AI-agentic engineering standards&amp;rsquo; this role wants someone to establish.&lt;/p></description></item></channel></rss>