<?xml version="1.0"?>
<puzzles xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://www.0pdd.com/puzzles.xsd" date="2026-09-16T07:50:21+00:00" version="BUILD">
  <puzzle alive="false">
    <issue href="https://github.com/objectionary/lints/issues/6" closed="2026-09-01T14:55:24+00:00">6</issue>
    <ticket>3147</ticket>
    <estimate>30</estimate>
    <role>DEV</role>
    <id>3147-66cbc2c7</id>
    <lines>23-27</lines>
    <body>Make duplicate names catcher more powerful. This test pack is disabled now because names duplication is not caught here. It happens because of "duplicate-names.xsl" thinks that abstract objects in the tests are on the different levels. Syntactically they are, but semantically they're not. So we need to make this duplicate catcher more powerful, enable the test by removing "skip: true" line and make sure it works.</body>
    <file>src/test/resources/org/eolang/lints/errors/catches-conflict-with-auto-name.yaml</file>
    <author>@yegor256</author>
    <email>yegor256@gmail.com</email>
    <time>2024-11-18T17:08:20Z</time>
    <children/>
  </puzzle>
  <puzzle alive="true">
    <issue href="https://github.com/objectionary/lints/issues/34">34</issue>
    <ticket>14</ticket>
    <estimate>35</estimate>
    <role>DEV</role>
    <id>14-e039e307</id>
    <lines>39-42</lines>
    <body>Calculate comment line number with abusive character. For now we just reusing object line number (via @line), which is not correct for specifying on which line of the program comment is located. This issue can be solved after &lt;a href="https://github.com/objectionary/eo/issues/3536"&gt;this one&lt;/a&gt;.</body>
    <file>src/main/java/org/eolang/lints/comments/AsciiOnly.java</file>
    <author>@rultor</author>
    <email>me@rultor.com</email>
    <time>2024-11-24T15:34:03Z</time>
    <children/>
  </puzzle>
  <puzzle alive="false">
    <issue href="https://github.com/objectionary/lints/issues/41" closed="2026-04-24T15:31:14+00:00">41</issue>
    <ticket>19</ticket>
    <estimate>45</estimate>
    <role>DEV</role>
    <id>19-80f5b41d</id>
    <lines>45-47</lines>
    <body>Create Lint envelope called `JavaLint` that will fetch motive from Markdown file based on the lint's name (Java class name) and lint's dimension (Java package name, e.g. `comments`).</body>
    <file>src/main/java/org/eolang/lints/comments/AsciiOnly.java</file>
    <author>@yegor256</author>
    <email>yegor256@gmail.com</email>
    <time>2024-11-27T13:31:42Z</time>
    <children/>
  </puzzle>
  <puzzle alive="false">
    <issue href="https://github.com/objectionary/lints/issues/42" closed="2025-05-05T14:49:09+00:00">42</issue>
    <ticket>19</ticket>
    <estimate>35</estimate>
    <role>DEV</role>
    <id>19-33379f10</id>
    <lines>3-5</lines>
    <body>Document motives for `not-empty-atoms` lint. Currently, we don't have a test case for this `not-empty-atoms` lint. We should create a new test case, and then document a motive for this lint.</body>
    <file>src/main/resources/org/eolang/motives/critical/not-empty-atoms.md</file>
    <author>@yegor256</author>
    <email>yegor256@gmail.com</email>
    <time>2024-11-27T13:31:42Z</time>
    <children/>
  </puzzle>
  <puzzle alive="false">
    <issue href="https://github.com/objectionary/lints/issues/43" closed="2026-05-08T04:39:58+00:00">43</issue>
    <ticket>19</ticket>
    <estimate>35</estimate>
    <role>DEV</role>
    <id>19-e20aed59</id>
    <lines>3-5</lines>
    <body>Document motives for `same-line-names` lint. Currently, we don't have a test case for this `same-line-names` lint. We should create a new test case, and then document a motive for this lint.</body>
    <file>src/main/resources/org/eolang/motives/critical/same-line-names.md</file>
    <author>@yegor256</author>
    <email>yegor256@gmail.com</email>
    <time>2024-11-27T13:31:42Z</time>
    <children/>
  </puzzle>
  <puzzle alive="false">
    <issue href="https://github.com/objectionary/lints/issues/44" closed="2024-12-29T12:51:20+00:00">44</issue>
    <ticket>19</ticket>
    <estimate>35</estimate>
    <role>DEV</role>
    <id>19-ccc6357f</id>
    <lines>5-8</lines>
    <body>Document motives and examples for `empty-object` lint. Currently, we don't have a test case for this `empty-object` lint. We should create a new test case, and then document a motive with examples for this lint.</body>
    <file>src/main/resources/org/eolang/motives/errors/empty-object.md</file>
    <author>@yegor256</author>
    <email>yegor256@gmail.com</email>
    <time>2024-11-27T13:31:42Z</time>
    <children/>
  </puzzle>
  <puzzle alive="false">
    <issue href="https://github.com/objectionary/lints/issues/45" closed="2025-01-31T15:10:26+00:00">45</issue>
    <ticket>19</ticket>
    <estimate>30</estimate>
    <role>DEV</role>
    <id>19-c076b490</id>
    <lines>11-13</lines>
    <body>Document more about `broken-refs` lint. Currently, there is no unit test that finds defects with broken refs. Let's add a few, and only then add more docs in broken-ref's motive.</body>
    <file>src/main/resources/org/eolang/motives/refs/broken-refs.md</file>
    <author>@yegor256</author>
    <email>yegor256@gmail.com</email>
    <time>2024-11-27T13:31:42Z</time>
    <children/>
  </puzzle>
  <puzzle alive="false">
    <issue href="https://github.com/objectionary/lints/issues/125" closed="2024-12-11T12:37:55+00:00">125</issue>
    <ticket>72</ticket>
    <estimate>60</estimate>
    <role>DEV</role>
    <id>72-f7af213e</id>
    <lines>49-53</lines>
    <body>Configure maven to download model file during the build and place into the JAR. Currently, we download model file each time when creating the lint, which may be slow in the usage of this lint. Instead, let's configure maven to download model file during the build, and place into JAR, so lint will be able to locate file from resources faster.</body>
    <file>src/main/java/org/eolang/lints/misc/UnitTestIsNotVerb.java</file>
    <author>@rultor</author>
    <email>me@rultor.com</email>
    <time>2024-12-10T08:44:10Z</time>
    <children/>
  </puzzle>
  <puzzle alive="false">
    <issue href="https://github.com/objectionary/lints/issues/135" closed="2025-01-23T13:46:56+00:00">135</issue>
    <ticket>129</ticket>
    <estimate>60</estimate>
    <role>DEV</role>
    <id>129-28f91348</id>
    <lines>56-60</lines>
    <body>Library stanford-corenlp-4.5.7-models.jar takes too much in size. Currently, JAR takes ~452mb, which may cause some troubles to the users of the lints library. Let's think what we can do about this. We should check is it possible to get rid of this dependency and download models from the other source.</body>
    <file>src/main/java/org/eolang/lints/misc/UnitTestIsNotVerb.java</file>
    <author>@rultor</author>
    <email>me@rultor.com</email>
    <time>2024-12-11T12:32:46Z</time>
    <children/>
  </puzzle>
  <puzzle alive="false">
    <issue href="https://github.com/objectionary/lints/issues/143" closed="2025-04-08T01:36:16+00:00">143</issue>
    <ticket>134</ticket>
    <estimate>45</estimate>
    <role>DEV</role>
    <id>134-6f7709d5</id>
    <lines>54-58</lines>
    <body>Measure lint time for smaller/larger classes, similar way to JNA Pointer. Currently, we measure linting of just one big class. Would be good to measure other classes in size too, for instance smaller classes (standard program), large class (JNA pointer), x-large class, and xxl class. Don't forget to adjust lint-summary.txt file to capture all the measurements.</body>
    <file>src/test/java/org/eolang/lints/ProgramTest.java</file>
    <author>@yegor256</author>
    <email>yegor256@gmail.com</email>
    <time>2024-12-13T11:53:23Z</time>
    <children>
      <puzzle alive="false">
        <issue href="https://github.com/objectionary/lints/issues/470" closed="2025-04-10T19:51:38+00:00">470</issue>
        <ticket>143</ticket>
        <estimate>35</estimate>
        <role>DEV</role>
        <id>143-358342b3</id>
        <lines>30-33</lines>
        <body>Add JMH benchmarks result reporting. Currently, there is no reporting of benchmark results. Let's add &lt;a href="https://github.com/volodya-lombrozo/jmh-benchmark-action"&gt;this&lt;/a&gt; GitHub Actions plugin and configure it to run on each PR.</body>
        <file>src/test/java/benchmarks/ProgramBench.java</file>
        <author>@rultor</author>
        <email>me@rultor.com</email>
        <time>2025-04-08T01:21:02Z</time>
        <children/>
      </puzzle>
    </children>
  </puzzle>
  <puzzle alive="false">
    <issue href="https://github.com/objectionary/lints/issues/144" closed="2024-12-31T06:40:35+00:00">144</issue>
    <ticket>134</ticket>
    <estimate>90</estimate>
    <role>DEV</role>
    <id>134-6deff79b</id>
    <lines>59-64</lines>
    <body>Capture all the lint timings in timings.csv. Currently, we just capture total time - amount of milliseconds was required to lint some XMIR. Would be helpful to get extended statistics - timings of each lint. Don't forget to include this information into lint-summary.txt. You can check how it was implemented in HONE: &lt;a href="https://github.com/objectionary/hone-maven-plugin/blob/master/src/main/java/org/eolang/hone/Timings.java"&gt;Timings.java&lt;/a&gt;.</body>
    <file>src/test/java/org/eolang/lints/ProgramTest.java</file>
    <author>@yegor256</author>
    <email>yegor256@gmail.com</email>
    <time>2024-12-13T11:53:23Z</time>
    <children>
      <puzzle alive="false">
        <issue href="https://github.com/objectionary/lints/issues/190" closed="2025-04-24T17:53:13+00:00">190</issue>
        <ticket>144</ticket>
        <estimate>35</estimate>
        <role>DEV</role>
        <id>144-43965ba3</id>
        <lines>319-322</lines>
        <body>Resolve code duplication with Program.java class. Currently, BcProgram.java is duplication of Program.java. Let's make it use the original Program.java, so they will stay synced. Don't forget to remove this puzzle.</body>
        <file>src/test/java/org/eolang/lints/ProgramTest.java</file>
        <author>@yegor256</author>
        <email>yegor256@gmail.com</email>
        <time>2024-12-31T06:40:30Z</time>
        <children/>
      </puzzle>
      <puzzle alive="false">
        <issue href="https://github.com/objectionary/lints/issues/509" closed="2026-08-12T06:57:45+00:00">509</issue>
        <ticket>144</ticket>
        <estimate>35</estimate>
        <role>DEV</role>
        <id>144-a2c4deb3</id>
        <lines>436-439</lines>
        <body>Resolve code duplication with Source.java class. Currently, BcSource.java is duplication of Source.java. Let's make it use the original Source.java, so they will stay synced. Don't forget to remove this puzzle.</body>
        <file>src/test/java/org/eolang/lints/SourceTest.java</file>
        <author>@h1alexbel</author>
        <email>h1alexbelx@gmail.com</email>
        <time>2025-04-24T12:09:08Z</time>
        <children/>
      </puzzle>
    </children>
  </puzzle>
  <puzzle alive="false">
    <issue href="https://github.com/objectionary/lints/issues/157" closed="2024-12-18T08:48:19+00:00">157</issue>
    <ticket>148</ticket>
    <estimate>30</estimate>
    <role>DEV</role>
    <id>148-2fd39dd6</id>
    <lines>38-43</lines>
    <body>Test or remove {@link Defect#rule()} method. This method is not used by any class in the project. Moreover, we don't even have a test for it. We should either test it or remove it. Actually, this method is used &lt;a href="https://github.com/objectionary/lints/pull/150/files#r1888310583"&gt;somewhere&lt;/a&gt;</body>
    <file>src/main/java/org/eolang/lints/Defect.java</file>
    <author>@rultor</author>
    <email>me@rultor.com</email>
    <time>2024-12-18T07:45:00Z</time>
    <children/>
  </puzzle>
  <puzzle alive="false">
    <issue href="https://github.com/objectionary/lints/issues/158" closed="2024-12-18T08:21:57+00:00">158</issue>
    <ticket>148</ticket>
    <estimate>30</estimate>
    <role>DEV</role>
    <id>148-092aa30a</id>
    <lines>38-40</lines>
    <body>The {@link XslLints} class should implement {@link Lint} instead. Currently, this class is used as an iterable of lints, but it should be used as a single lint that aggregates other lints.</body>
    <file>src/main/java/org/eolang/lints/XslLints.java</file>
    <author>@rultor</author>
    <email>me@rultor.com</email>
    <time>2024-12-18T07:45:00Z</time>
    <children/>
  </puzzle>
  <puzzle alive="false">
    <issue href="https://github.com/objectionary/lints/issues/160" closed="2024-12-18T08:48:21+00:00">160</issue>
    <ticket>148</ticket>
    <estimate>30</estimate>
    <role>DEV</role>
    <id>148-e3c58907</id>
    <lines>38-40</lines>
    <body>The {@link PkByXsl} class should implement {@link Lint} instead. Currently, this class is used as an iterable of lints, but it should be used as a single lint that aggregates other lints.</body>
    <file>src/main/java/org/eolang/lints/PkByXsl.java</file>
    <author>@yegor256</author>
    <email>yegor256@gmail.com</email>
    <time>2024-12-18T08:21:51Z</time>
    <children/>
  </puzzle>
  <puzzle alive="false">
    <issue href="https://github.com/objectionary/lints/issues/192" closed="2025-01-01T14:14:57+00:00">192</issue>
    <ticket>149</ticket>
    <estimate>35</estimate>
    <role>DEV</role>
    <id>149-6bce14ac</id>
    <lines>165-167</lines>
    <body>Introduce new class XmirKey.java Let's extract the code that calculates the key for XMIR file into new Java class. Don't forget to create unit tests, and remove this puzzle.</body>
    <file>src/main/java/org/eolang/lints/Programs.java</file>
    <author>@yegor256</author>
    <email>yegor256@gmail.com</email>
    <time>2024-12-31T14:04:55Z</time>
    <children/>
  </puzzle>
  <puzzle alive="false">
    <issue href="https://github.com/objectionary/lints/issues/215" closed="2026-09-07T06:32:06+00:00">215</issue>
    <ticket>107</ticket>
    <estimate>45</estimate>
    <role>DEV</role>
    <id>107-b3a5bdea</id>
    <lines>23-25</lines>
    <body>Configure default timeout for tests running on windows to 10s and 3s on other platforms. Currently, it fails with the 3s timeout on windows platform. Let's try to configure test default timeout exclusively for windows, and keep 3s for other platforms.</body>
    <file>src/test/resources/junit-platform.properties</file>
    <author>@yegor256</author>
    <email>yegor256@gmail.com</email>
    <time>2025-01-09T13:40:14Z</time>
    <children/>
  </puzzle>
  <puzzle alive="false">
    <issue href="https://github.com/objectionary/lints/issues/216" closed="2025-01-21T12:11:15+00:00">216</issue>
    <ticket>199</ticket>
    <estimate>30</estimate>
    <role>DEV</role>
    <id>199-3cb36c43</id>
    <lines>170-176</lines>
    <body>Use {@link XML#xpath(String)} Method Instead. This method is using a custom implementation to find the name of the program. We should replace it with the {@link XML#xpath(String)} method to make the code cleaner. You can use `program.xpath("/program/@name").stream().findFirst().orElse("unknown")` to find the name. This issue is blocked by &lt;a href="https://github.com/jcabi/jcabi-xml/issues/289"&gt;jcabi/jcabi-xml#289&lt;/a&gt;.</body>
    <file>src/main/java/org/eolang/lints/LtByXsl.java</file>
    <author>@yegor256</author>
    <email>yegor256@gmail.com</email>
    <time>2025-01-09T13:56:03Z</time>
    <children/>
  </puzzle>
  <puzzle alive="false">
    <issue href="https://github.com/objectionary/lints/issues/217" closed="2025-01-21T12:11:17+00:00">217</issue>
    <ticket>199</ticket>
    <estimate>30</estimate>
    <role>DEV</role>
    <id>199-c82777d8</id>
    <lines>188-194</lines>
    <body>Use {@link XML#nodes(String)} Method Instead. This method is using a custom implementation to find defects in the report. We should replace it with the {@link XML#nodes(String)} method to make the code cleaner. You can use `report.nodes("/defects/defect")` to find the defects. This issue is blocked by &lt;a href="https://github.com/jcabi/jcabi-xml/issues/288"&gt;jcabi/jcabi-xml#288&lt;/a&gt;.</body>
    <file>src/main/java/org/eolang/lints/LtByXsl.java</file>
    <author>@yegor256</author>
    <email>yegor256@gmail.com</email>
    <time>2025-01-09T13:56:03Z</time>
    <children/>
  </puzzle>
  <puzzle alive="false">
    <issue href="https://github.com/objectionary/lints/issues/276" closed="2025-02-11T14:54:11+00:00">276</issue>
    <ticket>257</ticket>
    <estimate>60</estimate>
    <role>DEV</role>
    <id>257-9496b6b4</id>
    <lines>52-56</lines>
    <body>Configure model download only during the build and place into the JAR. Currently, we download model file each time when creating the lint, which may be slow in the usage of this lint. Instead, let's configure maven to download model file during the build, and place into JAR, so lint will be able to locate file from resources faster.</body>
    <file>src/main/java/org/eolang/lints/misc/LtTestNotVerb.java</file>
    <author>@yegor256</author>
    <email>yegor256@gmail.com</email>
    <time>2025-01-23T13:46:49Z</time>
    <children/>
  </puzzle>
  <puzzle alive="false">
    <issue href="https://github.com/objectionary/lints/issues/313" closed="2026-09-01T11:00:05+00:00">313</issue>
    <ticket>297</ticket>
    <estimate>35</estimate>
    <role>DEV</role>
    <id>297-589ae9b7</id>
    <lines>41-45</lines>
    <body>Return `LtTestNotVerb` back. For some reason this lint produces errors in EO-to-Java Compiler. Check &lt;a href="https://github.com/objectionary/lints/issues/297#issuecomment-2636540673"&gt;this&lt;/a&gt; issue for more details. We should return it in the fixed state, once we understand the root cause of the problem.</body>
    <file>src/main/java/org/eolang/lints/PkMono.java</file>
    <author>@yegor256</author>
    <email>yegor256@gmail.com</email>
    <time>2025-02-05T13:26:15Z</time>
    <children/>
  </puzzle>
  <puzzle alive="false">
    <issue href="https://github.com/objectionary/lints/issues/365" closed="2025-04-22T12:48:35+00:00">365</issue>
    <ticket>259</ticket>
    <estimate>60</estimate>
    <role>DEV</role>
    <id>259-5bf6866f</id>
    <lines>24-28</lines>
    <body>Optimize performance of inconsistent arguments finding. Instead of re-collecting objects in nested loops, we should merge all objects from all programs into single XMIR under '&lt;objects/&gt;' element. After objects are merged, we can iterate over all the objects there only once, and find inconsistencies.</body>
    <file>src/main/java/org/eolang/lints/LtInconsistentArgs.java</file>
    <author>@yegor256</author>
    <email>yegor256@gmail.com</email>
    <time>2025-02-25T08:45:05Z</time>
    <children/>
  </puzzle>
  <puzzle alive="false">
    <issue href="https://github.com/objectionary/lints/issues/372" closed="2025-06-06T08:43:08+00:00">372</issue>
    <ticket>368</ticket>
    <estimate>90</estimate>
    <role>DEV</role>
    <id>368-1edf74b7</id>
    <lines>16-18</lines>
    <body>Implement lint caching decorator. We should cache `Lint.defects()` to cache found defects when calling particular lint. Don't forget to add unit tests, and benchmark tests.</body>
    <file>src/main/java/org/eolang/lints/Lint.java</file>
    <author>@yegor256</author>
    <email>yegor256@gmail.com</email>
    <time>2025-02-28T06:05:10Z</time>
    <children/>
  </puzzle>
  <puzzle alive="false">
    <issue href="https://github.com/objectionary/lints/issues/385" closed="2025-03-18T12:26:58+00:00">385</issue>
    <ticket>368</ticket>
    <estimate>45</estimate>
    <role>DEV</role>
    <id>368-78b44b68</id>
    <lines>112-116</lines>
    <body>Configure `unlint-non-existing-defect` lint to ignore unlints from other scope (WPA/Single program). On WPA side of this lint ({@link LtUnlintNonExistingDefectWpaTest}) we should ignore single program lints. Also, don't forget to enable {@link LtUnlintNonExistingDefectWpaTest#ignoresSingleProgramUnlint()}.</body>
    <file>src/test/java/org/eolang/lints/LtUnlintNonExistingDefectTest.java</file>
    <author>@yegor256</author>
    <email>yegor256@gmail.com</email>
    <time>2025-03-02T18:18:23Z</time>
    <children/>
  </puzzle>
  <puzzle alive="false">
    <issue href="https://github.com/objectionary/lints/issues/392" closed="2025-03-21T01:14:33+00:00">392</issue>
    <ticket>386</ticket>
    <estimate>30</estimate>
    <role>DEV</role>
    <id>386-d4b4e108</id>
    <lines>20-24</lines>
    <body>Replace `XML.xpath()` with `Xnav.path()` usage in defects() method. Currently, we cannot use `Xnav.path()` method due to &lt;a href="https://github.com/volodya-lombrozo/xnav/issues/74"&gt;this&lt;/a&gt; bug. Once it will be resolved, we should replace `XML.xpath()` with `Xnav.path()` in order to improve the performance of the `LtUnlint.defects()` execution.</body>
    <file>src/main/java/org/eolang/lints/LtUnlint.java</file>
    <author>@yegor256</author>
    <email>yegor256@gmail.com</email>
    <time>2025-03-05T18:24:05Z</time>
    <children/>
  </puzzle>
  <puzzle alive="false">
    <issue href="https://github.com/objectionary/lints/issues/405" closed="2025-06-06T08:43:09+00:00">405</issue>
    <ticket>394</ticket>
    <estimate>25</estimate>
    <role>DEV</role>
    <id>394-da4e25ec</id>
    <lines>95-97</lines>
    <body>Replace `LtAlways` in comparison with lint caching decorator. Currently, its not available, once &lt;a href="https://github.com/objectionary/lints/issues/372"&gt;this&lt;/a&gt; ticket will be solved, we can replace the class.</body>
    <file>src/test/java/org/eolang/lints/PkMonoTest.java</file>
    <author>@yegor256</author>
    <email>yegor256@gmail.com</email>
    <time>2025-03-12T08:15:42Z</time>
    <children/>
  </puzzle>
  <puzzle alive="false">
    <issue href="https://github.com/objectionary/lints/issues/436" closed="2025-03-28T10:03:30+00:00">436</issue>
    <ticket>429</ticket>
    <estimate>60</estimate>
    <role>DEV</role>
    <id>429-a4557e24</id>
    <lines>26-29</lines>
    <body>Convert all found {@link Defect}-s into XML and then assert using XPath. For now we are using custom asserts outlined in implementations of {@link Assertion} interface. Conversion to XML document can eliminate the need to custom asserts, since we will be able to utilize XPath expressions similarly as in {@link XtYaml#asserts()}.</body>
    <file>src/test/java/org/eolang/lints/WpaStory.java</file>
    <author>h1alexbel</author>
    <email>h1alexbelx@gmail.com</email>
    <time>2025-03-26T08:35:08Z</time>
    <children/>
  </puzzle>
  <puzzle alive="false">
    <issue href="https://github.com/objectionary/lints/issues/465" closed="2025-05-19T09:38:20+00:00">465</issue>
    <ticket>165</ticket>
    <estimate>60</estimate>
    <role>DEV</role>
    <id>165-a8f393c8</id>
    <lines>23-28</lines>
    <body>Add {@link LtReservedName} to the LINTS Mono pipeline. Currently, it will cause timeout exceptions in several places in tests, due to the design of {@link LtReservedName}. There, it scans all the home EO objects, pulled from Git by maven in the `generate-sources` phase, and process them. Will be great to process home objects only once - initially during the build, and then reuse it everywhere.</body>
    <file>src/main/java/org/eolang/lints/MonoLints.java</file>
    <author>@rultor</author>
    <email>me@rultor.com</email>
    <time>2025-04-04T14:16:55Z</time>
    <children>
      <puzzle alive="false">
        <issue href="https://github.com/objectionary/lints/issues/602" closed="2026-08-13T05:52:44+00:00">602</issue>
        <ticket>465</ticket>
        <estimate>45</estimate>
        <role>DEV</role>
        <id>465-7c10eaab</id>
        <lines>31-35</lines>
        <body>Refactor HomeNames. Currently, the class does two things: 1) Object name parsing, and 2) CSV placing. Let's refactor it to make it aligned with &lt;a href="https://en.wikipedia.org/wiki/Single-responsibility_principle"&gt;SRP&lt;/a&gt;. Probably one new class will be required (for name parsing), together with proper naming of this one (for placing them into CSV).</body>
        <file>src/main/groovy/org/eolang/lints/HomeNames.groovy</file>
        <author>@h1alexbel</author>
        <email>h1alexbelx@gmail.com</email>
        <time>2025-05-19T08:30:48Z</time>
        <children/>
      </puzzle>
    </children>
  </puzzle>
  <puzzle alive="false">
    <issue href="https://github.com/objectionary/lints/issues/502" closed="2026-04-24T10:52:45+00:00">502</issue>
    <ticket>259</ticket>
    <estimate>60</estimate>
    <role>DEV</role>
    <id>259-23892a1e</id>
    <lines>26-30</lines>
    <body>Optimize performance of inconsistent arguments finding. Instead of re-collecting objects in nested loops, we should merge all objects from all programs into single XMIR under '&lt;o/&gt;' element. After objects are merged, we can iterate over all the objects there only once, and find inconsistencies.</body>
    <file>src/main/java/org/eolang/lints/LtInconsistentArgs.java</file>
    <author>@rultor</author>
    <email>me@rultor.com</email>
    <time>2025-04-22T12:34:11Z</time>
    <children/>
  </puzzle>
  <puzzle alive="false">
    <issue href="https://github.com/objectionary/lints/issues/520" closed="2026-08-25T16:25:19+00:00">520</issue>
    <ticket>402</ticket>
    <estimate>15</estimate>
    <role>DEV</role>
    <id>402-462e483a</id>
    <lines>31-34</lines>
    <body>Replace the creation of new ArrayList&lt;&gt;(0) with the creation of ArrayList&lt;&gt;() without a constructor argument in whole project. Add ignore warning ConditionalRegexpMultilineCheck from Checkstyle (it doesn't seem to be possible at the moment &lt;a href="https://github.com/yegor256/qulice/issues/1328"&gt;issue 1328&lt;/a&gt;)</body>
    <file>src/main/java/org/eolang/lints/LtAsciiOnly.java</file>
    <author>@rultor</author>
    <email>me@rultor.com</email>
    <time>2025-04-27T08:47:51Z</time>
    <children/>
  </puzzle>
  <puzzle alive="false">
    <issue href="https://github.com/objectionary/lints/issues/563" closed="2026-06-23T09:45:52+00:00">563</issue>
    <ticket>555</ticket>
    <estimate>35</estimate>
    <role>DEV</role>
    <id>555-aaf5c23c</id>
    <lines>44-46</lines>
    <body>Enable `duplicate-names-in-diff-context` benchmark. Currently, its slow, especially for `L` and `XL`-sized sources. Let's optimize it, in order to enable this benchmark.</body>
    <file>src/test/java/benchmarks/SourceBench.java</file>
    <author>@h1alexbel</author>
    <email>h1alexbelx@gmail.com</email>
    <time>2025-05-07T10:47:33Z</time>
    <children/>
  </puzzle>
  <puzzle alive="false">
    <issue href="https://github.com/objectionary/lints/issues/592" closed="2026-08-12T06:50:28+00:00">592</issue>
    <ticket>376</ticket>
    <estimate>60</estimate>
    <role>DEV</role>
    <id>376-92eafa52</id>
    <lines>48-51</lines>
    <body>Enable redundant object in the single XMIR scope benchmarks. As for now, the lint is too slow, especially on L, XL and XXL-sized XMIRs. This happens mostly because of multiple XPath `//o` selects in the XSL. Once, the lint will be optimized, we can enable the lint in the benchmarks.</body>
    <file>src/test/java/benchmarks/SourceBench.java</file>
    <author>@yegor256</author>
    <email>yegor256@gmail.com</email>
    <time>2025-05-13T04:25:40Z</time>
    <children/>
  </puzzle>
  <puzzle alive="false">
    <issue href="https://github.com/objectionary/lints/issues/627" closed="2026-04-24T10:52:47+00:00">627</issue>
    <ticket>393</ticket>
    <estimate>30</estimate>
    <role>DEV</role>
    <id>393-4973abd9</id>
    <lines>22-26</lines>
    <body>DEV Introduce LfDfSticky integration tests. LfDfSticky is used in PkMono and PkWpa, which in turn are used in Program and Programs. Run Program::defects and Programs::defects separately and check that caching works correct. Important to note that specific Lint implementation is highly coupled with PkMono class, which in turn is used in Program's most used constructor, so probably Program(s) refactoring is required.</body>
    <file>src/main/java/org/eolang/lints/LtDfSticky.java</file>
    <author>@yegor256</author>
    <email>yegor256@gmail.com</email>
    <time>2025-06-06T08:42:59Z</time>
    <children/>
  </puzzle>
  <puzzle alive="false">
    <issue href="https://github.com/objectionary/lints/issues/652" closed="2026-04-24T10:52:49+00:00">652</issue>
    <ticket>624</ticket>
    <estimate>60</estimate>
    <role>DEV</role>
    <id>624-70aa78e1</id>
    <lines>5-10</lines>
    <body>Enable `catches-inconsistency-in-nested-anonymous-formations` test story. For now, its disabled because `LtInconsistentArgs` fails to convert parent tree with anonymous objects to searchable XPath for the XMIR. We should change our logic in both `LtInconsistentArgs#voidFqn()` and `VoidXpath`. Don't forget to enable `catches-inconsistency-resolving-anonymous-path.yaml`, `catches-inconsistency-when-parent-object-lacks-name.yaml`, and test stories as well.</body>
    <file>src/test/resources/org/eolang/lints/packs/wpa/inconsistent-args/catches-inconsistency-in-nested-anonymous-formations.yaml</file>
    <author>Yegor Bugayenko</author>
    <email>yegor256@gmail.com</email>
    <time>2025-06-22T07:11:32Z</time>
    <children/>
  </puzzle>
  <puzzle alive="true">
    <issue href="https://github.com/objectionary/lints/issues/680">680</issue>
    <ticket>540</ticket>
    <estimate>60</estimate>
    <role>DEV</role>
    <id>540-1cf7838e</id>
    <lines>10-14</lines>
    <body>Add a new style package - `write-good` - to both this list and the package list. Then fix all the issues it reports(there will be a lot). It&#x2019;s better to run Vale locally to find issues, since the GitHub Action outputs the list in a less readable format when there are many errors. format due to the large number of errors.</body>
    <file>.vale.ini</file>
    <author>@Marat-Tim</author>
    <email>108345628+Marat-Tim@users.noreply.github.com</email>
    <time>2025-07-16T05:49:26Z</time>
    <children/>
  </puzzle>
  <puzzle alive="false">
    <issue href="https://github.com/objectionary/lints/issues/685" closed="2025-07-29T09:42:42+00:00">685</issue>
    <ticket>676</ticket>
    <estimate>35</estimate>
    <role>DEV</role>
    <id>676-fcdc9c7d</id>
    <lines>12-16</lines>
    <body>Remove `+unlint application-without-as-attributes`. Currently, eo-parser does not generate `@as` attributes for applications, once we will resolve the problem in parser: https://github.com/objectionary/eo/issues/4382, we should enable it in all the places, including: `SourceTest#returnsEmptyListOfDefects` and `SourceTest#returnsOnlyOneDefect`.</body>
    <file>src/test/resources/org/eolang/lints/canonical.eo</file>
    <author>Aliaksei Bialiauski</author>
    <email>h1alexbelx@gmail.com</email>
    <time>2025-07-23T05:03:29Z</time>
    <children/>
  </puzzle>
  <puzzle alive="false">
    <issue href="https://github.com/objectionary/lints/issues/686" closed="2025-07-25T15:02:03+00:00">686</issue>
    <ticket>671</ticket>
    <estimate>45</estimate>
    <role>DEV</role>
    <id>671-0cafd5ba</id>
    <lines>17-21</lines>
    <body>Adjust `DefectMissing` to handle unlints with line ranges. Currently we don't support such line ranges in this and {@link LtUnlintNonExistingDefectWpa} lint, but we should, since {@link LtUnlint} supports them. If we will add the support of line ranges here, `unlint-non-existing-defect` in both scopes should catch up it. Don't forget to add tests for both scopes.</body>
    <file>src/main/java/org/eolang/lints/DefectMissing.java</file>
    <author>@h1alexbel</author>
    <email>h1alexbelx@gmail.com</email>
    <time>2025-07-23T05:04:48Z</time>
    <children/>
  </puzzle>
  <puzzle alive="false">
    <issue href="https://github.com/objectionary/lints/issues/715" closed="2026-07-23T05:19:43+00:00">715</issue>
    <ticket>711</ticket>
    <estimate>45</estimate>
    <role>DEV</role>
    <id>711-894ffa0c</id>
    <lines>387-390</lines>
    <body>Enable `hone` profile on all platforms after. For now, `hone-maven-plugin` fails on `macOS` and `Windows` machines. After the issue will be fixed, we should `&lt;os/&gt;` element from the `&lt;activation/&gt;` and keep `activeByDefault=true`.</body>
    <file>pom.xml</file>
    <author>@h1alexbel</author>
    <email>h1alexbelx@gmail.com</email>
    <time>2025-08-18T15:03:06Z</time>
    <children/>
  </puzzle>
  <puzzle alive="false">
    <issue href="https://github.com/objectionary/lints/issues/723" closed="2026-08-04T05:17:13+00:00">723</issue>
    <ticket>716</ticket>
    <estimate>35</estimate>
    <role>DEV</role>
    <id>716-7b35e97f</id>
    <lines>17-21</lines>
    <body>Enable hone.yml and jmh.yml (hone-dependent workflow) after hone will be fixed. At present, the hone is unable to generate the correct optimized byte code for Groovy, see this issue: https://github.com/objectionary/hone-maven-plugin/issues/297. Also, the plugin run is time-consuming, we should enable it only after the plugin will have stable execution time, in order to not disturb the development in this repository.</body>
    <file>.github/workflows/hone.yml</file>
    <author>@h1alexbel</author>
    <email>h1alexbelx@gmail.com</email>
    <time>2025-08-21T13:49:44Z</time>
    <children/>
  </puzzle>
  <puzzle alive="false">
    <issue href="https://github.com/objectionary/lints/issues/769" closed="2026-08-14T06:53:18+00:00">769</issue>
    <ticket>767</ticket>
    <estimate>60</estimate>
    <role>DEV</role>
    <id>767-c4e89915</id>
    <lines>65-68</lines>
    <body>Decrease timeouts for source linting. As for now, most lints are too slow, we need to optimize them first, so they run in milliseconds, not seconds/minutes. It should decrease our build time too. After that, we need to decrease our test timeouts. Don't forget to remove this puzzle.</body>
    <file>src/test/java/org/eolang/lints/SourceTest.java</file>
    <author>Aliaksei Bialiauski</author>
    <email>h1alexbelx@gmail.com</email>
    <time>2025-09-30T15:42:12Z</time>
    <children/>
  </puzzle>
  <puzzle alive="false">
    <issue href="https://github.com/objectionary/lints/issues/870" closed="2026-05-20T10:36:27+00:00">870</issue>
    <ticket>867</ticket>
    <estimate>90</estimate>
    <role>DEV</role>
    <id>867-3b63a0b0</id>
    <lines>70-75</lines>
    <body>Standardize EO test programs by using .eo files instead of inline strings. Currently, EO programs used in tests (e.g. in MonoLintsTest, PkByXslTest) are constructed from hard-coded String.join(...) calls scattered across test classes. This makes them hard to maintain and inconsistent. All such inline EO snippets should be extracted into dedicated .eo resource files under src/test/resources and loaded via ResourceOf, so that every test reads its input from a single canonical source.</body>
    <file>src/test/java/org/eolang/lints/MonoLintsTest.java</file>
    <author>@volodya-lombrozo</author>
    <email>volodya.lombrozo@gmail.com</email>
    <time>2026-05-19T05:44:13Z</time>
    <children>
      <puzzle alive="false">
        <issue href="https://github.com/objectionary/lints/issues/872" closed="2026-05-26T07:07:30+00:00">872</issue>
        <ticket>870</ticket>
        <estimate>90</estimate>
        <role>DEV</role>
        <id>870-2650a22a</id>
        <lines>52-58</lines>
        <body>Reduce total execution time of LtByXslTest below 60 seconds. The full test suite in this class takes ~197 seconds to run (360 tests), which is too slow for a regular build. Investigate which parameterized or integration tests dominate the runtime (likely {@code testsAllLintsByEo} and similar classpath-scanning suites), and consider splitting heavy tests into a separate integration-test profile, parallelising test execution, or caching parsed XMIR across test cases where it is safe to do so.</body>
        <file>src/test/java/org/eolang/lints/LtByXslTest.java</file>
        <author>@volodya-lombrozo</author>
        <email>volodya.lombrozo@gmail.com</email>
        <time>2026-05-20T10:01:59Z</time>
        <children>
          <puzzle alive="false">
            <issue href="https://github.com/objectionary/lints/issues/879" closed="2026-05-25T07:14:01+00:00">879</issue>
            <ticket>872</ticket>
            <estimate>60</estimate>
            <role>DEV</role>
            <id>872-aad65055</id>
            <lines>26-32</lines>
            <body>Extract name-validation logic from LtTestNotVerb into a testable component. Currently {@link LtTestNotVerbTest} parses many EO programs that differ only in the object name being tested, making the tests slow and hard to maintain. The name-validation predicate (verb vs. non-verb check) should be extracted into its own class so it can be tested directly with plain strings &#x2014; no EO parsing required. Once extracted, reduce {@link LtTestNotVerbTest} to a few representative end-to-end cases and add a dedicated unit test class for the new component.</body>
            <file>src/test/java/org/eolang/lints/LtTestNotVerbTest.java</file>
            <author>volodya-lombrozo</author>
            <email>volodya.lombrozo@gmail.com</email>
            <time>2026-05-22T09:09:44Z</time>
            <children/>
          </puzzle>
        </children>
      </puzzle>
      <puzzle alive="false">
        <issue href="https://github.com/objectionary/lints/issues/873" closed="2026-05-22T07:13:28+00:00">873</issue>
        <ticket>870</ticket>
        <estimate>60</estimate>
        <role>DEV</role>
        <id>870-99c16e08</id>
        <lines>59-65</lines>
        <body>Deduplicate EO resource files under src/test/resources/org/eolang/lints/. We now have 46 small {@code .eo} fixture files added during the extraction of inline EO programs. Some of these files may contain identical or semantically equivalent programs (e.g. {@code foo-without-dot.eo}, {@code first-foo.eo}, {@code simple.eo}). Audit all fixture files for content duplicates and consolidate where possible, updating test references to point to the surviving canonical file. This reduces maintenance burden and avoids subtle divergence between "the same" EO program defined twice.</body>
        <file>src/test/java/org/eolang/lints/LtByXslTest.java</file>
        <author>volodya-lombrozo</author>
        <email>volodya.lombrozo@gmail.com</email>
        <time>2026-05-20T10:01:59Z</time>
        <children/>
      </puzzle>
      <puzzle alive="false">
        <issue href="https://github.com/objectionary/lints/issues/874" closed="2026-05-21T15:00:14+00:00">874</issue>
        <ticket>870</ticket>
        <estimate>90</estimate>
        <role>DEV</role>
        <id>870-3df121a4</id>
        <lines>71-76</lines>
        <body>Introduce EoProgram helper class to wrap EO resource parsing. In many test classes we repeat {@code new EoSyntax(new ResourceOf("...")).parsed()}. Extract this into a dedicated {@code EoProgram(String resource)} class with a {@code parse()} method that handles {@link java.io.IOException} gracefully, logs parse timing, and provides a minimal in-memory cache so the same resource is not re-parsed across multiple test methods.</body>
        <file>src/test/java/org/eolang/lints/MonoLintsTest.java</file>
        <author>volodya-lombrozo</author>
        <email>volodya.lombrozo@gmail.com</email>
        <time>2026-05-20T10:01:59Z</time>
        <children/>
      </puzzle>
    </children>
  </puzzle>
  <puzzle alive="false">
    <issue href="https://github.com/objectionary/lints/issues/902" closed="2026-05-28T11:35:18+00:00">902</issue>
    <ticket>896</ticket>
    <estimate>60</estimate>
    <role>DEV</role>
    <id>896-45229a6d</id>
    <lines>20-25</lines>
    <body>Replace partial meta comparison with exact XMIR match. Currently the test only compares the ordered sequence of "head tail" strings extracted from the metas section. Since we have a clear 'input' and 'output' EO program in each YAML pack, we should compare the full XMIR structure of the fixed result against the expected XMIR, ignoring only volatile attributes such as @line numbers.</body>
    <file>src/test/java/org/eolang/lints/FxUnsortedMetasTest.java</file>
    <author>@volodya-lombrozo</author>
    <email>volodya.lombrozo@gmail.com</email>
    <time>2026-05-28T09:08:14Z</time>
    <children/>
  </puzzle>
  <puzzle alive="false">
    <issue href="https://github.com/objectionary/lints/issues/913" closed="2026-06-01T13:04:36+00:00">913</issue>
    <ticket>896</ticket>
    <estimate>30</estimate>
    <role>DEV</role>
    <id>896-2b0e002a</id>
    <lines>56-60</lines>
    <body>Replace String.format with FormattedText in this constructor. FxResource currently accepts a String, so String.format is used here, triggering ConstructorsCodeFreeCheck. Change FxResource to accept a Text object and pass new FormattedText("org/eolang/fixes/%s.xsl", xsl) instead, consistent with how ResourceOf is used for the lint and motive paths above.</body>
    <file>src/main/java/org/eolang/lints/LtByXsl.java</file>
    <author>@volodya-lombrozo</author>
    <email>volodya.lombrozo@gmail.com</email>
    <time>2026-06-01T09:57:43Z</time>
    <children/>
  </puzzle>
  <puzzle alive="false">
    <issue href="https://github.com/objectionary/lints/issues/914" closed="2026-06-02T09:59:17+00:00">914</issue>
    <ticket>896</ticket>
    <estimate>60</estimate>
    <role>DEV</role>
    <id>896-60b82aa8</id>
    <lines>54-59</lines>
    <body>Make FxResource accept full URL strings so that the fix path can be derived with the same LINTS_PATH pattern replacement used for motives, dropping the intermediate xsl variable. Currently FxResource.load() uses ClassLoader.getResource() which expects a classpath-relative path, not a full jar:/file: URL, so the two derivation approaches cannot be unified yet.</body>
    <file>src/main/java/org/eolang/lints/PkByXsl.java</file>
    <author>@volodya-lombrozo</author>
    <email>volodya.lombrozo@gmail.com</email>
    <time>2026-06-01T09:57:43Z</time>
    <children/>
  </puzzle>
  <puzzle alive="false">
    <issue href="https://github.com/objectionary/lints/issues/1072" closed="2026-07-24T08:10:22+00:00">1072</issue>
    <ticket>711</ticket>
    <estimate>45</estimate>
    <role>DEV</role>
    <id>711-48ded10d</id>
    <lines>384-388</lines>
    <body>Enable `hone` profile on all platforms after. For now, `hone-maven-plugin` fails on `macOS` and `Windows` machines. After the issue will be fixed, we should `&lt;os/&gt;` element from the `&lt;activation/&gt;` and keep `activeByDefault=true`. --&gt;</body>
    <file>pom.xml</file>
    <author>@volodya-lombrozo</author>
    <email>volodya.lombrozo@gmail.com</email>
    <time>2026-07-23T04:57:56Z</time>
    <children/>
  </puzzle>
  <puzzle alive="false">
    <issue href="https://github.com/objectionary/lints/issues/1212" closed="2026-08-25T16:34:27+00:00">1212</issue>
    <ticket>1172</ticket>
    <estimate>25</estimate>
    <role>DEV</role>
    <id>1172-e9cb8f30</id>
    <lines>4-7</lines>
    <body>Enable `catches-package-duplicate` after fix in EO parser. Current EO version fails to parse EO with multiple `+package` metas. See this for more details: https://github.com/objectionary/eo/issues/6395. Once it will be fixed and realised, we can enable this test again.</body>
    <file>src/test/resources/org/eolang/lints/packs/single/duplicate-metas/catches-package-duplicate.yaml</file>
    <author>Rultor.com</author>
    <email>gpg@rultor.com</email>
    <time>2026-08-07T13:39:04Z</time>
    <children/>
  </puzzle>
  <puzzle alive="false">
    <issue href="https://github.com/objectionary/lints/issues/1236" closed="2026-08-13T13:14:19+00:00">1236</issue>
    <ticket>1101</ticket>
    <estimate>30</estimate>
    <role>DEV</role>
    <id>1101-c0ed88ca</id>
    <lines>155-163</lines>
    <body>Decide whether canonical.eo should drop the `&gt;&gt;` on nested formations like `[i] &gt;&gt;`/`[i1] &gt;&gt;`, or whether `redundant-attachment` should gain a documented exception for formations that capture outer scope via `^`/`&#x3C1;`. The `&gt;&gt;` there is not structurally required (parsing and scope resolution work identically without it, verified empirically), but it may still be idiomatic for closures over outer state. Raise this with the EO language/parser maintainers; for now the lint is suppressed on canonical.eo via `+unlint redundant-attachment`.</body>
    <file>src/test/java/org/eolang/lints/SourceTest.java</file>
    <author>@volodya-lombrozo</author>
    <email>volodya.lombrozo@gmail.com</email>
    <time>2026-08-10T12:18:22Z</time>
    <children/>
  </puzzle>
  <puzzle alive="false">
    <issue>unknown</issue>
    <ticket>1321</ticket>
    <estimate>60</estimate>
    <role>DEV</role>
    <id>1321-6aa57021</id>
    <lines>45-102</lines>
    <body>Name the shapes this lint still misses. The compiler also leaves the recursion alone when the self-call is spelled "Phi.name" instead of "^.name", when the formation is reached other than by a plain application, as a decoratee or as the receiver of a dispatch, when an attribute holding a self-call is read from outside the formation, as in "range", and when two formations call each other. Each of those is syntactic, so each can be found here and reported with a reason of its own, the way the four below are. --&gt; &lt;!-- A nested formation that calls itself has its recursion turned into a Java loop, one copy of the object per step instead of one Java stack block, but only when the compiler recognises the shape. When it does not, the program still runs, only deeper and slower, and nothing says so at the call site. We say it here. --&gt; &lt;xsl:template match="/"&gt; &lt;defects&gt; &lt;xsl:for-each select="//o[eo:abstract(.) and @name and parent::o and o[@name='&#x3C6;']]"&gt; &lt;xsl:variable name="self" select="concat('&#x3BE;.&#x3C1;.', @name)"/&gt; &lt;xsl:variable name="root" select="o[@name='&#x3C6;']"/&gt; &lt;xsl:variable name="calls" select=".//o[@base = $self or starts-with(@base, concat($self, '.'))]"/&gt; &lt;xsl:variable name="loops" select="($root | $root//o)[@base = $self and eo:tail(., $root)]"/&gt; &lt;xsl:if test="exists($calls) and empty($loops)"&gt; &lt;defect&gt; &lt;xsl:variable name="line" select="eo:lineno($calls[1]/@line)"/&gt; &lt;xsl:attribute name="line"&gt; &lt;xsl:value-of select="$line"/&gt; &lt;/xsl:attribute&gt; &lt;xsl:if test="$line = '0'"&gt; &lt;xsl:attribute name="context"&gt; &lt;xsl:value-of select="eo:defect-context(.)"/&gt; &lt;/xsl:attribute&gt; &lt;/xsl:if&gt; &lt;xsl:attribute name="severity"&gt;warning&lt;/xsl:attribute&gt; &lt;xsl:attribute name="experimental"&gt;true&lt;/xsl:attribute&gt; &lt;xsl:text&gt;The recursion in &lt;/xsl:text&gt; &lt;xsl:value-of select="eo:escape(@name)"/&gt; &lt;xsl:text&gt; cannot be turned into a loop, &lt;/xsl:text&gt; &lt;xsl:choose&gt; &lt;xsl:when test="o[@name='&#x3BB;']"&gt; &lt;xsl:text&gt;the formation is an atom&lt;/xsl:text&gt; &lt;/xsl:when&gt; &lt;xsl:when test=".//o[contains(@base, '&#x3C6;')]"&gt; &lt;xsl:text&gt;its body reads its own &#x3C6;&lt;/xsl:text&gt; &lt;/xsl:when&gt; &lt;xsl:when test="$calls[starts-with(@base, concat($self, '.'))]"&gt; &lt;xsl:text&gt;the self-call is the receiver of a dispatch&lt;/xsl:text&gt; &lt;/xsl:when&gt; &lt;xsl:otherwise&gt; &lt;xsl:text&gt;no self-call sits in a tail position&lt;/xsl:text&gt; &lt;/xsl:otherwise&gt; &lt;/xsl:choose&gt; &lt;/defect&gt; &lt;/xsl:if&gt; &lt;/xsl:for-each&gt; &lt;/defects&gt; &lt;/xsl:template&gt;</body>
    <file>src/main/resources/org/eolang/lints/design/unoptimizable-recursion.xsl</file>
    <author>morphqdd</author>
    <email>europeDreadlyDevil@gmail.com</email>
    <time>2026-09-01T06:36:56Z</time>
    <children/>
  </puzzle>
  <puzzle alive="false">
    <issue href="https://github.com/objectionary/lints/issues/1336" closed="2026-09-06T06:11:58+00:00">1336</issue>
    <ticket>1046</ticket>
    <estimate>30</estimate>
    <role>DEV</role>
    <id>1046-9060248b</id>
    <lines>11-73</lines>
    <body>Report the exact physical line of the too-wide line inside a multi-line comment. Right now every offending line is reported with the comment block's own start @line, since the XSL has no way to compute the offset of a line within the tokenized comment text. Add a $pos-based offset (comment @line + position() - 1) so catches-multiline-wide-comment.yaml can assert on line 2 (the actual offending line) instead of line 1. --&gt; &lt;xsl:template match="/"&gt; &lt;xsl:variable name="max" select="100"/&gt; &lt;defects&gt; &lt;xsl:for-each select="/object/comments/comment"&gt; &lt;xsl:variable name="line" select="if (@line) then @line else '0'"/&gt; &lt;xsl:variable name="lines" select="tokenize(replace(., '\\n', '&amp;#10;'), '&amp;#10;')"/&gt; &lt;xsl:choose&gt; &lt;xsl:when test="count($lines) &amp;gt; 1"&gt; &lt;xsl:for-each select="$lines[string-length(.) &amp;gt; $max]"&gt; &lt;xsl:element name="defect"&gt; &lt;xsl:attribute name="line"&gt; &lt;xsl:value-of select="$line"/&gt; &lt;/xsl:attribute&gt; &lt;xsl:if test="$line = '0'"&gt; &lt;xsl:attribute name="context"&gt; &lt;xsl:value-of select="eo:defect-context(.)"/&gt; &lt;/xsl:attribute&gt; &lt;/xsl:if&gt; &lt;xsl:attribute name="severity"&gt; &lt;xsl:text&gt;warning&lt;/xsl:text&gt; &lt;/xsl:attribute&gt; &lt;xsl:text&gt;The comment line width is &lt;/xsl:text&gt; &lt;xsl:value-of select="string-length(.)"/&gt; &lt;xsl:text&gt;, while &lt;/xsl:text&gt; &lt;xsl:value-of select="$max"/&gt; &lt;xsl:text&gt; is max allowed&lt;/xsl:text&gt; &lt;/xsl:element&gt; &lt;/xsl:for-each&gt; &lt;/xsl:when&gt; &lt;xsl:otherwise&gt; &lt;xsl:if test="string-length(.) &amp;gt; $max"&gt; &lt;xsl:element name="defect"&gt; &lt;xsl:attribute name="line"&gt; &lt;xsl:value-of select="$line"/&gt; &lt;/xsl:attribute&gt; &lt;xsl:if test="$line = '0'"&gt; &lt;xsl:attribute name="context"&gt; &lt;xsl:value-of select="eo:defect-context(.)"/&gt; &lt;/xsl:attribute&gt; &lt;/xsl:if&gt; &lt;xsl:attribute name="severity"&gt; &lt;xsl:text&gt;warning&lt;/xsl:text&gt; &lt;/xsl:attribute&gt; &lt;xsl:text&gt;The comment width is &lt;/xsl:text&gt; &lt;xsl:value-of select="string-length(.)"/&gt; &lt;xsl:text&gt;, while &lt;/xsl:text&gt; &lt;xsl:value-of select="$max"/&gt; &lt;xsl:text&gt; is max allowed&lt;/xsl:text&gt; &lt;/xsl:element&gt; &lt;/xsl:if&gt; &lt;/xsl:otherwise&gt; &lt;/xsl:choose&gt; &lt;/xsl:for-each&gt; &lt;/defects&gt; &lt;/xsl:template&gt;</body>
    <file>src/main/resources/org/eolang/lints/comments/comment-is-too-wide.xsl</file>
    <author>@volodya-lombrozo</author>
    <email>volodya.lombrozo@gmail.com</email>
    <time>2026-09-01T14:42:11Z</time>
    <children/>
  </puzzle>
  <puzzle alive="false">
    <issue href="https://github.com/objectionary/lints/issues/1343" closed="2026-09-03T17:33:54+00:00">1343</issue>
    <ticket>1271</ticket>
    <estimate>30</estimate>
    <role>DEV</role>
    <id>1271-e767249a</id>
    <lines>25-28</lines>
    <body>Let XtLint accept EO sources (the {@code input:} pack key) in addition to raw XMIR documents, so that Java-implemented lints can be tested from EO programs the same way XSL-based lints are tested, instead of the hand-written {@code document:} blocks that the current packs use.</body>
    <file>src/test/java/org/eolang/lints/XtLint.java</file>
    <author>@rultor</author>
    <email>gpg@rultor.com</email>
    <time>2026-09-03T11:08:59Z</time>
    <children/>
  </puzzle>
  <puzzle alive="false">
    <issue>unknown</issue>
    <ticket>1321</ticket>
    <estimate>60</estimate>
    <role>DEV</role>
    <id>1321-eda8fa49</id>
    <lines>45-132</lines>
    <body>Name the shapes this lint still misses. The compiler also leaves the recursion alone when the self-call is spelled "Phi.name" instead of "^.name", when the formation is reached other than by a plain application, as a decoratee or as the receiver of a dispatch, when an attribute holding a self-call is read from outside the formation, as in "range", and when two formations call each other. Each of those is syntactic, so each can be found here and reported with a reason of its own, the way the four below are. --&gt; &lt;!-- TRUE when the @base is a self-call of the object with the given name, in any of the three forms the parser emits: the plain name resolves to "Phi.&lt;name&gt;", the "^" form to "xi.rho.&lt;name&gt;", and the "$" form to "xi.&lt;name&gt;". A dispatch on the self-call is also a self-call. --&gt; &lt;xsl:function name="eo:is-self-call" as="xs:boolean"&gt; &lt;xsl:param name="base" as="xs:string"/&gt; &lt;xsl:param name="name" as="xs:string"/&gt; &lt;xsl:sequence select="$base = concat('&#x3A6;.', $name) or starts-with($base, concat('&#x3A6;.', $name, '.')) or $base = concat('&#x3BE;.&#x3C1;.', $name) or starts-with($base, concat('&#x3BE;.&#x3C1;.', $name, '.')) or $base = concat('&#x3BE;.', $name) or starts-with($base, concat('&#x3BE;.', $name, '.'))"/&gt; &lt;/xsl:function&gt; &lt;!-- TRUE when the @base is a dispatch on a self-call, i.e. the self-call is the receiver and a method is dispatched on it. --&gt; &lt;xsl:function name="eo:is-self-dispatch" as="xs:boolean"&gt; &lt;xsl:param name="base" as="xs:string"/&gt; &lt;xsl:param name="name" as="xs:string"/&gt; &lt;xsl:sequence select="starts-with($base, concat('&#x3A6;.', $name, '.')) or starts-with($base, concat('&#x3BE;.&#x3C1;.', $name, '.')) or starts-with($base, concat('&#x3BE;.', $name, '.'))"/&gt; &lt;/xsl:function&gt; &lt;!-- TRUE when the @base is a self-call in a tail position: the plain call of the object, with no method dispatched on it. A dispatch on the self-call is never a tail call, because the receiver is evaluated, not the call. --&gt; &lt;xsl:function name="eo:is-self-tail" as="xs:boolean"&gt; &lt;xsl:param name="base" as="xs:string"/&gt; &lt;xsl:param name="name" as="xs:string"/&gt; &lt;xsl:sequence select="$base = concat('&#x3A6;.', $name) or $base = concat('&#x3BE;.&#x3C1;.', $name) or $base = concat('&#x3BE;.', $name)"/&gt; &lt;/xsl:function&gt; &lt;!-- A nested formation that calls itself has its recursion turned into a Java loop, one copy of the object per step instead of one Java stack block, but only when the compiler recognises the shape. When it does not, the program still runs, only deeper and slower, and nothing says so at the call site. We say it here. --&gt; &lt;xsl:template match="/"&gt; &lt;defects&gt; &lt;xsl:for-each select="//o[eo:abstract(.) and @name and o[@name='&#x3C6;']]"&gt; &lt;xsl:variable name="name" select="string(@name)"/&gt; &lt;xsl:variable name="root" select="o[@name='&#x3C6;']"/&gt; &lt;xsl:variable name="calls" select=".//o[eo:is-self-call(string(@base), $name)]"/&gt; &lt;xsl:variable name="loops" select="($root | $root//o)[eo:is-self-tail(string(@base), $name) and eo:tail(., $root)]"/&gt; &lt;xsl:if test="exists($calls) and empty($loops)"&gt; &lt;defect&gt; &lt;xsl:variable name="line" select="eo:lineno($calls[1]/@line)"/&gt; &lt;xsl:attribute name="line"&gt; &lt;xsl:value-of select="$line"/&gt; &lt;/xsl:attribute&gt; &lt;xsl:if test="$line = '0'"&gt; &lt;xsl:attribute name="context"&gt; &lt;xsl:value-of select="eo:defect-context(.)"/&gt; &lt;/xsl:attribute&gt; &lt;/xsl:if&gt; &lt;xsl:attribute name="severity"&gt;warning&lt;/xsl:attribute&gt; &lt;xsl:attribute name="experimental"&gt;true&lt;/xsl:attribute&gt; &lt;xsl:text&gt;The recursion in &lt;/xsl:text&gt; &lt;xsl:value-of select="eo:escape(@name)"/&gt; &lt;xsl:text&gt; cannot be turned into a loop, &lt;/xsl:text&gt; &lt;xsl:choose&gt; &lt;xsl:when test="o[@name='&#x3BB;']"&gt; &lt;xsl:text&gt;the formation is an atom&lt;/xsl:text&gt; &lt;/xsl:when&gt; &lt;xsl:when test=".//o[contains(@base, '&#x3C6;')]"&gt; &lt;xsl:text&gt;its body reads its own &#x3C6;&lt;/xsl:text&gt; &lt;/xsl:when&gt; &lt;xsl:when test="$calls[eo:is-self-dispatch(string(@base), $name)]"&gt; &lt;xsl:text&gt;the self-call is the receiver of a dispatch&lt;/xsl:text&gt; &lt;/xsl:when&gt; &lt;xsl:otherwise&gt; &lt;xsl:text&gt;no self-call sits in a tail position&lt;/xsl:text&gt; &lt;/xsl:otherwise&gt; &lt;/xsl:choose&gt; &lt;/defect&gt; &lt;/xsl:if&gt; &lt;/xsl:for-each&gt; &lt;/defects&gt; &lt;/xsl:template&gt;</body>
    <file>src/main/resources/org/eolang/lints/design/unoptimizable-recursion.xsl</file>
    <author>Vasilev Stas</author>
    <email>33578155+VasilevNStas@users.noreply.github.com</email>
    <time>2026-09-07T06:31:01Z</time>
    <children/>
  </puzzle>
  <puzzle alive="false">
    <issue href="https://github.com/objectionary/lints/issues/1421" closed="2026-09-09T06:08:47+00:00">1421</issue>
    <ticket>1419</ticket>
    <estimate>30</estimate>
    <role>DEV</role>
    <id>1419-4154c118</id>
    <lines>27-35</lines>
    <body>Emit a {@code rule} attribute on each generated {@code &lt;defect&gt;} element, carrying {@link Defect#rule()}. Right now the produced XML only has {@code line}, {@code severity}, and text, so a pack's {@code asserts:} can't check which rule fired a defect. This blocks moving Java tests such as {@code LtAsciiOnlyTest#setsRuleCorrectly} (and any similar rule-name assertion in other {@code Lt*Test} classes) into YAML packs. Once the attribute is added, convert those tests into packs with an {@code asserts:} XPath checking {@code @rule}.</body>
    <file>src/test/java/org/eolang/lints/XtLint.java</file>
    <author>@volodya-lombrozo</author>
    <email>volodya.lombrozo@gmail.com</email>
    <time>2026-09-07T12:19:41Z</time>
    <children>
      <puzzle alive="false">
        <issue href="https://github.com/objectionary/lints/issues/1429" closed="2026-09-09T15:29:15+00:00">1429</issue>
        <ticket>1421</ticket>
        <estimate>30</estimate>
        <role>DEV</role>
        <id>1421-d0131752</id>
        <lines>27-32</lines>
        <body>Move the rule-name assertions into YAML packs. Now that each {@code &lt;defect&gt;} carries {@code @rule}, a pack's {@code asserts:} can check which rule fired, so Java tests that exist only to assert a rule name, such as {@code LtAsciiOnlyTest#setsRuleCorrectly}, can become packs with an {@code asserts:} XPath on {@code @rule} and be deleted from Java.</body>
        <file>src/test/java/org/eolang/lints/XtLint.java</file>
        <author>@opusstudiohq-max</author>
        <email>opus.studio.hq@gmail.com</email>
        <time>2026-09-09T06:08:38Z</time>
        <children/>
      </puzzle>
    </children>
  </puzzle>
  <puzzle alive="false">
    <issue href="https://github.com/objectionary/lints/issues/1426" closed="2026-09-16T06:09:13+00:00">1426</issue>
    <ticket>1321</ticket>
    <estimate>60</estimate>
    <role>DEV</role>
    <id>1321-e3532044</id>
    <lines>45-132</lines>
    <body>Name the shapes this lint still misses. The compiler also leaves the recursion alone when the self-call is spelled "Phi.name" instead of "^.name", when the formation is reached other than by a plain application, as a decoratee or as the receiver of a dispatch, when an attribute holding a self-call is read from outside the formation, as in "range", and when two formations call each other. Each of those is syntactic, so each can be found here and reported with a reason of its own, the way the four below are. --&gt; &lt;!-- TRUE when the @base is a self-call of the object with the given name, in any of the three forms the parser emits: the plain name resolves to "Phi.&lt;name&gt;", the "^" form to "xi.rho.&lt;name&gt;", and the "$" form to "xi.&lt;name&gt;". A dispatch on the self-call is also a self-call. --&gt; &lt;xsl:function name="eo:is-self-call" as="xs:boolean"&gt; &lt;xsl:param name="base" as="xs:string"/&gt; &lt;xsl:param name="name" as="xs:string"/&gt; &lt;xsl:sequence select="$base = concat('&#x3A6;.', $name) or starts-with($base, concat('&#x3A6;.', $name, '.')) or $base = concat('&#x3BE;.&#x3C1;.', $name) or starts-with($base, concat('&#x3BE;.&#x3C1;.', $name, '.')) or $base = concat('&#x3BE;.', $name) or starts-with($base, concat('&#x3BE;.', $name, '.'))"/&gt; &lt;/xsl:function&gt; &lt;!-- TRUE when the @base is a dispatch on a self-call, i.e. the self-call is the receiver and a method is dispatched on it. --&gt; &lt;xsl:function name="eo:is-self-dispatch" as="xs:boolean"&gt; &lt;xsl:param name="base" as="xs:string"/&gt; &lt;xsl:param name="name" as="xs:string"/&gt; &lt;xsl:sequence select="starts-with($base, concat('&#x3A6;.', $name, '.')) or starts-with($base, concat('&#x3BE;.&#x3C1;.', $name, '.')) or starts-with($base, concat('&#x3BE;.', $name, '.'))"/&gt; &lt;/xsl:function&gt; &lt;!-- TRUE when the @base is a self-call in a tail position: the plain call of the object, with no method dispatched on it. A dispatch on the self-call is never a tail call, because the receiver is evaluated, not the call. --&gt; &lt;xsl:function name="eo:is-self-tail" as="xs:boolean"&gt; &lt;xsl:param name="base" as="xs:string"/&gt; &lt;xsl:param name="name" as="xs:string"/&gt; &lt;xsl:sequence select="$base = concat('&#x3A6;.', $name) or $base = concat('&#x3BE;.&#x3C1;.', $name) or $base = concat('&#x3BE;.', $name)"/&gt; &lt;/xsl:function&gt; &lt;!-- A nested formation that calls itself has its recursion turned into a Java loop, one copy of the object per step instead of one Java stack block, but only when the compiler recognises the shape. When it does not, the program still runs, only deeper and slower, and nothing says so at the call site. We say it here. --&gt; &lt;xsl:template match="/"&gt; &lt;defects&gt; &lt;xsl:for-each select="//o[eo:abstract(.) and @name and not(contains(@name, '&#x1F335;')) and o[@name='&#x3C6;']]"&gt; &lt;xsl:variable name="name" select="string(@name)"/&gt; &lt;xsl:variable name="root" select="o[@name='&#x3C6;']"/&gt; &lt;xsl:variable name="calls" select=".//o[eo:is-self-call(string(@base), $name)]"/&gt; &lt;xsl:variable name="loops" select="($root | $root//o)[eo:is-self-tail(string(@base), $name) and eo:tail(., $root)]"/&gt; &lt;xsl:if test="exists($calls) and empty($loops)"&gt; &lt;defect&gt; &lt;xsl:variable name="line" select="eo:lineno($calls[1]/@line)"/&gt; &lt;xsl:attribute name="line"&gt; &lt;xsl:value-of select="$line"/&gt; &lt;/xsl:attribute&gt; &lt;xsl:if test="$line = '0'"&gt; &lt;xsl:attribute name="context"&gt; &lt;xsl:value-of select="eo:defect-context(.)"/&gt; &lt;/xsl:attribute&gt; &lt;/xsl:if&gt; &lt;xsl:attribute name="severity"&gt;warning&lt;/xsl:attribute&gt; &lt;xsl:attribute name="experimental"&gt;true&lt;/xsl:attribute&gt; &lt;xsl:text&gt;The recursion in &lt;/xsl:text&gt; &lt;xsl:value-of select="eo:escape(@name)"/&gt; &lt;xsl:text&gt; cannot be turned into a loop, &lt;/xsl:text&gt; &lt;xsl:choose&gt; &lt;xsl:when test="o[@name='&#x3BB;']"&gt; &lt;xsl:text&gt;the formation is an atom&lt;/xsl:text&gt; &lt;/xsl:when&gt; &lt;xsl:when test=".//o[contains(@base, '&#x3C6;')]"&gt; &lt;xsl:text&gt;its body reads its own &#x3C6;&lt;/xsl:text&gt; &lt;/xsl:when&gt; &lt;xsl:when test="$calls[eo:is-self-dispatch(string(@base), $name)]"&gt; &lt;xsl:text&gt;the self-call is the receiver of a dispatch&lt;/xsl:text&gt; &lt;/xsl:when&gt; &lt;xsl:otherwise&gt; &lt;xsl:text&gt;no self-call sits in a tail position&lt;/xsl:text&gt; &lt;/xsl:otherwise&gt; &lt;/xsl:choose&gt; &lt;/defect&gt; &lt;/xsl:if&gt; &lt;/xsl:for-each&gt; &lt;/defects&gt; &lt;/xsl:template&gt;</body>
    <file>src/main/resources/org/eolang/lints/design/unoptimizable-recursion.xsl</file>
    <author>@evgeny</author>
    <email>113778529+gemshrine@users.noreply.github.com</email>
    <time>2026-09-07T20:16:14Z</time>
    <children/>
  </puzzle>
  <puzzle alive="true">
    <issue href="https://github.com/objectionary/lints/issues/1474">1474</issue>
    <ticket>1321</ticket>
    <estimate>60</estimate>
    <role>DEV</role>
    <id>1321-8d5877d7</id>
    <lines>46-133</lines>
    <body>Name the shapes this lint still misses. The compiler also leaves the recursion alone when the self-call is spelled "Phi.name" instead of "^.name", when the formation is reached other than by a plain application, as a decoratee or as the receiver of a dispatch, when an attribute holding a self-call is read from outside the formation, as in "range", and when two formations call each other. Each of those is syntactic, so each can be found here and reported with a reason of its own, the way the four below are. --&gt; &lt;!-- TRUE when the @base is a self-call of the object with the given name, in any of the three forms the parser emits: the plain name resolves to "Phi.&lt;name&gt;", the "^" form to "xi.rho.&lt;name&gt;", and the "$" form to "xi.&lt;name&gt;". A dispatch on the self-call is also a self-call. --&gt; &lt;xsl:function name="eo:is-self-call" as="xs:boolean"&gt; &lt;xsl:param name="base" as="xs:string"/&gt; &lt;xsl:param name="name" as="xs:string"/&gt; &lt;xsl:sequence select="$base = concat('&#x3A6;.', $name) or starts-with($base, concat('&#x3A6;.', $name, '.')) or $base = concat('&#x3BE;.&#x3C1;.', $name) or starts-with($base, concat('&#x3BE;.&#x3C1;.', $name, '.')) or $base = concat('&#x3BE;.', $name) or starts-with($base, concat('&#x3BE;.', $name, '.'))"/&gt; &lt;/xsl:function&gt; &lt;!-- TRUE when the @base is a dispatch on a self-call, i.e. the self-call is the receiver and a method is dispatched on it. --&gt; &lt;xsl:function name="eo:is-self-dispatch" as="xs:boolean"&gt; &lt;xsl:param name="base" as="xs:string"/&gt; &lt;xsl:param name="name" as="xs:string"/&gt; &lt;xsl:sequence select="starts-with($base, concat('&#x3A6;.', $name, '.')) or starts-with($base, concat('&#x3BE;.&#x3C1;.', $name, '.')) or starts-with($base, concat('&#x3BE;.', $name, '.'))"/&gt; &lt;/xsl:function&gt; &lt;!-- TRUE when the @base is a self-call in a tail position: the plain call of the object, with no method dispatched on it. A dispatch on the self-call is never a tail call, because the receiver is evaluated, not the call. --&gt; &lt;xsl:function name="eo:is-self-tail" as="xs:boolean"&gt; &lt;xsl:param name="base" as="xs:string"/&gt; &lt;xsl:param name="name" as="xs:string"/&gt; &lt;xsl:sequence select="$base = concat('&#x3A6;.', $name) or $base = concat('&#x3BE;.&#x3C1;.', $name) or $base = concat('&#x3BE;.', $name)"/&gt; &lt;/xsl:function&gt; &lt;!-- A nested formation that calls itself has its recursion turned into a Java loop, one copy of the object per step instead of one Java stack block, but only when the compiler recognises the shape. When it does not, the program still runs, only deeper and slower, and nothing says so at the call site. We say it here. --&gt; &lt;xsl:template match="/"&gt; &lt;defects&gt; &lt;xsl:for-each select="//o[eo:abstract(.) and @name and not(contains(@name, '&#x1F335;')) and o[@name='&#x3C6;']]"&gt; &lt;xsl:variable name="name" select="string(@name)"/&gt; &lt;xsl:variable name="root" select="o[@name='&#x3C6;']"/&gt; &lt;xsl:variable name="calls" select=".//o[eo:is-self-call(string(@base), $name) and not(ancestor::o[eo:test-name(@name)])]"/&gt; &lt;xsl:variable name="loops" select="($root | $root//o)[eo:is-self-tail(string(@base), $name) and eo:tail(., $root)]"/&gt; &lt;xsl:if test="exists($calls) and empty($loops)"&gt; &lt;defect&gt; &lt;xsl:variable name="line" select="eo:lineno($calls[1]/@line)"/&gt; &lt;xsl:attribute name="line"&gt; &lt;xsl:value-of select="$line"/&gt; &lt;/xsl:attribute&gt; &lt;xsl:if test="$line = '0'"&gt; &lt;xsl:attribute name="context"&gt; &lt;xsl:value-of select="eo:defect-context(.)"/&gt; &lt;/xsl:attribute&gt; &lt;/xsl:if&gt; &lt;xsl:attribute name="severity"&gt;warning&lt;/xsl:attribute&gt; &lt;xsl:attribute name="experimental"&gt;true&lt;/xsl:attribute&gt; &lt;xsl:text&gt;The recursion in &lt;/xsl:text&gt; &lt;xsl:value-of select="eo:escape(@name)"/&gt; &lt;xsl:text&gt; cannot be turned into a loop, &lt;/xsl:text&gt; &lt;xsl:choose&gt; &lt;xsl:when test="o[@name='&#x3BB;']"&gt; &lt;xsl:text&gt;the formation is an atom&lt;/xsl:text&gt; &lt;/xsl:when&gt; &lt;xsl:when test=".//o[contains(@base, '&#x3C6;')]"&gt; &lt;xsl:text&gt;its body reads its own &#x3C6;&lt;/xsl:text&gt; &lt;/xsl:when&gt; &lt;xsl:when test="$calls[eo:is-self-dispatch(string(@base), $name)]"&gt; &lt;xsl:text&gt;the self-call is the receiver of a dispatch&lt;/xsl:text&gt; &lt;/xsl:when&gt; &lt;xsl:otherwise&gt; &lt;xsl:text&gt;no self-call sits in a tail position&lt;/xsl:text&gt; &lt;/xsl:otherwise&gt; &lt;/xsl:choose&gt; &lt;/defect&gt; &lt;/xsl:if&gt; &lt;/xsl:for-each&gt; &lt;/defects&gt; &lt;/xsl:template&gt;</body>
    <file>src/main/resources/org/eolang/lints/design/unoptimizable-recursion.xsl</file>
    <author>Evgeny</author>
    <email>113778529+gemshrine@users.noreply.github.com</email>
    <time>2026-09-16T06:09:05Z</time>
    <children/>
  </puzzle>
</puzzles>
