diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index 6eac8f9..1592dbf 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -9,12 +9,14 @@ name: "CodeQL" on: push: - branches: [ "master", "release/**" ] + branches: + - "master" + - "release/**" jobs: analyze: name: Analyze - runs-on: ubuntu-latest + runs-on: ubuntu-20.04 strategy: fail-fast: false diff --git a/.github/workflows/coverage.yml b/.github/workflows/coverage.yml index 61137a6..1d212dc 100644 --- a/.github/workflows/coverage.yml +++ b/.github/workflows/coverage.yml @@ -5,6 +5,7 @@ on: push: branches: - "master" + - "release/**" jobs: test: runs-on: ubuntu-20.04 diff --git a/.github/workflows/debianrepo.yml b/.github/workflows/debianrepo.yml index 714b774..15ef3d1 100644 --- a/.github/workflows/debianrepo.yml +++ b/.github/workflows/debianrepo.yml @@ -3,10 +3,8 @@ name: debianrepo on: push: branches: - - "stable" - - "release/**" - "master" - - "debianrepo" + - "release/**" jobs: test_386: diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 320d6c0..a189dde 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -81,16 +81,54 @@ https://github.com/ooni/spec) repository. If the spec is missing, please help the pull request reviewer to create it. If the spec is not clear, please let us know during the review. -When you write a new experiment, keep the measurement phase and the -results analysis phases as separate functions. This helps us a lot -to write better unit tests for our code. +To get a sense of what we expect from an experiment, see the [internal/tutorial]( +https://github.com/ooni/probe-cli/tree/master/internal/tutorial) tutorial -To get a sense of what we expect from an experiment, see: +## Branching and releasing -- the internal/engine/experiment/example experiment +The following diagram illustrates the overall branching and releasing +strategy loosely followed by the core team. If you are an external +contributor, you generally only care about the development part, which +is on the left-hand side of the diagram. -- the internal/engine/experiment/webconnectivity experiment +![branching and releasing](docs/branching.png) -- the [internal/tutorial](https://github.com/ooni/probe-cli/tree/master/internal/tutorial) tutorial +Development uses the `master` branch. When we need to implement a +feature or fix a bug, we branch off of the `master` branch. We squash +and merge to include a feature or fix branch back into `master`. + +We periodically tag `-alpha` releases directly on `master`. The +semantics of such releases is that we reached a point where we have +features we would like to test using the `miniooni` research CLI +client. As part of these releases, we also update dependencies and +embedded assets. This process ensures that we perform better testing +of dependencies and assets as part of development. + +The `master` branch and pull requests only run CI lightweight tests +that ensure the code still compiles, has good coverage, and we are +not introducing regressions in terms of the measurement engine. + +To draft a release we branch off of `master` and create a `release/x.y` +branch where `x` is the major number and `y` is the minor number. For +release branches, we enable a very comprehensive set of tests that run +automatically with every commit. The purpose of a release branch is to +make sure all checks are green and hotfix bugs that we may discover +as part of more extensively testing a release candidate. Beta and stable +releases should occur on this branch. Subsequent patch releases should +also occur on this branch. We have one such branch for each `x.y` +release. If there are fixes on `master` that we want to backport, we +cherry-pick them into the release branch. Likewise, if we need to +forward port fixes, we cherry-pick them into `master`. + +When we branch off release `x.y` from `master`, we also need to bump +the `alpha` version used by `master`. + +None of the branches described so far automatically publishes any +binary package. To publish binary packages we use the `PRODUCT-staging` +branches (e.g., `mobile-staging`). To trigger these builds, we merge +from a release branch into the desired `PRODUCT-staging` branch. This +design ensures that we only publish binary packages when we want to +do so. Because we merge from a release branch, we are not pushing alpha +code to binary releases. (The only exception to this rule is `miniooni`, +treated differently because it's an `alpha` client.) -Thank you! diff --git a/docs/branching.excalidraw b/docs/branching.excalidraw new file mode 100644 index 0000000..8ecc78a --- /dev/null +++ b/docs/branching.excalidraw @@ -0,0 +1,1940 @@ +{ + "type": "excalidraw", + "version": 2, + "source": "https://excalidraw.com", + "elements": [ + { + "type": "ellipse", + "version": 117, + "versionNonce": 946575987, + "isDeleted": false, + "id": "FrOnFVoZdtaOFSxuuPxmW", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1408.3537069084748, + "y": 800.30078125, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 73.90624999999997, + "height": 73.640625, + "seed": 410580231, + "groupIds": [], + "strokeSharpness": "round", + "boundElementIds": [ + "ZsWo12aT76lV6R2H0b8V-" + ] + }, + { + "id": "9FCTh8g9toACPfN7yF2Tx", + "type": "text", + "x": 1409.3693319084748, + "y": 766.171875, + "width": 68, + "height": 25, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "groupIds": [], + "strokeSharpness": "round", + "seed": 1086889555, + "version": 141, + "versionNonce": 159889981, + "isDeleted": false, + "boundElementIds": null, + "text": "master", + "fontSize": 20, + "fontFamily": 1, + "textAlign": "center", + "verticalAlign": "top", + "baseline": 18 + }, + { + "id": "ZsWo12aT76lV6R2H0b8V-", + "type": "arrow", + "x": 1446.7307919303582, + "y": 950.9976346262545, + "width": 3.298960021883431, + "height": 63.87654087625447, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "groupIds": [], + "strokeSharpness": "round", + "seed": 1443933405, + "version": 244, + "versionNonce": 2140525587, + "isDeleted": false, + "boundElementIds": null, + "points": [ + [ + 0, + 0 + ], + [ + -3.298960021883431, + -63.87654087625447 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "i8LbwDXP7xJogP137mBcN", + "focus": 0.09728688754060083, + "gap": 5.964107779056704 + }, + "endBinding": { + "elementId": "FrOnFVoZdtaOFSxuuPxmW", + "focus": 0.12046082095303218, + "gap": 13.214645544914092 + }, + "startArrowhead": null, + "endArrowhead": "arrow" + }, + { + "id": "i8LbwDXP7xJogP137mBcN", + "type": "ellipse", + "x": 1412.9201131584748, + "y": 956.9453125, + "width": 65.4140625, + "height": 68.76953125, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "groupIds": [], + "strokeSharpness": "round", + "seed": 1779891677, + "version": 188, + "versionNonce": 1282370205, + "isDeleted": false, + "boundElementIds": [ + "ZsWo12aT76lV6R2H0b8V-", + "ErrLp--GEOsR3AU2FNwwz", + "9UArOcQdn2sGw8HZRdTn9", + "-4uRLR2_U4-S_frteL9z4", + "TT0_3mZZNKiBunuQSP-6q" + ] + }, + { + "type": "ellipse", + "version": 380, + "versionNonce": 1271009021, + "isDeleted": false, + "id": "61hQjrW1eCfb5OIprSXq3", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1414.3498006584748, + "y": 1274.353515625, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 65.4140625, + "height": 68.76953125, + "seed": 1879178909, + "groupIds": [], + "strokeSharpness": "round", + "boundElementIds": [ + "ZsWo12aT76lV6R2H0b8V-", + "ErrLp--GEOsR3AU2FNwwz", + "0dP3cEoktX25eCkvviNcM", + "SqX8Ci1x7CUCXJNH9loTM", + "1nUAY0kryU4ZLIvj0pXnc", + "8y35ZWVa5zFDh2Pz51UT-", + "WMUUsb8QMcD0Esl_zVVcA" + ] + }, + { + "type": "ellipse", + "version": 417, + "versionNonce": 1416112979, + "isDeleted": false, + "id": "H2rrZfUI5kDk2fa982pFA", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1555.8419881584748, + "y": 1264.396484375, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 65.4140625, + "height": 68.76953125, + "seed": 580711539, + "groupIds": [], + "strokeSharpness": "round", + "boundElementIds": [ + "ZsWo12aT76lV6R2H0b8V-", + "ErrLp--GEOsR3AU2FNwwz", + "3c3zZZ8zVq7no-eT4hyXg", + "DeUB5-Hpy2FpWy-xPqJ1c" + ] + }, + { + "id": "7IIG2hmA-CHb8UtlgutoE", + "type": "arrow", + "x": 1125.3717557752195, + "y": 1516.549162785709, + "width": 0.9791291618903415, + "height": 746.6889687780292, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "groupIds": [], + "strokeSharpness": "round", + "seed": 2143314653, + "version": 665, + "versionNonce": 637609821, + "isDeleted": false, + "boundElementIds": null, + "points": [ + [ + 0, + 0 + ], + [ + -0.9791291618903415, + -746.6889687780292 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow" + }, + { + "id": "EEe_kaxToCLeMN314Ayoi", + "type": "line", + "x": 1103.8576131584748, + "y": 1522.23046875, + "width": 46.3359375, + "height": 1.34765625, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "groupIds": [], + "strokeSharpness": "round", + "seed": 2050861085, + "version": 463, + "versionNonce": 328026355, + "isDeleted": false, + "boundElementIds": null, + "points": [ + [ + 0, + 0 + ], + [ + 46.3359375, + -1.34765625 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": null + }, + { + "id": "aavD3gXn3GoaVefLhge2J", + "type": "text", + "x": 1085.2052694084748, + "y": 1175.91796875, + "width": 39, + "height": 25, + "angle": 4.715798234183623, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "groupIds": [], + "strokeSharpness": "round", + "seed": 417732371, + "version": 696, + "versionNonce": 763245501, + "isDeleted": false, + "boundElementIds": null, + "text": "time", + "fontSize": 20, + "fontFamily": 1, + "textAlign": "center", + "verticalAlign": "top", + "baseline": 18 + }, + { + "type": "arrow", + "version": 579, + "versionNonce": 394113683, + "isDeleted": false, + "id": "0dP3cEoktX25eCkvviNcM", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1445.8941570710285, + "y": 1425.1896146421564, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 1.4090253251076774, + "height": 75.08235428431271, + "seed": 1132001171, + "groupIds": [], + "strokeSharpness": "round", + "boundElementIds": [], + "startBinding": { + "elementId": "_2_7auHWgP9OSMdW-IMqi", + "focus": -0.008815902175433654, + "gap": 2.850118004216746 + }, + "endBinding": { + "elementId": "61hQjrW1eCfb5OIprSXq3", + "focus": 0.10234482780286448, + "gap": 7.070910919200607 + }, + "lastCommittedPoint": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "points": [ + [ + 0, + 0 + ], + [ + -1.4090253251076774, + -75.08235428431271 + ] + ] + }, + { + "type": "ellipse", + "version": 328, + "versionNonce": 1851438109, + "isDeleted": false, + "id": "_2_7auHWgP9OSMdW-IMqi", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1414.1740194084748, + "y": 1428.025390625, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 65.4140625, + "height": 68.76953125, + "seed": 1207426259, + "groupIds": [], + "strokeSharpness": "round", + "boundElementIds": [ + "ZsWo12aT76lV6R2H0b8V-", + "ErrLp--GEOsR3AU2FNwwz", + "0dP3cEoktX25eCkvviNcM", + "SqX8Ci1x7CUCXJNH9loTM" + ] + }, + { + "id": "SqX8Ci1x7CUCXJNH9loTM", + "type": "arrow", + "x": 1483.1623006584748, + "y": 1446.53515625, + "width": 79.88293214663872, + "height": 99.1479660904406, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "groupIds": [], + "strokeSharpness": "round", + "seed": 563908051, + "version": 326, + "versionNonce": 1089464371, + "isDeleted": false, + "boundElementIds": null, + "points": [ + [ + 0, + 0 + ], + [ + 79.88293214663872, + -99.1479660904406 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "_2_7auHWgP9OSMdW-IMqi", + "focus": 0.5480446646136934, + "gap": 6.638688544200527 + }, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow" + }, + { + "type": "ellipse", + "version": 313, + "versionNonce": 365586899, + "isDeleted": false, + "id": "s6P4OqGNKJFw1EDYtmZZv", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1552.2091756584748, + "y": 962.474609375, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 65.4140625, + "height": 68.76953125, + "seed": 878492787, + "groupIds": [], + "strokeSharpness": "round", + "boundElementIds": [ + "ZsWo12aT76lV6R2H0b8V-", + "ErrLp--GEOsR3AU2FNwwz", + "3c3zZZ8zVq7no-eT4hyXg", + "DKJsQnJQP6zamLM3YcUgM", + "E89OFYWHnyapVNraQK6pF", + "9d9CMdbxWDQ158maCuq2K" + ] + }, + { + "type": "text", + "version": 197, + "versionNonce": 764656029, + "isDeleted": false, + "id": "E3oEt7YrddzXwWfuXo2BN", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1525.5490194084748, + "y": 924.55859375, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 113, + "height": 25, + "seed": 1670410451, + "groupIds": [], + "strokeSharpness": "round", + "boundElementIds": [], + "fontSize": 20, + "fontFamily": 1, + "text": "release/3.4", + "baseline": 18, + "textAlign": "center", + "verticalAlign": "top" + }, + { + "id": "SeebVefCHR0BG_Msq_mBX", + "type": "rectangle", + "x": 1623.8185506584748, + "y": 1004.05859375, + "width": 74.2987929059682, + "height": 28.08984375, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "groupIds": [], + "strokeSharpness": "round", + "seed": 781280467, + "version": 242, + "versionNonce": 455325555, + "isDeleted": false, + "boundElementIds": null + }, + { + "id": "vzC_reXHu0W5D5Vdy7wzo", + "type": "text", + "x": 1639.3262379777896, + "y": 1009.2944701526376, + "width": 43, + "height": 17, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "groupIds": [], + "strokeSharpness": "round", + "seed": 1846516307, + "version": 198, + "versionNonce": 1425747411, + "isDeleted": false, + "boundElementIds": null, + "text": "v3.4.0", + "fontSize": 14.094472755782043, + "fontFamily": 1, + "textAlign": "center", + "verticalAlign": "middle", + "baseline": 12 + }, + { + "type": "ellipse", + "version": 470, + "versionNonce": 1866617107, + "isDeleted": false, + "id": "_BzjrIXl7qYcDggInAePz", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1416.0451131584748, + "y": 1106.623046875, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 65.4140625, + "height": 68.76953125, + "seed": 1497777075, + "groupIds": [], + "strokeSharpness": "round", + "boundElementIds": [ + "ZsWo12aT76lV6R2H0b8V-", + "ErrLp--GEOsR3AU2FNwwz", + "1nUAY0kryU4ZLIvj0pXnc", + "DKJsQnJQP6zamLM3YcUgM", + "-4uRLR2_U4-S_frteL9z4" + ] + }, + { + "id": "1nUAY0kryU4ZLIvj0pXnc", + "type": "arrow", + "x": 1446.2091756584748, + "y": 1264.625, + "width": 0.0234375, + "height": 87.6484375, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "groupIds": [], + "strokeSharpness": "round", + "seed": 2110933469, + "version": 68, + "versionNonce": 1502952861, + "isDeleted": false, + "boundElementIds": null, + "points": [ + [ + 0, + 0 + ], + [ + 0.0234375, + -87.6484375 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "61hQjrW1eCfb5OIprSXq3", + "focus": -0.026277293582462318, + "gap": 9.737311460875041 + }, + "endBinding": { + "elementId": "_BzjrIXl7qYcDggInAePz", + "focus": 0.07673924794852657, + "gap": 1.6809069551271776 + }, + "startArrowhead": null, + "endArrowhead": "arrow" + }, + { + "id": "9UArOcQdn2sGw8HZRdTn9", + "type": "arrow", + "x": 1446.8732381584748, + "y": 1107.04296875, + "width": 1.85546875, + "height": 75.97265625, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "groupIds": [], + "strokeSharpness": "round", + "seed": 1363842525, + "version": 37, + "versionNonce": 597472947, + "isDeleted": false, + "boundElementIds": null, + "points": [ + [ + 0, + 0 + ], + [ + -1.85546875, + -75.97265625 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": { + "elementId": "i8LbwDXP7xJogP137mBcN", + "focus": 0.04829005202176653, + "gap": 5.360559841423914 + }, + "startArrowhead": null, + "endArrowhead": "arrow" + }, + { + "type": "ellipse", + "version": 589, + "versionNonce": 1457088595, + "isDeleted": false, + "id": "VXTr4t2TCfsx3lBbrX9FA", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1558.6388631584748, + "y": 1094.869140625, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 65.4140625, + "height": 68.76953125, + "seed": 442745331, + "groupIds": [], + "strokeSharpness": "round", + "boundElementIds": [ + "ZsWo12aT76lV6R2H0b8V-", + "ErrLp--GEOsR3AU2FNwwz", + "1nUAY0kryU4ZLIvj0pXnc", + "DKJsQnJQP6zamLM3YcUgM", + "8y35ZWVa5zFDh2Pz51UT-", + "DeUB5-Hpy2FpWy-xPqJ1c", + "E89OFYWHnyapVNraQK6pF", + "TT0_3mZZNKiBunuQSP-6q" + ] + }, + { + "id": "DeUB5-Hpy2FpWy-xPqJ1c", + "type": "arrow", + "x": 1587.3380819084748, + "y": 1261.33203125, + "width": 0.625, + "height": 93.7421875, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "groupIds": [], + "strokeSharpness": "round", + "seed": 248883293, + "version": 56, + "versionNonce": 248440307, + "isDeleted": false, + "boundElementIds": null, + "points": [ + [ + 0, + 0 + ], + [ + 0.625, + -93.7421875 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "H2rrZfUI5kDk2fa982pFA", + "focus": -0.044656571726164086, + "gap": 3.085899264298419 + }, + "endBinding": { + "elementId": "VXTr4t2TCfsx3lBbrX9FA", + "focus": 0.09561067905754547, + "gap": 4.113949074597102 + }, + "startArrowhead": null, + "endArrowhead": "arrow" + }, + { + "id": "E89OFYWHnyapVNraQK6pF", + "type": "arrow", + "x": 1590.7833944084748, + "y": 1090.12109375, + "width": 2.5, + "height": 54.69140625, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "groupIds": [], + "strokeSharpness": "round", + "seed": 1555295773, + "version": 57, + "versionNonce": 913368765, + "isDeleted": false, + "boundElementIds": null, + "points": [ + [ + 0, + 0 + ], + [ + -2.5, + -54.69140625 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "VXTr4t2TCfsx3lBbrX9FA", + "focus": 0.03745027340171186, + "gap": 4.7524583668077724 + }, + "endBinding": { + "elementId": "s6P4OqGNKJFw1EDYtmZZv", + "focus": -0.048987941378323296, + "gap": 4.345762088088847 + }, + "startArrowhead": null, + "endArrowhead": "arrow" + }, + { + "type": "rectangle", + "version": 661, + "versionNonce": 1384361875, + "isDeleted": false, + "id": "_LhK1JP2uBFu9cs14lXrK", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1296.482585787164, + "y": 1457.548828125, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 109.40816790596809, + "height": 28.898437499999996, + "seed": 1155306515, + "groupIds": [], + "strokeSharpness": "round", + "boundElementIds": [] + }, + { + "type": "text", + "version": 367, + "versionNonce": 1967332787, + "isDeleted": false, + "id": "KvB7SKO8PrwXdeyL73xr_", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1301.186669740148, + "y": 1463.498046875, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 100, + "height": 17, + "seed": 1945414301, + "groupIds": [], + "strokeSharpness": "round", + "boundElementIds": [], + "fontSize": 14.094472755782043, + "fontFamily": 1, + "text": "v3.4.0-alpha.2", + "baseline": 12, + "textAlign": "center", + "verticalAlign": "middle" + }, + { + "type": "rectangle", + "version": 420, + "versionNonce": 70141235, + "isDeleted": false, + "id": "-glBvfuqfOWMmoU9gXRFT", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1631.840966615148, + "y": 1279.462890625, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 89.32223040596818, + "height": 28.3203125, + "seed": 290301587, + "groupIds": [], + "strokeSharpness": "round", + "boundElementIds": [] + }, + { + "type": "text", + "version": 300, + "versionNonce": 175779773, + "isDeleted": false, + "id": "nrPdO2GBc4d1bH82trixr", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1636.0020818181322, + "y": 1285.123046875, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 81, + "height": 17, + "seed": 817102877, + "groupIds": [], + "strokeSharpness": "round", + "boundElementIds": [], + "fontSize": 14.094472755782043, + "fontFamily": 1, + "text": "v3.4.0-beta", + "baseline": 12, + "textAlign": "center", + "verticalAlign": "middle" + }, + { + "type": "ellipse", + "version": 506, + "versionNonce": 2067080915, + "isDeleted": false, + "id": "VaF9V5M1LnrUThs-jQWHP", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1802.1076131584748, + "y": 871.548828125, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 65.4140625, + "height": 68.76953125, + "seed": 1720262067, + "groupIds": [], + "strokeSharpness": "round", + "boundElementIds": [ + "ZsWo12aT76lV6R2H0b8V-", + "ErrLp--GEOsR3AU2FNwwz", + "3c3zZZ8zVq7no-eT4hyXg", + "DKJsQnJQP6zamLM3YcUgM", + "E89OFYWHnyapVNraQK6pF", + "9d9CMdbxWDQ158maCuq2K", + "FgsmrG4hr5lHP2MrO5s8R", + "KOoF1ll_rbvOkUtB5nQrm" + ] + }, + { + "type": "text", + "version": 380, + "versionNonce": 1530110941, + "isDeleted": false, + "id": "2WGdO8YR0j_5L0btHUCz1", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1749.3458944084748, + "y": 838.90625, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 178, + "height": 25, + "seed": 1843237341, + "groupIds": [], + "strokeSharpness": "round", + "boundElementIds": [], + "fontSize": 20, + "fontFamily": 1, + "text": "PRODUCT-staging", + "baseline": 18, + "textAlign": "center", + "verticalAlign": "top" + }, + { + "type": "ellipse", + "version": 693, + "versionNonce": 1580127347, + "isDeleted": false, + "id": "s_yysWSxHvWgqQNOQytNk", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1801.4044881584748, + "y": 1071.048828125, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 65.4140625, + "height": 68.76953125, + "seed": 71224733, + "groupIds": [], + "strokeSharpness": "round", + "boundElementIds": [ + "ZsWo12aT76lV6R2H0b8V-", + "ErrLp--GEOsR3AU2FNwwz", + "3c3zZZ8zVq7no-eT4hyXg", + "DKJsQnJQP6zamLM3YcUgM", + "E89OFYWHnyapVNraQK6pF", + "cRUGdqlcsVRxXboaX7eUv", + "KOoF1ll_rbvOkUtB5nQrm" + ] + }, + { + "id": "YFDoA96OIHSUPRj9uNZG9", + "type": "text", + "x": 1825.2287069084748, + "y": 1251.4453125, + "width": 16, + "height": 25, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "groupIds": [], + "strokeSharpness": "round", + "seed": 14043197, + "version": 116, + "versionNonce": 2957373, + "isDeleted": false, + "boundElementIds": null, + "text": "...", + "fontSize": 20, + "fontFamily": 1, + "textAlign": "center", + "verticalAlign": "top", + "baseline": 18 + }, + { + "id": "z6WqdkPoM_Z3D6W6gP42W", + "type": "arrow", + "x": 1628.8537069084748, + "y": 1258.87109375, + "width": 169.60222737006848, + "height": 117.26753555357459, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "groupIds": [], + "strokeSharpness": "round", + "seed": 369037107, + "version": 185, + "versionNonce": 1433931933, + "isDeleted": false, + "boundElementIds": null, + "points": [ + [ + 0, + 0 + ], + [ + 169.60222737006848, + -117.26753555357459 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow" + }, + { + "id": "9d9CMdbxWDQ158maCuq2K", + "type": "arrow", + "x": 1624.1701131584748, + "y": 985.66015625, + "width": 172.5390625, + "height": 73.01171875, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "groupIds": [], + "strokeSharpness": "round", + "seed": 548464211, + "version": 81, + "versionNonce": 1782879155, + "isDeleted": false, + "boundElementIds": null, + "points": [ + [ + 0, + 0 + ], + [ + 172.5390625, + -73.01171875 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "s6P4OqGNKJFw1EDYtmZZv", + "focus": 0.14599706380315358, + "gap": 7.993288982279637 + }, + "endBinding": { + "elementId": "VaF9V5M1LnrUThs-jQWHP", + "focus": 0.25387040147360945, + "gap": 5.937879878269271 + }, + "startArrowhead": null, + "endArrowhead": "arrow" + }, + { + "type": "text", + "version": 177, + "versionNonce": 1436044637, + "isDeleted": false, + "id": "VSB6KRjDrKaaQgIKYbm0R", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 5.4044502562560535, + "x": 1474.806831908475, + "y": 1379.625, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 61, + "height": 25, + "seed": 1175433267, + "groupIds": [], + "strokeSharpness": "round", + "boundElementIds": [], + "fontSize": 20, + "fontFamily": 1, + "text": "branch", + "baseline": 18, + "textAlign": "center", + "verticalAlign": "top" + }, + { + "type": "text", + "version": 413, + "versionNonce": 685998835, + "isDeleted": false, + "id": "5aFLJMqKE7dheHdiTupPl", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 5.697612295759227, + "x": 1711.959175658475, + "y": 1184.8203125, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 53, + "height": 25, + "seed": 1302932317, + "groupIds": [], + "strokeSharpness": "round", + "boundElementIds": [], + "fontSize": 20, + "fontFamily": 1, + "text": "merge", + "baseline": 18, + "textAlign": "center", + "verticalAlign": "top" + }, + { + "type": "text", + "version": 347, + "versionNonce": 1799395773, + "isDeleted": false, + "id": "iwzO6uFUgvNMG38ZS5g6o", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 5.878639824436498, + "x": 1701.177925658475, + "y": 941.0234375, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 53, + "height": 25, + "seed": 170129523, + "groupIds": [], + "strokeSharpness": "round", + "boundElementIds": [], + "fontSize": 20, + "fontFamily": 1, + "text": "merge", + "baseline": 18, + "textAlign": "center", + "verticalAlign": "top" + }, + { + "id": "FgsmrG4hr5lHP2MrO5s8R", + "type": "arrow", + "x": 1876.6740194084748, + "y": 906.5546875, + "width": 131.453125, + "height": 4.58203125, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "groupIds": [], + "strokeSharpness": "round", + "seed": 638118643, + "version": 76, + "versionNonce": 1509731475, + "isDeleted": false, + "boundElementIds": null, + "points": [ + [ + 0, + 0 + ], + [ + 131.453125, + -4.58203125 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "VaF9V5M1LnrUThs-jQWHP", + "focus": 0.06046380833199841, + "gap": 9.156601290169284 + }, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow" + }, + { + "id": "cRUGdqlcsVRxXboaX7eUv", + "type": "arrow", + "x": 1881.0855588399368, + "y": 1102.2806837868989, + "width": 117.90096056853827, + "height": 0.16936578725585605, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "groupIds": [], + "strokeSharpness": "round", + "seed": 984565661, + "version": 305, + "versionNonce": 1390434845, + "isDeleted": false, + "boundElementIds": null, + "points": [ + [ + 0, + 0 + ], + [ + 117.90096056853827, + -0.16936578725585605 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "s_yysWSxHvWgqQNOQytNk", + "focus": -0.08779841690752188, + "gap": 14.365559189322425 + }, + "endBinding": { + "elementId": "kN6CZUYhLA0Zj8thwW9WK", + "focus": -0.11245191540211615, + "gap": 9.5859375 + }, + "startArrowhead": null, + "endArrowhead": "arrow" + }, + { + "id": "l56iGD3sn2wE1jpAe4ahC", + "type": "rectangle", + "x": 2013.2208944084748, + "y": 856.1953125, + "width": 116.50781250000023, + "height": 88.8671875, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "groupIds": [], + "strokeSharpness": "round", + "seed": 1978032861, + "version": 70, + "versionNonce": 1164512893, + "isDeleted": false, + "boundElementIds": null + }, + { + "id": "BLCZtWmQ6-ehPzhO-L9au", + "type": "text", + "x": 2035.974800658475, + "y": 875.62890625, + "width": 71, + "height": 50, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "groupIds": [], + "strokeSharpness": "round", + "seed": 654630909, + "version": 17, + "versionNonce": 1817371603, + "isDeleted": false, + "boundElementIds": null, + "text": "binary\nrelease", + "fontSize": 20, + "fontFamily": 1, + "textAlign": "center", + "verticalAlign": "middle", + "baseline": 43 + }, + { + "type": "rectangle", + "version": 205, + "versionNonce": 1637627613, + "isDeleted": false, + "id": "kN6CZUYhLA0Zj8thwW9WK", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 2008.5724569084746, + "y": 1052.57421875, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 116.50781250000023, + "height": 88.8671875, + "seed": 123589789, + "groupIds": [], + "strokeSharpness": "round", + "boundElementIds": [ + "cRUGdqlcsVRxXboaX7eUv" + ] + }, + { + "type": "text", + "version": 132, + "versionNonce": 1049424243, + "isDeleted": false, + "id": "dZ-xZ6tKWg_R_Tvnh52bu", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 2024.728706908475, + "y": 1073.40625, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 71, + "height": 50, + "seed": 93130675, + "groupIds": [], + "strokeSharpness": "round", + "boundElementIds": [], + "fontSize": 20, + "fontFamily": 1, + "text": "binary\nrelease", + "baseline": 43, + "textAlign": "center", + "verticalAlign": "middle" + }, + { + "id": "tkm3e2izHwHNnA8Lcc5WG", + "type": "text", + "x": 1874.5880819084748, + "y": 879.94921875, + "width": 101, + "height": 50, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "groupIds": [], + "strokeSharpness": "round", + "seed": 1910496637, + "version": 109, + "versionNonce": 1913344829, + "isDeleted": false, + "boundElementIds": null, + "text": "CI build &\npublish", + "fontSize": 20, + "fontFamily": 1, + "textAlign": "center", + "verticalAlign": "top", + "baseline": 43 + }, + { + "type": "text", + "version": 245, + "versionNonce": 1930945437, + "isDeleted": false, + "id": "NxD-0wUhkx3JymNtjIX9V", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1876.6662069084748, + "y": 1074.7578125, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 101, + "height": 50, + "seed": 1410233747, + "groupIds": [], + "strokeSharpness": "round", + "boundElementIds": [], + "fontSize": 20, + "fontFamily": 1, + "text": "CI build &\npublish", + "baseline": 43, + "textAlign": "center", + "verticalAlign": "top" + }, + { + "id": "m1Xhg8wN1xso2OXh8pOyU", + "type": "text", + "x": 1346.0138631584748, + "y": 679.30859375, + "width": 702.3518750000002, + "height": 38.42187500000003, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "groupIds": [], + "strokeSharpness": "round", + "seed": 540380669, + "version": 185, + "versionNonce": 1434415283, + "isDeleted": false, + "boundElementIds": null, + "text": "=[ Ideal ooni/probe-cli development process ]=", + "fontSize": 30.73750000000001, + "fontFamily": 1, + "textAlign": "center", + "verticalAlign": "top", + "baseline": 27.42187500000003 + }, + { + "id": "KOoF1ll_rbvOkUtB5nQrm", + "type": "arrow", + "x": 1832.2201114984887, + "y": 1064.1524848341573, + "width": 3.8643214147527942, + "height": 122.06640596718341, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "groupIds": [], + "strokeSharpness": "round", + "seed": 1419722643, + "version": 107, + "versionNonce": 1492346877, + "isDeleted": false, + "boundElementIds": null, + "points": [ + [ + 0, + 0 + ], + [ + -3.8643214147527942, + -122.06640596718341 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "s_yysWSxHvWgqQNOQytNk", + "focus": -0.017449031873565522, + "gap": 6.9433909562065 + }, + "endBinding": { + "elementId": "VaF9V5M1LnrUThs-jQWHP", + "focus": 0.23233980950947344, + "gap": 2.39569092262321 + }, + "startArrowhead": null, + "endArrowhead": "arrow" + }, + { + "id": "WMUUsb8QMcD0Esl_zVVcA", + "type": "arrow", + "x": 1417.2990194084748, + "y": 1274.5234375, + "width": 150.6173141923548, + "height": 85.24313437528917, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "groupIds": [], + "strokeSharpness": "round", + "seed": 367157373, + "version": 127, + "versionNonce": 1884611155, + "isDeleted": false, + "boundElementIds": null, + "points": [ + [ + 0, + 0 + ], + [ + -150.6173141923548, + -85.24313437528917 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "61hQjrW1eCfb5OIprSXq3", + "focus": 0.4448864992719663, + "gap": 11.703208740334766 + }, + "endBinding": { + "elementId": "t8m7A_AiI0Zz6g-q3XhnP", + "focus": 0.8748653796977708, + "gap": 14.676496192619688 + }, + "startArrowhead": null, + "endArrowhead": "arrow" + }, + { + "id": "t8m7A_AiI0Zz6g-q3XhnP", + "type": "ellipse", + "x": 1208.2599569084748, + "y": 1098.05078125, + "width": 77.91796875, + "height": 80.2890625, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "groupIds": [], + "strokeSharpness": "round", + "seed": 205241949, + "version": 181, + "versionNonce": 362766429, + "isDeleted": false, + "boundElementIds": [ + "70dbl4jJzrLBtDEytNCQV", + "WMUUsb8QMcD0Esl_zVVcA" + ] + }, + { + "id": "70dbl4jJzrLBtDEytNCQV", + "type": "arrow", + "x": 1247.6935506584748, + "y": 1097.83203125, + "width": 1.41015625, + "height": 67.89453125, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "groupIds": [], + "strokeSharpness": "round", + "seed": 1082596541, + "version": 363, + "versionNonce": 516628467, + "isDeleted": false, + "boundElementIds": null, + "points": [ + [ + 0, + 0 + ], + [ + -1.41015625, + -67.89453125 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "t8m7A_AiI0Zz6g-q3XhnP", + "focus": 0.03369303215762137, + "gap": 1 + }, + "endBinding": { + "elementId": "cbY7dAu_xBZLtfnwANQ0h", + "focus": 0.02205392272987631, + "gap": 2.894614565986096 + }, + "startArrowhead": null, + "endArrowhead": "arrow" + }, + { + "id": "cbY7dAu_xBZLtfnwANQ0h", + "type": "ellipse", + "x": 1208.3615194084748, + "y": 960.5625, + "width": 76.01953124999999, + "height": 66.48046875000001, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "groupIds": [], + "strokeSharpness": "round", + "seed": 92260445, + "version": 169, + "versionNonce": 1592609981, + "isDeleted": false, + "boundElementIds": [ + "70dbl4jJzrLBtDEytNCQV", + "-4uRLR2_U4-S_frteL9z4" + ] + }, + { + "id": "pvblHfogurhXv88mbBcRK", + "type": "text", + "x": 1190.8966756584748, + "y": 923.8671875, + "width": 97, + "height": 25, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "groupIds": [], + "strokeSharpness": "round", + "seed": 555034749, + "version": 127, + "versionNonce": 1256761747, + "isDeleted": false, + "boundElementIds": null, + "text": "issue/NNN", + "fontSize": 20, + "fontFamily": 1, + "textAlign": "center", + "verticalAlign": "top", + "baseline": 18 + }, + { + "id": "l5V8BKWT6NL8Pot9eGQxW", + "type": "text", + "x": 1305.6271444084748, + "y": 1239.46875, + "width": 61, + "height": 25, + "angle": 0.5019114078121252, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "groupIds": [], + "strokeSharpness": "round", + "seed": 1943628413, + "version": 208, + "versionNonce": 880717085, + "isDeleted": false, + "boundElementIds": null, + "text": "branch", + "fontSize": 20, + "fontFamily": 1, + "textAlign": "center", + "verticalAlign": "top", + "baseline": 18 + }, + { + "id": "-4uRLR2_U4-S_frteL9z4", + "type": "arrow", + "x": 1281.456370622558, + "y": 1027.6261866542388, + "width": 134.43973816675407, + "height": 87.48529746818951, + "angle": 0.004286381490581803, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "dashed", + "roughness": 2, + "opacity": 100, + "groupIds": [], + "strokeSharpness": "round", + "seed": 515639315, + "version": 475, + "versionNonce": 1508114227, + "isDeleted": false, + "boundElementIds": null, + "points": [ + [ + 0, + 0 + ], + [ + 134.43973816675407, + 87.48529746818951 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "cbY7dAu_xBZLtfnwANQ0h", + "focus": 0.2493704175711463, + "gap": 13.087600935174486 + }, + "endBinding": { + "elementId": "_BzjrIXl7qYcDggInAePz", + "focus": 0.09625345211262865, + "gap": 8.481964629522814 + }, + "startArrowhead": null, + "endArrowhead": "arrow" + }, + { + "id": "uF9xy7cXMn1FvZunqydoW", + "type": "text", + "x": 1295.7169881584748, + "y": 1039.40625, + "width": 92, + "height": 50, + "angle": 0.6085681160569036, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "dashed", + "roughness": 2, + "opacity": 100, + "groupIds": [], + "strokeSharpness": "round", + "seed": 1420693821, + "version": 485, + "versionNonce": 633667965, + "isDeleted": false, + "boundElementIds": [ + "-4uRLR2_U4-S_frteL9z4" + ], + "text": "squash &\nmerge", + "fontSize": 20, + "fontFamily": 1, + "textAlign": "center", + "verticalAlign": "top", + "baseline": 43 + }, + { + "id": "KdT7jD6HzANFmEe6z4wLp", + "type": "arrow", + "x": 1833.0998006584748, + "y": 1252.171875, + "width": 2.63671875, + "height": 94.6484375, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "groupIds": [], + "strokeSharpness": "round", + "seed": 2067697885, + "version": 110, + "versionNonce": 1476512221, + "isDeleted": false, + "boundElementIds": null, + "points": [ + [ + 0, + 0 + ], + [ + -2.63671875, + -94.6484375 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow" + }, + { + "id": "TT0_3mZZNKiBunuQSP-6q", + "type": "arrow", + "x": 1555.6427694084748, + "y": 1114.3515625, + "width": 91.1191404562444, + "height": 83.38521337099382, + "angle": 0, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "dashed", + "roughness": 2, + "opacity": 100, + "groupIds": [], + "strokeSharpness": "round", + "seed": 1441302717, + "version": 209, + "versionNonce": 2034110067, + "isDeleted": false, + "boundElementIds": null, + "points": [ + [ + 0, + 0 + ], + [ + -91.1191404562444, + -83.38521337099382 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "VXTr4t2TCfsx3lBbrX9FA", + "focus": -0.38981301814327424, + "gap": 5.744985949842281 + }, + "endBinding": { + "elementId": "i8LbwDXP7xJogP137mBcN", + "focus": 0.49013243946634244, + "gap": 9.849649250656697 + }, + "startArrowhead": null, + "endArrowhead": "arrow" + }, + { + "id": "u4he9DEv2RkSQWCHnrB1f", + "type": "text", + "x": 1496.6896444084748, + "y": 1059.35546875, + "width": 57, + "height": 50, + "angle": 0.8031270324586943, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "dashed", + "roughness": 2, + "opacity": 100, + "groupIds": [], + "strokeSharpness": "round", + "seed": 1349313139, + "version": 249, + "versionNonce": 1279690301, + "isDeleted": false, + "boundElementIds": null, + "text": "cherry\npick", + "fontSize": 20, + "fontFamily": 1, + "textAlign": "center", + "verticalAlign": "top", + "baseline": 43 + }, + { + "type": "rectangle", + "version": 754, + "versionNonce": 1732591795, + "isDeleted": false, + "id": "sHsXEtwWTjBFom2nIhGIs", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1289.2511854554907, + "y": 820.90625, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 109.40816790596809, + "height": 28.898437499999996, + "seed": 507648189, + "groupIds": [], + "strokeSharpness": "round", + "boundElementIds": [] + }, + { + "type": "text", + "version": 466, + "versionNonce": 1287846365, + "isDeleted": false, + "id": "0dgfZ8refzUdb0GHOjr_F", + "fillStyle": "hachure", + "strokeWidth": 1, + "strokeStyle": "solid", + "roughness": 2, + "opacity": 100, + "angle": 0, + "x": 1301.4552694084748, + "y": 826.85546875, + "strokeColor": "#000000", + "backgroundColor": "transparent", + "width": 85, + "height": 17, + "seed": 1897307539, + "groupIds": [], + "strokeSharpness": "round", + "boundElementIds": [], + "fontSize": 14.094472755782043, + "fontFamily": 1, + "text": "v3.5.0-alpha", + "baseline": 12, + "textAlign": "center", + "verticalAlign": "middle" + } + ], + "appState": { + "gridSize": null, + "viewBackgroundColor": "#ffffff" + }, + "files": {} +} \ No newline at end of file diff --git a/docs/branching.png b/docs/branching.png new file mode 100644 index 0000000..bd3b5e2 Binary files /dev/null and b/docs/branching.png differ