roadmap/waku/process.html

392 lines
146 KiB
HTML
Raw Normal View History

2024-03-10 18:30:21 +00:00
<!DOCTYPE html>
2024-05-17 04:34:57 +00:00
<html><head><title>Process</title><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1.0"/><meta property="og:title" content="Process"/><meta property="og:description" content="Resources § Waku Github: https://github.com/waku-org/ Engineering Processes: https://github.com/waku-org/pm/blob/master/PROCESS.md Motivation and Goal § Implement the following attribute when delivering: Clear tracking of work across the teams so that when we says that a milestone is delivered, then: it is usable by all types of users (operators, web devs, system devs)."/><meta property="og:image" content="https://roadmap.logos.co/static/og-image.png"/><meta property="og:width" content="1200"/><meta property="og:height" content="675"/><link rel="icon" href="../static/icon.png"/><meta name="description" content="Resources § Waku Github: https://github.com/waku-org/ Engineering Processes: https://github.com/waku-org/pm/blob/master/PROCESS.md Motivation and Goal § Implement the following attribute when delivering: Clear tracking of work across the teams so that when we says that a milestone is delivered, then: it is usable by all types of users (operators, web devs, system devs)."/><meta name="generator" content="Quartz"/><link rel="preconnect" href="https://fonts.googleapis.com"/><link rel="preconnect" href="https://fonts.gstatic.com"/><link href="../index.css" rel="stylesheet" type="text/css" spa-preserve/><link href="https://cdn.jsdelivr.net/npm/katex@0.16.0/dist/katex.min.css" rel="stylesheet" type="text/css" spa-preserve/><link href="https://fonts.googleapis.com/css2?family=IBM Plex Mono&amp;family=sans-serif:wght@400;700&amp;family=sans-serif:ital,wght@0,400;0,600;1,400;1,600&amp;display=swap" rel="stylesheet" type="text/css" spa-preserve/><script src="../prescript.js" type="application/javascript" spa-preserve></script><script type="application/javascript" spa-preserve>const fetchData = fetch(`../static/contentIndex.json`).then(data => data.json())</script></head><body data-slug="waku/process"><div id="quartz-root" class="page"><div id="quartz-body"><div class="left sidebar"><h1 class="page-title "><a href="..">Logos Collective Project Roadmaps</a></h1><div class="spacer mobile-only"></div><div class="search "><div id="search-icon"><p>Search</p><div></div><svg tabIndex="0" aria-labelledby="title desc" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 19.9 19.7"><title id="title">Search</title><desc id="desc">Search</desc><g class="search-path" fill="none"><path stroke-linecap="square" d="M18.5 18.3l-5.4-5.4"></path><circle cx="8" cy="8" r="7"></circle></g></svg></div><div id="search-container"><div id="search-space"><input autocomplete="off" id="search-bar" name="search" type="text" aria-label="Search for something" placeholder="Search for something"/><div id="results-container"></div></div></div></div><div class="darkmode "><input class="toggle" id="darkmode-toggle" type="checkbox" tabIndex="-1"/><label id="toggle-label-light" for="darkmode-toggle" tabIndex="-1"><svg xmlns="http://www.w3.org/2000/svg" xmlnsXlink="http://www.w3.org/1999/xlink" version="1.1" id="dayIcon" x="0px" y="0px" viewBox="0 0 35 35" style="enable-background:new 0 0 35 35;" xmlSpace="preserve"><title>Light mode</title><path d="M6,17.5C6,16.672,5.328,16,4.5,16h-3C0.672,16,0,16.672,0,17.5 S0.672,19,1.5,19h3C5.328,19,6,18.328,6,17.5z M7.5,26c-0.414,0-0.789,0.168-1.061,0.439l-2,2C4.168,28.711,4,29.086,4,29.5 C4,30.328,4.671,31,5.5,31c0.414,0,0.789-0.168,1.06-0.44l2-2C8.832,28.289,9,27.914,9,27.5C9,26.672,8.329,26,7.5,26z M17.5,6 C18.329,6,19,5.328,19,4.5v-3C19,0.672,18.329,0,17.5,0S16,0.672,16,1.5v3C16,5.328,16.671,6,17.5,6z M27.5,9 c0.414,0,0.789-0.168,1.06-0.439l2-2C30.832,6.289,31,5.914,31,5.5C31,4.672,30.329,4,29.5,4c-0.414,0-0.789,0.168-1.061,0.44 l-2,2C26.168,6.711,26,7.086,26,7.5C26,8.328,26.671,9,27.5,9z M6.439,8.561C6.711,8.832,7.086,9,7.5,9C8.328,9,9,8.328,9,7.5 c0-0.414-0.168-0.789-0.439-1.061l-2-2C6.289,4.168,5.914,4,5.5,4C4.672,4,4,4.672,4,5.5c0,0.414,0.168,0.789,0.439,1.06 L6.439,8.561z M33.
2024-03-10 18:30:21 +00:00
<ul>
<li>Waku Github: <a href="https://github.com/waku-org/" class="external">https://github.com/waku-org/</a></li>
<li>Engineering Processes: <a href="https://github.com/waku-org/pm/blob/master/PROCESS.md" class="external">https://github.com/waku-org/pm/blob/master/PROCESS.md</a></li>
</ul>
<h2 id="motivation-and-goal">Motivation and Goal<a aria-hidden="true" tabindex="-1" href="#motivation-and-goal" class="internal"> §</a></h2>
<p>Implement the following attribute when delivering:</p>
<ol>
<li>Clear tracking of work across the teams so that when we says that a milestone is delivered, then:
<ul>
<li>it is usable by all types of users (operators, web devs, system devs).</li>
<li>It is documented (docs, dev rel)</li>
<li>It is of high quality (QA, Dogfooding)</li>
</ul>
</li>
<li>Items (epic, milestones) can be easily be closed and marked as complete thanks to:
<ul>
<li>Minimal external dependencies</li>
<li>Minimal intra-team dependency</li>
<li>Finite, well-define scope.</li>
</ul>
</li>
<li>Each milestone and the effort needed to achieve it has a clear value thanks to a well-defined, value-driven, minimal, scope.</li>
</ol>
<h2 id="terminology-and-scope">Terminology and Scope<a aria-hidden="true" tabindex="-1" href="#terminology-and-scope" class="internal"> §</a></h2>
<table><thead><tr><th>Name</th><th>Number of</th><th>Timeframe</th><th>Team Scope</th><th>Owner</th><th>Description</th></tr></thead><tbody><tr><td>Milestone</td><td>?</td><td>Pencilled for the year, planned for 2 quarters</td><td>Most subteams</td><td>Waku Lead</td><td>A, or cohesive set of, feature(s).</td></tr><tr><td>Epic</td><td>Several per milestone</td><td>Set for a milestone</td><td>Usually one subteam or external team (e.g. DST)</td><td>Subteam Lead or Member</td><td>Milestone work for a given subteam.</td></tr><tr><td>Task</td><td>Many per Epic</td><td>Set monthly-ish, delivered weekly</td><td>One subteam or individual</td><td>Team Member</td><td>May be one or several piece of work, client specific.</td></tr></tbody></table>
<h2 id="milestone-definition">Milestone Definition<a aria-hidden="true" tabindex="-1" href="#milestone-definition" class="internal"> §</a></h2>
<p>A <em>Milestone</em>:</p>
<ol>
<li><strong>Provides a tangible user benefit:</strong> The milestone should aim to provide a distinct benefit or feature to the user, whether they are end users, operators or developers. In some case, a milestone may be a bundle of small features. The bundle of features should be cohesive and the benefit to the users should be easy to summarize. Most likely, a bundle milestone will be scoped to a given track.</li>
<li><strong>Minimal Scope:</strong> The milestone should be trimmed to a minimal scope, encompassing only what is <em>just enough</em> to assess the potential impact of these features on the projects metrics (e.g. number of users, revenue). This means descoping any advanced features and aiming for a MVP-level delivery.</li>
<li><strong>Transversal:</strong> While the vertical scope of a milestone should be minimal, the delivery should be complete in terms of research, engineering, QA, documentation and dev rel assets so that the feature can be pushed to users once the milestone is marked as complete. Feedback loops should be as small as possible to ensure the value of a milestone is measured in a timely manner.</li>
<li><strong>Attached Estimate:</strong> An estimate should be associated with the milestone to facilitate the measurement of potential ROI. Additionally, tracking the estimate versus the actual progress is crucial for identifying any deviation and making informed decisions (e.g., deciding whether to continue if we learn the estimate is likely to be overrun).</li>
</ol>
<h2 id="milestone-scoping-process-flow">Milestone scoping process flow<a aria-hidden="true" tabindex="-1" href="#milestone-scoping-process-flow" class="internal"> §</a></h2>
<p>Phase 1: Waku lead defines the scope within the Milestone. The scope is then discussed asynchronously in the comments of the GitHub issue by relevant subteams and stakeholders, scope of Epics and subtasks are defined.</p>
<p>Phase 2: During a Waku PM call, the team reviews the Milestone to confirm scope or identify areas that require additional scoping.</p>
<p>Phase 3: If the scope is agreed upon, the team can proceed to create Epics and schedule work for kickoff.</p>
<h2 id="epics-and-workflow">Epics and Workflow<a aria-hidden="true" tabindex="-1" href="#epics-and-workflow" class="internal"> §</a></h2>
<p>A <em>milestone</em> is divided in <em>Epics</em>. Each <em>epic</em> is assigned to a given subteam.</p>
<p>Each Waku subteam lead (or selected member) is accountable for the delivery of their epic.</p>
<p>Typically, each <em>milestone</em> will be divided in the following <em>epics</em>:</p>
<table><thead><tr><th>Epic Label Prefix</th><th>Owner Sub-team</th><th>Output</th><th>Description</th></tr></thead><tbody><tr><td><code>E:research</code></td><td>Waku Research</td><td>PoC, RFC, Protocol Simulations/Studies</td><td>Initial work done by the research team to create or change a protocol. Engineering-only Milestones may not have such epic</td></tr><tr><td><code>E:nwaku</code></td><td>nwaku</td><td>MVP quality software</td><td>Bring software to MVP level, proceed with re-architecture of PoC if needed, ensure functionality is usable, refine APIs, auto-generated/API documentation, ensure interoperability works</td></tr><tr><td><code>E:js-waku</code></td><td>js-waku</td><td>MVP quality software, including all supported env (e.g. React Native &amp; Web)</td><td>Implement protocol in js-waku, same as nwaku.</td></tr><tr><td><code>E:bindings</code></td><td>nwaku</td><td>MVP quality software for supported bindings (WIP)</td><td>Expose new protocol/features on binding APIs.</td></tr><tr><td><code>E:go-waku</code></td><td>go-waku</td><td>MVP quality software, include all supported bindings (i.e. C and Rust)</td><td>Implement protocol in go-waku, only if needed by Status app.</td></tr><tr><td><code>E:qa</code></td><td>Vac/DST</td><td>RFC-based + functionality based tests, both unit and integration tests.</td><td>Test engineers take over and complete unit tests + add scenarios in integration test framework. In future, also add scenario to benchmark suite.</td></tr><tr><td><code>E:dogfood</code></td><td>js-waku, nwaku, bindings</td><td>Lab example updates, own nodes updated, etc.</td><td>Each dev team proceed by dogfooding the feature/API by using it themselves. Whether it is running their own node, or updating a selected number of examples. Go-waku can dogfood directly in status-go.</td></tr><tr><td><code>E:docs</code></td><td>Doc</td><td>Documentation (not auto-generated)</td><td>Document the new feature across all implementations, using the dogfooding output as handover material from engineering teams. This includes both coding guides but also a presentation ready visual documentation of the protocol behaviour.</td></tr><tr><td><code>E:eco-dev</code></td><td>Eco Dev</td><td>Dev Rel assets (examples, video tutorial, etc), comms plan (X threads, blog posts)</td><td>Dev Rel can now prepare assets to push the feature to developers, comms can prepare copies to communicate about it, BD can push it to projects and partners.</td></tr></tbody></table>
<pre><code class="mermaid">flowchart LR
subgraph milestone [Milestone]
scope[Define scope and estimate]
end
subgraph researchE [E:research]
scope-->research[RFC + Protocol Simulation + PoC]
end
subgraph nwakuE [E:nwaku]
research-- Handover -->nwaku[MVP, API, Code doc, unit test]
end
subgraph js-wakuE [E:js-waku]
research-- Handover -->js-waku[MVP, API, Code doc, unit test]
end
subgraph go-wakuE [E:go-waku]
research-- Handover -->go-waku[MVP, API, Code doc, unit test]
end
subgraph go-wakuE [E:bindings]
research-- Handover -->go-waku[API, Code doc, unit test]
end
subgraph qaE [E:qa]
nwaku--Handover-->QA[QA, extended, interop and RFC-based testing]
js-waku--Handover-->QA
go-waku--Handover-->QA
end
subgraph dogfoodE [E:dogfood]
nwaku-->Dogfooding[Developer use new software and API, interoperability]
js-waku-->Dogfooding
go-waku-->Dogfooding
end
subgraph docsE [E:docs]
Dogfooding-- Handover -->Docs[Update and create guides and protocol documentation]
end
subgraph ecodevE [E:eco-dev]
Dogfooding-- Handover -->Eco-Dev[Dev Rel and BD assets, plan Comms]
Docs-->Eco-Dev
end
</code></pre>
<h3 id="engineering-only-milestones">Engineering-Only Milestones<a aria-hidden="true" tabindex="-1" href="#engineering-only-milestones" class="internal"> §</a></h3>
<p>Some milestones may not involve the Waku Research team. In this case, the flow still applies but <code>E:research</code> is skipped.</p>
<h3 id="chat-sdk-and-other-special-sdk-work">Chat SDK and other Special SDK Work<a aria-hidden="true" tabindex="-1" href="#chat-sdk-and-other-special-sdk-work" class="internal"> §</a></h3>
<p>The Chat SDK team is focusing on go-waku integration in status-go and follows Status PM for issues and labelling.</p>
<p>Once the team starts building an independent Chat (or other) SDK, the flow will be as above but with research handled by VAC/ACZ and only one dev team:</p>
<table><thead><tr><th>Epic Prefix</th><th>Owner Sub-team</th><th>Output</th><th>Description</th></tr></thead><tbody><tr><td><code>E:acz</code></td><td>Vac/ACZ</td><td>RFC</td><td>RFC describing a specific, likely agnostic protocol</td></tr><tr><td><code>E:chat sdk</code></td><td>Chat SDK</td><td>PoC and then MVP quality software, Application RFC</td><td>Implement the ACZ RFC, define API and application protocol</td></tr></tbody></table>
<p>Handover to QA, Docs, Eco Dev with MVP quality software is still expected down the track but may be pending growing teams.</p>
<h3 id="accountability">Accountability<a aria-hidden="true" tabindex="-1" href="#accountability" class="internal"> §</a></h3>
<p>Each epic should have an owner per subteam.
Most epics will have a unique owner (e.g. a Waku Research team member owns a <code>E:research</code> epic).
For <em>Dogfood</em> and <em>QA</em> epics, one owner per client should be set.</p>
<p>The epic owner is responsible for breaking down the work in smaller issues in the related repo.</p>
<p>For research team, it is expected that most of the research work is done by the epic owner, which includes:</p>
<ul>
<li>Capturing problem statement</li>
<li>Designing protocol/solution</li>
<li>Implementing PoC in reference implementation</li>
<li>Running tests/simulations to confirm behaviour (to be offloaded to test engineer)</li>
</ul>
<p>For development teams, it is expected that design/break down is done by the epic owner.
But actual work can be picked up by other team member.
Epic owner must:</p>
<ul>
<li>Understand the change and its implications,</li>
<li>Liaise with researcher for any doubt or questions or design issues related to specific client/use case,</li>
<li>Create issues (<em>Tasks</em>) to break down work in client repo, include an <em>acceptance criteria</em> in each issue to ensure that the objective/end goal/behaviour is clearly described.</li>
</ul>
<p>It is likely that the epic owner will do the core change or first change for a given epic.
However, subsequent/other changes may be picked up in parallel or sequentially by other team members.</p>
<p>Hence:</p>
<ul>
<li>dependencies must be clearly stated in <em>Task</em> issue description</li>
<li>Team members must assign <em>Task</em> issues to themselves when work starts</li>
<li>Team members must update issues to track progress</li>
</ul>
<p>The program manager should ensure that epics are getting the right assignee in a timely fashion.
For example, when research work starts for a given milestone, epic owners from development team should be assigned, so they know to participate in discussions.
Program manager should also ensure that issues are being created in a timely fashion,
an is encouraged to use client PM call as a forum to check epics to be assigned, for example when a given epic is near completion.</p>
<h3 id="handovers">Handovers<a aria-hidden="true" tabindex="-1" href="#handovers" class="internal"> §</a></h3>
<p>The following handovers are defined:</p>
<table><thead><tr><th>Handover</th><th>Expectations when handing over</th><th>Expectations when accepting handover</th></tr></thead><tbody><tr><td>Research to development teams</td><td>- RFC PR is merged <br/> - PoC PR is merged</td><td>- RFC content and PoC are reviewed <br/> - Own code and functionality <br/> - Own minor RFC changes</td></tr><tr><td>Development teams to QA</td><td>- Happy path and selected error path tests exist <br/> - APIs are implemented to enable interop testing</td><td>- Review RFC <br/> - Review existing tests</td></tr><tr><td>Development teams to Docs</td><td>- Working usage of API is provided <br/> - Auto-generated documentation for public API is present</td><td>- Review examples <br/> - Understands functionality <br/></td></tr><tr><td>Docs to Eco Dev</td><td>- Docs PR is merged with functioning code</td><td>- Understands functionality <br/> - Execute guides</td></tr></tbody></table>
<p>The group or person handing over is expected to initiate a sync (meeting) or async (chat or GitHub) discussion to go through the output and overview.</p>
<p>Once the handover is accepted, the given epic can be closed.</p>
<h3 id="github-usage">GitHub Usage<a aria-hidden="true" tabindex="-1" href="#github-usage" class="internal"> §</a></h3>
<p>A <em>Milestone</em>:</p>
<ul>
<li>MUST have a matching GitHub issue in the <a href="https://github.com/waku-org/pm" class="external">https://github.com/waku-org/pm</a> repo with <code>milestone</code> label assigned.</li>
<li>MUST have a GitHub Milestone in <a href="https://github.com/waku-org/pm" class="external">https://github.com/waku-org/pm</a> repo, to which relevant <em>Epics</em> are added.</li>
<li>The GitHub milestone MUST be used to track progress.</li>
</ul>
<p>An <em>Epic</em>:</p>
<ul>
<li>MUST have a matching GitHub issue in the <a href="https://github.com/waku-org/pm" class="external">https://github.com/waku-org/pm</a> repo.</li>
<li>MUST have a label with format <code>E:&lt;prefix> &lt;epic name></code>.</li>
<li>SHOULD be added to a GitHub Milestone.</li>
<li>SHOULD have a <code>Planned Start</code> and <code>Due Date</code> set (these are GitHub projects fields you can find in the <code>Projects</code> section of the issue view sidebar).</li>
<li>MAY list <em>Tasks</em> present in other repos.</li>
<li>MUST have assignee(s), who represent the epic owner (see <a href="#accountability" class="internal">accountability</a>)</li>
</ul>
<p>A <em>Task</em>:</p>
<ul>
<li>MAY be tracked as a todo item in a GitHub Issue (<em>Task</em> or <em>Epic</em>),</li>
<li>OR MAY be tracked as a single GH issue
<ul>
<li>that MUST be labelled with related <em>Epic</em> label (<code>E:...</code>),</li>
</ul>
</li>
<li>OR MAY be tracked as a GH Pull Request
<ul>
<li>that MUST have a reference to the related GitHub <em>Task</em> or <em>Epic</em> issue</li>
</ul>
</li>
<li>MUST have an <em>acceptance criteria</em> and/or a list of <em>tasks</em> (that can be other GH issues).</li>
</ul>
<p>Finally, for <em>Tasks</em> that do not belong to a given <em>Epic</em> or <em>Milestone</em>:</p>
<ul>
<li>MUST have either labels:
<ul>
<li><code>bug</code>: This is a bug, likely reported by a user</li>
<li><code>enhancement</code>: This is an enhancement out of the scope of the technical roadmap, likely reported by a user
<ul>
<li>Major enhancements should be carefully reviewed and prioritized.</li>
</ul>
</li>
<li><code>documentation</code>: Documentation improvement or correction.</li>
<li><code>dependencies</code>: Upgrade dependencies in a timely manner to avoid time wasting when the dependency upgrade becomes critical.</li>
</ul>
</li>
</ul>
<p>Which means, in terms of <em>navigation</em>:</p>
<ul>
<li>Work for a Milestone is described in the related GitHub issue and tracked in the GitHub milestone.</li>
<li>In the GitHub milestone, we have a list of <em>Epics</em> to be achieved, the <em>Epics</em> are being closed as the work is done and handed over.</li>
<li>To look at remaining work for an <em>Epic</em>, one need to look at all issues (<em>Tasks</em>) with the corresponding <em>Epic</em> label (<code>E:...</code>)</li>
</ul></article></div><div class="right sidebar"><div class="graph "><h3>Graph View</h3><div class="graph-outer"><div id="graph-container" data-cfg="{&quot;drag&quot;:true,&quot;zoom&quot;:true,&quot;depth&quot;:1,&quot;scale&quot;:1.1,&quot;repelForce&quot;:0.5,&quot;centerForce&quot;:0.3,&quot;linkDistance&quot;:30,&quot;fontSize&quot;:0.6,&quot;opacityScale&quot;:1,&quot;showTags&quot;:true,&quot;removeTags&quot;:[]}"></div><svg version="1.1" id="global-graph-icon" xmlns="http://www.w3.org/2000/svg" xmlnsXlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 55 55" fill="currentColor" xmlSpace="preserve"><path d="M49,0c-3.309,0-6,2.691-6,6c0,1.035,0.263,2.009,0.726,2.86l-9.829,9.829C32.542,17.634,30.846,17,29,17
s-3.542,0.634-4.898,1.688l-7.669-7.669C16.785,10.424,17,9.74,17,9c0-2.206-1.794-4-4-4S9,6.794,9,9s1.794,4,4,4
c0.74,0,1.424-0.215,2.019-0.567l7.669,7.669C21.634,21.458,21,23.154,21,25s0.634,3.542,1.688,4.897L10.024,42.562
C8.958,41.595,7.549,41,6,41c-3.309,0-6,2.691-6,6s2.691,6,6,6s6-2.691,6-6c0-1.035-0.263-2.009-0.726-2.86l12.829-12.829
c1.106,0.86,2.44,1.436,3.898,1.619v10.16c-2.833,0.478-5,2.942-5,5.91c0,3.309,2.691,6,6,6s6-2.691,6-6c0-2.967-2.167-5.431-5-5.91
v-10.16c1.458-0.183,2.792-0.759,3.898-1.619l7.669,7.669C41.215,39.576,41,40.26,41,41c0,2.206,1.794,4,4,4s4-1.794,4-4
s-1.794-4-4-4c-0.74,0-1.424,0.215-2.019,0.567l-7.669-7.669C36.366,28.542,37,26.846,37,25s-0.634-3.542-1.688-4.897l9.665-9.665
C46.042,11.405,47.451,12,49,12c3.309,0,6-2.691,6-6S52.309,0,49,0z M11,9c0-1.103,0.897-2,2-2s2,0.897,2,2s-0.897,2-2,2
S11,10.103,11,9z M6,51c-2.206,0-4-1.794-4-4s1.794-4,4-4s4,1.794,4,4S8.206,51,6,51z M33,49c0,2.206-1.794,4-4,4s-4-1.794-4-4
s1.794-4,4-4S33,46.794,33,49z M29,31c-3.309,0-6-2.691-6-6s2.691-6,6-6s6,2.691,6,6S32.309,31,29,31z M47,41c0,1.103-0.897,2-2,2
s-2-0.897-2-2s0.897-2,2-2S47,39.897,47,41z M49,10c-2.206,0-4-1.794-4-4s1.794-4,4-4s4,1.794,4,4S51.206,10,49,10z"></path></svg></div><div id="global-graph-outer"><div id="global-graph-container" data-cfg="{&quot;drag&quot;:true,&quot;zoom&quot;:true,&quot;depth&quot;:-1,&quot;scale&quot;:0.9,&quot;repelForce&quot;:0.5,&quot;centerForce&quot;:0.3,&quot;linkDistance&quot;:30,&quot;fontSize&quot;:0.6,&quot;opacityScale&quot;:1,&quot;showTags&quot;:true,&quot;removeTags&quot;:[]}"></div></div></div><div class="toc desktop-only"><button type="button" id="toc"><h3>Table of Contents</h3><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="fold"><polyline points="6 9 12 15 18 9"></polyline></svg></button><div id="toc-content"><ul class="overflow"><li class="depth-0"><a href="#resources" data-for="resources">Resources</a></li><li class="depth-0"><a href="#motivation-and-goal" data-for="motivation-and-goal">Motivation and Goal</a></li><li class="depth-0"><a href="#terminology-and-scope" data-for="terminology-and-scope">Terminology and Scope</a></li><li class="depth-0"><a href="#milestone-definition" data-for="milestone-definition">Milestone Definition</a></li><li class="depth-0"><a href="#milestone-scoping-process-flow" data-for="milestone-scoping-process-flow">Milestone scoping process flow</a></li><li class="depth-0"><a href="#epics-and-workflow" data-for="epics-and-workflow">Epics and Workflow</a></li><li class="depth-1"><a href="#engineering-only-milestones" data-for="engineering-only-milestones">Engineering-Only Milestones</a></li><li class="depth-1"><a href="#chat-sdk-and-other-special-sdk-work" data-for="chat-sdk-and-other-special-sdk-work">Chat SDK and other Special SDK Work</a></li><li class="depth-1"><a href="#accountability" data-for="accountability">Accountability</a></li><li class="depth-1"><a href="#handovers" data-for="handovers">Handovers</a></li><li class="depth-1"><a href="#github-usage" data-for="github-usage">GitHub Usage</a></li></ul></div></div><div class="backlinks "><h3>Backlinks</h3><ul class="overflow"><li><a href="../waku/" class="internal">Waku Roadmap</a></li></ul></div></div></div><footer class><hr/><p>Created with <a href="https://quartz.jzhao.xyz/">Quartz v4.1.0</a>, © 2024</p><ul><li><a href="https://github.com/logos-co/roadmap">GitHub</a></li><li><a href="https://discord.com/invite/logos-state">Discord Community</a></li></ul></footer></div></body><script type="application/javascript">// quartz/components/scripts/quartz/components/scripts/callout.inline.ts
function toggleCallout() {
const outerBlock = this.parentElement;
outerBlock.classList.toggle(`is-collapsed`);
const collapsed = outerBlock.classList.contains(`is-collapsed`);
const height = collapsed ? this.scrollHeight : outerBlock.scrollHeight;
outerBlock.style.maxHeight = height + `px`;
let current = outerBlock;
let parent = outerBlock.parentElement;
while (parent) {
if (!parent.classList.contains(`callout`)) {
return;
}
const collapsed2 = parent.classList.contains(`is-collapsed`);
const height2 = collapsed2 ? parent.scrollHeight : parent.scrollHeight + current.scrollHeight;
parent.style.maxHeight = height2 + `px`;
current = parent;
parent = parent.parentElement;
}
}
function setupCallout() {
const collapsible = document.getElementsByClassName(
`callout is-collapsible`
);
for (const div of collapsible) {
const title = div.firstElementChild;
if (title) {
title.removeEventListener(`click`, toggleCallout);
title.addEventListener(`click`, toggleCallout);
const collapsed = div.classList.contains(`is-collapsed`);
const height = collapsed ? title.scrollHeight : div.scrollHeight;
div.style.maxHeight = height + `px`;
}
}
}
document.addEventListener(`nav`, setupCallout);
window.addEventListener(`resize`, setupCallout);
</script><script type="module">
import mermaid from 'https://cdn.jsdelivr.net/npm/mermaid/dist/mermaid.esm.min.mjs';
const darkMode = document.documentElement.getAttribute('saved-theme') === 'dark'
mermaid.initialize({
startOnLoad: false,
securityLevel: 'loose',
theme: darkMode ? 'dark' : 'default'
});
document.addEventListener('nav', async () => {
await mermaid.run({
querySelector: '.mermaid'
})
});
</script><script src="https://cdn.jsdelivr.net/npm/katex@0.16.7/dist/contrib/copy-tex.min.js" type="application/javascript"></script><script src="../postscript.js" type="module"></script></html>