<?xml version="1.0"?>
<puzzles xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://www.0pdd.com/puzzles.xsd" date="2024-02-13T09:25:34+00:00" version="BUILD">
  <puzzle alive="false">
    <issue href="https://github.com/tracehubpm/tracehub/issues/2" closed="2024-01-17T12:10:12+00:00">2</issue>
    <ticket>1</ticket>
    <estimate>60</estimate>
    <role>DEV</role>
    <id>1-24aad16a</id>
    <lines>8-11</lines>
    <body>Create release script to rultor configuration. We should create release script that will be executed by Rultor.com. Probably it can be a release inside the GitHub with a new tag, and build+push Docker image to the private Docker registry.</body>
    <file>.rultor.yml</file>
    <author>@h1alexbel</author>
    <email>hialexbel@gmail.com</email>
    <time>2024-01-12T08:46:18Z</time>
    <children>
      <puzzle alive="false">
        <issue href="https://github.com/tracehubpm/tracehub/issues/35" closed="2024-01-17T16:09:44+00:00">35</issue>
        <ticket>2</ticket>
        <estimate>45</estimate>
        <role>DEV</role>
        <id>2-57925dc8</id>
        <lines>69-72</lines>
        <body>Make a JUnit extension that won't run tests if request quota in GitHub is exceeded. Then we can enable this and other tests that are depending on real GitHub API. Don't forget to remove this puzzle.</body>
        <file>src/test/java/git/tracehub/agents/github/GhContentTest.java</file>
        <author>Aliaksei Bialiauski</author>
        <email>aliaksei.bialiauski@hey.com</email>
        <time>2024-01-17T12:09:58Z</time>
        <children/>
      </puzzle>
    </children>
  </puzzle>
  <puzzle alive="true">
    <issue href="https://github.com/tracehubpm/tracehub/issues/3">3</issue>
    <ticket>1</ticket>
    <estimate>90</estimate>
    <role>DEV</role>
    <id>1-e54979ee</id>
    <lines>15-18</lines>
    <body>Create deploy script for rultor configuration. We should create deploy script that will deliver our Java software into some target platform. For now, we assuming that it will be Cloud VM with public IP, and SSH connection.</body>
    <file>.rultor.yml</file>
    <author>@h1alexbel</author>
    <email>hialexbel@gmail.com</email>
    <time>2024-01-12T08:46:18Z</time>
    <children/>
  </puzzle>
  <puzzle alive="true">
    <issue href="https://github.com/tracehubpm/tracehub/issues/4">4</issue>
    <ticket>1</ticket>
    <estimate>30</estimate>
    <role>DEV</role>
    <id>1-a3e1623b</id>
    <lines>214-217</lines>
    <body>Remove exclusion of dependency check. Now have a skeleton and most of packages are not used. We should enable that check as soon as we can. Don't forget to remove this puzzle.</body>
    <file>pom.xml</file>
    <author>@h1alexbel</author>
    <email>hialexbel@gmail.com</email>
    <time>2024-01-12T10:14:00Z</time>
    <children/>
  </puzzle>
  <puzzle alive="false">
    <issue href="https://github.com/tracehubpm/tracehub/issues/6" closed="2024-01-30T16:51:52+00:00">6</issue>
    <ticket>1</ticket>
    <estimate>45</estimate>
    <role>DEV</role>
    <id>1-c1c9eddd</id>
    <lines>41-44</lines>
    <body>Schedule Invites#exec in the background. We should schedule GitHub invitations accepting to run it in the background while application is running. Don't forget to remove this puzzle.</body>
    <file>src/main/java/git/tracehub/agents/github/Invites.java</file>
    <author>@h1alexbel</author>
    <email>hialexbel@gmail.com</email>
    <time>2024-01-12T13:42:43Z</time>
    <children/>
  </puzzle>
  <puzzle alive="false">
    <issue href="https://github.com/tracehubpm/tracehub/issues/7" closed="2024-01-30T16:51:57+00:00">7</issue>
    <ticket>1</ticket>
    <estimate>25</estimate>
    <role>DEV</role>
    <id>1-482f85d4</id>
    <lines>78-80</lines>
    <body>Resolve private method with invite accepting. Let's create a new class instead of this #accept() private method. Don't forget to remove this puzzle.</body>
    <file>src/main/java/git/tracehub/agents/github/Invites.java</file>
    <author>@h1alexbel</author>
    <email>hialexbel@gmail.com</email>
    <time>2024-01-12T13:42:43Z</time>
    <children/>
  </puzzle>
  <puzzle alive="false">
    <issue href="https://github.com/tracehubpm/tracehub/issues/10" closed="2024-01-15T15:45:04+00:00">10</issue>
    <ticket>8</ticket>
    <estimate>30</estimate>
    <role>DEV</role>
    <id>8-f9140706</id>
    <lines>34-38</lines>
    <body>Redesign Job interface. Instead of extending from Text interface, lets define methods that describe project as a model, take a look here: https://github.com/tracehubpm/tracehub?tab=readme-ov-file#how-to-configure. For now lets a few attributes to it, to keep it simple: label, description, and cost.</body>
    <file>src/main/java/git/tracehub/Job.java</file>
    <author>h1alexbel</author>
    <email>hialexbel@gmail.com</email>
    <time>2024-01-15T10:14:09Z</time>
    <children>
      <puzzle alive="false">
        <issue href="https://github.com/tracehubpm/tracehub/issues/14" closed="2024-01-16T12:31:47+00:00">14</issue>
        <ticket>10</ticket>
        <estimate>25</estimate>
        <role>DEV</role>
        <id>10-0d6bf654</id>
        <lines>37-41</lines>
        <body>Return total minutes in GhJob#cost(). We should return total minutes instead of String value. For instance, 20 mins will be equal to 20, and 1h 20 mins will be equal to 60 + 20 =&gt; 80 minutes. In this case we also should rename method to GhJob#minutes().</body>
        <file>src/main/java/git/tracehub/agents/github/GhJob.java</file>
        <author>@h1alexbel</author>
        <email>hialexbel@gmail.com</email>
        <time>2024-01-15T15:38:04Z</time>
        <children/>
      </puzzle>
      <puzzle alive="false">
        <issue href="https://github.com/tracehubpm/tracehub/issues/15" closed="2024-01-22T13:09:21+00:00">15</issue>
        <ticket>10</ticket>
        <estimate>60</estimate>
        <role>DEV</role>
        <id>10-e7c3a7d3</id>
        <lines>42-47</lines>
        <body>YAML Job document validation. We should validate all incoming job documents. probably we should have some sort of schema. Alternatively we can transform YAML into XML with attached XSD schema to it. Don't forget to remove this puzzle.</body>
        <file>src/main/java/git/tracehub/agents/github/GhJob.java</file>
        <author>h1alexbel</author>
        <email>hialexbel@gmail.com</email>
        <time>2024-01-15T15:38:04Z</time>
        <children>
          <puzzle alive="false">
            <issue href="https://github.com/tracehubpm/tracehub/issues/64" closed="2024-02-13T06:10:38+00:00">64</issue>
            <ticket>15</ticket>
            <estimate>90</estimate>
            <role>DEV</role>
            <id>15-f28517eb</id>
            <lines>61-64</lines>
            <body>Apply validations on the Job. We should apply validations on the Job. For now we should wait for vsheets sheets for Jobs. Don't forget to remove this puzzle.</body>
            <file>src/main/java/git/tracehub/agents/github/issues/GhNew.java</file>
            <author>Aliaksei Bialiauski</author>
            <email>aliaksei.bialiauski@hey.com</email>
            <time>2024-01-22T13:09:09Z</time>
            <children>
              <puzzle alive="true">
                <issue href="https://github.com/tracehubpm/tracehub/issues/156">156</issue>
                <ticket>64</ticket>
                <estimate>45</estimate>
                <role>DEV</role>
                <id>64-195131f6</id>
                <lines>66-69</lines>
                <body>Post found job validation errors somewhere. We should post found errors in job by validation pipeline. Ideally the destination should be GitHub commit, or maybe pull request, where it was discovered.</body>
                <file>src/main/java/git/tracehub/agents/github/issues/GhNew.java</file>
                <author>Aliaksei Bialiauski</author>
                <email>aliaksei.bialiauski@hey.com</email>
                <time>2024-02-12T09:48:35Z</time>
                <children/>
              </puzzle>
              <puzzle alive="true">
                <issue href="https://github.com/tracehubpm/tracehub/issues/157">157</issue>
                <ticket>64</ticket>
                <estimate>35</estimate>
                <role>DEV</role>
                <id>64-d03b3996</id>
                <lines>55-57</lines>
                <body>Check the job creation if there is no backlog rules. We should validate job even there is no backlog:rules in project.yml. Depends on this &lt;a href="https://github.com/tracehubpm/tracehub/issues/116"&gt;one&lt;/a&gt;.</body>
                <file>src/test/java/git/tracehub/agents/github/issues/GhNewTest.java</file>
                <author>Aliaksei Bialiauski</author>
                <email>aliaksei.bialiauski@hey.com</email>
                <time>2024-02-12T09:48:35Z</time>
                <children/>
              </puzzle>
              <puzzle alive="true">
                <issue href="https://github.com/tracehubpm/tracehub/issues/158">158</issue>
                <ticket>64</ticket>
                <estimate>30</estimate>
                <role>DEV</role>
                <id>64-7c372c5f</id>
                <lines>50-52</lines>
                <body>Test case for invalid job. We should test case when invalid job was submitted (so validation failed). Don't forget to remove this puzzle.</body>
                <file>src/test/java/it/TkGitHubITCase.java</file>
                <author>Aliaksei Bialiauski</author>
                <email>aliaksei.bialiauski@hey.com</email>
                <time>2024-02-12T09:48:35Z</time>
                <children/>
              </puzzle>
            </children>
          </puzzle>
          <puzzle alive="false">
            <issue href="https://github.com/tracehubpm/tracehub/issues/65" closed="2024-01-24T10:55:30+00:00">65</issue>
            <ticket>15</ticket>
            <estimate>90</estimate>
            <role>DEV</role>
            <id>15-2952ddf6</id>
            <lines>67-69</lines>
            <body>Fetch all XSL sheets from vsheets repo. We should fetch all XSL sheets into list with possibility to exclude some of them. Don't forget to remove this puzzle.</body>
            <file>src/main/java/git/tracehub/tk/TkGitHub.java</file>
            <author>Aliaksei Bialiauski</author>
            <email>aliaksei.bialiauski@hey.com</email>
            <time>2024-01-22T13:09:09Z</time>
            <children>
              <puzzle alive="false">
                <issue href="https://github.com/tracehubpm/tracehub/issues/82" closed="2024-01-31T13:46:49+00:00">82</issue>
                <ticket>65</ticket>
                <estimate>60</estimate>
                <role>DEV</role>
                <id>65-27372e03</id>
                <lines>33-36</lines>
                <body>Fetch excluded warnings. We need to fetch all excluded warnings from project.yml. Firstly we should wait for warnings.xsl to be released by vsheets. Only then we can include this logic into GhProject.</body>
                <file>src/main/java/git/tracehub/Project.java</file>
                <author>@h1alexbel</author>
                <email>aliaksei.bialiauski@hey.com</email>
                <time>2024-01-24T10:55:17Z</time>
                <children>
                  <puzzle alive="true">
                    <issue href="https://github.com/tracehubpm/tracehub/issues/119">119</issue>
                    <ticket>82</ticket>
                    <estimate>30</estimate>
                    <role>DEV</role>
                    <id>82-6656af0e</id>
                    <lines>46-49</lines>
                    <body>Resolve code duplication in preparing project. We should resolve code duplication inside blocks where we setup MkGithub, each time and the same. We should consider creating JUnit extension for this configuration and similar.</body>
                    <file>src/test/java/git/tracehub/tk/TkGitHubTest.java</file>
                    <author>rultor</author>
                    <email>me@rultor.com</email>
                    <time>2024-01-31T13:44:46Z</time>
                    <children/>
                  </puzzle>
                  <puzzle alive="true">
                    <issue href="https://github.com/tracehubpm/tracehub/issues/120">120</issue>
                    <ticket>82</ticket>
                    <estimate>25</estimate>
                    <role>DEV</role>
                    <id>82-1e75badf</id>
                    <lines>99-103</lines>
                    <body>Do not throw exception if Project ID is NULL. We should turn this into an error (inside {@link git.tracehub.validation.ProjectValidation}) and add it after {@link XsErrors}. But not crash a program. For now {@link git.tracehub.agents.github.GhProject} terminates the execution since project.identity() is NULL.</body>
                    <file>src/test/java/git/tracehub/tk/TkGitHubTest.java</file>
                    <author>rultor</author>
                    <email>me@rultor.com</email>
                    <time>2024-01-31T13:44:46Z</time>
                    <children/>
                  </puzzle>
                  <puzzle alive="true">
                    <issue href="https://github.com/tracehubpm/tracehub/issues/121">121</issue>
                    <ticket>82</ticket>
                    <estimate>30</estimate>
                    <role>DEV</role>
                    <id>82-00a66205</id>
                    <lines>193-195</lines>
                    <body>Enable this test after warnings will be implemented. Take a look at &lt;a href="https://github.com/tracehubpm/tracehub/issues/44"&gt;this&lt;/a&gt; issue. Don't forget to remove this puzzle.</body>
                    <file>src/test/java/git/tracehub/tk/TkGitHubTest.java</file>
                    <author>rultor</author>
                    <email>me@rultor.com</email>
                    <time>2024-01-31T13:44:46Z</time>
                    <children/>
                  </puzzle>
                </children>
              </puzzle>
              <puzzle alive="true">
                <issue href="https://github.com/tracehubpm/tracehub/issues/83">83</issue>
                <ticket>65</ticket>
                <estimate>45</estimate>
                <role>DEV</role>
                <id>65-fdeb36cc</id>
                <lines>48-51</lines>
                <body>Implement CdRemote decorator. Lets cache remote requests to raw.githubusercontent.com. To prevent latency and some response failure problems. Its not urgent, but crucial in general.</body>
                <file>src/main/java/git/tracehub/validation/Remote.java</file>
                <author>Aliaksei Bialiauski</author>
                <email>aliaksei.bialiauski@hey.com</email>
                <time>2024-01-24T10:55:17Z</time>
                <children/>
              </puzzle>
            </children>
          </puzzle>
          <puzzle alive="false">
            <issue href="https://github.com/tracehubpm/tracehub/issues/66" closed="2024-01-25T09:53:45+00:00">66</issue>
            <ticket>15</ticket>
            <estimate>30</estimate>
            <role>DEV</role>
            <id>15-92cf651f</id>
            <lines>70-73</lines>
            <body>Clean up procedural code. We should clean up the code inside TkGitHub. Validation with XeErrors must be handled outside of this Take. The same with response construction.</body>
            <file>src/main/java/git/tracehub/tk/TkGitHub.java</file>
            <author>Aliaksei Bialiauski</author>
            <email>aliaksei.bialiauski@hey.com</email>
            <time>2024-01-22T13:09:09Z</time>
            <children>
              <puzzle alive="true">
                <issue href="https://github.com/tracehubpm/tracehub/issues/95">95</issue>
                <ticket>66</ticket>
                <estimate>45</estimate>
                <role>DEV</role>
                <id>66-9afb701a</id>
                <lines>40-43</lines>
                <body>Compose validations together and format all the problems together. We should compose all validation errors together after checking project, jobs, docs and so on.</body>
                <file>src/main/java/git/tracehub/tk/ErrorsCase.java</file>
                <author>Aliaksei Bialiauski</author>
                <email>aliaksei.bialiauski@hey.com</email>
                <time>2024-01-25T09:53:32Z</time>
                <children/>
              </puzzle>
              <puzzle alive="false">
                <issue href="https://github.com/tracehubpm/tracehub/issues/96" closed="2024-01-29T14:03:29+00:00">96</issue>
                <ticket>66</ticket>
                <estimate>60</estimate>
                <role>DEV</role>
                <id>66-cb577791</id>
                <lines>66-69</lines>
                <body>Fetch the target place for jobs from project.yml. We should fetch the target place (JIRA, GitHub), basically where we will create/update/delete our jobs. Now we just hard-coding GitHub. We should fix that.</body>
                <file>src/main/java/git/tracehub/tk/TkGitHub.java</file>
                <author>Aliaksei Bialiauski</author>
                <email>aliaksei.bialiauski@hey.com</email>
                <time>2024-01-25T09:53:32Z</time>
                <children>
                  <puzzle alive="true">
                    <issue href="https://github.com/tracehubpm/tracehub/issues/104">104</issue>
                    <ticket>96</ticket>
                    <estimate>45</estimate>
                    <role>DEV</role>
                    <id>96-2d15a255</id>
                    <lines>66-69</lines>
                    <body>Resolve code complexity with appending responses to StringBuilder. We should remove that complexity required to append strings to StringBuilder we pass between objects. Lets make it more simple. Don't forget to remove this puzzle.</body>
                    <file>src/main/java/git/tracehub/tk/TkGitHub.java</file>
                    <author>Aliaksei Bialiauski</author>
                    <email>aliaksei.bialiauski@hey.com</email>
                    <time>2024-01-29T14:03:12Z</time>
                    <children/>
                  </puzzle>
                  <puzzle alive="false">
                    <issue href="https://github.com/tracehubpm/tracehub/issues/105" closed="2024-02-05T10:36:17+00:00">105</issue>
                    <ticket>96</ticket>
                    <estimate>60</estimate>
                    <role>DEV</role>
                    <id>96-88118785</id>
                    <lines>70-73</lines>
                    <body>Adopt a support for multiple webhook types in TkGitHub. We should adopt TkGitHub to handle multiple webhook types. For now lets start with push event (currently supported and processed), issue_comment_created, issue_created.</body>
                    <file>src/main/java/git/tracehub/tk/TkGitHub.java</file>
                    <author>Aliaksei Bialiauski</author>
                    <email>aliaksei.bialiauski@hey.com</email>
                    <time>2024-01-29T14:03:12Z</time>
                    <children>
                      <puzzle alive="false">
                        <issue href="https://github.com/tracehubpm/tracehub/issues/142" closed="2024-02-05T11:25:45+00:00">142</issue>
                        <ticket>105</ticket>
                        <estimate>30</estimate>
                        <role>DEV</role>
                        <id>105-943e1410</id>
                        <lines>89-92</lines>
                        <body>Map event codes and objects to execute. We should map all event codes: `push`, `opened`, `labeled`, and etc. with objects that will execute that events (OnPush, OnNew, OnAttachedLabel, and so on).</body>
                        <file>src/main/java/git/tracehub/tk/TkGitHub.java</file>
                        <author>rultor</author>
                        <email>me@rultor.com</email>
                        <time>2024-02-05T10:34:09Z</time>
                        <children>
                          <puzzle alive="true">
                            <issue href="https://github.com/tracehubpm/tracehub/issues/144">144</issue>
                            <ticket>142</ticket>
                            <estimate>60</estimate>
                            <role>DEV</role>
                            <id>142-5968df0f</id>
                            <lines>39-43</lines>
                            <body>Implement dynamic object addition into a map. We should implement dynamic object addition into map with event codes and related objects. Probably we will need to read mapping sheet in some data format (JSON, XML, YAML, etc.), and dynamically fill the objects for each event.</body>
                            <file>src/main/java/git/tracehub/agents/github/HookMap.java</file>
                            <author>@rultor</author>
                            <email>me@rultor.com</email>
                            <time>2024-02-05T11:23:59Z</time>
                            <children/>
                          </puzzle>
                        </children>
                      </puzzle>
                    </children>
                  </puzzle>
                  <puzzle alive="true">
                    <issue href="https://github.com/tracehubpm/tracehub/issues/106">106</issue>
                    <ticket>96</ticket>
                    <estimate>60</estimate>
                    <role>DEV</role>
                    <id>96-3a7877e7</id>
                    <lines>35-40</lines>
                    <body>Instantiate Project that located in GitLab. We should create a Project object (GbProject.java) that located in GitLab. Lets do it similar to {@link git.tracehub.agents.github.GhProject}. During this ticket, probably you should resolve code duplication in order to keep objects in sync with DRY principle. Don't forget to remove this puzzle.</body>
                    <file>src/main/java/git/tracehub/tk/TkGitLab.java</file>
                    <author>Aliaksei Bialiauski</author>
                    <email>aliaksei.bialiauski@hey.com</email>
                    <time>2024-01-29T14:03:12Z</time>
                    <children/>
                  </puzzle>
                </children>
              </puzzle>
            </children>
          </puzzle>
          <puzzle alive="true">
            <issue href="https://github.com/tracehubpm/tracehub/issues/67">67</issue>
            <ticket>15</ticket>
            <estimate>45</estimate>
            <role>DEV</role>
            <id>15-2414bbb8</id>
            <lines>74-76</lines>
            <body>Create a comment on the head commit with errors. Instead of sending errors as webhook result, we should create a comment on a head commit from hook we got.</body>
            <file>src/main/java/git/tracehub/tk/TkGitHub.java</file>
            <author>Aliaksei Bialiauski</author>
            <email>aliaksei.bialiauski@hey.com</email>
            <time>2024-01-22T13:09:09Z</time>
            <children/>
          </puzzle>
          <puzzle alive="false">
            <issue href="https://github.com/tracehubpm/tracehub/issues/68" closed="2024-01-24T10:55:33+00:00">68</issue>
            <ticket>15</ticket>
            <estimate>30</estimate>
            <role>DEV</role>
            <id>15-4347abac</id>
            <lines>26-29</lines>
            <body>Get rid of XSL resources inside tracehub repo. All resources from /validation package should be transferred into new repo. We should get rid of XSL sheets here, after they will be stored in different repository. Don't forget to remove this puzzle</body>
            <file>src/main/resources/git/tracehub/validation/arc.xsl</file>
            <author>Aliaksei Bialiauski</author>
            <email>aliaksei.bialiauski@hey.com</email>
            <time>2024-01-22T13:09:09Z</time>
            <children/>
          </puzzle>
          <puzzle alive="false">
            <issue href="https://github.com/tracehubpm/tracehub/issues/69" closed="2024-01-25T09:53:48+00:00">69</issue>
            <ticket>15</ticket>
            <estimate>45</estimate>
            <role>DEV</role>
            <id>15-a7c26bea</id>
            <lines>44-47</lines>
            <body>Fix formatting in response with an errors. We should fix formatting in response that contains validation errors. Now it just inlines them. However, we should print them with a new line. Don't forget to remove this puzzle.</body>
            <file>src/test/java/it/TkGitHubITCase.java</file>
            <author>Aliaksei Bialiauski</author>
            <email>aliaksei.bialiauski@hey.com</email>
            <time>2024-01-22T13:09:09Z</time>
            <children>
              <puzzle alive="true">
                <issue href="https://github.com/tracehubpm/tracehub/issues/97">97</issue>
                <ticket>69</ticket>
                <estimate>25</estimate>
                <role>DEV</role>
                <id>69-0f550a7c</id>
                <lines>38-42</lines>
                <body>Log root sheets only in DEBUG mode. We should log only non-root sheets like project/*, jobs/*, docs/* and so on. Those sheets that are located just inside xsl, must be excluded, since they are used for constructing output XML only.</body>
                <file>src/main/java/git/tracehub/validation/XsApplied.java</file>
                <author>Aliaksei Bialiauski</author>
                <email>aliaksei.bialiauski@hey.com</email>
                <time>2024-01-25T09:53:32Z</time>
                <children/>
              </puzzle>
            </children>
          </puzzle>
        </children>
      </puzzle>
    </children>
  </puzzle>
  <puzzle alive="false">
    <issue href="https://github.com/tracehubpm/tracehub/issues/11" closed="2024-01-18T13:20:13+00:00">11</issue>
    <ticket>8</ticket>
    <estimate>45</estimate>
    <role>DEV</role>
    <id>8-d35523ae</id>
    <lines>33-38</lines>
    <body>Redesign Project interface. Instead of extending from Text interface, lets define methods that describe project as a model, take a look here: https://github.com/tracehubpm/tracehub?tab=readme-ov-file#how-to-configure. For now lets a few attributes to it, to keep it simple: id, name, description, active or not, JSON/XML of all performers, JSON/XML of all dependencies.</body>
    <file>src/main/java/git/tracehub/Project.java</file>
    <author>h1alexbel</author>
    <email>hialexbel@gmail.com</email>
    <time>2024-01-15T10:14:09Z</time>
    <children>
      <puzzle alive="false">
        <issue href="https://github.com/tracehubpm/tracehub/issues/38" closed="2024-01-19T09:59:40+00:00">38</issue>
        <ticket>11</ticket>
        <estimate>90</estimate>
        <role>DEV</role>
        <id>11-8c21cd6f</id>
        <lines>38-44</lines>
        <body>Transform YAML document into XML. For now we are working and parsing YAML directly, however, its not the best case for dynamic validation, since we need a lot of imperative and verbose checks. Lets convert the YAML doc of the project into XML document. Any check will be presented as XSL sheet and probably an XSD schema for strict format we will introduce.</body>
        <file>src/main/java/git/tracehub/agents/github/GhProject.java</file>
        <author>@rultor</author>
        <email>me@rultor.com</email>
        <time>2024-01-18T13:18:47Z</time>
        <children>
          <puzzle alive="false">
            <issue href="https://github.com/tracehubpm/tracehub/issues/46" closed="2024-01-26T09:41:29+00:00">46</issue>
            <ticket>38</ticket>
            <estimate>25</estimate>
            <role>DEV</role>
            <id>38-854498b9</id>
            <lines>310-314</lines>
            <body>Resolve code duplication with Project providing. We should resolve a code duplication for a project providing in tests. Possible some JUnit extension/Argument provider that will provide us a projects by list of path we feed to it. Don't forget to remove this puzzle.</body>
            <file>src/test/java/git/tracehub/agents/github/GhProjectTest.java</file>
            <author>rultor</author>
            <email>me@rultor.com</email>
            <time>2024-01-19T09:58:15Z</time>
            <children>
              <puzzle alive="true">
                <issue href="https://github.com/tracehubpm/tracehub/issues/99">99</issue>
                <ticket>46</ticket>
                <estimate>25</estimate>
                <role>DEV</role>
                <id>46-a14eaed6</id>
                <lines>39-41</lines>
                <body>Make a JUnit extension out of LocalProject. Lets make a JUnit extension with local GitHub project.yml setup. Don't forget to remove this puzzle.</body>
                <file>src/test/java/git/tracehub/extensions/LocalGhProject.java</file>
                <author>rultor</author>
                <email>me@rultor.com</email>
                <time>2024-01-26T09:38:37Z</time>
                <children/>
              </puzzle>
            </children>
          </puzzle>
        </children>
      </puzzle>
      <puzzle alive="false">
        <issue href="https://github.com/tracehubpm/tracehub/issues/39" closed="2024-01-22T13:09:26+00:00">39</issue>
        <ticket>11</ticket>
        <estimate>45</estimate>
        <role>DEV</role>
        <id>11-5dbe60a7</id>
        <lines>357-360</lines>
        <body>Extract this PoC to a validating objects. We should extract this proof of concept, where we are getting YAML document, converting it into XML, applying XSL sheets, and checking the result of validation.</body>
        <file>src/test/java/git/tracehub/agents/github/GhProjectTest.java</file>
        <author>rultor</author>
        <email>me@rultor.com</email>
        <time>2024-01-18T13:18:47Z</time>
        <children/>
      </puzzle>
    </children>
  </puzzle>
  <puzzle alive="false">
    <issue href="https://github.com/tracehubpm/tracehub/issues/17" closed="2024-01-15T19:56:07+00:00">17</issue>
    <ticket>8</ticket>
    <estimate>45</estimate>
    <role>DEV</role>
    <id>8-34436e68</id>
    <lines>102-106</lines>
    <body>Exclude duplicates in Composed. We should exclude duplicates when composing commit. I think we can remove it from latest position where it was found and append to new corresponding place. Don't forget to remove this puzzle.</body>
    <file>src/test/java/git/tracehub/agents/github/ComposedTest.java</file>
    <author>h1alexbel</author>
    <email>hialexbel@gmail.com</email>
    <time>2024-01-15T18:16:35Z</time>
    <children>
      <puzzle alive="true">
        <issue href="https://github.com/tracehubpm/tracehub/issues/19">19</issue>
        <ticket>17</ticket>
        <estimate>45</estimate>
        <role>DEV</role>
        <id>17-e4983716</id>
        <lines>76-78</lines>
        <body>Resolve code duplication and extract method parts. We should introduce more manageable pieces out of this method. Don't forget to remove this puzzle.</body>
        <file>src/main/java/git/tracehub/agents/github/Composed.java</file>
        <author>@h1alexbel</author>
        <email>hialexbel@gmail.com</email>
        <time>2024-01-15T19:47:15Z</time>
        <children/>
      </puzzle>
    </children>
  </puzzle>
  <puzzle alive="true">
    <issue href="https://github.com/tracehubpm/tracehub/issues/24">24</issue>
    <ticket>22</ticket>
    <estimate>25</estimate>
    <role>DEV</role>
    <id>22-48a12d84</id>
    <lines>93-96</lines>
    <body>Throw custom validation exception after applying validations. This puzzle can be resolved probably after GhJob will be empowered with XSD schema/validation decorator. Don't forget to remove this puzzle.</body>
    <file>src/test/java/git/tracehub/agents/github/GhJobTest.java</file>
    <author>h1alexbel</author>
    <email>hialexbel@gmail.com</email>
    <time>2024-01-16T12:24:01Z</time>
    <children/>
  </puzzle>
  <puzzle alive="false">
    <issue href="https://github.com/tracehubpm/tracehub/issues/25" closed="2024-01-21T11:08:33+00:00">25</issue>
    <ticket>22</ticket>
    <estimate>60</estimate>
    <role>DEV</role>
    <id>22-82dc0ed8</id>
    <lines>37-41</lines>
    <body>Create test with push webhook JSON payload. We should create an integration test for push GitHub webhook with it payload. Probably we need to configure Takes so that it will start accepting JSON payloads on /github/hook. Don't forget to remove this puzzle.</body>
    <file>src/test/java/it/TkGitHubITCase.java</file>
    <author>h1alexbel</author>
    <email>hialexbel@gmail.com</email>
    <time>2024-01-16T12:24:01Z</time>
    <children>
      <puzzle alive="false">
        <issue href="https://github.com/tracehubpm/tracehub/issues/53" closed="2024-01-23T08:03:14+00:00">53</issue>
        <ticket>25</ticket>
        <estimate>20</estimate>
        <role>DEV</role>
        <id>25-e442b194</id>
        <lines>37-41</lines>
        <body>verify compatibility with Docker environment variables. After replacing System#getEnv() to System#getProperty() for setting properties during integration build with github, we probably can break ENV settings during docker run. We should double check that. Don't forget to remove this puzzle.</body>
        <file>src/main/java/git/tracehub/identity/GhIdentity.java</file>
        <author>Aliaksei Bialiauski</author>
        <email>aliaksei.bialiauski@hey.com</email>
        <time>2024-01-21T11:08:20Z</time>
        <children/>
      </puzzle>
      <puzzle alive="true">
        <issue href="https://github.com/tracehubpm/tracehub/issues/54">54</issue>
        <ticket>25</ticket>
        <estimate>45</estimate>
        <role>DEV</role>
        <id>25-4e6eed3b</id>
        <lines>51-53</lines>
        <body>Test error.html.vm template. We should test that error page can be rendered and shown to the end-users with a exception stacktrace.</body>
        <file>src/main/java/git/tracehub/tk/FtApp.java</file>
        <author>Aliaksei Bialiauski</author>
        <email>aliaksei.bialiauski@hey.com</email>
        <time>2024-01-21T11:08:20Z</time>
        <children/>
      </puzzle>
      <puzzle alive="true">
        <issue href="https://github.com/tracehubpm/tracehub/issues/55">55</issue>
        <ticket>25</ticket>
        <estimate>45</estimate>
        <role>DEV</role>
        <id>25-21b1c2b5</id>
        <lines>47-51</lines>
        <body>Return the result of webhook. Instead of thanks for webhook, I believe we should return a result of sent webhook. A number of created issues, closed, and other info. Don't forget to create an integration test and remove this puzzle.</body>
        <file>src/main/java/git/tracehub/tk/TkGitHub.java</file>
        <author>Aliaksei Bialiauski</author>
        <email>aliaksei.bialiauski@hey.com</email>
        <time>2024-01-21T11:08:20Z</time>
        <children/>
      </puzzle>
      <puzzle alive="true">
        <issue href="https://github.com/tracehubpm/tracehub/issues/56">56</issue>
        <ticket>25</ticket>
        <estimate>90</estimate>
        <role>DEV</role>
        <id>25-c7ca1a65</id>
        <lines>52-57</lines>
        <body>Implement branching after receiving commits. As we discussed &lt;a href="https://github.com/tracehubpm/tracehub/issues/32"&gt;here&lt;/a&gt; and &lt;a href="https://github.com/tracehubpm/tracehub/issues/33"&gt;here&lt;/a&gt;, we should branch our TraceLogged commits into ThJobs, ThJobs into created, updated and deleted. We should make it as much generic as possible, since we aim to process all kinds of GitHub webhooks using Takes.</body>
        <file>src/main/java/git/tracehub/tk/TkGitHub.java</file>
        <author>Aliaksei Bialiauski</author>
        <email>aliaksei.bialiauski@hey.com</email>
        <time>2024-01-21T11:08:20Z</time>
        <children>
          <puzzle alive="true">
            <issue href="https://github.com/tracehubpm/tracehub/issues/93">93</issue>
            <ticket>56</ticket>
            <estimate>25</estimate>
            <role>DEV</role>
            <id>56-0746b68a</id>
            <lines>349-351</lines>
            <body>Setup publishing the diagrams in README. We should automatically add this diagram that was generated by plantuml-generator-maven-plugin into README on each build.</body>
            <file>pom.xml</file>
            <author>rultor</author>
            <email>me@rultor.com</email>
            <time>2024-01-25T07:35:34Z</time>
            <children/>
          </puzzle>
        </children>
      </puzzle>
      <puzzle alive="false">
        <issue href="https://github.com/tracehubpm/tracehub/issues/57" closed="2024-01-26T10:01:03+00:00">57</issue>
        <ticket>25</ticket>
        <estimate>60</estimate>
        <role>DEV</role>
        <id>25-ff666611</id>
        <lines>45-48</lines>
        <body>Introduce unit test for {@link TkGitHub}. We should create a simple, maintainable unit test. For now it can't be done, since {@link MkGithub} does not have configuration from JSON webhook we accepting.</body>
        <file>src/test/java/git/tracehub/tk/TkGitHubTest.java</file>
        <author>Aliaksei Bialiauski</author>
        <email>aliaksei.bialiauski@hey.com</email>
        <time>2024-01-21T11:08:20Z</time>
        <children/>
      </puzzle>
      <puzzle alive="true">
        <issue href="https://github.com/tracehubpm/tracehub/issues/59">59</issue>
        <ticket>25</ticket>
        <estimate>45</estimate>
        <role>DEV</role>
        <id>25-00ff0ddf</id>
        <lines>54-57</lines>
        <body>Test fallbacks. We should test all fallbacks we have in both: unit and integration tests. Don't forget to remove this puzzle.</body>
        <file>src/main/java/git/tracehub/tk/FtApp.java</file>
        <author>h1alexbel</author>
        <email>hialexbel@gmail.com</email>
        <time>2024-01-21T11:15:10Z</time>
        <children/>
      </puzzle>
    </children>
  </puzzle>
  <puzzle alive="false">
    <issue href="https://github.com/tracehubpm/tracehub/issues/29" closed="2024-01-29T14:03:33+00:00">29</issue>
    <ticket>26</ticket>
    <estimate>30</estimate>
    <role>DEV</role>
    <id>26-3dfe9030</id>
    <lines>92-97</lines>
    <body>Resolve code duplication in tests. We should create a reusable code structures for contribution inside GitHub repositories (both mock and real). \@Before code block in JUnit is not an option. Code duplication should be resolved in GhNewTest.java also. Don't forget to remove this puzzle.</body>
    <file>src/test/java/git/tracehub/agents/github/GhContentTest.java</file>
    <author>h1alexbel</author>
    <email>hialexbel@gmail.com</email>
    <time>2024-01-16T15:03:57Z</time>
    <children/>
  </puzzle>
  <puzzle alive="true">
    <issue href="https://github.com/tracehubpm/tracehub/issues/31">31</issue>
    <ticket>28</ticket>
    <estimate>60</estimate>
    <role>DEV</role>
    <id>28-2edfc6d0</id>
    <lines>42-46</lines>
    <body>Submit created tickets to a PMO. We should submit it directly to a PMO on each issue we created. Probably an input will be an issue number, repo, and full file path. For now can be postponed. We should prepare PMO for that firstly. Don't forget to remove this puzzle.</body>
    <file>src/main/java/git/tracehub/agents/github/issues/GhNew.java</file>
    <author>h1alexbel</author>
    <email>hialexbel@gmail.com</email>
    <time>2024-01-17T10:14:52Z</time>
    <children/>
  </puzzle>
  <puzzle alive="true">
    <issue href="https://github.com/tracehubpm/tracehub/issues/32">32</issue>
    <ticket>28</ticket>
    <estimate>60</estimate>
    <role>DEV</role>
    <id>28-279f9206</id>
    <lines>47-53</lines>
    <body>Implement GhClose.java. We should implement a logic for closing a GitHub issue for each deleted file in ThJobs#deleted(). As described above we need to reach out to PMO. PMO will provide us the issue number by the full path of deleted job. We should get the issue and close it in GitHub. Don't forget to remove this puzzle.</body>
    <file>src/main/java/git/tracehub/agents/github/issues/GhNew.java</file>
    <author>h1alexbel</author>
    <email>hialexbel@gmail.com</email>
    <time>2024-01-17T10:14:52Z</time>
    <children/>
  </puzzle>
  <puzzle alive="true">
    <issue href="https://github.com/tracehubpm/tracehub/issues/33">33</issue>
    <ticket>28</ticket>
    <estimate>60</estimate>
    <role>DEV</role>
    <id>28-51cbc0d2</id>
    <lines>54-58</lines>
    <body>Implement GhUpdate.java. We should implement a logic for updating for each updated files in ThJobs#updated(). We provide a full path of updated job to PMO, PMO gets us an issue number. From there, probably we should post a comment to that issue that things gets an update.</body>
    <file>src/main/java/git/tracehub/agents/github/issues/GhNew.java</file>
    <author>h1alexbel</author>
    <email>hialexbel@gmail.com</email>
    <time>2024-01-17T10:14:52Z</time>
    <children/>
  </puzzle>
  <puzzle alive="true">
    <issue href="https://github.com/tracehubpm/tracehub/issues/49">49</issue>
    <ticket>41</ticket>
    <estimate>60</estimate>
    <role>DEV</role>
    <id>41-2b5c36d8</id>
    <lines>41-45</lines>
    <body>How to assign a performer to an issue? We should decide how to assign performer, for now its just a random. That should be replaced with something more reasonable. Don't forget to remove this puzzle.</body>
    <file>src/main/java/git/tracehub/agents/github/issues/AssignOnIssue.java</file>
    <author>@rultor</author>
    <email>me@rultor.com</email>
    <time>2024-01-19T13:52:29Z</time>
    <children/>
  </puzzle>
  <puzzle alive="false">
    <issue href="https://github.com/tracehubpm/tracehub/issues/50" closed="2024-01-29T14:21:23+00:00">50</issue>
    <ticket>41</ticket>
    <estimate>30</estimate>
    <role>DEV</role>
    <id>41-7a2d248a</id>
    <lines>46-49</lines>
    <body>Handle if eligible candidates are empty. We should handle somehow a situation where there is no candidates in pool. Possible way to do that is to respond in issue that we don't have a candidates in pool.</body>
    <file>src/main/java/git/tracehub/agents/github/issues/AssignOnIssue.java</file>
    <author>@rultor</author>
    <email>me@rultor.com</email>
    <time>2024-01-19T13:52:29Z</time>
    <children/>
  </puzzle>
  <puzzle alive="false">
    <issue href="https://github.com/tracehubpm/tracehub/issues/86" closed="2024-01-29T14:21:27+00:00">86</issue>
    <ticket>84</ticket>
    <estimate>30</estimate>
    <role>DEV</role>
    <id>84-7604eaea</id>
    <lines>51-53</lines>
    <body>Clean up code inside 'if candidates are not empty' statement. We should introduce a small composable objects to replace this semi-procedural script that will be unmaintainable very soon.</body>
    <file>src/main/java/git/tracehub/agents/github/issues/AssignOnIssue.java</file>
    <author>@rultor</author>
    <email>me@rultor.com</email>
    <time>2024-01-24T14:16:21Z</time>
    <children/>
  </puzzle>
  <puzzle alive="true">
    <issue href="https://github.com/tracehubpm/tracehub/issues/87">87</issue>
    <ticket>84</ticket>
    <estimate>45</estimate>
    <role>DEV</role>
    <id>84-41de9cd1</id>
    <lines>49-53</lines>
    <body>Create assertions after issue was created in #returnsResponseOnHook. Right now we are just checking the response and the status of it. Its not enough for this integration test. We should make an assertions that checks whether issue is created/commented/assigned or not. Depends on this &lt;a href="https://github.com/tracehubpm/tracehub/issues/55"&gt;issue&lt;/a&gt;.</body>
    <file>src/test/java/it/TkGitHubITCase.java</file>
    <author>rultor</author>
    <email>me@rultor.com</email>
    <time>2024-01-24T14:16:21Z</time>
    <children/>
  </puzzle>
  <puzzle alive="false">
    <issue href="https://github.com/tracehubpm/tracehub/issues/107" closed="2024-01-30T07:36:00+00:00">107</issue>
    <ticket>26</ticket>
    <estimate>30</estimate>
    <role>DEV</role>
    <id>26-7d46e5cd</id>
    <lines>95-100</lines>
    <body>Resolve code duplication in tests. We should create a reusable code structures for contribution inside GitHub repositories (both mock and real). \@Before code block in JUnit is not an option. Code duplication should be resolved in GhNewTest.java, GhOrderTest.java, TkGitHubTest.java also. Don't forget to remove this puzzle.</body>
    <file>src/test/java/git/tracehub/agents/github/GhContentTest.java</file>
    <author>Aliaksei Bialiauski</author>
    <email>aliaksei.bialiauski@hey.com</email>
    <time>2024-01-29T14:03:12Z</time>
    <children/>
  </puzzle>
  <puzzle alive="false">
    <issue href="https://github.com/tracehubpm/tracehub/issues/113" closed="2024-02-07T19:52:47+00:00">113</issue>
    <ticket>109</ticket>
    <estimate>60</estimate>
    <role>DEV</role>
    <id>109-7f86aac7</id>
    <lines>30-33</lines>
    <body>Use rule values to validate Job.java. We should validate {@link Job} using values that we can get from #rules() method. We also should think about how to resolve mixing validations from XSL and Java.</body>
    <file>src/main/java/git/tracehub/Backlog.java</file>
    <author>@rultor</author>
    <email>me@rultor.com</email>
    <time>2024-01-30T11:46:18Z</time>
    <children>
      <puzzle alive="true">
        <issue href="https://github.com/tracehubpm/tracehub/issues/147">147</issue>
        <ticket>113</ticket>
        <estimate>25</estimate>
        <role>DEV</role>
        <id>113-61731007</id>
        <lines>91-94</lines>
        <body>Check the default values for applied rules. We should check that rules was bound to defaults, check &lt;a href="https://github.com/tracehubpm/tracehub/issues/116"&gt;this&lt;/a&gt; issue before. Don't forget to remove this puzzle.</body>
        <file>src/test/java/git/tracehub/validation/RulesBoundTest.java</file>
        <author>rultor</author>
        <email>me@rultor.com</email>
        <time>2024-02-07T19:50:59Z</time>
        <children/>
      </puzzle>
      <puzzle alive="true">
        <issue href="https://github.com/tracehubpm/tracehub/issues/148">148</issue>
        <ticket>113</ticket>
        <estimate>45</estimate>
        <role>DEV</role>
        <id>113-adb0fad0</id>
        <lines>26-30</lines>
        <body>Migrate estimate.xsl to vsheets. We should migrate estimate.xsl sheet into vsheets repo. Also, we should create a spec, like &lt;a href="https://github.com/tracehubpm/vsheets/blob/master/spec/struct_spec.rb"&gt;this&lt;/a&gt;. Don't forget to remove this puzzle.</body>
        <file>src/test/resources/git/tracehub/validation/estimate.xsl</file>
        <author>rultor</author>
        <email>me@rultor.com</email>
        <time>2024-02-07T19:50:59Z</time>
        <children>
          <puzzle alive="true">
            <issue href="https://github.com/tracehubpm/tracehub/issues/159">159</issue>
            <ticket>148</ticket>
            <estimate>25</estimate>
            <role>DEV</role>
            <id>148-2e63b3d7</id>
            <lines>150-156</lines>
            <body>Fetch remote sheets for job validation. We should fetch remote sheets for job validation from vsheets repo. For now its depends on migration of this sheets there. See &lt;a href="https://github.com/tracehubpm/tracehub/issues/148"&gt;this&lt;/a&gt; and &lt;a href="https://github.com/tracehubpm/tracehub/issues/149"&gt;this&lt;/a&gt;. Don't forget to create tests and remove this puzzle.</body>
            <file>src/main/java/git/tracehub/tk/TkGitHub.java</file>
            <author>Aliaksei Bialiauski</author>
            <email>aliaksei.bialiauski@hey.com</email>
            <time>2024-02-12T09:48:35Z</time>
            <children/>
          </puzzle>
        </children>
      </puzzle>
      <puzzle alive="true">
        <issue href="https://github.com/tracehubpm/tracehub/issues/149">149</issue>
        <ticket>113</ticket>
        <estimate>45</estimate>
        <role>DEV</role>
        <id>113-aefe337a</id>
        <lines>26-30</lines>
        <body>Migrate words.xsl to vsheets. We should migrate words.xsl sheet into vsheets repo. Also, we should create a spec, like &lt;a href="https://github.com/tracehubpm/vsheets/blob/master/spec/struct_spec.rb"&gt;this&lt;/a&gt;. Don't forget to remove this puzzle.</body>
        <file>src/test/resources/git/tracehub/validation/words.xsl</file>
        <author>rultor</author>
        <email>me@rultor.com</email>
        <time>2024-02-07T19:50:59Z</time>
        <children/>
      </puzzle>
      <puzzle alive="true">
        <issue href="https://github.com/tracehubpm/tracehub/issues/150">150</issue>
        <ticket>113</ticket>
        <estimate>25</estimate>
        <role>DEV</role>
        <id>113-f6346b05</id>
        <lines>43-46</lines>
        <body>Count only words, not a symbols, and exclude spaces. We should count only words, not a symbol length, like now. Also, we should not count spaces as words. Don't forget to remove this puzzle before migrating sheet to vsheets repo.</body>
        <file>src/test/resources/git/tracehub/validation/words.xsl</file>
        <author>rultor</author>
        <email>me@rultor.com</email>
        <time>2024-02-07T19:50:59Z</time>
        <children/>
      </puzzle>
    </children>
  </puzzle>
  <puzzle alive="true">
    <issue href="https://github.com/tracehubpm/tracehub/issues/116">116</issue>
    <ticket>111</ticket>
    <estimate>45</estimate>
    <role>DEV</role>
    <id>111-02ac39e3</id>
    <lines>37-40</lines>
    <body>Default rule values if they are not present. We should handle the situation when some rules are not present in project.yml:backlog:rules. We should decide the defaults for this rules, or maybe even omit some of them.</body>
    <file>src/main/java/git/tracehub/YmlRules.java</file>
    <author>rultor</author>
    <email>me@rultor.com</email>
    <time>2024-01-31T12:40:59Z</time>
    <children/>
  </puzzle>
  <puzzle alive="true">
    <issue href="https://github.com/tracehubpm/tracehub/issues/124">124</issue>
    <ticket>122</ticket>
    <estimate>30</estimate>
    <role>DEV</role>
    <id>122-abd19c5c</id>
    <lines>36-42</lines>
    <body>Form other YAML fields from issue body. We should add other fields in our YAML: `description`, `cost`, `role`. We should process body in pattern way, so we can find what kind of role and cost were specified. Moreover, we need to cut off this parsed from description, we should keep it without information about cost and role, since it already passed in related YAML fields.</body>
    <file>src/main/java/git/tracehub/agents/github/issues/YmlIssue.java</file>
    <author>Aliaksei Bialiauski</author>
    <email>aliaksei.bialiauski@hey.com</email>
    <time>2024-02-01T12:16:13Z</time>
    <children/>
  </puzzle>
  <puzzle alive="false">
    <issue href="https://github.com/tracehubpm/tracehub/issues/125" closed="2024-02-02T10:48:43+00:00">125</issue>
    <ticket>118</ticket>
    <estimate>90</estimate>
    <role>DEV</role>
    <id>118-518c3f47</id>
    <lines>75-78</lines>
    <body>Implement OnNew.java. We should parse on opened issue event that comes from GitHub as webhook, check if the author of opened issue is not tracehubgit and add label `new` to opened issue.</body>
    <file>src/main/java/git/tracehub/tk/TkGitHub.java</file>
    <author>Aliaksei Bialiauski</author>
    <email>aliaksei.bialiauski@hey.com</email>
    <time>2024-02-01T12:16:13Z</time>
    <children>
      <puzzle alive="true">
        <issue href="https://github.com/tracehubpm/tracehub/issues/136">136</issue>
        <ticket>125</ticket>
        <estimate>45</estimate>
        <role>DEV</role>
        <id>125-361df359</id>
        <lines>39-43</lines>
        <body>Create an integration test for OnNew.java. We should create a few integration tests that will check both cases: labeled issue, and issue ignored. It can be done right after we will implement &lt;a href="https://github.com/tracehubpm/tracehub/issues/105"&gt;this&lt;/a&gt;, include it in {@link git.tracehub.tk.TkGitHub}, so it will be testable.</body>
        <file>src/main/java/git/tracehub/agents/github/issues/OnNew.java</file>
        <author>rultor</author>
        <email>me@rultor.com</email>
        <time>2024-02-02T10:47:02Z</time>
        <children/>
      </puzzle>
    </children>
  </puzzle>
  <puzzle alive="false">
    <issue href="https://github.com/tracehubpm/tracehub/issues/126" closed="2024-02-02T13:41:41+00:00">126</issue>
    <ticket>122</ticket>
    <estimate>90</estimate>
    <role>DEV</role>
    <id>122-d87e71ac</id>
    <lines>79-82</lines>
    <body>Implement OnAttachedLabel.java. We should parse on attached label event that comes to us from GitHub webhook. If label was `bug` that we should launch {@link git.tracehub.agents.github.CreatePull} or other related integration.</body>
    <file>src/main/java/git/tracehub/tk/TkGitHub.java</file>
    <author>Aliaksei Bialiauski</author>
    <email>aliaksei.bialiauski@hey.com</email>
    <time>2024-02-01T12:16:13Z</time>
    <children>
      <puzzle alive="true">
        <issue href="https://github.com/tracehubpm/tracehub/issues/138">138</issue>
        <ticket>126</ticket>
        <estimate>45</estimate>
        <role>DEV</role>
        <id>126-0093b28c</id>
        <lines>44-46</lines>
        <body>Introduce unit tests for OnAttachedLabel.java We should introduce unit tests for this class. It one depends on &lt;a href="https://github.com/tracehubpm/tracehub/issues/130"&gt;this&lt;/a&gt; issue.</body>
        <file>src/main/java/git/tracehub/agents/github/issues/OnAttachedLabel.java</file>
        <author>Aliaksei Bialiauski</author>
        <email>aliaksei.bialiauski@hey.com</email>
        <time>2024-02-02T13:41:27Z</time>
        <children/>
      </puzzle>
      <puzzle alive="true">
        <issue href="https://github.com/tracehubpm/tracehub/issues/139">139</issue>
        <ticket>126</ticket>
        <estimate>45</estimate>
        <role>DEV</role>
        <id>126-c10ba874</id>
        <lines>83-87</lines>
        <body>Implement OnComment.java. We should implement logic that parses incoming comments and tries to pattern match them into one of the available categories. Can be postponed, its not an urgent one. Don't forget to remove this puzzle.</body>
        <file>src/main/java/git/tracehub/tk/TkGitHub.java</file>
        <author>Aliaksei Bialiauski</author>
        <email>aliaksei.bialiauski@hey.com</email>
        <time>2024-02-02T13:41:27Z</time>
        <children/>
      </puzzle>
    </children>
  </puzzle>
  <puzzle alive="true">
    <issue href="https://github.com/tracehubpm/tracehub/issues/127">127</issue>
    <ticket>122</ticket>
    <estimate>30</estimate>
    <role>DEV</role>
    <id>122-f550c519</id>
    <lines>83-86</lines>
    <body>Extract commits only on push event. We should implement OnPush.java that will handle that. Depends on &lt;a href="https://github.com/tracehubpm/tracehub/issues/56"&gt;this&lt;/a&gt; issue. Don't forget this remove this puzzle.</body>
    <file>src/main/java/git/tracehub/tk/TkGitHub.java</file>
    <author>Aliaksei Bialiauski</author>
    <email>aliaksei.bialiauski@hey.com</email>
    <time>2024-02-01T12:16:13Z</time>
    <children/>
  </puzzle>
  <puzzle alive="true">
    <issue href="https://github.com/tracehubpm/tracehub/issues/128">128</issue>
    <ticket>51</ticket>
    <estimate>90</estimate>
    <role>DEV</role>
    <id>51-db284561</id>
    <lines>87-90</lines>
    <body>Parse and send incoming requests into distributed queue. We should parse incoming requests, transform them and send into queue for further processing. On queue consumer side, it will be handled after in a FIFO way.</body>
    <file>src/main/java/git/tracehub/tk/TkGitHub.java</file>
    <author>Aliaksei Bialiauski</author>
    <email>aliaksei.bialiauski@hey.com</email>
    <time>2024-02-01T12:16:13Z</time>
    <children/>
  </puzzle>
  <puzzle alive="true">
    <issue href="https://github.com/tracehubpm/tracehub/issues/129">129</issue>
    <ticket>122</ticket>
    <estimate>45</estimate>
    <role>DEV</role>
    <id>122-5ffb6ab0</id>
    <lines>53-56</lines>
    <body>Test #createsCommit does not work with MkGithub. For now we can't test {@link CreateCommit} with {@link MkGithub}, since {@link com.jcabi.github.mock.MkCommit} cannot be identified with sha we providing in tests.</body>
    <file>src/test/java/git/tracehub/agents/github/CreateCommitTest.java</file>
    <author>Aliaksei Bialiauski</author>
    <email>aliaksei.bialiauski@hey.com</email>
    <time>2024-02-01T12:16:13Z</time>
    <children/>
  </puzzle>
  <puzzle alive="true">
    <issue href="https://github.com/tracehubpm/tracehub/issues/130">130</issue>
    <ticket>122</ticket>
    <estimate>90</estimate>
    <role>DEV</role>
    <id>122-4e87ef3f</id>
    <lines>47-51</lines>
    <body>Enable this test when {@link com.jcabi.github.mock.MkBranches} will implement #find(name) method. For now it can't be tested, since mock branch implementation does not work as expected, actually for now it throws the following exception: java.lang.UnsupportedOperationException: find(name) not implemented.</body>
    <file>src/test/java/git/tracehub/agents/github/CreatePullTest.java</file>
    <author>Aliaksei Bialiauski</author>
    <email>aliaksei.bialiauski@hey.com</email>
    <time>2024-02-01T12:16:13Z</time>
    <children/>
  </puzzle>
</puzzles>
