<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
<title type="text">Tiberriver256</title>
<generator uri="https://github.com/mojombo/jekyll">Jekyll</generator>
<link rel="self" type="application/atom+xml" href="https://tiberriver256.github.io/feed.xml" />
<link rel="alternate" type="text/html" href="https://tiberriver256.github.io" />
<updated>2026-04-04T10:00:32-04:00</updated>
<id>https://tiberriver256.github.io/</id>
<author>
  <name>Micah Rairdon</name>
  <uri>https://tiberriver256.github.io/</uri>
  <email>Jun(Real Email: Micah.Rairdon [GMail])k@JunkMail.com</email>
</author>


<entry>
  <title type="html"><![CDATA[Stop Reviewing Lint (AI Agents & Theory of Constraints)]]></title>
 <link rel="alternate" type="text/html" href="https://tiberriver256.github.io/ai%20and%20technology/you-are-the-bottleneck/" />
  <id>https://tiberriver256.github.io/ai%20and%20technology/you-are-the-bottleneck</id>
  <updated>2026-04-04T00:00:00-00:00</updated>
  <published>2026-04-04T00:00:00-04:00</published>
  
  <author>
    <name>Micah Rairdon</name>
    <uri>https://tiberriver256.github.io</uri>
    <email>Jun(Real Email: Micah.Rairdon [GMail])k@JunkMail.com</email>
  </author>
  <content type="html">
    &lt;style&gt;
.toc-section { margin: 4rem 0; max-width: none; font: inherit; opacity: 0; transform: translateY(24px); transition: opacity 0.6s ease, transform 0.6s ease; }
:where(.toc-section) div { margin: 0; max-width: none; font: inherit; }
.toc-section.visible { opacity: 1; transform: translateY(0); }
.toc-scene { margin: 2rem 0; text-align: center; max-width: none; }
.toc-scene svg { display: block; max-width: 100%; height: auto; margin: 0 auto; }
.toc-scene svg text { fill: currentColor; }
.toc-scene svg .label { opacity: 0.7; }
.toc-scene svg .accent { fill: #8eca9d; }
.toc-scene svg .warn { fill: #d90; }
.toc-scene svg .bad { fill: #a33; }
.toc-scene svg line { stroke: currentColor; opacity: 0.2; }
.toc-scene svg circle { transition: opacity 0.4s ease; }
.toc-em { background: rgba(142, 202, 157, 0.25); padding: 2px 6px; border-radius: 3px; }
.toc-math { font-family: SFMono-Regular, Menlo, Monaco, Consolas, monospace; font-size: 90%; line-height: 2.2; margin: 1.5rem 0; padding-left: 1rem; border-left: 3px solid #8eca9d; }
.toc-math .total { font-weight: 700; border-top: 1px solid currentColor; padding-top: 0.5rem; margin-top: 0.5rem; opacity: 0.9; }
.toc-big { font-size: 1.5rem; font-weight: 700; }
.toc-def { margin: 1.5rem 0; font-size: 1rem; line-height: 2; }
.toc-pipeline { margin: 2rem 0; max-width: none; }
.toc-pipeline-stats { display: flex; gap: 1.5rem; flex-wrap: wrap; margin: 0 0 1rem; max-width: none; font-size: 0.9rem; }
.toc-pipeline-stats strong { font-weight: 700; }
.toc-pipeline-controls { display: flex; gap: 0.75rem; flex-wrap: wrap; align-items: center; margin: 0; max-width: none; }
.toc-btn { display: inline-flex; align-items: center; justify-content: center; appearance: none; -webkit-appearance: none; padding: 0.5rem 1.25rem; font: inherit; font-size: 0.875rem; line-height: 1.2; border: 2px solid #8eca9d; border-radius: 999px; background: transparent; cursor: pointer; color: inherit; transition: background 0.2s, opacity 0.2s; }
.toc-btn:hover { background: rgba(142, 202, 157, 0.15); }
.toc-btn-dim { border-color: currentColor; opacity: 0.5; }
.toc-btn-dim:hover { opacity: 0.8; }
.toc-btn-disabled { opacity: 0.3; cursor: default; pointer-events: none; }
.toc-link { appearance: none; -webkit-appearance: none; padding: 0; border: 0; background: transparent; font: inherit; font-size: 0.75rem; opacity: 0.6; text-decoration: underline; cursor: pointer; margin-left: 0.5rem; color: inherit; }
.toc-link:hover { opacity: 1; }
.toc-btn:focus-visible, .toc-link:focus-visible { outline: 2px solid #8eca9d; outline-offset: 2px; }
.toc-note { font-size: 0.85rem; opacity: 0.7; font-style: italic; margin-top: 2rem; }
@media (prefers-color-scheme: dark) {
  .toc-scene svg .bad { fill: #e06666; }
}
&lt;/style&gt;

&lt;noscript&gt;&lt;style&gt;.toc-section { opacity: 1; transform: none; }&lt;/style&gt;&lt;/noscript&gt;

&lt;p&gt;&lt;em&gt;Part of a series on getting more done with AI coding agents, using the &lt;a href=&quot;https://en.wikipedia.org/wiki/Theory_of_constraints#The_five_focusing_steps&quot;&gt;5 Focusing Steps&lt;/a&gt; from Theory of Constraints.&lt;/em&gt;&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;Here’s the situation. You have AI coding agents. They write code for you. You want to ship more of it, faster.&lt;/p&gt;

&lt;p&gt;The obvious move: make the agents faster. Run more of them in parallel.&lt;/p&gt;

&lt;p&gt;That move is wrong. A 40-year-old idea from manufacturing explains why.&lt;/p&gt;

&lt;div class=&quot;toc-section&quot; data-anim=&quot;&quot;&gt;

&lt;h2&gt;A recipe from a factory floor&lt;/h2&gt;

Theory of Constraints says every system has exactly one bottleneck. Improve anything *other* than that bottleneck and you&apos;re wasting time.

It gives you five steps. In order.

&lt;div class=&quot;toc-def&quot;&gt;
&lt;div&gt;&lt;strong&gt;1. Identify&lt;/strong&gt; the constraint&lt;/div&gt;
&lt;div&gt;&lt;strong&gt;2. Exploit&lt;/strong&gt; — squeeze every drop from existing capacity&lt;/div&gt;
&lt;div&gt;&lt;strong&gt;3. Subordinate&lt;/strong&gt; — align everything else around it&lt;/div&gt;
&lt;div&gt;&lt;strong&gt;4. Elevate&lt;/strong&gt; — add real capacity&lt;/div&gt;
&lt;div&gt;&lt;strong&gt;5. Repeat&lt;/strong&gt;&lt;/div&gt;
&lt;/div&gt;

It&apos;s a simple recipe, but hard to follow because people always want to skip to step 4.

This series walks all five, applied to AI coding agents. Let&apos;s start at the top.
&lt;/div&gt;

&lt;div class=&quot;toc-section&quot; data-anim=&quot;&quot;&gt;

&lt;h2&gt;Step 1: Find the constraint&lt;/h2&gt;

This dot is you.

&lt;div class=&quot;toc-scene&quot;&gt;
&lt;svg viewBox=&quot;0 0 460 70&quot; aria-label=&quot;You — the constraint — represented as a single dot&quot;&gt;
&lt;circle cx=&quot;230&quot; cy=&quot;30&quot; r=&quot;8&quot; fill=&quot;currentColor&quot; /&gt;
&lt;text x=&quot;230&quot; y=&quot;55&quot; text-anchor=&quot;middle&quot; font-size=&quot;11&quot; class=&quot;label&quot;&gt;you&lt;/text&gt;
&lt;/svg&gt;
&lt;/div&gt;

You review code that AI agents write. Nothing ships until you say so.

That makes you the &lt;span class=&quot;toc-em&quot;&gt;constraint&lt;/span&gt;, because the system moves at the speed you can read.

In every AI-assisted dev team I&apos;ve seen, the human reviewer is the bottleneck. Your agents produce more code in an hour than you can review in a day. You will always have more input than you can handle.

Step 1: done.
&lt;/div&gt;

&lt;div class=&quot;toc-section&quot; data-anim=&quot;&quot;&gt;

&lt;h2&gt;Step 2: Exploit the constraint&lt;/h2&gt;

&lt;span class=&quot;toc-em&quot;&gt;Exploit&lt;/span&gt; sounds aggressive. It just means: make sure the bottleneck never wastes a cycle. You must be busy doing high-value work. Don&apos;t fiddle with tooling. Don&apos;t waste your time on nitpicky things. Automate as much as you can.

What&apos;s eating your review time right now? Let&apos;s find out.
&lt;/div&gt;

&lt;div class=&quot;toc-section&quot; data-anim=&quot;&quot;&gt;

&lt;h2&gt;Your agents just dropped off 10 PRs&lt;/h2&gt;

&lt;p&gt;They&apos;re fast! Good for them.&lt;/p&gt;

&lt;div class=&quot;toc-scene&quot;&gt;
&lt;svg viewBox=&quot;0 0 460 70&quot; aria-label=&quot;Ten PRs represented as numbered dots&quot;&gt;
&lt;circle cx=&quot;50&quot; cy=&quot;30&quot; r=&quot;8&quot; fill=&quot;currentColor&quot; /&gt;&lt;text x=&quot;50&quot; y=&quot;55&quot; text-anchor=&quot;middle&quot; font-size=&quot;10&quot; class=&quot;label&quot;&gt;1&lt;/text&gt;
&lt;circle cx=&quot;90&quot; cy=&quot;30&quot; r=&quot;8&quot; fill=&quot;currentColor&quot; /&gt;&lt;text x=&quot;90&quot; y=&quot;55&quot; text-anchor=&quot;middle&quot; font-size=&quot;10&quot; class=&quot;label&quot;&gt;2&lt;/text&gt;
&lt;circle cx=&quot;130&quot; cy=&quot;30&quot; r=&quot;8&quot; fill=&quot;currentColor&quot; /&gt;&lt;text x=&quot;130&quot; y=&quot;55&quot; text-anchor=&quot;middle&quot; font-size=&quot;10&quot; class=&quot;label&quot;&gt;3&lt;/text&gt;
&lt;circle cx=&quot;170&quot; cy=&quot;30&quot; r=&quot;8&quot; fill=&quot;currentColor&quot; /&gt;&lt;text x=&quot;170&quot; y=&quot;55&quot; text-anchor=&quot;middle&quot; font-size=&quot;10&quot; class=&quot;label&quot;&gt;4&lt;/text&gt;
&lt;circle cx=&quot;210&quot; cy=&quot;30&quot; r=&quot;8&quot; fill=&quot;currentColor&quot; /&gt;&lt;text x=&quot;210&quot; y=&quot;55&quot; text-anchor=&quot;middle&quot; font-size=&quot;10&quot; class=&quot;label&quot;&gt;5&lt;/text&gt;
&lt;circle cx=&quot;250&quot; cy=&quot;30&quot; r=&quot;8&quot; fill=&quot;currentColor&quot; /&gt;&lt;text x=&quot;250&quot; y=&quot;55&quot; text-anchor=&quot;middle&quot; font-size=&quot;10&quot; class=&quot;label&quot;&gt;6&lt;/text&gt;
&lt;circle cx=&quot;290&quot; cy=&quot;30&quot; r=&quot;8&quot; fill=&quot;currentColor&quot; /&gt;&lt;text x=&quot;290&quot; y=&quot;55&quot; text-anchor=&quot;middle&quot; font-size=&quot;10&quot; class=&quot;label&quot;&gt;7&lt;/text&gt;
&lt;circle cx=&quot;330&quot; cy=&quot;30&quot; r=&quot;8&quot; fill=&quot;currentColor&quot; /&gt;&lt;text x=&quot;330&quot; y=&quot;55&quot; text-anchor=&quot;middle&quot; font-size=&quot;10&quot; class=&quot;label&quot;&gt;8&lt;/text&gt;
&lt;circle cx=&quot;370&quot; cy=&quot;30&quot; r=&quot;8&quot; fill=&quot;currentColor&quot; /&gt;&lt;text x=&quot;370&quot; y=&quot;55&quot; text-anchor=&quot;middle&quot; font-size=&quot;10&quot; class=&quot;label&quot;&gt;9&lt;/text&gt;
&lt;circle cx=&quot;410&quot; cy=&quot;30&quot; r=&quot;8&quot; fill=&quot;currentColor&quot; /&gt;&lt;text x=&quot;410&quot; y=&quot;55&quot; text-anchor=&quot;middle&quot; font-size=&quot;10&quot; class=&quot;label&quot;&gt;10&lt;/text&gt;
&lt;/svg&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;div class=&quot;toc-section&quot; data-anim=&quot;&quot;&gt;

&lt;h2&gt;Uh oh&lt;/h2&gt;

&lt;div class=&quot;toc-scene&quot;&gt;
&lt;svg viewBox=&quot;0 0 460 80&quot; aria-label=&quot;Nine bad PRs shown in red, one good PR in default color&quot;&gt;
&lt;circle cx=&quot;50&quot; cy=&quot;30&quot; r=&quot;8&quot; class=&quot;bad&quot; /&gt;&lt;text x=&quot;50&quot; y=&quot;55&quot; text-anchor=&quot;middle&quot; font-size=&quot;9&quot; class=&quot;bad&quot;&gt;bad&lt;/text&gt;
&lt;circle cx=&quot;90&quot; cy=&quot;30&quot; r=&quot;8&quot; class=&quot;bad&quot; /&gt;&lt;text x=&quot;90&quot; y=&quot;55&quot; text-anchor=&quot;middle&quot; font-size=&quot;9&quot; class=&quot;bad&quot;&gt;bad&lt;/text&gt;
&lt;circle cx=&quot;130&quot; cy=&quot;30&quot; r=&quot;8&quot; class=&quot;bad&quot; /&gt;&lt;text x=&quot;130&quot; y=&quot;55&quot; text-anchor=&quot;middle&quot; font-size=&quot;9&quot; class=&quot;bad&quot;&gt;bad&lt;/text&gt;
&lt;circle cx=&quot;170&quot; cy=&quot;30&quot; r=&quot;8&quot; class=&quot;bad&quot; /&gt;&lt;text x=&quot;170&quot; y=&quot;55&quot; text-anchor=&quot;middle&quot; font-size=&quot;9&quot; class=&quot;bad&quot;&gt;bad&lt;/text&gt;
&lt;circle cx=&quot;210&quot; cy=&quot;30&quot; r=&quot;8&quot; class=&quot;bad&quot; /&gt;&lt;text x=&quot;210&quot; y=&quot;55&quot; text-anchor=&quot;middle&quot; font-size=&quot;9&quot; class=&quot;bad&quot;&gt;bad&lt;/text&gt;
&lt;circle cx=&quot;250&quot; cy=&quot;30&quot; r=&quot;8&quot; class=&quot;bad&quot; /&gt;&lt;text x=&quot;250&quot; y=&quot;55&quot; text-anchor=&quot;middle&quot; font-size=&quot;9&quot; class=&quot;bad&quot;&gt;bad&lt;/text&gt;
&lt;circle cx=&quot;290&quot; cy=&quot;30&quot; r=&quot;8&quot; class=&quot;bad&quot; /&gt;&lt;text x=&quot;290&quot; y=&quot;55&quot; text-anchor=&quot;middle&quot; font-size=&quot;9&quot; class=&quot;bad&quot;&gt;bad&lt;/text&gt;
&lt;circle cx=&quot;330&quot; cy=&quot;30&quot; r=&quot;8&quot; class=&quot;bad&quot; /&gt;&lt;text x=&quot;330&quot; y=&quot;55&quot; text-anchor=&quot;middle&quot; font-size=&quot;9&quot; class=&quot;bad&quot;&gt;bad&lt;/text&gt;
&lt;circle cx=&quot;370&quot; cy=&quot;30&quot; r=&quot;8&quot; class=&quot;bad&quot; /&gt;&lt;text x=&quot;370&quot; y=&quot;55&quot; text-anchor=&quot;middle&quot; font-size=&quot;9&quot; class=&quot;bad&quot;&gt;bad&lt;/text&gt;
&lt;circle cx=&quot;410&quot; cy=&quot;30&quot; r=&quot;8&quot; fill=&quot;currentColor&quot; /&gt;&lt;text x=&quot;410&quot; y=&quot;55&quot; text-anchor=&quot;middle&quot; font-size=&quot;9&quot; class=&quot;label&quot;&gt;ok&lt;/text&gt;
&lt;/svg&gt;
&lt;/div&gt;

&lt;p&gt;9 out of 10 have problems. But wait...&lt;/p&gt;
&lt;/div&gt;

&lt;div class=&quot;toc-section&quot; data-anim=&quot;&quot;&gt;

&lt;h2&gt;Most of those problems are &lt;em&gt;dumb&lt;/em&gt;&lt;/h2&gt;

&lt;p&gt;Wrong indentation, missing semicolons, someone forgot to run the formatter.&lt;/p&gt;

&lt;p&gt;Only &lt;strong&gt;2&lt;/strong&gt; have actual bugs — the kind that need your brain.&lt;/p&gt;

&lt;div class=&quot;toc-scene&quot;&gt;
&lt;svg viewBox=&quot;0 0 460 80&quot; aria-label=&quot;Seven trivial issues in yellow, two real bugs in red, one clean&quot;&gt;
&lt;circle cx=&quot;50&quot; cy=&quot;30&quot; r=&quot;8&quot; class=&quot;warn&quot; /&gt;&lt;text x=&quot;50&quot; y=&quot;55&quot; text-anchor=&quot;middle&quot; font-size=&quot;8&quot; class=&quot;label&quot;&gt;trivial&lt;/text&gt;
&lt;circle cx=&quot;90&quot; cy=&quot;30&quot; r=&quot;8&quot; class=&quot;warn&quot; /&gt;&lt;text x=&quot;90&quot; y=&quot;55&quot; text-anchor=&quot;middle&quot; font-size=&quot;8&quot; class=&quot;label&quot;&gt;trivial&lt;/text&gt;
&lt;circle cx=&quot;130&quot; cy=&quot;30&quot; r=&quot;8&quot; class=&quot;warn&quot; /&gt;&lt;text x=&quot;130&quot; y=&quot;55&quot; text-anchor=&quot;middle&quot; font-size=&quot;8&quot; class=&quot;label&quot;&gt;trivial&lt;/text&gt;
&lt;circle cx=&quot;170&quot; cy=&quot;30&quot; r=&quot;8&quot; class=&quot;warn&quot; /&gt;&lt;text x=&quot;170&quot; y=&quot;55&quot; text-anchor=&quot;middle&quot; font-size=&quot;8&quot; class=&quot;label&quot;&gt;trivial&lt;/text&gt;
&lt;circle cx=&quot;210&quot; cy=&quot;30&quot; r=&quot;8&quot; class=&quot;warn&quot; /&gt;&lt;text x=&quot;210&quot; y=&quot;55&quot; text-anchor=&quot;middle&quot; font-size=&quot;8&quot; class=&quot;label&quot;&gt;trivial&lt;/text&gt;
&lt;circle cx=&quot;250&quot; cy=&quot;30&quot; r=&quot;8&quot; class=&quot;warn&quot; /&gt;&lt;text x=&quot;250&quot; y=&quot;55&quot; text-anchor=&quot;middle&quot; font-size=&quot;8&quot; class=&quot;label&quot;&gt;trivial&lt;/text&gt;
&lt;circle cx=&quot;290&quot; cy=&quot;30&quot; r=&quot;8&quot; class=&quot;warn&quot; /&gt;&lt;text x=&quot;290&quot; y=&quot;55&quot; text-anchor=&quot;middle&quot; font-size=&quot;8&quot; class=&quot;label&quot;&gt;trivial&lt;/text&gt;
&lt;circle cx=&quot;330&quot; cy=&quot;30&quot; r=&quot;8&quot; class=&quot;bad&quot; /&gt;&lt;text x=&quot;330&quot; y=&quot;55&quot; text-anchor=&quot;middle&quot; font-size=&quot;8&quot; class=&quot;label&quot;&gt;real bug&lt;/text&gt;
&lt;circle cx=&quot;370&quot; cy=&quot;30&quot; r=&quot;8&quot; class=&quot;bad&quot; /&gt;&lt;text x=&quot;370&quot; y=&quot;55&quot; text-anchor=&quot;middle&quot; font-size=&quot;8&quot; class=&quot;label&quot;&gt;real bug&lt;/text&gt;
&lt;circle cx=&quot;410&quot; cy=&quot;30&quot; r=&quot;8&quot; fill=&quot;currentColor&quot; /&gt;&lt;text x=&quot;410&quot; y=&quot;55&quot; text-anchor=&quot;middle&quot; font-size=&quot;8&quot; class=&quot;label&quot;&gt;clean&lt;/text&gt;
&lt;/svg&gt;
&lt;/div&gt;

&lt;p&gt;&lt;em&gt;7 trivial · 2 real bugs · 1 clean&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;

&lt;div class=&quot;toc-section&quot; data-anim=&quot;&quot;&gt;

&lt;h2&gt;Without CI: all 10 land on your desk&lt;/h2&gt;

&lt;p&gt;Go ahead, send some through:&lt;/p&gt;

&lt;div class=&quot;toc-pipeline&quot; id=&quot;pipeline-no-ci&quot;&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;div class=&quot;toc-section&quot; data-anim=&quot;&quot;&gt;

&lt;h2&gt;So here&apos;s what just happened&lt;/h2&gt;

&lt;div class=&quot;toc-math&quot;&gt;
&lt;div&gt;10 first reviews&lt;/div&gt;
&lt;div&gt;+ 9 re-reviews&lt;/div&gt;
&lt;div class=&quot;total&quot;&gt;= up to 19 reviews&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;And 7 of those round-trips? For stuff a computer could catch in 2 seconds.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;You — the scarce resource, the only person who can hit merge — spent your afternoon being a spellchecker.&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;

&lt;div class=&quot;toc-section&quot; data-anim=&quot;&quot;&gt;

&lt;h2&gt;What if we put some cheap robots in front?&lt;/h2&gt;

&lt;p&gt;A linter and a formatter. Nothing fancy, and these have existed forever.&lt;/p&gt;

&lt;div class=&quot;toc-scene&quot;&gt;
&lt;svg viewBox=&quot;0 0 460 70&quot; aria-label=&quot;Pipeline showing linter and formatter before tech lead&quot;&gt;
&lt;circle cx=&quot;100&quot; cy=&quot;30&quot; r=&quot;6&quot; class=&quot;accent&quot; /&gt;&lt;text x=&quot;100&quot; y=&quot;55&quot; text-anchor=&quot;middle&quot; font-size=&quot;10&quot; class=&quot;label&quot;&gt;linter&lt;/text&gt;
&lt;line x1=&quot;115&quot; y1=&quot;30&quot; x2=&quot;175&quot; y2=&quot;30&quot; /&gt;
&lt;circle cx=&quot;190&quot; cy=&quot;30&quot; r=&quot;6&quot; class=&quot;accent&quot; /&gt;&lt;text x=&quot;190&quot; y=&quot;55&quot; text-anchor=&quot;middle&quot; font-size=&quot;10&quot; class=&quot;label&quot;&gt;formatter&lt;/text&gt;
&lt;line x1=&quot;205&quot; y1=&quot;30&quot; x2=&quot;275&quot; y2=&quot;30&quot; /&gt;
&lt;circle cx=&quot;290&quot; cy=&quot;30&quot; r=&quot;8&quot; fill=&quot;currentColor&quot; /&gt;&lt;text x=&quot;290&quot; y=&quot;10&quot; text-anchor=&quot;middle&quot; font-size=&quot;9&quot; class=&quot;label&quot;&gt;constraint ↓&lt;/text&gt;&lt;text x=&quot;290&quot; y=&quot;55&quot; text-anchor=&quot;middle&quot; font-size=&quot;11&quot; font-weight=&quot;700&quot;&gt;you&lt;/text&gt;
&lt;/svg&gt;
&lt;/div&gt;

&lt;p&gt;They check every PR &lt;em&gt;before&lt;/em&gt; it reaches you, so the dumb stuff gets bounced instantly. You never see it.&lt;/p&gt;
&lt;/div&gt;

&lt;div class=&quot;toc-section&quot; data-anim=&quot;&quot;&gt;

&lt;h2&gt;Same 10 PRs. This time with robots.&lt;/h2&gt;

&lt;p&gt;Try it:&lt;/p&gt;

&lt;div class=&quot;toc-pipeline&quot; id=&quot;pipeline-with-ci&quot;&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;div class=&quot;toc-section&quot; data-anim=&quot;&quot;&gt;

&lt;h2&gt;Look at that&lt;/h2&gt;

&lt;div class=&quot;toc-math&quot;&gt;
&lt;div&gt;3 first reviews&lt;/div&gt;
&lt;div&gt;+ 2 re-reviews (the real bugs)&lt;/div&gt;
&lt;div class=&quot;total&quot;&gt;= 5 reviews&lt;/div&gt;
&lt;/div&gt;

&lt;span class=&quot;toc-big&quot;&gt;19 → 5&lt;/span&gt;

&lt;p&gt;You&apos;re the same person with the same hours and the same brain. The only difference is less garbage in front of it.&lt;/p&gt;
&lt;/div&gt;

&lt;div class=&quot;toc-section&quot; data-anim=&quot;&quot;&gt;

&lt;h2&gt;That&apos;s Step 2&lt;/h2&gt;

&lt;p&gt;The linter didn&apos;t make you faster. It made sure that when you &lt;em&gt;do&lt;/em&gt; review something, it&apos;s worth reviewing.&lt;/p&gt;

&lt;p&gt;This is boring on purpose. Linters have existed for decades. If your agents submit PRs that fail lint, go set up CI. We&apos;ll wait.&lt;/p&gt;

&lt;p&gt;The boring stuff matters because it&apos;s &lt;em&gt;cheap&lt;/em&gt;. You don&apos;t need a workflow rewrite or new tools, just a CI pipeline that catches problems a computer solves in 2 seconds.&lt;/p&gt;
&lt;/div&gt;

&lt;div class=&quot;toc-section&quot; data-anim=&quot;&quot;&gt;

&lt;h2&gt;What everyone tries next&lt;/h2&gt;

&lt;p&gt;The pitch: &lt;em&gt;&quot;Run 5 agents in parallel! 10x throughput!&quot;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Your agents now produce 50 PRs a day.&lt;/p&gt;

&lt;p&gt;You still review 5.&lt;/p&gt;

&lt;p&gt;The other 45 sit there, going stale and accumulating merge conflicts.&lt;/p&gt;

&lt;p&gt;That didn&apos;t increase &lt;strong&gt;throughput&lt;/strong&gt;. It increased &lt;strong&gt;inventory&lt;/strong&gt; — work piling up in front of the constraint, rotting.&lt;/p&gt;

&lt;p&gt;Step 3 of Theory of Constraints has a name for the rule you just broke: &lt;span class=&quot;toc-em&quot;&gt;Subordinate&lt;/span&gt;. Don&apos;t let non-constraints produce faster than the constraint can consume.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;That&apos;s a future post.&lt;/em&gt;&lt;/p&gt;

&lt;p class=&quot;toc-note&quot;&gt;This series applies the 5 Focusing Steps to AI coding agents. We&apos;re in Step 2 — Exploit. Linters are just the start.&lt;/p&gt;
&lt;/div&gt;

&lt;script&gt;
(function() {
  // Scroll-triggered animations
  const observer = new IntersectionObserver((entries) =&gt; {
    entries.forEach(entry =&gt; {
      if (entry.isIntersecting) {
        entry.target.classList.add(&apos;visible&apos;);
        // Initialize pipeline if this section contains one
        const pipelineEl = entry.target.querySelector(&apos;.toc-pipeline&apos;);
        if (pipelineEl &amp;&amp; !pipelineEl.dataset.init) {
          pipelineEl.dataset.init = &apos;1&apos;;
          const hasCI = pipelineEl.id === &apos;pipeline-with-ci&apos;;
          createPipeline(pipelineEl, hasCI);
        }
      }
    });
  }, { threshold: 0.15 });

  document.querySelectorAll(&apos;.toc-section[data-anim]&apos;).forEach(el =&gt; observer.observe(el));

  // Pipeline simulation
  function createPipeline(mount, hasCI) {
    const types = [&quot;lint&quot;,&quot;ok&quot;,&quot;fmt&quot;,&quot;lint&quot;,&quot;logic&quot;,&quot;fmt&quot;,&quot;lint&quot;,&quot;lint&quot;,&quot;fmt&quot;,&quot;logic&quot;];
    const W = 460, Y = 50;
    const pos = hasCI
      ? { start: 20, lint: 100, fmt: 180, rev: 300, done: 420 }
      : { start: 30, rev: 200, done: 380 };

    let prs = [], sent = 0, counters = { rv: 0, bn: 0, mg: 0 };
    let raf, destroyed = false;

    const uid = &apos;pl-&apos; + Math.random().toString(36).slice(2, 8);
    mount.innerHTML = `
      &lt;div class=&quot;toc-scene&quot;&gt;&lt;svg id=&quot;${uid}-svg&quot; viewBox=&quot;0 0 ${W} 120&quot;&gt;&lt;/svg&gt;&lt;/div&gt;
      &lt;div class=&quot;toc-pipeline-stats&quot;&gt;
        &lt;span&gt;merged &lt;strong id=&quot;${uid}-merged&quot;&gt;0&lt;/strong&gt;&lt;/span&gt;
        &lt;span&gt;bounced &lt;strong id=&quot;${uid}-bounced&quot;&gt;0&lt;/strong&gt;&lt;/span&gt;
        &lt;span&gt;reviews &lt;strong id=&quot;${uid}-reviews&quot;&gt;0&lt;/strong&gt;&lt;/span&gt;
      &lt;/div&gt;
      &lt;div class=&quot;toc-pipeline-controls&quot;&gt;
        &lt;button type=&quot;button&quot; class=&quot;toc-btn&quot; id=&quot;${uid}-send&quot;&gt;send PR #1&lt;/button&gt;
        &lt;button type=&quot;button&quot; class=&quot;toc-btn toc-btn-dim&quot; id=&quot;${uid}-all&quot;&gt;send all&lt;/button&gt;
        &lt;button type=&quot;button&quot; class=&quot;toc-link&quot; id=&quot;${uid}-reset&quot;&gt;reset&lt;/button&gt;
      &lt;/div&gt;`;

    const $ = id =&gt; document.getElementById(uid + &apos;-&apos; + id);
    const svg = $(&apos;svg&apos;), sendBtn = $(&apos;send&apos;), allBtn = $(&apos;all&apos;);

    function drawStatic() {
      let s = `&lt;line x1=&quot;15&quot; y1=&quot;${Y}&quot; x2=&quot;${W-15}&quot; y2=&quot;${Y}&quot;/&gt;`;
      s += `&lt;line x1=&quot;15&quot; y1=&quot;${Y+30}&quot; x2=&quot;${W-15}&quot; y2=&quot;${Y+30}&quot; stroke-dasharray=&quot;4 4&quot;/&gt;`;
      s += `&lt;text x=&quot;${W/2}&quot; y=&quot;${Y+50}&quot; text-anchor=&quot;middle&quot; font-size=&quot;9&quot; class=&quot;label&quot;&gt;↩ bounced back&lt;/text&gt;`;
      if (hasCI) {
        s += `&lt;text x=&quot;${pos.lint}&quot; y=&quot;${Y-22}&quot; text-anchor=&quot;middle&quot; font-size=&quot;10&quot; class=&quot;label&quot;&gt;linter&lt;/text&gt;`;
        s += `&lt;circle cx=&quot;${pos.lint}&quot; cy=&quot;${Y}&quot; r=&quot;4&quot; class=&quot;accent&quot;/&gt;`;
        s += `&lt;text x=&quot;${pos.fmt}&quot; y=&quot;${Y-22}&quot; text-anchor=&quot;middle&quot; font-size=&quot;10&quot; class=&quot;label&quot;&gt;formatter&lt;/text&gt;`;
        s += `&lt;circle cx=&quot;${pos.fmt}&quot; cy=&quot;${Y}&quot; r=&quot;4&quot; class=&quot;accent&quot;/&gt;`;
      }
      s += `&lt;text x=&quot;${pos.rev}&quot; y=&quot;${Y-30}&quot; text-anchor=&quot;middle&quot; font-size=&quot;9&quot; class=&quot;label&quot;&gt;constraint ↓&lt;/text&gt;`;
      s += `&lt;text x=&quot;${pos.rev}&quot; y=&quot;${Y-18}&quot; text-anchor=&quot;middle&quot; font-size=&quot;11&quot; font-weight=&quot;700&quot;&gt;you&lt;/text&gt;`;
      s += `&lt;circle cx=&quot;${pos.rev}&quot; cy=&quot;${Y}&quot; r=&quot;4&quot; fill=&quot;currentColor&quot;/&gt;`;
      s += `&lt;text x=&quot;${pos.done}&quot; y=&quot;${Y-22}&quot; text-anchor=&quot;middle&quot; font-size=&quot;10&quot; class=&quot;label&quot;&gt;merged ✓&lt;/text&gt;`;
      return s;
    }
    const staticSVG = drawStatic();

    function spawnPR(idx) {
      if (idx &gt;= 10) return;
      prs.push({ id: idx+1, type: types[idx], x: pos.start, atStation: null, timer: 0, done: false, bounced: false, bouncedOnce: false, opacity: 1, yOff: 0, heading: null, passedLint: false, passedFmt: false });
      sent = idx + 1;
      sendBtn.textContent = sent &gt;= 10 ? &quot;—&quot; : `send PR #${sent+1}`;
      if (sent &gt;= 10) { sendBtn.classList.add(&quot;toc-btn-disabled&quot;); allBtn.classList.add(&quot;toc-btn-disabled&quot;); }
    }

    sendBtn.onclick = () =&gt; { if (sent &lt; 10) spawnPR(sent); };
    allBtn.onclick = () =&gt; {
      const start = sent;
      for (let i = 0; i &lt; 10 - start; i++) {
        setTimeout(() =&gt; { if (!destroyed) spawnPR(start + i); }, i * 600);
      }
    };
    $(&apos;reset&apos;).onclick = () =&gt; {
      prs = []; sent = 0; counters = { rv: 0, bn: 0, mg: 0 };
      sendBtn.textContent = &quot;send PR #1&quot;;
      sendBtn.classList.remove(&quot;toc-btn-disabled&quot;);
      allBtn.classList.remove(&quot;toc-btn-disabled&quot;);
      $(&apos;merged&apos;).textContent = &quot;0&quot;;
      $(&apos;bounced&apos;).textContent = &quot;0&quot;;
      $(&apos;reviews&apos;).textContent = &quot;0&quot;;
    };

    let last = performance.now();
    function tick(now) {
      if (destroyed) return;
      const dt = Math.min(now - last, 40); last = now;
      const atSt = st =&gt; prs.find(p =&gt; p.atStation === st &amp;&amp; !p.done &amp;&amp; !p.bounced);

      for (let p of prs) {
        if (p.done || p.bounced) { p.timer += dt; if (p.timer &gt; 600) p.opacity = Math.max(0, p.opacity - 0.015); continue; }

        let nextStation;
        if (hasCI) {
          if (!p.passedLint) nextStation = &quot;lint&quot;;
          else if (!p.passedFmt) nextStation = &quot;fmt&quot;;
          else nextStation = &quot;rev&quot;;
        } else {
          nextStation = &quot;rev&quot;;
        }
        const targetX = nextStation === &quot;lint&quot; ? pos.lint : nextStation === &quot;fmt&quot; ? pos.fmt : pos.rev;

        if (p.atStation) {
          p.timer += dt;
          const wt = p.atStation === &quot;rev&quot; ? 700 : 400;
          if (p.timer &gt; wt) {
            if (p.atStation === &quot;lint&quot;) {
              if (p.type === &quot;lint&quot;) { p.bounced = true; p.timer = 0; p.yOff = 30; counters.bn++; $(&apos;bounced&apos;).textContent = counters.bn; }
              else { p.passedLint = true; p.atStation = null; p.timer = 0; }
            } else if (p.atStation === &quot;fmt&quot;) {
              if (p.type === &quot;fmt&quot;) { p.bounced = true; p.timer = 0; p.yOff = 30; counters.bn++; $(&apos;bounced&apos;).textContent = counters.bn; }
              else { p.passedFmt = true; p.atStation = null; p.timer = 0; }
            } else if (p.atStation === &quot;rev&quot;) {
              if (p.type !== &quot;ok&quot; &amp;&amp; !p.bouncedOnce) {
                p.bouncedOnce = true; p.bounced = true; p.timer = 0; p.yOff = 30; counters.bn++; $(&apos;bounced&apos;).textContent = counters.bn;
              } else { p.atStation = null; p.timer = 0; p.heading = &quot;done&quot;; }
            }
          }
        } else if (p.heading === &quot;done&quot;) {
          p.x += (pos.done - p.x) * 0.1;
          if (Math.abs(p.x - pos.done) &lt; 2) { p.x = pos.done; p.done = true; p.timer = 0; counters.mg++; $(&apos;merged&apos;).textContent = counters.mg; }
        } else {
          const occupied = atSt(nextStation);
          if (!occupied) {
            p.x += (targetX - p.x) * 0.1;
            if (Math.abs(p.x - targetX) &lt; 2) {
              p.x = targetX; p.atStation = nextStation; p.timer = 0;
              if (nextStation === &quot;rev&quot;) { counters.rv++; $(&apos;reviews&apos;).textContent = counters.rv; }
            }
          } else {
            const waiting = prs.filter(q =&gt; q !== p &amp;&amp; !q.done &amp;&amp; !q.bounced &amp;&amp; !q.atStation &amp;&amp; q.heading !== &quot;done&quot; &amp;&amp; q.x &lt; targetX &amp;&amp; q.x &gt; targetX - 60);
            const qi = waiting.filter(q =&gt; q.id &lt; p.id).length;
            const qx = targetX - 18 - qi * 14;
            p.x += (qx - p.x) * 0.08;
          }
        }
      }
      prs = prs.filter(p =&gt; p.opacity &gt; 0.05);

      let s = staticSVG;
      for (let p of prs) {
        const py = Y + p.yOff;
        const cls = p.bounced ? &apos;label&apos; : p.done ? &apos;&apos; : p.type === &quot;ok&quot; ? &apos;&apos; : p.type === &quot;logic&quot; ? &apos;bad&apos; : &apos;warn&apos;;
        s += `&lt;g opacity=&quot;${p.opacity}&quot;&gt;&lt;circle cx=&quot;${p.x}&quot; cy=&quot;${py}&quot; r=&quot;6&quot; class=&quot;${cls}&quot; ${cls===&apos;&apos;?&apos;fill=&quot;currentColor&quot;&apos;:&apos;&apos;}/&gt;`;
        s += `&lt;text x=&quot;${p.x}&quot; y=&quot;${py-10}&quot; text-anchor=&quot;middle&quot; font-size=&quot;8&quot; class=&quot;label&quot;&gt;${p.id}&lt;/text&gt;&lt;/g&gt;`;
      }
      svg.innerHTML = s;
      raf = requestAnimationFrame(tick);
    }
    raf = requestAnimationFrame(tick);
  }
})();
&lt;/script&gt;


    &lt;p&gt;&lt;a href=&quot;https://tiberriver256.github.io/ai%20and%20technology/you-are-the-bottleneck/&quot;&gt;Stop Reviewing Lint (AI Agents &amp; Theory of Constraints)&lt;/a&gt; was originally published by Micah Rairdon at &lt;a href=&quot;https://tiberriver256.github.io&quot;&gt;Tiberriver256&lt;/a&gt; on April 04, 2026.&lt;/p&gt;
  </content>
</entry>


<entry>
  <title type="html"><![CDATA[Why I Prefer Stable Hours Over 'Get Your Work Done' in Software Dev]]></title>
 <link rel="alternate" type="text/html" href="https://tiberriver256.github.io/career/stable-work-hours-over-commitments/" />
  <id>https://tiberriver256.github.io/career/stable-work-hours-over-commitments</id>
  <updated>2026-02-03T00:00:00-00:00</updated>
  <published>2026-02-03T00:00:00-05:00</published>
  
  <author>
    <name>Micah Rairdon</name>
    <uri>https://tiberriver256.github.io</uri>
    <email>Jun(Real Email: Micah.Rairdon [GMail])k@JunkMail.com</email>
  </author>
  <content type="html">
    &lt;p&gt;I like stable, predictable work hours.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_800,q_auto,f_auto/https://tiberriver256.github.io/images/stable-work-hours-over-commitments/stable-hours-graph.png&quot; srcset=&quot;         https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_320,q_auto,f_auto/https://tiberriver256.github.io/images/stable-work-hours-over-commitments/stable-hours-graph.png 320w,         https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_640,q_auto,f_auto/https://tiberriver256.github.io/images/stable-work-hours-over-commitments/stable-hours-graph.png 640w,         https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_960,q_auto,f_auto/https://tiberriver256.github.io/images/stable-work-hours-over-commitments/stable-hours-graph.png 960w,         https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_1280,q_auto,f_auto/https://tiberriver256.github.io/images/stable-work-hours-over-commitments/stable-hours-graph.png 1280w,         https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_1600,q_auto,f_auto/https://tiberriver256.github.io/images/stable-work-hours-over-commitments/stable-hours-graph.png 1600w     &quot; sizes=&quot;(min-width: 50rem) 50rem, 90vw&quot; alt=&quot;Graph showing a flat green line representing consistent daily work hours - what I prefer&quot; loading=&quot;lazy&quot; /&gt;&lt;/p&gt;

&lt;p&gt;I learned that when you try to hook your self-worth to “commitments” or “getting
your work done” in an environment like software development where work is so
difficult to estimate your schedule can quickly become chaos.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_800,q_auto,f_auto/https://tiberriver256.github.io/images/stable-work-hours-over-commitments/unpredictable-hours-graph.png&quot; srcset=&quot;         https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_320,q_auto,f_auto/https://tiberriver256.github.io/images/stable-work-hours-over-commitments/unpredictable-hours-graph.png 320w,         https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_640,q_auto,f_auto/https://tiberriver256.github.io/images/stable-work-hours-over-commitments/unpredictable-hours-graph.png 640w,         https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_960,q_auto,f_auto/https://tiberriver256.github.io/images/stable-work-hours-over-commitments/unpredictable-hours-graph.png 960w,         https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_1280,q_auto,f_auto/https://tiberriver256.github.io/images/stable-work-hours-over-commitments/unpredictable-hours-graph.png 1280w,         https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_1600,q_auto,f_auto/https://tiberriver256.github.io/images/stable-work-hours-over-commitments/unpredictable-hours-graph.png 1600w     &quot; sizes=&quot;(min-width: 50rem) 50rem, 90vw&quot; alt=&quot;Graph showing a wavy red line with peaks and valleys representing unpredictable daily work hours - what I want to avoid&quot; loading=&quot;lazy&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;how-i-got-stuck&quot;&gt;How I got stuck…&lt;/h2&gt;

&lt;p&gt;I started out treating software development like the work I had laid out for me
when I worked at Staples (the office supply store). I would tell people how long
it would take a thing to get done and then I inevitably ended up overworking
when estimates missed, and… they tended to almost always miss.&lt;/p&gt;

&lt;p&gt;“Finish” early (rare, but it happens)? I sneak out early or coast because I
earned it after all those 60-hour weeks, right? It feels like justified
compensation.&lt;/p&gt;

&lt;h2 id=&quot;were-all-terrible-at-estimating-software&quot;&gt;We’re All Terrible at Estimating Software&lt;/h2&gt;

&lt;p&gt;We’re awful at it. I highly recommend reading Software Estimation: Demystifying
The Black Art by Steve McConnell where he goes to great lengths to prove to his
readers exactly how bad we are. He of course then proceeeds to give you useful
techniques on how you can get better… but still… the problem remains.&lt;/p&gt;

&lt;p&gt;We tend to either overestimate or underestimate and by a large margin. The more
common of the two is unfortunately underestimating the size which means you’ll
more commonly (if you’re like the rest of us humans) be working overtime rather
than getting out early.&lt;/p&gt;

&lt;h2 id=&quot;moving-into-leadership&quot;&gt;Moving Into Leadership&lt;/h2&gt;

&lt;p&gt;Moving into a leadership role, my perspective on this was solidified. It made no
sense to me if someone got the short end of the stick on something they thought
was easy but turned out to be hard to make them work overtime hours. Much better
to say “No problem” and let them call it a day. It also made no sense to watch
someone run off and have fun for hours just because they lucked out and got an
easy one (although… underestimation being way more common… this is super
rare).&lt;/p&gt;

&lt;h2 id=&quot;a-better-approach-stable-hours-improving-flow&quot;&gt;A Better Approach: Stable Hours, Improving Flow&lt;/h2&gt;

&lt;p&gt;So what do I do now?&lt;/p&gt;

&lt;p&gt;I stick to my hours… sometimes this means I get extra stuff done because I
finished earlier than I thought I would… sometimes this means I miss on
commitments.&lt;/p&gt;

&lt;p&gt;I ask my team to stick to their hours… don’t overwork yourself. Don’t cut out
on the rest of your team. Just go stable.&lt;/p&gt;

&lt;p&gt;Every time, though, it means my hours are stable and predictable.&lt;/p&gt;

&lt;h2 id=&quot;the-benefits&quot;&gt;The Benefits&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Stability&lt;/strong&gt; - Being able to tell my family when I’ll actually be home. Not
carrying around guilt that “I didn’t finish the thing I promised, so I must
not be good at my job.”&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Failure&lt;/strong&gt; - Failure isn’t always bad… it’s an opportunity to learn and
improve. When I or my team fail to meet commitments within a reasonable
timeframe we can talk about what went wrong and what we can do better next
time. Overworking to hit a deadline short-circuited that value for me for a
long time.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;strong&gt;Side Note:&lt;/strong&gt; I still work crazy hours sometimes… but… that’s a different
problem 😝&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2 id=&quot;common-questions&quot;&gt;Common Questions&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;How many hours?&lt;/strong&gt; - That’s up to your team… whatever you collectively
agree makes the most sense for you guys to be productive.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Do you really follow this strictly?&lt;/strong&gt; - Not really… it’s more of a target
than a strict rule. Sometimes you have to pull overtime. Sometimes you should
get out early. Those tend to be great team conversations though and shouldn’t
be left up to the individual to put on themselves.&lt;/li&gt;
&lt;/ul&gt;

    &lt;p&gt;&lt;a href=&quot;https://tiberriver256.github.io/career/stable-work-hours-over-commitments/&quot;&gt;Why I Prefer Stable Hours Over &apos;Get Your Work Done&apos; in Software Dev&lt;/a&gt; was originally published by Micah Rairdon at &lt;a href=&quot;https://tiberriver256.github.io&quot;&gt;Tiberriver256&lt;/a&gt; on February 03, 2026.&lt;/p&gt;
  </content>
</entry>


<entry>
  <title type="html"><![CDATA[Approvals Are a Security Wet Blanket for AI Agents]]></title>
 <link rel="alternate" type="text/html" href="https://tiberriver256.github.io/ai%20and%20technology/approvals-are-a-security-wet-blanket-for-ai-agents/" />
  <id>https://tiberriver256.github.io/ai%20and%20technology/approvals-are-a-security-wet-blanket-for-ai-agents</id>
  <updated>2026-01-29T00:00:00-00:00</updated>
  <published>2026-01-29T00:00:00-05:00</published>
  
  <author>
    <name>Micah Rairdon</name>
    <uri>https://tiberriver256.github.io</uri>
    <email>Jun(Real Email: Micah.Rairdon [GMail])k@JunkMail.com</email>
  </author>
  <content type="html">
    &lt;p&gt;I was running an AI agent in a remote VM, exposed only via HTTP through a Node
web server so I could send it commands. The agent asked to kill all Node
processes. I approved it and immediately lost access to the VM.&lt;/p&gt;

&lt;p&gt;In hindsight, obvious. In the moment, I was deep in a task and the approval
prompt looked like every other one I’d clicked that hour.&lt;/p&gt;

&lt;h2 id=&quot;approval-fatigue-is-the-real-problem&quot;&gt;Approval fatigue is the real problem&lt;/h2&gt;

&lt;p&gt;Approval prompts &lt;em&gt;feel&lt;/em&gt; like safety. They also feel like friction. And after the
four hundredth prompt in a week, they mostly feel like something to click so the
work can keep moving.&lt;/p&gt;

&lt;p&gt;In a team of 20 people using agents all year, prompts pile up fast. Thousands.
Maybe millions. Most are fine, which is exactly the problem. Run tests. Format a
file. Update a dependency. Then one prompt says to download and run a script
from a link in a ticket. The approve button looks the same as all the others.&lt;/p&gt;

&lt;p&gt;When the risky prompt shows up, the pattern is already set: click approve, keep
going. If safety depends on perfect attention, it fails.&lt;/p&gt;

&lt;!-- vale Google.Colons = NO --&gt;

&lt;h2 id=&quot;the-lethal-trifecta&quot;&gt;The lethal trifecta&lt;/h2&gt;

&lt;!-- vale Google.Colons = YES --&gt;

&lt;p&gt;Simon Willison coined the term &lt;strong&gt;lethal trifecta&lt;/strong&gt; for prompt-injection attacks
in agents:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;The agent reads &lt;strong&gt;untrusted content&lt;/strong&gt;—issues, pull requests, web pages,
tickets.&lt;/li&gt;
  &lt;li&gt;The agent &lt;strong&gt;takes actions&lt;/strong&gt;—running commands, opening pull requests, calling
tools.&lt;/li&gt;
  &lt;li&gt;The agent has access to &lt;strong&gt;private data&lt;/strong&gt;—keys, internal repos, customer data.&lt;/li&gt;
&lt;/ul&gt;

&lt;!-- vale Google.Colons = NO --&gt;

&lt;p&gt;Give an agent all three and a prompt attack turns into an incident. Here’s
Willison’s write-up:
&lt;a href=&quot;https://simonwillison.net/2025/Jun/16/the-lethal-trifecta/&quot;&gt;The lethal trifecta&lt;/a&gt;.&lt;/p&gt;

&lt;!-- vale Google.Colons = YES --&gt;

&lt;h2 id=&quot;shrink-the-blast-radius-instead&quot;&gt;Shrink the blast radius instead&lt;/h2&gt;

&lt;p&gt;I’ve come to think of approvals as a speed bump, not a seatbelt. They can help,
but the control that works is a sandbox.&lt;/p&gt;

&lt;p&gt;Start by giving the agent its own account. Don’t run it as a developer. Scope it
to only what it needs—maybe just repo read access and permission to open pull
requests. Run the agent on an isolated machine, away from the rest of the
network. If a prompt tricks it, the damage stays local. Limit what the agent can
read and write. Prefer pull requests over direct pushes. Control outbound
traffic with a firewall or proxy, and log what the agent fetches.&lt;/p&gt;

&lt;p&gt;None of this is exotic. It’s like not giving your CI runner root access to prod.&lt;/p&gt;

&lt;h2 id=&quot;a-boring-setup-beats-a-clever-one&quot;&gt;A boring setup beats a clever one&lt;/h2&gt;

&lt;h3 id=&quot;pull-request-only-agents&quot;&gt;Pull-request-only agents&lt;/h3&gt;

&lt;p&gt;If you pick one rule, pick this: the agent makes a branch and opens a pull
request. A human reviews and merges. The agent never pushes to a protected
branch. That turns agent actions into drafts. In my experience, this single
constraint stops most disasters.&lt;/p&gt;

&lt;h3 id=&quot;where-to-run-the-agent&quot;&gt;Where to run the agent&lt;/h3&gt;

&lt;!-- vale Google.Parens = NO --&gt;

&lt;p&gt;On macOS and Linux, sandbox options exist. Windows is harder than it looks.
Windows Subsystem for Linux isn’t an isolation boundary. Docker isn’t either in
many setups. For a stronger wall, use a VM like Hyper-V or VirtualBox. A cloud
machine works too.&lt;/p&gt;

&lt;!-- vale Google.Parens = YES --&gt;

&lt;p&gt;Off-network is often easier. GitHub Codespaces or a cloud VM draws a clean line.
GitHub Actions runners are a good model: they start clean and use scoped access.&lt;/p&gt;

&lt;h2 id=&quot;where-approvals-still-help&quot;&gt;Where approvals still help&lt;/h2&gt;

&lt;p&gt;I’m not saying approvals are useless. They help when they guard big,
irreversible actions: deploying to production, rotating secrets, publishing
packages and releases, writing to shared storage or outside services. Keep that
list small—that’s what makes the prompts meaningful instead of noise.&lt;/p&gt;

&lt;h2 id=&quot;a-checklist-to-steal&quot;&gt;A checklist to steal&lt;/h2&gt;

&lt;ul class=&quot;task-list&quot;&gt;
  &lt;li class=&quot;task-list-item&quot;&gt;&lt;input type=&quot;checkbox&quot; class=&quot;task-list-item-checkbox&quot; disabled=&quot;disabled&quot; /&gt;Use a separate agent account, not a developer account.&lt;/li&gt;
  &lt;li class=&quot;task-list-item&quot;&gt;&lt;input type=&quot;checkbox&quot; class=&quot;task-list-item-checkbox&quot; disabled=&quot;disabled&quot; /&gt;Scope access repo by repo.&lt;/li&gt;
  &lt;li class=&quot;task-list-item&quot;&gt;&lt;input type=&quot;checkbox&quot; class=&quot;task-list-item-checkbox&quot; disabled=&quot;disabled&quot; /&gt;Let the agent open pull requests, but don’t let it merge or push to
    protected branches.&lt;/li&gt;
  &lt;li class=&quot;task-list-item&quot;&gt;&lt;input type=&quot;checkbox&quot; class=&quot;task-list-item-checkbox&quot; disabled=&quot;disabled&quot; /&gt;Don’t put secrets in the agent environment by default.&lt;/li&gt;
  &lt;li class=&quot;task-list-item&quot;&gt;&lt;input type=&quot;checkbox&quot; class=&quot;task-list-item-checkbox&quot; disabled=&quot;disabled&quot; /&gt;Log and restrict outbound traffic. Use a proxy or allowlist when possible.&lt;/li&gt;
  &lt;li class=&quot;task-list-item&quot;&gt;&lt;input type=&quot;checkbox&quot; class=&quot;task-list-item-checkbox&quot; disabled=&quot;disabled&quot; /&gt;Gate high-risk actions with a small set of approvals.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;closing-thought&quot;&gt;Closing thought&lt;/h2&gt;

&lt;p&gt;Approvals feel safe because they’re visible, but visibility isn’t control. Put
the agent in a box that’s hard to escape, and give it access that can’t do much
harm. That’s the defense that works when you’re tired and clicking through
prompts at 4 PM on a Friday.&lt;/p&gt;

    &lt;p&gt;&lt;a href=&quot;https://tiberriver256.github.io/ai%20and%20technology/approvals-are-a-security-wet-blanket-for-ai-agents/&quot;&gt;Approvals Are a Security Wet Blanket for AI Agents&lt;/a&gt; was originally published by Micah Rairdon at &lt;a href=&quot;https://tiberriver256.github.io&quot;&gt;Tiberriver256&lt;/a&gt; on January 29, 2026.&lt;/p&gt;
  </content>
</entry>


<entry>
  <title type="html"><![CDATA[Do Newer Models Hold Up as Context Fills?]]></title>
 <link rel="alternate" type="text/html" href="https://tiberriver256.github.io/ai%20and%20technology/context-window-performance-dropoff/" />
  <id>https://tiberriver256.github.io/ai%20and%20technology/context-window-performance-dropoff</id>
  <updated>2025-12-18T00:00:00-00:00</updated>
  <published>2025-12-18T00:00:00-05:00</published>
  
  <author>
    <name>Micah Rairdon</name>
    <uri>https://tiberriver256.github.io</uri>
    <email>Jun(Real Email: Micah.Rairdon [GMail])k@JunkMail.com</email>
  </author>
  <content type="html">
    &lt;p&gt;My experience has always been that AI models get pretty dumb after about
50% of their context window is filled. &lt;a href=&quot;https://x.com/vikhyatk&quot;&gt;@vikhyatk&lt;/a&gt;
on x.com challenged my assumption and said it’s been getting better. I
decided to put on a little test. The below experiment was fully conducted
and documented by gpt-5.2-codex and the codex CLI. We used the copilot cli
for the sonnet 4.5 part of the experiment.&lt;/p&gt;

&lt;h2 id=&quot;experiment-setup&quot;&gt;Experiment setup&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Models:&lt;/strong&gt; &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gpt-5.1-codex-max&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gpt-5.2-codex&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;claude-sonnet-4.5&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Tasks:&lt;/strong&gt;
    &lt;ul&gt;
      &lt;li&gt;Recall: three facts inserted around ~10k tokens into the prompt&lt;/li&gt;
      &lt;li&gt;SVG: output a single SVG of a pelican riding a bicycle&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Context fill levels:&lt;/strong&gt; 0%, 25%, 50%, 75%, 98%&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Runs:&lt;/strong&gt; one run per task per context fill&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Filler:&lt;/strong&gt; deterministic structured text so the prompt reaches the target token count&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Tooling:&lt;/strong&gt; &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;uv run context_window_experiment.py&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;CLI runners:&lt;/strong&gt; Codex CLI (default) and Copilot CLI via &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;--runner copilot --models claude-sonnet-4.5&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you want to reproduce the results, save the script below as &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;context_window_experiment.py&lt;/code&gt; and run &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;uv run context_window_experiment.py&lt;/code&gt;.&lt;/p&gt;

&lt;details&gt;
  &lt;summary&gt;Experiment script (uv run)&lt;/summary&gt;

  &lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c1&quot;&gt;# /// script
# dependencies = [&quot;tiktoken&amp;gt;=0.7.0&quot;]
# ///
&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;&quot;&quot;Run context window performance experiments using the Codex or Copilot CLI.

Usage:
  uv run context_window_experiment.py
  uv run context_window_experiment.py --runner copilot --models claude-sonnet-4.5
&quot;&quot;&quot;&lt;/span&gt;

&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;__future__&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;annotations&lt;/span&gt;

&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;argparse&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;datetime&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dt&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;hashlib&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;json&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;pathlib&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;random&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;subprocess&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;time&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;dataclasses&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dataclass&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;typing&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;List&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Optional&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Tuple&lt;/span&gt;

&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;tiktoken&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;DEFAULT_MODELS&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;gpt-5.1-codex-max&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;gpt-5.2-codex&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;DEFAULT_CONTEXT_PCTS&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;25&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;50&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;75&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;98&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;DEFAULT_RUNS&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;DEFAULT_FACT_OFFSET_TOKENS&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;10_000&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;DEFAULT_CONTEXT_WINDOW&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;200_000&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;DEFAULT_ENCODING&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;o200k_base&quot;&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;DEFAULT_RUNNER&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;codex&quot;&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;DEFAULT_OUTPUT_DIR&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;context-window-results&quot;&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;FACTS&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&quot;The pelican&apos;s name is Harbor.&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&quot;The bicycle is painted teal with a white bell.&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&quot;The experiment code word is WINTER-ALPHA-7.&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;TASK_PELICAN&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;pelican_code&quot;&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;TASK_RECALL&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;fact_recall&quot;&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;PELICAN_INSTRUCTIONS&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&quot;TASK: Output a single SVG of a pelican riding a bicycle.&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&quot;Requirements:&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&quot;- Output SVG only, no Markdown, no code fences.&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&quot;- Keep the SVG within a 400x300 viewBox.&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&quot;- Use simple shapes and paths; no external assets.&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;RECALL_INSTRUCTIONS&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&quot;TASK: List the three facts exactly as stated in the IMPORTANT FACTS block.&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&quot;Return them as three bullet points, nothing else.&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;INTRO_TEXT&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&quot;You are participating in a context window experiment.&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&quot;Ignore filler text. Only follow the TASK at the end.&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&quot;Filler text begins below.&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;FILLER_HEADER&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;BEGIN FILLER&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;FILLER_FOOTER&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;END FILLER&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;FACTS_HEADER&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;IMPORTANT FACTS (memorize for later):&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;FACTS_FOOTER&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;END FACTS&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;WORD_BANK&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&quot;alpha&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&quot;bravo&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&quot;charlie&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&quot;delta&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&quot;echo&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&quot;foxtrot&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&quot;golf&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&quot;hotel&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&quot;india&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&quot;juliet&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&quot;kilo&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&quot;lima&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&quot;mike&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&quot;november&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&quot;oscar&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&quot;papa&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&quot;quebec&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&quot;romeo&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&quot;sierra&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&quot;tango&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&quot;uniform&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&quot;victor&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&quot;whiskey&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&quot;xray&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&quot;yankee&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&quot;zulu&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&quot;amber&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&quot;basil&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&quot;cedar&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&quot;dune&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&quot;ember&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&quot;fjord&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&quot;grove&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&quot;harbor&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&quot;ivory&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&quot;jade&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&quot;kelp&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&quot;linen&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&quot;moss&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&quot;nova&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&quot;onyx&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&quot;pearl&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&quot;quartz&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&quot;reef&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&quot;stone&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&quot;tulip&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&quot;umber&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&quot;velvet&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&quot;willow&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&quot;xenon&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&quot;yellow&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;s&quot;&gt;&quot;zephyr&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;


&lt;span class=&quot;o&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;dataclass&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;PromptParts&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;prompt&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;str&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;total_tokens&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;int&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;filler_before_tokens&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;int&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;filler_after_tokens&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;int&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;facts_start_tokens&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Optional&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;target_total_tokens&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;int&lt;/span&gt;


&lt;span class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;TokenCounter&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;__init__&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;encoding_name&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;str&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;bp&quot;&gt;None&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;encoding_name&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;encoding_name&lt;/span&gt;
        &lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;encoding&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;tiktoken&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;get_encoding&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;encoding_name&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;count&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;text&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;str&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;len&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;encoding&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;encode&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;text&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;


&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;parse_model_contexts&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;raw_pairs&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;List&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;str&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;])&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;dict&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;model_contexts&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;dict&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{}&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;item&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;raw_pairs&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;=&quot;&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;not&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;item&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;raise&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;ValueError&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sa&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Invalid model context override: &lt;/span&gt;&lt;span class=&quot;si&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;item&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;model&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;window&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;item&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;split&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;=&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;model&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;model&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;strip&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;window_value&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;window&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;strip&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;())&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;model_contexts&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;model&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;window_value&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;model_contexts&lt;/span&gt;


&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;stable_seed&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;parts&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;str&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;payload&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;|&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;join&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;parts&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;encode&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;utf-8&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;digest&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;hashlib&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;sha256&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;payload&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;digest&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;from_bytes&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;digest&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;8&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;big&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;


&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;make_sentence&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;rng&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;random&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Random&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;index&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;str&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;words&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;rng&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;sample&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;WORD_BANK&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;12&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;sa&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;FILLER &lt;/span&gt;&lt;span class=&quot;si&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;index&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;05&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;d&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;: &quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot; &quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;join&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;words&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;.&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;&lt;/span&gt;


&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;build_block&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;rng&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;random&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Random&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;sentences&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;25&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;str&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;join&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;make_sentence&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;rng&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;range&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;sentences&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;


&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;build_filler&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;target_tokens&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;counter&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;TokenCounter&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;seed_label&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;str&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Tuple&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;str&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]:&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;target_tokens&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;

    &lt;span class=&quot;n&quot;&gt;rng&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;random&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Random&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;stable_seed&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;seed_label&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;block&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;build_block&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;rng&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;block_tokens&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;counter&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;count&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;block&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;n&quot;&gt;parts&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;List&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;str&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[]&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;total_tokens&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;index_offset&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;block_tokens&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;while&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;total_tokens&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;block_tokens&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;target_tokens&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;parts&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;append&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;block&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;total_tokens&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;block_tokens&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;index_offset&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;25&lt;/span&gt;

    &lt;span class=&quot;c1&quot;&gt;# Build remainder with fresh sentences to avoid repeating the same block too much.
&lt;/span&gt;    &lt;span class=&quot;n&quot;&gt;remainder_rng&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;random&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Random&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;stable_seed&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;seed_label&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;remainder&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;sentence_index&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;index_offset&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;while&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;total_tokens&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;target_tokens&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;sentence&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;make_sentence&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;remainder_rng&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;sentence_index&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;sentence_tokens&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;counter&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;count&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;sentence&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;total_tokens&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;sentence_tokens&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;target_tokens&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;break&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;parts&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;append&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;sentence&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;total_tokens&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;sentence_tokens&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;sentence_index&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;

    &lt;span class=&quot;n&quot;&gt;padding_unit&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot; filler&quot;&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;padding_tokens&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;counter&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;count&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;padding_unit&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;while&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;total_tokens&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;padding_tokens&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;target_tokens&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;parts&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;append&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;padding_unit&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;total_tokens&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;padding_tokens&lt;/span&gt;

    &lt;span class=&quot;n&quot;&gt;parts&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;append&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;join&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;parts&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;total_tokens&lt;/span&gt;


&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;build_facts_block&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;str&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;lines&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;FACTS_HEADER&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;fact&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;FACTS&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;lines&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;append&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sa&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;- &lt;/span&gt;&lt;span class=&quot;si&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;fact&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;lines&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;append&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;FACTS_FOOTER&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;join&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;lines&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;


&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;build_prompt&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;task&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;str&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;target_total_tokens&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;counter&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;TokenCounter&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;fact_offset_tokens&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;seed_label&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;str&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;PromptParts&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;task&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;TASK_PELICAN&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;task_instructions&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;PELICAN_INSTRUCTIONS&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;include_facts&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;bp&quot;&gt;False&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;elif&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;task&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;TASK_RECALL&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;task_instructions&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;RECALL_INSTRUCTIONS&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;include_facts&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;bp&quot;&gt;True&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;else&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;raise&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;ValueError&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sa&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Unknown task: &lt;/span&gt;&lt;span class=&quot;si&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;task&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;n&quot;&gt;intro&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;INTRO_TEXT&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;FILLER_HEADER&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;intro_tokens&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;counter&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;count&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;intro&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;n&quot;&gt;facts_block&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;build_facts_block&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;include_facts&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;&quot;&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;facts_tokens&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;counter&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;count&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;facts_block&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;n&quot;&gt;task_tokens&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;counter&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;count&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;task_instructions&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;footer_tokens&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;counter&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;count&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;FILLER_FOOTER&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;include_facts&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;filler_before_target&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;max&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;fact_offset_tokens&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;intro_tokens&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;filler_before&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;filler_before_tokens&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;build_filler&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;filler_before_target&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;counter&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;sa&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;seed_label&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;|before&quot;&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;facts_start_tokens&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;intro_tokens&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;filler_before_tokens&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;else&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;filler_before&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;&quot;&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;filler_before_tokens&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;facts_start_tokens&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;bp&quot;&gt;None&lt;/span&gt;

    &lt;span class=&quot;n&quot;&gt;fixed_tokens&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;intro_tokens&lt;/span&gt;
        &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;filler_before_tokens&lt;/span&gt;
        &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;facts_tokens&lt;/span&gt;
        &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;footer_tokens&lt;/span&gt;
        &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;task_tokens&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;n&quot;&gt;filler_after_target&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;max&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;target_total_tokens&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;fixed_tokens&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;filler_after&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;filler_after_tokens&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;build_filler&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;filler_after_target&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;counter&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;sa&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;seed_label&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;|after&quot;&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;n&quot;&gt;prompt&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;join&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;intro&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;filler_before&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;facts_block&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;filler_after&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;FILLER_FOOTER&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;task_instructions&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;n&quot;&gt;total_tokens&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;counter&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;count&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;prompt&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;PromptParts&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;prompt&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;prompt&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;total_tokens&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;total_tokens&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;filler_before_tokens&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;filler_before_tokens&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;filler_after_tokens&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;filler_after_tokens&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;facts_start_tokens&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;facts_start_tokens&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;target_total_tokens&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;target_total_tokens&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;


&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;run_cli&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;runner&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;str&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;prompt&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;str&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;prompt_path&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pathlib&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Path&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;model&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;str&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;output_path&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pathlib&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Path&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;log_path&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pathlib&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Path&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Tuple&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;float&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]:&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;runner&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;codex&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;cmd&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;
            &lt;span class=&quot;s&quot;&gt;&quot;codex&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;s&quot;&gt;&quot;exec&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;s&quot;&gt;&quot;-m&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;model&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;s&quot;&gt;&quot;--color&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;s&quot;&gt;&quot;never&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;s&quot;&gt;&quot;--output-last-message&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;nb&quot;&gt;str&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;output_path&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;

        &lt;span class=&quot;n&quot;&gt;start&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;time&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;time&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;with&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;log_path&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;open&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;w&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;encoding&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;utf-8&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;log_file&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;proc&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;subprocess&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;run&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
                &lt;span class=&quot;n&quot;&gt;cmd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
                &lt;span class=&quot;nb&quot;&gt;input&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;prompt&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
                &lt;span class=&quot;n&quot;&gt;text&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;True&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
                &lt;span class=&quot;n&quot;&gt;stdout&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;log_file&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
                &lt;span class=&quot;n&quot;&gt;stderr&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;log_file&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
                &lt;span class=&quot;n&quot;&gt;check&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;False&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;end&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;time&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;time&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;proc&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;returncode&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;end&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;start&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;runner&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;copilot&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;cmd&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;
            &lt;span class=&quot;s&quot;&gt;&quot;copilot&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;s&quot;&gt;&quot;--model&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;model&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;s&quot;&gt;&quot;--no-color&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;s&quot;&gt;&quot;--stream&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;s&quot;&gt;&quot;off&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;s&quot;&gt;&quot;--silent&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;s&quot;&gt;&quot;--add-dir&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;nb&quot;&gt;str&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;prompt_path&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;parent&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt;
            &lt;span class=&quot;s&quot;&gt;&quot;--prompt&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;sa&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;@&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;prompt_path&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;

        &lt;span class=&quot;n&quot;&gt;start&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;time&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;time&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;with&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;output_path&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;open&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;w&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;encoding&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;utf-8&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;output_file&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;log_path&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;open&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
            &lt;span class=&quot;s&quot;&gt;&quot;w&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;encoding&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;utf-8&quot;&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;log_file&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;proc&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;subprocess&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;run&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
                &lt;span class=&quot;n&quot;&gt;cmd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
                &lt;span class=&quot;n&quot;&gt;text&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;True&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
                &lt;span class=&quot;n&quot;&gt;stdout&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;output_file&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
                &lt;span class=&quot;n&quot;&gt;stderr&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;log_file&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
                &lt;span class=&quot;n&quot;&gt;check&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;False&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;end&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;time&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;time&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;proc&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;returncode&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;end&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;start&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;raise&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;ValueError&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sa&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Unknown runner: &lt;/span&gt;&lt;span class=&quot;si&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;runner&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;


&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;parse_args&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;argparse&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Namespace&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;parser&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;argparse&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ArgumentParser&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;description&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Run context window experiments with Codex or Copilot CLI.&quot;&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;parser&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;add_argument&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
        &lt;span class=&quot;s&quot;&gt;&quot;--runner&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;choices&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;codex&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;copilot&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;default&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;DEFAULT_RUNNER&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;help&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;CLI runner to use.&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;parser&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;add_argument&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
        &lt;span class=&quot;s&quot;&gt;&quot;--models&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;default&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;,&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;join&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;DEFAULT_MODELS&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;help&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Comma-separated model list.&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;parser&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;add_argument&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
        &lt;span class=&quot;s&quot;&gt;&quot;--context-percentages&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;default&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;,&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;join&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;str&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;pct&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pct&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;DEFAULT_CONTEXT_PCTS&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;help&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Comma-separated target context percentages.&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;parser&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;add_argument&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
        &lt;span class=&quot;s&quot;&gt;&quot;--runs&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;nb&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;default&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;DEFAULT_RUNS&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;help&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Number of repetitions per task and context percentage.&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;parser&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;add_argument&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
        &lt;span class=&quot;s&quot;&gt;&quot;--context-window&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;nb&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;default&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;DEFAULT_CONTEXT_WINDOW&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;help&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Context window size in tokens (default applies to all models).&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;parser&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;add_argument&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
        &lt;span class=&quot;s&quot;&gt;&quot;--model-context&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;action&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;append&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;default&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[],&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;help&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Override context window for a model (format: model=window).&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;parser&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;add_argument&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
        &lt;span class=&quot;s&quot;&gt;&quot;--encoding&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;default&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;DEFAULT_ENCODING&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;help&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Tokenizer encoding name for tiktoken.&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;parser&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;add_argument&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
        &lt;span class=&quot;s&quot;&gt;&quot;--fact-offset-tokens&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;nb&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;default&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;DEFAULT_FACT_OFFSET_TOKENS&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;help&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Place facts around this token offset for recall tests.&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;parser&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;add_argument&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
        &lt;span class=&quot;s&quot;&gt;&quot;--seed&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;default&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;context-window-experiment&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;help&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Base seed label for deterministic filler generation.&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;parser&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;add_argument&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
        &lt;span class=&quot;s&quot;&gt;&quot;--output-dir&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;default&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;DEFAULT_OUTPUT_DIR&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;help&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Base output directory for prompts and responses.&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;parser&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;add_argument&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
        &lt;span class=&quot;s&quot;&gt;&quot;--run-id&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;default&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;None&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;help&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Optional run id; defaults to timestamp.&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;parser&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;add_argument&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
        &lt;span class=&quot;s&quot;&gt;&quot;--dry-run&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;action&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;store_true&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;help&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Only generate prompts and metadata; do not call the CLI.&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;parser&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;add_argument&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
        &lt;span class=&quot;s&quot;&gt;&quot;--skip-existing&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;action&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;store_true&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;help&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Skip runs where output files already exist.&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;parser&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;parse_args&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;


&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;ensure_dir&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;path&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pathlib&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Path&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;bp&quot;&gt;None&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;path&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;mkdir&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;parents&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;True&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;exist_ok&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;True&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;


&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;main&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;args&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;parse_args&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;

    &lt;span class=&quot;n&quot;&gt;models&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;item&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;strip&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;item&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;args&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;models&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;split&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;,&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;item&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;strip&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()]&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;percentages&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;
        &lt;span class=&quot;nb&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;item&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;strip&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;())&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;item&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;args&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;context_percentages&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;split&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;,&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;item&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;strip&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;

    &lt;span class=&quot;n&quot;&gt;model_contexts&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;model&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;args&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;context_window&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;model&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;models&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;args&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;model_context&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;model_contexts&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;update&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;parse_model_contexts&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;args&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;model_context&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;

    &lt;span class=&quot;n&quot;&gt;run_id&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;args&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;run_id&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;not&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;run_id&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;run_id&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dt&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;datetime&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;now&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;dt&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;timezone&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;utc&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;strftime&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;%Y%m%dT%H%M%SZ&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;n&quot;&gt;base_dir&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pathlib&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Path&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;args&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;output_dir&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;run_id&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;ensure_dir&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;base_dir&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;n&quot;&gt;counter&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;TokenCounter&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;args&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;encoding&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;n&quot;&gt;results_path&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;base_dir&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;results.jsonl&quot;&lt;/span&gt;

    &lt;span class=&quot;n&quot;&gt;tasks&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;TASK_PELICAN&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;TASK_RECALL&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;model&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;models&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;context_window&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;model_contexts&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;model&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;args&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;context_window&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pct&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;percentages&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;target_total&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;context_window&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;pct&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;mf&quot;&gt;100.0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;task&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;tasks&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
                &lt;span class=&quot;n&quot;&gt;seed_label&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;sa&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;args&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;seed&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;task&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;pct&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;&lt;/span&gt;
                &lt;span class=&quot;n&quot;&gt;prompt_parts&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;build_prompt&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
                    &lt;span class=&quot;n&quot;&gt;task&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;task&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
                    &lt;span class=&quot;n&quot;&gt;target_total_tokens&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;target_total&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
                    &lt;span class=&quot;n&quot;&gt;counter&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;counter&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
                    &lt;span class=&quot;n&quot;&gt;fact_offset_tokens&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;args&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;fact_offset_tokens&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
                    &lt;span class=&quot;n&quot;&gt;seed_label&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;seed_label&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
                &lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

                &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;run_index&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;range&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;args&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;runs&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
                    &lt;span class=&quot;n&quot;&gt;run_name&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;sa&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;model&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;__&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;pct&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;pct__&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;task&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;__run&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;run_index&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;&lt;/span&gt;
                    &lt;span class=&quot;n&quot;&gt;run_dir&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;base_dir&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;run_name&lt;/span&gt;
                    &lt;span class=&quot;n&quot;&gt;ensure_dir&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;run_dir&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

                    &lt;span class=&quot;n&quot;&gt;prompt_path&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;run_dir&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;prompt.txt&quot;&lt;/span&gt;
                    &lt;span class=&quot;n&quot;&gt;output_path&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;run_dir&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;response.txt&quot;&lt;/span&gt;
                    &lt;span class=&quot;n&quot;&gt;log_path&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;run_dir&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;cli.log&quot;&lt;/span&gt;
                    &lt;span class=&quot;n&quot;&gt;meta_path&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;run_dir&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;meta.json&quot;&lt;/span&gt;

                    &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;args&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;skip_existing&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;and&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;output_path&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;exists&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;():&lt;/span&gt;
                        &lt;span class=&quot;k&quot;&gt;continue&lt;/span&gt;

                    &lt;span class=&quot;n&quot;&gt;prompt_path&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;write_text&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;prompt_parts&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;prompt&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;encoding&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;utf-8&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

                    &lt;span class=&quot;n&quot;&gt;exit_code&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;bp&quot;&gt;None&lt;/span&gt;
                    &lt;span class=&quot;n&quot;&gt;elapsed&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;bp&quot;&gt;None&lt;/span&gt;
                    &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;ow&quot;&gt;not&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;args&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;dry_run&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
                        &lt;span class=&quot;n&quot;&gt;exit_code&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;elapsed&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;run_cli&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
                            &lt;span class=&quot;n&quot;&gt;runner&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;args&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;runner&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
                            &lt;span class=&quot;n&quot;&gt;prompt&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;prompt_parts&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;prompt&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
                            &lt;span class=&quot;n&quot;&gt;prompt_path&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;prompt_path&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
                            &lt;span class=&quot;n&quot;&gt;model&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;model&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
                            &lt;span class=&quot;n&quot;&gt;output_path&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;output_path&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
                            &lt;span class=&quot;n&quot;&gt;log_path&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;log_path&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
                        &lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

                    &lt;span class=&quot;n&quot;&gt;actual_pct&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
                        &lt;span class=&quot;n&quot;&gt;prompt_parts&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;total_tokens&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;context_window&lt;/span&gt;
                        &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;context_window&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;
                        &lt;span class=&quot;k&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;bp&quot;&gt;None&lt;/span&gt;
                    &lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

                    &lt;span class=&quot;n&quot;&gt;meta&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
                        &lt;span class=&quot;s&quot;&gt;&quot;run_name&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;run_name&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
                        &lt;span class=&quot;s&quot;&gt;&quot;runner&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;args&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;runner&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
                        &lt;span class=&quot;s&quot;&gt;&quot;model&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;model&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
                        &lt;span class=&quot;s&quot;&gt;&quot;context_window&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;context_window&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
                        &lt;span class=&quot;s&quot;&gt;&quot;target_context_pct&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pct&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
                        &lt;span class=&quot;s&quot;&gt;&quot;target_total_tokens&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;prompt_parts&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;target_total_tokens&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
                        &lt;span class=&quot;s&quot;&gt;&quot;actual_total_tokens&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;prompt_parts&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;total_tokens&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
                        &lt;span class=&quot;s&quot;&gt;&quot;actual_context_pct&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;actual_pct&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
                        &lt;span class=&quot;s&quot;&gt;&quot;task&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;task&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
                        &lt;span class=&quot;s&quot;&gt;&quot;runs&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;args&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;runs&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
                        &lt;span class=&quot;s&quot;&gt;&quot;run_index&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;run_index&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
                        &lt;span class=&quot;s&quot;&gt;&quot;facts&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;FACTS&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;task&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;TASK_RECALL&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[],&lt;/span&gt;
                        &lt;span class=&quot;s&quot;&gt;&quot;facts_start_tokens&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;prompt_parts&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;facts_start_tokens&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
                        &lt;span class=&quot;s&quot;&gt;&quot;fact_offset_tokens&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;args&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;fact_offset_tokens&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
                        &lt;span class=&quot;s&quot;&gt;&quot;filler_before_tokens&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;prompt_parts&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;filler_before_tokens&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
                        &lt;span class=&quot;s&quot;&gt;&quot;filler_after_tokens&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;prompt_parts&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;filler_after_tokens&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
                        &lt;span class=&quot;s&quot;&gt;&quot;encoding&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;args&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;encoding&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
                        &lt;span class=&quot;s&quot;&gt;&quot;prompt_path&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;str&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;prompt_path&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt;
                        &lt;span class=&quot;s&quot;&gt;&quot;response_path&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;str&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;output_path&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt;
                        &lt;span class=&quot;s&quot;&gt;&quot;log_path&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;str&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;log_path&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt;
                        &lt;span class=&quot;s&quot;&gt;&quot;exit_code&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;exit_code&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
                        &lt;span class=&quot;s&quot;&gt;&quot;elapsed_seconds&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;elapsed&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
                        &lt;span class=&quot;s&quot;&gt;&quot;timestamp_utc&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dt&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;datetime&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;now&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;dt&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;timezone&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;utc&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;isoformat&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(),&lt;/span&gt;
                    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

                    &lt;span class=&quot;n&quot;&gt;meta_path&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;write_text&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;json&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;dumps&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;meta&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;indent&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;encoding&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;utf-8&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
                    &lt;span class=&quot;k&quot;&gt;with&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;results_path&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;open&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;a&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;encoding&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;utf-8&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;as&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;results_file&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
                        &lt;span class=&quot;n&quot;&gt;results_file&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;write&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;json&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;dumps&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;meta&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;


&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;__name__&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;__main__&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;raise&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;SystemExit&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;main&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;())&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;  &lt;/div&gt;

&lt;/details&gt;

&lt;h2 id=&quot;recall-results&quot;&gt;Recall results&lt;/h2&gt;

&lt;p&gt;Exact means bullet-only output with no extra commentary.&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Context %&lt;/th&gt;
      &lt;th&gt;gpt-5.1-codex-max&lt;/th&gt;
      &lt;th&gt;gpt-5.2-codex&lt;/th&gt;
      &lt;th&gt;claude-sonnet-4.5&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;0&lt;/td&gt;
      &lt;td&gt;Exact&lt;/td&gt;
      &lt;td&gt;Exact&lt;/td&gt;
      &lt;td&gt;Facts correct, extra text&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;25&lt;/td&gt;
      &lt;td&gt;Exact&lt;/td&gt;
      &lt;td&gt;Exact&lt;/td&gt;
      &lt;td&gt;Facts correct, extra text&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;50&lt;/td&gt;
      &lt;td&gt;Exact&lt;/td&gt;
      &lt;td&gt;Exact&lt;/td&gt;
      &lt;td&gt;Facts correct, extra text&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;75&lt;/td&gt;
      &lt;td&gt;Exact&lt;/td&gt;
      &lt;td&gt;Exact&lt;/td&gt;
      &lt;td&gt;Facts correct, extra text&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;98&lt;/td&gt;
      &lt;td&gt;Exact&lt;/td&gt;
      &lt;td&gt;Exact&lt;/td&gt;
      &lt;td&gt;Facts correct, extra text&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;Copilot responses included additional commentary and formatting beyond the requested bullet-only output.&lt;/p&gt;

&lt;h2 id=&quot;svg-results&quot;&gt;SVG results&lt;/h2&gt;

&lt;p&gt;Below are the SVG outputs for each model at each context fill level. The response files were renamed and moved into &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;images/context-window-performance-dropoff/&lt;/code&gt; for rendering.&lt;/p&gt;

&lt;h3 id=&quot;gpt-51-codex-max&quot;&gt;gpt-5.1-codex-max&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;0% context:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_800,q_auto,f_auto/https://tiberriver256.github.io/images/context-window-performance-dropoff/gpt-5.1-codex-max-0pct.svg&quot; srcset=&quot;         https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_320,q_auto,f_auto/https://tiberriver256.github.io/images/context-window-performance-dropoff/gpt-5.1-codex-max-0pct.svg 320w,         https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_640,q_auto,f_auto/https://tiberriver256.github.io/images/context-window-performance-dropoff/gpt-5.1-codex-max-0pct.svg 640w,         https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_960,q_auto,f_auto/https://tiberriver256.github.io/images/context-window-performance-dropoff/gpt-5.1-codex-max-0pct.svg 960w,         https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_1280,q_auto,f_auto/https://tiberriver256.github.io/images/context-window-performance-dropoff/gpt-5.1-codex-max-0pct.svg 1280w,         https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_1600,q_auto,f_auto/https://tiberriver256.github.io/images/context-window-performance-dropoff/gpt-5.1-codex-max-0pct.svg 1600w     &quot; sizes=&quot;(min-width: 50rem) 50rem, 90vw&quot; alt=&quot;gpt-5.1-codex-max SVG output at 0 percent context&quot; loading=&quot;lazy&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;25% context:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_800,q_auto,f_auto/https://tiberriver256.github.io/images/context-window-performance-dropoff/gpt-5.1-codex-max-25pct.svg&quot; srcset=&quot;         https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_320,q_auto,f_auto/https://tiberriver256.github.io/images/context-window-performance-dropoff/gpt-5.1-codex-max-25pct.svg 320w,         https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_640,q_auto,f_auto/https://tiberriver256.github.io/images/context-window-performance-dropoff/gpt-5.1-codex-max-25pct.svg 640w,         https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_960,q_auto,f_auto/https://tiberriver256.github.io/images/context-window-performance-dropoff/gpt-5.1-codex-max-25pct.svg 960w,         https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_1280,q_auto,f_auto/https://tiberriver256.github.io/images/context-window-performance-dropoff/gpt-5.1-codex-max-25pct.svg 1280w,         https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_1600,q_auto,f_auto/https://tiberriver256.github.io/images/context-window-performance-dropoff/gpt-5.1-codex-max-25pct.svg 1600w     &quot; sizes=&quot;(min-width: 50rem) 50rem, 90vw&quot; alt=&quot;gpt-5.1-codex-max SVG output at 25 percent context&quot; loading=&quot;lazy&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;50% context:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_800,q_auto,f_auto/https://tiberriver256.github.io/images/context-window-performance-dropoff/gpt-5.1-codex-max-50pct.svg&quot; srcset=&quot;         https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_320,q_auto,f_auto/https://tiberriver256.github.io/images/context-window-performance-dropoff/gpt-5.1-codex-max-50pct.svg 320w,         https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_640,q_auto,f_auto/https://tiberriver256.github.io/images/context-window-performance-dropoff/gpt-5.1-codex-max-50pct.svg 640w,         https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_960,q_auto,f_auto/https://tiberriver256.github.io/images/context-window-performance-dropoff/gpt-5.1-codex-max-50pct.svg 960w,         https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_1280,q_auto,f_auto/https://tiberriver256.github.io/images/context-window-performance-dropoff/gpt-5.1-codex-max-50pct.svg 1280w,         https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_1600,q_auto,f_auto/https://tiberriver256.github.io/images/context-window-performance-dropoff/gpt-5.1-codex-max-50pct.svg 1600w     &quot; sizes=&quot;(min-width: 50rem) 50rem, 90vw&quot; alt=&quot;gpt-5.1-codex-max SVG output at 50 percent context&quot; loading=&quot;lazy&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;75% context:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_800,q_auto,f_auto/https://tiberriver256.github.io/images/context-window-performance-dropoff/gpt-5.1-codex-max-75pct.svg&quot; srcset=&quot;         https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_320,q_auto,f_auto/https://tiberriver256.github.io/images/context-window-performance-dropoff/gpt-5.1-codex-max-75pct.svg 320w,         https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_640,q_auto,f_auto/https://tiberriver256.github.io/images/context-window-performance-dropoff/gpt-5.1-codex-max-75pct.svg 640w,         https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_960,q_auto,f_auto/https://tiberriver256.github.io/images/context-window-performance-dropoff/gpt-5.1-codex-max-75pct.svg 960w,         https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_1280,q_auto,f_auto/https://tiberriver256.github.io/images/context-window-performance-dropoff/gpt-5.1-codex-max-75pct.svg 1280w,         https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_1600,q_auto,f_auto/https://tiberriver256.github.io/images/context-window-performance-dropoff/gpt-5.1-codex-max-75pct.svg 1600w     &quot; sizes=&quot;(min-width: 50rem) 50rem, 90vw&quot; alt=&quot;gpt-5.1-codex-max SVG output at 75 percent context&quot; loading=&quot;lazy&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;98% context:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_800,q_auto,f_auto/https://tiberriver256.github.io/images/context-window-performance-dropoff/gpt-5.1-codex-max-98pct.svg&quot; srcset=&quot;         https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_320,q_auto,f_auto/https://tiberriver256.github.io/images/context-window-performance-dropoff/gpt-5.1-codex-max-98pct.svg 320w,         https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_640,q_auto,f_auto/https://tiberriver256.github.io/images/context-window-performance-dropoff/gpt-5.1-codex-max-98pct.svg 640w,         https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_960,q_auto,f_auto/https://tiberriver256.github.io/images/context-window-performance-dropoff/gpt-5.1-codex-max-98pct.svg 960w,         https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_1280,q_auto,f_auto/https://tiberriver256.github.io/images/context-window-performance-dropoff/gpt-5.1-codex-max-98pct.svg 1280w,         https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_1600,q_auto,f_auto/https://tiberriver256.github.io/images/context-window-performance-dropoff/gpt-5.1-codex-max-98pct.svg 1600w     &quot; sizes=&quot;(min-width: 50rem) 50rem, 90vw&quot; alt=&quot;gpt-5.1-codex-max SVG output at 98 percent context&quot; loading=&quot;lazy&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;gpt-52-codex&quot;&gt;gpt-5.2-codex&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;0% context:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_800,q_auto,f_auto/https://tiberriver256.github.io/images/context-window-performance-dropoff/gpt-5.2-codex-0pct.svg&quot; srcset=&quot;         https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_320,q_auto,f_auto/https://tiberriver256.github.io/images/context-window-performance-dropoff/gpt-5.2-codex-0pct.svg 320w,         https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_640,q_auto,f_auto/https://tiberriver256.github.io/images/context-window-performance-dropoff/gpt-5.2-codex-0pct.svg 640w,         https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_960,q_auto,f_auto/https://tiberriver256.github.io/images/context-window-performance-dropoff/gpt-5.2-codex-0pct.svg 960w,         https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_1280,q_auto,f_auto/https://tiberriver256.github.io/images/context-window-performance-dropoff/gpt-5.2-codex-0pct.svg 1280w,         https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_1600,q_auto,f_auto/https://tiberriver256.github.io/images/context-window-performance-dropoff/gpt-5.2-codex-0pct.svg 1600w     &quot; sizes=&quot;(min-width: 50rem) 50rem, 90vw&quot; alt=&quot;gpt-5.2-codex SVG output at 0 percent context&quot; loading=&quot;lazy&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;25% context:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_800,q_auto,f_auto/https://tiberriver256.github.io/images/context-window-performance-dropoff/gpt-5.2-codex-25pct.svg&quot; srcset=&quot;         https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_320,q_auto,f_auto/https://tiberriver256.github.io/images/context-window-performance-dropoff/gpt-5.2-codex-25pct.svg 320w,         https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_640,q_auto,f_auto/https://tiberriver256.github.io/images/context-window-performance-dropoff/gpt-5.2-codex-25pct.svg 640w,         https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_960,q_auto,f_auto/https://tiberriver256.github.io/images/context-window-performance-dropoff/gpt-5.2-codex-25pct.svg 960w,         https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_1280,q_auto,f_auto/https://tiberriver256.github.io/images/context-window-performance-dropoff/gpt-5.2-codex-25pct.svg 1280w,         https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_1600,q_auto,f_auto/https://tiberriver256.github.io/images/context-window-performance-dropoff/gpt-5.2-codex-25pct.svg 1600w     &quot; sizes=&quot;(min-width: 50rem) 50rem, 90vw&quot; alt=&quot;gpt-5.2-codex SVG output at 25 percent context&quot; loading=&quot;lazy&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;50% context:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_800,q_auto,f_auto/https://tiberriver256.github.io/images/context-window-performance-dropoff/gpt-5.2-codex-50pct.svg&quot; srcset=&quot;         https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_320,q_auto,f_auto/https://tiberriver256.github.io/images/context-window-performance-dropoff/gpt-5.2-codex-50pct.svg 320w,         https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_640,q_auto,f_auto/https://tiberriver256.github.io/images/context-window-performance-dropoff/gpt-5.2-codex-50pct.svg 640w,         https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_960,q_auto,f_auto/https://tiberriver256.github.io/images/context-window-performance-dropoff/gpt-5.2-codex-50pct.svg 960w,         https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_1280,q_auto,f_auto/https://tiberriver256.github.io/images/context-window-performance-dropoff/gpt-5.2-codex-50pct.svg 1280w,         https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_1600,q_auto,f_auto/https://tiberriver256.github.io/images/context-window-performance-dropoff/gpt-5.2-codex-50pct.svg 1600w     &quot; sizes=&quot;(min-width: 50rem) 50rem, 90vw&quot; alt=&quot;gpt-5.2-codex SVG output at 50 percent context&quot; loading=&quot;lazy&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;75% context:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_800,q_auto,f_auto/https://tiberriver256.github.io/images/context-window-performance-dropoff/gpt-5.2-codex-75pct.svg&quot; srcset=&quot;         https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_320,q_auto,f_auto/https://tiberriver256.github.io/images/context-window-performance-dropoff/gpt-5.2-codex-75pct.svg 320w,         https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_640,q_auto,f_auto/https://tiberriver256.github.io/images/context-window-performance-dropoff/gpt-5.2-codex-75pct.svg 640w,         https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_960,q_auto,f_auto/https://tiberriver256.github.io/images/context-window-performance-dropoff/gpt-5.2-codex-75pct.svg 960w,         https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_1280,q_auto,f_auto/https://tiberriver256.github.io/images/context-window-performance-dropoff/gpt-5.2-codex-75pct.svg 1280w,         https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_1600,q_auto,f_auto/https://tiberriver256.github.io/images/context-window-performance-dropoff/gpt-5.2-codex-75pct.svg 1600w     &quot; sizes=&quot;(min-width: 50rem) 50rem, 90vw&quot; alt=&quot;gpt-5.2-codex SVG output at 75 percent context&quot; loading=&quot;lazy&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;98% context:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_800,q_auto,f_auto/https://tiberriver256.github.io/images/context-window-performance-dropoff/gpt-5.2-codex-98pct.svg&quot; srcset=&quot;         https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_320,q_auto,f_auto/https://tiberriver256.github.io/images/context-window-performance-dropoff/gpt-5.2-codex-98pct.svg 320w,         https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_640,q_auto,f_auto/https://tiberriver256.github.io/images/context-window-performance-dropoff/gpt-5.2-codex-98pct.svg 640w,         https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_960,q_auto,f_auto/https://tiberriver256.github.io/images/context-window-performance-dropoff/gpt-5.2-codex-98pct.svg 960w,         https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_1280,q_auto,f_auto/https://tiberriver256.github.io/images/context-window-performance-dropoff/gpt-5.2-codex-98pct.svg 1280w,         https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_1600,q_auto,f_auto/https://tiberriver256.github.io/images/context-window-performance-dropoff/gpt-5.2-codex-98pct.svg 1600w     &quot; sizes=&quot;(min-width: 50rem) 50rem, 90vw&quot; alt=&quot;gpt-5.2-codex SVG output at 98 percent context&quot; loading=&quot;lazy&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;claude-sonnet-45-copilot-cli&quot;&gt;claude-sonnet-4.5 (Copilot CLI)&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;0% context:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_800,q_auto,f_auto/https://tiberriver256.github.io/images/context-window-performance-dropoff/claude-sonnet-4.5-0pct.svg&quot; srcset=&quot;         https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_320,q_auto,f_auto/https://tiberriver256.github.io/images/context-window-performance-dropoff/claude-sonnet-4.5-0pct.svg 320w,         https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_640,q_auto,f_auto/https://tiberriver256.github.io/images/context-window-performance-dropoff/claude-sonnet-4.5-0pct.svg 640w,         https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_960,q_auto,f_auto/https://tiberriver256.github.io/images/context-window-performance-dropoff/claude-sonnet-4.5-0pct.svg 960w,         https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_1280,q_auto,f_auto/https://tiberriver256.github.io/images/context-window-performance-dropoff/claude-sonnet-4.5-0pct.svg 1280w,         https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_1600,q_auto,f_auto/https://tiberriver256.github.io/images/context-window-performance-dropoff/claude-sonnet-4.5-0pct.svg 1600w     &quot; sizes=&quot;(min-width: 50rem) 50rem, 90vw&quot; alt=&quot;claude-sonnet-4.5 SVG output at 0 percent context&quot; loading=&quot;lazy&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;25% context:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_800,q_auto,f_auto/https://tiberriver256.github.io/images/context-window-performance-dropoff/claude-sonnet-4.5-25pct.svg&quot; srcset=&quot;         https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_320,q_auto,f_auto/https://tiberriver256.github.io/images/context-window-performance-dropoff/claude-sonnet-4.5-25pct.svg 320w,         https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_640,q_auto,f_auto/https://tiberriver256.github.io/images/context-window-performance-dropoff/claude-sonnet-4.5-25pct.svg 640w,         https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_960,q_auto,f_auto/https://tiberriver256.github.io/images/context-window-performance-dropoff/claude-sonnet-4.5-25pct.svg 960w,         https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_1280,q_auto,f_auto/https://tiberriver256.github.io/images/context-window-performance-dropoff/claude-sonnet-4.5-25pct.svg 1280w,         https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_1600,q_auto,f_auto/https://tiberriver256.github.io/images/context-window-performance-dropoff/claude-sonnet-4.5-25pct.svg 1600w     &quot; sizes=&quot;(min-width: 50rem) 50rem, 90vw&quot; alt=&quot;claude-sonnet-4.5 SVG output at 25 percent context&quot; loading=&quot;lazy&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;50% context:&lt;/strong&gt;
No SVG output (response asked for file access)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;75% context:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_800,q_auto,f_auto/https://tiberriver256.github.io/images/context-window-performance-dropoff/claude-sonnet-4.5-75pct.svg&quot; srcset=&quot;         https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_320,q_auto,f_auto/https://tiberriver256.github.io/images/context-window-performance-dropoff/claude-sonnet-4.5-75pct.svg 320w,         https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_640,q_auto,f_auto/https://tiberriver256.github.io/images/context-window-performance-dropoff/claude-sonnet-4.5-75pct.svg 640w,         https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_960,q_auto,f_auto/https://tiberriver256.github.io/images/context-window-performance-dropoff/claude-sonnet-4.5-75pct.svg 960w,         https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_1280,q_auto,f_auto/https://tiberriver256.github.io/images/context-window-performance-dropoff/claude-sonnet-4.5-75pct.svg 1280w,         https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_1600,q_auto,f_auto/https://tiberriver256.github.io/images/context-window-performance-dropoff/claude-sonnet-4.5-75pct.svg 1600w     &quot; sizes=&quot;(min-width: 50rem) 50rem, 90vw&quot; alt=&quot;claude-sonnet-4.5 SVG output at 75 percent context&quot; loading=&quot;lazy&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;98% context:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_800,q_auto,f_auto/https://tiberriver256.github.io/images/context-window-performance-dropoff/claude-sonnet-4.5-98pct.svg&quot; srcset=&quot;         https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_320,q_auto,f_auto/https://tiberriver256.github.io/images/context-window-performance-dropoff/claude-sonnet-4.5-98pct.svg 320w,         https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_640,q_auto,f_auto/https://tiberriver256.github.io/images/context-window-performance-dropoff/claude-sonnet-4.5-98pct.svg 640w,         https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_960,q_auto,f_auto/https://tiberriver256.github.io/images/context-window-performance-dropoff/claude-sonnet-4.5-98pct.svg 960w,         https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_1280,q_auto,f_auto/https://tiberriver256.github.io/images/context-window-performance-dropoff/claude-sonnet-4.5-98pct.svg 1280w,         https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_1600,q_auto,f_auto/https://tiberriver256.github.io/images/context-window-performance-dropoff/claude-sonnet-4.5-98pct.svg 1600w     &quot; sizes=&quot;(min-width: 50rem) 50rem, 90vw&quot; alt=&quot;claude-sonnet-4.5 SVG output at 98 percent context&quot; loading=&quot;lazy&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;takeaway&quot;&gt;Takeaway&lt;/h2&gt;

&lt;p&gt;This is totally unscientific… but pretty much blows my idea out of the water.
The funny part is that I think some of the svgs actually improve as the context
window gets filled up which is… bizarre and kind of funny lol.&lt;/p&gt;

&lt;p&gt;Hope you enjoyed the read!&lt;/p&gt;

    &lt;p&gt;&lt;a href=&quot;https://tiberriver256.github.io/ai%20and%20technology/context-window-performance-dropoff/&quot;&gt;Do Newer Models Hold Up as Context Fills?&lt;/a&gt; was originally published by Micah Rairdon at &lt;a href=&quot;https://tiberriver256.github.io&quot;&gt;Tiberriver256&lt;/a&gt; on December 18, 2025.&lt;/p&gt;
  </content>
</entry>


<entry>
  <title type="html"><![CDATA[Sharing Skills: Claude Marketplace to VS Code Workspaces]]></title>
 <link rel="alternate" type="text/html" href="https://tiberriver256.github.io/ai%20and%20technology/skills-catalog-part-3-organizational-knowledge-at-scale/" />
  <id>https://tiberriver256.github.io/ai%20and%20technology/skills-catalog-part-3-organizational-knowledge-at-scale</id>
  <updated>2025-11-02T00:00:00-00:00</updated>
  <published>2025-11-02T00:00:00-04:00</published>
  
  <author>
    <name>Micah Rairdon</name>
    <uri>https://tiberriver256.github.io</uri>
    <email>Jun(Real Email: Micah.Rairdon [GMail])k@JunkMail.com</email>
  </author>
  <content type="html">
    &lt;table&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;Part 3 of 3&lt;/strong&gt; in the Skills Catalog series (&lt;a href=&quot;/ai%20and%20technology/skills-catalog-part-1-indexing-ai-context&quot;&gt;Part 1&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href=&quot;/ai%20and%20technology/skills-catalog-part-2-building-skills-that-scale&quot;&gt;Part 2&lt;/a&gt;)&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;You’ve built a skills catalog. Nested domains. Scripts that execute on demand.&lt;/p&gt;

&lt;p&gt;Now the final question: &lt;strong&gt;How do you share this across your team?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Anthropic distributes skills through their marketplace and Skills API—portable, reusable knowledge packages.&lt;/p&gt;

&lt;p&gt;GitHub Copilot doesn’t have a marketplace. But VS Code workspaces achieve the same outcome.&lt;/p&gt;

&lt;h2 id=&quot;the-problem&quot;&gt;The Problem&lt;/h2&gt;

&lt;p&gt;Your &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.github/skills/&lt;/code&gt; directory holds organizational standards, tested scripts, and domain expertise.&lt;/p&gt;

&lt;p&gt;But you have multiple repositories—frontend apps, backend services, infrastructure, libraries.&lt;/p&gt;

&lt;p&gt;Copy &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.github/skills/&lt;/code&gt; into each? What happens when you update a script?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;That doesn’t scale.&lt;/strong&gt;&lt;/p&gt;

&lt;h2 id=&quot;the-solution-shared-repository--workspaces&quot;&gt;The Solution: Shared Repository + Workspaces&lt;/h2&gt;

&lt;p&gt;Create one repository holding all organizational skills. Every project references it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The key insight&lt;/strong&gt;: VS Code automatically merges &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.github/copilot-instructions.md&lt;/code&gt; files from all workspace folders.&lt;/p&gt;

&lt;h3 id=&quot;repository-structure&quot;&gt;Repository Structure&lt;/h3&gt;

&lt;p&gt;Create &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;org-skills&lt;/code&gt; (or whatever you prefer):&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;org-skills/
├── README.md
├── .github/
│   ├── copilot-instructions.md
│   └── workflows/
│       └── validate-skills.yml
└── skills/
    ├── azure-devops/
    │   ├── index.md
    │   ├── pipelines.md
    │   ├── repos.md
    │   ├── work-items.md
    │   └── scripts/
    │       ├── get-related-work-items.ps1
    │       └── create-pr.ps1
    ├── aws/
    │   ├── index.md
    │   ├── ec2.md
    │   ├── s3.md
    │   └── scripts/
    ├── docker/
    │   ├── index.md
    │   ├── compose.md
    │   └── templates/
    ├── powershell/
    │   ├── index.md
    │   ├── standards.md
    │   └── modules.md
    └── react/
        ├── index.md
        ├── components.md
        └── patterns.md
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This repository becomes your single source of truth.&lt;/p&gt;

&lt;p&gt;Version control tracks changes. Teams contribute via PRs. CI validates scripts. Everyone uses the same versions.&lt;/p&gt;

&lt;h2 id=&quot;vs-code-workspaces&quot;&gt;VS Code Workspaces&lt;/h2&gt;

&lt;p&gt;VS Code merges &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.github/copilot-instructions.md&lt;/code&gt; files from all workspace folders. Add a folder, skills become available.&lt;/p&gt;

&lt;h3 id=&quot;how-it-works&quot;&gt;How It Works&lt;/h3&gt;

&lt;p&gt;Create a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.code-workspace&lt;/code&gt; file in any project:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;my-app.code-workspace&lt;/code&gt;&lt;/strong&gt;:&lt;/p&gt;

&lt;div class=&quot;language-json highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;folders&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
      &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;my-app&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
      &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;path&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;.&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
      &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;org-skills&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
      &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;path&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;../org-skills&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;settings&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;github.copilot.enable&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
      &lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;&quot;*&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;kc&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This workspace includes two folders: the current repository and org-skills.&lt;/p&gt;

&lt;p&gt;Open the workspace, and &lt;strong&gt;GitHub Copilot reads both &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.github/copilot-instructions.md&lt;/code&gt; files and merges them.&lt;/strong&gt;&lt;/p&gt;

&lt;h3 id=&quot;the-shared-repos-copilot-instructions&quot;&gt;The Shared Repo’s Copilot Instructions&lt;/h3&gt;

&lt;p&gt;In your &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;org-skills&lt;/code&gt; repository, create &lt;strong&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.github/copilot-instructions.md&lt;/code&gt;&lt;/strong&gt;:&lt;/p&gt;

&lt;div class=&quot;language-markdown highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;gh&quot;&gt;# Organizational Skills&lt;/span&gt;

This repository contains organizational knowledge and standards.

&lt;span class=&quot;gu&quot;&gt;## Available Skills&lt;/span&gt;

| Skill Name | Description | Path |
|------------|-------------|------|
| Azure DevOps | Work with Azure DevOps repos, pipelines, work items | &lt;span class=&quot;sb&quot;&gt;`skills/azure-devops/index.md`&lt;/span&gt; |
| AWS | AWS services and patterns | &lt;span class=&quot;sb&quot;&gt;`skills/aws/index.md`&lt;/span&gt; |
| Docker | Container standards and compose patterns | &lt;span class=&quot;sb&quot;&gt;`skills/docker/index.md`&lt;/span&gt; |
| PowerShell | PowerShell coding standards | &lt;span class=&quot;sb&quot;&gt;`skills/powershell/index.md`&lt;/span&gt; |
| React | React component patterns | &lt;span class=&quot;sb&quot;&gt;`skills/react/index.md`&lt;/span&gt; |
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Notice paths are relative to org-skills (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;skills/...&lt;/code&gt;), not absolute.&lt;/p&gt;

&lt;p&gt;VS Code merges the instructions automatically. &lt;strong&gt;Organizational knowledge available, no copying.&lt;/strong&gt;&lt;/p&gt;

&lt;h2 id=&quot;bootstrapping-new-projects&quot;&gt;Bootstrapping New Projects&lt;/h2&gt;

&lt;p&gt;When starting a new repository:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;strong&gt;Clone the shared skills repo&lt;/strong&gt; alongside your new project:&lt;/li&gt;
&lt;/ol&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nb&quot;&gt;cd&lt;/span&gt; ~/projects
git clone https://github.com/your-org/my-new-app.git
git clone https://github.com/your-org/org-skills.git
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;strong&gt;Create a workspace file&lt;/strong&gt; in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;my-new-app&lt;/code&gt;:&lt;/li&gt;
&lt;/ol&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nb&quot;&gt;cd &lt;/span&gt;my-new-app
&lt;span class=&quot;nb&quot;&gt;cat&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; my-new-app.code-workspace &lt;span class=&quot;o&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;sh&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;EOF&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt;&apos;
{
  &quot;folders&quot;: [
    {
      &quot;name&quot;: &quot;my-new-app&quot;,
      &quot;path&quot;: &quot;.&quot;
    },
    {
      &quot;name&quot;: &quot;org-skills&quot;,
      &quot;path&quot;: &quot;../org-skills&quot;
    }
  ]
}
&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;EOF
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;strong&gt;Open the workspace&lt;/strong&gt;:&lt;/li&gt;
&lt;/ol&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;code my-new-app.code-workspace
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Done.&lt;/strong&gt; The project has access to all organizational skills.&lt;/p&gt;

&lt;h2 id=&quot;updating-skills&quot;&gt;Updating Skills&lt;/h2&gt;

&lt;p&gt;Add or update a skill in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;org-skills&lt;/code&gt;, commit, and push. Every project pulls the latest:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nb&quot;&gt;cd&lt;/span&gt; ~/projects/org-skills
git pull
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;All workspaces referencing &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;org-skills&lt;/code&gt; see the updates immediately.&lt;/p&gt;

&lt;h2 id=&quot;what-youve-built&quot;&gt;What You’ve Built&lt;/h2&gt;

&lt;p&gt;Over these three parts, you’ve adapted Anthropic’s Skills concept for GitHub Copilot:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Part 1&lt;/strong&gt;: Auto-discovery → Catalog pattern for navigation&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Part 2&lt;/strong&gt;: Nested structures and scripts → Adapted for the catalog&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Part 3&lt;/strong&gt;: Marketplace distribution → VS Code workspaces for sharing&lt;/p&gt;

&lt;p&gt;A system for scaling AI context to &lt;strong&gt;hundreds of skills&lt;/strong&gt; across &lt;strong&gt;dozens of repositories&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Your AI doesn’t need to know everything. It just needs to know where to look.&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;&lt;em&gt;This approach adapts &lt;a href=&quot;https://www.anthropic.com/news/skills&quot;&gt;Anthropic Skills&lt;/a&gt; for GitHub Copilot. The core concepts—modular knowledge, on-demand loading, shareability—come from Anthropic’s design.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;If you build a skills catalog, I’d love to hear about it. Find me on &lt;a href=&quot;https://linkedin.com/in/tiberriver256&quot;&gt;LinkedIn&lt;/a&gt; or open an issue on this blog’s &lt;a href=&quot;https://github.com/Tiberriver256/Tiberriver256.GitHub.io&quot;&gt;GitHub repo&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

    &lt;p&gt;&lt;a href=&quot;https://tiberriver256.github.io/ai%20and%20technology/skills-catalog-part-3-organizational-knowledge-at-scale/&quot;&gt;Sharing Skills: Claude Marketplace to VS Code Workspaces&lt;/a&gt; was originally published by Micah Rairdon at &lt;a href=&quot;https://tiberriver256.github.io&quot;&gt;Tiberriver256&lt;/a&gt; on November 02, 2025.&lt;/p&gt;
  </content>
</entry>


<entry>
  <title type="html"><![CDATA[Learning from Anthropic: Nested Skills and Scripts]]></title>
 <link rel="alternate" type="text/html" href="https://tiberriver256.github.io/ai%20and%20technology/skills-catalog-part-2-building-skills-that-scale/" />
  <id>https://tiberriver256.github.io/ai%20and%20technology/skills-catalog-part-2-building-skills-that-scale</id>
  <updated>2025-11-02T00:00:00-00:00</updated>
  <published>2025-11-02T00:00:00-04:00</published>
  
  <author>
    <name>Micah Rairdon</name>
    <uri>https://tiberriver256.github.io</uri>
    <email>Jun(Real Email: Micah.Rairdon [GMail])k@JunkMail.com</email>
  </author>
  <content type="html">
    &lt;table&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;Part 2 of 3&lt;/strong&gt; in the Skills Catalog series (&lt;a href=&quot;/ai%20and%20technology/skills-catalog-part-1-indexing-ai-context&quot;&gt;Part 1&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href=&quot;/ai%20and%20technology/skills-catalog-part-3-organizational-knowledge-at-scale&quot;&gt;Part 3&lt;/a&gt;)&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;Part 1 covered the catalog pattern. Now: &lt;strong&gt;how do you organize knowledge that scales to hundreds of skills?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Anthropic’s &lt;a href=&quot;https://github.com/anthropics/skills&quot;&gt;skills repository&lt;/a&gt; shows patterns for complex domains:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;strong&gt;Nested structures&lt;/strong&gt; for complex domains&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Scripts as executable knowledge&lt;/strong&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Supporting resources&lt;/strong&gt; (templates, configs)&lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&quot;anthropics-nested-skills&quot;&gt;Anthropic’s Nested Skills&lt;/h2&gt;

&lt;p&gt;The &lt;a href=&quot;https://github.com/anthropics/skills/tree/main/mcp-builder&quot;&gt;mcp-builder skill&lt;/a&gt;:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;mcp-builder/
├── SKILL.md                    # Main skill description
├── guides/
│   ├── getting-started.md
│   ├── server-patterns.md
│   └── testing.md
├── templates/
│   ├── basic-server.py
│   └── typescript-server/
└── scripts/
    ├── create-server.sh
    └── test-server.sh
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Pattern&lt;/strong&gt;:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;strong&gt;SKILL.md&lt;/strong&gt;: Overview with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;description&lt;/code&gt; for discovery&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Guides&lt;/strong&gt;: Detailed sub-topics&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Templates&lt;/strong&gt;: Starting code&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Scripts&lt;/strong&gt;: Executable automation&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Keeps &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SKILL.md&lt;/code&gt; lean—points to guides. Claude loads guides selectively.&lt;/p&gt;

&lt;h2 id=&quot;adapting-for-the-catalog&quot;&gt;Adapting for the Catalog&lt;/h2&gt;

&lt;h3 id=&quot;top-level-catalog&quot;&gt;Top-Level Catalog&lt;/h3&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.github/copilot-instructions.md&lt;/code&gt; stays high-level:&lt;/p&gt;

&lt;div class=&quot;language-markdown highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;gu&quot;&gt;## Available Skills&lt;/span&gt;

| Skill Name | Description | Path |
|------------|-------------|------|
| Azure DevOps | Work with Azure DevOps repos, pipelines, work items | &lt;span class=&quot;sb&quot;&gt;`.github/skills/azure-devops/index.md`&lt;/span&gt; |
| React | React component patterns and standards | &lt;span class=&quot;sb&quot;&gt;`.github/skills/react/index.md`&lt;/span&gt; |
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Each skill points to an &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;index.md&lt;/code&gt; (like Anthropic’s &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SKILL.md&lt;/code&gt;).&lt;/p&gt;

&lt;h3 id=&quot;domain-index-sub-catalog&quot;&gt;Domain Index (Sub-Catalog)&lt;/h3&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.github/skills/azure-devops/index.md&lt;/code&gt; becomes a second-level catalog:&lt;/p&gt;

&lt;div class=&quot;language-markdown highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;gh&quot;&gt;# Azure DevOps Skill&lt;/span&gt;

&lt;span class=&quot;gu&quot;&gt;## Sub-Skills&lt;/span&gt;

| Sub-Skill | Description | Path |
|-----------|-------------|------|
| Repositories | Branch policies, PRs, code reviews | &lt;span class=&quot;sb&quot;&gt;`./repos.md`&lt;/span&gt; |
| Pipelines | YAML pipelines, triggers, monorepo support | &lt;span class=&quot;sb&quot;&gt;`./pipelines.md`&lt;/span&gt; |
| Work Items | Queries, custom fields, automation | &lt;span class=&quot;sb&quot;&gt;`./work-items.md`&lt;/span&gt; |

&lt;span class=&quot;gu&quot;&gt;## Quick References&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;
-&lt;/span&gt; Organization: &lt;span class=&quot;sb&quot;&gt;`https://dev.azure.com/yourorg`&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;-&lt;/span&gt; Project: &lt;span class=&quot;sb&quot;&gt;`YourProject`&lt;/span&gt;

&lt;span class=&quot;gu&quot;&gt;## Scripts&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;
-&lt;/span&gt; &lt;span class=&quot;sb&quot;&gt;`scripts/get-related-work-items.ps1`&lt;/span&gt; - Get work items for pipeline run
&lt;span class=&quot;p&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;sb&quot;&gt;`scripts/create-pr.ps1`&lt;/span&gt; - Create PR with template
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Two-level indexing:&lt;/p&gt;
&lt;ol&gt;
  &lt;li&gt;Main catalog → Azure DevOps skill exists&lt;/li&gt;
  &lt;li&gt;Azure DevOps index → Pipelines sub-skill for pipeline questions&lt;/li&gt;
&lt;/ol&gt;

&lt;h3 id=&quot;sub-skill-files&quot;&gt;Sub-Skill Files&lt;/h3&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.github/skills/azure-devops/pipelines.md&lt;/code&gt; contains focused knowledge:&lt;/p&gt;

&lt;div class=&quot;language-markdown highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;gh&quot;&gt;# Azure DevOps Pipelines&lt;/span&gt;

&lt;span class=&quot;gu&quot;&gt;## YAML Standards&lt;/span&gt;

All pipelines must:
&lt;span class=&quot;p&quot;&gt;-&lt;/span&gt; Use YAML (no classic pipelines)
&lt;span class=&quot;p&quot;&gt;-&lt;/span&gt; Include &lt;span class=&quot;sb&quot;&gt;`trigger.paths`&lt;/span&gt; for monorepos
&lt;span class=&quot;p&quot;&gt;-&lt;/span&gt; Use named stages for multi-stage deployments

&lt;span class=&quot;gu&quot;&gt;## Monorepo Trigger Pattern&lt;/span&gt;

&lt;span class=&quot;p&quot;&gt;```&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;yaml
&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;trigger&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;branches&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;include&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;main&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;paths&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;include&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;services/api/*&lt;/span&gt;
      &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;shared/common/*&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;```&lt;/span&gt;

&lt;span class=&quot;gu&quot;&gt;## Getting Related Work Items&lt;/span&gt;

Azure DevOps&apos;s built-in feature doesn&apos;t support monorepos. Use:

&lt;span class=&quot;p&quot;&gt;```&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;bash
&lt;/span&gt;pwsh .github/skills/azure-devops/scripts/get-related-work-items.ps1
&lt;span class=&quot;p&quot;&gt;```&lt;/span&gt;

See &lt;span class=&quot;sb&quot;&gt;`./scripts/get-related-work-items.ps1`&lt;/span&gt; for details.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;directory-structure&quot;&gt;Directory Structure&lt;/h3&gt;

&lt;p&gt;Here’s what it looks like (modeled on Anthropic’s pattern):&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;.github/skills/azure-devops/
├── index.md                    # Sub-skills catalog (like Anthropic&apos;s SKILL.md)
├── repos.md                    # Repository sub-skill
├── pipelines.md                # Pipelines sub-skill
├── work-items.md               # Work items sub-skill
├── scripts/                    # Executable automation (like Anthropic)
│   ├── get-related-work-items.ps1
│   ├── create-pr.ps1
│   └── query-work-items.ps1
└── templates/                  # Starting points (like Anthropic)
    ├── pr-template.md
    └── pipeline-template.yml
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Each &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.md&lt;/code&gt; file is 5-15KB. Same pattern Anthropic uses, adapted for explicit catalog navigation.&lt;/p&gt;

&lt;h2 id=&quot;scripts-learning-from-anthropic&quot;&gt;Scripts: Learning from Anthropic&lt;/h2&gt;

&lt;p&gt;Both Anthropic Skills and the catalog pattern support &lt;strong&gt;scripts as executable knowledge&lt;/strong&gt;.&lt;/p&gt;

&lt;h3 id=&quot;anthropics-approach&quot;&gt;Anthropic’s Approach&lt;/h3&gt;

&lt;p&gt;Look at the &lt;a href=&quot;https://github.com/anthropics/skills/tree/main/mcp-builder&quot;&gt;mcp-builder skill&lt;/a&gt;. It includes:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;scripts/create-server.sh&lt;/code&gt; - Bootstrap a new MCP server&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;scripts/test-server.sh&lt;/code&gt; - Validate server implementation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These aren’t documentation about &lt;em&gt;how&lt;/em&gt; to create a server—they’re executable scripts that &lt;em&gt;do it&lt;/em&gt;. Claude can invoke them directly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The philosophy&lt;/strong&gt;: Don’t just describe processes. Provide tested, working automation.&lt;/p&gt;

&lt;h3 id=&quot;catalog-adaptation&quot;&gt;Catalog Adaptation&lt;/h3&gt;

&lt;p&gt;Reference scripts in skill files:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;In &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.github/skills/azure-devops/pipelines.md&lt;/code&gt;&lt;/strong&gt;:&lt;/p&gt;

&lt;div class=&quot;language-markdown highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;gu&quot;&gt;## Getting Related Work Items&lt;/span&gt;

Azure DevOps&apos;s built-in feature doesn&apos;t support monorepos. Use:

&lt;span class=&quot;p&quot;&gt;```&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;bash
&lt;/span&gt;pwsh .github/skills/azure-devops/scripts/get-related-work-items.ps1 &lt;span class=&quot;nt&quot;&gt;-BuildId&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$BUILD_BUILDID&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;```&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Script conventions&lt;/strong&gt;:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;strong&gt;Self-contained&lt;/strong&gt;: Include dependencies&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Documented&lt;/strong&gt;: Header comments&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Tested&lt;/strong&gt;: Production-ready&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Referenced&lt;/strong&gt;: Skill files tell AI when to use them&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Example &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.github/skills/azure-devops/scripts/get-related-work-items.ps1&lt;/code&gt;:&lt;/p&gt;

&lt;div class=&quot;language-powershell highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;cm&quot;&gt;&amp;lt;#
&lt;/span&gt;&lt;span class=&quot;cs&quot;&gt;.SYNOPSIS&lt;/span&gt;&lt;span class=&quot;cm&quot;&gt;
    Retrieves commits and work items for a build pipeline with monorepo support.

&lt;/span&gt;&lt;span class=&quot;cs&quot;&gt;.DESCRIPTION&lt;/span&gt;&lt;span class=&quot;cm&quot;&gt;
    Azure DevOps&apos;s built-in &quot;Related Work Items&quot; feature doesn&apos;t filter by
    pipeline trigger paths in monorepos. This script does.

&lt;/span&gt;&lt;span class=&quot;cs&quot;&gt;.PARAMETER&lt;/span&gt;&lt;span class=&quot;cm&quot;&gt; BuildId
    The ID of the build. Defaults to $ENV:BUILD_BUILDID in Azure Pipelines.

&lt;/span&gt;&lt;span class=&quot;cs&quot;&gt;.PARAMETER&lt;/span&gt;&lt;span class=&quot;cm&quot;&gt; CollectionUri
    Azure DevOps organization URI. Defaults to $ENV:SYSTEM_COLLECTIONURI.

&lt;/span&gt;&lt;span class=&quot;cs&quot;&gt;.EXAMPLE&lt;/span&gt;&lt;span class=&quot;cm&quot;&gt;
    ./get-related-work-items.ps1 -BuildId 12345

&lt;/span&gt;&lt;span class=&quot;cs&quot;&gt;.NOTES&lt;/span&gt;&lt;span class=&quot;cm&quot;&gt;
    Requires the powershell-yaml module for parsing YAML pipeline files.
#&amp;gt;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;

&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;CmdletBinding&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;kr&quot;&gt;param&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Parameter&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$BuildId&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;nn&quot;&gt;ENV&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;BUILD_BUILDID&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;

    &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Parameter&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Uri&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$CollectionUri&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;nn&quot;&gt;ENV&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;SYSTEM_COLLECTIONURI&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;

    &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Parameter&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Guid&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$ProjectId&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;nn&quot;&gt;ENV&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;SYSTEM_TEAMPROJECTID&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;

    &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Parameter&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$AuthorizationHeader&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;Bearer &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;nn&quot;&gt;ENV&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;SYSTEM_ACCESSTOKEN&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;

&lt;/span&gt;&lt;span class=&quot;c&quot;&gt;# (Full implementation omitted for brevity)&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;why-scripts-matter&quot;&gt;Why Scripts Matter&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Traditional&lt;/strong&gt;: AI generates code. Sometimes buggy.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Skills approach&lt;/strong&gt;: AI uses tested scripts. Deterministic results.&lt;/p&gt;

&lt;p&gt;Now, when the AI encounters a monorepo pipeline question, it:&lt;/p&gt;
&lt;ol&gt;
  &lt;li&gt;Loads the pipelines sub-skill&lt;/li&gt;
  &lt;li&gt;Sees the script reference&lt;/li&gt;
  &lt;li&gt;Suggests running the script or shows how to invoke it&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;You get deterministic, tested behavior instead of AI-generated code that might have bugs.&lt;/strong&gt;&lt;/p&gt;

&lt;h2 id=&quot;why-scripts-beat-always-on-tools&quot;&gt;Why Scripts Beat Always-On Tools&lt;/h2&gt;

&lt;p&gt;MCP (Model Context Protocol) servers are powerful but costly—they’re always in context.&lt;/p&gt;

&lt;p&gt;20 MCP servers × 10-50 tools = 200-1000 tool descriptions before you’ve asked anything.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Scripts are opt-in.&lt;/strong&gt; Load only when:&lt;/p&gt;
&lt;ol&gt;
  &lt;li&gt;AI reads the skill file&lt;/li&gt;
  &lt;li&gt;Skill is relevant&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Azure questions? Azure scripts. React questions? React scripts.&lt;/p&gt;

&lt;h3 id=&quot;invoking-mcp-via-scripts&quot;&gt;Invoking MCP via Scripts&lt;/h3&gt;

&lt;p&gt;But what if a vendor ships an MCP server without a CLI? You still want opt-in behavior.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Solution&lt;/strong&gt;: Wrap the MCP server in a lightweight CLI client, then call it from scripts.&lt;/p&gt;

&lt;p&gt;Example: A hypothetical Jira MCP server.&lt;/p&gt;

&lt;p&gt;Create &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.github/skills/jira/scripts/mcp-client.sh&lt;/code&gt;:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;#!/bin/bash&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;# Lightweight MCP client that invokes Jira MCP server tools&lt;/span&gt;

&lt;span class=&quot;nv&quot;&gt;TOOL_NAME&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$1&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;shift
&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;ARGS&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$@&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;

&lt;span class=&quot;c&quot;&gt;# Connect to MCP server and invoke tool&lt;/span&gt;
npx @your-org/mcp-client &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;--server&lt;/span&gt; jira-mcp-server &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;--tool&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$TOOL_NAME&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt; &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;--args&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$ARGS&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Now your Jira skill can reference &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;./scripts/create-issue.sh&lt;/code&gt;:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;#!/bin/bash&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;# Create a Jira issue&lt;/span&gt;

./mcp-client.sh create-issue &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;--project&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;PROJ&quot;&lt;/span&gt; &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;--summary&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$1&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt; &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;--description&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$2&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The MCP server’s capabilities are available, but only when the Jira skill loads and the AI decides to run the script.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You control when capabilities enter the context.&lt;/strong&gt;&lt;/p&gt;

&lt;h2 id=&quot;composing-skills-the-fractal-pattern&quot;&gt;Composing Skills: The Fractal Pattern&lt;/h2&gt;

&lt;p&gt;Nested skills can go deeper. Azure DevOps → Pipelines → Monorepo Triggers → Path Filtering.&lt;/p&gt;

&lt;p&gt;Just add another layer:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;.github/skills/azure-devops/pipelines/
├── index.md                    # Pipelines overview + sub-catalog
├── triggers.md                 # Trigger patterns
├── variables.md                # Variables and parameters
├── templates.md                # Template usage
└── monorepo/
    ├── index.md                # Monorepo-specific guidance
    ├── path-filtering.md       # Path filter patterns
    └── scripts/
        └── get-related-work-items.ps1
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Each level has a catalog. AI navigates general → specific.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Practical limit&lt;/strong&gt;: 3-4 levels.&lt;/p&gt;

&lt;h2 id=&quot;section-conventions&quot;&gt;Section Conventions&lt;/h2&gt;

&lt;p&gt;Within each skill file, use consistent sections:&lt;/p&gt;

&lt;div class=&quot;language-markdown highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;gh&quot;&gt;# [Skill Name]&lt;/span&gt;

&lt;span class=&quot;gu&quot;&gt;## Overview&lt;/span&gt;
What this skill covers

&lt;span class=&quot;gu&quot;&gt;## Standards&lt;/span&gt;
Your organizational rules

&lt;span class=&quot;gu&quot;&gt;## Common Patterns&lt;/span&gt;
Frequently used code/configs

&lt;span class=&quot;gu&quot;&gt;## Scripts&lt;/span&gt;
Executable automation

&lt;span class=&quot;gu&quot;&gt;## Templates&lt;/span&gt;
Starting points

&lt;span class=&quot;gu&quot;&gt;## Troubleshooting&lt;/span&gt;
Known issues and fixes

&lt;span class=&quot;gu&quot;&gt;## References&lt;/span&gt;
External docs, links
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;AI learns this structure, finding information faster.&lt;/p&gt;

&lt;h2 id=&quot;building-a-nested-skill&quot;&gt;Building a Nested Skill&lt;/h2&gt;

&lt;p&gt;Create an Azure DevOps skill:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 1&lt;/strong&gt;: Create the directory structure&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nb&quot;&gt;mkdir&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-p&lt;/span&gt; .github/skills/azure-devops/&lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;scripts,templates&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Step 2&lt;/strong&gt;: Create the index (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.github/skills/azure-devops/index.md&lt;/code&gt;)&lt;/p&gt;

&lt;div class=&quot;language-markdown highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;gh&quot;&gt;# Azure DevOps Skill&lt;/span&gt;

&lt;span class=&quot;gu&quot;&gt;## Sub-Skills&lt;/span&gt;

| Sub-Skill | Description | Path |
|-----------|-------------|------|
| Pipelines | YAML pipelines, triggers, monorepo support | &lt;span class=&quot;sb&quot;&gt;`./pipelines.md`&lt;/span&gt; |

&lt;span class=&quot;gu&quot;&gt;## Scripts&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;
-&lt;/span&gt; &lt;span class=&quot;sb&quot;&gt;`scripts/get-related-work-items.ps1`&lt;/span&gt; - Get work items for a pipeline run
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Create &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;pipelines.md&lt;/code&gt; with standards, examples, script references. Add a tested PowerShell script. Reference in main catalog.&lt;/p&gt;

&lt;h2 id=&quot;key-takeaways&quot;&gt;Key Takeaways&lt;/h2&gt;

&lt;ol&gt;
  &lt;li&gt;Keep main files lean—nest details&lt;/li&gt;
  &lt;li&gt;Provide scripts—executable knowledge&lt;/li&gt;
  &lt;li&gt;Use consistent structures&lt;/li&gt;
  &lt;li&gt;Include templates and examples&lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&quot;scaling-to-100-skills&quot;&gt;Scaling to 100+ Skills&lt;/h2&gt;

&lt;p&gt;With this structure:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;10 domain skills&lt;/strong&gt; (Azure DevOps, AWS, Docker, React, etc.)&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;5-10 sub-skills each&lt;/strong&gt; (50-100 sub-skills total)&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;2-5 scripts per sub-skill&lt;/strong&gt; (100-500 scripts total)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Total catalog overhead: ~10KB (main) + ~50KB (indexes) = 60KB&lt;/p&gt;

&lt;p&gt;Total knowledge base: 5-50MB of detailed docs and scripts&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Megabytes of knowledge through a 60KB index.&lt;/strong&gt;&lt;/p&gt;

&lt;h2 id=&quot;next&quot;&gt;Next&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Part 3&lt;/strong&gt;: Shared skills repository + VS Code workspaces for portable organizational knowledge.&lt;/p&gt;

&lt;p&gt;Start nesting:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Pick one skill&lt;/li&gt;
  &lt;li&gt;Break into 2-3 sub-skills&lt;/li&gt;
  &lt;li&gt;Move one task into a script&lt;/li&gt;
&lt;/ol&gt;

&lt;hr /&gt;

&lt;p&gt;&lt;em&gt;Credit: This series adapts patterns from &lt;a href=&quot;https://www.anthropic.com/news/skills&quot;&gt;Anthropic Skills&lt;/a&gt;. The nested structure and script conventions mirror their &lt;a href=&quot;https://github.com/anthropics/skills&quot;&gt;official examples&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

    &lt;p&gt;&lt;a href=&quot;https://tiberriver256.github.io/ai%20and%20technology/skills-catalog-part-2-building-skills-that-scale/&quot;&gt;Learning from Anthropic: Nested Skills and Scripts&lt;/a&gt; was originally published by Micah Rairdon at &lt;a href=&quot;https://tiberriver256.github.io&quot;&gt;Tiberriver256&lt;/a&gt; on November 02, 2025.&lt;/p&gt;
  </content>
</entry>


<entry>
  <title type="html"><![CDATA[Bringing Anthropic Skills to GitHub Copilot]]></title>
 <link rel="alternate" type="text/html" href="https://tiberriver256.github.io/ai%20and%20technology/skills-catalog-part-1-indexing-ai-context/" />
  <id>https://tiberriver256.github.io/ai%20and%20technology/skills-catalog-part-1-indexing-ai-context</id>
  <updated>2025-11-02T00:00:00-00:00</updated>
  <published>2025-11-02T00:00:00-04:00</published>
  
  <author>
    <name>Micah Rairdon</name>
    <uri>https://tiberriver256.github.io</uri>
    <email>Jun(Real Email: Micah.Rairdon [GMail])k@JunkMail.com</email>
  </author>
  <content type="html">
    &lt;table&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;strong&gt;Part 1 of 3&lt;/strong&gt; in the Skills Catalog series (&lt;a href=&quot;/ai%20and%20technology/skills-catalog-part-2-building-skills-that-scale&quot;&gt;Part 2&lt;/a&gt;&lt;/td&gt;
      &lt;td&gt;&lt;a href=&quot;/ai%20and%20technology/skills-catalog-part-3-organizational-knowledge-at-scale&quot;&gt;Part 3&lt;/a&gt;)&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;Anthropic just announced &lt;a href=&quot;https://www.anthropic.com/news/skills&quot;&gt;Skills&lt;/a&gt;—modular, discoverable knowledge for Claude. Each skill is a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SKILL.md&lt;/code&gt; file with metadata. Claude discovers them through the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;description&lt;/code&gt; field. No central catalog, no manual wiring.&lt;/p&gt;

&lt;p&gt;Can we bring this to GitHub Copilot? Yes—with one key adaptation: &lt;strong&gt;a catalog table&lt;/strong&gt; that replaces Claude’s auto-discovery.&lt;/p&gt;

&lt;h2 id=&quot;what-are-anthropic-skills&quot;&gt;What Are Anthropic Skills?&lt;/h2&gt;

&lt;p&gt;From their &lt;a href=&quot;https://www.anthropic.com/news/skills&quot;&gt;Skills announcement&lt;/a&gt; and &lt;a href=&quot;https://github.com/anthropics/skills&quot;&gt;official repository&lt;/a&gt;:&lt;/p&gt;

&lt;h3 id=&quot;the-structure&quot;&gt;The Structure&lt;/h3&gt;

&lt;p&gt;Each skill is a folder containing a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SKILL.md&lt;/code&gt; file with YAML frontmatter:&lt;/p&gt;

&lt;div class=&quot;language-markdown highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nn&quot;&gt;---&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;description&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;Work&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;with&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;Azure&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;DevOps&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;pipelines,&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;triggers,&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;and&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;YAML&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;configurations&quot;&lt;/span&gt;
&lt;span class=&quot;nn&quot;&gt;---&lt;/span&gt;

&lt;span class=&quot;gh&quot;&gt;# Azure DevOps Pipelines&lt;/span&gt;

Your skill content in markdown...
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;That’s it. The &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;description&lt;/code&gt; field is how Claude discovers what the skill does. The rest is just markdown.&lt;/p&gt;

&lt;h3 id=&quot;how-discovery-works&quot;&gt;How Discovery Works&lt;/h3&gt;

&lt;p&gt;When you work with Claude (in Claude.ai, Claude Code, or via API), it scans available skills and uses the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;description&lt;/code&gt; field to decide which ones are relevant. No central catalog. No manual selection. Just self-describing knowledge packages.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example workflow&lt;/strong&gt;:&lt;/p&gt;
&lt;ol&gt;
  &lt;li&gt;You ask: “How do I set up a monorepo trigger in Azure DevOps?”&lt;/li&gt;
  &lt;li&gt;Claude scans skill descriptions&lt;/li&gt;
  &lt;li&gt;Finds “Work with Azure DevOps pipelines, triggers…” matches&lt;/li&gt;
  &lt;li&gt;Loads that &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SKILL.md&lt;/code&gt; file&lt;/li&gt;
  &lt;li&gt;Uses the knowledge to answer your question&lt;/li&gt;
&lt;/ol&gt;

&lt;h3 id=&quot;the-core-concept&quot;&gt;The Core Concept&lt;/h3&gt;

&lt;p&gt;The &lt;strong&gt;philosophy&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Modular&lt;/strong&gt;: One skill = one domain&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Discoverable&lt;/strong&gt;: Metadata makes skills findable&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;On-demand&lt;/strong&gt;: Load only when relevant&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Self-describing&lt;/strong&gt;: No central registry&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;why-this-concept-transfers&quot;&gt;Why This Concept Transfers&lt;/h2&gt;

&lt;p&gt;The underlying problem Anthropic Skills solve is universal: &lt;strong&gt;how do you give AI access to vast knowledge without overwhelming the context window?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Their answer: &lt;strong&gt;hint, then dive&lt;/strong&gt;.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Skills hint through &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;description&lt;/code&gt; fields&lt;/li&gt;
  &lt;li&gt;Claude dives into relevant skills when needed&lt;/li&gt;
  &lt;li&gt;Irrelevant knowledge stays out of context&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This pattern works regardless of the AI platform. The mechanics might differ, but the concept holds.&lt;/p&gt;

&lt;h2 id=&quot;bringing-it-to-github-copilot&quot;&gt;Bringing It to GitHub Copilot&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;The challenge&lt;/strong&gt;: GitHub Copilot doesn’t auto-discover skills like Claude does.&lt;/p&gt;

&lt;p&gt;Copilot reads files you explicitly include (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.github/copilot-instructions.md&lt;/code&gt;), but doesn’t scan skill folders or match descriptions to questions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The adaptation&lt;/strong&gt;: Replace auto-discovery with a &lt;strong&gt;catalog table&lt;/strong&gt;.&lt;/p&gt;

&lt;h2 id=&quot;the-catalog-pattern&quot;&gt;The Catalog Pattern&lt;/h2&gt;

&lt;p&gt;Create a lightweight index—a table listing skills with descriptions and paths:&lt;/p&gt;

&lt;div class=&quot;language-markdown highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;| Skill Name | Description | Path |
|------------|-------------|------|
| Azure DevOps Pipelines | Work with Azure DevOps YAML pipelines, triggers, variables | &lt;span class=&quot;sb&quot;&gt;`.github/skills/azure-devops-pipelines.md`&lt;/span&gt; |
| PowerShell Standards | Coding standards and common patterns for PowerShell | &lt;span class=&quot;sb&quot;&gt;`.github/skills/powershell-standards.md`&lt;/span&gt; |
| React Component Patterns | Approved component patterns and examples | &lt;span class=&quot;sb&quot;&gt;`.github/skills/react-patterns.md`&lt;/span&gt; |
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This table lives in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.github/copilot-instructions.md&lt;/code&gt; (always loaded).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How it works&lt;/strong&gt;:&lt;/p&gt;
&lt;ol&gt;
  &lt;li&gt;You ask: “Help me set up a monorepo trigger for Azure DevOps”&lt;/li&gt;
  &lt;li&gt;Copilot scans the catalog table (which is always in context)&lt;/li&gt;
  &lt;li&gt;Matches “Azure DevOps Pipelines” description to your question&lt;/li&gt;
  &lt;li&gt;Reads &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.github/skills/azure-devops-pipelines.md&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;Uses that knowledge to answer&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Same outcome—different discovery mechanism.&lt;/p&gt;

&lt;h3 id=&quot;why-the-catalog-works&quot;&gt;Why the Catalog Works&lt;/h3&gt;

&lt;p&gt;The catalog is tiny: 100 skills ≈ 5,000-10,000 tokens.&lt;/p&gt;

&lt;p&gt;Each skill file: 5,000-50,000 tokens. Loading all 100 upfront: 500,000-5,000,000 tokens.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The catalog scales to hundreds of skills while keeping base context lean.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Copilot loads only what it needs. Azure pipelines? Azure skill. React? React patterns.&lt;/p&gt;

&lt;p&gt;Benefits:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Precision&lt;/strong&gt;: Only relevant knowledge loads&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Scale&lt;/strong&gt;: Hundreds of skills supported&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Performance&lt;/strong&gt;: Lean context window&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;implementation&quot;&gt;Implementation&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Step 1&lt;/strong&gt;: Create &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.github/copilot-instructions.md&lt;/code&gt;:&lt;/p&gt;

&lt;div class=&quot;language-markdown highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;gh&quot;&gt;# Skills Catalog&lt;/span&gt;

This repository adapts Anthropic&apos;s Skills concept for GitHub Copilot.

&lt;span class=&quot;gu&quot;&gt;## Available Skills&lt;/span&gt;

| Skill Name | Description | Path |
|------------|-------------|------|
| Azure DevOps Pipelines | Work with Azure DevOps YAML pipelines, triggers, variables | &lt;span class=&quot;sb&quot;&gt;`.github/skills/azure-devops-pipelines.md`&lt;/span&gt; |
| PowerShell Standards | Coding standards and common patterns for PowerShell | &lt;span class=&quot;sb&quot;&gt;`.github/skills/powershell-standards.md`&lt;/span&gt; |

&lt;span class=&quot;gu&quot;&gt;## How to Use Skills&lt;/span&gt;

When you encounter a task related to a skill:
&lt;span class=&quot;p&quot;&gt;1.&lt;/span&gt; Read the skill file at the listed path
&lt;span class=&quot;p&quot;&gt;2.&lt;/span&gt; Follow any guidance, standards, or templates provided
&lt;span class=&quot;p&quot;&gt;3.&lt;/span&gt; Use any scripts referenced in the skill file
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Step 2&lt;/strong&gt;: Create a skill file at &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.github/skills/azure-devops-pipelines.md&lt;/code&gt;:&lt;/p&gt;

&lt;div class=&quot;language-markdown highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;gh&quot;&gt;# Azure DevOps Pipelines Skill&lt;/span&gt;

&lt;span class=&quot;gu&quot;&gt;## Overview&lt;/span&gt;
Standards and patterns for Azure DevOps YAML pipelines.

&lt;span class=&quot;gu&quot;&gt;## Monorepo Trigger Pattern&lt;/span&gt;

For monorepos, filter triggers by path:

&lt;span class=&quot;p&quot;&gt;```&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;yaml
&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;trigger&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;branches&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;include&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;main&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;paths&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;include&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;services/api/*&lt;/span&gt;
      &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;shared/common/*&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;standards&quot;&gt;Standards&lt;/h2&gt;
&lt;ul&gt;
  &lt;li&gt;Use YAML (no classic pipelines)&lt;/li&gt;
  &lt;li&gt;Include &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;trigger.paths&lt;/code&gt; for monorepos&lt;/li&gt;
  &lt;li&gt;Use named stages for multi-stage deployments
```&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Done.&lt;/p&gt;

&lt;h2 id=&quot;what-goes-in-a-skill-file&quot;&gt;What Goes in a Skill File?&lt;/h2&gt;

&lt;p&gt;Like Anthropic’s &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;SKILL.md&lt;/code&gt; format, keep each skill focused on one domain:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;strong&gt;Overview&lt;/strong&gt;: What this skill covers&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Key concepts&lt;/strong&gt;: Core knowledge&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Standards&lt;/strong&gt;: Your organizational conventions&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Examples&lt;/strong&gt;: Code samples, templates&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Scripts&lt;/strong&gt;: Paths to executable automation (more on this in Part 2)&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;References&lt;/strong&gt;: Links to external docs&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If a skill grows beyond 10-20KB, break it into sub-skills (covered in Part 2).&lt;/p&gt;

&lt;h2 id=&quot;github-copilot-enhancements&quot;&gt;GitHub Copilot Enhancements&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Path-specific instructions&lt;/strong&gt; in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.github/instructions/&lt;/code&gt;:&lt;/p&gt;

&lt;div class=&quot;language-markdown highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nn&quot;&gt;---&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;applyTo&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;src/api/**&quot;&lt;/span&gt;
&lt;span class=&quot;nn&quot;&gt;---&lt;/span&gt;

When working with files in src/api/:
&lt;span class=&quot;p&quot;&gt;-&lt;/span&gt; All API endpoints must include OpenAPI documentation
&lt;span class=&quot;p&quot;&gt;-&lt;/span&gt; See &lt;span class=&quot;sb&quot;&gt;`.github/skills/api-patterns.md`&lt;/span&gt; for approved patterns
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This builds layers:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Repository-wide&lt;/strong&gt;: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.github/copilot-instructions.md&lt;/code&gt; with the skills catalog&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Path-specific&lt;/strong&gt;: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.github/instructions/*.instructions.md&lt;/code&gt; for targeted guidance&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Skill files&lt;/strong&gt;: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.github/skills/*.md&lt;/code&gt; for detailed domain knowledge&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;why-this-works&quot;&gt;Why This Works&lt;/h2&gt;

&lt;p&gt;Anthropic Skills separate &lt;strong&gt;discovery&lt;/strong&gt; (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;description&lt;/code&gt; field) from &lt;strong&gt;content&lt;/strong&gt; (markdown).&lt;/p&gt;

&lt;p&gt;The catalog does the same:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Discovery&lt;/strong&gt;: Catalog table (always in context)&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Content&lt;/strong&gt;: Skill files (loaded on demand)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Same benefits:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Modular knowledge packages&lt;/li&gt;
  &lt;li&gt;On-demand loading&lt;/li&gt;
  &lt;li&gt;Scales to hundreds of skills&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;real-world-impact&quot;&gt;Real-World Impact&lt;/h2&gt;

&lt;p&gt;This pattern enables:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;50+ organizational skills&lt;/li&gt;
  &lt;li&gt;80%+ reduction in context bloat&lt;/li&gt;
  &lt;li&gt;Team knowledge discovery&lt;/li&gt;
  &lt;li&gt;Portable knowledge bases&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;next-steps&quot;&gt;Next Steps&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Part 2&lt;/strong&gt;: How Anthropic structures complex skills (like &lt;a href=&quot;https://github.com/anthropics/skills/tree/main/mcp-builder&quot;&gt;mcp-builder&lt;/a&gt;) and adapting nested patterns.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Part 3&lt;/strong&gt;: Distributing skills across your organization using VS Code workspaces.&lt;/p&gt;

&lt;p&gt;Start simple:&lt;/p&gt;
&lt;ol&gt;
  &lt;li&gt;Create &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.github/copilot-instructions.md&lt;/code&gt; with a skills catalog&lt;/li&gt;
  &lt;li&gt;Add 2-3 skills&lt;/li&gt;
  &lt;li&gt;Create one skill file with your conventions&lt;/li&gt;
&lt;/ol&gt;

&lt;hr /&gt;

&lt;p&gt;&lt;em&gt;Credit: This series adapts concepts from &lt;a href=&quot;https://www.anthropic.com/news/skills&quot;&gt;Anthropic Skills&lt;/a&gt;. The catalog pattern is the GitHub Copilot implementation of their discovery mechanism.&lt;/em&gt;&lt;/p&gt;

    &lt;p&gt;&lt;a href=&quot;https://tiberriver256.github.io/ai%20and%20technology/skills-catalog-part-1-indexing-ai-context/&quot;&gt;Bringing Anthropic Skills to GitHub Copilot&lt;/a&gt; was originally published by Micah Rairdon at &lt;a href=&quot;https://tiberriver256.github.io&quot;&gt;Tiberriver256&lt;/a&gt; on November 02, 2025.&lt;/p&gt;
  </content>
</entry>


<entry>
  <title type="html"><![CDATA[Why Use AI CLIs When GUIs Exist?]]></title>
 <link rel="alternate" type="text/html" href="https://tiberriver256.github.io/ai%20and%20technology/why-use-ai-clis-when-guis-exist/" />
  <id>https://tiberriver256.github.io/ai%20and%20technology/why-use-ai-clis-when-guis-exist</id>
  <updated>2025-10-19T00:00:00-00:00</updated>
  <published>2025-10-19T00:00:00-04:00</published>
  
  <author>
    <name>Micah Rairdon</name>
    <uri>https://tiberriver256.github.io</uri>
    <email>Jun(Real Email: Micah.Rairdon [GMail])k@JunkMail.com</email>
  </author>
  <content type="html">
    &lt;p&gt;People keep asking me why they’d ever use an AI command-line tool when the GUI works fine. The answer: CLIs let you mix deterministic scripting with non-deterministic AI judgment calls.&lt;/p&gt;

&lt;p&gt;Pure AI is hard to steer. Pure scripting breaks on edge cases. CLI tools blend both.&lt;/p&gt;

&lt;h2 id=&quot;the-difference-in-action&quot;&gt;The Difference in Action&lt;/h2&gt;

&lt;p&gt;Here’s the example I show:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;copilot &lt;span class=&quot;nt&quot;&gt;-p&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;Write me three reports on Bob, Dave, and Larry&quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;versus&lt;/p&gt;

&lt;div class=&quot;language-powershell highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;s2&quot;&gt;&quot;Bob&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;Dave&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;Larry&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;kr&quot;&gt;foreach&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;copilot&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;-p&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;Write me a report on &lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;$_&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The first is an AI call that might handle all three names or might not. The second is three separate calls with a guaranteed structure. You control the iteration. The AI handles the content.&lt;/p&gt;

&lt;h2 id=&quot;why-guis-cant-compose-like-this&quot;&gt;Why GUIs Can’t Compose Like This&lt;/h2&gt;

&lt;p&gt;GUIs excel at one-off tasks and visual feedback. But they can’t compose operations the way CLI tools can. You can’t pipe a GUI through a loop. You can’t redirect its output to another tool. You can’t script around it when you need deterministic control flow with non-deterministic content generation.&lt;/p&gt;

&lt;p&gt;The command line gives you programmable interfaces to AI. That’s the difference.&lt;/p&gt;

    &lt;p&gt;&lt;a href=&quot;https://tiberriver256.github.io/ai%20and%20technology/why-use-ai-clis-when-guis-exist/&quot;&gt;Why Use AI CLIs When GUIs Exist?&lt;/a&gt; was originally published by Micah Rairdon at &lt;a href=&quot;https://tiberriver256.github.io&quot;&gt;Tiberriver256&lt;/a&gt; on October 19, 2025.&lt;/p&gt;
  </content>
</entry>


<entry>
  <title type="html"><![CDATA[VC-Funded AI Coming to a Close]]></title>
 <link rel="alternate" type="text/html" href="https://tiberriver256.github.io/ai%20and%20technology/vc-funded-ai-coming-to-a-close/" />
  <id>https://tiberriver256.github.io/ai%20and%20technology/vc-funded-ai-coming-to-a-close</id>
  <updated>2025-07-05T00:00:00-00:00</updated>
  <published>2025-07-05T00:00:00-04:00</published>
  
  <author>
    <name>Micah Rairdon</name>
    <uri>https://tiberriver256.github.io</uri>
    <email>Jun(Real Email: Micah.Rairdon [GMail])k@JunkMail.com</email>
  </author>
  <content type="html">
    &lt;p&gt;The era of artificially cheap AI tools is ending, and Cursor’s recent pricing changes are just the beginning.&lt;/p&gt;

&lt;p&gt;For over two years, venture capital has subsidized AI tools, keeping prices below true costs while companies built market share. The Cursor team’s recent &lt;a href=&quot;https://cursor.com/en/blog/june-2025-pricing&quot;&gt;pricing model overhaul&lt;/a&gt; signals this honeymoon period is ending.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What changed at Cursor:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Previous: Unlimited usage with throttling after 500 requests&lt;/li&gt;
  &lt;li&gt;New: $20 API credits plus pay-per-use for premium models&lt;/li&gt;
  &lt;li&gt;Result: Many users faced unexpected bills when the rarely-used ‘auto’ mode became default&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;GitHub Copilot followed suit immediately:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://docs.github.com/en/copilot/managing-copilot/monitoring-usage-and-entitlements/about-premium-requests&quot;&gt;Premium request billing started June 18, 2025&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Previous: “Unlimited” Copilot Pro subscription&lt;/li&gt;
  &lt;li&gt;New: 300 premium request monthly cap + $0.04 per overage request&lt;/li&gt;
  &lt;li&gt;Premium requests include Claude Sonnet, Agent mode, and advanced features&lt;/li&gt;
  &lt;li&gt;Result: Users discovering that some interactions count as 50+ requests each&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;While both companies deserve credit for handling customer concerns, this represents a coordinated industry shift toward sustainable pricing. The question isn’t whether other AI tools will follow suit—it’s when.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Understanding the Layers&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Before diving into contingency plans, let’s clarify two key concepts:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Application Layer&lt;/strong&gt;: The UI and tools you interact with directly (ChatGPT.com, GitHub Copilot, Claude, Cursor)&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;API Layer&lt;/strong&gt;: The underlying AI models themselves (GPT-4, Claude Sonnet, Gemini Pro)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Most current subsidies exist at the application layer, where companies absorb API costs to build user bases.&lt;/p&gt;

&lt;h2 id=&quot;what-does-this-mean-for-us&quot;&gt;What does this mean for us?&lt;/h2&gt;

&lt;p&gt;Developer Mario Zechner &lt;a href=&quot;https://x.com/badlogicgames/status/1941509998758310156&quot;&gt;captured this moment perfectly&lt;/a&gt;:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_800,q_auto,f_auto/https://tiberriver256.github.io/images/vc-funded-ai-coming-to-a-close/mario-zechner-tweet.png&quot; srcset=&quot;         https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_320,q_auto,f_auto/https://tiberriver256.github.io/images/vc-funded-ai-coming-to-a-close/mario-zechner-tweet.png 320w,         https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_640,q_auto,f_auto/https://tiberriver256.github.io/images/vc-funded-ai-coming-to-a-close/mario-zechner-tweet.png 640w,         https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_960,q_auto,f_auto/https://tiberriver256.github.io/images/vc-funded-ai-coming-to-a-close/mario-zechner-tweet.png 960w,         https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_1280,q_auto,f_auto/https://tiberriver256.github.io/images/vc-funded-ai-coming-to-a-close/mario-zechner-tweet.png 1280w,         https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_1600,q_auto,f_auto/https://tiberriver256.github.io/images/vc-funded-ai-coming-to-a-close/mario-zechner-tweet.png 1600w     &quot; sizes=&quot;(min-width: 50rem) 50rem, 90vw&quot; alt=&quot;We are in a VC funded free lunch phase. Have contingency plans.&quot; loading=&quot;lazy&quot; /&gt;&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;We are in a VC funded free lunch phase. Have contingency plans.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;So what should those contingency plans look like?&lt;/p&gt;

&lt;h2 id=&quot;plan-1-maximize-current-value&quot;&gt;Plan 1: Maximize Current Value&lt;/h2&gt;

&lt;p&gt;Extract more value from existing AI investments before prices rise. If you can boost productivity from $100/month per person to $300/month per person, you can absorb price increases from $20 to $200 monthly while maintaining ROI.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Concrete steps:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Train your team on advanced prompting techniques&lt;/li&gt;
  &lt;li&gt;Integrate AI tools into more workflows beyond coding (documentation, testing, architecture)&lt;/li&gt;
  &lt;li&gt;Automate repetitive tasks that previously required manual work&lt;/li&gt;
  &lt;li&gt;Measure and document productivity gains to justify higher costs to leadership&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;plan-2-transition-to-local-llms-and-open-source-tools&quot;&gt;Plan 2: Transition to Local LLMs and Open Source Tools&lt;/h2&gt;

&lt;p&gt;Replace cloud-based AI with self-hosted alternatives to control costs long-term.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Application Layer Replacements:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Replace ChatGPT with &lt;a href=&quot;https://jan.ai/&quot;&gt;Jan.ai&lt;/a&gt; for general AI assistance&lt;/li&gt;
  &lt;li&gt;Replace GitHub Copilot/Cursor with &lt;a href=&quot;https://github.com/cline/cline&quot;&gt;Cline&lt;/a&gt; for coding assistance&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;API Layer Options:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Host models locally using &lt;a href=&quot;https://ollama.ai/&quot;&gt;Ollama&lt;/a&gt; for easier deployment&lt;/li&gt;
  &lt;li&gt;Use cloud services like Devstral by Mistral for managed local-style pricing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Cost Reality Check:&lt;/strong&gt; You’ll pay for hardware or cloud GPU time, but this may be cheaper long-term than premium SaaS pricing. Start experimenting now to understand your true costs and performance trade-offs.&lt;/p&gt;

&lt;h2 id=&quot;plan-3-build-vendor-agnostic-infrastructure&quot;&gt;Plan 3: Build Vendor-Agnostic Infrastructure&lt;/h2&gt;

&lt;p&gt;Create internal systems that can switch between AI providers (OpenAI, Anthropic, Google) without disrupting your team’s workflow.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why this matters:&lt;/strong&gt; Current subsidies exist primarily at the application layer. Moving to API-level integration means paying full rates today, but gaining crucial flexibility for tomorrow.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The strategic payoff:&lt;/strong&gt; When Google achieves dramatically cheaper inference, or when new providers emerge with better pricing, you can pivot instantly. Your team keeps using familiar tools while you swap the underlying AI provider seamlessly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Implementation approach:&lt;/strong&gt; Build or adopt tools that abstract the AI provider, allowing seamless switching between OpenAI, Anthropic, and others. Tools like &lt;a href=&quot;https://jan.ai/&quot;&gt;Jan.ai&lt;/a&gt; or &lt;a href=&quot;https://github.com/cline/cline&quot;&gt;Cline&lt;/a&gt; can be configured to work with multiple API endpoints.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Change management advantage:&lt;/strong&gt; Instead of asking your team to switch from ChatGPT to Claude (major workflow disruption), you change the backend while preserving their familiar interface.&lt;/p&gt;

&lt;h2 id=&quot;the-bottom-line&quot;&gt;The Bottom Line&lt;/h2&gt;

&lt;p&gt;The VC-subsidized AI era won’t last forever. Whether through maximizing current value, transitioning to local solutions, or building vendor-agnostic infrastructure, the key is preparing now while costs remain manageable.&lt;/p&gt;

&lt;p&gt;Choose your approach based on your organization’s size, technical capabilities, and risk tolerance. But choose soon—the free lunch is ending, and the prepared will have a significant advantage over those caught off-guard.&lt;/p&gt;

&lt;p&gt;Start experimenting with these approaches today, so you’re ready when the next pricing surprise hits.&lt;/p&gt;

    &lt;p&gt;&lt;a href=&quot;https://tiberriver256.github.io/ai%20and%20technology/vc-funded-ai-coming-to-a-close/&quot;&gt;VC-Funded AI Coming to a Close&lt;/a&gt; was originally published by Micah Rairdon at &lt;a href=&quot;https://tiberriver256.github.io&quot;&gt;Tiberriver256&lt;/a&gt; on July 05, 2025.&lt;/p&gt;
  </content>
</entry>


<entry>
  <title type="html"><![CDATA[Taming Your Copilot: A Practical Guide to Precision AI in VS Code]]></title>
 <link rel="alternate" type="text/html" href="https://tiberriver256.github.io/developer%20productivity/artificial%20intelligence/vs%20code/software%20engineering/taming-your-copilot-precision-ai-vscode/" />
  <id>https://tiberriver256.github.io/developer%20productivity/artificial%20intelligence/vs%20code/software%20engineering/taming-your-copilot-precision-ai-vscode</id>
  <updated>2025-07-04T00:00:00-00:00</updated>
  <published>2025-07-04T00:00:00-04:00</published>
  
  <author>
    <name>Micah Rairdon</name>
    <uri>https://tiberriver256.github.io</uri>
    <email>Jun(Real Email: Micah.Rairdon [GMail])k@JunkMail.com</email>
  </author>
  <content type="html">
    &lt;blockquote&gt;
  &lt;h2 id=&quot;guest-post-authored-by-jules-based-on-an-audio-transcript-of-micah-yammering-to-himself-about-this-topic&quot;&gt;Guest post authored by &lt;a href=&quot;https://jules.google.com&quot;&gt;Jules&lt;/a&gt;. Based on an audio transcript of Micah yammering to himself about this topic.&lt;/h2&gt;
&lt;/blockquote&gt;

&lt;p&gt;GitHub Copilot. It’s in your VS Code, whispering sweet code suggestions. Sometimes it’s a mind-reading marvel. Other times? It’s like trying to explain astrophysics to a Golden Retriever – well-intentioned, but ultimately… fuzzy. The truth is, Copilot’s raw power, like any sophisticated tool, needs direction. Your direction.&lt;/p&gt;

&lt;p&gt;Want to transform Copilot from an occasionally helpful wildcard into a disciplined, context-aware teammate that consistently nails your engineering playbook? Of course you do. That’s why you’re here. This isn’t about arcane “prompt engineering” rituals; it’s about leveraging three specific, built-in VS Code features with a simple, potent framework called RICCE. Get this right, and you’ll spend less time wrestling with AI output and more time shipping brilliant code.&lt;/p&gt;

&lt;h2 id=&quot;ricce-your-ais-missing-instruction-manual&quot;&gt;RICCE: Your AI’s Missing Instruction Manual&lt;/h2&gt;

&lt;p&gt;Think of RICCE – &lt;strong&gt;R&lt;/strong&gt;ole, &lt;strong&gt;I&lt;/strong&gt;nstructions, &lt;strong&gt;C&lt;/strong&gt;ontext, &lt;strong&gt;C&lt;/strong&gt;onstraints, &lt;strong&gt;E&lt;/strong&gt;xamples – as the essential checklist your AI wishes it came with. Ignore it, and you’re gambling. Master it, and you’re conducting an orchestra.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Role:&lt;/strong&gt; Who is Copilot for this task? A battle-hardened “Senior Security Engineer,” a “UX-focused Frontend Developer,” a “Clear Technical Writer”? Defining a Role primes Copilot with the right domain knowledge and even jargon. &lt;em&gt;Know who you’re talking to, and who’s talking.&lt;/em&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Instructions (Plural, mind you):&lt;/strong&gt; What, precisely, must Copilot &lt;em&gt;do&lt;/em&gt;? Break it down. Use crisp, active-voice commands. Think bullet points, not rambling paragraphs. &lt;em&gt;Omit needless words!&lt;/em&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Context:&lt;/strong&gt; What information does Copilot &lt;em&gt;absolutely need&lt;/em&gt; to nail this? Your target audience, specific business rules, relevant code snippets from &lt;em&gt;your&lt;/em&gt; project. No more, no less. Filler here is like static on the line – it just garbles the signal.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Constraints:&lt;/strong&gt; What are the non-negotiable boundaries? Output format (Markdown, JSON, a sonnet?), length (“under 500 words, or I walk”), tone (“formal, like a legal brief,” or “breezy, like we’re at a barbecue”). These are your guardrails.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Examples (The Secret Sauce):&lt;/strong&gt; This, dear reader, is where the magic happens. &lt;em&gt;Show, don’t just tell.&lt;/em&gt; One or two well-crafted examples of your desired output style, format, or logic can slash “hallucinations” and align Copilot with your brainwaves faster than any abstract instruction. &lt;em&gt;If your prompt feels complete without an example, you probably haven’t been specific enough.&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;vs-codes-customization-trio-your-ricce-toolkit&quot;&gt;VS Code’s Customization Trio: Your RICCE Toolkit&lt;/h2&gt;

&lt;p&gt;VS Code, bless its extensible heart, gives you three specific levers to implement RICCE. These aren’t buried in some config swamp; they’re designed to be version-controlled files, living right alongside your code in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.github/instructions/&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.github/prompts/&lt;/code&gt;, and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.github/chatmodes/&lt;/code&gt;. Treat them like code. Because they &lt;em&gt;are&lt;/em&gt; code – code for conversing with your AI.&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;strong&gt;Custom Instructions (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;*.instructions.md&lt;/code&gt;):&lt;/strong&gt; Think of these as your project’s Ten Commandments for Copilot. Reusable, often file-specific rules (“Always use &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;pathlib&lt;/code&gt; for Python paths, you heathen!”) that Copilot silently applies.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Prompt Files (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;*.prompt.md&lt;/code&gt; - still a bit experimental, but promising!):&lt;/strong&gt; Named, pre-baked recipes for common tasks. Want to run a “Security Review Checklist” or “Generate API Docs”? Trigger it with a slash command.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Custom Chat Modes (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;*.chatmode.md&lt;/code&gt;):&lt;/strong&gt; These are Copilot personas on demand. A “Planning Mode” that can only read code and suggest outlines? A “Refactoring Mode” with specific refactoring tools enabled? Yes, please.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&quot;weaving-ricce-into-vs-code-practical-magic&quot;&gt;Weaving RICCE into VS Code: Practical Magic&lt;/h2&gt;

&lt;p&gt;Let’s connect the dots. How do these VS Code features bring RICCE to life?&lt;/p&gt;

&lt;h3 id=&quot;constraints-your-digital-rulebook-via-instructionsmd&quot;&gt;Constraints: Your Digital Rulebook via &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;*.instructions.md&lt;/code&gt;&lt;/h3&gt;

&lt;p&gt;This is where you lay down the law. &lt;strong&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;*.instructions.md&lt;/code&gt; files are the primary home for RICCE’s Constraints.&lt;/strong&gt; They are your always-on style guides, your coding standard enforcers.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;How it works:&lt;/strong&gt; Use simple Markdown with optional YAML front-matter. The &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;applyTo: &quot;**/*.ts&quot;&lt;/code&gt; directive, for instance, scopes your rules to TypeScript files. Below this, list your non-negotiables as clear, declarative bullets.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Example (Constraint &amp;amp; Embedded Example):&lt;/strong&gt;
```yaml
—
applyTo: “&lt;em&gt;*/&lt;/em&gt;.py”
—
    &lt;ul&gt;
      &lt;li&gt;Employ &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;pathlib.Path&lt;/code&gt; for all filesystem path operations. (Show, don’t tell: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;from pathlib import Path; config_file = Path(&quot;/etc/app/config.ini&quot;)&lt;/code&gt;)&lt;/li&gt;
      &lt;li&gt;All public functions must include type hints.
```
Copilot sees this and, ideally, stops suggesting &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;os.path&lt;/code&gt; like it’s 1999. &lt;em&gt;Clarity itself.&lt;/em&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;roles-crafting-copilot-personas-with-chatmodemd&quot;&gt;Roles: Crafting Copilot Personas with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;*.chatmode.md&lt;/code&gt;&lt;/h3&gt;

&lt;p&gt;Want Copilot to think like a specific kind of expert? &lt;strong&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;*.chatmode.md&lt;/code&gt; files embody RICCE’s Role.&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;How it works:&lt;/strong&gt; YAML front-matter defines the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;description&lt;/code&gt; (what shows up in VS Code), &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;tools&lt;/code&gt; Copilot can use (e.g., &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;githubRepo&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;codeSearch&lt;/code&gt;), and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;allowedFolders&lt;/code&gt; (a crucial Context Constraint, keeping Copilot focused). The Markdown body is a system prompt – here, you define the persona, its goals, and often a step-by-step workflow (initial Instructions).&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Example (Role, Workflow Instructions, Tone Constraint, Embedded Example):&lt;/strong&gt;
    &lt;div class=&quot;language-yaml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nn&quot;&gt;---&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;description&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;The&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;Devil&apos;s&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;Advocate:&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;Stress-tests&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;technical&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;plans.&quot;&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;tools&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;pi&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;codeSearch&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;# Can read, can&apos;t write. Perfect.&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;allowedFolders&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;pi&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;docs/rfc&quot;&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;specs&quot;&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;nn&quot;&gt;---&lt;/span&gt;
&lt;span class=&quot;c1&quot;&gt;# ROLE&lt;/span&gt;
&lt;span class=&quot;s&quot;&gt;You are the Devil&apos;s Advocate. Your sole purpose is to find flaws in technical proposals, not to be nice. Be direct, be skeptical.&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;## WORKFLOW&lt;/span&gt;
&lt;span class=&quot;s&quot;&gt;1.  Summarize the core proposal (max 2 sentences).&lt;/span&gt;
&lt;span class=&quot;s&quot;&gt;2.  Identify three potential failure modes or overlooked edge cases.&lt;/span&gt;
&lt;span class=&quot;s&quot;&gt;3.  For each, ask a sharp &quot;What if...&quot; question. (Example&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;What&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;the&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;primary&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;database&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;becomes&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;unavailable&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;during&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;the&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;migration?&quot;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
    &lt;p&gt;&lt;em&gt;This mode has personality. It’s bold.&lt;/em&gt;&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;instructions--tasks-reusable-playbooks-with-promptmd&quot;&gt;Instructions &amp;amp; Tasks: Reusable Playbooks with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;*.prompt.md&lt;/code&gt;&lt;/h3&gt;

&lt;p&gt;For those multi-step coding recipes you use all the time, &lt;strong&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;*.prompt.md&lt;/code&gt; files are your RICCE Instructions powerhouse.&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;How it works:&lt;/strong&gt; YAML sets the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;mode&lt;/code&gt; (e.g., &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;agent&lt;/code&gt; for complex tasks), &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;tools&lt;/code&gt;, and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;description&lt;/code&gt;. The Markdown body details the step-by-step instructions. These can use variables like &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;${workspaceFolder}&lt;/code&gt; or &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;${selection}&lt;/code&gt; (Context!) and even include other prompt files.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Example (Full RICCE in one prompt file):&lt;/strong&gt;
    &lt;div class=&quot;language-yaml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nn&quot;&gt;---&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;mode&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;agent&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;tools&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;pi&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;codebase&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;terminal&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;description&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;Scaffold&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;new&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;React&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;component&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;with&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;tests&quot;&lt;/span&gt;
&lt;span class=&quot;nn&quot;&gt;---&lt;/span&gt;
&lt;span class=&quot;c1&quot;&gt;# ROLE&lt;/span&gt;
&lt;span class=&quot;s&quot;&gt;Act as a senior frontend developer following our team&apos;s conventions.&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;# INSTRUCTIONS&lt;/span&gt;
&lt;span class=&quot;s&quot;&gt;1. Ask the user for the component name (e.g., `UserProfileCard`).&lt;/span&gt;
&lt;span class=&quot;s&quot;&gt;2. Create a new folder named `${selection}` in `src/components/`.&lt;/span&gt;
&lt;span class=&quot;s&quot;&gt;3. Inside this folder, generate&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;A functional React component file (`${selection}.tsx`) using TypeScript.&lt;/span&gt;
        &lt;span class=&quot;s&quot;&gt;- It should accept `title` (string) and `userData` (object) as props.&lt;/span&gt;
        &lt;span class=&quot;s&quot;&gt;- (Example structure&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;interface Props { title&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;string; userData&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;object; } const ${selection}&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;React.FC&amp;lt;Props&amp;gt; = ({ title, userData }) =&amp;gt; { ... }; export default ${selection};`)&lt;/span&gt;
    &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;A basic Storybook file (`${selection}.stories.tsx`).&lt;/span&gt;
    &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;A `pytest`-style test file (`${selection}.test.tsx`) with a simple render test.&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;4. Adhere to our ESLint rules (Context&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;assume project ESLint config).&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;5. Constraint&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;All generated files must include a standard license header.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
    &lt;p&gt;&lt;em&gt;This prompt doesn’t just ask; it specifies. It tells a small story of creation.&lt;/em&gt;&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;context-its-all-around-you-if-you-point-it-out&quot;&gt;Context: It’s All Around You (If You Point it Out)&lt;/h3&gt;

&lt;p&gt;Copilot isn’t clairvoyant. You provide &lt;strong&gt;Context&lt;/strong&gt; by:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Scoping:&lt;/strong&gt; &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;allowedFolders&lt;/code&gt; in chat modes.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Injecting:&lt;/strong&gt; Variables in prompt files.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Opening Files:&lt;/strong&gt; Copilot &lt;em&gt;sees&lt;/em&gt; what you see in your active editor tabs. Use this.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Pasting:&lt;/strong&gt; Directly share error messages, logs, or key code snippets in chat. &lt;em&gt;Sometimes the most direct route is indeed the scenic one, if “scenic” means “copy-paste.”&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;examples-the-linchpin-woven-throughout&quot;&gt;Examples: The Linchpin, Woven Throughout&lt;/h3&gt;

&lt;p&gt;Remember, &lt;strong&gt;Examples&lt;/strong&gt; aren’t a separate VS Code feature; they are a &lt;em&gt;principle you apply within all other features&lt;/em&gt;. Embed them in your &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;*.instructions.md&lt;/code&gt; to clarify rules, in your &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;*.prompt.md&lt;/code&gt; to show desired output, and in your &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;*.chatmode.md&lt;/code&gt; system prompts to define interaction styles.&lt;/p&gt;

&lt;h2 id=&quot;the-payoff-from-chatty-wildcard-to-disciplined-teammate&quot;&gt;The Payoff: From Chatty Wildcard to Disciplined Teammate&lt;/h2&gt;

&lt;p&gt;Why bother with all this? Because by treating your Copilot configurations – your instructions, your prompts, your modes – as first-class, version-controlled artifacts, and by structuring them with RICCE, you change the game.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Precision Skyrockets:&lt;/strong&gt; Copilot makes fewer bizarre detours.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Consistency Reigns:&lt;/strong&gt; Outputs align with your standards, not its whims.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Efficiency Soars:&lt;/strong&gt; Less time correcting, more time creating. &lt;em&gt;Don’t make the customer do the work.&lt;/em&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Onboarding Smoothed:&lt;/strong&gt; New team members (and your future self) get a Copilot already trained in “the way things are done here.”&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This isn’t about stifling AI creativity. It’s about channeling it. It’s about moving from hoping for good output to &lt;em&gt;engineering&lt;/em&gt; it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Your Turn:&lt;/strong&gt;
Pick one common task. Try building a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;*.prompt.md&lt;/code&gt; for it. Define some &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;*.instructions.md&lt;/code&gt; for the relevant file types. Maybe even craft a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;*.chatmode.md&lt;/code&gt; for the mindset you need.
Treat these files like code. Iterate. Refine.
Adopt this habit, and Copilot will stop feeling like a clever party trick and start acting like the profoundly capable (and disciplined) teammate you always wanted.
—&lt;/p&gt;

    &lt;p&gt;&lt;a href=&quot;https://tiberriver256.github.io/developer%20productivity/artificial%20intelligence/vs%20code/software%20engineering/taming-your-copilot-precision-ai-vscode/&quot;&gt;Taming Your Copilot: A Practical Guide to Precision AI in VS Code&lt;/a&gt; was originally published by Micah Rairdon at &lt;a href=&quot;https://tiberriver256.github.io&quot;&gt;Tiberriver256&lt;/a&gt; on July 04, 2025.&lt;/p&gt;
  </content>
</entry>


<entry>
  <title type="html"><![CDATA[ChatGPT needs some humility]]></title>
 <link rel="alternate" type="text/html" href="https://tiberriver256.github.io/ai%20and%20technology/chatgpt-needs-some-humility/" />
  <id>https://tiberriver256.github.io/ai%20and%20technology/chatgpt-needs-some-humility</id>
  <updated>2025-06-22T00:00:00-00:00</updated>
  <published>2025-06-22T00:00:00-04:00</published>
  
  <author>
    <name>Micah Rairdon</name>
    <uri>https://tiberriver256.github.io</uri>
    <email>Jun(Real Email: Micah.Rairdon [GMail])k@JunkMail.com</email>
  </author>
  <content type="html">
    &lt;p&gt;It’s hot today in Michigan. High temps. High humidity.&lt;/p&gt;

&lt;p&gt;We turned down the thermostat a little bit, the AC kicked on, stayed on and
didn’t really seem to be able to move the internal temperature. Several hours
later I was curious…&lt;/p&gt;

&lt;p&gt;So… I opened up my Beestat app and gave ChatGPT a screenshot of the system
graph and asked it to calculate my degrees per hour.&lt;/p&gt;

&lt;p&gt;It spun for about 4 minutes, running Python code, all kinds of stuff. Then it
spit out some number confidently that I knew felt wrong. At the end it noted
“Hey.. if you want some more accurate numbers, export the CSV of today’s data
from ecobee’s website.”&lt;/p&gt;

&lt;p&gt;I uploaded the CSV and it was able to determine the correct trendline very
easily. What I would have liked is an original response to my image of “The
image doesn’t give me enough data to do an accurate calculation. Please get the
CSV.”&lt;/p&gt;

&lt;p&gt;I’ve attempted to embed some lack of confidence into the system using my
personalization prompt:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Rules around asking vs answering:&lt;/p&gt;

  &lt;ol&gt;
    &lt;li&gt;Whenever the user’s request lacks information needed for a precise answer,
pause and ask up to three concise clarifying questions starting with “Why
…” or “What specifically …”.&lt;/li&gt;
    &lt;li&gt;If sufficient context is present, answer normally.&lt;/li&gt;
    &lt;li&gt;After receiving clarifications, integrate them and provide the final answer
with reasoning.&lt;/li&gt;
  &lt;/ol&gt;
&lt;/blockquote&gt;

&lt;p&gt;In general, that has made my experiences with ChatGPT better but… it still
lacks some humility. It needs to doubt it’s own skills a bit more.. or at least
get a better gauge on it’s own capabilities.&lt;/p&gt;

    &lt;p&gt;&lt;a href=&quot;https://tiberriver256.github.io/ai%20and%20technology/chatgpt-needs-some-humility/&quot;&gt;ChatGPT needs some humility&lt;/a&gt; was originally published by Micah Rairdon at &lt;a href=&quot;https://tiberriver256.github.io&quot;&gt;Tiberriver256&lt;/a&gt; on June 22, 2025.&lt;/p&gt;
  </content>
</entry>


<entry>
  <title type="html"><![CDATA[I got my GitHub Copilot Certification]]></title>
 <link rel="alternate" type="text/html" href="https://tiberriver256.github.io/ai%20and%20technology/github-copilot-certification/" />
  <id>https://tiberriver256.github.io/ai%20and%20technology/github-copilot-certification</id>
  <updated>2025-06-21T00:00:00-00:00</updated>
  <published>2025-06-21T00:00:00-04:00</published>
  
  <author>
    <name>Micah Rairdon</name>
    <uri>https://tiberriver256.github.io</uri>
    <email>Jun(Real Email: Micah.Rairdon [GMail])k@JunkMail.com</email>
  </author>
  <content type="html">
    
&lt;p&gt;&lt;img src=&quot;https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_800,q_auto,f_auto/https://tiberriver256.github.io/images/github-copilot-certification/my-score.png&quot; srcset=&quot;         https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_320,q_auto,f_auto/https://tiberriver256.github.io/images/github-copilot-certification/my-score.png 320w,         https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_640,q_auto,f_auto/https://tiberriver256.github.io/images/github-copilot-certification/my-score.png 640w,         https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_960,q_auto,f_auto/https://tiberriver256.github.io/images/github-copilot-certification/my-score.png 960w,         https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_1280,q_auto,f_auto/https://tiberriver256.github.io/images/github-copilot-certification/my-score.png 1280w,         https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_1600,q_auto,f_auto/https://tiberriver256.github.io/images/github-copilot-certification/my-score.png 1600w     &quot; sizes=&quot;(min-width: 50rem) 50rem, 90vw&quot; alt=&quot;Screenshot of GitHub Copilot certification results, showing an overall score of 86% and individual section scores.&quot; loading=&quot;lazy&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;how-i-studied&quot;&gt;How I studied&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;Used a
&lt;a href=&quot;https://ghcertified.com/practice_tests/copilot/&quot;&gt;community-owned practice exam&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Followed the
&lt;a href=&quot;https://learn.microsoft.com/en-us/training/courses/gh-300t00&quot;&gt;Microsoft Learn modules&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;who-should-probably-take-this-exam&quot;&gt;Who should probably take this exam?&lt;/h2&gt;

&lt;p&gt;People administering a GitHub Copilot rollout at their organization.&lt;/p&gt;

&lt;h2 id=&quot;my-thoughts&quot;&gt;My thoughts&lt;/h2&gt;

&lt;p&gt;As a user of GitHub copilot, I thought the courses on prompt engineering and
actual usage were pretty good but minimal. I’ve learned a lot more about GitHub
copilot reading through the
&lt;a href=&quot;https://code.visualstudio.com/docs/copilot/overview&quot;&gt;GitHub Copilot for VSCode&lt;/a&gt;
docs which are fantastic.&lt;/p&gt;

&lt;p&gt;The docs stated that it’s targeted at adminstrators and for them I think it’d be
key. If you’re managing GitHub Copilot for an enterprise you need to be familiar
with:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;How GitHub Copilot handles data&lt;/li&gt;
  &lt;li&gt;What security options are available&lt;/li&gt;
  &lt;li&gt;General list of features (enough to answer questions for staff)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For all that, this is great.&lt;/p&gt;

&lt;p&gt;If you’re someone more interested in, “How does coding with AI actually work?”
skip the cert. Maybe check out the learn modules. Comb the GitHub for VSCode
docs. Try things out. Go through
&lt;a href=&quot;https://www.promptingguide.ai/&quot;&gt;promptingguide.ai&lt;/a&gt;. You’ll learn a lot more.&lt;/p&gt;

    &lt;p&gt;&lt;a href=&quot;https://tiberriver256.github.io/ai%20and%20technology/github-copilot-certification/&quot;&gt;I got my GitHub Copilot Certification&lt;/a&gt; was originally published by Micah Rairdon at &lt;a href=&quot;https://tiberriver256.github.io&quot;&gt;Tiberriver256&lt;/a&gt; on June 21, 2025.&lt;/p&gt;
  </content>
</entry>


<entry>
  <title type="html"><![CDATA[An interesting learning with SignGemma and the deaf community]]></title>
 <link rel="alternate" type="text/html" href="https://tiberriver256.github.io/ai%20and%20technology/signgemma-deaf-community-learning/" />
  <id>https://tiberriver256.github.io/ai%20and%20technology/signgemma-deaf-community-learning</id>
  <updated>2025-06-03T00:00:00-00:00</updated>
  <published>2025-06-03T00:00:00-04:00</published>
  
  <author>
    <name>Micah Rairdon</name>
    <uri>https://tiberriver256.github.io</uri>
    <email>Jun(Real Email: Micah.Rairdon [GMail])k@JunkMail.com</email>
  </author>
  <content type="html">
    &lt;p&gt;Google &lt;a href=&quot;https://x.com/GoogleDeepMind/status/1927375853551235160&quot;&gt;announced&lt;/a&gt; a new tool called SignGemma
which they describe as “our most capable model for translating sign language into spoken text”&lt;/p&gt;

&lt;p&gt;I absent mindedly shared this in the GR Slack group I hang out in and a friend encouraged me to dig
a little deeper into learning about how this new tool is received within the deaf community. The interesting
piece for me to hunt for was why this tool wouldn’t be well liked/received by some. Wouldn’t everyone
want this amazing tool?&lt;/p&gt;

&lt;h2 id=&quot;what-i-wanted-to-do&quot;&gt;What I wanted to do&lt;/h2&gt;

&lt;p&gt;Go out and talk with a few people who are deaf. Unfortunately, my life is pretty time constrained.. (as
you can probably tell from how frequently I write on this blog).&lt;/p&gt;

&lt;h2 id=&quot;what-i-did-instead&quot;&gt;What I did instead&lt;/h2&gt;

&lt;p&gt;I scoured the Internet… turns out there are lots of people sharing opinions on this topic on Reddit
and Facebook. So here I collect the reasons someone might view this release as negative.&lt;/p&gt;

&lt;h3 id=&quot;reaction-1-fear-it-might-take-asl-translator-jobs&quot;&gt;Reaction 1: Fear it might take ASL translator jobs&lt;/h3&gt;

&lt;p&gt;This technically isn’t coming from the deaf people but translators are what I would consider within the larger
community so I thought I’d incldue them.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_800,q_auto,f_auto/https://tiberriver256.github.io/images/signgemma-deaf-community-learning/reaction-1-job-concerns-facebook-post.png&quot; srcset=&quot;         https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_320,q_auto,f_auto/https://tiberriver256.github.io/images/signgemma-deaf-community-learning/reaction-1-job-concerns-facebook-post.png 320w,         https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_640,q_auto,f_auto/https://tiberriver256.github.io/images/signgemma-deaf-community-learning/reaction-1-job-concerns-facebook-post.png 640w,         https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_960,q_auto,f_auto/https://tiberriver256.github.io/images/signgemma-deaf-community-learning/reaction-1-job-concerns-facebook-post.png 960w,         https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_1280,q_auto,f_auto/https://tiberriver256.github.io/images/signgemma-deaf-community-learning/reaction-1-job-concerns-facebook-post.png 1280w,         https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_1600,q_auto,f_auto/https://tiberriver256.github.io/images/signgemma-deaf-community-learning/reaction-1-job-concerns-facebook-post.png 1600w     &quot; sizes=&quot;(min-width: 50rem) 50rem, 90vw&quot; alt=&quot;&quot; loading=&quot;lazy&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_800,q_auto,f_auto/https://tiberriver256.github.io/images/signgemma-deaf-community-learning/reaction-1-ai-taking-jobs-post.png&quot; srcset=&quot;         https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_320,q_auto,f_auto/https://tiberriver256.github.io/images/signgemma-deaf-community-learning/reaction-1-ai-taking-jobs-post.png 320w,         https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_640,q_auto,f_auto/https://tiberriver256.github.io/images/signgemma-deaf-community-learning/reaction-1-ai-taking-jobs-post.png 640w,         https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_960,q_auto,f_auto/https://tiberriver256.github.io/images/signgemma-deaf-community-learning/reaction-1-ai-taking-jobs-post.png 960w,         https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_1280,q_auto,f_auto/https://tiberriver256.github.io/images/signgemma-deaf-community-learning/reaction-1-ai-taking-jobs-post.png 1280w,         https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_1600,q_auto,f_auto/https://tiberriver256.github.io/images/signgemma-deaf-community-learning/reaction-1-ai-taking-jobs-post.png 1600w     &quot; sizes=&quot;(min-width: 50rem) 50rem, 90vw&quot; alt=&quot;&quot; loading=&quot;lazy&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;reaction-2-why-are-we-spending-money-to-help-hearing-people&quot;&gt;Reaction 2: Why are we spending money to help hearing people?&lt;/h3&gt;

&lt;p&gt;We should be working to help deaf people understand speaking… not the other way around&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_800,q_auto,f_auto/https://tiberriver256.github.io/images/signgemma-deaf-community-learning/reaction-2-helping-hearing-people-post.png&quot; srcset=&quot;         https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_320,q_auto,f_auto/https://tiberriver256.github.io/images/signgemma-deaf-community-learning/reaction-2-helping-hearing-people-post.png 320w,         https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_640,q_auto,f_auto/https://tiberriver256.github.io/images/signgemma-deaf-community-learning/reaction-2-helping-hearing-people-post.png 640w,         https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_960,q_auto,f_auto/https://tiberriver256.github.io/images/signgemma-deaf-community-learning/reaction-2-helping-hearing-people-post.png 960w,         https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_1280,q_auto,f_auto/https://tiberriver256.github.io/images/signgemma-deaf-community-learning/reaction-2-helping-hearing-people-post.png 1280w,         https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_1600,q_auto,f_auto/https://tiberriver256.github.io/images/signgemma-deaf-community-learning/reaction-2-helping-hearing-people-post.png 1600w     &quot; sizes=&quot;(min-width: 50rem) 50rem, 90vw&quot; alt=&quot;&quot; loading=&quot;lazy&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_800,q_auto,f_auto/https://tiberriver256.github.io/images/signgemma-deaf-community-learning/reaction-2-money-allocation-post.png&quot; srcset=&quot;         https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_320,q_auto,f_auto/https://tiberriver256.github.io/images/signgemma-deaf-community-learning/reaction-2-money-allocation-post.png 320w,         https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_640,q_auto,f_auto/https://tiberriver256.github.io/images/signgemma-deaf-community-learning/reaction-2-money-allocation-post.png 640w,         https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_960,q_auto,f_auto/https://tiberriver256.github.io/images/signgemma-deaf-community-learning/reaction-2-money-allocation-post.png 960w,         https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_1280,q_auto,f_auto/https://tiberriver256.github.io/images/signgemma-deaf-community-learning/reaction-2-money-allocation-post.png 1280w,         https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_1600,q_auto,f_auto/https://tiberriver256.github.io/images/signgemma-deaf-community-learning/reaction-2-money-allocation-post.png 1600w     &quot; sizes=&quot;(min-width: 50rem) 50rem, 90vw&quot; alt=&quot;&quot; loading=&quot;lazy&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;reaction-3-sign-language-to-english-doesnt-make-sense&quot;&gt;Reaction 3: Sign Language to English… doesn’t make sense&lt;/h3&gt;

&lt;p&gt;&lt;img src=&quot;https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_800,q_auto,f_auto/https://tiberriver256.github.io/images/signgemma-deaf-community-learning/reaction-3-sign-to-english-post.png&quot; srcset=&quot;         https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_320,q_auto,f_auto/https://tiberriver256.github.io/images/signgemma-deaf-community-learning/reaction-3-sign-to-english-post.png 320w,         https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_640,q_auto,f_auto/https://tiberriver256.github.io/images/signgemma-deaf-community-learning/reaction-3-sign-to-english-post.png 640w,         https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_960,q_auto,f_auto/https://tiberriver256.github.io/images/signgemma-deaf-community-learning/reaction-3-sign-to-english-post.png 960w,         https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_1280,q_auto,f_auto/https://tiberriver256.github.io/images/signgemma-deaf-community-learning/reaction-3-sign-to-english-post.png 1280w,         https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_1600,q_auto,f_auto/https://tiberriver256.github.io/images/signgemma-deaf-community-learning/reaction-3-sign-to-english-post.png 1600w     &quot; sizes=&quot;(min-width: 50rem) 50rem, 90vw&quot; alt=&quot;&quot; loading=&quot;lazy&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;reaction-4-itll-reduce-vocabulary-and-simplify-the-language&quot;&gt;Reaction 4: It’ll reduce vocabulary and simplify the language&lt;/h3&gt;

&lt;p&gt;&lt;img src=&quot;https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_800,q_auto,f_auto/https://tiberriver256.github.io/images/signgemma-deaf-community-learning/reaction-4-vocabulary-reduction-post.png&quot; srcset=&quot;         https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_320,q_auto,f_auto/https://tiberriver256.github.io/images/signgemma-deaf-community-learning/reaction-4-vocabulary-reduction-post.png 320w,         https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_640,q_auto,f_auto/https://tiberriver256.github.io/images/signgemma-deaf-community-learning/reaction-4-vocabulary-reduction-post.png 640w,         https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_960,q_auto,f_auto/https://tiberriver256.github.io/images/signgemma-deaf-community-learning/reaction-4-vocabulary-reduction-post.png 960w,         https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_1280,q_auto,f_auto/https://tiberriver256.github.io/images/signgemma-deaf-community-learning/reaction-4-vocabulary-reduction-post.png 1280w,         https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_1600,q_auto,f_auto/https://tiberriver256.github.io/images/signgemma-deaf-community-learning/reaction-4-vocabulary-reduction-post.png 1600w     &quot; sizes=&quot;(min-width: 50rem) 50rem, 90vw&quot; alt=&quot;&quot; loading=&quot;lazy&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Seems like the reaction here is the fear of &lt;a href=&quot;https://library.fiveable.me/key-terms/television-studies/cultural-homogenization&quot;&gt;cultural homogenization&lt;/a&gt; similar
to what television/media has done with local cultures/language variants of English.&lt;/p&gt;

&lt;h3 id=&quot;reaction-5-it-will-give-people-an-excuse-not-to-learn-sign-language&quot;&gt;Reaction 5: It will give people an excuse not to learn sign language&lt;/h3&gt;

&lt;p&gt;&lt;img src=&quot;https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_800,q_auto,f_auto/https://tiberriver256.github.io/images/signgemma-deaf-community-learning/reaction-5-excuse-not-to-learn-post.png&quot; srcset=&quot;         https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_320,q_auto,f_auto/https://tiberriver256.github.io/images/signgemma-deaf-community-learning/reaction-5-excuse-not-to-learn-post.png 320w,         https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_640,q_auto,f_auto/https://tiberriver256.github.io/images/signgemma-deaf-community-learning/reaction-5-excuse-not-to-learn-post.png 640w,         https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_960,q_auto,f_auto/https://tiberriver256.github.io/images/signgemma-deaf-community-learning/reaction-5-excuse-not-to-learn-post.png 960w,         https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_1280,q_auto,f_auto/https://tiberriver256.github.io/images/signgemma-deaf-community-learning/reaction-5-excuse-not-to-learn-post.png 1280w,         https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_1600,q_auto,f_auto/https://tiberriver256.github.io/images/signgemma-deaf-community-learning/reaction-5-excuse-not-to-learn-post.png 1600w     &quot; sizes=&quot;(min-width: 50rem) 50rem, 90vw&quot; alt=&quot;&quot; loading=&quot;lazy&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;reaction-6-hearing-people-may-be-less-inclined-to-provide-interpreters-thinking-this-tool-is-good-enough&quot;&gt;Reaction 6: Hearing people may be less inclined to provide interpreters thinking this tool is “good enough”&lt;/h3&gt;

&lt;p&gt;&lt;img src=&quot;https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_800,q_auto,f_auto/https://tiberriver256.github.io/images/signgemma-deaf-community-learning/reaction-6-interpreter-concerns-post.png&quot; srcset=&quot;         https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_320,q_auto,f_auto/https://tiberriver256.github.io/images/signgemma-deaf-community-learning/reaction-6-interpreter-concerns-post.png 320w,         https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_640,q_auto,f_auto/https://tiberriver256.github.io/images/signgemma-deaf-community-learning/reaction-6-interpreter-concerns-post.png 640w,         https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_960,q_auto,f_auto/https://tiberriver256.github.io/images/signgemma-deaf-community-learning/reaction-6-interpreter-concerns-post.png 960w,         https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_1280,q_auto,f_auto/https://tiberriver256.github.io/images/signgemma-deaf-community-learning/reaction-6-interpreter-concerns-post.png 1280w,         https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_1600,q_auto,f_auto/https://tiberriver256.github.io/images/signgemma-deaf-community-learning/reaction-6-interpreter-concerns-post.png 1600w     &quot; sizes=&quot;(min-width: 50rem) 50rem, 90vw&quot; alt=&quot;&quot; loading=&quot;lazy&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;what-i-also-stumbled-upon&quot;&gt;What I also stumbled upon&lt;/h2&gt;

&lt;p&gt;This tool was actually designed by a deaf person (&lt;a href=&quot;https://www.linkedin.com/in/samsepah/&quot;&gt;Sam Sepah&lt;/a&gt;) for a specific problem they felt they had!&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_800,q_auto,f_auto/https://tiberriver256.github.io/images/signgemma-deaf-community-learning/sam-sepah-designer-post-1.png&quot; srcset=&quot;         https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_320,q_auto,f_auto/https://tiberriver256.github.io/images/signgemma-deaf-community-learning/sam-sepah-designer-post-1.png 320w,         https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_640,q_auto,f_auto/https://tiberriver256.github.io/images/signgemma-deaf-community-learning/sam-sepah-designer-post-1.png 640w,         https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_960,q_auto,f_auto/https://tiberriver256.github.io/images/signgemma-deaf-community-learning/sam-sepah-designer-post-1.png 960w,         https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_1280,q_auto,f_auto/https://tiberriver256.github.io/images/signgemma-deaf-community-learning/sam-sepah-designer-post-1.png 1280w,         https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_1600,q_auto,f_auto/https://tiberriver256.github.io/images/signgemma-deaf-community-learning/sam-sepah-designer-post-1.png 1600w     &quot; sizes=&quot;(min-width: 50rem) 50rem, 90vw&quot; alt=&quot;&quot; loading=&quot;lazy&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_800,q_auto,f_auto/https://tiberriver256.github.io/images/signgemma-deaf-community-learning/sam-sepah-designer-post-2.png&quot; srcset=&quot;         https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_320,q_auto,f_auto/https://tiberriver256.github.io/images/signgemma-deaf-community-learning/sam-sepah-designer-post-2.png 320w,         https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_640,q_auto,f_auto/https://tiberriver256.github.io/images/signgemma-deaf-community-learning/sam-sepah-designer-post-2.png 640w,         https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_960,q_auto,f_auto/https://tiberriver256.github.io/images/signgemma-deaf-community-learning/sam-sepah-designer-post-2.png 960w,         https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_1280,q_auto,f_auto/https://tiberriver256.github.io/images/signgemma-deaf-community-learning/sam-sepah-designer-post-2.png 1280w,         https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_1600,q_auto,f_auto/https://tiberriver256.github.io/images/signgemma-deaf-community-learning/sam-sepah-designer-post-2.png 1600w     &quot; sizes=&quot;(min-width: 50rem) 50rem, 90vw&quot; alt=&quot;&quot; loading=&quot;lazy&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Unfortunately… couldn’t spot a &lt;strong&gt;specific&lt;/strong&gt; problem they were after. Just a vauge sort of “this
will help everything” which is typical of AI stuff.&lt;/p&gt;

&lt;h2 id=&quot;what-i-learned&quot;&gt;What I learned…&lt;/h2&gt;

&lt;p&gt;So… Looking back… my gut reaction of shock around “How could someone not be excited about this?”
feels pretty silly… especially me being pretty active in the autism community.&lt;/p&gt;

&lt;p&gt;There are a LOT of people in the deaf community. Any community is made up of individuals. Every individual
is unique and different from the other people within their community.&lt;/p&gt;

&lt;p&gt;We can take the “Once you’ve med one autistic person… you’ve met one autistic person” and flip it
to:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Once you’ve met one deaf person… you’ve met one deaf person&lt;/p&gt;
&lt;/blockquote&gt;

    &lt;p&gt;&lt;a href=&quot;https://tiberriver256.github.io/ai%20and%20technology/signgemma-deaf-community-learning/&quot;&gt;An interesting learning with SignGemma and the deaf community&lt;/a&gt; was originally published by Micah Rairdon at &lt;a href=&quot;https://tiberriver256.github.io&quot;&gt;Tiberriver256&lt;/a&gt; on June 03, 2025.&lt;/p&gt;
  </content>
</entry>


<entry>
  <title type="html"><![CDATA[Getting the related work items for an Azure Pipeline run in a monorepo]]></title>
 <link rel="alternate" type="text/html" href="https://tiberriver256.github.io/devops/azure-devops-pipelines-related-work-items-monorepo/" />
  <id>https://tiberriver256.github.io/devops/azure-devops-pipelines-related-work-items-monorepo</id>
  <updated>2024-08-28T00:00:00-00:00</updated>
  <published>2024-08-28T00:00:00-04:00</published>
  
  <author>
    <name>Micah Rairdon</name>
    <uri>https://tiberriver256.github.io</uri>
    <email>Jun(Real Email: Micah.Rairdon [GMail])k@JunkMail.com</email>
  </author>
  <content type="html">
    &lt;h2 id=&quot;the-problem&quot;&gt;The problem..&lt;/h2&gt;

&lt;p&gt;I absolutely love this little &lt;a href=&quot;https://learn.microsoft.com/en-us/azure/devops/pipelines/process/environments?view=azure-devops#view-deployment-history&quot;&gt;‘related work items’&lt;/a&gt;
feature in Azure DevOps pipelines:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_800,q_auto,f_auto/https://tiberriver256.github.io/images/azure-devops-pipelines-related-work-items-monorepo/related-work-items-button.png&quot; srcset=&quot;         https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_320,q_auto,f_auto/https://tiberriver256.github.io/images/azure-devops-pipelines-related-work-items-monorepo/related-work-items-button.png 320w,         https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_640,q_auto,f_auto/https://tiberriver256.github.io/images/azure-devops-pipelines-related-work-items-monorepo/related-work-items-button.png 640w,         https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_960,q_auto,f_auto/https://tiberriver256.github.io/images/azure-devops-pipelines-related-work-items-monorepo/related-work-items-button.png 960w,         https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_1280,q_auto,f_auto/https://tiberriver256.github.io/images/azure-devops-pipelines-related-work-items-monorepo/related-work-items-button.png 1280w,         https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_1600,q_auto,f_auto/https://tiberriver256.github.io/images/azure-devops-pipelines-related-work-items-monorepo/related-work-items-button.png 1600w     &quot; sizes=&quot;(min-width: 50rem) 50rem, 90vw&quot; alt=&quot;&quot; loading=&quot;lazy&quot; /&gt;&lt;/p&gt;

&lt;p&gt;You can click on it and quickly get a view of the work items associated with that pipeline:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_800,q_auto,f_auto/https://tiberriver256.github.io/images/azure-devops-pipelines-related-work-items-monorepo/related-work-items-view.png&quot; srcset=&quot;         https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_320,q_auto,f_auto/https://tiberriver256.github.io/images/azure-devops-pipelines-related-work-items-monorepo/related-work-items-view.png 320w,         https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_640,q_auto,f_auto/https://tiberriver256.github.io/images/azure-devops-pipelines-related-work-items-monorepo/related-work-items-view.png 640w,         https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_960,q_auto,f_auto/https://tiberriver256.github.io/images/azure-devops-pipelines-related-work-items-monorepo/related-work-items-view.png 960w,         https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_1280,q_auto,f_auto/https://tiberriver256.github.io/images/azure-devops-pipelines-related-work-items-monorepo/related-work-items-view.png 1280w,         https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_1600,q_auto,f_auto/https://tiberriver256.github.io/images/azure-devops-pipelines-related-work-items-monorepo/related-work-items-view.png 1600w     &quot; sizes=&quot;(min-width: 50rem) 50rem, 90vw&quot; alt=&quot;&quot; loading=&quot;lazy&quot; /&gt;&lt;/p&gt;

&lt;p&gt;This information is beneficial in two ways:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;It is useful information for the person running a deployment&lt;/li&gt;
  &lt;li&gt;It can be used via ADO APIs to block deployments if related stories are in a certain status&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;So… what’s the problem with this feature?&lt;/p&gt;

&lt;p&gt;It doesn’t support monorepos 😭😭😭&lt;/p&gt;

&lt;h2 id=&quot;what-happens-with-monorepos&quot;&gt;What happens with monorepos?&lt;/h2&gt;

&lt;p&gt;Let’s say I have a repository set up with the following folder structure and two azure pipelines files:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_800,q_auto,f_auto/https://tiberriver256.github.io/images/azure-devops-pipelines-related-work-items-monorepo/the-setup.png&quot; srcset=&quot;         https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_320,q_auto,f_auto/https://tiberriver256.github.io/images/azure-devops-pipelines-related-work-items-monorepo/the-setup.png 320w,         https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_640,q_auto,f_auto/https://tiberriver256.github.io/images/azure-devops-pipelines-related-work-items-monorepo/the-setup.png 640w,         https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_960,q_auto,f_auto/https://tiberriver256.github.io/images/azure-devops-pipelines-related-work-items-monorepo/the-setup.png 960w,         https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_1280,q_auto,f_auto/https://tiberriver256.github.io/images/azure-devops-pipelines-related-work-items-monorepo/the-setup.png 1280w,         https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_1600,q_auto,f_auto/https://tiberriver256.github.io/images/azure-devops-pipelines-related-work-items-monorepo/the-setup.png 1600w     &quot; sizes=&quot;(min-width: 50rem) 50rem, 90vw&quot; alt=&quot;&quot; loading=&quot;lazy&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Then let’s say I commit to the main branch twice. Each commit adds a single &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;index.js&lt;/code&gt; file to
each folder:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_800,q_auto,f_auto/https://tiberriver256.github.io/images/azure-devops-pipelines-related-work-items-monorepo/the-work.png&quot; srcset=&quot;         https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_320,q_auto,f_auto/https://tiberriver256.github.io/images/azure-devops-pipelines-related-work-items-monorepo/the-work.png 320w,         https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_640,q_auto,f_auto/https://tiberriver256.github.io/images/azure-devops-pipelines-related-work-items-monorepo/the-work.png 640w,         https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_960,q_auto,f_auto/https://tiberriver256.github.io/images/azure-devops-pipelines-related-work-items-monorepo/the-work.png 960w,         https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_1280,q_auto,f_auto/https://tiberriver256.github.io/images/azure-devops-pipelines-related-work-items-monorepo/the-work.png 1280w,         https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_1600,q_auto,f_auto/https://tiberriver256.github.io/images/azure-devops-pipelines-related-work-items-monorepo/the-work.png 1600w     &quot; sizes=&quot;(min-width: 50rem) 50rem, 90vw&quot; alt=&quot;&quot; loading=&quot;lazy&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Each of those files trigger their own build runs. When I view the related work items for each though.. this happens:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_800,q_auto,f_auto/https://tiberriver256.github.io/images/azure-devops-pipelines-related-work-items-monorepo/the-problem.png&quot; srcset=&quot;         https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_320,q_auto,f_auto/https://tiberriver256.github.io/images/azure-devops-pipelines-related-work-items-monorepo/the-problem.png 320w,         https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_640,q_auto,f_auto/https://tiberriver256.github.io/images/azure-devops-pipelines-related-work-items-monorepo/the-problem.png 640w,         https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_960,q_auto,f_auto/https://tiberriver256.github.io/images/azure-devops-pipelines-related-work-items-monorepo/the-problem.png 960w,         https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_1280,q_auto,f_auto/https://tiberriver256.github.io/images/azure-devops-pipelines-related-work-items-monorepo/the-problem.png 1280w,         https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_1600,q_auto,f_auto/https://tiberriver256.github.io/images/azure-devops-pipelines-related-work-items-monorepo/the-problem.png 1600w     &quot; sizes=&quot;(min-width: 50rem) 50rem, 90vw&quot; alt=&quot;&quot; loading=&quot;lazy&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;does-microsoft-plan-to-add-monorepo-support&quot;&gt;Does Microsoft plan to add monorepo support?&lt;/h2&gt;

&lt;p&gt;No… even though I’d think there would be plenty of support for this,
the idea has never gotten any &lt;a href=&quot;https://stackoverflow.com/a/68729663/3317144&quot;&gt;traction&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;lets-find-a-solution&quot;&gt;Let’s find a solution&lt;/h2&gt;

&lt;p&gt;It appears from the Azure DevOps REST API documentation that we should be able to do this ourselves…
&lt;strong&gt;IF&lt;/strong&gt; we are associating work items to our commits (via PR or otherwise). Which I so happen to be
doint already so the following method looks pretty promising:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Get ALL the commits related to a build pipeline via the &lt;a href=&quot;https://learn.microsoft.com/en-us/rest/api/azure/devops/build/builds/get-build-changes?view=azure-devops-rest-7.1&quot;&gt;Get Build Changes&lt;/a&gt; endpoint.&lt;/li&gt;
  &lt;li&gt;Filter those commits down to the ones we want using the &lt;a href=&quot;https://learn.microsoft.com/en-us/rest/api/azure/devops/git/commits/get-commits?view=azure-devops-rest-7.1&amp;amp;tabs=HTTP&quot;&gt;Get Commits&lt;/a&gt; endpoint using:
    &lt;ol&gt;
      &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;searchCriteria.itemPath&lt;/code&gt; - to exclude commits that aren’t in our trigger&lt;/li&gt;
      &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;searchCriteria.includeWorkItems&lt;/code&gt; - to include the work items associated with the commits&lt;/li&gt;
    &lt;/ol&gt;
  &lt;/li&gt;
  &lt;li&gt;Pull the work item ids from Step #2 to do whatever I want with&lt;/li&gt;
&lt;/ol&gt;

&lt;h3 id=&quot;powershell-time&quot;&gt;PowerShell time!&lt;/h3&gt;

&lt;p&gt;Following the above strategy I &lt;a href=&quot;https://gist.github.com/Tiberriver256/99452a6bd254327acceb0405e34d2230&quot;&gt;wrote up a quick PowerShell script&lt;/a&gt; that seems to get me everything I need:&lt;/p&gt;

&lt;div class=&quot;language-powershell highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;#Requires -PSEdition Core&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;

&lt;/span&gt;&lt;span class=&quot;cm&quot;&gt;&amp;lt;#
&lt;/span&gt;&lt;span class=&quot;cs&quot;&gt;.SYNOPSIS&lt;/span&gt;&lt;span class=&quot;cm&quot;&gt;
    Retrieves distinct commits and associated work items for a build pipeline... with support for monorepos!
    See the blog post at https://tiberriver256.github.io/DevOps/azure-devops-pipelines-related-work-items-monorepo for more information.
&lt;/span&gt;&lt;span class=&quot;cs&quot;&gt;.DESCRIPTION&lt;/span&gt;&lt;span class=&quot;cm&quot;&gt;
    This script retrieves the distinct commits and associated work items for a build pipeline. It requires the following parameters:
    - BuildId: The ID of the build. If not provided, it uses the value of the environment variable BUILD_BUILDID.
    - CollectionUri: The URI of the collection. If not provided, it uses the value of the environment variable SYSTEM_COLLECTIONURI.
    - ProjectId: The ID of the project. If not provided, it uses the value of the environment variable SYSTEM_TEAMPROJECTID.
    - AuthorizationHeader: The authorization header. If not provided, it uses the value of the environment variable SYSTEM_ACCESSTOKEN.
&lt;/span&gt;&lt;span class=&quot;cs&quot;&gt;.PARAMETER&lt;/span&gt;&lt;span class=&quot;cm&quot;&gt; BuildId
    The ID of the build.
&lt;/span&gt;&lt;span class=&quot;cs&quot;&gt;.PARAMETER&lt;/span&gt;&lt;span class=&quot;cm&quot;&gt; CollectionUri
    The URI of the collection.
&lt;/span&gt;&lt;span class=&quot;cs&quot;&gt;.PARAMETER&lt;/span&gt;&lt;span class=&quot;cm&quot;&gt; ProjectId
    The ID of the project.
&lt;/span&gt;&lt;span class=&quot;cs&quot;&gt;.PARAMETER&lt;/span&gt;&lt;span class=&quot;cm&quot;&gt; AuthorizationHeader
    The authorization header.
&lt;/span&gt;&lt;span class=&quot;cs&quot;&gt;.OUTPUTS&lt;/span&gt;&lt;span class=&quot;cm&quot;&gt;
    Returns a PSCustomObject with the following properties:
    - DistinctCommits: An array of distinct commits.
    - AssociatedWorkItems: An array of associated work items.
&lt;/span&gt;&lt;span class=&quot;cs&quot;&gt;.EXAMPLE&lt;/span&gt;&lt;span class=&quot;cm&quot;&gt;
    Get-BuildPipelineScopedChanges -BuildId 12345 -CollectionUri &quot;https://dev.azure.com/myorg/&quot; -ProjectId &quot;be77c668-1e13-4360-aa08-264b1d5f64c6&quot; -AuthorizationHeader &quot;Bearer &amp;lt;access_token&amp;gt;&quot;
    Retrieves the distinct commits and associated work items for the build with ID 12345 in the project &quot;be77c668-1e13-4360-aa08-264b1d5f64c6&quot; in the Azure DevOps organization &quot;myorg&quot; using the specified access token.
#&amp;gt;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;

&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;CmdletBinding&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;kr&quot;&gt;param&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Parameter&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$BuildId&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;nn&quot;&gt;ENV&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;BUILD_BUILDID&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;

    &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Parameter&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Uri&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$CollectionUri&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;nn&quot;&gt;ENV&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;SYSTEM_COLLECTIONURI&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;

    &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Parameter&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Guid&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$ProjectId&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;nn&quot;&gt;ENV&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;SYSTEM_TEAMPROJECTID&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;

    &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Parameter&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$AuthorizationHeader&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;Bearer &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;nn&quot;&gt;ENV&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;SYSTEM_ACCESSTOKEN&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;

&lt;/span&gt;&lt;span class=&quot;kr&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;EnsureModuleInstalled&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$name&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;  
    &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$module&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Get-InstalledModule&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;-Name&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$name&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;  
    &lt;/span&gt;&lt;span class=&quot;kr&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;$null&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-eq&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$module&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;  
        &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Install-Module&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;-Name&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$name&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;-Scope&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;CurrentUser&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;-AllowClobber&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;  
    &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;  
&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;

&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;EnsureModuleInstalled&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;powershell-yaml&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;

&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$Headers&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;@{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;Authorization&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$AuthorizationHeader&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;

&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$BuildUri&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$CollectionUri$ProjectId&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;/_apis/build/builds/&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$BuildId&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$ChangesUri&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$CollectionUri$ProjectId&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;/_apis/build/builds/&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$BuildId&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;/changes&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;

&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$Build&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Invoke-RestMethod&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;-Uri&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$BuildUri&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;-Headers&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$Headers&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$RepositoryId&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$Build&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;repository&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$CommitId&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$Build&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;sourceVersion&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$BuildDefinitionId&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$Build&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;definition&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$BuildDefinitionRevision&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$Build&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;definition&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;revision&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;

&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$BuildDefinitionUri&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$CollectionUri$ProjectId&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;/_apis/build/definitions/&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$BuildDefinitionId&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;?revision=&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$BuildDefinitionRevision&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$BuildDefinition&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Invoke-RestMethod&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;-Uri&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$BuildDefinitionUri&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;-Headers&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$Headers&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$YamlFilePath&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$BuildDefinition&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;process&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;yamlFilename&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$YamlFileUri&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$CollectionUri$ProjectId&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;/_apis/git/repositories/&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$RepositoryId&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;/items?path=&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$YamlFilePath&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&amp;amp;download=true&amp;amp;versionDescriptor.version=&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$CommitId&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&amp;amp;versionDescriptor.versionType=commit&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$YamlFile&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Invoke-RestMethod&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;-Uri&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$YamlFileUri&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;-Headers&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$Headers&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ConvertFrom-Yaml&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; 
&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$TriggerPaths&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$YamlFile&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;trigger&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;paths&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;include&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ForEach-Object&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;$_&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-replace&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;\*&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;

&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$IsMonoRepo&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$TriggerPaths&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;Count&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-ge&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-and&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$TriggerPaths&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-ne&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;/&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;


&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$Changes&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Invoke-RestMethod&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;-Uri&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$ChangesUri&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;-Headers&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$Headers&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;

&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$LatestChangeTimeStamp&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$Changes&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;timestamp&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$OldestChangeTimeStamp&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$Changes&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;-1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;timestamp&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;

&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$CommitsFilteredByTriggerPaths&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;@()&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$BaseCommitsUri&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$CollectionUri$ProjectId&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;/_apis/git/repositories/&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$RepositoryId&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;/commits?searchCriteria.fromDate=&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$OldestChangeTimeStamp&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&amp;amp;searchCriteria.toDate=&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$LatestChangeTimeStamp&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&amp;amp;searchCriteria.includeWorkItems=true&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;

&lt;/span&gt;&lt;span class=&quot;kr&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$IsMonoRepo&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;kr&quot;&gt;foreach&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$Path&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;kr&quot;&gt;in&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$TriggerPaths&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$CommitsUri&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$BaseCommitsUri&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&amp;amp;searchCriteria.itemPath=&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$Path&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$Commits&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Invoke-RestMethod&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;-Uri&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$CommitsUri&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;-Headers&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$Headers&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$CommitsFilteredByTriggerPaths&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;+=&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$Commits&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;kr&quot;&gt;else&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$Commits&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Invoke-RestMethod&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;-Uri&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$BaseCommitsUri&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;-Headers&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$Headers&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$CommitsFilteredByTriggerPaths&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$Commits&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;

&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$DistinctCommits&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;@(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$CommitsFilteredByTriggerPaths&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;err&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;err&quot;&gt;Group-Object&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;err&quot;&gt;-Property&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;err&quot;&gt;commitId&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;err&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;err&quot;&gt;ForEach-Object&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;$_&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Group&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;})&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;

&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$DistinctWorkItemUrls&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$DistinctCommits&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;workItems&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Get-Unique&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;

&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$AssociatedWorkItems&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;@(&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$DistinctWorkItemUrls&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;err&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;err&quot;&gt;ForEach-Object&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Invoke-RestMethod&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;-Uri&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;$_&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;-Headers&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$Headers&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;})&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;

&lt;/span&gt;&lt;span class=&quot;kr&quot;&gt;return&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;PSCustomObject&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]@{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;DistinctCommits&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;     &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$DistinctCommits&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;AssociatedWorkItems&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$AssociatedWorkItems&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

    &lt;p&gt;&lt;a href=&quot;https://tiberriver256.github.io/devops/azure-devops-pipelines-related-work-items-monorepo/&quot;&gt;Getting the related work items for an Azure Pipeline run in a monorepo&lt;/a&gt; was originally published by Micah Rairdon at &lt;a href=&quot;https://tiberriver256.github.io&quot;&gt;Tiberriver256&lt;/a&gt; on August 28, 2024.&lt;/p&gt;
  </content>
</entry>


<entry>
  <title type="html"><![CDATA[The quest for an ergonomic keyboard - Part 1]]></title>
 <link rel="alternate" type="text/html" href="https://tiberriver256.github.io/blogging/quest-for-an-ergonomic-keyboard-pt1/" />
  <id>https://tiberriver256.github.io/blogging/quest-for-an-ergonomic-keyboard-pt1</id>
  <updated>2024-06-08T00:00:00-00:00</updated>
  <published>2024-06-08T00:00:00-04:00</published>
  
  <author>
    <name>Micah Rairdon</name>
    <uri>https://tiberriver256.github.io</uri>
    <email>Jun(Real Email: Micah.Rairdon [GMail])k@JunkMail.com</email>
  </author>
  <content type="html">
    &lt;p&gt;If you didn’t read my &lt;a href=&quot;./2024-05-30-blogging-from-android.md&quot;&gt;previous blog post&lt;/a&gt;
I’m hunting for a good method for keeping my tech experiments going from my living
room lazy boy. One of the key components to that is having a bluetooth ergonomic keyboard&lt;/p&gt;

&lt;h2 id=&quot;why-bluetooth&quot;&gt;Why Bluetooth?&lt;/h2&gt;

&lt;p&gt;If I’m going to be popping up a little workspace here and there all over the house,
I want setup time and teardown time to be seconds. I also don’t want anything dangling
because when I’m watching my kids I often have to jump up quick to help with something
and I don’t want to get anything caught while I’m trying to get my keyboard off my lap.&lt;/p&gt;

&lt;h2 id=&quot;why-ergonomic&quot;&gt;Why ergonomic?&lt;/h2&gt;

&lt;p&gt;Regular keyboards hurt… like… a lot.&lt;/p&gt;

&lt;p&gt;I can only type on a laptop keyboard for about 15-20 minutes before my hands start hurting. I need
something that I can type on for hours without pain. I have a &lt;a href=&quot;https://www.zsa.io/moonlander&quot;&gt;Moonlander keyboard&lt;/a&gt;
which I use for work that lets me type for hours without a whole lot of pain. I need something similar.&lt;/p&gt;

&lt;h2 id=&quot;what-i-tried&quot;&gt;What I tried&lt;/h2&gt;

&lt;p&gt;I just bought the &lt;a href=&quot;https://www.slicemk.com/products/ergodoxlp-wireless&quot;&gt;ErgodoxLP Wireless by SliceMK&lt;/a&gt; which
is a fantastic little keyboard. I discovered though that I cannot handle the low-profile keyboard and low-profile
switches. They are too similar to a laptop for me. I typed on it for about an hour today at the library and 
had sever pain in my hands for about two hours after that. Definitely not a good fit.&lt;/p&gt;

&lt;h2 id=&quot;whats-next&quot;&gt;What’s next?&lt;/h2&gt;

&lt;p&gt;I’m debating between these two options:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.moergo.com/&quot;&gt;Glove80&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://svalboard.com/&quot;&gt;Svalboard&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;glove80&quot;&gt;Glove80&lt;/h3&gt;

&lt;p&gt;Pros:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Wireless&lt;/li&gt;
  &lt;li&gt;Split&lt;/li&gt;
  &lt;li&gt;Ergonomic&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Cons:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Low-profile switches might cause the same pain I experienced with the ErgodoxLP&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;svalboard&quot;&gt;Svalboard&lt;/h3&gt;

&lt;p&gt;Pros:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Highly ergonomic - Likely to be even less pain than my Moonlander just due to the lack of movement&lt;/li&gt;
  &lt;li&gt;Mouse embedded in keyboard - You can get a trackball right in the keyboard which reduces the clutter of
my working environment even further&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Cons:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Not wireless - Kinda sucks that it’s not wirelss but it would hook straight into my phone with a usb-c and
without the mouse there it might not be that big of a deal&lt;/li&gt;
  &lt;li&gt;Cost - These suckers come in at around $800 and I just had a plumbing emergency at home cost me $11k so I’m not sure I’ll be able to affort these guys too soon&lt;/li&gt;
&lt;/ul&gt;

    &lt;p&gt;&lt;a href=&quot;https://tiberriver256.github.io/blogging/quest-for-an-ergonomic-keyboard-pt1/&quot;&gt;The quest for an ergonomic keyboard - Part 1&lt;/a&gt; was originally published by Micah Rairdon at &lt;a href=&quot;https://tiberriver256.github.io&quot;&gt;Tiberriver256&lt;/a&gt; on June 08, 2024.&lt;/p&gt;
  </content>
</entry>


<entry>
  <title type="html"><![CDATA[Blogging from Android]]></title>
 <link rel="alternate" type="text/html" href="https://tiberriver256.github.io/blogging/blogging-from-android/" />
  <id>https://tiberriver256.github.io/blogging/blogging-from-android</id>
  <updated>2024-05-30T00:00:00-00:00</updated>
  <published>2024-05-30T00:00:00-04:00</published>
  
  <author>
    <name>Micah Rairdon</name>
    <uri>https://tiberriver256.github.io</uri>
    <email>Jun(Real Email: Micah.Rairdon [GMail])k@JunkMail.com</email>
  </author>
  <content type="html">
    &lt;p&gt;I love to write blog posts and tinker with technology. I haven’t been able to do
this for awhile for several reasons:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;I have two autistic boys that require constant attention when they are awake&lt;/li&gt;
  &lt;li&gt;I have severe pain in my hands that prevents me from typing on laptop
keyboards&lt;/li&gt;
  &lt;li&gt;My home office is in my youngest child’s bedroom which keeps me from blogging
when my kids are sleeping&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Needless to say… I’ve been stuck for quite some time. I think I may have found
a decent solution though, which is:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;A bluetooth split keyboard&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://termux.dev&quot;&gt;Termux&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;My Pixel 8 Pro&lt;/li&gt;
  &lt;li&gt;A &lt;a href=&quot;nvchad.com&quot;&gt;decent&lt;/a&gt; Neovim setup&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The setup allows me to work with my phone in my lap in my recliner and type out
a blog like this one! Very excited to be back blogging again!&lt;/p&gt;

    &lt;p&gt;&lt;a href=&quot;https://tiberriver256.github.io/blogging/blogging-from-android/&quot;&gt;Blogging from Android&lt;/a&gt; was originally published by Micah Rairdon at &lt;a href=&quot;https://tiberriver256.github.io&quot;&gt;Tiberriver256&lt;/a&gt; on May 30, 2024.&lt;/p&gt;
  </content>
</entry>


<entry>
  <title type="html"><![CDATA[ThingWorx local development environment with Docker - Part 1]]></title>
 <link rel="alternate" type="text/html" href="https://tiberriver256.github.io/web%20development/thingworx-local-development-environment-pt-1/" />
  <id>https://tiberriver256.github.io/web%20development/thingworx-local-development-environment-pt-1</id>
  <updated>2024-03-02T00:00:00-00:00</updated>
  <published>2024-03-02T00:00:00-05:00</published>
  
  <author>
    <name>Micah Rairdon</name>
    <uri>https://tiberriver256.github.io</uri>
    <email>Jun(Real Email: Micah.Rairdon [GMail])k@JunkMail.com</email>
  </author>
  <content type="html">
    &lt;p&gt;&lt;a href=&quot;https://www.ptc.com/en/products/thingworx&quot;&gt;ThingWorx&lt;/a&gt; is a platform for
developing “Industrial IoT solutions”. They’ve got a lot of interesting
documentation on various setup guides but I wanted to document how to get one up
and running locally in a few minutes for the express purposes of learning and
experimentation.&lt;/p&gt;

&lt;p&gt;A local setup doesn’t usually need all the heavy duty resilience and redundancy
requirements that come with setting up a production environment. Unfortunately,
while ThingWorx has plenty of documentation on setting up a production instance
they don’t have a whole lot of documentation on quickly spinning up a local
environment for experiementation.&lt;/p&gt;

&lt;h2 id=&quot;what-is-the-thingworx-architecture&quot;&gt;What is the ThingWorx architecture?&lt;/h2&gt;

&lt;p&gt;There are three basic components in ThingWorx
&lt;a href=&quot;https://support.ptc.com/help/thingworx/platform/r9/en/index.html#page/ThingWorx/Help/Installation/DeploymentArchitecture/thingworx_foundation_deployment_components.html&quot;&gt;documented here&lt;/a&gt;
and they are:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Things/Devices/Users/Clients&lt;/li&gt;
  &lt;li&gt;ThingWorx Foundation&lt;/li&gt;
  &lt;li&gt;Database&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The ThingWorx Foundation application is a Java web application designed to be
hosted with Apache Tomcat. The database you choose to use with ThingWorx is
somewhat up to you. Any database that provides a JDBC driver and is ANSI SQL
capable
&lt;a href=&quot;https://support.ptc.com/help/thingworx/platform/r9/en/index.html#page/ThingWorx/Help/ModelandDataBestPractices/persistenceProviderOptions.html&quot;&gt;should work&lt;/a&gt;,
although the officially distributed installers will make it easier if you’re
using either PostgreSQL, MS SQL, or Azure SQL.&lt;/p&gt;

&lt;p&gt;All of this looks like it’s VERY dockerizable.&lt;/p&gt;

&lt;h2 id=&quot;are-there-other-attempts-out-there-to-do-this-with-docker&quot;&gt;Are there other attempts out there to do this with Docker?&lt;/h2&gt;

&lt;p&gt;There are of course the official Docker implementations mentioned in
&lt;a href=&quot;https://support.ptc.com/help/thingworx/platform/r9/en/index.html#page/ThingWorx/Help/Installation/ThingWorxDockerGuide/thingworx_docker_landing_page.html#&quot;&gt;the installation guide here&lt;/a&gt;.
These are a little overkill for our needs though.&lt;/p&gt;

&lt;p&gt;A quick Google search yielded up
&lt;a href=&quot;https://github.com/Foxoncz/docker-thingworx&quot;&gt;Foxoncz/docker-thingworx&lt;/a&gt; which he
describes as being a “Simple dev setup for ThingWorx.” Sounds perfect for our
requirements! Let’s give it a shot!&lt;/p&gt;

&lt;h2 id=&quot;experimenting&quot;&gt;Experimenting&lt;/h2&gt;

&lt;p&gt;Well… the first problem with this repo… there’s no documentation on how we
should use it…&lt;/p&gt;

&lt;p&gt;There is a folder called &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;tw&lt;/code&gt; (probably short for ThingWorx). The folder
contains a a single empty file named &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;UNPACK_TW_HERE.txt&lt;/code&gt;. Seems like the
developer probably wanted us to unpack ThingWorx there. Now… lots of questions
left. There are multiple versions of ThingWorx available for download. Which one
should we unpack there? Let’s keep exploring and see if we can figure that out.&lt;/p&gt;

&lt;p&gt;There appear to be two docker files and a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;docker-compose.yml&lt;/code&gt; file that
connects the two of them.&lt;/p&gt;

&lt;h3 id=&quot;dockerfile-1---dockerfilepostgres&quot;&gt;Dockerfile 1 - Dockerfile.postgres&lt;/h3&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Dockerfile.postgres&lt;/code&gt; a very simple file seems to be the container for our
database and does three things:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Copies the contents of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/tw/install/&lt;/code&gt; into the container&lt;/li&gt;
  &lt;li&gt;Sets the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;twpg_init.sh&lt;/code&gt; script as the entrypoint script&lt;/li&gt;
  &lt;li&gt;Creates the basic ThingWorx storage folders and appropriate permissions&lt;/li&gt;
&lt;/ol&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;FROM postgres:9.6.5

COPY /tw/install/ /twpginit/
COPY /twpg_init.sh /docker-entrypoint-initdb.d/

RUN mkdir /ThingworxPostgresqlStorage &amp;amp;&amp;amp; \
    chmod 775 /ThingworxPostgresqlStorage  &amp;amp;&amp;amp; \
    chown postgres:postgres /ThingworxPostgresqlStorage
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;dockerfile-2---dockerfiletomcat&quot;&gt;Dockerfile 2 - Dockerfile.tomcat&lt;/h3&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Dockerfile.tomcat&lt;/code&gt; is also a very small file that is going to host our Tomcat
server. It does three very similar things:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Copies the ThingWorx war file into the tomcat webapps folder&lt;/li&gt;
  &lt;li&gt;Copies the ThingWorx &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;platform-settings.json&lt;/code&gt; file into the appropriate
folder in the container&lt;/li&gt;
  &lt;li&gt;Creates the basic Thingworx storage folders and appropriate permissions&lt;/li&gt;
&lt;/ol&gt;

&lt;h3 id=&quot;whats-next&quot;&gt;What’s next?&lt;/h3&gt;

&lt;p&gt;Based on the examination of those two files I’m guessing we should be extracting
the ThingWorx Postgre installation option down into the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;tw&lt;/code&gt; folder and then
just run &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;docker compose -f docker-compose.yml up&lt;/code&gt;. Let’s see what happens!&lt;/p&gt;

&lt;h2 id=&quot;our-first-go-at-it&quot;&gt;Our first go at it&lt;/h2&gt;

&lt;p&gt;The documentation in the repo didn’t give any specifics on what version of
ThingWorx should be used, but the latest is the greatest so let’s try
downloading 9.5.&lt;/p&gt;

&lt;p&gt;I already downloaded [Rancher Desktop][https://rancherdesktop.io/] and validated
everything in Docker land is working right by running &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;docker run hello-world&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;I downloaded the zip file containing ThingWorx Postgres and extracted it to the
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;tw&lt;/code&gt; folder and then I ran &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;docker compose -f docker-compose.yml up&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;This is what I got…&lt;/p&gt;

&lt;p&gt;Exceptions! Exceptions everywhere! Haha… to be expected I suppose. It seems
we’ll likely have to build our own. See you in the next post in this series!&lt;/p&gt;

    &lt;p&gt;&lt;a href=&quot;https://tiberriver256.github.io/web%20development/thingworx-local-development-environment-pt-1/&quot;&gt;ThingWorx local development environment with Docker - Part 1&lt;/a&gt; was originally published by Micah Rairdon at &lt;a href=&quot;https://tiberriver256.github.io&quot;&gt;Tiberriver256&lt;/a&gt; on March 02, 2024.&lt;/p&gt;
  </content>
</entry>


<entry>
  <title type="html"><![CDATA[Estimate, target, plan and commit]]></title>
 <link rel="alternate" type="text/html" href="https://tiberriver256.github.io/web%20development/estimate-target-plan-commit/" />
  <id>https://tiberriver256.github.io/web%20development/estimate-target-plan-commit</id>
  <updated>2023-12-30T00:00:00-00:00</updated>
  <published>2023-12-30T00:00:00-05:00</published>
  
  <author>
    <name>Micah Rairdon</name>
    <uri>https://tiberriver256.github.io</uri>
    <email>Jun(Real Email: Micah.Rairdon [GMail])k@JunkMail.com</email>
  </author>
  <content type="html">
    &lt;p&gt;I’ve started into
“&lt;a href=&quot;https://www.amazon.com/Software-Estimation-Demystifying-Developer-Practices/dp/0735605351&quot;&gt;Software Estimation: Demystifying the Black Art&lt;/a&gt;”
by Steve McConnell, and of course… as is my style. I’m making some conjectures
about what I think software development should look like based off of reading
the first chapter. I am going to finish the book, but jotting some quick
thoughts down as I go helps me to digest the book as I go, so don’t be surprised
if I actually contradict something in the book. I haven’t read it all yet.&lt;/p&gt;

&lt;h2 id=&quot;some-definitions&quot;&gt;Some definitions&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Estimate&lt;/strong&gt; - Something rather easily and simply generated that is roughly
accurate and expected to be off within a certain range. A simple formula that
may be good enough in most cases is suggested as
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Effort = NumberOfRequirements * AverageEffortPerRequirement&lt;/code&gt;.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Target&lt;/strong&gt; - The business wants to do &lt;em&gt;something&lt;/em&gt; by &lt;em&gt;X&lt;/em&gt; date. A statement of
a desireable business outcome.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Plan&lt;/strong&gt; - This is a detailed schedule on how we plan to &lt;em&gt;hit&lt;/em&gt; said target (it
will likely include prioritization and leaving certain things out).&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Commitment&lt;/strong&gt; - When someone or a team promises to hit the target with a
specific level of quality.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;a-logical-plan&quot;&gt;A logical plan&lt;/h2&gt;

&lt;p&gt;You can expect the business to come to you with targets. We should be ready with
&lt;em&gt;good enough™&lt;/em&gt; estimates to help produce plans that we can commit to.&lt;/p&gt;

&lt;p&gt;So the sequence is:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Build a system that can be used to produce &lt;em&gt;good enough™&lt;/em&gt; estimates
on-demand&lt;/li&gt;
  &lt;li&gt;Wait for the business to bring you targets&lt;/li&gt;
  &lt;li&gt;Build plans to hit those targets using your estimates&lt;/li&gt;
  &lt;li&gt;Only build plans you’re comfortable committing to&lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&quot;the-tricky-part&quot;&gt;The tricky part&lt;/h2&gt;

&lt;p&gt;It seems to me that building a data-set to produce &lt;em&gt;good enough™&lt;/em&gt; estimates
on-demand is the tricky part. I believe Steve is going to cover this in more
detail later in the book but my guess as to some important details would be all
centered around measuring that &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;AverageEffortPerRequirement&lt;/code&gt; and that the keys
to getting accurate measurements there are going to be around when can we say
something started and when can we say something is finished?&lt;/p&gt;

    &lt;p&gt;&lt;a href=&quot;https://tiberriver256.github.io/web%20development/estimate-target-plan-commit/&quot;&gt;Estimate, target, plan and commit&lt;/a&gt; was originally published by Micah Rairdon at &lt;a href=&quot;https://tiberriver256.github.io&quot;&gt;Tiberriver256&lt;/a&gt; on December 30, 2023.&lt;/p&gt;
  </content>
</entry>


<entry>
  <title type="html"><![CDATA[How to run multiple versions of React side-by-side using Single Spa]]></title>
 <link rel="alternate" type="text/html" href="https://tiberriver256.github.io/web%20development/how-to-run-multiple-react-versions-using-single-spa/" />
  <id>https://tiberriver256.github.io/web%20development/how-to-run-multiple-react-versions-using-single-spa</id>
  <updated>2023-10-21T00:00:00-00:00</updated>
  <published>2023-10-21T00:00:00-04:00</published>
  
  <author>
    <name>Micah Rairdon</name>
    <uri>https://tiberriver256.github.io</uri>
    <email>Jun(Real Email: Micah.Rairdon [GMail])k@JunkMail.com</email>
  </author>
  <content type="html">
    &lt;p&gt;This seems like it should be easy right?
&lt;a href=&quot;https://single-spa.js.org/&quot;&gt;Single-spa&lt;/a&gt; is a micro-frontend framework designed
to handle running multiple SPA frameworks side-by-side. It’s pretty
straightforward in all the other frameworks… but not so in React. Let’s dig
into why that is.&lt;/p&gt;

&lt;h2 id=&quot;whats-the-problem&quot;&gt;What’s the problem?&lt;/h2&gt;

&lt;p&gt;In order to use React you always have to install two packages:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;react&lt;/code&gt; - The main runtime for React&lt;/li&gt;
  &lt;li&gt;Some other package that handles the rendering (i.e.,
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;react-dom&lt;/code&gt;/&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;react-canvas&lt;/code&gt;/&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;react-native&lt;/code&gt;/&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;react-pdf&lt;/code&gt;/etc.)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This allows developers to plug multiple renderers into the React runtime and
magically grants everyone who knows React the ability to write JSX code that
works in a bunch of random places.&lt;/p&gt;

&lt;p&gt;Sounds magical! Why is this a problem again?&lt;/p&gt;

&lt;p&gt;The problem only comes when we’re trying to work with single-spa. Let’s setup a
quick project to show how this works:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;I create a root config&lt;/li&gt;
  &lt;li&gt;I create a React project running React 17, setting up my webpack externals to
look like: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;{ react: &apos;react-17&apos;, [&apos;react-dom&apos;]: &apos;react-dom-17&apos; }&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;I create another React project running React 18, setting up my webpack
externals to look like &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;{ react: &apos;react-18&apos;, [&apos;react-dom&apos;]: &apos;react-dom-18 }&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;I add import maps for &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;react-17&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;react-dom-17&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;react-18&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;react-dom-18&lt;/code&gt;
all pointing to their various &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;https://cdn.jsdelivr.net/npm/&lt;/code&gt; urls.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;We boot up the site and we get a nice fat error message:
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Unable to resolve bare specifier &apos;react&apos; from https://cdn.jsdelivr.net/npm/react-dom@17.0.2/umd/react-dom.development.js&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;The reason we get this error message is that &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;react-dom&lt;/code&gt; was bundled with a
dependency on &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;react&lt;/code&gt;. So, even though we have our application code swapping out
every &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;react&lt;/code&gt; import with either a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;react-17&lt;/code&gt; or a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;react-18&lt;/code&gt; import and we’re
doing the same for where our application code references &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;react-dom&lt;/code&gt; we can’t do
anything about the code inside the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;react-dom&lt;/code&gt; library that is looking for a
module named &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;react-dom&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;It’s a problem unique to React because of it’s two package delivery system. If
they shipped it as one package like Angular/Vue/etc. then we wouldn’t be having
this problem.&lt;/p&gt;

&lt;h2 id=&quot;the-solution&quot;&gt;The solution&lt;/h2&gt;

&lt;p&gt;We’re going to re-bundle up our own distribution of the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;react-dom&lt;/code&gt; libraries.
Running it through webpack first. That way we can tell &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;react-dom-17&lt;/code&gt; to import
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;react-17&lt;/code&gt; and we can tell &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;react-dom-18&lt;/code&gt; to import &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;react-18&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;What’s the easiest way to do that?&lt;/p&gt;

&lt;p&gt;Let’s use &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;npx create-single-spa&lt;/code&gt; to spin out two &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;utility modules&lt;/code&gt;:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;One to re-export &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;react-dom@17&lt;/code&gt; and have it’s webpack externals set to:
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;{ react: &apos;react-17&apos; }&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;One to re-export &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;react-dom@18&lt;/code&gt; and have it’s webpack externals set to:
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;{ react: &apos;react-18&apos; }&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The only file in both projects will look like this:&lt;/p&gt;

&lt;div class=&quot;language-js highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;ReactDOM&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;react-dom&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;default&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;ReactDOM&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;react-dom&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Now in our import maps we reference our own utility module versions of react-dom
instead of the ones hosted on cdn.jsdelivr.net and things just work!&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_800,q_auto,f_auto/https://tiberriver256.github.io/images/how-to-run-multiple-react-versions-using-single-spa/multiple-react-versions-yay.png&quot; srcset=&quot;         https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_320,q_auto,f_auto/https://tiberriver256.github.io/images/how-to-run-multiple-react-versions-using-single-spa/multiple-react-versions-yay.png 320w,         https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_640,q_auto,f_auto/https://tiberriver256.github.io/images/how-to-run-multiple-react-versions-using-single-spa/multiple-react-versions-yay.png 640w,         https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_960,q_auto,f_auto/https://tiberriver256.github.io/images/how-to-run-multiple-react-versions-using-single-spa/multiple-react-versions-yay.png 960w,         https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_1280,q_auto,f_auto/https://tiberriver256.github.io/images/how-to-run-multiple-react-versions-using-single-spa/multiple-react-versions-yay.png 1280w,         https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_1600,q_auto,f_auto/https://tiberriver256.github.io/images/how-to-run-multiple-react-versions-using-single-spa/multiple-react-versions-yay.png 1600w     &quot; sizes=&quot;(min-width: 50rem) 50rem, 90vw&quot; alt=&quot;&quot; loading=&quot;lazy&quot; /&gt;&lt;/p&gt;

&lt;p&gt;If you want to check out the working code,
&lt;a href=&quot;https://github.com/Tiberriver256/multiple-react-versions-single-spa&quot;&gt;I’ve got a sample repository on Github&lt;/a&gt;.&lt;/p&gt;

    &lt;p&gt;&lt;a href=&quot;https://tiberriver256.github.io/web%20development/how-to-run-multiple-react-versions-using-single-spa/&quot;&gt;How to run multiple versions of React side-by-side using Single Spa&lt;/a&gt; was originally published by Micah Rairdon at &lt;a href=&quot;https://tiberriver256.github.io&quot;&gt;Tiberriver256&lt;/a&gt; on October 21, 2023.&lt;/p&gt;
  </content>
</entry>


<entry>
  <title type="html"><![CDATA[Stages of ramp up on software development projects]]></title>
 <link rel="alternate" type="text/html" href="https://tiberriver256.github.io/programming/stages-of-project-ramp-up/" />
  <id>https://tiberriver256.github.io/programming/stages-of-project-ramp-up</id>
  <updated>2023-06-29T00:00:00-00:00</updated>
  <published>2023-06-29T00:00:00-04:00</published>
  
  <author>
    <name>Micah Rairdon</name>
    <uri>https://tiberriver256.github.io</uri>
    <email>Jun(Real Email: Micah.Rairdon [GMail])k@JunkMail.com</email>
  </author>
  <content type="html">
    &lt;p&gt;This is a list I’m going to be maintaining on different ideas and thougths
around ramping up on new software projects.&lt;/p&gt;

&lt;h2 id=&quot;grasp-of-existing-problems&quot;&gt;Grasp of existing problems&lt;/h2&gt;

&lt;p&gt;One component of ramping up on a new project is understanding existing problems.
You’ll never find a project without problems. These problems come in all shapes
and sizes. They might be code quality issues, they might be slow running tests,
they might be style issues on the front-end, they might be architectural issues,
whatever they are, you are sure to find problems in any project that’s been
around longer than a day.&lt;/p&gt;

&lt;p&gt;I find a lot of newer developers are exhausted by this fact or feel it is a bad
thing to find problems. I believe it’s the opposite. It’s a sign you’re starting
to get a good grasp of the project. What’s important, is to not let the problems
overwhelm you and to surface those problems to the rest of the team.&lt;/p&gt;

&lt;p&gt;As you ramp up, you’ll typically find yourself in one of these three stages. The
final stage is where you want to be at.&lt;/p&gt;

&lt;h3 id=&quot;finding-and-verifying-problems&quot;&gt;Finding and verifying problems&lt;/h3&gt;

&lt;p&gt;Ramping up on a new project, you’ll find yourself getting aggravated by things
in the code or things in the project you’re working on.&lt;/p&gt;

&lt;p&gt;As you find problems, you’ll be:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;strong&gt;Verifying it’s a problem&lt;/strong&gt; - Lots of times, it’s just a misunderstanding,
or it’s just something you weren’t aware of&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Document the problem&lt;/strong&gt; - Jot notes about the problem down somewhere&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Surface the problem to the team&lt;/strong&gt; - When you’re new to the team, it’s
essential that you discuss problems with the larger team. Raising awareness
is key even if nothing can be done about those problems.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;It’s important to note, at the beginning you will rarely know how to solve these
problems. That’s okay.&lt;/p&gt;

&lt;h3 id=&quot;finding-solutions-to-those-problems&quot;&gt;Finding solutions to those problems&lt;/h3&gt;

&lt;p&gt;At some point, you’ll have a firm enough grasp on the project to start seeing
solutions to the problems you’ve been identifying.&lt;/p&gt;

&lt;p&gt;This is very exciting! For the first time, you’re seeing a path to fixing the
problems that have been bugging you over the past weeks or months.&lt;/p&gt;

&lt;p&gt;As you discover solutions, you should:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;strong&gt;Verify the solution with a more senior team member&lt;/strong&gt; - If it’s a valid
solution, awesome! If not, you probably will learn some key features of the
project you’re working on. Both are very valuable.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Document the solution&lt;/strong&gt; - Jot down some notes about the potential solution.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Share the solution with the team&lt;/strong&gt; - Discuss your potential solution with
the broader team.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Important things to remember:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;There are always multiple ‘solutions’ to the same problem&lt;/strong&gt; - You might
solve the problem with documentation. Someone else might suggest changing the
code to prevent having to write documentation. Both are valid solutions worth
considering.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Don’t expect your solution to get queued up in the backlog&lt;/strong&gt; - There are
multiple solutions to a single problem. There are multiple problems. We will
never fix all the problems. Team members who have been on this project longer
likely understand the business context a bit better and will prioritize things
in a way that may not make sense to you at this stage. The important thing to
do here is to try and understand where your solution might fall on a
prioritized list and &lt;strong&gt;why&lt;/strong&gt; it was placed in that priority.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;prioritizing-solutions-based-on-business-goals-and-business-value&quot;&gt;Prioritizing solutions based on business goals and business value&lt;/h3&gt;

&lt;p&gt;As you continue identifying problems and solutions, eventually, you’ll be able
to prioritize them based on your understanding roughly of business goals and how
much business value implementing that solution will add.&lt;/p&gt;

&lt;p&gt;This is where you start to become an invaluable partner for the business. If you
were to visualize your list of solutions in a graph it might look like this:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_800,q_auto,f_auto/https://tiberriver256.github.io/images/stages-of-project-ramp-up/prioritizing-solutions.png&quot; srcset=&quot;         https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_320,q_auto,f_auto/https://tiberriver256.github.io/images/stages-of-project-ramp-up/prioritizing-solutions.png 320w,         https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_640,q_auto,f_auto/https://tiberriver256.github.io/images/stages-of-project-ramp-up/prioritizing-solutions.png 640w,         https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_960,q_auto,f_auto/https://tiberriver256.github.io/images/stages-of-project-ramp-up/prioritizing-solutions.png 960w,         https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_1280,q_auto,f_auto/https://tiberriver256.github.io/images/stages-of-project-ramp-up/prioritizing-solutions.png 1280w,         https://res.cloudinary.com/dhff6zdnc/image/fetch/c_limit,w_1600,q_auto,f_auto/https://tiberriver256.github.io/images/stages-of-project-ramp-up/prioritizing-solutions.png 1600w     &quot; sizes=&quot;(min-width: 50rem) 50rem, 90vw&quot; alt=&quot;&quot; loading=&quot;lazy&quot; /&gt;&lt;/p&gt;

&lt;p&gt;You’ll always want to be recommending the business support work on the solution
that you’ve identified as the highest value for the least effort. When you can
&lt;strong&gt;rank&lt;/strong&gt; solutions like this and &lt;strong&gt;articulate&lt;/strong&gt; that value back to the business
you’re fully ramped up.&lt;/p&gt;

    &lt;p&gt;&lt;a href=&quot;https://tiberriver256.github.io/programming/stages-of-project-ramp-up/&quot;&gt;Stages of ramp up on software development projects&lt;/a&gt; was originally published by Micah Rairdon at &lt;a href=&quot;https://tiberriver256.github.io&quot;&gt;Tiberriver256&lt;/a&gt; on June 29, 2023.&lt;/p&gt;
  </content>
</entry>

</feed>
