AI https://brookemahoney.com/ en Matt Pocock's Wayfinder Skill Notes https://brookemahoney.com/blog/matt-pococks-wayfinder-skill-notes <span class="field field--name-title field--type-string field--label-hidden">Matt Pocock's Wayfinder Skill Notes</span> <div class="clearfix text-formatted field field--name-body field--type-text-with-summary field--label-hidden field__items"> <div class="field__item"><h2>Wayfinder Workflow</h2><ul><li>Use <code>/wayfinder &lt;prompt&gt;</code> to create a map with decision issues.</li><li>Wayfinder will ask you choose a destination: a buildable spec or an actual product.</li><li>After wayfinder has made the initial map, work through issues one at a time using <code>/wayfinder &lt;ticket number&gt;</code> until all decisions are made. Sometimes new issues will be created while working on other issues.</li><li>Wayfinder will utilize other skills, such as /grill-with-docs, /prototype, and /research.<ul><li>The map specifies when each of those other skills are to be used</li></ul></li><li>The map also includes a list of 4 types of decision tickets:<ul><li>research</li><li>prototype</li><li>grilling</li><li>task (things the agent can't quite do itself)</li></ul></li><li>Once the map is made, then you can use <code>/to-spec</code> to turn the map into a spec.</li><li>Then use <code>/to-tickets</code> to create implementation tickets from the spec.</li><li>Use <code>/implement</code> to implement one ticket at at time</li><li>Use <code>/implement-spec</code> to have agents implement the whole spec AFK</li><li>Use <code>/code-review</code> afterward</li><li>Use <code>/retro</code> afterward to have the agent document what could have went better in the session.</li></ul><h2>Other mattpocock/skills that are helpful</h2><ul><li>/handoff: Compact the current conversation into a handoff document so another agent can continue the work.</li><li>/teach: Teach the user a new skill or concept over multiple sessions, using the current directory as a stateful teaching workspace.</li><li>/wait-what: Fire this the moment a message doesn't land.</li><li>/to-questionnaire: Turn a decision you can't answer alone into a Markdown questionnaire for the one person who can, filled in async, or together over a meeting. It grills you about the send (who it's for, what you need back), not the subject.</li></ul></div> </div> <span class="field field--name-uid field--type-entity-reference field--label-hidden"><span>brooke</span></span> <span class="field field--name-created field--type-created field--label-hidden"><time datetime="2026-11-02T12:01:53-08:00" title="Monday, 2 November 2026 - 12:01" class="datetime">Mon, 2 Nov 2026 - 12:01</time> </span> <div class="field field--name-field-tags field--type-entity-reference field--label-above"> <div class="field__label">Tags</div> <div class="field__items"> <div class="field__item"><a href="https://brookemahoney.com/tags/ai" hreflang="en">AI</a></div> </div> </div> Mon, 02 Nov 2026 20:01:53 +0000 brooke 181 at https://brookemahoney.com Contrib Drupal Module Development https://brookemahoney.com/blog/contrib-drupal-module-development <span class="field field--name-title field--type-string field--label-hidden">Contrib Drupal Module Development</span> <div class="clearfix text-formatted field field--name-body field--type-text-with-summary field--label-hidden field__items"> <div class="field__item"><p>One way to set up local Development for a contrib module using e0ipso's AI suite. See <a href="https://www.youtube.com/watch?v=q0R9e7KhBsg">Agentic Coding Harness for Drupal&nbsp;</a></p><ul><li>opt out of T3 telemetry by adding the following to <code>~/.ddev/.env</code><ul><li><code>T3CODE_TELEMETRY_ENABLED=false</code></li></ul></li><li>Install <a href="https://github.com/e0ipso/self-review">https://github.com/e0ipso/self-review</a></li><li>Then:</li></ul><pre><code class="language-plaintext">BDEV_CURRENT_SITE="config_suite" cd ~/Sites git clone git@git.drupal.org:project/$BDEV_CURRENT_SITE.git cd $BDEV_CURRENT_SITE cp ~/projects/.gitignore-ddev .gitignore ddev config --project-type=drupal11 --docroot=web orb ddev add-on get ddev/ddev-drupal-contrib ddev add-on get hanoii/ddev-drupal-contrib-extras ddev start ddev poser ddev symlink-project ddev config --update ddev restart ddev drush si -y ddev drush en $BDEV_CURRENT_SITE -y open $(ddev drush uli) ddev exec "cd web/core &amp;&amp; yarn install" # Temporary workaround on Mac because e0ipso's plugin only works for Linux for importing local OpenCode config mkdir -p $HOME/Sites/$BDEV_CURRENT_SITE/.ddev/homeadditions/.local/share ln -s $HOME/.local/share/opencode $HOME/Sites/$BDEV_CURRENT_SITE/.ddev/homeadditions/.local/share/opencode ddev add-on get e0ipso/ddev-playwright-cli ddev add-on get e0ipso/ddev-assistant-opencode ddev add-on get e0ipso/ddev-assistant-t3 ddev restart # Allows running playwright-cli from inside the container # without having to use the --config option # Symlinks .claude playwright skills to .agents folder for other harnesses. ddev ssh rm .playwright/cli.config.json ln -s "$(pwd)/.ddev/playwright-cli/cli.config.json" .playwright/cli.config.json mkdir -p .agents/skills ln -s "$(pwd)/.claude/skills/playwright-cli" .agents/skills/playwright-cli exit npx kenkeep init --harnesses opencode npx kenkeep doctor npx kenkeep pack import e0ipso/kenkeep-pack-drupal npx strikethroo init --harnesses opencode npx skills add e0ipso/strikethroo </code></pre><p>Strikethroo workflow: <a href="https://strikethroo.canpicasoft.com/workflow.html">https://strikethroo.canpicasoft.com/workflow.html</a> Kenkeep docs: <a href="https://kenkeep.canpicasoft.com/">https://kenkeep.canpicasoft.com/</a></p><ul><li><code>ddev t3 start</code></li><li><code>npx strikethroo serve</code></li><li><code>/st-create-plan display a welcome message to new users</code></li><li><code>/st-refine-plan 1, see review.xml</code></li><li><code>/st-execute-blueprint 1</code></li><li><code>/st-code-review 1, line 95 in example.module has a typo: "piece" should be "peace"</code></li></ul></div> </div> <span class="field field--name-uid field--type-entity-reference field--label-hidden"><span>brooke</span></span> <span class="field field--name-created field--type-created field--label-hidden"><time datetime="2026-11-02T11:58:32-08:00" title="Monday, 2 November 2026 - 11:58" class="datetime">Mon, 2 Nov 2026 - 11:58</time> </span> <div class="field field--name-field-tags field--type-entity-reference field--label-above"> <div class="field__label">Tags</div> <div class="field__items"> <div class="field__item"><a href="https://brookemahoney.com/tags/ai" hreflang="en">AI</a></div> <div class="field__item"><a href="https://brookemahoney.com/tags/drupal" hreflang="en">Drupal</a></div> <div class="field__item"><a href="https://brookemahoney.com/tags/ddev" hreflang="en">DDEV</a></div> </div> </div> Mon, 02 Nov 2026 19:58:32 +0000 brooke 179 at https://brookemahoney.com Notes for: Site Analysis and AI's Strengths and Limits, By David Hobbs https://brookemahoney.com/blog/notes-site-analysis-and-ais-strengths-and-limits-david-hobbs <span class="field field--name-title field--type-string field--label-hidden">Notes for: Site Analysis and AI's Strengths and Limits, By David Hobbs</span> <div class="clearfix text-formatted field field--name-body field--type-text-with-summary field--label-hidden field__items"> <div class="field__item"><p>Just copying over some notes from a great video, in case it ever goes away:</p><p>&nbsp;</p><h2><a href="https://www.youtube.com/watch?v=5N1-jrcCgLQ">Site Analysis and AI's Strengths and Limits</a></h2><p>By David Hobbs</p><h3>Progression of content analysis</h3><table class="table-style-align-center"><thead><tr><th>#</th><th>Type</th><th>Example</th><th>Automation at scale?</th><th>Use Al?</th><th>Quantitative or<br><br>Qualitative?</th></tr></thead><tbody><tr><td>1</td><td>Traditional Automation</td><td>Crawl with [[Screaming Frog]]</td><td>Yes</td><td>No</td><td>Quantitative</td></tr><tr><td>2</td><td>Manual</td><td>Line-by-line qualitative audit</td><td>No</td><td>No</td><td>Qualitative</td></tr><tr><td>3</td><td>One-off Al</td><td>Ask ChatGPT a question about a site</td><td>No</td><td>Yes, one time</td><td>Qualitative</td></tr><tr><td>4</td><td>LLM → Deterministic</td><td>Have Claude write a script to run reading level analysis on every page</td><td>Partial</td><td>Yes, one time</td><td>Quantitative</td></tr><tr><td>5</td><td>Scaled Al</td><td>Pass thousands of pages to low power LLM to categorize</td><td>Yes</td><td>Yes, every page</td><td>Qualitative</td></tr><tr><td>Note: Al allows us to do some qualitative analysis that is NOT manual.</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr></tbody></table><h2>Advantages of particular types of content analysis</h2><table class="table-style-align-center"><thead><tr><th>&nbsp;</th><th>&nbsp;</th><th>&nbsp;</th></tr></thead><tbody><tr><td>#</td><td>Type</td><td>Advantages</td></tr><tr><td>1</td><td>Traditional Automation</td><td>Easy to get basic information on many pages.</td></tr><tr><td>2</td><td>Manual</td><td>The approach everyone knows, and it feels like things are being done in a high quality manner (even before Al this was often the feeling).</td></tr><tr><td>3</td><td>One-off Al</td><td>Easy to get analysis that might be outside your expertise for a subset of pages.</td></tr><tr><td>4</td><td>LLM → Deterministic</td><td>Only use Al once, and then have all the advantages of traditional automation.</td></tr><tr><td>5</td><td>Scaled Al</td><td>Get qualitative information over a large swath of content (possibly impossible otherwise).</td></tr></tbody></table><h2>Disadvantages of the manual approach</h2><ul><li>Almost certainly leads to restricting the number of pages that are analyzed.</li><li>Very difficult to iterate or change course (such as if you decide to change the definition of audience)</li><li>Very difficult to merge analysis from multiple people.</li><li>Very difficult to be consistent.</li><li>Difficult to track over time.</li><li>Likely to encourage team to take action on content while analyzing it.</li></ul><h2>Disadvantages of one-off Al</h2><ul><li>Generally low transparency (How did it come up with the answer? Did it look at any pages? Did it consider your existing analysis?)</li><li>Related to the above, it can definitely hallucinate or over-extrapolate.</li><li>Generally requires powerful LLM</li><li>Can short circuit critical thinking of the analyst</li><li>NOT for pervasive analysis across a digital presence</li></ul><p>Tip: If you do one-off chatbot analysis, explicitly ask how it came up with the answer and its sources. ie., "Explain to me in detail how you determined this. What sources did you use? What did you derive from each source? What confidence do you have in this answer?"</p><h2>Disadvantages of LLM → Deterministic</h2><ul><li>Depending on skillset, can be difficult to evaluate whether the script is doing what you want it to do</li><li>Can be difficult to clearly specify the requirements</li><li>One-off efforts to write scripts can be difficult to reconcile together into a coherent whole</li></ul><h2>Keep in mind non-LLM automated analysis options</h2><ul><li>Near-text duplicate analysis</li><li>Graph database analysis (analysis of linkages between content / sections)</li><li>Scraping out information and component analysis</li><li>PDF analysis</li><li>Merge information (for instance from Google Analytics)</li><li>Reading level analysis</li><li>Charting</li><li>HTML structure analysis</li><li>Over-time analysis</li><li>Logo analysis</li><li>Formulas, maps, and rules</li><li>Technology analysis (such as with wappalyzer)</li></ul><p>Tip: Consider converting problems to deterministic ones with AI</p><h2>Disadvantage of Scaled Al</h2><ul><li>Difficult to develop on your own</li><li>Heavy processing is in the backend (not in chatbot)</li></ul><p>TIp: Clearly differentiate between what's EASY to analyze and what's IMPORTANT to analyze.</p><p>Note: Far too often teams just revert to what's simple to analyze when that will not help them achieve their real business goals. For example, you can't analyze for consolidation if you only look at a small subset of pages because then you would be able to use a spreadsheet.</p><h2>Summary</h2><ul><li>There is lots of automation that can be applied outside of LLMs.</li><li>For some questions, you really do need to look at the entire digital presence.</li><li>Al can help you accomplish qualitative assessments that required manual intervention before.<br>There are a variety of ways of using Al for site analysis.</li></ul><p>Tips</p><ol><li>Focus on refining the QUESTIONS you need answered.</li><li>If you do one-off chatbot analysis, explicitly ask how it came up with the answer in its sources.</li><li>Consider converting problems to deterministic ones with Al.</li><li>Clearly differentiate between what's EASY to analyze and what's IMPORTANT to analyze.</li></ol></div> </div> <span class="field field--name-uid field--type-entity-reference field--label-hidden"><span>brooke</span></span> <span class="field field--name-created field--type-created field--label-hidden"><time datetime="2026-11-02T11:04:39-08:00" title="Monday, 2 November 2026 - 11:04" class="datetime">Mon, 2 Nov 2026 - 11:04</time> </span> <div class="field field--name-field-tags field--type-entity-reference field--label-above"> <div class="field__label">Tags</div> <div class="field__items"> <div class="field__item"><a href="https://brookemahoney.com/tags/ai" hreflang="en">AI</a></div> <div class="field__item"><a href="https://brookemahoney.com/tags/drupal" hreflang="en">Drupal</a></div> </div> </div> Mon, 02 Nov 2026 19:04:39 +0000 brooke 176 at https://brookemahoney.com AI Ethics https://brookemahoney.com/blog/ai-ethics <span class="field field--name-title field--type-string field--label-hidden">AI Ethics</span> <div class="clearfix text-formatted field field--name-body field--type-text-with-summary field--label-hidden field__items"> <div class="field__item"><h2>The Environment</h2><p>From <a href="https://www.acquia.com/blog/when-clock-ticks-closer-ai-ethics-and-drupals-responsibility-public-good">When the Clock Ticks Closer: AI, Ethics, and Drupal's Responsibility to the Public Good April 1, 2026</a></p><ul><li>Data centers are multiplying across the globe drawing enormous quantities of power and water</li><li>from communities already under resource strain.</li><li>The raw materials required for AI hardware involve<ul><li>environmentally damaging extraction processes</li><li>energy-intensive manufacturing</li><li>growing mountains of electronic waste</li></ul></li></ul><p>"This is not an abstraction for the Drupal community. As an ecosystem that powers a substantial share of the world's web infrastructure - from small nonprofits to national governments - the collective energy footprint of Drupal-based sites and the hosting decisions behind them carries real weight. Organizations within the community have begun pushing for greener hosting choices, leaner architectures, and more deliberate thinking about when AI features add genuine value versus when they simply add compute."</p></div> </div> <span class="field field--name-uid field--type-entity-reference field--label-hidden"><span>brooke</span></span> <span class="field field--name-created field--type-created field--label-hidden"><time datetime="2026-11-02T10:58:09-08:00" title="Monday, 2 November 2026 - 10:58" class="datetime">Mon, 2 Nov 2026 - 10:58</time> </span> <div class="field field--name-field-tags field--type-entity-reference field--label-above"> <div class="field__label">Tags</div> <div class="field__items"> <div class="field__item"><a href="https://brookemahoney.com/tags/ai" hreflang="en">AI</a></div> <div class="field__item"><a href="https://brookemahoney.com/tags/drupal" hreflang="en">Drupal</a></div> </div> </div> Mon, 02 Nov 2026 18:58:09 +0000 brooke 174 at https://brookemahoney.com Distillation of "LIVE: Uncle Bob on Software Fundamentals in the Age of AI" https://brookemahoney.com/blog/distillation-live-uncle-bob-software-fundamentals-age-ai <span class="field field--name-title field--type-string field--label-hidden">Distillation of "LIVE: Uncle Bob on Software Fundamentals in the Age of AI"</span> <div class="clearfix text-formatted field field--name-body field--type-text-with-summary field--label-hidden field__items"> <div class="field__item"><p>This page has my notes about the youtube video that Matt Pocock produced called "LIVE: Uncle Bob on Software Fundamentals in the Age of AI". The video can be found here: <a class="external-link" href="https://www.youtube.com/watch?v=zcLPGC-tvgk" target="_blank" rel="noopener nofollow">https://www.youtube.com/watch?v=zcLPGC-tvgk</a></p><h2 data-heading="Main Takeaways">Main Takeaways</h2><ul><li data-list-item-id="eb2f9bc07ff740f207b7b2064fe8554b7">Bob describes how he has agents with specific jobs that handoff to each other in a workflow.</li><li data-list-item-id="ee00bb11d27b903a1f96f90eac84ffded">Bob uses mutation testing<ul><li data-list-item-id="e5229d39139a05cbb27405fa411be5470">ie. change + to -, === to !=, false to true, etc, and the test suite should fail.</li></ul></li><li data-list-item-id="ee96ccfeabb8bc1fc6e70f05efe385714">A main concept is: Agents fumble with long context, just like humans.<ul><li data-list-item-id="e6b22a454e011deaad5bdd23cf3634032">We have limited short term memory.</li><li data-list-item-id="e02e04c6ea3689459d80a6ef378ac75de">When we run out of short term memory, our work gets messy.</li><li data-list-item-id="e88c8a8170e50ce0762385a1d8ee2846a">Agents have longer and perfect short-term memory.</li><li data-list-item-id="eb445780872799872b1d847855791b2f5">Humans don't read all of what agents expect them to, and agents don't read all of what humans expect them to.</li><li data-list-item-id="ed86aa48b539eff31c02879d9e5f158fb">19:31 "when you focus the agents down to a single task, you're keeping the context window under control. The lost in the middle problem becomes much less of a problem."</li><li data-list-item-id="eb4428b2d5c2b287f6b641539beebf622">29:34 "if you compartmentalize nicely works pretty well just like a human."</li></ul></li><li data-list-item-id="e13d2fef9e8c4c638c783763ab615c3b6">Bob uses an agile mindset when working with agents (instead of a waterfall-like approach with very rigid specs and planning beforehand).<ul><li data-list-item-id="eaa40844dca35ca3f27ea0d976a725612">36:49 "Wait a minute. All this heavy upfront planning makes a mess of everything cuz what comes out at the end doesn't look anything like the plan and never has."</li></ul></li><li data-list-item-id="eeb9202327f33ae1043e42cf4ed9a6bea">Bob uses TDD when he codes but allows agents to write a function first and the test second.<ul><li data-list-item-id="ea0561ded3b6e53f5adf4ece252c54f6d">More details at 34:37 - 35:39</li></ul></li></ul><h2 data-heading="Bob's Agents">Bob's Agents</h2><h3 data-heading="Specifier Agents: Gherkin Specifier Agent and QA Procedure Specifier Agent">Specifier Agents: Gherkin Specifier Agent and QA Procedure Specifier Agent</h3><p>These agents' job is to take a human-written document and turn it into another type of document.</p><ul><li data-list-item-id="efaefedf6e8b966342b7247fa4c414ff0">Gherkin Specifier Agent: Creates a high level acceptance test using Gherkin</li><li data-list-item-id="e13abbc74a59333b366949e80ecadffd8">QA Procedure Agent: Creates "essentially a system test"<ul><li data-list-item-id="e21887cc5da0ec65f16af18622ef0e47c">Example of QA Procedure Agent from transcript:<ul><li data-list-item-id="edc420a2c162e87052c84ccfc487485c7">20:49 "I have them write it from a human's point of view:<ul><li data-list-item-id="eecc26aea619797804a70067d4da5879e">You are a human.</li><li data-list-item-id="e7816e0700ae8de38a79acb21e80b1330">You are operating this system at the UI.</li><li data-list-item-id="ed60be59b3103e6e2a465f3bfb60c2588">You must prove that the system works."</li></ul></li></ul></li></ul></li></ul><h3 data-heading="Coder / Implementer">Coder / Implementer</h3><p>This agent's job is to</p><ul><li data-list-item-id="e20463f7f8738c10a34c85baa4cd65175">write unit tests</li><li data-list-item-id="e561dea896b762abb116c626c94ee9c04">write the code</li><li data-list-item-id="ec385a91a9f29bebef9daad7036bb563a">get the Gherkin working</li></ul><h3 data-heading="Cleaner">Cleaner</h3><p>This agent's job is to</p><ul><li data-list-item-id="e66d7898e4b991c8ee56a886ae82b1f8f">Perform general code review (Change Risk Anti-Patterns)</li><li data-list-item-id="ef1e8d9af79b56e993a4079bb6a38767c">then clean up the mess in the code that the coder/implementer inevitably left</li></ul><h3 data-heading="Hardener">Hardener</h3><p>This agent's job is to</p><ul><li data-list-item-id="e11dba0b810993139777d67f86518865a">Run mutation testing</li></ul><h3 data-heading="QA Agent">QA Agent</h3><p>This agent's job is to</p><ul><li data-list-item-id="edf28481cb0c75c5d31b9424f79eb0951">Turn "the written QA document into an executable script that manipulates the system and comes up with a deterministic result"</li></ul><h2 data-heading="CRAP (Change Risk Anti-Patterns)">CRAP (Change Risk Anti-Patterns)</h2><p>CRAP (Change Risk Anti-Patterns) analysis is a metric used to identify code that is highly complex and lacks adequate test coverage, making it risky and difficult to maintain.</p><ul><li data-list-item-id="ec7e6b2dc5e8a3bce26379bf9c96a2b8a">43:44 Regarding CRAP, he has his agents write him his own crap tools for each language he writes in (Closure, Java, Go)</li><li data-list-item-id="e3da90dfcef84c3fa43aeb30b788bc62f">43:50 What I tell people is don't download those. I wrote them for me. What you should do is point your agents at them, have the agents look at them, and then build one for you.</li></ul></div> </div> <span class="field field--name-uid field--type-entity-reference field--label-hidden"><span>brooke</span></span> <span class="field field--name-created field--type-created field--label-hidden"><time datetime="2026-10-11T09:20:13-07:00" title="Sunday, 11 October 2026 - 09:20" class="datetime">Sun, 11 Oct 2026 - 09:20</time> </span> <div class="field field--name-field-tags field--type-entity-reference field--label-above"> <div class="field__label">Tags</div> <div class="field__items"> <div class="field__item"><a href="https://brookemahoney.com/tags/ai" hreflang="en">AI</a></div> </div> </div> Sun, 11 Oct 2026 16:20:13 +0000 brooke 151 at https://brookemahoney.com