<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: CodeMonkeyG</title>
    <description>The latest articles on DEV Community by CodeMonkeyG (@codemonkeyg).</description>
    <link>https://dev.to/codemonkeyg</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4138363%2Fb902969e-a9f4-446f-9b6c-8c237bf4b3eb.jpg</url>
      <title>DEV Community: CodeMonkeyG</title>
      <link>https://dev.to/codemonkeyg</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/codemonkeyg"/>
    <language>en</language>
    <item>
      <title>Did the AI Bubble Just Pop?</title>
      <dc:creator>CodeMonkeyG</dc:creator>
      <pubDate>Wed, 28 Oct 2026 00:00:00 +0000</pubDate>
      <link>https://dev.to/codemonkeyg/did-the-ai-bubble-just-pop-27e7</link>
      <guid>https://dev.to/codemonkeyg/did-the-ai-bubble-just-pop-27e7</guid>
      <description>&lt;p&gt;For a few weeks, the AI trade looked unstoppable. SpaceX jumped 7% in a day, tech executives demanded another hundred billion dollars for data centers, and Nvidia kept describing AI chip demand as insatiable. Then the market turned. CoreWeave, the former crypto mining company that became a major GPU rental business, fell to about a third of its value from the start of the month.&lt;/p&gt;

&lt;p&gt;The financing behind the boom is even stranger. Nvidia invests in companies that buy Nvidia GPUs. Those companies borrow more money using the chips as collateral, then rent the hardware back into the same ecosystem. Wall Street calls this circular financing. In plainer English, it is a circle jerk with billions of dollars in debt. Everyone gets to report growth as long as nobody asks where the actual outside revenue is coming from.&lt;/p&gt;

&lt;p&gt;That is the problem facing the so-called neocloud companies. They are built around AI workloads, expensive hardware, and borrowed money. Elon Musk reportedly warned that more than 200 of them could fail. CoreWeave's reported $52 billion debt, combined with interest rates near 15%, makes that warning feel less like internet drama and more like basic arithmetic.&lt;/p&gt;

&lt;p&gt;Anthropic's proposed public offering adds another layer of absurdity. The company is reportedly seeking a $100 billion valuation while carrying enormous losses and depending on infrastructure providers to keep supplying its computing power. Its filing also discusses models that may improve themselves faster than the company can fully understand. That is a remarkable risk disclosure for a company asking investors to believe in unlimited growth.&lt;/p&gt;

&lt;p&gt;The technology is real, but that does not make every company built around it a good business. The internet was real too, and plenty of dot-com companies still deserved to disappear. AI developers are already benefiting from cheaper tokens, better open models, and a brutal fight between providers. A market correction could make hardware cheaper and force investors to care about customers instead of spending plans.&lt;/p&gt;

&lt;p&gt;I would like to see the bubble pop, or at least lose enough air for the market to find equilibrium. AI would survive. The useful companies would survive. Maybe then a GPU could go back to being a piece of equipment instead of a financial instrument.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>cloud</category>
      <category>startup</category>
    </item>
    <item>
      <title>The Work Before the Work</title>
      <dc:creator>CodeMonkeyG</dc:creator>
      <pubDate>Mon, 26 Oct 2026 00:00:00 +0000</pubDate>
      <link>https://dev.to/codemonkeyg/the-work-before-the-work-g61</link>
      <guid>https://dev.to/codemonkeyg/the-work-before-the-work-g61</guid>
      <description>&lt;p&gt;Getting into painting cars has reminded me that the visible part of a project is often the smallest part of the process. Before paint touches the surface, there is cleaning, sanding, repairing, masking, priming, and inspecting. Each step affects the next one. If the surface is not prepared properly, a better gun, more expensive paint, or extra coats will not solve the underlying problem. The finish reflects the care taken before the finish was visible.&lt;/p&gt;

&lt;p&gt;That connection made me think about how we work with AI agents. A complex task also needs preparation before execution begins. The agent needs to understand the objective, the current condition of the project, the available tools, the constraints, and what a successful result actually means. A vague prompt is like painting over dirt or rust. It may produce something that looks finished at first, but the flaws remain underneath and become more difficult to correct later.&lt;/p&gt;

&lt;p&gt;My mind tends to move between subjects and notice relationships that may not be obvious at first. Painting a car and designing an agent workflow seem unrelated, but the underlying principle is universal: good results come from respecting the process. You prepare the surface, choose the right materials, apply each layer carefully, allow time for it to set, and inspect the work before continuing. With an agent, that means gathering context, breaking down the task, setting boundaries, reviewing intermediate results, and verifying the final output instead of assuming that completion means correctness.&lt;/p&gt;

&lt;p&gt;The lesson is not that every task needs unnecessary complexity. It is that care should be applied where it matters. Preparation creates a reliable foundation, and deliberate execution protects the work built on top of it. Whether I am trying to achieve a clean automotive finish or asking an agent to solve a difficult problem, the goal is the same: do not rush past the steps that make quality possible. Surface-level effort can produce activity, but thoughtful preparation is what gives the result a chance to be as good as it can be.&lt;/p&gt;

</description>
      <category>agents</category>
      <category>ai</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Grateful for the Road That Led Here</title>
      <dc:creator>CodeMonkeyG</dc:creator>
      <pubDate>Sun, 25 Oct 2026 00:00:00 +0000</pubDate>
      <link>https://dev.to/codemonkeyg/grateful-for-the-road-that-led-here-3b3a</link>
      <guid>https://dev.to/codemonkeyg/grateful-for-the-road-that-led-here-3b3a</guid>
      <description>&lt;p&gt;I recently had the chance to speak with &lt;a href="https://www.linkedin.com/in/jeffrymagloire/" rel="noopener noreferrer"&gt;Jeff Magloire&lt;/a&gt; and Daniel Cai about my experience building integrations, working with product teams, and solving problems inside complicated production environments. They are researching ProductOS, a tool intended to help connect customer needs, product decisions, engineering work, documentation, and delivery.&lt;/p&gt;

&lt;p&gt;I want to start by saying thank you.&lt;/p&gt;

&lt;p&gt;Thank you for reaching out. Thank you for taking the time to listen. Thank you for asking questions that made me think about work I have been doing for years, often without having a clear name for it.&lt;/p&gt;

&lt;p&gt;I went into the conversation expecting to talk about integrations. I did not expect to come away feeling so grateful for the road that brought me there.&lt;/p&gt;

&lt;h2&gt;
  
  
  A conversation that made me look back
&lt;/h2&gt;

&lt;p&gt;It is easy to describe a career after the fact as if it were a plan. Mine was not.&lt;/p&gt;

&lt;p&gt;I started by building custom applications and working with clients who needed something made, fixed, or explained. I learned by taking on work that was sometimes bigger than my experience at the time. I worked across different companies, products, and industries. I spent years building a hospitality platform from the ground up, working closely with a founder, customers, vendors, executives, and engineers.&lt;/p&gt;

&lt;p&gt;Much of that work happened before I knew the term forward deployed engineer. I was doing discovery, building proofs of concept, explaining technical decisions, connecting systems, helping close deals, deploying software, and supporting it after the launch. I was often the person standing between what a customer needed and what the systems could actually do.&lt;/p&gt;

&lt;p&gt;The title came later. The work came first.&lt;/p&gt;

&lt;p&gt;The interview helped me see that more clearly. When I talked about legacy systems, undocumented APIs, version differences, production failures, and the slow process of finding the truth inside an unfamiliar environment, I was also describing the education my career gave me.&lt;/p&gt;

&lt;p&gt;It was not a formal education. A lot of it had to be built on my own.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it took to get here
&lt;/h2&gt;

&lt;p&gt;There were many years when I had to figure things out without a clear path or a person standing over my shoulder to show me what to do next. I had to learn how to build companies, find customers, make promises carefully, deliver what I promised, and keep going when the work became more difficult than expected.&lt;/p&gt;

&lt;p&gt;I had to learn technologies because a customer needed a solution, not because a course had been prepared for me. I had to understand systems by reading incomplete documentation, testing boundaries, looking at code, and asking questions that sometimes exposed how little anyone knew about the system as a whole.&lt;/p&gt;

&lt;p&gt;There were times when doing it on my own felt empowering. There were other times when it was simply hard. Building something from the ground up can be lonely, especially when the people around you only see the finished product and not the years of uncertainty underneath it.&lt;/p&gt;

&lt;p&gt;Still, that experience shaped me.&lt;/p&gt;

&lt;p&gt;It taught me to be resourceful without pretending to know everything. It taught me to keep investigating when the answer was not obvious. It taught me that a working system is more than code. It has to make sense to the people using it, survive contact with production, and remain understandable when someone else has to support it.&lt;/p&gt;

&lt;p&gt;Those lessons came from many places. Some came from success. Some came from mistakes. Some came from projects that took far longer than expected. Some came from having no choice but to learn the next thing and keep moving.&lt;/p&gt;

&lt;p&gt;I am grateful for all of it, even the parts I would not choose to repeat.&lt;/p&gt;

&lt;h2&gt;
  
  
  What we talked about
&lt;/h2&gt;

&lt;p&gt;During the interview, we talked about the friction that appears when engineers, architects, product managers, and business leaders each work from a different understanding of the same project.&lt;/p&gt;

&lt;p&gt;We talked about technical documentation and the difficulty of integrating with systems that have been running for years. Sometimes the documentation is incomplete. Sometimes it describes another version. Sometimes the people who built the system are no longer available to explain why it behaves the way it does.&lt;/p&gt;

&lt;p&gt;In those situations, the work becomes a form of investigation. You gather what exists, test what you can, compare the behavior against the written specifications, and build a clearer picture one piece at a time.&lt;/p&gt;

&lt;p&gt;We also talked about AI agents and the work they may be able to take on. An agent can research documentation, compare products, organize notes, prepare an executive summary, or suggest priorities. That can remove a great deal of repetitive work.&lt;/p&gt;

&lt;p&gt;It cannot remove responsibility.&lt;/p&gt;

&lt;p&gt;The person who understands the customer, the company, the risks, and the consequences still has to make the final decision. That is the part I care about. I am interested in using AI to prepare better information, not in handing over judgment simply because the result looks polished.&lt;/p&gt;

&lt;p&gt;The best version of that workflow is still human. The agent does the heavy preparation. The person reviews it, corrects it, adds context, and decides what happens next.&lt;/p&gt;

&lt;h2&gt;
  
  
  Thank you for reminding me
&lt;/h2&gt;

&lt;p&gt;What stayed with me after the call was not one particular product idea. It was the feeling of being seen for work I had sometimes treated as ordinary because I had been doing it for so long.&lt;/p&gt;

&lt;p&gt;I have spent years connecting systems and people. I have translated customer problems into technical work, then translated technical limitations back into language that a customer or executive could use. I have entered unfamiliar codebases, built demonstrations, worked through production incidents, and tried to leave systems better documented than I found them.&lt;/p&gt;

&lt;p&gt;Those things do not always fit neatly into a job title. They are easy to overlook when you are busy doing them. Being asked about them made me stop and recognize how much experience had accumulated over time.&lt;/p&gt;

&lt;p&gt;That recognition came at a meaningful point in my life. After leaving a long professional chapter, I have been rebuilding my sense of direction. I have been learning again, experimenting with new tools, preparing for interviews, and thinking about what I want the next part of my career to look like.&lt;/p&gt;

&lt;p&gt;The conversation gave me a little of my fire back.&lt;/p&gt;

&lt;p&gt;Not because it confirmed that I have everything figured out. I do not. It helped because it reminded me that I have already done difficult work without having everything figured out. I have learned before. I have built before. I have found a way through problems that looked unreasonable at the beginning.&lt;/p&gt;

&lt;p&gt;I can do that again.&lt;/p&gt;

&lt;h2&gt;
  
  
  Carrying the gratitude forward
&lt;/h2&gt;

&lt;p&gt;I am grateful to Jeff and Daniel for the invitation and for the thoughtful conversation. I am grateful for the opportunity to explain what I have learned, but I am even more grateful for the chance to remember where those lessons came from.&lt;/p&gt;

&lt;p&gt;They came from customers who trusted me with important problems. They came from teammates, founders, and engineers who challenged my assumptions. They came from long nights, difficult decisions, failed approaches, and the next morning when the work still had to continue.&lt;/p&gt;

&lt;p&gt;They also came from having to do a lot of it on my own.&lt;/p&gt;

&lt;p&gt;That independence was not always easy, but it gave me a kind of confidence that no title can provide. I know how to start with an unclear problem. I know how to learn the system in front of me. I know how to build a first version, listen to the people using it, and keep improving it.&lt;/p&gt;

&lt;p&gt;That is what I want to carry into the next chapter: gratitude for the experience, humility about what I still need to learn, and the willingness to build again.&lt;/p&gt;

&lt;p&gt;For more background, see &lt;a href="https://dev.to/blog/posts/the-shape-of-a-career"&gt;The Shape of a Career&lt;/a&gt;, &lt;a href="https://dev.to/blog/posts/learning-python-after-php"&gt;Learning Python After PHP&lt;/a&gt;, and my &lt;a href="https://dev.to/resume"&gt;forward deployed engineering resume&lt;/a&gt;. I also share shorter reflections on &lt;a href="https://linkedin.com/in/codemonkeyg" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>career</category>
      <category>product</category>
      <category>softwareengineering</category>
    </item>
    <item>
      <title>Finding the Opportunity After the AI Workshop</title>
      <dc:creator>CodeMonkeyG</dc:creator>
      <pubDate>Sat, 24 Oct 2026 00:00:00 +0000</pubDate>
      <link>https://dev.to/codemonkeyg/finding-the-opportunity-after-the-ai-workshop-4cdm</link>
      <guid>https://dev.to/codemonkeyg/finding-the-opportunity-after-the-ai-workshop-4cdm</guid>
      <description>&lt;p&gt;I did not attend the workshop because I needed someone to teach me how to use AI. I attended because I wanted to understand how people with less technical experience were being introduced to it.&lt;/p&gt;

&lt;p&gt;What I saw clarified the opportunity in front of me: many people do not need another tool. They need someone who can help them turn AI into something useful in their actual lives.&lt;/p&gt;

&lt;p&gt;That realization connected the session to the work I have already done, the business I am building, and the kind of work I want to do next.&lt;/p&gt;

&lt;h2&gt;
  
  
  The insight was not the template
&lt;/h2&gt;

&lt;p&gt;The session introduced beginners to agent templates they could adapt without starting from a blank screen. That is a sensible way to lower the barrier to entry. I would probably choose a different path. After years of building companies, software, and integrations, I want to understand what is happening underneath the result.&lt;/p&gt;

&lt;p&gt;That difference helped me see the audience more clearly. Many capable people are interested in AI but do not know how to connect it to their actual work. They do not need to become programmers. They need help identifying a useful problem, choosing a reasonable starting point, and knowing where human judgment still belongs.&lt;/p&gt;

&lt;p&gt;I left thinking less about the template and more about the person who needs help deciding what the agent should do.&lt;/p&gt;

&lt;h2&gt;
  
  
  Experience changes how I see AI
&lt;/h2&gt;

&lt;p&gt;I have spent much of my career translating between business needs and technical reality. I see AI as more than prompts and new tools. I see workflows, handoffs, scattered information, and hours lost to tasks that could be organized or automated.&lt;/p&gt;

&lt;p&gt;I also see the limits. An agent can draft, summarize, research, or prepare a plan. It cannot decide whether the workflow is worth building, understand every consequence, or take responsibility for the outcome. Someone still has to ask good questions, check the result, and make sure the system fits the way people work.&lt;/p&gt;

&lt;p&gt;That is where my experience can help. I want to help people find one real problem, build a practical first version, and learn what the system can and cannot do before adding more complexity.&lt;/p&gt;

&lt;h2&gt;
  
  
  From ideas to useful work
&lt;/h2&gt;

&lt;p&gt;My next step is to turn the automated workflows I have already been developing into clear demonstrations. A potential client should be able to see what a workflow does, what information it uses, where a person remains involved, and how it improves the work.&lt;/p&gt;

&lt;p&gt;I also want to test a practical community session where people can bring ordinary problems and explore how AI or automation might fit into their lives. Those problems might involve small-business operations, marketing, personal financial organization, or life planning. The method stays the same: listen first, understand the work, and build only what helps.&lt;/p&gt;

&lt;p&gt;A good solution may be modest. It could be better lead follow-up, a system that turns scattered notes into a plan, or an assistant that prepares information for a decision without making the decision itself.&lt;/p&gt;

&lt;h2&gt;
  
  
  A familiar kind of work
&lt;/h2&gt;

&lt;p&gt;This feels like forward deployed engineering applied beyond traditional software teams. The work begins close to the person using the system. You understand the environment, build something that fits, and stay involved long enough to see whether it helps.&lt;/p&gt;

&lt;p&gt;That is familiar territory for me. The difference is that modern tools are becoming accessible to people who would never have built a traditional software system for themselves. My role can be to translate their frustration into a workable process, then help them use it with confidence.&lt;/p&gt;

&lt;p&gt;The value is not determined by how impressive the technology sounds. It is determined by whether the person's day becomes easier or more effective.&lt;/p&gt;

&lt;h2&gt;
  
  
  The opportunity requires action
&lt;/h2&gt;

&lt;p&gt;I left the session hopeful and excited about the future, but enthusiasm is only the beginning. The real work is choosing one idea, building it, testing it with real people, and changing it when the first version is not good enough.&lt;/p&gt;

&lt;p&gt;I do not need to pretend that I am starting from zero. I also cannot assume that experience alone is enough. I still have to listen, build, test, and earn trust one result at a time.&lt;/p&gt;

&lt;p&gt;That is the opportunity I see now. AI may give me more leverage, but the meaningful part is still human: understanding what matters to someone and helping make it better.&lt;/p&gt;

&lt;p&gt;For examples of how I have been exploring this already, see &lt;a href="https://dev.to/blog/posts/building-an-ai-assisted-carousel-pipeline-without-canva-or-adobe"&gt;Building an AI-Assisted Carousel Pipeline&lt;/a&gt; and &lt;a href="https://dev.to/blog/posts/an-agentic-ai-investigation-of-disputed-online-reviews"&gt;An Agentic AI Investigation of Disputed Online Reviews&lt;/a&gt;. Those projects taught me that AI becomes more useful when it is placed inside a workflow with clear boundaries, human review, and a result that someone can actually use.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>career</category>
      <category>productivity</category>
      <category>startup</category>
    </item>
    <item>
      <title>How Stacked Convertible Notes Can Eliminate Common-Stock Proceeds in an Acquisition</title>
      <dc:creator>CodeMonkeyG</dc:creator>
      <pubDate>Thu, 22 Oct 2026 00:00:00 +0000</pubDate>
      <link>https://dev.to/codemonkeyg/how-stacked-convertible-notes-can-eliminate-common-stock-proceeds-in-an-acquisition-32ck</link>
      <guid>https://dev.to/codemonkeyg/how-stacked-convertible-notes-can-eliminate-common-stock-proceeds-in-an-acquisition-32ck</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;General information only.&lt;/strong&gt; This article describes common financing mechanics and an illustrative acquisition waterfall. Actual outcomes depend on the company's charter, financing documents, debt agreements, applicable law, taxes, and transaction terms. It is not legal, tax, or investment advice. A stockholder considering an inspection demand or transaction should consult qualified counsel.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Multiple rounds of convertible notes without a priced equity round can create a substantial &lt;strong&gt;liquidation overhang&lt;/strong&gt;: claims that must be resolved before common stock participates in an acquisition. In a modest exit, the acquisition headline can look healthy while the amount available to common stockholders is small or zero.&lt;/p&gt;

&lt;p&gt;The result is not automatic. It depends on the precise note agreements, capitalization, senior debt, liquidation-preference terms, and merger agreement. But the mechanics are straightforward enough that every stockholder should understand the waterfall.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Unconverted notes may sit ahead of equity
&lt;/h2&gt;

&lt;p&gt;A convertible note begins as debt. If an acquisition occurs before a qualifying financing causes conversion, the note agreement generally determines whether the holder is repaid, converts into shares, or may choose between those outcomes.&lt;/p&gt;

&lt;p&gt;Where repayment applies, principal and accrued interest are claims that must be satisfied from transaction consideration before distributions to equity holders. Existing secured debt, transaction expenses, taxes, and other liabilities may rank ahead as well. Preferred and common stockholders do not share in the residual until those obligations are resolved.&lt;/p&gt;

&lt;p&gt;This is why the label "convertible" should not obscure the underlying risk: until conversion, a note can function as a senior claim on exit proceeds.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Change-of-control provisions can increase the claim
&lt;/h2&gt;

&lt;p&gt;Convertible-note agreements commonly include a change-of-control provision for an acquisition before a qualified financing. The exact language varies, but it may give the holder a choice between:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;repayment of outstanding principal plus interest, sometimes with a premium or multiple;&lt;/li&gt;
&lt;li&gt;conversion immediately before closing at a discount, valuation cap, or other formula; or&lt;/li&gt;
&lt;li&gt;another contractually defined treatment.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A multiple has a direct effect on the waterfall. For example, $5 million of principal subject to a 2.0x cash payout would require $10 million of consideration before the remaining distribution is shared with equity holders, subject to the agreement and any senior claims. That is very different from a conversion that turns the noteholder into an equity participant.&lt;/p&gt;

&lt;p&gt;The governing documents, not an assumed market norm, control. A cap, discount, maturity date, interest rate, and change-of-control election should all be reviewed together.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Interest adds to the overhang over time
&lt;/h2&gt;

&lt;p&gt;Notes usually accrue interest until they are repaid or converted. The longer a company delays a priced financing or exit, the greater the repayment amount may become.&lt;/p&gt;

&lt;p&gt;As a simplified example, $3 million accruing simple interest at 7% annually reaches approximately $4.05 million after five years and $4.26 million after six years, before any change-of-control premium. Whether interest compounds, converts, or is paid in cash depends on the note.&lt;/p&gt;

&lt;h2&gt;
  
  
  An illustrative acquisition waterfall
&lt;/h2&gt;

&lt;p&gt;Assume a company completed a $2.4 million seed preferred round and later issued $6 million of convertible notes. The following example assumes the notes are repaid for $7.5 million including accrued interest, the seed investors receive a $2.4 million non-participating liquidation preference, and there are no other senior claims beyond those shown.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Step&lt;/th&gt;
&lt;th&gt;Distribution&lt;/th&gt;
&lt;th&gt;Remaining proceeds&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Acquisition sale price&lt;/td&gt;
&lt;td&gt;$15,000,000&lt;/td&gt;
&lt;td&gt;$15,000,000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Transaction and legal fees&lt;/td&gt;
&lt;td&gt;-$1,000,000&lt;/td&gt;
&lt;td&gt;$14,000,000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Convertible notes: principal and interest&lt;/td&gt;
&lt;td&gt;-$7,500,000&lt;/td&gt;
&lt;td&gt;$6,500,000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Seed preferred liquidation preference&lt;/td&gt;
&lt;td&gt;-$2,400,000&lt;/td&gt;
&lt;td&gt;$4,100,000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Corporate liabilities and taxes&lt;/td&gt;
&lt;td&gt;-$1,000,000&lt;/td&gt;
&lt;td&gt;$3,100,000&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Under those assumptions, only $3.1 million remains for common stock and any other participating equity. If the notes instead have a 2.0x cash change-of-control payment based on $6 million of principal, the note claim alone becomes $12 million. With the same fees, preference, and liabilities, the proceeds available for common stock are reduced to zero.&lt;/p&gt;

&lt;p&gt;This is only a model, not a valuation conclusion. A real waterfall can change materially if notes convert, preferred holders elect conversion, preferences are participating or stacked, debt is secured, option holders participate, escrow or indemnity holdbacks apply, or consideration includes stock rather than cash.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why the capitalization records matter
&lt;/h2&gt;

&lt;p&gt;Public fundraising filings may show an early equity round but not the full financing picture. The cap table and note or SAFE register are the practical records needed to understand the senior stack.&lt;/p&gt;

&lt;p&gt;For a Delaware corporation, a properly scoped inspection demand under DGCL Section 220 may be a way for a stockholder with a proper purpose to seek relevant books and records. Counsel can advise on entitlement, purpose, scope, and the appropriate recipient. Useful records to request may include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the current and historical capitalization table, including fully diluted ownership;&lt;/li&gt;
&lt;li&gt;every outstanding note and SAFE, together with amendments and side letters;&lt;/li&gt;
&lt;li&gt;principal amounts, interest rates, maturity dates, valuation caps, discounts, and change-of-control terms;&lt;/li&gt;
&lt;li&gt;the certificate of incorporation and each preferred-stock financing document; and&lt;/li&gt;
&lt;li&gt;board materials or transaction analyses addressing an acquisition or recapitalization, where appropriately within scope.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Establish the senior-claim floor
&lt;/h2&gt;

&lt;p&gt;Once the records are available, the analysis starts with a simple question: &lt;strong&gt;how much consideration must be paid or allocated before common stock receives anything?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Build the calculation from the executed documents:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Identify secured debt, working-capital adjustments, fees, taxes, and other non-equity obligations.&lt;/li&gt;
&lt;li&gt;Calculate each convertible instrument's repayment amount, accrued interest, and change-of-control treatment.&lt;/li&gt;
&lt;li&gt;Model conversion outcomes using the relevant cap, discount, and capitalization definitions.&lt;/li&gt;
&lt;li&gt;Apply preferred-stock liquidation preferences and conversion elections.&lt;/li&gt;
&lt;li&gt;Compare the resulting residual with the total common shares and options entitled to participate.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The result is a break-even threshold: the transaction value at which common stock begins to have a meaningful cash outcome. Knowing that threshold is essential before relying on a headline acquisition valuation or assuming that a large common-share position will translate into proceeds.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Convertible financing can be useful when it bridges a company to a priced round. The risk arises when notes accumulate for years without conversion and then meet a sale price that is insufficient to satisfy debt-like claims, premiums, accrued interest, and preferred preferences.&lt;/p&gt;

&lt;p&gt;For common stockholders, the important work is documentary rather than speculative: obtain the governing records through appropriate channels, model the contractual waterfall carefully, and obtain legal and financial advice before drawing conclusions about an exit.&lt;/p&gt;

</description>
      <category>startup</category>
    </item>
    <item>
      <title>Patching a Critical PHP Runtime Vulnerability Across Seven Environments</title>
      <dc:creator>CodeMonkeyG</dc:creator>
      <pubDate>Wed, 21 Oct 2026 00:00:00 +0000</pubDate>
      <link>https://dev.to/codemonkeyg/patching-a-critical-php-runtime-vulnerability-across-seven-environments-3611</link>
      <guid>https://dev.to/codemonkeyg/patching-a-critical-php-runtime-vulnerability-across-seven-environments-3611</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Publication note.&lt;/strong&gt; This case study has been deliberately anonymized. Organization names, domains, repository names, container names, network details, credentials, and infrastructure-specific paths have been removed or generalized. The version thresholds, remediation approach, validation steps, and operational obstacles are retained because they are useful without exposing the affected environments.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Executive summary
&lt;/h2&gt;

&lt;p&gt;A newly disclosed pair of critical PHP runtime vulnerabilities required a rapid review of several containerized web applications. The important question was not whether a repository declared support for a particular PHP major version. The question was: &lt;strong&gt;what PHP version is actually executing public requests right now?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The review found seven public-facing PHP services built from mutable container tags. Source files did not prove that any live service was vulnerable, but they did show that the deployed patch level could drift whenever an image was rebuilt. Runtime verification confirmed that all seven active services were below their applicable security fix threshold.&lt;/p&gt;

&lt;p&gt;The remediation did not require compiling PHP from source. Each application container was rebuilt from an official, fixed PHP base image pinned both to an exact release tag and an immutable image digest. The services were then recreated one at a time, leaving proxies, databases, and unrelated application services running. Final checks inside every active PHP worker confirmed the fixed versions.&lt;/p&gt;

&lt;p&gt;Two builds initially failed because Docker could not read root-owned runtime directories that had been included in their build contexts. Narrow &lt;code&gt;.dockerignore&lt;/code&gt; rules excluded only those non-build artifacts. After rebuilding, all seven services ran fixed PHP versions.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Start with deployed reality, not framework requirements
&lt;/h2&gt;

&lt;p&gt;The affected applications used a mix of PHP-FPM-backed frameworks and a content-management workload. Their dependency manifests expressed broad compatibility ranges such as PHP 8.3 or later. That is useful for application development, but it does not prove that the operating container has received a particular runtime security release.&lt;/p&gt;

&lt;p&gt;The same distinction applies to a Dockerfile line such as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="s"&gt; php:8.3-fpm&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That tag is convenient, but mutable. A build performed at one time may produce a different image than a build performed later, and a running container may still be based on an older cached image. The corresponding risk was even less visible where a content-management image used a generic, unversioned runtime tag.&lt;/p&gt;

&lt;p&gt;The initial static review established three facts:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Each affected service accepted PHP requests through a public web path.&lt;/li&gt;
&lt;li&gt;Each runtime image tag was mutable or did not identify a PHP patch release.&lt;/li&gt;
&lt;li&gt;A source-only review could classify exposure as possible, but could not establish the live runtime version.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That last boundary mattered. Treating an image reference as proof of the running runtime would have been an assumption, not a finding.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Define the version policy before deployment
&lt;/h2&gt;

&lt;p&gt;The disclosed issues were fixed in specific PHP patch releases. The response policy treated these versions as the minimum acceptable upstream releases:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;PHP branch&lt;/th&gt;
&lt;th&gt;Minimum fixed version&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;8.2&lt;/td&gt;
&lt;td&gt;8.2.35&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8.3&lt;/td&gt;
&lt;td&gt;8.3.36&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8.4&lt;/td&gt;
&lt;td&gt;8.4.27&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8.5&lt;/td&gt;
&lt;td&gt;8.5.12&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;An environment running an older distribution-maintained PHP package may have a vendor backport. In that case, the package maintainer's advisory and changelog must establish that the fix is present. This fleet used official container images, so the operational rule was simpler: move each service to the published fixed patch release or later.&lt;/p&gt;

&lt;p&gt;We first queried the executing process in every active PHP container:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker &lt;span class="nb"&gt;exec&lt;/span&gt; &amp;lt;php-container&amp;gt; php &lt;span class="nt"&gt;-r&lt;/span&gt; &lt;span class="s1"&gt;'echo PHP_VERSION, PHP_EOL;'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;All seven returned versions below their branch threshold. This converted a potential exposure based on source review into a confirmed patching requirement.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Pin both the release and the image identity
&lt;/h2&gt;

&lt;p&gt;The permanent source change was intentionally small. Each generic PHP image tag was replaced by an exact fixed patch release plus its immutable registry digest:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="s"&gt; php:8.3.36-fpm@sha256:&amp;lt;verified-image-digest&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Services on the next supported branch used the equivalent fixed release:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="s"&gt; php:8.4.27-fpm@sha256:&amp;lt;verified-image-digest&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The content-management service and its associated command-line image received the same treatment: an explicit image variant with a verified fixed PHP runtime and a pinned digest.&lt;/p&gt;

&lt;p&gt;Tags make source files readable and state the intended release. Digests bind that declaration to the exact multi-platform image manifest that was inspected. Together they prevent a future rebuild from silently receiving a different image under the same tag.&lt;/p&gt;

&lt;p&gt;Before changing application source, the candidate images were pulled and inspected locally. The PHP executable inside each image was queried directly:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run &lt;span class="nt"&gt;--rm&lt;/span&gt; &lt;span class="nt"&gt;--entrypoint&lt;/span&gt; php &amp;lt;image-reference&amp;gt; &lt;span class="nt"&gt;-v&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This validated the runtime carried by the selected image rather than trusting the tag name alone.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Rebuild application containers, not PHP from source
&lt;/h2&gt;

&lt;p&gt;There are two very different meanings of "rebuild PHP":&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Action&lt;/th&gt;
&lt;th&gt;What it means&lt;/th&gt;
&lt;th&gt;What we did&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Compile PHP from source&lt;/td&gt;
&lt;td&gt;Download PHP source, compile it, and manage build flags and patches&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Rebuild an application image&lt;/td&gt;
&lt;td&gt;Run the application's Docker build again, using an updated PHP base image&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The latter was the correct response for this fleet. It preserved each application's existing extension installation and startup behavior while replacing its underlying, vulnerable PHP runtime with the fixed image.&lt;/p&gt;

&lt;p&gt;The normal deployment sequence was:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker compose build &lt;span class="nt"&gt;--pull&lt;/span&gt; &amp;lt;php-service&amp;gt;
docker compose up &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nt"&gt;--no-deps&lt;/span&gt; &lt;span class="nt"&gt;--force-recreate&lt;/span&gt; &amp;lt;php-service&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;--pull&lt;/code&gt; makes the build retrieve the declared digest if it is not already present. &lt;code&gt;--no-deps&lt;/code&gt; limits the restart to the patched service. &lt;code&gt;--force-recreate&lt;/code&gt; ensures that Compose does not keep an existing, vulnerable container merely because its service configuration appears otherwise unchanged.&lt;/p&gt;

&lt;p&gt;This was performed one service at a time. Reverse proxies, databases, caches, and front-end services were not rebuilt or restarted as part of this runtime-only response. That reduced the change surface and made troubleshooting clearer.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Roadblock: runtime files leaked into the build context
&lt;/h2&gt;

&lt;p&gt;The first four application image builds completed. Two later builds failed before executing their Dockerfiles because the Docker daemon could not stat directories inside the build contexts. Those directories were root-owned runtime artifacts under application storage paths.&lt;/p&gt;

&lt;p&gt;The failure was not a PHP compatibility issue. It came from Docker sending the entire project directory as build context. A root-owned directory that is useful at runtime does not need to be sent to the builder, especially when the Dockerfile does not copy it into the image.&lt;/p&gt;

&lt;p&gt;The fix was a narrow &lt;code&gt;.dockerignore&lt;/code&gt; entry in each affected repository:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;storage/framework/testing/disks/public/&amp;lt;runtime-directory&amp;gt;/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;application/storage/app/private/&amp;lt;runtime-directory&amp;gt;/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;These exclusions were deliberately specific. We did not delete runtime data, change ownership recursively, or ignore broad application storage trees. The directories remain available through the services' runtime volume mounts; they are simply excluded from an image build that does not need them.&lt;/p&gt;

&lt;p&gt;After adding the exclusions, both application images built successfully from their fixed base images and the corresponding PHP-FPM services were recreated.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Roadblock: a stale auxiliary PHP container
&lt;/h2&gt;

&lt;p&gt;One environment also had a long-running, ad hoc command-line PHP container that was separate from the primary PHP-FPM service. Its image was older than the new runtime policy, and it was not replaced when the main web worker was recreated.&lt;/p&gt;

&lt;p&gt;This was a useful reminder that a service inventory cannot stop at the primary web process. One-off jobs, administrative command-line containers, workers, scheduled tasks, and temporary debug shells can all retain an older runtime image.&lt;/p&gt;

&lt;p&gt;The response was to stop the stale auxiliary container and update the declared command-line image reference alongside the web runtime. Subsequent ad hoc jobs will use the pinned, fixed image. For teams with recurring operational jobs, this should become an explicit deployment check rather than a manual cleanup step.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. Verify the running container after every recreate
&lt;/h2&gt;

&lt;p&gt;A successful image build does not prove that traffic is using the new image. A successful &lt;code&gt;docker compose up&lt;/code&gt; does not prove that the application process started correctly. We validated the active runtime in every recreated service:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker &lt;span class="nb"&gt;exec&lt;/span&gt; &amp;lt;php-container&amp;gt; php &lt;span class="nt"&gt;-r&lt;/span&gt; &lt;span class="s1"&gt;'echo PHP_VERSION, PHP_EOL;'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The final state was:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Service group&lt;/th&gt;
&lt;th&gt;Active runtime after rollout&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Four PHP 8.3 services&lt;/td&gt;
&lt;td&gt;PHP 8.3.36&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Two PHP 8.4 services&lt;/td&gt;
&lt;td&gt;PHP 8.4.27&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;One PHP-FPM content service&lt;/td&gt;
&lt;td&gt;PHP 8.4.27&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;We also rendered each Compose configuration before deployment to catch YAML, interpolation, and image-reference errors:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker compose config &lt;span class="nt"&gt;-q&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The application image builds completed successfully after the build-context exclusions were added. Because the change was deliberately limited to the PHP base images and ignored build-only runtime artifacts, a full application test suite was not a substitute for, or prerequisite to, the key security assertion: the running PHP interpreter met the patched threshold.&lt;/p&gt;

&lt;h2&gt;
  
  
  8. What made the response effective
&lt;/h2&gt;

&lt;p&gt;Several practices turned a fleet-wide response into a controlled maintenance task:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Separate static evidence from runtime evidence.&lt;/strong&gt; Dockerfiles identified where to investigate; &lt;code&gt;php -v&lt;/code&gt; established what was actually exposed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use fixed versions and immutable digests.&lt;/strong&gt; Exact tags address patch level; digests protect against future tag drift.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Change only the affected service.&lt;/strong&gt; Recreating PHP workers without their dependencies reduced disruption.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Treat build failures as deployment problems, not reasons to defer patching.&lt;/strong&gt; The inaccessible runtime paths had a small, scoped solution.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Include auxiliary processes in the inventory.&lt;/strong&gt; A forgotten command-line PHP container can undermine an otherwise complete rollout.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Verify after deployment.&lt;/strong&gt; The only authoritative completion check was the version reported by each active container.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  9. Follow-up controls
&lt;/h2&gt;

&lt;p&gt;The immediate exposure was remediated, but the process should not depend on a manual emergency review every time a runtime advisory appears. The next controls are straightforward:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Maintain an inventory of public PHP workers, scheduled jobs, queue workers, and administrative containers.&lt;/li&gt;
&lt;li&gt;Require exact PHP patch versions and registry digests in Dockerfiles and Compose files.&lt;/li&gt;
&lt;li&gt;Add a deployment check that fails builds or releases below the approved PHP minimum.&lt;/li&gt;
&lt;li&gt;Record the image digest and &lt;code&gt;php -v&lt;/code&gt; output as a release artifact.&lt;/li&gt;
&lt;li&gt;Review access and application logs during the relevant exposure window, then follow the incident-response process if compromise indicators appear.&lt;/li&gt;
&lt;li&gt;Schedule regular base-image maintenance so urgent updates remain small, familiar changes.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;The technical fix was not exotic: identify the active runtimes, select patched base images, rebuild application containers, recreate the affected services, and verify the live interpreter. The difficult part was maintaining the distinction between repository intent and runtime reality while responding quickly across multiple environments.&lt;/p&gt;

&lt;p&gt;The result was a complete, verified rollout from vulnerable PHP patch levels to fixed releases, plus a more durable image-pinning and build-context practice. The next vulnerability response should begin with a clearer inventory, more deterministic image references, and fewer surprises between a successful build and a secure running service.&lt;/p&gt;

</description>
      <category>cybersecurity</category>
      <category>devops</category>
      <category>php</category>
      <category>security</category>
    </item>
    <item>
      <title>Building an AI-Assisted Carousel Pipeline Without Canva or Adobe</title>
      <dc:creator>CodeMonkeyG</dc:creator>
      <pubDate>Sat, 17 Oct 2026 00:00:00 +0000</pubDate>
      <link>https://dev.to/codemonkeyg/building-an-ai-assisted-carousel-pipeline-without-canva-or-adobe-1h57</link>
      <guid>https://dev.to/codemonkeyg/building-an-ai-assisted-carousel-pipeline-without-canva-or-adobe-1h57</guid>
      <description>&lt;h2&gt;
  
  
  Executive summary
&lt;/h2&gt;

&lt;p&gt;I wanted a repeatable way to create Instagram marketing carousels for a client. I had campaign ideas, SVG templates, and JPG backgrounds. I wanted to keep control of those assets, improve the writing through review, and produce images without depending on Adobe, Canva, or a hosted design editor.&lt;/p&gt;

&lt;p&gt;Working with an AI coding agent, we built a file-based pipeline: source notes became reviewable Markdown, Markdown became JSONL, and Python placed the approved text into SVG templates. Inkscape rendered the SVGs into PNGs. The finished batch contained 14 campaigns and 69 slides, with an editable SVG and a flattened PNG for each slide.&lt;/p&gt;

&lt;p&gt;Getting there required more than connecting a model to a renderer. Early versions pulled from the wrong source directory, treated production labels as copy, shortened sentences badly, and produced slides that passed layout checks but did not read well together. A later template revision exposed another mistake: the renderer treated example bullet lines as a hard capacity limit.&lt;/p&gt;

&lt;p&gt;Those failures helped define the architecture. AI handles editorial reasoning and task coordination. Python performs mechanical transformations. Templates define the visual design. People approve the message and decide what to publish.&lt;/p&gt;

&lt;p&gt;The rendering path runs locally and does not call a language model or image-generation service. The editorial workflow is designed to be portable across models, although model quality and tool support still matter. Running the entire agent workflow with a local model would require configuration and validation; that was not established by this project.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. The requirement was ownership, not another image generator
&lt;/h2&gt;

&lt;p&gt;The images in this project are composed from existing artwork and text. We did not ask a diffusion model to invent a new picture for each slide.&lt;/p&gt;

&lt;p&gt;That choice matters for business content. A supplied SVG can preserve the brand's typography, colors, text positions, shadows, background crop, and footer across an entire campaign. The writing can change without asking an image model to reproduce a logo or spell a headline correctly.&lt;/p&gt;

&lt;p&gt;I also wanted files I could keep using outside the original workflow. The outputs needed to include editable masters, not just images exported from an account I might later stop paying for.&lt;/p&gt;

&lt;p&gt;The working materials were ordinary files:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Material&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Campaign notes&lt;/td&gt;
&lt;td&gt;Source ideas, practical advice, and business context&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SVG templates&lt;/td&gt;
&lt;td&gt;Layout, typography, branding, and editable text layers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;JPG backgrounds&lt;/td&gt;
&lt;td&gt;Supplied visual assets&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Compiled Markdown&lt;/td&gt;
&lt;td&gt;Human-readable campaign copy for review&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;JSONL&lt;/td&gt;
&lt;td&gt;Structured input to the renderer, one campaign per line&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Generated SVGs&lt;/td&gt;
&lt;td&gt;Editable slide masters&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PNGs&lt;/td&gt;
&lt;td&gt;Flattened images for posting&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The source notes lived in Obsidian, but the pipeline used their Markdown files. Obsidian was a convenient writing environment, not a required rendering service.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Separating writing from rendering
&lt;/h2&gt;

&lt;p&gt;The final data flow was:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Campaign idea or source note + supplied SVG/JPG assets
                         |
                         v
              AI-assisted editorial draft
                         |
                         v
             Human-reviewable Markdown
                         |
                  Review and revision
                         |
                         v
             Mechanical Python compiler
                         |
                         v
          JSONL: one campaign object per line
                         |
                         v
             Mechanical Python renderer
                         |
                Editable SVG masters
                         |
                         v
                  Inkscape export
                         |
                         v
                     PNG slides
                         |
                         v
         Technical checks + visual/editorial review
                         |
              Revise upstream if needed
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each boundary has a different responsibility. The SVG defines appearance. The Markdown defines what the audience reads. JSONL carries that content into the renderer. Python should not decide whether a sentence sounds persuasive.&lt;/p&gt;

&lt;p&gt;A follow slide's Markdown uses three explicit fields:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gu"&gt;## Slide 03&lt;/span&gt;

&lt;span class="gu"&gt;### Title&lt;/span&gt;

Google may already list you

&lt;span class="gu"&gt;### Details&lt;/span&gt;

You may not control what locals see there.

&lt;span class="gu"&gt;### Bullet Points&lt;/span&gt;
&lt;span class="p"&gt;
-&lt;/span&gt; Photos may not show your storefront.
&lt;span class="p"&gt;-&lt;/span&gt; The category may not fit your shop.
&lt;span class="p"&gt;-&lt;/span&gt; Service areas may be missing or wrong.
&lt;span class="p"&gt;-&lt;/span&gt; The listing may still appear in a search.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The corresponding JSONL record contains campaign metadata and an ordered &lt;code&gt;slides&lt;/code&gt; array. Each slide has a number, title, details, and an array of bullet sentences. This gives the renderer a predictable input without asking it to interpret a loosely formatted brief.&lt;/p&gt;

&lt;p&gt;It also makes changes traceable. If a sentence needs work, I can read and edit the Markdown rather than hunt through SVG markup or modify a finished image.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. The early failures were useful specifications
&lt;/h2&gt;

&lt;p&gt;The initial source selection was wrong. The agent read a broader Instagram folder instead of the direct campaign notes. That produced work outside the intended scope. Correcting the directory narrowed the set to 14 campaigns.&lt;/p&gt;

&lt;p&gt;Other failures happened inside the content. Source notes mixed headings, design instructions, and actual audience copy. Labels such as "The Pitfalls" and "How to do it" sometimes became bullets. Long text was shortened into incomplete or awkward phrases.&lt;/p&gt;

&lt;p&gt;The tempting response was to add more Python rules: detect a bad phrase, replace it, remove another label, shorten another sentence. I pushed back on that approach. The compiler was accumulating editorial decisions that belonged in the writing stage.&lt;/p&gt;

&lt;p&gt;We moved those decisions upstream. The agent had to prepare finished, reviewable copy before conversion. The scripts could reject invalid structure or text that did not fit, but they were not supposed to repair weak writing.&lt;/p&gt;

&lt;p&gt;This was our garbage-in, garbage-out rule in practical terms. A parser should not conceal a bad draft by substituting generic advice. If the input is wrong, fix the input.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Passing a layout check did not make the carousel good
&lt;/h2&gt;

&lt;p&gt;One batch passed technical checks and visual layout review, yet the slides still felt disconnected. The titles, explanatory text, and bullets concerned similar subjects without consistently building one argument.&lt;/p&gt;

&lt;p&gt;I had also asked for five bullets per follow slide. That made the output look consistent, but encouraged filler and checklist writing. We changed the editorial rule to two to five complete, concise bullets when the slide needed them.&lt;/p&gt;

&lt;p&gt;We then revised one campaign before applying the style to the others. Campaign 1 compared fiber and cable internet through familiar situations: streaming shows, frozen video calls, upload speed, and Wi-Fi dead zones. Rather than declaring one service universally better, it helped a reader distinguish different problems and consider what their household needed.&lt;/p&gt;

&lt;p&gt;The revised progression was:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Ask which plan fits the home.&lt;/li&gt;
&lt;li&gt;Explain download and upload speed.&lt;/li&gt;
&lt;li&gt;Connect upload speed to a video call that freezes.&lt;/li&gt;
&lt;li&gt;Acknowledge when cable may already be sufficient.&lt;/li&gt;
&lt;li&gt;Separate Wi-Fi coverage from the speed of the purchased plan.&lt;/li&gt;
&lt;li&gt;Check availability at the actual address.&lt;/li&gt;
&lt;li&gt;Invite a specific conversation about the reader's situation.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That pilot became the approved reference for the remaining campaigns. We delegated bounded groups of campaign rewrites, then checked the files and rebuilt the outputs. Delegation spread the work; it did not remove the need to reconcile the results.&lt;/p&gt;

&lt;p&gt;The important improvement was editorial. Each slide had to carry one thought, and the next slide had to give the reader a reason to keep going.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. The renderer preserved the design instead of inventing one
&lt;/h2&gt;

&lt;p&gt;The Python renderer reads the structured content, chooses the title or follow template, inserts text, assigns the background, and calls Inkscape to export the PNG.&lt;/p&gt;

&lt;p&gt;The templates included separate visible and shadow text elements. Replacing only the visible title would leave the old words in its shadow. The renderer therefore updates the paired elements together, using their exact IDs and preserving their styling and placement.&lt;/p&gt;

&lt;p&gt;Unused bullet lines remain empty. XML-sensitive characters are escaped. The generated SVG retains editable text rather than flattening the entire slide into a bitmap.&lt;/p&gt;

&lt;p&gt;In this project's templates, the scripts also used explicit line-length and wrapping limits. Those limits were implementation choices for this design, not universal rules for Instagram. A different font, text box, or canvas requires inspecting the new template and checking its actual render.&lt;/p&gt;

&lt;p&gt;The scripts were kept directly on the Desktop for inspection and editing. They were small project tools, not a hosted application or a service that needed an account to produce each image.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. A one-word wrap showed why the loop matters
&lt;/h2&gt;

&lt;p&gt;Visual review found a heading in the Google Business Profile campaign that wrapped poorly:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;A listing can exist without
you
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Every word was visible. The copy matched the structured data. The heading still looked unbalanced because "you" sat alone on the second line.&lt;/p&gt;

&lt;p&gt;Under the review rules at that point, the agent reported the issue rather than silently changing the slide. I then authorized a revision through the full process.&lt;/p&gt;

&lt;p&gt;We returned to the source context and compiled Markdown, changed the headline to "Google may already list you," regenerated JSONL, and rerendered all seven slides in that campaign. The revised headline fit on one line. We visually checked the campaign again.&lt;/p&gt;

&lt;p&gt;We did not patch the PNG or change the generated SVG alone. Doing that would leave the underlying copy out of sync and allow the defect to return on the next run.&lt;/p&gt;

&lt;p&gt;That small correction demonstrated why the intermediate files were worth keeping. The same workflow handled both initial production and a targeted editorial revision.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. The template revision exposed an overly rigid assumption
&lt;/h2&gt;

&lt;p&gt;Later, I changed text from point text to area text in the design editor to define its boundaries, then asked for Campaign 1 to be rendered again without changing its copy.&lt;/p&gt;

&lt;p&gt;The title slide rendered, but the next slide failed. The exported follow template contained three example bullet spans. The renderer expected five and refused the mismatch.&lt;/p&gt;

&lt;p&gt;The initial diagnosis treated those three lines as the template's capacity. That was too literal. They were examples, not a request to reduce the campaign's bullet count.&lt;/p&gt;

&lt;p&gt;Inspection of the exported SVG showed positioned &lt;code&gt;&amp;lt;text&amp;gt;&lt;/code&gt; and &lt;code&gt;&amp;lt;tspan&amp;gt;&lt;/code&gt; elements. The relevant text did not expose &lt;code&gt;shape-inside&lt;/code&gt; or &lt;code&gt;inline-size&lt;/code&gt; boundaries. Whatever the editor displayed as area text, the file presented to this renderer still required handling explicit line positions.&lt;/p&gt;

&lt;p&gt;We corrected the mechanical assumption. For this template, the renderer can clone additional bullet spans using the measured vertical spacing of the example lines, preserving their attributes and doing the same for the shadow layer. It rejects spacing it cannot safely derive rather than guessing.&lt;/p&gt;

&lt;p&gt;A regression test covered two through five data bullets against the three-line example template. The tests passed, and the campaign rendered successfully. Subsequent checks compared output text with JSONL, checked main/shadow agreement, and inspected the PNGs.&lt;/p&gt;

&lt;p&gt;This fix supports the template structure we inspected. It is not a claim that the renderer understands every SVG area-text implementation or automatically respects arbitrary text-box boundaries. Export formats still need inspection and testing.&lt;/p&gt;

&lt;h2&gt;
  
  
  8. Model portability comes from the interfaces
&lt;/h2&gt;

&lt;p&gt;The workflow does not encode a particular model's private output format into the production files. Its working contracts are Markdown, JSON, SVG, and image files. The Python scripts do not call a model at all.&lt;/p&gt;

&lt;p&gt;That makes the production pipeline largely independent of which model helps write the copy or coordinate the tools. A model capable of following the schema can prepare the same inputs; a person can also edit those inputs directly.&lt;/p&gt;

&lt;p&gt;This does not make models interchangeable in practice. Writing quality, context handling, tool use, and image inspection can vary. During the work, image-analysis calls also failed with service errors. A failed visual check is a missing check, not a pass, even when the files render successfully.&lt;/p&gt;

&lt;p&gt;A fully local version is a reasonable deployment option, with work still required:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Configure the agent to use a suitable local model and tool interface.&lt;/li&gt;
&lt;li&gt;Provide local image inspection capability if automated visual review is required, or have a person inspect the PNGs.&lt;/li&gt;
&lt;li&gt;Check hardware capacity and validate the model against the actual writing and tool tasks.&lt;/li&gt;
&lt;li&gt;Adapt the project-specific paths, fonts, assets, and renderer assumptions to that installation.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We demonstrated local file processing and image rendering. We did not benchmark a fully local model deployment or establish equal results across all models. The portable interfaces make that deployment possible to pursue without replacing the entire content pipeline.&lt;/p&gt;

&lt;h2&gt;
  
  
  9. No required Adobe or Canva account
&lt;/h2&gt;

&lt;p&gt;The image-production path uses Python, SVG files, JPG assets, fonts, and Inkscape. It does not require an Adobe subscription, a Canva workspace, a proprietary template API, or a cloud image-generation endpoint.&lt;/p&gt;

&lt;p&gt;This is the independence I wanted. I can keep the source copy, change the code, move the files, use another SVG editor, and regenerate outputs locally. The editable master is a file I possess rather than an object available only inside a vendor's service.&lt;/p&gt;

&lt;p&gt;That independence has limits worth stating. Fonts and background artwork still have licenses. Software still has maintainers. Hosted models remain external dependencies when I choose to use them. Publishing to Instagram still depends on Instagram.&lt;/p&gt;

&lt;p&gt;The narrower, defensible claim is that creating these images does not require a proprietary design platform. That removes a specific dependency without pretending the whole workflow exists outside the software ecosystem.&lt;/p&gt;

&lt;h2&gt;
  
  
  10. Verification and the resulting artifacts
&lt;/h2&gt;

&lt;p&gt;We used several checks because each catches different failures:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Check&lt;/th&gt;
&lt;th&gt;What it establishes&lt;/th&gt;
&lt;th&gt;What it does not establish&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Markdown validation&lt;/td&gt;
&lt;td&gt;Required fields, numbering, bullet counts, and configured fit limits&lt;/td&gt;
&lt;td&gt;Whether the copy is engaging or accurate&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;JSONL parsing and count reconciliation&lt;/td&gt;
&lt;td&gt;Structured data is readable and accounts for the expected campaigns and slides&lt;/td&gt;
&lt;td&gt;Whether every claim is justified&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SVG text and shadow comparison&lt;/td&gt;
&lt;td&gt;Rendered text matches the intended content and paired layers&lt;/td&gt;
&lt;td&gt;Whether the typography looks balanced&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PNG dimensions and text bounds&lt;/td&gt;
&lt;td&gt;Files have expected dimensions and text stays within checked margins&lt;/td&gt;
&lt;td&gt;Whether contrast or wording works for a reader&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Individual visual and editorial review&lt;/td&gt;
&lt;td&gt;Visible layout defects and narrative problems can be identified&lt;/td&gt;
&lt;td&gt;Guaranteed quality or marketing performance&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The completed campaign set contained 69 slides across 14 campaigns, producing 69 SVGs and 69 PNGs. We later deleted and regenerated the slide outputs from the retained inputs. For that final bulk rerender, I explicitly requested that visual inspection be skipped. The successful render and file counts established regeneration, not a fresh visual approval of every image.&lt;/p&gt;

&lt;p&gt;We also distilled the procedure into a standalone workflow skill. It describes asset inspection, campaign writing, the Markdown-to-JSONL boundary, mechanical rendering, verification, and source-level revision. It avoids assuming this machine's paths or a particular business's contact details so another agent can use it with a new set of assets and a different idea.&lt;/p&gt;

&lt;p&gt;There are no measured conversion results in this case study. The carousels were written to generate leads, but producing them does not prove they generated engagement or customers. We also did not run a controlled cost or time comparison against a design subscription.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;This project began as a request for marketing images and became a practical exercise in separating judgment from execution.&lt;/p&gt;

&lt;p&gt;The agent was useful for drafting, revising, coordinating batches, and working through tools. It also made mistakes that needed human correction. Python became more reliable as we removed editorial guesswork from it. The SVG templates gave the design a stable form, while Markdown and JSONL let us revise the message without rebuilding the artwork manually.&lt;/p&gt;

&lt;p&gt;I now have campaign copy, editable masters, posting images, local rendering tools, and a documented process I can move to another agent. The workflow still needs editorial judgment and honest verification. It does not need a proprietary design service to turn approved words and supplied assets into images.&lt;/p&gt;

&lt;p&gt;For a related case study on evidence handling and human oversight, see &lt;a href="https://dev.to/blog/posts/an-agentic-ai-investigation-of-disputed-online-reviews"&gt;An Agentic AI Investigation of Disputed Online Reviews&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>automation</category>
      <category>productivity</category>
      <category>python</category>
    </item>
    <item>
      <title>An Agentic AI Investigation of Disputed Online Reviews</title>
      <dc:creator>CodeMonkeyG</dc:creator>
      <pubDate>Thu, 15 Oct 2026 00:00:00 +0000</pubDate>
      <link>https://dev.to/codemonkeyg/an-agentic-ai-investigation-of-disputed-online-reviews-7oe</link>
      <guid>https://dev.to/codemonkeyg/an-agentic-ai-investigation-of-disputed-online-reviews-7oe</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Publication note.&lt;/strong&gt; This case study has been deliberately de-identified. The business sector, location, names, dates, quotations, amounts, and case-specific URLs have been removed or generalized. Certain event descriptions have also been simplified to reduce the possibility of identifying individuals through searching. The workflow and technical methods are authentic to the project; the details retained are those necessary to explain the system rather than the parties.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Executive summary
&lt;/h2&gt;

&lt;p&gt;A local service business undergoing a management transition wanted to know whether several inherited negative online reviews might be fabricated, posted to the wrong location, or connected to competitors. The question looked like a straightforward web search. In practice, it required an investigation spanning conflicting narratives, multiple review platforms, public business information, platform moderation policies, unavailable primary sources, and missing private operational records.&lt;/p&gt;

&lt;p&gt;We built a multi-agent research workflow rather than asking a language model to decide whether the reviews were fake. A coordinating agent developed a neutral investigation specification, delegated bounded work to specialist agents, evaluated their returns, and maintained an evidence trail. Browser and web-retrieval tools collected public information; Python performed reproducible text alignment; structured files linked claims to sources; and document-generation tools produced both a technical handoff and an owner-facing explanation.&lt;/p&gt;

&lt;p&gt;The clearest result was a &lt;strong&gt;greater-than-90% similarity in the wording of two reviews published on different platforms&lt;/strong&gt;. That showed substantial shared or derivative text, but did not prove a fabricated transaction, a common author, or a coordinated campaign. A narrow, conditional platform-policy question was identified. The other disputed experiences remained unverified without internal business records. No reviewers were contacted and no takedown requests were submitted.&lt;/p&gt;

&lt;p&gt;The larger result was a repeatable approach to evidence-sensitive work: &lt;strong&gt;AI accelerated the investigation without being delegated the authority to decide what had happened.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Translating suspicion into testable questions
&lt;/h2&gt;

&lt;p&gt;The initial business request was informal: could these negative reviews be fake? That framing carried an obvious risk of confirmation bias. The owner’s suspicion was a reason to investigate, not evidence supporting the conclusion.&lt;/p&gt;

&lt;p&gt;We therefore separated three distinct questions:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Text provenance:&lt;/strong&gt; Is the published narrative independently written, closely copied, or derived from another source?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Underlying event:&lt;/strong&gt; Did a customer interaction occur, and are the factual allegations supported?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Platform rules:&lt;/strong&gt; Does the review fall within a specific removable-content policy, regardless of whether the underlying event happened?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;These are not interchangeable. A copied description can concern a real event. A genuine customer can make a factual mistake. A business can dispute a complaint without establishing a violation of a platform’s rules. The investigative specification required each case to state its evidence, its limitations, plausible alternatives, and its action threshold.&lt;/p&gt;

&lt;p&gt;The final work products were defined at the outset: separate case assessments, a structured evidence register, a cross-platform comparison, a policy matrix, an action register, and an owner-facing report. Defining deliverables before delegating work made omissions and incomplete research more visible.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. System architecture: coordinating agent and specialist workstreams
&lt;/h2&gt;

&lt;p&gt;The project used a &lt;strong&gt;coordinator-worker architecture&lt;/strong&gt;. The coordinating AI agent handled task planning, delegation, source reconciliation, interpretation, quality control, and final reporting. A first wave of specialist agents covered distinct review allegations, cross-platform history, and moderation/ownership context. Once more complete text became available, a second, narrower wave revisited the affected findings. Across the two waves, there were six specialist agent assignments; these were work assignments, not six independent confirmations.&lt;/p&gt;

&lt;p&gt;The logical data flow was:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Human business question
        |
        v
Research specification and evidence standard
        |
        v
Coordinating AI agent
        |
        +--&amp;gt; Specialist: disputed service event ------+
        +--&amp;gt; Specialist: other disputed interaction --+--&amp;gt; Source/evidence register
        +--&amp;gt; Specialist: cross-platform text/history -+
        +--&amp;gt; Specialist: platform rules/context ------+
                                                      |
                          Human supplies fuller text  |
                                      |               v
                                      +--&amp;gt; Targeted second-pass agents
                                                      |
                                                      v
                                     Source reconciliation + Python analysis
                                                      |
                                                      v
                                Case findings + policy mapping + limitations
                                                      |
                                                      v
                                Owner report + technical evidence package
                                                      |
                                                      v
                                  Human authorization for any outside action
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This was not a permanently deployed application with a unified database and custom APIs for every component. Coordination took place through structured agent instructions, browser results, files, and subsequent handoffs. That is still a meaningful agentic workflow: the system decomposed an objective, used external tools, examined the outputs, revised tasks, and assembled artifacts suitable for human decision-making.&lt;/p&gt;

&lt;p&gt;A critical architectural distinction was that &lt;strong&gt;agent agreement did not count as corroboration&lt;/strong&gt;. Several agents finding the same mirrored page still represented one underlying source. The coordinator was responsible for deduplicating evidence and evaluating provenance.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Integrating browser research and public sources
&lt;/h2&gt;

&lt;p&gt;The first pass attempted to inspect the original online reviews on their publishing platforms. Those attempts encountered two types of access failure: a restricted map interface that omitted the relevant full reviews, and a review site that rejected page retrieval with an HTTP 403 response.&lt;/p&gt;

&lt;p&gt;The access limitations changed what the system could claim. It had not obtained the complete platform originals, so it could not reliably establish edit history, exact publication metadata, account activity, or every word of the comments. Its first report should have made this limitation more prominent. When that weakness was challenged, the process explicitly acknowledged the missing originals rather than implying that an inaccessible expansion control had been used successfully.&lt;/p&gt;

&lt;p&gt;The agents then searched lawful public alternatives: indexed search results, third-party review directories, public organizational information, general incident-record access routes, and official moderation-policy documentation. Searches used combinations of account information, business context, and distinctive concepts. They did not attempt to bypass access controls or access private accounts.&lt;/p&gt;

&lt;p&gt;Each retrieved item was assigned an appropriate evidentiary role:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Source category&lt;/th&gt;
&lt;th&gt;What it could establish&lt;/th&gt;
&lt;th&gt;What it could not establish alone&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Live platform capture&lt;/td&gt;
&lt;td&gt;Displayed content and visible metadata at capture time&lt;/td&gt;
&lt;td&gt;Truth of the event described&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Human-supplied review extract&lt;/td&gt;
&lt;td&gt;Exact content furnished to the investigation&lt;/td&gt;
&lt;td&gt;Independent authenticity of the live page&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Third-party mirror&lt;/td&gt;
&lt;td&gt;Public circulation or listing association of text&lt;/td&gt;
&lt;td&gt;Independent confirmation of the incident&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Historical public comments&lt;/td&gt;
&lt;td&gt;Context concerning prior operations&lt;/td&gt;
&lt;td&gt;Personnel records or a particular transaction&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Official platform policy&lt;/td&gt;
&lt;td&gt;Relevant moderation rules and reporting process&lt;/td&gt;
&lt;td&gt;Whether an individual review violates them&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Authorized internal records, if supplied&lt;/td&gt;
&lt;td&gt;Potentially stronger transaction or incident verification&lt;/td&gt;
&lt;td&gt;Complete truth unless scope and completeness are evaluated&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;A failed public-record search was recorded as a &lt;strong&gt;non-result within the searched sources&lt;/strong&gt;, not as proof that no underlying event occurred. An unsuccessful court query, for example, could not establish that litigation never existed. A generic mechanical advisory could not diagnose an unidentified vehicle.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Human evidence changed the research trajectory
&lt;/h2&gt;

&lt;p&gt;After the initial handoff, a human participant supplied fuller review text and business responses. The investigation preserved these extracts as supplied and labeled them accordingly. They expanded the available evidence, but were not silently promoted to authenticated live-platform originals.&lt;/p&gt;

&lt;p&gt;This new material enabled a second wave of targeted research and a direct comparison of two previously incomplete narratives. One agent revisited the disputed operational incidents; another investigated the overlapping cross-platform reviews and historical context. The coordinator checked the claims made in those returns before merging them into the assessment.&lt;/p&gt;

&lt;p&gt;A public directory was found carrying text corresponding to some supplied complaints. After normalization, the circulated wording matched the supplied material. This supported the presence of the narratives in a listing associated with the business; it did &lt;strong&gt;not&lt;/strong&gt; independently verify the reported customer events.&lt;/p&gt;

&lt;p&gt;Historical customer comments and secondary organizational records likewise helped explain why different management periods might matter. They did not supply a verified personnel roster or a definitive transfer date. These boundaries were retained in the report.&lt;/p&gt;

&lt;p&gt;This is a concrete example of &lt;strong&gt;human-in-the-loop correction&lt;/strong&gt;: the human supplied missing evidence, the AI re-ran scoped tasks, and the results were updated without concealing the prior limitations.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Python-based text comparison
&lt;/h2&gt;

&lt;p&gt;The most substantive computational task was comparing two reviews on different platforms that appeared to describe the same experience. Their narratives were extremely similar, but the perspective of the speaker changed in places.&lt;/p&gt;

&lt;p&gt;The analysis isolated the two review bodies, normalized casing and apostrophes, tokenized words, and aligned the sequences with Python’s standard-library &lt;code&gt;difflib.SequenceMatcher&lt;/code&gt;, using &lt;code&gt;autojunk=False&lt;/code&gt;. This avoided relying on a model’s impression that two texts “looked copied.”&lt;/p&gt;

&lt;p&gt;A simplified version of the method is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;difflib&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;SequenceMatcher&lt;/span&gt;


&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;tokenize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
    &lt;span class="n"&gt;normalized&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;lower&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;’&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"'"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;findall&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;[a-z0-9]+(?:&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;[a-z0-9]+)?&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;normalized&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;


&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;tokenize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;review_a&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;tokenize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;review_b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;comparison&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;SequenceMatcher&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;autojunk&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;word-sequence similarity: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;comparison&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ratio&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# Result in this investigation: over 90%
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;SequenceMatcher.ratio()&lt;/code&gt; is defined as twice the number of aligned matching sequence elements divided by the combined sequence lengths. It is sensitive to order, unlike a simple overlap of word sets. The working investigation also preserved matching blocks and manually checked changed pronouns, unusual phrasing, and narrative order.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Interpretation was deliberately narrower than the number.&lt;/strong&gt; The greater-than-90% score measured wording similarity in the supplied transcriptions. It was not a probability of deception or common authorship. Both reviews might derive from one genuine incident, a shared draft, a repost, or another explanation. Neither the code nor the source material established which account posted first.&lt;/p&gt;

&lt;p&gt;The computational step added reproducibility; the interpretive step protected against overclaiming.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Mapping findings to platform policy
&lt;/h2&gt;

&lt;p&gt;The project included a separate research track for official review policies and reporting procedures. That prevented a common reasoning error: treating anything suspicious, inaccurate, or unfair as automatically removable.&lt;/p&gt;

&lt;p&gt;The paired text raised a &lt;strong&gt;qualified policy question&lt;/strong&gt; on the platform where the review appeared to discuss another person’s experience. But possible direct involvement by the reviewer meant that an automatic conclusion would have been premature. The recommendation was limited to considering a narrowly documented policy inquiry after obtaining authenticated full captures and reviewing the complete context.&lt;/p&gt;

&lt;p&gt;The other disputed reviews did not have sufficient evidence to justify reporting them as fake. The business’s own repair, diagnostic, correspondence, and other operational records would be needed to test the underlying factual allegations more rigorously. The research specification included searches that could accommodate alternate customer names, other payers, older record systems, and different operators.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No external action was automated.&lt;/strong&gt; No reviewer was contacted, no public accusation was made, and no platform complaint was filed. Preparing a possible report and deciding to submit it were explicitly different stages, separated by human authorization.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. Evidence management, artifacts, and quality control
&lt;/h2&gt;

&lt;p&gt;The process produced more than a chat response. It generated an agent-facing research specification, case-level handoffs, a machine-readable evidence register, an annotated cross-platform comparison, a policy/action matrix, draft owner reports, and packaged supporting files.&lt;/p&gt;

&lt;p&gt;A structured evidence item connected an observation to a case identifier, source location, collection time, source type, supporting attachment, and limitation. This made it possible to distinguish between what agents found, what the human participant supplied, and what remained inferential.&lt;/p&gt;

&lt;p&gt;Quality control included re-running the text comparison, checking preserved extracts, reviewing references and attachment paths, and testing archive readability. The supporting agent reported an evidence register with unique entries and verified links to the cases. During a later packaging handoff, a different visible CSV snapshot had a smaller record count. That discrepancy reinforces the need to &lt;strong&gt;version and reconcile artifact inventories&lt;/strong&gt; rather than treating a count in a summary as automatically authoritative.&lt;/p&gt;

&lt;p&gt;These checks establish internal consistency and traceability, not factual truth. A valid archive does not authenticate the reviews inside it; a precise similarity score does not resolve the customer transaction; and a citation confirms source attribution, not necessarily source accuracy.&lt;/p&gt;

&lt;p&gt;The reporting stage also used AI to adapt one evidence base for different readers: technical handoff documents for investigators, a more formal decision report, and a direct, accessible explanation for the nontechnical business owner. The underlying conclusions remained the same even as the tone and structure changed.&lt;/p&gt;

&lt;h2&gt;
  
  
  8. What AI handled, and what remained with people
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;AI- and tool-assisted&lt;/th&gt;
&lt;th&gt;Human or authorized-record responsibility&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Task decomposition and specialist-agent delegation&lt;/td&gt;
&lt;td&gt;Define the objective and permitted investigation scope&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Public searching, browsing, source discovery, and policy retrieval&lt;/td&gt;
&lt;td&gt;Supply unavailable material and approve any private-record access&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Text normalization, alignment, and reproducible comparison&lt;/td&gt;
&lt;td&gt;Interpret authorship and real-world involvement&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Evidence register, case files, and report generation&lt;/td&gt;
&lt;td&gt;Review consequential statements and legal/privacy implications&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Citation, attachment, and archive checks&lt;/td&gt;
&lt;td&gt;Decide whether and when to pursue external platform action&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The separation was intentional. The value was not that the AI replaced an investigator or arbitrator. The value was that it performed much of the expensive organizational and analytical work while leaving sensitive access and consequential decisions with people.&lt;/p&gt;

&lt;h2&gt;
  
  
  9. What worked, what failed, and what changed
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What worked:&lt;/strong&gt; bounded delegation accelerated research; a neutral specification reduced confirmation bias; deterministic Python analysis made one important finding reproducible; and structured evidence artifacts enabled handoffs between agents, technical reviewers, and the business owner.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What failed initially:&lt;/strong&gt; limitations in accessing the full primary-source reviews were not conspicuous enough in the initial presentation. That made the first report easier to overinterpret than it should have been. The subsequent user challenge revealed the problem.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What changed:&lt;/strong&gt; fuller human-supplied extracts triggered a second agent wave. The research moved from a suspected textual relationship to a measured one, while maintaining the distinction between shared words and a genuine or fabricated experience.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What remained unresolved:&lt;/strong&gt; direct authentication of the platform originals, complete reviewer histories, the underlying customer transactions, and some historical organizational details. These limitations were not repaired by adding more prose or more agents.&lt;/p&gt;

&lt;h2&gt;
  
  
  10. A reusable pattern for novel business workflows
&lt;/h2&gt;

&lt;p&gt;The approach can generalize to vendor diligence, incident review, contract compliance, warranty disputes, customer escalations, procurement research, and other evidence-sensitive tasks.&lt;/p&gt;

&lt;p&gt;A practical reusable design has six layers:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Specification:&lt;/strong&gt; define claims, evidence standards, scope, output requirements, and prohibited actions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Orchestration:&lt;/strong&gt; decompose work into bounded specialist assignments and set rules for reconciling results.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Retrieval:&lt;/strong&gt; use appropriate public or authorized data sources and preserve access failures.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Processing:&lt;/strong&gt; normalize content, apply deterministic analysis when useful, and maintain provenance.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Validation:&lt;/strong&gt; test alternative explanations, check artifacts, and map findings to decision thresholds.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Delivery and authorization:&lt;/strong&gt; produce audience-specific reports and require human approval before consequential actions.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This is a more useful mental model than “adding AI” to a business process. It treats AI as part of an &lt;strong&gt;operating workflow&lt;/strong&gt;, with explicit interfaces between probabilistic reasoning, deterministic tools, external information, and human accountability.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;A request to investigate online reviews became a small but substantial exercise in agentic system design. Multiple agents researched bounded problems; browser tools exposed real access constraints; public sources supplied partial corroboration; human-provided evidence corrected the initial analysis; Python quantified an important textual relationship; and structured artifacts carried the evidence into a decision report.&lt;/p&gt;

&lt;p&gt;The investigation did not prove that the reviews were fabricated. It established a narrower technical finding, identified a limited policy question, and documented precisely what would be required to go further.&lt;/p&gt;

&lt;p&gt;That is the central lesson: &lt;strong&gt;effective AI integration is not about producing a confident answer to every question. It is about designing a workflow that can make useful progress, show its evidence, admit its limits, and stop before claiming authority it does not possess.&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>agents</category>
      <category>ai</category>
      <category>analysis</category>
      <category>automation</category>
    </item>
    <item>
      <title>Learning Python After PHP</title>
      <dc:creator>CodeMonkeyG</dc:creator>
      <pubDate>Sat, 10 Oct 2026 00:00:00 +0000</pubDate>
      <link>https://dev.to/codemonkeyg/learning-python-after-php-3p0k</link>
      <guid>https://dev.to/codemonkeyg/learning-python-after-php-3p0k</guid>
      <description>&lt;p&gt;PHP is still one of the best answers to a very specific question: how do we get useful web software into production without making every decision from first principles? It has earned its place there. Modern PHP, especially with a framework like Laravel, offers a practical path from a request to a secure, testable application without requiring a team to invent an entire platform along the way.&lt;/p&gt;

&lt;p&gt;But learning Python after spending years in the PHP world has been a useful reminder that a language can feel familiar while changing the shape of the problems you reach for.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Difference Is Not Just Syntax
&lt;/h2&gt;

&lt;p&gt;Python is not magic, and I am not interested in pretending it is. The things that make software durable still matter: clear boundaries, explicit failure handling, tests, useful logging, and an understanding of what happens after code leaves a laptop.&lt;/p&gt;

&lt;p&gt;What has been interesting is how quickly Python gets out of the way once the problem is not fundamentally a web page. Data transformation, system integration, file processing, lightweight operational tools, and automation all feel close at hand. A script can start as a focused utility and grow into part of a repeatable workflow without demanding much ceremony.&lt;/p&gt;

&lt;p&gt;That makes it easy to see the division of labor that has emerged over time. PHP was chosen for the web because it makes the web approachable. Python has been chosen for so much else because it makes a broad range of technical work approachable.&lt;/p&gt;

&lt;h2&gt;
  
  
  FastAPI Makes an Excellent First Stop
&lt;/h2&gt;

&lt;p&gt;Most of my recent experimentation has been with FastAPI. It is a good fit for someone who already thinks in terms of endpoints, validation, authorization, and service boundaries. The familiarity is there, but the ergonomics are different.&lt;/p&gt;

&lt;p&gt;Type hints are a good example. In PHP, modern typing has become a meaningful part of writing maintainable code. In FastAPI, type information also directly shapes request validation, serialization, API documentation, and the development experience. A well-defined model does more than communicate intent to the next engineer; it helps the framework enforce the contract at the edge.&lt;/p&gt;

&lt;p&gt;That does not mean every API should be split into a standalone Python service. It means Python gives me another credible option when an API needs to sit near a data workflow, an automation process, or a computational task.&lt;/p&gt;

&lt;h2&gt;
  
  
  Scripts Become Workflow Building Blocks
&lt;/h2&gt;

&lt;p&gt;The bigger draw has been using Python scripts to create workflow pipelines. A small script can collect inputs, normalize them, call an external service, generate an artifact, and hand off a clean result to the next step. Once those pieces are explicit, they can be scheduled, retried, observed, and composed.&lt;/p&gt;

&lt;p&gt;That is useful far beyond “automation” as a vague buzzword. It is a way to remove repeated manual work while making the work easier to inspect. A pipeline should not just save time; it should make failures visible and leave a trail that explains what happened.&lt;/p&gt;

&lt;p&gt;Python has a mature ecosystem for this kind of work, but the ecosystem is only part of the story. The language encourages small, legible tools. That is a productive default when the goal is to connect systems rather than build a large application for its own sake.&lt;/p&gt;

&lt;h2&gt;
  
  
  Learning in the Age of AI Requires Some Friction
&lt;/h2&gt;

&lt;p&gt;There is one complication to learning a new language now: every editor wants to write it for you.&lt;/p&gt;

&lt;p&gt;Inline AI suggestions are useful when you already understand the language and are trying to move through familiar work faster. They are much less useful when the point is to build a mental model. If an IDE keeps offering the entire block, it is easy to accept code that looks reasonable before you understand its imports, control flow, error behavior, or idioms.&lt;/p&gt;

&lt;p&gt;My recommendation is simple: &lt;strong&gt;turn off inline suggestions right away when learning something new.&lt;/strong&gt; Keep an AI assistant available for questions, explanations, code review, or a second opinion, but create enough space to struggle through the first version yourself. That small amount of friction is where the syntax becomes instinct, the standard library becomes discoverable, and the trade-offs become visible.&lt;/p&gt;

&lt;p&gt;Later, turn the suggestions back on. By then, they will accelerate your work instead of substituting for the learning.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Broader Toolbox
&lt;/h2&gt;

&lt;p&gt;Learning Python has not made me less interested in PHP or in well-structured monoliths. It has made the toolbox clearer. PHP remains an excellent choice when the job is a web application that needs to become useful quickly and stay understandable as it grows.&lt;/p&gt;

&lt;p&gt;Python is compelling when the job extends beyond the request-response cycle: building an API around a data process, orchestrating a workflow, investigating a pile of documents, or writing the small piece of software that removes an entire category of manual work.&lt;/p&gt;

&lt;p&gt;The joy of moving into a new language is not discovering that the old one was wrong. It is recognizing more clearly which tool belongs in which hand.&lt;/p&gt;

</description>
      <category>learning</category>
      <category>php</category>
      <category>programming</category>
      <category>python</category>
    </item>
    <item>
      <title>Learning React After Vue</title>
      <dc:creator>CodeMonkeyG</dc:creator>
      <pubDate>Thu, 08 Oct 2026 00:00:00 +0000</pubDate>
      <link>https://dev.to/codemonkeyg/learning-react-after-vue-32c6</link>
      <guid>https://dev.to/codemonkeyg/learning-react-after-vue-32c6</guid>
      <description>&lt;p&gt;Vue is one of the easiest frameworks to recommend to someone who wants to build an interface without first absorbing an entire ecosystem. Its templates read naturally, its conventions are clear, and the path from a simple component to a working application is remarkably direct.&lt;/p&gt;

&lt;p&gt;Coming from Vue, React feels more open-ended. That is both its cost and its advantage.&lt;/p&gt;

&lt;h2&gt;
  
  
  Vue Makes the First Steps Clear
&lt;/h2&gt;

&lt;p&gt;Vue gives developers a well-lit path. Templates, reactive state, computed values, and component conventions fit together in a way that is easy to explain and easy to revisit after time away from a project. For teams that want a productive, coherent front-end framework, that clarity is a real strength.&lt;/p&gt;

&lt;p&gt;React asks for more decisions. JSX blends markup and behavior. State management can range from a few hooks to a broader application architecture. Routing, data fetching, form handling, and build tooling all have strong options, but not always one officially prescribed answer.&lt;/p&gt;

&lt;p&gt;That can feel like unnecessary complexity until the application has to fit into a larger organization.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why React Remains King
&lt;/h2&gt;

&lt;p&gt;React has remained the industry standard not because it is always the simplest option, but because its ecosystem solves an enormous range of real production problems.&lt;/p&gt;

&lt;p&gt;The talent pool is deep. The component ecosystem is mature. Documentation, examples, integrations, and experienced opinions are plentiful. When an application needs to connect to an established design system, analytics platform, API client, authentication provider, or testing tool, there is usually a well-traveled React path already available.&lt;/p&gt;

&lt;p&gt;That matters to businesses. A framework decision is not only about how fast one developer can create a component today. It is also about hiring, onboarding, support, long-term maintenance, and the probability that the next team can understand the codebase without starting from scratch.&lt;/p&gt;

&lt;p&gt;React's flexibility also works well when a front end has to grow beyond a single interface. It can support a focused embedded widget, a full application, server-rendered experiences, and shared component libraries. The same fundamentals travel across all of them.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Shift in Mental Model
&lt;/h2&gt;

&lt;p&gt;The most useful transition from Vue to React is not memorizing hook signatures. It is getting comfortable with rendering as a function of state.&lt;/p&gt;

&lt;p&gt;In Vue, the framework's reactivity system handles much of the connection between changing data and changing markup in a very approachable way. In React, it is worth being deliberate about what state belongs where, what should be derived rather than stored, and how component boundaries communicate.&lt;/p&gt;

&lt;p&gt;Those questions exist in every framework. React simply makes them harder to ignore. That can be a benefit. A team that is clear about state ownership and component responsibilities tends to produce interfaces that are easier to evolve.&lt;/p&gt;

&lt;h2&gt;
  
  
  Vue Is Not the Wrong Choice
&lt;/h2&gt;

&lt;p&gt;None of this makes Vue a lesser framework. Vue remains an excellent choice for teams that value its conventions, for products where its development experience is a natural fit, and for developers who want to move quickly without losing structure.&lt;/p&gt;

&lt;p&gt;The better question is not which framework wins every comparison. It is which ecosystem best supports the product, the team, and the work that comes next.&lt;/p&gt;

&lt;p&gt;For many organizations, React wins that question because it has become the common language of front-end hiring and tooling. Learning it is therefore less about following a trend and more about being able to operate comfortably in the broadest part of the web-development market.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Next Step: React Native
&lt;/h2&gt;

&lt;p&gt;One reason React is especially worth learning is that it creates a credible path toward React Native. The rendering primitives change, and mobile development introduces its own concerns around navigation, devices, deployment, and platform behavior. But the component model, state-management instincts, and much of the development workflow carry forward.&lt;/p&gt;

&lt;p&gt;That does not mean web developers can treat mobile applications as a free byproduct. Good mobile software deserves the same attention to user experience, performance, accessibility, and operational support as any other product. It does mean React provides a practical bridge: learn the core model on the web, then apply that foundation to native mobile work when the problem calls for it.&lt;/p&gt;

&lt;p&gt;Vue made it easy to get productive in component-based development. React is making the wider ecosystem easier to navigate. Both are useful tools; React is simply the one that opens the most doors right now.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>learning</category>
      <category>react</category>
      <category>vue</category>
    </item>
    <item>
      <title>The Shape of a Career</title>
      <dc:creator>CodeMonkeyG</dc:creator>
      <pubDate>Sat, 26 Sep 2026 00:00:00 +0000</pubDate>
      <link>https://dev.to/codemonkeyg/the-shape-of-a-career-2pii</link>
      <guid>https://dev.to/codemonkeyg/the-shape-of-a-career-2pii</guid>
      <description>&lt;p&gt;With a birthday approaching and one long professional chapter recently closed, I have been thinking less about what a career looks like on paper and more about the shape it takes while you are living it.&lt;/p&gt;

&lt;p&gt;Résumés prefer straight lines. They turn years into dates, responsibilities into bullets, and hard decisions into tidy transitions. That is useful. A résumé needs to make sense quickly to someone who was not there. But it cannot capture the detours: the project that taught you something your title did not, the customer conversation that changed how you design systems, or the role that looked temporary and became foundational.&lt;/p&gt;

&lt;p&gt;Looking back, my own path has not been especially straight. I started by building custom applications and commerce systems for a wide range of clients. That work required wearing every hat before I had names for most of them: discovery, design, development, deployment, support, and the uncomfortable but necessary work of explaining trade-offs to people who did not care what framework I preferred.&lt;/p&gt;

&lt;p&gt;Later came security products, public-sector modernization, enterprise identity, and eventually hospitality technology. On a spreadsheet, that can look like a collection of unrelated industries. In practice, the work kept returning to the same questions: What is the real problem? Which system actually owns the data? Where does the handoff fail? What has to be true for a solution to survive contact with production and the people who depend on it?&lt;/p&gt;

&lt;h2&gt;
  
  
  Detours Build a Different Kind of Depth
&lt;/h2&gt;

&lt;p&gt;At different points, I have been asked to make an interface usable, stabilize an integration, enter an unfamiliar codebase, build a demonstration that could survive serious questions, or turn an operational process into software. None of those tasks were interchangeable. Together, they built a way of working.&lt;/p&gt;

&lt;p&gt;That is the advantage of a career that does not follow a perfectly prescribed track. You begin to see patterns that are hard to learn from one specialty alone. A technical issue is often a communication issue in disguise. A customer request may be a data-model problem. A beautiful architecture that nobody can deploy or support is not complete. A quick fix without a clear operating model becomes tomorrow's incident.&lt;/p&gt;

&lt;p&gt;The deeper lesson is not that every detour is good. Some are expensive. Some teach the same lesson twice because we were not ready to learn it the first time. But a route that looks inefficient from far away can still produce judgment, range, and resilience. Those are not always the easiest strengths to list, but they are often the ones that matter when the requirements are ambiguous and the stakes are real.&lt;/p&gt;

&lt;h2&gt;
  
  
  What a Decade of Ownership Clarifies
&lt;/h2&gt;

&lt;p&gt;The most recent chapter lasted long enough to make that idea concrete. Building and operating a hospitality platform from its earliest days meant living with the full arc of technical work: discovery sessions, proofs of concept, executive demonstrations, integrations with legacy systems, production incidents, performance constraints, and the quiet maintenance work that keeps a product trustworthy.&lt;/p&gt;

&lt;p&gt;It also meant learning that ownership is not the same as control. A founding engineer can build a great deal, but no one person owns the market, the company, the timing, or every decision that shapes the next phase. There is a particular kind of honesty required when a long partnership comes to an end. You can acknowledge what was built, be grateful for the people and problems that made you better, and still recognize that it is time to move on.&lt;/p&gt;

&lt;p&gt;Leaving a company after years of shared effort is not a clean subtraction. There is loss in it, even when the separation is the right one. There is also room. The end of a role removes familiar responsibilities, but it can return questions that routine had pushed aside: What do I want to learn now? Which problems do I want to solve? What kind of team and product deserve the next stretch of attention?&lt;/p&gt;

&lt;h2&gt;
  
  
  The Value of Not Being Easily Reduced
&lt;/h2&gt;

&lt;p&gt;There is a Chinese proverb that says, “A crooked tree lives its own life, while a straight tree is turned into wood.” I have found that image useful lately, not as an argument against being useful, but as a reminder that usefulness is bigger than fitting neatly into one narrow category.&lt;/p&gt;

&lt;p&gt;The career version of that idea is not to become difficult for its own sake. It is to resist becoming so optimized for one job that you cannot recognize the next one. The ability to move between customer conversations and code, architecture and operations, legacy constraints and new tools has sometimes made for a less conventional title. It has also made it possible to contribute where the boundary lines are unclear.&lt;/p&gt;

&lt;p&gt;That range is why I still care about a pragmatic monolith when it is the right starting point, and why I am spending time with Python, FastAPI, workflow pipelines, and React rather than treating the tools that built the last decade as the only tools worth knowing. Technologies change. The underlying habit is more durable: understand the work in front of you, choose the simplest reliable path, and keep learning before the environment forces you to.&lt;/p&gt;

&lt;h2&gt;
  
  
  Carrying the Right Things Forward
&lt;/h2&gt;

&lt;p&gt;As this birthday gets closer, I am less interested in making a case for a single, polished career narrative. I am more interested in taking inventory.&lt;/p&gt;

&lt;p&gt;I want to carry forward the patience required to understand complicated systems, the confidence to speak plainly with customers and executives, and the humility to investigate before declaring a solution. I want to keep building things that reduce real friction for people doing real work. I want to continue learning languages and frameworks without confusing novelty for progress.&lt;/p&gt;

&lt;p&gt;Most of all, I want to keep enough of the irregular shape that got me here. Not every useful life or career is built in a straight line. Sometimes the bends are evidence of adaptation. Sometimes they are where the most interesting work begins.&lt;/p&gt;

&lt;p&gt;The next chapter does not need to erase the previous one to be meaningful. It only needs to make honest use of what came before.&lt;/p&gt;

</description>
      <category>career</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Why I Still Start With Monoliths</title>
      <dc:creator>CodeMonkeyG</dc:creator>
      <pubDate>Tue, 22 Sep 2026 00:00:00 +0000</pubDate>
      <link>https://dev.to/codemonkeyg/why-i-still-start-with-monoliths-5hlb</link>
      <guid>https://dev.to/codemonkeyg/why-i-still-start-with-monoliths-5hlb</guid>
      <description>&lt;p&gt;Nowadays, everyone with access to AI can build an app. Which is basically everyone at this point. But what happens when your brilliant idea that you vibe coded in a couple of hours needs to get deployed? How will you handle real network traffic? How will you make sure things are secure? This is where an actual software engineer has to step in and take over.&lt;/p&gt;

&lt;p&gt;When it's my turn to start a new project, sure, I prompt along with the rest but if it's more than just a couple of scripts, I always set the start point as a monolith. &lt;/p&gt;

&lt;p&gt;I understand that it is a controversial opinion in a world where everything is about micro services and moving as quickly as possible. However, I argue that if the goal is to build something useful as quickly as possible that the monolith will get you there first and much more securely than a mesh of microservices that each require its own management, deployment, and maintenance. &lt;/p&gt;

&lt;h2&gt;
  
  
  When Microservices Make Sense
&lt;/h2&gt;

&lt;p&gt;Microservices still have a place. If you look around at what the big tech companies are doing you will see that if they haven't already moved to a microservices-based architecture, it is likely because they are still in the process of doing so or because they tried it, got burned by the complexity, and pulled back toward something more modular but still unified. Startups and big companies aren't optimizing for the same thing, and pretending they are is how people get into trouble.&lt;/p&gt;

&lt;h2&gt;
  
  
  How The Monolith Wins
&lt;/h2&gt;

&lt;p&gt;But just as Alphabet and Meta got their start, when the team is small (or even just one person) the monolith lets everyone work and test together with a much smaller iteration cycle. While the most time consuming part may be to make sure your local repository is up to date, you also don't have to worry about multiple repositories, multiple orchestrations with environments or containers. You don't even have to wait for someone else to fix a bug that is blocking you because everything is in the monolith and you can go fix the bug yourself. The monolith provides the grounding point that allows the team to explore and move quickly.&lt;/p&gt;

&lt;p&gt;As an example, my current go-to is Laravel. One battle tested and hardened framework with the support of an entire community of software engineers and the backing from businesses that depend on it. One framework providing all the authentication, authorization, database modeling, API endpoints, front-end interface, testing harness, etc. It's all there when you take the monolith out of the box. This means a team from one to many can get to work on their idea right away and know that they are standing on the shoulders of giants. They can focus on building their best airplane instead of having to discover flight all over again.&lt;/p&gt;

&lt;p&gt;As the project scales the monolith is deployed to a group of auto-scaling servers. Each server handles whole transactions and network requests. As more machines are added, the monolith is duplicated in its entirety so newly added machines can handle more network traffic without needing autoscaling configurations for various services within your application, leading to dev-ops complexity. That simplicity has limits, though. The trade-off is that you can't split the load the way a microservice mesh can: if a single hot endpoint starts eating resources, you still have to put the whole thing on bigger machines. That's fine until it isn't. And when it stops being fine, you'll know, because the pain will be concrete instead of hypothetical.&lt;/p&gt;

&lt;h2&gt;
  
  
  What a Monolith Leaves on the Table
&lt;/h2&gt;

&lt;p&gt;Of course, as with anything in software, there is a cost to every decision. In order to reap the benefits of building with a monolith you will be giving up some other things. One thing you will have to set aside for later is the hyper-optimization of various services within the app. When you deploy the monolith to a new server you deploy the whole thing. This means, for example, if the CRUD endpoints for "user_comments" are getting hammered and eating up system resources you can't deploy new machines just big enough for just the "user_comments". You have to deploy on machines big enough to support the whole monolith. Something else you may leave on the table is easily swapping small modules when a new framework or piece of tech is available. With a monolith, you have to commit. Lean in to what you have until you have something that generates enough financial or human resources on its own that you can decide later to update, upgrade, or carve up the monolith into its respective microservices.&lt;/p&gt;

&lt;p&gt;The flip side of all that commitment is that the boundaries between pieces of your code get blurry over time. A change in one place can have effects somewhere else, and the person who wrote the original feature may not be around to know which wire you're about to cross. That's the part people often forget when they talk about monoliths being "easy". Easy to deploy, yes, but the mental model of the whole thing has to fit in one team's head, and that only works up to a point. When it stops working, you'll feel it as a slowdown in how fast you can move without breaking something. That slowdown is the real signal that it's time to think about carving things apart.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where Can You Deploy the Monolith
&lt;/h2&gt;

&lt;p&gt;One of the advantages of the monolith is also deploy-ability. Because it is all one single asset to be deployed, you can choose. Do you want to run on the bare metal of the machine? No big deal since the machine doesn't have anything else to worry about, you can install all necessary dependencies, update the code on the machine and &lt;code&gt;sudo service start&lt;/code&gt;. Feel like you would prefer to take advantage of containerization? That's just as easy, because the same run list applies to your containers and now you have a deploy-able package you can take to any server. No large orchestration required. A microservice might be a single container too, but with a monolith there's only one of them to worry about instead of a whole mesh.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who Cares?
&lt;/h2&gt;

&lt;p&gt;Anybody getting started on a new project. If it's an internal project for your company that has any chance of being spun off into a standalone tool or product. Frankly, in my experience the monolith has served me well. I have been part of several successful start-ups using monoliths (including one I built the tech for from the ground up). If you are looking to get serious and you are looking to actually push for real growth, nothing beats the maintainability, stability, and flexibility of the monolith.&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>backend</category>
      <category>softwaredevelopment</category>
      <category>softwareengineering</category>
    </item>
  </channel>
</rss>
