jackherd 1.10.0 → 1.11.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (66) hide show
  1. package/CHANGELOG.md +26 -0
  2. package/README.md +24 -16
  3. package/dist/{chunk-5MQBCUQ5.js → chunk-RMMXD4G5.js} +9 -2
  4. package/dist/config.d.ts +60 -0
  5. package/dist/config.js +39 -4
  6. package/dist/plan-format.d.ts +7 -1
  7. package/dist/plan-format.js +4 -2
  8. package/docs/follow-dark.svg +48 -0
  9. package/docs/follow.svg +48 -0
  10. package/herdr-plugin/herdr-plugin.toml +1 -1
  11. package/install.sh +1 -1
  12. package/kit/hooks/hooks/open-question/run.ts +8 -3
  13. package/kit/rules/rules/kit/pull-requests.md +2 -0
  14. package/kit/workflow/skills/follow/SKILL.md +3 -3
  15. package/kit/workflow/skills/orchestrate/SKILL.md +11 -3
  16. package/package.json +2 -2
  17. package/recipes/sources.md +4 -0
  18. package/schemas/jackherd.schema.json +80 -0
  19. package/src/cli.ts +1 -0
  20. package/src/config/schema.ts +24 -1
  21. package/src/config/tones.ts +27 -0
  22. package/src/lane-prompt/additions.ts +14 -0
  23. package/src/lane-prompt/command.ts +8 -2
  24. package/src/lane-prompt/input.ts +44 -3
  25. package/src/lane-prompt/options.ts +2 -0
  26. package/src/mermaid/command.ts +36 -0
  27. package/src/mermaid/problems.ts +48 -0
  28. package/src/plan-format/dependencies.ts +2 -2
  29. package/src/plan-format/waiting.ts +15 -2
  30. package/src/plans/appointment-rows.ts +34 -10
  31. package/src/plans/ask-coordinator.ts +46 -12
  32. package/src/plans/ask-target.ts +13 -2
  33. package/src/plans/board-close.ts +85 -0
  34. package/src/plans/frame.ts +5 -12
  35. package/src/plans/git.ts +35 -0
  36. package/src/plans/groomed.ts +27 -0
  37. package/src/plans/layout-phase.ts +7 -4
  38. package/src/plans/layout.ts +258 -48
  39. package/src/plans/link-chips.ts +22 -4
  40. package/src/plans/live.ts +73 -5
  41. package/src/plans/next-rows.ts +44 -0
  42. package/src/plans/planned.ts +22 -0
  43. package/src/plans/row-actions.ts +52 -0
  44. package/src/plans/row-focus.ts +148 -0
  45. package/src/plans/row-targets.ts +7 -0
  46. package/src/plans/selection.ts +14 -1
  47. package/src/plans/settings.ts +10 -0
  48. package/src/plans/snapshot.ts +79 -21
  49. package/src/plans/source-asked.ts +19 -0
  50. package/src/plans/source-prefix.ts +17 -0
  51. package/src/plans/source-rows.ts +188 -0
  52. package/src/plans/texts.ts +28 -3
  53. package/src/plans/tones.ts +30 -0
  54. package/src/plans/view.ts +8 -2
  55. package/src/plans/waiting-click.ts +129 -24
  56. package/src/terminal/text.ts +8 -0
  57. package/src/terminal/types.ts +4 -0
  58. package/src/vocabulary/index.ts +10 -0
  59. package/src/watch/plan-badges-read.ts +9 -2
  60. package/src/watch/plan-badges.ts +10 -2
  61. package/src/watch/report-questions.ts +4 -3
  62. package/src/watch/source-entries.ts +55 -0
  63. package/src/watch/source-fields.ts +1 -0
  64. package/src/watch/source-statuses.ts +60 -0
  65. package/src/watch/source-tickets.ts +21 -1
  66. package/src/watch/sources.ts +41 -1
package/CHANGELOG.md CHANGED
@@ -2,6 +2,32 @@
2
2
 
3
3
  What changed for people who use jackherd, newest first.
4
4
 
5
+ ## 1.11.1
6
+
7
+ - **The README images load from a versioned address on npm.** Every image address in the published markdown is `https://unpkg.com/jackherd@<version>/…`. An address without a version stays in the image proxies of npm and GitHub for a long time, so npm kept showing old images; a versioned address never changes, so every release brings its own. `bun run pin:assets` rewrites the addresses to the version in `package.json`, and a test fails until it ran after a version bump. It replaces the `?v=` mark on the icon addresses, which someone had to raise by hand. Text links stay without a version and lead to the newest release.
8
+ - **The "Follow anything outside GitHub" diagram is an image.** It was a Mermaid block, which npm does not render; it now has a light and a dark SVG like the other diagrams.
9
+ - **The coordinator names only the count of what waits for you.** The `heartbeat` line of the orchestrate skill says how many items wait (`3 wait for you, see the herd`) instead of listing them, and no reply repeats the list at its end: the herd shows it. The watcher's line to the coordinator is unchanged.
10
+ - **The README no longer links the recipes.** unpkg shows them as raw files and `/jh-follow` reads them from the installed package itself; the files stay in the package.
11
+
12
+ ## 1.11.0
13
+
14
+ - **The herd lists your sources.** A `watch.sources` entry that is no ticket gets a row in a `Sources` block: when it last ran, since when it fails (red mark), its newest report (amber mark while it is under a day old); a click opens the report's URL. `/jh-follow` and `recipes/sources.md` say how.
15
+ - **The colours of the herd are configurable.** `plans.tones` names the tone of each role (`waiting`, `new`, `running`, `resting`) from amber, teal, grey, red, green, blue and magenta; a source may carry its own `tone` for its new reports. The defaults are the colours it had.
16
+ - **A row from a source says which one.** `watch.sources[].label` (at most 40 characters, one line; without it the source's name) is put before a "Waiting for you" row whose `Origin` cell names the source, as `<label>: <row>`.
17
+ - **"Waiting for you" rows have `[done]`, the appointments have `[done]`, `[run]` and `[move]`.** `[done]` closes the row (the board's status cell, a sent file's record), `[run]` asks the coordinator to run the appointment now, `[move]` to ask you for a new time.
18
+ - **New blocks and cells in the herd.** `Next` shows the board's next section; a resting lane says `waits on: …` or `after: …`; `groomed 3d ago` beside the clock (amber from eight days) from the board-grooming appointment; `planned` shows the next phase per plan, with `stale?` once its plan file has not changed on the base branch for 14 days.
19
+ - **`jh mermaid <file>` checks the diagrams of a pull request text.** An edge label between dashes (`-- text -->`) or a pipe label without quotes makes GitHub show `Lexical error` instead of the diagram; the command exits 1 with the line. The pull request rule now says to write `-->|"label"|` and to run it before `gh pr create` or `gh pr edit`.
20
+ - **A report that says "Keine offenen." asks nothing.** The watcher no longer counts it as a question, and a bold or listed "None." does not either.
21
+ - **A note in the write set no longer widens it to the whole repository.** A backticked config key such as `watch.sources[].label` in the `Writes` cell of a plan's dependency table is no path, so `jh lane prompt` lists only the real folders.
22
+ - **One colour rule for the buttons.** The buttons no longer wear the colour of the row's mark: amber and bold in "Waiting for you", the normal foreground colour in the other blocks, dim only where nothing is left to do (an entry that says `↑ asked`).
23
+ - **A source with several entries opens on a click.** The `Sources` block shows one folded row per source (amber only for a new entry that no row of "Waiting for you" asks about); opened, it lists up to five entries with title, count (`map.count`, new) and time, then `+<n> more`. A click on an entry opens its `url`, `[ask]` asks the coordinator to look at exactly that entry, and an entry that "Waiting for you" already asks about is dim and says `↑ asked`. The watcher keeps the last 20 entries of such a source.
24
+ - **A question put off twice stays one open question.** The `open-question` hook writes no second record while one with the same text is still open, so asking it again with `[ask]` and answering "later" again leaves a single row.
25
+ - **A click folds the ticked tasks again.** The listed ticked tasks of a phase get a line `▾ <n> ticked · click or a folds them` above them; before, only `a` closed the list that a click had opened. The key hint and the legend name both.
26
+ - **`jh lane prompt` keeps your additions and names no contested phase.** What you write below the marker line at the end of the prompt file stays through every new writing, `--handover` included. A phase that two open rows of the board name comes into neither prompt; the command prints it and a lane left with nothing is refused.
27
+ - **The row under the mouse or the arrows is marked, everywhere.** Any clickable row of the herd (lane, phase, ticked line, `waiting`, `planned`, and the rows of `Waiting for you`, `Next`, `Appointments` and `Sources`) gets a light background and a `❯` in front, and its buttons turn bold; the background joins the text and its buttons across the full width. The herd now asks the terminal for mouse movement and redraws only when the row under the mouse changes. `↑↓` also walks the rows of the blocks on top; enter on one asks, opens or expands it, and never presses `[done]` or `[run]`. The legend names it.
28
+ - **Links are bracket buttons, and the mouse bolds only the one it is on.** The links under a lane (`[↗ #<n>] [📄 Plan] [✦ title]`) lose the grey background and read like `[ask]`: a square bracket means a click does something. `… checks` stays plain text, amber and dark red badges stay badges. An artifact link shows its title (the link text, the bold label before it, else the text of its line) instead of "Artifact". With the mouse over a row only the bracket under it turns bold; with the arrows the whole row is the unit. A line of links is marked by the mouse, not walked by the arrows.
29
+ - **The README follows a source from the command to your answer.** A short section with a diagram: source, watcher, coordinator, "Waiting for you", you.
30
+
5
31
  ## 1.10.0
6
32
 
7
33
  - **`jh sync` writes the ask rules the merge guard left behind.** A project sync adds `permissions.ask` rules for `gh run rerun` and the `gh api` writes that merge, write a file, dispatch or rerun a workflow, or move a ref; it records them in the lock, removes one only when the kit drops it and only if a kit shipped it, and leaves your own rules alone. Claude Code applies a matching ask rule even when a hook answers `allow`.
package/README.md CHANGED
@@ -1,9 +1,9 @@
1
1
  <p>
2
- <img alt="jackherd: a black and white Shih Tzu in a turquoise bandana, three lanes running from him to three agent nodes" src="https://unpkg.com/jackherd/assets/branding/jackherd-logo-outline.svg" width="340">
2
+ <img alt="jackherd: a black and white Shih Tzu in a turquoise bandana, three lanes running from him to three agent nodes" src="https://unpkg.com/jackherd@1.11.1/assets/branding/jackherd-logo-outline.svg" width="340">
3
3
  <br>
4
4
  </p>
5
5
 
6
- [![npm](https://img.shields.io/npm/v/jackherd)](https://www.npmjs.com/package/jackherd) [![license: MIT](https://img.shields.io/npm/l/jackherd)](https://www.npmjs.com/package/jackherd) [![2 dependencies](https://img.shields.io/badge/dependencies-2-brightgreen)](https://www.npmjs.com/package/jackherd?activeTab=dependencies)<br><img width="1" height="8" alt="" src="https://unpkg.com/jackherd/assets/icons/space.svg?v=2">
6
+ [![npm](https://img.shields.io/npm/v/jackherd)](https://www.npmjs.com/package/jackherd) [![license: MIT](https://img.shields.io/npm/l/jackherd)](https://www.npmjs.com/package/jackherd) [![2 dependencies](https://img.shields.io/badge/dependencies-2-brightgreen)](https://www.npmjs.com/package/jackherd?activeTab=dependencies)<br><img width="1" height="8" alt="" src="https://unpkg.com/jackherd@1.11.1/assets/icons/space.svg">
7
7
 
8
8
  # Your agents write code. Jack keeps the work moving.
9
9
 
@@ -15,25 +15,25 @@ For developers who'd rather make the calls than babysit their agents.
15
15
 
16
16
  **We recommend [herdr](https://herdr.dev), a terminal for coding agents:** Jack, the lanes and the watcher run there; without it, one Claude Code session plans and builds, with independent phases as parallel subagents.
17
17
 
18
- Install with one command, run `/jh-start` in a repository, and it offers your first plan: [Quickstart](#quickstart).<br><img width="1" height="8" alt="" src="https://unpkg.com/jackherd/assets/icons/space.svg?v=2">
18
+ Install with one command, run `/jh-start` in a repository, and it offers your first plan: [Quickstart](#quickstart).<br><img width="1" height="8" alt="" src="https://unpkg.com/jackherd@1.11.1/assets/icons/space.svg">
19
19
 
20
20
  <p>
21
- <img src="https://unpkg.com/jackherd/docs/workflow-dark.svg" width="720" alt="jackherd in herdr: a lane hits a question, Jack asks you as a choice, you pick, and the lane works on while the herd view counts its progress.">
21
+ <img src="https://unpkg.com/jackherd@1.11.1/docs/workflow-dark.svg" width="720" alt="jackherd in herdr: a lane hits a question, Jack asks you as a choice, you pick, and the lane works on while the herd view counts its progress.">
22
22
  <br>
23
- <sub>Jack and parallel lanes in herdr (recommended).</sub><br><img width="1" height="8" alt="" src="https://unpkg.com/jackherd/assets/icons/space.svg?v=2">
23
+ <sub>Jack and parallel lanes in herdr (recommended).</sub><br><img width="1" height="8" alt="" src="https://unpkg.com/jackherd@1.11.1/assets/icons/space.svg">
24
24
  </p>
25
25
 
26
- <p><img src="https://unpkg.com/jackherd/assets/icons/decide.svg?v=2" width="24" height="34" align="middle" alt=""> <b>You make the calls that matter.</b><br>Jack answers what the plan or a rule already settles and records each answer on the board, where you can check it. The rest reaches you as a short choice. Approve a plan once, and its pull requests merge on green checks, except on paths you marked to always ask.</p>
26
+ <p><img src="https://unpkg.com/jackherd@1.11.1/assets/icons/decide.svg" width="24" height="34" align="middle" alt=""> <b>You make the calls that matter.</b><br>Jack answers what the plan or a rule already settles and records each answer on the board, where you can check it. The rest reaches you as a short choice. Approve a plan once, and its pull requests merge on green checks, except on paths you marked to always ask.</p>
27
27
 
28
- <p><img src="https://unpkg.com/jackherd/assets/icons/bark.svg?v=2" width="24" height="34" align="middle" alt=""> <b>Jack barks when something moves.</b><br>One view of the whole herd: each lane's progress, pull request and checks, and on top whatever waits for your answer. In herdr it also shows what each agent is doing and every new review comment. You stop hopping between terminals and holding the state in your head.</p>
28
+ <p><img src="https://unpkg.com/jackherd@1.11.1/assets/icons/bark.svg" width="24" height="34" align="middle" alt=""> <b>Jack barks when something moves.</b><br>One view of the whole herd: each lane's progress, pull request and checks, and on top whatever waits for your answer. In herdr it also shows what each agent is doing and every new review comment. You stop hopping between terminals and holding the state in your head.</p>
29
29
 
30
- <p><img src="https://unpkg.com/jackherd/assets/icons/ear.svg?v=2" width="24" height="34" align="middle" alt=""> <b>Jack listens, on GitHub and beyond.</b><br>A review comment, from a teammate or a bot, goes to its lane, which fixes it with a test and answers in the thread; a judgement call comes to you. <code>/jh-follow</code> follows any tool with a CLI or an API, with recipes for Jira, Linear, Sentry and status pages as a head start, and Jack reports changes. Runs in herdr.</p>
30
+ <p><img src="https://unpkg.com/jackherd@1.11.1/assets/icons/ear.svg" width="24" height="34" align="middle" alt=""> <b>Jack listens, on GitHub and beyond.</b><br>A review comment, from a teammate or a bot, goes to its lane, which fixes it with a test and answers in the thread; a judgement call comes to you. <code>/jh-follow</code> follows any tool with a CLI or an API, with recipes for Jira, Linear, Sentry and status pages as a head start, and Jack reports changes. Runs in herdr.</p>
31
31
 
32
- <p><img src="https://unpkg.com/jackherd/assets/icons/lanes.svg?v=2" width="24" height="34" align="middle" alt=""> <b>Parallel where it pays.</b><br>The plan says what each phase writes and waits for, and jackherd works out what can run side by side: independent phases as subagents in one session, bigger ones in a lane of their own in herdr, with its own branch and worktree. Where more could run in parallel at little cost, Jack suggests it. He keeps the merge order and has the others rebase after each merge.</p>
32
+ <p><img src="https://unpkg.com/jackherd@1.11.1/assets/icons/lanes.svg" width="24" height="34" align="middle" alt=""> <b>Parallel where it pays.</b><br>The plan says what each phase writes and waits for, and jackherd works out what can run side by side: independent phases as subagents in one session, bigger ones in a lane of their own in herdr, with its own branch and worktree. Where more could run in parallel at little cost, Jack suggests it. He keeps the merge order and has the others rebase after each merge.</p>
33
33
 
34
- <p><img src="https://unpkg.com/jackherd/assets/icons/plan.svg?v=2" width="24" height="34" align="middle" alt=""> <b>One workflow, solo or team.</b><br>Plans, boards and Jack's decisions live in your repository, so everyone sees what was planned, what was settled and what comes next, and workflow changes go through your usual review. <code>jh init</code> adds the skills, rules and guard hooks through Claude Code's own project settings.</p>
34
+ <p><img src="https://unpkg.com/jackherd@1.11.1/assets/icons/plan.svg" width="24" height="34" align="middle" alt=""> <b>One workflow, solo or team.</b><br>Plans, boards and Jack's decisions live in your repository, so everyone sees what was planned, what was settled and what comes next, and workflow changes go through your usual review. <code>jh init</code> adds the skills, rules and guard hooks through Claude Code's own project settings.</p>
35
35
 
36
- <p><img src="https://unpkg.com/jackherd/assets/icons/bowl.svg?v=2" width="24" height="34" align="middle" alt=""> <b>Pick up where you left off.</b><br>The ticked-off plan and the board carry the state, not the chat. A lane whose context runs high continues in a fresh chat at the end of its phase; Jack hands himself over the same way.</p>
36
+ <p><img src="https://unpkg.com/jackherd@1.11.1/assets/icons/bowl.svg" width="24" height="34" align="middle" alt=""> <b>Pick up where you left off.</b><br>The ticked-off plan and the board carry the state, not the chat. A lane whose context runs high continues in a fresh chat at the end of its phase; Jack hands himself over the same way.</p>
37
37
 
38
38
  ## Quickstart
39
39
 
@@ -71,12 +71,20 @@ Install with one command, run `/jh-start` in a repository, and it offers your fi
71
71
 
72
72
  By hand (Bun 1.3+): `bun add -g jackherd` or `npm install -g jackherd`, then `jh init --global` for yourself, or `jh init` in a repository to give your team the same skills and guard hooks. → [INSTALL.md](https://unpkg.com/jackherd/INSTALL.md)
73
73
 
74
+ ## Follow anything outside GitHub
75
+
76
+ `/jh-follow` turns a ticket, an error log or a status page into something Jack acts on. It writes the source to `watch.sources` after a dry run and your yes; from then on a change takes this path:
77
+
78
+ <img src="https://unpkg.com/jackherd@1.11.1/docs/follow-dark.svg" width="720" alt="A source (ticket, error log or status page) has a new or changed entry; jh watch reports it to Jack; Jack puts a row into Waiting for you, prefixed with the source's label; its [ask] button makes Jack ask you, and then a lane works it.">
79
+
80
+ The herd lists each source that is no ticket in a `Sources` block (when it ran, since when it fails, its newest report, a click opens it), and a row that came from a source starts with its `label`.
81
+
74
82
  ## In detail
75
83
 
76
84
  <details>
77
85
  <summary><b>What Jack does on his own, and what waits for you</b></summary>
78
86
 
79
- <img src="https://unpkg.com/jackherd/docs/lanes-dark.svg" alt="Jack prompts two lanes and asks you for decisions and approvals; the lanes send questions back as text; jh watch reads lane state, pull requests and checks and wakes Jack.">
87
+ <img src="https://unpkg.com/jackherd@1.11.1/docs/lanes-dark.svg" alt="Jack prompts two lanes and asks you for decisions and approvals; the lanes send questions back as text; jh watch reads lane state, pull requests and checks and wakes Jack.">
80
88
 
81
89
  | On his own | After your approval | Never |
82
90
  | --- | --- | --- |
@@ -109,7 +117,7 @@ The guards catch mistakes, not intent; for that, use branch protection. The hook
109
117
 
110
118
  A **plan** is Markdown with phases, checkbox tasks, a model and a review gate per phase. A **board** lists the lanes of one or more plans: which phases each lane builds, on which model, after what. A **lane** is one agent session in its own git worktree (a second checkout of your repository), and **Jack** is the session in the main checkout that runs `/jh-orchestrate` on a board.
111
119
 
112
- <img src="https://unpkg.com/jackherd/docs/skills-dark.svg" alt="/jh-grill hands decisions to /jh-plan; /jh-plan feeds /jh-orchestrate or a single /jh-implement; /jh-implement ends in /jh-pre-commit, which runs the reviewers; /jh-diagnose hands a red command to /jh-implement.">
120
+ <img src="https://unpkg.com/jackherd@1.11.1/docs/skills-dark.svg" alt="/jh-grill hands decisions to /jh-plan; /jh-plan feeds /jh-orchestrate or a single /jh-implement; /jh-implement ends in /jh-pre-commit, which runs the reviewers; /jh-diagnose hands a red command to /jh-implement.">
113
121
 
114
122
  | Skill | Does |
115
123
  | --- | --- |
@@ -138,7 +146,7 @@ Each phase in the plan names its model: the planning model (Opus by default) whe
138
146
 
139
147
  Jack doesn't watch the terminals himself. `jh watch`, which he starts, wakes him when a lane is blocked or done, a check turns red, a pull request gets feedback, a lane's context fills up, a lane waits for an approval or works for ten minutes without reporting its task; deploys and previews too, when configured.
140
148
 
141
- `/jh-follow PROJ-123` adds anything a command can print as JSON: a ticket, an issue, error logs, a status page. It checks the tool and its login, shows you a dry run and writes the source to `watch.sources` after your yes. A token stays in the environment, read by a small Bun script, never in an argument. Each source runs on its own interval, kept across a restart of the watcher. The [recipes](https://unpkg.com/jackherd/recipes/README.md) cover Jira, Linear, GitHub issues and Projects, Sentry and status pages. The reports need herdr; a source can be set up and dry-run without it.
149
+ `/jh-follow PROJ-123` adds anything a command can print as JSON: a ticket, an issue, error logs, a status page. It checks the tool and its login, shows you a dry run and writes the source to `watch.sources` after your yes. A token stays in the environment, read by a small Bun script, never in an argument. Each source runs on its own interval, kept across a restart of the watcher. Recipes for Jira, Linear, GitHub issues and Projects, Sentry and status pages come with it. The reports need herdr; a source can be set up and dry-run without it.
142
150
 
143
151
  </details>
144
152
 
@@ -175,7 +183,7 @@ On top, **Waiting for you** lists what needs your answer: a file or Artifact sen
175
183
  ────────────────────────────────────────────────────────────────────────────────
176
184
  · no agent (1) docs-site 1/3
177
185
  ────────────────────────────────────────────────────────────────────────────────
178
- ↑↓ select →← open a ticked tasks s html q quit ? help
186
+ ↑↓ select →← open a/click ticked tasks s html q quit ? help
179
187
  ```
180
188
 
181
189
  </details>
@@ -191,7 +199,7 @@ On top, **Waiting for you** lists what needs your answer: a file or Artifact sen
191
199
  | `jh check` | types, lint and tests of what you touched, plus the plan and board checks (`--skip-slow`, `--parallel <plan>`) |
192
200
  | `jh herd` | the live view (`--once`, `--lane <name>`) |
193
201
  | `jh watch` | the watcher Jack runs |
194
- | `jh lane prompt <lane>` | writes a lane's first prompt from its board row and its plan (`--out`, `--handover`) |
202
+ | `jh lane prompt <lane>` | writes a lane's first prompt from its board row and its plan (`--out`, `--handover`); your additions below the marker line at its end stay |
195
203
  | `jh lane close <lane>` | removes a finished lane: agent, worktree, herdr workspace and branch, and marks the board; first checks that nothing is lost, and refuses with every reason; `--dry-run` only checks. Claude Code asks before each call |
196
204
  | `jh preview <file>` | renders a Markdown file through the GitHub API into a preview in GitHub and npm style |
197
205
  | `jh waiting` | the files and Artifacts sent to you that you have not answered yet (`close <id>…` or `close --all` once you have) |
@@ -40,15 +40,21 @@ var APPOINTMENT_VOCABULARY = {
40
40
  heading: "Termine",
41
41
  columns: { when: "Wann", action: "Aktion", origin: "Herkunft", status: "Stand" },
42
42
  statusAlso: ["Status"],
43
- open: ["offen"]
43
+ open: ["offen"],
44
+ grooming: "board-pflege"
44
45
  },
45
46
  [PLAN_LANGUAGE.en]: {
46
47
  heading: "Appointments",
47
48
  columns: { when: "When", action: "Action", origin: "Origin", status: "Status" },
48
49
  statusAlso: [],
49
- open: ["open"]
50
+ open: ["open"],
51
+ grooming: "board grooming"
50
52
  }
51
53
  };
54
+ var NEXT_VOCABULARY = {
55
+ [PLAN_LANGUAGE.de]: { heading: "Als N\xE4chstes" },
56
+ [PLAN_LANGUAGE.en]: { heading: "Next" }
57
+ };
52
58
  var WAITING_VOCABULARY = {
53
59
  [PLAN_LANGUAGE.de]: {
54
60
  heading: "Wartet auf dich",
@@ -164,6 +170,7 @@ export {
164
170
  LANE_PROMPT_OPENING,
165
171
  APPROVAL_TEXTS,
166
172
  APPOINTMENT_VOCABULARY,
173
+ NEXT_VOCABULARY,
167
174
  WAITING_VOCABULARY,
168
175
  isPlanLanguage,
169
176
  PLAN_STATUS,
package/dist/config.d.ts CHANGED
@@ -34,11 +34,22 @@ declare const sourceSchema: z.ZodObject<{
34
34
  body: z.ZodOptional<z.ZodString>;
35
35
  author: z.ZodOptional<z.ZodString>;
36
36
  status: z.ZodOptional<z.ZodString>;
37
+ count: z.ZodOptional<z.ZodString>;
37
38
  }, z.core.$catchall<z.ZodString>>;
38
39
  ignoreAuthors: z.ZodDefault<z.ZodArray<z.ZodString>>;
39
40
  reportLimit: z.ZodDefault<z.ZodNumber>;
41
+ label: z.ZodOptional<z.ZodString>;
40
42
  lane: z.ZodOptional<z.ZodString>;
41
43
  ticket: z.ZodOptional<z.ZodBoolean>;
44
+ tone: z.ZodOptional<z.ZodEnum<{
45
+ amber: "amber";
46
+ teal: "teal";
47
+ grey: "grey";
48
+ red: "red";
49
+ green: "green";
50
+ blue: "blue";
51
+ magenta: "magenta";
52
+ }>>;
42
53
  reportOn: z.ZodOptional<z.ZodArray<z.ZodString>>;
43
54
  }, z.core.$strict>;
44
55
  declare const jackherdConfigSchema: z.ZodObject<{
@@ -110,6 +121,44 @@ declare const jackherdConfigSchema: z.ZodObject<{
110
121
  alertTokens: z.ZodDefault<z.ZodNumber>;
111
122
  }, z.core.$strict>>;
112
123
  }, z.core.$strict>>;
124
+ tones: z.ZodPrefault<z.ZodObject<{
125
+ waiting: z.ZodDefault<z.ZodEnum<{
126
+ amber: "amber";
127
+ teal: "teal";
128
+ grey: "grey";
129
+ red: "red";
130
+ green: "green";
131
+ blue: "blue";
132
+ magenta: "magenta";
133
+ }>>;
134
+ new: z.ZodDefault<z.ZodEnum<{
135
+ amber: "amber";
136
+ teal: "teal";
137
+ grey: "grey";
138
+ red: "red";
139
+ green: "green";
140
+ blue: "blue";
141
+ magenta: "magenta";
142
+ }>>;
143
+ running: z.ZodDefault<z.ZodEnum<{
144
+ amber: "amber";
145
+ teal: "teal";
146
+ grey: "grey";
147
+ red: "red";
148
+ green: "green";
149
+ blue: "blue";
150
+ magenta: "magenta";
151
+ }>>;
152
+ resting: z.ZodDefault<z.ZodEnum<{
153
+ amber: "amber";
154
+ teal: "teal";
155
+ grey: "grey";
156
+ red: "red";
157
+ green: "green";
158
+ blue: "blue";
159
+ magenta: "magenta";
160
+ }>>;
161
+ }, z.core.$strict>>;
113
162
  }, z.core.$strict>>;
114
163
  watch: z.ZodPrefault<z.ZodObject<{
115
164
  deploy: z.ZodOptional<z.ZodObject<{
@@ -149,11 +198,22 @@ declare const jackherdConfigSchema: z.ZodObject<{
149
198
  body: z.ZodOptional<z.ZodString>;
150
199
  author: z.ZodOptional<z.ZodString>;
151
200
  status: z.ZodOptional<z.ZodString>;
201
+ count: z.ZodOptional<z.ZodString>;
152
202
  }, z.core.$catchall<z.ZodString>>;
153
203
  ignoreAuthors: z.ZodDefault<z.ZodArray<z.ZodString>>;
154
204
  reportLimit: z.ZodDefault<z.ZodNumber>;
205
+ label: z.ZodOptional<z.ZodString>;
155
206
  lane: z.ZodOptional<z.ZodString>;
156
207
  ticket: z.ZodOptional<z.ZodBoolean>;
208
+ tone: z.ZodOptional<z.ZodEnum<{
209
+ amber: "amber";
210
+ teal: "teal";
211
+ grey: "grey";
212
+ red: "red";
213
+ green: "green";
214
+ blue: "blue";
215
+ magenta: "magenta";
216
+ }>>;
157
217
  reportOn: z.ZodOptional<z.ZodArray<z.ZodString>>;
158
218
  }, z.core.$strict>>>;
159
219
  }, z.core.$strict>>;
package/dist/config.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  PLAN_LANGUAGE,
3
3
  RESPONSE_ADDRESS
4
- } from "./chunk-5MQBCUQ5.js";
4
+ } from "./chunk-RMMXD4G5.js";
5
5
 
6
6
  // src/config/json-schema.ts
7
7
  import { z as z3 } from "zod";
@@ -164,7 +164,8 @@ var SOURCE_FIELD = {
164
164
  url: "url",
165
165
  body: "body",
166
166
  author: "author",
167
- status: "status"
167
+ status: "status",
168
+ count: "count"
168
169
  };
169
170
  var CONTENT_FIELDS = [SOURCE_FIELD.title, SOURCE_FIELD.author, SOURCE_FIELD.body, SOURCE_FIELD.url];
170
171
 
@@ -274,6 +275,25 @@ import { isAbsolute } from "path";
274
275
  var segmentsOf = (path) => path.split(/[\\/]/).filter((segment) => segment !== "" && segment !== ".");
275
276
  var isRepositoryDirectory = (value) => !isAbsolute(value) && segmentsOf(value).length > 0 && !segmentsOf(value).includes("..");
276
277
 
278
+ // src/config/tones.ts
279
+ var TONE = {
280
+ amber: "amber",
281
+ teal: "teal",
282
+ grey: "grey",
283
+ red: "red",
284
+ green: "green",
285
+ blue: "blue",
286
+ magenta: "magenta"
287
+ };
288
+ var TONE_NAMES = Object.values(TONE);
289
+ var TONE_ROLE = { waiting: "waiting", new: "new", running: "running", resting: "resting" };
290
+ var DEFAULT_TONES = {
291
+ [TONE_ROLE.waiting]: TONE.amber,
292
+ [TONE_ROLE.new]: TONE.amber,
293
+ [TONE_ROLE.running]: TONE.teal,
294
+ [TONE_ROLE.resting]: TONE.grey
295
+ };
296
+
277
297
  // src/config/schema.ts
278
298
  var TERMINAL_ADAPTER = { none: "none", herdr: "herdr" };
279
299
  var MODEL_ROLE = {
@@ -387,11 +407,14 @@ var sourceMapSchema = z2.object({
387
407
  [SOURCE_FIELD.body]: sourcePath.optional(),
388
408
  [SOURCE_FIELD.author]: sourcePath.optional(),
389
409
  /** A ticket source's status, shown on its badge in the herd; also a field `reportOn` can name. */
390
- [SOURCE_FIELD.status]: sourcePath.optional()
410
+ [SOURCE_FIELD.status]: sourcePath.optional(),
411
+ /** How often the entry happened (an error count), shown as `113×` beside the entry in the herd's `Sources` block. */
412
+ [SOURCE_FIELD.count]: sourcePath.optional()
391
413
  }).catchall(sourcePath).refine((map) => Object.keys(map).every((field) => SOURCE_FIELD_NAME.test(field)), {
392
414
  message: "a map field is a letter, then letters, digits and `_`"
393
415
  });
394
416
  var canChange = ({ map, reportOn }) => map.updatedAt !== void 0 || CONTENT_FIELDS.some((field) => map[field] !== void 0) || reportOn !== void 0;
417
+ var toneName = z2.enum(TONE_NAMES);
395
418
  var sourceSchema = z2.strictObject({
396
419
  /** Printed in every report of the source and the key of its saved state. */
397
420
  name: z2.string().regex(/^[A-Za-z0-9][\w.-]*$/, "letters, digits, `_`, `.` and `-`"),
@@ -406,6 +429,8 @@ var sourceSchema = z2.strictObject({
406
429
  ignoreAuthors: z2.array(z2.string().min(1)).default([]),
407
430
  /** The most new or changed entries one report shows of this source; the rest is one line `+<n> more`. */
408
431
  reportLimit: z2.number().int().min(1).default(5),
432
+ /** Shown before a row of "Waiting for you" that came from this source (`Error log · Checkout: …`); without it the source's name. */
433
+ label: z2.string().min(1).max(40).regex(/^[^\r\n]+$/, "one line").optional(),
409
434
  /** The lane the source's reports name. */
410
435
  lane: z2.string().min(1).optional(),
411
436
  /**
@@ -413,6 +438,8 @@ var sourceSchema = z2.strictObject({
413
438
  * the lane above or the lane whose board row or plan names its id.
414
439
  */
415
440
  ticket: z2.boolean().optional(),
441
+ /** The tone of the source's mark in the herd's `Sources` block while its newest report is new; without it the tone of the role `new`. */
442
+ tone: toneName.optional(),
416
443
  /**
417
444
  * The mapped fields whose change reports, with the old and the new value, in place of the content of `title`,
418
445
  * `author`, `body` and `url`; without it a change of that content reports.
@@ -512,6 +539,12 @@ var hintsSchema = z2.strictObject({
512
539
  taskSignal: z2.boolean().default(true)
513
540
  });
514
541
  var DEFAULT_TASK_SIGNAL_MINUTES = 10;
542
+ var tonesSchema = z2.strictObject({
543
+ waiting: toneName.default(DEFAULT_TONES.waiting),
544
+ new: toneName.default(DEFAULT_TONES.new),
545
+ running: toneName.default(DEFAULT_TONES.running),
546
+ resting: toneName.default(DEFAULT_TONES.resting)
547
+ });
515
548
  var contextSchema = z2.strictObject({
516
549
  /** Tokens in a lane's context from which its fill shows yellow and `/implement` offers a new chat. */
517
550
  warnTokens: tokenCount.default(25e4),
@@ -581,7 +614,9 @@ var jackherdConfigSchema = z2.strictObject({
581
614
  icon: z2.string().min(1)
582
615
  })
583
616
  ).default(DEFAULT_LINK_KINDS.map((kind) => ({ ...kind }))),
584
- context: contextSchema.prefault({})
617
+ context: contextSchema.prefault({}),
618
+ /** The colour of each role in the herd, by name: what waits for you, what is new, what runs, what rests. */
619
+ tones: tonesSchema.prefault({})
585
620
  }).prefault({}),
586
621
  /**
587
622
  * Read by `jh watch`; without `deploy` it reports no deploy runs. `feedback` is on unless set to `false`:
@@ -64,6 +64,12 @@ declare const APPOINTMENT_VOCABULARY: Record<PlanLanguage, {
64
64
  /** Further header names that count as the status column. */
65
65
  statusAlso: readonly string[];
66
66
  open: readonly string[];
67
+ /** The lower-case word an action starts with when it is the weekly board grooming, which the herd's header counts from. */
68
+ grooming: string;
69
+ }>;
70
+ /** The heading of the board section of what the coordinator does next, a numbered list of at most three lines. */
71
+ declare const NEXT_VOCABULARY: Record<PlanLanguage, {
72
+ heading: string;
67
73
  }>;
68
74
  /**
69
75
  * The board section of what waits on the user's answer (a sent preview, an open question, a report to accept): its
@@ -568,4 +574,4 @@ declare const readSprintDocument: (markdown: string, language: PlanLanguage) =>
568
574
  */
569
575
  declare const readPhaseDependencies: (planMarkdown: string, language: PlanLanguage) => Record<string, string>;
570
576
 
571
- export { ADDRESS_FORM, APPOINTMENT_VOCABULARY, APPROVAL_TEXTS, type ChecklistItem, type ColumnModel, type DeferredItem, type DriftFinding, LANE_PROMPT_OPENING, LANGUAGE_NAME, type LaneProgress, type LongPhaseTitle, type MergedPhaseWithOpenBoxes, type MisplacedDeferral, PHASE_CELL_LIMIT, PHASE_ID_PREFIX, PHASE_TITLE_LIMIT, PLAN_LANGUAGE, PLAN_STATUS, PLAN_VOCABULARY, PROSE_REASON, type PhaseDependency, type PhaseHeading, type PhaseProgress, type PhaseSchedule, type PhaseTally, type PhaseWithoutGate, type PhaseWithoutRow, type PlanHeader, type PlanLanguage, type PlanPhase, type PlanStatus, type PlanStep, type PlanVocabulary, type PlansByHref, type ProseReason, RESPONSE_ADDRESS, type ResponseAddress, type RowWithProse, type RowWithoutPhase, SELF_MERGE_LABEL, SHORT_NAME_LIMIT, SHORT_NAME_PROBLEM, STANDING_APPROVAL_TEXTS, type ShortNameFinding, type ShortNameProblem, type SprintDocument, type SprintLane, type SprintPlanRow, type SprintPlanTable, type StatusWord, type StepProgress, WAITING_VOCABULARY, activeItem, boardRowsWithProse, boardRowsWithoutPhase, classifyStatus, columnModels, countDecisions, criticalPath, currentPhase, currentPhaseOf, deferralTarget, differsFromColumn, endsPhase, findDrift, hasLanesTable, isCheckboxLine, isDocumentationGateItem, isOpenCheckboxLine, isPhaseFinished, isPhaseOpen, isPlanLanguage, isReviewGateLine, isTickedUnmerged, laneNameOf, laneProgress, longPhaseTitles, mergedPhasesWithOpenBoxes, misplacedDeferrals, newPhasesWithoutReviewGate, onlyDocumentationOpen, parallelGroups, parallelGroupsOfPlan, parseDependencyTable, parsePlanPhases, parseSprintLanes, phaseHeading, phaseHeadingPattern, phaseHeadings, phaseIdsOfCell, phaseIdsOfPlan, phaseLabel, phaseLabels, phaseProgress, phaseWaves, phasesText, phasesWithoutDependencyRow, readPhaseDependencies, readPlanHeader, readSprintDocument, resolvePlanPath, sectionHeading, shortNameFindings, shortTitle, sprintTitleOf, sumPhases, tallyPhases, wavesOfPlan, withoutRepeats };
577
+ export { ADDRESS_FORM, APPOINTMENT_VOCABULARY, APPROVAL_TEXTS, type ChecklistItem, type ColumnModel, type DeferredItem, type DriftFinding, LANE_PROMPT_OPENING, LANGUAGE_NAME, type LaneProgress, type LongPhaseTitle, type MergedPhaseWithOpenBoxes, type MisplacedDeferral, NEXT_VOCABULARY, PHASE_CELL_LIMIT, PHASE_ID_PREFIX, PHASE_TITLE_LIMIT, PLAN_LANGUAGE, PLAN_STATUS, PLAN_VOCABULARY, PROSE_REASON, type PhaseDependency, type PhaseHeading, type PhaseProgress, type PhaseSchedule, type PhaseTally, type PhaseWithoutGate, type PhaseWithoutRow, type PlanHeader, type PlanLanguage, type PlanPhase, type PlanStatus, type PlanStep, type PlanVocabulary, type PlansByHref, type ProseReason, RESPONSE_ADDRESS, type ResponseAddress, type RowWithProse, type RowWithoutPhase, SELF_MERGE_LABEL, SHORT_NAME_LIMIT, SHORT_NAME_PROBLEM, STANDING_APPROVAL_TEXTS, type ShortNameFinding, type ShortNameProblem, type SprintDocument, type SprintLane, type SprintPlanRow, type SprintPlanTable, type StatusWord, type StepProgress, WAITING_VOCABULARY, activeItem, boardRowsWithProse, boardRowsWithoutPhase, classifyStatus, columnModels, countDecisions, criticalPath, currentPhase, currentPhaseOf, deferralTarget, differsFromColumn, endsPhase, findDrift, hasLanesTable, isCheckboxLine, isDocumentationGateItem, isOpenCheckboxLine, isPhaseFinished, isPhaseOpen, isPlanLanguage, isReviewGateLine, isTickedUnmerged, laneNameOf, laneProgress, longPhaseTitles, mergedPhasesWithOpenBoxes, misplacedDeferrals, newPhasesWithoutReviewGate, onlyDocumentationOpen, parallelGroups, parallelGroupsOfPlan, parseDependencyTable, parsePlanPhases, parseSprintLanes, phaseHeading, phaseHeadingPattern, phaseHeadings, phaseIdsOfCell, phaseIdsOfPlan, phaseLabel, phaseLabels, phaseProgress, phaseWaves, phasesText, phasesWithoutDependencyRow, readPhaseDependencies, readPlanHeader, readSprintDocument, resolvePlanPath, sectionHeading, shortNameFindings, shortTitle, sprintTitleOf, sumPhases, tallyPhases, wavesOfPlan, withoutRepeats };
@@ -4,6 +4,7 @@ import {
4
4
  APPROVAL_TEXTS,
5
5
  LANE_PROMPT_OPENING,
6
6
  LANGUAGE_NAME,
7
+ NEXT_VOCABULARY,
7
8
  PLAN_LANGUAGE,
8
9
  PLAN_STATUS,
9
10
  PLAN_VOCABULARY,
@@ -15,7 +16,7 @@ import {
15
16
  isPlanLanguage,
16
17
  phaseHeading,
17
18
  sectionHeading
18
- } from "./chunk-5MQBCUQ5.js";
19
+ } from "./chunk-RMMXD4G5.js";
19
20
 
20
21
  // src/plan-format/lanes.ts
21
22
  import { posix } from "path";
@@ -499,7 +500,7 @@ var dependsOf = (cell, language) => {
499
500
  return { after, external };
500
501
  };
501
502
  var pathOf = (entry) => {
502
- if (/\s/.test(entry)) return null;
503
+ if (/\s/.test(entry) || entry.includes("[]")) return null;
503
504
  const glob = entry.search(GLOB_CHARACTER);
504
505
  const literal = glob === -1 ? entry : entry.slice(0, Math.max(entry.lastIndexOf("/", glob), 0));
505
506
  const path = literal.replace(/^\.\//, "").replace(/\/+$/, "");
@@ -902,6 +903,7 @@ export {
902
903
  APPROVAL_TEXTS,
903
904
  LANE_PROMPT_OPENING,
904
905
  LANGUAGE_NAME,
906
+ NEXT_VOCABULARY,
905
907
  PHASE_CELL_LIMIT,
906
908
  PHASE_ID_PREFIX,
907
909
  PHASE_TITLE_LIMIT,
@@ -0,0 +1,48 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="960" height="372" viewBox="0 0 960 372" role="img" aria-labelledby="t d"><title id="t">How a source reaches you</title><desc id="d">A source (a ticket, an error log or a status page) has a new or changed entry. jh watch reads it and reports it to Jack, who puts a row into Waiting for you on the board; the row starts with the source's label, for example Error log, Checkout. The [ask] button on the row makes Jack ask you about it, and once you have answered, a lane works it.</desc><defs><style>.s{font-family:ui-sans-serif, system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif}.m{font-family:ui-monospace, SFMono-Regular, Menlo, Consolas, 'Liberation Mono', monospace}</style><clipPath id="jack-clip"><rect width="240" height="240" rx="50"/></clipPath><symbol id="jack" viewBox="0 0 240 240"><rect width="240" height="240" rx="50" fill="#212E34"/><g clip-path="url(#jack-clip)"><g transform="translate(34 8)"><path fill="#4A4E51" d="M80 50.5c.2 .1 .2 .1 1 1c-.2 .6-.3 1.3-.5 2c-.7 .4-.7 .4-4 2c-6 3.3-6 3.3-7 6.5c1.2-.4 2.3-.6 3.5-1c.8 0 1.7 0 2.5 0c.2 .1 .2 .1 1 1c-.5 2-.5 2-5.5 6.5c-3 5-3 5-5.5 11c.2 .3 .2 .3 1 2c.2 .3 .3 .7 .5 1c-.7 .7-1.3 1.3-2 2c-1.3-.2-2.6-.3-4-.5c0-1.2 0-2.3 0-3.5c-.2 .1-.2 .1-1.5 .5c-1.2 2.7-2.4 5.3-3.5 8c-1 2.1-2 4.2-3 6.3c-2.5 5.7-2.5 5.7-3 8.2c.5 0 1 0 1.5 0c.1-.8 .4-1.7 .5-2.5c.6 0 1.3 0 2 0c.5 2 1 3.9 1.6 6c1 4 2.2 8 3.4 11.9c2.1 8.4 1.1 15.5-3 23.1c-.6-.2-1.3-.3-2-.5c-.1-1.5-.3-3-.5-4.6c-.3-2.6-.5-5.2-1-7.9c-.5 0-1 0-1.5 0c-.1 1.7-.4 3.3-.5 5c-2.7 10.2-2.7 10.2-6 13.5c-6.1-3.1-9-14.9-11-21c-1.1-8.2 .9-14.7 3.5-22.5c-8.4 8.3-8.3 20.5-9 31.5c-.6-.2-1.3-.3-2-.5c-5.4-8.9-5.1-15-3-25c.5-1 1-2 1.5-3c-3 1.5-3 1.5-6.5 5c-.4 0-.6 0-1 0c.8-6.5 3.2-10.2 7.5-15c.6-.8 .6-.8 3.5-5c2.6-2.6 5.2-5.1 8-7.5c.6-.6 .6-.6 3.5-3.5c-.5-2-.5-2-1-3.5c3.6-6 6.5-9.2 12.5-13c.4-.6 .6-1.3 1-2c-.5-.6-1-1.3-1.5-2c2-3 2-3 4.5-4.5c.5 1 .5 1 1 3.5c2.5-1 2.5-1 8.5-5.5c.3 0 .7 0 1 0c-.1-.4-.1-.4-.5-2.5c4.3-3.3 10-2.5 15-1zM153 69.5c1.2 .2 2.3 .3 3.5 .5c.3 .7 .7 1.3 1 2c.3 0 .7 0 1 0c.5 1.2 1 2.3 1.5 3.5c3.4 7.6 6.2 13.7 12.2 19.6c3.3 3.4 3.3 3.4 3.8 5.9c-.2 .2-.3 .3-.5 .5c.1 .7 .1 .7 .5 4.5c-.5 .3-1 .7-1.5 1c-.8-.3-1.7-.7-2.5-1c.3 .7 .7 1.3 1 2c1.2 5.8 1.4 10 1 16c-.7 0-1.3 0-2 0c-.4-1.3-.8-2.7-1.3-4.1c-2.1-6.1-5.2-11.4-8.7-16.9c-.2-.8-.2-.8-1.5-5c-.3-.6-.3-.6-2.1-3.5c-1.9-3.5-1.9-3.5-2.9-8.5c.7 0 1.3 0 2 0c.5 .5 1 1 1.5 1.5c-.8-2.3-1.7-4.6-2.5-7c-.7-2-1.3-4-2-6c-.7-1-1.3-2-2-3c.2-.7 .3-1.3 .5-2zM86.5 100.5c1 0 2 0 3 0c1.3 .8 2.7 1.7 4 2.5c-2.5 2.5-2.5 2.5-8 5.5c-5.5 4.3-8.6 7-10 14c-.8 2.2-1.7 4.3-2.5 6.5c-1.2 4.6-.5 9.3 0 14c-.5 0-1 0-1.5 0c-.2 2-.3 3.9-.5 6c-.7 0-1.3 0-2 0c-.3-.6-.3-.6-2-3.5c-1-.8-2-1.7-3-2.5c-.5-1.5-.5-1.5 1.5-8.5c.3-10.3-1-18.2-4-28c0-4 0-4 1-6c2 2 2 2 3 6.5c2.5-.5 2.5-.5 8-4c9.8-3.5 9.8-3.5 13-2.5zM43 161.5c2.5 2.5 2.5 2.5 3 5c-1.5 2.5-1.5 2.5-4 5c.5 3.5 .5 3.5 4 6.5c-.1 1.2-.4 2.3-.5 3.5c-5.3 3.5-5.3 3.5-8.5 3.5c-6-2.5-6-2.5-11.5-7c0-3 0-3 4-8c9.5-8.5 9.5-8.5 13.5-8.5z"/><path fill="#9B9D9E" d="M142.5 60.5c.5 1 .5 1-.5 4.5c1.2 1.5 2.3 3 3.5 4.5c2 4.5 2 4.5 2.5 9.5c-.5 .2-1 .3-1.5 .5c-.1 .2-.1 .2-.5 1c-2-1-3.9-2-6-3c-.8-.3-1.7-.7-2.5-1c-.3-.7-.7-1.3-1-2c.3-.5 .7-1 1-1.5c-.2-.7-.3-1.3-.5-2c-3.5 .5-3.5 .5-7.5 4c-.5 3-.5 3 0 5.5c-2 4-2 4-3.5 5.5c-.3 0-.7 0-1 0c0 .7 0 1.3 0 2c-2-1-2-1-2.5-2.5c.3-13.7 .3-13.7 4.8-18.5c4.1-3.9 6.3-4.8 11.7-6c1-.5 1-.5 3.5-.5zM98 70.5c.5 .3 1 .7 1.5 1c1.3 .3 2.7 .7 4 1c4.4 5.8 6.5 10.3 6.5 17.5c-2 2-2 2-5 2.5c-.3 .2-.3 .2-2 1c-.2-.2-.2-.2-1.5-1c.5-3 .5-3 1-5c-.7-.8-1.3-1.7-2-2.5c-.2-1.7-.3-3.3-.5-5c-4.5-2.7-8.5-3-13.5-2.5c-.1 .3-.1 .3-.5 1.5c1.3 .8 2.7 1.7 4 2.5c-.1 .4-.1 .4-.5 2.5c-2.3 1.2-4.6 2.3-7 3.5c-5.5 5.5-5.5 5.5-6.5 7c0 .5 0 1 0 1.5c.9-.1 .9-.1 5.5-.5c1 1.3 2 2.7 3 4c-.2 .5-.3 1-.5 1.5c-1.7 .5-3.2 1-5 1.6c-5.5 1.9-5.5 1.9-11 5.4c-.4 .1-.4 .1-2.5 .5c-1.5-1.5-1.5-1.5-2.5-6c-.4-.3-.6-.7-1-1c0-6.7 .9-11.7 3-18c.2-.6 .2-.6 1-3.5c7.8-9.7 20.5-14.1 32-9.5z"/><path fill="#FAF9F8" d="M103.5 40c0 .4 0 .6 0 1c2.2-.1 4.3-.4 6.5-.5c7 0 7 0 9.5 1c-.2 .6-.3 1.3-.5 2c-1.8 .6-3.7 1.3-5.5 2c-.2 .5-.3 1-.5 1.5c.7-.1 1.3-.4 2-.5c13.4-.3 13.4-.3 19.5 3.5c-.3 .6-.7 1.3-1 2c-1 0-2 0-3 0c0 .5 0 1 0 1.5c1.2 .1 1.2 .1 7 .5c3.5 2 3.5 2 5.5 4.5c0 1 0 2 0 3c-3.3 .9-6.7 1.6-10 2.5c-7.5 5-7.5 5-8.5 9c-.3 4.5-.4 9-.5 13.5c1.5 1 1.5 1 7.5 2.5c.9 .6 .9 .6 5.5 3.5c2 1 2 1 9 2.5c7.9 4 11.3 8.3 15 16.5c0 .5 0 1 0 1.5c-1 .2-2 .3-3 .5c.5 1.8 1 3.7 1.5 5.5c.3 8.5-.8 13.6-6 20.5c-.7-.2-1.3-.3-2-.5c0-1.7 0-3.3 0-5c-.7 .2-1.3 .3-2 .5c-1.3 2.7-2.7 5.3-4 8c-3.2 3.7-6.4 6.2-11 8c-1-1-1-1-1.5-3c-2.5 1.3-4.8 2.9-7 4.5c-6.3 2.8-10.8 3.2-17.6 1c-1.3-.5-2.6-1-3.9-1.5c.2 1.2 .3 2.3 .5 3.5c-.2 .3-.3 .7-.5 1c-5.9 0-9-1.8-14-5c-3-3.5-3-3.5-3-4.5c-.7 0-1.3 0-2 0c.5 2.2 1 4.3 1.5 6.5c-.3 .3-.7 .7-1 1c-4.5-.9-7.6-3.6-11-6.5c-4-6-4-9.3-4-16.5c2.5-7.5 2.5-7.5 3.5-9.5c.3-1.7 .7-3.3 1-5c6.4-8 14.7-13 24.5-16c6.4-6.3 6.4-6.3 8.5-10.5c0-6-1.6-9.8-4.5-15c-.2-.5-.3-1-.5-1.5c-1.7-.3-3.3-.7-5-1c-1.3-.7-2.7-1.3-4-2c-5.7-1.9-10.2-.3-15.5 1.5c-10 5.5-10 5.5-13 10c-.3-.2-.3-.2-2-1c1.3-6.8 4.6-11.7 9.5-16.5c.5-.3 1-.6 1.5-1c.2-.5 .3-1 .5-1.5c-1 .1-1 .1-6 1c-.3-.4-.7-.6-1-1c.5-2 .5-2 4-6c5-2.5 5-2.5 7.5-3c0-.5 0-1 0-1.5c-10.5-1.5-18.5 1-27 7c-.5 .9-1 1.6-1.5 2.5c-.9 .6-.9 .6-5.5 4c-4 3.5-7.6 7-11 11c-4.6 3.8-8.7 6.8-14 9.5c-.7-.3-1.3-.7-2-1c.2-.7 .3-1.3 .5-2c1.8-1 3.7-2 5.5-3c5.2-4.2 9.7-8.5 14-13.5c3.1-2.8 6.2-5.5 9.5-8c1.3-1.3 2.6-2.6 4-4c5.6-3.6 10.4-6.1 17-7c.5-1 1-2 1.5-3c7.2-2.4 12.5-2.2 20-.5c.2 .1 .2 .1 1 .5c3.5 0 3.5 0 8.5-3.5c1-.5 1-.5 3-.5zM118 92.5c-1 1.2-2 2.3-3 3.5c.5 2.5 .5 2.5 3 5c1.8 .8 3.7 1.7 5.5 2.5c.5 1 .5 1 .5 4.5c-4 4.8-6.1 5-12.5 6c0 .7 0 1.3 0 2c4.7 1.5 7.7 .2 12-1.5c1.2-.7 2.3-1.3 3.5-2c1.3 .3 2.7 .7 4 1c3.5 0 3.5 0 5.5-1.5c-.2-.5-.3-1-.5-1.5c-1.7-.3-3.3-.7-5-1c-2.5-2-2.5-2-3-5.5c2-3 2-3 4-5.5c.5-3.5 .5-3.5-1.5-6.5c-4.3-2.2-8.2-1-12.5 .5zM146 58.5c5.8 1.1 8.3 3.9 12.5 8c3.7 5.9 4.4 7.3 5 14c2.8 6.2 5.4 10 10.5 14.5c5.2 5.2 7.2 10.3 9 17.5c0 3.5 0 3.5-2 11c-.2 1.3-.2 1.3-1 7.5c-3.8 10.7-3.8 10.7-8.5 13.5c-.5 .2-.5 .2-3 1c-1 1.3-2 2.7-3 4c-4.5 3-4.5 3-10.5 5c-2.7-.6-5.3-1.3-8-2c-1.7 1.2-3.3 2.3-5 3.5c-2 1-2 1-4 .5c.5-1.5 .5-1.5 6-5c.3-.3 .3-.3 2-2c2.4 0 4.9 0 7.5 0c.5 .5 1 1 1.5 1.5c4.3-.6 7.1-2.3 10.5-5c3.5-5.5 3.5-5.5 4-7c1.5 0 2.9 0 4.5 0c4.3-8.7 4.6-14 2.5-23.5c-.3-1-.7-2-1-3c.3 .1 .3 .1 2 .5c1.5 2.5 1.5 2.5 1.5 4c.5-.2 1-.3 1.5-.5c-.8-10-4.3-16-11.4-22.8c-3.7-3.8-5.5-6.9-7.6-11.7c-.7-1.5-1.5-2.9-2.3-4.4c-1.7-3.6-1.7-3.6-1.7-5.6c.3-.2 .7-.3 1-.5c-.5-3-.5-3-4.5-7c-2-1-3.9-2-6-3c-.7-.4-1.3-.6-2-1c0-.6 0-1.3 0-2zM33.5 83.5c-1 4-5.1 6.4-8 9c-8.6 8.1-14.6 17.2-15.2 29.2c.3 8.1 .3 8.1 2.2 11.8c.5 0 1 0 1.5 0c.4-2.9 .6-6 1-9c.6 0 1.3 0 2 0c.2 1.3 .4 2.7 .6 4.1c1.8 9.3 5.3 14.8 12.9 20.4c2.3 1.2 4.6 2.3 7 3.5c.7 .6 .7 .6 4.5 3.5c3.5 0 3.5 0 8.5-1.5c1 0 2 0 3 0c-1 2-1 2-2.5 3.5c-6.5 1.7-9.6 .9-16-1.5c-1.1-1-2.3-2-3.5-3c-1.5-.7-2.9-1.3-4.5-2c-3.9-3.4-6.9-6.5-9.5-11c-1.1-.5-2.3-1-3.5-1.5c-5.9-6.7-8-12.7-8-21.5c2.4-12.2 7.2-19.8 16.5-28c4.5-4 4.5-4 6-5.5c3.5-1 3.5-1 5-.5zM50.5 172c2.5 1 2.5 1 7 6.5c6 6.2 12 11.8 18.8 17.1c5.7 4.5 11.3 9.1 16.7 13.9c1.3 1.2 2.7 2.3 4 3.5c.7 .7 1.3 1.3 2 2c-.2 .8-.3 1.7-.5 2.5c-6 2.9-11.7 4-18.5 4c-2.6-2.6-4.3-5.5-5.5-9c-.3 .1-.3 .1-1.5 .5c0 2.3 0 4.6 0 7c-.3 .5-.7 1-1 1.5c-13.3 0-24.6-4.6-34.5-13.5c-4.5-4.5-4.5-4.5-8.5-11c.5-2.5 .5-2.5 4.5-7c5-3 5-3 8-3.5c.5 .3 1 .7 1.5 1c2-.5 2-.5 4-2c.9-4.2 1.7-8.3 2.5-12.5c.4-.3 .6-.7 1-1z"/><path fill="#03B5BD" d="M58.5 149.5c2.5 .5 2.5 .5 7 3.5c9.8 5.2 18.9 7.9 30 8.5c2.2 .5 4.3 1 6.5 1.5c7 0 7 0 9-.5c2.3-.2 4.6-.3 7-.5c3.2-.9 6.3-1.9 9.5-3c1.3-.2 2.7-.3 4-.5c.2 .2 .3 .3 .5 .5c-.8 6.3-4.1 10.2-8 15c-.2 .5-.3 1-.5 1.5c1.7-1 3.3-2 5-3c.7 .2 1.3 .3 2 .5c-3 12.2-9.3 20.3-17.5 29.5c-.7 .7-.7 .7-4 4.5c-1 .8-2 1.7-3 2.5c-3.5-.5-3.5-.5-8-5c-2.3-1.8-4.7-3.7-7-5.5c-2.7-2.2-5.3-4.3-8-6.5c-.8-.6-.8-.6-4.5-3.5c-11-9.3-20.7-18.8-28.5-31c3-4 3-4 8.5-8.5z"/><ellipse cx="94" cy="94" rx="6.5" ry="6.5" fill="#212E34"/><ellipse cx="135" cy="85.6" rx="6.2" ry="5.8" fill="#212E34"/><g fill="#FAF9F8"><circle cx="91.5" cy="91.5" r="2.1"/><circle cx="134.6" cy="84.3" r="2"/></g><ellipse cx="124" cy="93.8" rx="3.4" ry="1.1" fill="#9B9D9E" transform="rotate(-6 124 93.8)"/></g></g><rect x="5" y="5" width="230" height="230" rx="45" fill="none" stroke="#5B6B73" stroke-width="10"/></symbol></defs>
2
+ <rect x="1" y="1" width="958" height="370" rx="18" fill="#151D22" stroke="#34434B" stroke-width="1.5"/>
3
+ <path d="M146 115.5 152.5 115.4 158.5 115.3 163.9 115.3 168.8 115.2 173.2 115.1 177.2 115 180.9 115 184.2 114.9 187.3 114.8 190.1 114.7 192.7 114.6 195.2 114.6 197.6 114.5 200 114.4 202.4 114.3 204.8 114.2 207.3 114.2 209.9 114.1 212.7 114 215.8 113.9 219.1 113.8 222.8 113.8 226.8 113.7 231.2 113.6 236.1 113.5 241.5 113.5 247.5 113.4 254 113.3 A1.3 1.3 0 0 1 254 110.7 L254 110.7 247.5 110.6 241.5 110.5 236.1 110.5 231.2 110.4 226.8 110.3 222.8 110.2 219.1 110.2 215.8 110.1 212.7 110 209.9 109.9 207.3 109.8 204.8 109.8 202.4 109.7 200 109.6 197.6 109.5 195.2 109.4 192.7 109.4 190.1 109.3 187.3 109.2 184.2 109.1 180.9 109 177.2 109 173.2 108.9 168.8 108.8 163.9 108.7 158.5 108.7 152.5 108.6 146 108.5 A3.5 3.5 0 0 1 146 115.5Z" fill="#21BEC5"/>
4
+ <path d="M246 118L254 112L246 106" fill="none" stroke="#21BEC5" stroke-width="2.6" stroke-linecap="round" stroke-linejoin="round"/>
5
+ <path d="M326 115.5 332.5 115.4 338.3 115.3 343.6 115.3 348.2 115.2 352.4 115.1 356.1 115 359.4 115 362.4 114.9 365 114.8 367.4 114.7 369.7 114.6 371.8 114.6 373.8 114.5 375.8 114.4 377.8 114.3 379.8 114.2 382 114.2 384.4 114.1 387.1 114 390 113.9 393.2 113.8 396.9 113.8 401 113.7 405.6 113.6 410.7 113.5 416.5 113.5 422.9 113.4 430 113.3 A1.3 1.3 0 0 1 430 110.7 L430 110.7 422.9 110.6 416.5 110.5 410.7 110.5 405.6 110.4 401 110.3 396.9 110.2 393.2 110.2 390 110.1 387.1 110 384.4 109.9 382 109.8 379.8 109.8 377.8 109.7 375.8 109.6 373.8 109.5 371.8 109.4 369.7 109.4 367.4 109.3 365 109.2 362.4 109.1 359.4 109 356.1 109 352.4 108.9 348.2 108.8 343.6 108.7 338.3 108.7 332.5 108.6 326 108.5 A3.5 3.5 0 0 1 326 115.5Z" fill="#21BEC5"/>
6
+ <path d="M422 118L430 112L422 106" fill="none" stroke="#21BEC5" stroke-width="2.6" stroke-linecap="round" stroke-linejoin="round"/>
7
+ <path d="M510 115.5 515.2 115.4 520 115.3 524.5 115.3 528.7 115.2 532.6 115.1 536.3 115 539.7 115 543 114.9 546.1 114.8 549.1 114.7 552 114.6 554.8 114.6 557.5 114.5 560.2 114.4 563 114.3 565.8 114.2 568.6 114.2 571.5 114.1 574.6 114 577.8 113.9 581.2 113.8 584.7 113.8 588.5 113.7 592.6 113.6 597 113.5 601.6 113.5 606.6 113.4 612 113.3 A1.3 1.3 0 0 1 612 110.7 L612 110.7 606.6 110.6 601.6 110.5 597 110.5 592.6 110.4 588.5 110.3 584.7 110.2 581.2 110.2 577.8 110.1 574.6 110 571.5 109.9 568.6 109.8 565.8 109.8 563 109.7 560.2 109.6 557.5 109.5 554.8 109.4 552 109.4 549.1 109.3 546.1 109.2 543 109.1 539.7 109 536.3 109 532.6 108.9 528.7 108.8 524.5 108.7 520 108.7 515.2 108.6 510 108.5 A3.5 3.5 0 0 1 510 115.5Z" fill="#21BEC5"/>
8
+ <path d="M604 118L612 112L604 106" fill="none" stroke="#21BEC5" stroke-width="2.6" stroke-linecap="round" stroke-linejoin="round"/>
9
+ <path d="M854.5 151.5 853.5 160.2 850.4 167.9 845.3 175.1 838.3 181.8 829.4 188.1 818.7 193.7 806.6 198.7 793.1 203.1 778.5 206.9 762.8 209.9 746.3 212.4 729.2 214.1 711.5 215.2 693.5 215.6 675.3 215.3 657.1 214.4 639.1 212.8 621.3 210.6 604.1 207.6 587.5 204 571.7 199.7 556.8 194.8 543.1 189.2 530.7 182.9 519.8 176 510.4 168.5 502.8 160.3 497.1 151.3 A1.3 1.3 0 0 1 494.9 152.7 L494.9 152.7 500.6 161.9 508.4 170.6 518 178.5 529.1 185.7 541.7 192.3 555.6 198.1 570.6 203.3 586.5 207.7 603.3 211.6 620.7 214.7 638.6 217.1 656.8 218.9 675.1 220 693.5 220.4 711.7 220.1 729.6 219.2 747 217.6 763.7 215.3 779.7 212.3 794.7 208.6 808.6 204.3 821.3 199.2 832.5 193.4 842.2 186.8 850.2 179.4 856.3 171.1 860.1 162 861.5 152.5 A3.5 3.5 0 0 1 854.5 151.5Z" fill="#F0B455"/>
10
+ <path d="M504.9 156.5L496 152L494.2 161.8" fill="none" stroke="#F0B455" stroke-width="2.6" stroke-linecap="round" stroke-linejoin="round"/>
11
+ <path d="M444.5 153.6 443.7 161 442.6 168.3 441.4 175.4 440 182.5 438.4 189.4 436.6 196.1 434.6 202.7 432.4 209.2 429.9 215.5 427.2 221.6 424.3 227.5 421 233.2 417.6 238.7 413.8 244 409.8 249.1 405.5 254 400.9 258.6 396 262.9 390.8 267 385.2 270.9 379.3 274.4 373.1 277.7 366.5 280.7 359.5 283.4 352.2 285.7 344.5 287.7 336.4 289.4 327.8 290.7 A1.3 1.3 0 0 1 328.2 293.3 L328.2 293.3 336.8 292.1 345.1 290.6 353 288.7 360.6 286.4 367.8 283.8 374.6 280.9 381.1 277.7 387.3 274.1 393.1 270.3 398.6 266.2 403.9 261.8 408.8 257.1 413.4 252.1 417.7 247 421.7 241.5 425.4 235.9 428.9 230 432.1 224 435 217.7 437.7 211.2 440.2 204.6 442.4 197.9 444.4 190.9 446.2 183.9 447.8 176.7 449.2 169.4 450.4 161.9 451.5 154.4 A3.5 3.5 0 0 1 444.5 153.6Z" fill="#21BEC5"/>
12
+ <path d="M335.2 285.1L328 292L336.7 297" fill="none" stroke="#21BEC5" stroke-width="2.6" stroke-linecap="round" stroke-linejoin="round"/>
13
+ <path d="M254 288.5 253.2 288.6 251.7 288.7 249.6 288.7 247 288.8 243.8 288.9 240.1 289 236 289.1 231.6 289.1 226.8 289.2 221.8 289.3 216.6 289.4 211.2 289.4 205.8 289.5 200.2 289.6 194.7 289.7 189.3 289.8 184 289.8 178.8 289.9 173.9 290 169.2 290.1 164.8 290.1 160.9 290.2 157.3 290.3 154.3 290.4 151.8 290.5 149.9 290.5 148.6 290.6 148 290.7 A1.3 1.3 0 0 1 148 293.3 L148 293.3 148.6 293.4 149.9 293.5 151.8 293.5 154.3 293.6 157.3 293.7 160.9 293.8 164.8 293.9 169.2 293.9 173.9 294 178.8 294.1 184 294.2 189.3 294.2 194.7 294.3 200.2 294.4 205.8 294.5 211.2 294.6 216.6 294.6 221.8 294.7 226.8 294.8 231.6 294.9 236 294.9 240.1 295 243.8 295.1 247 295.2 249.6 295.3 251.7 295.3 253.2 295.4 254 295.5 A3.5 3.5 0 0 1 254 288.5Z" fill="#21BEC5"/>
14
+ <path d="M156 286L148 292L156 298" fill="none" stroke="#21BEC5" stroke-width="2.6" stroke-linecap="round" stroke-linejoin="round"/>
15
+ <ellipse cx="110" cy="146.0" rx="32.0" ry="3.5" fill="#BCC5CA" opacity="0.12"/>
16
+ <ellipse cx="290" cy="146.0" rx="32.0" ry="3.5" fill="#BCC5CA" opacity="0.12"/>
17
+ <ellipse cx="290" cy="326.0" rx="32.0" ry="3.5" fill="#BCC5CA" opacity="0.12"/>
18
+ <ellipse cx="110" cy="326.0" rx="32.0" ry="3.5" fill="#BCC5CA" opacity="0.12"/>
19
+ <ellipse cx="470" cy="150" rx="38" ry="4" fill="#BCC5CA" opacity="0.12"/>
20
+ <rect x="82" y="84" width="56" height="56" rx="11.2" fill="#212E34" stroke="#5B6B73" stroke-width="2.2"/>
21
+ <path d="M101 107a12 12 0 0 0 16 16z" fill="#21BEC5"/><path d="M108 115l7-7" stroke="#21BEC5" stroke-width="2.4" stroke-linecap="round"/><path d="M113 100a10 10 0 0 1 10 10" fill="none" stroke="#21BEC5" stroke-width="2.4" stroke-linecap="round"/>
22
+ <rect x="262" y="84" width="56" height="56" rx="11.2" fill="#212E34" stroke="#5B6B73" stroke-width="2.2"/>
23
+ <circle cx="284" cy="112" r="5.5" fill="#21BEC5"/><g fill="none" stroke="#21BEC5" stroke-width="3" stroke-linecap="round"><path d="M292 103a12 12 0 0 1 0 18"/><path d="M299 97a20 20 0 0 1 0 30"/></g>
24
+ <use href="#jack" x="438" y="80" width="64" height="64"/>
25
+ <rect x="262" y="264" width="56" height="56" rx="11.2" fill="#212E34" stroke="#5B6B73" stroke-width="2.2"/>
26
+ <circle cx="290" cy="285" r="7.5" fill="#FAF9F8"/><path d="M277 308a13 12 0 0 1 26 0z" fill="#FAF9F8"/>
27
+ <rect x="82" y="264" width="56" height="56" rx="11.2" fill="#212E34" stroke="#5B6B73" stroke-width="2.2"/><circle cx="110" cy="292" r="10.6" fill="#21BEC5"/>
28
+ <rect x="620" y="74.0" width="290" height="76" rx="12" fill="#1B252B" stroke="#2E3B42" stroke-width="1.5"/>
29
+ <text x="638" y="102" class="s" font-size="14" fill="#E6EDF3" font-weight="700">Waiting for you</text>
30
+ <text x="638" y="126" class="m" font-size="13" fill="#9B9D9E">Error log · Checkout: …</text>
31
+ <text x="892" y="126" class="m" font-size="13" fill="#F0B455" font-weight="700" text-anchor="end">[ask]</text>
32
+ <text x="110" y="164" class="s" font-size="15" fill="#E6EDF3" font-weight="700" text-anchor="middle">Source</text>
33
+ <text x="110" y="182" class="s" font-size="12.5" fill="#9B9D9E" text-anchor="middle">ticket, error log,</text>
34
+ <text x="110" y="199" class="s" font-size="12.5" fill="#9B9D9E" text-anchor="middle">status page</text>
35
+ <text x="290" y="164" class="m" font-size="14" fill="#E6EDF3" font-weight="700" text-anchor="middle">jh watch</text>
36
+ <text x="470" y="174" class="s" font-size="15" fill="#E6EDF3" font-weight="700" text-anchor="middle">Jack</text>
37
+ <text x="290" y="344" class="s" font-size="15" fill="#E6EDF3" font-weight="700" text-anchor="middle">You</text>
38
+ <text x="110" y="344" class="s" font-size="15" fill="#E6EDF3" font-weight="700" text-anchor="middle">Lane</text>
39
+ <text x="200" y="90" class="s" font-size="12.5" fill="#9B9D9E" text-anchor="middle">new or changed</text>
40
+ <text x="200" y="106" class="s" font-size="12.5" fill="#9B9D9E" text-anchor="middle">entry</text>
41
+ <text x="380" y="90" class="m" font-size="12" fill="#9B9D9E" text-anchor="middle">=== source …</text>
42
+ <text x="380" y="106" class="s" font-size="12.5" fill="#9B9D9E" text-anchor="middle">report</text>
43
+ <text x="548" y="90" class="s" font-size="12.5" fill="#9B9D9E" text-anchor="middle">board row,</text>
44
+ <text x="548" y="106" class="s" font-size="12.5" fill="#9B9D9E" text-anchor="middle">origin = source</text>
45
+ <text x="660" y="252" class="m" font-size="13" fill="#F0B455" font-weight="700" text-anchor="middle">[ask]</text>
46
+ <text x="425" y="236" class="s" font-size="12.5" fill="#9B9D9E" text-anchor="end">asks you,</text>
47
+ <text x="200" y="278" class="s" font-size="12.5" fill="#9B9D9E" text-anchor="middle">then a lane works it</text>
48
+ </svg>
@@ -0,0 +1,48 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="960" height="372" viewBox="0 0 960 372" role="img" aria-labelledby="t d"><title id="t">How a source reaches you</title><desc id="d">A source (a ticket, an error log or a status page) has a new or changed entry. jh watch reads it and reports it to Jack, who puts a row into Waiting for you on the board; the row starts with the source's label, for example Error log, Checkout. The [ask] button on the row makes Jack ask you about it, and once you have answered, a lane works it.</desc><defs><style>.s{font-family:ui-sans-serif, system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif}.m{font-family:ui-monospace, SFMono-Regular, Menlo, Consolas, 'Liberation Mono', monospace}</style><clipPath id="jack-clip"><rect width="240" height="240" rx="50"/></clipPath><symbol id="jack" viewBox="0 0 240 240"><rect width="240" height="240" rx="50" fill="#212E34"/><g clip-path="url(#jack-clip)"><g transform="translate(34 8)"><path fill="#4A4E51" d="M80 50.5c.2 .1 .2 .1 1 1c-.2 .6-.3 1.3-.5 2c-.7 .4-.7 .4-4 2c-6 3.3-6 3.3-7 6.5c1.2-.4 2.3-.6 3.5-1c.8 0 1.7 0 2.5 0c.2 .1 .2 .1 1 1c-.5 2-.5 2-5.5 6.5c-3 5-3 5-5.5 11c.2 .3 .2 .3 1 2c.2 .3 .3 .7 .5 1c-.7 .7-1.3 1.3-2 2c-1.3-.2-2.6-.3-4-.5c0-1.2 0-2.3 0-3.5c-.2 .1-.2 .1-1.5 .5c-1.2 2.7-2.4 5.3-3.5 8c-1 2.1-2 4.2-3 6.3c-2.5 5.7-2.5 5.7-3 8.2c.5 0 1 0 1.5 0c.1-.8 .4-1.7 .5-2.5c.6 0 1.3 0 2 0c.5 2 1 3.9 1.6 6c1 4 2.2 8 3.4 11.9c2.1 8.4 1.1 15.5-3 23.1c-.6-.2-1.3-.3-2-.5c-.1-1.5-.3-3-.5-4.6c-.3-2.6-.5-5.2-1-7.9c-.5 0-1 0-1.5 0c-.1 1.7-.4 3.3-.5 5c-2.7 10.2-2.7 10.2-6 13.5c-6.1-3.1-9-14.9-11-21c-1.1-8.2 .9-14.7 3.5-22.5c-8.4 8.3-8.3 20.5-9 31.5c-.6-.2-1.3-.3-2-.5c-5.4-8.9-5.1-15-3-25c.5-1 1-2 1.5-3c-3 1.5-3 1.5-6.5 5c-.4 0-.6 0-1 0c.8-6.5 3.2-10.2 7.5-15c.6-.8 .6-.8 3.5-5c2.6-2.6 5.2-5.1 8-7.5c.6-.6 .6-.6 3.5-3.5c-.5-2-.5-2-1-3.5c3.6-6 6.5-9.2 12.5-13c.4-.6 .6-1.3 1-2c-.5-.6-1-1.3-1.5-2c2-3 2-3 4.5-4.5c.5 1 .5 1 1 3.5c2.5-1 2.5-1 8.5-5.5c.3 0 .7 0 1 0c-.1-.4-.1-.4-.5-2.5c4.3-3.3 10-2.5 15-1zM153 69.5c1.2 .2 2.3 .3 3.5 .5c.3 .7 .7 1.3 1 2c.3 0 .7 0 1 0c.5 1.2 1 2.3 1.5 3.5c3.4 7.6 6.2 13.7 12.2 19.6c3.3 3.4 3.3 3.4 3.8 5.9c-.2 .2-.3 .3-.5 .5c.1 .7 .1 .7 .5 4.5c-.5 .3-1 .7-1.5 1c-.8-.3-1.7-.7-2.5-1c.3 .7 .7 1.3 1 2c1.2 5.8 1.4 10 1 16c-.7 0-1.3 0-2 0c-.4-1.3-.8-2.7-1.3-4.1c-2.1-6.1-5.2-11.4-8.7-16.9c-.2-.8-.2-.8-1.5-5c-.3-.6-.3-.6-2.1-3.5c-1.9-3.5-1.9-3.5-2.9-8.5c.7 0 1.3 0 2 0c.5 .5 1 1 1.5 1.5c-.8-2.3-1.7-4.6-2.5-7c-.7-2-1.3-4-2-6c-.7-1-1.3-2-2-3c.2-.7 .3-1.3 .5-2zM86.5 100.5c1 0 2 0 3 0c1.3 .8 2.7 1.7 4 2.5c-2.5 2.5-2.5 2.5-8 5.5c-5.5 4.3-8.6 7-10 14c-.8 2.2-1.7 4.3-2.5 6.5c-1.2 4.6-.5 9.3 0 14c-.5 0-1 0-1.5 0c-.2 2-.3 3.9-.5 6c-.7 0-1.3 0-2 0c-.3-.6-.3-.6-2-3.5c-1-.8-2-1.7-3-2.5c-.5-1.5-.5-1.5 1.5-8.5c.3-10.3-1-18.2-4-28c0-4 0-4 1-6c2 2 2 2 3 6.5c2.5-.5 2.5-.5 8-4c9.8-3.5 9.8-3.5 13-2.5zM43 161.5c2.5 2.5 2.5 2.5 3 5c-1.5 2.5-1.5 2.5-4 5c.5 3.5 .5 3.5 4 6.5c-.1 1.2-.4 2.3-.5 3.5c-5.3 3.5-5.3 3.5-8.5 3.5c-6-2.5-6-2.5-11.5-7c0-3 0-3 4-8c9.5-8.5 9.5-8.5 13.5-8.5z"/><path fill="#9B9D9E" d="M142.5 60.5c.5 1 .5 1-.5 4.5c1.2 1.5 2.3 3 3.5 4.5c2 4.5 2 4.5 2.5 9.5c-.5 .2-1 .3-1.5 .5c-.1 .2-.1 .2-.5 1c-2-1-3.9-2-6-3c-.8-.3-1.7-.7-2.5-1c-.3-.7-.7-1.3-1-2c.3-.5 .7-1 1-1.5c-.2-.7-.3-1.3-.5-2c-3.5 .5-3.5 .5-7.5 4c-.5 3-.5 3 0 5.5c-2 4-2 4-3.5 5.5c-.3 0-.7 0-1 0c0 .7 0 1.3 0 2c-2-1-2-1-2.5-2.5c.3-13.7 .3-13.7 4.8-18.5c4.1-3.9 6.3-4.8 11.7-6c1-.5 1-.5 3.5-.5zM98 70.5c.5 .3 1 .7 1.5 1c1.3 .3 2.7 .7 4 1c4.4 5.8 6.5 10.3 6.5 17.5c-2 2-2 2-5 2.5c-.3 .2-.3 .2-2 1c-.2-.2-.2-.2-1.5-1c.5-3 .5-3 1-5c-.7-.8-1.3-1.7-2-2.5c-.2-1.7-.3-3.3-.5-5c-4.5-2.7-8.5-3-13.5-2.5c-.1 .3-.1 .3-.5 1.5c1.3 .8 2.7 1.7 4 2.5c-.1 .4-.1 .4-.5 2.5c-2.3 1.2-4.6 2.3-7 3.5c-5.5 5.5-5.5 5.5-6.5 7c0 .5 0 1 0 1.5c.9-.1 .9-.1 5.5-.5c1 1.3 2 2.7 3 4c-.2 .5-.3 1-.5 1.5c-1.7 .5-3.2 1-5 1.6c-5.5 1.9-5.5 1.9-11 5.4c-.4 .1-.4 .1-2.5 .5c-1.5-1.5-1.5-1.5-2.5-6c-.4-.3-.6-.7-1-1c0-6.7 .9-11.7 3-18c.2-.6 .2-.6 1-3.5c7.8-9.7 20.5-14.1 32-9.5z"/><path fill="#FAF9F8" d="M103.5 40c0 .4 0 .6 0 1c2.2-.1 4.3-.4 6.5-.5c7 0 7 0 9.5 1c-.2 .6-.3 1.3-.5 2c-1.8 .6-3.7 1.3-5.5 2c-.2 .5-.3 1-.5 1.5c.7-.1 1.3-.4 2-.5c13.4-.3 13.4-.3 19.5 3.5c-.3 .6-.7 1.3-1 2c-1 0-2 0-3 0c0 .5 0 1 0 1.5c1.2 .1 1.2 .1 7 .5c3.5 2 3.5 2 5.5 4.5c0 1 0 2 0 3c-3.3 .9-6.7 1.6-10 2.5c-7.5 5-7.5 5-8.5 9c-.3 4.5-.4 9-.5 13.5c1.5 1 1.5 1 7.5 2.5c.9 .6 .9 .6 5.5 3.5c2 1 2 1 9 2.5c7.9 4 11.3 8.3 15 16.5c0 .5 0 1 0 1.5c-1 .2-2 .3-3 .5c.5 1.8 1 3.7 1.5 5.5c.3 8.5-.8 13.6-6 20.5c-.7-.2-1.3-.3-2-.5c0-1.7 0-3.3 0-5c-.7 .2-1.3 .3-2 .5c-1.3 2.7-2.7 5.3-4 8c-3.2 3.7-6.4 6.2-11 8c-1-1-1-1-1.5-3c-2.5 1.3-4.8 2.9-7 4.5c-6.3 2.8-10.8 3.2-17.6 1c-1.3-.5-2.6-1-3.9-1.5c.2 1.2 .3 2.3 .5 3.5c-.2 .3-.3 .7-.5 1c-5.9 0-9-1.8-14-5c-3-3.5-3-3.5-3-4.5c-.7 0-1.3 0-2 0c.5 2.2 1 4.3 1.5 6.5c-.3 .3-.7 .7-1 1c-4.5-.9-7.6-3.6-11-6.5c-4-6-4-9.3-4-16.5c2.5-7.5 2.5-7.5 3.5-9.5c.3-1.7 .7-3.3 1-5c6.4-8 14.7-13 24.5-16c6.4-6.3 6.4-6.3 8.5-10.5c0-6-1.6-9.8-4.5-15c-.2-.5-.3-1-.5-1.5c-1.7-.3-3.3-.7-5-1c-1.3-.7-2.7-1.3-4-2c-5.7-1.9-10.2-.3-15.5 1.5c-10 5.5-10 5.5-13 10c-.3-.2-.3-.2-2-1c1.3-6.8 4.6-11.7 9.5-16.5c.5-.3 1-.6 1.5-1c.2-.5 .3-1 .5-1.5c-1 .1-1 .1-6 1c-.3-.4-.7-.6-1-1c.5-2 .5-2 4-6c5-2.5 5-2.5 7.5-3c0-.5 0-1 0-1.5c-10.5-1.5-18.5 1-27 7c-.5 .9-1 1.6-1.5 2.5c-.9 .6-.9 .6-5.5 4c-4 3.5-7.6 7-11 11c-4.6 3.8-8.7 6.8-14 9.5c-.7-.3-1.3-.7-2-1c.2-.7 .3-1.3 .5-2c1.8-1 3.7-2 5.5-3c5.2-4.2 9.7-8.5 14-13.5c3.1-2.8 6.2-5.5 9.5-8c1.3-1.3 2.6-2.6 4-4c5.6-3.6 10.4-6.1 17-7c.5-1 1-2 1.5-3c7.2-2.4 12.5-2.2 20-.5c.2 .1 .2 .1 1 .5c3.5 0 3.5 0 8.5-3.5c1-.5 1-.5 3-.5zM118 92.5c-1 1.2-2 2.3-3 3.5c.5 2.5 .5 2.5 3 5c1.8 .8 3.7 1.7 5.5 2.5c.5 1 .5 1 .5 4.5c-4 4.8-6.1 5-12.5 6c0 .7 0 1.3 0 2c4.7 1.5 7.7 .2 12-1.5c1.2-.7 2.3-1.3 3.5-2c1.3 .3 2.7 .7 4 1c3.5 0 3.5 0 5.5-1.5c-.2-.5-.3-1-.5-1.5c-1.7-.3-3.3-.7-5-1c-2.5-2-2.5-2-3-5.5c2-3 2-3 4-5.5c.5-3.5 .5-3.5-1.5-6.5c-4.3-2.2-8.2-1-12.5 .5zM146 58.5c5.8 1.1 8.3 3.9 12.5 8c3.7 5.9 4.4 7.3 5 14c2.8 6.2 5.4 10 10.5 14.5c5.2 5.2 7.2 10.3 9 17.5c0 3.5 0 3.5-2 11c-.2 1.3-.2 1.3-1 7.5c-3.8 10.7-3.8 10.7-8.5 13.5c-.5 .2-.5 .2-3 1c-1 1.3-2 2.7-3 4c-4.5 3-4.5 3-10.5 5c-2.7-.6-5.3-1.3-8-2c-1.7 1.2-3.3 2.3-5 3.5c-2 1-2 1-4 .5c.5-1.5 .5-1.5 6-5c.3-.3 .3-.3 2-2c2.4 0 4.9 0 7.5 0c.5 .5 1 1 1.5 1.5c4.3-.6 7.1-2.3 10.5-5c3.5-5.5 3.5-5.5 4-7c1.5 0 2.9 0 4.5 0c4.3-8.7 4.6-14 2.5-23.5c-.3-1-.7-2-1-3c.3 .1 .3 .1 2 .5c1.5 2.5 1.5 2.5 1.5 4c.5-.2 1-.3 1.5-.5c-.8-10-4.3-16-11.4-22.8c-3.7-3.8-5.5-6.9-7.6-11.7c-.7-1.5-1.5-2.9-2.3-4.4c-1.7-3.6-1.7-3.6-1.7-5.6c.3-.2 .7-.3 1-.5c-.5-3-.5-3-4.5-7c-2-1-3.9-2-6-3c-.7-.4-1.3-.6-2-1c0-.6 0-1.3 0-2zM33.5 83.5c-1 4-5.1 6.4-8 9c-8.6 8.1-14.6 17.2-15.2 29.2c.3 8.1 .3 8.1 2.2 11.8c.5 0 1 0 1.5 0c.4-2.9 .6-6 1-9c.6 0 1.3 0 2 0c.2 1.3 .4 2.7 .6 4.1c1.8 9.3 5.3 14.8 12.9 20.4c2.3 1.2 4.6 2.3 7 3.5c.7 .6 .7 .6 4.5 3.5c3.5 0 3.5 0 8.5-1.5c1 0 2 0 3 0c-1 2-1 2-2.5 3.5c-6.5 1.7-9.6 .9-16-1.5c-1.1-1-2.3-2-3.5-3c-1.5-.7-2.9-1.3-4.5-2c-3.9-3.4-6.9-6.5-9.5-11c-1.1-.5-2.3-1-3.5-1.5c-5.9-6.7-8-12.7-8-21.5c2.4-12.2 7.2-19.8 16.5-28c4.5-4 4.5-4 6-5.5c3.5-1 3.5-1 5-.5zM50.5 172c2.5 1 2.5 1 7 6.5c6 6.2 12 11.8 18.8 17.1c5.7 4.5 11.3 9.1 16.7 13.9c1.3 1.2 2.7 2.3 4 3.5c.7 .7 1.3 1.3 2 2c-.2 .8-.3 1.7-.5 2.5c-6 2.9-11.7 4-18.5 4c-2.6-2.6-4.3-5.5-5.5-9c-.3 .1-.3 .1-1.5 .5c0 2.3 0 4.6 0 7c-.3 .5-.7 1-1 1.5c-13.3 0-24.6-4.6-34.5-13.5c-4.5-4.5-4.5-4.5-8.5-11c.5-2.5 .5-2.5 4.5-7c5-3 5-3 8-3.5c.5 .3 1 .7 1.5 1c2-.5 2-.5 4-2c.9-4.2 1.7-8.3 2.5-12.5c.4-.3 .6-.7 1-1z"/><path fill="#03B5BD" d="M58.5 149.5c2.5 .5 2.5 .5 7 3.5c9.8 5.2 18.9 7.9 30 8.5c2.2 .5 4.3 1 6.5 1.5c7 0 7 0 9-.5c2.3-.2 4.6-.3 7-.5c3.2-.9 6.3-1.9 9.5-3c1.3-.2 2.7-.3 4-.5c.2 .2 .3 .3 .5 .5c-.8 6.3-4.1 10.2-8 15c-.2 .5-.3 1-.5 1.5c1.7-1 3.3-2 5-3c.7 .2 1.3 .3 2 .5c-3 12.2-9.3 20.3-17.5 29.5c-.7 .7-.7 .7-4 4.5c-1 .8-2 1.7-3 2.5c-3.5-.5-3.5-.5-8-5c-2.3-1.8-4.7-3.7-7-5.5c-2.7-2.2-5.3-4.3-8-6.5c-.8-.6-.8-.6-4.5-3.5c-11-9.3-20.7-18.8-28.5-31c3-4 3-4 8.5-8.5z"/><ellipse cx="94" cy="94" rx="6.5" ry="6.5" fill="#212E34"/><ellipse cx="135" cy="85.6" rx="6.2" ry="5.8" fill="#212E34"/><g fill="#FAF9F8"><circle cx="91.5" cy="91.5" r="2.1"/><circle cx="134.6" cy="84.3" r="2"/></g><ellipse cx="124" cy="93.8" rx="3.4" ry="1.1" fill="#9B9D9E" transform="rotate(-6 124 93.8)"/></g></g><rect x="5" y="5" width="230" height="230" rx="45" fill="none"/></symbol></defs>
2
+ <rect x="1" y="1" width="958" height="370" rx="18" fill="#FAF9F8" stroke="#C4CBCE" stroke-width="1.5"/>
3
+ <path d="M146 115.5 152.5 115.4 158.5 115.3 163.9 115.3 168.8 115.2 173.2 115.1 177.2 115 180.9 115 184.2 114.9 187.3 114.8 190.1 114.7 192.7 114.6 195.2 114.6 197.6 114.5 200 114.4 202.4 114.3 204.8 114.2 207.3 114.2 209.9 114.1 212.7 114 215.8 113.9 219.1 113.8 222.8 113.8 226.8 113.7 231.2 113.6 236.1 113.5 241.5 113.5 247.5 113.4 254 113.3 A1.3 1.3 0 0 1 254 110.7 L254 110.7 247.5 110.6 241.5 110.5 236.1 110.5 231.2 110.4 226.8 110.3 222.8 110.2 219.1 110.2 215.8 110.1 212.7 110 209.9 109.9 207.3 109.8 204.8 109.8 202.4 109.7 200 109.6 197.6 109.5 195.2 109.4 192.7 109.4 190.1 109.3 187.3 109.2 184.2 109.1 180.9 109 177.2 109 173.2 108.9 168.8 108.8 163.9 108.7 158.5 108.7 152.5 108.6 146 108.5 A3.5 3.5 0 0 1 146 115.5Z" fill="#03B5BD"/>
4
+ <path d="M246 118L254 112L246 106" fill="none" stroke="#03B5BD" stroke-width="2.6" stroke-linecap="round" stroke-linejoin="round"/>
5
+ <path d="M326 115.5 332.5 115.4 338.3 115.3 343.6 115.3 348.2 115.2 352.4 115.1 356.1 115 359.4 115 362.4 114.9 365 114.8 367.4 114.7 369.7 114.6 371.8 114.6 373.8 114.5 375.8 114.4 377.8 114.3 379.8 114.2 382 114.2 384.4 114.1 387.1 114 390 113.9 393.2 113.8 396.9 113.8 401 113.7 405.6 113.6 410.7 113.5 416.5 113.5 422.9 113.4 430 113.3 A1.3 1.3 0 0 1 430 110.7 L430 110.7 422.9 110.6 416.5 110.5 410.7 110.5 405.6 110.4 401 110.3 396.9 110.2 393.2 110.2 390 110.1 387.1 110 384.4 109.9 382 109.8 379.8 109.8 377.8 109.7 375.8 109.6 373.8 109.5 371.8 109.4 369.7 109.4 367.4 109.3 365 109.2 362.4 109.1 359.4 109 356.1 109 352.4 108.9 348.2 108.8 343.6 108.7 338.3 108.7 332.5 108.6 326 108.5 A3.5 3.5 0 0 1 326 115.5Z" fill="#03B5BD"/>
6
+ <path d="M422 118L430 112L422 106" fill="none" stroke="#03B5BD" stroke-width="2.6" stroke-linecap="round" stroke-linejoin="round"/>
7
+ <path d="M510 115.5 515.2 115.4 520 115.3 524.5 115.3 528.7 115.2 532.6 115.1 536.3 115 539.7 115 543 114.9 546.1 114.8 549.1 114.7 552 114.6 554.8 114.6 557.5 114.5 560.2 114.4 563 114.3 565.8 114.2 568.6 114.2 571.5 114.1 574.6 114 577.8 113.9 581.2 113.8 584.7 113.8 588.5 113.7 592.6 113.6 597 113.5 601.6 113.5 606.6 113.4 612 113.3 A1.3 1.3 0 0 1 612 110.7 L612 110.7 606.6 110.6 601.6 110.5 597 110.5 592.6 110.4 588.5 110.3 584.7 110.2 581.2 110.2 577.8 110.1 574.6 110 571.5 109.9 568.6 109.8 565.8 109.8 563 109.7 560.2 109.6 557.5 109.5 554.8 109.4 552 109.4 549.1 109.3 546.1 109.2 543 109.1 539.7 109 536.3 109 532.6 108.9 528.7 108.8 524.5 108.7 520 108.7 515.2 108.6 510 108.5 A3.5 3.5 0 0 1 510 115.5Z" fill="#03B5BD"/>
8
+ <path d="M604 118L612 112L604 106" fill="none" stroke="#03B5BD" stroke-width="2.6" stroke-linecap="round" stroke-linejoin="round"/>
9
+ <path d="M854.5 151.5 853.5 160.2 850.4 167.9 845.3 175.1 838.3 181.8 829.4 188.1 818.7 193.7 806.6 198.7 793.1 203.1 778.5 206.9 762.8 209.9 746.3 212.4 729.2 214.1 711.5 215.2 693.5 215.6 675.3 215.3 657.1 214.4 639.1 212.8 621.3 210.6 604.1 207.6 587.5 204 571.7 199.7 556.8 194.8 543.1 189.2 530.7 182.9 519.8 176 510.4 168.5 502.8 160.3 497.1 151.3 A1.3 1.3 0 0 1 494.9 152.7 L494.9 152.7 500.6 161.9 508.4 170.6 518 178.5 529.1 185.7 541.7 192.3 555.6 198.1 570.6 203.3 586.5 207.7 603.3 211.6 620.7 214.7 638.6 217.1 656.8 218.9 675.1 220 693.5 220.4 711.7 220.1 729.6 219.2 747 217.6 763.7 215.3 779.7 212.3 794.7 208.6 808.6 204.3 821.3 199.2 832.5 193.4 842.2 186.8 850.2 179.4 856.3 171.1 860.1 162 861.5 152.5 A3.5 3.5 0 0 1 854.5 151.5Z" fill="#E8A33D"/>
10
+ <path d="M504.9 156.5L496 152L494.2 161.8" fill="none" stroke="#E8A33D" stroke-width="2.6" stroke-linecap="round" stroke-linejoin="round"/>
11
+ <path d="M444.5 153.6 443.7 161 442.6 168.3 441.4 175.4 440 182.5 438.4 189.4 436.6 196.1 434.6 202.7 432.4 209.2 429.9 215.5 427.2 221.6 424.3 227.5 421 233.2 417.6 238.7 413.8 244 409.8 249.1 405.5 254 400.9 258.6 396 262.9 390.8 267 385.2 270.9 379.3 274.4 373.1 277.7 366.5 280.7 359.5 283.4 352.2 285.7 344.5 287.7 336.4 289.4 327.8 290.7 A1.3 1.3 0 0 1 328.2 293.3 L328.2 293.3 336.8 292.1 345.1 290.6 353 288.7 360.6 286.4 367.8 283.8 374.6 280.9 381.1 277.7 387.3 274.1 393.1 270.3 398.6 266.2 403.9 261.8 408.8 257.1 413.4 252.1 417.7 247 421.7 241.5 425.4 235.9 428.9 230 432.1 224 435 217.7 437.7 211.2 440.2 204.6 442.4 197.9 444.4 190.9 446.2 183.9 447.8 176.7 449.2 169.4 450.4 161.9 451.5 154.4 A3.5 3.5 0 0 1 444.5 153.6Z" fill="#03B5BD"/>
12
+ <path d="M335.2 285.1L328 292L336.7 297" fill="none" stroke="#03B5BD" stroke-width="2.6" stroke-linecap="round" stroke-linejoin="round"/>
13
+ <path d="M254 288.5 253.2 288.6 251.7 288.7 249.6 288.7 247 288.8 243.8 288.9 240.1 289 236 289.1 231.6 289.1 226.8 289.2 221.8 289.3 216.6 289.4 211.2 289.4 205.8 289.5 200.2 289.6 194.7 289.7 189.3 289.8 184 289.8 178.8 289.9 173.9 290 169.2 290.1 164.8 290.1 160.9 290.2 157.3 290.3 154.3 290.4 151.8 290.5 149.9 290.5 148.6 290.6 148 290.7 A1.3 1.3 0 0 1 148 293.3 L148 293.3 148.6 293.4 149.9 293.5 151.8 293.5 154.3 293.6 157.3 293.7 160.9 293.8 164.8 293.9 169.2 293.9 173.9 294 178.8 294.1 184 294.2 189.3 294.2 194.7 294.3 200.2 294.4 205.8 294.5 211.2 294.6 216.6 294.6 221.8 294.7 226.8 294.8 231.6 294.9 236 294.9 240.1 295 243.8 295.1 247 295.2 249.6 295.3 251.7 295.3 253.2 295.4 254 295.5 A3.5 3.5 0 0 1 254 288.5Z" fill="#03B5BD"/>
14
+ <path d="M156 286L148 292L156 298" fill="none" stroke="#03B5BD" stroke-width="2.6" stroke-linecap="round" stroke-linejoin="round"/>
15
+ <ellipse cx="110" cy="146.0" rx="32.0" ry="3.5" fill="#BCC5CA" opacity="0.55"/>
16
+ <ellipse cx="290" cy="146.0" rx="32.0" ry="3.5" fill="#BCC5CA" opacity="0.55"/>
17
+ <ellipse cx="290" cy="326.0" rx="32.0" ry="3.5" fill="#BCC5CA" opacity="0.55"/>
18
+ <ellipse cx="110" cy="326.0" rx="32.0" ry="3.5" fill="#BCC5CA" opacity="0.55"/>
19
+ <ellipse cx="470" cy="150" rx="38" ry="4" fill="#BCC5CA" opacity="0.55"/>
20
+ <rect x="82" y="84" width="56" height="56" rx="11.2" fill="#212E34"/>
21
+ <path d="M101 107a12 12 0 0 0 16 16z" fill="#03B5BD"/><path d="M108 115l7-7" stroke="#03B5BD" stroke-width="2.4" stroke-linecap="round"/><path d="M113 100a10 10 0 0 1 10 10" fill="none" stroke="#03B5BD" stroke-width="2.4" stroke-linecap="round"/>
22
+ <rect x="262" y="84" width="56" height="56" rx="11.2" fill="#212E34"/>
23
+ <circle cx="284" cy="112" r="5.5" fill="#03B5BD"/><g fill="none" stroke="#03B5BD" stroke-width="3" stroke-linecap="round"><path d="M292 103a12 12 0 0 1 0 18"/><path d="M299 97a20 20 0 0 1 0 30"/></g>
24
+ <use href="#jack" x="438" y="80" width="64" height="64"/>
25
+ <rect x="262" y="264" width="56" height="56" rx="11.2" fill="#212E34"/>
26
+ <circle cx="290" cy="285" r="7.5" fill="#FAF9F8"/><path d="M277 308a13 12 0 0 1 26 0z" fill="#FAF9F8"/>
27
+ <rect x="82" y="264" width="56" height="56" rx="11.2" fill="#212E34"/><circle cx="110" cy="292" r="10.6" fill="#03B5BD"/>
28
+ <rect x="620" y="74.0" width="290" height="76" rx="12" fill="#FFFFFF" stroke="#DDE2E4" stroke-width="1.5"/>
29
+ <text x="638" y="102" class="s" font-size="14" fill="#212E34" font-weight="700">Waiting for you</text>
30
+ <text x="638" y="126" class="m" font-size="13" fill="#4A4E51">Error log · Checkout: …</text>
31
+ <text x="892" y="126" class="m" font-size="13" fill="#9A5A00" font-weight="700" text-anchor="end">[ask]</text>
32
+ <text x="110" y="164" class="s" font-size="15" fill="#212E34" font-weight="700" text-anchor="middle">Source</text>
33
+ <text x="110" y="182" class="s" font-size="12.5" fill="#4A4E51" text-anchor="middle">ticket, error log,</text>
34
+ <text x="110" y="199" class="s" font-size="12.5" fill="#4A4E51" text-anchor="middle">status page</text>
35
+ <text x="290" y="164" class="m" font-size="14" fill="#212E34" font-weight="700" text-anchor="middle">jh watch</text>
36
+ <text x="470" y="174" class="s" font-size="15" fill="#212E34" font-weight="700" text-anchor="middle">Jack</text>
37
+ <text x="290" y="344" class="s" font-size="15" fill="#212E34" font-weight="700" text-anchor="middle">You</text>
38
+ <text x="110" y="344" class="s" font-size="15" fill="#212E34" font-weight="700" text-anchor="middle">Lane</text>
39
+ <text x="200" y="90" class="s" font-size="12.5" fill="#4A4E51" text-anchor="middle">new or changed</text>
40
+ <text x="200" y="106" class="s" font-size="12.5" fill="#4A4E51" text-anchor="middle">entry</text>
41
+ <text x="380" y="90" class="m" font-size="12" fill="#4A4E51" text-anchor="middle">=== source …</text>
42
+ <text x="380" y="106" class="s" font-size="12.5" fill="#4A4E51" text-anchor="middle">report</text>
43
+ <text x="548" y="90" class="s" font-size="12.5" fill="#4A4E51" text-anchor="middle">board row,</text>
44
+ <text x="548" y="106" class="s" font-size="12.5" fill="#4A4E51" text-anchor="middle">origin = source</text>
45
+ <text x="660" y="252" class="m" font-size="13" fill="#9A5A00" font-weight="700" text-anchor="middle">[ask]</text>
46
+ <text x="425" y="236" class="s" font-size="12.5" fill="#4A4E51" text-anchor="end">asks you,</text>
47
+ <text x="200" y="278" class="s" font-size="12.5" fill="#4A4E51" text-anchor="middle">then a lane works it</text>
48
+ </svg>