<?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>Forem: Promise</title>
    <description>The latest articles on Forem by Promise (@ceopro).</description>
    <link>https://forem.com/ceopro</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F780244%2F9feb3d4c-05d3-4f85-a15b-a9e444761815.png</url>
      <title>Forem: Promise</title>
      <link>https://forem.com/ceopro</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/ceopro"/>
    <language>en</language>
    <item>
      <title>Toxic Relationships 💔: When Your Agents Hallucinate</title>
      <dc:creator>Promise</dc:creator>
      <pubDate>Fri, 13 Feb 2026 11:25:39 +0000</pubDate>
      <link>https://forem.com/prodevel/toxic-relationships-when-your-agents-hallucinate-1cpb</link>
      <guid>https://forem.com/prodevel/toxic-relationships-when-your-agents-hallucinate-1cpb</guid>
      <description>&lt;p&gt;Love is blind, but in production, blind trust is a fatal architectural flaw.&lt;/p&gt;

&lt;p&gt;This Valentine’s Day, while others talk about chemistry, let’s talk about state divergence. The most toxic relationship in your stack is the one between an unmoderated Lead Agent and a specialised Worker. Without strict validation, your agents will start finishing each other's sentences in the worst way possible: by hallucinating context that doesn't exist.&lt;/p&gt;

&lt;p&gt;Reliability in autonomous systems isn't about better prompting. It is about better boundaries. When you allow an agent to update your global state without a verification layer, you are essentially allowing a non-deterministic process to rewrite your source of truth.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Actor-Critic Architecture
&lt;/h3&gt;

&lt;p&gt;Instead of a linear chain of command, we deploy an Actor-Critic pattern. This separates the creative process of problem-solving from the rigid process of validation. The Actor proposes a solution, but the Critic, governed by a different set of constraints and tools, must sign off on the work before it is committed to the state.&lt;/p&gt;

&lt;p&gt;The diagram below illustrates this relationship. Notice that the human is not a bottleneck for every task, but sits behind a high-integrity gate for critical actions.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;graph TD
    A[User Request] --&amp;gt; B{Lead Orchestrator}
    B --&amp;gt; C[Actor Agent: Generation]
    C --&amp;gt; D[Proposed Action/Code]
    D --&amp;gt; E{Critic Agent: Validation}
    E -- Rejected: Hallucination Detected --&amp;gt; C
    E -- Approved: Schema Validated --&amp;gt; F[Human-in-the-Loop Gate]
    F -- Approved --&amp;gt; G[Production Execution]
    F -- Denied --&amp;gt; B
    G --&amp;gt; H[Update Global State]

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Breaking the Feedback Loop
&lt;/h3&gt;

&lt;p&gt;The danger of agentic relationships is the echo chamber effect. If an Actor Agent makes a mistake and the Orchestrator accepts it as fact, every subsequent step in the graph is built on a lie. We break this by ensuring the Critic has access to an independent source of truth, such as a read-only database or a static documentation repository, which the Actor cannot influence.&lt;/p&gt;

&lt;p&gt;By the time the process reaches a Human-in-the-Loop gate, the "relationship" between the agents has already filtered out the noise. The human isn't there to fix basic logic errors. They are there to provide high-level strategic approval.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Strategic Benefit
&lt;/h3&gt;

&lt;p&gt;Moving from blind execution to Actor-Critic orchestration changes the ROI of your AI initiatives. You spend less time debugging erratic behaviour and more time scaling the system.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Reduced Token Waste:&lt;/strong&gt; Catching errors early in the graph prevents expensive, long-running loops based on false premises.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Auditability:&lt;/strong&gt; Every disagreement between the Actor and Critic is logged, providing a clear map of where your prompts or tools need refinement.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Governance:&lt;/strong&gt; You can swap out the Actor for a cheaper model while keeping a high-frontier model as the Critic to maintain quality control.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Stop falling in love with your first prototype. Build an orchestration layer that challenges its own assumptions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Would you like me to design a specific Critic schema for your most frequent agent failure modes?&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>valentines</category>
      <category>agents</category>
      <category>hallucination</category>
    </item>
    <item>
      <title>Agentic Amnesia: The State Management Crisis</title>
      <dc:creator>Promise</dc:creator>
      <pubDate>Sat, 07 Feb 2026 03:08:26 +0000</pubDate>
      <link>https://forem.com/prodevel/agentic-amnesia-the-state-management-crisis-6am</link>
      <guid>https://forem.com/prodevel/agentic-amnesia-the-state-management-crisis-6am</guid>
      <description>&lt;p&gt;The most significant bottleneck in 2026 enterprise AI isn't model intelligence. It is memory.&lt;/p&gt;

&lt;p&gt;We see it weekly at Prodevel. A firm deploys a sophisticated multi-agent system to handle supply chain logistics or legal discovery. For the first three steps, the system is brilliant. By step four, the agents begin to wander. By step six, they have forgotten the original constraint entirely. This is agentic amnesia: the catastrophic loss of context that occurs when an autonomous system fails to maintain a persistent, coherent state.&lt;/p&gt;

&lt;p&gt;In the early days of 2024, we relied on long context windows to solve this. We simply stuffed the entire conversation history into the prompt. But in a production environment where agents interact with dozens of tools and generate thousands of tokens, "context stuffing" is both expensive and noisy. It leads to the lost-in-the-middle phenomenon, where the model ignores the very instructions that matter most.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Architecture of Remembrance
&lt;/h3&gt;

&lt;p&gt;To solve this, Prodevel has moved away from stateless chains. We treat agentic workflows as long-running processes that require a dedicated state backend. If your agent doesn't have a "checkpoint" system, it isn't an enterprise tool. It is a toy.&lt;/p&gt;

&lt;p&gt;We utilize a state-first design pattern. Instead of passing a growing string of text between agents, we pass a pointer to a structured state object stored in a persistent layer like Redis or Postgres.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Check-pointing:&lt;/strong&gt; Every time an agent calls a tool or makes a decision, the state is saved. If the execution environment crashes, the agent resumes from the last known good state rather than restarting the entire reasoning loop.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Thread Scoping:&lt;/strong&gt; We decouple the short-term working memory (the current task) from the long-term archival memory (the project history).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;State Summarisation:&lt;/strong&gt; As the state grows, a background "Summariser Agent" compresses older interactions into high-signal metadata. This keeps the active context window lean and focused.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Technical Implementation: The Checkpointer Pattern
&lt;/h3&gt;

&lt;p&gt;Here is how we implement persistent state management in a 2026 agentic graph using a TypeScript-based orchestration layer. This ensures that the agent retains its "identity" and progress across asynchronous tool calls.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;StateGraph&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@langchain/langgraph&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;RedisSaver&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@langchain/langgraph-checkpoint-redis&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// Define the schema for our persistent state&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;StateSchema&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;plan&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;y&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;y&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;default&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;completed_steps&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;y&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;x&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;concat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;y&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="na"&gt;default&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;current_error_count&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;y&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;y&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;default&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="c1"&gt;// Initialize the Redis-based checkpointer for 2026 production loads&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;checkpointer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;RedisSaver&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; 
  &lt;span class="na"&gt;uri&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;REDIS_URL&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;redis://localhost:6379&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; 
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="c1"&gt;// Build the graph with a 'Thread ID' for persistence&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;workflow&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;StateGraph&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;channels&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;StateSchema&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addNode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;researcher&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;researchNode&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addNode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;writer&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;writingNode&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addEdge&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;researcher&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;writer&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// The 'thread_id' is the secret to curing amnesia&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;workflow&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;compile&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;checkpointer&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;config&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;configurable&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;thread_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;project_finance_audit_001&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;invoke&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;plan&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Analyze Q4 data&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Check compliance&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="nx"&gt;config&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  The Strategic Moat
&lt;/h3&gt;

&lt;p&gt;Founders often ask why they should invest in custom orchestration rather than using a standard chat interface. The answer is reliability. A stateless agent is a liability because its failure mode is silent and unpredictable.&lt;/p&gt;

&lt;p&gt;A state-managed system provides a full audit trail. You can see exactly where the logic diverged. You can rewind the state, fix the underlying tool or prompt, and re-run the execution from the point of failure. This isn't just better engineering. It is the only way to build a moat around your AI operations in 2026.&lt;/p&gt;

&lt;p&gt;If your agents are currently wandering in circles, you don't have a model problem. You have a state problem.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Would you like me to review your current orchestration logic to identify where your state is leaking?&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>langchain</category>
      <category>agentic</category>
      <category>ai</category>
    </item>
    <item>
      <title>5 skills you need to develop as a recent Computer Science Graduate</title>
      <dc:creator>Promise</dc:creator>
      <pubDate>Fri, 06 Feb 2026 16:23:09 +0000</pubDate>
      <link>https://forem.com/prodevel/5-skills-you-need-to-develop-as-a-recent-computer-science-graduate-3om1</link>
      <guid>https://forem.com/prodevel/5-skills-you-need-to-develop-as-a-recent-computer-science-graduate-3om1</guid>
      <description>&lt;h2&gt;
  
  
  The Post-Syntax Era: 5 Skills for the 2026 CS Graduate
&lt;/h2&gt;

&lt;p&gt;Congratulations. You have graduated into the most volatile labour market in the history of computing.&lt;/p&gt;

&lt;p&gt;In 2026, the industry has undergone a fundamental decoupling. Writing syntax is no longer the moat for a software engineer. LLMs and autonomous agents have commoditised boilerplate, unit testing, and even complex refactoring. If you enter the workforce expecting to be a coder, you are already obsolete.&lt;/p&gt;

&lt;p&gt;At Prodevel, we look for systems architects in training. These are graduates who understand that software is now a collaborative dance between human intent and agentic execution. Here are the five non-negotiable skills you need to survive and thrive in 2026.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Agentic Orchestration and Graph Logic
&lt;/h3&gt;

&lt;p&gt;By now, prompt engineering is a relic of 2024. Today, we build agentic workflows. You need to move beyond single-turn chats and learn to design multi-agent systems where specialised models, such as Architects, Coders, and Reviewers, collaborate within a state-controlled environment.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The Technical Shift: Mastering frameworks like LangGraph or PydanticAI to manage cycles and state.&lt;/li&gt;
&lt;li&gt;Why it matters: You aren't writing the code. You are writing the logic that governs the agents writing the code.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. Context Engineering and RAG 2.0
&lt;/h3&gt;

&lt;p&gt;In 2026, the bottleneck isn't the model's parameters. It is the data you feed it. Retrieval-Augmented Generation (RAG) has evolved from simple vector searches into complex agentic RAG pipelines that utilise knowledge graphs and hybrid search.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The Skill: Understanding how to structure unstructured data, including PDFs, Slack logs, and Notion, into a format an LLM can actually reason over without hallucinating on outdated context.&lt;/li&gt;
&lt;li&gt;Prodevel Insight: If you can't manage a vector database like Pinecone or Weaviate and optimise a retrieval pipeline, you are effectively flying blind.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. Security-by-Design and Agentic Guardrails
&lt;/h3&gt;

&lt;p&gt;With autonomous agents operating at scale, the attack surface has exploded. We have seen prompt injection evolve into agent hijacking, where malicious actors attempt to take control of an agent’s tool-calling capabilities.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The Requirement: You must understand the OWASP Top 10 for LLMs.&lt;/li&gt;
&lt;li&gt;Implementation: Learning to deploy strict Human-in-the-Loop (HITL) gates and sandbox environments for agent-executed code. In 2026, a developer who ships an agent without execution guardrails is a liability.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4. Mathematical Foundations (The Deep T-Shape)
&lt;/h3&gt;

&lt;p&gt;While tools change every six months, the math doesn't. To debug a model that is behaving erratically, you need to understand what is happening under the bonnet.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The Core: Linear algebra, probability, and transformer architecture.&lt;/li&gt;
&lt;li&gt;The Value: When an agent gets stuck in a reasoning loop, a junior dev tries a different prompt. A Prodevel engineer analyses the attention mechanism or temperature settings to fix the root cause.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  5. Multi-Cloud and Edge Deployment
&lt;/h3&gt;

&lt;p&gt;The cloud is no longer just AWS or Azure. In 2026, we are deploying smaller, domain-specific models (SLMs) to the edge. This includes mobile devices, IoT, and local servers to reduce latency and cost.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The Toolset: Kubernetes, Docker, and WebAssembly (Wasm) for running high-performance AI logic in the browser or at the edge.&lt;/li&gt;
&lt;li&gt;Strategic Advantage: Companies are desperate for engineers who can balance the intelligence-to-cost ratio by deciding when to use a frontier model versus a local, fine-tuned Llama-4 variant.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Tool Definition Logic
&lt;/h3&gt;

&lt;p&gt;In 2026, we spend more time defining tools than functions. Here is how a Prodevel engineer defines a type-safe tool for an agent using TypeScript:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;z&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;zod&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;DatabaseQueryTool&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;query_production_db&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Executes read-only SQL queries. Requires Human-in-the-loop for DELETE/UPDATE.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;schema&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;z&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;object&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;query&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;z&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;string&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;describe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;The SQL query to execute&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="na"&gt;limit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;z&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;number&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="k"&gt;default&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="p"&gt;}),&lt;/span&gt;
  &lt;span class="na"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;query&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;limit&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="nx"&gt;context&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;forbidden&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;DELETE&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;DROP&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;UPDATE&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;TRUNCATE&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;forbidden&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;some&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;word&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;query&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toUpperCase&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;includes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;word&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Unauthorized: Destructive queries require manual sign-off via HITL-Gate.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;readOnlyPool&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;query&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;query&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;limit&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  The Bottom Line
&lt;/h3&gt;

&lt;p&gt;The 2026 Computer Science degree is a ticket to the stadium, not a seat in the VIP box. To stay relevant, you must pivot from being a builder of software to an &lt;strong&gt;orchestrator of intelligence&lt;/strong&gt;.&lt;/p&gt;

</description>
      <category>programming</category>
      <category>workplace</category>
      <category>ai</category>
      <category>upskilling</category>
    </item>
    <item>
      <title>So .. I coded in Python</title>
      <dc:creator>Promise</dc:creator>
      <pubDate>Wed, 10 Jan 2024 17:14:27 +0000</pubDate>
      <link>https://forem.com/ceopro/so-i-coded-in-python-2gal</link>
      <guid>https://forem.com/ceopro/so-i-coded-in-python-2gal</guid>
      <description>&lt;p&gt;I have been using PHP for as long as I can remember. However, recently, I decided to pick up another programming language. As an API developer, one of the my biggest searches when building scalable APIs is how much requests can the api take before giving up.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnevebhe2twuqjraqmmas.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnevebhe2twuqjraqmmas.jpg" alt="Photo by Markus Spiske: https://www.pexels.com/photo/black-laptop-computer-turned-on-showing-computer-codes-177598/" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I initially attempted to learn Scala but that syntax looked like hieroglyphics to me and the set up was just way to cumbersome. I also tried working on other (backend) languages like Go and even NodeJS. &lt;em&gt;By the way, Scala is really fast. No seriously!&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Finally, I decided to give Python a real go (no pun intended). It was tedious at first, you had to indent properly. A case of a missing line can cost you sleepless debug minutes.&lt;/p&gt;

&lt;p&gt;Then you have random variables like *&lt;em&gt;**kwargs&lt;/em&gt;* and the rest. Sigh.&lt;/p&gt;

&lt;p&gt;After breaking through the initial barriers however, I started to appreciate the language some more. I learnt about list comprehension, the difference between (lists) and dicts, strict typings and my personal favourite; &lt;a href="https://peps.python.org/pep-0544/" rel="noopener noreferrer"&gt;Protocols&lt;/a&gt;.&lt;br&gt;
&lt;em&gt;Photo by Markus Spiske: &lt;a href="https://www.pexels.com/photo/black-laptop-computer-turned-on-showing-computer-codes-177598/" rel="noopener noreferrer"&gt;https://www.pexels.com/photo/black-laptop-computer-turned-on-showing-computer-codes-177598/&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Also, great thanks to the team at Django for an awesome framework, definitely made things a lot smoother. I have now completed my first project that I will be shipping into production this week. What a journey it has been. Sure it could have been easier with PHP, but back to the latency issue. My code looks more succint and chops through tasks at an alarming rate (this is a good thing).&lt;/p&gt;

&lt;p&gt;So if you are looking for a part time language, pick Python. I mean, look at this beauty:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;        if res.ok:
            response_body = json.loads(res.content)
            web_ids = {item['reference']: item['id'] for item in response_body['data']}
            cases = [When(reference=key, then=value) for key, value in web_ids.items()]
            Place.objects.filter(reference__in=web_ids.keys()).update(webId=Case(*cases))
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here is an AI generated joke for you:&lt;/p&gt;

&lt;h3&gt;
  
  
  Why do Python programmers prefer dark mode?
&lt;/h3&gt;

&lt;p&gt;Because light attracts bugs!&lt;/p&gt;

</description>
    </item>
    <item>
      <title>DB Search and Replace. The automated kind</title>
      <dc:creator>Promise</dc:creator>
      <pubDate>Wed, 03 Aug 2022 21:28:00 +0000</pubDate>
      <link>https://forem.com/ceopro/search-and-replace-in-laravel-58f1</link>
      <guid>https://forem.com/ceopro/search-and-replace-in-laravel-58f1</guid>
      <description>&lt;p&gt;Imagine you had to make a change in your database records. You have been assigned the task of updating the affected records. There is only one problem: you do not know which tables or how many records are affected. What do you do?&lt;/p&gt;

&lt;p&gt;That was an actual scenario that occurred sometime this week. Except, it wasn't some nefarious line of code. It was time to fix those horrible class names used in Laravel relationships. You know what I am talking about: the &lt;code&gt;App\Models\User&lt;/code&gt; kind littered across the database. &lt;/p&gt;

&lt;p&gt;This tutorial will show you how to run a search and replace using Laravel's built-in migration and DB classes. It should help you avoid manually running a search and replace or using an external tool.&lt;/p&gt;

&lt;h2&gt;
  
  
  Create a migration
&lt;/h2&gt;

&lt;p&gt;Generate a migration file using the artisan console.&lt;br&gt;
&lt;code&gt;php artisan make:migration search_replace_relationships&lt;/code&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Search and replace logic
&lt;/h2&gt;

&lt;p&gt;Remember, you do not know what tables are affected and what column so, you cannot run: &lt;code&gt;DB::update()&lt;/code&gt;. Instead, we have to do the following:&lt;br&gt;
Get a list of items to search for and replace&lt;br&gt;
Get a list of tables&lt;br&gt;
Get a list of columns in each table&lt;br&gt;
Run a nested for loop&lt;br&gt;
If you are updating multiple items, you will need an additional loop for each item you wish to replace.&lt;/p&gt;
&lt;h3&gt;
  
  
  Get a list of changes
&lt;/h3&gt;

&lt;p&gt;In this case, we are replacing relationship morphs. You can create a morph map as described &lt;a href="https://laravel.com/docs/9.x/eloquent-relationships#custom-polymorphic-types" rel="noopener noreferrer"&gt;here&lt;/a&gt;. For example, our morph map looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Relation::morphMap([
            'user' =&amp;gt; User::class,
            'post' =&amp;gt; Post::class,
        ]);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We can then retrieve the morph map using:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$morphMap = \Illuminate\Database\Eloquent\Relations\Relation::morphMap();
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Get a list of all tables
&lt;/h3&gt;

&lt;p&gt;I could not find native support for retrieving table names in Laravel. Alternatively, you can run this query to retrieve a list of database tables.&lt;br&gt;
&lt;code&gt;$tables   = \Illuminate\Support\Facades\DB::select('SHOW TABLES');&lt;/code&gt;&lt;br&gt;
&lt;a href="https://stackoverflow.com/questions/33478988/how-to-fetch-the-tables-list-in-database-in-laravel-5-1" rel="noopener noreferrer"&gt;Inspired by&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Get a list of columns for each table
&lt;/h3&gt;

&lt;p&gt;Here is our first loop.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;foreach ($tables as $table) {
            $tableName = $table-&amp;gt;{sprintf('Tables_in_%s',
                \Illuminate\Support\Facades\DB::connection()-&amp;gt;getDatabaseName())};
            $columns   = Schema::getColumnListing($tableName);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The result of the first query to retrieve the table names returns an array of objects. Each object key is &lt;code&gt;Tables_in_dbname&lt;/code&gt;.  Using the correct key syntax, get to the value which holds the actual table name.&lt;br&gt;
Next, we use the &lt;code&gt;Schema&lt;/code&gt; class to get the columns of the table name while still in the loop.&lt;/p&gt;
&lt;h3&gt;
  
  
  Run a nested loop
&lt;/h3&gt;

&lt;p&gt;Here comes our first nested loop. For each table, loop through each column to find the text that we want to change and perform the replacement:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;foreach ($columns as $column) {
                $columnType = Schema::getColumnType($tableName, $column);
                if ($columnType === 'string') {
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We use the &lt;code&gt;Schema::getColumnType&lt;/code&gt; function to get the type of the column. That is because in this case, we are replacing the morph types so we know that the field for morph types is usually a string. If this is different in your setup (very unlikely) you can skip this entirely.&lt;/p&gt;

&lt;h3&gt;
  
  
  Run the replace
&lt;/h3&gt;

&lt;p&gt;Finally, we run the search and replace logic.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;\Illuminate\Support\Facades\DB::table($tableName)-&amp;gt;where($column, $value)-&amp;gt;update([$column =&amp;gt; $key]);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Retrieve an instance of the table, then search for the value in each column and replace it using the update function. &lt;br&gt;
The SQL equivalent is:&lt;br&gt;
&lt;code&gt;UPDATE FROM $tableName where $column = $value SET $column = $key&lt;/code&gt; the &lt;code&gt;$key&lt;/code&gt; in this case being the &lt;code&gt;user&lt;/code&gt; for the first item in our morph map and &lt;code&gt;$value&lt;/code&gt; being the class name in this case &lt;code&gt;App\Models\User&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Please note that the update method does not fire any eloquent events, which is the behaviour we want since we are running a migration.&lt;/p&gt;
&lt;h2&gt;
  
  
  Bring it all together.
&lt;/h2&gt;

&lt;p&gt;In your migration up function, you should end up with the following:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$tables   = \Illuminate\Support\Facades\DB::select('SHOW TABLES');
        $morphMap = \Illuminate\Database\Eloquent\Relations\Relation::morphMap();
        foreach ($tables as $table) {
            $tableName = $table-&amp;gt;{sprintf('Tables_in_%s',
                \Illuminate\Support\Facades\DB::connection()-&amp;gt;getDatabaseName())};
            $columns   = Schema::getColumnListing($tableName);
            foreach ($columns as $column) {
                $columnType = Schema::getColumnType($tableName, $column);
                if ($columnType === 'string') {
                    foreach ($morphMap as $key =&amp;gt; $value) {
                        \Illuminate\Support\Facades\DB::table($tableName)-&amp;gt;where($column, $value)-&amp;gt;update([$column =&amp;gt; $key]);
                    }
                }
            }
        }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I think migrations are one of the most powerful features offered by any framework. Once you have mastered how to use migrations, you can resolve minor to large database infractions without ever logging into your production database.&lt;/p&gt;

&lt;p&gt;Have you found this useful, comment below.&lt;/p&gt;

&lt;p&gt;Photo by &lt;a href="https://www.pexels.com/photo/person-choosing-document-in-folder-4792285/" rel="noopener noreferrer"&gt;Anete Lusina:&lt;/a&gt;&lt;/p&gt;

</description>
      <category>laravel</category>
      <category>php</category>
      <category>database</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Lazy load config on Laravel</title>
      <dc:creator>Promise</dc:creator>
      <pubDate>Sat, 04 Jun 2022 18:09:21 +0000</pubDate>
      <link>https://forem.com/ceopro/lazy-load-config-on-laravel-2jjj</link>
      <guid>https://forem.com/ceopro/lazy-load-config-on-laravel-2jjj</guid>
      <description>&lt;p&gt;It is common knowledge that configuration on Laravel applications are one of the very first things to load. If it is not, well, check out the application lifecycle &lt;a href="https://laravel.com/docs/9.x/lifecycle#service-providers" rel="noopener noreferrer"&gt;here&lt;/a&gt;. As part of the autoconfiguration of Laravel, everything in the config folder is considered an application configuration and loads pretty much as soon as the application is booted.&lt;/p&gt;

&lt;p&gt;Why is this important? We will get to that in a second. First how can we achieve this.&lt;/p&gt;

&lt;p&gt;The first step is to create a custom service provider. If you are not sure what these are, &lt;a href="https://laravel.com/docs/9.x/providers" rel="noopener noreferrer"&gt;here is the doc&lt;/a&gt; for it.&lt;/p&gt;

&lt;p&gt;I created one called &lt;code&gt;CustomConfigServiceProvider&lt;/code&gt;. You can place this in the Providers directory. &lt;/p&gt;

&lt;p&gt;Next create a new custom folder for your custom configuration files. Remember, everything in config is autoloaded. I created a folder called &lt;code&gt;custom-config&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;In the boot section of the provider, add the following piece of code.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;parent::boot();
$this-&amp;gt;mergeConfigFrom(__DIR__.'/../../../custom-config/settings.php', 'settings');
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You are probably thinking, what is happening here? Let me break it down. Here is how your file should look:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;?php

namespace App\Providers\Custom;

use Illuminate\Support\ServiceProvider;

class CustomConfigServiceProvider extends ServiceProvider
{
    public function boot()
    {
        parent::boot();
        $this-&amp;gt;mergeConfigFrom(__DIR__.'/../../../custom-config/settings.php', 'settings');
    }

    public function register()
    {
        parent::register();
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;First since every provider is extending the base &lt;code&gt;ServiceProvider&lt;/code&gt; class from the framework, we are calling &lt;code&gt;parent::boot()&lt;/code&gt; to ensure the code block runs first.&lt;br&gt;
Then we are merging our new configuration into the configuration set that was already loaded previously. In this case, we have a custom configuration file called &lt;code&gt;settings.php&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Now you have everything set up for your lazy loaded configuration. &lt;/p&gt;

&lt;p&gt;There is just one last step to complete. We need to register our service provider. In your &lt;code&gt;config/app.php&lt;/code&gt; file, add your new provider in the providers array. &lt;/p&gt;

&lt;p&gt;Viola, you now have lazy loaded configuration. &lt;/p&gt;

&lt;p&gt;For the use cases, there are numerous, for instance, if you have a configuration that relies on a third-party application to have been loaded previously. More on this later.&lt;/p&gt;

&lt;p&gt;Check out some cool features of &lt;a href="https://dev.to/prog_25/laravel-9-best-features-55mm"&gt;Laravel 9&lt;/a&gt;. Are you using lazy loaded configurations? Let me know in the comments.&lt;/p&gt;

</description>
      <category>laravel</category>
      <category>webdev</category>
      <category>php</category>
      <category>programming</category>
    </item>
    <item>
      <title>Laravel 9 Best Features</title>
      <dc:creator>Promise</dc:creator>
      <pubDate>Tue, 08 Feb 2022 23:23:28 +0000</pubDate>
      <link>https://forem.com/ceopro/laravel-9-best-features-55mm</link>
      <guid>https://forem.com/ceopro/laravel-9-best-features-55mm</guid>
      <description>&lt;p&gt;So I went to read up on some Laravel documentation regarding Homestead because you know, Docker on Mac, arghhh, well that is a story for another day.&lt;/p&gt;

&lt;p&gt;Anyway, Laravel 9 is out and one of the features that stood out for me was the support for generic types. If you do not know what these are, there is a great article by Ondřej Mirtes regarding them &lt;a href="https://phpstan.org/blog/generics-in-php-using-phpdocs" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;What does this have to do with Laravel? Well, I am coming to that in a minute. One of my favourite features in Laravel is Eloquent, more specifically, Eloquent relationships. But there has always been something missing, whenever you get the collection instance, the IDE does not know what types are inside the collection. &lt;/p&gt;

&lt;p&gt;Consider the code below, I have been using generic type hinting for a while in my code, more in a documentation capacity.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;* @property Collection&amp;lt;Notification&amp;gt; $notifications
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If I call the notifications property, I correctly get that it is an instance of &lt;code&gt;Collection&lt;/code&gt; but what I don't get is that the contents are instances of &lt;code&gt;Notification&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;So &lt;code&gt;$notifications-&amp;gt;first()&lt;/code&gt; will simply be an object with no type. I will need to type hint the resulting object if I wanted to get autocomplete.&lt;/p&gt;

&lt;p&gt;With this change in Laravel 9, the extra comment type hint is now unnecessary. I can simply type-hint the collection with a generic like above and get the correct instance. This will help clean up a lot of unnecessary comments in the code.&lt;/p&gt;

&lt;p&gt;Anyway, if that does not get you excited, you can check out some of the other features &lt;a href="https://laravel.com/docs/9.x/releases" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>laravel</category>
      <category>php</category>
      <category>programming</category>
    </item>
  </channel>
</rss>
