Aquileo | mrbusche.com blogStuff mrbusche has learned2026-02-27T16:42:00Zhttps://mrbusche.com/Matt BuscheAquileo | GitHub Actions - Dynamic Status Checks2026-02-27T16:42:00Zhttps://mrbusche.com/2026/02/27/github-actions-dynamic-status-checks/<p>If you maintain a library of Docker images, you know the power of the strategy matrix in GitHub Actions. It's the easiest way to support multiple language versions (Node 22, 24, 25) across different OS variants (Debian 12, 13) without writing a thousand lines of YAML.</p><p>But there's a catch: Required Status Checks.</p><pre class="language-yaml" tabindex="0"><code class="language-yaml"><span class="token key atrule">jobs</span><span class="token punctuation">:</span>
<span class="token key atrule">build</span><span class="token punctuation">:</span>
<span class="token key atrule">strategy</span><span class="token punctuation">:</span>
<span class="token key atrule">matrix</span><span class="token punctuation">:</span>
<span class="token key atrule">node-versions</span><span class="token punctuation">:</span> <span class="token punctuation">[</span><span class="token number">25</span><span class="token punctuation">,</span> <span class="token number">24</span><span class="token punctuation">,</span> <span class="token number">22</span><span class="token punctuation">,</span> <span class="token number">20</span><span class="token punctuation">]</span>
<span class="token key atrule">debian-versions</span><span class="token punctuation">:</span> <span class="token punctuation">[</span><span class="token number">13</span><span class="token punctuation">,</span> <span class="token number">12</span><span class="token punctuation">]</span>
<span class="token key atrule">runs-on</span><span class="token punctuation">:</span> ubuntu<span class="token punctuation">-</span>latest
<span class="token key atrule">steps</span><span class="token punctuation">:</span>
<span class="token punctuation">-</span> <span class="token key atrule">run</span><span class="token punctuation">:</span> echo "Building Docker image<span class="token punctuation">...</span>"</code></pre><p>When you point a GitHub branch protection rule at a specific matrix job, it looks for a static name like <code>build (node-25, debian-13)</code>. As soon as you bump your matrix to Node 26, the old check disappears, and the new one, <code>build (node-26, debian-13)</code>, isn't recognized as the "required" check yet. Your PRs end up stuck in a "Waiting for status to be reported" state.</p><p>To combat this, I implemented an <code>all-checks-passed</code> job. Instead of making the individual matrix names "required" in repository settings, you can make this single, static job the required one.</p><pre class="language-yaml" tabindex="0"><code class="language-yaml"><span class="token key atrule">jobs</span><span class="token punctuation">:</span>
<span class="token key atrule">build</span><span class="token punctuation">:</span>
<span class="token key atrule">strategy</span><span class="token punctuation">:</span>
<span class="token key atrule">matrix</span><span class="token punctuation">:</span>
<span class="token key atrule">node-versions</span><span class="token punctuation">:</span> <span class="token punctuation">[</span><span class="token number">25</span><span class="token punctuation">,</span> <span class="token number">24</span><span class="token punctuation">,</span> <span class="token number">22</span><span class="token punctuation">,</span> <span class="token number">20</span><span class="token punctuation">]</span>
<span class="token key atrule">debian-versions</span><span class="token punctuation">:</span> <span class="token punctuation">[</span><span class="token number">13</span><span class="token punctuation">,</span> <span class="token number">12</span><span class="token punctuation">]</span>
<span class="token key atrule">runs-on</span><span class="token punctuation">:</span> ubuntu<span class="token punctuation">-</span>latest
<span class="token key atrule">steps</span><span class="token punctuation">:</span>
<span class="token punctuation">-</span> <span class="token key atrule">run</span><span class="token punctuation">:</span> echo "Building Docker image<span class="token punctuation">...</span>"
<span class="token key atrule">all-checks-passed</span><span class="token punctuation">:</span>
<span class="token key atrule">runs-on</span><span class="token punctuation">:</span> ubuntu<span class="token punctuation">-</span>latest
<span class="token key atrule">needs</span><span class="token punctuation">:</span> <span class="token punctuation">[</span>build<span class="token punctuation">]</span> <span class="token comment"># List your dynamic job here</span>
<span class="token key atrule">if</span><span class="token punctuation">:</span> always() <span class="token comment"># Ensures this runs even if others fail</span>
<span class="token key atrule">steps</span><span class="token punctuation">:</span>
<span class="token punctuation">-</span> <span class="token key atrule">name</span><span class="token punctuation">:</span> Check status of all required jobs
<span class="token key atrule">run</span><span class="token punctuation">:</span> <span class="token punctuation">|</span><span class="token scalar string">
if [[ "${{ contains(needs.*.result, 'failure') ||
contains(needs.*.result, 'cancelled') }}" == "true" ]]; then
echo "One or more dynamic checks failed."
exit 1
fi
echo "All checks passed!"</span></code></pre>Aquileo | Uses2025-07-06T23:54:31Zhttps://mrbusche.com/uses/<h2 id="editor-terminal">Editor + Terminal</h2><ul><li>Visual Studio Code for JavaScript and HTML development</li><li>IntelliJ IDEA for any Java based back end work</li><li>PyCharm or VS Code for Python</li><li>Prefer Cursor when it's available</li></ul><h2 id="desktop-apps">Desktop Apps</h2><ul><li>Personal<ul><li>I use Google Keep for any note taking and Google Tasks for any recurring reminders</li><li>Backup through Google Drive</li><li>I use <a href="https://github.com/ScoopInstaller/Scoop">scoop</a> to install apps when possible</li></ul></li><li>Work<ul><li>I use One Note for notes and Microsoft ToDo for any recurring reminders</li><li>Backup through OneDrive</li><li>Applications are managed through SNAP in an Ubuntu Amazon workspace</li></ul></li></ul><h2 id="hardware">Hardware</h2><ul><li>Personal<ul><li><a href="https://www.microsoft.com/en-us/d/surface-laptop-studio/8srdf62swkpf">Surface Laptop Studio</a></li></ul></li><li>Work<ul><li>HP ZBook Power G11 with an Ubuntu Amazon workspace</li></ul></li><li>I use the <a href="https://www.microsoft.com/en-us/d/microsoft-ergonomic-keyboard/93841ngdwr1h">Microsoft Ergonomic Keyboard</a> and a <a href="https://www.logitech.com/en-us/products/mice/mx-master-3s.html">Logitech MX Master 3S</a></li></ul>Aquileo | Using Poetry with platform argument2025-03-06T16:54:00Zhttps://mrbusche.com/2025/03/06/using-poetry-with-platform-argument/<p>Poetry has recently become our enterprise standard, but it still lacking some features that <code>pip</code> provides. Thankfully, a pull request has been opened to <a href="https://github.com/python-poetry/poetry-plugin-bundle/pull/123">add the platform flag</a>. Unfortunately, it has not yet been merged.</p><p>To get things working, you can install poetry 2.0.1 and the latest commit from the pull request repo. If you're feeling risky, you could point to the branch, but we were more comfortable pointing to a specific commit</p><pre class="language-python" tabindex="0"><code class="language-python">python3 <span class="token operator">-</span>m pip install poetry<span class="token operator">==</span><span class="token number">2.0</span><span class="token number">.1</span>
python3 <span class="token operator">-</span>m pip install git<span class="token operator">+</span>BrandonLWhite<span class="token operator">/</span>poetry<span class="token operator">-</span>plugin<span class="token operator">-</span>bundle<span class="token operator">-</span>bw<span class="token punctuation">.</span>git@640529e823cd2cb678831409e646c1f641279953
python3 <span class="token operator">-</span>m poetry bundle <span class="token operator">-</span><span class="token operator">-</span>platform manylinux2014_x86_64</code></pre>Aquileo | Book Notes - LLMs in Production2024-12-20T11:40:30Zhttps://mrbusche.com/2024/12/20/book-notes-llms-in-production/<p><a href="https://www.manning.com/books/llms-in-production">LLMs in production</a></p><p>A word of warning: Embrace the future now All new technology meets resistance and has critics; despite this, technologies keep being adopted, and progress continues. In business, technology can give a company an unprecedented advantage. There's no shortage of stories of companies failing because they didn't adapt to new technologies. We can learn a lot from their failures</p><p>Like all other skills, your proximity and willingness to get involved are the two main blockers to knowledge, not a degree or ability to notate—these only shorten your journey toward being heard and understood. If you don't have any experience in this area, it might be good to start by first developing an intuition around what an LLM is and needs by contributing to a project like OpenAssistant. If you're a human, that's exactly what LLMs need. By volunteering, you can start understanding what these models train on and why. If you fall anywhere, from no knowledge up to being a professional machine learning engineer, we'll be imparting the knowledge necessary to shorten your time to understanding considerably.</p><p>Our current understanding of language is that language is made up of at least five parts: phonetics, syntax, semantics, pragmatics, and morphology. Each of these portions contributes significantly to the overall experience and meaning being ingested by the listener in any conversation.</p><ul><li>Phonetics is probably the easiest for a language model to ingest, as it involves the actual sound of the language. This is where accent manifests and deals with the production and perception of speech sounds, with phonology focusing on the way sounds are organized within a particular language system.</li><li>Syntax is the place where current LLMs are highest-performing, both in parsing syntax from the user and generating its own. Syntax is generally what we think of as grammar and word order; it is the study of how words can combine to form phrases, clauses, and sentences. Syntax is also the first place language-learning programs start to help people acquire new languages, especially based on where they are coming from natively</li><li>Semantics are the literal encoded meaning of words in utterances, which changes at breakneck speed in waves. People automatically optimize semantic meaning by only using words they consider meaningful in the current language epoch.</li></ul><p>In the seminal paper, "Attention Is All You Need," [1] Vaswani et al. take the mathematical shortcut several steps further, positing that for performance, absolutely no recurrence (the "R" in RNN) or any convolutions are needed at all.</p><p>Reasoning and Acting (ReAct) is a few-shot framework for prompting that is meant to emulate how people reason and make decisions when learning new tasks. [10] It involves a multistep process for the LLM, where a question is asked, the model determines an action, and then observes and reasons upon the results of that action to determine subsequent actions.</p><p>PUSHING THE BOUNDARIES OF COMPRESSION After going down to int4, there are experimental quantization strategies for going even further down to int2. Int2 70B models still perform decently, much to many peoples' surprise.</p><p>We can enhance this approach in an important way that we haven't touched on yet: using knowledge graphs. Knowledge graphs store information in a structure that captures relationships between entities. This structure consists of nodes that represent objects and edges that represent relationships. A graph database like NEO4J makes it easy to create and query knowledge graphs. And as it turns out, knowledge graphs are amazing at answering more complex multipart questions where you need to connect the dots between linked pieces of information. Because they've already connected the dots for us</p>Aquileo | Links - Morgan Stanley uses AI evals to shape the future of financial services2024-12-06T16:01:30Zhttps://mrbusche.com/2024/12/06/morgan-stanley-ai-evals-finacial-services/<p>Sharing this post on <a href="https://openai.com/index/morgan-stanley/">Morgan Stanley and AI</a> from the OpenAI blog.</p><blockquote><p>"This technology makes you as smart as the smartest person in the organization. Each client is different, and AI helps us cater to each client's unique needs." Jeff McMillan, Head of Firmwide AI at Morgan Stanley</p></blockquote><h2 id="evals">Evals</h2><blockquote><p>To evaluate GPT-4's performance against their experts, Morgan Stanley ran summarization evals to test how effectively the model condensed vast amounts of intellectual capital and process-driven content into concise summaries. Advisors and prompt engineers graded AI responses for accuracy and coherence, allowing the team to refine prompts and improve output quality.</p></blockquote><p>The biggest takeaway</p><blockquote><p>The eval framework wasn't static; it evolved as the team learned.</p></blockquote><p>This should be expected with Generative AI, your eval framework should not be static, and your project is never <em>done</em>.</p><h2 id="expanding-the-corpus">Expanding the corpus</h2><p>This is massive and extremely well done</p><blockquote><p>"We went from being able to answer 7,000 questions to a place where we can now effectively answer any question from a corpus of 100,000 documents," says David Wu, Head of Firmwide AI Product & Architecture Strategy at Morgan Stanley.</p></blockquote><h2 id="adoption">Adoption</h2><blockquote><p>over 98% adoption in wealth management</p></blockquote><p>!! !! !!</p><blockquote><p>Their strong eval framework has also unlocked a flywheel for future solutions and services.</p></blockquote><p>I am currently reading <a href="https://itrevolution.com/product/the-value-flywheel-effect/">The Value Flywheel Effect</a> so this really resonated with me.</p><p>They've tackled the two hardest obstacles, in my opinion, they've created a very successful project AND gotten widespread adoption. When stakeholders are bought in like this, releasing additional projects should have a much lower barrier to entry.</p>Aquileo | Links - Lucky Maverick | The Secret to Success - Mimic Evolution2024-12-06T15:26:30Zhttps://mrbusche.com/2024/12/06/jonathan-bales-mimic-evolution/<p>Sharing this post from <a href="https://luckymaverick.substack.com/p/evolution">Jonathan Bales on Evolution</a>.</p><blockquote><p>most decisions <a href="https://luckymaverick.substack.com/p/how-to-improve-your-decisions-immediately">really don't matter</a>.</p></blockquote><h2 id="what-to-learn-from-evolution">What to Learn from Evolution</h2><blockquote><p>You can be dumb and still fund hug success, as long as you</p><ul><li>Perfect the trial-and-error cycle</li></ul></blockquote><p>The faster you can make the trial-and-error cycle work, the quicker you can find success</p><blockquote><p>The best way to speed up your learning curve: <a href="https://luckymaverick.substack.com/p/how-to-get-better-at-anything-asap">be extreme</a>.</p><ul><li>Don't suppress chaos</li></ul></blockquote><h2 id="less-data">Less Data</h2><blockquote><p>You don't always need more data. Usually, you need less.</p></blockquote><blockquote><p>The more data we have, the more likely we are to drown in it. - Taleb</p></blockquote><p>This quote is so true, we wait to make a decision when we have way too much information. We could have made an educated decision months ago, but we continually delay to reduce our risk of failure. If you don't take chances, you'll never fail, but you'll also never learn to overcome adversity.</p><h2 id="removing-fragility">Removing Fragility</h2><h3 id="avoid-risk-of-ruin">Avoid risk of ruin</h3><blockquote><p>You should take on all kinds of risk when there's nothing to lose.</p></blockquote><h3 id="admit-how-little-you-know">Admit how little you know</h3><blockquote><p>Overconfidence is fragility.</p></blockquote>Aquileo | Amazon Nova foundation models2024-12-06T14:54:00Zhttps://mrbusche.com/2024/12/06/amazon-nova/<p>Amazon announced their <a href="https://aws.amazon.com/blogs/aws/introducing-amazon-nova-frontier-intelligence-and-industry-leading-price-performance/">Amazon Nova foundation models</a> on December 3, 2024. The main features are low cost and low latency.</p><h2 id="amazon-nova">Amazon Nova</h2><h3 id="micro">Micro</h3><ul><li>very low cost</li><li>text-only</li><li>great for summarization, translation, and classification</li><li>128k token context</li></ul><h3 id="lite">Lite</h3><ul><li>Multimodal<ul><li>Multiple images</li><li>Up to 30 minutes of video</li></ul></li><li>300k token context</li><li>Find-tuning with model distillation is available</li></ul><h3 id="pro">Pro</h3><ul><li>Similar to Lite but with more accuracy</li><li>Serves as a teacher model to distill custom varians of Lite and Micro</li></ul><h3 id="premier">Premier</h3><ul><li>Availability in early 2025</li></ul><p>Simon Willison compares them to the <a href="https://simonwillison.net/2024/Dec/4/amazon-nova/">Google Gemini family of models</a>.</p><p>Costs for micro are $0.035 per million input and $0.14 for output, $0.06 and $0.24 for lite, and $0.80 and $3.20 for Pro. The micro model is slightly cheaper than Gemini 1.5 Flash-8B and appears to be the cheapest model available.</p>Aquileo | Links - No Priors Ep. 91 | With Cohere Co-Founder and CEO Aidan Gomez2024-12-06T11:54:00Zhttps://mrbusche.com/2024/12/06/cohere-ceo-aidan-gomez-on-the-future-of-ai/<p>This <a href="https://www.youtube.com/watch?v=2XRpTZpHjfc">interview with Cohere CEO Aidan Gomez</a> is a must watch (or listen) for anyone interested in AI. Here are some key takeaways:</p><ul><li>The role of "luck and chance" in his journey.</li><li>The smallest nuance can significantly impact language model outputs, highlighting the need for robust and reliable models (Cohere is trying to build models with this in mind).</li><li>Tailoring AI solutions to specific needs, like generating medically relevant summaries for a doctor based on a simple phrase like "My knee hurts." vs requiring them to look through 20 years of patient notes.</li><li>Listening to customers is crucial for identifying valuable applications. We are not even close to having all the answers with LLMs.</li><li>Begin with the most cost-effective solutions and gradually build complexity. You shouldn't be starting from scratch is most use cases.</li><li>Waiting 6-12 months can dramatically reduce development costs (specifically referring to building an LLM). Staying on the bleeding edge may be profitable but waiting 6-12 months and taking advantage of everything learned is more profitable.</li></ul>Aquileo | Links - Seth Godin Severe weather alert2024-12-02T22:46:30Zhttps://mrbusche.com/2024/12/02/seth-godin-severe-weather-alert/<p>Like a lot of Seth Godin posts, this one is short but impactful, <a href="https://seths.blog/2024/11/severe-weather-alert/">Severe Weather Alert</a></p><p>He discusses getting an alert every day about severe weather in his area, but now it's just "weather"</p><blockquote><p>We think that regularly alerting people to something is likely to get their attention again and again.</p></blockquote><p>The more an application cries wolf, the more likely we are to ignore it</p>Aquileo | Amazon Bedrock Updates for November 20242024-12-01T21:25:30Zhttps://mrbusche.com/2024/12/01/amazon-bedrock-updates-november-2024/<h2 id="reducing-hallucinations-in-large-language-models-with-custom-intervention-using-amazon-bedrock-agents"><a href="https://aws.amazon.com/blogs/machine-learning/reducing-hallucinations-in-large-language-models-with-custom-intervention-using-amazon-bedrock-agents/">Reducing hallucinations in large language models with custom intervention using Amazon Bedrock Agents</a></h2><ul><li>Amazon Bedrock Guardrails offers hallucination detection and grounding checks (existing functionality)</li><li>You can develop a custom hallucination score using RAGAS to reject generated responses (requires SNS)</li></ul><h2 id="amazon-bedrock-flows-is-now-generally-available"><a href="https://aws.amazon.com/blogs/machine-learning/amazon-bedrock-flows-is-now-generally-available-with-enhanced-safety-and-traceability/">Amazon Bedrock Flows is now generally available</a></h2><ul><li>Prompt Flows are named to Amazon Bedrock Flows (Microsoft also uses the name Prompt Flows)</li><li>You can now filter harmful content using Prompt node and Knowledge base node</li><li>Improved traceability - you can now quickly debug workflows with traceability of input and outputs</li></ul><h2 id="prompt-optimization-on-amazon-bedrock"><a href="https://aws.amazon.com/blogs/machine-learning/improve-the-performance-of-your-generative-ai-applications-with-prompt-optimization-on-amazon-bedrock/">Prompt Optimization on Amazon Bedrock</a></h2><ul><li>This is exactly what it sounds like, you provide a prompt and your prompt is optimized for use with a specific model, which can result in significant improvements for Gen AI tasks</li></ul>