<?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: Prodevel</title>
    <description>The latest articles on Forem by Prodevel (@prodevel).</description>
    <link>https://forem.com/prodevel</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%2Forganization%2Fprofile_image%2F5929%2Ffbe62cca-cef1-401c-abfe-2dbed4ab97cf.png</url>
      <title>Forem: Prodevel</title>
      <link>https://forem.com/prodevel</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/prodevel"/>
    <language>en</language>
    <item>
      <title>I got tired of re-explaining my projects to Claude — so I built context-window</title>
      <dc:creator>Promise</dc:creator>
      <pubDate>Sat, 16 May 2026 11:59:15 +0000</pubDate>
      <link>https://forem.com/prodevel/i-got-tired-of-re-explaining-my-projects-to-claude-so-i-built-context-window-1fd</link>
      <guid>https://forem.com/prodevel/i-got-tired-of-re-explaining-my-projects-to-claude-so-i-built-context-window-1fd</guid>
      <description>&lt;p&gt;Every time I opened up a new Claude conversation, I find myself re-telling it the same things. Who I am. What stack this project uses and more importantly, for business context, I find myself resharing the same business rules. The two odd conventions we picked up six months ago. That one third-party API quirk that bit us last quarter.&lt;/p&gt;

&lt;p&gt;It's not Claude's fault. It can't remember things across sessions — that's how the model works. But it means I'm doing the same warm-up exercise every single time. Multiply that by however many projects I touch in a week and it adds up to hours of wasted effort.&lt;/p&gt;

&lt;p&gt;So I built a small tool to fix it for myself, and I've open-sourced it: &lt;a href="https://github.com/prodevuk/context-window" rel="noopener noreferrer"&gt;&lt;strong&gt;context-window&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The idea
&lt;/h2&gt;

&lt;p&gt;What if your &lt;strong&gt;context was a first-class entity&lt;/strong&gt;, not something you re-type into a chat?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You write a context &lt;strong&gt;once&lt;/strong&gt; — your coding conventions, your business background, notes on a tricky API. It lives in a local library with a name, a description, a category, tags, a priority, and a token count.&lt;/li&gt;
&lt;li&gt;You &lt;strong&gt;attach&lt;/strong&gt; it to as many projects as you like. The same "Rust Conventions" context can be referenced by every Rust repo on your machine.&lt;/li&gt;
&lt;li&gt;Each project owns a tiny &lt;strong&gt;manifest file&lt;/strong&gt; — just metadata, not the full bodies — that any LLM client can read at session start.&lt;/li&gt;
&lt;li&gt;The LLM decides which contexts are relevant, asks for the bodies it actually needs, and gets to work already up to speed.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That's the whole shape of it. Two entities (Context and Project), one manifest, one MCP server, no cloud.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it looks like in practice
&lt;/h2&gt;

&lt;p&gt;Create a context once:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;context new &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-n&lt;/span&gt; &lt;span class="s2"&gt;"Rust Conventions"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s2"&gt;"How we write Rust in this codebase"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--content-file&lt;/span&gt; ./RUST_STYLE.md &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--category&lt;/span&gt; conventions &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--tags&lt;/span&gt; rust,backend &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--priority&lt;/span&gt; important
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then, from any project on your machine:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; /path/to/your/project
context project init &lt;span class="nt"&gt;-n&lt;/span&gt; my-project
context project attach &amp;lt;context-id&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That writes a &lt;code&gt;.context/manifest.json&lt;/code&gt; in the project root. It looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"project_name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"my-project"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mcp_server"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"transport"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"stdio"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"context-mcp"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"contexts"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"context_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"…"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Rust Conventions"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"How we write Rust in this codebase"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"category"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"conventions"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"priority"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"important"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"token_count"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1240&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"total_token_count"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1240&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"instructions"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Call get_project_summary first. Use get_context to fetch a body. ..."&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Note the deliberate absence of &lt;strong&gt;content&lt;/strong&gt;. The manifest is a catalogue — names, descriptions, categories, priorities, token counts. The LLM reads this on session start, decides what's relevant, and fetches bodies on demand via the MCP server. Cheap.&lt;/p&gt;

&lt;h2&gt;
  
  
  Wiring Claude up to it
&lt;/h2&gt;

&lt;p&gt;context-window ships with a stdio MCP server (&lt;code&gt;context-mcp&lt;/code&gt;). One command registers it globally with Claude Code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;claude mcp add context-window &lt;span class="nt"&gt;--scope&lt;/span&gt; user context-mcp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No &lt;code&gt;--project-id&lt;/code&gt; is needed. The server walks up from the current working directory looking for the nearest &lt;code&gt;.context/manifest.json&lt;/code&gt; and uses that project automatically. Move between repos, and the active project follows you.&lt;/p&gt;

&lt;p&gt;There are 16 MCP tools, but in practice you only think about a handful:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;get_project_summary&lt;/code&gt; — orient yourself; returns the manifest&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;get_context&lt;/code&gt; — fetch the body of one context&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;search_contexts&lt;/code&gt; — FTS5 search across the library&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;get_context_budget&lt;/code&gt; — when you're tight on tokens, ask for the highest-priority subset that fits a given budget&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;create_context&lt;/code&gt; / &lt;code&gt;attach_context&lt;/code&gt; — capture and link new knowledge mid-conversation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The last point is the most underrated. When the user explains something, the next session will need to know — a constraint, a decision, a person's preference — the model can call &lt;code&gt;create_context(..., created_by: "llm:claude-opus-4-7")&lt;/code&gt; and that knowledge is permanent and reusable. The conversation doesn't have to be wasted as soon as you close the tab.&lt;/p&gt;

&lt;h2&gt;
  
  
  What else did I like: usage analytics
&lt;/h2&gt;

&lt;p&gt;I quickly realised I wanted to know if Claude was &lt;em&gt;actually&lt;/em&gt; using the contexts I was carefully curating. So every MCP, CLI, and web call records an event with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the tool name&lt;/li&gt;
&lt;li&gt;duration, outcome, error code&lt;/li&gt;
&lt;li&gt;the active project and (when applicable) the context id touched&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;the calling client's name and version&lt;/strong&gt; — &lt;code&gt;claude-code&lt;/code&gt;, &lt;code&gt;chrome&lt;/code&gt;, &lt;code&gt;cli&lt;/code&gt;, &lt;code&gt;firefox&lt;/code&gt;, etc.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That last one matters. The MCP server captures the &lt;code&gt;clientInfo&lt;/code&gt; block from the &lt;code&gt;initialize&lt;/code&gt; handshake, so the dashboard tells you exactly which client (and which version) is calling each tool. If Claude Code is doing the work, you'll see &lt;code&gt;claude-code&lt;/code&gt; in the breakdown. If you use the web UI yourself, you'll see your browser. If you forget you wired up a different LLM, you'll see it sitting there in the bar chart.&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%2Ful1klh0tfv4366x5lmcw.png" 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%2Ful1klh0tfv4366x5lmcw.png" alt="context-window dashboard" width="800" height="498"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The dashboard is server-rendered HTML with SVG charts. No client-side framework, no build step beyond &lt;code&gt;tsc&lt;/code&gt;. There's a sparkline for activity over time, four bar charts (top tools, top contexts, top projects, top clients), and a row of summary stat cards. It runs at &lt;code&gt;http://127.0.0.1:5173/dashboard&lt;/code&gt; after &lt;code&gt;context web&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  A few interesting design choices
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;The manifest is derived state.&lt;/strong&gt; If you update a context that's attached to three projects, all three manifests rewrite themselves automatically. Same for archive, delete, attach, detach, reorder. There's exactly one source of truth — the SQLite DB — and the on-disk manifest is always a fresh projection of it. No staleness, no sync command needed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Inactive contexts are hidden, not surgically removed.&lt;/strong&gt; Archive a context and it stays attached to whatever projects already had it, but it's filtered out of &lt;code&gt;get_project_summary&lt;/code&gt;, &lt;code&gt;get_context_budget&lt;/code&gt;, and &lt;code&gt;search_contexts&lt;/code&gt;. So an LLM never sees stale knowledge as "available", but the link is preserved if you decide to unarchive later.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Token counts are pre-computed on write.&lt;/strong&gt; Every time a context is created or updated, we tokenise it with &lt;code&gt;gpt-tokenizer&lt;/code&gt; and store the count. That means &lt;code&gt;get_context_budget&lt;/code&gt; can do its work entirely as a SQL query — no expensive tokenisation per request.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Storage is transport-agnostic.&lt;/strong&gt; The whole codebase is split into &lt;code&gt;core/&lt;/code&gt; (business logic), &lt;code&gt;storage/&lt;/code&gt; (the &lt;code&gt;Repository&lt;/code&gt; interface + a SQLite implementation), and three transports (&lt;code&gt;mcp/&lt;/code&gt;, &lt;code&gt;cli/&lt;/code&gt;, &lt;code&gt;web/&lt;/code&gt;). If someone wanted to add a Postgres backend or an HTTP MCP transport for a cloud mode, they'd swap the storage + add a transport. The core services don't move.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/prodevuk/context-window.git
&lt;span class="nb"&gt;cd &lt;/span&gt;context-window
npm &lt;span class="nb"&gt;install
&lt;/span&gt;npm run build
npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; &lt;span class="nb"&gt;.&lt;/span&gt;
context project init       &lt;span class="c"&gt;# in your project&lt;/span&gt;
context web                &lt;span class="c"&gt;# http://127.0.0.1:5173&lt;/span&gt;
claude mcp add context-window &lt;span class="nt"&gt;--scope&lt;/span&gt; user context-mcp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's the whole getting-started. It's TypeScript, Node ≥ 20, SQLite. No accounts, no API keys, no telemetry, no network calls (unless you point an MCP client at it).&lt;/p&gt;

&lt;p&gt;The repo has a 10-test unit suite plus end-to-end smoke tests against both the stdio MCP server and the web UI. &lt;/p&gt;

&lt;h2&gt;
  
  
  Where to take it from here
&lt;/h2&gt;

&lt;p&gt;A few things on my list:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Better budget heuristics. Right now &lt;code&gt;get_context_budget&lt;/code&gt; is a strict priority-then-position fit. It could be a lot smarter — maybe weight by recent usage from the analytics it already collects.&lt;/li&gt;
&lt;li&gt;A proper "what should I capture next?" prompt for the LLM, surfaced as an MCP tool.&lt;/li&gt;
&lt;li&gt;Per-project token windows that match the actual model's window, not a fixed default.&lt;/li&gt;
&lt;li&gt;Encrypted-at-rest contexts for the ones marked &lt;code&gt;visibility: private&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you've ever felt the same pain — "I'm pasting the same paragraph again, aren't I?" — I'd love to hear what &lt;em&gt;you'd&lt;/em&gt; want from a tool like this.&lt;/p&gt;

&lt;p&gt;The repo is at &lt;a href="https://github.com/prodevuk/context-window" rel="noopener noreferrer"&gt;github.com/prodevuk/context-window&lt;/a&gt;. Issues, ideas, and PRs are all very welcome. MIT licence.&lt;/p&gt;

&lt;p&gt;Thanks for reading.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>claude</category>
      <category>mcp</category>
      <category>typescript</category>
    </item>
    <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>
  </channel>
</rss>
