<turbo-stream action="append" target="posts_list"><template>    <div class="postbit" id="388556" data-post-id="388556">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="ryanzidago" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/ryanzidago/120/40875_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  ryanzidago
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>Heya,</p>
<p>I don’t fully understand the objection here, even for new comers.<br>
Mind developping a bit more?</p>
<p>To me:</p>
<blockquote>
<p>This is especially true in cases where you don’t generally expect an error case and if you do you want it to raise/crash.</p>
</blockquote>
<ol>
<li>A function might as well return <code>value</code> and raise in case of errors instead of only returning <code>{:ok, value}</code> without ever returning <code>{:error, reason}</code>, especially since we have the pattern with the <code>!</code> functions.<br>
This is great for new comers because then they can learn the pattern of <code>!</code> functions vs. <code>{:ok, value} | {:error, reason}</code></li>
</ol>
<blockquote>
<p>I often thing about this bit of <a href="https://erlang.org/download/armstrong_thesis_2003.pdf" rel="nofollow">Joe Armstrong’s thesis</a></p>
</blockquote>
<ol start="2">
<li>The example from Joe Armstrong never really explain anything from the user experience (the users calling your application) point of view. I prefer bubbling up errors up to the “boundaries” of the application (web ui, cli, api, etc.) so then I can decide what to do instead of crashing in a deeply nested context functions and the user only ever seeing the live view refreshing the web page. I could rescue the error though it makes the code much harder to follow than bubbling up the error in the first place.<br>
This is also great for new comers because now they are forced to think: <code>!</code> functions mean the error is not worth informing the end user and <code>{:ok, value} | {:error, reason}</code> means it may be worth letting the end users know what’s going on.</li>
</ol>
<p>I personally realised that it’s much better for humans and AI agents the like to force them to think about the various error cases of their programs and have established pattern to reason about it (<code>!</code> vs. <code>{:ok, value} | {:error, reason}</code>).</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="388556" data-batch-url="/posts/batch_likers">
                        1
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/oedituscredo-a-pack-of-supplemental-credo-checks/74702/22">Post #21</a>
	                </div>
	            </div>
              <div id="likers-container-388556" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="388556"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #21"></div>
  </section>
</div>
    <div class="postbit" id="388557" data-post-id="388557">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="sodapopcan" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/sodapopcan/120/34668_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  sodapopcan
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>Just throwing my two cents in here as I’ve faced this recently.</p>
<p>TL;DR, I’m in agreement with the check as is.</p>
<p>I see <code>!</code> as a bit of a blessing and a curse, but ultimately more of a blessing.  I’ve never written Erlang in anger so I can’t speak to the hivemind there, but in Elixir you can never quite be sure if <code>:ok = foo()</code> was intentional or merely an experiment that slipped through the cracks.  Not even too long ago I had the mindset of <a class="mention" href="/u/cheerfulstoic" rel="nofollow">@cheerfulstoic</a>, but after purposefully using <code>:ok = foo()</code> it got flagged in code review with a “what happens in the event of no match?” and finding it hard to criticize anyone being confused by this.</p>
<p>While not everyone uses <code>!</code> to mean “it’s definitely going to raise for sure” (just one of the ways it’s cursed), generally when you see <code>foo!()</code> on its own line or <code>foo = foo!()</code>, it’s pretty clear what’s up.  And actually, pushing back on <a class="mention" href="/u/cheerfulstoic" rel="nofollow">@cheerfulstoic</a> a bit (oh feck, I just sounded like an LLM there, ugh ugh ugh, heck, ugh) 100% of the time I will take even the smallest step up from <code>MatchError</code> when furiously debugging production.</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="388557" data-batch-url="/posts/batch_likers">
                        1
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/oedituscredo-a-pack-of-supplemental-credo-checks/74702/23">Post #22</a>
	                </div>
	            </div>
              <div id="likers-container-388557" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="388557"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #22"></div>
  </section>
</div>
    <div class="postbit" id="388558" data-post-id="388558">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="mudasobwa" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/mudasobwa/120/5298_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  mudasobwa
                    <span class="op-star" title="Thread Starter">
                      <img alt="OP" class="op-star-icon" src="/assets/thread-icons/thread-icon-thread-starter-df91e872.png" />
                    </span>
                  </h3>
		          </div>
						
			          <div class="user-title">
									<span>Creator of Cure</span>
			          </div>
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<aside class="quote no-group" data-username="ryanzidago" data-post="22" data-topic="74702">
<div class="title">
<div class="quote-controls"></div>
<img alt="" width="24" height="24" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/ryanzidago/48/40875_2.png" class="avatar"> ryanzidago:</div>
<blockquote>
<p>The example from Joe Armstrong never really explain anything from the user experience (the users calling your application) point of view.</p>
</blockquote>
</aside>
<p>I could not disagree more. The Joe’s example is a perfect explanation of why non-exhaustive pattern-matches are even allowed in Erlang (unlike many other languages, especially strongly-typed, and in <a href="https://cure-lang.org" rel="noopener nofollow ugc">Cure</a> I went another path, demanding those, fwiw.)</p>
<p>On the other hand, there is no silver bullet. As always in CS we are aiming for the best balance between worse and the worst. If this library was a ‘code rewriter’ stuff, not a linter, I would have tended to agree with <a class="mention" href="/u/cheerfulstoic" rel="nofollow">@cheerfulstoic</a>.</p>
<p>But this is an opinionated <em>linter</em>. Opinionated enough to have defaults, and friendly enough to have overrides. Somewhere in the thread above, there is a reference to elixir core bug I reported, provoked by <code>:ok = …</code> match, that lately became non-exhaustive. I believe, the developer should be able to walk through all the ‘issues’ reported by these checks and either explicitly mark false positives with <code># credo:disable-for-…</code> or even switch this particular check off completely.</p>
<p>I don’t treat newcomers as idiots (my first PR to elixir core happened when my experience in elixir was counted by weeks,) and I am pretty sure even a newcomer might figure out that the check in linter library is not a dogma.</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="388558" data-batch-url="/posts/batch_likers">
                        0
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/oedituscredo-a-pack-of-supplemental-credo-checks/74702/24">Post #23</a>
	                </div>
	            </div>
              <div id="likers-container-388558" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="388558"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #23"></div>
  </section>
</div>
    <div class="postbit" id="388559" data-post-id="388559">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="mudasobwa" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/mudasobwa/120/5298_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  mudasobwa
                    <span class="op-star" title="Thread Starter">
                      <img alt="OP" class="op-star-icon" src="/assets/thread-icons/thread-icon-thread-starter-df91e872.png" />
                    </span>
                  </h3>
		          </div>
						
			          <div class="user-title">
									<span>Creator of Cure</span>
			          </div>
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<aside class="quote no-group" data-username="sodapopcan" data-post="23" data-topic="74702">
<div class="title">
<div class="quote-controls"></div>
<img alt="" width="24" height="24" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/sodapopcan/48/34668_2.png" class="avatar"> sodapopcan:</div>
<blockquote>
<p>but after purposefully using <code>:ok = foo()</code> it got flagged</p>
</blockquote>
</aside>
<p>There are functions, even in Elixir/Erlang core, returning <code>:ok</code>, like <code>Process.send/3</code> and many others. And there are linters, demanding no hanging calls (not matching the result to anything.)</p>
<p>So ugh, it’s tough to introduce linters. But I’m sharp. The check stays as it is.</p>
<p><img src="https://forum.elixirforum.com/images/emoji/apple/slight_smile.png?v=15" title=":slight_smile:" class="emoji only-emoji" alt=":slight_smile:" loading="lazy" width="20" height="20"></p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="388559" data-batch-url="/posts/batch_likers">
                        1
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/oedituscredo-a-pack-of-supplemental-credo-checks/74702/25">Post #24</a>
	                </div>
	            </div>
              <div id="likers-container-388559" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="388559"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #24"></div>
  </section>
</div>
    <div class="postbit" id="388607" data-post-id="388607">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="sodapopcan" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/sodapopcan/120/34668_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  sodapopcan
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>I’m agreeing, unless I totally misunderstood!  I was just using plain <code>:ok</code> as a short example, it wasn’t pertinent to my example, it could have just as easily been <code>{:ok, _foo} = ...</code>.  I took “hanging pattern matching” to mean “using pattern matching to assert an expression should never fail and blow up if it does.”  AFAIK with Erlang, this is the only option.  Elixir gives us <code>!</code> which we can use to be more explicit about it.</p>
<p>Although you maybe also just be further explaining and understand I’m agreeing, lol.  I dunno.</p>
<p>A big part of me always wants to have a match whenever there is a side-effect, at the very least a throw-away:</p>
<pre data-code-wrap="elixir"><code class="lang-elixir">_ = launch_missiles()
</code></pre>
<p>in which case I would want hanging matches.  But in practice I find myself never doing this.  And yet I do still pretty frequently find myself pausing when I see a function call that isn’t assigned to anything thinking it must be a mistake.</p>
<p>I feel I’m not expressing myself super well here and probably confusing this more <img src="https://forum.elixirforum.com/images/emoji/apple/sweat_smile.png?v=15" title=":sweat_smile:" class="emoji" alt=":sweat_smile:" loading="lazy" width="20" height="20"></p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="388607" data-batch-url="/posts/batch_likers">
                        2
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/oedituscredo-a-pack-of-supplemental-credo-checks/74702/26">Post #25</a>
	                </div>
	            </div>
              <div id="likers-container-388607" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="388607"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #25"></div>
  </section>
</div>
    <div class="postbit" id="390747" data-post-id="390747">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="mudasobwa" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/mudasobwa/120/5298_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  mudasobwa
                    <span class="op-star" title="Thread Starter">
                      <img alt="OP" class="op-star-icon" src="/assets/thread-icons/thread-icon-thread-starter-df91e872.png" />
                    </span>
                  </h3>
		          </div>
						
			          <div class="user-title">
									<span>Creator of Cure</span>
			          </div>
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p><strong><code>v0.8.0</code></strong> gracefully stolen from <a href="https://forum.elixirforum.com/t/excrap-a-library-to-calculate-change-risk-anti-patterns-crap-scores/75799/3" class="inline-onebox" rel="nofollow">ExCrap - a library to calculate Change Risk Anti-Patterns (CRAP scores) - #3 by mudasobwa</a> <code>CRAP</code> checks.</p>
<aside class="onebox allowlistedgeneric" data-onebox-src="https://oeditus-credo.hexdocs.pm/OeditusCredo.Check.Refactoring.ChangeRiskAntiPatterns.html">
  <header class="source">

      <a href="https://oeditus-credo.hexdocs.pm/OeditusCredo.Check.Refactoring.ChangeRiskAntiPatterns.html" target="_blank" rel="noopener nofollow ugc">oeditus-credo.hexdocs.pm</a>
  </header>

  <article class="onebox-body">
    

<h3><a href="https://oeditus-credo.hexdocs.pm/OeditusCredo.Check.Refactoring.ChangeRiskAntiPatterns.html" target="_blank" rel="noopener nofollow ugc">OeditusCredo.Check.Refactoring.ChangeRiskAntiPatterns — OeditusCredo v0.8.1</a></h3>



  </article>

  <div class="onebox-metadata">
    
    
  </div>

  <div style="clear: both"></div>
</aside>
 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="390747" data-batch-url="/posts/batch_likers">
                        0
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/oedituscredo-a-pack-of-supplemental-credo-checks/74702/27">Post #26</a>
	                </div>
	            </div>
              <div id="likers-container-390747" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="390747"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #26"></div>
  </section>
</div>
    <div class="postbit" id="390758" data-post-id="390758">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="fuelen" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/fuelen/120/9870_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  fuelen
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>Why would you need MissingTelemetryInObanWorker if Oban emits telemetry events by itself?</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="390758" data-batch-url="/posts/batch_likers">
                        0
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/oedituscredo-a-pack-of-supplemental-credo-checks/74702/28">Post #27</a>
	                </div>
	            </div>
              <div id="likers-container-390758" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="390758"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #27"></div>
  </section>
</div>
    <div class="postbit" id="390772" data-post-id="390772">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="mudasobwa" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/mudasobwa/120/5298_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  mudasobwa
                    <span class="op-star" title="Thread Starter">
                      <img alt="OP" class="op-star-icon" src="/assets/thread-icons/thread-icon-thread-starter-df91e872.png" />
                    </span>
                  </h3>
		          </div>
						
			          <div class="user-title">
									<span>Creator of Cure</span>
			          </div>
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>I had my reason, but you’re not the first person asking so I ditched it in <code>v0.8.1</code>.</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="390772" data-batch-url="/posts/batch_likers">
                        0
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/oedituscredo-a-pack-of-supplemental-credo-checks/74702/29">Post #28</a>
	                </div>
	            </div>
              <div id="likers-container-390772" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="390772"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #28"></div>
  </section>
</div>
    <div class="postbit" id="392495" data-post-id="392495">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="mudasobwa" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/mudasobwa/120/5298_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  mudasobwa
                    <span class="op-star" title="Thread Starter">
                      <img alt="OP" class="op-star-icon" src="/assets/thread-icons/thread-icon-thread-starter-df91e872.png" />
                    </span>
                  </h3>
		          </div>
						
			          <div class="user-title">
									<span>Creator of Cure</span>
			          </div>
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>Heads up!</p>
<p><code>oeditus_credo</code> <code>v0.10.2</code> has just landed. It adds several opinionated checks, as “prefer inplace <code>%{} = map</code> instead of <code>is_map(map)</code> guard”, “prefer pattern matches over conditional operators” and so on.</p>
<p>Excerpt from the changelog:</p>
<h2><a name="p-392495-h-0102httpsgithubcomoeditusoeditus_credoreleasestagv0102-2026-08-07-1" class="anchor" href="#p-392495-h-0102httpsgithubcomoeditusoeditus_credoreleasestagv0102-2026-08-07-1" aria-label="Heading link" rel="nofollow"></a><a href="https://github.com/oeditus/oeditus_credo/releases/tag/v0.10.2" rel="noopener nofollow ugc">0.10.2</a> - 2026-08-07</h2>
<ul>
<li>
<p>5 idiomatic refactoring checks:</p>
<ul>
<li><code>PreferStringBoundariesOverRegex</code> - Detects <code>Regex.match?</code> for prefix/suffix checks instead of <code>String.starts_with?/2</code> and <code>String.ends_with?/2</code></li>
<li><code>PreferFunctionCapture</code> - Detects <code>fn x -&gt; Module.func(x) end</code> instead of <code>&amp;Module.func/1</code></li>
<li><code>PreferShortFieldAccessCapture</code> - Detects <code>fn x -&gt; x.field end</code> instead of <code>&amp; &amp;1.field</code></li>
<li><code>PreferMapMerge</code> - Detects chained <code>Map.put</code> calls instead of a single <code>Map.merge/2</code></li>
<li><code>AvoidUnawaitedTaskAsync</code> - Detects fire-and-forget <code>Task.async</code> whose handle is discarded</li>
</ul>
</li>
<li>
<p>9 idiomatic refactoring checks:</p>
<ul>
<li><code>PreferDestructuring</code> - Detects <code>elem/2</code> and <code>Map.get/2</code> with literal keys instead of pattern match destructuring</li>
<li><code>PreferMultiHeadForNil</code> - Detects <code>is_nil/1</code> guards instead of multi-head clauses matching <code>nil</code></li>
<li><code>PreferWithClause</code> - Detects nested <code>case</code> statements (pyramid of doom) instead of <code>with</code></li>
<li><code>PreferTaggedTuplesForErrors</code> - Detects <code>try...rescue</code> used as control flow instead of tagged tuples</li>
<li><code>PreferForComprehensionOverFilterMap</code> - Detects <code>Enum.filter |&gt; Enum.map</code> instead of a <code>for</code> comprehension</li>
<li><code>PreferListPrepend</code> - Detects O(N) <code>list ++ [item]</code> appends instead of <code>[item | list]</code></li>
<li><code>PreferPatternMatchingForEmptiness</code> - Detects <code>Enum.count(list) &gt; 0</code> instead of matching <code>[_ | _]</code> or <code>[]</code></li>
<li><code>PreferDotAccessForStructs</code> - Detects <code>struct[:field]</code> bracket access instead of <code>struct.field</code></li>
<li><code>AvoidSinglePipe</code> - Detects single-stage pipes <code>x |&gt; f()</code> instead of a direct call <code>f(x)</code></li>
</ul>
</li>
<li>
<p>6 idiomatic refactoring checks:</p>
<ul>
<li><code>PreferCasePatternMatching</code> - Detects <code>if</code>/<code>cond</code> where <code>case</code> pattern matching is preferred</li>
<li><code>PreferMultiHeadFunction</code> - Detects parameter branching inside function body instead of multi-head clauses</li>
<li><code>PreferPipelineOperator</code> - Detects sequential assignments instead of pipe operator <code>|&gt;</code></li>
<li><code>PreferInplaceMapMatching</code> - Detects <code>is_map/1</code> guard instead of inplace <code>%{} = map</code> pattern matching</li>
<li><code>PreferInplaceListMatching</code> - Detects O(N) <code>length/1</code> calls in guards instead of <code>[_ | _]</code> or <code>[]</code></li>
<li><code>PreferInplaceBinaryMatching</code> - Detects <code>is_binary</code> non-empty guards instead of <code>&lt;&lt;_::utf8, _::binary&gt;&gt;</code></li>
</ul>
</li>
</ul>
<p>If your eyes are not bleeding seeing <code>cond</code> with several branches and/or <code>if</code> with a body of several LoCs, you don’t need to update, I think.</p>
<p>Enjoy!</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="392495" data-batch-url="/posts/batch_likers">
                        2
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/oedituscredo-a-pack-of-supplemental-credo-checks/74702/30">Post #29</a>
	                </div>
	            </div>
              <div id="likers-container-392495" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="392495"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #29"></div>
  </section>
</div>
    <div class="postbit" id="392505" data-post-id="392505">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="mudasobwa" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/mudasobwa/120/5298_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  mudasobwa
                    <span class="op-star" title="Thread Starter">
                      <img alt="OP" class="op-star-icon" src="/assets/thread-icons/thread-icon-thread-starter-df91e872.png" />
                    </span>
                  </h3>
		          </div>
						
			          <div class="user-title">
									<span>Creator of Cure</span>
			          </div>
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p><code>v0.11.0</code> comes with lightweight checks. Instead of doing the proper AST traversion and blow up CI, one now can use skills generated by <code>mix oeditus_assistant_skill claude/gemini/openai</code> locally, or plug the github action reporting issues directly as PR comments with suggestions, generated by <code>mix oeditus_assistant_gha</code>.</p>
<p>Let some people enjoy and some hate me for being not AI-madness resistant.</p>
<aside class="onebox allowlistedgeneric" data-onebox-src="https://oeditus-credo.hexdocs.pm/readme.html#ai-assistant-automation-tasks">
  <header class="source">

      <a href="https://oeditus-credo.hexdocs.pm/readme.html#ai-assistant-automation-tasks" target="_blank" rel="noopener nofollow ugc">oeditus-credo.hexdocs.pm</a>
  </header>

  <article class="onebox-body">
    

<h3><a href="https://oeditus-credo.hexdocs.pm/readme.html#ai-assistant-automation-tasks" target="_blank" rel="noopener nofollow ugc">AI Assistant &amp; Automation Tasks - README — OeditusCredo v0.11.0</a></h3>

  <p>Custom Credo checks for detecting common Elixir/Phoenix anti-patterns, mistakes, and CWE Top 25 security vulnerabilities.</p>


  </article>

  <div class="onebox-metadata">
    
    
  </div>

  <div style="clear: both"></div>
</aside>
 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="392505" data-batch-url="/posts/batch_likers">
                        2
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/oedituscredo-a-pack-of-supplemental-credo-checks/74702/31">Post #30</a>
	                </div>
	            </div>
              <div id="likers-container-392505" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="392505"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-last-post cat-last-post" title="Last post!"></div>
  </section>
</div>
</template></turbo-stream><turbo-stream action="replace" target="load-more-container"><template><div id="load-more-container" class="load-more-container">
    <span class="all-loaded">— All posts loaded —</span>
</div></template></turbo-stream>