summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAbhishek Kekane <abhishek.kekane@nttdata.com>2017-08-01 15:12:14 +0530
committerAbhishek Kekane <akekane@redhat.com>2017-11-27 05:31:13 +0000
commitc54d45f5db0653cc78f22253b77bf1f15e842bc3 (patch)
treedafeba2275522015246fe339aad077084ad9db5b
parentf5e074c9e4165cf3d6c6957a38809d409b0a7a73 (diff)
Masakari developer's documentation
Added documentation for how to get involved, development qucikstart and masakari system architecture. Change-Id: Ie2cbdde7698a79a1b996e485d141eb15dbded4cd
Notes
Notes (review): Code-Review+2: Sampath Priyankara (samP) <sam47priya@gmail.com> Code-Review+2: Rikimaru Honjo <honjo.rikimaru@po.ntt-tx.co.jp> Workflow+1: Rikimaru Honjo <honjo.rikimaru@po.ntt-tx.co.jp> Verified+2: Zuul Submitted-by: Zuul Submitted-at: Tue, 12 Dec 2017 02:30:51 +0000 Reviewed-on: https://review.openstack.org/489569 Project: openstack/masakari Branch: refs/heads/master
-rw-r--r--doc/source/architecture.rst44
-rw-r--r--doc/source/contributing.rst4
-rw-r--r--doc/source/development.environment.rst127
-rw-r--r--doc/source/how_to_get_involved.rst298
-rw-r--r--doc/source/images/Masakari_spec_process.svg340
-rw-r--r--doc/source/images/architecture.pngbin0 -> 55916 bytes
-rw-r--r--doc/source/index.rst68
-rw-r--r--doc/source/installation.rst12
-rw-r--r--doc/source/process.rst197
-rw-r--r--doc/source/readme.rst1
-rw-r--r--doc/source/usage.rst7
-rw-r--r--tox.ini4
12 files changed, 1062 insertions, 40 deletions
diff --git a/doc/source/architecture.rst b/doc/source/architecture.rst
new file mode 100644
index 0000000..bb865d5
--- /dev/null
+++ b/doc/source/architecture.rst
@@ -0,0 +1,44 @@
1..
2 Copyright 2017 NTT DATA
3
4 Licensed under the Apache License, Version 2.0 (the "License"); you may
5 not use this file except in compliance with the License. You may obtain
6 a copy of the License at
7
8 http://www.apache.org/licenses/LICENSE-2.0
9
10 Unless required by applicable law or agreed to in writing, software
11 distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
12 WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
13 License for the specific language governing permissions and limitations
14 under the License.
15
16Masakari System Architecture
17============================
18
19Masakari is comprised of two services api and engine, each performing different
20functions. The user-facing interface is a REST API, while internally Masakari
21communicates via an RPC message passing mechanism.
22
23The API servers process REST requests, which typically involve database
24reads/writes, sending RPC messages to other Masakari engine,
25and generating responses to the REST calls.
26RPC messaging is done via the **oslo.messaging** library,
27an abstraction on top of message queues.
28Masakari engine will run on same host where masakari api is running, and have
29a `manager` that is listening for `RPC` messages.
30The manager also, optionally, has periodic tasks.
31
32Components
33----------
34
35Below you will find a helpful explanation of the key components
36of a typical Masakari deployment.
37
38.. image:: ./images/architecture.png
39 :width: 100%
40
41* DB: sql database for data storage.
42* API: component that receives HTTP requests, converts commands and
43 communicates with masakari engine via the **oslo.messaging** queue.
44* Engine: Executes recovery workflow and communicates with nova via HTTP.
diff --git a/doc/source/contributing.rst b/doc/source/contributing.rst
deleted file mode 100644
index 1728a61..0000000
--- a/doc/source/contributing.rst
+++ /dev/null
@@ -1,4 +0,0 @@
1============
2Contributing
3============
4.. include:: ../../CONTRIBUTING.rst
diff --git a/doc/source/development.environment.rst b/doc/source/development.environment.rst
new file mode 100644
index 0000000..c33ed72
--- /dev/null
+++ b/doc/source/development.environment.rst
@@ -0,0 +1,127 @@
1..
2 Copyright 2017 NTT DATA
3
4 Licensed under the Apache License, Version 2.0 (the "License"); you may
5 not use this file except in compliance with the License. You may obtain
6 a copy of the License at
7
8 http://www.apache.org/licenses/LICENSE-2.0
9
10 Unless required by applicable law or agreed to in writing, software
11 distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
12 WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
13 License for the specific language governing permissions and limitations
14 under the License.
15
16======================
17Development Quickstart
18======================
19
20This page describes how to setup and use a working Python development
21environment that can be used in developing masakari on Ubuntu.
22These instructions assume you're already familiar with git.
23
24Following these instructions will allow you to build the documentation
25and run the masakari unit tests.
26
27.. note:: For how to contribute to Masakari, see
28 `How To Contribute <http://docs.openstack.org/infra/manual/developers.html>`_.
29 Masakari uses the Gerrit code review system,
30 See `Gerrit Workflow <http://docs.openstack.org/infra/manual/developers.html#development-workflow>`_.
31
32Setup
33=====
34
35There are two ways to create a development environment: using
36DevStack, or explicitly installing and cloning just what you need.
37
38
39Using DevStack
40--------------
41
42To enable Masakari in DevStack, perform the following steps:
43
44
45Download DevStack
46~~~~~~~~~~~~~~~~~
47
48.. sourcecode:: bash
49
50 export DEVSTACK_DIR=~/devstack
51 git clone git://git.openstack.org/openstack-dev/devstack.git $DEVSTACK_DIR
52
53Enable the Masakari plugin
54~~~~~~~~~~~~~~~~~~~~~~~~~~
55
56Enable the plugin by adding the following section to ``$DEVSTACK_DIR/local.conf``
57
58.. sourcecode:: bash
59
60 [[local|localrc]]
61 enable_plugin masakari git://git.openstack.org/openstack/masakari
62
63Optionally, a git refspec (branch or tag or commit) may be provided as follows:
64
65.. sourcecode:: bash
66
67 [[local|localrc]]
68 enable_plugin masakari git://git.openstack.org/openstack/masakari <refspec>
69
70Run the DevStack utility
71~~~~~~~~~~~~~~~~~~~~~~~~
72
73.. sourcecode:: bash
74
75 cd $DEVSTACK_DIR
76 ./stack.sh
77
78Explicit Install/Clone
79----------------------
80
81DevStack installs a complete OpenStack environment. Alternatively,
82you can explicitly install and clone just what you need for Masakari
83development.
84
85Getting the code
86~~~~~~~~~~~~~~~~
87
88Grab the code from git::
89
90 git clone https://git.openstack.org/openstack/masakari
91 cd masakari
92
93
94Linux Systems
95~~~~~~~~~~~~~
96
97The first step of this process is to install the system (not Python)
98packages that are required. Following are instructions on how to do
99this on Linux.
100
101On Debian-based distributions (e.g., Debian/Mint/Ubuntu)::
102
103 sudo apt-get install python-pip
104 sudo pip install tox
105 tox -e bindep
106 sudo apt-get install <indicated missing package names>
107
108Building the Documentation
109==========================
110
111Install the prerequisite packages: graphviz
112
113To do a full documentation build, issue the following command while
114the masakari directory is current.
115
116.. code-block:: bash
117
118 tox -e docs
119
120That will create a Python virtual environment, install the needed
121Python prerequisites in that environment, and build all the
122documentation in that environment.
123
124Running unit tests
125==================
126
127See `Running Python Unit Tests <https://docs.openstack.org/project-team-guide/project-setup/python.html#running-python-unit-tests>`_.
diff --git a/doc/source/how_to_get_involved.rst b/doc/source/how_to_get_involved.rst
new file mode 100644
index 0000000..540cb73
--- /dev/null
+++ b/doc/source/how_to_get_involved.rst
@@ -0,0 +1,298 @@
1..
2 Copyright 2017 NTT DATA
3
4 Licensed under the Apache License, Version 2.0 (the "License"); you may
5 not use this file except in compliance with the License. You may obtain
6 a copy of the License at
7
8 http://www.apache.org/licenses/LICENSE-2.0
9
10 Unless required by applicable law or agreed to in writing, software
11 distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
12 WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
13 License for the specific language governing permissions and limitations
14 under the License.
15
16.. _getting_involved:
17
18========================================
19How to get (more) involved with Masakari
20========================================
21
22So you want to get more involved with Masakari? Or you are new to Masakari and
23wondering where to start?
24
25We are working on building easy ways for you to get help and ideas on
26how to learn more about Masakari and how the Masakari community works.
27
28How do I get started?
29=====================
30
31There are quite a few global docs on this:
32
33- http://www.openstack.org/assets/welcome-guide/OpenStackWelcomeGuide.pdf
34- https://wiki.openstack.org/wiki/How_To_Contribute
35- http://www.openstack.org/community/
36
37There is more general info, non Masakari specific info here:
38
39- https://wiki.openstack.org/wiki/Mentors
40- https://wiki.openstack.org/wiki/OpenStack_Upstream_Training
41
42What should I work on?
43~~~~~~~~~~~~~~~~~~~~~~
44
45So you are starting out your Masakari journey, where is a good place to
46start?
47
48If you'd like to learn how Masakari works before changing anything
49(good idea!), we recommend looking for reviews with -1s and -2s and seeing
50why they got down voted. Once you have some understanding, start reviewing
51patches. It's OK to ask people to explain things you don't understand. It's
52also OK to see some potential problems but put a +0.
53
54Once you're ready to write code, take a look at some of the work already marked
55as low-hanging fruit:
56
57* https://bugs.launchpad.net/masakari/+bugs?field.tag=low-hanging-fruit
58
59How do I get my feature in?
60~~~~~~~~~~~~~~~~~~~~~~~~~~~
61
62The best way of getting your feature in is... well it depends.
63
64First concentrate on solving your problem and/or use case, don't fixate
65on getting the code you have working merged. It’s likely things will need
66significant re-work after you discuss how your needs match up with all
67the existing ways Masakari is currently being used. The good news, is this
68process should leave you with a feature that's more flexible and doesn't
69lock you into your current way of thinking.
70
71A key part of getting code merged, is helping with reviewing other
72people's code. Great reviews of others code will help free up more core
73reviewer time to look at your own patches. In addition, you will
74understand how the review is thinking when they review your code.
75
76Also, work out if any ongoing efforts are blocking your feature and
77helping out speeding those up. The spec review process should help with
78this effort.
79
80For more details on our process, please see: :ref:`process`.
81
82What is expected of a good contributor?
83~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
84
85TODO - need more info on this
86
87Top Tips for working with the Masakari community
88================================================
89
90Here are some top tips around engaging with the Masakari community:
91
92- IRC
93
94 - we talk a lot in #openstack-masakari
95 - do ask us questions in there, and we will try to help you
96 - not sure about asking questions? feel free to listen in around
97 other people's questions
98 - we recommend you setup an IRC bouncer:
99 https://wiki.openstack.org/wiki/IRC
100
101- Email
102
103 - Use the [masakari] tag in the mailing lists
104 - Filtering on [masakari] and [all] can help tame the list
105
106- Be Open
107
108 - i.e. don't review your teams code in private, do it publicly in
109 gerrit
110 - i.e. be ready to talk about openly about problems you are having,
111 not "theoretical" issues
112 - that way you can start to gain the trust of the wider community
113
114- Got a problem? Please ask!
115
116 - Please raise any problems and ask questions early
117 - we want to help you before you are frustrated or annoyed
118 - unsure who to ask? Just ask in IRC.
119
120- Talk about problems first, then solutions
121
122 - Don't think about "merging your patch", instead think about
123 "solving your problem"
124 - conversations are more productive that way
125
126- It's not the decision that's important, it's the reason behind it that's
127 important
128
129 - Don't like the way the community is going?
130 - Please ask why we were going that way, and please engage with the
131 debate
132 - If you don't, we are unable to learn from what you have to offer
133
134- No one will decide, this is stuck, who can help me?
135
136 - it's rare, but it happens
137 - ...but if you don't ask, it's hard for them to help you
138
139Process
140=======
141
142It can feel like you are faced with a wall of process. We are a big
143community, to make sure the right communication happens, we do use a
144minimal amount of process.
145
146If you find something that doesn't make sense, please:
147
148- ask questions to find out \*why\* it happens
149- if you know of a better way to do it, please speak up
150- one "better way" might be to remove the process if it no longer helps
151
152To learn more about Masakari's process, please read :ref:`process`.
153
154Why bother with any process?
155~~~~~~~~~~~~~~~~~~~~~~~~~~~~
156
157Why is it worth creating a bug or blueprint to track your code review?
158This may seem like silly process, but there is usually a good reason
159behind it.
160
161We have lots of code to review, and we have tools to try and get to
162really important code reviews first. If yours is really important, but
163not picked up by our tools, it's possible you just get lost in the bottom
164of a big queue.
165
166If you have a bug fix, you have done loads of work to identify the
167issue, and test out your fix, and submit it. By adding a bug report, you
168are making it easier for other folks who hit the same problem to find
169your work, possibly saving them the hours of pain you went through. With
170any luck that gives all those people the time to fix different bugs, all
171that might have affected you, if you had not given them the time go fix
172it.
173
174It's similar with blueprints. You have worked out how to scratch your
175itch, lets tell others about that great new feature you have added, so
176they can use that. Also, it stops someone with a similar idea going
177through all the pain of creating a feature only to find you already have
178that feature ready and up for review, or merged into the latest release.
179
180Hopefully this gives you an idea why we have applied a small layer of
181process to what we are doing. Having said all this, we need to unlearn
182old habits to move forward, there may be better ways to do things, and
183we are open to trying them. Please help be part of the solution.
184
185.. _why_plus1:
186
187Why do code reviews if I am not in masakari-core?
188=================================================
189
190Code reviews are the life blood of the developer community.
191
192There is a good discussion on how you do good reviews, and how anyone
193can be a reviewer:
194http://docs.openstack.org/infra/manual/developers.html#peer-review
195
196In the draft process guide, I discuss how doing reviews can help get
197your code merged faster: :ref:`process`.
198
199Let’s look at some of the top reasons why participating with code reviews
200really helps you:
201
202- Doing more reviews, and seeing what other reviewers notice, will help
203 you better understand what is expected of code that gets merged into
204 master
205- Having more non-core people do great reviews, leaves less review work
206 for the core reviewers to do, so we are able get more code merged
207- Empathy is one of the keys to a happy community. If you are used to
208 doing code reviews, you will better understand the comments you get
209 when people review your code. As you do more code reviews, and see
210 what others notice, you will get a better idea of what people are
211 looking for when then apply a +2 to your code.
212
213What are the most useful types of code review comments? Well here are a
214few to the top ones:
215
216- Fundamental flaws are the biggest thing to spot. Does the patch break
217 a whole set of existing users, or an existing feature?
218- Consistency of behavior is really important. Does this bit of code
219 do things differently to where similar things happen elsewhere in
220 Masakari?
221- Is the code easy to maintain, well tested and easy to read? Code is
222 read order of magnitude times more than it is written, so optimize
223 for the reader of the code, not the writer.
224
225Let's look at some problems people hit when starting out doing code
226reviews:
227
228- My +1 doesn't mean anything, why should I bother?
229
230 - So your +1 really does help. Some really useful -1 votes that lead
231 to a +1 vote helps get code into a position
232
233- When to use -1 vs 0 vs +1
234
235 - Please see the guidelines here:
236 http://docs.openstack.org/infra/manual/developers.html#peer-review
237
238- I have already reviewed this code internally, no point in adding a +1
239 externally?
240
241 - Please talk to your company about doing all code reviews in the
242 public, that is a much better way to get involved. Showing how the
243 code has evolved upstream, is much better than trying to 'perfect'
244 code internally, before uploading for public review. You can use
245 Draft mode, and mark things as WIP if you prefer, but please do
246 the reviews upstream.
247
248- Where do I start? What should I review?
249
250 - There are various tools, but a good place to start is:
251 https://etherpad.openstack.org/p/masakari-pike-workitems
252 - Depending on the time in the cycle, it's worth looking at
253 NeedsCodeReview blueprints:
254 https://blueprints.launchpad.net/masakari/
255 - Maybe take a look at things you want to see merged, bug fixes and
256 features, or little code fixes
257 - Look for things that have been waiting a long time for a review:
258 - If you get through the above lists, try other tools, such as:
259 http://status.openstack.org/reviews
260
261How to do great code reviews?
262=============================
263
264http://docs.openstack.org/infra/manual/developers.html#peer-review
265
266For more tips, please see: `Why do code reviews if I am not in masakari-core?`_
267
268How do I become masakari-core?
269==============================
270
271You don't have to be masakari-core to be a valued member of the Masakari
272community. There are many, many ways you can help. Every quality review
273that helps someone get their patch closer to being ready to merge helps
274everyone get their code merged faster.
275
276The first step to becoming masakari-core is learning how to be an active
277member of the Masakari community, including learning how to do great code
278reviews.
279
280If you feel like you have the time to commit to all the masakari-core
281membership expectations, reach out to the Masakari PTL who will be
282able to find you an existing member of masakari-core to help mentor you. If
283all goes well, and you seem like a good candidate, your mentor will
284contact the rest of the masakari-core team to ask them to start looking at
285your reviews, so they are able to vote for you, if you get nominated for
286join masakari-core.
287
288We encourage all mentoring, where possible, to occur on #openstack-masakari
289so everyone can learn and benefit from your discussions.
290
291The above mentoring is available to everyone who wants to learn how to
292better code reviews, even if you don't ever want to commit to becoming
293masakari-core. If you already have a mentor, that's great, the process is
294only there for folks who are still trying to find a mentor. Being
295admitted to the mentoring program no way guarantees you will become a
296member of masakari-core eventually, it's here to help you improve, and help
297you have the sort of involvement and conversations that can lead to
298becoming a member of masakari-core.
diff --git a/doc/source/images/Masakari_spec_process.svg b/doc/source/images/Masakari_spec_process.svg
new file mode 100644
index 0000000..0d570ff
--- /dev/null
+++ b/doc/source/images/Masakari_spec_process.svg
@@ -0,0 +1,340 @@
1<?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" fill-opacity="1" color-rendering="auto" color-interpolation="auto" text-rendering="auto" stroke="black" stroke-linecap="square" width="637" stroke-miterlimit="10" shape-rendering="auto" stroke-opacity="1" fill="black" stroke-dasharray="none" font-weight="normal" stroke-width="1" height="1149" font-family="'Dialog'" font-style="normal" stroke-linejoin="miter" font-size="12" stroke-dashoffset="0" image-rendering="auto">
2 <!--Generated by ySVG 2.5-->
3 <defs id="genericDefs"/>
4 <g>
5 <defs id="defs1">
6 <linearGradient x1="66.9357" gradientUnits="userSpaceOnUse" x2="66.9357" y1="-759.8748" y2="-727.3748" id="linearGradient1" spreadMethod="pad">
7 <stop stop-opacity="1" stop-color="rgb(230,242,191)" offset="0%"/>
8 <stop stop-opacity="1" stop-color="rgb(173,214,51)" offset="100%"/>
9 </linearGradient>
10 <linearGradient x1="183.182" gradientUnits="userSpaceOnUse" x2="183.182" y1="-759.8748" y2="-727.3748" id="linearGradient2" spreadMethod="pad">
11 <stop stop-opacity="1" stop-color="rgb(230,242,191)" offset="0%"/>
12 <stop stop-opacity="1" stop-color="rgb(173,214,51)" offset="100%"/>
13 </linearGradient>
14 <linearGradient x1="329.9673" gradientUnits="userSpaceOnUse" x2="329.9673" y1="-759.8748" y2="-727.3748" id="linearGradient3" spreadMethod="pad">
15 <stop stop-opacity="1" stop-color="rgb(230,242,191)" offset="0%"/>
16 <stop stop-opacity="1" stop-color="rgb(173,214,51)" offset="100%"/>
17 </linearGradient>
18 <linearGradient x1="136.0729" gradientUnits="userSpaceOnUse" x2="136.0729" y1="-31" y2="1.5" id="linearGradient4" spreadMethod="pad">
19 <stop stop-opacity="1" stop-color="rgb(255,230,191)" offset="0%"/>
20 <stop stop-opacity="1" stop-color="rgb(255,173,51)" offset="100%"/>
21 </linearGradient>
22 <linearGradient x1="16.0004" gradientUnits="userSpaceOnUse" x2="16.0004" y1="-31" y2="1.5" id="linearGradient5" spreadMethod="pad">
23 <stop stop-opacity="1" stop-color="rgb(255,230,191)" offset="0%"/>
24 <stop stop-opacity="1" stop-color="rgb(255,173,51)" offset="100%"/>
25 </linearGradient>
26 <linearGradient x1="340.4421" gradientUnits="userSpaceOnUse" x2="340.4421" y1="-1104.6365" y2="-1072.1365" id="linearGradient6" spreadMethod="pad">
27 <stop stop-opacity="1" stop-color="rgb(230,242,191)" offset="0%"/>
28 <stop stop-opacity="1" stop-color="rgb(173,214,51)" offset="100%"/>
29 </linearGradient>
30 <linearGradient x1="256.3125" gradientUnits="userSpaceOnUse" x2="256.3125" y1="-464.8748" y2="-432.3748" id="linearGradient7" spreadMethod="pad">
31 <stop stop-opacity="1" stop-color="rgb(230,242,191)" offset="0%"/>
32 <stop stop-opacity="1" stop-color="rgb(173,214,51)" offset="100%"/>
33 </linearGradient>
34 <linearGradient x1="238.6593" gradientUnits="userSpaceOnUse" x2="238.6593" y1="-389.8748" y2="-357.3748" id="linearGradient8" spreadMethod="pad">
35 <stop stop-opacity="1" stop-color="rgb(255,230,191)" offset="0%"/>
36 <stop stop-opacity="1" stop-color="rgb(255,173,51)" offset="100%"/>
37 </linearGradient>
38 <linearGradient x1="130.2458" gradientUnits="userSpaceOnUse" x2="130.2458" y1="-314.8748" y2="-282.3748" id="linearGradient9" spreadMethod="pad">
39 <stop stop-opacity="1" stop-color="rgb(255,230,191)" offset="0%"/>
40 <stop stop-opacity="1" stop-color="rgb(255,173,51)" offset="100%"/>
41 </linearGradient>
42 <linearGradient x1="125.0589" gradientUnits="userSpaceOnUse" x2="125.0589" y1="-589.8748" y2="-557.3748" id="linearGradient10" spreadMethod="pad">
43 <stop stop-opacity="1" stop-color="rgb(230,242,191)" offset="0%"/>
44 <stop stop-opacity="1" stop-color="rgb(173,214,51)" offset="100%"/>
45 </linearGradient>
46 <linearGradient x1="380.6786" gradientUnits="userSpaceOnUse" x2="380.6786" y1="-31" y2="1.5" id="linearGradient11" spreadMethod="pad">
47 <stop stop-opacity="1" stop-color="rgb(255,230,191)" offset="0%"/>
48 <stop stop-opacity="1" stop-color="rgb(255,173,51)" offset="100%"/>
49 </linearGradient>
50 <linearGradient x1="438.3602" gradientUnits="userSpaceOnUse" x2="438.3602" y1="-664.8748" y2="-632.3748" id="linearGradient12" spreadMethod="pad">
51 <stop stop-opacity="1" stop-color="rgb(230,242,191)" offset="0%"/>
52 <stop stop-opacity="1" stop-color="rgb(173,214,51)" offset="100%"/>
53 </linearGradient>
54 <linearGradient x1="452.3026" gradientUnits="userSpaceOnUse" x2="452.3026" y1="-314.8748" y2="-282.3748" id="linearGradient13" spreadMethod="pad">
55 <stop stop-opacity="1" stop-color="rgb(255,230,191)" offset="0%"/>
56 <stop stop-opacity="1" stop-color="rgb(255,173,51)" offset="100%"/>
57 </linearGradient>
58 <linearGradient x1="457.2567" gradientUnits="userSpaceOnUse" x2="457.2567" y1="-264.8748" y2="-232.3748" id="linearGradient14" spreadMethod="pad">
59 <stop stop-opacity="1" stop-color="rgb(255,230,191)" offset="0%"/>
60 <stop stop-opacity="1" stop-color="rgb(255,173,51)" offset="100%"/>
61 </linearGradient>
62 <linearGradient x1="36.5255" gradientUnits="userSpaceOnUse" x2="36.5255" y1="-189.8748" y2="-157.3748" id="linearGradient15" spreadMethod="pad">
63 <stop stop-opacity="1" stop-color="rgb(230,242,191)" offset="0%"/>
64 <stop stop-opacity="1" stop-color="rgb(173,214,51)" offset="100%"/>
65 </linearGradient>
66 <linearGradient x1="154.6882" gradientUnits="userSpaceOnUse" x2="154.6882" y1="-264.8748" y2="-232.3748" id="linearGradient16" spreadMethod="pad">
67 <stop stop-opacity="1" stop-color="rgb(255,230,191)" offset="0%"/>
68 <stop stop-opacity="1" stop-color="rgb(255,173,51)" offset="100%"/>
69 </linearGradient>
70 <linearGradient x1="126.5706" gradientUnits="userSpaceOnUse" x2="126.5706" y1="-539.8748" y2="-507.3748" id="linearGradient17" spreadMethod="pad">
71 <stop stop-opacity="1" stop-color="rgb(255,230,191)" offset="0%"/>
72 <stop stop-opacity="1" stop-color="rgb(255,173,51)" offset="100%"/>
73 </linearGradient>
74 <clipPath clipPathUnits="userSpaceOnUse" id="clipPath1">
75 <path d="M0 0 L637 0 L637 1149 L0 1149 L0 0 Z"/>
76 </clipPath>
77 <clipPath clipPathUnits="userSpaceOnUse" id="clipPath2">
78 <path d="M-15 -1119 L622 -1119 L622 30 L-15 30 L-15 -1119 Z"/>
79 </clipPath>
80 </defs>
81 <g fill="white" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="translate(15,1119)" stroke="white">
82 <rect x="-15" width="637" height="1149" y="-1119" clip-path="url(#clipPath2)" stroke="none"/>
83 </g>
84 <g fill="rgb(245,245,245)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,15,1119)" stroke="rgb(245,245,245)">
85 <rect x="50.9353" y="-795.5408" clip-path="url(#clipPath2)" width="411.8175" rx="4" ry="4" height="81.666" stroke="none"/>
86 <rect x="50.9353" y="-795.5408" clip-path="url(#clipPath2)" fill="rgb(235,235,235)" width="411.8175" height="21.666" stroke="none"/>
87 </g>
88 <g font-size="15" stroke-linecap="butt" transform="matrix(1,0,0,1,15,1119)" text-rendering="geometricPrecision" font-family="sans-serif" shape-rendering="geometricPrecision" stroke-miterlimit="1.45">
89 <text x="385.3573" xml:space="preserve" y="-779.0388" clip-path="url(#clipPath2)" stroke="none">launchpad</text>
90 <rect x="50.9353" y="-795.5408" clip-path="url(#clipPath2)" fill="none" width="411.8175" stroke-dasharray="6,2" rx="4" ry="4" height="81.666"/>
91 </g>
92 <g fill="rgb(153,204,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,15,1119)" stroke="rgb(153,204,0)">
93 <path d="M66.9357 -744.8748 L153.1818 -744.8748 L153.1818 -738.8748 Q153.1818 -728.8748 143.1818 -728.8748 L76.9357 -728.8748 Q66.9357 -728.8748 66.9357 -738.8748 Z" stroke="none" clip-path="url(#clipPath2)"/>
94 <path fill="url(#linearGradient1)" d="M66.9357 -748.8748 Q66.9357 -758.8748 76.9357 -758.8748 L143.1818 -758.8748 Q153.1818 -758.8748 153.1818 -748.8748 L153.1818 -743.8748 L66.9357 -743.8748 Z" clip-path="url(#clipPath2)" stroke="none"/>
95 <path fill="none" d="M68.9357 -748.8748 Q68.9357 -756.8748 76.9357 -756.8748 L143.1818 -756.8748 Q151.1818 -756.8748 151.1818 -748.8748 L151.1818 -738.8748 Q151.1818 -730.8748 143.1818 -730.8748 L76.9357 -730.8748 Q68.9357 -730.8748 68.9357 -738.8748 Z" stroke-width="2" clip-path="url(#clipPath2)" stroke="rgb(240,247,217)"/>
96 <path fill="none" d="M68.9357 -748.8748 Q68.9357 -756.8748 76.9357 -756.8748 L143.1818 -756.8748 Q151.1818 -756.8748 151.1818 -748.8748 L151.1818 -738.8748 Q151.1818 -730.8748 143.1818 -730.8748 L76.9357 -730.8748 Q68.9357 -730.8748 68.9357 -738.8748 Z" clip-path="url(#clipPath2)"/>
97 </g>
98 <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,15,1119)" stroke-linecap="butt">
99 <text x="73.9357" xml:space="preserve" y="-739.3396" clip-path="url(#clipPath2)" stroke="none">create a bug</text>
100 </g>
101 <g fill="rgb(153,204,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,15,1119)" stroke="rgb(153,204,0)">
102 <path d="M183.182 -744.8748 L299.9672 -744.8748 L299.9672 -738.8748 Q299.9672 -728.8748 289.9672 -728.8748 L193.182 -728.8748 Q183.182 -728.8748 183.182 -738.8748 Z" stroke="none" clip-path="url(#clipPath2)"/>
103 <path fill="url(#linearGradient2)" d="M183.182 -748.8748 Q183.182 -758.8748 193.182 -758.8748 L289.9672 -758.8748 Q299.9672 -758.8748 299.9672 -748.8748 L299.9672 -743.8748 L183.182 -743.8748 Z" clip-path="url(#clipPath2)" stroke="none"/>
104 <path fill="none" d="M185.182 -748.8748 Q185.182 -756.8748 193.182 -756.8748 L289.9672 -756.8748 Q297.9672 -756.8748 297.9672 -748.8748 L297.9672 -738.8748 Q297.9672 -730.8748 289.9672 -730.8748 L193.182 -730.8748 Q185.182 -730.8748 185.182 -738.8748 Z" stroke-width="2" clip-path="url(#clipPath2)" stroke="rgb(240,247,217)"/>
105 <path fill="none" d="M185.182 -748.8748 Q185.182 -756.8748 193.182 -756.8748 L289.9672 -756.8748 Q297.9672 -756.8748 297.9672 -748.8748 L297.9672 -738.8748 Q297.9672 -730.8748 289.9672 -730.8748 L193.182 -730.8748 Q185.182 -730.8748 185.182 -738.8748 Z" clip-path="url(#clipPath2)"/>
106 </g>
107 <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,15,1119)" stroke-linecap="butt">
108 <text x="190.182" xml:space="preserve" y="-739.3396" clip-path="url(#clipPath2)" stroke="none">create a blueprint</text>
109 </g>
110 <g fill="rgb(153,204,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,15,1119)" stroke="rgb(153,204,0)">
111 <path d="M329.9673 -744.8748 L446.7525 -744.8748 L446.7525 -738.8748 Q446.7525 -728.8748 436.7525 -728.8748 L339.9673 -728.8748 Q329.9673 -728.8748 329.9673 -738.8748 Z" stroke="none" clip-path="url(#clipPath2)"/>
112 <path fill="url(#linearGradient3)" d="M329.9673 -748.8748 Q329.9673 -758.8748 339.9673 -758.8748 L436.7525 -758.8748 Q446.7525 -758.8748 446.7525 -748.8748 L446.7525 -743.8748 L329.9673 -743.8748 Z" clip-path="url(#clipPath2)" stroke="none"/>
113 <path fill="none" d="M331.9673 -748.8748 Q331.9673 -756.8748 339.9673 -756.8748 L436.7525 -756.8748 Q444.7525 -756.8748 444.7525 -748.8748 L444.7525 -738.8748 Q444.7525 -730.8748 436.7525 -730.8748 L339.9673 -730.8748 Q331.9673 -730.8748 331.9673 -738.8748 Z" stroke-width="2" clip-path="url(#clipPath2)" stroke="rgb(240,247,217)"/>
114 <path fill="none" d="M331.9673 -748.8748 Q331.9673 -756.8748 339.9673 -756.8748 L436.7525 -756.8748 Q444.7525 -756.8748 444.7525 -748.8748 L444.7525 -738.8748 Q444.7525 -730.8748 436.7525 -730.8748 L339.9673 -730.8748 Q331.9673 -730.8748 331.9673 -738.8748 Z" clip-path="url(#clipPath2)"/>
115 </g>
116 <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,15,1119)" stroke-linecap="butt">
117 <text x="336.9673" xml:space="preserve" y="-739.3396" clip-path="url(#clipPath2)" stroke="none">create a blueprint</text>
118 </g>
119 <g fill="rgb(245,245,245)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,15,1119)" stroke="rgb(245,245,245)">
120 <rect x="0" y="-66.666" clip-path="url(#clipPath2)" width="238.6298" rx="4" ry="4" height="81.666" stroke="none"/>
121 <rect x="0" y="-66.666" clip-path="url(#clipPath2)" fill="rgb(235,235,235)" width="238.6298" height="21.666" stroke="none"/>
122 </g>
123 <g font-size="15" stroke-linecap="butt" transform="matrix(1,0,0,1,15,1119)" text-rendering="geometricPrecision" font-family="sans-serif" shape-rendering="geometricPrecision" stroke-miterlimit="1.45">
124 <text x="161.8495" xml:space="preserve" y="-50.1641" clip-path="url(#clipPath2)" stroke="none">End states</text>
125 <rect x="0" y="-66.666" clip-path="url(#clipPath2)" fill="none" width="238.6298" stroke-dasharray="6,2" rx="4" ry="4" height="81.666"/>
126 </g>
127 <g fill="rgb(255,153,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,15,1119)" stroke="rgb(255,153,0)">
128 <path d="M136.0729 -16 L222.6295 -16 L222.6295 -10 Q222.6295 0 212.6295 0 L146.0729 0 Q136.0729 0 136.0729 -10 Z" stroke="none" clip-path="url(#clipPath2)"/>
129 <path fill="url(#linearGradient4)" d="M136.0729 -20 Q136.0729 -30 146.0729 -30 L212.6295 -30 Q222.6295 -30 222.6295 -20 L222.6295 -15 L136.0729 -15 Z" clip-path="url(#clipPath2)" stroke="none"/>
130 <path fill="none" d="M138.0729 -20 Q138.0729 -28 146.0729 -28 L212.6295 -28 Q220.6295 -28 220.6295 -20 L220.6295 -10 Q220.6295 -2 212.6295 -2 L146.0729 -2 Q138.0729 -2 138.0729 -10 Z" stroke-width="2" clip-path="url(#clipPath2)" stroke="rgb(255,240,217)"/>
131 <path fill="none" d="M138.0729 -20 Q138.0729 -28 146.0729 -28 L212.6295 -28 Q220.6295 -28 220.6295 -20 L220.6295 -10 Q220.6295 -2 212.6295 -2 L146.0729 -2 Q138.0729 -2 138.0729 -10 Z" clip-path="url(#clipPath2)"/>
132 </g>
133 <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,15,1119)" stroke-linecap="butt">
134 <text x="143.0729" xml:space="preserve" y="-10.4648" clip-path="url(#clipPath2)" stroke="none">out of scope</text>
135 </g>
136 <g fill="rgb(255,153,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,15,1119)" stroke="rgb(255,153,0)">
137 <path d="M16.0004 -16 L106.0726 -16 L106.0726 -10 Q106.0726 0 96.0726 0 L26.0004 0 Q16.0004 0 16.0004 -10 Z" stroke="none" clip-path="url(#clipPath2)"/>
138 <path fill="url(#linearGradient5)" d="M16.0004 -20 Q16.0004 -30 26.0004 -30 L96.0726 -30 Q106.0726 -30 106.0726 -20 L106.0726 -15 L16.0004 -15 Z" clip-path="url(#clipPath2)" stroke="none"/>
139 <path fill="none" d="M18.0004 -20 Q18.0004 -28 26.0004 -28 L96.0726 -28 Q104.0726 -28 104.0726 -20 L104.0726 -10 Q104.0726 -2 96.0726 -2 L26.0004 -2 Q18.0004 -2 18.0004 -10 Z" stroke-width="2" clip-path="url(#clipPath2)" stroke="rgb(255,240,217)"/>
140 <path fill="none" d="M18.0004 -20 Q18.0004 -28 26.0004 -28 L96.0726 -28 Q104.0726 -28 104.0726 -20 L104.0726 -10 Q104.0726 -2 96.0726 -2 L26.0004 -2 Q18.0004 -2 18.0004 -10 Z" clip-path="url(#clipPath2)"/>
141 </g>
142 <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,15,1119)" stroke-linecap="butt">
143 <text x="23.0004" xml:space="preserve" y="-10.4648" clip-path="url(#clipPath2)" stroke="none">code merged</text>
144 </g>
145 <g fill="rgb(255,204,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,15,1119)" stroke="rgb(255,204,0)">
146 <path d="M178.4522 -953.1078 L208.7433 -968.1078 L239.0343 -953.1078 L208.7433 -938.1078 Z" fill-rule="evenodd" clip-path="url(#clipPath2)" stroke="none"/>
147 </g>
148 <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,15,1119)" stroke-linecap="butt">
149 <text x="185.4522" xml:space="preserve" y="-948.5726" clip-path="url(#clipPath2)" stroke="none">bug fix?</text>
150 <path fill="none" d="M178.4522 -953.1078 L208.7433 -968.1078 L239.0343 -953.1078 L208.7433 -938.1078 Z" clip-path="url(#clipPath2)" fill-rule="evenodd"/>
151 </g>
152 <g fill="rgb(153,204,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,15,1119)" stroke="rgb(153,204,0)">
153 <path d="M340.4421 -1089.6365 L378.7761 -1089.6365 L378.7761 -1083.6365 Q378.7761 -1073.6365 368.7761 -1073.6365 L350.4421 -1073.6365 Q340.4421 -1073.6365 340.4421 -1083.6365 Z" stroke="none" clip-path="url(#clipPath2)"/>
154 <path fill="url(#linearGradient6)" d="M340.4421 -1093.6365 Q340.4421 -1103.6365 350.4421 -1103.6365 L368.7761 -1103.6365 Q378.7761 -1103.6365 378.7761 -1093.6365 L378.7761 -1088.6365 L340.4421 -1088.6365 Z" clip-path="url(#clipPath2)" stroke="none"/>
155 <path fill="none" d="M342.4421 -1093.6365 Q342.4421 -1101.6365 350.4421 -1101.6365 L368.7761 -1101.6365 Q376.7761 -1101.6365 376.7761 -1093.6365 L376.7761 -1083.6365 Q376.7761 -1075.6365 368.7761 -1075.6365 L350.4421 -1075.6365 Q342.4421 -1075.6365 342.4421 -1083.6365 Z" stroke-width="2" clip-path="url(#clipPath2)" stroke="rgb(240,247,217)"/>
156 <path fill="none" d="M342.4421 -1093.6365 Q342.4421 -1101.6365 350.4421 -1101.6365 L368.7761 -1101.6365 Q376.7761 -1101.6365 376.7761 -1093.6365 L376.7761 -1083.6365 Q376.7761 -1075.6365 368.7761 -1075.6365 L350.4421 -1075.6365 Q342.4421 -1075.6365 342.4421 -1083.6365 Z" clip-path="url(#clipPath2)"/>
157 </g>
158 <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,15,1119)" stroke-linecap="butt">
159 <text x="347.4421" xml:space="preserve" y="-1084.1013" clip-path="url(#clipPath2)" stroke="none">idea</text>
160 </g>
161 <g fill="rgb(255,204,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,15,1119)" stroke="rgb(255,204,0)">
162 <path d="M302.1072 -1038.6365 L359.6091 -1053.6365 L417.1111 -1038.6365 L359.6091 -1023.6365 Z" fill-rule="evenodd" clip-path="url(#clipPath2)" stroke="none"/>
163 </g>
164 <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,15,1119)" stroke-linecap="butt">
165 <text x="309.1072" xml:space="preserve" y="-1032.1677" clip-path="url(#clipPath2)" stroke="none">REST API change?</text>
166 <path fill="none" d="M302.1072 -1038.6365 L359.6091 -1053.6365 L417.1111 -1038.6365 L359.6091 -1023.6365 Z" clip-path="url(#clipPath2)" fill-rule="evenodd"/>
167 </g>
168 <g fill="rgb(153,204,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,15,1119)" stroke="rgb(153,204,0)">
169 <path d="M256.3125 -449.8748 L402.3828 -449.8748 L402.3828 -443.8748 Q402.3828 -433.8748 392.3828 -433.8748 L266.3125 -433.8748 Q256.3125 -433.8748 256.3125 -443.8748 Z" stroke="none" clip-path="url(#clipPath2)"/>
170 <path fill="url(#linearGradient7)" d="M256.3125 -453.8748 Q256.3125 -463.8748 266.3125 -463.8748 L392.3828 -463.8748 Q402.3828 -463.8748 402.3828 -453.8748 L402.3828 -448.8748 L256.3125 -448.8748 Z" clip-path="url(#clipPath2)" stroke="none"/>
171 <path fill="none" d="M258.3125 -453.8748 Q258.3125 -461.8748 266.3125 -461.8748 L392.3828 -461.8748 Q400.3828 -461.8748 400.3828 -453.8748 L400.3828 -443.8748 Q400.3828 -435.8748 392.3828 -435.8748 L266.3125 -435.8748 Q258.3125 -435.8748 258.3125 -443.8748 Z" stroke-width="2" clip-path="url(#clipPath2)" stroke="rgb(240,247,217)"/>
172 <path fill="none" d="M258.3125 -453.8748 Q258.3125 -461.8748 266.3125 -461.8748 L392.3828 -461.8748 Q400.3828 -461.8748 400.3828 -453.8748 L400.3828 -443.8748 Q400.3828 -435.8748 392.3828 -435.8748 L266.3125 -435.8748 Q258.3125 -435.8748 258.3125 -443.8748 Z" clip-path="url(#clipPath2)"/>
173 </g>
174 <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,15,1119)" stroke-linecap="butt">
175 <text x="263.3125" xml:space="preserve" y="-444.3396" clip-path="url(#clipPath2)" stroke="none">submit spec for review</text>
176 </g>
177 <g fill="rgb(255,204,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,15,1119)" stroke="rgb(255,204,0)">
178 <path d="M188.5178 -878.1078 L223.8889 -893.1078 L259.26 -878.1078 L223.8889 -863.1078 Z" fill-rule="evenodd" clip-path="url(#clipPath2)" stroke="none"/>
179 </g>
180 <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,15,1119)" stroke-linecap="butt">
181 <text x="195.5178" xml:space="preserve" y="-871.639" clip-path="url(#clipPath2)" stroke="none">a feature?</text>
182 <path fill="none" d="M188.5178 -878.1078 L223.8889 -893.1078 L259.26 -878.1078 L223.8889 -863.1078 Z" clip-path="url(#clipPath2)" fill-rule="evenodd"/>
183 </g>
184 <g fill="rgb(255,153,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,15,1119)" stroke="rgb(255,153,0)">
185 <path d="M238.6593 -374.8748 L327.4776 -374.8748 L327.4776 -368.8748 Q327.4776 -358.8748 317.4776 -358.8748 L248.6593 -358.8748 Q238.6593 -358.8748 238.6593 -368.8748 Z" stroke="none" clip-path="url(#clipPath2)"/>
186 <path fill="url(#linearGradient8)" d="M238.6593 -378.8748 Q238.6593 -388.8748 248.6593 -388.8748 L317.4776 -388.8748 Q327.4776 -388.8748 327.4776 -378.8748 L327.4776 -373.8748 L238.6593 -373.8748 Z" clip-path="url(#clipPath2)" stroke="none"/>
187 <path fill="none" d="M240.6593 -378.8748 Q240.6593 -386.8748 248.6593 -386.8748 L317.4776 -386.8748 Q325.4776 -386.8748 325.4776 -378.8748 L325.4776 -368.8748 Q325.4776 -360.8748 317.4776 -360.8748 L248.6593 -360.8748 Q240.6593 -360.8748 240.6593 -368.8748 Z" stroke-width="2" clip-path="url(#clipPath2)" stroke="rgb(255,240,217)"/>
188 <path fill="none" d="M240.6593 -378.8748 Q240.6593 -386.8748 248.6593 -386.8748 L317.4776 -386.8748 Q325.4776 -386.8748 325.4776 -378.8748 L325.4776 -368.8748 Q325.4776 -360.8748 317.4776 -360.8748 L248.6593 -360.8748 Q240.6593 -360.8748 240.6593 -368.8748 Z" clip-path="url(#clipPath2)"/>
189 </g>
190 <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,15,1119)" stroke-linecap="butt">
191 <text x="245.6593" xml:space="preserve" y="-369.3396" clip-path="url(#clipPath2)" stroke="none">spec merged</text>
192 </g>
193 <g fill="rgb(255,153,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,15,1119)" stroke="rgb(255,153,0)">
194 <path d="M130.2458 -299.8748 L320.9939 -299.8748 L320.9939 -293.8748 Q320.9939 -283.8748 310.9939 -283.8748 L140.2458 -283.8748 Q130.2458 -283.8748 130.2458 -293.8748 Z" stroke="none" clip-path="url(#clipPath2)"/>
195 <path fill="url(#linearGradient9)" d="M130.2458 -303.8748 Q130.2458 -313.8748 140.2458 -313.8748 L310.9939 -313.8748 Q320.9939 -313.8748 320.9939 -303.8748 L320.9939 -298.8748 L130.2458 -298.8748 Z" clip-path="url(#clipPath2)" stroke="none"/>
196 <path fill="none" d="M132.2458 -303.8748 Q132.2458 -311.8748 140.2458 -311.8748 L310.9939 -311.8748 Q318.9939 -311.8748 318.9939 -303.8748 L318.9939 -293.8748 Q318.9939 -285.8748 310.9939 -285.8748 L140.2458 -285.8748 Q132.2458 -285.8748 132.2458 -293.8748 Z" stroke-width="2" clip-path="url(#clipPath2)" stroke="rgb(255,240,217)"/>
197 <path fill="none" d="M132.2458 -303.8748 Q132.2458 -311.8748 140.2458 -311.8748 L310.9939 -311.8748 Q318.9939 -311.8748 318.9939 -303.8748 L318.9939 -293.8748 Q318.9939 -285.8748 310.9939 -285.8748 L140.2458 -285.8748 Q132.2458 -285.8748 132.2458 -293.8748 Z" clip-path="url(#clipPath2)"/>
198 </g>
199 <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,15,1119)" stroke-linecap="butt">
200 <text x="137.2458" xml:space="preserve" y="-294.3396" clip-path="url(#clipPath2)" stroke="none">blueprint approved for release</text>
201 </g>
202 <g fill="rgb(255,204,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,15,1119)" stroke="rgb(255,204,0)">
203 <path d="M204.6518 -648.8748 L253.9389 -663.8748 L303.226 -648.8748 L253.9389 -633.8748 Z" fill-rule="evenodd" clip-path="url(#clipPath2)" stroke="none"/>
204 </g>
205 <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,15,1119)" stroke-linecap="butt">
206 <text x="211.6518" xml:space="preserve" y="-644.3396" clip-path="url(#clipPath2)" stroke="none">spec required?</text>
207 <path fill="none" d="M204.6518 -648.8748 L253.9389 -663.8748 L303.226 -648.8748 L253.9389 -633.8748 Z" clip-path="url(#clipPath2)" fill-rule="evenodd"/>
208 </g>
209 <g fill="rgb(153,204,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,15,1119)" stroke="rgb(153,204,0)">
210 <path d="M125.0589 -574.8748 L333.5316 -574.8748 L333.5316 -568.8748 Q333.5316 -558.8748 323.5316 -558.8748 L135.0589 -558.8748 Q125.0589 -558.8748 125.0589 -568.8748 Z" stroke="none" clip-path="url(#clipPath2)"/>
211 <path fill="url(#linearGradient10)" d="M125.0589 -578.8748 Q125.0589 -588.8748 135.0589 -588.8748 L323.5316 -588.8748 Q333.5316 -588.8748 333.5316 -578.8748 L333.5316 -573.8748 L125.0589 -573.8748 Z" clip-path="url(#clipPath2)" stroke="none"/>
212 <path fill="none" d="M127.0589 -578.8748 Q127.0589 -586.8748 135.0589 -586.8748 L323.5316 -586.8748 Q331.5316 -586.8748 331.5316 -578.8748 L331.5316 -568.8748 Q331.5316 -560.8748 323.5316 -560.8748 L135.0589 -560.8748 Q127.0589 -560.8748 127.0589 -568.8748 Z" stroke-width="2" clip-path="url(#clipPath2)" stroke="rgb(240,247,217)"/>
213 <path fill="none" d="M127.0589 -578.8748 Q127.0589 -586.8748 135.0589 -586.8748 L323.5316 -586.8748 Q331.5316 -586.8748 331.5316 -578.8748 L331.5316 -568.8748 Q331.5316 -560.8748 323.5316 -560.8748 L135.0589 -560.8748 Q127.0589 -560.8748 127.0589 -568.8748 Z" clip-path="url(#clipPath2)"/>
214 </g>
215 <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,15,1119)" stroke-linecap="butt">
216 <text x="132.0589" xml:space="preserve" y="-569.3396" clip-path="url(#clipPath2)" stroke="none">add link on masakari meeting agenda</text>
217 </g>
218 <g fill="rgb(255,153,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,15,1119)" stroke="rgb(255,153,0)">
219 <path d="M380.6786 -16 L569.6278 -16 L569.6278 -10 Q569.6278 0 559.6278 0 L390.6786 0 Q380.6786 0 380.6786 -10 Z" stroke="none" clip-path="url(#clipPath2)"/>
220 <path fill="url(#linearGradient11)" d="M380.6786 -20 Q380.6786 -30 390.6786 -30 L559.6278 -30 Q569.6278 -30 569.6278 -20 L569.6278 -15 L380.6786 -15 Z" clip-path="url(#clipPath2)" stroke="none"/>
221 <path fill="none" d="M382.6786 -20 Q382.6786 -28 390.6786 -28 L559.6278 -28 Q567.6278 -28 567.6278 -20 L567.6278 -10 Q567.6278 -2 559.6278 -2 L390.6786 -2 Q382.6786 -2 382.6786 -10 Z" stroke-width="2" clip-path="url(#clipPath2)" stroke="rgb(255,240,217)"/>
222 <path fill="none" d="M382.6786 -20 Q382.6786 -28 390.6786 -28 L559.6278 -28 Q567.6278 -28 567.6278 -20 L567.6278 -10 Q567.6278 -2 559.6278 -2 L390.6786 -2 Q382.6786 -2 382.6786 -10 Z" clip-path="url(#clipPath2)"/>
223 </g>
224 <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,15,1119)" stroke-linecap="butt">
225 <text x="387.6786" xml:space="preserve" y="-10.4648" clip-path="url(#clipPath2)" stroke="none">blueprint hit by feature freeze</text>
226 </g>
227 <g fill="rgb(153,204,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,15,1119)" stroke="rgb(153,204,0)">
228 <path d="M438.3602 -649.8748 L606.4208 -649.8748 L606.4208 -643.8748 Q606.4208 -633.8748 596.4208 -633.8748 L448.3602 -633.8748 Q438.3602 -633.8748 438.3602 -643.8748 Z" stroke="none" clip-path="url(#clipPath2)"/>
229 <path fill="url(#linearGradient12)" d="M438.3602 -653.8748 Q438.3602 -663.8748 448.3602 -663.8748 L596.4208 -663.8748 Q606.4208 -663.8748 606.4208 -653.8748 L606.4208 -648.8748 L438.3602 -648.8748 Z" clip-path="url(#clipPath2)" stroke="none"/>
230 <path fill="none" d="M440.3602 -653.8748 Q440.3602 -661.8748 448.3602 -661.8748 L596.4208 -661.8748 Q604.4208 -661.8748 604.4208 -653.8748 L604.4208 -643.8748 Q604.4208 -635.8748 596.4208 -635.8748 L448.3602 -635.8748 Q440.3602 -635.8748 440.3602 -643.8748 Z" stroke-width="2" clip-path="url(#clipPath2)" stroke="rgb(240,247,217)"/>
231 <path fill="none" d="M440.3602 -653.8748 Q440.3602 -661.8748 448.3602 -661.8748 L596.4208 -661.8748 Q604.4208 -661.8748 604.4208 -653.8748 L604.4208 -643.8748 Q604.4208 -635.8748 596.4208 -635.8748 L448.3602 -635.8748 Q440.3602 -635.8748 440.3602 -643.8748 Z" clip-path="url(#clipPath2)"/>
232 </g>
233 <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,15,1119)" stroke-linecap="butt">
234 <text x="446.3602" xml:space="preserve" y="-642.406" clip-path="url(#clipPath2)" stroke="none">re-submit for next release</text>
235 </g>
236 <g fill="rgb(255,153,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,15,1119)" stroke="rgb(255,153,0)">
237 <path d="M452.3026 -299.8748 L592.4784 -299.8748 L592.4784 -293.8748 Q592.4784 -283.8748 582.4784 -283.8748 L462.3026 -283.8748 Q452.3026 -283.8748 452.3026 -293.8748 Z" stroke="none" clip-path="url(#clipPath2)"/>
238 <path fill="url(#linearGradient13)" d="M452.3026 -303.8748 Q452.3026 -313.8748 462.3026 -313.8748 L582.4784 -313.8748 Q592.4784 -313.8748 592.4784 -303.8748 L592.4784 -298.8748 L452.3026 -298.8748 Z" clip-path="url(#clipPath2)" stroke="none"/>
239 <path fill="none" d="M454.3026 -303.8748 Q454.3026 -311.8748 462.3026 -311.8748 L582.4784 -311.8748 Q590.4784 -311.8748 590.4784 -303.8748 L590.4784 -293.8748 Q590.4784 -285.8748 582.4784 -285.8748 L462.3026 -285.8748 Q454.3026 -285.8748 454.3026 -293.8748 Z" stroke-width="2" clip-path="url(#clipPath2)" stroke="rgb(255,240,217)"/>
240 <path fill="none" d="M454.3026 -303.8748 Q454.3026 -311.8748 462.3026 -311.8748 L582.4784 -311.8748 Q590.4784 -311.8748 590.4784 -303.8748 L590.4784 -293.8748 Q590.4784 -285.8748 582.4784 -285.8748 L462.3026 -285.8748 Q454.3026 -285.8748 454.3026 -293.8748 Z" clip-path="url(#clipPath2)"/>
241 </g>
242 <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,15,1119)" stroke-linecap="butt">
243 <text x="459.3026" xml:space="preserve" y="-294.3396" clip-path="url(#clipPath2)" stroke="none">blueprint unapproved</text>
244 </g>
245 <g fill="rgb(255,153,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,15,1119)" stroke="rgb(255,153,0)">
246 <path d="M457.2567 -249.8748 L587.5243 -249.8748 L587.5243 -243.8748 Q587.5243 -233.8748 577.5243 -233.8748 L467.2567 -233.8748 Q457.2567 -233.8748 457.2567 -243.8748 Z" stroke="none" clip-path="url(#clipPath2)"/>
247 <path fill="url(#linearGradient14)" d="M457.2567 -253.8748 Q457.2567 -263.8748 467.2567 -263.8748 L577.5243 -263.8748 Q587.5243 -263.8748 587.5243 -253.8748 L587.5243 -248.8748 L457.2567 -248.8748 Z" clip-path="url(#clipPath2)" stroke="none"/>
248 <path fill="none" d="M459.2567 -253.8748 Q459.2567 -261.8748 467.2567 -261.8748 L577.5243 -261.8748 Q585.5243 -261.8748 585.5243 -253.8748 L585.5243 -243.8748 Q585.5243 -235.8748 577.5243 -235.8748 L467.2567 -235.8748 Q459.2567 -235.8748 459.2567 -243.8748 Z" stroke-width="2" clip-path="url(#clipPath2)" stroke="rgb(255,240,217)"/>
249 <path fill="none" d="M459.2567 -253.8748 Q459.2567 -261.8748 467.2567 -261.8748 L577.5243 -261.8748 Q585.5243 -261.8748 585.5243 -253.8748 L585.5243 -243.8748 Q585.5243 -235.8748 577.5243 -235.8748 L467.2567 -235.8748 Q459.2567 -235.8748 459.2567 -243.8748 Z" clip-path="url(#clipPath2)"/>
250 </g>
251 <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,15,1119)" stroke-linecap="butt">
252 <text x="464.2567" xml:space="preserve" y="-244.3396" clip-path="url(#clipPath2)" stroke="none">apply procedural -2</text>
253 </g>
254 <g fill="rgb(153,204,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,15,1119)" stroke="rgb(153,204,0)">
255 <path d="M36.5255 -174.8748 L183.5919 -174.8748 L183.5919 -168.8748 Q183.5919 -158.8748 173.5919 -158.8748 L46.5255 -158.8748 Q36.5255 -158.8748 36.5255 -168.8748 Z" stroke="none" clip-path="url(#clipPath2)"/>
256 <path fill="url(#linearGradient15)" d="M36.5255 -178.8748 Q36.5255 -188.8748 46.5255 -188.8748 L173.5919 -188.8748 Q183.5919 -188.8748 183.5919 -178.8748 L183.5919 -173.8748 L36.5255 -173.8748 Z" clip-path="url(#clipPath2)" stroke="none"/>
257 <path fill="none" d="M38.5255 -178.8748 Q38.5255 -186.8748 46.5255 -186.8748 L173.5919 -186.8748 Q181.5919 -186.8748 181.5919 -178.8748 L181.5919 -168.8748 Q181.5919 -160.8748 173.5919 -160.8748 L46.5255 -160.8748 Q38.5255 -160.8748 38.5255 -168.8748 Z" stroke-width="2" clip-path="url(#clipPath2)" stroke="rgb(240,247,217)"/>
258 <path fill="none" d="M38.5255 -178.8748 Q38.5255 -186.8748 46.5255 -186.8748 L173.5919 -186.8748 Q181.5919 -186.8748 181.5919 -178.8748 L181.5919 -168.8748 Q181.5919 -160.8748 173.5919 -160.8748 L46.5255 -160.8748 Q38.5255 -160.8748 38.5255 -168.8748 Z" clip-path="url(#clipPath2)"/>
259 </g>
260 <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,15,1119)" stroke-linecap="butt">
261 <text x="43.5255" xml:space="preserve" y="-169.3396" clip-path="url(#clipPath2)" stroke="none">upload code for review</text>
262 </g>
263 <g fill="rgb(255,153,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,15,1119)" stroke="rgb(255,153,0)">
264 <path d="M154.6882 -249.8748 L296.5515 -249.8748 L296.5515 -243.8748 Q296.5515 -233.8748 286.5515 -233.8748 L164.6882 -233.8748 Q154.6882 -233.8748 154.6882 -243.8748 Z" stroke="none" clip-path="url(#clipPath2)"/>
265 <path fill="url(#linearGradient16)" d="M154.6882 -253.8748 Q154.6882 -263.8748 164.6882 -263.8748 L286.5515 -263.8748 Q296.5515 -263.8748 296.5515 -253.8748 L296.5515 -248.8748 L154.6882 -248.8748 Z" clip-path="url(#clipPath2)" stroke="none"/>
266 <path fill="none" d="M156.6882 -253.8748 Q156.6882 -261.8748 164.6882 -261.8748 L286.5515 -261.8748 Q294.5515 -261.8748 294.5515 -253.8748 L294.5515 -243.8748 Q294.5515 -235.8748 286.5515 -235.8748 L164.6882 -235.8748 Q156.6882 -235.8748 156.6882 -243.8748 Z" stroke-width="2" clip-path="url(#clipPath2)" stroke="rgb(255,240,217)"/>
267 <path fill="none" d="M156.6882 -253.8748 Q156.6882 -261.8748 164.6882 -261.8748 L286.5515 -261.8748 Q294.5515 -261.8748 294.5515 -253.8748 L294.5515 -243.8748 Q294.5515 -235.8748 286.5515 -235.8748 L164.6882 -235.8748 Q156.6882 -235.8748 156.6882 -243.8748 Z" clip-path="url(#clipPath2)"/>
268 </g>
269 <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,15,1119)" stroke-linecap="butt">
270 <text x="161.6882" xml:space="preserve" y="-244.3396" clip-path="url(#clipPath2)" stroke="none">remove procedural -2</text>
271 </g>
272 <g fill="rgb(255,153,0)" text-rendering="geometricPrecision" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,15,1119)" stroke="rgb(255,153,0)">
273 <path d="M126.5706 -524.8748 L332.0198 -524.8748 L332.0198 -518.8748 Q332.0198 -508.8748 322.0198 -508.8748 L136.5706 -508.8748 Q126.5706 -508.8748 126.5706 -518.8748 Z" stroke="none" clip-path="url(#clipPath2)"/>
274 <path fill="url(#linearGradient17)" d="M126.5706 -528.8748 Q126.5706 -538.8748 136.5706 -538.8748 L322.0198 -538.8748 Q332.0198 -538.8748 332.0198 -528.8748 L332.0198 -523.8748 L126.5706 -523.8748 Z" clip-path="url(#clipPath2)" stroke="none"/>
275 <path fill="none" d="M128.5706 -528.8748 Q128.5706 -536.8748 136.5706 -536.8748 L322.0198 -536.8748 Q330.0198 -536.8748 330.0198 -528.8748 L330.0198 -518.8748 Q330.0198 -510.8748 322.0198 -510.8748 L136.5706 -510.8748 Q128.5706 -510.8748 128.5706 -518.8748 Z" stroke-width="2" clip-path="url(#clipPath2)" stroke="rgb(255,240,217)"/>
276 <path fill="none" d="M128.5706 -528.8748 Q128.5706 -536.8748 136.5706 -536.8748 L322.0198 -536.8748 Q330.0198 -536.8748 330.0198 -528.8748 L330.0198 -518.8748 Q330.0198 -510.8748 322.0198 -510.8748 L136.5706 -510.8748 Q128.5706 -510.8748 128.5706 -518.8748 Z" clip-path="url(#clipPath2)"/>
277 </g>
278 <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" font-family="sans-serif" transform="matrix(1,0,0,1,15,1119)" stroke-linecap="butt">
279 <text x="133.5706" xml:space="preserve" y="-519.3396" clip-path="url(#clipPath2)" stroke="none">review blueprint in masakari meeting</text>
280 </g>
281 <g text-rendering="geometricPrecision" stroke-miterlimit="1.45" shape-rendering="geometricPrecision" transform="matrix(1,0,0,1,15,1119)" stroke-linecap="butt">
282 <path fill="none" d="M193.5977 -945.6048 L193.5977 -928.1078 L173.5175 -893.1078 L173.5175 -853.1078 L110.0587 -810.5408 L110.0587 -766.9" clip-path="url(#clipPath2)"/>
283 <path d="M110.0587 -758.9 L115.0587 -770.9 L110.0587 -767.9 L105.0587 -770.9 Z" clip-path="url(#clipPath2)" stroke="none"/>
284 <path fill="none" d="M359.6091 -1073.6365 L359.6091 -1061.6365" clip-path="url(#clipPath2)"/>
285 <path d="M359.6091 -1053.6365 L364.6091 -1065.6365 L359.6091 -1062.6365 L354.6091 -1065.6365 Z" clip-path="url(#clipPath2)" stroke="none"/>
286 <path fill="none" stroke-dasharray="6,2" d="M330.8582 -1031.1052 L330.8582 -1013.6365 L208.7433 -983.1078 L208.7433 -976.1078" clip-path="url(#clipPath2)"/>
287 <path stroke-dasharray="6,2" d="M208.7433 -968.1078 L213.7433 -980.1078 L208.7433 -977.1078 L203.7433 -980.1078 Z" clip-path="url(#clipPath2)" stroke="none"/>
288 <text x="262.3915" xml:space="preserve" y="-980.4183" clip-path="url(#clipPath2)" font-family="sans-serif" stroke="none">no</text>
289 <path fill="none" d="M388.3601 -1031.1052 L388.3599 -766.908" clip-path="url(#clipPath2)"/>
290 <path d="M388.3599 -758.908 L393.3599 -770.908 L388.3599 -767.908 L383.3599 -770.908 Z" clip-path="url(#clipPath2)" stroke="none"/>
291 <text x="392.36" xml:space="preserve" y="-886.7205" clip-path="url(#clipPath2)" font-family="sans-serif" stroke="none">yes</text>
292 <path fill="none" d="M388.3599 -728.8748 L388.3599 -523.8748 L378.0377 -478.8748 L378.0377 -471.9041" clip-path="url(#clipPath2)"/>
293 <path d="M378.0377 -463.9041 L383.0377 -475.9041 L378.0377 -472.9041 L373.0377 -475.9041 Z" clip-path="url(#clipPath2)" stroke="none"/>
294 <path fill="none" stroke-dasharray="6,2" d="M365.8652 -433.8748 L365.8651 -148.8748 L200.9904 -81.666 L200.9904 -38.0252" clip-path="url(#clipPath2)"/>
295 <path stroke-dasharray="6,2" d="M200.9904 -30.0252 L205.9904 -42.0252 L200.9904 -39.0252 L195.9904 -42.0252 Z" clip-path="url(#clipPath2)" stroke="none"/>
296 <path fill="none" stroke-dasharray="6,2" d="M223.8887 -945.6134 L223.8889 -901.1078" clip-path="url(#clipPath2)"/>
297 <path stroke-dasharray="6,2" d="M223.8889 -893.1078 L228.8889 -905.1078 L223.8889 -902.1078 L218.8889 -905.1078 Z" clip-path="url(#clipPath2)" stroke="none"/>
298 <path fill="none" d="M241.5744 -870.6118 L241.5746 -766.902" clip-path="url(#clipPath2)"/>
299 <path d="M241.5746 -758.902 L246.5746 -770.902 L241.5746 -767.902 L236.5746 -770.902 Z" clip-path="url(#clipPath2)" stroke="none"/>
300 <path fill="none" d="M292.83 -433.8748 L292.83 -423.8748 L283.0685 -403.8748 L283.0685 -396.9041" clip-path="url(#clipPath2)"/>
301 <path d="M283.0685 -388.9041 L288.0685 -400.9041 L283.0685 -397.9041 L278.0685 -400.9041 Z" clip-path="url(#clipPath2)" stroke="none"/>
302 <path fill="none" d="M283.0685 -358.8748 L283.0685 -348.8748 L273.3069 -328.8748 L273.3069 -321.9041" clip-path="url(#clipPath2)"/>
303 <path d="M273.3069 -313.9041 L278.3069 -325.9041 L273.3069 -322.9041 L268.3069 -325.9041 Z" clip-path="url(#clipPath2)" stroke="none"/>
304 <path fill="none" d="M241.5746 -728.8748 L241.5746 -698.8748 L253.9389 -678.8748 L253.9389 -671.8748" clip-path="url(#clipPath2)"/>
305 <path d="M253.9389 -663.8748 L258.9389 -675.8748 L253.9389 -672.8748 L248.9389 -675.8748 Z" clip-path="url(#clipPath2)" stroke="none"/>
306 <path fill="none" d="M278.5825 -641.3718 L278.5825 -623.8748 L348.5317 -588.8748 L348.5317 -508.8748 L329.3476 -478.8748 L329.3476 -471.9041" clip-path="url(#clipPath2)"/>
307 <path d="M329.3476 -463.9041 L334.3476 -475.9041 L329.3476 -472.9041 L324.3476 -475.9041 Z" clip-path="url(#clipPath2)" stroke="none"/>
308 <path fill="none" stroke-dasharray="6,2" d="M229.2953 -641.3804 L229.2953 -596.9004" clip-path="url(#clipPath2)"/>
309 <path stroke-dasharray="6,2" d="M229.2952 -588.9004 L234.2953 -600.9004 L229.2953 -597.9004 L224.2953 -600.9004 Z" clip-path="url(#clipPath2)" stroke="none"/>
310 <path fill="none" d="M438.3272 -648.8748 L311.226 -648.8748" clip-path="url(#clipPath2)"/>
311 <path d="M303.226 -648.8748 L315.226 -643.8748 L312.226 -648.8748 L315.226 -653.8748 Z" clip-path="url(#clipPath2)" stroke="none"/>
312 <path fill="none" d="M522.3905 -313.9138 L522.3905 -625.8748" clip-path="url(#clipPath2)"/>
313 <path d="M522.3905 -633.8748 L517.3905 -621.8748 L522.3905 -624.8748 L527.3905 -621.8748 Z" clip-path="url(#clipPath2)" stroke="none"/>
314 <path fill="none" d="M522.3905 -30.0498 L522.3905 -225.8748" clip-path="url(#clipPath2)"/>
315 <path d="M522.3905 -233.8748 L517.3905 -221.8748 L522.3905 -224.8748 L527.3905 -221.8748 Z" clip-path="url(#clipPath2)" stroke="none"/>
316 <path fill="none" d="M522.3905 -263.9138 L522.3905 -275.8748" clip-path="url(#clipPath2)"/>
317 <path d="M522.3905 -283.8748 L517.3905 -271.8748 L522.3905 -274.8748 L527.3905 -271.8748 Z" clip-path="url(#clipPath2)" stroke="none"/>
318 <path fill="none" d="M110.0587 -728.8748 L110.0587 -196.9077" clip-path="url(#clipPath2)"/>
319 <path d="M110.0587 -188.9077 L115.0587 -200.9077 L110.0587 -197.9077 L105.0587 -200.9077 Z" clip-path="url(#clipPath2)" stroke="none"/>
320 <path fill="none" stroke-dasharray="6,2" d="M206.2033 -870.6048 L206.2033 -853.1078 L35.9353 -810.5408 L35.9353 -248.8748 L61.0366 -203.8748 L61.0366 -196.9041" clip-path="url(#clipPath2)"/>
321 <path stroke-dasharray="6,2" d="M61.0366 -188.9041 L66.0366 -200.9041 L61.0366 -197.9041 L56.0366 -200.9041 Z" clip-path="url(#clipPath2)" stroke="none"/>
322 <path fill="none" d="M61.0366 -158.8748 L61.0365 -38.0315" clip-path="url(#clipPath2)"/>
323 <path d="M61.0365 -30.0315 L66.0365 -42.0315 L61.0365 -39.0315 L56.0365 -42.0315 Z" clip-path="url(#clipPath2)" stroke="none"/>
324 <path fill="none" stroke-dasharray="6,2" d="M110.0587 -158.8748 L110.0587 -148.8748 L157.712 -81.666 L157.712 -38.0252" clip-path="url(#clipPath2)"/>
325 <path stroke-dasharray="6,2" d="M157.712 -30.0252 L162.712 -42.0252 L157.712 -39.0252 L152.712 -42.0252 Z" clip-path="url(#clipPath2)" stroke="none"/>
326 <path fill="none" stroke-dasharray="6,2" d="M159.0809 -158.8748 L159.0809 -148.8748 L427.9159 -81.666 L427.9159 -38.0252" clip-path="url(#clipPath2)"/>
327 <path stroke-dasharray="6,2" d="M427.9159 -30.0252 L432.9159 -42.0252 L427.9159 -39.0252 L422.9159 -42.0252 Z" clip-path="url(#clipPath2)" stroke="none"/>
328 <path fill="none" d="M225.6198 -283.8748 L225.6198 -271.9138" clip-path="url(#clipPath2)"/>
329 <path d="M225.6198 -263.9138 L230.6198 -275.9138 L225.6198 -272.9138 L220.6198 -275.9138 Z" clip-path="url(#clipPath2)" stroke="none"/>
330 <path fill="none" d="M225.6198 -233.8748 L225.6198 -223.8748 L159.0809 -203.8748 L159.0809 -196.9041" clip-path="url(#clipPath2)"/>
331 <path d="M159.0809 -188.9041 L164.0809 -200.9041 L159.0809 -197.9041 L154.0809 -200.9041 Z" clip-path="url(#clipPath2)" stroke="none"/>
332 <path fill="none" d="M229.2952 -558.8748 L229.2952 -546.9138" clip-path="url(#clipPath2)"/>
333 <path d="M229.2952 -538.9138 L234.2952 -550.9138 L229.2952 -547.9138 L224.2952 -550.9138 Z" clip-path="url(#clipPath2)" stroke="none"/>
334 <path fill="none" d="M177.9329 -508.8748 L177.9328 -321.9224" clip-path="url(#clipPath2)"/>
335 <path d="M177.9328 -313.9224 L182.9328 -325.9224 L177.9328 -322.9224 L172.9328 -325.9224 Z" clip-path="url(#clipPath2)" stroke="none"/>
336 <path fill="none" stroke-dasharray="6,2" d="M280.6575 -508.8748 L280.6575 -471.9187" clip-path="url(#clipPath2)"/>
337 <path stroke-dasharray="6,2" d="M280.6575 -463.9187 L285.6575 -475.9187 L280.6575 -472.9187 L275.6576 -475.9187 Z" clip-path="url(#clipPath2)" stroke="none"/>
338 </g>
339 </g>
340</svg>
diff --git a/doc/source/images/architecture.png b/doc/source/images/architecture.png
new file mode 100644
index 0000000..bd344e4
--- /dev/null
+++ b/doc/source/images/architecture.png
Binary files differ
diff --git a/doc/source/index.rst b/doc/source/index.rst
index 0139820..b4c65d8 100644
--- a/doc/source/index.rst
+++ b/doc/source/index.rst
@@ -1,25 +1,63 @@
1.. masakari documentation master file, created by 1..
2 sphinx-quickstart on Tue Jul 9 22:26:36 2013. 2 Copyright 2017 NTT DATA
3 You can adapt this file completely to your liking, but it should at least
4 contain the root `toctree` directive.
5 3
6Welcome to masakari's documentation! 4 Licensed under the Apache License, Version 2.0 (the "License"); you may
7======================================================== 5 not use this file except in compliance with the License. You may obtain
6 a copy of the License at
8 7
9Contents: 8 http://www.apache.org/licenses/LICENSE-2.0
9
10 Unless required by applicable law or agreed to in writing, software
11 distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
12 WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
13 License for the specific language governing permissions and limitations
14 under the License.
15
16=======================================================
17Welcome to Masakari's developer/operator documentation!
18=======================================================
19
20Masakari is an OpenStack project designed to assure high availability of
21instances and compute processes running on hosts.
22
23The developer documentation provided here is continually kept up-to-date
24based on the latest code, and may not represent the state of the project at
25any specific prior release.
26
27This documentation is intended to help explain what the Masakari developers
28think is the current scope of the Masakari project, as well as the
29architectural decisions we have made in order to support that scope. We also
30document our plans for evolving our architecture over time. Finally, we
31documented our current development process and policies.
32
33Masakari API References
34=======================
35
36The Masakari API is quite large, we provide a concept guide which
37gives some of the high level details, as well as a more detailed API
38reference.
39
40To generate API reference guide issue the following command while
41the masakari directory is current.
42
43.. code-block:: bash
44
45 $ tox -e api-ref
46
47Developer Guide
48===============
49
50If you are new to Masakari, this should help you start to understand what
51masakari actually does, and why.
10 52
11.. toctree:: 53.. toctree::
12 :maxdepth: 2 54 :maxdepth: 1
13 55
14 readme 56 how_to_get_involved
15 installation 57 architecture
16 usage 58 development.environment
17 contributing
18 59
19Indices and tables 60Indices and tables
20================== 61==================
21 62
22* :ref:`genindex`
23* :ref:`modindex`
24* :ref:`search` 63* :ref:`search`
25
diff --git a/doc/source/installation.rst b/doc/source/installation.rst
deleted file mode 100644
index 865ffa5..0000000
--- a/doc/source/installation.rst
+++ /dev/null
@@ -1,12 +0,0 @@
1============
2Installation
3============
4
5At the command line::
6
7 $ pip install masakari
8
9Or, if you have virtualenvwrapper installed::
10
11 $ mkvirtualenv masakari
12 $ pip install masakari
diff --git a/doc/source/process.rst b/doc/source/process.rst
new file mode 100644
index 0000000..458fad7
--- /dev/null
+++ b/doc/source/process.rst
@@ -0,0 +1,197 @@
1..
2 Copyright 2017 NTT DATA
3
4 Licensed under the Apache License, Version 2.0 (the "License"); you may
5 not use this file except in compliance with the License. You may obtain
6 a copy of the License at
7
8 http://www.apache.org/licenses/LICENSE-2.0
9
10 Unless required by applicable law or agreed to in writing, software
11 distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
12 WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
13 License for the specific language governing permissions and limitations
14 under the License.
15
16.. _process:
17
18=====================
19Masakari team process
20=====================
21
22Masakari is always evolving its processes, but it's important to explain why we
23have them: so we can all work to ensure that the interactions we need to
24happen do happen. The process exists to make productive communication between
25all members of our community easier.
26
27OpenStack Wide Patterns
28=======================
29
30Masakari follows most of the generally adopted norms for OpenStack projects.
31You can get more details here:
32
33* http://docs.openstack.org/infra/manual/developers.html
34* http://docs.openstack.org/project-team-guide/
35
36If you are new to Masakari, please read this first: :ref:`getting_involved`.
37
38How do I get my code merged?
39============================
40
41OK, so you are new to Masakari, and you have been given a feature to
42implement. How do I make that happen?
43
44You can get most of your questions answered here:
45
46- http://docs.openstack.org/infra/manual/developers.html
47
48But let's put a Masakari specific twist on things...
49
50Overview
51~~~~~~~~
52
53.. image:: ./images/Masakari_spec_process.svg
54 :alt: Flow chart showing the Masakari bug/feature process
55
56Where do you track bugs?
57~~~~~~~~~~~~~~~~~~~~~~~~
58
59We track bugs here:
60
61- http://bugs.launchpad.net/masakari
62
63If you fix an issue, please raise a bug so others who spot that issue
64can find the fix you kindly created for them.
65
66Also before submitting your patch it's worth checking to see if someone
67has already fixed it for you (Launchpad helps you with that, at little,
68when you create the bug report).
69
70When do I need a blueprint vs. a spec?
71~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
72
73To understand this question, we need to understand why blueprints and
74specs are useful.
75
76But here is the rough idea:
77
78- if it needs a spec, it will need a blueprint.
79- if it's an API change, it needs a spec.
80- if it's a single small patch that touches a small amount of code,
81 with limited deployer and doc impact, it probably doesn't need a
82 spec.
83
84If you are unsure, please ask PTL or one of the other
85masakari-core on IRC.
86
87How do I get my blueprint approved?
88~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
89
90So you need your blueprint approved? Here is how:
91
92- if you don't need a spec, please add a link to your blueprint to the
93 agenda for the next masakari meeting:
94 https://wiki.openstack.org/wiki/Meetings/Masakari
95
96 - be sure your blueprint description has enough context for the
97 review in that meeting.
98
99- if you need a spec, then please submit a masakari-spec for review.
100
101Got any more questions? Contact samP or one of the other
102masakari-core who are awake at the same time as you. IRC is best as
103you will often get an immediate response, if they are too busy send
104him/her an email.
105
106How do I get a procedural -2 removed from my patch?
107~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
108
109When feature freeze hits, any patches for blueprints that are still in review
110get a procedural -2 to stop them merging. In Masakari a blueprint is only
111approved for a single release. To have the -2 removed, you need to get the
112blueprint approved for the current release
113(see `How do I get my blueprint approved?`_).
114
115My code review seems stuck, what can I do?
116~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
117
118First and foremost - address any -1s and -2s! A few tips:
119
120- Be precise. Ensure you're not talking at cross purposes.
121- Try to understand where the reviewer is coming from. They may have a
122 very different perspective and/or use-case to you.
123- If you don't understand the problem, ask them to explain - this is
124 common and helpful behavior.
125- Be positive. Everyone's patches have issues, including core
126 reviewers. No-one cares once the issues are fixed.
127- Try not to flip-flop. When two reviewers are pulling you in different
128 directions, stop pushing code and negotiate the best way forward.
129- If the reviewer does not respond to replies left on the patchset,
130 reach out to them on IRC or email. If they still don't respond, you
131 can try to ask their colleagues if they're on holiday (or simply
132 wait). Finally, you can ask for mediation in the Masakari meeting by
133 adding it to the agenda
134 (https://wiki.openstack.org/wiki/Meetings/Masakari). This is also what
135 you should do if you are unable to negotiate a resolution to an
136 issue.
137
138Eventually you should get some +1s from people working through the
139review queue. Expect to get -1s as well. You can ask for reviews within
140your company, 1-2 are useful (not more), especially if those reviewers
141are known to give good reviews. You can spend some time while you wait
142reviewing other people's code - they may reciprocate and you may learn
143something (:ref:`Why do code reviews when I'm not core? <why_plus1>`).
144
145If you've waited an appropriate amount of time and you haven't had any
146+1s, you can ask on IRC for reviews. Please don't ask for core review
147straight away, especially not directly (IRC or email). Core reviewer
148time is very valuable and gaining some +1s is a good way to show your
149patch meets basic quality standards.
150
151Once you have a few +1s, be patient. Remember the average wait times.
152You can ask for reviews each week in IRC, it helps to ask when cores are
153awake.
154
155Bugs
156----
157
158It helps to apply correct tracking information.
159
160- Put "Closes-Bug", "Partial-Bug" or "Related-Bug" in the commit
161 message tags as necessary.
162- If you have to raise a bug in Launchpad first, do it - this helps
163 someone else find your fix.
164- Make sure the bug has the correct priority and tag set.
165
166Features
167--------
168
169Again, it helps to apply correct tracking information. For
170blueprint-only features:
171
172- Put your blueprint in the commit message, EG "blueprint
173 simple-feature".
174- Mark the blueprint as NeedsCodeReview if you are finished.
175- Maintain the whiteboard on the blueprint so it's easy to understand
176 which patches need reviews.
177- Use a single topic for all related patches. All patches for one
178 blueprint should share a topic.
179
180For blueprint and spec features, do everything for blueprint-only
181features and also:
182
183- If it's a project or subteam priority, add it to:
184 https://etherpad.openstack.org/p/masakari-pike-workitems
185- Ensure your spec is approved for the current release cycle.
186
187If it's not a priority, your blueprint/spec has been approved for the
188cycle and you have been patient, you can raise it during the Masakari
189meeting. The outcome may be that your spec gets unapproved for the
190cycle, so that priority items can take focus. If this happens to you,
191sorry - it should not have been approved in the first place, Masakari team
192bit off more than they could chew, it is their mistake not yours. You
193can re-propose it for the next cycle.
194
195If it's not a priority and your spec has not been approved, your code
196will not merge this cycle. Please re-propose your spec for the next
197cycle.
diff --git a/doc/source/readme.rst b/doc/source/readme.rst
deleted file mode 100644
index a6210d3..0000000
--- a/doc/source/readme.rst
+++ /dev/null
@@ -1 +0,0 @@
1.. include:: ../../README.rst
diff --git a/doc/source/usage.rst b/doc/source/usage.rst
deleted file mode 100644
index e5c3030..0000000
--- a/doc/source/usage.rst
+++ /dev/null
@@ -1,7 +0,0 @@
1========
2Usage
3========
4
5To use masakari in a project::
6
7 import masakari
diff --git a/tox.ini b/tox.ini
index 32f2da4..690c84b 100644
--- a/tox.ini
+++ b/tox.ini
@@ -48,7 +48,9 @@ commands = python setup.py test --coverage --testr-args='{posargs}'
48 coverage report 48 coverage report
49 49
50[testenv:docs] 50[testenv:docs]
51commands = python setup.py build_sphinx 51basepython = python2.7
52commands =
53 python setup.py build_sphinx
52 54
53[testenv:releasenotes] 55[testenv:releasenotes]
54commands = 56commands =