Build briefs¶
This folder holds the build briefs: one English file per ticket, written so that an unattended
build session can finish the ticket with a green make check without asking anything. Each brief
names its goal, the chapters and ADRs to read, the fixed build rules, scope and boundaries, the
tests to write first, the acceptance criteria and the report format. Order and dependencies come
from the plan (section "Tickets" of each milestone); this index repeats them for
the launcher.
Briefs exist for milestone M1 (plan ticket M0-05) and for the milestones M2 to M8. By the
owner's decisions of 2026-10-11, 2026-10-13 and 2026-10-14 the briefs of M2 to M8 are written
before M1 closes, so that builds do not run out of work (D-W-100, D-W-114, D-W-120, D-W-124 and D-W-125 in
DECISIONS.md): they name interfaces of earlier milestones as those briefs and
the merged code name them, and each carries the boundary that a build session follows merged
code that differs only in names and stops with Verdict: BLOCKED where it behaves differently
from the specification. Briefs of the milestones after these are written when the owner asks for
them or when the milestone before them closes.
How a brief runs¶
- The launcher starts a brief only when every ticket in "Depends on" is merged into the base branch and milestone M0 is closed (plan, section "M0 Planning"). A brief of a later milestone does not wait for the milestone before it to close: its "Depends on" names every ticket it builds on (plan P-01). A local SonarQube with the "Bothy way" gate must be running from M1-05 on (ticket M0-07).
- The launcher fills the placeholders
{{REPORT_PATH}}and{{DONE_PATH}}and passes its host rules (ports, machine rules); a brief never contains instance-specific values. - Each brief runs in its own git worktree on the branch
feat/<ticket-id>-<slug>. Tickets of the same wave share no dependency and may run in parallel; overlapping files are resolved at merge. - The working rules of the plan (section "Way of working per ticket") apply to every brief: test
first, specification first,
make checkgreen, review and red team before the merge, which goes through a pull request asAGENTS.mddescribes ("How work lands onmain"; it takes precedence over the local merge that the plan names). The red team report is stored as.review/<sha>.mdof the commit to merge, last lineUrteil: JA(PLAN 3.9, D-W-32). - A brief that finds a gap in the core contract (chapters 00, 03, 04, 05) stops with
Verdict: BLOCKEDinstead of building a deviation. Every brief has the title line# <ticket>: <title>, the status lineStatus: ready | Depends on: ... | Milestone: <milestone>, the eleven sections of the existing briefs in their order (Goal to Report) and a report with the placeholders of item 2;tools/docs/tests/test_brief_format.pyfails on any other shape and on a brief file that the index does not list. -
The owner's fixed build rules 1 to 5 stand in every brief byte for byte as in the section "Fixed build rules" below: a literal English translation of the owner's wording, nothing added or left out.
tools/docs/tests/test_brief_rules.pyfails on any other wording. Rule 3 ("API documentation is generated from code (OpenAPI from the routes, ...)") means one source in this repository:docs/api/openapi.yamlis normative (ADR 0013, spec first), routes, handler interfaces and clients are generated from it, andmake codegen-checkkeeps them equal. No session generates OpenAPI from handler code.Which gate enforces the doc comments per language and where the API documentation comes from: chapter 23, "Documentation in code".
Fixed build rules¶
1. No MVP. New from scratch and directly in the final state; stages are only the order.
2. Strictly modular: clear module and service boundaries, dependencies only through defined
interfaces, no cross access.
3. Documentation in code: every public module, class, function and interface with a docstring/doc
comment (purpose, parameters, return value, errors, example where useful); comments explain the
why, not the what. API documentation is generated from code (OpenAPI from the routes, dartdoc,
Python API docs in MkDocs).
4. Documentation in the repo: README per module/service, ADR for every architecture decision,
CHANGELOG per release, keep the documentation site current. A change without matching
documentation is not done.
5. Quality gates (SonarQube, linters, type checking, security scanners, test coverage) block the
merge.
A brief may add a note on a rule after this block (for example "Note on rule 3"), never inside it.
Note on rules 1 and 3: "stages" are the milestones M1, M2 and so on of the plan. "MkDocs" is the
docs site of ADR 0045 (MkDocs with Material today); after the planned switch to Zensical, which
reads the same mkdocs.yml, rule 3 means that site (D-W-54).
Waves¶
A wave is the longest chain of dependencies before a ticket. All tickets of a wave can start once the waves before it are merged; many can start earlier, as soon as their own dependencies are in.
| Wave | Tickets that may run in parallel |
|---|---|
| 1 | M1-01, M1-02, M2-32, M4-03 |
| 2 | M1-03, M1-04, M1-05, M2-38, M4-01, M6-10 |
| 3 | M1-06, M1-07, M1-17, M1-74, M3-17, M4-04, M4-06, M4-08, M4-10, M7-24 |
| 4 | M1-08, M1-09, M1-22, M2-23, M3-01, M4-02, M4-05, M4-11, M4-12, M4-16, M5-01, M7-19 |
| 5 | M1-10, M1-12, M3-02, M4-07, M4-09, M4-15, M6-11, M8-01 |
| 6 | M1-11, M1-13, M4-13, M6-12, M8-02 |
| 7 | M1-14, M1-15, M1-18, M1-23, M1-26, M4-14 |
| 8 | M1-16, M1-19, M1-21, M1-24, M1-25, M1-27, M4-17, M7-01 |
| 9 | M1-20, M1-28, M2-01, M4-18, M7-10 |
| 10 | M1-29, M1-32, M1-33, M4-19, M4-25, M7-11 |
| 11 | M1-30, M1-31, M1-34, M4-20, M4-26 |
| 12 | M1-35, M4-27, M4-29 |
| 13 | M1-36, M1-44, M1-50 |
| 14 | M1-37, M1-45, M1-46, M1-48, M1-51, M2-24, M7-22 |
| 15 | M1-38, M1-39, M1-40, M1-41, M1-43, M1-47, M1-49, M1-52, M2-39 |
| 16 | M1-42, M1-53, M2-40 |
| 17 | M1-54, M1-55, M2-41 |
| 18 | M1-56, M2-42, M4-37 |
| 19 | M1-57, M1-58, M1-60, M2-26, M3-13 |
| 20 | M1-59, M1-61 |
| 21 | M1-62, M1-63, M3-18 |
| 22 | M1-64, M1-71 |
| 23 | M1-65, M6-01, M8-10 |
| 24 | M1-66, M1-70, M1-72, M2-07, M6-02 |
| 25 | M1-67, M1-68, M2-20 |
| 26 | M1-69, M2-21, M2-43, M7-25 |
| 27 | M1-73, M2-02, M2-44, M3-03, M4-28, M4-31 |
| 28 | M2-03, M2-04, M2-45, M2-47, M3-04, M4-35, M6-03, M7-02, M7-29 |
| 29 | M2-05, M2-46, M3-05, M3-06, M6-04, M7-03, M7-04, M7-15 |
| 30 | M2-06, M2-27, M2-48, M3-10, M3-11, M4-22, M6-07, M7-16 |
| 31 | M2-08, M6-08, M6-09, M6-18, M7-20 |
| 32 | M2-09, M2-16 |
| 33 | M2-10, M2-12, M2-14, M2-15, M2-17, M2-18, M2-19, M3-19, M8-03 |
| 34 | M2-11, M2-22, M2-25, M2-29, M3-20, M3-21, M3-23, M8-08 |
| 35 | M2-13, M2-28, M2-30, M2-33, M2-34, M3-07, M3-24, M4-30, M6-13, M7-17 |
| 36 | M2-31, M2-35, M2-49, M3-08, M3-14, M3-22, M4-33, M6-15, M8-11 |
| 37 | M2-36, M2-37, M2-50, M2-51, M3-09, M3-12, M3-15, M3-16, M4-21, M4-23, M6-05, M8-04 |
| 38 | M4-24, M4-39, M5-02, M6-06, M6-14, M7-05, M8-05, M8-06 |
| 39 | M4-32, M4-34, M4-36, M5-03, M5-04, M7-06, M7-09, M8-07 |
| 40 | M4-38, M5-05, M5-06, M5-07, M5-08, M5-09, M5-14, M6-16, M7-07, M7-08, M7-12, M7-14, M8-09 |
| 41 | M5-10, M5-11, M6-17, M7-18, M7-21, M7-23, M7-26, M7-27 |
| 42 | M5-12, M7-13 |
| 43 | M5-13 |
| 44 | M7-28 |
Index¶
Dependencies are minimal: a ticket implied through another dependency is not repeated. Brief files are added by the brief-writing steps (plan ticket M0-05 for M1, D-W-100 for M2 and M3, D-W-114 for M4, D-W-120 for M5 and M6, D-W-125 for M7, D-W-124 for M8) under the names listed here.
| Wave | ID | Title | Brief file | Depends on |
|---|---|---|---|---|
| 1 | M1-01 | Server gates in the make contract | M1-01-server-gates.md |
none (M0 closed) |
| 1 | M1-02 | Action catalogue as the single data source | M1-02-action-catalogue-source.md |
none (M0 closed) |
| 2 | M1-03 | API contract checks in the gate | M1-03-api-contract-checks.md |
M1-02 |
| 2 | M1-04 | Operations configuration checks in the gate | M1-04-ops-config-checks.md |
M1-01 |
| 2 | M1-05 | Server skeleton, module register and architecture gate | M1-05-server-skeleton.md |
M1-01 |
| 3 | M1-06 | Module register checked against the core contract | M1-06-module-register-check.md |
M1-02, M1-05 |
| 3 | M1-07 | Configuration schema and loader | M1-07-config-schema-loader.md |
M1-05 |
| 4 | M1-08 | Configuration reference generated from the schema | M1-08-config-reference.md |
M1-07 |
| 4 | M1-09 | Secret provider and secrets commands | M1-09-secret-provider.md |
M1-07 |
| 5 | M1-10 | Logging and telemetry foundation | M1-10-telemetry-foundation.md |
M1-09 |
| 6 | M1-11 | Lifecycle, listeners, health and shutdown | M1-11-lifecycle-health.md |
M1-10, M1-12, M1-22 |
| 5 | M1-12 | PostgreSQL access, migrations and schema version | M1-12-postgres-migrations.md |
M1-09 |
| 6 | M1-13 | Unit of work with phase hooks and in-transaction events | M1-13-unit-of-work.md |
M1-06, M1-08, M1-12 |
| 7 | M1-14 | Background jobs with River | M1-14-background-jobs.md |
M1-11, M1-13 |
| 7 | M1-15 | Sequence counters and instance record | M1-15-instance-counters.md |
M1-11, M1-13 |
| 8 | M1-16 | Event log with commit-ordered sequence | M1-16-event-log.md |
M1-14, M1-15 |
| 3 | M1-17 | Server interface generated from openapi.yaml | M1-17-api-server-stubs.md |
M1-03, M1-05 |
| 7 | M1-18 | HTTP middleware chain and problem details | M1-18-http-chain.md |
M1-11, M1-17 |
| 8 | M1-19 | Rate limits per class | M1-19-rate-limits.md |
M1-18 |
| 9 | M1-20 | Idempotency keys | M1-20-idempotency-keys.md |
M1-16, M1-18, M1-26 |
| 8 | M1-21 | Transport protection | M1-21-transport-protection.md |
M1-18 |
| 4 | M1-22 | Egress client and SSRF lint | M1-22-egress-client.md |
M1-07 |
| 7 | M1-23 | Server container image | M1-23-server-image.md |
M1-11 |
| 8 | M1-24 | Audit hash chain and recorder | M1-24-audit-chain.md |
M1-15, M1-18, M1-26 |
| 8 | M1-25 | Action catalogue in code and registration duty | M1-25-authz-catalogue.md |
M1-18 |
| 7 | M1-26 | Principal tables and directory | M1-26-identity-principals.md |
M1-13 |
| 8 | M1-27 | Grant model storage | M1-27-authz-grant-store.md |
M1-26 |
| 9 | M1-28 | Permission snapshot, cache and authorize | M1-28-authz-core.md |
M1-24, M1-25, M1-27 |
| 10 | M1-29 | Permission changes, access.changed and invariants I1 and SR8 | M1-29-authz-invariants.md |
M1-16, M1-28 |
| 11 | M1-30 | Expiry of grants and memberships | M1-30-authz-expiry.md |
M1-29 |
| 11 | M1-31 | People, owners and own profile | M1-31-identity-people.md |
M1-20, M1-29 |
| 10 | M1-32 | Signing keys, JWKS and rotation | M1-32-signing-keys.md |
M1-20, M1-23, M1-28 |
| 10 | M1-33 | Devices, device keys and DPoP verification | M1-33-identity-devices-dpop.md |
M1-28 |
| 11 | M1-34 | Sessions, access tokens, refresh families and logout | M1-34-identity-sessions.md |
M1-32, M1-33 |
| 12 | M1-35 | Step-up with the device key | M1-35-identity-step-up.md |
M1-34 |
| 13 | M1-36 | Identity provider port and provider management | M1-36-identity-providers.md |
M1-31, M1-35 |
| 14 | M1-37 | First setup, enrollment codes and setup lock | M1-37-identity-bootstrap.md |
M1-19, M1-36 |
| 15 | M1-38 | Device approval and pairing | M1-38-identity-device-approval.md |
M1-37 |
| 15 | M1-39 | Local accounts with password and TOTP | M1-39-identity-local-accounts.md |
M1-37 |
| 15 | M1-40 | Passkeys | M1-40-identity-passkeys.md |
M1-37 |
| 15 | M1-41 | OIDC login with PKCE | M1-41-identity-oidc.md |
M1-37 |
| 16 | M1-42 | Groups from OIDC claims | M1-42-identity-oidc-groups.md |
M1-41 |
| 15 | M1-43 | Trusted proxy header login | M1-43-identity-trusted-header.md |
M1-21, M1-37 |
| 13 | M1-44 | API tokens with prefix and checksum | M1-44-identity-api-tokens.md |
M1-29, M1-35 |
| 14 | M1-45 | Disable a person, revoke a device, end a session | M1-45-identity-revocation.md |
M1-44 |
| 14 | M1-46 | Instance settings, branding and discovery | M1-46-instance-settings.md |
M1-36 |
| 15 | M1-47 | Feature flags with registration and cleanup gate | M1-47-feature-flags.md |
M1-44, M1-46 |
| 14 | M1-48 | Groups and grants over the API | M1-48-authz-api.md |
M1-31, M1-44 |
| 15 | M1-49 | Who has access, preview and view as | M1-49-authz-explain.md |
M1-48 |
| 13 | M1-50 | Audit verification, checkpoints and queries | M1-50-audit-verify.md |
M1-35 |
| 14 | M1-51 | Agent records, backend policy and credential holder | M1-51-agents-records.md |
M1-31, M1-44 |
| 15 | M1-52 | Spaces and sidebar | M1-52-chat-spaces.md |
M1-46, M1-51 |
| 16 | M1-53 | Channels and forum tags | M1-53-chat-channels.md |
M1-52 |
| 17 | M1-54 | Operators with invariant I1 | M1-54-chat-operators.md |
M1-49, M1-53 |
| 17 | M1-55 | Threads | M1-55-chat-threads.md |
M1-53 |
| 18 | M1-56 | Sending messages | M1-56-messaging-send.md |
M1-55 |
| 19 | M1-57 | Reading history | M1-57-messaging-history.md |
M1-56 |
| 19 | M1-58 | Editing, deleting and revisions | M1-58-messaging-edit-delete.md |
M1-56 |
| 20 | M1-59 | Reactions and pins | M1-59-messaging-reactions-pins.md |
M1-58 |
| 19 | M1-60 | Mentions and templates | M1-60-messaging-mentions-templates.md |
M1-56 |
| 20 | M1-61 | Read state, drafts and personal settings | M1-61-sync-personal-data.md |
M1-60 |
| 21 | M1-62 | Moving threads | M1-62-chat-thread-move.md |
M1-54, M1-61 |
| 21 | M1-63 | Catch-up over REST and snapshot | M1-63-sync-catch-up.md |
M1-61 |
| 22 | M1-64 | Gateway connection and session | M1-64-gateway-connection.md |
M1-19, M1-21, M1-63 |
| 23 | M1-65 | Gateway hub, delivery and revocation | M1-65-gateway-delivery.md |
M1-45, M1-64 |
| 24 | M1-66 | Focus and typing | M1-66-gateway-focus-typing.md |
M1-65 |
| 25 | M1-67 | Gateway frame conformance | M1-67-gateway-conformance.md |
M1-62, M1-66 |
| 25 | M1-68 | Server core metrics per catalogue | M1-68-core-metrics.md |
M1-04, M1-50, M1-66 |
| 26 | M1-69 | Canary test across all outputs | M1-69-canary-test.md |
M1-68, M1-71 |
| 24 | M1-70 | Leak tests and 404 equality | M1-70-leak-tests.md |
M1-65, M1-71 |
| 22 | M1-71 | Contract tests with Schemathesis | M1-71-contract-tests.md |
M1-37, M1-50, M1-62, M1-63 |
| 24 | M1-72 | Load tests and performance gate | M1-72-performance-gate.md |
M1-57, M1-65, M1-71 |
| 27 | M1-73 | Compose smoke test | M1-73-compose-smoke.md |
M1-69 |
| 3 | M1-74 | CodeQL for Go | M1-74-codeql-go.md |
M1-05 |
| 9 | M2-01 | Worker consumers of the event log | M2-01-worker-event-consumers.md |
M1-16 |
| 27 | M2-02 | Channel behaviour and agent configuration | M2-02-channel-behavior-config.md |
M1-69 |
| 28 | M2-03 | Project binding and readiness | M2-03-project-binding.md |
M2-02 |
| 28 | M2-04 | Trigger decision as a pure function | M2-04-trigger-decision.md |
M2-02 |
| 29 | M2-05 | Runs, state machine and trigger state | M2-05-runs-state-machine.md |
M2-04 |
| 30 | M2-06 | Invocation token with EdDSA and JWKS | M2-06-invocation-token.md |
M2-05 |
| 24 | M2-07 | Agent consumers over the gateway and REST | M2-07-agent-consumers.md |
M1-65 |
| 31 | M2-08 | Delivery with I2, guard rules and a fresh token | M2-08-invocation-delivery.md |
M2-06, M2-07 |
| 32 | M2-09 | Starting, finishing and cancelling runs, orphaned runs | M2-09-run-lifecycle.md |
M2-08 |
| 33 | M2-10 | Run document, patches and live box | M2-10-run-document-live-box.md |
M2-09 |
| 34 | M2-11 | Follow-ups with steer and queue | M2-11-run-followups.md |
M2-10 |
| 33 | M2-12 | Agent sessions per thread | M2-12-agent-sessions.md |
M2-09 |
| 35 | M2-13 | Run context with origin and trust | M2-13-run-context.md |
M2-11, M2-12 |
| 33 | M2-14 | Acting-for binding (SR9) | M2-14-acting-for.md |
M2-09 |
| 33 | M2-15 | Components and interactions | M2-15-components-interactions.md |
M1-57, M1-58, M2-09 |
| 32 | M2-16 | Slash commands | M2-16-slash-commands.md |
M2-08 |
| 33 | M2-17 | Command autocomplete | M2-17-command-autocomplete.md |
M2-16 |
| 33 | M2-18 | Auto title and placeholder detection | M2-18-auto-title.md |
M2-09 |
| 33 | M2-19 | Agent replies and announcements | M2-19-agent-messages.md |
M2-09 |
| 25 | M2-20 | Heartbeat, presence and desired versus actual mode | M2-20-heartbeat-presence.md |
M2-07 |
| 26 | M2-21 | Switching and guided flow (I4) | M2-21-billing-switch-i4.md |
M1-54, M2-20 |
| 34 | M2-22 | Costs: booking, price table and display | M2-22-costs.md |
M2-12 |
| 4 | M2-23 | Generated TypeScript and Python clients as a gate (G4, G5) | M2-23-generated-clients.md |
M1-17 |
| 14 | M2-24 | App manifest, installation and scopes | M2-24-apps-install.md |
M1-44 |
| 34 | M2-25 | Commands and interactions for apps | M2-25-app-commands.md |
M2-15, M2-17, M2-26 |
| 19 | M2-26 | Outgoing webhooks after Standard Webhooks | M2-26-webhooks-outgoing.md |
M1-56, M2-01, M2-24 |
| 30 | M2-27 | Incoming webhooks native and alertmanager | M2-27-webhooks-incoming.md |
M2-05, M2-24 |
| 35 | M2-28 | Cost reconciliation as its own app | M2-28-cost-reconciliation.md |
M2-22, M2-24 |
| 34 | M2-29 | Python SDK with hand layer and FakeServer (ADR 0026) | M2-29-python-sdk.md |
M2-10, M2-14, M2-23 |
| 35 | M2-30 | TypeScript SDK with webhook verifier | M2-30-typescript-sdk.md |
M2-26, M2-29 |
| 36 | M2-31 | Conformance suite with the Fake-Agent | M2-31-agent-conformance-suite.md |
M2-13, M2-15, M2-17, M2-18, M2-19, M2-20, M2-27, M2-29 |
| 1 | M2-32 | Recording Hermes Agent before the build | M2-32-hermes-recording.md |
none |
| 35 | M2-33 | Reference adapter for Hermes Agent (L7, L8) | M2-33-hermes-adapter.md |
M2-12, M2-29, M2-32 |
| 35 | M2-34 | Claude Code runner core | M2-34-claude-code-runner-core.md |
M2-03, M2-12, M2-29 |
| 36 | M2-35 | Claude Code runner: follow-ups, stop and error paths | M2-35-claude-code-runner-paths.md |
M2-34 |
| 37 | M2-36 | Performance targets of the agent path | M2-36-agent-path-perf.md |
M1-72, M2-31 |
| 37 | M2-37 | Guide "connect your own agent" with a check run | M2-37-agent-guide.md |
M2-22, M2-30, M2-31 |
| 2 | M2-38 | Host service module and Noise core in Go and Dart | M2-38-noise-core.md |
M1-01 |
| 15 | M2-39 | Host records and the target host |
M2-39-terminal-hosts.md |
M1-48 |
| 16 | M2-40 | Terminal rights, SR10, I6, SR12 and fresh step-up | M2-40-terminal-authz.md |
M1-49, M2-39 |
| 17 | M2-41 | Host pairing and fingerprint | M2-41-host-pairing.md |
M2-40 |
| 18 | M2-42 | bothy-host: installation, state, doctor and pair | M2-42-host-install-doctor.md |
M2-38, M2-41 |
| 26 | M2-43 | Control connection between host service and server | M2-43-host-control.md |
M1-67, M2-42 |
| 27 | M2-44 | Terminal sessions, session token and relay | M2-44-terminal-sessions-relay.md |
M2-43 |
| 28 | M2-45 | bothy-host: sessions, PTY and profiles | M2-45-host-pty-profiles.md |
M2-44 |
| 29 | M2-46 | Terminal revocation, limits, audit and metrics | M2-46-terminal-revocation-limits.md |
M1-30, M1-69, M2-45 |
| 28 | M2-47 | Terminal relay across several nodes (T6) | M2-47-terminal-multi-node.md |
M2-44 |
| 30 | M2-48 | Conformance and chaos suite of the terminal | M2-48-terminal-conformance.md |
M1-72, M1-73, M2-24, M2-46, M2-47 |
| 36 | M2-49 | Reference app for code hosting (GitHub) | M2-49-github-app.md |
M2-25, M2-30 |
| 37 | M2-50 | Reference app for ticket systems (Jira) | M2-50-jira-app.md |
M2-49 |
| 37 | M2-51 | Run graph data and stall detection | M2-51-run-graph-data.md |
M2-35 |
| 4 | M3-01 | Object storage port with file system driver | M3-01-object-storage-fs.md |
M1-07 |
| 5 | M3-02 | S3 driver against SeaweedFS | M3-02-object-storage-s3.md |
M1-09, M1-22, M3-01 |
| 27 | M3-03 | Upload sessions, parts and completion | M3-03-upload-sessions.md |
M1-69, M1-70, M3-01 |
| 28 | M3-04 | Scan pass with clamd | M3-04-clamd-scan.md |
M3-03 |
| 29 | M3-05 | File download with download tickets | M3-05-file-download.md |
M3-04 |
| 29 | M3-06 | Images: removing metadata and thumbnails | M3-06-image-metadata-thumbnails.md |
M3-04 |
| 35 | M3-07 | Attachments and release of the agent invocation | M3-07-attachments-invocation.md |
M1-58, M2-11, M3-04 |
| 36 | M3-08 | Cleanup and deletion of files | M3-08-file-cleanup.md |
M3-07 |
| 37 | M3-09 | Voice messages and transcript | M3-09-voice-transcript.md |
M1-47, M2-31, M3-05, M3-06, M3-07 |
| 30 | M3-10 | Avatar and logo | M3-10-avatar-logo.md |
M3-06 |
| 30 | M3-11 | Channel export | M3-11-channel-export.md |
M1-57, M3-05 |
| 37 | M3-12 | Claude Code runner: answer attachments | M3-12-runner-attachments.md |
M2-35, M3-07 |
| 19 | M3-13 | Search vectors and search_tsquery | M3-13-search-vectors.md |
M1-56 |
| 36 | M3-14 | Search coordinator and prefix search | M3-14-search-coordinator.md |
M1-57, M3-07, M3-13 |
| 37 | M3-15 | File text extraction | M3-15-file-text-extraction.md |
M3-14 |
| 37 | M3-16 | Search load test | M3-16-search-load-test.md |
M1-72, M3-14 |
| 3 | M3-17 | Notification decision as a pure function | M3-17-notify-decision.md |
M1-05 |
| 21 | M3-18 | Notification preferences and quiet hours | M3-18-notify-preferences.md |
M1-61, M3-17 |
| 33 | M3-19 | Hint jobs, automatic following and bundling | M3-19-notify-jobs.md |
M1-38, M2-01, M2-09, M3-18 |
| 34 | M3-20 | APNs adapter with Fake-APNs | M3-20-apns-adapter.md |
M3-19 |
| 34 | M3-21 | FCM adapter with Fake-FCM | M3-21-fcm-adapter.md |
M3-19 |
| 36 | M3-22 | Push registration and preview endpoint (ADR 0031) | M3-22-push-registration.md |
M3-05, M3-06, M3-07, M3-20, M3-21, M3-23 |
| 34 | M3-23 | Desktop hints over the gateway | M3-23-desktop-notices.md |
M3-19 |
| 35 | M3-24 | Push handoff performance target | M3-24-push-handoff-perf.md |
M1-72, M3-20 |
| 2 | M4-01 | Workspace and architecture test of the apps | M4-01-workspace-arch.md |
M1-01 |
| 4 | M4-02 | Dart API client as a gate | M4-02-dart-api-client.md |
M4-01, M1-17 |
| 1 | M4-03 | Accent variants in the token generator | M4-03-accent-variants.md |
none (M0 closed) |
| 3 | M4-04 | Design system with tokens, theme and fonts (ADR 0030) | M4-04-design-system-theme.md |
M4-01, M4-03 |
| 4 | M4-05 | Icons in the design system | M4-05-design-icons.md |
M4-04 |
| 3 | M4-06 | Localization with ARB lint | M4-06-l10n.md |
M4-01 |
| 5 | M4-07 | Core components with goldens | M4-07-core-components.md |
M4-05, M4-06 |
| 3 | M4-08 | Domain package | M4-08-domain.md |
M4-01 |
| 5 | M4-09 | Login: DPoP, refresh and step-up | M4-09-auth-dpop.md |
M4-02, M4-08 |
| 3 | M4-10 | Device key for macOS and iOS | M4-10-device-key-apple.md |
M4-01 |
| 4 | M4-11 | Device key for Windows | M4-11-device-key-windows.md |
M4-10 |
| 4 | M4-12 | Local database schema v1 (ADR 0029) | M4-12-local-store.md |
M4-08 |
| 6 | M4-13 | Sync engine: connection and session | M4-13-sync-connection.md |
M4-09, M4-12 |
| 7 | M4-14 | Sync engine: catch-up, reconciliation and revocation | M4-14-sync-catch-up.md |
M4-13 |
| 5 | M4-15 | Sync engine: outbox | M4-15-sync-outbox.md |
M4-02, M4-12 |
| 4 | M4-16 | Sync engine: run documents | M4-16-sync-run-documents.md |
M4-08 |
| 8 | M4-17 | Fake server for integration tests | M4-17-fake-server.md |
M4-14, M4-15, M4-16 |
| 9 | M4-18 | Desktop app shell | M4-18-desktop-shell.md |
M4-07, M4-11, M4-17 |
| 10 | M4-19 | Sidebar, spaces, channels and post list | M4-19-sidebar-post-list.md |
M4-18 |
| 11 | M4-20 | Thread view, input and message actions | M4-20-thread-view.md |
M4-19 |
| 37 | M4-21 | Live box, trigger state, follow-ups, components and commands | M4-21-agent-interface.md |
M4-20, M2-31 |
| 30 | M4-22 | Files, images and voice messages on the desktop | M4-22-files-desktop.md |
M4-20, M3-05 |
| 37 | M4-23 | Search, quick switcher, mentions and Running now | M4-23-search-switcher.md |
M4-20, M3-14 |
| 38 | M4-24 | Keyboard shortcuts and focus order | M4-24-shortcuts-focus.md |
M4-21, M4-23 |
| 10 | M4-25 | Settings, devices and sessions on the desktop | M4-25-settings-devices.md |
M4-18 |
| 11 | M4-26 | Administration: people, groups and devices | M4-26-admin-people.md |
M4-25 |
| 12 | M4-27 | Administration: grant wizard, Who has access, View as person | M4-27-admin-grants.md |
M4-26 |
| 27 | M4-28 | Administration: agents, backend switch, costs and tokens | M4-28-admin-agents.md |
M4-27, M2-21 |
| 12 | M4-29 | Administration: audit view | M4-29-admin-audit.md |
M4-26 |
| 35 | M4-30 | Windows: notification area and local notifications | M4-30-windows-tray-notifications.md |
M4-25, M3-23 |
| 27 | M4-31 | Client metrics and crash reports (ADR 0057) | M4-31-client-metrics.md |
M4-25, M1-69 |
| 39 | M4-32 | Accessibility on the desktop | M4-32-desktop-accessibility.md |
M4-22, M4-24, M4-28, M4-29, M4-33 |
| 36 | M4-33 | Channel menu: notification level and export | M4-33-channel-menu.md |
M4-20, M4-30, M3-11 |
| 39 | M4-34 | Desktop E2E and performance targets | M4-34-desktop-e2e-perf.md |
M4-22, M4-24, M4-33, M1-73 |
| 28 | M4-35 | Package terminal_ui and terminal view |
M4-35-terminal-ui.md |
M4-07, M4-09, M2-44 |
| 39 | M4-36 | Terminal on the desktop | M4-36-terminal-desktop.md |
M4-35, M4-24, M2-48 |
| 18 | M4-37 | Administration: hosts, pairing and grant terminal |
M4-37-admin-hosts.md |
M4-27, M2-41 |
| 40 | M4-38 | Terminal E2E and performance targets on the desktop | M4-38-terminal-e2e-perf.md |
M4-34, M4-36, M4-37 |
| 38 | M4-39 | Run graph and control room on the desktop | M4-39-run-graph-desktop.md |
M2-51, M4-21, M4-23, M6-11 |
| 23 | M6-01 | Console session following the BFF pattern | M6-01-console-session.md |
M1-39, M1-40, M1-41, M1-43, M1-45, M1-49, M1-64 |
| 37 | M6-05 | Statistics in the server | M6-05-stats-server.md |
M2-22, M2-26, M3-22 |
| 2 | M6-10 | Design tokens for charts: check for color vision deficiency | M6-10-viz-cvd-check.md |
M4-03 |
| 5 | M6-11 | bothy_viz: primitives, models, fixtures and harness |
M6-11-viz-package.md |
M1-04, M4-02, M4-04, M4-06, M4-08, M6-10 |
| 6 | M6-12 | bothy_viz: six views |
M6-12-viz-views.md |
M6-11 |
| 35 | M6-13 | stats: own measurement | M6-13-stats-measure.md |
M2-15, M2-21, M2-22, M3-20, M3-21, M6-11 |
| 38 | M6-14 | stats: timeline, SLO traffic light and backend view | M6-14-stats-queries.md |
M2-30, M6-05, M6-13 |
| 36 | M6-15 | stats: live stream stats.live |
M6-15-stats-live.md |
M6-13 |
| 4 | M5-01 | Device key for Android | M5-01-device-key-android.md |
M4-10 |
| 38 | M5-02 | iPhone layout and navigation | M5-02-iphone-layout.md |
M4-21, M4-23 |
| 39 | M5-03 | Android layout, navigation and notification channels | M5-03-android-layout.md |
M5-01, M5-02 |
| 39 | M5-04 | ClientKit and Notification Service Extension (ADR 0056) | M5-04-clientkit-nse.md |
M3-22, M4-31, M5-02 |
| 40 | M5-05 | Android push service without the Flutter engine | M5-05-android-push.md |
M5-03, M5-04 |
| 40 | M5-06 | Sharing from other apps | M5-06-sharing.md |
M1-73, M4-22, M5-03, M5-04 |
| 40 | M5-07 | Voice recording, camera and photo | M5-07-voice-camera.md |
M3-09, M4-22, M5-03 |
| 40 | M5-08 | App lock | M5-08-app-lock.md |
M5-03 |
| 40 | M5-09 | Emergency actions on mobile | M5-09-mobile-emergency.md |
M4-27, M5-03 |
| 41 | M5-10 | Accessibility on mobile | M5-10-mobile-a11y.md |
M5-06, M5-07, M5-08, M5-09 |
| 41 | M5-11 | Device E2E and performance targets on mobile | M5-11-mobile-e2e-perf.md |
M1-39, M5-05, M5-06, M5-07, M5-08, M5-09 |
| 42 | M5-12 | Terminal on mobile with extra keys bar | M5-12-mobile-terminal.md |
M4-36, M5-10 |
| 43 | M5-13 | Terminal E2E on mobile | M5-13-mobile-terminal-e2e.md |
M4-38, M5-11, M5-12 |
| 40 | M5-14 | Run graph and control room on iPhone and Android | M5-14-run-graph-mobile.md |
M4-39, M5-03 |
| 24 | M6-02 | Console app and serving by the server (ADR 0028) | M6-02-console-app.md |
M4-07, M4-09, M6-01 |
| 28 | M6-03 | Content Security Policy with a headless test | M6-03-console-csp.md |
M1-73, M6-02 |
| 29 | M6-04 | Administration in the console | M6-04-console-admin.md |
M4-28, M4-29, M6-03 |
| 38 | M6-06 | Statistics views | M6-06-stats-views.md |
M4-26, M6-02, M6-05, M6-11 |
| 30 | M6-07 | Permission hints and expiry overview | M6-07-permission-hints.md |
M1-30, M6-04 |
| 31 | M6-08 | Manage apps, webhooks and incoming webhooks | M6-08-apps-webhooks-admin.md |
M2-26, M2-27, M6-04 |
| 31 | M6-09 | Manage instance, branding, login providers and feature flags | M6-09-instance-admin.md |
M1-47, M3-10, M6-04 |
| 40 | M6-16 | Visualizations in the desktop app, console and mobile | M6-16-viz-in-apps.md |
M5-03, M6-04, M6-06, M6-12, M6-14, M6-15 |
| 41 | M6-17 | Optional Grafana embedding in the console | M6-17-console-grafana-embed.md |
M6-16 |
| 31 | M6-18 | Terminal in the console (ADR 0070) | M6-18-console-terminal.md |
M2-48, M4-35, M4-37, M6-04 |
| 8 | M7-01 | Image bothy-postgres with pgBackRest |
M7-01-postgres-image.md |
M1-08, M1-23 |
| 28 | M7-02 | Backup service: schedules, manifest and metrics (ADR 0058) | M7-02-backup-service.md |
M3-02, M3-03, M7-01 |
| 29 | M7-03 | Automatic restore test | M7-03-restore-test.md |
M7-02 |
| 29 | M7-04 | bothy restore finalize and sync epoch (ADR 0059) |
M7-04-restore-finalize-epoch.md |
M2-07, M2-26, M7-02 |
| 38 | M7-05 | Retention per class | M7-05-retention-per-class.md |
M1-39, M1-40, M1-59, M2-15, M2-22, M2-26, M2-46, M3-08, M3-15, M3-22 |
| 39 | M7-06 | Access, export, account deletion and rectification | M7-06-privacy-requests.md |
M7-05 |
| 40 | M7-07 | Deletion journal and restore | M7-07-deletion-journal.md |
M7-04, M7-06 |
| 40 | M7-08 | Maintenance mode read_only (ADR 0065) |
M7-08-maintenance-mode.md |
M7-09 |
| 39 | M7-09 | Status page with automatic checks | M7-09-status-page.md |
M6-13, M7-02, M7-05 |
| 14 | M7-22 | Audit log checkpoints in object storage | M7-22-audit-checkpoints-s3.md |
M1-50, M3-02 |
| 9 | M7-10 | Server release chain with a trial release (ADR 0036, 0060, 0062) | M7-10-server-release-chain.md |
M7-01 |
| 10 | M7-11 | Breaking-change check of the API against the last publication (G6) | M7-11-api-breaking-check.md |
M1-03, M7-10 |
| 40 | M7-12 | Desktop app distribution (ADR 0037) | M7-12-desktop-distribution.md |
M4-34, M7-10 |
| 42 | M7-13 | Mobile app distribution and minimum version | M7-13-mobile-distribution.md |
M5-11, M7-12 |
| 40 | M7-14 | Portability test in CI with the full stack | M7-14-portability-test.md |
M2-29, M7-03, M7-09, M7-29 |
| 29 | M7-15 | OpenTofu module generic-vm |
M7-15-tofu-generic-vm.md |
M7-29 |
| 35 | M7-17 | Multi-node operation (level 2) | M7-17-multi-node.md |
M1-72, M2-10, M2-47, M3-23 |
| 41 | M7-18 | Capacity load test | M7-18-capacity-load-test.md |
M7-14 |
| 4 | M7-19 | API reference in the docs site | M7-19-api-reference-docs.md |
M1-17 |
| 31 | M7-20 | Alerts into the instance and to the outside | M7-20-alert-routing.md |
M1-73, M2-27 |
| 41 | M7-21 | Status page in apps and console | M7-21-status-views.md |
M5-03, M6-04, M7-08 |
| 3 | M7-24 | Token output for TypeScript | M7-24-tokens-typescript.md |
M6-10 |
| 26 | M7-25 | Grafana panel plugin "Bothy Live" | M7-25-grafana-plugin.md |
M1-68, M7-24 |
| 41 | M7-26 | Plugin in the Compose stack, portability and release | M7-26-plugin-release.md |
M7-14, M7-25 |
| 41 | M7-27 | Demo instance with made-up data (bothy setup --demo) |
M7-27-demo-instance.md |
M2-48, M6-14, M6-15, M7-14 |
| 44 | M7-28 | Showcase: images, video, landing pages and release template | M7-28-showcase.md |
M5-13, M6-16, M6-18, M7-25, M7-27 |
| 30 | M7-16 | OpenTofu modules hetzner, aws, azure |
M7-16-tofu-cloud-modules.md |
M7-15 |
| 41 | M7-23 | Release chain of the host service | M7-23-host-release-chain.md |
M2-48, M7-12 |
| 28 | M7-29 | Setup wizard install.sh (installation in one command) |
M7-29-setup-wizard.md |
M1-73, M7-10 |
| 5 | M8-01 | Discord read client with pure GET | M8-01-discord-read-client.md |
M1-22 |
| 6 | M8-02 | CDN fetch with host allow list | M8-02-cdn-fetch.md |
M8-01 |
| 33 | M8-03 | Import interface in the server | M8-03-import-server.md |
M2-09 |
| 37 | M8-04 | Import tool: dry run, apply, report | M8-04-import-tool.md |
M8-02, M8-10, M8-11 |
| 38 | M8-05 | Read mirror with settle rule | M8-05-read-mirror.md |
M8-04 |
| 38 | M8-06 | Binding of imported session references | M8-06-session-binding-import.md |
M2-22, M2-34, M8-04 |
| 39 | M8-07 | Switchover and revert per channel | M8-07-switch-revert.md |
M8-05, M8-06 |
| 34 | M8-08 | Import overview in the console | M8-08-import-console.md |
M6-04, M8-03 |
| 40 | M8-09 | Carry out the migration of an existing installation (owner go) | M8-09-migration-execution.md |
M8-07, M8-08 |
| 23 | M8-10 | Login and API client of the import tool | M8-10-import-login-client.md |
M1-38, M1-71 |
| 36 | M8-11 | Thread, message, pin and file items of the import interface | M8-11-import-content-items.md |
M1-59, M2-18, M3-07, M3-13, M8-03 |
Make targets created by tickets¶
A brief may call a make target only if the Makefile already has it or the ticket that creates it
is the brief itself or in its dependency closure; otherwise the target could be missing when the
launcher starts the brief. tools/docs/brief_deps.py (part of make docs) checks this table, the
waves, the graph and the column "Depends on" of the plan against the index.
| Target | Created by |
|---|---|
arch |
M1-01 |
codegen-check |
M1-01 |
migrations-lint |
M1-01 |
migrations-lock |
M1-01 |
perf |
M1-01 |
catalog |
M1-02 |
catalog-check |
M1-02 |
api-checks |
M1-03 |
api-tables |
M1-03 |
ops-check |
M1-04 |
register-check |
M1-06 |
config-doc-check |
M1-08 |
image |
M1-23 |
image-test |
M1-23 |
flag-check |
M1-47 |
signal-check |
M1-68 |
sql-visibility |
M1-70 |
contract-test |
M1-71 |
bench-search |
M3-16 |
apps-platform |
M4-01 |
e2e-desktop |
M4-34 |
perf-desktop |
M4-34 |
terminal-stack |
M4-36 |
e2e-mobile |
M5-11 |
console-e2e |
M6-03 |
postgres-image |
M7-01 |
postgres-image-test |
M7-01 |
release-prep |
M7-10 |
release-trial |
M7-10 |
api-breaking |
M7-11 |
portability-trial |
M7-14 |
tofu-check |
M7-15 |
tofu-vm-test |
M7-15 |
showcase |
M7-28 |
To change a dependency, edit the column "Depends on" of the index and the row in the plan, then
run uv run --project tools --locked --quiet python tools/docs/brief_deps.py --write; it
regenerates the wave column, the table "Waves" and the graph edges.
Dependency graph¶
Edges point from a dependency to the ticket that needs it (transitive reduction of the index).
There is one diagram per milestone of the dependent tickets, because Mermaid renders only a
limited number of edges per diagram (MAX_GRAPH_EDGES in tools/docs/brief_deps.py).
Tickets of M1:
flowchart TB
M1_01["M1-01"]
M1_02["M1-02"]
M1_03["M1-03"]
M1_04["M1-04"]
M1_05["M1-05"]
M1_06["M1-06"]
M1_07["M1-07"]
M1_08["M1-08"]
M1_09["M1-09"]
M1_10["M1-10"]
M1_11["M1-11"]
M1_12["M1-12"]
M1_13["M1-13"]
M1_14["M1-14"]
M1_15["M1-15"]
M1_16["M1-16"]
M1_17["M1-17"]
M1_18["M1-18"]
M1_19["M1-19"]
M1_20["M1-20"]
M1_21["M1-21"]
M1_22["M1-22"]
M1_23["M1-23"]
M1_24["M1-24"]
M1_25["M1-25"]
M1_26["M1-26"]
M1_27["M1-27"]
M1_28["M1-28"]
M1_29["M1-29"]
M1_30["M1-30"]
M1_31["M1-31"]
M1_32["M1-32"]
M1_33["M1-33"]
M1_34["M1-34"]
M1_35["M1-35"]
M1_36["M1-36"]
M1_37["M1-37"]
M1_38["M1-38"]
M1_39["M1-39"]
M1_40["M1-40"]
M1_41["M1-41"]
M1_42["M1-42"]
M1_43["M1-43"]
M1_44["M1-44"]
M1_45["M1-45"]
M1_46["M1-46"]
M1_47["M1-47"]
M1_48["M1-48"]
M1_49["M1-49"]
M1_50["M1-50"]
M1_51["M1-51"]
M1_52["M1-52"]
M1_53["M1-53"]
M1_54["M1-54"]
M1_55["M1-55"]
M1_56["M1-56"]
M1_57["M1-57"]
M1_58["M1-58"]
M1_59["M1-59"]
M1_60["M1-60"]
M1_61["M1-61"]
M1_62["M1-62"]
M1_63["M1-63"]
M1_64["M1-64"]
M1_65["M1-65"]
M1_66["M1-66"]
M1_67["M1-67"]
M1_68["M1-68"]
M1_69["M1-69"]
M1_70["M1-70"]
M1_71["M1-71"]
M1_72["M1-72"]
M1_73["M1-73"]
M1_74["M1-74"]
M1_02 --> M1_03
M1_01 --> M1_04
M1_01 --> M1_05
M1_02 --> M1_06
M1_05 --> M1_06
M1_05 --> M1_07
M1_07 --> M1_08
M1_07 --> M1_09
M1_09 --> M1_10
M1_10 --> M1_11
M1_12 --> M1_11
M1_22 --> M1_11
M1_09 --> M1_12
M1_06 --> M1_13
M1_08 --> M1_13
M1_12 --> M1_13
M1_11 --> M1_14
M1_13 --> M1_14
M1_11 --> M1_15
M1_13 --> M1_15
M1_14 --> M1_16
M1_15 --> M1_16
M1_03 --> M1_17
M1_05 --> M1_17
M1_11 --> M1_18
M1_17 --> M1_18
M1_18 --> M1_19
M1_16 --> M1_20
M1_18 --> M1_20
M1_26 --> M1_20
M1_18 --> M1_21
M1_07 --> M1_22
M1_11 --> M1_23
M1_15 --> M1_24
M1_18 --> M1_24
M1_26 --> M1_24
M1_18 --> M1_25
M1_13 --> M1_26
M1_26 --> M1_27
M1_24 --> M1_28
M1_25 --> M1_28
M1_27 --> M1_28
M1_16 --> M1_29
M1_28 --> M1_29
M1_29 --> M1_30
M1_20 --> M1_31
M1_29 --> M1_31
M1_20 --> M1_32
M1_23 --> M1_32
M1_28 --> M1_32
M1_28 --> M1_33
M1_32 --> M1_34
M1_33 --> M1_34
M1_34 --> M1_35
M1_31 --> M1_36
M1_35 --> M1_36
M1_19 --> M1_37
M1_36 --> M1_37
M1_37 --> M1_38
M1_37 --> M1_39
M1_37 --> M1_40
M1_37 --> M1_41
M1_41 --> M1_42
M1_21 --> M1_43
M1_37 --> M1_43
M1_29 --> M1_44
M1_35 --> M1_44
M1_44 --> M1_45
M1_36 --> M1_46
M1_44 --> M1_47
M1_46 --> M1_47
M1_31 --> M1_48
M1_44 --> M1_48
M1_48 --> M1_49
M1_35 --> M1_50
M1_31 --> M1_51
M1_44 --> M1_51
M1_46 --> M1_52
M1_51 --> M1_52
M1_52 --> M1_53
M1_49 --> M1_54
M1_53 --> M1_54
M1_53 --> M1_55
M1_55 --> M1_56
M1_56 --> M1_57
M1_56 --> M1_58
M1_58 --> M1_59
M1_56 --> M1_60
M1_60 --> M1_61
M1_54 --> M1_62
M1_61 --> M1_62
M1_61 --> M1_63
M1_19 --> M1_64
M1_21 --> M1_64
M1_63 --> M1_64
M1_45 --> M1_65
M1_64 --> M1_65
M1_65 --> M1_66
M1_62 --> M1_67
M1_66 --> M1_67
M1_04 --> M1_68
M1_50 --> M1_68
M1_66 --> M1_68
M1_68 --> M1_69
M1_71 --> M1_69
M1_65 --> M1_70
M1_71 --> M1_70
M1_37 --> M1_71
M1_50 --> M1_71
M1_62 --> M1_71
M1_63 --> M1_71
M1_57 --> M1_72
M1_65 --> M1_72
M1_71 --> M1_72
M1_69 --> M1_73
M1_05 --> M1_74
Tickets of M2:
flowchart TB
M1_01["M1-01"]
M1_16["M1-16"]
M1_17["M1-17"]
M1_30["M1-30"]
M1_44["M1-44"]
M1_48["M1-48"]
M1_49["M1-49"]
M1_54["M1-54"]
M1_56["M1-56"]
M1_57["M1-57"]
M1_58["M1-58"]
M1_65["M1-65"]
M1_67["M1-67"]
M1_69["M1-69"]
M1_72["M1-72"]
M1_73["M1-73"]
M2_01["M2-01"]
M2_02["M2-02"]
M2_03["M2-03"]
M2_04["M2-04"]
M2_05["M2-05"]
M2_06["M2-06"]
M2_07["M2-07"]
M2_08["M2-08"]
M2_09["M2-09"]
M2_10["M2-10"]
M2_11["M2-11"]
M2_12["M2-12"]
M2_13["M2-13"]
M2_14["M2-14"]
M2_15["M2-15"]
M2_16["M2-16"]
M2_17["M2-17"]
M2_18["M2-18"]
M2_19["M2-19"]
M2_20["M2-20"]
M2_21["M2-21"]
M2_22["M2-22"]
M2_23["M2-23"]
M2_24["M2-24"]
M2_25["M2-25"]
M2_26["M2-26"]
M2_27["M2-27"]
M2_28["M2-28"]
M2_29["M2-29"]
M2_30["M2-30"]
M2_31["M2-31"]
M2_32["M2-32"]
M2_33["M2-33"]
M2_34["M2-34"]
M2_35["M2-35"]
M2_36["M2-36"]
M2_37["M2-37"]
M2_38["M2-38"]
M2_39["M2-39"]
M2_40["M2-40"]
M2_41["M2-41"]
M2_42["M2-42"]
M2_43["M2-43"]
M2_44["M2-44"]
M2_45["M2-45"]
M2_46["M2-46"]
M2_47["M2-47"]
M2_48["M2-48"]
M2_49["M2-49"]
M2_50["M2-50"]
M2_51["M2-51"]
M1_16 --> M2_01
M1_69 --> M2_02
M2_02 --> M2_03
M2_02 --> M2_04
M2_04 --> M2_05
M2_05 --> M2_06
M1_65 --> M2_07
M2_06 --> M2_08
M2_07 --> M2_08
M2_08 --> M2_09
M2_09 --> M2_10
M2_10 --> M2_11
M2_09 --> M2_12
M2_11 --> M2_13
M2_12 --> M2_13
M2_09 --> M2_14
M1_57 --> M2_15
M1_58 --> M2_15
M2_09 --> M2_15
M2_08 --> M2_16
M2_16 --> M2_17
M2_09 --> M2_18
M2_09 --> M2_19
M2_07 --> M2_20
M1_54 --> M2_21
M2_20 --> M2_21
M2_12 --> M2_22
M1_17 --> M2_23
M1_44 --> M2_24
M2_15 --> M2_25
M2_17 --> M2_25
M2_26 --> M2_25
M1_56 --> M2_26
M2_01 --> M2_26
M2_24 --> M2_26
M2_05 --> M2_27
M2_24 --> M2_27
M2_22 --> M2_28
M2_24 --> M2_28
M2_10 --> M2_29
M2_14 --> M2_29
M2_23 --> M2_29
M2_26 --> M2_30
M2_29 --> M2_30
M2_13 --> M2_31
M2_15 --> M2_31
M2_17 --> M2_31
M2_18 --> M2_31
M2_19 --> M2_31
M2_20 --> M2_31
M2_27 --> M2_31
M2_29 --> M2_31
M2_12 --> M2_33
M2_29 --> M2_33
M2_32 --> M2_33
M2_03 --> M2_34
M2_12 --> M2_34
M2_29 --> M2_34
M2_34 --> M2_35
M1_72 --> M2_36
M2_31 --> M2_36
M2_22 --> M2_37
M2_30 --> M2_37
M2_31 --> M2_37
M1_01 --> M2_38
M1_48 --> M2_39
M1_49 --> M2_40
M2_39 --> M2_40
M2_40 --> M2_41
M2_38 --> M2_42
M2_41 --> M2_42
M1_67 --> M2_43
M2_42 --> M2_43
M2_43 --> M2_44
M2_44 --> M2_45
M1_30 --> M2_46
M1_69 --> M2_46
M2_45 --> M2_46
M2_44 --> M2_47
M1_72 --> M2_48
M1_73 --> M2_48
M2_24 --> M2_48
M2_46 --> M2_48
M2_47 --> M2_48
M2_25 --> M2_49
M2_30 --> M2_49
M2_49 --> M2_50
M2_35 --> M2_51
Tickets of M3:
flowchart TB
M1_05["M1-05"]
M1_07["M1-07"]
M1_09["M1-09"]
M1_22["M1-22"]
M1_38["M1-38"]
M1_47["M1-47"]
M1_56["M1-56"]
M1_57["M1-57"]
M1_58["M1-58"]
M1_61["M1-61"]
M1_69["M1-69"]
M1_70["M1-70"]
M1_72["M1-72"]
M2_01["M2-01"]
M2_09["M2-09"]
M2_11["M2-11"]
M2_31["M2-31"]
M2_35["M2-35"]
M3_01["M3-01"]
M3_02["M3-02"]
M3_03["M3-03"]
M3_04["M3-04"]
M3_05["M3-05"]
M3_06["M3-06"]
M3_07["M3-07"]
M3_08["M3-08"]
M3_09["M3-09"]
M3_10["M3-10"]
M3_11["M3-11"]
M3_12["M3-12"]
M3_13["M3-13"]
M3_14["M3-14"]
M3_15["M3-15"]
M3_16["M3-16"]
M3_17["M3-17"]
M3_18["M3-18"]
M3_19["M3-19"]
M3_20["M3-20"]
M3_21["M3-21"]
M3_22["M3-22"]
M3_23["M3-23"]
M3_24["M3-24"]
M1_07 --> M3_01
M1_09 --> M3_02
M1_22 --> M3_02
M3_01 --> M3_02
M1_69 --> M3_03
M1_70 --> M3_03
M3_01 --> M3_03
M3_03 --> M3_04
M3_04 --> M3_05
M3_04 --> M3_06
M1_58 --> M3_07
M2_11 --> M3_07
M3_04 --> M3_07
M3_07 --> M3_08
M1_47 --> M3_09
M2_31 --> M3_09
M3_05 --> M3_09
M3_06 --> M3_09
M3_07 --> M3_09
M3_06 --> M3_10
M1_57 --> M3_11
M3_05 --> M3_11
M2_35 --> M3_12
M3_07 --> M3_12
M1_56 --> M3_13
M1_57 --> M3_14
M3_07 --> M3_14
M3_13 --> M3_14
M3_14 --> M3_15
M1_72 --> M3_16
M3_14 --> M3_16
M1_05 --> M3_17
M1_61 --> M3_18
M3_17 --> M3_18
M1_38 --> M3_19
M2_01 --> M3_19
M2_09 --> M3_19
M3_18 --> M3_19
M3_19 --> M3_20
M3_19 --> M3_21
M3_05 --> M3_22
M3_06 --> M3_22
M3_07 --> M3_22
M3_20 --> M3_22
M3_21 --> M3_22
M3_23 --> M3_22
M3_19 --> M3_23
M1_72 --> M3_24
M3_20 --> M3_24
Tickets of M4:
flowchart TB
M1_01["M1-01"]
M1_17["M1-17"]
M1_69["M1-69"]
M1_73["M1-73"]
M2_21["M2-21"]
M2_31["M2-31"]
M2_41["M2-41"]
M2_44["M2-44"]
M2_48["M2-48"]
M2_51["M2-51"]
M3_05["M3-05"]
M3_11["M3-11"]
M3_14["M3-14"]
M3_23["M3-23"]
M4_01["M4-01"]
M4_02["M4-02"]
M4_03["M4-03"]
M4_04["M4-04"]
M4_05["M4-05"]
M4_06["M4-06"]
M4_07["M4-07"]
M4_08["M4-08"]
M4_09["M4-09"]
M4_10["M4-10"]
M4_11["M4-11"]
M4_12["M4-12"]
M4_13["M4-13"]
M4_14["M4-14"]
M4_15["M4-15"]
M4_16["M4-16"]
M4_17["M4-17"]
M4_18["M4-18"]
M4_19["M4-19"]
M4_20["M4-20"]
M4_21["M4-21"]
M4_22["M4-22"]
M4_23["M4-23"]
M4_24["M4-24"]
M4_25["M4-25"]
M4_26["M4-26"]
M4_27["M4-27"]
M4_28["M4-28"]
M4_29["M4-29"]
M4_30["M4-30"]
M4_31["M4-31"]
M4_32["M4-32"]
M4_33["M4-33"]
M4_34["M4-34"]
M4_35["M4-35"]
M4_36["M4-36"]
M4_37["M4-37"]
M4_38["M4-38"]
M4_39["M4-39"]
M6_11["M6-11"]
M1_01 --> M4_01
M1_17 --> M4_02
M4_01 --> M4_02
M4_01 --> M4_04
M4_03 --> M4_04
M4_04 --> M4_05
M4_01 --> M4_06
M4_05 --> M4_07
M4_06 --> M4_07
M4_01 --> M4_08
M4_02 --> M4_09
M4_08 --> M4_09
M4_01 --> M4_10
M4_10 --> M4_11
M4_08 --> M4_12
M4_09 --> M4_13
M4_12 --> M4_13
M4_13 --> M4_14
M4_02 --> M4_15
M4_12 --> M4_15
M4_08 --> M4_16
M4_14 --> M4_17
M4_15 --> M4_17
M4_16 --> M4_17
M4_07 --> M4_18
M4_11 --> M4_18
M4_17 --> M4_18
M4_18 --> M4_19
M4_19 --> M4_20
M2_31 --> M4_21
M4_20 --> M4_21
M3_05 --> M4_22
M4_20 --> M4_22
M3_14 --> M4_23
M4_20 --> M4_23
M4_21 --> M4_24
M4_23 --> M4_24
M4_18 --> M4_25
M4_25 --> M4_26
M4_26 --> M4_27
M2_21 --> M4_28
M4_27 --> M4_28
M4_26 --> M4_29
M3_23 --> M4_30
M4_25 --> M4_30
M1_69 --> M4_31
M4_25 --> M4_31
M4_22 --> M4_32
M4_24 --> M4_32
M4_28 --> M4_32
M4_29 --> M4_32
M4_33 --> M4_32
M3_11 --> M4_33
M4_20 --> M4_33
M4_30 --> M4_33
M1_73 --> M4_34
M4_22 --> M4_34
M4_24 --> M4_34
M4_33 --> M4_34
M2_44 --> M4_35
M4_07 --> M4_35
M4_09 --> M4_35
M2_48 --> M4_36
M4_24 --> M4_36
M4_35 --> M4_36
M2_41 --> M4_37
M4_27 --> M4_37
M4_34 --> M4_38
M4_36 --> M4_38
M4_37 --> M4_38
M2_51 --> M4_39
M4_21 --> M4_39
M4_23 --> M4_39
M6_11 --> M4_39
Tickets of M5:
flowchart TB
M1_39["M1-39"]
M1_73["M1-73"]
M3_09["M3-09"]
M3_22["M3-22"]
M4_10["M4-10"]
M4_21["M4-21"]
M4_22["M4-22"]
M4_23["M4-23"]
M4_27["M4-27"]
M4_31["M4-31"]
M4_36["M4-36"]
M4_38["M4-38"]
M4_39["M4-39"]
M5_01["M5-01"]
M5_02["M5-02"]
M5_03["M5-03"]
M5_04["M5-04"]
M5_05["M5-05"]
M5_06["M5-06"]
M5_07["M5-07"]
M5_08["M5-08"]
M5_09["M5-09"]
M5_10["M5-10"]
M5_11["M5-11"]
M5_12["M5-12"]
M5_13["M5-13"]
M5_14["M5-14"]
M4_10 --> M5_01
M4_21 --> M5_02
M4_23 --> M5_02
M5_01 --> M5_03
M5_02 --> M5_03
M3_22 --> M5_04
M4_31 --> M5_04
M5_02 --> M5_04
M5_03 --> M5_05
M5_04 --> M5_05
M1_73 --> M5_06
M4_22 --> M5_06
M5_03 --> M5_06
M5_04 --> M5_06
M3_09 --> M5_07
M4_22 --> M5_07
M5_03 --> M5_07
M5_03 --> M5_08
M4_27 --> M5_09
M5_03 --> M5_09
M5_06 --> M5_10
M5_07 --> M5_10
M5_08 --> M5_10
M5_09 --> M5_10
M1_39 --> M5_11
M5_05 --> M5_11
M5_06 --> M5_11
M5_07 --> M5_11
M5_08 --> M5_11
M5_09 --> M5_11
M4_36 --> M5_12
M5_10 --> M5_12
M4_38 --> M5_13
M5_11 --> M5_13
M5_12 --> M5_13
M4_39 --> M5_14
M5_03 --> M5_14
Tickets of M6:
flowchart TB
M1_04["M1-04"]
M1_30["M1-30"]
M1_39["M1-39"]
M1_40["M1-40"]
M1_41["M1-41"]
M1_43["M1-43"]
M1_45["M1-45"]
M1_47["M1-47"]
M1_49["M1-49"]
M1_64["M1-64"]
M1_73["M1-73"]
M2_15["M2-15"]
M2_21["M2-21"]
M2_22["M2-22"]
M2_26["M2-26"]
M2_27["M2-27"]
M2_30["M2-30"]
M2_48["M2-48"]
M3_10["M3-10"]
M3_20["M3-20"]
M3_21["M3-21"]
M3_22["M3-22"]
M4_02["M4-02"]
M4_03["M4-03"]
M4_04["M4-04"]
M4_06["M4-06"]
M4_07["M4-07"]
M4_08["M4-08"]
M4_09["M4-09"]
M4_26["M4-26"]
M4_28["M4-28"]
M4_29["M4-29"]
M4_35["M4-35"]
M4_37["M4-37"]
M5_03["M5-03"]
M6_01["M6-01"]
M6_02["M6-02"]
M6_03["M6-03"]
M6_04["M6-04"]
M6_05["M6-05"]
M6_06["M6-06"]
M6_07["M6-07"]
M6_08["M6-08"]
M6_09["M6-09"]
M6_10["M6-10"]
M6_11["M6-11"]
M6_12["M6-12"]
M6_13["M6-13"]
M6_14["M6-14"]
M6_15["M6-15"]
M6_16["M6-16"]
M6_17["M6-17"]
M6_18["M6-18"]
M1_39 --> M6_01
M1_40 --> M6_01
M1_41 --> M6_01
M1_43 --> M6_01
M1_45 --> M6_01
M1_49 --> M6_01
M1_64 --> M6_01
M4_07 --> M6_02
M4_09 --> M6_02
M6_01 --> M6_02
M1_73 --> M6_03
M6_02 --> M6_03
M4_28 --> M6_04
M4_29 --> M6_04
M6_03 --> M6_04
M2_22 --> M6_05
M2_26 --> M6_05
M3_22 --> M6_05
M4_26 --> M6_06
M6_02 --> M6_06
M6_05 --> M6_06
M6_11 --> M6_06
M1_30 --> M6_07
M6_04 --> M6_07
M2_26 --> M6_08
M2_27 --> M6_08
M6_04 --> M6_08
M1_47 --> M6_09
M3_10 --> M6_09
M6_04 --> M6_09
M4_03 --> M6_10
M1_04 --> M6_11
M4_02 --> M6_11
M4_04 --> M6_11
M4_06 --> M6_11
M4_08 --> M6_11
M6_10 --> M6_11
M6_11 --> M6_12
M2_15 --> M6_13
M2_21 --> M6_13
M2_22 --> M6_13
M3_20 --> M6_13
M3_21 --> M6_13
M6_11 --> M6_13
M2_30 --> M6_14
M6_05 --> M6_14
M6_13 --> M6_14
M6_13 --> M6_15
M5_03 --> M6_16
M6_04 --> M6_16
M6_06 --> M6_16
M6_12 --> M6_16
M6_14 --> M6_16
M6_15 --> M6_16
M6_16 --> M6_17
M2_48 --> M6_18
M4_35 --> M6_18
M4_37 --> M6_18
M6_04 --> M6_18
Tickets of M7:
flowchart TB
M1_03["M1-03"]
M1_08["M1-08"]
M1_17["M1-17"]
M1_23["M1-23"]
M1_39["M1-39"]
M1_40["M1-40"]
M1_50["M1-50"]
M1_59["M1-59"]
M1_68["M1-68"]
M1_72["M1-72"]
M1_73["M1-73"]
M2_07["M2-07"]
M2_10["M2-10"]
M2_15["M2-15"]
M2_22["M2-22"]
M2_26["M2-26"]
M2_27["M2-27"]
M2_29["M2-29"]
M2_46["M2-46"]
M2_47["M2-47"]
M2_48["M2-48"]
M3_02["M3-02"]
M3_03["M3-03"]
M3_08["M3-08"]
M3_15["M3-15"]
M3_22["M3-22"]
M3_23["M3-23"]
M4_34["M4-34"]
M5_03["M5-03"]
M5_11["M5-11"]
M5_13["M5-13"]
M6_04["M6-04"]
M6_10["M6-10"]
M6_13["M6-13"]
M6_14["M6-14"]
M6_15["M6-15"]
M6_16["M6-16"]
M6_18["M6-18"]
M7_01["M7-01"]
M7_02["M7-02"]
M7_03["M7-03"]
M7_04["M7-04"]
M7_05["M7-05"]
M7_06["M7-06"]
M7_07["M7-07"]
M7_08["M7-08"]
M7_09["M7-09"]
M7_10["M7-10"]
M7_11["M7-11"]
M7_12["M7-12"]
M7_13["M7-13"]
M7_14["M7-14"]
M7_15["M7-15"]
M7_16["M7-16"]
M7_17["M7-17"]
M7_18["M7-18"]
M7_19["M7-19"]
M7_20["M7-20"]
M7_21["M7-21"]
M7_22["M7-22"]
M7_23["M7-23"]
M7_24["M7-24"]
M7_25["M7-25"]
M7_26["M7-26"]
M7_27["M7-27"]
M7_28["M7-28"]
M7_29["M7-29"]
M1_08 --> M7_01
M1_23 --> M7_01
M3_02 --> M7_02
M3_03 --> M7_02
M7_01 --> M7_02
M7_02 --> M7_03
M2_07 --> M7_04
M2_26 --> M7_04
M7_02 --> M7_04
M1_39 --> M7_05
M1_40 --> M7_05
M1_59 --> M7_05
M2_15 --> M7_05
M2_22 --> M7_05
M2_26 --> M7_05
M2_46 --> M7_05
M3_08 --> M7_05
M3_15 --> M7_05
M3_22 --> M7_05
M7_05 --> M7_06
M7_04 --> M7_07
M7_06 --> M7_07
M7_09 --> M7_08
M6_13 --> M7_09
M7_02 --> M7_09
M7_05 --> M7_09
M7_01 --> M7_10
M1_03 --> M7_11
M7_10 --> M7_11
M4_34 --> M7_12
M7_10 --> M7_12
M5_11 --> M7_13
M7_12 --> M7_13
M2_29 --> M7_14
M7_03 --> M7_14
M7_09 --> M7_14
M7_29 --> M7_14
M7_29 --> M7_15
M7_15 --> M7_16
M1_72 --> M7_17
M2_10 --> M7_17
M2_47 --> M7_17
M3_23 --> M7_17
M7_14 --> M7_18
M1_17 --> M7_19
M1_73 --> M7_20
M2_27 --> M7_20
M5_03 --> M7_21
M6_04 --> M7_21
M7_08 --> M7_21
M1_50 --> M7_22
M3_02 --> M7_22
M2_48 --> M7_23
M7_12 --> M7_23
M6_10 --> M7_24
M1_68 --> M7_25
M7_24 --> M7_25
M7_14 --> M7_26
M7_25 --> M7_26
M2_48 --> M7_27
M6_14 --> M7_27
M6_15 --> M7_27
M7_14 --> M7_27
M5_13 --> M7_28
M6_16 --> M7_28
M6_18 --> M7_28
M7_25 --> M7_28
M7_27 --> M7_28
M1_73 --> M7_29
M7_10 --> M7_29
Tickets of M8:
flowchart TB
M1_22["M1-22"]
M1_38["M1-38"]
M1_59["M1-59"]
M1_71["M1-71"]
M2_09["M2-09"]
M2_18["M2-18"]
M2_22["M2-22"]
M2_34["M2-34"]
M3_07["M3-07"]
M3_13["M3-13"]
M6_04["M6-04"]
M8_01["M8-01"]
M8_02["M8-02"]
M8_03["M8-03"]
M8_04["M8-04"]
M8_05["M8-05"]
M8_06["M8-06"]
M8_07["M8-07"]
M8_08["M8-08"]
M8_09["M8-09"]
M8_10["M8-10"]
M8_11["M8-11"]
M1_22 --> M8_01
M8_01 --> M8_02
M2_09 --> M8_03
M8_02 --> M8_04
M8_10 --> M8_04
M8_11 --> M8_04
M8_04 --> M8_05
M2_22 --> M8_06
M2_34 --> M8_06
M8_04 --> M8_06
M8_05 --> M8_07
M8_06 --> M8_07
M6_04 --> M8_08
M8_03 --> M8_08
M8_07 --> M8_09
M8_08 --> M8_09
M1_38 --> M8_10
M1_71 --> M8_10
M1_59 --> M8_11
M2_18 --> M8_11
M3_07 --> M8_11
M3_13 --> M8_11
M8_03 --> M8_11