<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.mozilla.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Kmoir</id>
	<title>MozillaWiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.mozilla.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Kmoir"/>
	<link rel="alternate" type="text/html" href="https://wiki.mozilla.org/Special:Contributions/Kmoir"/>
	<updated>2026-11-05T10:33:57Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.39.17</generator>
	<entry>
		<id>https://wiki.mozilla.org/index.php?title=Performance/Glossary&amp;diff=1229890</id>
		<title>Performance/Glossary</title>
		<link rel="alternate" type="text/html" href="https://wiki.mozilla.org/index.php?title=Performance/Glossary&amp;diff=1229890"/>
		<updated>2020-08-07T18:17:15Z</updated>

		<summary type="html">&lt;p&gt;Kmoir: /* Backfill */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Classification of user actions/flows that will be perceived as task with discrete performance expectations and settings/configurations that affect the raw performance of those tasks.&lt;br /&gt;
&lt;br /&gt;
==Pageload==&lt;br /&gt;
&lt;br /&gt;
=== Metrics ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Term !! Metadata !! Definition !! Relevant Links&lt;br /&gt;
|-&lt;br /&gt;
| || || One or two sentences || &lt;br /&gt;
* Full definition&lt;br /&gt;
* Related tests/coverage&lt;br /&gt;
* Results&lt;br /&gt;
* User research&lt;br /&gt;
|-&lt;br /&gt;
| SpeedIndex || Visual || (SI) is a page load performance metric that shows you how quickly the contents of a page are visibly populated. It is the average time at which visible parts of the page are displayed. Expressed in milliseconds, and dependent on the size of the viewport, the lower the score, the better.  ||[https://developer.mozilla.org/en-US/docs/Glossary/Speed_index MDN Documentation] &lt;br /&gt;
|-&lt;br /&gt;
| Contentful SpeedIndex || Visual || This metric uses edge detection to calculate the amount of “content” that is visible on each frame. It was designed to have a good metric to measure the amount of text that is visible and ignore the impact of popup or login screens at the end of a page load. || [https://www.sitespeed.io/documentation/sitespeed.io/metrics/#contentful-speed-index sitespeed.io documentation]&lt;br /&gt;
|-&lt;br /&gt;
|  Perceptual SpeedIndex || Visual || A metric that measures the above-the-fold visual performance of a webpage, while accounting for the layout stability.  || * [http://www.parvez-ahammad.org/blog/perceptual-speed-index-psi-for-measuring-above-fold-visual-performance-of-webpages Perceptual Speed Index (PSI) for measuring above-fold visual performance of webpages] &lt;br /&gt;
* [https://github.com/WPO-Foundation/visualmetrics Visual metrics github repo]&lt;br /&gt;
|-&lt;br /&gt;
| Visual Completeness || Visual  || The point in time when a web browser has finished rendering viewable content in the viewport, but not the entire page. || &lt;br /&gt;
|-&lt;br /&gt;
| First Paint event || Standard || The time between navigation and when the browser renders the first pixels to the screen, rendering anything that is visually different from what was on the screen prior to navigation.  || [https://developer.mozilla.org/en-US/docs/Glossary/First_paint MDN documentation]&lt;br /&gt;
|-&lt;br /&gt;
| First Contentful Paint || Standard || How long it takes the browser to render the first bit of content from the DOM providing the first feedback to the user the page is actually loading. || [https://developer.mozilla.org/en-US/docs/Glossary/First_contentful_paint MDN documentation]&lt;br /&gt;
|-&lt;br /&gt;
| DOMContentLoaded event || Standard || A DOM event that is fired once the underlying document has finished being parsed and loaded, but before any of its additional resources (stylesheets, images, subframes) have finished loading. || [https://developer.mozilla.org/en-US/docs/Web/API/Window/DOMContent MDN documentation]&lt;br /&gt;
|-&lt;br /&gt;
|  Onload event || Standard || A DOM event that is fired once the underlying document has finished loading, including all of its stylesheets, images and subframes. This does not include additional resources that start to load due to script. || [https://developer.mozilla.org/en-US/docs/Web/API/Window/load_event MDN Documentation]&lt;br /&gt;
|-&lt;br /&gt;
| Time to Interactive || Proposed standard || (TTI) is a non-standardized web performance &#039;progress&#039; metric defined as the point in time when the last Long Task finished and was followed by 5 seconds of network and main thread inactivity.&lt;br /&gt;
    &lt;br /&gt;
# The page has displayed useful content&lt;br /&gt;
# Event handlers are registered for most visible page elements&lt;br /&gt;
# When a user interacts with the page, the page consistently responds within 50ms - the user does not experience jank.&lt;br /&gt;
 || &lt;br /&gt;
* [https://developer.mozilla.org/en-US/docs/Glossary/Time_to_interactive MDN Documentation]&lt;br /&gt;
* [https://github.com/WICG/time-to-interactive Proposed web standard]&lt;br /&gt;
|-&lt;br /&gt;
| Cold page load ||  || browser started and stabilized/idle, same profile dir as previous, site not loaded or cache cleared  || &lt;br /&gt;
|-&lt;br /&gt;
| Warm page load ||  || browser started and stabilized/idle, same profile dir as previous, site already loaded once, any click-throughs clicked  || &lt;br /&gt;
|-&lt;br /&gt;
| Reload ||  || To re-request the rendering of a document. This may mean re-retrieving the entire document and any of its resources off of the network, or might mean reloading the resources out of a local cache.  || &lt;br /&gt;
|-&lt;br /&gt;
| Backwards/Forwards navigation ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| Level 1 cookie blocking || Tracking Protection ||  || &lt;br /&gt;
|-&lt;br /&gt;
| Level 2 cookie blocking || Tracking Protection ||  || &lt;br /&gt;
|-&lt;br /&gt;
| Level 1 content blocking || Tracking Protection||  || &lt;br /&gt;
|-&lt;br /&gt;
| Level 2 content blocking || Tracking Protection ||  || &lt;br /&gt;
|-&lt;br /&gt;
|  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Responsiveness (mobile vs Desktop) ===&lt;br /&gt;
&lt;br /&gt;
====Scroll====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Term !! Metadata !! Definition !! Relevant Links&lt;br /&gt;
|-&lt;br /&gt;
| Checkerboarding || Metrics || Checkerboarding occurs when Gecko is unable to paint the viewable portion of a webpage while we&#039;re scrolling. Instead, we just paint a color instead of the content. || &lt;br /&gt;
|-&lt;br /&gt;
| Velocity || Metrics || || &lt;br /&gt;
|-&lt;br /&gt;
| Touch|| Variations || || &lt;br /&gt;
|-&lt;br /&gt;
| Keyboard || Variations || || &lt;br /&gt;
|-&lt;br /&gt;
| Mouse/UI || Variations || || &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Browser====&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Term !! Metadata !! Desktop Definition !! Mobile Definition !! Relevant Links&lt;br /&gt;
|-&lt;br /&gt;
| Pageload Jank || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| Time to first blank || Open || The time from process start to display the very first painted frame. On Windows, this is currently a white rectangle, which we consider &amp;quot;first blank&amp;quot; || N/A ||&lt;br /&gt;
|-&lt;br /&gt;
| Time to first chrome paint || Open || The time from process start to displaying the first frame of the browser UI (not including the content area) || N/A ||&lt;br /&gt;
|-&lt;br /&gt;
| Time to settled about:home || Open || The time from process start to displaying a fully loaded about:home || N/A ||&lt;br /&gt;
|-&lt;br /&gt;
| Fresh profile || Open || new profile dir, user.js, first time network requests || Application process starts for the very first time. This includes onboarding, but no migration.  ||&lt;br /&gt;
|-&lt;br /&gt;
| Cold start || Open || The browser is started when it hasn&#039;t already been started in this operating system session, so the disk cache is empty. For example, the first time that Firefox starts up after the operating system boots is a cold start. || Application process is not running. Not a first run, and no onboarding. The application is started either via the homescreen or applink. In GPlay terminology, there&#039;s no stored state (i.e. no `onSaveInstanceState` bundles)  When the Fenix team measures cold start times, the generally measure from process start to visual completeness of the homescreen. ||&lt;br /&gt;
|-&lt;br /&gt;
| Warm start || Open || The browser starts when a previous instance of the browser was already started and shutdown within the same operating system session. || Application process is running, but the HomeActivity is not. The application is started either via the homescreen or applink. In GPlay terminology, &amp;quot;warm start&amp;quot; includes many situations and is not well defined. For example, it also includes if the app process is killed but there are `onSaveInstance` state bundles (which seems closer to Cold start)&lt;br /&gt;
&#039;&#039;&#039;This is not currently measured by the Fenix team.&#039;&#039;&#039; &lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
| Hot start || Open || Depending on user settings this will either open new window or new tab || Application process is running, HomeActivity is also running. The application is started either via the homescreen or applink, which brings the HomeActivity to the foreground.&lt;br /&gt;
&lt;br /&gt;
In GPlay terminology, `onTrimMemory` may or may not have been called)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;This is not currently measured by the Fenix team.&#039;&#039;&#039; &lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
| Delete history on close || Close || A non-default configuration that has Firefox forget all user browsing history on shut down. || N/A ||&lt;br /&gt;
|-&lt;br /&gt;
| From crash || Session Restore || || N/A ||&lt;br /&gt;
|-&lt;br /&gt;
| User initiated || Session Restore || || N/A ||&lt;br /&gt;
|- &lt;br /&gt;
| App link || Variations || N/A || ||&lt;br /&gt;
|-&lt;br /&gt;
| With WebExtension-&amp;gt;Theme || Variations || At least one or more WebExtension themes is installed, and one is enabled. || ||&lt;br /&gt;
|-&lt;br /&gt;
| With WebExtension-&amp;gt;Addon || Variations || At least one or more WebExtension addon is installed and enabled. || ||&lt;br /&gt;
|-&lt;br /&gt;
| Secure Proxy || Variations || The &amp;quot;Firefox Private Network&amp;quot; WebExtension. || ||&lt;br /&gt;
|-&lt;br /&gt;
| Time to interface change complete || UI || Click on a &amp;quot;share&amp;quot; button and the delay to when the display is shown. || ||&lt;br /&gt;
|-&lt;br /&gt;
| Open || Window || To open a new browser window.|| N/A ||&lt;br /&gt;
|-&lt;br /&gt;
| Close || Window || To close a new browser window. || N/A ||&lt;br /&gt;
|-&lt;br /&gt;
| Switch|| Window || To switch focus from one browser window to another. || N/A ||&lt;br /&gt;
|-&lt;br /&gt;
| Resize || Window || To resize a browser window. || N/A ||&lt;br /&gt;
|-&lt;br /&gt;
| Open || Tab || To open a new browser tab. || ||&lt;br /&gt;
|-&lt;br /&gt;
| Close || Tab || To close a new browser tab. || ||&lt;br /&gt;
|-&lt;br /&gt;
| Switch || Tab || To switch from one browser tab to another within the same window. || ||&lt;br /&gt;
|-&lt;br /&gt;
| Open || Menu || To open one of Firefox&#039;s built in toolbar menus or context menu. || ||&lt;br /&gt;
|-&lt;br /&gt;
| Close || Menu || To close one of Firefox&#039;s built in toolbar menus or context menu. || ||&lt;br /&gt;
|-&lt;br /&gt;
| Touch || Input || Input from the user via a touchscreen. || ||&lt;br /&gt;
|-&lt;br /&gt;
| Keyboard|| Input || Input from the user via the keyboard. || ||&lt;br /&gt;
|-&lt;br /&gt;
| Mouse || Input || Input from the user via a mouse. || ||&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Resource===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Term !! Metadata !! Definition !! Relevant Links&lt;br /&gt;
|-&lt;br /&gt;
| Memory || || || &lt;br /&gt;
|-&lt;br /&gt;
| Power || || || &lt;br /&gt;
|-&lt;br /&gt;
| CPU || || || &lt;br /&gt;
|-&lt;br /&gt;
| GPU || || || &lt;br /&gt;
|-&lt;br /&gt;
| Disk || || || &lt;br /&gt;
|-&lt;br /&gt;
| Network || || || &lt;br /&gt;
|-&lt;br /&gt;
| App idle in foreground || Network variations || || &lt;br /&gt;
|-&lt;br /&gt;
| App idle in background ||  Network variations || || &lt;br /&gt;
|-&lt;br /&gt;
| Audio || Media || || &lt;br /&gt;
|-&lt;br /&gt;
| Dropped Frame || Video|| || &lt;br /&gt;
|-&lt;br /&gt;
| Resolution Change || Media || || &lt;br /&gt;
|-&lt;br /&gt;
| Stall length || Media || || &lt;br /&gt;
|-&lt;br /&gt;
| AV sync || Media || || &lt;br /&gt;
|-&lt;br /&gt;
| Number of stalls || Media || || &lt;br /&gt;
|-&lt;br /&gt;
| AV sync || Media || || &lt;br /&gt;
|-&lt;br /&gt;
| Time to payback state change || Media || || &lt;br /&gt;
|-&lt;br /&gt;
| Real Time Communication (RTC) || Media || || &lt;br /&gt;
|-&lt;br /&gt;
| Frame per second (FPS) || Virtual Reality (VR) || || &lt;br /&gt;
|-&lt;br /&gt;
| Visual Distortion || Virtual Reality (VR) || || &lt;br /&gt;
|-&lt;br /&gt;
| Z-fighting || Virtual Reality (VR) || || &lt;br /&gt;
|-&lt;br /&gt;
| Judder || Virtual Reality (VR) || || &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Components===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Term !! Metadata !! Definition !! Relevant Links&lt;br /&gt;
|-&lt;br /&gt;
| Graphics || || || &lt;br /&gt;
|-&lt;br /&gt;
| Layout || || || &lt;br /&gt;
|-&lt;br /&gt;
| Parsing || Javascript || || [[JavaScript]&lt;br /&gt;
|-&lt;br /&gt;
| Compilation || Javascript || || [[JavaScript]]&lt;br /&gt;
|-&lt;br /&gt;
| Network || || || [[Networking]]&lt;br /&gt;
|-&lt;br /&gt;
| DOM || || || [[DOM]]&lt;br /&gt;
|-&lt;br /&gt;
| Storage || || || [[Storage]]&lt;br /&gt;
|-&lt;br /&gt;
| Media || || || [[Media]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=Mozilla specific terms=&lt;br /&gt;
&lt;br /&gt;
== Backfill ==&lt;br /&gt;
Trigger skipped jobs (Treeherder terminology).&lt;br /&gt;
Also refers to filling in missing data points from Perfherder&#039;s [https://treeherder.mozilla.org/perf.html#/graphs Graphs view].&lt;br /&gt;
&lt;br /&gt;
== Data point ==&lt;br /&gt;
Performance metric value visible in Perfherder&#039;s [https://treeherder.mozilla.org/perf.html#/graphs Graph view].&lt;br /&gt;
[[File:Data point.png|700px|none|left|Selected data point]]&lt;br /&gt;
&lt;br /&gt;
== DOM Content Flushed (dcf) ==&lt;br /&gt;
This is a Mozilla proprietary extension and not part of the performance/navigation timing specification. It marks the completion of the first presentation flush after DOMContentLoaded.&lt;br /&gt;
Internal Firefox metric activated by setting the preference dom.performance.time_to_dom_content_flushed.enabled to true.&lt;br /&gt;
&lt;br /&gt;
== Downstream ==&lt;br /&gt;
Alert triggered by a commit that originally happened on another repo and was merged into the current one after.&lt;br /&gt;
&lt;br /&gt;
== First Non-Blank Paint (fnbpaint) ==&lt;br /&gt;
The timestamp of a shipped frame that contains the first paint to draw more than the document background.&lt;br /&gt;
Has low value to a user, as this paint may be completely meaningless or useless. The first non-blank paint is often represented as &amp;quot;Start Render&amp;quot; in performance products.&lt;br /&gt;
&lt;br /&gt;
== Gecko profile ==&lt;br /&gt;
The Firefox Profiler is a profiler that is built into Firefox and is available at profiler.firefox.com. It has tighter integration with Firefox than external profilers, and has more of a platform focus that the DevTools performance panel. It can be used a variety of situations where external profilers are not available, and can provide more information and insight into what the browser is doing.&lt;br /&gt;
&lt;br /&gt;
== mitmproxy ==&lt;br /&gt;
[https://mitmproxy.org/ Mitmproxy] is a third-party open-source tool ([https://github.com/mitmproxy/mitmproxy found here in github]) that allows the recording of a live web page and saving it as a playback archive. Using Mitmproxy&#039;s &#039;mitmdump&#039; tool, the recorded page can be played back through a local proxy browser proxy; then browsing to the URL loads the page from the mitmproxy recording instead of the live site. &lt;br /&gt;
&lt;br /&gt;
The Raptor performance testing framework uses Mitmproxy for Raptor page-load performance tests. Mitmproxy is available as a python [https://searchfox.org/mozilla-central/source/testing/mozbase/mozproxy mozbase/mozproxy] module for import in any python project.&lt;br /&gt;
&lt;br /&gt;
== Noise (regarding performance tests) ==&lt;br /&gt;
Generally a test reports values that are in a range instead of a consistent value. The larger the range of &#039;normal&#039; results, the more noise we have.&lt;br /&gt;
Some tests will post results in a small range, and when we get a data point significantly outside the range, it is easy to identify.&lt;br /&gt;
The problem is that many tests have a large range of expected results. It makes it hard to determine what a regression is when we might have a range += 4% from the median and we have a 3% regression. It is obvious in the graph over time, but hard to tell until you have many future data points.&lt;br /&gt;
&lt;br /&gt;
== Perf Sheriff ==&lt;br /&gt;
Using perfherder, a perf-sheriff will perform these tasks:&lt;br /&gt;
# Look at the graph and determine the original branch, date, revision where the alert occurred&lt;br /&gt;
# Look at Treeherder and determine if we have all the data.&lt;br /&gt;
# Retrigger jobs if needed (more noise, more retriggers)&lt;br /&gt;
# Once you have more data, look at the data in compare view to see if other tests/platforms have changed&lt;br /&gt;
# Add all related alerts you see to the summary with the reassign button&lt;br /&gt;
&lt;br /&gt;
== Perfherder ==&lt;br /&gt;
Perfherder is an interactive dashboard intended to allow monitoring and analysis of automated performance tests run against &#039;&#039;&#039;Mozilla&#039;&#039;&#039; products (currently Firefox and Firefox for Android).&lt;br /&gt;
&lt;br /&gt;
== Raptor ==&lt;br /&gt;
Raptor is a performance testing framework used for running browser page-load and browser benchmark tests. Raptor can run performance tests on Firefox desktop, Firefox android (Fennec, Geckoview example app, and the android components Reference Browser), and Google Chrome/Chromium. For more information please refer to [https://wiki.mozilla.org/Performance_sheriffing/Raptor the Raptor wiki page.]&lt;br /&gt;
&lt;br /&gt;
==RelMan glossary==&lt;br /&gt;
[https://wiki.mozilla.org/Release_Management/Glossary These terms] are of use, especially when doing Performance sheriffing.&lt;br /&gt;
&lt;br /&gt;
== Retrigger ==&lt;br /&gt;
Any run of the same job on the same commit for the same repo triggered after the first one.&lt;br /&gt;
Retriggers usually happen when the available datapoint in the graph are not enough for the sheriff to determine the culprit.&lt;br /&gt;
&lt;br /&gt;
== SETA ==&lt;br /&gt;
SETA finds the minimum set of jobs to run in order to catch all failures that our automation has found in the recent past on Firefox development repositories. &lt;br /&gt;
SETA creates job priorities for all jobs found in the runnable-jobs API for that repository.&lt;br /&gt;
&lt;br /&gt;
== Talos ==&lt;br /&gt;
Talos is our versatile performance testing framework we use at &#039;&#039;&#039;Mozilla&#039;&#039;&#039;. It was created to serve as a test runner for the existing performance tests that &#039;&#039;&#039;Mozilla&#039;&#039;&#039; was running back in 2007 as well as providing an extensible framework for new tests as they were created.&lt;br /&gt;
&lt;br /&gt;
== Treeherder ==&lt;br /&gt;
Treeherder is a reporting dashboard for Mozilla checkins. It allows users to see the results of automatic builds and their respective tests. The Treeherder service manages the etl layer for data ingestion, web services, and the data model behind Treeherder.&lt;br /&gt;
&lt;br /&gt;
== Time To First Interactive (ttfi) ==&lt;br /&gt;
This is a newer metric and reports when the page is first expected to be usable and will respond to input quickly (with the possibility of slow responses as more content loads).&lt;br /&gt;
# Start looking for First Interactive at first contentful paint&lt;br /&gt;
# Look for the first interactive window (with no regard to in-flight requests)&lt;br /&gt;
# First Interactive is the start of the interactive window from step 2, first contentful paint or DOM Content Loaded, whichever is later&lt;br /&gt;
&lt;br /&gt;
== R/b ==&lt;br /&gt;
Short name for retrigger/backfill.&lt;br /&gt;
&lt;br /&gt;
== WebPageTest ==&lt;br /&gt;
Accurately measure, track, and report on key Firefox-performance metrics, over time.&lt;/div&gt;</summary>
		<author><name>Kmoir</name></author>
	</entry>
	<entry>
		<id>https://wiki.mozilla.org/index.php?title=Performance/Glossary&amp;diff=1229889</id>
		<title>Performance/Glossary</title>
		<link rel="alternate" type="text/html" href="https://wiki.mozilla.org/index.php?title=Performance/Glossary&amp;diff=1229889"/>
		<updated>2020-08-07T18:10:25Z</updated>

		<summary type="html">&lt;p&gt;Kmoir: /* First Contentful Paint (fcp) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Classification of user actions/flows that will be perceived as task with discrete performance expectations and settings/configurations that affect the raw performance of those tasks.&lt;br /&gt;
&lt;br /&gt;
==Pageload==&lt;br /&gt;
&lt;br /&gt;
=== Metrics ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Term !! Metadata !! Definition !! Relevant Links&lt;br /&gt;
|-&lt;br /&gt;
| || || One or two sentences || &lt;br /&gt;
* Full definition&lt;br /&gt;
* Related tests/coverage&lt;br /&gt;
* Results&lt;br /&gt;
* User research&lt;br /&gt;
|-&lt;br /&gt;
| SpeedIndex || Visual || (SI) is a page load performance metric that shows you how quickly the contents of a page are visibly populated. It is the average time at which visible parts of the page are displayed. Expressed in milliseconds, and dependent on the size of the viewport, the lower the score, the better.  ||[https://developer.mozilla.org/en-US/docs/Glossary/Speed_index MDN Documentation] &lt;br /&gt;
|-&lt;br /&gt;
| Contentful SpeedIndex || Visual || This metric uses edge detection to calculate the amount of “content” that is visible on each frame. It was designed to have a good metric to measure the amount of text that is visible and ignore the impact of popup or login screens at the end of a page load. || [https://www.sitespeed.io/documentation/sitespeed.io/metrics/#contentful-speed-index sitespeed.io documentation]&lt;br /&gt;
|-&lt;br /&gt;
|  Perceptual SpeedIndex || Visual || A metric that measures the above-the-fold visual performance of a webpage, while accounting for the layout stability.  || * [http://www.parvez-ahammad.org/blog/perceptual-speed-index-psi-for-measuring-above-fold-visual-performance-of-webpages Perceptual Speed Index (PSI) for measuring above-fold visual performance of webpages] &lt;br /&gt;
* [https://github.com/WPO-Foundation/visualmetrics Visual metrics github repo]&lt;br /&gt;
|-&lt;br /&gt;
| Visual Completeness || Visual  || The point in time when a web browser has finished rendering viewable content in the viewport, but not the entire page. || &lt;br /&gt;
|-&lt;br /&gt;
| First Paint event || Standard || The time between navigation and when the browser renders the first pixels to the screen, rendering anything that is visually different from what was on the screen prior to navigation.  || [https://developer.mozilla.org/en-US/docs/Glossary/First_paint MDN documentation]&lt;br /&gt;
|-&lt;br /&gt;
| First Contentful Paint || Standard || How long it takes the browser to render the first bit of content from the DOM providing the first feedback to the user the page is actually loading. || [https://developer.mozilla.org/en-US/docs/Glossary/First_contentful_paint MDN documentation]&lt;br /&gt;
|-&lt;br /&gt;
| DOMContentLoaded event || Standard || A DOM event that is fired once the underlying document has finished being parsed and loaded, but before any of its additional resources (stylesheets, images, subframes) have finished loading. || [https://developer.mozilla.org/en-US/docs/Web/API/Window/DOMContent MDN documentation]&lt;br /&gt;
|-&lt;br /&gt;
|  Onload event || Standard || A DOM event that is fired once the underlying document has finished loading, including all of its stylesheets, images and subframes. This does not include additional resources that start to load due to script. || [https://developer.mozilla.org/en-US/docs/Web/API/Window/load_event MDN Documentation]&lt;br /&gt;
|-&lt;br /&gt;
| Time to Interactive || Proposed standard || (TTI) is a non-standardized web performance &#039;progress&#039; metric defined as the point in time when the last Long Task finished and was followed by 5 seconds of network and main thread inactivity.&lt;br /&gt;
    &lt;br /&gt;
# The page has displayed useful content&lt;br /&gt;
# Event handlers are registered for most visible page elements&lt;br /&gt;
# When a user interacts with the page, the page consistently responds within 50ms - the user does not experience jank.&lt;br /&gt;
 || &lt;br /&gt;
* [https://developer.mozilla.org/en-US/docs/Glossary/Time_to_interactive MDN Documentation]&lt;br /&gt;
* [https://github.com/WICG/time-to-interactive Proposed web standard]&lt;br /&gt;
|-&lt;br /&gt;
| Cold page load ||  || browser started and stabilized/idle, same profile dir as previous, site not loaded or cache cleared  || &lt;br /&gt;
|-&lt;br /&gt;
| Warm page load ||  || browser started and stabilized/idle, same profile dir as previous, site already loaded once, any click-throughs clicked  || &lt;br /&gt;
|-&lt;br /&gt;
| Reload ||  || To re-request the rendering of a document. This may mean re-retrieving the entire document and any of its resources off of the network, or might mean reloading the resources out of a local cache.  || &lt;br /&gt;
|-&lt;br /&gt;
| Backwards/Forwards navigation ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| Level 1 cookie blocking || Tracking Protection ||  || &lt;br /&gt;
|-&lt;br /&gt;
| Level 2 cookie blocking || Tracking Protection ||  || &lt;br /&gt;
|-&lt;br /&gt;
| Level 1 content blocking || Tracking Protection||  || &lt;br /&gt;
|-&lt;br /&gt;
| Level 2 content blocking || Tracking Protection ||  || &lt;br /&gt;
|-&lt;br /&gt;
|  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Responsiveness (mobile vs Desktop) ===&lt;br /&gt;
&lt;br /&gt;
====Scroll====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Term !! Metadata !! Definition !! Relevant Links&lt;br /&gt;
|-&lt;br /&gt;
| Checkerboarding || Metrics || Checkerboarding occurs when Gecko is unable to paint the viewable portion of a webpage while we&#039;re scrolling. Instead, we just paint a color instead of the content. || &lt;br /&gt;
|-&lt;br /&gt;
| Velocity || Metrics || || &lt;br /&gt;
|-&lt;br /&gt;
| Touch|| Variations || || &lt;br /&gt;
|-&lt;br /&gt;
| Keyboard || Variations || || &lt;br /&gt;
|-&lt;br /&gt;
| Mouse/UI || Variations || || &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Browser====&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Term !! Metadata !! Desktop Definition !! Mobile Definition !! Relevant Links&lt;br /&gt;
|-&lt;br /&gt;
| Pageload Jank || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| Time to first blank || Open || The time from process start to display the very first painted frame. On Windows, this is currently a white rectangle, which we consider &amp;quot;first blank&amp;quot; || N/A ||&lt;br /&gt;
|-&lt;br /&gt;
| Time to first chrome paint || Open || The time from process start to displaying the first frame of the browser UI (not including the content area) || N/A ||&lt;br /&gt;
|-&lt;br /&gt;
| Time to settled about:home || Open || The time from process start to displaying a fully loaded about:home || N/A ||&lt;br /&gt;
|-&lt;br /&gt;
| Fresh profile || Open || new profile dir, user.js, first time network requests || Application process starts for the very first time. This includes onboarding, but no migration.  ||&lt;br /&gt;
|-&lt;br /&gt;
| Cold start || Open || The browser is started when it hasn&#039;t already been started in this operating system session, so the disk cache is empty. For example, the first time that Firefox starts up after the operating system boots is a cold start. || Application process is not running. Not a first run, and no onboarding. The application is started either via the homescreen or applink. In GPlay terminology, there&#039;s no stored state (i.e. no `onSaveInstanceState` bundles)  When the Fenix team measures cold start times, the generally measure from process start to visual completeness of the homescreen. ||&lt;br /&gt;
|-&lt;br /&gt;
| Warm start || Open || The browser starts when a previous instance of the browser was already started and shutdown within the same operating system session. || Application process is running, but the HomeActivity is not. The application is started either via the homescreen or applink. In GPlay terminology, &amp;quot;warm start&amp;quot; includes many situations and is not well defined. For example, it also includes if the app process is killed but there are `onSaveInstance` state bundles (which seems closer to Cold start)&lt;br /&gt;
&#039;&#039;&#039;This is not currently measured by the Fenix team.&#039;&#039;&#039; &lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
| Hot start || Open || Depending on user settings this will either open new window or new tab || Application process is running, HomeActivity is also running. The application is started either via the homescreen or applink, which brings the HomeActivity to the foreground.&lt;br /&gt;
&lt;br /&gt;
In GPlay terminology, `onTrimMemory` may or may not have been called)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;This is not currently measured by the Fenix team.&#039;&#039;&#039; &lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
| Delete history on close || Close || A non-default configuration that has Firefox forget all user browsing history on shut down. || N/A ||&lt;br /&gt;
|-&lt;br /&gt;
| From crash || Session Restore || || N/A ||&lt;br /&gt;
|-&lt;br /&gt;
| User initiated || Session Restore || || N/A ||&lt;br /&gt;
|- &lt;br /&gt;
| App link || Variations || N/A || ||&lt;br /&gt;
|-&lt;br /&gt;
| With WebExtension-&amp;gt;Theme || Variations || At least one or more WebExtension themes is installed, and one is enabled. || ||&lt;br /&gt;
|-&lt;br /&gt;
| With WebExtension-&amp;gt;Addon || Variations || At least one or more WebExtension addon is installed and enabled. || ||&lt;br /&gt;
|-&lt;br /&gt;
| Secure Proxy || Variations || The &amp;quot;Firefox Private Network&amp;quot; WebExtension. || ||&lt;br /&gt;
|-&lt;br /&gt;
| Time to interface change complete || UI || Click on a &amp;quot;share&amp;quot; button and the delay to when the display is shown. || ||&lt;br /&gt;
|-&lt;br /&gt;
| Open || Window || To open a new browser window.|| N/A ||&lt;br /&gt;
|-&lt;br /&gt;
| Close || Window || To close a new browser window. || N/A ||&lt;br /&gt;
|-&lt;br /&gt;
| Switch|| Window || To switch focus from one browser window to another. || N/A ||&lt;br /&gt;
|-&lt;br /&gt;
| Resize || Window || To resize a browser window. || N/A ||&lt;br /&gt;
|-&lt;br /&gt;
| Open || Tab || To open a new browser tab. || ||&lt;br /&gt;
|-&lt;br /&gt;
| Close || Tab || To close a new browser tab. || ||&lt;br /&gt;
|-&lt;br /&gt;
| Switch || Tab || To switch from one browser tab to another within the same window. || ||&lt;br /&gt;
|-&lt;br /&gt;
| Open || Menu || To open one of Firefox&#039;s built in toolbar menus or context menu. || ||&lt;br /&gt;
|-&lt;br /&gt;
| Close || Menu || To close one of Firefox&#039;s built in toolbar menus or context menu. || ||&lt;br /&gt;
|-&lt;br /&gt;
| Touch || Input || Input from the user via a touchscreen. || ||&lt;br /&gt;
|-&lt;br /&gt;
| Keyboard|| Input || Input from the user via the keyboard. || ||&lt;br /&gt;
|-&lt;br /&gt;
| Mouse || Input || Input from the user via a mouse. || ||&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Resource===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Term !! Metadata !! Definition !! Relevant Links&lt;br /&gt;
|-&lt;br /&gt;
| Memory || || || &lt;br /&gt;
|-&lt;br /&gt;
| Power || || || &lt;br /&gt;
|-&lt;br /&gt;
| CPU || || || &lt;br /&gt;
|-&lt;br /&gt;
| GPU || || || &lt;br /&gt;
|-&lt;br /&gt;
| Disk || || || &lt;br /&gt;
|-&lt;br /&gt;
| Network || || || &lt;br /&gt;
|-&lt;br /&gt;
| App idle in foreground || Network variations || || &lt;br /&gt;
|-&lt;br /&gt;
| App idle in background ||  Network variations || || &lt;br /&gt;
|-&lt;br /&gt;
| Audio || Media || || &lt;br /&gt;
|-&lt;br /&gt;
| Dropped Frame || Video|| || &lt;br /&gt;
|-&lt;br /&gt;
| Resolution Change || Media || || &lt;br /&gt;
|-&lt;br /&gt;
| Stall length || Media || || &lt;br /&gt;
|-&lt;br /&gt;
| AV sync || Media || || &lt;br /&gt;
|-&lt;br /&gt;
| Number of stalls || Media || || &lt;br /&gt;
|-&lt;br /&gt;
| AV sync || Media || || &lt;br /&gt;
|-&lt;br /&gt;
| Time to payback state change || Media || || &lt;br /&gt;
|-&lt;br /&gt;
| Real Time Communication (RTC) || Media || || &lt;br /&gt;
|-&lt;br /&gt;
| Frame per second (FPS) || Virtual Reality (VR) || || &lt;br /&gt;
|-&lt;br /&gt;
| Visual Distortion || Virtual Reality (VR) || || &lt;br /&gt;
|-&lt;br /&gt;
| Z-fighting || Virtual Reality (VR) || || &lt;br /&gt;
|-&lt;br /&gt;
| Judder || Virtual Reality (VR) || || &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Components===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Term !! Metadata !! Definition !! Relevant Links&lt;br /&gt;
|-&lt;br /&gt;
| Graphics || || || &lt;br /&gt;
|-&lt;br /&gt;
| Layout || || || &lt;br /&gt;
|-&lt;br /&gt;
| Parsing || Javascript || || [[JavaScript]&lt;br /&gt;
|-&lt;br /&gt;
| Compilation || Javascript || || [[JavaScript]]&lt;br /&gt;
|-&lt;br /&gt;
| Network || || || [[Networking]]&lt;br /&gt;
|-&lt;br /&gt;
| DOM || || || [[DOM]]&lt;br /&gt;
|-&lt;br /&gt;
| Storage || || || [[Storage]]&lt;br /&gt;
|-&lt;br /&gt;
| Media || || || [[Media]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Backfill ==&lt;br /&gt;
Trigger skipped jobs (Treeherder terminology).&lt;br /&gt;
Also refers to filling in missing data points from Perfherder&#039;s [https://treeherder.mozilla.org/perf.html#/graphs Graphs view].&lt;br /&gt;
&lt;br /&gt;
== Data point ==&lt;br /&gt;
Performance metric value visible in Perfherder&#039;s [https://treeherder.mozilla.org/perf.html#/graphs Graph view].&lt;br /&gt;
[[File:Data point.png|700px|none|left|Selected data point]]&lt;br /&gt;
&lt;br /&gt;
== DOM Content Flushed (dcf) ==&lt;br /&gt;
This is a Mozilla proprietary extension and not part of the performance/navigation timing specification. It marks the completion of the first presentation flush after DOMContentLoaded.&lt;br /&gt;
Internal Firefox metric activated by setting the preference dom.performance.time_to_dom_content_flushed.enabled to true.&lt;br /&gt;
&lt;br /&gt;
== Downstream ==&lt;br /&gt;
Alert triggered by a commit that originally happened on another repo and was merged into the current one after.&lt;br /&gt;
&lt;br /&gt;
== First Non-Blank Paint (fnbpaint) ==&lt;br /&gt;
The timestamp of a shipped frame that contains the first paint to draw more than the document background.&lt;br /&gt;
Has low value to a user, as this paint may be completely meaningless or useless. The first non-blank paint is often represented as &amp;quot;Start Render&amp;quot; in performance products.&lt;br /&gt;
&lt;br /&gt;
== Gecko profile ==&lt;br /&gt;
The Firefox Profiler is a profiler that is built into Firefox and is available at profiler.firefox.com. It has tighter integration with Firefox than external profilers, and has more of a platform focus that the DevTools performance panel. It can be used a variety of situations where external profilers are not available, and can provide more information and insight into what the browser is doing.&lt;br /&gt;
&lt;br /&gt;
== mitmproxy ==&lt;br /&gt;
[https://mitmproxy.org/ Mitmproxy] is a third-party open-source tool ([https://github.com/mitmproxy/mitmproxy found here in github]) that allows the recording of a live web page and saving it as a playback archive. Using Mitmproxy&#039;s &#039;mitmdump&#039; tool, the recorded page can be played back through a local proxy browser proxy; then browsing to the URL loads the page from the mitmproxy recording instead of the live site. &lt;br /&gt;
&lt;br /&gt;
The Raptor performance testing framework uses Mitmproxy for Raptor page-load performance tests. Mitmproxy is available as a python [https://searchfox.org/mozilla-central/source/testing/mozbase/mozproxy mozbase/mozproxy] module for import in any python project.&lt;br /&gt;
&lt;br /&gt;
== Noise (regarding performance tests) ==&lt;br /&gt;
Generally a test reports values that are in a range instead of a consistent value. The larger the range of &#039;normal&#039; results, the more noise we have.&lt;br /&gt;
Some tests will post results in a small range, and when we get a data point significantly outside the range, it is easy to identify.&lt;br /&gt;
The problem is that many tests have a large range of expected results. It makes it hard to determine what a regression is when we might have a range += 4% from the median and we have a 3% regression. It is obvious in the graph over time, but hard to tell until you have many future data points.&lt;br /&gt;
&lt;br /&gt;
== Perf Sheriff ==&lt;br /&gt;
Using perfherder, a perf-sheriff will perform these tasks:&lt;br /&gt;
# Look at the graph and determine the original branch, date, revision where the alert occurred&lt;br /&gt;
# Look at Treeherder and determine if we have all the data.&lt;br /&gt;
# Retrigger jobs if needed (more noise, more retriggers)&lt;br /&gt;
# Once you have more data, look at the data in compare view to see if other tests/platforms have changed&lt;br /&gt;
# Add all related alerts you see to the summary with the reassign button&lt;br /&gt;
&lt;br /&gt;
== Perfherder ==&lt;br /&gt;
Perfherder is an interactive dashboard intended to allow monitoring and analysis of automated performance tests run against &#039;&#039;&#039;Mozilla&#039;&#039;&#039; products (currently Firefox and Firefox for Android).&lt;br /&gt;
&lt;br /&gt;
== Raptor ==&lt;br /&gt;
Raptor is a performance testing framework used for running browser page-load and browser benchmark tests. Raptor can run performance tests on Firefox desktop, Firefox android (Fennec, Geckoview example app, and the android components Reference Browser), and Google Chrome/Chromium. For more information please refer to [https://wiki.mozilla.org/Performance_sheriffing/Raptor the Raptor wiki page.]&lt;br /&gt;
&lt;br /&gt;
==RelMan glossary==&lt;br /&gt;
[https://wiki.mozilla.org/Release_Management/Glossary These terms] are of use, especially when doing Performance sheriffing.&lt;br /&gt;
&lt;br /&gt;
== Retrigger ==&lt;br /&gt;
Any run of the same job on the same commit for the same repo triggered after the first one.&lt;br /&gt;
Retriggers usually happen when the available datapoint in the graph are not enough for the sheriff to determine the culprit.&lt;br /&gt;
&lt;br /&gt;
== SETA ==&lt;br /&gt;
SETA finds the minimum set of jobs to run in order to catch all failures that our automation has found in the recent past on Firefox development repositories. &lt;br /&gt;
SETA creates job priorities for all jobs found in the runnable-jobs API for that repository.&lt;br /&gt;
&lt;br /&gt;
== Talos ==&lt;br /&gt;
Talos is our versatile performance testing framework we use at &#039;&#039;&#039;Mozilla&#039;&#039;&#039;. It was created to serve as a test runner for the existing performance tests that &#039;&#039;&#039;Mozilla&#039;&#039;&#039; was running back in 2007 as well as providing an extensible framework for new tests as they were created.&lt;br /&gt;
&lt;br /&gt;
== Treeherder ==&lt;br /&gt;
Treeherder is a reporting dashboard for Mozilla checkins. It allows users to see the results of automatic builds and their respective tests. The Treeherder service manages the etl layer for data ingestion, web services, and the data model behind Treeherder.&lt;br /&gt;
&lt;br /&gt;
== Time To First Interactive (ttfi) ==&lt;br /&gt;
This is a newer metric and reports when the page is first expected to be usable and will respond to input quickly (with the possibility of slow responses as more content loads).&lt;br /&gt;
# Start looking for First Interactive at first contentful paint&lt;br /&gt;
# Look for the first interactive window (with no regard to in-flight requests)&lt;br /&gt;
# First Interactive is the start of the interactive window from step 2, first contentful paint or DOM Content Loaded, whichever is later&lt;br /&gt;
&lt;br /&gt;
== R/b ==&lt;br /&gt;
Short name for retrigger/backfill.&lt;br /&gt;
&lt;br /&gt;
== WebPageTest ==&lt;br /&gt;
Accurately measure, track, and report on key Firefox-performance metrics, over time.&lt;/div&gt;</summary>
		<author><name>Kmoir</name></author>
	</entry>
	<entry>
		<id>https://wiki.mozilla.org/index.php?title=Performance/Glossary&amp;diff=1229816</id>
		<title>Performance/Glossary</title>
		<link rel="alternate" type="text/html" href="https://wiki.mozilla.org/index.php?title=Performance/Glossary&amp;diff=1229816"/>
		<updated>2020-08-05T21:07:21Z</updated>

		<summary type="html">&lt;p&gt;Kmoir: merge content from TestEngineering/Performance/Glossary in&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Classification of user actions/flows that will be perceived as task with discrete performance expectations and settings/configurations that affect the raw performance of those tasks.&lt;br /&gt;
&lt;br /&gt;
==Pageload==&lt;br /&gt;
&lt;br /&gt;
=== Metrics ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Term !! Metadata !! Definition !! Relevant Links&lt;br /&gt;
|-&lt;br /&gt;
| || || One or two sentences || &lt;br /&gt;
* Full definition&lt;br /&gt;
* Related tests/coverage&lt;br /&gt;
* Results&lt;br /&gt;
* User research&lt;br /&gt;
|-&lt;br /&gt;
| SpeedIndex || Visual || (SI) is a page load performance metric that shows you how quickly the contents of a page are visibly populated. It is the average time at which visible parts of the page are displayed. Expressed in milliseconds, and dependent on the size of the viewport, the lower the score, the better.  ||[https://developer.mozilla.org/en-US/docs/Glossary/Speed_index MDN Documentation] &lt;br /&gt;
|-&lt;br /&gt;
| Contentful SpeedIndex || Visual || This metric uses edge detection to calculate the amount of “content” that is visible on each frame. It was designed to have a good metric to measure the amount of text that is visible and ignore the impact of popup or login screens at the end of a page load. || [https://www.sitespeed.io/documentation/sitespeed.io/metrics/#contentful-speed-index sitespeed.io documentation]&lt;br /&gt;
|-&lt;br /&gt;
|  Perceptual SpeedIndex || Visual || A metric that measures the above-the-fold visual performance of a webpage, while accounting for the layout stability.  || * [http://www.parvez-ahammad.org/blog/perceptual-speed-index-psi-for-measuring-above-fold-visual-performance-of-webpages Perceptual Speed Index (PSI) for measuring above-fold visual performance of webpages] &lt;br /&gt;
* [https://github.com/WPO-Foundation/visualmetrics Visual metrics github repo]&lt;br /&gt;
|-&lt;br /&gt;
| Visual Completeness || Visual  || The point in time when a web browser has finished rendering viewable content in the viewport, but not the entire page. || &lt;br /&gt;
|-&lt;br /&gt;
| First Paint event || Standard || The time between navigation and when the browser renders the first pixels to the screen, rendering anything that is visually different from what was on the screen prior to navigation.  || [https://developer.mozilla.org/en-US/docs/Glossary/First_paint MDN documentation]&lt;br /&gt;
|-&lt;br /&gt;
| First Contentful Paint || Standard || How long it takes the browser to render the first bit of content from the DOM providing the first feedback to the user the page is actually loading. || [https://developer.mozilla.org/en-US/docs/Glossary/First_contentful_paint MDN documentation]&lt;br /&gt;
|-&lt;br /&gt;
| DOMContentLoaded event || Standard || A DOM event that is fired once the underlying document has finished being parsed and loaded, but before any of its additional resources (stylesheets, images, subframes) have finished loading. || [https://developer.mozilla.org/en-US/docs/Web/API/Window/DOMContent MDN documentation]&lt;br /&gt;
|-&lt;br /&gt;
|  Onload event || Standard || A DOM event that is fired once the underlying document has finished loading, including all of its stylesheets, images and subframes. This does not include additional resources that start to load due to script. || [https://developer.mozilla.org/en-US/docs/Web/API/Window/load_event MDN Documentation]&lt;br /&gt;
|-&lt;br /&gt;
| Time to Interactive || Proposed standard || (TTI) is a non-standardized web performance &#039;progress&#039; metric defined as the point in time when the last Long Task finished and was followed by 5 seconds of network and main thread inactivity.&lt;br /&gt;
    &lt;br /&gt;
# The page has displayed useful content&lt;br /&gt;
# Event handlers are registered for most visible page elements&lt;br /&gt;
# When a user interacts with the page, the page consistently responds within 50ms - the user does not experience jank.&lt;br /&gt;
 || &lt;br /&gt;
* [https://developer.mozilla.org/en-US/docs/Glossary/Time_to_interactive MDN Documentation]&lt;br /&gt;
* [https://github.com/WICG/time-to-interactive Proposed web standard]&lt;br /&gt;
|-&lt;br /&gt;
| Cold page load ||  || browser started and stabilized/idle, same profile dir as previous, site not loaded or cache cleared  || &lt;br /&gt;
|-&lt;br /&gt;
| Warm page load ||  || browser started and stabilized/idle, same profile dir as previous, site already loaded once, any click-throughs clicked  || &lt;br /&gt;
|-&lt;br /&gt;
| Reload ||  || To re-request the rendering of a document. This may mean re-retrieving the entire document and any of its resources off of the network, or might mean reloading the resources out of a local cache.  || &lt;br /&gt;
|-&lt;br /&gt;
| Backwards/Forwards navigation ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| Level 1 cookie blocking || Tracking Protection ||  || &lt;br /&gt;
|-&lt;br /&gt;
| Level 2 cookie blocking || Tracking Protection ||  || &lt;br /&gt;
|-&lt;br /&gt;
| Level 1 content blocking || Tracking Protection||  || &lt;br /&gt;
|-&lt;br /&gt;
| Level 2 content blocking || Tracking Protection ||  || &lt;br /&gt;
|-&lt;br /&gt;
|  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Responsiveness (mobile vs Desktop) ===&lt;br /&gt;
&lt;br /&gt;
====Scroll====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Term !! Metadata !! Definition !! Relevant Links&lt;br /&gt;
|-&lt;br /&gt;
| Checkerboarding || Metrics || Checkerboarding occurs when Gecko is unable to paint the viewable portion of a webpage while we&#039;re scrolling. Instead, we just paint a color instead of the content. || &lt;br /&gt;
|-&lt;br /&gt;
| Velocity || Metrics || || &lt;br /&gt;
|-&lt;br /&gt;
| Touch|| Variations || || &lt;br /&gt;
|-&lt;br /&gt;
| Keyboard || Variations || || &lt;br /&gt;
|-&lt;br /&gt;
| Mouse/UI || Variations || || &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Browser====&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Term !! Metadata !! Desktop Definition !! Mobile Definition !! Relevant Links&lt;br /&gt;
|-&lt;br /&gt;
| Pageload Jank || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| Time to first blank || Open || The time from process start to display the very first painted frame. On Windows, this is currently a white rectangle, which we consider &amp;quot;first blank&amp;quot; || N/A ||&lt;br /&gt;
|-&lt;br /&gt;
| Time to first chrome paint || Open || The time from process start to displaying the first frame of the browser UI (not including the content area) || N/A ||&lt;br /&gt;
|-&lt;br /&gt;
| Time to settled about:home || Open || The time from process start to displaying a fully loaded about:home || N/A ||&lt;br /&gt;
|-&lt;br /&gt;
| Fresh profile || Open || new profile dir, user.js, first time network requests || Application process starts for the very first time. This includes onboarding, but no migration.  ||&lt;br /&gt;
|-&lt;br /&gt;
| Cold start || Open || The browser is started when it hasn&#039;t already been started in this operating system session, so the disk cache is empty. For example, the first time that Firefox starts up after the operating system boots is a cold start. || Application process is not running. Not a first run, and no onboarding. The application is started either via the homescreen or applink. In GPlay terminology, there&#039;s no stored state (i.e. no `onSaveInstanceState` bundles)  When the Fenix team measures cold start times, the generally measure from process start to visual completeness of the homescreen. ||&lt;br /&gt;
|-&lt;br /&gt;
| Warm start || Open || The browser starts when a previous instance of the browser was already started and shutdown within the same operating system session. || Application process is running, but the HomeActivity is not. The application is started either via the homescreen or applink. In GPlay terminology, &amp;quot;warm start&amp;quot; includes many situations and is not well defined. For example, it also includes if the app process is killed but there are `onSaveInstance` state bundles (which seems closer to Cold start)&lt;br /&gt;
&#039;&#039;&#039;This is not currently measured by the Fenix team.&#039;&#039;&#039; &lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
| Hot start || Open || Depending on user settings this will either open new window or new tab || Application process is running, HomeActivity is also running. The application is started either via the homescreen or applink, which brings the HomeActivity to the foreground.&lt;br /&gt;
&lt;br /&gt;
In GPlay terminology, `onTrimMemory` may or may not have been called)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;This is not currently measured by the Fenix team.&#039;&#039;&#039; &lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
| Delete history on close || Close || A non-default configuration that has Firefox forget all user browsing history on shut down. || N/A ||&lt;br /&gt;
|-&lt;br /&gt;
| From crash || Session Restore || || N/A ||&lt;br /&gt;
|-&lt;br /&gt;
| User initiated || Session Restore || || N/A ||&lt;br /&gt;
|- &lt;br /&gt;
| App link || Variations || N/A || ||&lt;br /&gt;
|-&lt;br /&gt;
| With WebExtension-&amp;gt;Theme || Variations || At least one or more WebExtension themes is installed, and one is enabled. || ||&lt;br /&gt;
|-&lt;br /&gt;
| With WebExtension-&amp;gt;Addon || Variations || At least one or more WebExtension addon is installed and enabled. || ||&lt;br /&gt;
|-&lt;br /&gt;
| Secure Proxy || Variations || The &amp;quot;Firefox Private Network&amp;quot; WebExtension. || ||&lt;br /&gt;
|-&lt;br /&gt;
| Time to interface change complete || UI || Click on a &amp;quot;share&amp;quot; button and the delay to when the display is shown. || ||&lt;br /&gt;
|-&lt;br /&gt;
| Open || Window || To open a new browser window.|| N/A ||&lt;br /&gt;
|-&lt;br /&gt;
| Close || Window || To close a new browser window. || N/A ||&lt;br /&gt;
|-&lt;br /&gt;
| Switch|| Window || To switch focus from one browser window to another. || N/A ||&lt;br /&gt;
|-&lt;br /&gt;
| Resize || Window || To resize a browser window. || N/A ||&lt;br /&gt;
|-&lt;br /&gt;
| Open || Tab || To open a new browser tab. || ||&lt;br /&gt;
|-&lt;br /&gt;
| Close || Tab || To close a new browser tab. || ||&lt;br /&gt;
|-&lt;br /&gt;
| Switch || Tab || To switch from one browser tab to another within the same window. || ||&lt;br /&gt;
|-&lt;br /&gt;
| Open || Menu || To open one of Firefox&#039;s built in toolbar menus or context menu. || ||&lt;br /&gt;
|-&lt;br /&gt;
| Close || Menu || To close one of Firefox&#039;s built in toolbar menus or context menu. || ||&lt;br /&gt;
|-&lt;br /&gt;
| Touch || Input || Input from the user via a touchscreen. || ||&lt;br /&gt;
|-&lt;br /&gt;
| Keyboard|| Input || Input from the user via the keyboard. || ||&lt;br /&gt;
|-&lt;br /&gt;
| Mouse || Input || Input from the user via a mouse. || ||&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Resource===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Term !! Metadata !! Definition !! Relevant Links&lt;br /&gt;
|-&lt;br /&gt;
| Memory || || || &lt;br /&gt;
|-&lt;br /&gt;
| Power || || || &lt;br /&gt;
|-&lt;br /&gt;
| CPU || || || &lt;br /&gt;
|-&lt;br /&gt;
| GPU || || || &lt;br /&gt;
|-&lt;br /&gt;
| Disk || || || &lt;br /&gt;
|-&lt;br /&gt;
| Network || || || &lt;br /&gt;
|-&lt;br /&gt;
| App idle in foreground || Network variations || || &lt;br /&gt;
|-&lt;br /&gt;
| App idle in background ||  Network variations || || &lt;br /&gt;
|-&lt;br /&gt;
| Audio || Media || || &lt;br /&gt;
|-&lt;br /&gt;
| Dropped Frame || Video|| || &lt;br /&gt;
|-&lt;br /&gt;
| Resolution Change || Media || || &lt;br /&gt;
|-&lt;br /&gt;
| Stall length || Media || || &lt;br /&gt;
|-&lt;br /&gt;
| AV sync || Media || || &lt;br /&gt;
|-&lt;br /&gt;
| Number of stalls || Media || || &lt;br /&gt;
|-&lt;br /&gt;
| AV sync || Media || || &lt;br /&gt;
|-&lt;br /&gt;
| Time to payback state change || Media || || &lt;br /&gt;
|-&lt;br /&gt;
| Real Time Communication (RTC) || Media || || &lt;br /&gt;
|-&lt;br /&gt;
| Frame per second (FPS) || Virtual Reality (VR) || || &lt;br /&gt;
|-&lt;br /&gt;
| Visual Distortion || Virtual Reality (VR) || || &lt;br /&gt;
|-&lt;br /&gt;
| Z-fighting || Virtual Reality (VR) || || &lt;br /&gt;
|-&lt;br /&gt;
| Judder || Virtual Reality (VR) || || &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Components===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Term !! Metadata !! Definition !! Relevant Links&lt;br /&gt;
|-&lt;br /&gt;
| Graphics || || || &lt;br /&gt;
|-&lt;br /&gt;
| Layout || || || &lt;br /&gt;
|-&lt;br /&gt;
| Parsing || Javascript || || [[JavaScript]&lt;br /&gt;
|-&lt;br /&gt;
| Compilation || Javascript || || [[JavaScript]]&lt;br /&gt;
|-&lt;br /&gt;
| Network || || || [[Networking]]&lt;br /&gt;
|-&lt;br /&gt;
| DOM || || || [[DOM]]&lt;br /&gt;
|-&lt;br /&gt;
| Storage || || || [[Storage]]&lt;br /&gt;
|-&lt;br /&gt;
| Media || || || [[Media]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Backfill ==&lt;br /&gt;
Trigger skipped jobs (Treeherder terminology).&lt;br /&gt;
Also refers to filling in missing data points from Perfherder&#039;s [https://treeherder.mozilla.org/perf.html#/graphs Graphs view].&lt;br /&gt;
&lt;br /&gt;
== Data point ==&lt;br /&gt;
Performance metric value visible in Perfherder&#039;s [https://treeherder.mozilla.org/perf.html#/graphs Graph view].&lt;br /&gt;
[[File:Data point.png|700px|none|left|Selected data point]]&lt;br /&gt;
&lt;br /&gt;
== DOM Content Flushed (dcf) ==&lt;br /&gt;
This is a Mozilla proprietary extension and not part of the performance/navigation timing specification. It marks the completion of the first presentation flush after DOMContentLoaded.&lt;br /&gt;
Internal Firefox metric activated by setting the preference dom.performance.time_to_dom_content_flushed.enabled to true.&lt;br /&gt;
&lt;br /&gt;
== Downstream ==&lt;br /&gt;
Alert triggered by a commit that originally happened on another repo and was merged into the current one after.&lt;br /&gt;
&lt;br /&gt;
== First Contentful Paint (fcp) ==&lt;br /&gt;
First Contentful Paint (FCP) measures the time from navigation to the time when the browser renders the first bit of content from the DOM.&lt;br /&gt;
&lt;br /&gt;
== First Non-Blank Paint (fnbpaint) ==&lt;br /&gt;
The timestamp of a shipped frame that contains the first paint to draw more than the document background.&lt;br /&gt;
Has low value to a user, as this paint may be completely meaningless or useless. The first non-blank paint is often represented as &amp;quot;Start Render&amp;quot; in performance products.&lt;br /&gt;
&lt;br /&gt;
== Gecko profile ==&lt;br /&gt;
The Firefox Profiler is a profiler that is built into Firefox and is available at profiler.firefox.com. It has tighter integration with Firefox than external profilers, and has more of a platform focus that the DevTools performance panel. It can be used a variety of situations where external profilers are not available, and can provide more information and insight into what the browser is doing.&lt;br /&gt;
&lt;br /&gt;
== mitmproxy ==&lt;br /&gt;
[https://mitmproxy.org/ Mitmproxy] is a third-party open-source tool ([https://github.com/mitmproxy/mitmproxy found here in github]) that allows the recording of a live web page and saving it as a playback archive. Using Mitmproxy&#039;s &#039;mitmdump&#039; tool, the recorded page can be played back through a local proxy browser proxy; then browsing to the URL loads the page from the mitmproxy recording instead of the live site. &lt;br /&gt;
&lt;br /&gt;
The Raptor performance testing framework uses Mitmproxy for Raptor page-load performance tests. Mitmproxy is available as a python [https://searchfox.org/mozilla-central/source/testing/mozbase/mozproxy mozbase/mozproxy] module for import in any python project.&lt;br /&gt;
&lt;br /&gt;
== Noise (regarding performance tests) ==&lt;br /&gt;
Generally a test reports values that are in a range instead of a consistent value. The larger the range of &#039;normal&#039; results, the more noise we have.&lt;br /&gt;
Some tests will post results in a small range, and when we get a data point significantly outside the range, it is easy to identify.&lt;br /&gt;
The problem is that many tests have a large range of expected results. It makes it hard to determine what a regression is when we might have a range += 4% from the median and we have a 3% regression. It is obvious in the graph over time, but hard to tell until you have many future data points.&lt;br /&gt;
&lt;br /&gt;
== Perf Sheriff ==&lt;br /&gt;
Using perfherder, a perf-sheriff will perform these tasks:&lt;br /&gt;
# Look at the graph and determine the original branch, date, revision where the alert occurred&lt;br /&gt;
# Look at Treeherder and determine if we have all the data.&lt;br /&gt;
# Retrigger jobs if needed (more noise, more retriggers)&lt;br /&gt;
# Once you have more data, look at the data in compare view to see if other tests/platforms have changed&lt;br /&gt;
# Add all related alerts you see to the summary with the reassign button&lt;br /&gt;
&lt;br /&gt;
== Perfherder ==&lt;br /&gt;
Perfherder is an interactive dashboard intended to allow monitoring and analysis of automated performance tests run against &#039;&#039;&#039;Mozilla&#039;&#039;&#039; products (currently Firefox and Firefox for Android).&lt;br /&gt;
&lt;br /&gt;
== Raptor ==&lt;br /&gt;
Raptor is a performance testing framework used for running browser page-load and browser benchmark tests. Raptor can run performance tests on Firefox desktop, Firefox android (Fennec, Geckoview example app, and the android components Reference Browser), and Google Chrome/Chromium. For more information please refer to [https://wiki.mozilla.org/Performance_sheriffing/Raptor the Raptor wiki page.]&lt;br /&gt;
&lt;br /&gt;
==RelMan glossary==&lt;br /&gt;
[https://wiki.mozilla.org/Release_Management/Glossary These terms] are of use, especially when doing Performance sheriffing.&lt;br /&gt;
&lt;br /&gt;
== Retrigger ==&lt;br /&gt;
Any run of the same job on the same commit for the same repo triggered after the first one.&lt;br /&gt;
Retriggers usually happen when the available datapoint in the graph are not enough for the sheriff to determine the culprit.&lt;br /&gt;
&lt;br /&gt;
== SETA ==&lt;br /&gt;
SETA finds the minimum set of jobs to run in order to catch all failures that our automation has found in the recent past on Firefox development repositories. &lt;br /&gt;
SETA creates job priorities for all jobs found in the runnable-jobs API for that repository.&lt;br /&gt;
&lt;br /&gt;
== Talos ==&lt;br /&gt;
Talos is our versatile performance testing framework we use at &#039;&#039;&#039;Mozilla&#039;&#039;&#039;. It was created to serve as a test runner for the existing performance tests that &#039;&#039;&#039;Mozilla&#039;&#039;&#039; was running back in 2007 as well as providing an extensible framework for new tests as they were created.&lt;br /&gt;
&lt;br /&gt;
== Treeherder ==&lt;br /&gt;
Treeherder is a reporting dashboard for Mozilla checkins. It allows users to see the results of automatic builds and their respective tests. The Treeherder service manages the etl layer for data ingestion, web services, and the data model behind Treeherder.&lt;br /&gt;
&lt;br /&gt;
== Time To First Interactive (ttfi) ==&lt;br /&gt;
This is a newer metric and reports when the page is first expected to be usable and will respond to input quickly (with the possibility of slow responses as more content loads).&lt;br /&gt;
# Start looking for First Interactive at first contentful paint&lt;br /&gt;
# Look for the first interactive window (with no regard to in-flight requests)&lt;br /&gt;
# First Interactive is the start of the interactive window from step 2, first contentful paint or DOM Content Loaded, whichever is later&lt;br /&gt;
&lt;br /&gt;
== R/b ==&lt;br /&gt;
Short name for retrigger/backfill.&lt;br /&gt;
&lt;br /&gt;
== WebPageTest ==&lt;br /&gt;
Accurately measure, track, and report on key Firefox-performance metrics, over time.&lt;/div&gt;</summary>
		<author><name>Kmoir</name></author>
	</entry>
	<entry>
		<id>https://wiki.mozilla.org/index.php?title=Performance/Glossary&amp;diff=1228900</id>
		<title>Performance/Glossary</title>
		<link rel="alternate" type="text/html" href="https://wiki.mozilla.org/index.php?title=Performance/Glossary&amp;diff=1228900"/>
		<updated>2020-07-09T13:52:10Z</updated>

		<summary type="html">&lt;p&gt;Kmoir: /* Components */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Classification of user actions/flows that will be perceived as task with discrete performance expectations and settings/configurations that affect the raw performance of those tasks.&lt;br /&gt;
&lt;br /&gt;
==Pageload==&lt;br /&gt;
&lt;br /&gt;
=== Metrics ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Term !! Metadata !! Definition !! Relevant Links&lt;br /&gt;
|-&lt;br /&gt;
| || || One or two sentences || &lt;br /&gt;
* Full definition&lt;br /&gt;
* Related tests/coverage&lt;br /&gt;
* Results&lt;br /&gt;
* User research&lt;br /&gt;
|-&lt;br /&gt;
| SpeedIndex || Visual || (SI) is a page load performance metric that shows you how quickly the contents of a page are visibly populated. It is the average time at which visible parts of the page are displayed. Expressed in milliseconds, and dependent on the size of the viewport, the lower the score, the better.  ||[https://developer.mozilla.org/en-US/docs/Glossary/Speed_index MDN Documentation] &lt;br /&gt;
|-&lt;br /&gt;
| Contentful SpeedIndex || Visual || This metric uses edge detection to calculate the amount of “content” that is visible on each frame. It was designed to have a good metric to measure the amount of text that is visible and ignore the impact of popup or login screens at the end of a page load. || [https://www.sitespeed.io/documentation/sitespeed.io/metrics/#contentful-speed-index sitespeed.io documentation]&lt;br /&gt;
|-&lt;br /&gt;
|  Perceptual SpeedIndex || Visual || A metric that measures the above-the-fold visual performance of a webpage, while accounting for the layout stability.  || * [http://www.parvez-ahammad.org/blog/perceptual-speed-index-psi-for-measuring-above-fold-visual-performance-of-webpages Perceptual Speed Index (PSI) for measuring above-fold visual performance of webpages] &lt;br /&gt;
* [https://github.com/WPO-Foundation/visualmetrics Visual metrics github repo]&lt;br /&gt;
|-&lt;br /&gt;
| Visual Completeness || Visual  || The point in time when a web browser has finished rendering viewable content in the viewport, but not the entire page. || &lt;br /&gt;
|-&lt;br /&gt;
| First Paint event || Standard || The time between navigation and when the browser renders the first pixels to the screen, rendering anything that is visually different from what was on the screen prior to navigation.  || [https://developer.mozilla.org/en-US/docs/Glossary/First_paint MDN documentation]&lt;br /&gt;
|-&lt;br /&gt;
| First Contentful Paint || Standard || How long it takes the browser to render the first bit of content from the DOM providing the first feedback to the user the page is actually loading. || [https://developer.mozilla.org/en-US/docs/Glossary/First_contentful_paint MDN documentation]&lt;br /&gt;
|-&lt;br /&gt;
| DOMContentLoaded event || Standard || A DOM event that is fired once the underlying document has finished being parsed and loaded, but before any of its additional resources (stylesheets, images, subframes) have finished loading. || [https://developer.mozilla.org/en-US/docs/Web/API/Window/DOMContent MDN documentation]&lt;br /&gt;
|-&lt;br /&gt;
|  Onload event || Standard || A DOM event that is fired once the underlying document has finished loading, including all of its stylesheets, images and subframes. This does not include additional resources that start to load due to script. || [https://developer.mozilla.org/en-US/docs/Web/API/Window/load_event MDN Documentation]&lt;br /&gt;
|-&lt;br /&gt;
| Time to Interactive || Proposed standard || (TTI) is a non-standardized web performance &#039;progress&#039; metric defined as the point in time when the last Long Task finished and was followed by 5 seconds of network and main thread inactivity.&lt;br /&gt;
    &lt;br /&gt;
# The page has displayed useful content&lt;br /&gt;
# Event handlers are registered for most visible page elements&lt;br /&gt;
# When a user interacts with the page, the page consistently responds within 50ms - the user does not experience jank.&lt;br /&gt;
 || &lt;br /&gt;
* [https://developer.mozilla.org/en-US/docs/Glossary/Time_to_interactive MDN Documentation]&lt;br /&gt;
* [https://github.com/WICG/time-to-interactive Proposed web standard]&lt;br /&gt;
|-&lt;br /&gt;
| Cold page load ||  || browser started and stabilized/idle, same profile dir as previous, site not loaded or cache cleared  || &lt;br /&gt;
|-&lt;br /&gt;
| Warm page load ||  || browser started and stabilized/idle, same profile dir as previous, site already loaded once, any click-throughs clicked  || &lt;br /&gt;
|-&lt;br /&gt;
| Reload ||  || To re-request the rendering of a document. This may mean re-retrieving the entire document and any of its resources off of the network, or might mean reloading the resources out of a local cache.  || &lt;br /&gt;
|-&lt;br /&gt;
| Backwards/Forwards navigation ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| Level 1 cookie blocking || Tracking Protection ||  || &lt;br /&gt;
|-&lt;br /&gt;
| Level 2 cookie blocking || Tracking Protection ||  || &lt;br /&gt;
|-&lt;br /&gt;
| Level 1 content blocking || Tracking Protection||  || &lt;br /&gt;
|-&lt;br /&gt;
| Level 2 content blocking || Tracking Protection ||  || &lt;br /&gt;
|-&lt;br /&gt;
|  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Responsiveness (mobile vs Desktop) ===&lt;br /&gt;
&lt;br /&gt;
====Scroll====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Term !! Metadata !! Definition !! Relevant Links&lt;br /&gt;
|-&lt;br /&gt;
| Checkerboarding || Metrics || Checkerboarding occurs when Gecko is unable to paint the viewable portion of a webpage while we&#039;re scrolling. Instead, we just paint a color instead of the content. || &lt;br /&gt;
|-&lt;br /&gt;
| Velocity || Metrics || || &lt;br /&gt;
|-&lt;br /&gt;
| Touch|| Variations || || &lt;br /&gt;
|-&lt;br /&gt;
| Keyboard || Variations || || &lt;br /&gt;
|-&lt;br /&gt;
| Mouse/UI || Variations || || &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Browser====&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Term !! Metadata !! Desktop Definition !! Mobile Definition !! Relevant Links&lt;br /&gt;
|-&lt;br /&gt;
| Pageload Jank || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| Time to first blank || Open || The time from process start to display the very first painted frame. On Windows, this is currently a white rectangle, which we consider &amp;quot;first blank&amp;quot; || N/A ||&lt;br /&gt;
|-&lt;br /&gt;
| Time to first chrome paint || Open || The time from process start to displaying the first frame of the browser UI (not including the content area) || N/A ||&lt;br /&gt;
|-&lt;br /&gt;
| Time to settled about:home || Open || The time from process start to displaying a fully loaded about:home || N/A ||&lt;br /&gt;
|-&lt;br /&gt;
| Fresh profile || Open || new profile dir, user.js, first time network requests || Application process starts for the very first time. This includes onboarding, but no migration.  ||&lt;br /&gt;
|-&lt;br /&gt;
| Cold start || Open || The browser is started when it hasn&#039;t already been started in this operating system session, so the disk cache is empty. For example, the first time that Firefox starts up after the operating system boots is a cold start. || Application process is not running. Not a first run, and no onboarding. The application is started either via the homescreen or applink. In GPlay terminology, there&#039;s no stored state (i.e. no `onSaveInstanceState` bundles)  When the Fenix team measures cold start times, the generally measure from process start to visual completeness of the homescreen. ||&lt;br /&gt;
|-&lt;br /&gt;
| Warm start || Open || The browser starts when a previous instance of the browser was already started and shutdown within the same operating system session. || Application process is running, but the HomeActivity is not. The application is started either via the homescreen or applink. In GPlay terminology, &amp;quot;warm start&amp;quot; includes many situations and is not well defined. For example, it also includes if the app process is killed but there are `onSaveInstance` state bundles (which seems closer to Cold start)&lt;br /&gt;
&#039;&#039;&#039;This is not currently measured by the Fenix team.&#039;&#039;&#039; &lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
| Hot start || Open || Depending on user settings this will either open new window or new tab || Application process is running, HomeActivity is also running. The application is started either via the homescreen or applink, which brings the HomeActivity to the foreground.&lt;br /&gt;
&lt;br /&gt;
In GPlay terminology, `onTrimMemory` may or may not have been called)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;This is not currently measured by the Fenix team.&#039;&#039;&#039; &lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
| Delete history on close || Close || A non-default configuration that has Firefox forget all user browsing history on shut down. || N/A ||&lt;br /&gt;
|-&lt;br /&gt;
| From crash || Session Restore || || N/A ||&lt;br /&gt;
|-&lt;br /&gt;
| User initiated || Session Restore || || N/A ||&lt;br /&gt;
|- &lt;br /&gt;
| App link || Variations || N/A || ||&lt;br /&gt;
|-&lt;br /&gt;
| With WebExtension-&amp;gt;Theme || Variations || At least one or more WebExtension themes is installed, and one is enabled. || ||&lt;br /&gt;
|-&lt;br /&gt;
| With WebExtension-&amp;gt;Addon || Variations || At least one or more WebExtension addon is installed and enabled. || ||&lt;br /&gt;
|-&lt;br /&gt;
| Secure Proxy || Variations || The &amp;quot;Firefox Private Network&amp;quot; WebExtension. || ||&lt;br /&gt;
|-&lt;br /&gt;
| Time to interface change complete || UI || Click on a &amp;quot;share&amp;quot; button and the delay to when the display is shown. || ||&lt;br /&gt;
|-&lt;br /&gt;
| Open || Window || To open a new browser window.|| N/A ||&lt;br /&gt;
|-&lt;br /&gt;
| Close || Window || To close a new browser window. || N/A ||&lt;br /&gt;
|-&lt;br /&gt;
| Switch|| Window || To switch focus from one browser window to another. || N/A ||&lt;br /&gt;
|-&lt;br /&gt;
| Resize || Window || To resize a browser window. || N/A ||&lt;br /&gt;
|-&lt;br /&gt;
| Open || Tab || To open a new browser tab. || ||&lt;br /&gt;
|-&lt;br /&gt;
| Close || Tab || To close a new browser tab. || ||&lt;br /&gt;
|-&lt;br /&gt;
| Switch || Tab || To switch from one browser tab to another within the same window. || ||&lt;br /&gt;
|-&lt;br /&gt;
| Open || Menu || To open one of Firefox&#039;s built in toolbar menus or context menu. || ||&lt;br /&gt;
|-&lt;br /&gt;
| Close || Menu || To close one of Firefox&#039;s built in toolbar menus or context menu. || ||&lt;br /&gt;
|-&lt;br /&gt;
| Touch || Input || Input from the user via a touchscreen. || ||&lt;br /&gt;
|-&lt;br /&gt;
| Keyboard|| Input || Input from the user via the keyboard. || ||&lt;br /&gt;
|-&lt;br /&gt;
| Mouse || Input || Input from the user via a mouse. || ||&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Resource===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Term !! Metadata !! Definition !! Relevant Links&lt;br /&gt;
|-&lt;br /&gt;
| Memory || || || &lt;br /&gt;
|-&lt;br /&gt;
| Power || || || &lt;br /&gt;
|-&lt;br /&gt;
| CPU || || || &lt;br /&gt;
|-&lt;br /&gt;
| GPU || || || &lt;br /&gt;
|-&lt;br /&gt;
| Disk || || || &lt;br /&gt;
|-&lt;br /&gt;
| Network || || || &lt;br /&gt;
|-&lt;br /&gt;
| App idle in foreground || Network variations || || &lt;br /&gt;
|-&lt;br /&gt;
| App idle in background ||  Network variations || || &lt;br /&gt;
|-&lt;br /&gt;
| Audio || Media || || &lt;br /&gt;
|-&lt;br /&gt;
| Dropped Frame || Video|| || &lt;br /&gt;
|-&lt;br /&gt;
| Resolution Change || Media || || &lt;br /&gt;
|-&lt;br /&gt;
| Stall length || Media || || &lt;br /&gt;
|-&lt;br /&gt;
| AV sync || Media || || &lt;br /&gt;
|-&lt;br /&gt;
| Number of stalls || Media || || &lt;br /&gt;
|-&lt;br /&gt;
| AV sync || Media || || &lt;br /&gt;
|-&lt;br /&gt;
| Time to payback state change || Media || || &lt;br /&gt;
|-&lt;br /&gt;
| Real Time Communication (RTC) || Media || || &lt;br /&gt;
|-&lt;br /&gt;
| Frame per second (FPS) || Virtual Reality (VR) || || &lt;br /&gt;
|-&lt;br /&gt;
| Visual Distortion || Virtual Reality (VR) || || &lt;br /&gt;
|-&lt;br /&gt;
| Z-fighting || Virtual Reality (VR) || || &lt;br /&gt;
|-&lt;br /&gt;
| Judder || Virtual Reality (VR) || || &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Components===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Term !! Metadata !! Definition !! Relevant Links&lt;br /&gt;
|-&lt;br /&gt;
| Graphics || || || &lt;br /&gt;
|-&lt;br /&gt;
| Layout || || || &lt;br /&gt;
|-&lt;br /&gt;
| Parsing || Javascript || || [[JavaScript]&lt;br /&gt;
|-&lt;br /&gt;
| Compilation || Javascript || || [[JavaScript]]&lt;br /&gt;
|-&lt;br /&gt;
| Network || || || [[Networking]]&lt;br /&gt;
|-&lt;br /&gt;
| DOM || || || [[DOM]]&lt;br /&gt;
|-&lt;br /&gt;
| Storage || || || [[Storage]]&lt;br /&gt;
|-&lt;br /&gt;
| Media || || || [[Media]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Kmoir</name></author>
	</entry>
	<entry>
		<id>https://wiki.mozilla.org/index.php?title=Performance/Glossary&amp;diff=1228899</id>
		<title>Performance/Glossary</title>
		<link rel="alternate" type="text/html" href="https://wiki.mozilla.org/index.php?title=Performance/Glossary&amp;diff=1228899"/>
		<updated>2020-07-09T13:47:34Z</updated>

		<summary type="html">&lt;p&gt;Kmoir: /* Components */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Classification of user actions/flows that will be perceived as task with discrete performance expectations and settings/configurations that affect the raw performance of those tasks.&lt;br /&gt;
&lt;br /&gt;
==Pageload==&lt;br /&gt;
&lt;br /&gt;
=== Metrics ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Term !! Metadata !! Definition !! Relevant Links&lt;br /&gt;
|-&lt;br /&gt;
| || || One or two sentences || &lt;br /&gt;
* Full definition&lt;br /&gt;
* Related tests/coverage&lt;br /&gt;
* Results&lt;br /&gt;
* User research&lt;br /&gt;
|-&lt;br /&gt;
| SpeedIndex || Visual || (SI) is a page load performance metric that shows you how quickly the contents of a page are visibly populated. It is the average time at which visible parts of the page are displayed. Expressed in milliseconds, and dependent on the size of the viewport, the lower the score, the better.  ||[https://developer.mozilla.org/en-US/docs/Glossary/Speed_index MDN Documentation] &lt;br /&gt;
|-&lt;br /&gt;
| Contentful SpeedIndex || Visual || This metric uses edge detection to calculate the amount of “content” that is visible on each frame. It was designed to have a good metric to measure the amount of text that is visible and ignore the impact of popup or login screens at the end of a page load. || [https://www.sitespeed.io/documentation/sitespeed.io/metrics/#contentful-speed-index sitespeed.io documentation]&lt;br /&gt;
|-&lt;br /&gt;
|  Perceptual SpeedIndex || Visual || A metric that measures the above-the-fold visual performance of a webpage, while accounting for the layout stability.  || * [http://www.parvez-ahammad.org/blog/perceptual-speed-index-psi-for-measuring-above-fold-visual-performance-of-webpages Perceptual Speed Index (PSI) for measuring above-fold visual performance of webpages] &lt;br /&gt;
* [https://github.com/WPO-Foundation/visualmetrics Visual metrics github repo]&lt;br /&gt;
|-&lt;br /&gt;
| Visual Completeness || Visual  || The point in time when a web browser has finished rendering viewable content in the viewport, but not the entire page. || &lt;br /&gt;
|-&lt;br /&gt;
| First Paint event || Standard || The time between navigation and when the browser renders the first pixels to the screen, rendering anything that is visually different from what was on the screen prior to navigation.  || [https://developer.mozilla.org/en-US/docs/Glossary/First_paint MDN documentation]&lt;br /&gt;
|-&lt;br /&gt;
| First Contentful Paint || Standard || How long it takes the browser to render the first bit of content from the DOM providing the first feedback to the user the page is actually loading. || [https://developer.mozilla.org/en-US/docs/Glossary/First_contentful_paint MDN documentation]&lt;br /&gt;
|-&lt;br /&gt;
| DOMContentLoaded event || Standard || A DOM event that is fired once the underlying document has finished being parsed and loaded, but before any of its additional resources (stylesheets, images, subframes) have finished loading. || [https://developer.mozilla.org/en-US/docs/Web/API/Window/DOMContent MDN documentation]&lt;br /&gt;
|-&lt;br /&gt;
|  Onload event || Standard || A DOM event that is fired once the underlying document has finished loading, including all of its stylesheets, images and subframes. This does not include additional resources that start to load due to script. || [https://developer.mozilla.org/en-US/docs/Web/API/Window/load_event MDN Documentation]&lt;br /&gt;
|-&lt;br /&gt;
| Time to Interactive || Proposed standard || (TTI) is a non-standardized web performance &#039;progress&#039; metric defined as the point in time when the last Long Task finished and was followed by 5 seconds of network and main thread inactivity.&lt;br /&gt;
    &lt;br /&gt;
# The page has displayed useful content&lt;br /&gt;
# Event handlers are registered for most visible page elements&lt;br /&gt;
# When a user interacts with the page, the page consistently responds within 50ms - the user does not experience jank.&lt;br /&gt;
 || &lt;br /&gt;
* [https://developer.mozilla.org/en-US/docs/Glossary/Time_to_interactive MDN Documentation]&lt;br /&gt;
* [https://github.com/WICG/time-to-interactive Proposed web standard]&lt;br /&gt;
|-&lt;br /&gt;
| Cold page load ||  || browser started and stabilized/idle, same profile dir as previous, site not loaded or cache cleared  || &lt;br /&gt;
|-&lt;br /&gt;
| Warm page load ||  || browser started and stabilized/idle, same profile dir as previous, site already loaded once, any click-throughs clicked  || &lt;br /&gt;
|-&lt;br /&gt;
| Reload ||  || To re-request the rendering of a document. This may mean re-retrieving the entire document and any of its resources off of the network, or might mean reloading the resources out of a local cache.  || &lt;br /&gt;
|-&lt;br /&gt;
| Backwards/Forwards navigation ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| Level 1 cookie blocking || Tracking Protection ||  || &lt;br /&gt;
|-&lt;br /&gt;
| Level 2 cookie blocking || Tracking Protection ||  || &lt;br /&gt;
|-&lt;br /&gt;
| Level 1 content blocking || Tracking Protection||  || &lt;br /&gt;
|-&lt;br /&gt;
| Level 2 content blocking || Tracking Protection ||  || &lt;br /&gt;
|-&lt;br /&gt;
|  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Responsiveness (mobile vs Desktop) ===&lt;br /&gt;
&lt;br /&gt;
====Scroll====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Term !! Metadata !! Definition !! Relevant Links&lt;br /&gt;
|-&lt;br /&gt;
| Checkerboarding || Metrics || Checkerboarding occurs when Gecko is unable to paint the viewable portion of a webpage while we&#039;re scrolling. Instead, we just paint a color instead of the content. || &lt;br /&gt;
|-&lt;br /&gt;
| Velocity || Metrics || || &lt;br /&gt;
|-&lt;br /&gt;
| Touch|| Variations || || &lt;br /&gt;
|-&lt;br /&gt;
| Keyboard || Variations || || &lt;br /&gt;
|-&lt;br /&gt;
| Mouse/UI || Variations || || &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Browser====&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Term !! Metadata !! Desktop Definition !! Mobile Definition !! Relevant Links&lt;br /&gt;
|-&lt;br /&gt;
| Pageload Jank || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| Time to first blank || Open || The time from process start to display the very first painted frame. On Windows, this is currently a white rectangle, which we consider &amp;quot;first blank&amp;quot; || N/A ||&lt;br /&gt;
|-&lt;br /&gt;
| Time to first chrome paint || Open || The time from process start to displaying the first frame of the browser UI (not including the content area) || N/A ||&lt;br /&gt;
|-&lt;br /&gt;
| Time to settled about:home || Open || The time from process start to displaying a fully loaded about:home || N/A ||&lt;br /&gt;
|-&lt;br /&gt;
| Fresh profile || Open || new profile dir, user.js, first time network requests || Application process starts for the very first time. This includes onboarding, but no migration.  ||&lt;br /&gt;
|-&lt;br /&gt;
| Cold start || Open || The browser is started when it hasn&#039;t already been started in this operating system session, so the disk cache is empty. For example, the first time that Firefox starts up after the operating system boots is a cold start. || Application process is not running. Not a first run, and no onboarding. The application is started either via the homescreen or applink. In GPlay terminology, there&#039;s no stored state (i.e. no `onSaveInstanceState` bundles)  When the Fenix team measures cold start times, the generally measure from process start to visual completeness of the homescreen. ||&lt;br /&gt;
|-&lt;br /&gt;
| Warm start || Open || The browser starts when a previous instance of the browser was already started and shutdown within the same operating system session. || Application process is running, but the HomeActivity is not. The application is started either via the homescreen or applink. In GPlay terminology, &amp;quot;warm start&amp;quot; includes many situations and is not well defined. For example, it also includes if the app process is killed but there are `onSaveInstance` state bundles (which seems closer to Cold start)&lt;br /&gt;
&#039;&#039;&#039;This is not currently measured by the Fenix team.&#039;&#039;&#039; &lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
| Hot start || Open || Depending on user settings this will either open new window or new tab || Application process is running, HomeActivity is also running. The application is started either via the homescreen or applink, which brings the HomeActivity to the foreground.&lt;br /&gt;
&lt;br /&gt;
In GPlay terminology, `onTrimMemory` may or may not have been called)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;This is not currently measured by the Fenix team.&#039;&#039;&#039; &lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
| Delete history on close || Close || A non-default configuration that has Firefox forget all user browsing history on shut down. || N/A ||&lt;br /&gt;
|-&lt;br /&gt;
| From crash || Session Restore || || N/A ||&lt;br /&gt;
|-&lt;br /&gt;
| User initiated || Session Restore || || N/A ||&lt;br /&gt;
|- &lt;br /&gt;
| App link || Variations || N/A || ||&lt;br /&gt;
|-&lt;br /&gt;
| With WebExtension-&amp;gt;Theme || Variations || At least one or more WebExtension themes is installed, and one is enabled. || ||&lt;br /&gt;
|-&lt;br /&gt;
| With WebExtension-&amp;gt;Addon || Variations || At least one or more WebExtension addon is installed and enabled. || ||&lt;br /&gt;
|-&lt;br /&gt;
| Secure Proxy || Variations || The &amp;quot;Firefox Private Network&amp;quot; WebExtension. || ||&lt;br /&gt;
|-&lt;br /&gt;
| Time to interface change complete || UI || Click on a &amp;quot;share&amp;quot; button and the delay to when the display is shown. || ||&lt;br /&gt;
|-&lt;br /&gt;
| Open || Window || To open a new browser window.|| N/A ||&lt;br /&gt;
|-&lt;br /&gt;
| Close || Window || To close a new browser window. || N/A ||&lt;br /&gt;
|-&lt;br /&gt;
| Switch|| Window || To switch focus from one browser window to another. || N/A ||&lt;br /&gt;
|-&lt;br /&gt;
| Resize || Window || To resize a browser window. || N/A ||&lt;br /&gt;
|-&lt;br /&gt;
| Open || Tab || To open a new browser tab. || ||&lt;br /&gt;
|-&lt;br /&gt;
| Close || Tab || To close a new browser tab. || ||&lt;br /&gt;
|-&lt;br /&gt;
| Switch || Tab || To switch from one browser tab to another within the same window. || ||&lt;br /&gt;
|-&lt;br /&gt;
| Open || Menu || To open one of Firefox&#039;s built in toolbar menus or context menu. || ||&lt;br /&gt;
|-&lt;br /&gt;
| Close || Menu || To close one of Firefox&#039;s built in toolbar menus or context menu. || ||&lt;br /&gt;
|-&lt;br /&gt;
| Touch || Input || Input from the user via a touchscreen. || ||&lt;br /&gt;
|-&lt;br /&gt;
| Keyboard|| Input || Input from the user via the keyboard. || ||&lt;br /&gt;
|-&lt;br /&gt;
| Mouse || Input || Input from the user via a mouse. || ||&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Resource===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Term !! Metadata !! Definition !! Relevant Links&lt;br /&gt;
|-&lt;br /&gt;
| Memory || || || &lt;br /&gt;
|-&lt;br /&gt;
| Power || || || &lt;br /&gt;
|-&lt;br /&gt;
| CPU || || || &lt;br /&gt;
|-&lt;br /&gt;
| GPU || || || &lt;br /&gt;
|-&lt;br /&gt;
| Disk || || || &lt;br /&gt;
|-&lt;br /&gt;
| Network || || || &lt;br /&gt;
|-&lt;br /&gt;
| App idle in foreground || Network variations || || &lt;br /&gt;
|-&lt;br /&gt;
| App idle in background ||  Network variations || || &lt;br /&gt;
|-&lt;br /&gt;
| Audio || Media || || &lt;br /&gt;
|-&lt;br /&gt;
| Dropped Frame || Video|| || &lt;br /&gt;
|-&lt;br /&gt;
| Resolution Change || Media || || &lt;br /&gt;
|-&lt;br /&gt;
| Stall length || Media || || &lt;br /&gt;
|-&lt;br /&gt;
| AV sync || Media || || &lt;br /&gt;
|-&lt;br /&gt;
| Number of stalls || Media || || &lt;br /&gt;
|-&lt;br /&gt;
| AV sync || Media || || &lt;br /&gt;
|-&lt;br /&gt;
| Time to payback state change || Media || || &lt;br /&gt;
|-&lt;br /&gt;
| Real Time Communication (RTC) || Media || || &lt;br /&gt;
|-&lt;br /&gt;
| Frame per second (FPS) || Virtual Reality (VR) || || &lt;br /&gt;
|-&lt;br /&gt;
| Visual Distortion || Virtual Reality (VR) || || &lt;br /&gt;
|-&lt;br /&gt;
| Z-fighting || Virtual Reality (VR) || || &lt;br /&gt;
|-&lt;br /&gt;
| Judder || Virtual Reality (VR) || || &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Components===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Term !! Metadata !! Definition !! Relevant Links&lt;br /&gt;
|-&lt;br /&gt;
| Graphics || || || &lt;br /&gt;
|-&lt;br /&gt;
| Layout || || || &lt;br /&gt;
|-&lt;br /&gt;
| Parsing || Javascript || || &lt;br /&gt;
|-&lt;br /&gt;
| Compilation || Javascript || || &lt;br /&gt;
|-&lt;br /&gt;
| Network || || || &lt;br /&gt;
|-&lt;br /&gt;
| DOM || || || [[DOM|DOM]]&lt;br /&gt;
|-&lt;br /&gt;
| Storage || || || &lt;br /&gt;
|-&lt;br /&gt;
| Media || || || [[Media]]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Kmoir</name></author>
	</entry>
	<entry>
		<id>https://wiki.mozilla.org/index.php?title=Performance/Glossary&amp;diff=1228898</id>
		<title>Performance/Glossary</title>
		<link rel="alternate" type="text/html" href="https://wiki.mozilla.org/index.php?title=Performance/Glossary&amp;diff=1228898"/>
		<updated>2020-07-09T13:44:00Z</updated>

		<summary type="html">&lt;p&gt;Kmoir: /* Metrics */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Classification of user actions/flows that will be perceived as task with discrete performance expectations and settings/configurations that affect the raw performance of those tasks.&lt;br /&gt;
&lt;br /&gt;
==Pageload==&lt;br /&gt;
&lt;br /&gt;
=== Metrics ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Term !! Metadata !! Definition !! Relevant Links&lt;br /&gt;
|-&lt;br /&gt;
| || || One or two sentences || &lt;br /&gt;
* Full definition&lt;br /&gt;
* Related tests/coverage&lt;br /&gt;
* Results&lt;br /&gt;
* User research&lt;br /&gt;
|-&lt;br /&gt;
| SpeedIndex || Visual || (SI) is a page load performance metric that shows you how quickly the contents of a page are visibly populated. It is the average time at which visible parts of the page are displayed. Expressed in milliseconds, and dependent on the size of the viewport, the lower the score, the better.  ||[https://developer.mozilla.org/en-US/docs/Glossary/Speed_index MDN Documentation] &lt;br /&gt;
|-&lt;br /&gt;
| Contentful SpeedIndex || Visual || This metric uses edge detection to calculate the amount of “content” that is visible on each frame. It was designed to have a good metric to measure the amount of text that is visible and ignore the impact of popup or login screens at the end of a page load. || [https://www.sitespeed.io/documentation/sitespeed.io/metrics/#contentful-speed-index sitespeed.io documentation]&lt;br /&gt;
|-&lt;br /&gt;
|  Perceptual SpeedIndex || Visual || A metric that measures the above-the-fold visual performance of a webpage, while accounting for the layout stability.  || * [http://www.parvez-ahammad.org/blog/perceptual-speed-index-psi-for-measuring-above-fold-visual-performance-of-webpages Perceptual Speed Index (PSI) for measuring above-fold visual performance of webpages] &lt;br /&gt;
* [https://github.com/WPO-Foundation/visualmetrics Visual metrics github repo]&lt;br /&gt;
|-&lt;br /&gt;
| Visual Completeness || Visual  || The point in time when a web browser has finished rendering viewable content in the viewport, but not the entire page. || &lt;br /&gt;
|-&lt;br /&gt;
| First Paint event || Standard || The time between navigation and when the browser renders the first pixels to the screen, rendering anything that is visually different from what was on the screen prior to navigation.  || [https://developer.mozilla.org/en-US/docs/Glossary/First_paint MDN documentation]&lt;br /&gt;
|-&lt;br /&gt;
| First Contentful Paint || Standard || How long it takes the browser to render the first bit of content from the DOM providing the first feedback to the user the page is actually loading. || [https://developer.mozilla.org/en-US/docs/Glossary/First_contentful_paint MDN documentation]&lt;br /&gt;
|-&lt;br /&gt;
| DOMContentLoaded event || Standard || A DOM event that is fired once the underlying document has finished being parsed and loaded, but before any of its additional resources (stylesheets, images, subframes) have finished loading. || [https://developer.mozilla.org/en-US/docs/Web/API/Window/DOMContent MDN documentation]&lt;br /&gt;
|-&lt;br /&gt;
|  Onload event || Standard || A DOM event that is fired once the underlying document has finished loading, including all of its stylesheets, images and subframes. This does not include additional resources that start to load due to script. || [https://developer.mozilla.org/en-US/docs/Web/API/Window/load_event MDN Documentation]&lt;br /&gt;
|-&lt;br /&gt;
| Time to Interactive || Proposed standard || (TTI) is a non-standardized web performance &#039;progress&#039; metric defined as the point in time when the last Long Task finished and was followed by 5 seconds of network and main thread inactivity.&lt;br /&gt;
    &lt;br /&gt;
# The page has displayed useful content&lt;br /&gt;
# Event handlers are registered for most visible page elements&lt;br /&gt;
# When a user interacts with the page, the page consistently responds within 50ms - the user does not experience jank.&lt;br /&gt;
 || &lt;br /&gt;
* [https://developer.mozilla.org/en-US/docs/Glossary/Time_to_interactive MDN Documentation]&lt;br /&gt;
* [https://github.com/WICG/time-to-interactive Proposed web standard]&lt;br /&gt;
|-&lt;br /&gt;
| Cold page load ||  || browser started and stabilized/idle, same profile dir as previous, site not loaded or cache cleared  || &lt;br /&gt;
|-&lt;br /&gt;
| Warm page load ||  || browser started and stabilized/idle, same profile dir as previous, site already loaded once, any click-throughs clicked  || &lt;br /&gt;
|-&lt;br /&gt;
| Reload ||  || To re-request the rendering of a document. This may mean re-retrieving the entire document and any of its resources off of the network, or might mean reloading the resources out of a local cache.  || &lt;br /&gt;
|-&lt;br /&gt;
| Backwards/Forwards navigation ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| Level 1 cookie blocking || Tracking Protection ||  || &lt;br /&gt;
|-&lt;br /&gt;
| Level 2 cookie blocking || Tracking Protection ||  || &lt;br /&gt;
|-&lt;br /&gt;
| Level 1 content blocking || Tracking Protection||  || &lt;br /&gt;
|-&lt;br /&gt;
| Level 2 content blocking || Tracking Protection ||  || &lt;br /&gt;
|-&lt;br /&gt;
|  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Responsiveness (mobile vs Desktop) ===&lt;br /&gt;
&lt;br /&gt;
====Scroll====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Term !! Metadata !! Definition !! Relevant Links&lt;br /&gt;
|-&lt;br /&gt;
| Checkerboarding || Metrics || Checkerboarding occurs when Gecko is unable to paint the viewable portion of a webpage while we&#039;re scrolling. Instead, we just paint a color instead of the content. || &lt;br /&gt;
|-&lt;br /&gt;
| Velocity || Metrics || || &lt;br /&gt;
|-&lt;br /&gt;
| Touch|| Variations || || &lt;br /&gt;
|-&lt;br /&gt;
| Keyboard || Variations || || &lt;br /&gt;
|-&lt;br /&gt;
| Mouse/UI || Variations || || &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Browser====&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Term !! Metadata !! Desktop Definition !! Mobile Definition !! Relevant Links&lt;br /&gt;
|-&lt;br /&gt;
| Pageload Jank || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| Time to first blank || Open || The time from process start to display the very first painted frame. On Windows, this is currently a white rectangle, which we consider &amp;quot;first blank&amp;quot; || N/A ||&lt;br /&gt;
|-&lt;br /&gt;
| Time to first chrome paint || Open || The time from process start to displaying the first frame of the browser UI (not including the content area) || N/A ||&lt;br /&gt;
|-&lt;br /&gt;
| Time to settled about:home || Open || The time from process start to displaying a fully loaded about:home || N/A ||&lt;br /&gt;
|-&lt;br /&gt;
| Fresh profile || Open || new profile dir, user.js, first time network requests || Application process starts for the very first time. This includes onboarding, but no migration.  ||&lt;br /&gt;
|-&lt;br /&gt;
| Cold start || Open || The browser is started when it hasn&#039;t already been started in this operating system session, so the disk cache is empty. For example, the first time that Firefox starts up after the operating system boots is a cold start. || Application process is not running. Not a first run, and no onboarding. The application is started either via the homescreen or applink. In GPlay terminology, there&#039;s no stored state (i.e. no `onSaveInstanceState` bundles)  When the Fenix team measures cold start times, the generally measure from process start to visual completeness of the homescreen. ||&lt;br /&gt;
|-&lt;br /&gt;
| Warm start || Open || The browser starts when a previous instance of the browser was already started and shutdown within the same operating system session. || Application process is running, but the HomeActivity is not. The application is started either via the homescreen or applink. In GPlay terminology, &amp;quot;warm start&amp;quot; includes many situations and is not well defined. For example, it also includes if the app process is killed but there are `onSaveInstance` state bundles (which seems closer to Cold start)&lt;br /&gt;
&#039;&#039;&#039;This is not currently measured by the Fenix team.&#039;&#039;&#039; &lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
| Hot start || Open || Depending on user settings this will either open new window or new tab || Application process is running, HomeActivity is also running. The application is started either via the homescreen or applink, which brings the HomeActivity to the foreground.&lt;br /&gt;
&lt;br /&gt;
In GPlay terminology, `onTrimMemory` may or may not have been called)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;This is not currently measured by the Fenix team.&#039;&#039;&#039; &lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
| Delete history on close || Close || A non-default configuration that has Firefox forget all user browsing history on shut down. || N/A ||&lt;br /&gt;
|-&lt;br /&gt;
| From crash || Session Restore || || N/A ||&lt;br /&gt;
|-&lt;br /&gt;
| User initiated || Session Restore || || N/A ||&lt;br /&gt;
|- &lt;br /&gt;
| App link || Variations || N/A || ||&lt;br /&gt;
|-&lt;br /&gt;
| With WebExtension-&amp;gt;Theme || Variations || At least one or more WebExtension themes is installed, and one is enabled. || ||&lt;br /&gt;
|-&lt;br /&gt;
| With WebExtension-&amp;gt;Addon || Variations || At least one or more WebExtension addon is installed and enabled. || ||&lt;br /&gt;
|-&lt;br /&gt;
| Secure Proxy || Variations || The &amp;quot;Firefox Private Network&amp;quot; WebExtension. || ||&lt;br /&gt;
|-&lt;br /&gt;
| Time to interface change complete || UI || Click on a &amp;quot;share&amp;quot; button and the delay to when the display is shown. || ||&lt;br /&gt;
|-&lt;br /&gt;
| Open || Window || To open a new browser window.|| N/A ||&lt;br /&gt;
|-&lt;br /&gt;
| Close || Window || To close a new browser window. || N/A ||&lt;br /&gt;
|-&lt;br /&gt;
| Switch|| Window || To switch focus from one browser window to another. || N/A ||&lt;br /&gt;
|-&lt;br /&gt;
| Resize || Window || To resize a browser window. || N/A ||&lt;br /&gt;
|-&lt;br /&gt;
| Open || Tab || To open a new browser tab. || ||&lt;br /&gt;
|-&lt;br /&gt;
| Close || Tab || To close a new browser tab. || ||&lt;br /&gt;
|-&lt;br /&gt;
| Switch || Tab || To switch from one browser tab to another within the same window. || ||&lt;br /&gt;
|-&lt;br /&gt;
| Open || Menu || To open one of Firefox&#039;s built in toolbar menus or context menu. || ||&lt;br /&gt;
|-&lt;br /&gt;
| Close || Menu || To close one of Firefox&#039;s built in toolbar menus or context menu. || ||&lt;br /&gt;
|-&lt;br /&gt;
| Touch || Input || Input from the user via a touchscreen. || ||&lt;br /&gt;
|-&lt;br /&gt;
| Keyboard|| Input || Input from the user via the keyboard. || ||&lt;br /&gt;
|-&lt;br /&gt;
| Mouse || Input || Input from the user via a mouse. || ||&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Resource===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Term !! Metadata !! Definition !! Relevant Links&lt;br /&gt;
|-&lt;br /&gt;
| Memory || || || &lt;br /&gt;
|-&lt;br /&gt;
| Power || || || &lt;br /&gt;
|-&lt;br /&gt;
| CPU || || || &lt;br /&gt;
|-&lt;br /&gt;
| GPU || || || &lt;br /&gt;
|-&lt;br /&gt;
| Disk || || || &lt;br /&gt;
|-&lt;br /&gt;
| Network || || || &lt;br /&gt;
|-&lt;br /&gt;
| App idle in foreground || Network variations || || &lt;br /&gt;
|-&lt;br /&gt;
| App idle in background ||  Network variations || || &lt;br /&gt;
|-&lt;br /&gt;
| Audio || Media || || &lt;br /&gt;
|-&lt;br /&gt;
| Dropped Frame || Video|| || &lt;br /&gt;
|-&lt;br /&gt;
| Resolution Change || Media || || &lt;br /&gt;
|-&lt;br /&gt;
| Stall length || Media || || &lt;br /&gt;
|-&lt;br /&gt;
| AV sync || Media || || &lt;br /&gt;
|-&lt;br /&gt;
| Number of stalls || Media || || &lt;br /&gt;
|-&lt;br /&gt;
| AV sync || Media || || &lt;br /&gt;
|-&lt;br /&gt;
| Time to payback state change || Media || || &lt;br /&gt;
|-&lt;br /&gt;
| Real Time Communication (RTC) || Media || || &lt;br /&gt;
|-&lt;br /&gt;
| Frame per second (FPS) || Virtual Reality (VR) || || &lt;br /&gt;
|-&lt;br /&gt;
| Visual Distortion || Virtual Reality (VR) || || &lt;br /&gt;
|-&lt;br /&gt;
| Z-fighting || Virtual Reality (VR) || || &lt;br /&gt;
|-&lt;br /&gt;
| Judder || Virtual Reality (VR) || || &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Components===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Term !! Metadata !! Definition !! Relevant Links&lt;br /&gt;
|-&lt;br /&gt;
| Graphics || || || &lt;br /&gt;
|-&lt;br /&gt;
| Layout || || || &lt;br /&gt;
|-&lt;br /&gt;
| Parsing || Javascript || || &lt;br /&gt;
|-&lt;br /&gt;
| Compilation || Javascript || || &lt;br /&gt;
|-&lt;br /&gt;
| Network || || || &lt;br /&gt;
|-&lt;br /&gt;
| DOM || || || &lt;br /&gt;
|-&lt;br /&gt;
| Storage || || || &lt;br /&gt;
|-&lt;br /&gt;
| Media || || || &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Kmoir</name></author>
	</entry>
	<entry>
		<id>https://wiki.mozilla.org/index.php?title=Performance/Glossary&amp;diff=1228897</id>
		<title>Performance/Glossary</title>
		<link rel="alternate" type="text/html" href="https://wiki.mozilla.org/index.php?title=Performance/Glossary&amp;diff=1228897"/>
		<updated>2020-07-09T13:39:25Z</updated>

		<summary type="html">&lt;p&gt;Kmoir: /* Metrics */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Classification of user actions/flows that will be perceived as task with discrete performance expectations and settings/configurations that affect the raw performance of those tasks.&lt;br /&gt;
&lt;br /&gt;
==Pageload==&lt;br /&gt;
&lt;br /&gt;
=== Metrics ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Term !! Metadata !! Definition !! Relevant Links&lt;br /&gt;
|-&lt;br /&gt;
| || || One or two sentences || &lt;br /&gt;
* Full definition&lt;br /&gt;
* Related tests/coverage&lt;br /&gt;
* Results&lt;br /&gt;
* User research&lt;br /&gt;
|-&lt;br /&gt;
| SpeedIndex || Visual || (SI) is a page load performance metric that shows you how quickly the contents of a page are visibly populated. It is the average time at which visible parts of the page are displayed. Expressed in milliseconds, and dependent on the size of the viewport, the lower the score, the better.  ||[https://developer.mozilla.org/en-US/docs/Glossary/Speed_index MDN Documentation] &lt;br /&gt;
|-&lt;br /&gt;
| Contentful SpeedIndex || Visual || This metric uses edge detection to calculate the amount of “content” that is visible on each frame. It was designed to have a good metric to measure the amount of text that is visible and ignore the impact of popup or login screens at the end of a page load. || [https://www.sitespeed.io/documentation/sitespeed.io/metrics/#contentful-speed-index sitespeed.io documentation]&lt;br /&gt;
|-&lt;br /&gt;
|  Perceptual SpeedIndex || Visual || A metric that measures the above-the-fold visual performance of a webpage, while accounting for the layout stability.  || * [http://www.parvez-ahammad.org/blog/perceptual-speed-index-psi-for-measuring-above-fold-visual-performance-of-webpages Perceptual Speed Index (PSI) for measuring above-fold visual performance of webpages] &lt;br /&gt;
* [https://github.com/WPO-Foundation/visualmetrics Visual metrics github repo]&lt;br /&gt;
|-&lt;br /&gt;
| Visual Completeness || Visual  || The point in time when a web browser has finished rendering viewable content in the viewport, but not the entire page. || &lt;br /&gt;
|-&lt;br /&gt;
| First Paint event || Standard || The time between navigation and when the browser renders the first pixels to the screen, rendering anything that is visually different from what was on the screen prior to navigation.  || [https://developer.mozilla.org/en-US/docs/Glossary/First_paint MDN documentation]&lt;br /&gt;
|-&lt;br /&gt;
| First Contentful Paint || Standard || How long it takes the browser to render the first bit of content from the DOM providing the first feedback to the user the page is actually loading. || [[MDN Documentation|https://developer.mozilla.org/en-US/docs/Glossary/First_contentful_paint MDN documentation]]&lt;br /&gt;
|-&lt;br /&gt;
| DOMContentLoaded event || Standard || A DOM event that is fired once the underlying document has finished being parsed and loaded, but before any of its additional resources (stylesheets, images, subframes) have finished loading. || [https://developer.mozilla.org/en-US/docs/Web/API/Window/DOMContent MDN documentation]&lt;br /&gt;
|-&lt;br /&gt;
|  Onload event || Standard || A DOM event that is fired once the underlying document has finished loading, including all of its stylesheets, images and subframes. This does not include additional resources that start to load due to script. || [https://developer.mozilla.org/en-US/docs/Web/API/Window/load_event MDN Documentation]&lt;br /&gt;
|-&lt;br /&gt;
| Time to Interactive || Proposed standard || (TTI) is a non-standardized web performance &#039;progress&#039; metric defined as the point in time when the last Long Task finished and was followed by 5 seconds of network and main thread inactivity.&lt;br /&gt;
    &lt;br /&gt;
# The page has displayed useful content&lt;br /&gt;
# Event handlers are registered for most visible page elements&lt;br /&gt;
# When a user interacts with the page, the page consistently responds within 50ms - the user does not experience jank.&lt;br /&gt;
 || &lt;br /&gt;
* [https://developer.mozilla.org/en-US/docs/Glossary/Time_to_interactive MDN Documentation]&lt;br /&gt;
* [https://github.com/WICG/time-to-interactive Proposed web standard]&lt;br /&gt;
|-&lt;br /&gt;
| Cold page load ||  || browser started and stabilized/idle, same profile dir as previous, site not loaded or cache cleared  || &lt;br /&gt;
|-&lt;br /&gt;
| Warm page load ||  || browser started and stabilized/idle, same profile dir as previous, site already loaded once, any click-throughs clicked  || &lt;br /&gt;
|-&lt;br /&gt;
| Reload ||  || To re-request the rendering of a document. This may mean re-retrieving the entire document and any of its resources off of the network, or might mean reloading the resources out of a local cache.  || &lt;br /&gt;
|-&lt;br /&gt;
| Backwards/Forwards navigation ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| Level 1 cookie blocking || Tracking Protection ||  || &lt;br /&gt;
|-&lt;br /&gt;
| Level 2 cookie blocking || Tracking Protection ||  || &lt;br /&gt;
|-&lt;br /&gt;
| Level 1 content blocking || Tracking Protection||  || &lt;br /&gt;
|-&lt;br /&gt;
| Level 2 content blocking || Tracking Protection ||  || &lt;br /&gt;
|-&lt;br /&gt;
|  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Responsiveness (mobile vs Desktop) ===&lt;br /&gt;
&lt;br /&gt;
====Scroll====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Term !! Metadata !! Definition !! Relevant Links&lt;br /&gt;
|-&lt;br /&gt;
| Checkerboarding || Metrics || Checkerboarding occurs when Gecko is unable to paint the viewable portion of a webpage while we&#039;re scrolling. Instead, we just paint a color instead of the content. || &lt;br /&gt;
|-&lt;br /&gt;
| Velocity || Metrics || || &lt;br /&gt;
|-&lt;br /&gt;
| Touch|| Variations || || &lt;br /&gt;
|-&lt;br /&gt;
| Keyboard || Variations || || &lt;br /&gt;
|-&lt;br /&gt;
| Mouse/UI || Variations || || &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Browser====&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Term !! Metadata !! Desktop Definition !! Mobile Definition !! Relevant Links&lt;br /&gt;
|-&lt;br /&gt;
| Pageload Jank || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| Time to first blank || Open || The time from process start to display the very first painted frame. On Windows, this is currently a white rectangle, which we consider &amp;quot;first blank&amp;quot; || N/A ||&lt;br /&gt;
|-&lt;br /&gt;
| Time to first chrome paint || Open || The time from process start to displaying the first frame of the browser UI (not including the content area) || N/A ||&lt;br /&gt;
|-&lt;br /&gt;
| Time to settled about:home || Open || The time from process start to displaying a fully loaded about:home || N/A ||&lt;br /&gt;
|-&lt;br /&gt;
| Fresh profile || Open || new profile dir, user.js, first time network requests || Application process starts for the very first time. This includes onboarding, but no migration.  ||&lt;br /&gt;
|-&lt;br /&gt;
| Cold start || Open || The browser is started when it hasn&#039;t already been started in this operating system session, so the disk cache is empty. For example, the first time that Firefox starts up after the operating system boots is a cold start. || Application process is not running. Not a first run, and no onboarding. The application is started either via the homescreen or applink. In GPlay terminology, there&#039;s no stored state (i.e. no `onSaveInstanceState` bundles)  When the Fenix team measures cold start times, the generally measure from process start to visual completeness of the homescreen. ||&lt;br /&gt;
|-&lt;br /&gt;
| Warm start || Open || The browser starts when a previous instance of the browser was already started and shutdown within the same operating system session. || Application process is running, but the HomeActivity is not. The application is started either via the homescreen or applink. In GPlay terminology, &amp;quot;warm start&amp;quot; includes many situations and is not well defined. For example, it also includes if the app process is killed but there are `onSaveInstance` state bundles (which seems closer to Cold start)&lt;br /&gt;
&#039;&#039;&#039;This is not currently measured by the Fenix team.&#039;&#039;&#039; &lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
| Hot start || Open || Depending on user settings this will either open new window or new tab || Application process is running, HomeActivity is also running. The application is started either via the homescreen or applink, which brings the HomeActivity to the foreground.&lt;br /&gt;
&lt;br /&gt;
In GPlay terminology, `onTrimMemory` may or may not have been called)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;This is not currently measured by the Fenix team.&#039;&#039;&#039; &lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
| Delete history on close || Close || A non-default configuration that has Firefox forget all user browsing history on shut down. || N/A ||&lt;br /&gt;
|-&lt;br /&gt;
| From crash || Session Restore || || N/A ||&lt;br /&gt;
|-&lt;br /&gt;
| User initiated || Session Restore || || N/A ||&lt;br /&gt;
|- &lt;br /&gt;
| App link || Variations || N/A || ||&lt;br /&gt;
|-&lt;br /&gt;
| With WebExtension-&amp;gt;Theme || Variations || At least one or more WebExtension themes is installed, and one is enabled. || ||&lt;br /&gt;
|-&lt;br /&gt;
| With WebExtension-&amp;gt;Addon || Variations || At least one or more WebExtension addon is installed and enabled. || ||&lt;br /&gt;
|-&lt;br /&gt;
| Secure Proxy || Variations || The &amp;quot;Firefox Private Network&amp;quot; WebExtension. || ||&lt;br /&gt;
|-&lt;br /&gt;
| Time to interface change complete || UI || Click on a &amp;quot;share&amp;quot; button and the delay to when the display is shown. || ||&lt;br /&gt;
|-&lt;br /&gt;
| Open || Window || To open a new browser window.|| N/A ||&lt;br /&gt;
|-&lt;br /&gt;
| Close || Window || To close a new browser window. || N/A ||&lt;br /&gt;
|-&lt;br /&gt;
| Switch|| Window || To switch focus from one browser window to another. || N/A ||&lt;br /&gt;
|-&lt;br /&gt;
| Resize || Window || To resize a browser window. || N/A ||&lt;br /&gt;
|-&lt;br /&gt;
| Open || Tab || To open a new browser tab. || ||&lt;br /&gt;
|-&lt;br /&gt;
| Close || Tab || To close a new browser tab. || ||&lt;br /&gt;
|-&lt;br /&gt;
| Switch || Tab || To switch from one browser tab to another within the same window. || ||&lt;br /&gt;
|-&lt;br /&gt;
| Open || Menu || To open one of Firefox&#039;s built in toolbar menus or context menu. || ||&lt;br /&gt;
|-&lt;br /&gt;
| Close || Menu || To close one of Firefox&#039;s built in toolbar menus or context menu. || ||&lt;br /&gt;
|-&lt;br /&gt;
| Touch || Input || Input from the user via a touchscreen. || ||&lt;br /&gt;
|-&lt;br /&gt;
| Keyboard|| Input || Input from the user via the keyboard. || ||&lt;br /&gt;
|-&lt;br /&gt;
| Mouse || Input || Input from the user via a mouse. || ||&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Resource===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Term !! Metadata !! Definition !! Relevant Links&lt;br /&gt;
|-&lt;br /&gt;
| Memory || || || &lt;br /&gt;
|-&lt;br /&gt;
| Power || || || &lt;br /&gt;
|-&lt;br /&gt;
| CPU || || || &lt;br /&gt;
|-&lt;br /&gt;
| GPU || || || &lt;br /&gt;
|-&lt;br /&gt;
| Disk || || || &lt;br /&gt;
|-&lt;br /&gt;
| Network || || || &lt;br /&gt;
|-&lt;br /&gt;
| App idle in foreground || Network variations || || &lt;br /&gt;
|-&lt;br /&gt;
| App idle in background ||  Network variations || || &lt;br /&gt;
|-&lt;br /&gt;
| Audio || Media || || &lt;br /&gt;
|-&lt;br /&gt;
| Dropped Frame || Video|| || &lt;br /&gt;
|-&lt;br /&gt;
| Resolution Change || Media || || &lt;br /&gt;
|-&lt;br /&gt;
| Stall length || Media || || &lt;br /&gt;
|-&lt;br /&gt;
| AV sync || Media || || &lt;br /&gt;
|-&lt;br /&gt;
| Number of stalls || Media || || &lt;br /&gt;
|-&lt;br /&gt;
| AV sync || Media || || &lt;br /&gt;
|-&lt;br /&gt;
| Time to payback state change || Media || || &lt;br /&gt;
|-&lt;br /&gt;
| Real Time Communication (RTC) || Media || || &lt;br /&gt;
|-&lt;br /&gt;
| Frame per second (FPS) || Virtual Reality (VR) || || &lt;br /&gt;
|-&lt;br /&gt;
| Visual Distortion || Virtual Reality (VR) || || &lt;br /&gt;
|-&lt;br /&gt;
| Z-fighting || Virtual Reality (VR) || || &lt;br /&gt;
|-&lt;br /&gt;
| Judder || Virtual Reality (VR) || || &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Components===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Term !! Metadata !! Definition !! Relevant Links&lt;br /&gt;
|-&lt;br /&gt;
| Graphics || || || &lt;br /&gt;
|-&lt;br /&gt;
| Layout || || || &lt;br /&gt;
|-&lt;br /&gt;
| Parsing || Javascript || || &lt;br /&gt;
|-&lt;br /&gt;
| Compilation || Javascript || || &lt;br /&gt;
|-&lt;br /&gt;
| Network || || || &lt;br /&gt;
|-&lt;br /&gt;
| DOM || || || &lt;br /&gt;
|-&lt;br /&gt;
| Storage || || || &lt;br /&gt;
|-&lt;br /&gt;
| Media || || || &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Kmoir</name></author>
	</entry>
	<entry>
		<id>https://wiki.mozilla.org/index.php?title=Performance/Glossary&amp;diff=1228823</id>
		<title>Performance/Glossary</title>
		<link rel="alternate" type="text/html" href="https://wiki.mozilla.org/index.php?title=Performance/Glossary&amp;diff=1228823"/>
		<updated>2020-07-07T01:39:56Z</updated>

		<summary type="html">&lt;p&gt;Kmoir: /* Metrics */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Classification of user actions/flows that will be perceived as task with discrete performance expectations and settings/configurations that affect the raw performance of those tasks.&lt;br /&gt;
&lt;br /&gt;
==Pageload==&lt;br /&gt;
&lt;br /&gt;
=== Metrics ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Term !! Metadata !! Definition !! Relevant Links&lt;br /&gt;
|-&lt;br /&gt;
| || || One or two sentences || &lt;br /&gt;
* Full definition&lt;br /&gt;
* Related tests/coverage&lt;br /&gt;
* Results&lt;br /&gt;
* User research&lt;br /&gt;
|-&lt;br /&gt;
| SpeedIndex || Visual || (SI) is a page load performance metric that shows you how quickly the contents of a page are visibly populated. It is the average time at which visible parts of the page are displayed. Expressed in milliseconds, and dependent on the size of the viewport, the lower the score, the better.  ||[https://developer.mozilla.org/en-US/docs/Glossary/Speed_index MDN Documentation] &lt;br /&gt;
|-&lt;br /&gt;
| Contentful SpeedIndex || Visual || This metric uses edge detection to calculate the amount of “content” that is visible on each frame. It was designed to have a good metric to measure the amount of text that is visible and ignore the impact of popup or login screens at the end of a page load. || [https://www.sitespeed.io/documentation/sitespeed.io/metrics/#contentful-speed-index sitespeed.io documentation]&lt;br /&gt;
|-&lt;br /&gt;
|  Perceptual SpeedIndex || Visual || A metric that measures the above-the-fold visual performance of a webpage, while accounting for the layout stability.  || * [http://www.parvez-ahammad.org/blog/perceptual-speed-index-psi-for-measuring-above-fold-visual-performance-of-webpages Perceptual Speed Index (PSI) for measuring above-fold visual performance of webpages] &lt;br /&gt;
* [https://github.com/WPO-Foundation/visualmetrics Visual metrics github repo]&lt;br /&gt;
|-&lt;br /&gt;
| Visual Completeness || Visual  || The point in time when a web browser has finished rendering viewable content in the viewport, but not the entire page. || &lt;br /&gt;
|-&lt;br /&gt;
| First Paint event || Standard || The time between navigation and when the browser renders the first pixels to the screen, rendering anything that is visually different from what was on the screen prior to navigation.  || [https://developer.mozilla.org/en-US/docs/Glossary/First_paint MDN documentation]&lt;br /&gt;
|-&lt;br /&gt;
| First Contentful Paint || Standard || How long it takes the browser to render the first bit of content from the DOM providing the first feedback to the user the page is actually loading. || [[MDN Documentation|https://developer.mozilla.org/en-US/docs/Glossary/First_contentful_paint]]&lt;br /&gt;
|-&lt;br /&gt;
| DOMContentLoaded event || Standard || A DOM event that is fired once the underlying document has finished being parsed and loaded, but before any of its additional resources (stylesheets, images, subframes) have finished loading. || [https://developer.mozilla.org/en-US/docs/Web/API/Window/DOMContent MDN documentation]&lt;br /&gt;
|-&lt;br /&gt;
|  Onload event || Standard || A DOM event that is fired once the underlying document has finished loading, including all of its stylesheets, images and subframes. This does not include additional resources that start to load due to script. || [https://developer.mozilla.org/en-US/docs/Web/API/Window/load_event MDN Documentation]&lt;br /&gt;
|-&lt;br /&gt;
| Time to Interactive || Proposed standard || (TTI) is a non-standardized web performance &#039;progress&#039; metric defined as the point in time when the last Long Task finished and was followed by 5 seconds of network and main thread inactivity.&lt;br /&gt;
    &lt;br /&gt;
# The page has displayed useful content&lt;br /&gt;
# Event handlers are registered for most visible page elements&lt;br /&gt;
# When a user interacts with the page, the page consistently responds within 50ms - the user does not experience jank.&lt;br /&gt;
 || &lt;br /&gt;
* [https://developer.mozilla.org/en-US/docs/Glossary/Time_to_interactive MDN Documentation]&lt;br /&gt;
* [https://github.com/WICG/time-to-interactive Proposed web standard]&lt;br /&gt;
|-&lt;br /&gt;
| Cold page load ||  || browser started and stabilized/idle, same profile dir as previous, site not loaded or cache cleared  || &lt;br /&gt;
|-&lt;br /&gt;
| Warm page load ||  || browser started and stabilized/idle, same profile dir as previous, site already loaded once, any click-throughs clicked  || &lt;br /&gt;
|-&lt;br /&gt;
| Reload ||  || To re-request the rendering of a document. This may mean re-retrieving the entire document and any of its resources off of the network, or might mean reloading the resources out of a local cache.  || &lt;br /&gt;
|-&lt;br /&gt;
| Backwards/Forwards navigation ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| Level 1 cookie blocking || Tracking Protection ||  || &lt;br /&gt;
|-&lt;br /&gt;
| Level 2 cookie blocking || Tracking Protection ||  || &lt;br /&gt;
|-&lt;br /&gt;
| Level 1 content blocking || Tracking Protection||  || &lt;br /&gt;
|-&lt;br /&gt;
| Level 2 content blocking || Tracking Protection ||  || &lt;br /&gt;
|-&lt;br /&gt;
|  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Responsiveness (mobile vs Desktop) ===&lt;br /&gt;
&lt;br /&gt;
====Scroll====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Term !! Metadata !! Definition !! Relevant Links&lt;br /&gt;
|-&lt;br /&gt;
| Checkerboarding || Metrics || Checkerboarding occurs when Gecko is unable to paint the viewable portion of a webpage while we&#039;re scrolling. Instead, we just paint a color instead of the content. || &lt;br /&gt;
|-&lt;br /&gt;
| Velocity || Metrics || || &lt;br /&gt;
|-&lt;br /&gt;
| Touch|| Variations || || &lt;br /&gt;
|-&lt;br /&gt;
| Keyboard || Variations || || &lt;br /&gt;
|-&lt;br /&gt;
| Mouse/UI || Variations || || &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Browser====&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Term !! Metadata !! Desktop Definition !! Mobile Definition !! Relevant Links&lt;br /&gt;
|-&lt;br /&gt;
| Pageload Jank || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| Time to first blank || Open || The time from process start to display the very first painted frame. On Windows, this is currently a white rectangle, which we consider &amp;quot;first blank&amp;quot; || N/A ||&lt;br /&gt;
|-&lt;br /&gt;
| Time to first chrome paint || Open || The time from process start to displaying the first frame of the browser UI (not including the content area) || N/A ||&lt;br /&gt;
|-&lt;br /&gt;
| Time to settled about:home || Open || The time from process start to displaying a fully loaded about:home || N/A ||&lt;br /&gt;
|-&lt;br /&gt;
| Fresh profile || Open || new profile dir, user.js, first time network requests || Application process starts for the very first time. This includes onboarding, but no migration.  ||&lt;br /&gt;
|-&lt;br /&gt;
| Cold start || Open || The browser is started when it hasn&#039;t already been started in this operating system session, so the disk cache is empty. For example, the first time that Firefox starts up after the operating system boots is a cold start. || Application process is not running. Not a first run, and no onboarding. The application is started either via the homescreen or applink. In GPlay terminology, there&#039;s no stored state (i.e. no `onSaveInstanceState` bundles)  When the Fenix team measures cold start times, the generally measure from process start to visual completeness of the homescreen. ||&lt;br /&gt;
|-&lt;br /&gt;
| Warm start || Open || The browser starts when a previous instance of the browser was already started and shutdown within the same operating system session. || Application process is running, but the HomeActivity is not. The application is started either via the homescreen or applink. In GPlay terminology, &amp;quot;warm start&amp;quot; includes many situations and is not well defined. For example, it also includes if the app process is killed but there are `onSaveInstance` state bundles (which seems closer to Cold start)&lt;br /&gt;
&#039;&#039;&#039;This is not currently measured by the Fenix team.&#039;&#039;&#039; &lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
| Hot start || Open || Depending on user settings this will either open new window or new tab || Application process is running, HomeActivity is also running. The application is started either via the homescreen or applink, which brings the HomeActivity to the foreground.&lt;br /&gt;
&lt;br /&gt;
In GPlay terminology, `onTrimMemory` may or may not have been called)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;This is not currently measured by the Fenix team.&#039;&#039;&#039; &lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
| Delete history on close || Close || A non-default configuration that has Firefox forget all user browsing history on shut down. || N/A ||&lt;br /&gt;
|-&lt;br /&gt;
| From crash || Session Restore || || N/A ||&lt;br /&gt;
|-&lt;br /&gt;
| User initiated || Session Restore || || N/A ||&lt;br /&gt;
|- &lt;br /&gt;
| App link || Variations || N/A || ||&lt;br /&gt;
|-&lt;br /&gt;
| With WebExtension-&amp;gt;Theme || Variations || At least one or more WebExtension themes is installed, and one is enabled. || ||&lt;br /&gt;
|-&lt;br /&gt;
| With WebExtension-&amp;gt;Addon || Variations || At least one or more WebExtension addon is installed and enabled. || ||&lt;br /&gt;
|-&lt;br /&gt;
| Secure Proxy || Variations || The &amp;quot;Firefox Private Network&amp;quot; WebExtension. || ||&lt;br /&gt;
|-&lt;br /&gt;
| Time to interface change complete || UI || Click on a &amp;quot;share&amp;quot; button and the delay to when the display is shown. || ||&lt;br /&gt;
|-&lt;br /&gt;
| Open || Window || To open a new browser window.|| N/A ||&lt;br /&gt;
|-&lt;br /&gt;
| Close || Window || To close a new browser window. || N/A ||&lt;br /&gt;
|-&lt;br /&gt;
| Switch|| Window || To switch focus from one browser window to another. || N/A ||&lt;br /&gt;
|-&lt;br /&gt;
| Resize || Window || To resize a browser window. || N/A ||&lt;br /&gt;
|-&lt;br /&gt;
| Open || Tab || To open a new browser tab. || ||&lt;br /&gt;
|-&lt;br /&gt;
| Close || Tab || To close a new browser tab. || ||&lt;br /&gt;
|-&lt;br /&gt;
| Switch || Tab || To switch from one browser tab to another within the same window. || ||&lt;br /&gt;
|-&lt;br /&gt;
| Open || Menu || To open one of Firefox&#039;s built in toolbar menus or context menu. || ||&lt;br /&gt;
|-&lt;br /&gt;
| Close || Menu || To close one of Firefox&#039;s built in toolbar menus or context menu. || ||&lt;br /&gt;
|-&lt;br /&gt;
| Touch || Input || Input from the user via a touchscreen. || ||&lt;br /&gt;
|-&lt;br /&gt;
| Keyboard|| Input || Input from the user via the keyboard. || ||&lt;br /&gt;
|-&lt;br /&gt;
| Mouse || Input || Input from the user via a mouse. || ||&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Resource===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Term !! Metadata !! Definition !! Relevant Links&lt;br /&gt;
|-&lt;br /&gt;
| Memory || || || &lt;br /&gt;
|-&lt;br /&gt;
| Power || || || &lt;br /&gt;
|-&lt;br /&gt;
| CPU || || || &lt;br /&gt;
|-&lt;br /&gt;
| GPU || || || &lt;br /&gt;
|-&lt;br /&gt;
| Disk || || || &lt;br /&gt;
|-&lt;br /&gt;
| Network || || || &lt;br /&gt;
|-&lt;br /&gt;
| App idle in foreground || Network variations || || &lt;br /&gt;
|-&lt;br /&gt;
| App idle in background ||  Network variations || || &lt;br /&gt;
|-&lt;br /&gt;
| Audio || Media || || &lt;br /&gt;
|-&lt;br /&gt;
| Dropped Frame || Video|| || &lt;br /&gt;
|-&lt;br /&gt;
| Resolution Change || Media || || &lt;br /&gt;
|-&lt;br /&gt;
| Stall length || Media || || &lt;br /&gt;
|-&lt;br /&gt;
| AV sync || Media || || &lt;br /&gt;
|-&lt;br /&gt;
| Number of stalls || Media || || &lt;br /&gt;
|-&lt;br /&gt;
| AV sync || Media || || &lt;br /&gt;
|-&lt;br /&gt;
| Time to payback state change || Media || || &lt;br /&gt;
|-&lt;br /&gt;
| Real Time Communication (RTC) || Media || || &lt;br /&gt;
|-&lt;br /&gt;
| Frame per second (FPS) || Virtual Reality (VR) || || &lt;br /&gt;
|-&lt;br /&gt;
| Visual Distortion || Virtual Reality (VR) || || &lt;br /&gt;
|-&lt;br /&gt;
| Z-fighting || Virtual Reality (VR) || || &lt;br /&gt;
|-&lt;br /&gt;
| Judder || Virtual Reality (VR) || || &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Components===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Term !! Metadata !! Definition !! Relevant Links&lt;br /&gt;
|-&lt;br /&gt;
| Graphics || || || &lt;br /&gt;
|-&lt;br /&gt;
| Layout || || || &lt;br /&gt;
|-&lt;br /&gt;
| Parsing || Javascript || || &lt;br /&gt;
|-&lt;br /&gt;
| Compilation || Javascript || || &lt;br /&gt;
|-&lt;br /&gt;
| Network || || || &lt;br /&gt;
|-&lt;br /&gt;
| DOM || || || &lt;br /&gt;
|-&lt;br /&gt;
| Storage || || || &lt;br /&gt;
|-&lt;br /&gt;
| Media || || || &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Kmoir</name></author>
	</entry>
	<entry>
		<id>https://wiki.mozilla.org/index.php?title=Performance/Glossary&amp;diff=1228815</id>
		<title>Performance/Glossary</title>
		<link rel="alternate" type="text/html" href="https://wiki.mozilla.org/index.php?title=Performance/Glossary&amp;diff=1228815"/>
		<updated>2020-07-06T19:30:34Z</updated>

		<summary type="html">&lt;p&gt;Kmoir: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Metrics ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Term !! Metadata !! Definition !! Relevant Links&lt;br /&gt;
|-&lt;br /&gt;
| || || One or two sentences || &lt;br /&gt;
* Full definition&lt;br /&gt;
* Related tests/coverage&lt;br /&gt;
* Results&lt;br /&gt;
* User research&lt;br /&gt;
|-&lt;br /&gt;
| SpeedIndex || Visual || (SI) is a page load performance metric that shows you how quickly the contents of a page are visibly populated. It is the average time at which visible parts of the page are displayed. Expressed in milliseconds, and dependent on the size of the viewport, the lower the score, the better.  ||[https://developer.mozilla.org/en-US/docs/Glossary/Speed_index MDN Documentation] &lt;br /&gt;
|-&lt;br /&gt;
| Contentful SpeedIndex || Visual || This metric uses edge detection to calculate the amount of “content” that is visible on each frame. It was designed to have a good metric to measure the amount of text that is visible and ignore the impact of popup or login screens at the end of a page load. || [https://www.sitespeed.io/documentation/sitespeed.io/metrics/#contentful-speed-index sitespeed.io documentation]&lt;br /&gt;
|-&lt;br /&gt;
|  Perceptual SpeedIndex || Visual || A metric that measures the above-the-fold visual performance of a webpage, while accounting for the layout stability.  || * [http://www.parvez-ahammad.org/blog/perceptual-speed-index-psi-for-measuring-above-fold-visual-performance-of-webpages Perceptual Speed Index (PSI) for measuring above-fold visual performance of webpages] &lt;br /&gt;
* [https://github.com/WPO-Foundation/visualmetrics Visual metrics github repo]&lt;br /&gt;
|-&lt;br /&gt;
| Visual Completeness || Visual  || The point in time when a web browser has finished rendering viewable content in the viewport, but not the entire page. || &lt;br /&gt;
|-&lt;br /&gt;
| First Paint event || Standard || The time between navigation and when the browser renders the first pixels to the screen, rendering anything that is visually different from what was on the screen prior to navigation.  || [https://developer.mozilla.org/en-US/docs/Glossary/First_paint MDN documentation]&lt;br /&gt;
|-&lt;br /&gt;
| First Contentful Paint || Standard || How long it takes the browser to render the first bit of content from the DOM providing the first feedback to the user the page is actually loading. || [[MDN Documentation|https://developer.mozilla.org/en-US/docs/Glossary/First_contentful_paint]]&lt;br /&gt;
|-&lt;br /&gt;
| DOMContentLoaded event || Standard || A DOM event that is fired once the underlying document has finished being parsed and loaded, but before any of its additional resources (stylesheets, images, subframes) have finished loading. || [https://developer.mozilla.org/en-US/docs/Web/API/Window/DOMContent MDN documentation]&lt;br /&gt;
|-&lt;br /&gt;
|  Onload event || Standard || A DOM event that is fired once the underlying document has finished loading, including all of its stylesheets, images and subframes. This does not include additional resources that start to load due to script. || [https://developer.mozilla.org/en-US/docs/Web/API/Window/load_event MDN Documentation]&lt;br /&gt;
|-&lt;br /&gt;
| Time to Interactive || Proposed standard || (TTI) is a non-standardized web performance &#039;progress&#039; metric defined as the point in time when the last Long Task finished and was followed by 5 seconds of network and main thread inactivity.&lt;br /&gt;
    &lt;br /&gt;
# The page has displayed useful content&lt;br /&gt;
# Event handlers are registered for most visible page elements&lt;br /&gt;
# When a user interacts with the page, the page consistently responds within 50ms - the user does not experience jank.&lt;br /&gt;
 || &lt;br /&gt;
* [https://developer.mozilla.org/en-US/docs/Glossary/Time_to_interactive MDN Documentation]&lt;br /&gt;
* [https://github.com/WICG/time-to-interactive Proposed web standard]&lt;br /&gt;
|-&lt;br /&gt;
| Cold page load ||  || browser started and stabilized/idle, same profile dir as previous, site not loaded or cache cleared  || &lt;br /&gt;
|-&lt;br /&gt;
| Warm page load ||  || browser started and stabilized/idle, same profile dir as previous, site already loaded once, any click-throughs clicked  || &lt;br /&gt;
|-&lt;br /&gt;
| Reload ||  || To re-request the rendering of a document. This may mean re-retrieving the entire document and any of its resources off of the network, or might mean reloading the resources out of a local cache.  || &lt;br /&gt;
|-&lt;br /&gt;
| Backwards/Forwards navigation ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| Level 1 cookie blocking || Tracking Protection ||  || &lt;br /&gt;
|-&lt;br /&gt;
| Level 2 cookie blocking || Tracking Protection ||  || &lt;br /&gt;
|-&lt;br /&gt;
| Level 1 content blocking || Tracking Protection||  || &lt;br /&gt;
|-&lt;br /&gt;
| Level 2 content blocking || Tracking Protection ||  || &lt;br /&gt;
|-&lt;br /&gt;
|  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Responsiveness (mobile vs Desktop) ===&lt;br /&gt;
&lt;br /&gt;
====Scroll====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Term !! Metadata !! Definition !! Relevant Links&lt;br /&gt;
|-&lt;br /&gt;
| Checkerboarding || Metrics || Checkerboarding occurs when Gecko is unable to paint the viewable portion of a webpage while we&#039;re scrolling. Instead, we just paint a color instead of the content. || &lt;br /&gt;
|-&lt;br /&gt;
| Velocity || Metrics || || &lt;br /&gt;
|-&lt;br /&gt;
| Touch|| Variations || || &lt;br /&gt;
|-&lt;br /&gt;
| Keyboard || Variations || || &lt;br /&gt;
|-&lt;br /&gt;
| Mouse/UI || Variations || || &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Browser====&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Term !! Metadata !! Desktop Definition !! Mobile Definition !! Relevant Links&lt;br /&gt;
|-&lt;br /&gt;
| Pageload Jank || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| Time to first blank || Open || The time from process start to display the very first painted frame. On Windows, this is currently a white rectangle, which we consider &amp;quot;first blank&amp;quot; || N/A ||&lt;br /&gt;
|-&lt;br /&gt;
| Time to first chrome paint || Open || The time from process start to displaying the first frame of the browser UI (not including the content area) || N/A ||&lt;br /&gt;
|-&lt;br /&gt;
| Time to settled about:home || Open || The time from process start to displaying a fully loaded about:home || N/A ||&lt;br /&gt;
|-&lt;br /&gt;
| Fresh profile || Open || new profile dir, user.js, first time network requests || Application process starts for the very first time. This includes onboarding, but no migration.  ||&lt;br /&gt;
|-&lt;br /&gt;
| Cold start || Open || The browser is started when it hasn&#039;t already been started in this operating system session, so the disk cache is empty. For example, the first time that Firefox starts up after the operating system boots is a cold start. || Application process is not running. Not a first run, and no onboarding. The application is started either via the homescreen or applink. In GPlay terminology, there&#039;s no stored state (i.e. no `onSaveInstanceState` bundles)  When the Fenix team measures cold start times, the generally measure from process start to visual completeness of the homescreen. ||&lt;br /&gt;
|-&lt;br /&gt;
| Warm start || Open || The browser starts when a previous instance of the browser was already started and shutdown within the same operating system session. || Application process is running, but the HomeActivity is not. The application is started either via the homescreen or applink. In GPlay terminology, &amp;quot;warm start&amp;quot; includes many situations and is not well defined. For example, it also includes if the app process is killed but there are `onSaveInstance` state bundles (which seems closer to Cold start)&lt;br /&gt;
&#039;&#039;&#039;This is not currently measured by the Fenix team.&#039;&#039;&#039; &lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
| Hot start || Open || Depending on user settings this will either open new window or new tab || Application process is running, HomeActivity is also running. The application is started either via the homescreen or applink, which brings the HomeActivity to the foreground.&lt;br /&gt;
&lt;br /&gt;
In GPlay terminology, `onTrimMemory` may or may not have been called)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;This is not currently measured by the Fenix team.&#039;&#039;&#039; &lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
| Delete history on close || Close || A non-default configuration that has Firefox forget all user browsing history on shut down. || N/A ||&lt;br /&gt;
|-&lt;br /&gt;
| From crash || Session Restore || || N/A ||&lt;br /&gt;
|-&lt;br /&gt;
| User initiated || Session Restore || || N/A ||&lt;br /&gt;
|- &lt;br /&gt;
| App link || Variations || N/A || ||&lt;br /&gt;
|-&lt;br /&gt;
| With WebExtension-&amp;gt;Theme || Variations || At least one or more WebExtension themes is installed, and one is enabled. || ||&lt;br /&gt;
|-&lt;br /&gt;
| With WebExtension-&amp;gt;Addon || Variations || At least one or more WebExtension addon is installed and enabled. || ||&lt;br /&gt;
|-&lt;br /&gt;
| Secure Proxy || Variations || The &amp;quot;Firefox Private Network&amp;quot; WebExtension. || ||&lt;br /&gt;
|-&lt;br /&gt;
| Time to interface change complete || UI || Click on a &amp;quot;share&amp;quot; button and the delay to when the display is shown. || ||&lt;br /&gt;
|-&lt;br /&gt;
| Open || Window || To open a new browser window.|| N/A ||&lt;br /&gt;
|-&lt;br /&gt;
| Close || Window || To close a new browser window. || N/A ||&lt;br /&gt;
|-&lt;br /&gt;
| Switch|| Window || To switch focus from one browser window to another. || N/A ||&lt;br /&gt;
|-&lt;br /&gt;
| Resize || Window || To resize a browser window. || N/A ||&lt;br /&gt;
|-&lt;br /&gt;
| Open || Tab || To open a new browser tab. || ||&lt;br /&gt;
|-&lt;br /&gt;
| Close || Tab || To close a new browser tab. || ||&lt;br /&gt;
|-&lt;br /&gt;
| Switch || Tab || To switch from one browser tab to another within the same window. || ||&lt;br /&gt;
|-&lt;br /&gt;
| Open || Menu || To open one of Firefox&#039;s built in toolbar menus or context menu. || ||&lt;br /&gt;
|-&lt;br /&gt;
| Close || Menu || To close one of Firefox&#039;s built in toolbar menus or context menu. || ||&lt;br /&gt;
|-&lt;br /&gt;
| Touch || Input || Input from the user via a touchscreen. || ||&lt;br /&gt;
|-&lt;br /&gt;
| Keyboard|| Input || Input from the user via the keyboard. || ||&lt;br /&gt;
|-&lt;br /&gt;
| Mouse || Input || Input from the user via a mouse. || ||&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Resource===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Term !! Metadata !! Definition !! Relevant Links&lt;br /&gt;
|-&lt;br /&gt;
| Memory || || || &lt;br /&gt;
|-&lt;br /&gt;
| Power || || || &lt;br /&gt;
|-&lt;br /&gt;
| CPU || || || &lt;br /&gt;
|-&lt;br /&gt;
| GPU || || || &lt;br /&gt;
|-&lt;br /&gt;
| Disk || || || &lt;br /&gt;
|-&lt;br /&gt;
| Network || || || &lt;br /&gt;
|-&lt;br /&gt;
| App idle in foreground || Network variations || || &lt;br /&gt;
|-&lt;br /&gt;
| App idle in background ||  Network variations || || &lt;br /&gt;
|-&lt;br /&gt;
| Audio || Media || || &lt;br /&gt;
|-&lt;br /&gt;
| Dropped Frame || Video|| || &lt;br /&gt;
|-&lt;br /&gt;
| Resolution Change || Media || || &lt;br /&gt;
|-&lt;br /&gt;
| Stall length || Media || || &lt;br /&gt;
|-&lt;br /&gt;
| AV sync || Media || || &lt;br /&gt;
|-&lt;br /&gt;
| Number of stalls || Media || || &lt;br /&gt;
|-&lt;br /&gt;
| AV sync || Media || || &lt;br /&gt;
|-&lt;br /&gt;
| Time to payback state change || Media || || &lt;br /&gt;
|-&lt;br /&gt;
| Real Time Communication (RTC) || Media || || &lt;br /&gt;
|-&lt;br /&gt;
| Frame per second (FPS) || Virtual Reality (VR) || || &lt;br /&gt;
|-&lt;br /&gt;
| Visual Distortion || Virtual Reality (VR) || || &lt;br /&gt;
|-&lt;br /&gt;
| Z-fighting || Virtual Reality (VR) || || &lt;br /&gt;
|-&lt;br /&gt;
| Judder || Virtual Reality (VR) || || &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Components===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Term !! Metadata !! Definition !! Relevant Links&lt;br /&gt;
|-&lt;br /&gt;
| Graphics || || || &lt;br /&gt;
|-&lt;br /&gt;
| Layout || || || &lt;br /&gt;
|-&lt;br /&gt;
| Parsing || Javascript || || &lt;br /&gt;
|-&lt;br /&gt;
| Compilation || Javascript || || &lt;br /&gt;
|-&lt;br /&gt;
| Network || || || &lt;br /&gt;
|-&lt;br /&gt;
| DOM || || || &lt;br /&gt;
|-&lt;br /&gt;
| Storage || || || &lt;br /&gt;
|-&lt;br /&gt;
| Media || || || &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Kmoir</name></author>
	</entry>
	<entry>
		<id>https://wiki.mozilla.org/index.php?title=Performance/Glossary&amp;diff=1228814</id>
		<title>Performance/Glossary</title>
		<link rel="alternate" type="text/html" href="https://wiki.mozilla.org/index.php?title=Performance/Glossary&amp;diff=1228814"/>
		<updated>2020-07-06T19:10:19Z</updated>

		<summary type="html">&lt;p&gt;Kmoir: /* Metrics */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Metrics ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Term !! Metadata !! Definition !! Relevant Links&lt;br /&gt;
|-&lt;br /&gt;
| || || One or two sentences || &lt;br /&gt;
* Full definition&lt;br /&gt;
* Related tests/coverage&lt;br /&gt;
* Results&lt;br /&gt;
* User research&lt;br /&gt;
|-&lt;br /&gt;
| SpeedIndex || Visual || (SI) is a page load performance metric that shows you how quickly the contents of a page are visibly populated. It is the average time at which visible parts of the page are displayed. Expressed in milliseconds, and dependent on the size of the viewport, the lower the score, the better.  ||[https://developer.mozilla.org/en-US/docs/Glossary/Speed_index MDN Documentation] &lt;br /&gt;
|-&lt;br /&gt;
| Contentful SpeedIndex || Visual || This metric uses edge detection to calculate the amount of “content” that is visible on each frame. It was designed to have a good metric to measure the amount of text that is visible and ignore the impact of popup or login screens at the end of a page load. || [https://www.sitespeed.io/documentation/sitespeed.io/metrics/#contentful-speed-index sitespeed.io documentation]&lt;br /&gt;
|-&lt;br /&gt;
|  Perceptual SpeedIndex || Visual || A metric that measures the above-the-fold visual performance of a webpage, while accounting for the layout stability.  || * [http://www.parvez-ahammad.org/blog/perceptual-speed-index-psi-for-measuring-above-fold-visual-performance-of-webpages Perceptual Speed Index (PSI) for measuring above-fold visual performance of webpages] &lt;br /&gt;
* [https://github.com/WPO-Foundation/visualmetrics Visual metrics github repo]&lt;br /&gt;
|-&lt;br /&gt;
| Visual Completeness || Visual  || The point in time when a web browser has finished rendering viewable content in the viewport, but not the entire page. || &lt;br /&gt;
|-&lt;br /&gt;
| First Paint event || Standard || The time between navigation and when the browser renders the first pixels to the screen, rendering anything that is visually different from what was on the screen prior to navigation.  || [https://developer.mozilla.org/en-US/docs/Glossary/First_paint MDN documentation]&lt;br /&gt;
|-&lt;br /&gt;
| First Contentful Paint || Standard || How long it takes the browser to render the first bit of content from the DOM providing the first feedback to the user the page is actually loading. || [[MDN Documentation|https://developer.mozilla.org/en-US/docs/Glossary/First_contentful_paint]]&lt;br /&gt;
|-&lt;br /&gt;
| DOMContentLoaded event || Standard || A DOM event that is fired once the underlying document has finished being parsed and loaded, but before any of its additional resources (stylesheets, images, subframes) have finished loading. || [https://developer.mozilla.org/en-US/docs/Web/API/Window/DOMContent MDN documentation]&lt;br /&gt;
|-&lt;br /&gt;
|  Onload event || Standard || A DOM event that is fired once the underlying document has finished loading, including all of its stylesheets, images and subframes. This does not include additional resources that start to load due to script. || [https://developer.mozilla.org/en-US/docs/Web/API/Window/load_event MDN Documentation]&lt;br /&gt;
|-&lt;br /&gt;
| Time to Interactive || Proposed standard || (TTI) is a non-standardized web performance &#039;progress&#039; metric defined as the point in time when the last Long Task finished and was followed by 5 seconds of network and main thread inactivity.&lt;br /&gt;
    &lt;br /&gt;
# The page has displayed useful content&lt;br /&gt;
# Event handlers are registered for most visible page elements&lt;br /&gt;
# When a user interacts with the page, the page consistently responds within 50ms - the user does not experience jank.&lt;br /&gt;
 || &lt;br /&gt;
* [https://developer.mozilla.org/en-US/docs/Glossary/Time_to_interactive MDN Documentation]&lt;br /&gt;
* [https://github.com/WICG/time-to-interactive Proposed web standard]&lt;br /&gt;
|-&lt;br /&gt;
| Cold page load ||  || browser started and stabilized/idle, same profile dir as previous, site not loaded or cache cleared  || &lt;br /&gt;
|-&lt;br /&gt;
| Warm page load ||  || browser started and stabilized/idle, same profile dir as previous, site already loaded once, any click-throughs clicked  || &lt;br /&gt;
|-&lt;br /&gt;
| Reload ||  || To re-request the rendering of a document. This may mean re-retrieving the entire document and any of its resources off of the network, or might mean reloading the resources out of a local cache.  || &lt;br /&gt;
|-&lt;br /&gt;
| Backwards/Forwards navigation ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| Level 1 cookie blocking || Tracking Protection ||  || &lt;br /&gt;
|-&lt;br /&gt;
| Level 2 cookie blocking || Tracking Protection ||  || &lt;br /&gt;
|-&lt;br /&gt;
| Level 1 content blocking || Tracking Protection||  || &lt;br /&gt;
|-&lt;br /&gt;
| Level 2 content blocking || Tracking Protection ||  || &lt;br /&gt;
|-&lt;br /&gt;
|  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Responsiveness (mobile vs Desktop) ===&lt;br /&gt;
&lt;br /&gt;
====Scroll====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Term !! Metadata !! Definition !! Relevant Links&lt;br /&gt;
|-&lt;br /&gt;
| Checkerboarding || Metrics || Checkerboarding occurs when Gecko is unable to paint the viewable portion of a webpage while we&#039;re scrolling. Instead, we just paint a color instead of the content. || &lt;br /&gt;
|-&lt;br /&gt;
| Velocity || Metrics || || &lt;br /&gt;
|-&lt;br /&gt;
| Touch|| Variations || || &lt;br /&gt;
|-&lt;br /&gt;
| Keyboard || Variations || || &lt;br /&gt;
|-&lt;br /&gt;
| Mouse/UI || Variations || || &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Browser====&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Term !! Metadata !! Desktop Definition !! Mobile Definition !! Relevant Links&lt;br /&gt;
|-&lt;br /&gt;
| Pageload Jank || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| Time to first blank || Open || The time from process start to display the very first painted frame. On Windows, this is currently a white rectangle, which we consider &amp;quot;first blank&amp;quot; || N/A ||&lt;br /&gt;
|-&lt;br /&gt;
| Time to first chrome paint || Open || The time from process start to displaying the first frame of the browser UI (not including the content area) || N/A ||&lt;br /&gt;
|-&lt;br /&gt;
| Time to settled about:home || Open || The time from process start to displaying a fully loaded about:home || N/A ||&lt;br /&gt;
|-&lt;br /&gt;
| Fresh profile || Open || new profile dir, user.js, first time network requests || Application process starts for the very first time. This includes onboarding, but no migration.  ||&lt;br /&gt;
|-&lt;br /&gt;
| Cold start || Open || The browser is started when it hasn&#039;t already been started in this operating system session, so the disk cache is empty. For example, the first time that Firefox starts up after the operating system boots is a cold start. || Application process is not running. Not a first run, and no onboarding. The application is started either via the homescreen or applink. In GPlay terminology, there&#039;s no stored state (i.e. no `onSaveInstanceState` bundles)  When the Fenix team measures cold start times, the generally measure from process start to visual completeness of the homescreen. ||&lt;br /&gt;
|-&lt;br /&gt;
| Warm start || Open || The browser starts when a previous instance of the browser was already started and shutdown within the same operating system session. || Application process is running, but the HomeActivity is not. The application is started either via the homescreen or applink. In GPlay terminology, &amp;quot;warm start&amp;quot; includes many situations and is not well defined. For example, it also includes if the app process is killed but there are `onSaveInstance` state bundles (which seems closer to Cold start)&lt;br /&gt;
&#039;&#039;&#039;This is not currently measured by the Fenix team.&#039;&#039;&#039; &lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
| Hot start || Open || Depending on user settings this will either open new window or new tab || Application process is running, HomeActivity is also running. The application is started either via the homescreen or applink, which brings the HomeActivity to the foreground.&lt;br /&gt;
&lt;br /&gt;
In GPlay terminology, `onTrimMemory` may or may not have been called)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;This is not currently measured by the Fenix team.&#039;&#039;&#039; &lt;br /&gt;
||&lt;br /&gt;
|-&lt;br /&gt;
| Delete history on close || Close || A non-default configuration that has Firefox forget all user browsing history on shut down. || N/A ||&lt;br /&gt;
|-&lt;br /&gt;
| From crash || Session Restore || || N/A ||&lt;br /&gt;
|-&lt;br /&gt;
| User initiated || Session Restore || || N/A ||&lt;br /&gt;
|- &lt;br /&gt;
| App link || Variations || N/A || ||&lt;br /&gt;
|-&lt;br /&gt;
| With WebExtension-&amp;gt;Theme || Variations || At least one or more WebExtension themes is installed, and one is enabled. || ||&lt;br /&gt;
|-&lt;br /&gt;
| With WebExtension-&amp;gt;Addon || Variations || At least one or more WebExtension addon is installed and enabled. || ||&lt;br /&gt;
|-&lt;br /&gt;
| Secure Proxy || Variations || The &amp;quot;Firefox Private Network&amp;quot; WebExtension. || ||&lt;br /&gt;
|-&lt;br /&gt;
| Time to interface change complete || UI || Click on a &amp;quot;share&amp;quot; button and the delay to when the display is shown. || ||&lt;br /&gt;
|-&lt;br /&gt;
| Open || Window || To open a new browser window.|| N/A ||&lt;br /&gt;
|-&lt;br /&gt;
| Close || Window || To close a new browser window. || N/A ||&lt;br /&gt;
|-&lt;br /&gt;
| Switch|| Window || To switch focus from one browser window to another. || N/A ||&lt;br /&gt;
|-&lt;br /&gt;
| Resize || Window || To resize a browser window. || N/A ||&lt;br /&gt;
|-&lt;br /&gt;
| Open || Tab || To open a new browser tab. || ||&lt;br /&gt;
|-&lt;br /&gt;
| Close || Tab || To close a new browser tab. || ||&lt;br /&gt;
|-&lt;br /&gt;
| Switch || Tab || To switch from one browser tab to another within the same window. || ||&lt;br /&gt;
|-&lt;br /&gt;
| Open || Menu || To open one of Firefox&#039;s built in toolbar menus or context menu. || ||&lt;br /&gt;
|-&lt;br /&gt;
| Close || Menu || To close one of Firefox&#039;s built in toolbar menus or context menu. || ||&lt;br /&gt;
|-&lt;br /&gt;
| Touch || Input || Input from the user via a touchscreen. || ||&lt;br /&gt;
|-&lt;br /&gt;
| Keyboard|| Input || Input from the user via the keyboard. || ||&lt;br /&gt;
|-&lt;br /&gt;
| Mouse || Input || Input from the user via a mouse. || ||&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Kmoir</name></author>
	</entry>
	<entry>
		<id>https://wiki.mozilla.org/index.php?title=Performance/Glossary&amp;diff=1228812</id>
		<title>Performance/Glossary</title>
		<link rel="alternate" type="text/html" href="https://wiki.mozilla.org/index.php?title=Performance/Glossary&amp;diff=1228812"/>
		<updated>2020-07-06T18:19:20Z</updated>

		<summary type="html">&lt;p&gt;Kmoir: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Metrics ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Term !! Metadata !! Definition !! Relevant Links&lt;br /&gt;
|-&lt;br /&gt;
| || || One or two sentences || &lt;br /&gt;
* Full definition&lt;br /&gt;
* Related tests/coverage&lt;br /&gt;
* Results&lt;br /&gt;
* User research&lt;br /&gt;
|-&lt;br /&gt;
| SpeedIndex || Visual || (SI) is a page load performance metric that shows you how quickly the contents of a page are visibly populated. It is the average time at which visible parts of the page are displayed. Expressed in milliseconds, and dependent on the size of the viewport, the lower the score, the better.  ||[https://developer.mozilla.org/en-US/docs/Glossary/Speed_index MDN Documentation] &lt;br /&gt;
|-&lt;br /&gt;
| Contentful SpeedIndex || Visual || This metric uses edge detection to calculate the amount of “content” that is visible on each frame. It was designed to have a good metric to measure the amount of text that is visible and ignore the impact of popup or login screens at the end of a page load. || [https://www.sitespeed.io/documentation/sitespeed.io/metrics/#contentful-speed-index sitespeed.io documentation]&lt;br /&gt;
|-&lt;br /&gt;
|  Perceptual SpeedIndex || Visual || A metric that measures the above-the-fold visual performance of a webpage, while accounting for the layout stability.  || * [http://www.parvez-ahammad.org/blog/perceptual-speed-index-psi-for-measuring-above-fold-visual-performance-of-webpages Perceptual Speed Index (PSI) for measuring above-fold visual performance of webpages] &lt;br /&gt;
* [https://github.com/WPO-Foundation/visualmetrics Visual metrics github repo]&lt;br /&gt;
|-&lt;br /&gt;
| Visual Completeness || Visual  || The point in time when a web browser has finished rendering viewable content in the viewport, but not the entire page. || &lt;br /&gt;
|-&lt;br /&gt;
| First Paint event || Standard || The time between navigation and when the browser renders the first pixels to the screen, rendering anything that is visually different from what was on the screen prior to navigation.  || [https://developer.mozilla.org/en-US/docs/Glossary/First_paint MDN documentation]&lt;br /&gt;
|-&lt;br /&gt;
| First Contentful Paint || Standard || How long it takes the browser to render the first bit of content from the DOM providing the first feedback to the user the page is actually loading. || [[MDN Documentation|https://developer.mozilla.org/en-US/docs/Glossary/First_contentful_paint]]&lt;br /&gt;
|-&lt;br /&gt;
| DOMContentLoaded event || Standard || A DOM event that is fired once the underlying document has finished being parsed and loaded, but before any of its additional resources (stylesheets, images, subframes) have finished loading. || [https://developer.mozilla.org/en-US/docs/Web/API/Window/DOMContent MDN documentation]&lt;br /&gt;
|-&lt;br /&gt;
|  Onload event || Standard || A DOM event that is fired once the underlying document has finished loading, including all of its stylesheets, images and subframes. This does not include additional resources that start to load due to script. || [https://developer.mozilla.org/en-US/docs/Web/API/Window/load_event MDN Documentation]&lt;br /&gt;
|-&lt;br /&gt;
| Time to Interactive || Proposed standard || (TTI) is a non-standardized web performance &#039;progress&#039; metric defined as the point in time when the last Long Task finished and was followed by 5 seconds of network and main thread inactivity.&lt;br /&gt;
    &lt;br /&gt;
# The page has displayed useful content&lt;br /&gt;
# Event handlers are registered for most visible page elements&lt;br /&gt;
# When a user interacts with the page, the page consistently responds within 50ms - the user does not experience jank.&lt;br /&gt;
 || &lt;br /&gt;
* [https://developer.mozilla.org/en-US/docs/Glossary/Time_to_interactive MDN Documentation]&lt;br /&gt;
* [https://github.com/WICG/time-to-interactive Proposed web standard]&lt;br /&gt;
|-&lt;br /&gt;
| Cold page load ||  || browser started and stabilized/idle, same profile dir as previous, site not loaded or cache cleared  || &lt;br /&gt;
|-&lt;br /&gt;
| Warm page load ||  || browser started and stabilized/idle, same profile dir as previous, site already loaded once, any click-throughs clicked  || &lt;br /&gt;
|-&lt;br /&gt;
| Reload ||  || To re-request the rendering of a document. This may mean re-retrieving the entire document and any of its resources off of the network, or might mean reloading the resources out of a local cache.  || &lt;br /&gt;
|-&lt;br /&gt;
| Backwards/Forwards navigation ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
| Level 1 cookie blocking || Tracking Protection ||  || &lt;br /&gt;
|-&lt;br /&gt;
| Level 2 cookie blocking || Tracking Protection ||  || &lt;br /&gt;
|-&lt;br /&gt;
| Level 1 content blocking || Tracking Protection||  || &lt;br /&gt;
|-&lt;br /&gt;
| Level 2 content blocking || Tracking Protection ||  || &lt;br /&gt;
|-&lt;br /&gt;
|  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
|  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
|  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
|  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
|  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
|  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Kmoir</name></author>
	</entry>
	<entry>
		<id>https://wiki.mozilla.org/index.php?title=Performance/Glossary&amp;diff=1228807</id>
		<title>Performance/Glossary</title>
		<link rel="alternate" type="text/html" href="https://wiki.mozilla.org/index.php?title=Performance/Glossary&amp;diff=1228807"/>
		<updated>2020-07-06T17:20:05Z</updated>

		<summary type="html">&lt;p&gt;Kmoir: Created page with &amp;quot;{| class=&amp;quot;wikitable sortable&amp;quot; |- ! Term !! Metadata !! Definition !! Relevant Links |- | || || One or two sentences ||  * Full definition * Related tests/coverage * Results *...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Term !! Metadata !! Definition !! Relevant Links&lt;br /&gt;
|-&lt;br /&gt;
| || || One or two sentences || &lt;br /&gt;
* Full definition&lt;br /&gt;
* Related tests/coverage&lt;br /&gt;
* Results&lt;br /&gt;
* User research&lt;br /&gt;
|-&lt;br /&gt;
| SpeedIndex || Visual || (SI) is a page load performance metric that shows you how quickly the contents of a page are visibly populated. It is the average time at which visible parts of the page are displayed. Expressed in milliseconds, and dependent on the size of the viewport, the lower the score, the better.  ||[https://developer.mozilla.org/en-US/docs/Glossary/Speed_index MDN Documentation] &lt;br /&gt;
|-&lt;br /&gt;
|  ||  ||  || &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Kmoir</name></author>
	</entry>
	<entry>
		<id>https://wiki.mozilla.org/index.php?title=Auto-tools/Projects/Pulse&amp;diff=1224157</id>
		<title>Auto-tools/Projects/Pulse</title>
		<link rel="alternate" type="text/html" href="https://wiki.mozilla.org/index.php?title=Auto-tools/Projects/Pulse&amp;diff=1224157"/>
		<updated>2020-02-24T14:33:00Z</updated>

		<summary type="html">&lt;p&gt;Kmoir: /* To upgrade a ssl certificate on pulse.mozilla.org */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Introducing Pulse =&lt;br /&gt;
&lt;br /&gt;
Pulse is a managed [http://www.rabbitmq.com RabbitMQ] cluster designed to provide loose coupling between automation and infrastructure tools.  The goal of Pulse is to add visibility to Mozilla&#039;s tools and systems and to eliminate polling and other brittle methods of scraping data. This allows more robust, dynamic, and informative tools.&lt;br /&gt;
&lt;br /&gt;
Pulse is available at pulse.mozilla.org:5671 (AMQP over SSL).  It is hosted by [http://cloudamqp.com CloudAMQP].&lt;br /&gt;
&lt;br /&gt;
[[Auto-tools/Projects/Pulse/PulseGuardian|PulseGuardian]] is a tool that manages Pulse&#039;s users and queues (and eventually exchanges).  It is available at https://pulseguardian.mozilla.org and hosted by [http://heroku.com Heroku].&lt;br /&gt;
&lt;br /&gt;
We have a discussion forum available via the standard trio of [news:mozilla.tools.pulse USENET newsgroup], [https://lists.mozilla.org/listinfo/tools-pulse mailing list], and [https://groups.google.com/forum/#!forum/mozilla.tools.pulse Google Group].&lt;br /&gt;
&lt;br /&gt;
File bugs under [https://bugzilla.mozilla.org/enter_bug.cgi?product=Webtools&amp;amp;component=Pulse Webtools :: Pulse].  We don&#039;t have a separate component for PulseGuardian; rather, we just start the summaries with &amp;quot;[PulseGuardian]&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Also see the [https://tools.taskcluster.net/pulse-inspector/ Pulse Inspector] web app, which displays Pulse messages in real time, and the (manually updated) [[/Exchanges|list of Pulse exchanges]].&lt;br /&gt;
&lt;br /&gt;
= System Description =&lt;br /&gt;
&lt;br /&gt;
Pulse isn&#039;t any one thing.  At its heart, it is a RabbitMQ system with a particular configuration and a set of conventions for using it along with a management tool, [[Auto-tools/Projects/Pulse/PulseGuardian|PulseGuardian]], to make Pulse as automated and self-serve as possible.  Pulse follows the pub-sub pattern, in which publishers send messages to topic exchanges, and consumers create queues bound to these exchanges in order to subscribe to the publishers&#039; messages.  In general, publishers create and own exchanges, and consumers create and own queues.&lt;br /&gt;
&lt;br /&gt;
= Specification =&lt;br /&gt;
&lt;br /&gt;
Pulse is a managed [https://www.rabbitmq.com/resources/specs/amqp0-9-1.pdf AMQP 0-9-1]&lt;br /&gt;
service with [https://www.rabbitmq.com/extensions.html RabbitMQ extensions] for publishing messages from Mozilla&lt;br /&gt;
infrastructure. The aim is provide hooks that subscribers can&lt;br /&gt;
use to integrate and extend Mozilla infrastructure.&lt;br /&gt;
&lt;br /&gt;
== Authentication ==&lt;br /&gt;
&lt;br /&gt;
Pulse credentials are managed and issued by [[Auto-tools/Projects/Pulse/PulseGuardian|PulseGuardian]],&lt;br /&gt;
available at https://pulseguardian.mozilla.org. This service SHALL issue&lt;br /&gt;
an &#039;&#039;accessToken&#039;&#039; for any &#039;&#039;clientId&#039;&#039; that is registered&lt;br /&gt;
with &#039;&#039;authorized&#039;&#039; email address.&lt;br /&gt;
The accessToken is strictly secret and MUST NOT be shared&lt;br /&gt;
publicly. The clientId is not secret. When establishing an AMQP&lt;br /&gt;
connection, the clientId and accessToken MUST be used as&lt;br /&gt;
&#039;&#039;username&#039;&#039; and &#039;&#039;password&#039;&#039;, respectively.&lt;br /&gt;
&lt;br /&gt;
== Authorized Users ==&lt;br /&gt;
&lt;br /&gt;
Pulse is intended to be open to all Mozillians who want to&lt;br /&gt;
extend or integrate with Mozilla infrastructure. To guard against&lt;br /&gt;
abuse PulseGuardian users MUST authenticate via Persona. PulseGuardian SHOULD verify that users have a vouched Mozillians profile.&lt;br /&gt;
&lt;br /&gt;
== Publishers ==&lt;br /&gt;
&lt;br /&gt;
Publishers MUST name &#039;&#039;exchanges&#039;&#039; in the form &amp;lt;code&amp;gt;exchange/&amp;lt;clientId&amp;gt;/&amp;lt;name&amp;gt;&amp;lt;/code&amp;gt; where clientId is the userid used to bind/connect to the server. Attempts to name an exchange otherwise SHALL result in an authorization error. Exchanges MUST be &#039;&#039;topic exchanges&#039;&#039; and they MUST be declared &#039;&#039;durable&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Messages MUST contain a UTF-8-encoded [http://tools.ietf.org/html/rfc7159 JSON] payload, and&lt;br /&gt;
their &amp;lt;code&amp;gt;Content-Type&amp;lt;/code&amp;gt; MUST be &amp;lt;code&amp;gt;application/json&amp;lt;/code&amp;gt;.&lt;br /&gt;
Messages SHOULD NOT be larger than 8&amp;amp;nbsp;kB; deviations may be&lt;br /&gt;
feasible for low-traffic exchanges. Messages MUST NOT contain&lt;br /&gt;
secret or sensitive information; all exchanges and messages&lt;br /&gt;
SHALL be considered public.&lt;br /&gt;
&lt;br /&gt;
A message SHOULD carry a &#039;&#039;routing key&#039;&#039;, in which fields have a&lt;br /&gt;
fixed index from the left. Additionally, a message MAY be&lt;br /&gt;
&#039;&#039;cced&#039;&#039; to multiple routing keys, using the RabbitMQ&lt;br /&gt;
[https://www.rabbitmq.com/sender-selected.html &#039;&#039;Sender-selected Distribution&#039;&#039;] extension.&lt;br /&gt;
&lt;br /&gt;
Messages SHOULD be &#039;&#039;durable&#039;&#039; and SHOULD be published over&lt;br /&gt;
RabbitMQ [https://www.rabbitmq.com/confirms.html &#039;&#039;confirm-publish&#039;&#039; channels]. Otherwise, the&lt;br /&gt;
documentation MUST clearly reflect that messages from the&lt;br /&gt;
given exchange do not exhibit deliver &#039;&#039;at-least-once&#039;&#039; semantics.&lt;br /&gt;
&lt;br /&gt;
== Subscribers ==&lt;br /&gt;
&lt;br /&gt;
Subscribers MUST name &#039;&#039;queues&#039;&#039; in the form&lt;br /&gt;
&amp;lt;code&amp;gt;queue/&amp;lt;clientId&amp;gt;/&amp;lt;name&amp;gt;&amp;lt;/code&amp;gt;; attempts to name a queue otherwise&lt;br /&gt;
SHALL result in an authorization error. Queues MAY &#039;&#039;consume&#039;&#039;&lt;br /&gt;
from any exchange prefixed &amp;lt;code&amp;gt;exchange/&amp;lt;/code&amp;gt;; attempts to consume&lt;br /&gt;
from any other exchange SHALL result in an authentication error.&lt;br /&gt;
&lt;br /&gt;
Subscribers MAY limit the size of their queues using the RabbitMQ&lt;br /&gt;
[https://www.rabbitmq.com/maxlength.html &#039;&#039;Queue Length Limit&#039;&#039;] extension. Subscribers MUST NOT let&lt;br /&gt;
their queues grow unbounded; if left unattended, &#039;&#039;Pulse&#039;&#039;&lt;br /&gt;
SHALL notify the owner by email. Additionally, &#039;&#039;Pulse&#039;&#039; MAY delete&lt;br /&gt;
a queue which exceeds defined limits. Subscribers SHOULD specify a&lt;br /&gt;
prefetch limit using the RabbitMQ [https://www.rabbitmq.com/consumer-prefetch.html &#039;&#039;Consumer Prefetch&#039;&#039; limit] extension.&lt;br /&gt;
&lt;br /&gt;
Subscribers SHOULD use either &#039;&#039;durable&#039;&#039; queues or&lt;br /&gt;
&#039;&#039;auto-delete&#039;&#039; queues. Implementors are recommended to aim&lt;br /&gt;
for deliver-&#039;&#039;at-least-once&#039;&#039; semantics.&lt;br /&gt;
&lt;br /&gt;
== Appendix A: Everything in Bullet Points ==&lt;br /&gt;
&lt;br /&gt;
This is a summary of the above.&lt;br /&gt;
&lt;br /&gt;
Pulse:&lt;br /&gt;
* MUST offer registration at &amp;lt;code&amp;gt;pulse.mozilla.org&amp;lt;/code&amp;gt;&lt;br /&gt;
* MUST support [https://www.rabbitmq.com/resources/specs/amqp0-9-1.pdf AMQP 0-9-1] and these RabbitMQ extensions:&lt;br /&gt;
** [https://www.rabbitmq.com/confirms.html Confirms]&lt;br /&gt;
** [https://www.rabbitmq.com/consumer-prefetch.html Consumer Prefetch]&lt;br /&gt;
** [https://www.rabbitmq.com/maxlength.html Queue Length Limit]&lt;br /&gt;
** [https://www.rabbitmq.com/sender-selected.html Sender-selected Distribution]&lt;br /&gt;
* SHOULD exhibit deliver-&#039;&#039;at-least-once&#039;&#039; semantics&lt;br /&gt;
* MAY delete queues that grows beyond &#039;&#039;Pulse&#039;&#039; defined limits&lt;br /&gt;
* SHALL notify owner by email when a queue grows close to &#039;&#039;Pulse&#039;&#039;-defined limits.&lt;br /&gt;
&lt;br /&gt;
Publishers:&lt;br /&gt;
* SHOULD use [https://www.rabbitmq.com/confirms.html confirm-publish channels]&lt;br /&gt;
&lt;br /&gt;
Exchanges:&lt;br /&gt;
* MUST be named &amp;lt;code&amp;gt;exchange/&amp;lt;clientId&amp;gt;/&amp;lt;name&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
* MUST be topic exchanges&lt;br /&gt;
* MUST be durable&lt;br /&gt;
&lt;br /&gt;
Messages:&lt;br /&gt;
* MUST be UTF-8-encoded [http://tools.ietf.org/html/rfc7159 JSON]&lt;br /&gt;
* MUST carry &amp;lt;code&amp;gt;application/json&amp;lt;/code&amp;gt; as &amp;lt;code&amp;gt;Content-Type&amp;lt;/code&amp;gt;&lt;br /&gt;
* SHOULD be durable&lt;br /&gt;
* SHOULD be less than 8 KiB (for good performance)&lt;br /&gt;
* MAY be CC&#039;ed to [https://www.rabbitmq.com/sender-selected.html multiple routing keys]&lt;br /&gt;
* MUST NOT contain private or sensitive information&lt;br /&gt;
* SHOULD have a routing key where fields have a fixed index from the left&lt;br /&gt;
&lt;br /&gt;
Subscribers:&lt;br /&gt;
* SHOULD specify a [https://www.rabbitmq.com/consumer-prefetch.html &#039;&#039;consumer prefetch&#039;&#039; limit]&lt;br /&gt;
&lt;br /&gt;
Queues:&lt;br /&gt;
* MUST be named &amp;lt;code&amp;gt;queue/&amp;lt;clientId&amp;gt;/&amp;lt;name&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
* MAY have a [https://www.rabbitmq.com/maxlength.html limited length]&lt;br /&gt;
* MUST not grow unbounded&lt;br /&gt;
&lt;br /&gt;
= Let&#039;s Use It =&lt;br /&gt;
&lt;br /&gt;
There are currently two Pulse clients available. Please note that you can also connect to Pulse in other languages, provided you have an AMQP 0.9.1 library that will let you interact with AMQP exchanges. See https://github.com/rabbitmq/rabbitmq-tutorials#languages for example.&lt;br /&gt;
&lt;br /&gt;
== Python Pulse client library ==&lt;br /&gt;
&lt;br /&gt;
The [https://github.com/mozilla-services/mozillapulse mozillapulse] Python package provides classes for existing publishers, consumers, and messages so you can quickly build Pulse applications.  See the [https://github.com/mozilla-services/mozillapulse/blob/master/README.md README] to get started (although note that the test publisher is currently offline; see {{bug|1218976}}.  You can use another consumer, e.g. BuildConsumer, to verify your setup.).&lt;br /&gt;
&lt;br /&gt;
This library is somewhat inflexible, however, and should be rewritten. One idea is to turn TaskCluster&#039;s Python client into a standalone package.&lt;br /&gt;
&lt;br /&gt;
== Go (golang) Pulse client library ==&lt;br /&gt;
&lt;br /&gt;
This can be found here:&lt;br /&gt;
* http://taskcluster.github.io/pulse-go/&lt;br /&gt;
&lt;br /&gt;
Extensions for TaskCluster exchanges here (see section &amp;quot;AMQP APIs&amp;quot;):&lt;br /&gt;
* http://taskcluster.github.io/taskcluster-client-go/&lt;br /&gt;
&lt;br /&gt;
= Contributing =&lt;br /&gt;
&lt;br /&gt;
To set up a local system for development, see the [https://github.com/mozilla-services/mozillapulse/blob/master/HACKING.md HACKING.md] file included in the mozillapulse source.&lt;br /&gt;
&lt;br /&gt;
The main Pulse library (mozillapulse) and publisher shims (pulseshims) are written in Python, although there is also a Go library as mentioned in the section above.  We also want to provide a canonical JavaScript library at some point.  To hack on the main Pulse library, you should be comfortable in Python, and it&#039;s helpful to understand the basics of AMQP.  Knowledge of kombu is also useful.&lt;br /&gt;
&lt;br /&gt;
To hack on PulseGuardian, you should know some Python and JavaScript.  Experience with Flask, SQLAlchemy, and RabbitMQ are useful, but you can probably learn what you need as you fix bugs.&lt;br /&gt;
&lt;br /&gt;
Feel free to stop by #pulse or #ateam with questions!&lt;br /&gt;
&lt;br /&gt;
Here is the list of open, unassigned, mentored Pulse and PulseGuardian bugs to get you started.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;bugzilla&amp;gt;&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;quicksearch&amp;quot;: &amp;quot;status:new&amp;quot;,&lt;br /&gt;
        &amp;quot;product&amp;quot;: &amp;quot;Webtools&amp;quot;,&lt;br /&gt;
        &amp;quot;component&amp;quot;: &amp;quot;Pulse&amp;quot;,&lt;br /&gt;
        &amp;quot;f1&amp;quot;: &amp;quot;bug_mentor&amp;quot;,&lt;br /&gt;
        &amp;quot;o1&amp;quot;: &amp;quot;isnotempty&amp;quot;,&lt;br /&gt;
        &amp;quot;include_fields&amp;quot;: &amp;quot;id,summary,priority,status&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/bugzilla&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Once you have your feet wet and are ready to take on a more involved project, here is a list of all current Pulse bugs:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;bugzilla&amp;gt;&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;quicksearch&amp;quot;: &amp;quot;status:new,assigned,reopened,unconfirmed&amp;quot;,&lt;br /&gt;
        &amp;quot;product&amp;quot;: &amp;quot;Webtools&amp;quot;,&lt;br /&gt;
        &amp;quot;component&amp;quot;: &amp;quot;Pulse&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/bugzilla&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For mentored bugs, we use the User Story to provide a link back to this page, as well as any extra information for contributors, such as required knowledge or tools.  The basic text for mentored bugs should be &amp;quot;This is a mentored Pulse bug.  For general information on Pulse, see https://wiki.mozilla.org/Auto-tools/Projects/Pulse, which includes a section on Contributing.&amp;quot;  An example of extra text is &amp;quot;This bug also requires you to have a working mail server.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
= Road Map =&lt;br /&gt;
&lt;br /&gt;
See the [https://bugzilla.mozilla.org/buglist.cgi?resolution=---&amp;amp;query_format=advanced&amp;amp;component=Pulse&amp;amp;product=Webtools prioritized bug list] for all open issues and feature requests.&lt;br /&gt;
&lt;br /&gt;
= Security Model =&lt;br /&gt;
&lt;br /&gt;
This is summarized in the formal Pulse specification above.  What follows is the rationale and some technical implementation notes.&lt;br /&gt;
&lt;br /&gt;
In order to have a reliable, well behaved system, the following assertions will need to be true.&lt;br /&gt;
&lt;br /&gt;
* All users, publishers and consumers alike, must have their own accounts (no guest/public users).&lt;br /&gt;
* Only publishers should be able to declare exchanges.&lt;br /&gt;
* Only the publisher user account associated with a particular vhost should be allowed to publish messages to exchanges in the vhost.  In other words, exactly one user account should be allowed to publish messages within a given vhost.&lt;br /&gt;
* Only the user that created a particular queue should be allowed to consume from it.&lt;br /&gt;
&lt;br /&gt;
Since exchange and queue permissions go together, we&#039;ll need exchange and queue naming conventions mixed with restrictive permissions.  Each user will be restricted to a particular exchange and queue naming prefix.  Many users will be either consumers or publishers, but for simplicity, each user can do both.  Users will have full permissions on &amp;lt;code&amp;gt;&amp;quot;^exchange/&amp;lt;username&amp;gt;/.*$&amp;quot;&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;&amp;quot;^queue/&amp;lt;username&amp;gt;/.*$&amp;quot;&amp;lt;/code&amp;gt;.  They will also have read permissions to exchange/*.  This will both prevent users from writing to other users&#039; exchanges as well as prevent them from consuming from other users&#039; queues.  For convenience, if a consumer creates a nondurable queue, mozillapulse can assign a random suffix to the user&#039;s standard queue name prefix, i.e. &amp;lt;code&amp;gt;queue/&amp;lt;username&amp;gt;/&amp;lt;random string&amp;gt;&amp;lt;/code&amp;gt;, since the user wouldn&#039;t be able to create nor access a completely random server-assigned name.&lt;br /&gt;
&lt;br /&gt;
Note that this doesn&#039;t prevent a consumer from creating an exchange named as a queue, since the permission model doesn&#039;t distinguish between queues and exchanges, and consumers need the ability to create queues.  This is not particularly problematic, since no one would have permission to use that exchange.&lt;br /&gt;
&lt;br /&gt;
With this security model, we technically don&#039;t really need vhosts, since the names of the queues and exchanges the users can use are so specific.  There may still be a benefit in allowing apps to use the same queue name for different exchanges, though, which would be possible if each exchange had its own vhost.  The downside is that you cannot specify &amp;quot;all vhosts&amp;quot; when setting a user&#039;s permissions, so they would either have to list all vhosts they want to use when creating the user in PulseGuardian, and be able to update that list later, or PulseGuardian or some other app would have to automatically add new permissions to all users when a vhost is created.&lt;br /&gt;
&lt;br /&gt;
= Admin Procedures =&lt;br /&gt;
&lt;br /&gt;
dustin and the taskcluster team have access to the Pulse cluster on CloudAMQP and the following related services:&lt;br /&gt;
&lt;br /&gt;
* PulseGuardian should be deleting queues that are too long. If you need to manually delete a queue, use the Management UI. Try to ping the queue owner first before killing if possible.&lt;br /&gt;
&lt;br /&gt;
== To upgrade a ssl certificate on pulse.mozilla.org ==&lt;br /&gt;
&lt;br /&gt;
Open a bug with IT to generate a new certificate &lt;br /&gt;
{{bug|1532325}}&lt;br /&gt;
&lt;br /&gt;
IT needs to email support@cloudamqp.com with the new cert.  The cloudampq support team will install it on all our of cloudampq nodes.  After it has been installed, you can login to the administrative start the nodes one by one which will not result any downtime.  (Ensure you wait for the node to restart before restarting another one.)  Verify that the certs are installed on the nodes&lt;br /&gt;
&lt;br /&gt;
* https://sslanalyzer.comodoca.com/?url=pulse.mozilla.org&lt;br /&gt;
* https://sslanalyzer.comodoca.com/?url=orange-antelope-01.rmq.cloudamqp.com&lt;br /&gt;
* https://sslanalyzer.comodoca.com/?url=orange-antelope-02.rmq.cloudamqp.com&lt;br /&gt;
* https://sslanalyzer.comodoca.com/?url=orange-antelope-01.rmq.cloudamqp.com&lt;br /&gt;
&lt;br /&gt;
This should show the dates for the new certificate and that the cert is trusted by Mozilla and Microsoft.&lt;br /&gt;
&lt;br /&gt;
Cloudampq updated their web page since we last did this so that you should be able to upload the cert yourself and have it propagate.  See the admin console under &amp;quot;Certificate&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
= More reading =&lt;br /&gt;
&lt;br /&gt;
* [http://slides.com/mcote/pulse Slides] from a presentation on Pulse.&lt;br /&gt;
* [https://mrcote.info/blog/2015/02/16/pulse-update/ Update] on Pulse from 2015/02/16.&lt;br /&gt;
&lt;br /&gt;
LegNeato also wrote several blog posts on Pulse as he was building it.  They contain some more background if you&#039;re really interested.  They are linked below, in chronological order.&lt;br /&gt;
&lt;br /&gt;
* [http://christian.legnitto.com/blog/2010/07/17/mozilla-pulse-and-rabbitmq/ Mozilla Pulse and RabbitMQ]&lt;br /&gt;
* [http://christian.legnitto.com/blog/2010/08/20/push-notifications-for-bugzilla/ Push notifications for Bugzilla]&lt;br /&gt;
** This idea has been shelved for the time being, both due to security issues and performance.  See [[BMO/ChangeNotificationSystem]] for an alternative.&lt;br /&gt;
* [http://christian.legnitto.com/blog/2010/09/10/bugzilla-amqp-is-now-buzgilla-push-supports-the-stomp-protocol/ bugzilla-amqp is now buzgilla-push, supports the STOMP protocol]&lt;br /&gt;
** See above note.  Just keeping these links for interest&#039;s sake.&lt;br /&gt;
* [http://christian.legnitto.com/blog/2010/10/15/whats-up-with-pulse/ What’s up with Pulse?]&lt;br /&gt;
* [http://christian.legnitto.com/blog/2010/11/23/github-amqp-integration-service-hook-live/ GitHub AMQP integration service hook live!]&lt;br /&gt;
** Tangentially related to Pulse.&lt;br /&gt;
* [http://christian.legnitto.com/blog/2010/12/06/lots-of-pulse-changes-out-of-prototype-mode-this-week/ Lots of Pulse changes, out of prototype mode this week!]&lt;br /&gt;
* [http://christian.legnitto.com/blog/2010/12/22/another-update-on-pulse/ Another update on Pulse]&lt;/div&gt;</summary>
		<author><name>Kmoir</name></author>
	</entry>
	<entry>
		<id>https://wiki.mozilla.org/index.php?title=MozWeek/Berlin2020&amp;diff=1222083</id>
		<title>MozWeek/Berlin2020</title>
		<link rel="alternate" type="text/html" href="https://wiki.mozilla.org/index.php?title=MozWeek/Berlin2020&amp;diff=1222083"/>
		<updated>2020-01-08T15:53:23Z</updated>

		<summary type="html">&lt;p&gt;Kmoir: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;What is it?&#039;&#039;&#039; -- Multiple team meetings, happening in the same city, at the same time + some opportunity to get together as one big group as well as with other teams as it makes sense. Then, on the last day, we have a fun social event for all, Mozilla-style! &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;The information on this wiki primarily applies to Full time and contractor staff. If you are a volunteer contributor please inquire with your community manager/program manager about [[All_Hands/Contributor_nominations|contributor nominations]], interns please inquire to your coordinator. Volunteer contributors who have recieved an invitation can find relevant information [[All_Hands/Berlin2020/contributors|here]]. &#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==&#039;&#039;&#039;Dates and Location&#039;&#039;&#039;==&lt;br /&gt;
Monday, January 27, 2020 - Friday, January 31, 2020 (travel days are Monday, Jan 27 &amp;amp; Saturday, Feb 1) in Berlin, Germany.&lt;br /&gt;
&lt;br /&gt;
We have guestrooms at three hotels: [https://www.ihg.com/intercontinental/hotels/us/en/berlin/berha/hoteldetail InterContinental Berlin], [https://www.pullman-berlin-schweizerhof.com/en/ Hotel Pullman Schweizerhof], and [https://www.hotel-berlin.de/en/ Hotel Berlin, Berlin].  [https://drive.google.com/open?id=1eu_rYMxuc_hgSNqCJxW7Vn32pYMNayPa&amp;amp;usp=sharing View on map].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;*For those countries where rest time is required on weekends (vs. work travel), Mozilla will cover a return on the next available work day, if you choose. This needs to pre-approved and pre-arranged.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==&#039;&#039;&#039;Registration&#039;&#039;&#039;==&lt;br /&gt;
This is an invite-only event. All full time and Elance/Upwork employees are expected to attend this all company event. Contractors, Vendors and seasonal employees are included on a case by case evaluation based upon team needs and upon executive review and approval. &lt;br /&gt;
&lt;br /&gt;
Advance registration is required. Attendees will need to wear their event badge at all times, including to evening events. We will have security at our events who will be ensuring everyone in our space should be there. This includes facilitators, and other related business guests. &lt;br /&gt;
&lt;br /&gt;
=====New Hires=====&lt;br /&gt;
We have a process to identify qualified regular full time new hires and Brianna will invite all new hires to register and book travel directly on their start date. No action is necessary from hiring managers other than to let them know about the event (please do not forward any links). Please work closely with your recruiting manager as they are aware of all deadlines.&lt;br /&gt;
&lt;br /&gt;
All regular full time new hires must have a start date of January 6, 2020 or earlier and in workday by December 13, 2019. Final invites were extended on December 16, 2019. Contractors/vendors required executive approval and those who are hired after the approval period will not be invited, please see process/timeline [https://docs.google.com/document/d/1lbxsJwkorleL6tchh5tL_yCeFZmHz7Qm5Lumm7u7-JA/edit?ts=5d6950bd here]. If you have any questions, please email bmark@mozilla.com.&lt;br /&gt;
&lt;br /&gt;
=====Volunteer Contributors=====&lt;br /&gt;
There are a number of policies that apply specifically to contributors that are different than for staff. Please look [[All_Hands/Berlin2020/contributors|here]] for all contributor specific instructions and policies.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Local contributors:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Please note that because of the extensive nomination and screening process we apply to all contributors who attend the event - we are unable to invite local contributors or temporary participants to the event outside of the regular nomination and screening process.&lt;br /&gt;
&lt;br /&gt;
=====Registration Changes=====&lt;br /&gt;
Everyone who registered received a confirmation email titled &amp;quot;Registration Confirmation to Mozilla Berlin All Hands&amp;quot; which shows you how you answered each question. If you didn&#039;t get the email and/or need to make changes to your registration, please email mozilla@shworldwide.com.&lt;br /&gt;
&lt;br /&gt;
==&#039;&#039;&#039;Immigration&#039;&#039;&#039;==&lt;br /&gt;
If you have any questions about immigration, please email immigration@mozilla.com. &lt;br /&gt;
&lt;br /&gt;
==== STEP ====&lt;br /&gt;
&#039;&#039;&#039;What is STEP?&#039;&#039;&#039; &lt;br /&gt;
The [https://step.state.gov/ Smart Traveler Enrollment Program (STEP)] is a free service to allow U.S. citizens and nationals traveling abroad to enroll their trip with the nearest U.S. Embassy or Consulate. &lt;br /&gt;
Benefits of Enrolling in STEP &lt;br /&gt;
* Receive important information from the Embassy about safety conditions in your destination country, helping you make informed decisions about your travel plans.&lt;br /&gt;
* Help the U.S. Embassy contact you in an emergency, whether natural disaster, civil unrest, or family emergency.&lt;br /&gt;
* Help family and friends get in touch with you in an emergency.&lt;br /&gt;
&lt;br /&gt;
==== Visas ====&lt;br /&gt;
You do not need a visa if you hold a passport issued from the EU, USA, Australia, New Zealand, Taiwan, or Canada. &lt;br /&gt;
Please see here to confirm the entry document requirements for the country you’re from: https://www.auswaertiges-amt.de/en/einreiseundaufenthalt/visabestimmungen-node/staatenlistevisumpflicht-node &lt;br /&gt;
&lt;br /&gt;
If you are from a country that requires a visa to enter Germany, please plan to obtain one as early as possible as government processing times constantly change. You can find a broad overview of the process here: https://www.auswaertiges-amt.de/en/einreiseundaufenthalt/visabestimmungen-node . For more detailed instructions regarding the visa process you will need to refer to the website of your nearest Mission/Consulate General. You will be able to learn more about the process by searching for “business visa” or “visitor visa” on the website for that German Mission.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Please keep in mind that while you are traveling for work, you are not traveling for a German based job.&#039;&#039;&#039; All Hands is a business conference/event. As you book your travel please also keep in mind that you could require a transit visa if you have a layover in a country that requires it. &lt;br /&gt;
&lt;br /&gt;
If you have questions specific to your circumstances, please email immigration@mozilla.com. &lt;br /&gt;
&lt;br /&gt;
==== Entering Germany ====&lt;br /&gt;
Your passport or identity card will be checked when you arrive at an EU port or airport to make sure you’re allowed to come into the country. The passport must be valid for the whole of your stay. You may also need a visa to come into or travel through Germany, depending on your nationality. &lt;br /&gt;
* If you are from an EEA country or Switzerland, you can enter Germany with either a valid passport or a national identity card issued by a EEA country. &lt;br /&gt;
* If you need a United States Passport, start here: https://travel.state.gov/content/passports/en/passports.html. Please note it can take 4-6 weeks to receive your passport. Please plan ahead. &lt;br /&gt;
&lt;br /&gt;
==== EU Visa Waiver Program Suspension - Update ====&lt;br /&gt;
In March 2019 the EU announced that the visa free entry requirements for third country visitors to Europe would be changing. This change will not go into affect until 1 January 2021, note this is one year after our Berlin All Hands trip. After this date, citizens from certain countries, including the USA and Canada, will be required to obtain an ETIAS travel authorization before they can enter Europe.&lt;br /&gt;
&lt;br /&gt;
==== More details: ==== &lt;br /&gt;
Mission websites in popular Mozillian locations:&lt;br /&gt;
* United States: https://www.germany.info/us-en/service/05-VisaEinreise/business-visa/963542&lt;br /&gt;
* Canada: https://canada.diplo.de/ca-en/consular-services/visa/shortstay&lt;br /&gt;
* UK: https://uk.diplo.de/uk-en/02/visa&lt;br /&gt;
* Paris: https://allemagneenfrance.diplo.de/fr-de/service/00-visa-seite&lt;br /&gt;
* Taiwan: https://taipei.diplo.de/tw-en/service/visa&lt;br /&gt;
* Beijing: https://china.diplo.de/cn-zh/service/visa-einreise/schengenvisum/1343246&lt;br /&gt;
* India: https://india.diplo.de/in-en/service/-/1908794&lt;br /&gt;
&lt;br /&gt;
==&#039;&#039;&#039;Travel to Berlin&#039;&#039;&#039;==&lt;br /&gt;
Bookings to Berlin are done. The Egencia instructions were emailed to &#039;&#039;&#039;anyone approved to attend&#039;&#039;&#039;. New hires have individual deadlines based upon hire/start date. Approved contractors, vendors, seasonal, status employees were notified with an email from bmark@mozilla.com with specific instructions. &lt;br /&gt;
&lt;br /&gt;
Specific instructions were about how to book, as we have a new process for anyone based outside the US, Canada &amp;amp; Central/South America. APAC employees will &#039;&#039;&#039;NOT&#039;&#039;&#039; be booking your All Hands travel in country based site, and will be using Egencia Americas. European employees &#039;&#039;&#039;WILL&#039;&#039;&#039; be booking in your country based site to allow access to trains and low cost airlines. &lt;br /&gt;
&lt;br /&gt;
Should you need to reach someone at &#039;&#039;&#039;Egencia Americas&#039;&#039;&#039; for special circumstances or changes that can&#039;t be done online:&lt;br /&gt;
*Call+1 (800) 361-1120 or +1(702)939-2533; Hours of operations are Monday – Friday (except holidays) 5:00 AM– 6:00 PM PT or 8:00 AM – 9:00 PM ET or 12:00 PM - 1:00 AM UTC. If you call outside these hours, you will get an after-hours agent (not a meeting agent, who may not be as helpful) . Please ensure the agent you speak with knows you are booking for a meeting.&lt;br /&gt;
*Email: groupagents@customercare.egencia.com. The email is monitored Monday - Friday.&lt;br /&gt;
&lt;br /&gt;
Other Egencia contact details:&lt;br /&gt;
*Egencia UK+EMEA - Email: customer_service@egencia.co.uk; UK Local #: +44 203 077 2536 (charged at local rate). For calls made outside the UK, please dial +00 44 161 233 5525. (From anywhere outside the EU, please dial +011 44...)&lt;br /&gt;
*Egencia FR - Email: service_client@egencia.fr; France Local #: +33 8 11 65 66 53. For calls made outside France, please dial +33 4 86 06 15 18 (From anywhere outside the EU, please dial +011 33)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Important Details:&#039;&#039;&#039;&lt;br /&gt;
Everyone should plan to arrive in Berlin Tegel Airport (TXL) on Monday, January 27 and leave on Saturday, February 1. Anyone who plans to arrive ahead of that or to stay longer, regardless of the reason, must follow the &amp;quot;arriving early/departing late guidelines.&amp;quot; These guidelines also apply if you want to fly in or out of airports other than your home airport and Berlin Tegel (anything custom). A few notes:&lt;br /&gt;
*If you are a vendor (paid by a company other than Mozilla or Upwork), contractor, or seasonal staff, those approved will be sent separate email.&lt;br /&gt;
*Volunteers will be handled separate from this process.&lt;br /&gt;
*We work closely with Recruiting to ensure new hires are invited after their start date. No need to let us know about these.&lt;br /&gt;
*If you would like to invite someone who is a business partner, facilitator or some other category that isn&#039;t an employee or volunteer (not a personal guest/family), email bmark@mozilla.com.&lt;br /&gt;
*Change fees and changes in airfare will be covered by Mozilla for business reasons only. Please email bmark@mozilla.com ahead of calling Egencia to make the change. If the change is specific for all hands, payment can be made centrally. If a change is due to a team specific need, you will need to provide payment over the phone and submit for reimbursement with manager approval. Any changes for personal reasons must be paid by the employee directly to Egencia over the phone (see next point)&lt;br /&gt;
*If you&#039;d like to change your itinerary for personal reasons, please call Egencia directly (numbers above( and be prepared to provide payment for the change fee and any change in airfare over the phone. &lt;br /&gt;
&lt;br /&gt;
====Arriving Early/Departing Late Guidelines====&lt;br /&gt;
&lt;br /&gt;
Our standard travel guidelines apply (pre-populated in Egencia) when booking with a few additional budget constraints. Anything booked outside of them will require approval. Most people will arrive on Monday, January 27 and leave on Saturday, February 1. Here are some exceptions: &lt;br /&gt;
&lt;br /&gt;
# If you plan to spend some extra &#039;&#039;&#039;personal time in Berlin/Europe&#039;&#039;&#039; or nearby (choosing to arrive before Monday, Jan 27 or depart after Saturday, Feb 1), you&#039;ll need to create a itinerary in Egencia for standard dates/locations within the Egencia Portal and compare to the custom dates/locations you&#039;d like. Pricing for the standard dates should be &#039;&#039;Round Trip only&#039;&#039;. Pricing for custom dates/locations should be for &#039;&#039;Round trip or Multi city trips only&#039;&#039;. Please share the difference via email to bmark@mozilla.com and receive approval ahead of submission in Egencia. You can &#039;&#039;sway up to +$100 over&#039;&#039; and Mozilla will cover it. Otherwise you&#039;ll need to come with an alternate itinerary that fits within the pricing (like a round trip in and out of TXL w/ longer dates, and you personally book &amp;amp; cover the rest). Please note that one way trips are only approved on a case by case basis. Do not book one ways without prior approval. &#039;&#039;We &#039;&#039;&#039;do not&#039;&#039;&#039; have the ability for employees to reimburse Mozilla for any overage.&#039;&#039; This scenario also applies for routing through different airports to/from Berlin Tegel than your home airport (ex. a layover in London for a few days, or flying out of something other than TXL). &lt;br /&gt;
# If you are attending the &#039;&#039;&#039;Sunday/Monday CI event&#039;&#039;&#039; (by invite), you can arrive on Sunday, January 26.&lt;br /&gt;
# If you would like to arrive early to &#039;&#039;&#039;recover from jetlag&#039;&#039;&#039;, you will need manager approval for any additional costs associated with the extension. There is &#039;&#039;&#039;no unilateral&#039;&#039;&#039; &amp;quot;All Hands&amp;quot; approval based upon timezone to arrive early. For hotel, you will book and pay on your own, and expense the manager approved amount (which is coded to your cost center). This policy does not apply to volunteer contributors, any jetlag recovery costs must be self funded.&lt;br /&gt;
# If you are celebrating the &#039;&#039;&#039;Lunar New Year&#039;&#039;&#039;, [https://wiki.mozilla.org/All_Hands/Berlin2020#Lunar_New_Year see here].&lt;br /&gt;
# If you live in a country where &#039;&#039;&#039;work travel is prohibited on weekends&#039;&#039;&#039;, you may travel on Friday, Jan 24 and Monday, Feb 3, if you’d prefer (not required). For hotel, you will book and pay on your own, and expense the manager approved amount (which is coded to your cost center). You must have approval from our benefits team in writing (and send to bmark@mozilla.com) &#039;&#039;&#039;prior&#039;&#039;&#039; to booking any travel. Approvals and expenses will not be applied retroactively. &lt;br /&gt;
# If you live in a country where &#039;&#039;&#039;work travel is prohibited on Sunday&#039;&#039;&#039;, you may travel on Saturday, Jan 25, if you’d prefer (not required). For hotel, you will book and pay on your own, and expense the manager approved amount (which is coded to your cost center). You must have approval from our benefits team in writing (and send to bmark@mozilla.com) &#039;&#039;&#039;prior&#039;&#039;&#039; to booking any travel. Approvals and expenses will not be applied retroactively.&lt;br /&gt;
# If you&#039;d like to make changes to extend your stay on either side after booking, you will be responsible for all change fees and change in airfare. &lt;br /&gt;
&lt;br /&gt;
====Booking Family Travel====&lt;br /&gt;
Whether your family will accompany you on your flight or join us later; and you have two options: direct with the airline (recommended) or through Egencia.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Direct (recommended):&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
First, figure out which flights you want to be on as an employee in Egencia. Hold them in Egencia. Find the flights you want for your family on the airline site and book them. Go back to Egencia and book your flights. Once you have both sets of confirmation numbers, call the airline and ask them to LINK your two reservations. This shows that you are traveling together and shouldn&#039;t be moved. When you call, you can also ask the airline agent to assign seats together. By booking your family direct on the airline, it gives them &amp;quot;priority&amp;quot; with the airline over people who book via a third party (expedia, booking.com, kayak, etc). These aren&#039;t guarantees, but they do help.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Via Egencia:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
We do not recommend booking family through Egencia. If you&#039;d like details about how to do it, please email bmark@mozilla.com&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Notes:&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
* If your family is arriving on a different flights than you but would like to take advantage of the airport shuttles on Sunday/Monday and/or Saturday, please email their itinerary to mozilla@shworldwide.com.&lt;br /&gt;
* We are unable to accommodate volunteer contributor families/guests.&lt;br /&gt;
* As of 20 November, we only have rooms that can accommodate 2 adults. If a larger room is needed, it will need to be booked and paid for on your own.&lt;br /&gt;
&lt;br /&gt;
====Not Flying====&lt;br /&gt;
Mozilla will reimburse U-Bahn tickets for those based in the Berlin area for getting to/from hotels. For more information on the U-Bahn, please see the Berlin office guide on [https://mana.mozilla.org/wiki/display/WPR/Berlin+Office+Guide#BerlinOfficeGuide-MovingAroundBerlin mana]. &lt;br /&gt;
&lt;br /&gt;
For those outside of the Berlin area who are taking the train, please book by November 10. Instructions were emailed to everyone. &lt;br /&gt;
&lt;br /&gt;
Parking is not reimbursable.&lt;br /&gt;
&lt;br /&gt;
====Travel Insurance====&lt;br /&gt;
Mozilla provides emergency medical accident and illness cover for all global MoCo employees/interns and their dependents. You can view more information on [https://mana.mozilla.org/wiki/display/PR/Travel+Insurance+-+Business Mana]. This coverage begins at the time the you leave home to start your business trip. It also has a provision for a 14 day extension for leisure travel outside of the business travel. If you have additional questions, please email benefits@mozilla.com. &lt;br /&gt;
&lt;br /&gt;
Mozilla does not cover travel insurance for elancers, upworkers, contractors, vendors, or volunteers/community members (unless required for visa application).&lt;br /&gt;
&lt;br /&gt;
====Air Travel Fine Print====&lt;br /&gt;
*Change fees will be covered by Mozilla for &#039;&#039;&#039;business reasons only&#039;&#039;&#039;. If you need a change and have manager approval, email bmark@mozilla.com &#039;&#039;&#039;prior to requesting the change with Egencia&#039;&#039;&#039;. Once you have approval, call Egencia to make the change at 1-877-255-1090 (note this will not be possible without prior approval so be sure to get that by way of an email from your manager to Brianna Mark). If you are changing for personal reasons, the change in airfare, change fee and Egencia fee is your responsibility.&lt;br /&gt;
*Mozilla will &#039;&#039;&#039;not&#039;&#039;&#039; reimburse for Business/First class upgrades, tickets or seat reservations. &lt;br /&gt;
*Mozilla will reimburse for one checked bag each way.&lt;br /&gt;
*&#039;&#039;Mozilla Frequent Flyer perks do not apply for All Hands&#039;&#039;. &lt;br /&gt;
*Flights booked outside of Egencia will not be an approved expense unless email approval by Brianna is obtained prior to booking.&lt;br /&gt;
*Any submitted expenses needs to have an itinerary attached to ensure it is employee expenses only and within policy.&lt;br /&gt;
&lt;br /&gt;
====Ground Transportation====&lt;br /&gt;
=====Shuttles to hotels=====&lt;br /&gt;
Berlin Tegel airport is open from 4:00 - 0:00. &lt;br /&gt;
Shuttles will be provided from Berlin Tegel Airport (TXL) to our 3 hotels:&lt;br /&gt;
*Sunday, Jan 26 from 9:00 - 22:00, for flights landing between 7:45 and 21:45.&lt;br /&gt;
*Monday, Jan 27 from 8:00 - 23:00, for flights landing between 7:15 and 22:55.&lt;br /&gt;
&lt;br /&gt;
Shuttles will drop at Hotel Berlin, Berlin and InterCon Berlin. Those staying at Pullman will get off at InterCon and walk across the street. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Arrival at Terminal A:&#039;&#039;&#039;&lt;br /&gt;
Once you have arrived at Terminal A, you will pick up any checked luggage at baggage claim located near your arrival gate. Once you have your checked luggage you can exit the secure area of Terminal A. There will be staff holding Mozilla signs &amp;amp; wearing bright blue Mozilla shirts directing you to the shuttle. You will exit the main hall of TXL and walk past the public buses to the bus parking area where the Mozilla shuttle will be. The shuttle will depart every 30 minutes (approx on the :00 and :30 each hour).&lt;br /&gt;
&lt;br /&gt;
Terminal A Airlines: Aegean, Air Canada, Air France, All Nippon Airways, American Airlines, Austrian Airlines, British Airways, Brussels Airlines, China Southern Airlines, Delta, Etihad Airways, Finnair, Iberia 3672, Icelandair, KLM, LOT-Polish Airlines, Lufthansa, Qantas Airways, SAS, Scandinavian Airlines, Singapore Airlines, Swiss, TAP Portugal, Turkish Airlines, United&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Arrival at Terminal C:&#039;&#039;&#039;&lt;br /&gt;
Once you have arrived at Terminal C, you will pick up any checked luggage at baggage claim located near your arrival gate. Once you have your checked luggage exit the secure area of Terminal C and turn right. There will be staff holding Mozilla signs &amp;amp; wearing bright blue Mozilla shirts directing you to the shuttle. After exiting Terminal C you will walk down an alley that leads to an elevator &amp;amp; staircase, take this to the upper level and cross over the covered bridge. At the end of the bridge you will be in front of the main TXL terminal. Walk past the public buses to the bus parking area where the Mozilla shuttle will be. The shuttle will depart every 30 minutes (approx on the :00 and :30 each hour).&lt;br /&gt;
&lt;br /&gt;
Terminal C Airlines: Aer Lingus, easyJet, Iberia, Ryan Air, Vueling Airlines&lt;br /&gt;
&lt;br /&gt;
Arrivals at other terminals should follow directions to terminal A/public bus locations and will see staff in bright blue shirts. Terminal D &amp;amp; E: Eurowings&lt;br /&gt;
Map of Airport: [[File:MOZ MAH TXL map v1.pdf|thumb|Map of Berlin Tegel Airport]]&lt;br /&gt;
&lt;br /&gt;
=====Shuttles to airport=====&lt;br /&gt;
Shuttles from our 3 hotels to Berlin Tegel will be provided:&lt;br /&gt;
*Saturday, Feb 1 from 4:00 - 20:00, for flights departing 7:15 and 22:15.&lt;br /&gt;
*Sunday, Feb 2 from 4:00 - 12:00, for flights departing 6:00 - 14:00. &#039;&#039;If you are on a later flight, you can take the last shuttle at 12:00.&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
Those staying at Pullman will walk to InterCon hotel for shuttles to airport. &lt;br /&gt;
&lt;br /&gt;
=====Self organized transportation=====&lt;br /&gt;
If you are arriving outside of shuttle hours, transportation is on your own (both in booking and paying) and is not reimbursable. Taxis and Addison Lee are not reimbursable. &lt;br /&gt;
&lt;br /&gt;
=====Train=====&lt;br /&gt;
If you are arriving by train to Hauptbahnhof:&lt;br /&gt;
To Hotel Berlin Berlin&lt;br /&gt;
* FROM HAUPTBAHNHOF STATION: Take the S-Bahn metro lines S5, S9 or S75 to the station “Zoologischer Garten” (20 min.). From there, take the bus 100 to the stop Lützowplatz. &lt;br /&gt;
* Via U-BAHN: Take the U-Bahn metro lines U2, U3 and U1 to the station “U-Nollendorfplatz”. Exit the station in the direction of “Karl-Heinrich-Ulrichs-Straße.&amp;quot; The road leads directly to the hotel (approx 5 mins). &lt;br /&gt;
* [https://www.hotel-berlin.de/d/berlinberlinpro/media/PDF/Anfahrt_A4_E_Karl-Heinrich-Ulrichs-Strae_5c2ab7.pdf Map]&lt;br /&gt;
&lt;br /&gt;
To InterCon Berlin and Pullman&lt;br /&gt;
* FROM HAUPTBAHNHOF STATION: Take the S-Bahn metro lines S3, S5, S7, or S9 to the station “Zoologischer Garten”. From there, walk 10 mins to hotel.&lt;br /&gt;
&lt;br /&gt;
Berlin&#039;s integrated public transport is divided in 3 tariff zones (ABC). To travel within the city, including from Tegel airport to the hotels, you only need an AB ticket. Tickets can be bought at automated booths in most stations (accept credit cards), and on Metro (need coins). You can use the same ticket to travel on buses, metro, S-Bahn, U-Bahn. More information, including PDF maps, are available on [https://www.berlin.de/en/public-transportation/1772016-2913840-tickets-fares-and-route-maps.en.html this website]. A mobile app is available on stores (&amp;quot;BVG FahrInfo Plus&amp;quot;) and allows to create routes between stations, or you can use directly the [https://www.bvg.de/en BVG] website.&lt;br /&gt;
&lt;br /&gt;
====Getting around Berlin====&lt;br /&gt;
You’ll rarely hear from your Berlin-based colleagues (or anyone else actually living in the city instead of the suburbs) that they prefer or even enjoy taking the car anywhere. Many don’t even own a car unless they truly need it because driving in Berlin is not a lot of fun with busy traffic, lots (looooots!) of construction sites, a bunch of one-way streets and barely any free parking spaces. When exploring the city, we recommend that you use public transportation instead, which takes you everywhere and is pretty reliable. Or you rent bikes and even add some exercise to your city tour.&lt;br /&gt;
&lt;br /&gt;
In order to make sure that you know your transportation options, here’s an overview of what you may use — and how.&lt;br /&gt;
&lt;br /&gt;
=====Buying tickets=====&lt;br /&gt;
Most types of public transport require you to buy and validate your ticket before entering the respective vehicle. You can find ticket machines at the stations or buy a ticket at shops in one of the larger train stations. The machines usually inform you in German and in English, which makes them easy to use. &lt;br /&gt;
&lt;br /&gt;
You’ll be able to buy different types of tickets depending on where you go and duration of their validity, from just one ride up to 6 days. If you plan to use public transportation for several days in a row it’s definitely recommended to get a multi-day ticket because the relative price will be lower.&lt;br /&gt;
&lt;br /&gt;
Of course, there are also some peculiarities to each type of transportation when it comes to paying the fees:&lt;br /&gt;
U-Bahn &amp;amp; S-Bahn: After buying a ticket at the machine, which you’ll most likely find on the platform or, if it’s a larger train station, in the entry area, you may need to validate it at an extra machine. They’re usually located on the platform, as well. [https://welcome2berlin.weebly.com/uploads/1/2/1/2/121289663/s-bahn-ticket-machine-00-img-6428-1920x2560-otmc-10-90_orig.jpg Here&#039;s a picture of a ticket machine with the ticket validation machine to its left.]&lt;br /&gt;
Bus: Most bus stations don’t have ticket machines but you can buy one from the driver.&lt;br /&gt;
Tram: Some trains have ticket machines inside; however, they don’t always work.&lt;br /&gt;
&lt;br /&gt;
Please also take into account where you’re actually planning to go when buying a ticket. Berlin has 3 fare zones: A (city center), B (wider Berlin city area) and C (outside of the actual Berlin city area; Brandenburg). Unless you’re only exploring the area around the All Hands site, you’ll probably want to get “AB” tickets. If you need to go to or from Berlin Schönefeld Airport (SXF), it is located in fare zone C, so you&#039;ll need a ticket that covers area “C”. If you have an “AB” ticket you can buy an extension ticket for a single trip.&lt;br /&gt;
&lt;br /&gt;
=====U-Bahn (the subway)=====&lt;br /&gt;
The “U-Bahn” is our local subway system, which connects the entire city area, taking you almost everywhere within just a few minutes. There are 10 lines overall, named U1 to U9 (plus the kind of odd U55 that only connects very few stations). Big “U” signs all over Berlin help you spot the next station. &lt;br /&gt;
&lt;br /&gt;
The BVG (Berliner Verkehrsbetriebe, the Berlin transport company) offer a fully interactive route map on their website. If you prefer a printed version, you can pick one up for free at one of their customer centers; the main office is located in the subway station “Alexanderplatz” in the city center. Or you just download their app, which is available for all major OS. You can also buy tickets via the app.&lt;br /&gt;
&lt;br /&gt;
Pro tip: You may want to download the Berlin map in your favorite navigation app. Given that your phone plan may not apply to Europe (or it’s ridiculously expensive to go online), this can actually save your day because public WiFi isn’t as widely available in Germany as e.g. in North America.&lt;br /&gt;
&lt;br /&gt;
=====Tram/Straßenbahn=====&lt;br /&gt;
The tram is Berlin’s overground train service within the city. There are 22 lines overall: 9 so-called MetroTram lines (names consist of “M” plus a line number) and 13 streetcar lines (where the name is a simple number). They complement the U-Bahn and S-Bahn system by running on important routes that are not covered otherwise. &lt;br /&gt;
&lt;br /&gt;
Given the size of the Berlin city area, you’ll most likely need to switch between trains and types of public transport, which includes the trams. They’re usually easy to find since they’re comparatively loud, painted in shining yellow and, well, run on overground tracks through pedestrian zones and next to roads used by cars. Also, big red signs with the word “tram” on them guide the way.&lt;br /&gt;
&lt;br /&gt;
=====S-Bahn=====&lt;br /&gt;
The S-Bahn is another overground train but covers longer distances than the tram (and doesn&#039;t run in or cross streets).&lt;br /&gt;
&lt;br /&gt;
You’ll probably want to take the S-Bahn when visiting the neighbourhoods that are further out, doing a day trip to Potsdam or going to Schoenefeld Airport. If Berlin’s 3rd airport, BER, ever happens to open, transport from the city will also be covered by S-Bahn.  It&#039;s also good for some trips within the city center.&lt;br /&gt;
&lt;br /&gt;
=====Other trains=====&lt;br /&gt;
Are you planning a trip through Germany or even beyond? Then you may want to consider taking one of the trains of the Deutsche Bahn (German railway company).&lt;br /&gt;
&lt;br /&gt;
Trains leave from the 7 long-distance train stations in Berlin. You can buy tickets online (bahn.de) or at the machines in each of the stations. If you’re planning a longer trip or want to travel during peak times, it’s recommended to buy your ticket in advance, add a seat reservation and take sufficient provisions for the trip since food and drinks at the “Bord-Bistro” are ridiculously expensive.&lt;br /&gt;
&lt;br /&gt;
Pro tip: If you bought a seat reservation in advance and there’s someone sitting in your spot, don’t be shy and ask them to get up. It may be awkward but it’s totally normal. Also, the reservation goes away if you don’t claim your seat within a certain amount of time after getting on the train.&lt;br /&gt;
&lt;br /&gt;
Even though it carries about two billion passengers annually, it’s unlikely that you’ll experience amazing service or punctuality on your Deutsche Bahn trip — which is at least a little bit funny given that it used to be owned by the government of a country that’s mostly known for its efficiency. Just kidding ;) German trains are quite comfortable to use, prices are okay and from Berlin, you’ll arrive in most other larger cities in Germany and the neighbouring countries within comparatively short times as the trains can go up to 300 km/h.&lt;br /&gt;
&lt;br /&gt;
=====Busses=====&lt;br /&gt;
Just like in any other country, busses combine all of the inconveniences of public transportation and driving a car in the city: it’s crowded, you may need to stand for a pretty long time and it takes forever to get to your destination. Still, busses are used a lot (at least in Berlin) because they cover many short routes where there’s not S-Bahn, U-Bahn or Tram service.&lt;br /&gt;
&lt;br /&gt;
When entering a bus in Berlin, operated by the aforementioned BVG, you’re theoretically required to show your ticket to the diver; some don’t really care while others are quite strict about it. Beyond that, there are a couple of additional rules you should be aware of before stepping into a BVG bus:&lt;br /&gt;
* Don’t stand anywhere close to a door unless you feel prepared to deal with the rage of the bus driver. They don’t mind yelling at someone in the very back of the bus or even interrupt their route until the respective person behaves as they’re expected to.&lt;br /&gt;
*This applies to your luggage just as much as to you as a person.&lt;br /&gt;
*Make sure to monitor the route closely. If you want to get off the bus you need to push the button to request a stop soon enough or stay on the bus until the driver finishes their tour.&lt;br /&gt;
&lt;br /&gt;
Pro tip: If you get on a bus that isn’t too crowded let the driver know where you want to go and take a seat nearby. They’re not all grumpy. Some of them are actually quite friendly and helpful when you approach them directly.&lt;br /&gt;
&lt;br /&gt;
=====Taxi &amp;amp; Uber=====&lt;br /&gt;
Uber has grown to become the most successful driving services in many countries but it is currently banned in Germany after its UberX service has been found in violation of German federal law prohibiting private citizens (e.g. without background checks) to offer transport services. Instead use one of the many (7500 in total) regular yellow licensed taxis. When calling a driver in Berlin you have several choices:&lt;br /&gt;
&lt;br /&gt;
*Get a regular taxi by calling one over the phone (+49 30 20 20 20 OR +49 30 26 10 26), find a taxi stop, or stop a taxi on the street. Just make sure to have some cash on you as some of them don’t take credit cards. Remember, licensed Taxis are a light yellow (&amp;quot;light ivory&amp;quot;, [https://upload.wikimedia.org/wikipedia/commons/e/e0/Taxis_at_EDDT-%28jha%29.jpg picture]).&lt;br /&gt;
&lt;br /&gt;
*Call a regular taxi via the [https://www.taxi.eu/en/cities/berlin/ taxi.eu] app. This app (download: [http://itunes.apple.com/de/app/taxi.eu/id465315934 Apple iOS], [https://market.android.com/details?id=at.austrosoft.t4me.MB_BerlinTZBEU Android]) offers a similar service as Uber but gives access to the majority of Berlin&#039;s regular (and regulated) taxis (7200 of the 7500 total). The main difference is that you can either pay cash or need to be connected to the internet in order to pay through the app at the end of your ride: while you agree on a price with your Uber driver before getting into their car, taxi.eu will charge you for the actual distance/time it took to get you to your destination, which isn’t clearly determined before your arrival and only an estimate is shown during booking.&lt;br /&gt;
&lt;br /&gt;
==&#039;&#039;&#039;Hotels&#039;&#039;&#039;==&lt;br /&gt;
Your hotel assignments/confirmations have been emailed coming from bmark@mozilla.com, not the hotel directly. Please make sure to read and check for accuracy. &lt;br /&gt;
&lt;br /&gt;
In each email, you will find:&lt;br /&gt;
*Your assigned hotel&lt;br /&gt;
*The dates that have been booked for you&lt;br /&gt;
*Links to book extra nights beyond what has been booked for you (links expired Dec 20, 2019)&lt;br /&gt;
&lt;br /&gt;
A few things to note:&lt;br /&gt;
#If you have any changes or questions about your reservation, email mozilla@shworldwide.com. The hotel cannot make changes to All Hands reservations so we’d like very much if you didn’t try (it complicates things).&lt;br /&gt;
#If you registered that you have guests joining you for all or part of the week:&lt;br /&gt;
*You will be responsible for covering all additional fees at the hotel. &lt;br /&gt;
*All hotel rooms have a maximum capacity of 2 adults (with some exceptions limited to very small children)&lt;br /&gt;
*If you registered by October 13:&lt;br /&gt;
*Guests have already been added to your hotel reservation on your behalf. You have been assigned a room that can accommodate you and your guests. Please refer to the total occupants listed in your hotel confirmation.&lt;br /&gt;
*If you need to add a guest, please email mozilla@shworldwide.com. Please note: all hotel rooms that can accommodate more than 2 adults have been alloted. If a larger room is needed, it will need to be booked and paid for on your own. &lt;br /&gt;
&lt;br /&gt;
If you are planning to book pre/post stays and didn&#039;t complete by the deadline of Dec 20, you can book directly with the hotel online. We can not guarantee any rates or room type availability. Please use your legal name and use LDAP email so the hotel can try to match reservations and room types. Reservations booked through third party sites (hotels.com,. etc) can not be linked to all hands reservations. &lt;br /&gt;
&lt;br /&gt;
Everyone will be required to present a form of payment on check-in for incidentals. For your own sanity, please do not provide a debit/cash card. If you are unable to provide a credit card, please email mozilla@shworldwide.com and we can request special accommodations.&lt;br /&gt;
&lt;br /&gt;
==&#039;&#039;&#039;Families/Guests&#039;&#039;&#039;==&lt;br /&gt;
Of course our focus, for the majority of the week, will be on Mozilla. Everyone is expected to be present and engaged each day, during work hours (as your schedule dictates). Please do what you can to make sure your loved ones understand the kind of commitment you’ve made. Please note that what are able to do for families varies by each location. We are unable to accommodate volunteer contributor or intern families/guests at our All Hands. &lt;br /&gt;
&lt;br /&gt;
====Quick summary logistics====&lt;br /&gt;
* Air Travel: Employees do need to book via Egencia regardless of how families are booked. &lt;br /&gt;
* Hotel: Family/friends are welcome to stay with you. All room rates are based upon single occupancy and include breakfast. Guests must be added to reservations in advance and any additional room expenses will be yours to cover. Most of our hotel rooms have a maximum of double occupancy (2 adults), with very limited availability of rooms for higher occupancy. Higher occupancy rooms will be assigned in the order that you register. As of 20 November, we only have rooms that can accommodate 2 adults. If a larger room is needed, it will need to be booked and paid for on your own. &lt;br /&gt;
&lt;br /&gt;
Additional Guest fees&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Hotel !! Hotel Berlin !! InterCon !! Pullman&lt;br /&gt;
|-&lt;br /&gt;
| 2nd guest fee (incl bfast) || 20,00 € || 25,00 € || 24,00 €&lt;br /&gt;
|-&lt;br /&gt;
| 3rd guest fee (incl bfast) || 50,00 € || N/A || N/A&lt;br /&gt;
|-&lt;br /&gt;
| 4th guest fee (incl bfast) || 50,00 € || N/A || N/A&lt;br /&gt;
|-&lt;br /&gt;
| Age applicable || 6+ || All || All&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* Lunch &amp;amp; Dinner: Family will be on their own for lunch daily and dinner on Tuesday, Wednesday &amp;amp; Thursday. &lt;br /&gt;
* Monday &amp;amp; Friday Night Events: Family members who are registered for the event and registered with the hotel, are invited to join us for our evening events.&lt;br /&gt;
* Childcare Services: We will not provide centralized childcare services. We have found that every family has different needs and centralized childcare does not deliver on those needs. If you are in need of help finding options for your family, we are happy to connect you with staff whose families who are coming (#allhands-childcare and #parents are great places to start), as well we are happy to help support finding of resources (although you are likely better at it than us). Given every circumstance is unique, we defer to your manager to determine what Mozilla can support you with financially.&lt;br /&gt;
&lt;br /&gt;
On demand babysitting services in Berlin: &lt;br /&gt;
* https://extra-arms.com/for-families-babysitting/&lt;br /&gt;
* https://www.withourbaby.com/&lt;br /&gt;
&lt;br /&gt;
====Exploring Berlin with Kids====&lt;br /&gt;
Berlin is a great city to explore with kids as it offers lots of fun, interesting and educational activities that are even suitable for the cold weeks of January. Which brings us to a very important recommendation we want to share right at the beginning of this section: dress your kids up appropriately to the weather but focus on layers. The onion look may not always be super fancy but both you and your kids will appreciate it: Since it can get unpleasantly cold in the Berlin winter, public places and attractions tend to heat up their indoor offers. Wearing layers makes sure that your kids neither get cold outside nor sweaty when going inside.&lt;br /&gt;
&lt;br /&gt;
=====Inside activities=====&lt;br /&gt;
*The Deutsches Technikmuseum (German Technical Museum) is a great place to spend time on a cold January day. It’s exciting for both adults and kids and offers a lot to explore. Discover the cultural history of technology by yourself! Also, you can get there from the All Hands location in just 20 minutes by public transport. &lt;br /&gt;
Deutsches Technikmuseum, Trebbiner Straße 9, 10963 Berlin-Kreuzberg&lt;br /&gt;
Opening hours: TUE-FRI 9am-5:30pm, SAT+SUN 10am-6pm&lt;br /&gt;
*MACHmit! museum für Kinder is a museum like no other: Endless opportunities to discover and try new things encourage children to learn through play, whilst also gaining new and exciting experiences that they would not come across in an average day. Arts and crafts activities, lots of running and being loud and for parents a nice area where you can get coffee and snacks.&lt;br /&gt;
MACHmit! Museum für Kinder, Senefelderstraße 5, 10437 Berlin&lt;br /&gt;
Opening hours: TUE-SUN 10am-6pm&lt;br /&gt;
*The Aquarium Berlin in the center of Berlin is one of Europe’s best-known and most notable aquariums. Behind the building’s historic façade awaits an impressive diversity of species that few facilities in the world can rival. The Aquarium not only houses numerous extraordinary fish, it is also home to hundreds of impressive reptiles and insects. Also, it’s just a 5 minutes walk from the All Hands location.&lt;br /&gt;
Aquarium Berlin, Budapester Str. 32, 10787 Berlin&lt;br /&gt;
Opening hours: Daily 9am-6pm&lt;br /&gt;
*View the night sky without any clouds disrupting your view at the Zeiss-Großplanetarium! The largest planetarium in Central Europe was inaugurated in 1987. The Planetarium offers lots of events for young and older kids and is just impressive to be in. You should check it out!&lt;br /&gt;
Zeiss-Großplanetarium, Prenzlauer Allee 80, 10405 Berlin&lt;br /&gt;
Opening hours: TUE+SUN 9:30am-6pm, WED+THU 9:30am-9pm, FRI+SAT 9:30am-10:30pm&lt;br /&gt;
*Tropical Island: Taking a break at Tropical Island means swimming, diving or just relaxing by the Tropical Sea or Lagoon, exploring the world&#039;s largest indoor rainforest or getting your adrenaline pumping on Germany&#039;s highest water slide tower -- plus lots of other great attractions. Disclaimer: It’s crowded, so if you are not so much into big groups of people, this might not be for you -- but kids LOVE IT. You can easily reach Tropical Island within a one-hour train ride. &lt;br /&gt;
&lt;br /&gt;
=====Outside activities=====&lt;br /&gt;
You and your kids don’t mind the cold too much? Great! There are plenty of nice things to do outside even the winter. As the train services run pretty well and Berlin is well connected even to the rural areas, you have a lot to choose from and it’s pretty easy as well as inexpensive to get there.&lt;br /&gt;
*Just a few minutes outside of Berlin you’ll find Karls Erlebnis-Dorf (Karl’s Adventure Village) in Elstal. In addition to offering a spacious farmers market, many attractions for children are waiting for you, including a big wooden roller coaster. Admission is free. You can get there by car, bus and train.&lt;br /&gt;
Karls Erlebnis-Dorf, Döberitzer Heide 1, 14641 Elstal&lt;br /&gt;
Opening hours: Daily 8am-7pm&lt;br /&gt;
*Tempelhofer Feld is a big recreation area in the Berlin districts Neukölln and Tempelhof. It’s actually the largest inner-city open space worldwide, Berlin’s most spacious urban park as well as part of larger historical project. Throughout the year, the park is used for outdoor sports like jogging, biking, roller-blading, and kiting, but is also a popular spot for wild gardening and barbecues. The Mozilla Berlin Family Day 2017 took place right there.&lt;br /&gt;
Accessible via 10 entrances&lt;br /&gt;
Opening hours: From sunrise to sunset&lt;br /&gt;
&lt;br /&gt;
==&#039;&#039;&#039;Lunar New Year&#039;&#039;&#039;==&lt;br /&gt;
We are aware of the overlap in the Lunar New Year celebrations with the Berlin All Hands. To help folks who decide to attend the Berlin All Hands and who also celebrate Chinese New Year, we will offer the following:&lt;br /&gt;
* A higher airfare caps for air travel to allow for fewer layovers on Monday, January 27&lt;br /&gt;
* Assurance that Berlin is optional but if employee wants to attend they can shift their holiday days to another time. &lt;br /&gt;
* Live Airmo Feeds of Plenary (+ relevant team all hands meetings) + quick posting of recording to accommodate those who choose not to travel. &lt;br /&gt;
* Potentially shifting any main plenary session date/time&lt;br /&gt;
&lt;br /&gt;
We are working with leadership and representatives of those most affected and will update wiki regularly with updates. Feel free to reach out to Brianna with questions.&lt;br /&gt;
&lt;br /&gt;
==&#039;&#039;&#039;Week at a Glance&#039;&#039;&#039;==&lt;br /&gt;
View [https://docs.google.com/spreadsheets/d/1kIwKEmlYE9tMuWRvSNZnYDGWFwEumcHVp1s0LVPz-e8/edit#gid=0 Week at a glance]&lt;br /&gt;
&lt;br /&gt;
====Monday====&lt;br /&gt;
*Monday is travel/arrival day&lt;br /&gt;
*Registration&lt;br /&gt;
*Welcome Reception from 6:00 pm - 9:00 pm&lt;br /&gt;
&lt;br /&gt;
====Tuesday====&lt;br /&gt;
*Breakfast in hotel restaurants&lt;br /&gt;
*Lunch in hotels of your team homeroom&lt;br /&gt;
*Dinner on own&lt;br /&gt;
&lt;br /&gt;
====Wednesday====&lt;br /&gt;
*Breakfast in hotel restaurants&lt;br /&gt;
*Lunch in hotels of your team homeroom&lt;br /&gt;
*[https://berlinallhandsjanuary2020.sched.com/event/YKzH/demos Demos] from 4pm - 6pm ([https://wiki.mozilla.org/All_Hands/Berlin2020/Demos  full list])&lt;br /&gt;
*Dinner on own&lt;br /&gt;
&lt;br /&gt;
====Thursday====&lt;br /&gt;
*Breakfast in hotel restaurants&lt;br /&gt;
*Lunch in hotels of your team homeroom&lt;br /&gt;
*Dinner on own&lt;br /&gt;
&lt;br /&gt;
====Friday====&lt;br /&gt;
*Breakfast in hotel restaurants&lt;br /&gt;
*Lunch in hotels of your team homeroom&lt;br /&gt;
*Closing event at Motorwerk&lt;br /&gt;
&lt;br /&gt;
====Saturday====&lt;br /&gt;
*Breakfast in hotel restaurants&lt;br /&gt;
*Departure day only. No scheduled activities.&lt;br /&gt;
&lt;br /&gt;
===Berlin All Hands Event Calendar===&lt;br /&gt;
Here: https://berlinallhandsjanuary2020.sched.com/. &lt;br /&gt;
&lt;br /&gt;
Don&#039;t see stuff for your org yet? Don&#039;t fret! The schedule changes regularly as meetings and events are confirmed. Keep checking back. Team specific events are managed by [https://mana.mozilla.org/wiki/pages/viewpage.action?spaceKey=EAs&amp;amp;title=Mozilla+EA+Directory team EAs]. &lt;br /&gt;
&lt;br /&gt;
=====Create an account=====&lt;br /&gt;
We don’t recommend using the same email &amp;amp; password as anything like bank accounts, etc. We care about your security! If you already have a Sched account from past All Hands, it still works, log in with that.&lt;br /&gt;
&lt;br /&gt;
=====Add items to your calendar=====&lt;br /&gt;
Select the circle on any agenda item to add it to your calendar (you do need to have an account &amp;amp; be logged in to do this)&lt;br /&gt;
&lt;br /&gt;
You can also share a link to meetings to invite others. Go into the meeting and copy the short link. You can email that out to anyone and they can quickly add it to their calendar.&lt;br /&gt;
&lt;br /&gt;
=====Subscribe to GCal Calendar Link=====&lt;br /&gt;
Click on the mobile phone on the right hand side of the screen. All the calendar options are available here. &lt;br /&gt;
You have the option to choose ALL meetings or YOUR meetings. Unless you have 400 items on your calendar, just select your calendar. It will add anything on your calendar to your GCal (also an option for Outlook and iCal). It syncs once per day.&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;only syncs once per day&amp;quot; only applies to Google Calendar. With almost all other clients (like Apple Calendar, Outlook, or the calendar app on your phone) you can set the refresh interval, and Sched&#039;s instructions recommend 1 hour. Note - the gcal function has been buggy for some users in the past. If it doesn&#039;t update with new items, delete the calendar and download again. &lt;br /&gt;
&lt;br /&gt;
Warning: This is a link that utilizes your username for the .ics file.&lt;br /&gt;
&lt;br /&gt;
=====From Mobile=====&lt;br /&gt;
Visit from any mobile device (https://berlinallhandsjanuary2020.sched.com/mobile-site) - bookmark or add to your homescreen for quick access. There is a bonus icon you get by doing this. It caches the last time you opened the page offline and refreshes anytime you are connected.&lt;br /&gt;
&lt;br /&gt;
=====Filters=====&lt;br /&gt;
&#039;&#039;&#039;Filters&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
We have filtering functionality. You can filter by:&lt;br /&gt;
Departments (ex: People)&lt;br /&gt;
AND&lt;br /&gt;
Functional Teams (ex: People &amp;amp; Capabilities)&lt;br /&gt;
&lt;br /&gt;
*Search by Room, Speaker/Leader&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Further Filtering&#039;&#039;&#039;&lt;br /&gt;
*Audience - who should be there (ex: Team only or Invite)&lt;br /&gt;
*Homerooms (you can quickly see what is happening in homerooms, by team) - why do you care? If you have a cross team meeting in their room, its a quick way to search&lt;br /&gt;
*Views - Lots of view options. It defaults to the simple view, but there are quite a few options.&lt;br /&gt;
&lt;br /&gt;
Have a tip? Feel free to add it!&lt;br /&gt;
&lt;br /&gt;
==&#039;&#039;&#039;Food, Drink &amp;amp; Events&#039;&#039;&#039;==&lt;br /&gt;
Lunch &amp;amp; snacks will be provided and paid for centrally for attendees. Breakfast is provided Tuesday - Saturday as part of your guestroom reservation - you must eat breakfast in the hotel you sleep in. You will not be reimbursed if you go to another hotel and pay to eat there. &lt;br /&gt;
&lt;br /&gt;
Allergies/preferences: We will ensure that all food/environmental allergies are taken into consideration and will always have gluten-free and vegan options. If you have severe allergies that we need to know about; you can indicate in registration.&lt;br /&gt;
&lt;br /&gt;
===Hosted Evening Events===&lt;br /&gt;
We have evening events on the Monday and Friday nights.&lt;br /&gt;
&lt;br /&gt;
====Monday Night Welcome Reception====&lt;br /&gt;
6 pm - 9 pm, InterCon hotel&lt;br /&gt;
&lt;br /&gt;
====Friday Night at Motorwerk====&lt;br /&gt;
6:00 pm - 11:00 pm&lt;br /&gt;
&lt;br /&gt;
======Getting to/from the event======&lt;br /&gt;
Shuttles depart from the hotels starting at 5:00 pm. Shuttles will return starting at 8:00 pm. The last departure returning will leave at 11:05 pm. The only way to access the event is via our shuttles.&lt;br /&gt;
&lt;br /&gt;
=====Coat Check=====&lt;br /&gt;
Coat check will be available for clothing only, no bags. &lt;br /&gt;
&lt;br /&gt;
====Tuesday, Wednesday &amp;amp; Thursday Night Dinners====&lt;br /&gt;
You&#039;ll be on your own for Tuesday, Wednesday &amp;amp; Thursday and will have a similar expense policy from past all hands (50EUR/night - 150EUR total to include food, beverage, transportation, exchange fees, etc). &lt;br /&gt;
&lt;br /&gt;
Here is how this will work:&lt;br /&gt;
&lt;br /&gt;
For all evenings, once your meetings have concluded, you and your team, friends, new acquaintances, are free to explore and to find somewhere great to eat that suits you. Each of you can expense a total of 150EUR over the three days (or 50EUR/night).&lt;br /&gt;
&lt;br /&gt;
This amount includes:&lt;br /&gt;
*Meal cost, including tax &amp;amp; gratuity&lt;br /&gt;
*Any beverages&lt;br /&gt;
*Transportation to/from the restaurant&lt;br /&gt;
*Conversion fees (for credit cards) or cash withdrawal fees&lt;br /&gt;
&lt;br /&gt;
Anything over the 150EUR for the three evenings will be your own expense. The fine print:&lt;br /&gt;
*If your team is hosting an evening event 1 of the nights and the payment is coordinated (meaning, you don’t have to open your wallet and pay), you can expense up to 100EUR for the other night.&lt;br /&gt;
*You will be asked (later) to submit a Berlin All Hands only expense report. You can submit ONE report for Berlin only and must be submitted no later than February 28, 2020.&lt;br /&gt;
*No expenses over 50 EUR per night will be [https://docs.google.com/document/d/1XUD5KYotSr5SNi0q4ldgGG3bzBu-G3q4l5i-JiPE5ko/edit approved].&lt;br /&gt;
&lt;br /&gt;
Volunteer Contributors will have a separate process that will be communicated directly.&lt;br /&gt;
&lt;br /&gt;
=====Groups, Restaurants &amp;amp; Reservations=====&lt;br /&gt;
*Group dinners - All large (eight or more people) reservations must go through Lisa Carlson (email lcarlson@mozilla.com) and dinners must stay within the per diem per night (50EURpp including, food, beverage, tax, gratuity and transportation), and employees attending must not also expense their per diem for that night.&lt;br /&gt;
&lt;br /&gt;
In no case should employees expense or use MoCo corporate cards to cover purchases of alcohol outside of team dinners or the 50EUR individual per diem.&lt;br /&gt;
&lt;br /&gt;
==&#039;&#039;&#039;Safety &amp;amp; Security&#039;&#039;&#039;==&lt;br /&gt;
=====Alcohol at Events=====&lt;br /&gt;
To better support and sustain an environment (and workplace culture) where people feel safe and included, we have made a set of changes regarding alcohol at our events. In all cases, our approach aligns with our [https://www.mozilla.org/en-US/about/governance/policies/participation/ Community Participation Guidelines] (“CPG”).&lt;br /&gt;
*All participants are &#039;&#039;&#039;required to read and acknowledge our new Community Participation Guidelines as a condition of participation&#039;&#039;&#039;.&lt;br /&gt;
*We will &#039;&#039;&#039;limit bar-servings to beer and wine&#039;&#039;&#039; and ensure an equal number and quality (i.e. not just Coke) of non-alcoholic drink options are available and displayed.&lt;br /&gt;
*Team dinners should be &#039;&#039;&#039;thoughtful about the potential exclusionary nature of alcohol when planning&#039;&#039;&#039;.&lt;br /&gt;
*Clearly outlined, communicated (to event teams, HR and managers) and understood &#039;&#039;&#039;escalation process&#039;&#039;&#039; for behavior that might be deemed counter to the spirit of our CPG.&lt;br /&gt;
&lt;br /&gt;
=====Device Security=====&lt;br /&gt;
If you are traveling to the All Hands with a device that has Mozilla data (laptop, personal cell phone/tablet with @mozilla gmail, etc) on it and your device has been retained for further inspection by border agents, or if your device has been inspected outside your immediate presence - and you believe your credentials have been compromised - you must notify the Enterprise Information Security team as soon as possible at infosec@mozilla.com or by calling Mozilla End User Services at +1 650-963-8811. (This number will be staffed 24x7)&lt;br /&gt;
 &lt;br /&gt;
We will work with you to reset your credentials and help you get your device back to a known good state either by getting you a new one (if it’s been taken), or by resetting it back to a verifiable Mozilla-approved installation.&lt;br /&gt;
&lt;br /&gt;
=====Physical Security=====&lt;br /&gt;
Badges are required to access all meeting spaces and evening events.&lt;br /&gt;
&lt;br /&gt;
==&#039;&#039;&#039;Accessibility&#039;&#039;&#039;==&lt;br /&gt;
====Evenings====&lt;br /&gt;
Monday Night reception is at the InterContinental Berlin. No stairs or elevators required. &lt;br /&gt;
&lt;br /&gt;
====Meeting spaces====&lt;br /&gt;
* InterCon: Most meeting space levels are accessible by elevators.&lt;br /&gt;
* Pullman: All meeting space levels are accessible by guestroom elevators.&lt;br /&gt;
* Hotel Berlin: All meeting space is on the ground level.&lt;br /&gt;
&lt;br /&gt;
====Listen Systems====&lt;br /&gt;
We will have Listen Systems available for any meeting in the main plenary space. Visit the AV booth to pick one up.&lt;br /&gt;
&lt;br /&gt;
====Bathrooms====&lt;br /&gt;
TBA &lt;br /&gt;
&lt;br /&gt;
====Breastfeeding/pumping stations====&lt;br /&gt;
Milk Stork Services are reimbursable - please contact benefits@mozilla.com for more information.&lt;br /&gt;
&lt;br /&gt;
====Public transit====&lt;br /&gt;
Useful info for transit accessibility: https://wheelchairtravel.org/berlin/public-transportation/&lt;br /&gt;
&lt;br /&gt;
==&#039;&#039;&#039;Sustainability&#039;&#039;&#039;==&lt;br /&gt;
&#039;&#039;&#039;Hotel Berlin, Berlin&#039;&#039;&#039; is certified partner of visitBerlin we stand for sustainable, green meetings and events. For more information, visit https://convention.visitberlin.de/en/sustain.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;InterContinental Hotel Berlin&#039;&#039;&#039; is Green Globe Certified. Green Globe Certification is the worldwide sustainability system based on internationally accepted criteria for sustainable operation and management of travel and tourism businesses. Operating under a worldwide license, Green Globe Certification is based in California, USA and is represented in over 83 countries. Green Globe Certification is a member of the Global Sustainable Tourism Council, supported by the United Nations World Tourism Organization. Additonally, as part of IHG’s Green Engage™ program the InterContinental Berlin has implemented best practices at all operational levels. The innovative Environmental Management System not only measures the day-to-day energy, water and waste consumption, but also provides recommended actions – ‘green solutions’ – to improve energy conservation and the property’s carbon footprint score.&lt;br /&gt;
&lt;br /&gt;
==&#039;&#039;&#039;Berlin: In your spare time (likely pre/post)&#039;&#039;&#039;==&lt;br /&gt;
=====First things first=====&lt;br /&gt;
Germany overall is widely diverse with regard to mentality, language, architecture, history, and more. In this guide we’re focusing on Berlin. However, if you have the opportunity to see a bit more of the country, you should definitely take it. We may also add that if you plan for a larger Europe trip, while there might be overlaps and similarities between the individual European countries, there are also lots and lots of differences -- and we’re by far not only referring to language. If you want to learn more about any other places you’re planning to go reach out to Mozillians who’re based there or otherwise know the city/country well. First-hand information is usually the most valuable and we have so many amazing people from anywhere in the world at our organization that it’s almost impossible that you don’t find someone who can help!&lt;br /&gt;
&lt;br /&gt;
=====Exploring the city -- beyond Charlottenburg and Mitte!=====&lt;br /&gt;
For the All Hands week we’re going to be in Charlottenburg, one of the neighbourhoods most visited by tourists. Along with Mitte (basically the city center), it’s an attractive destination for shopping and sightseeing. Nevertheless, we can only recommend that you leave the usual tourist trail in order to get a more diverse impression of Germany’s capital. There’s, for example, kind-of-hipster Kreuzberg, where our German office is located -- along with a bunch of amazing bars, restaurants, clubs and much more. Or take vibrant Friedrichshain, which is just across the Spree river from Kreuzberg, or family-friendly Prenzlauer Berg, all of which have their own interesting tourist attractions that are complemented by a relaxed local vibe. Overall, Berlin has 12 boroughs and a total of 96 officially recognized localities, so there’s clearly a lot to see!&lt;br /&gt;
&lt;br /&gt;
=====Orientation=====&lt;br /&gt;
Berlin is a pretty large city (891 qm, or 344 sq mi), so even Berliners use navigation apps regularly -- especially when leaving their “Kiez”. We therefore recommend that you download the Berlin map to your phone, as well, in order to make orientation easier, especially when doing some sightseeing.&lt;br /&gt;
&lt;br /&gt;
This is also due to peculiarities that may make orientation less obvious, such as house numbers which do not necessarily run in the same direction (up or down) everywhere: On a lot of streets, the numbers ascend on one side and descend on the other. So to avoid getting you lost, you should check the numbering scheme first: you can find the name of the street at nearly every street corner. The same sign will usually state the range of house numbers in that segment.&lt;br /&gt;
&lt;br /&gt;
Thanks to the subway system in particular, you can actually visit multiple neighbourhoods on the same day even if they’re not close. You can go from east to west in not much more than half an hour (if you’re lucky and have a good connection) and, even though it’s recommended to dedicate at least a few hours to each of the neighbourhoods you visit in order to get a proper impression, you should make use of it. Only by visiting different parts of the city that don’t share all of their history and demographics, you’ll be able to truly “see” Berlin. &lt;br /&gt;
&lt;br /&gt;
=====Sightseeing &amp;amp; history=====&lt;br /&gt;
As mentioned (multiple times) before Berlin is full of history. It’s almost impossible to walk around the city for half an hour without coming across some sort of historical site. This ranges from a huge range of museums and galleries, which you’ll best get informed about through a guidebook, as well as historical buildings, such as churches.&lt;br /&gt;
&lt;br /&gt;
If you don’t mind the cold weather, make sure to set aside some time for sites outside. You could, for example, explore cold war history and go to Checkpoint Charlie, the former border crossing between East and West Berlin, which is undoubtedly one of the city’s top attractions. Another recommendation would be a visit to Hohenschönhausen, a former Stasi prison where East German dissidents were incarcerated. Tours of the prison are conducted daily and often led by a former prisoner, who will give you a real insight into this fascinating, albeit traumatic time in history.&lt;br /&gt;
&lt;br /&gt;
If you’re looking for something more cheerful and/or a bunch of suggestions for historical sightseeing options by neighbourhood, you should check out Wikivoyage, a free web-based travel guide that has also been called the “Wikipedia of travel guides”. Take a look at the article on City West, if you want to explore the vicinity of our All Hands location. Literally every other Berlin tourist would likely favor the eastern districts of Friedrichshain, Prenzlauer Berg and (western) Kreuzberg, for its lower price and a lot of international bars, cafés and many other tourist attractions.&lt;br /&gt;
&lt;br /&gt;
Links&lt;br /&gt;
https://en.wikivoyage.org/wiki/Berlin/City_West&lt;br /&gt;
https://en.wikivoyage.org/wiki/Berlin/East_Central&lt;br /&gt;
&lt;br /&gt;
=====Food!=====&lt;br /&gt;
Being an international city, almost any cuisine you can imagine is available in Berlin. Still, we recommend that you try out some actual German food during your stay. For example, go to a local bakery and you’ll be stunned by the variety: There are over 300 types of dark and white breads, and more than 1,200 different kinds of “Brötchen” and “Kleingebäck” (bread rolls and mini-breads). We’re so much into bread that every region in Germany even has their own term for bread rolls (“Brötchen” vs. “Schrippe” vs. “Weck” vs. Semmel”...). Bread is central to the “German diet”: For breakfast, many people eat it with cheese, sausage products, honey or marmalade and “Abendbrot” (“evening bread” = dinner) usually consists of sandwiches.&lt;br /&gt;
&lt;br /&gt;
If you’re rather looking for a warm meal, you should try a Currywurst (“curry sausage”). Over the last couple of years, the Berlin foodie scene has truly exploded and you can get so much more than the stereotypical type of curry sausage nowadays, from plain to fancy, for meat lovers or for vegans. You can get them in restaurants, at street food markets or even from salespeople in the pedestrian zones.&lt;br /&gt;
&lt;br /&gt;
When visiting restaurants that offer German cuisine, you’ll notice that meat is a main ingredient for many meals -- though there are also plenty of fish and vegetarian options nowadays. With regard to side dishes, potatoes (in a lot of different varieties, such as cooked, roasted, mashed or as cakes) are very popular as well as noodles. &lt;br /&gt;
&lt;br /&gt;
In Germany as in many other countries it’s quite common to meet friends and family for dinner and go to a bar or pub afterwards. Berlin has a lot to offer in that respect and most places have their very individual flair. If you’re not into the aforementioned beer options, you could go for a (non-alcoholic or boozed) cocktail or a good glass of wine. Since Germany has several renown wine-growing regions, there’s a lot to choose from!&lt;br /&gt;
&lt;br /&gt;
==&#039;&#039;&#039;All Hands Expense Policy&#039;&#039;&#039;==&lt;br /&gt;
1. All &amp;quot;All Hands&amp;quot; Expenses must be submitted on 1 (and only 1) Expense report (e.g. Berlin All Hands Expense Report). Each expense must be tagged with &amp;quot;All Hands - Jan 2020&amp;quot;&lt;br /&gt;
&lt;br /&gt;
2. It must contain only those expenses relative to the All Hands Event in Berlin. &lt;br /&gt;
&lt;br /&gt;
3. If your submitted expense report for All Hands is submitted outside these guidelines, it will be rejected and you will be asked to re-submit with only All Hands Expenses&lt;br /&gt;
&lt;br /&gt;
4. The deadline to submit the All Hands Expense Report is &#039;&#039;&#039;February 28, 2020&#039;&#039;&#039;.&lt;br /&gt;
 &lt;br /&gt;
5. Expenses related to team events (except those coordinated through Lisa Carlson), parking, room service, mini-bar charges, and food/drink costs above the vouched amounts, will not be approved. &lt;br /&gt;
&lt;br /&gt;
6. When submitting your expense report through Egencia, make sure to &amp;quot;attached the PDF&amp;quot; (toggle on mobile, check box on desktop). &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;The intention of our all hands are to centrally organize a structure that includes:&#039;&#039;&#039;&lt;br /&gt;
*Meals (2 evening events + breakfast, lunch, drinks and snacks Tuesday - Friday)&lt;br /&gt;
*Transportation&lt;br /&gt;
*Accommodations&lt;br /&gt;
&lt;br /&gt;
Expenses submitted can not exceed the approved amounts. Any social events (except dinners/team building activities coordinated through Lisa Carlson) that are not part of our central plan will generally be self-organized and funded by participants. &lt;br /&gt;
&lt;br /&gt;
=====Travel expenses policy=====&lt;br /&gt;
Reimbursement will be made for necessary and reasonable expenses. &lt;br /&gt;
&lt;br /&gt;
* Getting to/from home to your airport: We ask that you use the most economical option, while balancing your personal needs - whether that be mileage/parking, public transportation or ride shares. We will not reimburse for private towncar services or car rental. &lt;br /&gt;
* Per standard Mozilla travel policy, Travel Meal Policy: Employees are eligible for travel meals when traveling. For Meals: There is a $75 USD per day meal policy while traveling. This covers breakfast (est. $15), lunch (est. $20), and dinner (est. $40). Receipts: Receipts are required. When submitting a meal for reimbursement, please include how many people attended the meal. There is no need to include names.&lt;br /&gt;
* We will not reimburse for seat/class upgrades. Frequent flyer status does not apply for All Hands. &lt;br /&gt;
* We will reimburse for bag checking fees for one bag. &lt;br /&gt;
&lt;br /&gt;
Any other expenses must be approved by your manager ahead of time. Any expenses for extending your stay for business reasons - such as additional hotel nights, meals, etc must be approved by your manager before booking and travel.&lt;br /&gt;
&lt;br /&gt;
=====Cell phone reimbursement policy=====&lt;br /&gt;
Cell phone reimbursement must be approved by your manager prior to submitting the expense. Teams will decide for their staff what is appropriate to expense. &lt;br /&gt;
&lt;br /&gt;
=====Internet reimbursement policy=====&lt;br /&gt;
Internet will be provided in all guestrooms and meeting space in all hotels. If you opt to upgrade/add service, those costs are not reimbursable, unless previously approved by your manager and are for business reasons.&lt;br /&gt;
&lt;br /&gt;
==&#039;&#039;&#039;Activities&#039;&#039;&#039;==&lt;br /&gt;
&lt;br /&gt;
=====Lockpicking Event=====&lt;br /&gt;
&lt;br /&gt;
On Wednesday Evening, there will be a Lockpicking event run by :decoder. The event will start at 6:30 PM and there will be dinner available at the venue for all the participants as well. [https://berlinallhandsjanuary2020.sched.com/event/Ya9V/lockpicking-dinner Advance registration] is required. &lt;br /&gt;
&lt;br /&gt;
We will be joined by four other lockpickers from Berlin, two of them being championship winners on several national competitions. The same two people are also engineers working in the lock industry, so there will be plenty of interesting things to hear and learn this evening.&lt;br /&gt;
&lt;br /&gt;
For better planning, we ask that people fill out the [https://berlinallhandsjanuary2020.sched.com/event/Ya9V/lockpicking-dinner registration form], we are limited to 100 participants initially. If the course ends up being fully booked and you still want to participate, you can join us at 8:00 PM on that same evening (without any guarantees on wait time and without dinner., but we still need you to [https://berlinallhandsjanuary2020.sched.com/event/Ya9V/lockpicking-dinner register]). We are confident that we will be able to accommodate everyone who wants to join. However, registering makes the planning a lot easier.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;What is Lockpicking?&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Lockpicking is a sport where you open locks (e.g. padlocks) without destroying them using manipulation tools (&amp;quot;picks&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;Why would I want to do this?&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Lockpicking is a great activity to practice patience, imagination and dexterity. From an engineering perspective, it helps to strengthen your sense for what is going on in that &amp;quot;black box&amp;quot; and even has some parallels to debugging. However, lockpicking is first and foremost about having fun and the lock being a challenge. So no matter what you work on, I promise you this will be a fun experience and also a good opportunity to put your laptop/phone aside for a while.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;Do I need to know anything about this prior to participating?&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Absolutely not. We will teach you how locks work, how to handle the tools and everything else you need to know. The only thing you need to bring with you is some patience.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;I have some tools, should I bring them?&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
We will have tools at the venue and would ask people to not bring their own tools. Traveling with lock picks is possible under certain conditions but the legal situation, especially when it comes to flying, is complicated and depends on the countries you travel through. Hence we ask people to not travel with their tools because it can get you delayed and cause other legal issues.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;Isn&#039;t this illegal?&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Lockpicking as a sport/hobby is legal in many countries (including most of the EU), as long as you only open your own locks. Of course, opening locks for which you don&#039;t have permission to do so can get you into trouble and is strongly discouraged by the community.&lt;br /&gt;
&lt;br /&gt;
However, there are a few countries around the world, including a handful of states in the US and some provinces in Canada where the possession of the tools (lock picks) is illegal without a license. If you want to do this at home and don’t know the rules for your country, feel free to ask us at the venue and we will try to help find the answers.&lt;br /&gt;
&lt;br /&gt;
=====Daily Morning Yoga=====&lt;br /&gt;
&lt;br /&gt;
Join Mozillians for a morning yoga practice from &#039;&#039;&#039;6:30-7:30am Tuesday-Friday IN TBD space&#039;&#039;&#039; [link to location coming!].&lt;br /&gt;
&lt;br /&gt;
Sharon Bautista of the Firefox User Research team will lead a mixed-level yoga practice. Some prior experience with basic yoga poses (downdog, warrior poses, sun salutation A, etc.) will be helpful. We’ll practice asanas (physical postures) for about 50 minutes and use the last 10 minutes for guided pranayama (breath work) and/or meditation. The practice will be scaffolded with options so you can make it more gentle or more vigorous, depending on your preference. &lt;br /&gt;
&lt;br /&gt;
Dress in comfortable clothing that you can move in, and bring your own yoga mat or large towel to use as a mat. An additional smaller towel may be helpful. All are welcome. If you’re on the fence about joining or have questions, don’t hesitate to ping Sharon: sbautista on Slack.&lt;br /&gt;
&lt;br /&gt;
=====Swim crew=====&lt;br /&gt;
* Pullman - Lizzard, jdavidson, bkal, jmok, ??&lt;br /&gt;
* Intercontinental - ??&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Let&#039;s coordinate here and in #brrlin to figure out times and which pool is best.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
I&#039;m interested in a before or after dinner swim during the week, but also could potentially do early morning! - Liz&lt;br /&gt;
&lt;br /&gt;
====Running group====&lt;br /&gt;
&lt;br /&gt;
See [https://docs.google.com/document/d/1hyhlVBWuG7TKsjRDh78F1zN7Y5K-HBUobbms5yzZ1dU/edit#heading=h.28r2nxazs8yq running signup doc] for meeting times or check out the #running channel in slack.&lt;/div&gt;</summary>
		<author><name>Kmoir</name></author>
	</entry>
	<entry>
		<id>https://wiki.mozilla.org/index.php?title=Firefox/Python_3_Migration&amp;diff=1221627</id>
		<title>Firefox/Python 3 Migration</title>
		<link rel="alternate" type="text/html" href="https://wiki.mozilla.org/index.php?title=Firefox/Python_3_Migration&amp;diff=1221627"/>
		<updated>2019-12-24T03:23:15Z</updated>

		<summary type="html">&lt;p&gt;Kmoir: /* Port a Mach Command */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page collects links and resources to assist the migration of the Firefox ecosystem off of Python 2 and onto Python 3.&lt;br /&gt;
&lt;br /&gt;
== Why This is Important ==&lt;br /&gt;
&lt;br /&gt;
In mozilla-central there are over 3500 Python files (excluding third party files), comprising roughly 230k lines of code. Most of it is Python 2.[https://ahal.ca/blog/2019/python-3-at-mozilla/]&lt;br /&gt;
&lt;br /&gt;
Python 2 will reach it&#039;s  End Of Life on &#039;&#039;&#039;[https://www.python.org/doc/sunset-python-2/ January 1st 2020]&#039;&#039;&#039; (here&#039;s [https://pythonclock.org/ a countdown!]).&lt;br /&gt;
&lt;br /&gt;
== What Will Happen If We Don&#039;t Upgrade? ==&lt;br /&gt;
&lt;br /&gt;
The [https://www.python.org/doc/sunset-python-2/ PSF said it best]:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote style=&amp;quot;background-color: #F0F0FF; padding: 1em&amp;quot;&amp;gt;&amp;quot;If people find catastrophic security problems in Python 2, or in software written in Python 2, then most volunteers will not help fix them. If you need help with Python 2 software, then many volunteers will not help you, and over time fewer and fewer volunteers will be able to help you. You will lose chances to use good tools because they will only run on Python 3, and you will slow down people who depend on you and work with you.&lt;br /&gt;
&lt;br /&gt;
Some of these problems will start on January 1. Other problems will grow over time.&amp;quot;&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== How We Get There ==&lt;br /&gt;
&lt;br /&gt;
As of today (May 2019) we require both the Python 2 and Python 3 interpreters to be installed to build and develop Firefox.&lt;br /&gt;
&lt;br /&gt;
Next we:&lt;br /&gt;
&lt;br /&gt;
# Make Python 3 porting and development safe by adding a Python 3 option to the developer toolchain. (mach lint, coverage.py, parts of the test suite)&lt;br /&gt;
# Make key support libraries run in both Python 2 and Python 3. (mach-core)&lt;br /&gt;
# Build interpreter switching mechanisms into the toolchain so we can run sub-components in just 2 or just 3. (mach sub-commands, py_action)&lt;br /&gt;
# Port Python 2-only components to Python 3 piecemeal.&lt;br /&gt;
# Remove Python 2 compatibility. (When that might happen needs discussion. Possibly sometime in 2020.)&lt;br /&gt;
&lt;br /&gt;
== Getting Involved ==&lt;br /&gt;
&lt;br /&gt;
=== Find the others ===&lt;br /&gt;
&lt;br /&gt;
Most discussion happens in the #py3 channel on Slack (NDA&#039;d Mozillians only). You can also join #python on irc.mozilla.org.&lt;br /&gt;
&lt;br /&gt;
=== What you&#039;ll need ===&lt;br /&gt;
&lt;br /&gt;
You will need a [https://developer.mozilla.org/en-US/docs/Mozilla/Developer_guide/Build_Instructions/Simple_Firefox_build working Firefox build environment].&lt;br /&gt;
&lt;br /&gt;
=== Where to start: ===&lt;br /&gt;
&lt;br /&gt;
==== Remove more of the &amp;quot;excluded&amp;quot; paths from the py2 and py3 linters ====&lt;br /&gt;
&lt;br /&gt;
See [https://pad.mozilla.org/p/py3 this Etherpad] for instructions. (Etherpad is blank, needs to be fixed)&lt;br /&gt;
&lt;br /&gt;
Roughly:&lt;br /&gt;
&lt;br /&gt;
* Pick a directory [https://pad.mozilla.org/p/py3 from the list], and put your name beside it so we know it&#039;s ported (this etherpad is now blank, ask in #py3 for details)&lt;br /&gt;
* Edit py2.yml and/or py3.yml and remove that directory from the exclusion list (from tools/lint/py2.yml and tools/lint/py3.yml in https://hg.mozilla.org/mozilla-central/)&lt;br /&gt;
* Run `./mach lint -l py2 -l py3 &amp;lt;your directory name&amp;gt;` to get a list of errors&lt;br /&gt;
* To get a list of files that need fixing:&lt;br /&gt;
 ./mach lint -l py2 -l py3 &amp;lt;your directory name&amp;gt; --format unix &amp;gt; tofix.txt&lt;br /&gt;
* To install `futurize`:&lt;br /&gt;
 pip install --user future&lt;br /&gt;
* To run through futurize&lt;br /&gt;
 cat tofix.txt | cut -f1 -d: | sort -u | xargs futurize -1 -w&lt;br /&gt;
* Visually inspect the patch, especially around `except:` clauses.  Watch out for &amp;quot;xxx_todo_changeme&amp;quot; in the patch.  These are places where futurize couldn&#039;t port the code and you need to fix it manually.&lt;br /&gt;
&lt;br /&gt;
When your patch is ready file:&lt;br /&gt;
&lt;br /&gt;
# Use moz-phab for submitting the patch - https://moz-conduit.readthedocs.io/en/latest/phabricator-user.html#submitting-patches&lt;br /&gt;
# Use [https://bugzilla.mozilla.org/show_bug.cgi?id=1559975 bug 1559975]&lt;br /&gt;
# Set one of callek, ahal, or catlee as the code reviewer&lt;br /&gt;
&lt;br /&gt;
==== Enable Python 3 on more Python unittests ====&lt;br /&gt;
&lt;br /&gt;
Python unittests are run with `./mach python-test` and are (usually) defined in `python.ini` files. To get a test running against Python 3:&lt;br /&gt;
&lt;br /&gt;
# Find a test that is skipped with Python 3, you can use [https://searchfox.org/mozilla-central/search?q=.*(skip|fail)-if.*python+%3F%3D%3D+%3F3&amp;amp;case=true&amp;amp;regexp=true&amp;amp;path=.ini%24 this query] to find these tests.&lt;br /&gt;
# Edit the manifest and remove the Python 3 skip-if annotation.&lt;br /&gt;
# Run the test with `./mach python-test --python 3 path/to/test`.&lt;br /&gt;
# Fix any errors and repeat the previous step.&lt;br /&gt;
# Once it is passing locally, test it out on try. If there is no Python 3 task running this manifest already, you&#039;ll need to add one by adding `3` to the `python-version` key in [https://searchfox.org/mozilla-central/source/taskcluster/ci/source-test/python.yml python.yml].&lt;br /&gt;
# Push the task to try on all platforms it is configured for.&lt;br /&gt;
&lt;br /&gt;
==== Port a Mach Command ====&lt;br /&gt;
&lt;br /&gt;
The mach driver (toplevel `mach` file) contains a whitelist of commands that still run with Python 2. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The whitelist contained in the mach command is py2commands&lt;br /&gt;
&lt;br /&gt;
 py2commands=&amp;quot;&lt;br /&gt;
    addtest&lt;br /&gt;
    analyze&lt;br /&gt;
    android&lt;br /&gt;
    android-emulator&lt;br /&gt;
    artifact&lt;br /&gt;
    awsy-test&lt;br /&gt;
    bootstrap...&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Pick the command that you&#039;d like to convert and then:&lt;br /&gt;
# Remove it from the whitelist&lt;br /&gt;
# Run: ./mach &amp;lt;command&amp;gt;&lt;br /&gt;
# See what breaks and fix it!&lt;br /&gt;
# Repeat with a variety of different flags and arguments&lt;br /&gt;
# Make sure any Python unittests running in CI have Python 3 enabled (see above)&lt;br /&gt;
&lt;br /&gt;
== How to Port the Code ==&lt;br /&gt;
&lt;br /&gt;
=== Before starting ===&lt;br /&gt;
&lt;br /&gt;
If you haven&#039;t ported modules before (or need a refresher), read the [https://docs.python.org/3/howto/pyporting.html Porting Guide on python.org].  It has a good outline of the porting process.&lt;br /&gt;
&lt;br /&gt;
=== Porting modules in the Firefox source tree ===&lt;br /&gt;
&lt;br /&gt;
* We&#039;ve already standardized on Python 2.7 across the tree.&lt;br /&gt;
* Make sure you can test the code you&#039;re working on with python3!&lt;br /&gt;
** If using `tox`, then adding `py35`, and `py36` to the list of environments should be sufficient.&lt;br /&gt;
** If using |mach python-test|, make sure the relevant manifest doesn&#039;t skip-if Python 3 and run |mach python-test --python 3 &amp;lt;path&amp;gt;|.&lt;br /&gt;
* [http://python-future.org/futurize.html#stage-1-safe-fixes `futurize` Stage 1 fixes] can be used to transform code into code that&#039;s compatible with both python2.7 and python3.&lt;br /&gt;
* The `six` module is available in-tree, feel free to use it as a dependency.&lt;br /&gt;
* [https://black.readthedocs.io/en/stable/index.html Black] can format Python 2 code and Python 3 code (but [https://black.readthedocs.io/en/stable/installation_and_usage.html it requires Py3.6+ to run]).&lt;br /&gt;
&lt;br /&gt;
=== Porting examples ===&lt;br /&gt;
&lt;br /&gt;
Prefer &amp;lt;code&amp;gt;[https://six.readthedocs.io/ six]&amp;lt;/code&amp;gt; when possible.  Make use of &amp;lt;code&amp;gt;six.PY2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;six.PY3&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;six.moves&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;six.string_types&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;six.integer_types&amp;lt;/code&amp;gt;, etc.  This make it easy to find the py2 code again so we can remove it.&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;import&amp;lt;/code&amp;gt; statements ====&lt;br /&gt;
&lt;br /&gt;
Use the &amp;lt;code&amp;gt;[https://six.readthedocs.io/#module-six.moves six.moves]&amp;lt;/code&amp;gt; module:&lt;br /&gt;
&lt;br /&gt;
Before:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import __builtin__&lt;br /&gt;
&lt;br /&gt;
__builtin__.__import__ = myimporthook()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
from six.moves import builtins&lt;br /&gt;
&lt;br /&gt;
builtins.__import__ = myimporthook()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;if&amp;lt;/code&amp;gt; statements ====&lt;br /&gt;
&lt;br /&gt;
Use &amp;lt;code&amp;gt;six.PY2&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;six.PY3&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import six&lt;br /&gt;
&lt;br /&gt;
if six.PY2:&lt;br /&gt;
    # py2 stuff&lt;br /&gt;
else:&lt;br /&gt;
    # py3 stuff&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If six isn&#039;t available or you are in the imports section of the module then this is fine too:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
if sys.version_info &amp;lt; (3,):&lt;br /&gt;
   # py2 stuff&lt;br /&gt;
else:&lt;br /&gt;
   # py3 stuff&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== String data ====&lt;br /&gt;
&lt;br /&gt;
Use &amp;lt;code&amp;gt;six.string_types&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;six.text_type&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;six.binary_type&amp;lt;/code&amp;gt;, etc. Also see the &amp;lt;code&amp;gt;six&amp;lt;/code&amp;gt; docs for &amp;quot;[https://six.readthedocs.io/#binary-and-text-data Binary and text data]&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
Before:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# using unicode&lt;br /&gt;
def write(self, buf):&lt;br /&gt;
    if isinstance(buf, unicode):&lt;br /&gt;
        buf = buf.encode(&#039;utf-8&#039;)&lt;br /&gt;
    BytesIO.write(self, buf)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# using types.StringTypes&lt;br /&gt;
if isinstance(value, types.StringTypes):&lt;br /&gt;
    ...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import six&lt;br /&gt;
&lt;br /&gt;
# fixed unicode&lt;br /&gt;
def write(self, buf):&lt;br /&gt;
    if isinstance(buf, six.text_type):&lt;br /&gt;
        buf = buf.encode(&#039;utf-8&#039;)&lt;br /&gt;
    BytesIO.write(self, buf)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# fixed types.StringTypes&lt;br /&gt;
if isinstance(value, six.string_types):&lt;br /&gt;
    ...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;subprocess.check_output()&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
Python 2.7 code will often call &amp;lt;code&amp;gt;subprocess.check_output()&amp;lt;/code&amp;gt; and then do string manipulation on the output, such as &amp;lt;code&amp;gt;str.splitlines()&amp;lt;/code&amp;gt;.  The code will fail under Python 3 because &amp;lt;code&amp;gt;subprocess.check_output()&amp;lt;/code&amp;gt; now returns a binary data stream.  However we can use the &amp;lt;code&amp;gt;universal_newlines=True&amp;lt;/code&amp;gt; keyword argument to get back a text type object in both Python 2 and Python 3.&lt;br /&gt;
&lt;br /&gt;
Before:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
output = subprocess.check_output([callargs])&lt;br /&gt;
lines = output.splitlines()  # Broken in Python 3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
output = subprocess.check_output([callargs], universal_newlines=True)&lt;br /&gt;
lines = output.splitlines()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
See the [https://docs.python.org/3.6/library/subprocess.html#frequently-used-arguments subprocess documentation] for details.&lt;br /&gt;
&lt;br /&gt;
=== Porting Resources ===&lt;br /&gt;
&lt;br /&gt;
[https://docs.python.org/3/howto/pyporting.html Porting Guide on python.org]&lt;br /&gt;
&lt;br /&gt;
[http://python-future.org/compatible_idioms.html Cheat Sheet: Writing Python 2-3 compatible code].  Note: misses some advanced changes, like porting __eq__() to __hash__() and changes to the slice interface.&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
&lt;br /&gt;
[https://bugzilla.mozilla.org/showdependencytree.cgi?id=1496527&amp;amp;hide_resolved=1 Bug 1496527] tracks the migration&lt;br /&gt;
&lt;br /&gt;
https://ahal.ca/blog/2019/python-3-at-mozilla&lt;br /&gt;
&lt;br /&gt;
[https://docs.google.com/document/d/1Uo6GYztM4_3mYJ1P8Tj1M2VCXktaOXjUid8AIojO8Oo/edit?usp=sharing Python 3 tree migration notes]&lt;br /&gt;
&lt;br /&gt;
[https://docs.google.com/document/d/1AzM3EOThG7GeMSCS5CcaTkojQEneaNj3N07igLBkyvc/edit# mach Python 3 migration roadmap]&lt;/div&gt;</summary>
		<author><name>Kmoir</name></author>
	</entry>
	<entry>
		<id>https://wiki.mozilla.org/index.php?title=Firefox/Python_3_Migration&amp;diff=1221626</id>
		<title>Firefox/Python 3 Migration</title>
		<link rel="alternate" type="text/html" href="https://wiki.mozilla.org/index.php?title=Firefox/Python_3_Migration&amp;diff=1221626"/>
		<updated>2019-12-24T03:12:35Z</updated>

		<summary type="html">&lt;p&gt;Kmoir: /* Remove more of the &amp;quot;excluded&amp;quot; paths from the py2 and py3 linters */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page collects links and resources to assist the migration of the Firefox ecosystem off of Python 2 and onto Python 3.&lt;br /&gt;
&lt;br /&gt;
== Why This is Important ==&lt;br /&gt;
&lt;br /&gt;
In mozilla-central there are over 3500 Python files (excluding third party files), comprising roughly 230k lines of code. Most of it is Python 2.[https://ahal.ca/blog/2019/python-3-at-mozilla/]&lt;br /&gt;
&lt;br /&gt;
Python 2 will reach it&#039;s  End Of Life on &#039;&#039;&#039;[https://www.python.org/doc/sunset-python-2/ January 1st 2020]&#039;&#039;&#039; (here&#039;s [https://pythonclock.org/ a countdown!]).&lt;br /&gt;
&lt;br /&gt;
== What Will Happen If We Don&#039;t Upgrade? ==&lt;br /&gt;
&lt;br /&gt;
The [https://www.python.org/doc/sunset-python-2/ PSF said it best]:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote style=&amp;quot;background-color: #F0F0FF; padding: 1em&amp;quot;&amp;gt;&amp;quot;If people find catastrophic security problems in Python 2, or in software written in Python 2, then most volunteers will not help fix them. If you need help with Python 2 software, then many volunteers will not help you, and over time fewer and fewer volunteers will be able to help you. You will lose chances to use good tools because they will only run on Python 3, and you will slow down people who depend on you and work with you.&lt;br /&gt;
&lt;br /&gt;
Some of these problems will start on January 1. Other problems will grow over time.&amp;quot;&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== How We Get There ==&lt;br /&gt;
&lt;br /&gt;
As of today (May 2019) we require both the Python 2 and Python 3 interpreters to be installed to build and develop Firefox.&lt;br /&gt;
&lt;br /&gt;
Next we:&lt;br /&gt;
&lt;br /&gt;
# Make Python 3 porting and development safe by adding a Python 3 option to the developer toolchain. (mach lint, coverage.py, parts of the test suite)&lt;br /&gt;
# Make key support libraries run in both Python 2 and Python 3. (mach-core)&lt;br /&gt;
# Build interpreter switching mechanisms into the toolchain so we can run sub-components in just 2 or just 3. (mach sub-commands, py_action)&lt;br /&gt;
# Port Python 2-only components to Python 3 piecemeal.&lt;br /&gt;
# Remove Python 2 compatibility. (When that might happen needs discussion. Possibly sometime in 2020.)&lt;br /&gt;
&lt;br /&gt;
== Getting Involved ==&lt;br /&gt;
&lt;br /&gt;
=== Find the others ===&lt;br /&gt;
&lt;br /&gt;
Most discussion happens in the #py3 channel on Slack (NDA&#039;d Mozillians only). You can also join #python on irc.mozilla.org.&lt;br /&gt;
&lt;br /&gt;
=== What you&#039;ll need ===&lt;br /&gt;
&lt;br /&gt;
You will need a [https://developer.mozilla.org/en-US/docs/Mozilla/Developer_guide/Build_Instructions/Simple_Firefox_build working Firefox build environment].&lt;br /&gt;
&lt;br /&gt;
=== Where to start: ===&lt;br /&gt;
&lt;br /&gt;
==== Remove more of the &amp;quot;excluded&amp;quot; paths from the py2 and py3 linters ====&lt;br /&gt;
&lt;br /&gt;
See [https://pad.mozilla.org/p/py3 this Etherpad] for instructions. (Etherpad is blank, needs to be fixed)&lt;br /&gt;
&lt;br /&gt;
Roughly:&lt;br /&gt;
&lt;br /&gt;
* Pick a directory [https://pad.mozilla.org/p/py3 from the list], and put your name beside it so we know it&#039;s ported (this etherpad is now blank, ask in #py3 for details)&lt;br /&gt;
* Edit py2.yml and/or py3.yml and remove that directory from the exclusion list (from tools/lint/py2.yml and tools/lint/py3.yml in https://hg.mozilla.org/mozilla-central/)&lt;br /&gt;
* Run `./mach lint -l py2 -l py3 &amp;lt;your directory name&amp;gt;` to get a list of errors&lt;br /&gt;
* To get a list of files that need fixing:&lt;br /&gt;
 ./mach lint -l py2 -l py3 &amp;lt;your directory name&amp;gt; --format unix &amp;gt; tofix.txt&lt;br /&gt;
* To install `futurize`:&lt;br /&gt;
 pip install --user future&lt;br /&gt;
* To run through futurize&lt;br /&gt;
 cat tofix.txt | cut -f1 -d: | sort -u | xargs futurize -1 -w&lt;br /&gt;
* Visually inspect the patch, especially around `except:` clauses.  Watch out for &amp;quot;xxx_todo_changeme&amp;quot; in the patch.  These are places where futurize couldn&#039;t port the code and you need to fix it manually.&lt;br /&gt;
&lt;br /&gt;
When your patch is ready file:&lt;br /&gt;
&lt;br /&gt;
# Use moz-phab for submitting the patch - https://moz-conduit.readthedocs.io/en/latest/phabricator-user.html#submitting-patches&lt;br /&gt;
# Use [https://bugzilla.mozilla.org/show_bug.cgi?id=1559975 bug 1559975]&lt;br /&gt;
# Set one of callek, ahal, or catlee as the code reviewer&lt;br /&gt;
&lt;br /&gt;
==== Enable Python 3 on more Python unittests ====&lt;br /&gt;
&lt;br /&gt;
Python unittests are run with `./mach python-test` and are (usually) defined in `python.ini` files. To get a test running against Python 3:&lt;br /&gt;
&lt;br /&gt;
# Find a test that is skipped with Python 3, you can use [https://searchfox.org/mozilla-central/search?q=.*(skip|fail)-if.*python+%3F%3D%3D+%3F3&amp;amp;case=true&amp;amp;regexp=true&amp;amp;path=.ini%24 this query] to find these tests.&lt;br /&gt;
# Edit the manifest and remove the Python 3 skip-if annotation.&lt;br /&gt;
# Run the test with `./mach python-test --python 3 path/to/test`.&lt;br /&gt;
# Fix any errors and repeat the previous step.&lt;br /&gt;
# Once it is passing locally, test it out on try. If there is no Python 3 task running this manifest already, you&#039;ll need to add one by adding `3` to the `python-version` key in [https://searchfox.org/mozilla-central/source/taskcluster/ci/source-test/python.yml python.yml].&lt;br /&gt;
# Push the task to try on all platforms it is configured for.&lt;br /&gt;
&lt;br /&gt;
==== Port a Mach Command ====&lt;br /&gt;
&lt;br /&gt;
The mach driver (toplevel `mach` file) contains a whitelist of commands that still run with Python 2. Pick the command that you&#039;d like to convert and then:&lt;br /&gt;
&lt;br /&gt;
# Remove it from the whitelist&lt;br /&gt;
# Run: ./mach &amp;lt;command&amp;gt;&lt;br /&gt;
# See what breaks and fix it!&lt;br /&gt;
# Repeat with a variety of different flags and arguments&lt;br /&gt;
# Make sure any Python unittests running in CI have Python 3 enabled (see above)&lt;br /&gt;
&lt;br /&gt;
== How to Port the Code ==&lt;br /&gt;
&lt;br /&gt;
=== Before starting ===&lt;br /&gt;
&lt;br /&gt;
If you haven&#039;t ported modules before (or need a refresher), read the [https://docs.python.org/3/howto/pyporting.html Porting Guide on python.org].  It has a good outline of the porting process.&lt;br /&gt;
&lt;br /&gt;
=== Porting modules in the Firefox source tree ===&lt;br /&gt;
&lt;br /&gt;
* We&#039;ve already standardized on Python 2.7 across the tree.&lt;br /&gt;
* Make sure you can test the code you&#039;re working on with python3!&lt;br /&gt;
** If using `tox`, then adding `py35`, and `py36` to the list of environments should be sufficient.&lt;br /&gt;
** If using |mach python-test|, make sure the relevant manifest doesn&#039;t skip-if Python 3 and run |mach python-test --python 3 &amp;lt;path&amp;gt;|.&lt;br /&gt;
* [http://python-future.org/futurize.html#stage-1-safe-fixes `futurize` Stage 1 fixes] can be used to transform code into code that&#039;s compatible with both python2.7 and python3.&lt;br /&gt;
* The `six` module is available in-tree, feel free to use it as a dependency.&lt;br /&gt;
* [https://black.readthedocs.io/en/stable/index.html Black] can format Python 2 code and Python 3 code (but [https://black.readthedocs.io/en/stable/installation_and_usage.html it requires Py3.6+ to run]).&lt;br /&gt;
&lt;br /&gt;
=== Porting examples ===&lt;br /&gt;
&lt;br /&gt;
Prefer &amp;lt;code&amp;gt;[https://six.readthedocs.io/ six]&amp;lt;/code&amp;gt; when possible.  Make use of &amp;lt;code&amp;gt;six.PY2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;six.PY3&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;six.moves&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;six.string_types&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;six.integer_types&amp;lt;/code&amp;gt;, etc.  This make it easy to find the py2 code again so we can remove it.&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;import&amp;lt;/code&amp;gt; statements ====&lt;br /&gt;
&lt;br /&gt;
Use the &amp;lt;code&amp;gt;[https://six.readthedocs.io/#module-six.moves six.moves]&amp;lt;/code&amp;gt; module:&lt;br /&gt;
&lt;br /&gt;
Before:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import __builtin__&lt;br /&gt;
&lt;br /&gt;
__builtin__.__import__ = myimporthook()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
from six.moves import builtins&lt;br /&gt;
&lt;br /&gt;
builtins.__import__ = myimporthook()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;if&amp;lt;/code&amp;gt; statements ====&lt;br /&gt;
&lt;br /&gt;
Use &amp;lt;code&amp;gt;six.PY2&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;six.PY3&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import six&lt;br /&gt;
&lt;br /&gt;
if six.PY2:&lt;br /&gt;
    # py2 stuff&lt;br /&gt;
else:&lt;br /&gt;
    # py3 stuff&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If six isn&#039;t available or you are in the imports section of the module then this is fine too:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
if sys.version_info &amp;lt; (3,):&lt;br /&gt;
   # py2 stuff&lt;br /&gt;
else:&lt;br /&gt;
   # py3 stuff&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== String data ====&lt;br /&gt;
&lt;br /&gt;
Use &amp;lt;code&amp;gt;six.string_types&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;six.text_type&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;six.binary_type&amp;lt;/code&amp;gt;, etc. Also see the &amp;lt;code&amp;gt;six&amp;lt;/code&amp;gt; docs for &amp;quot;[https://six.readthedocs.io/#binary-and-text-data Binary and text data]&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
Before:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# using unicode&lt;br /&gt;
def write(self, buf):&lt;br /&gt;
    if isinstance(buf, unicode):&lt;br /&gt;
        buf = buf.encode(&#039;utf-8&#039;)&lt;br /&gt;
    BytesIO.write(self, buf)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# using types.StringTypes&lt;br /&gt;
if isinstance(value, types.StringTypes):&lt;br /&gt;
    ...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import six&lt;br /&gt;
&lt;br /&gt;
# fixed unicode&lt;br /&gt;
def write(self, buf):&lt;br /&gt;
    if isinstance(buf, six.text_type):&lt;br /&gt;
        buf = buf.encode(&#039;utf-8&#039;)&lt;br /&gt;
    BytesIO.write(self, buf)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# fixed types.StringTypes&lt;br /&gt;
if isinstance(value, six.string_types):&lt;br /&gt;
    ...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;subprocess.check_output()&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
Python 2.7 code will often call &amp;lt;code&amp;gt;subprocess.check_output()&amp;lt;/code&amp;gt; and then do string manipulation on the output, such as &amp;lt;code&amp;gt;str.splitlines()&amp;lt;/code&amp;gt;.  The code will fail under Python 3 because &amp;lt;code&amp;gt;subprocess.check_output()&amp;lt;/code&amp;gt; now returns a binary data stream.  However we can use the &amp;lt;code&amp;gt;universal_newlines=True&amp;lt;/code&amp;gt; keyword argument to get back a text type object in both Python 2 and Python 3.&lt;br /&gt;
&lt;br /&gt;
Before:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
output = subprocess.check_output([callargs])&lt;br /&gt;
lines = output.splitlines()  # Broken in Python 3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
output = subprocess.check_output([callargs], universal_newlines=True)&lt;br /&gt;
lines = output.splitlines()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
See the [https://docs.python.org/3.6/library/subprocess.html#frequently-used-arguments subprocess documentation] for details.&lt;br /&gt;
&lt;br /&gt;
=== Porting Resources ===&lt;br /&gt;
&lt;br /&gt;
[https://docs.python.org/3/howto/pyporting.html Porting Guide on python.org]&lt;br /&gt;
&lt;br /&gt;
[http://python-future.org/compatible_idioms.html Cheat Sheet: Writing Python 2-3 compatible code].  Note: misses some advanced changes, like porting __eq__() to __hash__() and changes to the slice interface.&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
&lt;br /&gt;
[https://bugzilla.mozilla.org/showdependencytree.cgi?id=1496527&amp;amp;hide_resolved=1 Bug 1496527] tracks the migration&lt;br /&gt;
&lt;br /&gt;
https://ahal.ca/blog/2019/python-3-at-mozilla&lt;br /&gt;
&lt;br /&gt;
[https://docs.google.com/document/d/1Uo6GYztM4_3mYJ1P8Tj1M2VCXktaOXjUid8AIojO8Oo/edit?usp=sharing Python 3 tree migration notes]&lt;br /&gt;
&lt;br /&gt;
[https://docs.google.com/document/d/1AzM3EOThG7GeMSCS5CcaTkojQEneaNj3N07igLBkyvc/edit# mach Python 3 migration roadmap]&lt;/div&gt;</summary>
		<author><name>Kmoir</name></author>
	</entry>
	<entry>
		<id>https://wiki.mozilla.org/index.php?title=Firefox/Python_3_Migration&amp;diff=1221625</id>
		<title>Firefox/Python 3 Migration</title>
		<link rel="alternate" type="text/html" href="https://wiki.mozilla.org/index.php?title=Firefox/Python_3_Migration&amp;diff=1221625"/>
		<updated>2019-12-24T02:47:51Z</updated>

		<summary type="html">&lt;p&gt;Kmoir: /* Remove more of the &amp;quot;excluded&amp;quot; paths from the py2 and py3 linters */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page collects links and resources to assist the migration of the Firefox ecosystem off of Python 2 and onto Python 3.&lt;br /&gt;
&lt;br /&gt;
== Why This is Important ==&lt;br /&gt;
&lt;br /&gt;
In mozilla-central there are over 3500 Python files (excluding third party files), comprising roughly 230k lines of code. Most of it is Python 2.[https://ahal.ca/blog/2019/python-3-at-mozilla/]&lt;br /&gt;
&lt;br /&gt;
Python 2 will reach it&#039;s  End Of Life on &#039;&#039;&#039;[https://www.python.org/doc/sunset-python-2/ January 1st 2020]&#039;&#039;&#039; (here&#039;s [https://pythonclock.org/ a countdown!]).&lt;br /&gt;
&lt;br /&gt;
== What Will Happen If We Don&#039;t Upgrade? ==&lt;br /&gt;
&lt;br /&gt;
The [https://www.python.org/doc/sunset-python-2/ PSF said it best]:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote style=&amp;quot;background-color: #F0F0FF; padding: 1em&amp;quot;&amp;gt;&amp;quot;If people find catastrophic security problems in Python 2, or in software written in Python 2, then most volunteers will not help fix them. If you need help with Python 2 software, then many volunteers will not help you, and over time fewer and fewer volunteers will be able to help you. You will lose chances to use good tools because they will only run on Python 3, and you will slow down people who depend on you and work with you.&lt;br /&gt;
&lt;br /&gt;
Some of these problems will start on January 1. Other problems will grow over time.&amp;quot;&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== How We Get There ==&lt;br /&gt;
&lt;br /&gt;
As of today (May 2019) we require both the Python 2 and Python 3 interpreters to be installed to build and develop Firefox.&lt;br /&gt;
&lt;br /&gt;
Next we:&lt;br /&gt;
&lt;br /&gt;
# Make Python 3 porting and development safe by adding a Python 3 option to the developer toolchain. (mach lint, coverage.py, parts of the test suite)&lt;br /&gt;
# Make key support libraries run in both Python 2 and Python 3. (mach-core)&lt;br /&gt;
# Build interpreter switching mechanisms into the toolchain so we can run sub-components in just 2 or just 3. (mach sub-commands, py_action)&lt;br /&gt;
# Port Python 2-only components to Python 3 piecemeal.&lt;br /&gt;
# Remove Python 2 compatibility. (When that might happen needs discussion. Possibly sometime in 2020.)&lt;br /&gt;
&lt;br /&gt;
== Getting Involved ==&lt;br /&gt;
&lt;br /&gt;
=== Find the others ===&lt;br /&gt;
&lt;br /&gt;
Most discussion happens in the #py3 channel on Slack (NDA&#039;d Mozillians only). You can also join #python on irc.mozilla.org.&lt;br /&gt;
&lt;br /&gt;
=== What you&#039;ll need ===&lt;br /&gt;
&lt;br /&gt;
You will need a [https://developer.mozilla.org/en-US/docs/Mozilla/Developer_guide/Build_Instructions/Simple_Firefox_build working Firefox build environment].&lt;br /&gt;
&lt;br /&gt;
=== Where to start: ===&lt;br /&gt;
&lt;br /&gt;
==== Remove more of the &amp;quot;excluded&amp;quot; paths from the py2 and py3 linters ====&lt;br /&gt;
&lt;br /&gt;
See [https://pad.mozilla.org/p/py3 this Etherpad] for instructions.&lt;br /&gt;
&lt;br /&gt;
Roughly:&lt;br /&gt;
&lt;br /&gt;
* Pick a directory [https://pad.mozilla.org/p/py3 from the list], and put your name beside it so we know it&#039;s ported (this etherpad is now blank, ask in #py3 for details)&lt;br /&gt;
* Edit py2.yml and/or py3.yml and remove that directory from the exclusion list (from tools/lint/py2.yml and tools/lint/py3.yml in https://hg.mozilla.org/mozilla-central/)&lt;br /&gt;
* Run `./mach lint -l py2 -l py3 &amp;lt;your directory name&amp;gt;` to get a list of errors&lt;br /&gt;
* To get a list of files that need fixing:&lt;br /&gt;
 ./mach lint -l py2 -l py3 &amp;lt;your directory name&amp;gt; --format unix &amp;gt; tofix.txt&lt;br /&gt;
* To install `futurize`:&lt;br /&gt;
 pip install --user future&lt;br /&gt;
* To run through futurize&lt;br /&gt;
 cat tofix.txt | cut -f1 -d: | sort -u | xargs futurize -1 -w&lt;br /&gt;
* Visually inspect the patch, especially around `except:` clauses.  Watch out for &amp;quot;xxx_todo_changeme&amp;quot; in the patch.  These are places where futurize couldn&#039;t port the code and you need to fix it manually.&lt;br /&gt;
&lt;br /&gt;
When your patch is ready file:&lt;br /&gt;
&lt;br /&gt;
# Use moz-phab for submitting the patch - https://moz-conduit.readthedocs.io/en/latest/phabricator-user.html#submitting-patches&lt;br /&gt;
# Use [https://bugzilla.mozilla.org/show_bug.cgi?id=1559975 bug 1559975]&lt;br /&gt;
# Set one of callek, ahal, or catlee as the code reviewer&lt;br /&gt;
&lt;br /&gt;
==== Enable Python 3 on more Python unittests ====&lt;br /&gt;
&lt;br /&gt;
Python unittests are run with `./mach python-test` and are (usually) defined in `python.ini` files. To get a test running against Python 3:&lt;br /&gt;
&lt;br /&gt;
# Find a test that is skipped with Python 3, you can use [https://searchfox.org/mozilla-central/search?q=.*(skip|fail)-if.*python+%3F%3D%3D+%3F3&amp;amp;case=true&amp;amp;regexp=true&amp;amp;path=.ini%24 this query] to find these tests.&lt;br /&gt;
# Edit the manifest and remove the Python 3 skip-if annotation.&lt;br /&gt;
# Run the test with `./mach python-test --python 3 path/to/test`.&lt;br /&gt;
# Fix any errors and repeat the previous step.&lt;br /&gt;
# Once it is passing locally, test it out on try. If there is no Python 3 task running this manifest already, you&#039;ll need to add one by adding `3` to the `python-version` key in [https://searchfox.org/mozilla-central/source/taskcluster/ci/source-test/python.yml python.yml].&lt;br /&gt;
# Push the task to try on all platforms it is configured for.&lt;br /&gt;
&lt;br /&gt;
==== Port a Mach Command ====&lt;br /&gt;
&lt;br /&gt;
The mach driver (toplevel `mach` file) contains a whitelist of commands that still run with Python 2. Pick the command that you&#039;d like to convert and then:&lt;br /&gt;
&lt;br /&gt;
# Remove it from the whitelist&lt;br /&gt;
# Run: ./mach &amp;lt;command&amp;gt;&lt;br /&gt;
# See what breaks and fix it!&lt;br /&gt;
# Repeat with a variety of different flags and arguments&lt;br /&gt;
# Make sure any Python unittests running in CI have Python 3 enabled (see above)&lt;br /&gt;
&lt;br /&gt;
== How to Port the Code ==&lt;br /&gt;
&lt;br /&gt;
=== Before starting ===&lt;br /&gt;
&lt;br /&gt;
If you haven&#039;t ported modules before (or need a refresher), read the [https://docs.python.org/3/howto/pyporting.html Porting Guide on python.org].  It has a good outline of the porting process.&lt;br /&gt;
&lt;br /&gt;
=== Porting modules in the Firefox source tree ===&lt;br /&gt;
&lt;br /&gt;
* We&#039;ve already standardized on Python 2.7 across the tree.&lt;br /&gt;
* Make sure you can test the code you&#039;re working on with python3!&lt;br /&gt;
** If using `tox`, then adding `py35`, and `py36` to the list of environments should be sufficient.&lt;br /&gt;
** If using |mach python-test|, make sure the relevant manifest doesn&#039;t skip-if Python 3 and run |mach python-test --python 3 &amp;lt;path&amp;gt;|.&lt;br /&gt;
* [http://python-future.org/futurize.html#stage-1-safe-fixes `futurize` Stage 1 fixes] can be used to transform code into code that&#039;s compatible with both python2.7 and python3.&lt;br /&gt;
* The `six` module is available in-tree, feel free to use it as a dependency.&lt;br /&gt;
* [https://black.readthedocs.io/en/stable/index.html Black] can format Python 2 code and Python 3 code (but [https://black.readthedocs.io/en/stable/installation_and_usage.html it requires Py3.6+ to run]).&lt;br /&gt;
&lt;br /&gt;
=== Porting examples ===&lt;br /&gt;
&lt;br /&gt;
Prefer &amp;lt;code&amp;gt;[https://six.readthedocs.io/ six]&amp;lt;/code&amp;gt; when possible.  Make use of &amp;lt;code&amp;gt;six.PY2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;six.PY3&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;six.moves&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;six.string_types&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;six.integer_types&amp;lt;/code&amp;gt;, etc.  This make it easy to find the py2 code again so we can remove it.&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;import&amp;lt;/code&amp;gt; statements ====&lt;br /&gt;
&lt;br /&gt;
Use the &amp;lt;code&amp;gt;[https://six.readthedocs.io/#module-six.moves six.moves]&amp;lt;/code&amp;gt; module:&lt;br /&gt;
&lt;br /&gt;
Before:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import __builtin__&lt;br /&gt;
&lt;br /&gt;
__builtin__.__import__ = myimporthook()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
from six.moves import builtins&lt;br /&gt;
&lt;br /&gt;
builtins.__import__ = myimporthook()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;if&amp;lt;/code&amp;gt; statements ====&lt;br /&gt;
&lt;br /&gt;
Use &amp;lt;code&amp;gt;six.PY2&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;six.PY3&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import six&lt;br /&gt;
&lt;br /&gt;
if six.PY2:&lt;br /&gt;
    # py2 stuff&lt;br /&gt;
else:&lt;br /&gt;
    # py3 stuff&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If six isn&#039;t available or you are in the imports section of the module then this is fine too:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
if sys.version_info &amp;lt; (3,):&lt;br /&gt;
   # py2 stuff&lt;br /&gt;
else:&lt;br /&gt;
   # py3 stuff&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== String data ====&lt;br /&gt;
&lt;br /&gt;
Use &amp;lt;code&amp;gt;six.string_types&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;six.text_type&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;six.binary_type&amp;lt;/code&amp;gt;, etc. Also see the &amp;lt;code&amp;gt;six&amp;lt;/code&amp;gt; docs for &amp;quot;[https://six.readthedocs.io/#binary-and-text-data Binary and text data]&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
Before:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# using unicode&lt;br /&gt;
def write(self, buf):&lt;br /&gt;
    if isinstance(buf, unicode):&lt;br /&gt;
        buf = buf.encode(&#039;utf-8&#039;)&lt;br /&gt;
    BytesIO.write(self, buf)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# using types.StringTypes&lt;br /&gt;
if isinstance(value, types.StringTypes):&lt;br /&gt;
    ...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import six&lt;br /&gt;
&lt;br /&gt;
# fixed unicode&lt;br /&gt;
def write(self, buf):&lt;br /&gt;
    if isinstance(buf, six.text_type):&lt;br /&gt;
        buf = buf.encode(&#039;utf-8&#039;)&lt;br /&gt;
    BytesIO.write(self, buf)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# fixed types.StringTypes&lt;br /&gt;
if isinstance(value, six.string_types):&lt;br /&gt;
    ...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;subprocess.check_output()&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
Python 2.7 code will often call &amp;lt;code&amp;gt;subprocess.check_output()&amp;lt;/code&amp;gt; and then do string manipulation on the output, such as &amp;lt;code&amp;gt;str.splitlines()&amp;lt;/code&amp;gt;.  The code will fail under Python 3 because &amp;lt;code&amp;gt;subprocess.check_output()&amp;lt;/code&amp;gt; now returns a binary data stream.  However we can use the &amp;lt;code&amp;gt;universal_newlines=True&amp;lt;/code&amp;gt; keyword argument to get back a text type object in both Python 2 and Python 3.&lt;br /&gt;
&lt;br /&gt;
Before:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
output = subprocess.check_output([callargs])&lt;br /&gt;
lines = output.splitlines()  # Broken in Python 3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
output = subprocess.check_output([callargs], universal_newlines=True)&lt;br /&gt;
lines = output.splitlines()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
See the [https://docs.python.org/3.6/library/subprocess.html#frequently-used-arguments subprocess documentation] for details.&lt;br /&gt;
&lt;br /&gt;
=== Porting Resources ===&lt;br /&gt;
&lt;br /&gt;
[https://docs.python.org/3/howto/pyporting.html Porting Guide on python.org]&lt;br /&gt;
&lt;br /&gt;
[http://python-future.org/compatible_idioms.html Cheat Sheet: Writing Python 2-3 compatible code].  Note: misses some advanced changes, like porting __eq__() to __hash__() and changes to the slice interface.&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
&lt;br /&gt;
[https://bugzilla.mozilla.org/showdependencytree.cgi?id=1496527&amp;amp;hide_resolved=1 Bug 1496527] tracks the migration&lt;br /&gt;
&lt;br /&gt;
https://ahal.ca/blog/2019/python-3-at-mozilla&lt;br /&gt;
&lt;br /&gt;
[https://docs.google.com/document/d/1Uo6GYztM4_3mYJ1P8Tj1M2VCXktaOXjUid8AIojO8Oo/edit?usp=sharing Python 3 tree migration notes]&lt;br /&gt;
&lt;br /&gt;
[https://docs.google.com/document/d/1AzM3EOThG7GeMSCS5CcaTkojQEneaNj3N07igLBkyvc/edit# mach Python 3 migration roadmap]&lt;/div&gt;</summary>
		<author><name>Kmoir</name></author>
	</entry>
	<entry>
		<id>https://wiki.mozilla.org/index.php?title=Firefox/Python_3_Migration&amp;diff=1221616</id>
		<title>Firefox/Python 3 Migration</title>
		<link rel="alternate" type="text/html" href="https://wiki.mozilla.org/index.php?title=Firefox/Python_3_Migration&amp;diff=1221616"/>
		<updated>2019-12-23T13:32:42Z</updated>

		<summary type="html">&lt;p&gt;Kmoir: /* Remove more of the &amp;quot;excluded&amp;quot; paths from the py2 and py3 linters */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page collects links and resources to assist the migration of the Firefox ecosystem off of Python 2 and onto Python 3.&lt;br /&gt;
&lt;br /&gt;
== Why This is Important ==&lt;br /&gt;
&lt;br /&gt;
In mozilla-central there are over 3500 Python files (excluding third party files), comprising roughly 230k lines of code. Most of it is Python 2.[https://ahal.ca/blog/2019/python-3-at-mozilla/]&lt;br /&gt;
&lt;br /&gt;
Python 2 will reach it&#039;s  End Of Life on &#039;&#039;&#039;[https://www.python.org/doc/sunset-python-2/ January 1st 2020]&#039;&#039;&#039; (here&#039;s [https://pythonclock.org/ a countdown!]).&lt;br /&gt;
&lt;br /&gt;
== What Will Happen If We Don&#039;t Upgrade? ==&lt;br /&gt;
&lt;br /&gt;
The [https://www.python.org/doc/sunset-python-2/ PSF said it best]:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote style=&amp;quot;background-color: #F0F0FF; padding: 1em&amp;quot;&amp;gt;&amp;quot;If people find catastrophic security problems in Python 2, or in software written in Python 2, then most volunteers will not help fix them. If you need help with Python 2 software, then many volunteers will not help you, and over time fewer and fewer volunteers will be able to help you. You will lose chances to use good tools because they will only run on Python 3, and you will slow down people who depend on you and work with you.&lt;br /&gt;
&lt;br /&gt;
Some of these problems will start on January 1. Other problems will grow over time.&amp;quot;&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== How We Get There ==&lt;br /&gt;
&lt;br /&gt;
As of today (May 2019) we require both the Python 2 and Python 3 interpreters to be installed to build and develop Firefox.&lt;br /&gt;
&lt;br /&gt;
Next we:&lt;br /&gt;
&lt;br /&gt;
# Make Python 3 porting and development safe by adding a Python 3 option to the developer toolchain. (mach lint, coverage.py, parts of the test suite)&lt;br /&gt;
# Make key support libraries run in both Python 2 and Python 3. (mach-core)&lt;br /&gt;
# Build interpreter switching mechanisms into the toolchain so we can run sub-components in just 2 or just 3. (mach sub-commands, py_action)&lt;br /&gt;
# Port Python 2-only components to Python 3 piecemeal.&lt;br /&gt;
# Remove Python 2 compatibility. (When that might happen needs discussion. Possibly sometime in 2020.)&lt;br /&gt;
&lt;br /&gt;
== Getting Involved ==&lt;br /&gt;
&lt;br /&gt;
=== Find the others ===&lt;br /&gt;
&lt;br /&gt;
Most discussion happens in the #py3 channel on Slack (NDA&#039;d Mozillians only). You can also join #python on irc.mozilla.org.&lt;br /&gt;
&lt;br /&gt;
=== What you&#039;ll need ===&lt;br /&gt;
&lt;br /&gt;
You will need a [https://developer.mozilla.org/en-US/docs/Mozilla/Developer_guide/Build_Instructions/Simple_Firefox_build working Firefox build environment].&lt;br /&gt;
&lt;br /&gt;
=== Where to start: ===&lt;br /&gt;
&lt;br /&gt;
==== Remove more of the &amp;quot;excluded&amp;quot; paths from the py2 and py3 linters ====&lt;br /&gt;
&lt;br /&gt;
See [https://pad.mozilla.org/p/py3 this Etherpad] for instructions.&lt;br /&gt;
&lt;br /&gt;
Roughly:&lt;br /&gt;
&lt;br /&gt;
* Pick a directory [https://pad.mozilla.org/p/py3 from the list], and put your name beside it so we know it&#039;s ported&lt;br /&gt;
* Edit py2.yml and/or py3.yml and remove that directory from the exclusion list (from tools/lint/py2.yml and tools/lint/py3.yml in https://hg.mozilla.org/mozilla-central/)&lt;br /&gt;
* Run `./mach lint -l py2 -l py3 &amp;lt;your directory name&amp;gt;` to get a list of errors&lt;br /&gt;
* To get a list of files that need fixing:&lt;br /&gt;
 ./mach lint -l py2 -l py3 &amp;lt;your directory name&amp;gt; --format unix &amp;gt; tofix.txt&lt;br /&gt;
* To install `futurize`:&lt;br /&gt;
 pip install --user future&lt;br /&gt;
* To run through futurize&lt;br /&gt;
 cat tofix.txt | cut -f1 -d: | sort -u | xargs futurize -1 -w&lt;br /&gt;
* Visually inspect the patch, especially around `except:` clauses.  Watch out for &amp;quot;xxx_todo_changeme&amp;quot; in the patch.  These are places where futurize couldn&#039;t port the code and you need to fix it manually.&lt;br /&gt;
&lt;br /&gt;
When your patch is ready file:&lt;br /&gt;
&lt;br /&gt;
# Use moz-phab for submitting the patch - https://moz-conduit.readthedocs.io/en/latest/phabricator-user.html#submitting-patches&lt;br /&gt;
# Use [https://bugzilla.mozilla.org/show_bug.cgi?id=1559975 bug 1559975]&lt;br /&gt;
# Set one of callek, ahal, or catlee as the code reviewer&lt;br /&gt;
&lt;br /&gt;
==== Enable Python 3 on more Python unittests ====&lt;br /&gt;
&lt;br /&gt;
Python unittests are run with `./mach python-test` and are (usually) defined in `python.ini` files. To get a test running against Python 3:&lt;br /&gt;
&lt;br /&gt;
# Find a test that is skipped with Python 3, you can use [https://searchfox.org/mozilla-central/search?q=.*(skip|fail)-if.*python+%3F%3D%3D+%3F3&amp;amp;case=true&amp;amp;regexp=true&amp;amp;path=.ini%24 this query] to find these tests.&lt;br /&gt;
# Edit the manifest and remove the Python 3 skip-if annotation.&lt;br /&gt;
# Run the test with `./mach python-test --python 3 path/to/test`.&lt;br /&gt;
# Fix any errors and repeat the previous step.&lt;br /&gt;
# Once it is passing locally, test it out on try. If there is no Python 3 task running this manifest already, you&#039;ll need to add one by adding `3` to the `python-version` key in [https://searchfox.org/mozilla-central/source/taskcluster/ci/source-test/python.yml python.yml].&lt;br /&gt;
# Push the task to try on all platforms it is configured for.&lt;br /&gt;
&lt;br /&gt;
==== Port a Mach Command ====&lt;br /&gt;
&lt;br /&gt;
The mach driver (toplevel `mach` file) contains a whitelist of commands that still run with Python 2. Pick the command that you&#039;d like to convert and then:&lt;br /&gt;
&lt;br /&gt;
# Remove it from the whitelist&lt;br /&gt;
# Run: ./mach &amp;lt;command&amp;gt;&lt;br /&gt;
# See what breaks and fix it!&lt;br /&gt;
# Repeat with a variety of different flags and arguments&lt;br /&gt;
# Make sure any Python unittests running in CI have Python 3 enabled (see above)&lt;br /&gt;
&lt;br /&gt;
== How to Port the Code ==&lt;br /&gt;
&lt;br /&gt;
=== Before starting ===&lt;br /&gt;
&lt;br /&gt;
If you haven&#039;t ported modules before (or need a refresher), read the [https://docs.python.org/3/howto/pyporting.html Porting Guide on python.org].  It has a good outline of the porting process.&lt;br /&gt;
&lt;br /&gt;
=== Porting modules in the Firefox source tree ===&lt;br /&gt;
&lt;br /&gt;
* We&#039;ve already standardized on Python 2.7 across the tree.&lt;br /&gt;
* Make sure you can test the code you&#039;re working on with python3!&lt;br /&gt;
** If using `tox`, then adding `py35`, and `py36` to the list of environments should be sufficient.&lt;br /&gt;
** If using |mach python-test|, make sure the relevant manifest doesn&#039;t skip-if Python 3 and run |mach python-test --python 3 &amp;lt;path&amp;gt;|.&lt;br /&gt;
* [http://python-future.org/futurize.html#stage-1-safe-fixes `futurize` Stage 1 fixes] can be used to transform code into code that&#039;s compatible with both python2.7 and python3.&lt;br /&gt;
* The `six` module is available in-tree, feel free to use it as a dependency.&lt;br /&gt;
* [https://black.readthedocs.io/en/stable/index.html Black] can format Python 2 code and Python 3 code (but [https://black.readthedocs.io/en/stable/installation_and_usage.html it requires Py3.6+ to run]).&lt;br /&gt;
&lt;br /&gt;
=== Porting examples ===&lt;br /&gt;
&lt;br /&gt;
Prefer &amp;lt;code&amp;gt;[https://six.readthedocs.io/ six]&amp;lt;/code&amp;gt; when possible.  Make use of &amp;lt;code&amp;gt;six.PY2&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;six.PY3&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;six.moves&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;six.string_types&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;six.integer_types&amp;lt;/code&amp;gt;, etc.  This make it easy to find the py2 code again so we can remove it.&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;import&amp;lt;/code&amp;gt; statements ====&lt;br /&gt;
&lt;br /&gt;
Use the &amp;lt;code&amp;gt;[https://six.readthedocs.io/#module-six.moves six.moves]&amp;lt;/code&amp;gt; module:&lt;br /&gt;
&lt;br /&gt;
Before:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import __builtin__&lt;br /&gt;
&lt;br /&gt;
__builtin__.__import__ = myimporthook()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
from six.moves import builtins&lt;br /&gt;
&lt;br /&gt;
builtins.__import__ = myimporthook()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;if&amp;lt;/code&amp;gt; statements ====&lt;br /&gt;
&lt;br /&gt;
Use &amp;lt;code&amp;gt;six.PY2&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;six.PY3&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import six&lt;br /&gt;
&lt;br /&gt;
if six.PY2:&lt;br /&gt;
    # py2 stuff&lt;br /&gt;
else:&lt;br /&gt;
    # py3 stuff&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If six isn&#039;t available or you are in the imports section of the module then this is fine too:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
if sys.version_info &amp;lt; (3,):&lt;br /&gt;
   # py2 stuff&lt;br /&gt;
else:&lt;br /&gt;
   # py3 stuff&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== String data ====&lt;br /&gt;
&lt;br /&gt;
Use &amp;lt;code&amp;gt;six.string_types&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;six.text_type&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;six.binary_type&amp;lt;/code&amp;gt;, etc. Also see the &amp;lt;code&amp;gt;six&amp;lt;/code&amp;gt; docs for &amp;quot;[https://six.readthedocs.io/#binary-and-text-data Binary and text data]&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
Before:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# using unicode&lt;br /&gt;
def write(self, buf):&lt;br /&gt;
    if isinstance(buf, unicode):&lt;br /&gt;
        buf = buf.encode(&#039;utf-8&#039;)&lt;br /&gt;
    BytesIO.write(self, buf)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# using types.StringTypes&lt;br /&gt;
if isinstance(value, types.StringTypes):&lt;br /&gt;
    ...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import six&lt;br /&gt;
&lt;br /&gt;
# fixed unicode&lt;br /&gt;
def write(self, buf):&lt;br /&gt;
    if isinstance(buf, six.text_type):&lt;br /&gt;
        buf = buf.encode(&#039;utf-8&#039;)&lt;br /&gt;
    BytesIO.write(self, buf)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# fixed types.StringTypes&lt;br /&gt;
if isinstance(value, six.string_types):&lt;br /&gt;
    ...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== &amp;lt;code&amp;gt;subprocess.check_output()&amp;lt;/code&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
Python 2.7 code will often call &amp;lt;code&amp;gt;subprocess.check_output()&amp;lt;/code&amp;gt; and then do string manipulation on the output, such as &amp;lt;code&amp;gt;str.splitlines()&amp;lt;/code&amp;gt;.  The code will fail under Python 3 because &amp;lt;code&amp;gt;subprocess.check_output()&amp;lt;/code&amp;gt; now returns a binary data stream.  However we can use the &amp;lt;code&amp;gt;universal_newlines=True&amp;lt;/code&amp;gt; keyword argument to get back a text type object in both Python 2 and Python 3.&lt;br /&gt;
&lt;br /&gt;
Before:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
output = subprocess.check_output([callargs])&lt;br /&gt;
lines = output.splitlines()  # Broken in Python 3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
output = subprocess.check_output([callargs], universal_newlines=True)&lt;br /&gt;
lines = output.splitlines()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
See the [https://docs.python.org/3.6/library/subprocess.html#frequently-used-arguments subprocess documentation] for details.&lt;br /&gt;
&lt;br /&gt;
=== Porting Resources ===&lt;br /&gt;
&lt;br /&gt;
[https://docs.python.org/3/howto/pyporting.html Porting Guide on python.org]&lt;br /&gt;
&lt;br /&gt;
[http://python-future.org/compatible_idioms.html Cheat Sheet: Writing Python 2-3 compatible code].  Note: misses some advanced changes, like porting __eq__() to __hash__() and changes to the slice interface.&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
&lt;br /&gt;
[https://bugzilla.mozilla.org/showdependencytree.cgi?id=1496527&amp;amp;hide_resolved=1 Bug 1496527] tracks the migration&lt;br /&gt;
&lt;br /&gt;
https://ahal.ca/blog/2019/python-3-at-mozilla&lt;br /&gt;
&lt;br /&gt;
[https://docs.google.com/document/d/1Uo6GYztM4_3mYJ1P8Tj1M2VCXktaOXjUid8AIojO8Oo/edit?usp=sharing Python 3 tree migration notes]&lt;br /&gt;
&lt;br /&gt;
[https://docs.google.com/document/d/1AzM3EOThG7GeMSCS5CcaTkojQEneaNj3N07igLBkyvc/edit# mach Python 3 migration roadmap]&lt;/div&gt;</summary>
		<author><name>Kmoir</name></author>
	</entry>
	<entry>
		<id>https://wiki.mozilla.org/index.php?title=Auto-tools/Projects/Pulse&amp;diff=1221274</id>
		<title>Auto-tools/Projects/Pulse</title>
		<link rel="alternate" type="text/html" href="https://wiki.mozilla.org/index.php?title=Auto-tools/Projects/Pulse&amp;diff=1221274"/>
		<updated>2019-12-13T16:13:36Z</updated>

		<summary type="html">&lt;p&gt;Kmoir: /* Admin Procedures */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Introducing Pulse =&lt;br /&gt;
&lt;br /&gt;
Pulse is a managed [http://www.rabbitmq.com RabbitMQ] cluster designed to provide loose coupling between automation and infrastructure tools.  The goal of Pulse is to add visibility to Mozilla&#039;s tools and systems and to eliminate polling and other brittle methods of scraping data. This allows more robust, dynamic, and informative tools.&lt;br /&gt;
&lt;br /&gt;
Pulse is available at pulse.mozilla.org:5671 (AMQP over SSL).  It is hosted by [http://cloudamqp.com CloudAMQP].&lt;br /&gt;
&lt;br /&gt;
[[Auto-tools/Projects/Pulse/PulseGuardian|PulseGuardian]] is a tool that manages Pulse&#039;s users and queues (and eventually exchanges).  It is available at https://pulseguardian.mozilla.org and hosted by [http://heroku.com Heroku].&lt;br /&gt;
&lt;br /&gt;
We have a discussion forum available via the standard trio of [news:mozilla.tools.pulse USENET newsgroup], [https://lists.mozilla.org/listinfo/tools-pulse mailing list], and [https://groups.google.com/forum/#!forum/mozilla.tools.pulse Google Group].&lt;br /&gt;
&lt;br /&gt;
File bugs under [https://bugzilla.mozilla.org/enter_bug.cgi?product=Webtools&amp;amp;component=Pulse Webtools :: Pulse].  We don&#039;t have a separate component for PulseGuardian; rather, we just start the summaries with &amp;quot;[PulseGuardian]&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Also see the [https://tools.taskcluster.net/pulse-inspector/ Pulse Inspector] web app, which displays Pulse messages in real time, and the (manually updated) [[/Exchanges|list of Pulse exchanges]].&lt;br /&gt;
&lt;br /&gt;
= System Description =&lt;br /&gt;
&lt;br /&gt;
Pulse isn&#039;t any one thing.  At its heart, it is a RabbitMQ system with a particular configuration and a set of conventions for using it along with a management tool, [[Auto-tools/Projects/Pulse/PulseGuardian|PulseGuardian]], to make Pulse as automated and self-serve as possible.  Pulse follows the pub-sub pattern, in which publishers send messages to topic exchanges, and consumers create queues bound to these exchanges in order to subscribe to the publishers&#039; messages.  In general, publishers create and own exchanges, and consumers create and own queues.&lt;br /&gt;
&lt;br /&gt;
= Specification =&lt;br /&gt;
&lt;br /&gt;
Pulse is a managed [https://www.rabbitmq.com/resources/specs/amqp0-9-1.pdf AMQP 0-9-1]&lt;br /&gt;
service with [https://www.rabbitmq.com/extensions.html RabbitMQ extensions] for publishing messages from Mozilla&lt;br /&gt;
infrastructure. The aim is provide hooks that subscribers can&lt;br /&gt;
use to integrate and extend Mozilla infrastructure.&lt;br /&gt;
&lt;br /&gt;
== Authentication ==&lt;br /&gt;
&lt;br /&gt;
Pulse credentials are managed and issued by [[Auto-tools/Projects/Pulse/PulseGuardian|PulseGuardian]],&lt;br /&gt;
available at https://pulseguardian.mozilla.org. This service SHALL issue&lt;br /&gt;
an &#039;&#039;accessToken&#039;&#039; for any &#039;&#039;clientId&#039;&#039; that is registered&lt;br /&gt;
with &#039;&#039;authorized&#039;&#039; email address.&lt;br /&gt;
The accessToken is strictly secret and MUST NOT be shared&lt;br /&gt;
publicly. The clientId is not secret. When establishing an AMQP&lt;br /&gt;
connection, the clientId and accessToken MUST be used as&lt;br /&gt;
&#039;&#039;username&#039;&#039; and &#039;&#039;password&#039;&#039;, respectively.&lt;br /&gt;
&lt;br /&gt;
== Authorized Users ==&lt;br /&gt;
&lt;br /&gt;
Pulse is intended to be open to all Mozillians who want to&lt;br /&gt;
extend or integrate with Mozilla infrastructure. To guard against&lt;br /&gt;
abuse PulseGuardian users MUST authenticate via Persona. PulseGuardian SHOULD verify that users have a vouched Mozillians profile.&lt;br /&gt;
&lt;br /&gt;
== Publishers ==&lt;br /&gt;
&lt;br /&gt;
Publishers MUST name &#039;&#039;exchanges&#039;&#039; in the form &amp;lt;code&amp;gt;exchange/&amp;lt;clientId&amp;gt;/&amp;lt;name&amp;gt;&amp;lt;/code&amp;gt; where clientId is the userid used to bind/connect to the server. Attempts to name an exchange otherwise SHALL result in an authorization error. Exchanges MUST be &#039;&#039;topic exchanges&#039;&#039; and they MUST be declared &#039;&#039;durable&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Messages MUST contain a UTF-8-encoded [http://tools.ietf.org/html/rfc7159 JSON] payload, and&lt;br /&gt;
their &amp;lt;code&amp;gt;Content-Type&amp;lt;/code&amp;gt; MUST be &amp;lt;code&amp;gt;application/json&amp;lt;/code&amp;gt;.&lt;br /&gt;
Messages SHOULD NOT be larger than 8&amp;amp;nbsp;kB; deviations may be&lt;br /&gt;
feasible for low-traffic exchanges. Messages MUST NOT contain&lt;br /&gt;
secret or sensitive information; all exchanges and messages&lt;br /&gt;
SHALL be considered public.&lt;br /&gt;
&lt;br /&gt;
A message SHOULD carry a &#039;&#039;routing key&#039;&#039;, in which fields have a&lt;br /&gt;
fixed index from the left. Additionally, a message MAY be&lt;br /&gt;
&#039;&#039;cced&#039;&#039; to multiple routing keys, using the RabbitMQ&lt;br /&gt;
[https://www.rabbitmq.com/sender-selected.html &#039;&#039;Sender-selected Distribution&#039;&#039;] extension.&lt;br /&gt;
&lt;br /&gt;
Messages SHOULD be &#039;&#039;durable&#039;&#039; and SHOULD be published over&lt;br /&gt;
RabbitMQ [https://www.rabbitmq.com/confirms.html &#039;&#039;confirm-publish&#039;&#039; channels]. Otherwise, the&lt;br /&gt;
documentation MUST clearly reflect that messages from the&lt;br /&gt;
given exchange do not exhibit deliver &#039;&#039;at-least-once&#039;&#039; semantics.&lt;br /&gt;
&lt;br /&gt;
== Subscribers ==&lt;br /&gt;
&lt;br /&gt;
Subscribers MUST name &#039;&#039;queues&#039;&#039; in the form&lt;br /&gt;
&amp;lt;code&amp;gt;queue/&amp;lt;clientId&amp;gt;/&amp;lt;name&amp;gt;&amp;lt;/code&amp;gt;; attempts to name a queue otherwise&lt;br /&gt;
SHALL result in an authorization error. Queues MAY &#039;&#039;consume&#039;&#039;&lt;br /&gt;
from any exchange prefixed &amp;lt;code&amp;gt;exchange/&amp;lt;/code&amp;gt;; attempts to consume&lt;br /&gt;
from any other exchange SHALL result in an authentication error.&lt;br /&gt;
&lt;br /&gt;
Subscribers MAY limit the size of their queues using the RabbitMQ&lt;br /&gt;
[https://www.rabbitmq.com/maxlength.html &#039;&#039;Queue Length Limit&#039;&#039;] extension. Subscribers MUST NOT let&lt;br /&gt;
their queues grow unbounded; if left unattended, &#039;&#039;Pulse&#039;&#039;&lt;br /&gt;
SHALL notify the owner by email. Additionally, &#039;&#039;Pulse&#039;&#039; MAY delete&lt;br /&gt;
a queue which exceeds defined limits. Subscribers SHOULD specify a&lt;br /&gt;
prefetch limit using the RabbitMQ [https://www.rabbitmq.com/consumer-prefetch.html &#039;&#039;Consumer Prefetch&#039;&#039; limit] extension.&lt;br /&gt;
&lt;br /&gt;
Subscribers SHOULD use either &#039;&#039;durable&#039;&#039; queues or&lt;br /&gt;
&#039;&#039;auto-delete&#039;&#039; queues. Implementors are recommended to aim&lt;br /&gt;
for deliver-&#039;&#039;at-least-once&#039;&#039; semantics.&lt;br /&gt;
&lt;br /&gt;
== Appendix A: Everything in Bullet Points ==&lt;br /&gt;
&lt;br /&gt;
This is a summary of the above.&lt;br /&gt;
&lt;br /&gt;
Pulse:&lt;br /&gt;
* MUST offer registration at &amp;lt;code&amp;gt;pulse.mozilla.org&amp;lt;/code&amp;gt;&lt;br /&gt;
* MUST support [https://www.rabbitmq.com/resources/specs/amqp0-9-1.pdf AMQP 0-9-1] and these RabbitMQ extensions:&lt;br /&gt;
** [https://www.rabbitmq.com/confirms.html Confirms]&lt;br /&gt;
** [https://www.rabbitmq.com/consumer-prefetch.html Consumer Prefetch]&lt;br /&gt;
** [https://www.rabbitmq.com/maxlength.html Queue Length Limit]&lt;br /&gt;
** [https://www.rabbitmq.com/sender-selected.html Sender-selected Distribution]&lt;br /&gt;
* SHOULD exhibit deliver-&#039;&#039;at-least-once&#039;&#039; semantics&lt;br /&gt;
* MAY delete queues that grows beyond &#039;&#039;Pulse&#039;&#039; defined limits&lt;br /&gt;
* SHALL notify owner by email when a queue grows close to &#039;&#039;Pulse&#039;&#039;-defined limits.&lt;br /&gt;
&lt;br /&gt;
Publishers:&lt;br /&gt;
* SHOULD use [https://www.rabbitmq.com/confirms.html confirm-publish channels]&lt;br /&gt;
&lt;br /&gt;
Exchanges:&lt;br /&gt;
* MUST be named &amp;lt;code&amp;gt;exchange/&amp;lt;clientId&amp;gt;/&amp;lt;name&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
* MUST be topic exchanges&lt;br /&gt;
* MUST be durable&lt;br /&gt;
&lt;br /&gt;
Messages:&lt;br /&gt;
* MUST be UTF-8-encoded [http://tools.ietf.org/html/rfc7159 JSON]&lt;br /&gt;
* MUST carry &amp;lt;code&amp;gt;application/json&amp;lt;/code&amp;gt; as &amp;lt;code&amp;gt;Content-Type&amp;lt;/code&amp;gt;&lt;br /&gt;
* SHOULD be durable&lt;br /&gt;
* SHOULD be less than 8 KiB (for good performance)&lt;br /&gt;
* MAY be CC&#039;ed to [https://www.rabbitmq.com/sender-selected.html multiple routing keys]&lt;br /&gt;
* MUST NOT contain private or sensitive information&lt;br /&gt;
* SHOULD have a routing key where fields have a fixed index from the left&lt;br /&gt;
&lt;br /&gt;
Subscribers:&lt;br /&gt;
* SHOULD specify a [https://www.rabbitmq.com/consumer-prefetch.html &#039;&#039;consumer prefetch&#039;&#039; limit]&lt;br /&gt;
&lt;br /&gt;
Queues:&lt;br /&gt;
* MUST be named &amp;lt;code&amp;gt;queue/&amp;lt;clientId&amp;gt;/&amp;lt;name&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
* MAY have a [https://www.rabbitmq.com/maxlength.html limited length]&lt;br /&gt;
* MUST not grow unbounded&lt;br /&gt;
&lt;br /&gt;
= Let&#039;s Use It =&lt;br /&gt;
&lt;br /&gt;
There are currently two Pulse clients available. Please note that you can also connect to Pulse in other languages, provided you have an AMQP 0.9.1 library that will let you interact with AMQP exchanges. See https://github.com/rabbitmq/rabbitmq-tutorials#languages for example.&lt;br /&gt;
&lt;br /&gt;
== Python Pulse client library ==&lt;br /&gt;
&lt;br /&gt;
The [https://github.com/mozilla-services/mozillapulse mozillapulse] Python package provides classes for existing publishers, consumers, and messages so you can quickly build Pulse applications.  See the [https://github.com/mozilla-services/mozillapulse/blob/master/README.md README] to get started (although note that the test publisher is currently offline; see {{bug|1218976}}.  You can use another consumer, e.g. BuildConsumer, to verify your setup.).&lt;br /&gt;
&lt;br /&gt;
This library is somewhat inflexible, however, and should be rewritten. One idea is to turn TaskCluster&#039;s Python client into a standalone package.&lt;br /&gt;
&lt;br /&gt;
== Go (golang) Pulse client library ==&lt;br /&gt;
&lt;br /&gt;
This can be found here:&lt;br /&gt;
* http://taskcluster.github.io/pulse-go/&lt;br /&gt;
&lt;br /&gt;
Extensions for TaskCluster exchanges here (see section &amp;quot;AMQP APIs&amp;quot;):&lt;br /&gt;
* http://taskcluster.github.io/taskcluster-client-go/&lt;br /&gt;
&lt;br /&gt;
= Contributing =&lt;br /&gt;
&lt;br /&gt;
To set up a local system for development, see the [https://github.com/mozilla-services/mozillapulse/blob/master/HACKING.md HACKING.md] file included in the mozillapulse source.&lt;br /&gt;
&lt;br /&gt;
The main Pulse library (mozillapulse) and publisher shims (pulseshims) are written in Python, although there is also a Go library as mentioned in the section above.  We also want to provide a canonical JavaScript library at some point.  To hack on the main Pulse library, you should be comfortable in Python, and it&#039;s helpful to understand the basics of AMQP.  Knowledge of kombu is also useful.&lt;br /&gt;
&lt;br /&gt;
To hack on PulseGuardian, you should know some Python and JavaScript.  Experience with Flask, SQLAlchemy, and RabbitMQ are useful, but you can probably learn what you need as you fix bugs.&lt;br /&gt;
&lt;br /&gt;
Feel free to stop by #pulse or #ateam with questions!&lt;br /&gt;
&lt;br /&gt;
Here is the list of open, unassigned, mentored Pulse and PulseGuardian bugs to get you started.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;bugzilla&amp;gt;&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;quicksearch&amp;quot;: &amp;quot;status:new&amp;quot;,&lt;br /&gt;
        &amp;quot;product&amp;quot;: &amp;quot;Webtools&amp;quot;,&lt;br /&gt;
        &amp;quot;component&amp;quot;: &amp;quot;Pulse&amp;quot;,&lt;br /&gt;
        &amp;quot;f1&amp;quot;: &amp;quot;bug_mentor&amp;quot;,&lt;br /&gt;
        &amp;quot;o1&amp;quot;: &amp;quot;isnotempty&amp;quot;,&lt;br /&gt;
        &amp;quot;include_fields&amp;quot;: &amp;quot;id,summary,priority,status&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/bugzilla&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Once you have your feet wet and are ready to take on a more involved project, here is a list of all current Pulse bugs:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;bugzilla&amp;gt;&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;quicksearch&amp;quot;: &amp;quot;status:new,assigned,reopened,unconfirmed&amp;quot;,&lt;br /&gt;
        &amp;quot;product&amp;quot;: &amp;quot;Webtools&amp;quot;,&lt;br /&gt;
        &amp;quot;component&amp;quot;: &amp;quot;Pulse&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/bugzilla&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For mentored bugs, we use the User Story to provide a link back to this page, as well as any extra information for contributors, such as required knowledge or tools.  The basic text for mentored bugs should be &amp;quot;This is a mentored Pulse bug.  For general information on Pulse, see https://wiki.mozilla.org/Auto-tools/Projects/Pulse, which includes a section on Contributing.&amp;quot;  An example of extra text is &amp;quot;This bug also requires you to have a working mail server.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
= Road Map =&lt;br /&gt;
&lt;br /&gt;
See the [https://bugzilla.mozilla.org/buglist.cgi?resolution=---&amp;amp;query_format=advanced&amp;amp;component=Pulse&amp;amp;product=Webtools prioritized bug list] for all open issues and feature requests.&lt;br /&gt;
&lt;br /&gt;
= Security Model =&lt;br /&gt;
&lt;br /&gt;
This is summarized in the formal Pulse specification above.  What follows is the rationale and some technical implementation notes.&lt;br /&gt;
&lt;br /&gt;
In order to have a reliable, well behaved system, the following assertions will need to be true.&lt;br /&gt;
&lt;br /&gt;
* All users, publishers and consumers alike, must have their own accounts (no guest/public users).&lt;br /&gt;
* Only publishers should be able to declare exchanges.&lt;br /&gt;
* Only the publisher user account associated with a particular vhost should be allowed to publish messages to exchanges in the vhost.  In other words, exactly one user account should be allowed to publish messages within a given vhost.&lt;br /&gt;
* Only the user that created a particular queue should be allowed to consume from it.&lt;br /&gt;
&lt;br /&gt;
Since exchange and queue permissions go together, we&#039;ll need exchange and queue naming conventions mixed with restrictive permissions.  Each user will be restricted to a particular exchange and queue naming prefix.  Many users will be either consumers or publishers, but for simplicity, each user can do both.  Users will have full permissions on &amp;lt;code&amp;gt;&amp;quot;^exchange/&amp;lt;username&amp;gt;/.*$&amp;quot;&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;&amp;quot;^queue/&amp;lt;username&amp;gt;/.*$&amp;quot;&amp;lt;/code&amp;gt;.  They will also have read permissions to exchange/*.  This will both prevent users from writing to other users&#039; exchanges as well as prevent them from consuming from other users&#039; queues.  For convenience, if a consumer creates a nondurable queue, mozillapulse can assign a random suffix to the user&#039;s standard queue name prefix, i.e. &amp;lt;code&amp;gt;queue/&amp;lt;username&amp;gt;/&amp;lt;random string&amp;gt;&amp;lt;/code&amp;gt;, since the user wouldn&#039;t be able to create nor access a completely random server-assigned name.&lt;br /&gt;
&lt;br /&gt;
Note that this doesn&#039;t prevent a consumer from creating an exchange named as a queue, since the permission model doesn&#039;t distinguish between queues and exchanges, and consumers need the ability to create queues.  This is not particularly problematic, since no one would have permission to use that exchange.&lt;br /&gt;
&lt;br /&gt;
With this security model, we technically don&#039;t really need vhosts, since the names of the queues and exchanges the users can use are so specific.  There may still be a benefit in allowing apps to use the same queue name for different exchanges, though, which would be possible if each exchange had its own vhost.  The downside is that you cannot specify &amp;quot;all vhosts&amp;quot; when setting a user&#039;s permissions, so they would either have to list all vhosts they want to use when creating the user in PulseGuardian, and be able to update that list later, or PulseGuardian or some other app would have to automatically add new permissions to all users when a vhost is created.&lt;br /&gt;
&lt;br /&gt;
= Admin Procedures =&lt;br /&gt;
&lt;br /&gt;
dustin and the taskcluster team have access to the Pulse cluster on CloudAMQP and the following related services:&lt;br /&gt;
&lt;br /&gt;
* PulseGuardian should be deleting queues that are too long. If you need to manually delete a queue, use the Management UI. Try to ping the queue owner first before killing if possible.&lt;br /&gt;
&lt;br /&gt;
== To upgrade a ssl certificate on pulse.mozilla.org ==&lt;br /&gt;
&lt;br /&gt;
Open a bug with IT to generate a new certificate &lt;br /&gt;
{{bug|1532325}}&lt;br /&gt;
&lt;br /&gt;
IT needs to email support@cloudamqp.com with the new cert.  The cloudampq support team will install it on all our of cloudampq nodes.  After it has been installed, you can login to the administrative start the nodes one by one which will not result any downtime.  (Ensure you wait for the node to restart before restarting another one.)  Verify that the certs are installed on the nodes&lt;br /&gt;
&lt;br /&gt;
* https://sslanalyzer.comodoca.com/?url=pulse.mozilla.org&lt;br /&gt;
* https://sslanalyzer.comodoca.com/?url=orange-antelope-01.rmq.cloudamqp.com&lt;br /&gt;
* https://sslanalyzer.comodoca.com/?url=orange-antelope-02.rmq.cloudamqp.com&lt;br /&gt;
* https://sslanalyzer.comodoca.com/?url=orange-antelope-01.rmq.cloudamqp.com&lt;br /&gt;
&lt;br /&gt;
This should show the dates for the new certificate and that the cert is trusted by Mozilla and Microsoft.&lt;br /&gt;
&lt;br /&gt;
= More reading =&lt;br /&gt;
&lt;br /&gt;
* [http://slides.com/mcote/pulse Slides] from a presentation on Pulse.&lt;br /&gt;
* [https://mrcote.info/blog/2015/02/16/pulse-update/ Update] on Pulse from 2015/02/16.&lt;br /&gt;
&lt;br /&gt;
LegNeato also wrote several blog posts on Pulse as he was building it.  They contain some more background if you&#039;re really interested.  They are linked below, in chronological order.&lt;br /&gt;
&lt;br /&gt;
* [http://christian.legnitto.com/blog/2010/07/17/mozilla-pulse-and-rabbitmq/ Mozilla Pulse and RabbitMQ]&lt;br /&gt;
* [http://christian.legnitto.com/blog/2010/08/20/push-notifications-for-bugzilla/ Push notifications for Bugzilla]&lt;br /&gt;
** This idea has been shelved for the time being, both due to security issues and performance.  See [[BMO/ChangeNotificationSystem]] for an alternative.&lt;br /&gt;
* [http://christian.legnitto.com/blog/2010/09/10/bugzilla-amqp-is-now-buzgilla-push-supports-the-stomp-protocol/ bugzilla-amqp is now buzgilla-push, supports the STOMP protocol]&lt;br /&gt;
** See above note.  Just keeping these links for interest&#039;s sake.&lt;br /&gt;
* [http://christian.legnitto.com/blog/2010/10/15/whats-up-with-pulse/ What’s up with Pulse?]&lt;br /&gt;
* [http://christian.legnitto.com/blog/2010/11/23/github-amqp-integration-service-hook-live/ GitHub AMQP integration service hook live!]&lt;br /&gt;
** Tangentially related to Pulse.&lt;br /&gt;
* [http://christian.legnitto.com/blog/2010/12/06/lots-of-pulse-changes-out-of-prototype-mode-this-week/ Lots of Pulse changes, out of prototype mode this week!]&lt;br /&gt;
* [http://christian.legnitto.com/blog/2010/12/22/another-update-on-pulse/ Another update on Pulse]&lt;/div&gt;</summary>
		<author><name>Kmoir</name></author>
	</entry>
	<entry>
		<id>https://wiki.mozilla.org/index.php?title=WeeklyUpdates/2019-11-25&amp;diff=1220771</id>
		<title>WeeklyUpdates/2019-11-25</title>
		<link rel="alternate" type="text/html" href="https://wiki.mozilla.org/index.php?title=WeeklyUpdates/2019-11-25&amp;diff=1220771"/>
		<updated>2019-11-29T15:02:46Z</updated>

		<summary type="html">&lt;p&gt;Kmoir: /* Welcome! */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
{{WeeklyUpdateNav}}&lt;br /&gt;
* Every Monday @ 11:00am Pacific Time (19:00 UTC) &lt;br /&gt;
* Watch at https://mzl.la/project-meeting-2019-11-25 or anonymously at https://air.mozilla.org. You can also watch on the Mozilla YouTube channel at https://www.youtube.com/watch?v=HEfZ1s0z2Sw.&lt;br /&gt;
* join #weekly-project-call on irc.mozilla.org or Slack for backchannel discussion&lt;br /&gt;
* If you plan on presenting, please join the Zoom video chat 20 minutes prior to the start of the meeting and announce to the A/V Technicians that you will be speaking so that they can confirm your Audio and Video.&lt;br /&gt;
* &#039;&#039;&#039;Presenters only:&#039;&#039;&#039; Zoom Meeting ID: 828 817 988  [https://mozilla.zoom.us/j/828817988 https://mozilla.zoom.us/j/828817988.] Do &#039;&#039;&#039;not&#039;&#039;&#039; use this room if you&#039;re not planning to speak. &lt;br /&gt;
* One-tap mobile&lt;br /&gt;
** +16465588656,,828817988# US (New York)&lt;br /&gt;
** +17207072699,,828817988# US&lt;br /&gt;
* Dial-in by your location&lt;br /&gt;
** +1 646 558 8656 US (New York)&lt;br /&gt;
** +1 720 707 2699 US&lt;br /&gt;
** 877 853 5257 US Toll-free&lt;br /&gt;
** +61 2 8015 2088 Australia&lt;br /&gt;
** +61 8 7150 1149 Australia&lt;br /&gt;
** 1800 893 423 Australia Toll-free&lt;br /&gt;
** +1 647 558 0588 Canada&lt;br /&gt;
** +33 1 8288 0188 France&lt;br /&gt;
** +33 7 5678 4048 France&lt;br /&gt;
** 0 805 082 588 France Toll-free&lt;br /&gt;
** +49 30 5679 5800 Germany&lt;br /&gt;
** +49 69 8088 3899 Germany&lt;br /&gt;
** +49 30 3080 6188 Germany&lt;br /&gt;
** 800 724 3138 Germany Toll-free&lt;br /&gt;
** +852 5808 6088 Hong Kong, China&lt;br /&gt;
** +44 203 695 0088 United Kingdom&lt;br /&gt;
** +44 203 966 3809 United Kingdom&lt;br /&gt;
** +44 203 051 2874 United Kingdom&lt;br /&gt;
** 0 800 031 5717 United Kingdom Toll-free&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
= Weekly Project Status Meeting Agenda =&lt;br /&gt;
&lt;br /&gt;
Items in this section will be shared during the live status meeting.&lt;br /&gt;
&lt;br /&gt;
== Friends of Mozilla [[Image:Tree.gif|Friends of Mozilla]] ==&lt;br /&gt;
&lt;br /&gt;
== Upcoming Events ==&lt;br /&gt;
&lt;br /&gt;
=== This Week ===&lt;br /&gt;
&lt;br /&gt;
=== Monday, {{#time:d F|{{SUBPAGENAME}}}} ===&lt;br /&gt;
&lt;br /&gt;
=== Tuesday, {{#time:d F|{{SUBPAGENAME}} +1 day}} ===&lt;br /&gt;
&lt;br /&gt;
=== Wednesday, {{#time:d F|{{SUBPAGENAME}} +2 days}} ===&lt;br /&gt;
==== Homebrew Website Club ====&lt;br /&gt;
The &#039;&#039;&#039;Homebrew Website Club&#039;&#039;&#039; is a growing world-wide network of meetups for everyone who wants to take back their web experience from social media silos, and own their online identities, content, and interactions.&lt;br /&gt;
&lt;br /&gt;
* 17:30-19:30 GMT at&lt;br /&gt;
** &#039;&#039;&#039;Nottingham (UK)&#039;&#039;&#039;&lt;br /&gt;
* Details and &#039;&#039;&#039;RSVP: https://indieweb.org/events/2019-11-27-homebrew-website-club&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Thursday, {{#time:d F|{{SUBPAGENAME}} +3 days}} ===&lt;br /&gt;
&lt;br /&gt;
=== Friday, {{#time:d F|{{SUBPAGENAME}} +4 days}} ===&lt;br /&gt;
&lt;br /&gt;
=== Saturday, {{#time:d F|{{SUBPAGENAME}} +5 days}} ===&lt;br /&gt;
&lt;br /&gt;
=== Sunday, {{#time:d F|{{SUBPAGENAME}} +6 days}} ===&lt;br /&gt;
&lt;br /&gt;
=== Next Week ===&lt;br /&gt;
=== Saturday Sunday 7-8 December ===&lt;br /&gt;
==== 🌁 IndieWebCamp San Francisco ====&lt;br /&gt;
&#039;&#039;&#039;IndieWebCamp San Francisco&#039;&#039;&#039; is an all-levels BarCamp-like collaboration hosted at Mozilla [[SF]] for two days (&#039;&#039;&#039;Saturday &amp;amp; Sunday&#039;&#039;&#039;) of roundtable sessions, brainstorming, creating, teaching, and a hackathon to help us all take back our data and lives on the web!&lt;br /&gt;
&lt;br /&gt;
Details and tickets: https://2019.indieweb.org/sf&lt;br /&gt;
&lt;br /&gt;
Any questions? Ask organizer [[Tantek]] on Slack.&lt;br /&gt;
&lt;br /&gt;
=== Later Events and Available Tickets ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Mozilla DevRel Complimentary Tickets&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Our DevRel Sponsorship team sometimes receives complimentary tickets to share with Mozillians interested in attending the following events. Please fill out this form [https://airtable.com/shrRFuIEm7j2a0Gtu Ticket RequestForm ]. &lt;br /&gt;
If you have questions, reach out to the DevSponsorship Team at devsponsorship@mozilla.com for more details. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;[https://www.openup.global/?lang=en/ OPenUP Summit]&#039;&#039;&#039; Taipei | 2019-11-30 to 12-01&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;[https://ntnu.edu/wac2019 Web Audio Conference 2019]&#039;&#039;&#039; Trondheim, Norway | 2019-12-04 to 2019-12-06&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;[https://halfstackconf.com/ Halfstack]&#039;&#039;&#039; Phoenix, AZ | 2020-01-17 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Mozilla Sponsored Developer Events&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Current list of Mozilla sponsored developer events (with their start dates) around the globe (DevRel Events team will update):&lt;br /&gt;
&lt;br /&gt;
Open UP Summit | 11/30-12/1 2019 | Taipei&lt;br /&gt;
&lt;br /&gt;
Web Audio Conference 2019 | 12/4/19 | Trondheim, Norway&lt;br /&gt;
&lt;br /&gt;
[https://2019.indieweb.org/sf 🌁 IndieWebCamp San Francisco] | 12/7/19 - 12/8/19 | [[MozSF]], San Francisco&lt;br /&gt;
&lt;br /&gt;
Halfstack | 01/17/20 | Phoenix&lt;br /&gt;
&lt;br /&gt;
PyCascades 2020 | 89/2/20 | Portland&lt;br /&gt;
&lt;br /&gt;
You Got This 2020 | 01/18/20 | Birmingham, UK&lt;br /&gt;
&lt;br /&gt;
[https://2020.indieweb.org/austin 🌮 IndieWebCamp Austin 2020] | 02/22/20 - 02/23/20 | Austin, Texas, USA&lt;br /&gt;
&lt;br /&gt;
PerfMatters Conference 2020 | 03/31/20 - 04/02/20 | Redwood City, CA USA&lt;br /&gt;
&lt;br /&gt;
JS Kongress Munich | 04/15-16/20 | Munich, Germany&lt;br /&gt;
&lt;br /&gt;
[https://2020.indieweb.org/summit ⛰ IndieWeb Summit 2020] | 06/27/20 - 06/28/20 | Portland, Oregon, USA&lt;br /&gt;
&lt;br /&gt;
== Speakers ==&lt;br /&gt;
&lt;br /&gt;
The limit is &#039;&#039;&#039;3 minutes per topic&#039;&#039;&#039;.  It&#039;s like a lightning talk, but don&#039;t feel that you have to have slides in order to make a presentation.  If you plan on showing a video, you need to contact the Air Mozilla team before the day of the meeting or you will be deferred to the next week. The meeting is streamed in a 4:3 format in order to allow for split screen. If your slides are 16:9 &amp;quot;widescreen&amp;quot; format, please indicate in the &amp;quot;Sharing&amp;quot; column below.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;fullwidth-table wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  [https://mozillians.org/u/USERNAME Presenter]&lt;br /&gt;
!  Title&lt;br /&gt;
!  Topic&lt;br /&gt;
!  Location&lt;br /&gt;
!  Sharing&lt;br /&gt;
!  Media&lt;br /&gt;
!  More Details&lt;br /&gt;
|-&lt;br /&gt;
| Who Are You?&lt;br /&gt;
| What Do You Do?&lt;br /&gt;
| What are you going to talk about?&lt;br /&gt;
| Where are you presenting from? (Moz Space, your house, space)&lt;br /&gt;
| Will you be sharing your screen? (yes/no, 4:3 or 16:9)&lt;br /&gt;
| Links to slides or images you want displayed on screen&lt;br /&gt;
| Link to where audience can find out more information&lt;br /&gt;
|-&lt;br /&gt;
| Andrew Krug&lt;br /&gt;
| Staff Security Engineer, Enterprise Information Security&lt;br /&gt;
| IT MinIT&lt;br /&gt;
| Remote, Via PreRecorded Video &lt;br /&gt;
| Please play [https://drive.google.com/open?id=1W4b875PcToUg4kghNxMvgTH8ED77NOt7 video]&lt;br /&gt;
| n/a&lt;br /&gt;
| &lt;br /&gt;
* [https://drive.google.com/open?id=1W4b875PcToUg4kghNxMvgTH8ED77NOt7 Video]&lt;br /&gt;
* [https://wiki.mozilla.org/IT/WeeklyMinIT#2019-11-25 MinIT Wiki Shownotes]&lt;br /&gt;
|-&lt;br /&gt;
| Asa Dotzler&lt;br /&gt;
| Team Firefox&lt;br /&gt;
| Weekly Firefox Update&lt;br /&gt;
| MTV&lt;br /&gt;
| no&lt;br /&gt;
| n/a&lt;br /&gt;
| [https://wiki.mozilla.org/Firefox/Roadmap/Updates#2019-11-25 2019-11-25]&lt;br /&gt;
|-&lt;br /&gt;
| Till Schneidereit&lt;br /&gt;
| Senior Manager, Research Engineering&lt;br /&gt;
| Emerging Technologies Weekly Update&lt;br /&gt;
| Berlin&lt;br /&gt;
| no&lt;br /&gt;
| n/a&lt;br /&gt;
| [https://wiki.mozilla.org/WeeklyUpdates/EmergingTechnology#November_25th.2C_2019 ET update]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Welcome! =&lt;br /&gt;
&lt;br /&gt;
Let&#039;s say hello to some new Mozillians! If you are not able to join the meeting live, you can add a link to a short video introducing yourself.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;fullwidth-table wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! &#039;&#039;Who is being introduced?&#039;&#039;&lt;br /&gt;
! &#039;&#039;Who are you? (the introducer)&#039;&#039;&lt;br /&gt;
! &#039;&#039;Where are you doing the introduction?&#039;&#039;&lt;br /&gt;
! &#039;&#039;Where are they from?&#039;&#039;&lt;br /&gt;
! &#039;&#039;How will they be part of Mozilla?&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Nishant Bhasin&lt;br /&gt;
| Garvan Keeley&lt;br /&gt;
| Toronto&lt;br /&gt;
| Toronto&lt;br /&gt;
| Senior Software Engineer, Firefox for iOS&lt;br /&gt;
|-&lt;br /&gt;
| Zeid Zabaneh&lt;br /&gt;
| Kim Moir&lt;br /&gt;
| Toronto&lt;br /&gt;
| Toronto&lt;br /&gt;
| Senior Software Engineer, Developer productivity&lt;br /&gt;
|-&lt;br /&gt;
| Marc Leclair&lt;br /&gt;
| Vicky Chin&lt;br /&gt;
| Toronto&lt;br /&gt;
| Toronto&lt;br /&gt;
| Software Engineer, Android Performance&lt;br /&gt;
|-&lt;br /&gt;
| Erik Nordin&lt;br /&gt;
| Sean Voisen&lt;br /&gt;
| Home (SF Bay Area)&lt;br /&gt;
| PDX&lt;br /&gt;
| Software Engineer, Platform Layout&lt;br /&gt;
&amp;lt;!-- Insert new rows here --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Their Name&lt;br /&gt;
| Your Name&lt;br /&gt;
| Intro location&lt;br /&gt;
| Their Location&lt;br /&gt;
| Their Role&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Weekly Updates]]&lt;br /&gt;
[[Category:Meeting Notes]]&lt;/div&gt;</summary>
		<author><name>Kmoir</name></author>
	</entry>
	<entry>
		<id>https://wiki.mozilla.org/index.php?title=WeeklyUpdates/2019-11-25&amp;diff=1220572</id>
		<title>WeeklyUpdates/2019-11-25</title>
		<link rel="alternate" type="text/html" href="https://wiki.mozilla.org/index.php?title=WeeklyUpdates/2019-11-25&amp;diff=1220572"/>
		<updated>2019-11-22T22:19:58Z</updated>

		<summary type="html">&lt;p&gt;Kmoir: /* Welcome! */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
{{WeeklyUpdateNav}}&lt;br /&gt;
* Every Monday @ 11:00am Pacific Time (19:00 UTC) &lt;br /&gt;
* Watch anonymously at https://air.mozilla.org.&lt;br /&gt;
* join #weekly-project-call on irc.mozilla.org or Slack for backchannel discussion&lt;br /&gt;
* If you plan on presenting, please join the Zoom video chat 20 minutes prior to the start of the meeting and announce to the A/V Technicians that you will be speaking so that they can confirm your Audio and Video.&lt;br /&gt;
* &#039;&#039;&#039;Presenters only:&#039;&#039;&#039; Zoom Meeting ID: 828 817 988  [https://mozilla.zoom.us/j/828817988 https://mozilla.zoom.us/j/828817988.] Do &#039;&#039;&#039;not&#039;&#039;&#039; use this room if you&#039;re not planning to speak. &lt;br /&gt;
* One-tap mobile&lt;br /&gt;
** +16465588656,,828817988# US (New York)&lt;br /&gt;
** +17207072699,,828817988# US&lt;br /&gt;
* Dial-in by your location&lt;br /&gt;
** +1 646 558 8656 US (New York)&lt;br /&gt;
** +1 720 707 2699 US&lt;br /&gt;
** 877 853 5257 US Toll-free&lt;br /&gt;
** +61 2 8015 2088 Australia&lt;br /&gt;
** +61 8 7150 1149 Australia&lt;br /&gt;
** 1800 893 423 Australia Toll-free&lt;br /&gt;
** +1 647 558 0588 Canada&lt;br /&gt;
** +33 1 8288 0188 France&lt;br /&gt;
** +33 7 5678 4048 France&lt;br /&gt;
** 0 805 082 588 France Toll-free&lt;br /&gt;
** +49 30 5679 5800 Germany&lt;br /&gt;
** +49 69 8088 3899 Germany&lt;br /&gt;
** +49 30 3080 6188 Germany&lt;br /&gt;
** 800 724 3138 Germany Toll-free&lt;br /&gt;
** +852 5808 6088 Hong Kong, China&lt;br /&gt;
** +44 203 695 0088 United Kingdom&lt;br /&gt;
** +44 203 966 3809 United Kingdom&lt;br /&gt;
** +44 203 051 2874 United Kingdom&lt;br /&gt;
** 0 800 031 5717 United Kingdom Toll-free&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
= Weekly Project Status Meeting Agenda =&lt;br /&gt;
&lt;br /&gt;
Items in this section will be shared during the live status meeting.&lt;br /&gt;
&lt;br /&gt;
== Friends of Mozilla [[Image:Tree.gif|Friends of Mozilla]] ==&lt;br /&gt;
&lt;br /&gt;
== Upcoming Events ==&lt;br /&gt;
&lt;br /&gt;
=== This Week ===&lt;br /&gt;
&lt;br /&gt;
=== Monday, {{#time:d F|{{SUBPAGENAME}}}} ===&lt;br /&gt;
&lt;br /&gt;
=== Tuesday, {{#time:d F|{{SUBPAGENAME}} +1 day}} ===&lt;br /&gt;
&lt;br /&gt;
=== Wednesday, {{#time:d F|{{SUBPAGENAME}} +2 days}} ===&lt;br /&gt;
&lt;br /&gt;
=== Thursday, {{#time:d F|{{SUBPAGENAME}} +3 days}} ===&lt;br /&gt;
&lt;br /&gt;
=== Friday, {{#time:d F|{{SUBPAGENAME}} +4 days}} ===&lt;br /&gt;
&lt;br /&gt;
=== Saturday, {{#time:d F|{{SUBPAGENAME}} +5 days}} ===&lt;br /&gt;
&lt;br /&gt;
=== Sunday, {{#time:d F|{{SUBPAGENAME}} +6 days}} ===&lt;br /&gt;
&lt;br /&gt;
=== Next Week ===&lt;br /&gt;
&lt;br /&gt;
=== Later Events and Available Tickets ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Mozilla DevRel Complimentary Tickets&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Our DevRel Sponsorship team sometimes receives complimentary tickets to share with Mozillians interested in attending the following events. Please fill out this form [https://airtable.com/shrRFuIEm7j2a0Gtu Ticket RequestForm ]. &lt;br /&gt;
If you have questions, reach out to the DevSponsorship Team at devsponsorship@mozilla.com for more details. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Mozilla Sponsored Developer Events&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Current list of Mozilla sponsored developer events (with their start dates) around the globe (DevRel Events team will update):&lt;br /&gt;
&lt;br /&gt;
== Speakers ==&lt;br /&gt;
&lt;br /&gt;
The limit is &#039;&#039;&#039;3 minutes per topic&#039;&#039;&#039;.  It&#039;s like a lightning talk, but don&#039;t feel that you have to have slides in order to make a presentation.  If you plan on showing a video, you need to contact the Air Mozilla team before the day of the meeting or you will be deferred to the next week. The meeting is streamed in a 4:3 format in order to allow for split screen. If your slides are 16:9 &amp;quot;widescreen&amp;quot; format, please indicate in the &amp;quot;Sharing&amp;quot; column below.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;fullwidth-table wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  [https://mozillians.org/u/USERNAME Presenter]&lt;br /&gt;
!  Title&lt;br /&gt;
!  Topic&lt;br /&gt;
!  Location&lt;br /&gt;
!  Sharing&lt;br /&gt;
!  Media&lt;br /&gt;
!  More Details&lt;br /&gt;
|-&lt;br /&gt;
| Who Are You?&lt;br /&gt;
| What Do You Do?&lt;br /&gt;
| What are you going to talk about?&lt;br /&gt;
| Where are you presenting from? (Moz Space, your house, space)&lt;br /&gt;
| Will you be sharing your screen? (yes/no, 4:3 or 16:9)&lt;br /&gt;
| Links to slides or images you want displayed on screen&lt;br /&gt;
| Link to where audience can find out more information&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Welcome! =&lt;br /&gt;
&lt;br /&gt;
Let&#039;s say hello to some new Mozillians! If you are not able to join the meeting live, you can add a link to a short video introducing yourself.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;fullwidth-table wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! &#039;&#039;Who is being introduced?&#039;&#039;&lt;br /&gt;
! &#039;&#039;Who are you? (the introducer)&#039;&#039;&lt;br /&gt;
! &#039;&#039;Where are you doing the introduction?&#039;&#039;&lt;br /&gt;
! &#039;&#039;Where are they from?&#039;&#039;&lt;br /&gt;
! &#039;&#039;How will they be part of Mozilla?&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Zeid Zabehah&lt;br /&gt;
| Kim Moir&lt;br /&gt;
| Toronto&lt;br /&gt;
| Toronto&lt;br /&gt;
| Senior Software Engineer, Developer productivity&lt;br /&gt;
&amp;lt;!-- Insert new rows here --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Their Name&lt;br /&gt;
| Your Name&lt;br /&gt;
| Intro location&lt;br /&gt;
| Their Location&lt;br /&gt;
| Their Role&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Weekly Updates]]&lt;br /&gt;
[[Category:Meeting Notes]]&lt;/div&gt;</summary>
		<author><name>Kmoir</name></author>
	</entry>
	<entry>
		<id>https://wiki.mozilla.org/index.php?title=WeeklyUpdates/2019-09-23&amp;diff=1218150</id>
		<title>WeeklyUpdates/2019-09-23</title>
		<link rel="alternate" type="text/html" href="https://wiki.mozilla.org/index.php?title=WeeklyUpdates/2019-09-23&amp;diff=1218150"/>
		<updated>2019-09-23T17:50:01Z</updated>

		<summary type="html">&lt;p&gt;Kmoir: /* Welcome! */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
{{WeeklyUpdateNav}}&lt;br /&gt;
* Every Monday @ 11:00am Pacific Time (19:00 UTC) &lt;br /&gt;
* Watch at https://mzl.la/project-meeting-2019-09-23 or anonymously at https://air.mozilla.org. You can also watch on the Mozilla YouTube channel at https://www.youtube.com/watch?v=Rbp5LBBQLkU.&lt;br /&gt;
* join #weekly-project-call on irc.mozilla.org or Slack for backchannel discussion&lt;br /&gt;
* If you plan on presenting, please join the Zoom video chat 20 minutes prior to the start of the meeting and announce to the A/V Technicians that you will be speaking so that they can confirm your Audio and Video.&lt;br /&gt;
* &#039;&#039;&#039;Presenters only:&#039;&#039;&#039; Zoom Meeting ID: 828 817 988  [https://mozilla.zoom.us/j/828817988 https://mozilla.zoom.us/j/828817988.] Do &#039;&#039;&#039;not&#039;&#039;&#039; use this room if you&#039;re not planning to speak. &lt;br /&gt;
* One-tap mobile&lt;br /&gt;
** +16465588656,,828817988# US (New York)&lt;br /&gt;
** +17207072699,,828817988# US&lt;br /&gt;
* Dial-in by your location&lt;br /&gt;
** +1 646 558 8656 US (New York)&lt;br /&gt;
** +1 720 707 2699 US&lt;br /&gt;
** 877 853 5257 US Toll-free&lt;br /&gt;
** +61 2 8015 2088 Australia&lt;br /&gt;
** +61 8 7150 1149 Australia&lt;br /&gt;
** 1800 893 423 Australia Toll-free&lt;br /&gt;
** +1 647 558 0588 Canada&lt;br /&gt;
** +33 1 8288 0188 France&lt;br /&gt;
** +33 7 5678 4048 France&lt;br /&gt;
** 0 805 082 588 France Toll-free&lt;br /&gt;
** +49 30 5679 5800 Germany&lt;br /&gt;
** +49 69 8088 3899 Germany&lt;br /&gt;
** +49 30 3080 6188 Germany&lt;br /&gt;
** 800 724 3138 Germany Toll-free&lt;br /&gt;
** +852 5808 6088 Hong Kong, China&lt;br /&gt;
** +44 203 695 0088 United Kingdom&lt;br /&gt;
** +44 203 966 3809 United Kingdom&lt;br /&gt;
** +44 203 051 2874 United Kingdom&lt;br /&gt;
** 0 800 031 5717 United Kingdom Toll-free&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
= Weekly Project Status Meeting Agenda =&lt;br /&gt;
&lt;br /&gt;
Items in this section will be shared during the live status meeting.&lt;br /&gt;
&lt;br /&gt;
== Friends of Mozilla [[Image:Tree.gif|Friends of Mozilla]] ==&lt;br /&gt;
&lt;br /&gt;
== Upcoming Events ==&lt;br /&gt;
&lt;br /&gt;
=== This Week ===&lt;br /&gt;
&lt;br /&gt;
=== Monday, {{#time:d F|{{SUBPAGENAME}}}} ===&lt;br /&gt;
&lt;br /&gt;
=== Tuesday, {{#time:d F|{{SUBPAGENAME}} +1 day}} ===&lt;br /&gt;
&lt;br /&gt;
=== Wednesday, {{#time:d F|{{SUBPAGENAME}} +2 days}} ===&lt;br /&gt;
* Add-ons Community Meeting &lt;br /&gt;
** 15:30 UTC / 8:30am PST | See [[Add-ons/Community/Meetings|wiki]] for call-in info&lt;br /&gt;
&lt;br /&gt;
=== Thursday, {{#time:d F|{{SUBPAGENAME}} +3 days}} ===&lt;br /&gt;
&lt;br /&gt;
=== Friday, {{#time:d F|{{SUBPAGENAME}} +4 days}} ===&lt;br /&gt;
&lt;br /&gt;
=== Saturday, {{#time:d F|{{SUBPAGENAME}} +5 days}} ===&lt;br /&gt;
&lt;br /&gt;
=== Sunday, {{#time:d F|{{SUBPAGENAME}} +6 days}} ===&lt;br /&gt;
&lt;br /&gt;
=== Next Week ===&lt;br /&gt;
&lt;br /&gt;
=== Later Events and Available Tickets ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Mozilla DevRel Complimentary Tickets&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Our DevRel Sponsorship team sometimes receives complimentary tickets to share with Mozillians interested in attending the following events. Please fill out this form [https://airtable.com/shrRFuIEm7j2a0Gtu Ticket RequestForm ]. &lt;br /&gt;
If you have questions, reach out to the DevSponsorship Team at devsponsorship@mozilla.com for more details. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;[https://jsconfbp.com/ JS Conf &amp;amp; CSS Conf Budapest]&#039;&#039;&#039; Budapest, Hungary | 2019-09-25 &amp;amp; 2019-09-26-27&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;[https://ruhrjs.de/ RuhrJS 2019]&#039;&#039;&#039; Rotunde Bochum - Bochum Germany | 2019-10-05 to 2019-10-06&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;[http://connect.tech/ CONNECT.TECH]&#039;&#039;&#039; Atlanta, GA, USA | 2019-10-16 to 2019-10-18&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;[https://2018.ffconf.org/ ffconf]&#039;&#039;&#039; ffconf (formerly known as Full Frontal) Brighton, England | 2019-10-08 to 2019-10-08&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;[https://www.rust-belt-rust.com: Rust Belt Rust]&#039;&#039;&#039;| Dayton, OH, USA | 2019-10-18-19&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;[https://scriptconf.org/ Script&#039;19: Javascript for Everyone]&#039;&#039;&#039;| Linz, Austria | 2019-10-25&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;[https://perfnow.nl/ performance.now ()]&#039;&#039;&#039;| Amsterdam, The Netherlands | 2019-11-21 to 2019-11-22&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;[https://halfstackconf.com/ Halfstack]&#039;&#039;&#039; London | 2019-11-22 &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;[https://2019.webconf.asia/ Webconf Asia]&#039;&#039;&#039; Hong Kong | 2019-11-20-23 &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;[https://ntnu.edu/wac2019 Web Audio Conference 2019]&#039;&#039;&#039; Trondheim, Norway | 2019-12-04 to 2019-12-06&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;[https://halfstackconf.com/ Halfstack]&#039;&#039;&#039; Phoenix, AZ | 2020-01-17 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Mozilla Sponsored Developer Events&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Current list of Mozilla sponsored developer events (with their start dates) around the globe (DevRel Events team will update):&lt;br /&gt;
&lt;br /&gt;
Finch Front End | 9/23-25/19 | Edinburgh, UK&lt;br /&gt;
&lt;br /&gt;
CSSConf Budapest 2019 | 9/25/19 | Budapest, Hungary&lt;br /&gt;
&lt;br /&gt;
JSConf Budapest 2019 | 9/26-27/19 | Budapest, Hungary&lt;br /&gt;
&lt;br /&gt;
PromptConf | 09/28/19 | Chicago&lt;br /&gt;
&lt;br /&gt;
ARTIFACT Conference | 9/30-10/2 19 | Austin, Texas US&lt;br /&gt;
&lt;br /&gt;
[https://indieweb.org/2019/Amsterdam ❌ IndieWebCamp Amsterdam] | 9/28/19 - 9/29/19 | Amsterdam, NL | 9/28/19 - 9/29/19 | Amsterdam, NL&lt;br /&gt;
&lt;br /&gt;
View Source 2019 | 9/30/19 - 10/2/19 | Amsterdam, NL&lt;br /&gt;
&lt;br /&gt;
Fronteers | 10/3/19 | Amsterdam, NL&lt;br /&gt;
&lt;br /&gt;
RuhrJS 2019 | 10/5/19 | Bochum, Germany&lt;br /&gt;
&lt;br /&gt;
[https://indieweb.org/2019/NYC 🗽 IndieWebCamp New York City 2019] | 10/5/19 - 10/6/19 | New York City, NY, USA&lt;br /&gt;
&lt;br /&gt;
Paris Web 2019 | 10/10-12/19 | Bois-Colombes and Paris, France&lt;br /&gt;
&lt;br /&gt;
Web Engines Hackfest 2019 | 10/14/19 | Galicia, Spain&lt;br /&gt;
&lt;br /&gt;
CONNECT.TECH | 10/16/19 | Atlanta, GA, USA&lt;br /&gt;
&lt;br /&gt;
Rust Belt Rust | 10/18-19/19 | Dayton, OH, USA&lt;br /&gt;
&lt;br /&gt;
[https://indieweb.org/2019/Brighton 🎪 IndieWebCamp Brighton 2019] | 10/19/19 - 10/20/19 | Brighton, England&lt;br /&gt;
&lt;br /&gt;
2019 LLVM Developers&#039; Meeting | 10/22/19 | San Jose&lt;br /&gt;
&lt;br /&gt;
Rust.Tokyo | 10/26/19 | Tokyo&lt;br /&gt;
&lt;br /&gt;
a11yTO Conf | 10/24/19 | Toronto&lt;br /&gt;
&lt;br /&gt;
Script&#039;19: Javascript for Everyone 10/25/19 | Linz, Austria&lt;br /&gt;
&lt;br /&gt;
Security BSides Portland | 10/25-26/19 | Portland, USA&lt;br /&gt;
&lt;br /&gt;
beyond tellerrand // | BERLIN 2019 | 11/4/19 | Berlin, Germany&lt;br /&gt;
&lt;br /&gt;
CascadiaJS | 11/07/19 | Seattle&lt;br /&gt;
&lt;br /&gt;
ffconf | 11/8/19 | Brighton, UK&lt;br /&gt;
&lt;br /&gt;
RustFest Barcelona  | 11/09/19 | Barcelona&lt;br /&gt;
&lt;br /&gt;
Performance now |11/21-22/19 | Amsterdam, The Netherlands&lt;br /&gt;
&lt;br /&gt;
Halfstack | 11/22/19| London&lt;br /&gt;
&lt;br /&gt;
WebConf Asia | 11/20-23| Hong Kong&lt;br /&gt;
&lt;br /&gt;
webclerks community conference | 11/25/19 | Vienna&lt;br /&gt;
&lt;br /&gt;
Web Audio Conference 2019 | 12/4/19 | Trondheim, Norway&lt;br /&gt;
&lt;br /&gt;
dotJS 2019 | 12/5-6/19&lt;br /&gt;
&lt;br /&gt;
Halfstack | 01/17/20 | Phoenix&lt;br /&gt;
&lt;br /&gt;
You Got This 2020 | 01/18/20 | Birmingham, UK&lt;br /&gt;
&lt;br /&gt;
JS Kongress Munich | 04/15-16/20 | Munich, Germany&lt;br /&gt;
&lt;br /&gt;
[https://indieweb.org/2020 ⛰ IndieWeb Summit 2020] | 06/27/20 - 06/28/20 | Portland, Oregon, USA&lt;br /&gt;
&lt;br /&gt;
== Speakers ==&lt;br /&gt;
&lt;br /&gt;
The limit is &#039;&#039;&#039;3 minutes per topic&#039;&#039;&#039;.  It&#039;s like a lightning talk, but don&#039;t feel that you have to have slides in order to make a presentation.  If you plan on showing a video, you need to contact the Air Mozilla team before the day of the meeting or you will be deferred to the next week. The meeting is streamed in a 4:3 format in order to allow for split screen. If your slides are 16:9 &amp;quot;widescreen&amp;quot; format, please indicate in the &amp;quot;Sharing&amp;quot; column below.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;fullwidth-table wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  [https://mozillians.org/u/USERNAME Presenter]&lt;br /&gt;
!  Title&lt;br /&gt;
!  Topic&lt;br /&gt;
!  Location&lt;br /&gt;
!  Sharing&lt;br /&gt;
!  Media&lt;br /&gt;
!  More Details&lt;br /&gt;
|-&lt;br /&gt;
| Who Are You?&lt;br /&gt;
| What Do You Do?&lt;br /&gt;
| What are you going to talk about?&lt;br /&gt;
| Where are you presenting from? (Moz Space, your house, space)&lt;br /&gt;
| Will you be sharing your screen? (yes/no, 4:3 or 16:9)&lt;br /&gt;
| Links to slides or images you want displayed on screen&lt;br /&gt;
| Link to where audience can find out more information&lt;br /&gt;
|-&lt;br /&gt;
| Josh Matthews&lt;br /&gt;
| Engagement Whip, Mixed Reality&lt;br /&gt;
| Emerging Technologies weekly update&lt;br /&gt;
| Toronto&lt;br /&gt;
| no&lt;br /&gt;
| n/a&lt;br /&gt;
| [https://wiki.mozilla.org/WeeklyUpdates/EmergingTechnology#September_23rd.2C_2019 ET headlines]&lt;br /&gt;
|-&lt;br /&gt;
| Asa Dotzler&lt;br /&gt;
| Team Firefox&lt;br /&gt;
| Weekly Firefox Update&lt;br /&gt;
| MTV&lt;br /&gt;
| no&lt;br /&gt;
| n/a&lt;br /&gt;
| [https://wiki.mozilla.org/Firefox/Roadmap/Updates#2019-09-23 2019-09-23]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Welcome! =&lt;br /&gt;
&lt;br /&gt;
Let&#039;s say hello to some new Mozillians! If you are not able to join the meeting live, you can add a link to a short video introducing yourself.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;fullwidth-table wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! &#039;&#039;Who is being introduced?&#039;&#039;&lt;br /&gt;
! &#039;&#039;Who are you? (the introducer)&#039;&#039;&lt;br /&gt;
! &#039;&#039;Where are you doing the introduction?&#039;&#039;&lt;br /&gt;
! &#039;&#039;Where are they from?&#039;&#039;&lt;br /&gt;
! &#039;&#039;How will they be part of Mozilla?&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
&amp;lt;!-- Insert new rows here --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Their Name&lt;br /&gt;
| Your Name&lt;br /&gt;
| Intro location&lt;br /&gt;
| Their Location&lt;br /&gt;
| Their Role&lt;br /&gt;
|-&lt;br /&gt;
| Ricky Stewart&lt;br /&gt;
| Chris Manchester&lt;br /&gt;
| SF Office&lt;br /&gt;
| Chicago Remote&lt;br /&gt;
| Senior Software Engineer, Developer Productivity&lt;br /&gt;
|-&lt;br /&gt;
| Alex Williams&lt;br /&gt;
| Jofish Kaye&lt;br /&gt;
| Remote Mountain View&lt;br /&gt;
| Remote South Carolina&lt;br /&gt;
| HCI Research Intern, Emerging Technologies&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Weekly Updates]]&lt;br /&gt;
[[Category:Meeting Notes]]&lt;/div&gt;</summary>
		<author><name>Kmoir</name></author>
	</entry>
	<entry>
		<id>https://wiki.mozilla.org/index.php?title=WeeklyUpdates/2019-09-23&amp;diff=1218119</id>
		<title>WeeklyUpdates/2019-09-23</title>
		<link rel="alternate" type="text/html" href="https://wiki.mozilla.org/index.php?title=WeeklyUpdates/2019-09-23&amp;diff=1218119"/>
		<updated>2019-09-23T13:08:03Z</updated>

		<summary type="html">&lt;p&gt;Kmoir: /* Welcome! */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
{{WeeklyUpdateNav}}&lt;br /&gt;
* Every Monday @ 11:00am Pacific Time (19:00 UTC) &lt;br /&gt;
* Watch anonymously at https://air.mozilla.org.&lt;br /&gt;
* join #weekly-project-call on irc.mozilla.org or Slack for backchannel discussion&lt;br /&gt;
* If you plan on presenting, please join the Zoom video chat 20 minutes prior to the start of the meeting and announce to the A/V Technicians that you will be speaking so that they can confirm your Audio and Video.&lt;br /&gt;
* &#039;&#039;&#039;Presenters only:&#039;&#039;&#039; Zoom Meeting ID: 828 817 988  [https://mozilla.zoom.us/j/828817988 https://mozilla.zoom.us/j/828817988.] Do &#039;&#039;&#039;not&#039;&#039;&#039; use this room if you&#039;re not planning to speak. &lt;br /&gt;
* One-tap mobile&lt;br /&gt;
** +16465588656,,828817988# US (New York)&lt;br /&gt;
** +17207072699,,828817988# US&lt;br /&gt;
* Dial-in by your location&lt;br /&gt;
** +1 646 558 8656 US (New York)&lt;br /&gt;
** +1 720 707 2699 US&lt;br /&gt;
** 877 853 5257 US Toll-free&lt;br /&gt;
** +61 2 8015 2088 Australia&lt;br /&gt;
** +61 8 7150 1149 Australia&lt;br /&gt;
** 1800 893 423 Australia Toll-free&lt;br /&gt;
** +1 647 558 0588 Canada&lt;br /&gt;
** +33 1 8288 0188 France&lt;br /&gt;
** +33 7 5678 4048 France&lt;br /&gt;
** 0 805 082 588 France Toll-free&lt;br /&gt;
** +49 30 5679 5800 Germany&lt;br /&gt;
** +49 69 8088 3899 Germany&lt;br /&gt;
** +49 30 3080 6188 Germany&lt;br /&gt;
** 800 724 3138 Germany Toll-free&lt;br /&gt;
** +852 5808 6088 Hong Kong, China&lt;br /&gt;
** +44 203 695 0088 United Kingdom&lt;br /&gt;
** +44 203 966 3809 United Kingdom&lt;br /&gt;
** +44 203 051 2874 United Kingdom&lt;br /&gt;
** 0 800 031 5717 United Kingdom Toll-free&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
= Weekly Project Status Meeting Agenda =&lt;br /&gt;
&lt;br /&gt;
Items in this section will be shared during the live status meeting.&lt;br /&gt;
&lt;br /&gt;
== Friends of Mozilla [[Image:Tree.gif|Friends of Mozilla]] ==&lt;br /&gt;
&lt;br /&gt;
== Upcoming Events ==&lt;br /&gt;
&lt;br /&gt;
=== This Week ===&lt;br /&gt;
&lt;br /&gt;
=== Monday, {{#time:d F|{{SUBPAGENAME}}}} ===&lt;br /&gt;
&lt;br /&gt;
=== Tuesday, {{#time:d F|{{SUBPAGENAME}} +1 day}} ===&lt;br /&gt;
&lt;br /&gt;
=== Wednesday, {{#time:d F|{{SUBPAGENAME}} +2 days}} ===&lt;br /&gt;
&lt;br /&gt;
=== Thursday, {{#time:d F|{{SUBPAGENAME}} +3 days}} ===&lt;br /&gt;
&lt;br /&gt;
=== Friday, {{#time:d F|{{SUBPAGENAME}} +4 days}} ===&lt;br /&gt;
&lt;br /&gt;
=== Saturday, {{#time:d F|{{SUBPAGENAME}} +5 days}} ===&lt;br /&gt;
&lt;br /&gt;
=== Sunday, {{#time:d F|{{SUBPAGENAME}} +6 days}} ===&lt;br /&gt;
&lt;br /&gt;
=== Next Week ===&lt;br /&gt;
&lt;br /&gt;
=== Later Events and Available Tickets ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Mozilla DevRel Complimentary Tickets&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Our DevRel Sponsorship team sometimes receives complimentary tickets to share with Mozillians interested in attending the following events. Please fill out this form [https://airtable.com/shrRFuIEm7j2a0Gtu Ticket RequestForm ]. &lt;br /&gt;
If you have questions, reach out to the DevSponsorship Team at devsponsorship@mozilla.com for more details. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;[https://jsconfbp.com/ JS Conf &amp;amp; CSS Conf Budapest]&#039;&#039;&#039; Budapest, Hungary | 2019-09-25 &amp;amp; 2019-09-26-27&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;[https://ruhrjs.de/ RuhrJS 2019]&#039;&#039;&#039; Rotunde Bochum - Bochum Germany | 2019-10-05 to 2019-10-06&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;[http://connect.tech/ CONNECT.TECH]&#039;&#039;&#039; Atlanta, GA, USA | 2019-10-16 to 2019-10-18&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;[https://2018.ffconf.org/ ffconf]&#039;&#039;&#039; ffconf (formerly known as Full Frontal) Brighton, England | 2019-10-08 to 2019-10-08&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;[https://www.rust-belt-rust.com: Rust Belt Rust]&#039;&#039;&#039;| Dayton, OH, USA | 2019-10-18-19&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;[https://scriptconf.org/ Script&#039;19: Javascript for Everyone]&#039;&#039;&#039;| Linz, Austria | 2019-10-25&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;[https://perfnow.nl/ performance.now ()]&#039;&#039;&#039;| Amsterdam, The Netherlands | 2019-11-21 to 2019-11-22&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;[https://halfstackconf.com/ Halfstack]&#039;&#039;&#039; London | 2019-11-22 &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;[https://2019.webconf.asia/ Webconf Asia]&#039;&#039;&#039; Hong Kong | 2019-11-20-23 &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;[https://ntnu.edu/wac2019 Web Audio Conference 2019]&#039;&#039;&#039; Trondheim, Norway | 2019-12-04 to 2019-12-06&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;[https://halfstackconf.com/ Halfstack]&#039;&#039;&#039; Phoenix, AZ | 2020-01-17 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Mozilla Sponsored Developer Events&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Current list of Mozilla sponsored developer events (with their start dates) around the globe (DevRel Events team will update):&lt;br /&gt;
&lt;br /&gt;
Finch Front End | 9/23-25/19 | Edinburgh, UK&lt;br /&gt;
&lt;br /&gt;
CSSConf Budapest 2019 | 9/25/19 | Budapest, Hungary&lt;br /&gt;
&lt;br /&gt;
JSConf Budapest 2019 | 9/26-27/19 | Budapest, Hungary&lt;br /&gt;
&lt;br /&gt;
PromptConf | 09/28/19 | Chicago&lt;br /&gt;
&lt;br /&gt;
ARTIFACT Conference | 9/30-10/2 19 | Austin, Texas US&lt;br /&gt;
&lt;br /&gt;
[https://indieweb.org/2019/Amsterdam ❌ IndieWebCamp Amsterdam] | 9/28/19 - 9/29/19 | Amsterdam, NL | 9/28/19 - 9/29/19 | Amsterdam, NL&lt;br /&gt;
&lt;br /&gt;
View Source 2019 | 9/30/19 - 10/2/19 | Amsterdam, NL&lt;br /&gt;
&lt;br /&gt;
Fronteers | 10/3/19 | Amsterdam, NL&lt;br /&gt;
&lt;br /&gt;
RuhrJS 2019 | 10/5/19 | Bochum, Germany&lt;br /&gt;
&lt;br /&gt;
[https://indieweb.org/2019/NYC 🗽 IndieWebCamp New York City 2019] | 10/5/19 - 10/6/19 | New York City, NY, USA&lt;br /&gt;
&lt;br /&gt;
Paris Web 2019 | 10/10-12/19 | Bois-Colombes and Paris, France&lt;br /&gt;
&lt;br /&gt;
Web Engines Hackfest 2019 | 10/14/19 | Galicia, Spain&lt;br /&gt;
&lt;br /&gt;
CONNECT.TECH | 10/16/19 | Atlanta, GA, USA&lt;br /&gt;
&lt;br /&gt;
Rust Belt Rust | 10/18-19/19 | Dayton, OH, USA&lt;br /&gt;
&lt;br /&gt;
[https://indieweb.org/2019/Brighton 🎪 IndieWebCamp Brighton 2019] | 10/19/19 - 10/20/19 | Brighton, England&lt;br /&gt;
&lt;br /&gt;
2019 LLVM Developers&#039; Meeting | 10/22/19 | San Jose&lt;br /&gt;
&lt;br /&gt;
Rust.Tokyo | 10/26/19 | Tokyo&lt;br /&gt;
&lt;br /&gt;
a11yTO Conf | 10/24/19 | Toronto&lt;br /&gt;
&lt;br /&gt;
Script&#039;19: Javascript for Everyone 10/25/19 | Linz, Austria&lt;br /&gt;
&lt;br /&gt;
Security BSides Portland | 10/25-26/19 | Portland, USA&lt;br /&gt;
&lt;br /&gt;
beyond tellerrand // | BERLIN 2019 | 11/4/19 | Berlin, Germany&lt;br /&gt;
&lt;br /&gt;
CascadiaJS | 11/07/19 | Seattle&lt;br /&gt;
&lt;br /&gt;
ffconf | 11/8/19 | Brighton, UK&lt;br /&gt;
&lt;br /&gt;
RustFest Barcelona  | 11/09/19 | Barcelona&lt;br /&gt;
&lt;br /&gt;
Performance now |11/21-22/19 | Amsterdam, The Netherlands&lt;br /&gt;
&lt;br /&gt;
Halfstack | 11/22/19| London&lt;br /&gt;
&lt;br /&gt;
WebConf Asia | 11/20-23| Hong Kong&lt;br /&gt;
&lt;br /&gt;
webclerks community conference | 11/25/19 | Vienna&lt;br /&gt;
&lt;br /&gt;
Web Audio Conference 2019 | 12/4/19 | Trondheim, Norway&lt;br /&gt;
&lt;br /&gt;
dotJS 2019 | 12/5-6/19&lt;br /&gt;
&lt;br /&gt;
Halfstack | 01/17/20 | Phoenix&lt;br /&gt;
&lt;br /&gt;
You Got This 2020 | 01/18/20 | Birmingham, UK&lt;br /&gt;
&lt;br /&gt;
JS Kongress Munich | 04/15-16/20 | Munich, Germany&lt;br /&gt;
&lt;br /&gt;
[https://indieweb.org/2020 ⛰ IndieWeb Summit 2020] | 06/27/20 - 06/28/20 | Portland, Oregon, USA&lt;br /&gt;
&lt;br /&gt;
== Speakers ==&lt;br /&gt;
&lt;br /&gt;
The limit is &#039;&#039;&#039;3 minutes per topic&#039;&#039;&#039;.  It&#039;s like a lightning talk, but don&#039;t feel that you have to have slides in order to make a presentation.  If you plan on showing a video, you need to contact the Air Mozilla team before the day of the meeting or you will be deferred to the next week. The meeting is streamed in a 4:3 format in order to allow for split screen. If your slides are 16:9 &amp;quot;widescreen&amp;quot; format, please indicate in the &amp;quot;Sharing&amp;quot; column below.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;fullwidth-table wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!  [https://mozillians.org/u/USERNAME Presenter]&lt;br /&gt;
!  Title&lt;br /&gt;
!  Topic&lt;br /&gt;
!  Location&lt;br /&gt;
!  Sharing&lt;br /&gt;
!  Media&lt;br /&gt;
!  More Details&lt;br /&gt;
|-&lt;br /&gt;
| Who Are You?&lt;br /&gt;
| What Do You Do?&lt;br /&gt;
| What are you going to talk about?&lt;br /&gt;
| Where are you presenting from? (Moz Space, your house, space)&lt;br /&gt;
| Will you be sharing your screen? (yes/no, 4:3 or 16:9)&lt;br /&gt;
| Links to slides or images you want displayed on screen&lt;br /&gt;
| Link to where audience can find out more information&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Welcome! =&lt;br /&gt;
&lt;br /&gt;
Let&#039;s say hello to some new Mozillians! If you are not able to join the meeting live, you can add a link to a short video introducing yourself.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;fullwidth-table wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! &#039;&#039;Who is being introduced?&#039;&#039;&lt;br /&gt;
! &#039;&#039;Who are you? (the introducer)&#039;&#039;&lt;br /&gt;
! &#039;&#039;Where are you doing the introduction?&#039;&#039;&lt;br /&gt;
! &#039;&#039;Where are they from?&#039;&#039;&lt;br /&gt;
! &#039;&#039;How will they be part of Mozilla?&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
&amp;lt;!-- Insert new rows here --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Their Name&lt;br /&gt;
| Your Name&lt;br /&gt;
| Intro location&lt;br /&gt;
| Their Location&lt;br /&gt;
| Their Role&lt;br /&gt;
|-&lt;br /&gt;
| Ricky Stewart&lt;br /&gt;
| Chris Manchester&lt;br /&gt;
| SF Office&lt;br /&gt;
| Chicago Remote&lt;br /&gt;
| Senior Software Engineer, Build Systems&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Weekly Updates]]&lt;br /&gt;
[[Category:Meeting Notes]]&lt;/div&gt;</summary>
		<author><name>Kmoir</name></author>
	</entry>
	<entry>
		<id>https://wiki.mozilla.org/index.php?title=Auto-tools/Projects/Pulse&amp;diff=1209085</id>
		<title>Auto-tools/Projects/Pulse</title>
		<link rel="alternate" type="text/html" href="https://wiki.mozilla.org/index.php?title=Auto-tools/Projects/Pulse&amp;diff=1209085"/>
		<updated>2019-03-18T15:40:37Z</updated>

		<summary type="html">&lt;p&gt;Kmoir: /* To upgrade a ssl certificate on pulse.mozilla.org */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Introducing Pulse =&lt;br /&gt;
&lt;br /&gt;
Pulse is a managed [http://www.rabbitmq.com RabbitMQ] cluster designed to provide loose coupling between automation and infrastructure tools.  The goal of Pulse is to add visibility to Mozilla&#039;s tools and systems and to eliminate polling and other brittle methods of scraping data. This allows more robust, dynamic, and informative tools.&lt;br /&gt;
&lt;br /&gt;
Pulse is available at pulse.mozilla.org:5671 (AMQP over SSL).  It is hosted by [http://cloudamqp.com CloudAMQP].&lt;br /&gt;
&lt;br /&gt;
[[Auto-tools/Projects/Pulse/PulseGuardian|PulseGuardian]] is a tool that manages Pulse&#039;s users and queues (and eventually exchanges).  It is available at https://pulseguardian.mozilla.org and hosted by [http://heroku.com Heroku].&lt;br /&gt;
&lt;br /&gt;
We have a discussion forum available via the standard trio of [news:mozilla.tools.pulse USENET newsgroup], [https://lists.mozilla.org/listinfo/tools-pulse mailing list], and [https://groups.google.com/forum/#!forum/mozilla.tools.pulse Google Group].&lt;br /&gt;
&lt;br /&gt;
File bugs under [https://bugzilla.mozilla.org/enter_bug.cgi?product=Webtools&amp;amp;component=Pulse Webtools :: Pulse].  We don&#039;t have a separate component for PulseGuardian; rather, we just start the summaries with &amp;quot;[PulseGuardian]&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Also see the [https://tools.taskcluster.net/pulse-inspector/ Pulse Inspector] web app, which displays Pulse messages in real time, and the (manually updated) [[/Exchanges|list of Pulse exchanges]].&lt;br /&gt;
&lt;br /&gt;
= System Description =&lt;br /&gt;
&lt;br /&gt;
Pulse isn&#039;t any one thing.  At its heart, it is a RabbitMQ system with a particular configuration and a set of conventions for using it along with a management tool, [[Auto-tools/Projects/Pulse/PulseGuardian|PulseGuardian]], to make Pulse as automated and self-serve as possible.  Pulse follows the pub-sub pattern, in which publishers send messages to topic exchanges, and consumers create queues bound to these exchanges in order to subscribe to the publishers&#039; messages.  In general, publishers create and own exchanges, and consumers create and own queues.&lt;br /&gt;
&lt;br /&gt;
= Specification =&lt;br /&gt;
&lt;br /&gt;
Pulse is a managed [https://www.rabbitmq.com/resources/specs/amqp0-9-1.pdf AMQP 0-9-1]&lt;br /&gt;
service with [https://www.rabbitmq.com/extensions.html RabbitMQ extensions] for publishing messages from Mozilla&lt;br /&gt;
infrastructure. The aim is provide hooks that subscribers can&lt;br /&gt;
use to integrate and extend Mozilla infrastructure.&lt;br /&gt;
&lt;br /&gt;
== Authentication ==&lt;br /&gt;
&lt;br /&gt;
Pulse credentials are managed and issued by [[Auto-tools/Projects/Pulse/PulseGuardian|PulseGuardian]],&lt;br /&gt;
available at https://pulseguardian.mozilla.org. This service SHALL issue&lt;br /&gt;
an &#039;&#039;accessToken&#039;&#039; for any &#039;&#039;clientId&#039;&#039; that is registered&lt;br /&gt;
with &#039;&#039;authorized&#039;&#039; email address.&lt;br /&gt;
The accessToken is strictly secret and MUST NOT be shared&lt;br /&gt;
publicly. The clientId is not secret. When establishing an AMQP&lt;br /&gt;
connection, the clientId and accessToken MUST be used as&lt;br /&gt;
&#039;&#039;username&#039;&#039; and &#039;&#039;password&#039;&#039;, respectively.&lt;br /&gt;
&lt;br /&gt;
== Authorized Users ==&lt;br /&gt;
&lt;br /&gt;
Pulse is intended to be open to all Mozillians who want to&lt;br /&gt;
extend or integrate with Mozilla infrastructure. To guard against&lt;br /&gt;
abuse PulseGuardian users MUST authenticate via Persona. PulseGuardian SHOULD verify that users have a vouched Mozillians profile.&lt;br /&gt;
&lt;br /&gt;
== Publishers ==&lt;br /&gt;
&lt;br /&gt;
Publishers MUST name &#039;&#039;exchanges&#039;&#039; in the form &amp;lt;code&amp;gt;exchange/&amp;lt;clientId&amp;gt;/&amp;lt;name&amp;gt;&amp;lt;/code&amp;gt; where clientId is the userid used to bind/connect to the server. Attempts to name an exchange otherwise SHALL result in an authorization error. Exchanges MUST be &#039;&#039;topic exchanges&#039;&#039; and they MUST be declared &#039;&#039;durable&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Messages MUST contain a UTF-8-encoded [http://tools.ietf.org/html/rfc7159 JSON] payload, and&lt;br /&gt;
their &amp;lt;code&amp;gt;Content-Type&amp;lt;/code&amp;gt; MUST be &amp;lt;code&amp;gt;application/json&amp;lt;/code&amp;gt;.&lt;br /&gt;
Messages SHOULD NOT be larger than 8&amp;amp;nbsp;kB; deviations may be&lt;br /&gt;
feasible for low-traffic exchanges. Messages MUST NOT contain&lt;br /&gt;
secret or sensitive information; all exchanges and messages&lt;br /&gt;
SHALL be considered public.&lt;br /&gt;
&lt;br /&gt;
A message SHOULD carry a &#039;&#039;routing key&#039;&#039;, in which fields have a&lt;br /&gt;
fixed index from the left. Additionally, a message MAY be&lt;br /&gt;
&#039;&#039;cced&#039;&#039; to multiple routing keys, using the RabbitMQ&lt;br /&gt;
[https://www.rabbitmq.com/sender-selected.html &#039;&#039;Sender-selected Distribution&#039;&#039;] extension.&lt;br /&gt;
&lt;br /&gt;
Messages SHOULD be &#039;&#039;durable&#039;&#039; and SHOULD be published over&lt;br /&gt;
RabbitMQ [https://www.rabbitmq.com/confirms.html &#039;&#039;confirm-publish&#039;&#039; channels]. Otherwise, the&lt;br /&gt;
documentation MUST clearly reflect that messages from the&lt;br /&gt;
given exchange do not exhibit deliver &#039;&#039;at-least-once&#039;&#039; semantics.&lt;br /&gt;
&lt;br /&gt;
== Subscribers ==&lt;br /&gt;
&lt;br /&gt;
Subscribers MUST name &#039;&#039;queues&#039;&#039; in the form&lt;br /&gt;
&amp;lt;code&amp;gt;queue/&amp;lt;clientId&amp;gt;/&amp;lt;name&amp;gt;&amp;lt;/code&amp;gt;; attempts to name a queue otherwise&lt;br /&gt;
SHALL result in an authorization error. Queues MAY &#039;&#039;consume&#039;&#039;&lt;br /&gt;
from any exchange prefixed &amp;lt;code&amp;gt;exchange/&amp;lt;/code&amp;gt;; attempts to consume&lt;br /&gt;
from any other exchange SHALL result in an authentication error.&lt;br /&gt;
&lt;br /&gt;
Subscribers MAY limit the size of their queues using the RabbitMQ&lt;br /&gt;
[https://www.rabbitmq.com/maxlength.html &#039;&#039;Queue Length Limit&#039;&#039;] extension. Subscribers MUST NOT let&lt;br /&gt;
their queues grow unbounded; if left unattended, &#039;&#039;Pulse&#039;&#039;&lt;br /&gt;
SHALL notify the owner by email. Additionally, &#039;&#039;Pulse&#039;&#039; MAY delete&lt;br /&gt;
a queue which exceeds defined limits. Subscribers SHOULD specify a&lt;br /&gt;
prefetch limit using the RabbitMQ [https://www.rabbitmq.com/consumer-prefetch.html &#039;&#039;Consumer Prefetch&#039;&#039; limit] extension.&lt;br /&gt;
&lt;br /&gt;
Subscribers SHOULD use either &#039;&#039;durable&#039;&#039; queues or&lt;br /&gt;
&#039;&#039;auto-delete&#039;&#039; queues. Implementors are recommended to aim&lt;br /&gt;
for deliver-&#039;&#039;at-least-once&#039;&#039; semantics.&lt;br /&gt;
&lt;br /&gt;
== Appendix A: Everything in Bullet Points ==&lt;br /&gt;
&lt;br /&gt;
This is a summary of the above.&lt;br /&gt;
&lt;br /&gt;
Pulse:&lt;br /&gt;
* MUST offer registration at &amp;lt;code&amp;gt;pulse.mozilla.org&amp;lt;/code&amp;gt;&lt;br /&gt;
* MUST support [https://www.rabbitmq.com/resources/specs/amqp0-9-1.pdf AMQP 0-9-1] and these RabbitMQ extensions:&lt;br /&gt;
** [https://www.rabbitmq.com/confirms.html Confirms]&lt;br /&gt;
** [https://www.rabbitmq.com/consumer-prefetch.html Consumer Prefetch]&lt;br /&gt;
** [https://www.rabbitmq.com/maxlength.html Queue Length Limit]&lt;br /&gt;
** [https://www.rabbitmq.com/sender-selected.html Sender-selected Distribution]&lt;br /&gt;
* SHOULD exhibit deliver-&#039;&#039;at-least-once&#039;&#039; semantics&lt;br /&gt;
* MAY delete queues that grows beyond &#039;&#039;Pulse&#039;&#039; defined limits&lt;br /&gt;
* SHALL notify owner by email when a queue grows close to &#039;&#039;Pulse&#039;&#039;-defined limits.&lt;br /&gt;
&lt;br /&gt;
Publishers:&lt;br /&gt;
* SHOULD use [https://www.rabbitmq.com/confirms.html confirm-publish channels]&lt;br /&gt;
&lt;br /&gt;
Exchanges:&lt;br /&gt;
* MUST be named &amp;lt;code&amp;gt;exchange/&amp;lt;clientId&amp;gt;/&amp;lt;name&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
* MUST be topic exchanges&lt;br /&gt;
* MUST be durable&lt;br /&gt;
&lt;br /&gt;
Messages:&lt;br /&gt;
* MUST be UTF-8-encoded [http://tools.ietf.org/html/rfc7159 JSON]&lt;br /&gt;
* MUST carry &amp;lt;code&amp;gt;application/json&amp;lt;/code&amp;gt; as &amp;lt;code&amp;gt;Content-Type&amp;lt;/code&amp;gt;&lt;br /&gt;
* SHOULD be durable&lt;br /&gt;
* SHOULD be less than 8 KiB (for good performance)&lt;br /&gt;
* MAY be CC&#039;ed to [https://www.rabbitmq.com/sender-selected.html multiple routing keys]&lt;br /&gt;
* MUST NOT contain private or sensitive information&lt;br /&gt;
* SHOULD have a routing key where fields have a fixed index from the left&lt;br /&gt;
&lt;br /&gt;
Subscribers:&lt;br /&gt;
* SHOULD specify a [https://www.rabbitmq.com/consumer-prefetch.html &#039;&#039;consumer prefetch&#039;&#039; limit]&lt;br /&gt;
&lt;br /&gt;
Queues:&lt;br /&gt;
* MUST be named &amp;lt;code&amp;gt;queue/&amp;lt;clientId&amp;gt;/&amp;lt;name&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
* MAY have a [https://www.rabbitmq.com/maxlength.html limited length]&lt;br /&gt;
* MUST not grow unbounded&lt;br /&gt;
&lt;br /&gt;
= Let&#039;s Use It =&lt;br /&gt;
&lt;br /&gt;
There are currently two Pulse clients available. Please note that you can also connect to Pulse in other languages, provided you have an AMQP 0.9.1 library that will let you interact with AMQP exchanges. See https://github.com/rabbitmq/rabbitmq-tutorials#languages for example.&lt;br /&gt;
&lt;br /&gt;
== Python Pulse client library ==&lt;br /&gt;
&lt;br /&gt;
The [https://github.com/mozilla-services/mozillapulse mozillapulse] Python package provides classes for existing publishers, consumers, and messages so you can quickly build Pulse applications.  See the [https://github.com/mozilla-services/mozillapulse/blob/master/README.md README] to get started (although note that the test publisher is currently offline; see {{bug|1218976}}.  You can use another consumer, e.g. BuildConsumer, to verify your setup.).&lt;br /&gt;
&lt;br /&gt;
This library is somewhat inflexible, however, and should be rewritten. One idea is to turn TaskCluster&#039;s Python client into a standalone package.&lt;br /&gt;
&lt;br /&gt;
== Go (golang) Pulse client library ==&lt;br /&gt;
&lt;br /&gt;
This can be found here:&lt;br /&gt;
* http://taskcluster.github.io/pulse-go/&lt;br /&gt;
&lt;br /&gt;
Extensions for TaskCluster exchanges here (see section &amp;quot;AMQP APIs&amp;quot;):&lt;br /&gt;
* http://taskcluster.github.io/taskcluster-client-go/&lt;br /&gt;
&lt;br /&gt;
= Contributing =&lt;br /&gt;
&lt;br /&gt;
To set up a local system for development, see the [https://github.com/mozilla-services/mozillapulse/blob/master/HACKING.md HACKING.md] file included in the mozillapulse source.&lt;br /&gt;
&lt;br /&gt;
The main Pulse library (mozillapulse) and publisher shims (pulseshims) are written in Python, although there is also a Go library as mentioned in the section above.  We also want to provide a canonical JavaScript library at some point.  To hack on the main Pulse library, you should be comfortable in Python, and it&#039;s helpful to understand the basics of AMQP.  Knowledge of kombu is also useful.&lt;br /&gt;
&lt;br /&gt;
To hack on PulseGuardian, you should know some Python and JavaScript.  Experience with Flask, SQLAlchemy, and RabbitMQ are useful, but you can probably learn what you need as you fix bugs.&lt;br /&gt;
&lt;br /&gt;
Feel free to stop by #pulse or #ateam with questions!&lt;br /&gt;
&lt;br /&gt;
Here is the list of open, unassigned, mentored Pulse and PulseGuardian bugs to get you started.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;bugzilla&amp;gt;&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;quicksearch&amp;quot;: &amp;quot;status:new&amp;quot;,&lt;br /&gt;
        &amp;quot;product&amp;quot;: &amp;quot;Webtools&amp;quot;,&lt;br /&gt;
        &amp;quot;component&amp;quot;: &amp;quot;Pulse&amp;quot;,&lt;br /&gt;
        &amp;quot;f1&amp;quot;: &amp;quot;bug_mentor&amp;quot;,&lt;br /&gt;
        &amp;quot;o1&amp;quot;: &amp;quot;isnotempty&amp;quot;,&lt;br /&gt;
        &amp;quot;include_fields&amp;quot;: &amp;quot;id,summary,priority,status&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/bugzilla&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Once you have your feet wet and are ready to take on a more involved project, here is a list of all current Pulse bugs:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;bugzilla&amp;gt;&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;quicksearch&amp;quot;: &amp;quot;status:new,assigned,reopened,unconfirmed&amp;quot;,&lt;br /&gt;
        &amp;quot;product&amp;quot;: &amp;quot;Webtools&amp;quot;,&lt;br /&gt;
        &amp;quot;component&amp;quot;: &amp;quot;Pulse&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/bugzilla&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For mentored bugs, we use the User Story to provide a link back to this page, as well as any extra information for contributors, such as required knowledge or tools.  The basic text for mentored bugs should be &amp;quot;This is a mentored Pulse bug.  For general information on Pulse, see https://wiki.mozilla.org/Auto-tools/Projects/Pulse, which includes a section on Contributing.&amp;quot;  An example of extra text is &amp;quot;This bug also requires you to have a working mail server.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
= Road Map =&lt;br /&gt;
&lt;br /&gt;
See the [https://bugzilla.mozilla.org/buglist.cgi?resolution=---&amp;amp;query_format=advanced&amp;amp;component=Pulse&amp;amp;product=Webtools prioritized bug list] for all open issues and feature requests.&lt;br /&gt;
&lt;br /&gt;
= Security Model =&lt;br /&gt;
&lt;br /&gt;
This is summarized in the formal Pulse specification above.  What follows is the rationale and some technical implementation notes.&lt;br /&gt;
&lt;br /&gt;
In order to have a reliable, well behaved system, the following assertions will need to be true.&lt;br /&gt;
&lt;br /&gt;
* All users, publishers and consumers alike, must have their own accounts (no guest/public users).&lt;br /&gt;
* Only publishers should be able to declare exchanges.&lt;br /&gt;
* Only the publisher user account associated with a particular vhost should be allowed to publish messages to exchanges in the vhost.  In other words, exactly one user account should be allowed to publish messages within a given vhost.&lt;br /&gt;
* Only the user that created a particular queue should be allowed to consume from it.&lt;br /&gt;
&lt;br /&gt;
Since exchange and queue permissions go together, we&#039;ll need exchange and queue naming conventions mixed with restrictive permissions.  Each user will be restricted to a particular exchange and queue naming prefix.  Many users will be either consumers or publishers, but for simplicity, each user can do both.  Users will have full permissions on &amp;lt;code&amp;gt;&amp;quot;^exchange/&amp;lt;username&amp;gt;/.*$&amp;quot;&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;&amp;quot;^queue/&amp;lt;username&amp;gt;/.*$&amp;quot;&amp;lt;/code&amp;gt;.  They will also have read permissions to exchange/*.  This will both prevent users from writing to other users&#039; exchanges as well as prevent them from consuming from other users&#039; queues.  For convenience, if a consumer creates a nondurable queue, mozillapulse can assign a random suffix to the user&#039;s standard queue name prefix, i.e. &amp;lt;code&amp;gt;queue/&amp;lt;username&amp;gt;/&amp;lt;random string&amp;gt;&amp;lt;/code&amp;gt;, since the user wouldn&#039;t be able to create nor access a completely random server-assigned name.&lt;br /&gt;
&lt;br /&gt;
Note that this doesn&#039;t prevent a consumer from creating an exchange named as a queue, since the permission model doesn&#039;t distinguish between queues and exchanges, and consumers need the ability to create queues.  This is not particularly problematic, since no one would have permission to use that exchange.&lt;br /&gt;
&lt;br /&gt;
With this security model, we technically don&#039;t really need vhosts, since the names of the queues and exchanges the users can use are so specific.  There may still be a benefit in allowing apps to use the same queue name for different exchanges, though, which would be possible if each exchange had its own vhost.  The downside is that you cannot specify &amp;quot;all vhosts&amp;quot; when setting a user&#039;s permissions, so they would either have to list all vhosts they want to use when creating the user in PulseGuardian, and be able to update that list later, or PulseGuardian or some other app would have to automatically add new permissions to all users when a vhost is created.&lt;br /&gt;
&lt;br /&gt;
= Admin Procedures =&lt;br /&gt;
&lt;br /&gt;
kmoir and glob have access to the Pulse cluster on CloudAMQP and the following related services:&lt;br /&gt;
&lt;br /&gt;
* PulseGuardian should be deleting queues that are too long. If you need to manually delete a queue, use the Management UI. Try to ping the queue owner first before killing if possible.&lt;br /&gt;
&lt;br /&gt;
== To upgrade a ssl certificate on pulse.mozilla.org ==&lt;br /&gt;
&lt;br /&gt;
Open a bug with IT to generate a new certificate &lt;br /&gt;
{{bug|1532325}}&lt;br /&gt;
&lt;br /&gt;
IT needs to email support@cloudamqp.com with the new cert.  The cloudampq support team will install it on all our of cloudampq nodes.  After it has been installed, you can login to the administrative start the nodes one by one which will not result any downtime.  (Ensure you wait for the node to restart before restarting another one.)  Verify that the certs are installed on the nodes&lt;br /&gt;
&lt;br /&gt;
* https://sslanalyzer.comodoca.com/?url=pulse.mozilla.org&lt;br /&gt;
* https://sslanalyzer.comodoca.com/?url=orange-antelope-01.rmq.cloudamqp.com&lt;br /&gt;
* https://sslanalyzer.comodoca.com/?url=orange-antelope-02.rmq.cloudamqp.com&lt;br /&gt;
* https://sslanalyzer.comodoca.com/?url=orange-antelope-01.rmq.cloudamqp.com&lt;br /&gt;
&lt;br /&gt;
This should show the dates for the new certificate and that the cert is trusted by Mozilla and Microsoft.&lt;br /&gt;
&lt;br /&gt;
= More reading =&lt;br /&gt;
&lt;br /&gt;
* [http://slides.com/mcote/pulse Slides] from a presentation on Pulse.&lt;br /&gt;
* [https://mrcote.info/blog/2015/02/16/pulse-update/ Update] on Pulse from 2015/02/16.&lt;br /&gt;
&lt;br /&gt;
LegNeato also wrote several blog posts on Pulse as he was building it.  They contain some more background if you&#039;re really interested.  They are linked below, in chronological order.&lt;br /&gt;
&lt;br /&gt;
* [http://christian.legnitto.com/blog/2010/07/17/mozilla-pulse-and-rabbitmq/ Mozilla Pulse and RabbitMQ]&lt;br /&gt;
* [http://christian.legnitto.com/blog/2010/08/20/push-notifications-for-bugzilla/ Push notifications for Bugzilla]&lt;br /&gt;
** This idea has been shelved for the time being, both due to security issues and performance.  See [[BMO/ChangeNotificationSystem]] for an alternative.&lt;br /&gt;
* [http://christian.legnitto.com/blog/2010/09/10/bugzilla-amqp-is-now-buzgilla-push-supports-the-stomp-protocol/ bugzilla-amqp is now buzgilla-push, supports the STOMP protocol]&lt;br /&gt;
** See above note.  Just keeping these links for interest&#039;s sake.&lt;br /&gt;
* [http://christian.legnitto.com/blog/2010/10/15/whats-up-with-pulse/ What’s up with Pulse?]&lt;br /&gt;
* [http://christian.legnitto.com/blog/2010/11/23/github-amqp-integration-service-hook-live/ GitHub AMQP integration service hook live!]&lt;br /&gt;
** Tangentially related to Pulse.&lt;br /&gt;
* [http://christian.legnitto.com/blog/2010/12/06/lots-of-pulse-changes-out-of-prototype-mode-this-week/ Lots of Pulse changes, out of prototype mode this week!]&lt;br /&gt;
* [http://christian.legnitto.com/blog/2010/12/22/another-update-on-pulse/ Another update on Pulse]&lt;/div&gt;</summary>
		<author><name>Kmoir</name></author>
	</entry>
	<entry>
		<id>https://wiki.mozilla.org/index.php?title=Auto-tools/Projects/Pulse&amp;diff=1209084</id>
		<title>Auto-tools/Projects/Pulse</title>
		<link rel="alternate" type="text/html" href="https://wiki.mozilla.org/index.php?title=Auto-tools/Projects/Pulse&amp;diff=1209084"/>
		<updated>2019-03-18T15:40:18Z</updated>

		<summary type="html">&lt;p&gt;Kmoir: /* To upgrade a ssl certificate on pulse.mozilla.org */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Introducing Pulse =&lt;br /&gt;
&lt;br /&gt;
Pulse is a managed [http://www.rabbitmq.com RabbitMQ] cluster designed to provide loose coupling between automation and infrastructure tools.  The goal of Pulse is to add visibility to Mozilla&#039;s tools and systems and to eliminate polling and other brittle methods of scraping data. This allows more robust, dynamic, and informative tools.&lt;br /&gt;
&lt;br /&gt;
Pulse is available at pulse.mozilla.org:5671 (AMQP over SSL).  It is hosted by [http://cloudamqp.com CloudAMQP].&lt;br /&gt;
&lt;br /&gt;
[[Auto-tools/Projects/Pulse/PulseGuardian|PulseGuardian]] is a tool that manages Pulse&#039;s users and queues (and eventually exchanges).  It is available at https://pulseguardian.mozilla.org and hosted by [http://heroku.com Heroku].&lt;br /&gt;
&lt;br /&gt;
We have a discussion forum available via the standard trio of [news:mozilla.tools.pulse USENET newsgroup], [https://lists.mozilla.org/listinfo/tools-pulse mailing list], and [https://groups.google.com/forum/#!forum/mozilla.tools.pulse Google Group].&lt;br /&gt;
&lt;br /&gt;
File bugs under [https://bugzilla.mozilla.org/enter_bug.cgi?product=Webtools&amp;amp;component=Pulse Webtools :: Pulse].  We don&#039;t have a separate component for PulseGuardian; rather, we just start the summaries with &amp;quot;[PulseGuardian]&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Also see the [https://tools.taskcluster.net/pulse-inspector/ Pulse Inspector] web app, which displays Pulse messages in real time, and the (manually updated) [[/Exchanges|list of Pulse exchanges]].&lt;br /&gt;
&lt;br /&gt;
= System Description =&lt;br /&gt;
&lt;br /&gt;
Pulse isn&#039;t any one thing.  At its heart, it is a RabbitMQ system with a particular configuration and a set of conventions for using it along with a management tool, [[Auto-tools/Projects/Pulse/PulseGuardian|PulseGuardian]], to make Pulse as automated and self-serve as possible.  Pulse follows the pub-sub pattern, in which publishers send messages to topic exchanges, and consumers create queues bound to these exchanges in order to subscribe to the publishers&#039; messages.  In general, publishers create and own exchanges, and consumers create and own queues.&lt;br /&gt;
&lt;br /&gt;
= Specification =&lt;br /&gt;
&lt;br /&gt;
Pulse is a managed [https://www.rabbitmq.com/resources/specs/amqp0-9-1.pdf AMQP 0-9-1]&lt;br /&gt;
service with [https://www.rabbitmq.com/extensions.html RabbitMQ extensions] for publishing messages from Mozilla&lt;br /&gt;
infrastructure. The aim is provide hooks that subscribers can&lt;br /&gt;
use to integrate and extend Mozilla infrastructure.&lt;br /&gt;
&lt;br /&gt;
== Authentication ==&lt;br /&gt;
&lt;br /&gt;
Pulse credentials are managed and issued by [[Auto-tools/Projects/Pulse/PulseGuardian|PulseGuardian]],&lt;br /&gt;
available at https://pulseguardian.mozilla.org. This service SHALL issue&lt;br /&gt;
an &#039;&#039;accessToken&#039;&#039; for any &#039;&#039;clientId&#039;&#039; that is registered&lt;br /&gt;
with &#039;&#039;authorized&#039;&#039; email address.&lt;br /&gt;
The accessToken is strictly secret and MUST NOT be shared&lt;br /&gt;
publicly. The clientId is not secret. When establishing an AMQP&lt;br /&gt;
connection, the clientId and accessToken MUST be used as&lt;br /&gt;
&#039;&#039;username&#039;&#039; and &#039;&#039;password&#039;&#039;, respectively.&lt;br /&gt;
&lt;br /&gt;
== Authorized Users ==&lt;br /&gt;
&lt;br /&gt;
Pulse is intended to be open to all Mozillians who want to&lt;br /&gt;
extend or integrate with Mozilla infrastructure. To guard against&lt;br /&gt;
abuse PulseGuardian users MUST authenticate via Persona. PulseGuardian SHOULD verify that users have a vouched Mozillians profile.&lt;br /&gt;
&lt;br /&gt;
== Publishers ==&lt;br /&gt;
&lt;br /&gt;
Publishers MUST name &#039;&#039;exchanges&#039;&#039; in the form &amp;lt;code&amp;gt;exchange/&amp;lt;clientId&amp;gt;/&amp;lt;name&amp;gt;&amp;lt;/code&amp;gt; where clientId is the userid used to bind/connect to the server. Attempts to name an exchange otherwise SHALL result in an authorization error. Exchanges MUST be &#039;&#039;topic exchanges&#039;&#039; and they MUST be declared &#039;&#039;durable&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Messages MUST contain a UTF-8-encoded [http://tools.ietf.org/html/rfc7159 JSON] payload, and&lt;br /&gt;
their &amp;lt;code&amp;gt;Content-Type&amp;lt;/code&amp;gt; MUST be &amp;lt;code&amp;gt;application/json&amp;lt;/code&amp;gt;.&lt;br /&gt;
Messages SHOULD NOT be larger than 8&amp;amp;nbsp;kB; deviations may be&lt;br /&gt;
feasible for low-traffic exchanges. Messages MUST NOT contain&lt;br /&gt;
secret or sensitive information; all exchanges and messages&lt;br /&gt;
SHALL be considered public.&lt;br /&gt;
&lt;br /&gt;
A message SHOULD carry a &#039;&#039;routing key&#039;&#039;, in which fields have a&lt;br /&gt;
fixed index from the left. Additionally, a message MAY be&lt;br /&gt;
&#039;&#039;cced&#039;&#039; to multiple routing keys, using the RabbitMQ&lt;br /&gt;
[https://www.rabbitmq.com/sender-selected.html &#039;&#039;Sender-selected Distribution&#039;&#039;] extension.&lt;br /&gt;
&lt;br /&gt;
Messages SHOULD be &#039;&#039;durable&#039;&#039; and SHOULD be published over&lt;br /&gt;
RabbitMQ [https://www.rabbitmq.com/confirms.html &#039;&#039;confirm-publish&#039;&#039; channels]. Otherwise, the&lt;br /&gt;
documentation MUST clearly reflect that messages from the&lt;br /&gt;
given exchange do not exhibit deliver &#039;&#039;at-least-once&#039;&#039; semantics.&lt;br /&gt;
&lt;br /&gt;
== Subscribers ==&lt;br /&gt;
&lt;br /&gt;
Subscribers MUST name &#039;&#039;queues&#039;&#039; in the form&lt;br /&gt;
&amp;lt;code&amp;gt;queue/&amp;lt;clientId&amp;gt;/&amp;lt;name&amp;gt;&amp;lt;/code&amp;gt;; attempts to name a queue otherwise&lt;br /&gt;
SHALL result in an authorization error. Queues MAY &#039;&#039;consume&#039;&#039;&lt;br /&gt;
from any exchange prefixed &amp;lt;code&amp;gt;exchange/&amp;lt;/code&amp;gt;; attempts to consume&lt;br /&gt;
from any other exchange SHALL result in an authentication error.&lt;br /&gt;
&lt;br /&gt;
Subscribers MAY limit the size of their queues using the RabbitMQ&lt;br /&gt;
[https://www.rabbitmq.com/maxlength.html &#039;&#039;Queue Length Limit&#039;&#039;] extension. Subscribers MUST NOT let&lt;br /&gt;
their queues grow unbounded; if left unattended, &#039;&#039;Pulse&#039;&#039;&lt;br /&gt;
SHALL notify the owner by email. Additionally, &#039;&#039;Pulse&#039;&#039; MAY delete&lt;br /&gt;
a queue which exceeds defined limits. Subscribers SHOULD specify a&lt;br /&gt;
prefetch limit using the RabbitMQ [https://www.rabbitmq.com/consumer-prefetch.html &#039;&#039;Consumer Prefetch&#039;&#039; limit] extension.&lt;br /&gt;
&lt;br /&gt;
Subscribers SHOULD use either &#039;&#039;durable&#039;&#039; queues or&lt;br /&gt;
&#039;&#039;auto-delete&#039;&#039; queues. Implementors are recommended to aim&lt;br /&gt;
for deliver-&#039;&#039;at-least-once&#039;&#039; semantics.&lt;br /&gt;
&lt;br /&gt;
== Appendix A: Everything in Bullet Points ==&lt;br /&gt;
&lt;br /&gt;
This is a summary of the above.&lt;br /&gt;
&lt;br /&gt;
Pulse:&lt;br /&gt;
* MUST offer registration at &amp;lt;code&amp;gt;pulse.mozilla.org&amp;lt;/code&amp;gt;&lt;br /&gt;
* MUST support [https://www.rabbitmq.com/resources/specs/amqp0-9-1.pdf AMQP 0-9-1] and these RabbitMQ extensions:&lt;br /&gt;
** [https://www.rabbitmq.com/confirms.html Confirms]&lt;br /&gt;
** [https://www.rabbitmq.com/consumer-prefetch.html Consumer Prefetch]&lt;br /&gt;
** [https://www.rabbitmq.com/maxlength.html Queue Length Limit]&lt;br /&gt;
** [https://www.rabbitmq.com/sender-selected.html Sender-selected Distribution]&lt;br /&gt;
* SHOULD exhibit deliver-&#039;&#039;at-least-once&#039;&#039; semantics&lt;br /&gt;
* MAY delete queues that grows beyond &#039;&#039;Pulse&#039;&#039; defined limits&lt;br /&gt;
* SHALL notify owner by email when a queue grows close to &#039;&#039;Pulse&#039;&#039;-defined limits.&lt;br /&gt;
&lt;br /&gt;
Publishers:&lt;br /&gt;
* SHOULD use [https://www.rabbitmq.com/confirms.html confirm-publish channels]&lt;br /&gt;
&lt;br /&gt;
Exchanges:&lt;br /&gt;
* MUST be named &amp;lt;code&amp;gt;exchange/&amp;lt;clientId&amp;gt;/&amp;lt;name&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
* MUST be topic exchanges&lt;br /&gt;
* MUST be durable&lt;br /&gt;
&lt;br /&gt;
Messages:&lt;br /&gt;
* MUST be UTF-8-encoded [http://tools.ietf.org/html/rfc7159 JSON]&lt;br /&gt;
* MUST carry &amp;lt;code&amp;gt;application/json&amp;lt;/code&amp;gt; as &amp;lt;code&amp;gt;Content-Type&amp;lt;/code&amp;gt;&lt;br /&gt;
* SHOULD be durable&lt;br /&gt;
* SHOULD be less than 8 KiB (for good performance)&lt;br /&gt;
* MAY be CC&#039;ed to [https://www.rabbitmq.com/sender-selected.html multiple routing keys]&lt;br /&gt;
* MUST NOT contain private or sensitive information&lt;br /&gt;
* SHOULD have a routing key where fields have a fixed index from the left&lt;br /&gt;
&lt;br /&gt;
Subscribers:&lt;br /&gt;
* SHOULD specify a [https://www.rabbitmq.com/consumer-prefetch.html &#039;&#039;consumer prefetch&#039;&#039; limit]&lt;br /&gt;
&lt;br /&gt;
Queues:&lt;br /&gt;
* MUST be named &amp;lt;code&amp;gt;queue/&amp;lt;clientId&amp;gt;/&amp;lt;name&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
* MAY have a [https://www.rabbitmq.com/maxlength.html limited length]&lt;br /&gt;
* MUST not grow unbounded&lt;br /&gt;
&lt;br /&gt;
= Let&#039;s Use It =&lt;br /&gt;
&lt;br /&gt;
There are currently two Pulse clients available. Please note that you can also connect to Pulse in other languages, provided you have an AMQP 0.9.1 library that will let you interact with AMQP exchanges. See https://github.com/rabbitmq/rabbitmq-tutorials#languages for example.&lt;br /&gt;
&lt;br /&gt;
== Python Pulse client library ==&lt;br /&gt;
&lt;br /&gt;
The [https://github.com/mozilla-services/mozillapulse mozillapulse] Python package provides classes for existing publishers, consumers, and messages so you can quickly build Pulse applications.  See the [https://github.com/mozilla-services/mozillapulse/blob/master/README.md README] to get started (although note that the test publisher is currently offline; see {{bug|1218976}}.  You can use another consumer, e.g. BuildConsumer, to verify your setup.).&lt;br /&gt;
&lt;br /&gt;
This library is somewhat inflexible, however, and should be rewritten. One idea is to turn TaskCluster&#039;s Python client into a standalone package.&lt;br /&gt;
&lt;br /&gt;
== Go (golang) Pulse client library ==&lt;br /&gt;
&lt;br /&gt;
This can be found here:&lt;br /&gt;
* http://taskcluster.github.io/pulse-go/&lt;br /&gt;
&lt;br /&gt;
Extensions for TaskCluster exchanges here (see section &amp;quot;AMQP APIs&amp;quot;):&lt;br /&gt;
* http://taskcluster.github.io/taskcluster-client-go/&lt;br /&gt;
&lt;br /&gt;
= Contributing =&lt;br /&gt;
&lt;br /&gt;
To set up a local system for development, see the [https://github.com/mozilla-services/mozillapulse/blob/master/HACKING.md HACKING.md] file included in the mozillapulse source.&lt;br /&gt;
&lt;br /&gt;
The main Pulse library (mozillapulse) and publisher shims (pulseshims) are written in Python, although there is also a Go library as mentioned in the section above.  We also want to provide a canonical JavaScript library at some point.  To hack on the main Pulse library, you should be comfortable in Python, and it&#039;s helpful to understand the basics of AMQP.  Knowledge of kombu is also useful.&lt;br /&gt;
&lt;br /&gt;
To hack on PulseGuardian, you should know some Python and JavaScript.  Experience with Flask, SQLAlchemy, and RabbitMQ are useful, but you can probably learn what you need as you fix bugs.&lt;br /&gt;
&lt;br /&gt;
Feel free to stop by #pulse or #ateam with questions!&lt;br /&gt;
&lt;br /&gt;
Here is the list of open, unassigned, mentored Pulse and PulseGuardian bugs to get you started.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;bugzilla&amp;gt;&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;quicksearch&amp;quot;: &amp;quot;status:new&amp;quot;,&lt;br /&gt;
        &amp;quot;product&amp;quot;: &amp;quot;Webtools&amp;quot;,&lt;br /&gt;
        &amp;quot;component&amp;quot;: &amp;quot;Pulse&amp;quot;,&lt;br /&gt;
        &amp;quot;f1&amp;quot;: &amp;quot;bug_mentor&amp;quot;,&lt;br /&gt;
        &amp;quot;o1&amp;quot;: &amp;quot;isnotempty&amp;quot;,&lt;br /&gt;
        &amp;quot;include_fields&amp;quot;: &amp;quot;id,summary,priority,status&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/bugzilla&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Once you have your feet wet and are ready to take on a more involved project, here is a list of all current Pulse bugs:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;bugzilla&amp;gt;&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;quicksearch&amp;quot;: &amp;quot;status:new,assigned,reopened,unconfirmed&amp;quot;,&lt;br /&gt;
        &amp;quot;product&amp;quot;: &amp;quot;Webtools&amp;quot;,&lt;br /&gt;
        &amp;quot;component&amp;quot;: &amp;quot;Pulse&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/bugzilla&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For mentored bugs, we use the User Story to provide a link back to this page, as well as any extra information for contributors, such as required knowledge or tools.  The basic text for mentored bugs should be &amp;quot;This is a mentored Pulse bug.  For general information on Pulse, see https://wiki.mozilla.org/Auto-tools/Projects/Pulse, which includes a section on Contributing.&amp;quot;  An example of extra text is &amp;quot;This bug also requires you to have a working mail server.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
= Road Map =&lt;br /&gt;
&lt;br /&gt;
See the [https://bugzilla.mozilla.org/buglist.cgi?resolution=---&amp;amp;query_format=advanced&amp;amp;component=Pulse&amp;amp;product=Webtools prioritized bug list] for all open issues and feature requests.&lt;br /&gt;
&lt;br /&gt;
= Security Model =&lt;br /&gt;
&lt;br /&gt;
This is summarized in the formal Pulse specification above.  What follows is the rationale and some technical implementation notes.&lt;br /&gt;
&lt;br /&gt;
In order to have a reliable, well behaved system, the following assertions will need to be true.&lt;br /&gt;
&lt;br /&gt;
* All users, publishers and consumers alike, must have their own accounts (no guest/public users).&lt;br /&gt;
* Only publishers should be able to declare exchanges.&lt;br /&gt;
* Only the publisher user account associated with a particular vhost should be allowed to publish messages to exchanges in the vhost.  In other words, exactly one user account should be allowed to publish messages within a given vhost.&lt;br /&gt;
* Only the user that created a particular queue should be allowed to consume from it.&lt;br /&gt;
&lt;br /&gt;
Since exchange and queue permissions go together, we&#039;ll need exchange and queue naming conventions mixed with restrictive permissions.  Each user will be restricted to a particular exchange and queue naming prefix.  Many users will be either consumers or publishers, but for simplicity, each user can do both.  Users will have full permissions on &amp;lt;code&amp;gt;&amp;quot;^exchange/&amp;lt;username&amp;gt;/.*$&amp;quot;&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;&amp;quot;^queue/&amp;lt;username&amp;gt;/.*$&amp;quot;&amp;lt;/code&amp;gt;.  They will also have read permissions to exchange/*.  This will both prevent users from writing to other users&#039; exchanges as well as prevent them from consuming from other users&#039; queues.  For convenience, if a consumer creates a nondurable queue, mozillapulse can assign a random suffix to the user&#039;s standard queue name prefix, i.e. &amp;lt;code&amp;gt;queue/&amp;lt;username&amp;gt;/&amp;lt;random string&amp;gt;&amp;lt;/code&amp;gt;, since the user wouldn&#039;t be able to create nor access a completely random server-assigned name.&lt;br /&gt;
&lt;br /&gt;
Note that this doesn&#039;t prevent a consumer from creating an exchange named as a queue, since the permission model doesn&#039;t distinguish between queues and exchanges, and consumers need the ability to create queues.  This is not particularly problematic, since no one would have permission to use that exchange.&lt;br /&gt;
&lt;br /&gt;
With this security model, we technically don&#039;t really need vhosts, since the names of the queues and exchanges the users can use are so specific.  There may still be a benefit in allowing apps to use the same queue name for different exchanges, though, which would be possible if each exchange had its own vhost.  The downside is that you cannot specify &amp;quot;all vhosts&amp;quot; when setting a user&#039;s permissions, so they would either have to list all vhosts they want to use when creating the user in PulseGuardian, and be able to update that list later, or PulseGuardian or some other app would have to automatically add new permissions to all users when a vhost is created.&lt;br /&gt;
&lt;br /&gt;
= Admin Procedures =&lt;br /&gt;
&lt;br /&gt;
kmoir and glob have access to the Pulse cluster on CloudAMQP and the following related services:&lt;br /&gt;
&lt;br /&gt;
* PulseGuardian should be deleting queues that are too long. If you need to manually delete a queue, use the Management UI. Try to ping the queue owner first before killing if possible.&lt;br /&gt;
&lt;br /&gt;
== To upgrade a ssl certificate on pulse.mozilla.org ==&lt;br /&gt;
&lt;br /&gt;
Open a bug with IT to generate a new certificate &lt;br /&gt;
{{bug|1532325}}&lt;br /&gt;
&lt;br /&gt;
IT needs to email support@cloudamqp.com with the new cert.  The cloudampq support team will install it on all our of cloudampq nodes.  After it has been installed, you can login to the administrative start the nodes one by one which will not result any downtime.  (Ensure you wait for the node to restart before restarting another one.)  Verify that the certs are installed on the nodes&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* https://sslanalyzer.comodoca.com/?url=pulse.mozilla.org&lt;br /&gt;
* https://sslanalyzer.comodoca.com/?url=orange-antelope-01.rmq.cloudamqp.com&lt;br /&gt;
* https://sslanalyzer.comodoca.com/?url=orange-antelope-02.rmq.cloudamqp.com&lt;br /&gt;
* https://sslanalyzer.comodoca.com/?url=orange-antelope-01.rmq.cloudamqp.com&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
This should show the dates for the new certificate and that the cert is trusted by Mozilla and Microsoft.&lt;br /&gt;
&lt;br /&gt;
= More reading =&lt;br /&gt;
&lt;br /&gt;
* [http://slides.com/mcote/pulse Slides] from a presentation on Pulse.&lt;br /&gt;
* [https://mrcote.info/blog/2015/02/16/pulse-update/ Update] on Pulse from 2015/02/16.&lt;br /&gt;
&lt;br /&gt;
LegNeato also wrote several blog posts on Pulse as he was building it.  They contain some more background if you&#039;re really interested.  They are linked below, in chronological order.&lt;br /&gt;
&lt;br /&gt;
* [http://christian.legnitto.com/blog/2010/07/17/mozilla-pulse-and-rabbitmq/ Mozilla Pulse and RabbitMQ]&lt;br /&gt;
* [http://christian.legnitto.com/blog/2010/08/20/push-notifications-for-bugzilla/ Push notifications for Bugzilla]&lt;br /&gt;
** This idea has been shelved for the time being, both due to security issues and performance.  See [[BMO/ChangeNotificationSystem]] for an alternative.&lt;br /&gt;
* [http://christian.legnitto.com/blog/2010/09/10/bugzilla-amqp-is-now-buzgilla-push-supports-the-stomp-protocol/ bugzilla-amqp is now buzgilla-push, supports the STOMP protocol]&lt;br /&gt;
** See above note.  Just keeping these links for interest&#039;s sake.&lt;br /&gt;
* [http://christian.legnitto.com/blog/2010/10/15/whats-up-with-pulse/ What’s up with Pulse?]&lt;br /&gt;
* [http://christian.legnitto.com/blog/2010/11/23/github-amqp-integration-service-hook-live/ GitHub AMQP integration service hook live!]&lt;br /&gt;
** Tangentially related to Pulse.&lt;br /&gt;
* [http://christian.legnitto.com/blog/2010/12/06/lots-of-pulse-changes-out-of-prototype-mode-this-week/ Lots of Pulse changes, out of prototype mode this week!]&lt;br /&gt;
* [http://christian.legnitto.com/blog/2010/12/22/another-update-on-pulse/ Another update on Pulse]&lt;/div&gt;</summary>
		<author><name>Kmoir</name></author>
	</entry>
	<entry>
		<id>https://wiki.mozilla.org/index.php?title=Auto-tools/Projects/Pulse&amp;diff=1209083</id>
		<title>Auto-tools/Projects/Pulse</title>
		<link rel="alternate" type="text/html" href="https://wiki.mozilla.org/index.php?title=Auto-tools/Projects/Pulse&amp;diff=1209083"/>
		<updated>2019-03-18T15:39:09Z</updated>

		<summary type="html">&lt;p&gt;Kmoir: /* To upgrade a ssl certificate on pulse.mozilla.org */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Introducing Pulse =&lt;br /&gt;
&lt;br /&gt;
Pulse is a managed [http://www.rabbitmq.com RabbitMQ] cluster designed to provide loose coupling between automation and infrastructure tools.  The goal of Pulse is to add visibility to Mozilla&#039;s tools and systems and to eliminate polling and other brittle methods of scraping data. This allows more robust, dynamic, and informative tools.&lt;br /&gt;
&lt;br /&gt;
Pulse is available at pulse.mozilla.org:5671 (AMQP over SSL).  It is hosted by [http://cloudamqp.com CloudAMQP].&lt;br /&gt;
&lt;br /&gt;
[[Auto-tools/Projects/Pulse/PulseGuardian|PulseGuardian]] is a tool that manages Pulse&#039;s users and queues (and eventually exchanges).  It is available at https://pulseguardian.mozilla.org and hosted by [http://heroku.com Heroku].&lt;br /&gt;
&lt;br /&gt;
We have a discussion forum available via the standard trio of [news:mozilla.tools.pulse USENET newsgroup], [https://lists.mozilla.org/listinfo/tools-pulse mailing list], and [https://groups.google.com/forum/#!forum/mozilla.tools.pulse Google Group].&lt;br /&gt;
&lt;br /&gt;
File bugs under [https://bugzilla.mozilla.org/enter_bug.cgi?product=Webtools&amp;amp;component=Pulse Webtools :: Pulse].  We don&#039;t have a separate component for PulseGuardian; rather, we just start the summaries with &amp;quot;[PulseGuardian]&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Also see the [https://tools.taskcluster.net/pulse-inspector/ Pulse Inspector] web app, which displays Pulse messages in real time, and the (manually updated) [[/Exchanges|list of Pulse exchanges]].&lt;br /&gt;
&lt;br /&gt;
= System Description =&lt;br /&gt;
&lt;br /&gt;
Pulse isn&#039;t any one thing.  At its heart, it is a RabbitMQ system with a particular configuration and a set of conventions for using it along with a management tool, [[Auto-tools/Projects/Pulse/PulseGuardian|PulseGuardian]], to make Pulse as automated and self-serve as possible.  Pulse follows the pub-sub pattern, in which publishers send messages to topic exchanges, and consumers create queues bound to these exchanges in order to subscribe to the publishers&#039; messages.  In general, publishers create and own exchanges, and consumers create and own queues.&lt;br /&gt;
&lt;br /&gt;
= Specification =&lt;br /&gt;
&lt;br /&gt;
Pulse is a managed [https://www.rabbitmq.com/resources/specs/amqp0-9-1.pdf AMQP 0-9-1]&lt;br /&gt;
service with [https://www.rabbitmq.com/extensions.html RabbitMQ extensions] for publishing messages from Mozilla&lt;br /&gt;
infrastructure. The aim is provide hooks that subscribers can&lt;br /&gt;
use to integrate and extend Mozilla infrastructure.&lt;br /&gt;
&lt;br /&gt;
== Authentication ==&lt;br /&gt;
&lt;br /&gt;
Pulse credentials are managed and issued by [[Auto-tools/Projects/Pulse/PulseGuardian|PulseGuardian]],&lt;br /&gt;
available at https://pulseguardian.mozilla.org. This service SHALL issue&lt;br /&gt;
an &#039;&#039;accessToken&#039;&#039; for any &#039;&#039;clientId&#039;&#039; that is registered&lt;br /&gt;
with &#039;&#039;authorized&#039;&#039; email address.&lt;br /&gt;
The accessToken is strictly secret and MUST NOT be shared&lt;br /&gt;
publicly. The clientId is not secret. When establishing an AMQP&lt;br /&gt;
connection, the clientId and accessToken MUST be used as&lt;br /&gt;
&#039;&#039;username&#039;&#039; and &#039;&#039;password&#039;&#039;, respectively.&lt;br /&gt;
&lt;br /&gt;
== Authorized Users ==&lt;br /&gt;
&lt;br /&gt;
Pulse is intended to be open to all Mozillians who want to&lt;br /&gt;
extend or integrate with Mozilla infrastructure. To guard against&lt;br /&gt;
abuse PulseGuardian users MUST authenticate via Persona. PulseGuardian SHOULD verify that users have a vouched Mozillians profile.&lt;br /&gt;
&lt;br /&gt;
== Publishers ==&lt;br /&gt;
&lt;br /&gt;
Publishers MUST name &#039;&#039;exchanges&#039;&#039; in the form &amp;lt;code&amp;gt;exchange/&amp;lt;clientId&amp;gt;/&amp;lt;name&amp;gt;&amp;lt;/code&amp;gt; where clientId is the userid used to bind/connect to the server. Attempts to name an exchange otherwise SHALL result in an authorization error. Exchanges MUST be &#039;&#039;topic exchanges&#039;&#039; and they MUST be declared &#039;&#039;durable&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Messages MUST contain a UTF-8-encoded [http://tools.ietf.org/html/rfc7159 JSON] payload, and&lt;br /&gt;
their &amp;lt;code&amp;gt;Content-Type&amp;lt;/code&amp;gt; MUST be &amp;lt;code&amp;gt;application/json&amp;lt;/code&amp;gt;.&lt;br /&gt;
Messages SHOULD NOT be larger than 8&amp;amp;nbsp;kB; deviations may be&lt;br /&gt;
feasible for low-traffic exchanges. Messages MUST NOT contain&lt;br /&gt;
secret or sensitive information; all exchanges and messages&lt;br /&gt;
SHALL be considered public.&lt;br /&gt;
&lt;br /&gt;
A message SHOULD carry a &#039;&#039;routing key&#039;&#039;, in which fields have a&lt;br /&gt;
fixed index from the left. Additionally, a message MAY be&lt;br /&gt;
&#039;&#039;cced&#039;&#039; to multiple routing keys, using the RabbitMQ&lt;br /&gt;
[https://www.rabbitmq.com/sender-selected.html &#039;&#039;Sender-selected Distribution&#039;&#039;] extension.&lt;br /&gt;
&lt;br /&gt;
Messages SHOULD be &#039;&#039;durable&#039;&#039; and SHOULD be published over&lt;br /&gt;
RabbitMQ [https://www.rabbitmq.com/confirms.html &#039;&#039;confirm-publish&#039;&#039; channels]. Otherwise, the&lt;br /&gt;
documentation MUST clearly reflect that messages from the&lt;br /&gt;
given exchange do not exhibit deliver &#039;&#039;at-least-once&#039;&#039; semantics.&lt;br /&gt;
&lt;br /&gt;
== Subscribers ==&lt;br /&gt;
&lt;br /&gt;
Subscribers MUST name &#039;&#039;queues&#039;&#039; in the form&lt;br /&gt;
&amp;lt;code&amp;gt;queue/&amp;lt;clientId&amp;gt;/&amp;lt;name&amp;gt;&amp;lt;/code&amp;gt;; attempts to name a queue otherwise&lt;br /&gt;
SHALL result in an authorization error. Queues MAY &#039;&#039;consume&#039;&#039;&lt;br /&gt;
from any exchange prefixed &amp;lt;code&amp;gt;exchange/&amp;lt;/code&amp;gt;; attempts to consume&lt;br /&gt;
from any other exchange SHALL result in an authentication error.&lt;br /&gt;
&lt;br /&gt;
Subscribers MAY limit the size of their queues using the RabbitMQ&lt;br /&gt;
[https://www.rabbitmq.com/maxlength.html &#039;&#039;Queue Length Limit&#039;&#039;] extension. Subscribers MUST NOT let&lt;br /&gt;
their queues grow unbounded; if left unattended, &#039;&#039;Pulse&#039;&#039;&lt;br /&gt;
SHALL notify the owner by email. Additionally, &#039;&#039;Pulse&#039;&#039; MAY delete&lt;br /&gt;
a queue which exceeds defined limits. Subscribers SHOULD specify a&lt;br /&gt;
prefetch limit using the RabbitMQ [https://www.rabbitmq.com/consumer-prefetch.html &#039;&#039;Consumer Prefetch&#039;&#039; limit] extension.&lt;br /&gt;
&lt;br /&gt;
Subscribers SHOULD use either &#039;&#039;durable&#039;&#039; queues or&lt;br /&gt;
&#039;&#039;auto-delete&#039;&#039; queues. Implementors are recommended to aim&lt;br /&gt;
for deliver-&#039;&#039;at-least-once&#039;&#039; semantics.&lt;br /&gt;
&lt;br /&gt;
== Appendix A: Everything in Bullet Points ==&lt;br /&gt;
&lt;br /&gt;
This is a summary of the above.&lt;br /&gt;
&lt;br /&gt;
Pulse:&lt;br /&gt;
* MUST offer registration at &amp;lt;code&amp;gt;pulse.mozilla.org&amp;lt;/code&amp;gt;&lt;br /&gt;
* MUST support [https://www.rabbitmq.com/resources/specs/amqp0-9-1.pdf AMQP 0-9-1] and these RabbitMQ extensions:&lt;br /&gt;
** [https://www.rabbitmq.com/confirms.html Confirms]&lt;br /&gt;
** [https://www.rabbitmq.com/consumer-prefetch.html Consumer Prefetch]&lt;br /&gt;
** [https://www.rabbitmq.com/maxlength.html Queue Length Limit]&lt;br /&gt;
** [https://www.rabbitmq.com/sender-selected.html Sender-selected Distribution]&lt;br /&gt;
* SHOULD exhibit deliver-&#039;&#039;at-least-once&#039;&#039; semantics&lt;br /&gt;
* MAY delete queues that grows beyond &#039;&#039;Pulse&#039;&#039; defined limits&lt;br /&gt;
* SHALL notify owner by email when a queue grows close to &#039;&#039;Pulse&#039;&#039;-defined limits.&lt;br /&gt;
&lt;br /&gt;
Publishers:&lt;br /&gt;
* SHOULD use [https://www.rabbitmq.com/confirms.html confirm-publish channels]&lt;br /&gt;
&lt;br /&gt;
Exchanges:&lt;br /&gt;
* MUST be named &amp;lt;code&amp;gt;exchange/&amp;lt;clientId&amp;gt;/&amp;lt;name&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
* MUST be topic exchanges&lt;br /&gt;
* MUST be durable&lt;br /&gt;
&lt;br /&gt;
Messages:&lt;br /&gt;
* MUST be UTF-8-encoded [http://tools.ietf.org/html/rfc7159 JSON]&lt;br /&gt;
* MUST carry &amp;lt;code&amp;gt;application/json&amp;lt;/code&amp;gt; as &amp;lt;code&amp;gt;Content-Type&amp;lt;/code&amp;gt;&lt;br /&gt;
* SHOULD be durable&lt;br /&gt;
* SHOULD be less than 8 KiB (for good performance)&lt;br /&gt;
* MAY be CC&#039;ed to [https://www.rabbitmq.com/sender-selected.html multiple routing keys]&lt;br /&gt;
* MUST NOT contain private or sensitive information&lt;br /&gt;
* SHOULD have a routing key where fields have a fixed index from the left&lt;br /&gt;
&lt;br /&gt;
Subscribers:&lt;br /&gt;
* SHOULD specify a [https://www.rabbitmq.com/consumer-prefetch.html &#039;&#039;consumer prefetch&#039;&#039; limit]&lt;br /&gt;
&lt;br /&gt;
Queues:&lt;br /&gt;
* MUST be named &amp;lt;code&amp;gt;queue/&amp;lt;clientId&amp;gt;/&amp;lt;name&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
* MAY have a [https://www.rabbitmq.com/maxlength.html limited length]&lt;br /&gt;
* MUST not grow unbounded&lt;br /&gt;
&lt;br /&gt;
= Let&#039;s Use It =&lt;br /&gt;
&lt;br /&gt;
There are currently two Pulse clients available. Please note that you can also connect to Pulse in other languages, provided you have an AMQP 0.9.1 library that will let you interact with AMQP exchanges. See https://github.com/rabbitmq/rabbitmq-tutorials#languages for example.&lt;br /&gt;
&lt;br /&gt;
== Python Pulse client library ==&lt;br /&gt;
&lt;br /&gt;
The [https://github.com/mozilla-services/mozillapulse mozillapulse] Python package provides classes for existing publishers, consumers, and messages so you can quickly build Pulse applications.  See the [https://github.com/mozilla-services/mozillapulse/blob/master/README.md README] to get started (although note that the test publisher is currently offline; see {{bug|1218976}}.  You can use another consumer, e.g. BuildConsumer, to verify your setup.).&lt;br /&gt;
&lt;br /&gt;
This library is somewhat inflexible, however, and should be rewritten. One idea is to turn TaskCluster&#039;s Python client into a standalone package.&lt;br /&gt;
&lt;br /&gt;
== Go (golang) Pulse client library ==&lt;br /&gt;
&lt;br /&gt;
This can be found here:&lt;br /&gt;
* http://taskcluster.github.io/pulse-go/&lt;br /&gt;
&lt;br /&gt;
Extensions for TaskCluster exchanges here (see section &amp;quot;AMQP APIs&amp;quot;):&lt;br /&gt;
* http://taskcluster.github.io/taskcluster-client-go/&lt;br /&gt;
&lt;br /&gt;
= Contributing =&lt;br /&gt;
&lt;br /&gt;
To set up a local system for development, see the [https://github.com/mozilla-services/mozillapulse/blob/master/HACKING.md HACKING.md] file included in the mozillapulse source.&lt;br /&gt;
&lt;br /&gt;
The main Pulse library (mozillapulse) and publisher shims (pulseshims) are written in Python, although there is also a Go library as mentioned in the section above.  We also want to provide a canonical JavaScript library at some point.  To hack on the main Pulse library, you should be comfortable in Python, and it&#039;s helpful to understand the basics of AMQP.  Knowledge of kombu is also useful.&lt;br /&gt;
&lt;br /&gt;
To hack on PulseGuardian, you should know some Python and JavaScript.  Experience with Flask, SQLAlchemy, and RabbitMQ are useful, but you can probably learn what you need as you fix bugs.&lt;br /&gt;
&lt;br /&gt;
Feel free to stop by #pulse or #ateam with questions!&lt;br /&gt;
&lt;br /&gt;
Here is the list of open, unassigned, mentored Pulse and PulseGuardian bugs to get you started.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;bugzilla&amp;gt;&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;quicksearch&amp;quot;: &amp;quot;status:new&amp;quot;,&lt;br /&gt;
        &amp;quot;product&amp;quot;: &amp;quot;Webtools&amp;quot;,&lt;br /&gt;
        &amp;quot;component&amp;quot;: &amp;quot;Pulse&amp;quot;,&lt;br /&gt;
        &amp;quot;f1&amp;quot;: &amp;quot;bug_mentor&amp;quot;,&lt;br /&gt;
        &amp;quot;o1&amp;quot;: &amp;quot;isnotempty&amp;quot;,&lt;br /&gt;
        &amp;quot;include_fields&amp;quot;: &amp;quot;id,summary,priority,status&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/bugzilla&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Once you have your feet wet and are ready to take on a more involved project, here is a list of all current Pulse bugs:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;bugzilla&amp;gt;&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;quicksearch&amp;quot;: &amp;quot;status:new,assigned,reopened,unconfirmed&amp;quot;,&lt;br /&gt;
        &amp;quot;product&amp;quot;: &amp;quot;Webtools&amp;quot;,&lt;br /&gt;
        &amp;quot;component&amp;quot;: &amp;quot;Pulse&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/bugzilla&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For mentored bugs, we use the User Story to provide a link back to this page, as well as any extra information for contributors, such as required knowledge or tools.  The basic text for mentored bugs should be &amp;quot;This is a mentored Pulse bug.  For general information on Pulse, see https://wiki.mozilla.org/Auto-tools/Projects/Pulse, which includes a section on Contributing.&amp;quot;  An example of extra text is &amp;quot;This bug also requires you to have a working mail server.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
= Road Map =&lt;br /&gt;
&lt;br /&gt;
See the [https://bugzilla.mozilla.org/buglist.cgi?resolution=---&amp;amp;query_format=advanced&amp;amp;component=Pulse&amp;amp;product=Webtools prioritized bug list] for all open issues and feature requests.&lt;br /&gt;
&lt;br /&gt;
= Security Model =&lt;br /&gt;
&lt;br /&gt;
This is summarized in the formal Pulse specification above.  What follows is the rationale and some technical implementation notes.&lt;br /&gt;
&lt;br /&gt;
In order to have a reliable, well behaved system, the following assertions will need to be true.&lt;br /&gt;
&lt;br /&gt;
* All users, publishers and consumers alike, must have their own accounts (no guest/public users).&lt;br /&gt;
* Only publishers should be able to declare exchanges.&lt;br /&gt;
* Only the publisher user account associated with a particular vhost should be allowed to publish messages to exchanges in the vhost.  In other words, exactly one user account should be allowed to publish messages within a given vhost.&lt;br /&gt;
* Only the user that created a particular queue should be allowed to consume from it.&lt;br /&gt;
&lt;br /&gt;
Since exchange and queue permissions go together, we&#039;ll need exchange and queue naming conventions mixed with restrictive permissions.  Each user will be restricted to a particular exchange and queue naming prefix.  Many users will be either consumers or publishers, but for simplicity, each user can do both.  Users will have full permissions on &amp;lt;code&amp;gt;&amp;quot;^exchange/&amp;lt;username&amp;gt;/.*$&amp;quot;&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;&amp;quot;^queue/&amp;lt;username&amp;gt;/.*$&amp;quot;&amp;lt;/code&amp;gt;.  They will also have read permissions to exchange/*.  This will both prevent users from writing to other users&#039; exchanges as well as prevent them from consuming from other users&#039; queues.  For convenience, if a consumer creates a nondurable queue, mozillapulse can assign a random suffix to the user&#039;s standard queue name prefix, i.e. &amp;lt;code&amp;gt;queue/&amp;lt;username&amp;gt;/&amp;lt;random string&amp;gt;&amp;lt;/code&amp;gt;, since the user wouldn&#039;t be able to create nor access a completely random server-assigned name.&lt;br /&gt;
&lt;br /&gt;
Note that this doesn&#039;t prevent a consumer from creating an exchange named as a queue, since the permission model doesn&#039;t distinguish between queues and exchanges, and consumers need the ability to create queues.  This is not particularly problematic, since no one would have permission to use that exchange.&lt;br /&gt;
&lt;br /&gt;
With this security model, we technically don&#039;t really need vhosts, since the names of the queues and exchanges the users can use are so specific.  There may still be a benefit in allowing apps to use the same queue name for different exchanges, though, which would be possible if each exchange had its own vhost.  The downside is that you cannot specify &amp;quot;all vhosts&amp;quot; when setting a user&#039;s permissions, so they would either have to list all vhosts they want to use when creating the user in PulseGuardian, and be able to update that list later, or PulseGuardian or some other app would have to automatically add new permissions to all users when a vhost is created.&lt;br /&gt;
&lt;br /&gt;
= Admin Procedures =&lt;br /&gt;
&lt;br /&gt;
kmoir and glob have access to the Pulse cluster on CloudAMQP and the following related services:&lt;br /&gt;
&lt;br /&gt;
* PulseGuardian should be deleting queues that are too long. If you need to manually delete a queue, use the Management UI. Try to ping the queue owner first before killing if possible.&lt;br /&gt;
&lt;br /&gt;
== To upgrade a ssl certificate on pulse.mozilla.org ==&lt;br /&gt;
&lt;br /&gt;
Open a bug with IT to generate a new certificate &lt;br /&gt;
{{bug|1532325}}&lt;br /&gt;
&lt;br /&gt;
IT needs to email support@cloudamqp.com with the new cert.  The cloudampq support team will install it on all our of cloudampq nodes.  After it has been installed, you can login to the administrative start the nodes one by one which will not result any downtime.  (Ensure you wait for the node to restart before restarting another one.)  Verify that the certs are installed on the nodes&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
https://sslanalyzer.comodoca.com/?url=pulse.mozilla.org&lt;br /&gt;
https://sslanalyzer.comodoca.com/?url=orange-antelope-01.rmq.cloudamqp.com&lt;br /&gt;
https://sslanalyzer.comodoca.com/?url=orange-antelope-02.rmq.cloudamqp.com&lt;br /&gt;
https://sslanalyzer.comodoca.com/?url=orange-antelope-01.rmq.cloudamqp.com&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This should show the dates for the new certificate and that the cert is trusted by Mozilla and Microsoft.&lt;br /&gt;
&lt;br /&gt;
= More reading =&lt;br /&gt;
&lt;br /&gt;
* [http://slides.com/mcote/pulse Slides] from a presentation on Pulse.&lt;br /&gt;
* [https://mrcote.info/blog/2015/02/16/pulse-update/ Update] on Pulse from 2015/02/16.&lt;br /&gt;
&lt;br /&gt;
LegNeato also wrote several blog posts on Pulse as he was building it.  They contain some more background if you&#039;re really interested.  They are linked below, in chronological order.&lt;br /&gt;
&lt;br /&gt;
* [http://christian.legnitto.com/blog/2010/07/17/mozilla-pulse-and-rabbitmq/ Mozilla Pulse and RabbitMQ]&lt;br /&gt;
* [http://christian.legnitto.com/blog/2010/08/20/push-notifications-for-bugzilla/ Push notifications for Bugzilla]&lt;br /&gt;
** This idea has been shelved for the time being, both due to security issues and performance.  See [[BMO/ChangeNotificationSystem]] for an alternative.&lt;br /&gt;
* [http://christian.legnitto.com/blog/2010/09/10/bugzilla-amqp-is-now-buzgilla-push-supports-the-stomp-protocol/ bugzilla-amqp is now buzgilla-push, supports the STOMP protocol]&lt;br /&gt;
** See above note.  Just keeping these links for interest&#039;s sake.&lt;br /&gt;
* [http://christian.legnitto.com/blog/2010/10/15/whats-up-with-pulse/ What’s up with Pulse?]&lt;br /&gt;
* [http://christian.legnitto.com/blog/2010/11/23/github-amqp-integration-service-hook-live/ GitHub AMQP integration service hook live!]&lt;br /&gt;
** Tangentially related to Pulse.&lt;br /&gt;
* [http://christian.legnitto.com/blog/2010/12/06/lots-of-pulse-changes-out-of-prototype-mode-this-week/ Lots of Pulse changes, out of prototype mode this week!]&lt;br /&gt;
* [http://christian.legnitto.com/blog/2010/12/22/another-update-on-pulse/ Another update on Pulse]&lt;/div&gt;</summary>
		<author><name>Kmoir</name></author>
	</entry>
	<entry>
		<id>https://wiki.mozilla.org/index.php?title=Auto-tools/Projects/Pulse&amp;diff=1209082</id>
		<title>Auto-tools/Projects/Pulse</title>
		<link rel="alternate" type="text/html" href="https://wiki.mozilla.org/index.php?title=Auto-tools/Projects/Pulse&amp;diff=1209082"/>
		<updated>2019-03-18T15:38:53Z</updated>

		<summary type="html">&lt;p&gt;Kmoir: /* To upgrade a ssl certificate on pulse.mozilla.org */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Introducing Pulse =&lt;br /&gt;
&lt;br /&gt;
Pulse is a managed [http://www.rabbitmq.com RabbitMQ] cluster designed to provide loose coupling between automation and infrastructure tools.  The goal of Pulse is to add visibility to Mozilla&#039;s tools and systems and to eliminate polling and other brittle methods of scraping data. This allows more robust, dynamic, and informative tools.&lt;br /&gt;
&lt;br /&gt;
Pulse is available at pulse.mozilla.org:5671 (AMQP over SSL).  It is hosted by [http://cloudamqp.com CloudAMQP].&lt;br /&gt;
&lt;br /&gt;
[[Auto-tools/Projects/Pulse/PulseGuardian|PulseGuardian]] is a tool that manages Pulse&#039;s users and queues (and eventually exchanges).  It is available at https://pulseguardian.mozilla.org and hosted by [http://heroku.com Heroku].&lt;br /&gt;
&lt;br /&gt;
We have a discussion forum available via the standard trio of [news:mozilla.tools.pulse USENET newsgroup], [https://lists.mozilla.org/listinfo/tools-pulse mailing list], and [https://groups.google.com/forum/#!forum/mozilla.tools.pulse Google Group].&lt;br /&gt;
&lt;br /&gt;
File bugs under [https://bugzilla.mozilla.org/enter_bug.cgi?product=Webtools&amp;amp;component=Pulse Webtools :: Pulse].  We don&#039;t have a separate component for PulseGuardian; rather, we just start the summaries with &amp;quot;[PulseGuardian]&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Also see the [https://tools.taskcluster.net/pulse-inspector/ Pulse Inspector] web app, which displays Pulse messages in real time, and the (manually updated) [[/Exchanges|list of Pulse exchanges]].&lt;br /&gt;
&lt;br /&gt;
= System Description =&lt;br /&gt;
&lt;br /&gt;
Pulse isn&#039;t any one thing.  At its heart, it is a RabbitMQ system with a particular configuration and a set of conventions for using it along with a management tool, [[Auto-tools/Projects/Pulse/PulseGuardian|PulseGuardian]], to make Pulse as automated and self-serve as possible.  Pulse follows the pub-sub pattern, in which publishers send messages to topic exchanges, and consumers create queues bound to these exchanges in order to subscribe to the publishers&#039; messages.  In general, publishers create and own exchanges, and consumers create and own queues.&lt;br /&gt;
&lt;br /&gt;
= Specification =&lt;br /&gt;
&lt;br /&gt;
Pulse is a managed [https://www.rabbitmq.com/resources/specs/amqp0-9-1.pdf AMQP 0-9-1]&lt;br /&gt;
service with [https://www.rabbitmq.com/extensions.html RabbitMQ extensions] for publishing messages from Mozilla&lt;br /&gt;
infrastructure. The aim is provide hooks that subscribers can&lt;br /&gt;
use to integrate and extend Mozilla infrastructure.&lt;br /&gt;
&lt;br /&gt;
== Authentication ==&lt;br /&gt;
&lt;br /&gt;
Pulse credentials are managed and issued by [[Auto-tools/Projects/Pulse/PulseGuardian|PulseGuardian]],&lt;br /&gt;
available at https://pulseguardian.mozilla.org. This service SHALL issue&lt;br /&gt;
an &#039;&#039;accessToken&#039;&#039; for any &#039;&#039;clientId&#039;&#039; that is registered&lt;br /&gt;
with &#039;&#039;authorized&#039;&#039; email address.&lt;br /&gt;
The accessToken is strictly secret and MUST NOT be shared&lt;br /&gt;
publicly. The clientId is not secret. When establishing an AMQP&lt;br /&gt;
connection, the clientId and accessToken MUST be used as&lt;br /&gt;
&#039;&#039;username&#039;&#039; and &#039;&#039;password&#039;&#039;, respectively.&lt;br /&gt;
&lt;br /&gt;
== Authorized Users ==&lt;br /&gt;
&lt;br /&gt;
Pulse is intended to be open to all Mozillians who want to&lt;br /&gt;
extend or integrate with Mozilla infrastructure. To guard against&lt;br /&gt;
abuse PulseGuardian users MUST authenticate via Persona. PulseGuardian SHOULD verify that users have a vouched Mozillians profile.&lt;br /&gt;
&lt;br /&gt;
== Publishers ==&lt;br /&gt;
&lt;br /&gt;
Publishers MUST name &#039;&#039;exchanges&#039;&#039; in the form &amp;lt;code&amp;gt;exchange/&amp;lt;clientId&amp;gt;/&amp;lt;name&amp;gt;&amp;lt;/code&amp;gt; where clientId is the userid used to bind/connect to the server. Attempts to name an exchange otherwise SHALL result in an authorization error. Exchanges MUST be &#039;&#039;topic exchanges&#039;&#039; and they MUST be declared &#039;&#039;durable&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Messages MUST contain a UTF-8-encoded [http://tools.ietf.org/html/rfc7159 JSON] payload, and&lt;br /&gt;
their &amp;lt;code&amp;gt;Content-Type&amp;lt;/code&amp;gt; MUST be &amp;lt;code&amp;gt;application/json&amp;lt;/code&amp;gt;.&lt;br /&gt;
Messages SHOULD NOT be larger than 8&amp;amp;nbsp;kB; deviations may be&lt;br /&gt;
feasible for low-traffic exchanges. Messages MUST NOT contain&lt;br /&gt;
secret or sensitive information; all exchanges and messages&lt;br /&gt;
SHALL be considered public.&lt;br /&gt;
&lt;br /&gt;
A message SHOULD carry a &#039;&#039;routing key&#039;&#039;, in which fields have a&lt;br /&gt;
fixed index from the left. Additionally, a message MAY be&lt;br /&gt;
&#039;&#039;cced&#039;&#039; to multiple routing keys, using the RabbitMQ&lt;br /&gt;
[https://www.rabbitmq.com/sender-selected.html &#039;&#039;Sender-selected Distribution&#039;&#039;] extension.&lt;br /&gt;
&lt;br /&gt;
Messages SHOULD be &#039;&#039;durable&#039;&#039; and SHOULD be published over&lt;br /&gt;
RabbitMQ [https://www.rabbitmq.com/confirms.html &#039;&#039;confirm-publish&#039;&#039; channels]. Otherwise, the&lt;br /&gt;
documentation MUST clearly reflect that messages from the&lt;br /&gt;
given exchange do not exhibit deliver &#039;&#039;at-least-once&#039;&#039; semantics.&lt;br /&gt;
&lt;br /&gt;
== Subscribers ==&lt;br /&gt;
&lt;br /&gt;
Subscribers MUST name &#039;&#039;queues&#039;&#039; in the form&lt;br /&gt;
&amp;lt;code&amp;gt;queue/&amp;lt;clientId&amp;gt;/&amp;lt;name&amp;gt;&amp;lt;/code&amp;gt;; attempts to name a queue otherwise&lt;br /&gt;
SHALL result in an authorization error. Queues MAY &#039;&#039;consume&#039;&#039;&lt;br /&gt;
from any exchange prefixed &amp;lt;code&amp;gt;exchange/&amp;lt;/code&amp;gt;; attempts to consume&lt;br /&gt;
from any other exchange SHALL result in an authentication error.&lt;br /&gt;
&lt;br /&gt;
Subscribers MAY limit the size of their queues using the RabbitMQ&lt;br /&gt;
[https://www.rabbitmq.com/maxlength.html &#039;&#039;Queue Length Limit&#039;&#039;] extension. Subscribers MUST NOT let&lt;br /&gt;
their queues grow unbounded; if left unattended, &#039;&#039;Pulse&#039;&#039;&lt;br /&gt;
SHALL notify the owner by email. Additionally, &#039;&#039;Pulse&#039;&#039; MAY delete&lt;br /&gt;
a queue which exceeds defined limits. Subscribers SHOULD specify a&lt;br /&gt;
prefetch limit using the RabbitMQ [https://www.rabbitmq.com/consumer-prefetch.html &#039;&#039;Consumer Prefetch&#039;&#039; limit] extension.&lt;br /&gt;
&lt;br /&gt;
Subscribers SHOULD use either &#039;&#039;durable&#039;&#039; queues or&lt;br /&gt;
&#039;&#039;auto-delete&#039;&#039; queues. Implementors are recommended to aim&lt;br /&gt;
for deliver-&#039;&#039;at-least-once&#039;&#039; semantics.&lt;br /&gt;
&lt;br /&gt;
== Appendix A: Everything in Bullet Points ==&lt;br /&gt;
&lt;br /&gt;
This is a summary of the above.&lt;br /&gt;
&lt;br /&gt;
Pulse:&lt;br /&gt;
* MUST offer registration at &amp;lt;code&amp;gt;pulse.mozilla.org&amp;lt;/code&amp;gt;&lt;br /&gt;
* MUST support [https://www.rabbitmq.com/resources/specs/amqp0-9-1.pdf AMQP 0-9-1] and these RabbitMQ extensions:&lt;br /&gt;
** [https://www.rabbitmq.com/confirms.html Confirms]&lt;br /&gt;
** [https://www.rabbitmq.com/consumer-prefetch.html Consumer Prefetch]&lt;br /&gt;
** [https://www.rabbitmq.com/maxlength.html Queue Length Limit]&lt;br /&gt;
** [https://www.rabbitmq.com/sender-selected.html Sender-selected Distribution]&lt;br /&gt;
* SHOULD exhibit deliver-&#039;&#039;at-least-once&#039;&#039; semantics&lt;br /&gt;
* MAY delete queues that grows beyond &#039;&#039;Pulse&#039;&#039; defined limits&lt;br /&gt;
* SHALL notify owner by email when a queue grows close to &#039;&#039;Pulse&#039;&#039;-defined limits.&lt;br /&gt;
&lt;br /&gt;
Publishers:&lt;br /&gt;
* SHOULD use [https://www.rabbitmq.com/confirms.html confirm-publish channels]&lt;br /&gt;
&lt;br /&gt;
Exchanges:&lt;br /&gt;
* MUST be named &amp;lt;code&amp;gt;exchange/&amp;lt;clientId&amp;gt;/&amp;lt;name&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
* MUST be topic exchanges&lt;br /&gt;
* MUST be durable&lt;br /&gt;
&lt;br /&gt;
Messages:&lt;br /&gt;
* MUST be UTF-8-encoded [http://tools.ietf.org/html/rfc7159 JSON]&lt;br /&gt;
* MUST carry &amp;lt;code&amp;gt;application/json&amp;lt;/code&amp;gt; as &amp;lt;code&amp;gt;Content-Type&amp;lt;/code&amp;gt;&lt;br /&gt;
* SHOULD be durable&lt;br /&gt;
* SHOULD be less than 8 KiB (for good performance)&lt;br /&gt;
* MAY be CC&#039;ed to [https://www.rabbitmq.com/sender-selected.html multiple routing keys]&lt;br /&gt;
* MUST NOT contain private or sensitive information&lt;br /&gt;
* SHOULD have a routing key where fields have a fixed index from the left&lt;br /&gt;
&lt;br /&gt;
Subscribers:&lt;br /&gt;
* SHOULD specify a [https://www.rabbitmq.com/consumer-prefetch.html &#039;&#039;consumer prefetch&#039;&#039; limit]&lt;br /&gt;
&lt;br /&gt;
Queues:&lt;br /&gt;
* MUST be named &amp;lt;code&amp;gt;queue/&amp;lt;clientId&amp;gt;/&amp;lt;name&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
* MAY have a [https://www.rabbitmq.com/maxlength.html limited length]&lt;br /&gt;
* MUST not grow unbounded&lt;br /&gt;
&lt;br /&gt;
= Let&#039;s Use It =&lt;br /&gt;
&lt;br /&gt;
There are currently two Pulse clients available. Please note that you can also connect to Pulse in other languages, provided you have an AMQP 0.9.1 library that will let you interact with AMQP exchanges. See https://github.com/rabbitmq/rabbitmq-tutorials#languages for example.&lt;br /&gt;
&lt;br /&gt;
== Python Pulse client library ==&lt;br /&gt;
&lt;br /&gt;
The [https://github.com/mozilla-services/mozillapulse mozillapulse] Python package provides classes for existing publishers, consumers, and messages so you can quickly build Pulse applications.  See the [https://github.com/mozilla-services/mozillapulse/blob/master/README.md README] to get started (although note that the test publisher is currently offline; see {{bug|1218976}}.  You can use another consumer, e.g. BuildConsumer, to verify your setup.).&lt;br /&gt;
&lt;br /&gt;
This library is somewhat inflexible, however, and should be rewritten. One idea is to turn TaskCluster&#039;s Python client into a standalone package.&lt;br /&gt;
&lt;br /&gt;
== Go (golang) Pulse client library ==&lt;br /&gt;
&lt;br /&gt;
This can be found here:&lt;br /&gt;
* http://taskcluster.github.io/pulse-go/&lt;br /&gt;
&lt;br /&gt;
Extensions for TaskCluster exchanges here (see section &amp;quot;AMQP APIs&amp;quot;):&lt;br /&gt;
* http://taskcluster.github.io/taskcluster-client-go/&lt;br /&gt;
&lt;br /&gt;
= Contributing =&lt;br /&gt;
&lt;br /&gt;
To set up a local system for development, see the [https://github.com/mozilla-services/mozillapulse/blob/master/HACKING.md HACKING.md] file included in the mozillapulse source.&lt;br /&gt;
&lt;br /&gt;
The main Pulse library (mozillapulse) and publisher shims (pulseshims) are written in Python, although there is also a Go library as mentioned in the section above.  We also want to provide a canonical JavaScript library at some point.  To hack on the main Pulse library, you should be comfortable in Python, and it&#039;s helpful to understand the basics of AMQP.  Knowledge of kombu is also useful.&lt;br /&gt;
&lt;br /&gt;
To hack on PulseGuardian, you should know some Python and JavaScript.  Experience with Flask, SQLAlchemy, and RabbitMQ are useful, but you can probably learn what you need as you fix bugs.&lt;br /&gt;
&lt;br /&gt;
Feel free to stop by #pulse or #ateam with questions!&lt;br /&gt;
&lt;br /&gt;
Here is the list of open, unassigned, mentored Pulse and PulseGuardian bugs to get you started.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;bugzilla&amp;gt;&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;quicksearch&amp;quot;: &amp;quot;status:new&amp;quot;,&lt;br /&gt;
        &amp;quot;product&amp;quot;: &amp;quot;Webtools&amp;quot;,&lt;br /&gt;
        &amp;quot;component&amp;quot;: &amp;quot;Pulse&amp;quot;,&lt;br /&gt;
        &amp;quot;f1&amp;quot;: &amp;quot;bug_mentor&amp;quot;,&lt;br /&gt;
        &amp;quot;o1&amp;quot;: &amp;quot;isnotempty&amp;quot;,&lt;br /&gt;
        &amp;quot;include_fields&amp;quot;: &amp;quot;id,summary,priority,status&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/bugzilla&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Once you have your feet wet and are ready to take on a more involved project, here is a list of all current Pulse bugs:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;bugzilla&amp;gt;&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;quicksearch&amp;quot;: &amp;quot;status:new,assigned,reopened,unconfirmed&amp;quot;,&lt;br /&gt;
        &amp;quot;product&amp;quot;: &amp;quot;Webtools&amp;quot;,&lt;br /&gt;
        &amp;quot;component&amp;quot;: &amp;quot;Pulse&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/bugzilla&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For mentored bugs, we use the User Story to provide a link back to this page, as well as any extra information for contributors, such as required knowledge or tools.  The basic text for mentored bugs should be &amp;quot;This is a mentored Pulse bug.  For general information on Pulse, see https://wiki.mozilla.org/Auto-tools/Projects/Pulse, which includes a section on Contributing.&amp;quot;  An example of extra text is &amp;quot;This bug also requires you to have a working mail server.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
= Road Map =&lt;br /&gt;
&lt;br /&gt;
See the [https://bugzilla.mozilla.org/buglist.cgi?resolution=---&amp;amp;query_format=advanced&amp;amp;component=Pulse&amp;amp;product=Webtools prioritized bug list] for all open issues and feature requests.&lt;br /&gt;
&lt;br /&gt;
= Security Model =&lt;br /&gt;
&lt;br /&gt;
This is summarized in the formal Pulse specification above.  What follows is the rationale and some technical implementation notes.&lt;br /&gt;
&lt;br /&gt;
In order to have a reliable, well behaved system, the following assertions will need to be true.&lt;br /&gt;
&lt;br /&gt;
* All users, publishers and consumers alike, must have their own accounts (no guest/public users).&lt;br /&gt;
* Only publishers should be able to declare exchanges.&lt;br /&gt;
* Only the publisher user account associated with a particular vhost should be allowed to publish messages to exchanges in the vhost.  In other words, exactly one user account should be allowed to publish messages within a given vhost.&lt;br /&gt;
* Only the user that created a particular queue should be allowed to consume from it.&lt;br /&gt;
&lt;br /&gt;
Since exchange and queue permissions go together, we&#039;ll need exchange and queue naming conventions mixed with restrictive permissions.  Each user will be restricted to a particular exchange and queue naming prefix.  Many users will be either consumers or publishers, but for simplicity, each user can do both.  Users will have full permissions on &amp;lt;code&amp;gt;&amp;quot;^exchange/&amp;lt;username&amp;gt;/.*$&amp;quot;&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;&amp;quot;^queue/&amp;lt;username&amp;gt;/.*$&amp;quot;&amp;lt;/code&amp;gt;.  They will also have read permissions to exchange/*.  This will both prevent users from writing to other users&#039; exchanges as well as prevent them from consuming from other users&#039; queues.  For convenience, if a consumer creates a nondurable queue, mozillapulse can assign a random suffix to the user&#039;s standard queue name prefix, i.e. &amp;lt;code&amp;gt;queue/&amp;lt;username&amp;gt;/&amp;lt;random string&amp;gt;&amp;lt;/code&amp;gt;, since the user wouldn&#039;t be able to create nor access a completely random server-assigned name.&lt;br /&gt;
&lt;br /&gt;
Note that this doesn&#039;t prevent a consumer from creating an exchange named as a queue, since the permission model doesn&#039;t distinguish between queues and exchanges, and consumers need the ability to create queues.  This is not particularly problematic, since no one would have permission to use that exchange.&lt;br /&gt;
&lt;br /&gt;
With this security model, we technically don&#039;t really need vhosts, since the names of the queues and exchanges the users can use are so specific.  There may still be a benefit in allowing apps to use the same queue name for different exchanges, though, which would be possible if each exchange had its own vhost.  The downside is that you cannot specify &amp;quot;all vhosts&amp;quot; when setting a user&#039;s permissions, so they would either have to list all vhosts they want to use when creating the user in PulseGuardian, and be able to update that list later, or PulseGuardian or some other app would have to automatically add new permissions to all users when a vhost is created.&lt;br /&gt;
&lt;br /&gt;
= Admin Procedures =&lt;br /&gt;
&lt;br /&gt;
kmoir and glob have access to the Pulse cluster on CloudAMQP and the following related services:&lt;br /&gt;
&lt;br /&gt;
* PulseGuardian should be deleting queues that are too long. If you need to manually delete a queue, use the Management UI. Try to ping the queue owner first before killing if possible.&lt;br /&gt;
&lt;br /&gt;
== To upgrade a ssl certificate on pulse.mozilla.org ==&lt;br /&gt;
&lt;br /&gt;
Open a bug with IT to generate a new certificate &lt;br /&gt;
{{bug|1532325}}&lt;br /&gt;
&lt;br /&gt;
IT needs to email support@cloudamqp.com with the new cert.  The cloudampq support team will install it on all our of cloudampq nodes.  After it has been installed, you can login to the administrative start the nodes one by one which will not result any downtime.  (Ensure you wait for the node to restart before restarting another one.)  Verify that the certs are installed on the nodes&lt;br /&gt;
&lt;br /&gt;
&amp;lt;text&amp;gt;&lt;br /&gt;
https://sslanalyzer.comodoca.com/?url=pulse.mozilla.org&lt;br /&gt;
https://sslanalyzer.comodoca.com/?url=orange-antelope-01.rmq.cloudamqp.com&lt;br /&gt;
https://sslanalyzer.comodoca.com/?url=orange-antelope-02.rmq.cloudamqp.com&lt;br /&gt;
https://sslanalyzer.comodoca.com/?url=orange-antelope-01.rmq.cloudamqp.com&lt;br /&gt;
&amp;lt;/text&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This should show the dates for the new certificate and that the cert is trusted by Mozilla and Microsoft.&lt;br /&gt;
&lt;br /&gt;
= More reading =&lt;br /&gt;
&lt;br /&gt;
* [http://slides.com/mcote/pulse Slides] from a presentation on Pulse.&lt;br /&gt;
* [https://mrcote.info/blog/2015/02/16/pulse-update/ Update] on Pulse from 2015/02/16.&lt;br /&gt;
&lt;br /&gt;
LegNeato also wrote several blog posts on Pulse as he was building it.  They contain some more background if you&#039;re really interested.  They are linked below, in chronological order.&lt;br /&gt;
&lt;br /&gt;
* [http://christian.legnitto.com/blog/2010/07/17/mozilla-pulse-and-rabbitmq/ Mozilla Pulse and RabbitMQ]&lt;br /&gt;
* [http://christian.legnitto.com/blog/2010/08/20/push-notifications-for-bugzilla/ Push notifications for Bugzilla]&lt;br /&gt;
** This idea has been shelved for the time being, both due to security issues and performance.  See [[BMO/ChangeNotificationSystem]] for an alternative.&lt;br /&gt;
* [http://christian.legnitto.com/blog/2010/09/10/bugzilla-amqp-is-now-buzgilla-push-supports-the-stomp-protocol/ bugzilla-amqp is now buzgilla-push, supports the STOMP protocol]&lt;br /&gt;
** See above note.  Just keeping these links for interest&#039;s sake.&lt;br /&gt;
* [http://christian.legnitto.com/blog/2010/10/15/whats-up-with-pulse/ What’s up with Pulse?]&lt;br /&gt;
* [http://christian.legnitto.com/blog/2010/11/23/github-amqp-integration-service-hook-live/ GitHub AMQP integration service hook live!]&lt;br /&gt;
** Tangentially related to Pulse.&lt;br /&gt;
* [http://christian.legnitto.com/blog/2010/12/06/lots-of-pulse-changes-out-of-prototype-mode-this-week/ Lots of Pulse changes, out of prototype mode this week!]&lt;br /&gt;
* [http://christian.legnitto.com/blog/2010/12/22/another-update-on-pulse/ Another update on Pulse]&lt;/div&gt;</summary>
		<author><name>Kmoir</name></author>
	</entry>
	<entry>
		<id>https://wiki.mozilla.org/index.php?title=Auto-tools/Projects/Pulse&amp;diff=1209081</id>
		<title>Auto-tools/Projects/Pulse</title>
		<link rel="alternate" type="text/html" href="https://wiki.mozilla.org/index.php?title=Auto-tools/Projects/Pulse&amp;diff=1209081"/>
		<updated>2019-03-18T15:38:25Z</updated>

		<summary type="html">&lt;p&gt;Kmoir: /* Admin Procedures */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Introducing Pulse =&lt;br /&gt;
&lt;br /&gt;
Pulse is a managed [http://www.rabbitmq.com RabbitMQ] cluster designed to provide loose coupling between automation and infrastructure tools.  The goal of Pulse is to add visibility to Mozilla&#039;s tools and systems and to eliminate polling and other brittle methods of scraping data. This allows more robust, dynamic, and informative tools.&lt;br /&gt;
&lt;br /&gt;
Pulse is available at pulse.mozilla.org:5671 (AMQP over SSL).  It is hosted by [http://cloudamqp.com CloudAMQP].&lt;br /&gt;
&lt;br /&gt;
[[Auto-tools/Projects/Pulse/PulseGuardian|PulseGuardian]] is a tool that manages Pulse&#039;s users and queues (and eventually exchanges).  It is available at https://pulseguardian.mozilla.org and hosted by [http://heroku.com Heroku].&lt;br /&gt;
&lt;br /&gt;
We have a discussion forum available via the standard trio of [news:mozilla.tools.pulse USENET newsgroup], [https://lists.mozilla.org/listinfo/tools-pulse mailing list], and [https://groups.google.com/forum/#!forum/mozilla.tools.pulse Google Group].&lt;br /&gt;
&lt;br /&gt;
File bugs under [https://bugzilla.mozilla.org/enter_bug.cgi?product=Webtools&amp;amp;component=Pulse Webtools :: Pulse].  We don&#039;t have a separate component for PulseGuardian; rather, we just start the summaries with &amp;quot;[PulseGuardian]&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Also see the [https://tools.taskcluster.net/pulse-inspector/ Pulse Inspector] web app, which displays Pulse messages in real time, and the (manually updated) [[/Exchanges|list of Pulse exchanges]].&lt;br /&gt;
&lt;br /&gt;
= System Description =&lt;br /&gt;
&lt;br /&gt;
Pulse isn&#039;t any one thing.  At its heart, it is a RabbitMQ system with a particular configuration and a set of conventions for using it along with a management tool, [[Auto-tools/Projects/Pulse/PulseGuardian|PulseGuardian]], to make Pulse as automated and self-serve as possible.  Pulse follows the pub-sub pattern, in which publishers send messages to topic exchanges, and consumers create queues bound to these exchanges in order to subscribe to the publishers&#039; messages.  In general, publishers create and own exchanges, and consumers create and own queues.&lt;br /&gt;
&lt;br /&gt;
= Specification =&lt;br /&gt;
&lt;br /&gt;
Pulse is a managed [https://www.rabbitmq.com/resources/specs/amqp0-9-1.pdf AMQP 0-9-1]&lt;br /&gt;
service with [https://www.rabbitmq.com/extensions.html RabbitMQ extensions] for publishing messages from Mozilla&lt;br /&gt;
infrastructure. The aim is provide hooks that subscribers can&lt;br /&gt;
use to integrate and extend Mozilla infrastructure.&lt;br /&gt;
&lt;br /&gt;
== Authentication ==&lt;br /&gt;
&lt;br /&gt;
Pulse credentials are managed and issued by [[Auto-tools/Projects/Pulse/PulseGuardian|PulseGuardian]],&lt;br /&gt;
available at https://pulseguardian.mozilla.org. This service SHALL issue&lt;br /&gt;
an &#039;&#039;accessToken&#039;&#039; for any &#039;&#039;clientId&#039;&#039; that is registered&lt;br /&gt;
with &#039;&#039;authorized&#039;&#039; email address.&lt;br /&gt;
The accessToken is strictly secret and MUST NOT be shared&lt;br /&gt;
publicly. The clientId is not secret. When establishing an AMQP&lt;br /&gt;
connection, the clientId and accessToken MUST be used as&lt;br /&gt;
&#039;&#039;username&#039;&#039; and &#039;&#039;password&#039;&#039;, respectively.&lt;br /&gt;
&lt;br /&gt;
== Authorized Users ==&lt;br /&gt;
&lt;br /&gt;
Pulse is intended to be open to all Mozillians who want to&lt;br /&gt;
extend or integrate with Mozilla infrastructure. To guard against&lt;br /&gt;
abuse PulseGuardian users MUST authenticate via Persona. PulseGuardian SHOULD verify that users have a vouched Mozillians profile.&lt;br /&gt;
&lt;br /&gt;
== Publishers ==&lt;br /&gt;
&lt;br /&gt;
Publishers MUST name &#039;&#039;exchanges&#039;&#039; in the form &amp;lt;code&amp;gt;exchange/&amp;lt;clientId&amp;gt;/&amp;lt;name&amp;gt;&amp;lt;/code&amp;gt; where clientId is the userid used to bind/connect to the server. Attempts to name an exchange otherwise SHALL result in an authorization error. Exchanges MUST be &#039;&#039;topic exchanges&#039;&#039; and they MUST be declared &#039;&#039;durable&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Messages MUST contain a UTF-8-encoded [http://tools.ietf.org/html/rfc7159 JSON] payload, and&lt;br /&gt;
their &amp;lt;code&amp;gt;Content-Type&amp;lt;/code&amp;gt; MUST be &amp;lt;code&amp;gt;application/json&amp;lt;/code&amp;gt;.&lt;br /&gt;
Messages SHOULD NOT be larger than 8&amp;amp;nbsp;kB; deviations may be&lt;br /&gt;
feasible for low-traffic exchanges. Messages MUST NOT contain&lt;br /&gt;
secret or sensitive information; all exchanges and messages&lt;br /&gt;
SHALL be considered public.&lt;br /&gt;
&lt;br /&gt;
A message SHOULD carry a &#039;&#039;routing key&#039;&#039;, in which fields have a&lt;br /&gt;
fixed index from the left. Additionally, a message MAY be&lt;br /&gt;
&#039;&#039;cced&#039;&#039; to multiple routing keys, using the RabbitMQ&lt;br /&gt;
[https://www.rabbitmq.com/sender-selected.html &#039;&#039;Sender-selected Distribution&#039;&#039;] extension.&lt;br /&gt;
&lt;br /&gt;
Messages SHOULD be &#039;&#039;durable&#039;&#039; and SHOULD be published over&lt;br /&gt;
RabbitMQ [https://www.rabbitmq.com/confirms.html &#039;&#039;confirm-publish&#039;&#039; channels]. Otherwise, the&lt;br /&gt;
documentation MUST clearly reflect that messages from the&lt;br /&gt;
given exchange do not exhibit deliver &#039;&#039;at-least-once&#039;&#039; semantics.&lt;br /&gt;
&lt;br /&gt;
== Subscribers ==&lt;br /&gt;
&lt;br /&gt;
Subscribers MUST name &#039;&#039;queues&#039;&#039; in the form&lt;br /&gt;
&amp;lt;code&amp;gt;queue/&amp;lt;clientId&amp;gt;/&amp;lt;name&amp;gt;&amp;lt;/code&amp;gt;; attempts to name a queue otherwise&lt;br /&gt;
SHALL result in an authorization error. Queues MAY &#039;&#039;consume&#039;&#039;&lt;br /&gt;
from any exchange prefixed &amp;lt;code&amp;gt;exchange/&amp;lt;/code&amp;gt;; attempts to consume&lt;br /&gt;
from any other exchange SHALL result in an authentication error.&lt;br /&gt;
&lt;br /&gt;
Subscribers MAY limit the size of their queues using the RabbitMQ&lt;br /&gt;
[https://www.rabbitmq.com/maxlength.html &#039;&#039;Queue Length Limit&#039;&#039;] extension. Subscribers MUST NOT let&lt;br /&gt;
their queues grow unbounded; if left unattended, &#039;&#039;Pulse&#039;&#039;&lt;br /&gt;
SHALL notify the owner by email. Additionally, &#039;&#039;Pulse&#039;&#039; MAY delete&lt;br /&gt;
a queue which exceeds defined limits. Subscribers SHOULD specify a&lt;br /&gt;
prefetch limit using the RabbitMQ [https://www.rabbitmq.com/consumer-prefetch.html &#039;&#039;Consumer Prefetch&#039;&#039; limit] extension.&lt;br /&gt;
&lt;br /&gt;
Subscribers SHOULD use either &#039;&#039;durable&#039;&#039; queues or&lt;br /&gt;
&#039;&#039;auto-delete&#039;&#039; queues. Implementors are recommended to aim&lt;br /&gt;
for deliver-&#039;&#039;at-least-once&#039;&#039; semantics.&lt;br /&gt;
&lt;br /&gt;
== Appendix A: Everything in Bullet Points ==&lt;br /&gt;
&lt;br /&gt;
This is a summary of the above.&lt;br /&gt;
&lt;br /&gt;
Pulse:&lt;br /&gt;
* MUST offer registration at &amp;lt;code&amp;gt;pulse.mozilla.org&amp;lt;/code&amp;gt;&lt;br /&gt;
* MUST support [https://www.rabbitmq.com/resources/specs/amqp0-9-1.pdf AMQP 0-9-1] and these RabbitMQ extensions:&lt;br /&gt;
** [https://www.rabbitmq.com/confirms.html Confirms]&lt;br /&gt;
** [https://www.rabbitmq.com/consumer-prefetch.html Consumer Prefetch]&lt;br /&gt;
** [https://www.rabbitmq.com/maxlength.html Queue Length Limit]&lt;br /&gt;
** [https://www.rabbitmq.com/sender-selected.html Sender-selected Distribution]&lt;br /&gt;
* SHOULD exhibit deliver-&#039;&#039;at-least-once&#039;&#039; semantics&lt;br /&gt;
* MAY delete queues that grows beyond &#039;&#039;Pulse&#039;&#039; defined limits&lt;br /&gt;
* SHALL notify owner by email when a queue grows close to &#039;&#039;Pulse&#039;&#039;-defined limits.&lt;br /&gt;
&lt;br /&gt;
Publishers:&lt;br /&gt;
* SHOULD use [https://www.rabbitmq.com/confirms.html confirm-publish channels]&lt;br /&gt;
&lt;br /&gt;
Exchanges:&lt;br /&gt;
* MUST be named &amp;lt;code&amp;gt;exchange/&amp;lt;clientId&amp;gt;/&amp;lt;name&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
* MUST be topic exchanges&lt;br /&gt;
* MUST be durable&lt;br /&gt;
&lt;br /&gt;
Messages:&lt;br /&gt;
* MUST be UTF-8-encoded [http://tools.ietf.org/html/rfc7159 JSON]&lt;br /&gt;
* MUST carry &amp;lt;code&amp;gt;application/json&amp;lt;/code&amp;gt; as &amp;lt;code&amp;gt;Content-Type&amp;lt;/code&amp;gt;&lt;br /&gt;
* SHOULD be durable&lt;br /&gt;
* SHOULD be less than 8 KiB (for good performance)&lt;br /&gt;
* MAY be CC&#039;ed to [https://www.rabbitmq.com/sender-selected.html multiple routing keys]&lt;br /&gt;
* MUST NOT contain private or sensitive information&lt;br /&gt;
* SHOULD have a routing key where fields have a fixed index from the left&lt;br /&gt;
&lt;br /&gt;
Subscribers:&lt;br /&gt;
* SHOULD specify a [https://www.rabbitmq.com/consumer-prefetch.html &#039;&#039;consumer prefetch&#039;&#039; limit]&lt;br /&gt;
&lt;br /&gt;
Queues:&lt;br /&gt;
* MUST be named &amp;lt;code&amp;gt;queue/&amp;lt;clientId&amp;gt;/&amp;lt;name&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
* MAY have a [https://www.rabbitmq.com/maxlength.html limited length]&lt;br /&gt;
* MUST not grow unbounded&lt;br /&gt;
&lt;br /&gt;
= Let&#039;s Use It =&lt;br /&gt;
&lt;br /&gt;
There are currently two Pulse clients available. Please note that you can also connect to Pulse in other languages, provided you have an AMQP 0.9.1 library that will let you interact with AMQP exchanges. See https://github.com/rabbitmq/rabbitmq-tutorials#languages for example.&lt;br /&gt;
&lt;br /&gt;
== Python Pulse client library ==&lt;br /&gt;
&lt;br /&gt;
The [https://github.com/mozilla-services/mozillapulse mozillapulse] Python package provides classes for existing publishers, consumers, and messages so you can quickly build Pulse applications.  See the [https://github.com/mozilla-services/mozillapulse/blob/master/README.md README] to get started (although note that the test publisher is currently offline; see {{bug|1218976}}.  You can use another consumer, e.g. BuildConsumer, to verify your setup.).&lt;br /&gt;
&lt;br /&gt;
This library is somewhat inflexible, however, and should be rewritten. One idea is to turn TaskCluster&#039;s Python client into a standalone package.&lt;br /&gt;
&lt;br /&gt;
== Go (golang) Pulse client library ==&lt;br /&gt;
&lt;br /&gt;
This can be found here:&lt;br /&gt;
* http://taskcluster.github.io/pulse-go/&lt;br /&gt;
&lt;br /&gt;
Extensions for TaskCluster exchanges here (see section &amp;quot;AMQP APIs&amp;quot;):&lt;br /&gt;
* http://taskcluster.github.io/taskcluster-client-go/&lt;br /&gt;
&lt;br /&gt;
= Contributing =&lt;br /&gt;
&lt;br /&gt;
To set up a local system for development, see the [https://github.com/mozilla-services/mozillapulse/blob/master/HACKING.md HACKING.md] file included in the mozillapulse source.&lt;br /&gt;
&lt;br /&gt;
The main Pulse library (mozillapulse) and publisher shims (pulseshims) are written in Python, although there is also a Go library as mentioned in the section above.  We also want to provide a canonical JavaScript library at some point.  To hack on the main Pulse library, you should be comfortable in Python, and it&#039;s helpful to understand the basics of AMQP.  Knowledge of kombu is also useful.&lt;br /&gt;
&lt;br /&gt;
To hack on PulseGuardian, you should know some Python and JavaScript.  Experience with Flask, SQLAlchemy, and RabbitMQ are useful, but you can probably learn what you need as you fix bugs.&lt;br /&gt;
&lt;br /&gt;
Feel free to stop by #pulse or #ateam with questions!&lt;br /&gt;
&lt;br /&gt;
Here is the list of open, unassigned, mentored Pulse and PulseGuardian bugs to get you started.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;bugzilla&amp;gt;&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;quicksearch&amp;quot;: &amp;quot;status:new&amp;quot;,&lt;br /&gt;
        &amp;quot;product&amp;quot;: &amp;quot;Webtools&amp;quot;,&lt;br /&gt;
        &amp;quot;component&amp;quot;: &amp;quot;Pulse&amp;quot;,&lt;br /&gt;
        &amp;quot;f1&amp;quot;: &amp;quot;bug_mentor&amp;quot;,&lt;br /&gt;
        &amp;quot;o1&amp;quot;: &amp;quot;isnotempty&amp;quot;,&lt;br /&gt;
        &amp;quot;include_fields&amp;quot;: &amp;quot;id,summary,priority,status&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/bugzilla&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Once you have your feet wet and are ready to take on a more involved project, here is a list of all current Pulse bugs:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;bugzilla&amp;gt;&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;quicksearch&amp;quot;: &amp;quot;status:new,assigned,reopened,unconfirmed&amp;quot;,&lt;br /&gt;
        &amp;quot;product&amp;quot;: &amp;quot;Webtools&amp;quot;,&lt;br /&gt;
        &amp;quot;component&amp;quot;: &amp;quot;Pulse&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/bugzilla&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For mentored bugs, we use the User Story to provide a link back to this page, as well as any extra information for contributors, such as required knowledge or tools.  The basic text for mentored bugs should be &amp;quot;This is a mentored Pulse bug.  For general information on Pulse, see https://wiki.mozilla.org/Auto-tools/Projects/Pulse, which includes a section on Contributing.&amp;quot;  An example of extra text is &amp;quot;This bug also requires you to have a working mail server.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
= Road Map =&lt;br /&gt;
&lt;br /&gt;
See the [https://bugzilla.mozilla.org/buglist.cgi?resolution=---&amp;amp;query_format=advanced&amp;amp;component=Pulse&amp;amp;product=Webtools prioritized bug list] for all open issues and feature requests.&lt;br /&gt;
&lt;br /&gt;
= Security Model =&lt;br /&gt;
&lt;br /&gt;
This is summarized in the formal Pulse specification above.  What follows is the rationale and some technical implementation notes.&lt;br /&gt;
&lt;br /&gt;
In order to have a reliable, well behaved system, the following assertions will need to be true.&lt;br /&gt;
&lt;br /&gt;
* All users, publishers and consumers alike, must have their own accounts (no guest/public users).&lt;br /&gt;
* Only publishers should be able to declare exchanges.&lt;br /&gt;
* Only the publisher user account associated with a particular vhost should be allowed to publish messages to exchanges in the vhost.  In other words, exactly one user account should be allowed to publish messages within a given vhost.&lt;br /&gt;
* Only the user that created a particular queue should be allowed to consume from it.&lt;br /&gt;
&lt;br /&gt;
Since exchange and queue permissions go together, we&#039;ll need exchange and queue naming conventions mixed with restrictive permissions.  Each user will be restricted to a particular exchange and queue naming prefix.  Many users will be either consumers or publishers, but for simplicity, each user can do both.  Users will have full permissions on &amp;lt;code&amp;gt;&amp;quot;^exchange/&amp;lt;username&amp;gt;/.*$&amp;quot;&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;&amp;quot;^queue/&amp;lt;username&amp;gt;/.*$&amp;quot;&amp;lt;/code&amp;gt;.  They will also have read permissions to exchange/*.  This will both prevent users from writing to other users&#039; exchanges as well as prevent them from consuming from other users&#039; queues.  For convenience, if a consumer creates a nondurable queue, mozillapulse can assign a random suffix to the user&#039;s standard queue name prefix, i.e. &amp;lt;code&amp;gt;queue/&amp;lt;username&amp;gt;/&amp;lt;random string&amp;gt;&amp;lt;/code&amp;gt;, since the user wouldn&#039;t be able to create nor access a completely random server-assigned name.&lt;br /&gt;
&lt;br /&gt;
Note that this doesn&#039;t prevent a consumer from creating an exchange named as a queue, since the permission model doesn&#039;t distinguish between queues and exchanges, and consumers need the ability to create queues.  This is not particularly problematic, since no one would have permission to use that exchange.&lt;br /&gt;
&lt;br /&gt;
With this security model, we technically don&#039;t really need vhosts, since the names of the queues and exchanges the users can use are so specific.  There may still be a benefit in allowing apps to use the same queue name for different exchanges, though, which would be possible if each exchange had its own vhost.  The downside is that you cannot specify &amp;quot;all vhosts&amp;quot; when setting a user&#039;s permissions, so they would either have to list all vhosts they want to use when creating the user in PulseGuardian, and be able to update that list later, or PulseGuardian or some other app would have to automatically add new permissions to all users when a vhost is created.&lt;br /&gt;
&lt;br /&gt;
= Admin Procedures =&lt;br /&gt;
&lt;br /&gt;
kmoir and glob have access to the Pulse cluster on CloudAMQP and the following related services:&lt;br /&gt;
&lt;br /&gt;
* PulseGuardian should be deleting queues that are too long. If you need to manually delete a queue, use the Management UI. Try to ping the queue owner first before killing if possible.&lt;br /&gt;
&lt;br /&gt;
== To upgrade a ssl certificate on pulse.mozilla.org ==&lt;br /&gt;
&lt;br /&gt;
Open a bug with IT to generate a new certificate &lt;br /&gt;
{{bug|1532325}}&lt;br /&gt;
&lt;br /&gt;
IT needs to email support@cloudamqp.com with the new cert.  The cloudampq support team will install it on all our of cloudampq nodes.  After it has been installed, you can login to the administrative start the nodes one by one which will not result any downtime.  (Ensure you wait for the node to restart before restarting another one.)  Verify that the certs are installed on the nodes&lt;br /&gt;
&lt;br /&gt;
https://sslanalyzer.comodoca.com/?url=pulse.mozilla.org&lt;br /&gt;
https://sslanalyzer.comodoca.com/?url=orange-antelope-01.rmq.cloudamqp.com&lt;br /&gt;
https://sslanalyzer.comodoca.com/?url=orange-antelope-02.rmq.cloudamqp.com&lt;br /&gt;
https://sslanalyzer.comodoca.com/?url=orange-antelope-01.rmq.cloudamqp.com&lt;br /&gt;
&lt;br /&gt;
This should show the dates for the new certificate and that the cert is trusted by Mozilla and Microsoft.&lt;br /&gt;
&lt;br /&gt;
= More reading =&lt;br /&gt;
&lt;br /&gt;
* [http://slides.com/mcote/pulse Slides] from a presentation on Pulse.&lt;br /&gt;
* [https://mrcote.info/blog/2015/02/16/pulse-update/ Update] on Pulse from 2015/02/16.&lt;br /&gt;
&lt;br /&gt;
LegNeato also wrote several blog posts on Pulse as he was building it.  They contain some more background if you&#039;re really interested.  They are linked below, in chronological order.&lt;br /&gt;
&lt;br /&gt;
* [http://christian.legnitto.com/blog/2010/07/17/mozilla-pulse-and-rabbitmq/ Mozilla Pulse and RabbitMQ]&lt;br /&gt;
* [http://christian.legnitto.com/blog/2010/08/20/push-notifications-for-bugzilla/ Push notifications for Bugzilla]&lt;br /&gt;
** This idea has been shelved for the time being, both due to security issues and performance.  See [[BMO/ChangeNotificationSystem]] for an alternative.&lt;br /&gt;
* [http://christian.legnitto.com/blog/2010/09/10/bugzilla-amqp-is-now-buzgilla-push-supports-the-stomp-protocol/ bugzilla-amqp is now buzgilla-push, supports the STOMP protocol]&lt;br /&gt;
** See above note.  Just keeping these links for interest&#039;s sake.&lt;br /&gt;
* [http://christian.legnitto.com/blog/2010/10/15/whats-up-with-pulse/ What’s up with Pulse?]&lt;br /&gt;
* [http://christian.legnitto.com/blog/2010/11/23/github-amqp-integration-service-hook-live/ GitHub AMQP integration service hook live!]&lt;br /&gt;
** Tangentially related to Pulse.&lt;br /&gt;
* [http://christian.legnitto.com/blog/2010/12/06/lots-of-pulse-changes-out-of-prototype-mode-this-week/ Lots of Pulse changes, out of prototype mode this week!]&lt;br /&gt;
* [http://christian.legnitto.com/blog/2010/12/22/another-update-on-pulse/ Another update on Pulse]&lt;/div&gt;</summary>
		<author><name>Kmoir</name></author>
	</entry>
	<entry>
		<id>https://wiki.mozilla.org/index.php?title=Auto-tools/Projects/Pulse&amp;diff=1209073</id>
		<title>Auto-tools/Projects/Pulse</title>
		<link rel="alternate" type="text/html" href="https://wiki.mozilla.org/index.php?title=Auto-tools/Projects/Pulse&amp;diff=1209073"/>
		<updated>2019-03-18T15:05:52Z</updated>

		<summary type="html">&lt;p&gt;Kmoir: /* Admin Procedures */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Introducing Pulse =&lt;br /&gt;
&lt;br /&gt;
Pulse is a managed [http://www.rabbitmq.com RabbitMQ] cluster designed to provide loose coupling between automation and infrastructure tools.  The goal of Pulse is to add visibility to Mozilla&#039;s tools and systems and to eliminate polling and other brittle methods of scraping data. This allows more robust, dynamic, and informative tools.&lt;br /&gt;
&lt;br /&gt;
Pulse is available at pulse.mozilla.org:5671 (AMQP over SSL).  It is hosted by [http://cloudamqp.com CloudAMQP].&lt;br /&gt;
&lt;br /&gt;
[[Auto-tools/Projects/Pulse/PulseGuardian|PulseGuardian]] is a tool that manages Pulse&#039;s users and queues (and eventually exchanges).  It is available at https://pulseguardian.mozilla.org and hosted by [http://heroku.com Heroku].&lt;br /&gt;
&lt;br /&gt;
We have a discussion forum available via the standard trio of [news:mozilla.tools.pulse USENET newsgroup], [https://lists.mozilla.org/listinfo/tools-pulse mailing list], and [https://groups.google.com/forum/#!forum/mozilla.tools.pulse Google Group].&lt;br /&gt;
&lt;br /&gt;
File bugs under [https://bugzilla.mozilla.org/enter_bug.cgi?product=Webtools&amp;amp;component=Pulse Webtools :: Pulse].  We don&#039;t have a separate component for PulseGuardian; rather, we just start the summaries with &amp;quot;[PulseGuardian]&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Also see the [https://tools.taskcluster.net/pulse-inspector/ Pulse Inspector] web app, which displays Pulse messages in real time, and the (manually updated) [[/Exchanges|list of Pulse exchanges]].&lt;br /&gt;
&lt;br /&gt;
= System Description =&lt;br /&gt;
&lt;br /&gt;
Pulse isn&#039;t any one thing.  At its heart, it is a RabbitMQ system with a particular configuration and a set of conventions for using it along with a management tool, [[Auto-tools/Projects/Pulse/PulseGuardian|PulseGuardian]], to make Pulse as automated and self-serve as possible.  Pulse follows the pub-sub pattern, in which publishers send messages to topic exchanges, and consumers create queues bound to these exchanges in order to subscribe to the publishers&#039; messages.  In general, publishers create and own exchanges, and consumers create and own queues.&lt;br /&gt;
&lt;br /&gt;
= Specification =&lt;br /&gt;
&lt;br /&gt;
Pulse is a managed [https://www.rabbitmq.com/resources/specs/amqp0-9-1.pdf AMQP 0-9-1]&lt;br /&gt;
service with [https://www.rabbitmq.com/extensions.html RabbitMQ extensions] for publishing messages from Mozilla&lt;br /&gt;
infrastructure. The aim is provide hooks that subscribers can&lt;br /&gt;
use to integrate and extend Mozilla infrastructure.&lt;br /&gt;
&lt;br /&gt;
== Authentication ==&lt;br /&gt;
&lt;br /&gt;
Pulse credentials are managed and issued by [[Auto-tools/Projects/Pulse/PulseGuardian|PulseGuardian]],&lt;br /&gt;
available at https://pulseguardian.mozilla.org. This service SHALL issue&lt;br /&gt;
an &#039;&#039;accessToken&#039;&#039; for any &#039;&#039;clientId&#039;&#039; that is registered&lt;br /&gt;
with &#039;&#039;authorized&#039;&#039; email address.&lt;br /&gt;
The accessToken is strictly secret and MUST NOT be shared&lt;br /&gt;
publicly. The clientId is not secret. When establishing an AMQP&lt;br /&gt;
connection, the clientId and accessToken MUST be used as&lt;br /&gt;
&#039;&#039;username&#039;&#039; and &#039;&#039;password&#039;&#039;, respectively.&lt;br /&gt;
&lt;br /&gt;
== Authorized Users ==&lt;br /&gt;
&lt;br /&gt;
Pulse is intended to be open to all Mozillians who want to&lt;br /&gt;
extend or integrate with Mozilla infrastructure. To guard against&lt;br /&gt;
abuse PulseGuardian users MUST authenticate via Persona. PulseGuardian SHOULD verify that users have a vouched Mozillians profile.&lt;br /&gt;
&lt;br /&gt;
== Publishers ==&lt;br /&gt;
&lt;br /&gt;
Publishers MUST name &#039;&#039;exchanges&#039;&#039; in the form &amp;lt;code&amp;gt;exchange/&amp;lt;clientId&amp;gt;/&amp;lt;name&amp;gt;&amp;lt;/code&amp;gt; where clientId is the userid used to bind/connect to the server. Attempts to name an exchange otherwise SHALL result in an authorization error. Exchanges MUST be &#039;&#039;topic exchanges&#039;&#039; and they MUST be declared &#039;&#039;durable&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Messages MUST contain a UTF-8-encoded [http://tools.ietf.org/html/rfc7159 JSON] payload, and&lt;br /&gt;
their &amp;lt;code&amp;gt;Content-Type&amp;lt;/code&amp;gt; MUST be &amp;lt;code&amp;gt;application/json&amp;lt;/code&amp;gt;.&lt;br /&gt;
Messages SHOULD NOT be larger than 8&amp;amp;nbsp;kB; deviations may be&lt;br /&gt;
feasible for low-traffic exchanges. Messages MUST NOT contain&lt;br /&gt;
secret or sensitive information; all exchanges and messages&lt;br /&gt;
SHALL be considered public.&lt;br /&gt;
&lt;br /&gt;
A message SHOULD carry a &#039;&#039;routing key&#039;&#039;, in which fields have a&lt;br /&gt;
fixed index from the left. Additionally, a message MAY be&lt;br /&gt;
&#039;&#039;cced&#039;&#039; to multiple routing keys, using the RabbitMQ&lt;br /&gt;
[https://www.rabbitmq.com/sender-selected.html &#039;&#039;Sender-selected Distribution&#039;&#039;] extension.&lt;br /&gt;
&lt;br /&gt;
Messages SHOULD be &#039;&#039;durable&#039;&#039; and SHOULD be published over&lt;br /&gt;
RabbitMQ [https://www.rabbitmq.com/confirms.html &#039;&#039;confirm-publish&#039;&#039; channels]. Otherwise, the&lt;br /&gt;
documentation MUST clearly reflect that messages from the&lt;br /&gt;
given exchange do not exhibit deliver &#039;&#039;at-least-once&#039;&#039; semantics.&lt;br /&gt;
&lt;br /&gt;
== Subscribers ==&lt;br /&gt;
&lt;br /&gt;
Subscribers MUST name &#039;&#039;queues&#039;&#039; in the form&lt;br /&gt;
&amp;lt;code&amp;gt;queue/&amp;lt;clientId&amp;gt;/&amp;lt;name&amp;gt;&amp;lt;/code&amp;gt;; attempts to name a queue otherwise&lt;br /&gt;
SHALL result in an authorization error. Queues MAY &#039;&#039;consume&#039;&#039;&lt;br /&gt;
from any exchange prefixed &amp;lt;code&amp;gt;exchange/&amp;lt;/code&amp;gt;; attempts to consume&lt;br /&gt;
from any other exchange SHALL result in an authentication error.&lt;br /&gt;
&lt;br /&gt;
Subscribers MAY limit the size of their queues using the RabbitMQ&lt;br /&gt;
[https://www.rabbitmq.com/maxlength.html &#039;&#039;Queue Length Limit&#039;&#039;] extension. Subscribers MUST NOT let&lt;br /&gt;
their queues grow unbounded; if left unattended, &#039;&#039;Pulse&#039;&#039;&lt;br /&gt;
SHALL notify the owner by email. Additionally, &#039;&#039;Pulse&#039;&#039; MAY delete&lt;br /&gt;
a queue which exceeds defined limits. Subscribers SHOULD specify a&lt;br /&gt;
prefetch limit using the RabbitMQ [https://www.rabbitmq.com/consumer-prefetch.html &#039;&#039;Consumer Prefetch&#039;&#039; limit] extension.&lt;br /&gt;
&lt;br /&gt;
Subscribers SHOULD use either &#039;&#039;durable&#039;&#039; queues or&lt;br /&gt;
&#039;&#039;auto-delete&#039;&#039; queues. Implementors are recommended to aim&lt;br /&gt;
for deliver-&#039;&#039;at-least-once&#039;&#039; semantics.&lt;br /&gt;
&lt;br /&gt;
== Appendix A: Everything in Bullet Points ==&lt;br /&gt;
&lt;br /&gt;
This is a summary of the above.&lt;br /&gt;
&lt;br /&gt;
Pulse:&lt;br /&gt;
* MUST offer registration at &amp;lt;code&amp;gt;pulse.mozilla.org&amp;lt;/code&amp;gt;&lt;br /&gt;
* MUST support [https://www.rabbitmq.com/resources/specs/amqp0-9-1.pdf AMQP 0-9-1] and these RabbitMQ extensions:&lt;br /&gt;
** [https://www.rabbitmq.com/confirms.html Confirms]&lt;br /&gt;
** [https://www.rabbitmq.com/consumer-prefetch.html Consumer Prefetch]&lt;br /&gt;
** [https://www.rabbitmq.com/maxlength.html Queue Length Limit]&lt;br /&gt;
** [https://www.rabbitmq.com/sender-selected.html Sender-selected Distribution]&lt;br /&gt;
* SHOULD exhibit deliver-&#039;&#039;at-least-once&#039;&#039; semantics&lt;br /&gt;
* MAY delete queues that grows beyond &#039;&#039;Pulse&#039;&#039; defined limits&lt;br /&gt;
* SHALL notify owner by email when a queue grows close to &#039;&#039;Pulse&#039;&#039;-defined limits.&lt;br /&gt;
&lt;br /&gt;
Publishers:&lt;br /&gt;
* SHOULD use [https://www.rabbitmq.com/confirms.html confirm-publish channels]&lt;br /&gt;
&lt;br /&gt;
Exchanges:&lt;br /&gt;
* MUST be named &amp;lt;code&amp;gt;exchange/&amp;lt;clientId&amp;gt;/&amp;lt;name&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
* MUST be topic exchanges&lt;br /&gt;
* MUST be durable&lt;br /&gt;
&lt;br /&gt;
Messages:&lt;br /&gt;
* MUST be UTF-8-encoded [http://tools.ietf.org/html/rfc7159 JSON]&lt;br /&gt;
* MUST carry &amp;lt;code&amp;gt;application/json&amp;lt;/code&amp;gt; as &amp;lt;code&amp;gt;Content-Type&amp;lt;/code&amp;gt;&lt;br /&gt;
* SHOULD be durable&lt;br /&gt;
* SHOULD be less than 8 KiB (for good performance)&lt;br /&gt;
* MAY be CC&#039;ed to [https://www.rabbitmq.com/sender-selected.html multiple routing keys]&lt;br /&gt;
* MUST NOT contain private or sensitive information&lt;br /&gt;
* SHOULD have a routing key where fields have a fixed index from the left&lt;br /&gt;
&lt;br /&gt;
Subscribers:&lt;br /&gt;
* SHOULD specify a [https://www.rabbitmq.com/consumer-prefetch.html &#039;&#039;consumer prefetch&#039;&#039; limit]&lt;br /&gt;
&lt;br /&gt;
Queues:&lt;br /&gt;
* MUST be named &amp;lt;code&amp;gt;queue/&amp;lt;clientId&amp;gt;/&amp;lt;name&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
* MAY have a [https://www.rabbitmq.com/maxlength.html limited length]&lt;br /&gt;
* MUST not grow unbounded&lt;br /&gt;
&lt;br /&gt;
= Let&#039;s Use It =&lt;br /&gt;
&lt;br /&gt;
There are currently two Pulse clients available. Please note that you can also connect to Pulse in other languages, provided you have an AMQP 0.9.1 library that will let you interact with AMQP exchanges. See https://github.com/rabbitmq/rabbitmq-tutorials#languages for example.&lt;br /&gt;
&lt;br /&gt;
== Python Pulse client library ==&lt;br /&gt;
&lt;br /&gt;
The [https://github.com/mozilla-services/mozillapulse mozillapulse] Python package provides classes for existing publishers, consumers, and messages so you can quickly build Pulse applications.  See the [https://github.com/mozilla-services/mozillapulse/blob/master/README.md README] to get started (although note that the test publisher is currently offline; see {{bug|1218976}}.  You can use another consumer, e.g. BuildConsumer, to verify your setup.).&lt;br /&gt;
&lt;br /&gt;
This library is somewhat inflexible, however, and should be rewritten. One idea is to turn TaskCluster&#039;s Python client into a standalone package.&lt;br /&gt;
&lt;br /&gt;
== Go (golang) Pulse client library ==&lt;br /&gt;
&lt;br /&gt;
This can be found here:&lt;br /&gt;
* http://taskcluster.github.io/pulse-go/&lt;br /&gt;
&lt;br /&gt;
Extensions for TaskCluster exchanges here (see section &amp;quot;AMQP APIs&amp;quot;):&lt;br /&gt;
* http://taskcluster.github.io/taskcluster-client-go/&lt;br /&gt;
&lt;br /&gt;
= Contributing =&lt;br /&gt;
&lt;br /&gt;
To set up a local system for development, see the [https://github.com/mozilla-services/mozillapulse/blob/master/HACKING.md HACKING.md] file included in the mozillapulse source.&lt;br /&gt;
&lt;br /&gt;
The main Pulse library (mozillapulse) and publisher shims (pulseshims) are written in Python, although there is also a Go library as mentioned in the section above.  We also want to provide a canonical JavaScript library at some point.  To hack on the main Pulse library, you should be comfortable in Python, and it&#039;s helpful to understand the basics of AMQP.  Knowledge of kombu is also useful.&lt;br /&gt;
&lt;br /&gt;
To hack on PulseGuardian, you should know some Python and JavaScript.  Experience with Flask, SQLAlchemy, and RabbitMQ are useful, but you can probably learn what you need as you fix bugs.&lt;br /&gt;
&lt;br /&gt;
Feel free to stop by #pulse or #ateam with questions!&lt;br /&gt;
&lt;br /&gt;
Here is the list of open, unassigned, mentored Pulse and PulseGuardian bugs to get you started.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;bugzilla&amp;gt;&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;quicksearch&amp;quot;: &amp;quot;status:new&amp;quot;,&lt;br /&gt;
        &amp;quot;product&amp;quot;: &amp;quot;Webtools&amp;quot;,&lt;br /&gt;
        &amp;quot;component&amp;quot;: &amp;quot;Pulse&amp;quot;,&lt;br /&gt;
        &amp;quot;f1&amp;quot;: &amp;quot;bug_mentor&amp;quot;,&lt;br /&gt;
        &amp;quot;o1&amp;quot;: &amp;quot;isnotempty&amp;quot;,&lt;br /&gt;
        &amp;quot;include_fields&amp;quot;: &amp;quot;id,summary,priority,status&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/bugzilla&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Once you have your feet wet and are ready to take on a more involved project, here is a list of all current Pulse bugs:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;bugzilla&amp;gt;&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;quicksearch&amp;quot;: &amp;quot;status:new,assigned,reopened,unconfirmed&amp;quot;,&lt;br /&gt;
        &amp;quot;product&amp;quot;: &amp;quot;Webtools&amp;quot;,&lt;br /&gt;
        &amp;quot;component&amp;quot;: &amp;quot;Pulse&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/bugzilla&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For mentored bugs, we use the User Story to provide a link back to this page, as well as any extra information for contributors, such as required knowledge or tools.  The basic text for mentored bugs should be &amp;quot;This is a mentored Pulse bug.  For general information on Pulse, see https://wiki.mozilla.org/Auto-tools/Projects/Pulse, which includes a section on Contributing.&amp;quot;  An example of extra text is &amp;quot;This bug also requires you to have a working mail server.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
= Road Map =&lt;br /&gt;
&lt;br /&gt;
See the [https://bugzilla.mozilla.org/buglist.cgi?resolution=---&amp;amp;query_format=advanced&amp;amp;component=Pulse&amp;amp;product=Webtools prioritized bug list] for all open issues and feature requests.&lt;br /&gt;
&lt;br /&gt;
= Security Model =&lt;br /&gt;
&lt;br /&gt;
This is summarized in the formal Pulse specification above.  What follows is the rationale and some technical implementation notes.&lt;br /&gt;
&lt;br /&gt;
In order to have a reliable, well behaved system, the following assertions will need to be true.&lt;br /&gt;
&lt;br /&gt;
* All users, publishers and consumers alike, must have their own accounts (no guest/public users).&lt;br /&gt;
* Only publishers should be able to declare exchanges.&lt;br /&gt;
* Only the publisher user account associated with a particular vhost should be allowed to publish messages to exchanges in the vhost.  In other words, exactly one user account should be allowed to publish messages within a given vhost.&lt;br /&gt;
* Only the user that created a particular queue should be allowed to consume from it.&lt;br /&gt;
&lt;br /&gt;
Since exchange and queue permissions go together, we&#039;ll need exchange and queue naming conventions mixed with restrictive permissions.  Each user will be restricted to a particular exchange and queue naming prefix.  Many users will be either consumers or publishers, but for simplicity, each user can do both.  Users will have full permissions on &amp;lt;code&amp;gt;&amp;quot;^exchange/&amp;lt;username&amp;gt;/.*$&amp;quot;&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;&amp;quot;^queue/&amp;lt;username&amp;gt;/.*$&amp;quot;&amp;lt;/code&amp;gt;.  They will also have read permissions to exchange/*.  This will both prevent users from writing to other users&#039; exchanges as well as prevent them from consuming from other users&#039; queues.  For convenience, if a consumer creates a nondurable queue, mozillapulse can assign a random suffix to the user&#039;s standard queue name prefix, i.e. &amp;lt;code&amp;gt;queue/&amp;lt;username&amp;gt;/&amp;lt;random string&amp;gt;&amp;lt;/code&amp;gt;, since the user wouldn&#039;t be able to create nor access a completely random server-assigned name.&lt;br /&gt;
&lt;br /&gt;
Note that this doesn&#039;t prevent a consumer from creating an exchange named as a queue, since the permission model doesn&#039;t distinguish between queues and exchanges, and consumers need the ability to create queues.  This is not particularly problematic, since no one would have permission to use that exchange.&lt;br /&gt;
&lt;br /&gt;
With this security model, we technically don&#039;t really need vhosts, since the names of the queues and exchanges the users can use are so specific.  There may still be a benefit in allowing apps to use the same queue name for different exchanges, though, which would be possible if each exchange had its own vhost.  The downside is that you cannot specify &amp;quot;all vhosts&amp;quot; when setting a user&#039;s permissions, so they would either have to list all vhosts they want to use when creating the user in PulseGuardian, and be able to update that list later, or PulseGuardian or some other app would have to automatically add new permissions to all users when a vhost is created.&lt;br /&gt;
&lt;br /&gt;
= Admin Procedures =&lt;br /&gt;
&lt;br /&gt;
jgriffin and mcote have access to the Pulse cluster on CloudAMQP and the following related services:&lt;br /&gt;
&lt;br /&gt;
* PulseGuardian should be deleting queues that are too long. If you need to manually delete a queue, use the Management UI. Try to ping the queue owner first before killing if possible.&lt;br /&gt;
&lt;br /&gt;
= More reading =&lt;br /&gt;
&lt;br /&gt;
* [http://slides.com/mcote/pulse Slides] from a presentation on Pulse.&lt;br /&gt;
* [https://mrcote.info/blog/2015/02/16/pulse-update/ Update] on Pulse from 2015/02/16.&lt;br /&gt;
&lt;br /&gt;
LegNeato also wrote several blog posts on Pulse as he was building it.  They contain some more background if you&#039;re really interested.  They are linked below, in chronological order.&lt;br /&gt;
&lt;br /&gt;
* [http://christian.legnitto.com/blog/2010/07/17/mozilla-pulse-and-rabbitmq/ Mozilla Pulse and RabbitMQ]&lt;br /&gt;
* [http://christian.legnitto.com/blog/2010/08/20/push-notifications-for-bugzilla/ Push notifications for Bugzilla]&lt;br /&gt;
** This idea has been shelved for the time being, both due to security issues and performance.  See [[BMO/ChangeNotificationSystem]] for an alternative.&lt;br /&gt;
* [http://christian.legnitto.com/blog/2010/09/10/bugzilla-amqp-is-now-buzgilla-push-supports-the-stomp-protocol/ bugzilla-amqp is now buzgilla-push, supports the STOMP protocol]&lt;br /&gt;
** See above note.  Just keeping these links for interest&#039;s sake.&lt;br /&gt;
* [http://christian.legnitto.com/blog/2010/10/15/whats-up-with-pulse/ What’s up with Pulse?]&lt;br /&gt;
* [http://christian.legnitto.com/blog/2010/11/23/github-amqp-integration-service-hook-live/ GitHub AMQP integration service hook live!]&lt;br /&gt;
** Tangentially related to Pulse.&lt;br /&gt;
* [http://christian.legnitto.com/blog/2010/12/06/lots-of-pulse-changes-out-of-prototype-mode-this-week/ Lots of Pulse changes, out of prototype mode this week!]&lt;br /&gt;
* [http://christian.legnitto.com/blog/2010/12/22/another-update-on-pulse/ Another update on Pulse]&lt;/div&gt;</summary>
		<author><name>Kmoir</name></author>
	</entry>
	<entry>
		<id>https://wiki.mozilla.org/index.php?title=Auto-tools/Projects/Pulse&amp;diff=1209072</id>
		<title>Auto-tools/Projects/Pulse</title>
		<link rel="alternate" type="text/html" href="https://wiki.mozilla.org/index.php?title=Auto-tools/Projects/Pulse&amp;diff=1209072"/>
		<updated>2019-03-18T14:57:30Z</updated>

		<summary type="html">&lt;p&gt;Kmoir: deprecating buildbot content&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Introducing Pulse =&lt;br /&gt;
&lt;br /&gt;
Pulse is a managed [http://www.rabbitmq.com RabbitMQ] cluster designed to provide loose coupling between automation and infrastructure tools.  The goal of Pulse is to add visibility to Mozilla&#039;s tools and systems and to eliminate polling and other brittle methods of scraping data. This allows more robust, dynamic, and informative tools.&lt;br /&gt;
&lt;br /&gt;
Pulse is available at pulse.mozilla.org:5671 (AMQP over SSL).  It is hosted by [http://cloudamqp.com CloudAMQP].&lt;br /&gt;
&lt;br /&gt;
[[Auto-tools/Projects/Pulse/PulseGuardian|PulseGuardian]] is a tool that manages Pulse&#039;s users and queues (and eventually exchanges).  It is available at https://pulseguardian.mozilla.org and hosted by [http://heroku.com Heroku].&lt;br /&gt;
&lt;br /&gt;
We have a discussion forum available via the standard trio of [news:mozilla.tools.pulse USENET newsgroup], [https://lists.mozilla.org/listinfo/tools-pulse mailing list], and [https://groups.google.com/forum/#!forum/mozilla.tools.pulse Google Group].&lt;br /&gt;
&lt;br /&gt;
File bugs under [https://bugzilla.mozilla.org/enter_bug.cgi?product=Webtools&amp;amp;component=Pulse Webtools :: Pulse].  We don&#039;t have a separate component for PulseGuardian; rather, we just start the summaries with &amp;quot;[PulseGuardian]&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Also see the [https://tools.taskcluster.net/pulse-inspector/ Pulse Inspector] web app, which displays Pulse messages in real time, and the (manually updated) [[/Exchanges|list of Pulse exchanges]].&lt;br /&gt;
&lt;br /&gt;
= System Description =&lt;br /&gt;
&lt;br /&gt;
Pulse isn&#039;t any one thing.  At its heart, it is a RabbitMQ system with a particular configuration and a set of conventions for using it along with a management tool, [[Auto-tools/Projects/Pulse/PulseGuardian|PulseGuardian]], to make Pulse as automated and self-serve as possible.  Pulse follows the pub-sub pattern, in which publishers send messages to topic exchanges, and consumers create queues bound to these exchanges in order to subscribe to the publishers&#039; messages.  In general, publishers create and own exchanges, and consumers create and own queues.&lt;br /&gt;
&lt;br /&gt;
= Specification =&lt;br /&gt;
&lt;br /&gt;
Pulse is a managed [https://www.rabbitmq.com/resources/specs/amqp0-9-1.pdf AMQP 0-9-1]&lt;br /&gt;
service with [https://www.rabbitmq.com/extensions.html RabbitMQ extensions] for publishing messages from Mozilla&lt;br /&gt;
infrastructure. The aim is provide hooks that subscribers can&lt;br /&gt;
use to integrate and extend Mozilla infrastructure.&lt;br /&gt;
&lt;br /&gt;
== Authentication ==&lt;br /&gt;
&lt;br /&gt;
Pulse credentials are managed and issued by [[Auto-tools/Projects/Pulse/PulseGuardian|PulseGuardian]],&lt;br /&gt;
available at https://pulseguardian.mozilla.org. This service SHALL issue&lt;br /&gt;
an &#039;&#039;accessToken&#039;&#039; for any &#039;&#039;clientId&#039;&#039; that is registered&lt;br /&gt;
with &#039;&#039;authorized&#039;&#039; email address.&lt;br /&gt;
The accessToken is strictly secret and MUST NOT be shared&lt;br /&gt;
publicly. The clientId is not secret. When establishing an AMQP&lt;br /&gt;
connection, the clientId and accessToken MUST be used as&lt;br /&gt;
&#039;&#039;username&#039;&#039; and &#039;&#039;password&#039;&#039;, respectively.&lt;br /&gt;
&lt;br /&gt;
== Authorized Users ==&lt;br /&gt;
&lt;br /&gt;
Pulse is intended to be open to all Mozillians who want to&lt;br /&gt;
extend or integrate with Mozilla infrastructure. To guard against&lt;br /&gt;
abuse PulseGuardian users MUST authenticate via Persona. PulseGuardian SHOULD verify that users have a vouched Mozillians profile.&lt;br /&gt;
&lt;br /&gt;
== Publishers ==&lt;br /&gt;
&lt;br /&gt;
Publishers MUST name &#039;&#039;exchanges&#039;&#039; in the form &amp;lt;code&amp;gt;exchange/&amp;lt;clientId&amp;gt;/&amp;lt;name&amp;gt;&amp;lt;/code&amp;gt; where clientId is the userid used to bind/connect to the server. Attempts to name an exchange otherwise SHALL result in an authorization error. Exchanges MUST be &#039;&#039;topic exchanges&#039;&#039; and they MUST be declared &#039;&#039;durable&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Messages MUST contain a UTF-8-encoded [http://tools.ietf.org/html/rfc7159 JSON] payload, and&lt;br /&gt;
their &amp;lt;code&amp;gt;Content-Type&amp;lt;/code&amp;gt; MUST be &amp;lt;code&amp;gt;application/json&amp;lt;/code&amp;gt;.&lt;br /&gt;
Messages SHOULD NOT be larger than 8&amp;amp;nbsp;kB; deviations may be&lt;br /&gt;
feasible for low-traffic exchanges. Messages MUST NOT contain&lt;br /&gt;
secret or sensitive information; all exchanges and messages&lt;br /&gt;
SHALL be considered public.&lt;br /&gt;
&lt;br /&gt;
A message SHOULD carry a &#039;&#039;routing key&#039;&#039;, in which fields have a&lt;br /&gt;
fixed index from the left. Additionally, a message MAY be&lt;br /&gt;
&#039;&#039;cced&#039;&#039; to multiple routing keys, using the RabbitMQ&lt;br /&gt;
[https://www.rabbitmq.com/sender-selected.html &#039;&#039;Sender-selected Distribution&#039;&#039;] extension.&lt;br /&gt;
&lt;br /&gt;
Messages SHOULD be &#039;&#039;durable&#039;&#039; and SHOULD be published over&lt;br /&gt;
RabbitMQ [https://www.rabbitmq.com/confirms.html &#039;&#039;confirm-publish&#039;&#039; channels]. Otherwise, the&lt;br /&gt;
documentation MUST clearly reflect that messages from the&lt;br /&gt;
given exchange do not exhibit deliver &#039;&#039;at-least-once&#039;&#039; semantics.&lt;br /&gt;
&lt;br /&gt;
== Subscribers ==&lt;br /&gt;
&lt;br /&gt;
Subscribers MUST name &#039;&#039;queues&#039;&#039; in the form&lt;br /&gt;
&amp;lt;code&amp;gt;queue/&amp;lt;clientId&amp;gt;/&amp;lt;name&amp;gt;&amp;lt;/code&amp;gt;; attempts to name a queue otherwise&lt;br /&gt;
SHALL result in an authorization error. Queues MAY &#039;&#039;consume&#039;&#039;&lt;br /&gt;
from any exchange prefixed &amp;lt;code&amp;gt;exchange/&amp;lt;/code&amp;gt;; attempts to consume&lt;br /&gt;
from any other exchange SHALL result in an authentication error.&lt;br /&gt;
&lt;br /&gt;
Subscribers MAY limit the size of their queues using the RabbitMQ&lt;br /&gt;
[https://www.rabbitmq.com/maxlength.html &#039;&#039;Queue Length Limit&#039;&#039;] extension. Subscribers MUST NOT let&lt;br /&gt;
their queues grow unbounded; if left unattended, &#039;&#039;Pulse&#039;&#039;&lt;br /&gt;
SHALL notify the owner by email. Additionally, &#039;&#039;Pulse&#039;&#039; MAY delete&lt;br /&gt;
a queue which exceeds defined limits. Subscribers SHOULD specify a&lt;br /&gt;
prefetch limit using the RabbitMQ [https://www.rabbitmq.com/consumer-prefetch.html &#039;&#039;Consumer Prefetch&#039;&#039; limit] extension.&lt;br /&gt;
&lt;br /&gt;
Subscribers SHOULD use either &#039;&#039;durable&#039;&#039; queues or&lt;br /&gt;
&#039;&#039;auto-delete&#039;&#039; queues. Implementors are recommended to aim&lt;br /&gt;
for deliver-&#039;&#039;at-least-once&#039;&#039; semantics.&lt;br /&gt;
&lt;br /&gt;
== Appendix A: Everything in Bullet Points ==&lt;br /&gt;
&lt;br /&gt;
This is a summary of the above.&lt;br /&gt;
&lt;br /&gt;
Pulse:&lt;br /&gt;
* MUST offer registration at &amp;lt;code&amp;gt;pulse.mozilla.org&amp;lt;/code&amp;gt;&lt;br /&gt;
* MUST support [https://www.rabbitmq.com/resources/specs/amqp0-9-1.pdf AMQP 0-9-1] and these RabbitMQ extensions:&lt;br /&gt;
** [https://www.rabbitmq.com/confirms.html Confirms]&lt;br /&gt;
** [https://www.rabbitmq.com/consumer-prefetch.html Consumer Prefetch]&lt;br /&gt;
** [https://www.rabbitmq.com/maxlength.html Queue Length Limit]&lt;br /&gt;
** [https://www.rabbitmq.com/sender-selected.html Sender-selected Distribution]&lt;br /&gt;
* SHOULD exhibit deliver-&#039;&#039;at-least-once&#039;&#039; semantics&lt;br /&gt;
* MAY delete queues that grows beyond &#039;&#039;Pulse&#039;&#039; defined limits&lt;br /&gt;
* SHALL notify owner by email when a queue grows close to &#039;&#039;Pulse&#039;&#039;-defined limits.&lt;br /&gt;
&lt;br /&gt;
Publishers:&lt;br /&gt;
* SHOULD use [https://www.rabbitmq.com/confirms.html confirm-publish channels]&lt;br /&gt;
&lt;br /&gt;
Exchanges:&lt;br /&gt;
* MUST be named &amp;lt;code&amp;gt;exchange/&amp;lt;clientId&amp;gt;/&amp;lt;name&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
* MUST be topic exchanges&lt;br /&gt;
* MUST be durable&lt;br /&gt;
&lt;br /&gt;
Messages:&lt;br /&gt;
* MUST be UTF-8-encoded [http://tools.ietf.org/html/rfc7159 JSON]&lt;br /&gt;
* MUST carry &amp;lt;code&amp;gt;application/json&amp;lt;/code&amp;gt; as &amp;lt;code&amp;gt;Content-Type&amp;lt;/code&amp;gt;&lt;br /&gt;
* SHOULD be durable&lt;br /&gt;
* SHOULD be less than 8 KiB (for good performance)&lt;br /&gt;
* MAY be CC&#039;ed to [https://www.rabbitmq.com/sender-selected.html multiple routing keys]&lt;br /&gt;
* MUST NOT contain private or sensitive information&lt;br /&gt;
* SHOULD have a routing key where fields have a fixed index from the left&lt;br /&gt;
&lt;br /&gt;
Subscribers:&lt;br /&gt;
* SHOULD specify a [https://www.rabbitmq.com/consumer-prefetch.html &#039;&#039;consumer prefetch&#039;&#039; limit]&lt;br /&gt;
&lt;br /&gt;
Queues:&lt;br /&gt;
* MUST be named &amp;lt;code&amp;gt;queue/&amp;lt;clientId&amp;gt;/&amp;lt;name&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
* MAY have a [https://www.rabbitmq.com/maxlength.html limited length]&lt;br /&gt;
* MUST not grow unbounded&lt;br /&gt;
&lt;br /&gt;
= Let&#039;s Use It =&lt;br /&gt;
&lt;br /&gt;
There are currently two Pulse clients available. Please note that you can also connect to Pulse in other languages, provided you have an AMQP 0.9.1 library that will let you interact with AMQP exchanges. See https://github.com/rabbitmq/rabbitmq-tutorials#languages for example.&lt;br /&gt;
&lt;br /&gt;
== Python Pulse client library ==&lt;br /&gt;
&lt;br /&gt;
The [https://github.com/mozilla-services/mozillapulse mozillapulse] Python package provides classes for existing publishers, consumers, and messages so you can quickly build Pulse applications.  See the [https://github.com/mozilla-services/mozillapulse/blob/master/README.md README] to get started (although note that the test publisher is currently offline; see {{bug|1218976}}.  You can use another consumer, e.g. BuildConsumer, to verify your setup.).&lt;br /&gt;
&lt;br /&gt;
This library is somewhat inflexible, however, and should be rewritten. One idea is to turn TaskCluster&#039;s Python client into a standalone package.&lt;br /&gt;
&lt;br /&gt;
== Go (golang) Pulse client library ==&lt;br /&gt;
&lt;br /&gt;
This can be found here:&lt;br /&gt;
* http://taskcluster.github.io/pulse-go/&lt;br /&gt;
&lt;br /&gt;
Extensions for TaskCluster exchanges here (see section &amp;quot;AMQP APIs&amp;quot;):&lt;br /&gt;
* http://taskcluster.github.io/taskcluster-client-go/&lt;br /&gt;
&lt;br /&gt;
= Contributing =&lt;br /&gt;
&lt;br /&gt;
To set up a local system for development, see the [https://github.com/mozilla-services/mozillapulse/blob/master/HACKING.md HACKING.md] file included in the mozillapulse source.&lt;br /&gt;
&lt;br /&gt;
The main Pulse library (mozillapulse) and publisher shims (pulseshims) are written in Python, although there is also a Go library as mentioned in the section above.  We also want to provide a canonical JavaScript library at some point.  To hack on the main Pulse library, you should be comfortable in Python, and it&#039;s helpful to understand the basics of AMQP.  Knowledge of kombu is also useful.&lt;br /&gt;
&lt;br /&gt;
To hack on PulseGuardian, you should know some Python and JavaScript.  Experience with Flask, SQLAlchemy, and RabbitMQ are useful, but you can probably learn what you need as you fix bugs.&lt;br /&gt;
&lt;br /&gt;
Feel free to stop by #pulse or #ateam with questions!&lt;br /&gt;
&lt;br /&gt;
Here is the list of open, unassigned, mentored Pulse and PulseGuardian bugs to get you started.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;bugzilla&amp;gt;&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;quicksearch&amp;quot;: &amp;quot;status:new&amp;quot;,&lt;br /&gt;
        &amp;quot;product&amp;quot;: &amp;quot;Webtools&amp;quot;,&lt;br /&gt;
        &amp;quot;component&amp;quot;: &amp;quot;Pulse&amp;quot;,&lt;br /&gt;
        &amp;quot;f1&amp;quot;: &amp;quot;bug_mentor&amp;quot;,&lt;br /&gt;
        &amp;quot;o1&amp;quot;: &amp;quot;isnotempty&amp;quot;,&lt;br /&gt;
        &amp;quot;include_fields&amp;quot;: &amp;quot;id,summary,priority,status&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/bugzilla&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Once you have your feet wet and are ready to take on a more involved project, here is a list of all current Pulse bugs:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;bugzilla&amp;gt;&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;quicksearch&amp;quot;: &amp;quot;status:new,assigned,reopened,unconfirmed&amp;quot;,&lt;br /&gt;
        &amp;quot;product&amp;quot;: &amp;quot;Webtools&amp;quot;,&lt;br /&gt;
        &amp;quot;component&amp;quot;: &amp;quot;Pulse&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/bugzilla&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For mentored bugs, we use the User Story to provide a link back to this page, as well as any extra information for contributors, such as required knowledge or tools.  The basic text for mentored bugs should be &amp;quot;This is a mentored Pulse bug.  For general information on Pulse, see https://wiki.mozilla.org/Auto-tools/Projects/Pulse, which includes a section on Contributing.&amp;quot;  An example of extra text is &amp;quot;This bug also requires you to have a working mail server.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
= Road Map =&lt;br /&gt;
&lt;br /&gt;
See the [https://bugzilla.mozilla.org/buglist.cgi?resolution=---&amp;amp;query_format=advanced&amp;amp;component=Pulse&amp;amp;product=Webtools prioritized bug list] for all open issues and feature requests.&lt;br /&gt;
&lt;br /&gt;
= Security Model =&lt;br /&gt;
&lt;br /&gt;
This is summarized in the formal Pulse specification above.  What follows is the rationale and some technical implementation notes.&lt;br /&gt;
&lt;br /&gt;
In order to have a reliable, well behaved system, the following assertions will need to be true.&lt;br /&gt;
&lt;br /&gt;
* All users, publishers and consumers alike, must have their own accounts (no guest/public users).&lt;br /&gt;
* Only publishers should be able to declare exchanges.&lt;br /&gt;
* Only the publisher user account associated with a particular vhost should be allowed to publish messages to exchanges in the vhost.  In other words, exactly one user account should be allowed to publish messages within a given vhost.&lt;br /&gt;
* Only the user that created a particular queue should be allowed to consume from it.&lt;br /&gt;
&lt;br /&gt;
Since exchange and queue permissions go together, we&#039;ll need exchange and queue naming conventions mixed with restrictive permissions.  Each user will be restricted to a particular exchange and queue naming prefix.  Many users will be either consumers or publishers, but for simplicity, each user can do both.  Users will have full permissions on &amp;lt;code&amp;gt;&amp;quot;^exchange/&amp;lt;username&amp;gt;/.*$&amp;quot;&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;&amp;quot;^queue/&amp;lt;username&amp;gt;/.*$&amp;quot;&amp;lt;/code&amp;gt;.  They will also have read permissions to exchange/*.  This will both prevent users from writing to other users&#039; exchanges as well as prevent them from consuming from other users&#039; queues.  For convenience, if a consumer creates a nondurable queue, mozillapulse can assign a random suffix to the user&#039;s standard queue name prefix, i.e. &amp;lt;code&amp;gt;queue/&amp;lt;username&amp;gt;/&amp;lt;random string&amp;gt;&amp;lt;/code&amp;gt;, since the user wouldn&#039;t be able to create nor access a completely random server-assigned name.&lt;br /&gt;
&lt;br /&gt;
Note that this doesn&#039;t prevent a consumer from creating an exchange named as a queue, since the permission model doesn&#039;t distinguish between queues and exchanges, and consumers need the ability to create queues.  This is not particularly problematic, since no one would have permission to use that exchange.&lt;br /&gt;
&lt;br /&gt;
With this security model, we technically don&#039;t really need vhosts, since the names of the queues and exchanges the users can use are so specific.  There may still be a benefit in allowing apps to use the same queue name for different exchanges, though, which would be possible if each exchange had its own vhost.  The downside is that you cannot specify &amp;quot;all vhosts&amp;quot; when setting a user&#039;s permissions, so they would either have to list all vhosts they want to use when creating the user in PulseGuardian, and be able to update that list later, or PulseGuardian or some other app would have to automatically add new permissions to all users when a vhost is created.&lt;br /&gt;
&lt;br /&gt;
= Admin Procedures =&lt;br /&gt;
&lt;br /&gt;
jgriffin and mcote have access to the Pulse cluster on CloudAMQP and the following related services:&lt;br /&gt;
&lt;br /&gt;
* PulseGuardian should be deleting queues that are too long. If you need to manually delete a queue, use the Management UI. Try to ping the queue owner first before killing if possible.&lt;br /&gt;
* pulsetranslator service, which normalizes Buildbot messages, is currently running on Heroku and may need to be reset from time to time.&lt;br /&gt;
&lt;br /&gt;
= More reading =&lt;br /&gt;
&lt;br /&gt;
* [http://slides.com/mcote/pulse Slides] from a presentation on Pulse.&lt;br /&gt;
* [https://mrcote.info/blog/2015/02/16/pulse-update/ Update] on Pulse from 2015/02/16.&lt;br /&gt;
&lt;br /&gt;
LegNeato also wrote several blog posts on Pulse as he was building it.  They contain some more background if you&#039;re really interested.  They are linked below, in chronological order.&lt;br /&gt;
&lt;br /&gt;
* [http://christian.legnitto.com/blog/2010/07/17/mozilla-pulse-and-rabbitmq/ Mozilla Pulse and RabbitMQ]&lt;br /&gt;
* [http://christian.legnitto.com/blog/2010/08/20/push-notifications-for-bugzilla/ Push notifications for Bugzilla]&lt;br /&gt;
** This idea has been shelved for the time being, both due to security issues and performance.  See [[BMO/ChangeNotificationSystem]] for an alternative.&lt;br /&gt;
* [http://christian.legnitto.com/blog/2010/09/10/bugzilla-amqp-is-now-buzgilla-push-supports-the-stomp-protocol/ bugzilla-amqp is now buzgilla-push, supports the STOMP protocol]&lt;br /&gt;
** See above note.  Just keeping these links for interest&#039;s sake.&lt;br /&gt;
* [http://christian.legnitto.com/blog/2010/10/15/whats-up-with-pulse/ What’s up with Pulse?]&lt;br /&gt;
* [http://christian.legnitto.com/blog/2010/11/23/github-amqp-integration-service-hook-live/ GitHub AMQP integration service hook live!]&lt;br /&gt;
** Tangentially related to Pulse.&lt;br /&gt;
* [http://christian.legnitto.com/blog/2010/12/06/lots-of-pulse-changes-out-of-prototype-mode-this-week/ Lots of Pulse changes, out of prototype mode this week!]&lt;br /&gt;
* [http://christian.legnitto.com/blog/2010/12/22/another-update-on-pulse/ Another update on Pulse]&lt;/div&gt;</summary>
		<author><name>Kmoir</name></author>
	</entry>
	<entry>
		<id>https://wiki.mozilla.org/index.php?title=Phabricator/Bugzilla_Equivalents&amp;diff=1207309</id>
		<title>Phabricator/Bugzilla Equivalents</title>
		<link rel="alternate" type="text/html" href="https://wiki.mozilla.org/index.php?title=Phabricator/Bugzilla_Equivalents&amp;diff=1207309"/>
		<updated>2019-02-06T14:35:35Z</updated>

		<summary type="html">&lt;p&gt;Kmoir: /* Watch a component */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Some common tasks in Bugzilla do not have direct analogues in Phabricator and others may not be obvious to a new user. This page serves to document these common tasks and how to handle similar situations when using Phabricator.&lt;br /&gt;
&lt;br /&gt;
= Making requests to other users =&lt;br /&gt;
&lt;br /&gt;
== Request &#039;&#039;&#039;review?&#039;&#039;&#039; on a patch ==&lt;br /&gt;
Patches may be [https://moz-conduit.readthedocs.io/en/latest/phabricator-user.html#submitting-patches submitted to Phabricator] for review using [https://github.com/mozilla-conduit/review &#039;&#039;&#039;moz-phab&#039;&#039;&#039;]. It is possible to ask for review as part of patch submission (See the [https://github.com/mozilla-conduit/review#execution &#039;&#039;&#039;moz-phab&#039;&#039;&#039; documentation]).&lt;br /&gt;
&lt;br /&gt;
Note that Phabricator has two reviewer designations, normal and &amp;quot;blocking&amp;quot;. Setting a user as a &amp;quot;blocking&amp;quot; reviewer is similar to the common use of a &#039;&#039;&#039;review?&#039;&#039;&#039; flag in that it requires review from that user or an explicit removal. Normal reviewers work differently in that acceptance from any reviewer removes the review from that user&#039;s queue (i.e. Only a single reviewer must accept). Using blocking reviewers mimics the Bugzilla workflow most closely, and there is a &#039;&#039;&#039;submit.always_blocking&#039;&#039;&#039; [https://github.com/mozilla-conduit/review#configuration configuration] option in &#039;&#039;&#039;moz-phab&#039;&#039;&#039; which will default to making all reviewers blocking.&lt;br /&gt;
&lt;br /&gt;
== Request &#039;&#039;&#039;feedback?&#039;&#039;&#039; on a patch ==&lt;br /&gt;
Phabricator does not distinguish between asking for final review and requesting other forms of feedback. It is best to use an explicit comment explaining you would like feedback, along with one of:&lt;br /&gt;
&lt;br /&gt;
* Requesting review from the user you&#039;d like feedback from.&lt;br /&gt;
[[File:Non-blocking-review.png|320px]]&lt;br /&gt;
&lt;br /&gt;
* Using an &#039;&#039;&#039;@&#039;&#039;&#039; mention. Including &#039;&#039;&#039;@&amp;lt;username&amp;gt;&#039;&#039;&#039; in a comment on Phabricator notifies the provided user of your message. The notification is a one-time action which does not require acknowledgement, so it is best to make it clear with your text that you are expecting feedback.&lt;br /&gt;
[[File:At-mention.png|479px]]&lt;br /&gt;
&lt;br /&gt;
== Make a &#039;&#039;&#039;needinfo?&#039;&#039;&#039; request ==&lt;br /&gt;
Phabricator does not have a feature directly comparable to Bugzilla&#039;s &#039;&#039;&#039;needinfo?&#039;&#039;&#039; request. We suggest one of the following alternatives:&lt;br /&gt;
&lt;br /&gt;
* Use an &#039;&#039;&#039;@&#039;&#039;&#039; mention. Including &#039;&#039;&#039;@&amp;lt;username&amp;gt;&#039;&#039;&#039; in a comment on Phabricator notifies the provided user of your message. The notification is a one-time action which does not require acknowledgement, so it is best to make it clear with your text that you expect a response.&lt;br /&gt;
[[File:At-mention.png|479px]]&lt;br /&gt;
&lt;br /&gt;
* Add the user as a &#039;&#039;&#039;blocking reviewer&#039;&#039;&#039; and indicate your intent by including a comment. The Phabricator revision cannot be &#039;&#039;&#039;Accepted&#039;&#039;&#039; until the indicated user has either &#039;&#039;&#039;Accepted&#039;&#039;&#039; the revision, &#039;&#039;&#039;Resigned&#039;&#039;&#039; as a reviewer, or removed as a reviewer. Since this is re-purposing the normal request for review it is best to include a comment making your intended use clear.&lt;br /&gt;
[[File:Blocking-reviewer.png|324px]]&lt;br /&gt;
&lt;br /&gt;
== Request &#039;&#039;&#039;review?&#039;&#039;&#039; of an image file ==&lt;br /&gt;
If you have a stand-alone image you&#039;d like feedback on you may still do so using Bugzilla. Since the &#039;&#039;&#039;review?&#039;&#039;&#039; flag may be disabled for the component, please use a &#039;&#039;&#039;needinfo?&#039;&#039;&#039; or &#039;&#039;&#039;feedback?&#039;&#039;&#039; flag.&lt;br /&gt;
&lt;br /&gt;
Phabricator does have the [https://phabricator.services.mozilla.com/pholio/ Pholio] application for commenting on mocks. Unfortunately it is not well integrated with the rest of our workflows and you cannot flag specific users for review. You can find Pholio in the main menu as &amp;quot;Design Review&amp;quot;, and a new image can be uploaded by clicking [https://phabricator.services.mozilla.com/pholio/create/ &amp;quot;Create Mock&amp;quot;] on the main Pholio page.&lt;br /&gt;
&lt;br /&gt;
== Clear a &#039;&#039;&#039;review?&#039;&#039;&#039; flag from your own patch ==&lt;br /&gt;
There are two ways to remove a patch from the queue of your reviewers:&lt;br /&gt;
&lt;br /&gt;
* Explicitly edit the reviewers and remove the reviewer using the &amp;quot;Change Reviewers&amp;quot; action.&lt;br /&gt;
[[File:Change-Reviewers.png|206px]]&lt;br /&gt;
&lt;br /&gt;
* &amp;quot;Plan Changes&amp;quot; to your revision, which removes the revision from their queue until you have posted a new version of the diff.&lt;br /&gt;
[[File:Plan-Changes.png|205px]]&lt;br /&gt;
&lt;br /&gt;
Both of these actions are taken using the &amp;quot;Add Action...&amp;quot; dropdown at the bottom of the revision&#039;s page. After you have added the action (along with any comments) you must click the &amp;quot;Submit&amp;quot; button.&lt;br /&gt;
&lt;br /&gt;
== Request &#039;&#039;&#039;approval-mozilla-&amp;lt;repo&amp;gt;?&#039;&#039;&#039; uplift on a patch ==&lt;br /&gt;
At this time &#039;&#039;&#039;approval-mozilla-&amp;lt;repo&amp;gt;?&#039;&#039;&#039; requests should use the current [[Release Management/Uplift rules]]. &#039;&#039;&#039;approval-mozilla-&amp;lt;repo&amp;gt;?&#039;&#039;&#039; can be set on the Bugzilla attachment which corresponds to the revision in Phabricator. There is a plan to move uplift approval to Phabricator fully, look out for an announcement when that is further along.&lt;br /&gt;
&lt;br /&gt;
== Request &#039;&#039;&#039;sec-approval?&#039;&#039;&#039; on a patch ==&lt;br /&gt;
At this time &#039;&#039;&#039;sec-approval?&#039;&#039;&#039; requests should use the current [[Security/Bug Approval Process]]. &#039;&#039;&#039;sec-approval?&#039;&#039;&#039; can be set on the Bugzilla attachment which corresponds to the revision in Phabricator. There is a plan to move &#039;&#039;&#039;sec-approval&#039;&#039;&#039; to Phabricator fully, look out for an announcement when that is further along.&lt;br /&gt;
&lt;br /&gt;
== Request &#039;&#039;&#039;checkin-needed&#039;&#039;&#039; to land your changes ==&lt;br /&gt;
At this time &#039;&#039;&#039;checkin-needed&#039;&#039;&#039; requests should use the current [https://developer.mozilla.org/en-US/docs/Mozilla/Developer_guide/How_to_Submit_a_Patch#Getting_the_patch_checked_into_the_tree checkin-needed process]. &#039;&#039;&#039;checkin-needed&#039;&#039;&#039; can be set on the bug linked to the Phabricator revision you wish to land. There is a plan to move &#039;&#039;&#039;checkin-needed&#039;&#039;&#039; to Phabricator fully, look out for an announcement when that is further along (Tracking [https://bugzilla.mozilla.org/show_bug.cgi?id=1514807 Bug 1514807]).&lt;br /&gt;
&lt;br /&gt;
= Responding to requests =&lt;br /&gt;
&lt;br /&gt;
== Clear a &#039;&#039;&#039;review?&#039;&#039;&#039; flag asked of you ==&lt;br /&gt;
If you&#039;d like to remove yourself as a reviewer you can do so in one of two ways:&lt;br /&gt;
&lt;br /&gt;
* Explicitly edit the reviewers and remove yourself using the &amp;quot;Change Reviewers&amp;quot; action.&lt;br /&gt;
[[File:Change-Reviewers-reviewer.png|216px]]&lt;br /&gt;
&lt;br /&gt;
* Add the &amp;quot;Resign as Reviewer&amp;quot; action, which marks you as resigned. Resigning has mostly the same effect as removing yourself from the reviewer list except for the case when a project you&#039;re a member of has been asked for review. Resigning in the project case explicitly marks you as not a reviewer and is easier than removing the project and re-adding all other members.&lt;br /&gt;
[[File:Resign-As-Reviewer.png|204px]]&lt;br /&gt;
&lt;br /&gt;
Both of these actions are taken using the &amp;quot;Add Action...&amp;quot; dropdown at the bottom of the revision&#039;s page. After you have added the action (along with any comments), you must click the &amp;quot;Submit&amp;quot; button.&lt;br /&gt;
&lt;br /&gt;
= Querying for Information =&lt;br /&gt;
&lt;br /&gt;
== Query a user&#039;s review queue ==&lt;br /&gt;
You may query a user&#039;s review queue by crafting an advanced differential search query. Take the following steps:&lt;br /&gt;
# Visit this example query page: https://phabricator.services.mozilla.com/differential/query/IeE2zgiqj9EX/&lt;br /&gt;
# Change &amp;quot;Responsible Users&amp;quot; to the user you&#039;re interested in.&lt;br /&gt;
#* You probably do &#039;&#039;not&#039;&#039; want &amp;quot;Exact User: &amp;lt;username&amp;gt;&amp;quot; as it excludes revisions for the user&#039;s projects.&lt;br /&gt;
# Click &amp;quot;Search&amp;quot;.&lt;br /&gt;
# The user&#039;s review queue are items under the &amp;quot;Must Review&amp;quot; and &amp;quot;Ready to Review&amp;quot; headings.&lt;br /&gt;
&lt;br /&gt;
== Query a user&#039;s activity ==&lt;br /&gt;
You may query a user&#039;s activity by visiting their profile page: https://phabricator.services.mozilla.com/p/&amp;lt;username&amp;gt;/. An example user&#039;s profile page is here: https://phabricator.services.mozilla.com/p/bzbarsky/. The &amp;quot;Recent Activity&amp;quot; box lists only recent activity, but you may click the &amp;quot;View All&amp;quot; button to be taken to an advanced query of the user&#039;s activity.&lt;br /&gt;
&lt;br /&gt;
== Save a frequently used query ==&lt;br /&gt;
Most query advanced query pages have a &amp;quot;Save Query&amp;quot; button on the results page. Clicking this allows you to give the query a name and add it to your personal query list. After saving a query you can share it with others by copying the URL of the results page (Note, this URL does not include the saved query name and is quite opaque).&lt;br /&gt;
&lt;br /&gt;
= Other Tasks =&lt;br /&gt;
&lt;br /&gt;
== Upload a WIP patch ==&lt;br /&gt;
Work in progress patches can be uploaded to Phabricator in the same way as a normal patch, although generally you would not add reviewers. If you&#039;d like someone to look at your WIP patch you may add reviewers but it is best to explicitly mention what you expect from the reviewer.&lt;br /&gt;
&lt;br /&gt;
== Watch a component ==&lt;br /&gt;
Phabricator has a notification system, [https://phabricator.services.mozilla.com/herald/ Herald], which allows you to create custom notification rules. This can be used to subscribe yourself to revisions that touch certain parts of the code base, or even add yourself as a reviewer. You can view example rules other user&#039;s have created [https://phabricator.services.mozilla.com/herald/query/all/ here].&lt;br /&gt;
&lt;br /&gt;
== How do I deal with non-mozilla branch patches after bugzilla review flags are disable on components on Feb 28? ==&lt;br /&gt;
&lt;br /&gt;
In the announcement, it states &lt;br /&gt;
&lt;br /&gt;
Initially, only code landing in mozilla-central will be required to be reviewed in Phabricator. Once we have implemented more processes in Phabricator, we will move reviews of all of the mozilla-central “branches” to Phabricator.&lt;br /&gt;
&lt;br /&gt;
What does this mean for cases where a separate branch patch needs to be written after Feb 28 before it&#039;s possible to review the other branches in Phabricator?&lt;br /&gt;
&lt;br /&gt;
You can review anything Phabricator, however Lando can&#039;t land to the other &amp;quot;branches&amp;quot; at this time. Uplift approval will also be moved at a later date.&lt;/div&gt;</summary>
		<author><name>Kmoir</name></author>
	</entry>
	<entry>
		<id>https://wiki.mozilla.org/index.php?title=Phabricator/Bugzilla_Equivalents&amp;diff=1206999</id>
		<title>Phabricator/Bugzilla Equivalents</title>
		<link rel="alternate" type="text/html" href="https://wiki.mozilla.org/index.php?title=Phabricator/Bugzilla_Equivalents&amp;diff=1206999"/>
		<updated>2019-01-31T22:19:20Z</updated>

		<summary type="html">&lt;p&gt;Kmoir: /* Upload WIP patches */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Some common tasks in Bugzilla do not have direct analogues in Phabricator and others may not be obvious to a new user. This page serves to document these common tasks and how similar situations should be handled when using Phabricator.&lt;br /&gt;
&lt;br /&gt;
= Tasks =&lt;br /&gt;
&lt;br /&gt;
== Querying for Information ==&lt;br /&gt;
&lt;br /&gt;
=== Query a user&#039;s review queue ===&lt;br /&gt;
You may query a user&#039;s review queue by crafting an advanced differential search query. Take the following steps:&lt;br /&gt;
* Visit this example query page: https://phabricator.services.mozilla.com/differential/query/IeE2zgiqj9EX/&lt;br /&gt;
* Change &amp;quot;Responsible Users&amp;quot; to the user you&#039;re interested in.&lt;br /&gt;
** You probably do &#039;&#039;not&#039;&#039; want &amp;quot;Exact User: &amp;lt;username&amp;gt;&amp;quot; as it excludes revisions for the user&#039;s projects.&lt;br /&gt;
* Click &amp;quot;Search&amp;quot;.&lt;br /&gt;
* The user&#039;s review queue are items under the &amp;quot;Must Review&amp;quot; and &amp;quot;Ready to Review&amp;quot; headings.&lt;br /&gt;
&lt;br /&gt;
=== Query a user&#039;s activity ===&lt;br /&gt;
You may query a user&#039;s activity by visiting their profile page: https://phabricator.services.mozilla.com/p/&amp;lt;username&amp;gt;/. An example user&#039;s profile page is here: https://phabricator.services.mozilla.com/p/bzbarsky/. The &amp;quot;Recent Activity&amp;quot; box lists only recent activity, but you may click the &amp;quot;View All&amp;quot; button to be taken to an advanced query of the user&#039;s activity.&lt;br /&gt;
&lt;br /&gt;
=== Save a frequently used query ===&lt;br /&gt;
Most query advanced query pages will have a &amp;quot;Save Query&amp;quot; button on the results page. Clicking this will allow you to give the query a name and add it to your personal query list. After saving a query you can share it with others by copying the URL of the results page (Note, this url does not include the saved query name and is quite opaque).&lt;br /&gt;
&lt;br /&gt;
== Making requests to other users ==&lt;br /&gt;
&lt;br /&gt;
=== Make a &#039;&#039;&#039;needinfo?&#039;&#039;&#039; request ===&lt;br /&gt;
Phabricator does not have a feature directly comparable to Bugzilla&#039;s &#039;&#039;&#039;needinfo?&#039;&#039;&#039; request. We suggest one of the following alternatives:&lt;br /&gt;
* Use an &#039;&#039;&#039;@&#039;&#039;&#039; mention. Including &#039;&#039;&#039;@&amp;lt;username&amp;gt;&#039;&#039;&#039; in a comment on Phabricator will notify the provided user of your message. This is a one-time notification which does not require acknowledgement, so it is best to make it clear with your text that you expect a response.&lt;br /&gt;
* Add the user as a &#039;&#039;&#039;blocking reviewer&#039;&#039;&#039; and indicate your intent by including a comment. This will prevent the Phabricator revision from becoming &#039;&#039;&#039;Accepted&#039;&#039;&#039; until the indicated user has either &#039;&#039;&#039;Accepted&#039;&#039;&#039; the revision, &#039;&#039;&#039;Resigned&#039;&#039;&#039; as a reviewer, or been removed as a reviewer. Since this is re-purposing the normal request for review it is best to include a comment making your intended use clear.&lt;br /&gt;
&lt;br /&gt;
=== Request &#039;&#039;&#039;feedback?&#039;&#039;&#039; on a patch ===&lt;br /&gt;
Phabricator does not distinguish between asking for final review and requesting other forms of feedback. It is best to use an explicit comment explaining you would like feedback, along with one of:&lt;br /&gt;
* Requesting review from the user you&#039;d like feedback from.&lt;br /&gt;
* Using an &#039;&#039;&#039;@&#039;&#039;&#039; mention. Including &#039;&#039;&#039;@&amp;lt;username&amp;gt;&#039;&#039;&#039; in a comment on Phabricator will notify the provided user of your message. This is a one-time notification which does not require acknowledgement, so it is best to make it clear with your text that you are expecting feedback.&lt;br /&gt;
&lt;br /&gt;
=== Upload WIP patches ===&lt;br /&gt;
&lt;br /&gt;
TODO: Not sure if this workflow should be integrated into the request feedback section.&lt;br /&gt;
&lt;br /&gt;
=== Request &#039;&#039;&#039;review?&#039;&#039;&#039; on a patch ===&lt;br /&gt;
TODO: moz-phab, add reviewer, blocking vs non-blocking.&lt;br /&gt;
&lt;br /&gt;
=== Clear a &#039;&#039;&#039;review?&#039;&#039;&#039; flag from your own patch ===&lt;br /&gt;
TODO: plan changes vs edit reviewers.&lt;br /&gt;
&lt;br /&gt;
=== Clear a &#039;&#039;&#039;review?&#039;&#039;&#039; flag asked of you ===&lt;br /&gt;
TODO: request changes vs resign.&lt;br /&gt;
&lt;br /&gt;
=== Request uplift approval on a patch ===&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
=== Request &#039;&#039;&#039;checkin-needed&#039;&#039;&#039; to land your changes ===&lt;br /&gt;
TODO: Move to phabricator tag.&lt;br /&gt;
&lt;br /&gt;
=== Request &#039;&#039;&#039;review?&#039;&#039;&#039; of an image file ===&lt;br /&gt;
TODO: Pholio&lt;br /&gt;
&lt;br /&gt;
=== Request &#039;&#039;&#039;sec-approval?&#039;&#039;&#039; on a patch ===&lt;br /&gt;
TODO&lt;/div&gt;</summary>
		<author><name>Kmoir</name></author>
	</entry>
	<entry>
		<id>https://wiki.mozilla.org/index.php?title=Phabricator/Bugzilla_Equivalents&amp;diff=1206998</id>
		<title>Phabricator/Bugzilla Equivalents</title>
		<link rel="alternate" type="text/html" href="https://wiki.mozilla.org/index.php?title=Phabricator/Bugzilla_Equivalents&amp;diff=1206998"/>
		<updated>2019-01-31T22:18:59Z</updated>

		<summary type="html">&lt;p&gt;Kmoir: /* Request feedback? on a patch */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Some common tasks in Bugzilla do not have direct analogues in Phabricator and others may not be obvious to a new user. This page serves to document these common tasks and how similar situations should be handled when using Phabricator.&lt;br /&gt;
&lt;br /&gt;
= Tasks =&lt;br /&gt;
&lt;br /&gt;
== Querying for Information ==&lt;br /&gt;
&lt;br /&gt;
=== Query a user&#039;s review queue ===&lt;br /&gt;
You may query a user&#039;s review queue by crafting an advanced differential search query. Take the following steps:&lt;br /&gt;
* Visit this example query page: https://phabricator.services.mozilla.com/differential/query/IeE2zgiqj9EX/&lt;br /&gt;
* Change &amp;quot;Responsible Users&amp;quot; to the user you&#039;re interested in.&lt;br /&gt;
** You probably do &#039;&#039;not&#039;&#039; want &amp;quot;Exact User: &amp;lt;username&amp;gt;&amp;quot; as it excludes revisions for the user&#039;s projects.&lt;br /&gt;
* Click &amp;quot;Search&amp;quot;.&lt;br /&gt;
* The user&#039;s review queue are items under the &amp;quot;Must Review&amp;quot; and &amp;quot;Ready to Review&amp;quot; headings.&lt;br /&gt;
&lt;br /&gt;
=== Query a user&#039;s activity ===&lt;br /&gt;
You may query a user&#039;s activity by visiting their profile page: https://phabricator.services.mozilla.com/p/&amp;lt;username&amp;gt;/. An example user&#039;s profile page is here: https://phabricator.services.mozilla.com/p/bzbarsky/. The &amp;quot;Recent Activity&amp;quot; box lists only recent activity, but you may click the &amp;quot;View All&amp;quot; button to be taken to an advanced query of the user&#039;s activity.&lt;br /&gt;
&lt;br /&gt;
=== Save a frequently used query ===&lt;br /&gt;
Most query advanced query pages will have a &amp;quot;Save Query&amp;quot; button on the results page. Clicking this will allow you to give the query a name and add it to your personal query list. After saving a query you can share it with others by copying the URL of the results page (Note, this url does not include the saved query name and is quite opaque).&lt;br /&gt;
&lt;br /&gt;
== Making requests to other users ==&lt;br /&gt;
&lt;br /&gt;
=== Make a &#039;&#039;&#039;needinfo?&#039;&#039;&#039; request ===&lt;br /&gt;
Phabricator does not have a feature directly comparable to Bugzilla&#039;s &#039;&#039;&#039;needinfo?&#039;&#039;&#039; request. We suggest one of the following alternatives:&lt;br /&gt;
* Use an &#039;&#039;&#039;@&#039;&#039;&#039; mention. Including &#039;&#039;&#039;@&amp;lt;username&amp;gt;&#039;&#039;&#039; in a comment on Phabricator will notify the provided user of your message. This is a one-time notification which does not require acknowledgement, so it is best to make it clear with your text that you expect a response.&lt;br /&gt;
* Add the user as a &#039;&#039;&#039;blocking reviewer&#039;&#039;&#039; and indicate your intent by including a comment. This will prevent the Phabricator revision from becoming &#039;&#039;&#039;Accepted&#039;&#039;&#039; until the indicated user has either &#039;&#039;&#039;Accepted&#039;&#039;&#039; the revision, &#039;&#039;&#039;Resigned&#039;&#039;&#039; as a reviewer, or been removed as a reviewer. Since this is re-purposing the normal request for review it is best to include a comment making your intended use clear.&lt;br /&gt;
&lt;br /&gt;
=== Request &#039;&#039;&#039;feedback?&#039;&#039;&#039; on a patch ===&lt;br /&gt;
Phabricator does not distinguish between asking for final review and requesting other forms of feedback. It is best to use an explicit comment explaining you would like feedback, along with one of:&lt;br /&gt;
* Requesting review from the user you&#039;d like feedback from.&lt;br /&gt;
* Using an &#039;&#039;&#039;@&#039;&#039;&#039; mention. Including &#039;&#039;&#039;@&amp;lt;username&amp;gt;&#039;&#039;&#039; in a comment on Phabricator will notify the provided user of your message. This is a one-time notification which does not require acknowledgement, so it is best to make it clear with your text that you are expecting feedback.&lt;br /&gt;
&lt;br /&gt;
=== Upload WIP patches ===&lt;br /&gt;
&lt;br /&gt;
Not sure if this workflow should be integrated into the request feedback section.&lt;br /&gt;
&lt;br /&gt;
=== Request &#039;&#039;&#039;review?&#039;&#039;&#039; on a patch ===&lt;br /&gt;
TODO: moz-phab, add reviewer, blocking vs non-blocking.&lt;br /&gt;
&lt;br /&gt;
=== Clear a &#039;&#039;&#039;review?&#039;&#039;&#039; flag from your own patch ===&lt;br /&gt;
TODO: plan changes vs edit reviewers.&lt;br /&gt;
&lt;br /&gt;
=== Clear a &#039;&#039;&#039;review?&#039;&#039;&#039; flag asked of you ===&lt;br /&gt;
TODO: request changes vs resign.&lt;br /&gt;
&lt;br /&gt;
=== Request uplift approval on a patch ===&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
=== Request &#039;&#039;&#039;checkin-needed&#039;&#039;&#039; to land your changes ===&lt;br /&gt;
TODO: Move to phabricator tag.&lt;br /&gt;
&lt;br /&gt;
=== Request &#039;&#039;&#039;review?&#039;&#039;&#039; of an image file ===&lt;br /&gt;
TODO: Pholio&lt;br /&gt;
&lt;br /&gt;
=== Request &#039;&#039;&#039;sec-approval?&#039;&#039;&#039; on a patch ===&lt;br /&gt;
TODO&lt;/div&gt;</summary>
		<author><name>Kmoir</name></author>
	</entry>
	<entry>
		<id>https://wiki.mozilla.org/index.php?title=DeveloperServices&amp;diff=1205299</id>
		<title>DeveloperServices</title>
		<link rel="alternate" type="text/html" href="https://wiki.mozilla.org/index.php?title=DeveloperServices&amp;diff=1205299"/>
		<updated>2018-12-18T22:02:56Z</updated>

		<summary type="html">&lt;p&gt;Kmoir: /* Roster */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;section begin=summary /&amp;gt;{{TeamSummary&lt;br /&gt;
|teamtitle=Developer Services&lt;br /&gt;
|teampagelocation=DeveloperServices&lt;br /&gt;
|teamlead=Kendall Libby&lt;br /&gt;
|mailinglist=developer-services@mozilla.org&lt;br /&gt;
|description=The Developer Services team works on version control systems and related tools at Mozilla.&lt;br /&gt;
* We work on hg, git-internal, and vcs-sync.&lt;br /&gt;
* We support the try repository.&lt;br /&gt;
* We also provide operational support for Treeherder (DB only), and DXR.&lt;br /&gt;
}}&amp;lt;section end=summary /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Oncall for VCS =&lt;br /&gt;
&amp;quot;Oncall&amp;quot; is really &amp;quot;escalation path&amp;quot; for services we handle. Start with the service owner, then irc channel (below), then escalate to oncall if no response.&lt;br /&gt;
{| class=&amp;quot;fullwidth-table&amp;quot;&lt;br /&gt;
| style=&amp;quot;background:#EFEFEF;&amp;quot; |&#039;&#039;&#039;Role&#039;&#039;&#039;&lt;br /&gt;
| style=&amp;quot;background:#EFEFEF;&amp;quot; |&#039;&#039;&#039;Name&#039;&#039;&#039;&lt;br /&gt;
| style=&amp;quot;background:#EFEFEF;&amp;quot; |&#039;&#039;&#039;IRC Contact&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Primary&lt;br /&gt;
| Kendall Libby&lt;br /&gt;
| fubar&lt;br /&gt;
|-&lt;br /&gt;
| Backup on call&lt;br /&gt;
| Jacob Watkins&lt;br /&gt;
| dividehex&lt;br /&gt;
|}&lt;br /&gt;
As always with service issues, please indicate urgency and contact information in any page or voice mail. Using Nagios paging is most reliable.  For less urgent contact methods, see [[#contact|contact info]] below.&lt;br /&gt;
&lt;br /&gt;
= Roster =&lt;br /&gt;
{| class=&amp;quot;fullwidth-table&amp;quot;&lt;br /&gt;
| style=&amp;quot;background:#EFEFEF;&amp;quot; |&#039;&#039;&#039;Name&#039;&#039;&#039;&lt;br /&gt;
| style=&amp;quot;background:#EFEFEF;&amp;quot; |&#039;&#039;&#039;Contact&#039;&#039;&#039;&lt;br /&gt;
| style=&amp;quot;background:#EFEFEF;&amp;quot; | &#039;&#039;&#039;Location&#039;&#039;&#039;&lt;br /&gt;
| style=&amp;quot;background:#EFEFEF;&amp;quot; | &#039;&#039;&#039;Project(s)&#039;&#039;&#039;&lt;br /&gt;
| style=&amp;quot;background:#EFEFEF;&amp;quot; | &#039;&#039;&#039;Working Hours&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|Kendall Libby&lt;br /&gt;
|fubar&lt;br /&gt;
|Boston, MA, USA&lt;br /&gt;
|Treeherder (DB), DXR, hg, git-internal&lt;br /&gt;
|ET&lt;br /&gt;
|-&lt;br /&gt;
|Jake Watkins&lt;br /&gt;
|dividehex&lt;br /&gt;
|California, USA&lt;br /&gt;
|Autoland, Treeherder (DB)&lt;br /&gt;
|PT&lt;br /&gt;
|-&lt;br /&gt;
|David House&lt;br /&gt;
|dhouse&lt;br /&gt;
|Montana, USA&lt;br /&gt;
|DXR, vcssync&lt;br /&gt;
|MT&lt;br /&gt;
|-&lt;br /&gt;
|Connor Sheehan&lt;br /&gt;
|sheehan&lt;br /&gt;
|Toronto, CA&lt;br /&gt;
|hg&lt;br /&gt;
|ET&lt;br /&gt;
|-&lt;br /&gt;
|Steven Macleod&lt;br /&gt;
|smacleod&lt;br /&gt;
|Toronto, CA&lt;br /&gt;
|hg&lt;br /&gt;
|ET&lt;br /&gt;
|-&lt;br /&gt;
|Byron Jones&lt;br /&gt;
|glob&lt;br /&gt;
|Perth, AUS&lt;br /&gt;
|hg&lt;br /&gt;
|GMT+08:00&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;contact&amp;quot;&amp;gt; &amp;lt;/div&amp;gt;&lt;br /&gt;
To contact all of the above, use the list developer-services@mozilla.org or [ircs://irc.mozilla.org/#vcs #vcs].&lt;br /&gt;
&lt;br /&gt;
Additional folks work on various modifications and extensions to the version control systems. They can be reached at dev-version-control@lists.mozilla.org or [ircs://irc.mozilla.org/#vcs #vcs].&lt;br /&gt;
&lt;br /&gt;
The other systems we support follow the &amp;quot;devops&amp;quot; model -- the first point of contact for operations and support are the following channels on irc:&lt;br /&gt;
* [ircs://irc.mozilla.org/#bteam #bteam] for BMO&lt;br /&gt;
* [ircs://irc.mozilla.org/#treeherder #treeherder] for Treeherder ([https://groups.google.com/forum/#!forum/mozilla.tools.treeherder discussion list])&lt;br /&gt;
* [ircs://irc.mozilla.org/#mozreview #mozreview] for MozReview&lt;br /&gt;
* [ircs://irc.mozilla.org/#static #static] for DXR&lt;br /&gt;
&lt;br /&gt;
= Meetings =&lt;br /&gt;
* [[DeveloperServices/TeamMeetings|https://wiki.mozilla.org/DeveloperServices/TeamMeetings]]&lt;br /&gt;
&lt;br /&gt;
= Services =&lt;br /&gt;
* [[/Account Recovery]] - how to re-enable account access&lt;br /&gt;
* [[/git]] - details of our Git DVCS system&lt;br /&gt;
* [[/hg]] - details of our Mercurial DVCS system&lt;/div&gt;</summary>
		<author><name>Kmoir</name></author>
	</entry>
	<entry>
		<id>https://wiki.mozilla.org/index.php?title=DeveloperServices&amp;diff=1197437</id>
		<title>DeveloperServices</title>
		<link rel="alternate" type="text/html" href="https://wiki.mozilla.org/index.php?title=DeveloperServices&amp;diff=1197437"/>
		<updated>2018-07-17T19:21:12Z</updated>

		<summary type="html">&lt;p&gt;Kmoir: /* Roster */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;section begin=summary /&amp;gt;{{TeamSummary&lt;br /&gt;
|teamtitle=Developer Services&lt;br /&gt;
|teampagelocation=DeveloperServices&lt;br /&gt;
|teamlead=Kendall Libby&lt;br /&gt;
|mailinglist=developer-services@mozilla.org&lt;br /&gt;
|description=The Developer Services team works on version control systems and related tools at Mozilla.&lt;br /&gt;
* We work on hg, git-internal, and svn.&lt;br /&gt;
* We support the try repository.&lt;br /&gt;
* We also provide operational support for BMO, MozReview, Treeherder (DB only), and DXR.&lt;br /&gt;
}}&amp;lt;section end=summary /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Oncall for VCS =&lt;br /&gt;
&amp;quot;Oncall&amp;quot; is really &amp;quot;escalation path&amp;quot; for services we handle. Start with the service owner, then irc channel (below), then escalate to oncall if no response.&lt;br /&gt;
{| class=&amp;quot;fullwidth-table&amp;quot;&lt;br /&gt;
| style=&amp;quot;background:#EFEFEF;&amp;quot; |&#039;&#039;&#039;Role&#039;&#039;&#039;&lt;br /&gt;
| style=&amp;quot;background:#EFEFEF;&amp;quot; |&#039;&#039;&#039;Name&#039;&#039;&#039;&lt;br /&gt;
| style=&amp;quot;background:#EFEFEF;&amp;quot; |&#039;&#039;&#039;IRC Contact&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Primary&lt;br /&gt;
| Kendall Libby&lt;br /&gt;
| fubar&lt;br /&gt;
|-&lt;br /&gt;
| Backup on call&lt;br /&gt;
| Jacob Watkins&lt;br /&gt;
| dividehex&lt;br /&gt;
|}&lt;br /&gt;
As always with service issues, please indicate urgency and contact information in any page or voice mail. Using Nagios paging is most reliable.  For less urgent contact methods, see [[#contact|contact info]] below.&lt;br /&gt;
&lt;br /&gt;
= Roster =&lt;br /&gt;
{| class=&amp;quot;fullwidth-table&amp;quot;&lt;br /&gt;
| style=&amp;quot;background:#EFEFEF;&amp;quot; |&#039;&#039;&#039;Name&#039;&#039;&#039;&lt;br /&gt;
| style=&amp;quot;background:#EFEFEF;&amp;quot; |&#039;&#039;&#039;Contact&#039;&#039;&#039;&lt;br /&gt;
| style=&amp;quot;background:#EFEFEF;&amp;quot; | &#039;&#039;&#039;Location&#039;&#039;&#039;&lt;br /&gt;
| style=&amp;quot;background:#EFEFEF;&amp;quot; | &#039;&#039;&#039;Project(s)&#039;&#039;&#039;&lt;br /&gt;
| style=&amp;quot;background:#EFEFEF;&amp;quot; | &#039;&#039;&#039;Working Hours&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|Kendall Libby&lt;br /&gt;
|fubar&lt;br /&gt;
|Boston, MA, USA&lt;br /&gt;
|BMO, Treeherder (DB), MozReview, DXR, hg, git&lt;br /&gt;
|ET&lt;br /&gt;
|-&lt;br /&gt;
|Jake Watkins&lt;br /&gt;
|dividehex&lt;br /&gt;
|California, USA&lt;br /&gt;
|MozReview, Autoland, Treeherder (DB)&lt;br /&gt;
|PT&lt;br /&gt;
|-&lt;br /&gt;
|David House&lt;br /&gt;
|dhouse&lt;br /&gt;
|Montana, USA&lt;br /&gt;
|BMO, DXR, vcssync&lt;br /&gt;
|MT&lt;br /&gt;
|-&lt;br /&gt;
|Gregory Szorc&lt;br /&gt;
|gps&lt;br /&gt;
|San Francisco, CA, USA&lt;br /&gt;
|hg, MozReview, build module owner&lt;br /&gt;
|PT&lt;br /&gt;
|-&lt;br /&gt;
|Connor Sheehan&lt;br /&gt;
|sheehan&lt;br /&gt;
|Toronto, CA&lt;br /&gt;
|hg&lt;br /&gt;
|ET&lt;br /&gt;
|-&lt;br /&gt;
|Steven Macleod&lt;br /&gt;
|smacleod&lt;br /&gt;
|Toronto, CA&lt;br /&gt;
|hg&lt;br /&gt;
|ET&lt;br /&gt;
|-&lt;br /&gt;
|Byron Jones&lt;br /&gt;
|glob&lt;br /&gt;
|Perth, AUS&lt;br /&gt;
|hg&lt;br /&gt;
|GMT+08:00&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;contact&amp;quot;&amp;gt; &amp;lt;/div&amp;gt;&lt;br /&gt;
To contact all of the above, use the list developer-services@mozilla.org or [ircs://irc.mozilla.org/#vcs #vcs].&lt;br /&gt;
&lt;br /&gt;
Additional folks work on various modifications and extensions to the version control systems. They can be reached at dev-version-control@lists.mozilla.org or [ircs://irc.mozilla.org/#vcs #vcs].&lt;br /&gt;
&lt;br /&gt;
The other systems we support follow the &amp;quot;devops&amp;quot; model -- the first point of contact for operations and support are the following channels on irc:&lt;br /&gt;
* [ircs://irc.mozilla.org/#bteam #bteam] for BMO&lt;br /&gt;
* [ircs://irc.mozilla.org/#treeherder #treeherder] for Treeherder ([https://groups.google.com/forum/#!forum/mozilla.tools.treeherder discussion list])&lt;br /&gt;
* [ircs://irc.mozilla.org/#mozreview #mozreview] for MozReview&lt;br /&gt;
* [ircs://irc.mozilla.org/#static #static] for DXR&lt;br /&gt;
&lt;br /&gt;
= Meetings =&lt;br /&gt;
* [[DeveloperServices/TeamMeetings|https://wiki.mozilla.org/DeveloperServices/TeamMeetings]]&lt;br /&gt;
&lt;br /&gt;
= Services =&lt;br /&gt;
* [[/Account Recovery]] - how to re-enable account access&lt;br /&gt;
* [[/git]] - details of our Git DVCS system&lt;br /&gt;
* [[/hg]] - details of our Mercurial DVCS system&lt;/div&gt;</summary>
		<author><name>Kmoir</name></author>
	</entry>
	<entry>
		<id>https://wiki.mozilla.org/index.php?title=Engineering_Workflow/Road_Map&amp;diff=1193583</id>
		<title>Engineering Workflow/Road Map</title>
		<link rel="alternate" type="text/html" href="https://wiki.mozilla.org/index.php?title=Engineering_Workflow/Road_Map&amp;diff=1193583"/>
		<updated>2018-05-10T16:33:01Z</updated>

		<summary type="html">&lt;p&gt;Kmoir: /* Build backend */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Engineering Workflow Road Map =&lt;br /&gt;
&lt;br /&gt;
These are the improvements and new services we are currently working on and others that we are considering for the near future (1-2 years).  It is subject to change.&lt;br /&gt;
&lt;br /&gt;
== Current ==&lt;br /&gt;
&lt;br /&gt;
=== Phabricator integration ===&lt;br /&gt;
&lt;br /&gt;
Although our [[Phabricator]] instance has been up since September 2017, there has been ongoing work to integrate it into our tools, most notably [[BMO]].  There is a tracking bug ({{bug|1381498}}) for the remaining work before we announce general availability and start encouraging people to move over.&lt;br /&gt;
&lt;br /&gt;
The last remaining item of note is forking Arcanist so that it works with git-cinnabar ({{bug|1443375}}).&lt;br /&gt;
&lt;br /&gt;
Impact:&lt;br /&gt;
* One sole tool for review allows the Engineering Workflow to concentrate its efforts, and eliminates the need for contributors to learn several tools.&lt;br /&gt;
* A more intuitive interface than BMO and MozReview, with a contemporary look to appeal to new contributors.&lt;br /&gt;
* Some integration with existing tools and processes, balancing complexity and disruption.&lt;br /&gt;
* Excellent support from Phabricator&#039;s developers ([https://phacility.com Phacility]) and a large user community.&lt;br /&gt;
&lt;br /&gt;
=== Lando ===&lt;br /&gt;
&lt;br /&gt;
[https://lando.services.mozilla.com Lando] is the new automatic code-landing tool integrated with Phabricator.  It is (or at least will be) functionally similar to MozReview&#039;s Autoland but is designed to be more maintainable and extensible by being less tightly coupled to the review tool.&lt;br /&gt;
&lt;br /&gt;
Impact:&lt;br /&gt;
* One-button landing offers an easier way to land code and minimal context switching from reviewing code.&lt;br /&gt;
* Queued landings due to tree closures means developers don&#039;t have to be around when they open to land their code.&lt;br /&gt;
* Becomes a common gateway to mozilla-central (and other repos) which allows more process and security improvements (see below).&lt;br /&gt;
&lt;br /&gt;
=== Vendor manifests ===&lt;br /&gt;
&lt;br /&gt;
Provide a common structure, process, and tools for managing third-party code in mozilla-central.  An [https://groups.google.com/forum/?pli=1#!topic/mozilla.dev.platform/-B8MECCeJnM Intent to Require] was posted to dev.platform on 2018/04/10 and finalized on 2018/10/18.  Follow the tracking bug ({{bug|1454867}}) for progress.&lt;br /&gt;
&lt;br /&gt;
Impact:&lt;br /&gt;
* Easier to identify and find third-party code in mozilla-central.&lt;br /&gt;
* Easier to determine metadata about third-party code, including original source and current revision.&lt;br /&gt;
* Easier to update third-party code.&lt;br /&gt;
&lt;br /&gt;
=== BMO usability ===&lt;br /&gt;
&lt;br /&gt;
Implement a number of long-awaited UX enhancements, including MarkDown, full UTF-8 support, and quick edits.&lt;br /&gt;
&lt;br /&gt;
Impact:&lt;br /&gt;
* User delight!&lt;br /&gt;
* Less friction for new users.&lt;br /&gt;
* Better expressibility and accuracy in comments.&lt;br /&gt;
&lt;br /&gt;
=== Hg scalability and efficiency ===&lt;br /&gt;
&lt;br /&gt;
Implement hgweb mirroring in AWS and upstream remotefilelog extension for hg&lt;br /&gt;
&lt;br /&gt;
Impact:&lt;br /&gt;
* Multi-region redundancy and autoscaling for hgweb servers for additional resiliency&lt;br /&gt;
* Faster checkouts to enable shorter end to end times for local and CI builds&lt;br /&gt;
&lt;br /&gt;
=== Build backend ===&lt;br /&gt;
&lt;br /&gt;
Implement a new build backend for both local and CI builds.  Deploy a new distributed sccache system written in Rust to enable fast, secure local builds in offices. Implement local build telemetry that submits data to the generic data ingestion pipeline to allow us to identify and reduce inefficiencies in local builds.&lt;br /&gt;
&lt;br /&gt;
Impact&lt;br /&gt;
* Reduce the incidence of clobber builds&lt;br /&gt;
* Faster incremental builds&lt;br /&gt;
* Secure and IT supported mechanism for faster local builds in offices&lt;br /&gt;
&lt;br /&gt;
== Future ==&lt;br /&gt;
&lt;br /&gt;
=== Enforced reviewers ===&lt;br /&gt;
&lt;br /&gt;
=== Intent-to-land ===&lt;br /&gt;
&lt;br /&gt;
=== Lando Try support ===&lt;br /&gt;
&lt;br /&gt;
=== Lando confidential-revision support ===&lt;br /&gt;
&lt;br /&gt;
=== Lando stacked landing ===&lt;br /&gt;
&lt;br /&gt;
=== cinnabar-less Git(Hub) gecko-dev support ===&lt;br /&gt;
&lt;br /&gt;
=== Lando headless client API support ===&lt;br /&gt;
&lt;br /&gt;
=== Lando and Phabricator backout support ===&lt;br /&gt;
&lt;br /&gt;
=== Transplant service improvements ===&lt;br /&gt;
&lt;br /&gt;
=== Lando Git support ===&lt;br /&gt;
&lt;br /&gt;
=== Auth0 integration with BMO ===&lt;br /&gt;
&lt;br /&gt;
=== Markdown in BMO ===&lt;br /&gt;
&lt;br /&gt;
===  Run tests from source directory in local and ci builds ===&lt;br /&gt;
&lt;br /&gt;
=== Overhauling release repositories and build configurations to use named branches ===&lt;br /&gt;
&lt;br /&gt;
=== Support for platforms other than Linux for new build backend ===&lt;br /&gt;
&lt;br /&gt;
=== Cross-compile a Windows build with clang-cl from Linux ===&lt;br /&gt;
&lt;br /&gt;
=== Artifact caching experiments for builds ===&lt;/div&gt;</summary>
		<author><name>Kmoir</name></author>
	</entry>
	<entry>
		<id>https://wiki.mozilla.org/index.php?title=Engineering_Workflow/Road_Map&amp;diff=1193582</id>
		<title>Engineering Workflow/Road Map</title>
		<link rel="alternate" type="text/html" href="https://wiki.mozilla.org/index.php?title=Engineering_Workflow/Road_Map&amp;diff=1193582"/>
		<updated>2018-05-10T16:26:17Z</updated>

		<summary type="html">&lt;p&gt;Kmoir: /* New build backend */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Engineering Workflow Road Map =&lt;br /&gt;
&lt;br /&gt;
These are the improvements and new services we are currently working on and others that we are considering for the near future (1-2 years).  It is subject to change.&lt;br /&gt;
&lt;br /&gt;
== Current ==&lt;br /&gt;
&lt;br /&gt;
=== Phabricator integration ===&lt;br /&gt;
&lt;br /&gt;
Although our [[Phabricator]] instance has been up since September 2017, there has been ongoing work to integrate it into our tools, most notably [[BMO]].  There is a tracking bug ({{bug|1381498}}) for the remaining work before we announce general availability and start encouraging people to move over.&lt;br /&gt;
&lt;br /&gt;
The last remaining item of note is forking Arcanist so that it works with git-cinnabar ({{bug|1443375}}).&lt;br /&gt;
&lt;br /&gt;
Impact:&lt;br /&gt;
* One sole tool for review allows the Engineering Workflow to concentrate its efforts, and eliminates the need for contributors to learn several tools.&lt;br /&gt;
* A more intuitive interface than BMO and MozReview, with a contemporary look to appeal to new contributors.&lt;br /&gt;
* Some integration with existing tools and processes, balancing complexity and disruption.&lt;br /&gt;
* Excellent support from Phabricator&#039;s developers ([https://phacility.com Phacility]) and a large user community.&lt;br /&gt;
&lt;br /&gt;
=== Lando ===&lt;br /&gt;
&lt;br /&gt;
[https://lando.services.mozilla.com Lando] is the new automatic code-landing tool integrated with Phabricator.  It is (or at least will be) functionally similar to MozReview&#039;s Autoland but is designed to be more maintainable and extensible by being less tightly coupled to the review tool.&lt;br /&gt;
&lt;br /&gt;
Impact:&lt;br /&gt;
* One-button landing offers an easier way to land code and minimal context switching from reviewing code.&lt;br /&gt;
* Queued landings due to tree closures means developers don&#039;t have to be around when they open to land their code.&lt;br /&gt;
* Becomes a common gateway to mozilla-central (and other repos) which allows more process and security improvements (see below).&lt;br /&gt;
&lt;br /&gt;
=== Vendor manifests ===&lt;br /&gt;
&lt;br /&gt;
Provide a common structure, process, and tools for managing third-party code in mozilla-central.  An [https://groups.google.com/forum/?pli=1#!topic/mozilla.dev.platform/-B8MECCeJnM Intent to Require] was posted to dev.platform on 2018/04/10 and finalized on 2018/10/18.  Follow the tracking bug ({{bug|1454867}}) for progress.&lt;br /&gt;
&lt;br /&gt;
Impact:&lt;br /&gt;
* Easier to identify and find third-party code in mozilla-central.&lt;br /&gt;
* Easier to determine metadata about third-party code, including original source and current revision.&lt;br /&gt;
* Easier to update third-party code.&lt;br /&gt;
&lt;br /&gt;
=== BMO usability ===&lt;br /&gt;
&lt;br /&gt;
Implement a number of long-awaited UX enhancements, including MarkDown, full UTF-8 support, and quick edits.&lt;br /&gt;
&lt;br /&gt;
Impact:&lt;br /&gt;
* User delight!&lt;br /&gt;
* Less friction for new users.&lt;br /&gt;
* Better expressibility and accuracy in comments.&lt;br /&gt;
&lt;br /&gt;
=== Hg scalability and efficiency ===&lt;br /&gt;
&lt;br /&gt;
Implement hgweb mirroring in AWS and upstream remotefilelog extension for hg&lt;br /&gt;
&lt;br /&gt;
Impact:&lt;br /&gt;
* Multi-region redundancy and autoscaling for hgweb servers for additional resiliency&lt;br /&gt;
* Faster checkouts to enable shorter end to end times for local and CI builds&lt;br /&gt;
&lt;br /&gt;
=== Build backend ===&lt;br /&gt;
&lt;br /&gt;
Implement a new build backend for both local and CI builds.  Implement a new distributed sccache system written in Rust to enable fast, secure local builds in offices.&lt;br /&gt;
&lt;br /&gt;
Impact&lt;br /&gt;
* Reduce the incidence of clobber builds&lt;br /&gt;
* Faster incremental builds&lt;br /&gt;
* Secure and IT supported mechanism for faster local builds in offices&lt;br /&gt;
&lt;br /&gt;
== Future ==&lt;br /&gt;
&lt;br /&gt;
=== Enforced reviewers ===&lt;br /&gt;
&lt;br /&gt;
=== Intent-to-land ===&lt;br /&gt;
&lt;br /&gt;
=== Lando Try support ===&lt;br /&gt;
&lt;br /&gt;
=== Lando confidential-revision support ===&lt;br /&gt;
&lt;br /&gt;
=== Lando stacked landing ===&lt;br /&gt;
&lt;br /&gt;
=== cinnabar-less Git(Hub) gecko-dev support ===&lt;br /&gt;
&lt;br /&gt;
=== Lando headless client API support ===&lt;br /&gt;
&lt;br /&gt;
=== Lando and Phabricator backout support ===&lt;br /&gt;
&lt;br /&gt;
=== Transplant service improvements ===&lt;br /&gt;
&lt;br /&gt;
=== Lando Git support ===&lt;br /&gt;
&lt;br /&gt;
=== Auth0 integration with BMO ===&lt;br /&gt;
&lt;br /&gt;
=== Markdown in BMO ===&lt;br /&gt;
&lt;br /&gt;
===  Run tests from source directory in local and ci builds ===&lt;br /&gt;
&lt;br /&gt;
=== Overhauling release repositories and build configurations to use named branches ===&lt;br /&gt;
&lt;br /&gt;
=== Support for platforms other than Linux for new build backend ===&lt;br /&gt;
&lt;br /&gt;
=== Cross-compile a Windows build with clang-cl from Linux ===&lt;br /&gt;
&lt;br /&gt;
=== Artifact caching experiments for builds ===&lt;/div&gt;</summary>
		<author><name>Kmoir</name></author>
	</entry>
	<entry>
		<id>https://wiki.mozilla.org/index.php?title=Engineering_Workflow/Road_Map&amp;diff=1193581</id>
		<title>Engineering Workflow/Road Map</title>
		<link rel="alternate" type="text/html" href="https://wiki.mozilla.org/index.php?title=Engineering_Workflow/Road_Map&amp;diff=1193581"/>
		<updated>2018-05-10T16:21:59Z</updated>

		<summary type="html">&lt;p&gt;Kmoir: /* Future */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Engineering Workflow Road Map =&lt;br /&gt;
&lt;br /&gt;
These are the improvements and new services we are currently working on and others that we are considering for the near future (1-2 years).  It is subject to change.&lt;br /&gt;
&lt;br /&gt;
== Current ==&lt;br /&gt;
&lt;br /&gt;
=== Phabricator integration ===&lt;br /&gt;
&lt;br /&gt;
Although our [[Phabricator]] instance has been up since September 2017, there has been ongoing work to integrate it into our tools, most notably [[BMO]].  There is a tracking bug ({{bug|1381498}}) for the remaining work before we announce general availability and start encouraging people to move over.&lt;br /&gt;
&lt;br /&gt;
The last remaining item of note is forking Arcanist so that it works with git-cinnabar ({{bug|1443375}}).&lt;br /&gt;
&lt;br /&gt;
Impact:&lt;br /&gt;
* One sole tool for review allows the Engineering Workflow to concentrate its efforts, and eliminates the need for contributors to learn several tools.&lt;br /&gt;
* A more intuitive interface than BMO and MozReview, with a contemporary look to appeal to new contributors.&lt;br /&gt;
* Some integration with existing tools and processes, balancing complexity and disruption.&lt;br /&gt;
* Excellent support from Phabricator&#039;s developers ([https://phacility.com Phacility]) and a large user community.&lt;br /&gt;
&lt;br /&gt;
=== Lando ===&lt;br /&gt;
&lt;br /&gt;
[https://lando.services.mozilla.com Lando] is the new automatic code-landing tool integrated with Phabricator.  It is (or at least will be) functionally similar to MozReview&#039;s Autoland but is designed to be more maintainable and extensible by being less tightly coupled to the review tool.&lt;br /&gt;
&lt;br /&gt;
Impact:&lt;br /&gt;
* One-button landing offers an easier way to land code and minimal context switching from reviewing code.&lt;br /&gt;
* Queued landings due to tree closures means developers don&#039;t have to be around when they open to land their code.&lt;br /&gt;
* Becomes a common gateway to mozilla-central (and other repos) which allows more process and security improvements (see below).&lt;br /&gt;
&lt;br /&gt;
=== Vendor manifests ===&lt;br /&gt;
&lt;br /&gt;
Provide a common structure, process, and tools for managing third-party code in mozilla-central.  An [https://groups.google.com/forum/?pli=1#!topic/mozilla.dev.platform/-B8MECCeJnM Intent to Require] was posted to dev.platform on 2018/04/10 and finalized on 2018/10/18.  Follow the tracking bug ({{bug|1454867}}) for progress.&lt;br /&gt;
&lt;br /&gt;
Impact:&lt;br /&gt;
* Easier to identify and find third-party code in mozilla-central.&lt;br /&gt;
* Easier to determine metadata about third-party code, including original source and current revision.&lt;br /&gt;
* Easier to update third-party code.&lt;br /&gt;
&lt;br /&gt;
=== BMO usability ===&lt;br /&gt;
&lt;br /&gt;
Implement a number of long-awaited UX enhancements, including MarkDown, full UTF-8 support, and quick edits.&lt;br /&gt;
&lt;br /&gt;
Impact:&lt;br /&gt;
* User delight!&lt;br /&gt;
* Less friction for new users.&lt;br /&gt;
* Better expressibility and accuracy in comments.&lt;br /&gt;
&lt;br /&gt;
=== Hg scalability and efficiency ===&lt;br /&gt;
&lt;br /&gt;
Implement hgweb mirroring in AWS and upstream remotefilelog extension for hg&lt;br /&gt;
&lt;br /&gt;
Impact:&lt;br /&gt;
* Multi-region redundancy and autoscaling for hgweb servers for additional resiliency&lt;br /&gt;
* Faster checkouts to enable shorter end to end times for local and CI builds&lt;br /&gt;
&lt;br /&gt;
=== New build backend ===&lt;br /&gt;
&lt;br /&gt;
Implement a new build backend for both local builds and builds in CI&lt;br /&gt;
&lt;br /&gt;
Impact&lt;br /&gt;
* Reduce the incidence of clobber builds&lt;br /&gt;
* Faster incremental builds&lt;br /&gt;
&lt;br /&gt;
== Future ==&lt;br /&gt;
&lt;br /&gt;
=== Enforced reviewers ===&lt;br /&gt;
&lt;br /&gt;
=== Intent-to-land ===&lt;br /&gt;
&lt;br /&gt;
=== Lando Try support ===&lt;br /&gt;
&lt;br /&gt;
=== Lando confidential-revision support ===&lt;br /&gt;
&lt;br /&gt;
=== Lando stacked landing ===&lt;br /&gt;
&lt;br /&gt;
=== cinnabar-less Git(Hub) gecko-dev support ===&lt;br /&gt;
&lt;br /&gt;
=== Lando headless client API support ===&lt;br /&gt;
&lt;br /&gt;
=== Lando and Phabricator backout support ===&lt;br /&gt;
&lt;br /&gt;
=== Transplant service improvements ===&lt;br /&gt;
&lt;br /&gt;
=== Lando Git support ===&lt;br /&gt;
&lt;br /&gt;
=== Auth0 integration with BMO ===&lt;br /&gt;
&lt;br /&gt;
=== Markdown in BMO ===&lt;br /&gt;
&lt;br /&gt;
===  Run tests from source directory in local and ci builds ===&lt;br /&gt;
&lt;br /&gt;
=== Overhauling release repositories and build configurations to use named branches ===&lt;br /&gt;
&lt;br /&gt;
=== Support for platforms other than Linux for new build backend ===&lt;br /&gt;
&lt;br /&gt;
=== Cross-compile a Windows build with clang-cl from Linux ===&lt;br /&gt;
&lt;br /&gt;
=== Artifact caching experiments for builds ===&lt;/div&gt;</summary>
		<author><name>Kmoir</name></author>
	</entry>
	<entry>
		<id>https://wiki.mozilla.org/index.php?title=Engineering_Workflow/Road_Map&amp;diff=1193580</id>
		<title>Engineering Workflow/Road Map</title>
		<link rel="alternate" type="text/html" href="https://wiki.mozilla.org/index.php?title=Engineering_Workflow/Road_Map&amp;diff=1193580"/>
		<updated>2018-05-10T16:09:54Z</updated>

		<summary type="html">&lt;p&gt;Kmoir: /* Hg scalability and efficiency */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Engineering Workflow Road Map =&lt;br /&gt;
&lt;br /&gt;
These are the improvements and new services we are currently working on and others that we are considering for the near future (1-2 years).  It is subject to change.&lt;br /&gt;
&lt;br /&gt;
== Current ==&lt;br /&gt;
&lt;br /&gt;
=== Phabricator integration ===&lt;br /&gt;
&lt;br /&gt;
Although our [[Phabricator]] instance has been up since September 2017, there has been ongoing work to integrate it into our tools, most notably [[BMO]].  There is a tracking bug ({{bug|1381498}}) for the remaining work before we announce general availability and start encouraging people to move over.&lt;br /&gt;
&lt;br /&gt;
The last remaining item of note is forking Arcanist so that it works with git-cinnabar ({{bug|1443375}}).&lt;br /&gt;
&lt;br /&gt;
Impact:&lt;br /&gt;
* One sole tool for review allows the Engineering Workflow to concentrate its efforts, and eliminates the need for contributors to learn several tools.&lt;br /&gt;
* A more intuitive interface than BMO and MozReview, with a contemporary look to appeal to new contributors.&lt;br /&gt;
* Some integration with existing tools and processes, balancing complexity and disruption.&lt;br /&gt;
* Excellent support from Phabricator&#039;s developers ([https://phacility.com Phacility]) and a large user community.&lt;br /&gt;
&lt;br /&gt;
=== Lando ===&lt;br /&gt;
&lt;br /&gt;
[https://lando.services.mozilla.com Lando] is the new automatic code-landing tool integrated with Phabricator.  It is (or at least will be) functionally similar to MozReview&#039;s Autoland but is designed to be more maintainable and extensible by being less tightly coupled to the review tool.&lt;br /&gt;
&lt;br /&gt;
Impact:&lt;br /&gt;
* One-button landing offers an easier way to land code and minimal context switching from reviewing code.&lt;br /&gt;
* Queued landings due to tree closures means developers don&#039;t have to be around when they open to land their code.&lt;br /&gt;
* Becomes a common gateway to mozilla-central (and other repos) which allows more process and security improvements (see below).&lt;br /&gt;
&lt;br /&gt;
=== Vendor manifests ===&lt;br /&gt;
&lt;br /&gt;
Provide a common structure, process, and tools for managing third-party code in mozilla-central.  An [https://groups.google.com/forum/?pli=1#!topic/mozilla.dev.platform/-B8MECCeJnM Intent to Require] was posted to dev.platform on 2018/04/10 and finalized on 2018/10/18.  Follow the tracking bug ({{bug|1454867}}) for progress.&lt;br /&gt;
&lt;br /&gt;
Impact:&lt;br /&gt;
* Easier to identify and find third-party code in mozilla-central.&lt;br /&gt;
* Easier to determine metadata about third-party code, including original source and current revision.&lt;br /&gt;
* Easier to update third-party code.&lt;br /&gt;
&lt;br /&gt;
=== BMO usability ===&lt;br /&gt;
&lt;br /&gt;
Implement a number of long-awaited UX enhancements, including MarkDown, full UTF-8 support, and quick edits.&lt;br /&gt;
&lt;br /&gt;
Impact:&lt;br /&gt;
* User delight!&lt;br /&gt;
* Less friction for new users.&lt;br /&gt;
* Better expressibility and accuracy in comments.&lt;br /&gt;
&lt;br /&gt;
=== Hg scalability and efficiency ===&lt;br /&gt;
&lt;br /&gt;
Implement hgweb mirroring in AWS and upstream remotefilelog extension for hg&lt;br /&gt;
&lt;br /&gt;
Impact:&lt;br /&gt;
* Multi-region redundancy and autoscaling for hgweb servers for additional resiliency&lt;br /&gt;
* Faster checkouts to enable shorter end to end times for local and CI builds&lt;br /&gt;
&lt;br /&gt;
=== New build backend ===&lt;br /&gt;
&lt;br /&gt;
Implement a new build backend for both local builds and builds in CI&lt;br /&gt;
&lt;br /&gt;
Impact&lt;br /&gt;
* Reduce the incidence of clobber builds&lt;br /&gt;
* Faster incremental builds&lt;br /&gt;
&lt;br /&gt;
== Future ==&lt;br /&gt;
&lt;br /&gt;
=== Enforced reviewers ===&lt;br /&gt;
&lt;br /&gt;
=== Intent-to-land ===&lt;br /&gt;
&lt;br /&gt;
=== Lando Try support ===&lt;br /&gt;
&lt;br /&gt;
=== Lando confidential-revision support ===&lt;br /&gt;
&lt;br /&gt;
=== Lando stacked landing ===&lt;br /&gt;
&lt;br /&gt;
=== cinnabar-less Git(Hub) gecko-dev support ===&lt;br /&gt;
&lt;br /&gt;
=== Lando headless client API support ===&lt;br /&gt;
&lt;br /&gt;
=== Lando and Phabricator backout support ===&lt;br /&gt;
&lt;br /&gt;
=== Transplant service improvements ===&lt;br /&gt;
&lt;br /&gt;
=== Lando Git support ===&lt;br /&gt;
&lt;br /&gt;
=== Auth0 integration with BMO ===&lt;br /&gt;
&lt;br /&gt;
=== Markdown in BMO ===&lt;/div&gt;</summary>
		<author><name>Kmoir</name></author>
	</entry>
	<entry>
		<id>https://wiki.mozilla.org/index.php?title=Engineering_Workflow/Road_Map&amp;diff=1193578</id>
		<title>Engineering Workflow/Road Map</title>
		<link rel="alternate" type="text/html" href="https://wiki.mozilla.org/index.php?title=Engineering_Workflow/Road_Map&amp;diff=1193578"/>
		<updated>2018-05-10T15:23:00Z</updated>

		<summary type="html">&lt;p&gt;Kmoir: Add developer workflow items&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Engineering Workflow Road Map =&lt;br /&gt;
&lt;br /&gt;
These are the improvements and new services we are currently working on and others that we are considering for the near future (1-2 years).  It is subject to change.&lt;br /&gt;
&lt;br /&gt;
== Current ==&lt;br /&gt;
&lt;br /&gt;
=== Phabricator integration ===&lt;br /&gt;
&lt;br /&gt;
Although our [[Phabricator]] instance has been up since September 2017, there has been ongoing work to integrate it into our tools, most notably [[BMO]].  There is a tracking bug ({{bug|1381498}}) for the remaining work before we announce general availability and start encouraging people to move over.&lt;br /&gt;
&lt;br /&gt;
The last remaining item of note is forking Arcanist so that it works with git-cinnabar ({{bug|1443375}}).&lt;br /&gt;
&lt;br /&gt;
Impact:&lt;br /&gt;
* One sole tool for review allows the Engineering Workflow to concentrate its efforts, and eliminates the need for contributors to learn several tools.&lt;br /&gt;
* A more intuitive interface than BMO and MozReview, with a contemporary look to appeal to new contributors.&lt;br /&gt;
* Some integration with existing tools and processes, balancing complexity and disruption.&lt;br /&gt;
* Excellent support from Phabricator&#039;s developers ([https://phacility.com Phacility]) and a large user community.&lt;br /&gt;
&lt;br /&gt;
=== Lando ===&lt;br /&gt;
&lt;br /&gt;
[https://lando.services.mozilla.com Lando] is the new automatic code-landing tool integrated with Phabricator.  It is (or at least will be) functionally similar to MozReview&#039;s Autoland but is designed to be more maintainable and extensible by being less tightly coupled to the review tool.&lt;br /&gt;
&lt;br /&gt;
Impact:&lt;br /&gt;
* One-button landing offers an easier way to land code and minimal context switching from reviewing code.&lt;br /&gt;
* Queued landings due to tree closures means developers don&#039;t have to be around when they open to land their code.&lt;br /&gt;
* Becomes a common gateway to mozilla-central (and other repos) which allows more process and security improvements (see below).&lt;br /&gt;
&lt;br /&gt;
=== Vendor manifests ===&lt;br /&gt;
&lt;br /&gt;
Provide a common structure, process, and tools for managing third-party code in mozilla-central.  An [https://groups.google.com/forum/?pli=1#!topic/mozilla.dev.platform/-B8MECCeJnM Intent to Require] was posted to dev.platform on 2018/04/10 and finalized on 2018/10/18.  Follow the tracking bug ({{bug|1454867}}) for progress.&lt;br /&gt;
&lt;br /&gt;
Impact:&lt;br /&gt;
* Easier to identify and find third-party code in mozilla-central.&lt;br /&gt;
* Easier to determine metadata about third-party code, including original source and current revision.&lt;br /&gt;
* Easier to update third-party code.&lt;br /&gt;
&lt;br /&gt;
=== BMO usability ===&lt;br /&gt;
&lt;br /&gt;
Implement a number of long-awaited UX enhancements, including MarkDown, full UTF-8 support, and quick edits.&lt;br /&gt;
&lt;br /&gt;
Impact:&lt;br /&gt;
* User delight!&lt;br /&gt;
* Less friction for new users.&lt;br /&gt;
* Better expressibility and accuracy in comments.&lt;br /&gt;
&lt;br /&gt;
=== Hg scalability and efficiency ===&lt;br /&gt;
&lt;br /&gt;
Implement hgweb mirroring in AWS and upstream remotefilelog extension for hg&lt;br /&gt;
&lt;br /&gt;
Impact&lt;br /&gt;
* Multi-region redundancy and autoscaling for hgweb servers for additional resiliency&lt;br /&gt;
* Faster checkouts to enable shorter end to end times for local and CI builds&lt;br /&gt;
&lt;br /&gt;
=== New build backend ===&lt;br /&gt;
&lt;br /&gt;
Implement a new build backend for both local builds and builds in CI&lt;br /&gt;
&lt;br /&gt;
Impact&lt;br /&gt;
* Reduce the incidence of clobber builds&lt;br /&gt;
* Faster incremental builds&lt;br /&gt;
&lt;br /&gt;
== Future ==&lt;br /&gt;
&lt;br /&gt;
=== Enforced reviewers ===&lt;br /&gt;
&lt;br /&gt;
=== Intent-to-land ===&lt;br /&gt;
&lt;br /&gt;
=== Lando Try support ===&lt;br /&gt;
&lt;br /&gt;
=== Lando confidential-revision support ===&lt;br /&gt;
&lt;br /&gt;
=== Lando stacked landing ===&lt;br /&gt;
&lt;br /&gt;
=== cinnabar-less Git(Hub) gecko-dev support ===&lt;br /&gt;
&lt;br /&gt;
=== Lando headless client API support ===&lt;br /&gt;
&lt;br /&gt;
=== Lando and Phabricator backout support ===&lt;br /&gt;
&lt;br /&gt;
=== Transplant service improvements ===&lt;br /&gt;
&lt;br /&gt;
=== Lando Git support ===&lt;br /&gt;
&lt;br /&gt;
=== Auth0 integration with BMO ===&lt;br /&gt;
&lt;br /&gt;
=== Markdown in BMO ===&lt;/div&gt;</summary>
		<author><name>Kmoir</name></author>
	</entry>
	<entry>
		<id>https://wiki.mozilla.org/index.php?title=Template:NextReleaseDate&amp;diff=1180904</id>
		<title>Template:NextReleaseDate</title>
		<link rel="alternate" type="text/html" href="https://wiki.mozilla.org/index.php?title=Template:NextReleaseDate&amp;diff=1180904"/>
		<updated>2017-09-21T15:22:43Z</updated>

		<summary type="html">&lt;p&gt;Kmoir: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;2017-09-28&lt;/div&gt;</summary>
		<author><name>Kmoir</name></author>
	</entry>
	<entry>
		<id>https://wiki.mozilla.org/index.php?title=Template:Version/Gecko/release/current&amp;diff=1180901</id>
		<title>Template:Version/Gecko/release/current</title>
		<link rel="alternate" type="text/html" href="https://wiki.mozilla.org/index.php?title=Template:Version/Gecko/release/current&amp;diff=1180901"/>
		<updated>2017-09-21T15:09:43Z</updated>

		<summary type="html">&lt;p&gt;Kmoir: Merge day&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;56&lt;/div&gt;</summary>
		<author><name>Kmoir</name></author>
	</entry>
	<entry>
		<id>https://wiki.mozilla.org/index.php?title=Template:Version/Gecko/beta/current&amp;diff=1180900</id>
		<title>Template:Version/Gecko/beta/current</title>
		<link rel="alternate" type="text/html" href="https://wiki.mozilla.org/index.php?title=Template:Version/Gecko/beta/current&amp;diff=1180900"/>
		<updated>2017-09-21T15:09:37Z</updated>

		<summary type="html">&lt;p&gt;Kmoir: Merge day&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;57&lt;/div&gt;</summary>
		<author><name>Kmoir</name></author>
	</entry>
	<entry>
		<id>https://wiki.mozilla.org/index.php?title=Template:Version/Gecko/central/current&amp;diff=1180899</id>
		<title>Template:Version/Gecko/central/current</title>
		<link rel="alternate" type="text/html" href="https://wiki.mozilla.org/index.php?title=Template:Version/Gecko/central/current&amp;diff=1180899"/>
		<updated>2017-09-21T15:09:30Z</updated>

		<summary type="html">&lt;p&gt;Kmoir: Merge day&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;58&lt;/div&gt;</summary>
		<author><name>Kmoir</name></author>
	</entry>
	<entry>
		<id>https://wiki.mozilla.org/index.php?title=Template:Version/Gecko/release/next&amp;diff=1180898</id>
		<title>Template:Version/Gecko/release/next</title>
		<link rel="alternate" type="text/html" href="https://wiki.mozilla.org/index.php?title=Template:Version/Gecko/release/next&amp;diff=1180898"/>
		<updated>2017-09-21T15:09:23Z</updated>

		<summary type="html">&lt;p&gt;Kmoir: Merge day&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;57&lt;/div&gt;</summary>
		<author><name>Kmoir</name></author>
	</entry>
	<entry>
		<id>https://wiki.mozilla.org/index.php?title=Template:NextReleaseDate&amp;diff=1180897</id>
		<title>Template:NextReleaseDate</title>
		<link rel="alternate" type="text/html" href="https://wiki.mozilla.org/index.php?title=Template:NextReleaseDate&amp;diff=1180897"/>
		<updated>2017-09-21T15:09:16Z</updated>

		<summary type="html">&lt;p&gt;Kmoir: Merge day&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;2017-10-03&lt;/div&gt;</summary>
		<author><name>Kmoir</name></author>
	</entry>
	<entry>
		<id>https://wiki.mozilla.org/index.php?title=ReleaseEngineering/How_To/Update_TryChooser&amp;diff=1178342</id>
		<title>ReleaseEngineering/How To/Update TryChooser</title>
		<link rel="alternate" type="text/html" href="https://wiki.mozilla.org/index.php?title=ReleaseEngineering/How_To/Update_TryChooser&amp;diff=1178342"/>
		<updated>2017-08-15T15:23:50Z</updated>

		<summary type="html">&lt;p&gt;Kmoir: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Release Engineering How To|Update the Try Syntax}}&lt;br /&gt;
{{Release Engineering Deployment|trychooser}}&lt;br /&gt;
&lt;br /&gt;
== Updating Trychooser app ==&lt;br /&gt;
We need to keep the try syntax chooser webpage located at https://github.com/mozilla-releng/services/releng_frontend/src/static/trychooser/index.html up to date so developers will continue to &#039;&#039;&#039;use&#039;&#039;&#039; it and we benefit from the lowered build/test load.&lt;br /&gt;
&lt;br /&gt;
To keep the site up to date, check out the [https://github.com/mozilla-releng/services/releng_frontend/src/static/trychooser/index.html] and update index.html with new test/talos suite names - be sure to change both the value and the label.  Eg:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;pre&amp;gt;&amp;lt;li&amp;gt;&amp;lt;label&amp;gt;&amp;lt;input type=&amp;quot;checkbox&amp;quot; name=&amp;quot;talos_suite&amp;quot; value=&amp;quot;SUITE_NAME&amp;quot;&amp;gt;SUITE_NAME&amp;lt;/label&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Deploying Trychooser ==&lt;br /&gt;
Trychooser is webops-style app, see [[ReleaseEngineering/How_To/Update_a_Releng_Cluster_Site]] where $site is &#039;trychooser&#039;.&lt;/div&gt;</summary>
		<author><name>Kmoir</name></author>
	</entry>
	<entry>
		<id>https://wiki.mozilla.org/index.php?title=ReleaseEngineering/How_To/Adjust_a_Worker%27s_Master&amp;diff=1178231</id>
		<title>ReleaseEngineering/How To/Adjust a Worker&#039;s Master</title>
		<link rel="alternate" type="text/html" href="https://wiki.mozilla.org/index.php?title=ReleaseEngineering/How_To/Adjust_a_Worker%27s_Master&amp;diff=1178231"/>
		<updated>2017-08-14T20:42:18Z</updated>

		<summary type="html">&lt;p&gt;Kmoir: Created page with &amp;quot;{{Release Engineering How To|Adjust a Worker&amp;#039;s Master}} Edit by editing the machine in [https://github.com/catlee/tools/tree/master/lib/python/slavealloc] to either adjust its...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Release Engineering How To|Adjust a Worker&#039;s Master}}&lt;br /&gt;
Edit by editing the machine in [https://github.com/catlee/tools/tree/master/lib/python/slavealloc] to either adjust its pool or (not preferred outside of development) lock it to a master.  Then, if necessary, reboot the worker machine.&lt;/div&gt;</summary>
		<author><name>Kmoir</name></author>
	</entry>
	<entry>
		<id>https://wiki.mozilla.org/index.php?title=ReleaseEngineering/How_To/Adjust_a_Slave%27s_Master&amp;diff=1178229</id>
		<title>ReleaseEngineering/How To/Adjust a Slave&#039;s Master</title>
		<link rel="alternate" type="text/html" href="https://wiki.mozilla.org/index.php?title=ReleaseEngineering/How_To/Adjust_a_Slave%27s_Master&amp;diff=1178229"/>
		<updated>2017-08-14T20:41:24Z</updated>

		<summary type="html">&lt;p&gt;Kmoir: Blanked the page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Kmoir</name></author>
	</entry>
	<entry>
		<id>https://wiki.mozilla.org/index.php?title=ReleaseEngineering/How_To/Adjust_a_Slave%27s_Master&amp;diff=1178228</id>
		<title>ReleaseEngineering/How To/Adjust a Slave&#039;s Master</title>
		<link rel="alternate" type="text/html" href="https://wiki.mozilla.org/index.php?title=ReleaseEngineering/How_To/Adjust_a_Slave%27s_Master&amp;diff=1178228"/>
		<updated>2017-08-14T20:40:36Z</updated>

		<summary type="html">&lt;p&gt;Kmoir: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Release Engineering How To|Adjust a Worker&#039;s Master}}&lt;br /&gt;
In the era of slavealloc, this is done by editing the slave in [https://github.com/catlee/tools/tree/master/lib/python/slavealloc] to either adjust its pool or (not preferred outside of development) lock it to a master.  Then, if necessary, reboot the slave.&lt;/div&gt;</summary>
		<author><name>Kmoir</name></author>
	</entry>
</feed>