<?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: SeaOtter ( Kentaro Mori )</title>
    <description>The latest articles on DEV Community by SeaOtter ( Kentaro Mori ) (@moruku36).</description>
    <link>https://dev.to/moruku36</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%2F4165444%2F3289b767-50b2-46c5-9619-2ec3c048fb0c.png</url>
      <title>DEV Community: SeaOtter ( Kentaro Mori )</title>
      <link>https://dev.to/moruku36</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/moruku36"/>
    <language>en</language>
    <item>
      <title>You Don't Need to Be a Security Specialist to Verify Your Defenses: Learning with Web Security Control Lab</title>
      <dc:creator>SeaOtter ( Kentaro Mori )</dc:creator>
      <pubDate>Tue, 27 Oct 2026 09:06:51 +0000</pubDate>
      <link>https://dev.to/moruku36/you-dont-need-to-be-a-security-specialist-to-verify-your-defenses-learning-with-web-security-23md</link>
      <guid>https://dev.to/moruku36/you-dont-need-to-be-a-security-specialist-to-verify-your-defenses-learning-with-web-security-23md</guid>
      <description>&lt;h2&gt;
  
  
  Introduction: security is no longer "the specialists' job"
&lt;/h2&gt;

&lt;p&gt;If you build web applications, scenes like these are probably becoming familiar:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You wrote the login flow and the admin pages yourself. But security checks keep slipping, because "there's nobody here who really knows that stuff."&lt;/li&gt;
&lt;li&gt;You let AI write more of your code now. Working software arrives faster, but you have no way to judge whether that code is safe.&lt;/li&gt;
&lt;li&gt;You promote AI adoption or digitalization inside your company, and when someone asks "is the security OK?", you are not sure what "OK" would even be based on.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Few organizations have a dedicated security person. Yet when an incident happens, the people who respond are the ones who built the system or promoted it. For many engineers today, the first problem is not learning advanced attack techniques. It is having &lt;strong&gt;a way to verify that the defenses you put in actually work&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;That verification step is where things get fuzzy. You can say "I added an authorization check" or "I set attributes on the cookie," but if the condition for "checked" is vague, you end up with "the scan passed, but I can't explain what it guaranteed." Done in name only — &lt;em&gt;I meant to have it covered&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Web Security Control Lab&lt;/strong&gt; (below, "the lab") is a small learning system for practicing that verification step. It is not a diagnostic tool for security professionals. It is teaching material for engineers who build web apps or drive technology adoption in their organizations, so they can try things safely on their own machine and learn the basic pattern of &lt;em&gt;defense plus verification&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;This article first explains what the lab is for and how I would like you to use it, and then follows the implementation on both the application side and the scanner side, in code. The technical content is not watered down. Terms are explained where they first appear, so if security is not your specialty, read it while mapping the ideas onto your own application.&lt;/p&gt;

&lt;p&gt;Repository: &lt;a href="https://github.com/moruku36/web-security-control-lab" rel="noopener noreferrer"&gt;https://github.com/moruku36/web-security-control-lab&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Safety premise&lt;/strong&gt;: This lab is for learning only. The app binds to 127.0.0.1 only; never expose it to the internet or a shared network. As described later, the scanner refuses non-local targets. Do not use real data or real passwords, and never scan systems that belong to someone else. &lt;a href="https://github.com/moruku36/web-security-control-lab/blob/4dc4d9dc1adfdf9cfcf07abf3593f04a5722d886/SECURITY.md" rel="noopener noreferrer"&gt;SECURITY.md&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This article covers commit &lt;a href="https://github.com/moruku36/web-security-control-lab/commit/4dc4d9dc1adfdf9cfcf07abf3593f04a5722d886" rel="noopener noreferrer"&gt;&lt;code&gt;4dc4d9d&lt;/code&gt;&lt;/a&gt; (main as of October 22, 2026). I verified the runs myself on October 24, 2026, in an isolated Python 3.12.3 environment. Links are pinned to this commit unless noted otherwise.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this lab is for
&lt;/h2&gt;

&lt;p&gt;The lab's basic loop is &lt;strong&gt;observe → detect (scanner) → analyze the cause → fix → re-verify&lt;/strong&gt;. Instead of memorizing terms in a classroom style, you touch an app that has weaknesses, find them with a check, think about why they happen, and compare against the fixed state. Experiencing that whole loop on a small subject is the point.&lt;/p&gt;

&lt;p&gt;The setup comes in pairs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A FastAPI app that deliberately leaves weaknesses in (&lt;code&gt;VULNERABLE&lt;/code&gt; mode), and the same app with defenses applied (&lt;code&gt;HARDENED&lt;/code&gt; mode)&lt;/li&gt;
&lt;li&gt;A scanner (CLI) that applies the same six conditions to both modes and returns &lt;code&gt;PASS&lt;/code&gt; / &lt;code&gt;FAIL&lt;/code&gt; / &lt;code&gt;ERROR&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Why bundle "a weak app," "a fixed app," and "a checking tool"? Noticing weaknesses takes practice, and a fixed app alone does not show you what changed. With the checking tool in the middle, "which conditions must hold before we may call it fixed" is decided up front, and the learning does not end at "I sort of get it."&lt;/p&gt;

&lt;p&gt;I imagine three ways of using it:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Usage&lt;/th&gt;
&lt;th&gt;What you do&lt;/th&gt;
&lt;th&gt;What you get&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1. Compare first&lt;/td&gt;
&lt;td&gt;Start both modes, run the same checks, compare the results&lt;/td&gt;
&lt;td&gt;The overall picture of what changes with and without defenses&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2. Go deep on one&lt;/td&gt;
&lt;td&gt;Follow the LAB-01 worksheet: predict → observe → explain the cause → fix → re-verify&lt;/td&gt;
&lt;td&gt;One theme — authorization — understood to the point where you can explain it&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3. Apply it to your own app&lt;/td&gt;
&lt;td&gt;Use the six check conditions as a checklist and review your own app's login, admin pages, and logs&lt;/td&gt;
&lt;td&gt;The habit of thinking about defense and verification as a pair&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Just as important is what the lab is &lt;strong&gt;not&lt;/strong&gt;. It is not a tool for assessing production services, and its results are not proof that a production system is safe (see "Limitations"). It is not for probing other people's systems either: the scanner is designed to refuse non-local targets in the first place.&lt;/p&gt;

&lt;h2&gt;
  
  
  The whole picture: only three parts
&lt;/h2&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fzq1ubt18ogqzclafu7uq.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fzq1ubt18ogqzclafu7uq.png" alt="Overall architecture: the learner and the host-side scanner connect over local HTTP to a single FastAPI app; SQLite lives inside the app process" width="800" height="529"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Figure 1: Overall architecture. Colors: blue = learner, green = scanner, purple = target app, orange = launcher, yellow = data. Rendered from the repository's Mermaid source with Pele 1.8.0.&lt;/em&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Element&lt;/th&gt;
&lt;th&gt;What it is&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Target app&lt;/td&gt;
&lt;td&gt;FastAPI (&lt;code&gt;app/&lt;/code&gt;), one process&lt;/td&gt;
&lt;td&gt;Takes exactly one &lt;code&gt;LAB_MODE&lt;/code&gt; per start&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Data&lt;/td&gt;
&lt;td&gt;SQLite (inside the app process)&lt;/td&gt;
&lt;td&gt;In-memory by default; changeable via &lt;code&gt;LAB_DB_PATH&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Scanner&lt;/td&gt;
&lt;td&gt;Host-side CLI &lt;code&gt;security-lab&lt;/code&gt; (&lt;code&gt;scanner/&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;Checks over HTTP only; never opens SQLite directly&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The key point: the scanner does not peek inside the app (its database). It accesses the app from outside, over HTTP — the same vantage point an attacker or a user has — which makes the perspective close to real-world practice: "how does this look from the outside?"&lt;/p&gt;

&lt;p&gt;Start the app with uvicorn on the host, or with Docker Compose's single &lt;code&gt;web&lt;/code&gt; service (&lt;code&gt;VULNERABLE&lt;/code&gt;, 127.0.0.1:8000). There is no database container and no scanner container. The mode is read from the &lt;code&gt;LAB_MODE&lt;/code&gt; environment variable at startup and never changes during the process's life. To compare both modes, start separate processes on separate ports.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it: the smallest run
&lt;/h2&gt;

&lt;p&gt;So this does not stay read-only, here is the minimal procedure. You need Python 3.11+ and Git (commands below are for Bash; on Windows PowerShell, only the way you set environment variables differs — noted below).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/moruku36/web-security-control-lab.git
&lt;span class="nb"&gt;cd &lt;/span&gt;web-security-control-lab
git checkout 4dc4d9dc1adfdf9cfcf07abf3593f04a5722d886
python &lt;span class="nt"&gt;-m&lt;/span&gt; venv .venv
&lt;span class="nb"&gt;source&lt;/span&gt; .venv/bin/activate
pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="s1"&gt;'.[dev]'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The commit is pinned so everyone works on the version this article covers. This state (detached HEAD) is fine for reading and running. If you want to practice fixing things yourself, first create a working branch, e.g. &lt;code&gt;git switch -c my-lab-practice&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Use two terminals to start both modes:&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="c"&gt;# Terminal 1: the mode that leaves weaknesses in&lt;/span&gt;
&lt;span class="nv"&gt;LAB_MODE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;VULNERABLE uvicorn app.main:app &lt;span class="nt"&gt;--host&lt;/span&gt; 127.0.0.1 &lt;span class="nt"&gt;--port&lt;/span&gt; 8000

&lt;span class="c"&gt;# Terminal 2: the mode with defenses applied&lt;/span&gt;
&lt;span class="nv"&gt;LAB_MODE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;HARDENED uvicorn app.main:app &lt;span class="nt"&gt;--host&lt;/span&gt; 127.0.0.1 &lt;span class="nt"&gt;--port&lt;/span&gt; 8001
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;On PowerShell, set the variable before starting uvicorn, like &lt;code&gt;$env:LAB_MODE="HARDENED"&lt;/code&gt;. The mode is read at startup, so changing it requires a server restart.&lt;/p&gt;

&lt;p&gt;In a third terminal, confirm startup and mode, then scan:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-s&lt;/span&gt; http://127.0.0.1:8000/health
curl &lt;span class="nt"&gt;-s&lt;/span&gt; http://127.0.0.1:8001/health

security-lab scan http://127.0.0.1:8000 &lt;span class="nt"&gt;--format&lt;/span&gt; json &lt;span class="nt"&gt;--expected-mode&lt;/span&gt; VULNERABLE
security-lab scan http://127.0.0.1:8001 &lt;span class="nt"&gt;--format&lt;/span&gt; json &lt;span class="nt"&gt;--expected-mode&lt;/span&gt; HARDENED
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Check that the &lt;code&gt;mode&lt;/code&gt; in the &lt;code&gt;/health&lt;/code&gt; JSON is what you expect before going on. &lt;code&gt;--expected-mode&lt;/code&gt; tells the scanner to confirm the app is in the intended mode; if it disagrees, every check becomes &lt;code&gt;ERROR&lt;/code&gt;. Pass the base URL — do not append a path like &lt;code&gt;/admin&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Trying it in a browser is also worthwhile. Log in as the regular user &lt;code&gt;alice&lt;/code&gt; / &lt;code&gt;user&lt;/code&gt; and open the admin page &lt;code&gt;/admin&lt;/code&gt;: in &lt;code&gt;VULNERABLE&lt;/code&gt; it is displayed; in &lt;code&gt;HARDENED&lt;/code&gt; it is rejected with 403. But when comparing both modes in the same browser, use separate profiles, or test one mode at a time and clear cookies. Cookies are not separated by port, so separate tabs alone can make sessions interfere (&lt;a href="https://www.rfc-editor.org/rfc/rfc6265#section-8.5" rel="noopener noreferrer"&gt;RFC 6265 §8.5&lt;/a&gt;).&lt;/p&gt;

&lt;h3&gt;
  
  
  How to read the results (just this, to start)
&lt;/h3&gt;

&lt;p&gt;Results are three-valued:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;PASS&lt;/code&gt;: the check's condition was met&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;FAIL&lt;/code&gt;: a weakness was observed&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ERROR&lt;/code&gt;: a prerequisite could not be confirmed, so the check did not complete. &lt;strong&gt;This is not success&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When the checks run properly, the expected results are: &lt;code&gt;VULNERABLE&lt;/code&gt; → 6 FAIL (HIGH 1 / MEDIUM 4 / LOW 1), &lt;code&gt;HARDENED&lt;/code&gt; → 6 PASS (findings 0). Watch the exit codes, too. &lt;code&gt;0&lt;/code&gt; means "the report completed" — it is 0 even when the report contains FAILs. "Exit code 0 = no problems" is a misreading we will come back to later.&lt;/p&gt;

&lt;h2&gt;
  
  
  The six checks: all of them show up in "ordinary apps"
&lt;/h2&gt;

&lt;p&gt;None of the six targets is exotic. Any web app with a login has all of these elements in daily use. First, where each one appears in your own app:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;ID&lt;/th&gt;
&lt;th&gt;Target&lt;/th&gt;
&lt;th&gt;Everyday scene&lt;/th&gt;
&lt;th&gt;If it is weak (summary)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;LAB-01&lt;/td&gt;
&lt;td&gt;Authorization on the admin page&lt;/td&gt;
&lt;td&gt;Admin screens, approval features&lt;/td&gt;
&lt;td&gt;Someone who is not an admin can perform admin operations&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LAB-02&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;HttpOnly&lt;/code&gt; on the session cookie&lt;/td&gt;
&lt;td&gt;Anything with a login&lt;/td&gt;
&lt;td&gt;A login state becomes easier to abuse via scripts&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LAB-03&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;SameSite&lt;/code&gt; on the session cookie&lt;/td&gt;
&lt;td&gt;Logins, integrations with external sites&lt;/td&gt;
&lt;td&gt;A login state becomes easier to ride on unintended requests&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LAB-04&lt;/td&gt;
&lt;td&gt;Security headers&lt;/td&gt;
&lt;td&gt;Every screen and API&lt;/td&gt;
&lt;td&gt;Browser-side defenses do not engage&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LAB-05&lt;/td&gt;
&lt;td&gt;Information exposure in error responses&lt;/td&gt;
&lt;td&gt;API error handling&lt;/td&gt;
&lt;td&gt;Clues for inferring the internal structure&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LAB-06&lt;/td&gt;
&lt;td&gt;Recording failed logins&lt;/td&gt;
&lt;td&gt;Logins, operational monitoring&lt;/td&gt;
&lt;td&gt;Malicious attempts happen and nobody notices&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Two terms, briefly. &lt;strong&gt;Authentication&lt;/strong&gt; establishes &lt;em&gt;who&lt;/em&gt; you are (logging in). &lt;strong&gt;Authorization&lt;/strong&gt; decides &lt;em&gt;whether you may do this operation&lt;/em&gt;. Being logged in and being allowed to see the admin page are different things, and LAB-01 targets exactly that confusion. A &lt;strong&gt;cookie&lt;/strong&gt; is a small piece of data stored by the browser and automatically attached to requests when its conditions match. Carrying the login-state identifier in a cookie is a widespread pattern, and its "read restriction (HttpOnly)" and "sending conditions (SameSite)" are what LAB-02 and LAB-03 examine.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fa6iqt3aav4ebk2g7rxov.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fa6iqt3aav4ebk2g7rxov.png" alt="Concept diagram: check points split by boundary — cookie attributes on the browser side, authorization, responses, and logging on the server side" width="800" height="1466"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Figure 2: Each control guards a different boundary and has different check points. Colors: blue = browser side, purple = server side, green = scanner, red = range not verified by these checks.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The app side: where do the defenses live?
&lt;/h2&gt;

&lt;h3&gt;
  
  
  How the mode branches
&lt;/h3&gt;

&lt;p&gt;The mode is read from the environment in &lt;a href="https://github.com/moruku36/web-security-control-lab/blob/4dc4d9dc1adfdf9cfcf07abf3593f04a5722d886/app/config.py" rel="noopener noreferrer"&gt;app/config.py&lt;/a&gt;, and each feature branches on that value. The weaknesses are not "misconfigurations": they are written into the code explicitly, with a marker comment &lt;code&gt;INTENTIONAL_VULNERABILITY_FOR_LOCAL_LAB&lt;/code&gt;, so that reviewers can distinguish "intentional weakness" from "accident." Marking places that are deliberately so is an idea that transfers to production code in reviews, too.&lt;/p&gt;

&lt;p&gt;The endpoints:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Path&lt;/th&gt;
&lt;th&gt;Role&lt;/th&gt;
&lt;th&gt;What changes by mode&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;GET /health&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Returns status and mode&lt;/td&gt;
&lt;td&gt;Nothing (used for the scanner's prerequisite check)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;GET/POST /login&lt;/code&gt;, &lt;code&gt;GET /logout&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Authentication; issue and discard sessions&lt;/td&gt;
&lt;td&gt;Whether failures are logged (LAB-06)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;GET /profile&lt;/code&gt;, &lt;code&gt;GET /api/profile&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Login-required page / the same content as JSON&lt;/td&gt;
&lt;td&gt;Nothing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;GET /admin&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Admin page&lt;/td&gt;
&lt;td&gt;Whether the role is checked (LAB-01)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;GET /api/diagnostic&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Diagnostic error response&lt;/td&gt;
&lt;td&gt;Whether internal information is exposed (LAB-05)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;GET /audit-logs&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Returns the audit log&lt;/td&gt;
&lt;td&gt;Nothing (unauthenticated in both modes — a limitation, below)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The practice accounts are fixed plaintext fixtures (regular user &lt;code&gt;alice&lt;/code&gt; / &lt;code&gt;user&lt;/code&gt;, administrator &lt;code&gt;admin&lt;/code&gt; / &lt;code&gt;admin&lt;/code&gt;). They are teaching data, unrelated to how credentials should be handled in production.&lt;/p&gt;

&lt;h3&gt;
  
  
  LAB-01: check authorization at the endpoint itself
&lt;/h3&gt;

&lt;p&gt;In the &lt;code&gt;/admin&lt;/code&gt; implementation (&lt;a href="https://github.com/moruku36/web-security-control-lab/blob/4dc4d9dc1adfdf9cfcf07abf3593f04a5722d886/app/main.py" rel="noopener noreferrer"&gt;app/main.py&lt;/a&gt;), an unauthenticated visitor is sent back to login with a 303 in both modes. The difference comes next: in &lt;code&gt;HARDENED&lt;/code&gt;, anyone whose role is not &lt;code&gt;admin&lt;/code&gt; gets 403; in &lt;code&gt;VULNERABLE&lt;/code&gt;, that check simply does not exist.&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="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;LAB_MODE&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;LabMode&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;HARDENED&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;admin&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="nc"&gt;HTTPException&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;status_code&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;HTTP_403_FORBIDDEN&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;detail&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Access denied: Administrator role required.&lt;/span&gt;&lt;span class="sh"&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;p&gt;A common real-world failure is "regular users never see a link to the admin screen, so it's fine." Even if the link is invisible, a direct request to the URL still arrives. What this implementation shows is the principle: &lt;strong&gt;the check belongs at the endpoint itself, and that is where you refuse&lt;/strong&gt;. When you build admin features in your own app, check this first.&lt;/p&gt;

&lt;p&gt;The expected observations:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Observation&lt;/th&gt;
&lt;th&gt;VULNERABLE&lt;/th&gt;
&lt;th&gt;HARDENED&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;/admin&lt;/code&gt; while logged out&lt;/td&gt;
&lt;td&gt;303 back to login&lt;/td&gt;
&lt;td&gt;303 back to login&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;/admin&lt;/code&gt; as a regular user&lt;/td&gt;
&lt;td&gt;200, page displayed&lt;/td&gt;
&lt;td&gt;403, refused&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;/admin&lt;/code&gt; as an administrator&lt;/td&gt;
&lt;td&gt;200, displayed&lt;/td&gt;
&lt;td&gt;200, displayed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;/admin&lt;/code&gt; with the old token after logout&lt;/td&gt;
&lt;td&gt;303 back to login&lt;/td&gt;
&lt;td&gt;303 back to login&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Note that not everything differs between the modes. The only difference is regular-user access; invalidating the old token after logout is correct behavior shared by both modes, placed there on purpose. It is practice in distinguishing "the state after a defense" from "the parts that were already right."&lt;/p&gt;

&lt;h3&gt;
  
  
  Sessions and cookies
&lt;/h3&gt;

&lt;p&gt;On a successful login, a token is issued with &lt;code&gt;secrets.token_hex(24)&lt;/code&gt;, a record is created in the sessions table, and the token is placed in the &lt;code&gt;lab_session&lt;/code&gt; cookie (&lt;a href="https://github.com/moruku36/web-security-control-lab/blob/4dc4d9dc1adfdf9cfcf07abf3593f04a5722d886/app/auth.py" rel="noopener noreferrer"&gt;app/auth.py&lt;/a&gt;). Logout deletes the record from the sessions table, so the old token becomes invalid in both modes.&lt;/p&gt;

&lt;p&gt;The cookie attributes branch by mode: &lt;code&gt;HARDENED&lt;/code&gt; sets &lt;code&gt;httponly=True&lt;/code&gt; and &lt;code&gt;samesite="lax"&lt;/code&gt;; &lt;code&gt;VULNERABLE&lt;/code&gt; sets neither (LAB-02, LAB-03). Note that &lt;code&gt;secure=False&lt;/code&gt; is a deliberate choice for HTTP on localhost, shared by both modes (see "Limitations"). Rather than leaving everything to framework defaults, check once which attributes your session cookie actually carries — in many apps, that alone surfaces review points.&lt;/p&gt;

&lt;h3&gt;
  
  
  Headers, errors, logs
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;LAB-04 (security headers)&lt;/strong&gt;: a mechanism for attaching instructions to responses — "browser, behave like this." Only in &lt;code&gt;HARDENED&lt;/code&gt;, HTTP middleware adds &lt;code&gt;Content-Security-Policy: default-src 'self'&lt;/code&gt;, &lt;code&gt;X-Content-Type-Options: nosniff&lt;/code&gt;, &lt;code&gt;Referrer-Policy: strict-origin-when-cross-origin&lt;/code&gt;, and &lt;code&gt;X-Frame-Options: DENY&lt;/code&gt;. Whether they are configured shows up directly in the check result.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;LAB-05 (error responses)&lt;/strong&gt;: &lt;code&gt;/api/diagnostic&lt;/code&gt; returns, in &lt;code&gt;VULNERABLE&lt;/code&gt;, a 500 JSON containing a mock traceback and runtime-environment information; in &lt;code&gt;HARDENED&lt;/code&gt;, it is narrowed down to a generic message and an &lt;code&gt;error_code&lt;/code&gt;. Detailed errors are convenient during development, but returning them to users in production gives clues about the internal structure. Every exposed value is mock teaching data, not a real secret.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;LAB-06 (audit log)&lt;/strong&gt;: successful authentication is always recorded as &lt;code&gt;AUTH_SUCCESS&lt;/code&gt;, but &lt;code&gt;AUTH_FAILURE&lt;/code&gt; on failure is recorded only in &lt;code&gt;HARDENED&lt;/code&gt;. If you record only successful operations and not failures, attempts such as password spraying cannot be detected when they happen. Not recording failures is itself treated as the weakness here.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The scanner side: what does a PASS actually prove?
&lt;/h2&gt;

&lt;p&gt;Now the checking side — especially relevant if you want to add automated checks to your own app, or if you have to read a vendor's assessment results.&lt;/p&gt;

&lt;p&gt;The scanner's six checks (&lt;a href="https://github.com/moruku36/web-security-control-lab/blob/4dc4d9dc1adfdf9cfcf07abf3593f04a5722d886/scanner/checks.py" rel="noopener noreferrer"&gt;scanner/checks.py&lt;/a&gt;) judge by these conditions:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;ID&lt;/th&gt;
&lt;th&gt;Target&lt;/th&gt;
&lt;th&gt;PASS condition&lt;/th&gt;
&lt;th&gt;Example FAIL reason codes&lt;/th&gt;
&lt;th&gt;Severity&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;LAB-01&lt;/td&gt;
&lt;td&gt;Authorization on &lt;code&gt;/admin&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Anonymous → login; regular user → 403; admin → displayed; old token after logout → invalid&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;USER_ADMIN_ACCESS&lt;/code&gt;, etc.&lt;/td&gt;
&lt;td&gt;HIGH&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LAB-02&lt;/td&gt;
&lt;td&gt;Session cookie&lt;/td&gt;
&lt;td&gt;Has the &lt;code&gt;HttpOnly&lt;/code&gt; attribute&lt;/td&gt;
&lt;td&gt;&lt;code&gt;COOKIE_ATTRIBUTE_MISSING&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;MEDIUM&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LAB-03&lt;/td&gt;
&lt;td&gt;Session cookie&lt;/td&gt;
&lt;td&gt;Exactly one &lt;code&gt;SameSite&lt;/code&gt; attribute, with value &lt;code&gt;Lax&lt;/code&gt; or &lt;code&gt;Strict&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;COOKIE_ATTRIBUTE_MISSING&lt;/code&gt; / &lt;code&gt;COOKIE_SAMESITE_VALUE_INVALID&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;MEDIUM&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LAB-04&lt;/td&gt;
&lt;td&gt;Response headers of &lt;code&gt;/health&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;CSP, X-Content-Type-Options, and Referrer-Policy exist and are non-empty&lt;/td&gt;
&lt;td&gt;&lt;code&gt;HEADER_MISSING&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;MEDIUM&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LAB-05&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/api/diagnostic&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Returns a generic error without internal information&lt;/td&gt;
&lt;td&gt;&lt;code&gt;DIAGNOSTIC_EXPOSURE&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;LOW&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LAB-06&lt;/td&gt;
&lt;td&gt;Audit log&lt;/td&gt;
&lt;td&gt;The &lt;code&gt;AUTH_FAILURE&lt;/code&gt; count increases across a failed login&lt;/td&gt;
&lt;td&gt;&lt;code&gt;AUTH_FAILURE_NOT_LOGGED&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;MEDIUM&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Never let ERROR become success
&lt;/h3&gt;

&lt;p&gt;Each check's result is three-valued: &lt;code&gt;PASS&lt;/code&gt; (condition met), &lt;code&gt;FAIL&lt;/code&gt; (weakness observed), &lt;code&gt;ERROR&lt;/code&gt; (a prerequisite could not be confirmed; incomplete). The important rule: &lt;strong&gt;when a prerequisite collapses, do not pronounce on the weakness — fall to ERROR&lt;/strong&gt;. A common failure of automated checks is a check that "didn't really run" turning into "no problem found." This lab does the opposite, thoroughly.&lt;/p&gt;

&lt;p&gt;For example, LAB-01 does not start by hitting &lt;code&gt;/admin&lt;/code&gt;. It first logs in with the synthetic accounts and confirms via &lt;code&gt;/api/profile&lt;/code&gt; that the identity and role are as expected (that confirmation stays in the evidence as &lt;code&gt;verified&lt;/code&gt;), and only then makes its four observations: anonymous, regular user, administrator, and the old token after logout. If the login prerequisite cannot be established, the check is ERROR. When several weaknesses are observed, the primary reason code is chosen by priority: anonymous access &amp;gt; regular-user access &amp;gt; session retained.&lt;/p&gt;

&lt;p&gt;LAB-03's condition is strict, too. It looks only at the &lt;code&gt;Set-Cookie&lt;/code&gt; header for &lt;code&gt;lab_session&lt;/code&gt; (other cookies' SameSite is ignored), requires exactly one attribute, and — ignoring letter case and surrounding whitespace — accepts only &lt;code&gt;Lax&lt;/code&gt; / &lt;code&gt;Strict&lt;/code&gt;. If attributes are duplicated, or there are multiple target headers so the effective value is indeterminate, the result is ERROR, not FAIL. Note that &lt;code&gt;SameSite=None&lt;/code&gt; means "does not meet this lab's condition"; it is not a general judgment that it is dangerous. What browsers do when the attribute is unspecified is also outside this check's scope.&lt;/p&gt;

&lt;p&gt;Conversely, some checks are deliberately narrow. LAB-04 looks only at the presence and non-emptiness of headers; it does not evaluate how strong the CSP's content is. LAB-06 looks only at whether the count increased; a strict correspondence between a specific attempt and a log entry, or alerting, is out of scope. &lt;strong&gt;A PASS means only "that check's condition was met" — nothing more is claimed.&lt;/strong&gt; That is the design policy. If you read results with the same discipline, you will neither over-read nor under-read vendor reports and automated assessments.&lt;/p&gt;

&lt;h3&gt;
  
  
  Minimize the evidence
&lt;/h3&gt;

&lt;p&gt;What remains in a report's evidence (schema 2.0) is restricted by an allowlist to &lt;code&gt;actor&lt;/code&gt; (anonymous / user / admin / user_old_token), &lt;code&gt;endpoint&lt;/code&gt;, status code, and permitted redirect targets — at most 16 observations — plus fixed reason codes. Messages are fixed templates per reason code; response bodies and exception strings never leak into a report. The validation in &lt;a href="https://github.com/moruku36/web-security-control-lab/blob/4dc4d9dc1adfdf9cfcf07abf3593f04a5722d886/scanner/models.py" rel="noopener noreferrer"&gt;scanner/models.py&lt;/a&gt; enforces this. It is a design so that the checking tool itself does not take in the target's internal information as "evidence." When you share check results internally or paste them into tickets, whether this care exists changes how easy they are to handle.&lt;/p&gt;

&lt;h2&gt;
  
  
  The scanner's own safety design: if the target is wrong, it stops before sending
&lt;/h2&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fo93xkx37ueovim3dydhv.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fo93xkx37ueovim3dydhv.png" alt="Verification flow: startup, target validation, prerequisite confirmation, the six checks, comparison against expectations, and exit codes" width="800" height="983"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Figure 3: Verification flow. If the prerequisites cannot be established, it ends in ERROR and is never treated as success. Colors: green = scanner processing and the HARDENED expectation, orange = the VULNERABLE expectation, red = abnormal termination (refusal / ERROR).&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;"It's a checking tool, so it may check anything" is not true. Target validation is fail-closed — when in doubt, stop (&lt;a href="https://github.com/moruku36/web-security-control-lab/blob/4dc4d9dc1adfdf9cfcf07abf3593f04a5722d886/scanner/target.py" rel="noopener noreferrer"&gt;scanner/target.py&lt;/a&gt;, &lt;a href="https://github.com/moruku36/web-security-control-lab/blob/4dc4d9dc1adfdf9cfcf07abf3593f04a5722d886/scanner/cli.py" rel="noopener noreferrer"&gt;scanner/cli.py&lt;/a&gt;).&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Permitted hosts are only &lt;code&gt;localhost&lt;/code&gt;, loopback IPs (judged with &lt;code&gt;ipaddress&lt;/code&gt;), and the Compose service name. Anything else is refused before any request is sent&lt;/li&gt;
&lt;li&gt;Target URLs are accepted only in base-URL form (scheme + host [+ port]); URLs with credentials, paths, queries, or fragments are refused, and a refused URL is not echoed into the error message&lt;/li&gt;
&lt;li&gt;The HTTP client ignores proxy environment variables (&lt;code&gt;trust_env=False&lt;/code&gt;), does not follow redirects, and uses a 5-second timeout&lt;/li&gt;
&lt;li&gt;The only credentials used are the synthetic fixtures. At scan start, &lt;code&gt;/health&lt;/code&gt; confirms the service name and mode; if that disagrees with &lt;code&gt;--expected-mode&lt;/code&gt;, every check becomes ERROR (&lt;code&gt;MODE_MISMATCH&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;As more work is delegated to AI agents and automation tools, designs like "if the target is wrong, stop before sending" and "targets outside your authority are simply unreachable" apply to automation in general, not only to checking tools.&lt;/p&gt;

&lt;p&gt;Exit codes — the key point when wiring this into automation (CI):&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Exit code&lt;/th&gt;
&lt;th&gt;Meaning&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;Report completed (&lt;strong&gt;0 even when it contains FAILs&lt;/strong&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;No subcommand&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Target refused, or argument error&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;Inspection incomplete (contains ERROR), or runtime error&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;In other words, "exit code 0" does not mean "no weaknesses." Judge pass/fail from the report's &lt;code&gt;status_summary&lt;/code&gt; and &lt;code&gt;findings&lt;/code&gt;. If you build your own checks into CI, you need the same separation between "the tool ran successfully" and "the checks passed."&lt;/p&gt;

&lt;h2&gt;
  
  
  Verified results
&lt;/h2&gt;

&lt;p&gt;Results I confirmed in my environment (Python 3.12.3, commit &lt;code&gt;4dc4d9d&lt;/code&gt;, October 24, 2026). I started both modes exactly as in this article's procedure, and the scan results matched the expectations.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tests: all 126 passed (unit / integration / vulnerabilities)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;VULNERABLE&lt;/code&gt; (port 8000): 6 FAIL, findings HIGH 1 / MEDIUM 4 / LOW 1, exit code 0&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;HARDENED&lt;/code&gt; (port 8001): 6 PASS, findings 0, exit code 0&lt;/li&gt;
&lt;li&gt;I also confirmed that deliberately mismatching &lt;code&gt;--expected-mode&lt;/code&gt; makes every check ERROR (&lt;code&gt;MODE_MISMATCH&lt;/code&gt;) with exit code 3, and that targeting &lt;code&gt;https://example.com&lt;/code&gt; is refused before any request, with exit code 2&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The text-format report for VULNERABLE looks like this (excerpt):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Web Security Control Lab
Target: http://127.0.0.1:8000 (mode reported by target: VULNERABLE)
Scope: six local educational checks only; not a production or compliance assessment.
[HIGH] LAB-01 Broken Access Control
  /admin is accessible by a non-admin user
[MEDIUM] LAB-02 Session Cookie
  HttpOnly flag is missing
[MEDIUM] LAB-03 Session Cookie
  SameSite policy is missing
[MEDIUM] LAB-04 Security Header
  Content-Security-Policy is missing
[LOW] LAB-05 Information Disclosure
  Detailed error information is exposed
[MEDIUM] LAB-06 Security Logging
  Failed authentication attempt was not recorded
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The repository's CI includes a job that runs live checks against both modes, and the run for the target commit succeeded (&lt;a href="https://github.com/moruku36/web-security-control-lab/actions/runs/39791370267" rel="noopener noreferrer"&gt;CI run&lt;/a&gt;, confirmed October 22, 2026).&lt;/p&gt;

&lt;h2&gt;
  
  
  Limitations: HARDENED does not mean "safe in production"
&lt;/h2&gt;

&lt;p&gt;This is easy to misunderstand, so let me be explicit. &lt;code&gt;HARDENED&lt;/code&gt; means only "the state with the six lab controls applied." As the README states, the following constraints remain in both modes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fixed plaintext test credentials, sessions with no expiry, logout via &lt;code&gt;GET&lt;/code&gt;, and an unauthenticated &lt;code&gt;/audit-logs&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;No &lt;code&gt;Secure&lt;/code&gt; on cookies (premised on HTTP on localhost)&lt;/li&gt;
&lt;li&gt;The checks are observations by an HTTP client, not verification of real browser behavior. Confirming cookie attributes does not prove safety against cross-site operations&lt;/li&gt;
&lt;li&gt;CSRF defenses themselves (tokens, etc.) are not among the lab's controls, and the scanner does not drive a browser to attempt CSRF (&lt;a href="https://developer.mozilla.org/en-US/docs/Web/Security/Attacks/CSRF" rel="noopener noreferrer"&gt;MDN's CSRF explainer&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Passing the six checks proves neither production safety nor this material's educational effectiveness (educational effectiveness is unevaluated)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For a real service you would additionally need HTTPS enforcement, hashed password storage, session expiry and revocation design, CSRF tokens, access control and retention for logs, CSP content design, and more. The lab's scope ends at the entrance: putting "the basic six" into a checkable form.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to use this in your own work
&lt;/h2&gt;

&lt;p&gt;Finally, how to apply it, by reader:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If you develop web applications.&lt;/strong&gt; When you add a feature, use the six conditions as review viewpoints as they are. Added an admin feature? Try the same URL as logged-out / regular user / administrator. Added a login? Look at the session cookie's attributes and whether failures are logged. When a review says "we've handled it," being able to ask "confirmed by which observation?" is this material's practical value.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If you have AI write code, or you promote AI adoption.&lt;/strong&gt; For generated code, "it works" and "the defenses work" are separate claims. The lab's approach — define the defense and its check condition as a pair, and never pass a check whose prerequisites collapsed — is a yardstick for reviewing AI-generated authentication and authorization code. The automation side's fail-closed design (target allowlists, minimized evidence) is also a reference for deciding what scope to delegate to agents.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If you develop in a team.&lt;/strong&gt; The six check conditions work as a shared language for security reviews. Being able to say "by LAB-01's condition, this screen is open to regular users" instead of "this somehow feels risky" moves the discussion forward even without a specialist in the room.&lt;/p&gt;

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;What I most want to convey with this lab is not the names of individual defenses, but the design of verification:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Define the defense and its check condition as a pair&lt;/strong&gt;: decide what to fix, and by which observation you will call it fixed, at the same time&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Never let ERROR become success&lt;/strong&gt;: a check whose prerequisites are unconfirmed is "incomplete," not "passed" — and distinguish that in the exit code, too&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Do not widen what PASS means&lt;/strong&gt;: do not speak of things you did not check (CSP strength, real browser behavior, CSRF as a whole) as if they had passed&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Make the checking tool fail-closed, too&lt;/strong&gt;: target allowlists, minimized evidence, no exception strings recorded&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Start by launching both modes and looking at how the results differ; then go deep on just one, with the LAB-01 &lt;a href="https://github.com/moruku36/web-security-control-lab/blob/4dc4d9dc1adfdf9cfcf07abf3593f04a5722d886/docs/worksheets/LAB01.md" rel="noopener noreferrer"&gt;worksheet&lt;/a&gt; (predict → observe → explain the cause → fix → re-verify). The repository is under the MIT license.&lt;/p&gt;

&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Repository: &lt;a href="https://github.com/moruku36/web-security-control-lab" rel="noopener noreferrer"&gt;https://github.com/moruku36/web-security-control-lab&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/moruku36/web-security-control-lab/blob/4dc4d9dc1adfdf9cfcf07abf3593f04a5722d886/README.md" rel="noopener noreferrer"&gt;README&lt;/a&gt; — startup, the six checks, limitations&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/moruku36/web-security-control-lab/blob/4dc4d9dc1adfdf9cfcf07abf3593f04a5722d886/SECURITY.md" rel="noopener noreferrer"&gt;SECURITY.md&lt;/a&gt; — the local-only scope&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/moruku36/web-security-control-lab/blob/4dc4d9dc1adfdf9cfcf07abf3593f04a5722d886/docs/SECURITY_CONTROLS.md" rel="noopener noreferrer"&gt;docs/SECURITY_CONTROLS.md&lt;/a&gt; — each control's theory, detection logic, and OWASP mapping&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/Security/Attacks/CSRF" rel="noopener noreferrer"&gt;MDN: CSRF&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.rfc-editor.org/rfc/rfc6265#section-8.5" rel="noopener noreferrer"&gt;RFC 6265 §8.5&lt;/a&gt; — cookies and port boundaries&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>security</category>
      <category>beginners</category>
      <category>python</category>
      <category>webdev</category>
    </item>
    <item>
      <title>What Is a Forward Deployed Engineer (FDE)? Origins, Business Models, and How AI Labs and Japanese IT Firms Are Using It</title>
      <dc:creator>SeaOtter ( Kentaro Mori )</dc:creator>
      <pubDate>Fri, 23 Oct 2026 12:13:01 +0000</pubDate>
      <link>https://dev.to/moruku36/what-is-a-forward-deployed-engineer-fde-origins-business-models-and-how-ai-labs-and-japanese-eli</link>
      <guid>https://dev.to/moruku36/what-is-a-forward-deployed-engineer-fde-origins-business-models-and-how-ai-labs-and-japanese-eli</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;On October 22, 2026, OpenAI held a live event called "Working at the Frontier: Forward Deployed Engineering at OpenAI" and published a page describing the program.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://openai.com/business/forward-deployed-engineering/" rel="noopener noreferrer"&gt;https://openai.com/business/forward-deployed-engineering/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The term FDE (Forward Deployed Engineer) has become very common over the past year. At the same time, people often ask questions like these:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If the job is to go to a customer, listen to what they need, and build a system, how is that different from a solutions engineer or a contract developer?&lt;/li&gt;
&lt;li&gt;The role apparently started at a company called Palantir. Why are AI companies adopting it one after another right now?&lt;/li&gt;
&lt;li&gt;In the end, how does this model make money?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This article tries to answer those questions by organizing public information (company announcements, earnings materials, news reports, and job postings) in chronological order. Everything here reflects what was known as of &lt;strong&gt;October 23, 2026&lt;/strong&gt;. FDE is a way of working that is still taking shape, so treat this as a &lt;strong&gt;first edition&lt;/strong&gt; that will be updated as things change.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Key points&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;An FDE is not just "a developer stationed at a customer." Two things set it apart from traditional contract development: &lt;strong&gt;taking responsibility until the system is used in production and delivers results&lt;/strong&gt;, and &lt;strong&gt;feeding what was learned in the field back into the company's own product or AI models&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;It started at Palantir. Things built in the field were cleaned up by the product team, turned into product features, and monetized through software licenses.&lt;/li&gt;
&lt;li&gt;In 2025, a widely discussed study reported that most enterprise generative AI pilots were not producing results. In 2026, OpenAI, Anthropic, Microsoft, AWS, and others committed close to $10 billion in total to FDE organizations.&lt;/li&gt;
&lt;li&gt;There are roughly three ways to make money with FDEs: &lt;strong&gt;recover the cost through product licenses&lt;/strong&gt;, &lt;strong&gt;recover it through deployment fees plus AI usage fees&lt;/strong&gt;, and &lt;strong&gt;charge for outcomes or a fixed price instead of hours worked&lt;/strong&gt;. Large Japanese IT companies are adopting the third model.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Terms used in this article
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Term&lt;/th&gt;
&lt;th&gt;Meaning&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Production&lt;/td&gt;
&lt;td&gt;The state where a system is used in everyday work, not just tried out&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PoC / pilot&lt;/td&gt;
&lt;td&gt;A small trial to check whether something works before full adoption&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Person-month billing (&lt;em&gt;ningetsu&lt;/em&gt;)&lt;/td&gt;
&lt;td&gt;Pricing based on "one person working for one month." It has long been the standard in Japanese system integration&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Usage-based pricing&lt;/td&gt;
&lt;td&gt;Fees that depend on how much you use. For AI, this is usually the amount of text processed (tokens)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gross margin&lt;/td&gt;
&lt;td&gt;Revenue minus the direct cost of delivering the product or service. Software companies tend to be high; services companies that rely on people tend to be low&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Private equity (PE)&lt;/td&gt;
&lt;td&gt;Investment firms that buy stakes in companies, improve their operations, and profit from the increase in value&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  1. What did OpenAI announce?
&lt;/h2&gt;

&lt;p&gt;First, here is what the OpenAI page says.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Item&lt;/th&gt;
&lt;th&gt;Details&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Role&lt;/td&gt;
&lt;td&gt;FDEs join the customer's team, observe how work gets done, and bring AI into production&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Process&lt;/td&gt;
&lt;td&gt;Define the outcome → Discover → Prototype → Validate → Go to production → Scale&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tools&lt;/td&gt;
&lt;td&gt;OpenAI Presence (an AI agent platform), Context Layer (a shared base for company knowledge), process mapping, and code modernization with Codex&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Examples&lt;/td&gt;
&lt;td&gt;T-Mobile (55% of customer chats handled without handoff to a person), BBVA (80% accuracy in credit risk assessment), modernization of 15,000 systems&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Organization&lt;/td&gt;
&lt;td&gt;OpenAI's own FDEs work together with its subsidiary, &lt;strong&gt;DeployCo (the OpenAI Deployment Company)&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqcrrfueqz51zsve1uamv.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqcrrfueqz51zsve1uamv.png" alt="The process starts with defining the outcome and moves through five stages: discover, prototype, validate, go to production, and scale. Model weaknesses found during prototyping and validation are reported to OpenAI's product and research teams, and improvements come back to the project. In the scale stage, DeployCo and IT partners take over ongoing support and rollout." width="800" height="1316"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Figure 1. The flow of an OpenAI FDE project (based on OpenAI's page)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The FAQ on that page contains two answers that show what kind of role this is.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;To the question "Do FDEs provide professional services?", the answer is &lt;strong&gt;"No."&lt;/strong&gt; FDEs are described as engineers who work with professional services partners to solve problems at the frontier of AI.&lt;/li&gt;
&lt;li&gt;It also says: "&lt;strong&gt;If something can be achieved with existing AI capabilities, an FDE is usually not needed.&lt;/strong&gt;"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In other words, OpenAI's FDEs do not take on just any request. They go into cases where &lt;strong&gt;current AI is not yet good enough to run in production&lt;/strong&gt;, and they report the model weaknesses they find to the product and research teams. Broad rollout to many companies is handled by DeployCo and partners.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. History: from Palantir to the AI labs
&lt;/h2&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fbkkpocb5huzshsiaa1zc.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fbkkpocb5huzshsiaa1zc.png" alt="A timeline of FDE in three periods. Origins: Palantir is founded and Shyam Sankar conceives the FDE role, the Airbus project and the birth of Foundry, the 2020 listing and criticism that Palantir is a services company. Re-evaluation: AIP Bootcamp in 2023, a surge in FDE job postings and the MIT study in 2025, and the start of OpenAI's FDE team. Capital commitment: OpenAI DeployCo and Anthropic's joint venture in May 2026, AWS and Microsoft in June and July, Japanese IT companies from August to October, Anthropic's training program, and OpenAI's event." width="798" height="205"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Figure 2. A short history of FDE (compiled from various sources)&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  2-1. Origins: Palantir (late 2000s to 2010s)
&lt;/h3&gt;

&lt;p&gt;The FDE role was created by Palantir, the US data analytics software company. It is credited to &lt;strong&gt;Shyam Sankar&lt;/strong&gt;, who joined in 2006 as the company's 13th employee and is now its CTO (&lt;a href="https://goldhouse.org/people/shyam-sankar/" rel="noopener noreferrer"&gt;profile&lt;/a&gt;). Palantir originally built software for government and intelligence agencies. Those customers handle a lot of classified information, and their work is highly specialized. The usual approach of "listen to the requirements, take them back to the office, and build" did not solve their problems well.&lt;/p&gt;

&lt;p&gt;Palantir split the people who went out to customers into two roles (&lt;a href="https://blog.palantir.com/a-day-in-the-life-of-a-palantir-deployment-strategist-951cb59a5a96" rel="noopener noreferrer"&gt;Palantir blog&lt;/a&gt;):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Delta&lt;/strong&gt;: Forward Deployed Software Engineer. The person who writes code and builds things on site&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Echo&lt;/strong&gt;: Deployment Strategist. The person who owns the problem and the outcome, and moves the customer organization&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The official blog explains that "in theory, Echos are more product-manager-like and Deltas are more technical, but in reality both roles are a mix of product management, engineering, and strategy."&lt;/p&gt;

&lt;p&gt;Nabeel Qureshi, who worked at Palantir for about eight years, wrote the essay "&lt;a href="https://nabeelqu.substack.com/p/reflections-on-palantir" rel="noopener noreferrer"&gt;Reflections on Palantir&lt;/a&gt;" (2024), a valuable inside account of how this worked. The main points:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;FDEs spent three to four days a week at the customer's office, learning the work of demanding industries such as manufacturing, healthcare, intelligence, and aerospace.&lt;/li&gt;
&lt;li&gt;The first major commercial project was with &lt;strong&gt;Airbus&lt;/strong&gt; in Toulouse, France. The team built software that removed bottlenecks in A350 production and significantly increased the production rate.&lt;/li&gt;
&lt;li&gt;FDEs prioritized speed and accepted rough, hacky solutions to get something working. &lt;strong&gt;The product development team then cleaned these up&lt;/strong&gt; into stable software that many customers could use.&lt;/li&gt;
&lt;li&gt;Many features of Palantir's main product, Foundry, came from the product team automating what FDEs had been doing by hand in the field.&lt;/li&gt;
&lt;/ul&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F422q7e414147d8piylwl.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F422q7e414147d8piylwl.png" alt="Palantir's loop. Echos and Deltas are stationed at the customer and solve the problem quickly. The product development team cleans up the solution and turns it into a standard feature of Foundry or AIP. The next customer can be served faster and more cheaply, a Bootcamp produces something working in days, contracts expand, and software license revenue comes in. That profit is invested in the next deployment." width="800" height="1232"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Figure 3. Palantir's "field → product → next field" loop (based on Qureshi's essay)&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  2-2. "Isn't Palantir just a services company?"
&lt;/h3&gt;

&lt;p&gt;The model of employing many FDEs was criticized for a long time: "That's not a software company, it's a consulting firm." This criticism was loud around the company's 2020 listing as well. Qureshi himself writes that around 2016 it was "partly fair."&lt;/p&gt;

&lt;p&gt;Since then, however, the numbers have looked like those of a software company.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Gross margin in 2023 was about 80% (from Qureshi's essay, which compares it with about 32% at Accenture).&lt;/li&gt;
&lt;li&gt;In Q2 2026, revenue grew 93% year over year to $1.935 billion, and &lt;strong&gt;US commercial revenue grew 149%&lt;/strong&gt; to $764 million (&lt;a href="https://www.sec.gov/Archives/edgar/data/0001321655/000132165526000039/a2026q2ex991pressrelease.htm" rel="noopener noreferrer"&gt;Palantir earnings release&lt;/a&gt;). Gross margin is reported at about 85% (secondary source).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Because improvements made in the field keep getting absorbed into the product, the share of manual services work does not grow much as the customer base grows. That is Palantir's explanation of why it did not become a services company.&lt;/p&gt;

&lt;h3&gt;
  
  
  2-3. AIP Bootcamp (2023 onward)
&lt;/h3&gt;

&lt;p&gt;In 2023, as generative AI spread, Palantir launched the &lt;strong&gt;AIP Bootcamp&lt;/strong&gt;. Its &lt;a href="https://www.sec.gov/Archives/edgar/data/1321655/000132165525000022/pltr-20241231.htm" rel="noopener noreferrer"&gt;FY2024 annual report (10-K)&lt;/a&gt; describes it as a way to "deliver real workflows on actual customer data in days." It is usually described as an intensive workshop of about five days, in which FDEs and the customer build AI use cases on the customer's own data. Since this leads into full contracts, FDEs also act as &lt;strong&gt;the front door for sales&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  2-4. Renewed attention in the generative AI era (2025)
&lt;/h3&gt;

&lt;p&gt;There are two main reasons FDEs suddenly drew attention in 2025.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;The problem of pilots not turning into results became clear.&lt;/strong&gt;
In its report "The GenAI Divide: State of AI in Business 2025," MIT's NANDA initiative found that about 95% of enterprise generative AI pilots had no measurable impact on profit and loss (&lt;a href="https://fortune.com/2025/08/18/mit-report-95-percent-generative-ai-pilots-at-companies-failing-cfo" rel="noopener noreferrer"&gt;Fortune&lt;/a&gt;). The cause was attributed not to model quality but to how organizations adopt the technology. Note that this figure comes from early-stage research, and the reported sample sizes differ between news outlets.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Job postings grew sharply.&lt;/strong&gt;
There are reports that FDE postings grew more than 800% from January to September 2025 (Financial Times, via &lt;a href="https://fastcompany.co.za/work-life/2025-11-08-forward-deployed-engineers-a-new-role-in-the-evolving-ai-job-market" rel="noopener noreferrer"&gt;Fast Company&lt;/a&gt;) and an analysis showing 1,165% year-over-year growth (&lt;a href="https://bloomberry.com/blog/i-analyzed-1000-forward-deployed-engineer-jobs/" rel="noopener noreferrer"&gt;Bloomberry&lt;/a&gt;). The methods differ, so the numbers are not directly comparable, but they agree on the scale: &lt;strong&gt;roughly 8 to 12 times in one year&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;OpenAI's FDE team also &lt;strong&gt;started with two people&lt;/strong&gt; around this time and had grown to about 140 by August 2026, according to Colin Jarvis, OpenAI's head of FDE (&lt;a href="https://newsletter.eng-leadership.com/p/inside-openais-forward-deployed-engineer" rel="noopener noreferrer"&gt;Engineering Leadership&lt;/a&gt;).&lt;/p&gt;

&lt;h3&gt;
  
  
  2-5. The year of big commitments (2026)
&lt;/h3&gt;

&lt;p&gt;In 2026, companies began creating dedicated organizations and companies and committing large amounts of money.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Date&lt;/th&gt;
&lt;th&gt;Company&lt;/th&gt;
&lt;th&gt;What happened&lt;/th&gt;
&lt;th&gt;Scale&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;May 4, 2026&lt;/td&gt;
&lt;td&gt;Anthropic&lt;/td&gt;
&lt;td&gt;Announced an enterprise AI services joint venture with Blackstone, Hellman &amp;amp; Friedman, and Goldman Sachs. Launched in July as &lt;strong&gt;Ode with Anthropic&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;$1.5B ($300M each from Anthropic, Blackstone, and H&amp;amp;F), about 100 engineers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;May 11, 2026&lt;/td&gt;
&lt;td&gt;OpenAI&lt;/td&gt;
&lt;td&gt;Launched the subsidiary &lt;strong&gt;OpenAI Deployment Company (DeployCo)&lt;/strong&gt; and agreed to acquire Tomoro in the UK&lt;/td&gt;
&lt;td&gt;Over $4B initial investment, about 150 FDEs and specialists from Tomoro&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;June 30, 2026&lt;/td&gt;
&lt;td&gt;AWS&lt;/td&gt;
&lt;td&gt;Created a new FDE organization that sends teams to customers for 45-day engagements&lt;/td&gt;
&lt;td&gt;$1B&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;July 2026&lt;/td&gt;
&lt;td&gt;Microsoft&lt;/td&gt;
&lt;td&gt;Created the &lt;strong&gt;Frontier Company&lt;/strong&gt; (an internal unit; some see it as a reorganization of its consulting services)&lt;/td&gt;
&lt;td&gt;$2.5B, about 6,000 people&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sept 8, 2026&lt;/td&gt;
&lt;td&gt;Accenture and Google Cloud&lt;/td&gt;
&lt;td&gt;Set up a dedicated Gemini Enterprise unit&lt;/td&gt;
&lt;td&gt;Target of 1,000 FDEs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Oct 2, 2026&lt;/td&gt;
&lt;td&gt;Anthropic&lt;/td&gt;
&lt;td&gt;Launched the &lt;strong&gt;Claude Frontier Academy&lt;/strong&gt; to train partner engineers in a medical-residency style program&lt;/td&gt;
&lt;td&gt;$100M, 10,000 engineers by the end of 2027&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Sources: &lt;a href="https://openai.com/index/openai-launches-the-deployment-company/" rel="noopener noreferrer"&gt;OpenAI&lt;/a&gt;, &lt;a href="https://www.cnbc.com/2026/05/04/anthropic-goldman-blackstone-ai-venture.html" rel="noopener noreferrer"&gt;CNBC&lt;/a&gt;, &lt;a href="https://techcrunch.com/2026/07/15/anthropic-blackstone-bet-the-next-trillion-dollar-ai-business-is-implementation-not-models/" rel="noopener noreferrer"&gt;TechCrunch&lt;/a&gt;, &lt;a href="https://thenextweb.com/news/aws-1bn-forward-deployed-engineers-enterprise-ai/" rel="noopener noreferrer"&gt;The Next Web (AWS)&lt;/a&gt;, &lt;a href="https://geekwire.com/2026/microsoft-announces-2-5b-frontier-company-to-embed-ai-engineers-inside-customers" rel="noopener noreferrer"&gt;GeekWire (Microsoft)&lt;/a&gt;, &lt;a href="https://www.directionsonmicrosoft.com/microsoft-launches-its-own-forward-deployed-engineering-unit-the-frontier-company/" rel="noopener noreferrer"&gt;Directions on Microsoft&lt;/a&gt;, &lt;a href="https://anthropic.com/news/claude-frontier-academy" rel="noopener noreferrer"&gt;Anthropic&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Investor Tomasz Tunguz estimates the money committed to FDE efforts over the past year at about $9.75 billion across five companies (&lt;a href="https://tomtunguz.com/fde-arms-race/" rel="noopener noreferrer"&gt;The FDE Arms Race&lt;/a&gt;). OpenAI's October 22 event is part of this trend.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. What kind of work is it?
&lt;/h2&gt;

&lt;h3&gt;
  
  
  3-1. What gap does an FDE fill?
&lt;/h3&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fng1nduwo7szwcqgegaet.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fng1nduwo7szwcqgegaet.png" alt="There is a deployment gap between what frontier models can do and measurable business results. The gap consists of scattered data and legacy systems, unwritten rules and exceptions in the work, quality evaluation and human review, permissions, monitoring and accountability, and adoption in the field. FDEs fill this gap, report what they learn to product and research teams, and those learnings become standard features for the next customer." width="800" height="143"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Figure 4. The deployment gap and the role of FDEs (based on OpenAI's explanation)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;OpenAI calls this the "deployment gap." No matter how capable AI becomes, it does not produce results unless it is connected to &lt;strong&gt;data scattered across the company, unwritten business rules, access control, and the habits of people on the ground&lt;/strong&gt;. FDEs go inside the customer to close that gap.&lt;/p&gt;

&lt;h3&gt;
  
  
  3-2. How is it different from existing roles?
&lt;/h3&gt;

&lt;p&gt;To answer "How is this different from a solutions engineer or contract development?", here is a comparison with similar roles.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Pre-sales solutions engineer&lt;/th&gt;
&lt;th&gt;Management consultant&lt;/th&gt;
&lt;th&gt;Contract development (person-month)&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;FDE&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Main output&lt;/td&gt;
&lt;td&gt;Demos and proposals&lt;/td&gt;
&lt;td&gt;A recommendations deck&lt;/td&gt;
&lt;td&gt;A system built to spec&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;A system used in production that produced results&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Who defines the problem&lt;/td&gt;
&lt;td&gt;The customer&lt;/td&gt;
&lt;td&gt;Worked out together&lt;/td&gt;
&lt;td&gt;The customer (requirements)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Found together, including whether it is worth solving&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Writes code?&lt;/td&gt;
&lt;td&gt;A little&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes (with a large team)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Yes (with a small team)&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Where responsibility ends&lt;/td&gt;
&lt;td&gt;The sale&lt;/td&gt;
&lt;td&gt;The report&lt;/td&gt;
&lt;td&gt;Delivery and acceptance&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Production use and adoption&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Where learnings go&lt;/td&gt;
&lt;td&gt;Sales materials&lt;/td&gt;
&lt;td&gt;Firm know-how&lt;/td&gt;
&lt;td&gt;Often stay inside the project&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Into the company's product or AI&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Basis for fees&lt;/td&gt;
&lt;td&gt;Product sales&lt;/td&gt;
&lt;td&gt;Time&lt;/td&gt;
&lt;td&gt;Headcount × duration&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Product or AI usage, fixed price, outcomes&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ftoyphjla921cxv55fqsa.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ftoyphjla921cxv55fqsa.png" alt="A four-quadrant map. The horizontal axis is how much the work improves the product; the vertical axis is responsibility for production results. Top right, the FDE quadrant: Palantir FDE, OpenAI FDE, DeployCo and Ode. Top left: person-month contract development and IT firms' FDE-style offerings. Bottom left: management consulting. Bottom right: pre-sales solutions engineers and customer success." width="800" height="800"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Figure 5. Where FDE sits relative to similar roles (positions are approximate)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The differences come down to two points.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Responsibility until results show up in production&lt;/strong&gt;
Traditional contract development usually ends at "build what was asked for and deliver it," and consulting ends at "make a recommendation." FDEs own the work &lt;strong&gt;until the business numbers actually improve&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A path back into the product&lt;/strong&gt;
This is the biggest difference. In contract development, what is learned on a project often stays within that project. FDEs pass what they learn back to the product team at Palantir, or to the research team at OpenAI. For example, at OpenAI a field report that "the model keeps making simple mistakes when converting COBOL to Java" was passed to the research team as a request for more training data in that area (&lt;a href="https://newsletter.eng-leadership.com/p/inside-openais-forward-deployed-engineer" rel="noopener noreferrer"&gt;Engineering Leadership&lt;/a&gt;).&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Put the other way around, &lt;strong&gt;an FDE with no path back into the product is just on-site contract development with a new name&lt;/strong&gt;. This is a useful lens when looking at the Japanese market later.&lt;/p&gt;

&lt;h3&gt;
  
  
  3-3. What the work looks like day to day
&lt;/h3&gt;

&lt;p&gt;Job postings and interviews paint the following picture.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;A lot of time on site&lt;/strong&gt;: At OpenAI, about half of working time is spent with customers. It varies by region: about 80% in the UAE and Japan, and two to three weeks a month in Europe and the US (&lt;a href="https://newsletter.eng-leadership.com/p/inside-openais-forward-deployed-engineer" rel="noopener noreferrer"&gt;Engineering Leadership&lt;/a&gt;). Anthropic's postings list 25–50% travel.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Example work&lt;/strong&gt;: One OpenAI example from Japan is modernizing the code of a customer with many legacy systems. Days alternate between meetings with teams such as payments, writing tests, and building migration code and progress dashboards.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Skills in demand&lt;/strong&gt;: According to an industry site that aggregates postings, the most requested skills are customer communication, travel and on-site work, and Python. &lt;strong&gt;Only 32% of postings ask for LLM expertise&lt;/strong&gt; (&lt;a href="https://synon.co.jp/article/news/2026-10-15-fde-daily" rel="noopener noreferrer"&gt;Synon FDE daily, Japanese&lt;/a&gt;). What matters more than AI knowledge is the ability to &lt;strong&gt;build something that actually works in the customer's environment&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pay&lt;/strong&gt;: Anthropic's US postings list $280K–$320K, and one analysis puts senior FDEs at AI labs at $350K–$550K (&lt;a href="https://tomtunguz.com/fde-arms-race/" rel="noopener noreferrer"&gt;Tunguz&lt;/a&gt;).&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3-4. Does this mean "AI writes the code and engineers just talk to customers"?
&lt;/h3&gt;

&lt;p&gt;Some people read FDE that way. It is half right and half not quite.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;What's right&lt;/strong&gt;: Thanks to generative AI and coding agents, the effort needed to build has dropped sharply. As a result, &lt;strong&gt;a small team of three to five people&lt;/strong&gt; can take a single use case all the way to production (see Fujitsu below). With less need for large teams, &lt;strong&gt;deciding what to build&lt;/strong&gt; matters more.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What's not quite right&lt;/strong&gt;: FDEs are not people who only talk. Palantir's Deltas and OpenAI's FDEs are engineers who write code and ship it to production. The planning and coordination role is often &lt;strong&gt;split into a separate role&lt;/strong&gt;, such as Palantir's Echo or Salesforce's Deployment Strategist.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In short, the job is not "focus on talking to customers." It is to &lt;strong&gt;go into the customer's workplace and, together with them, use AI as a tool to build something all the way through&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  4. Business models: how does it make money?
&lt;/h2&gt;

&lt;p&gt;Looking at the companies adopting FDEs, there are roughly three ways they make money (this grouping follows an &lt;a href="https://fde-consulting.jp/blog/fde-companies-japan" rel="noopener noreferrer"&gt;overview&lt;/a&gt; by a Japanese FDE consultancy).&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Frzdstup60ej27tb9p8lp.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Frzdstup60ej27tb9p8lp.png" alt="Three FDE business models. A, product adoption (Palantir, Salesforce): start FDE work or a Bootcamp short and cheap, then recover the cost through software licenses once it is embedded in the business, with gross margins around 80%. B, AI lab and cloud deployment companies (OpenAI, Anthropic, Microsoft, AWS, Google): the deployment company earns deployment fees, and once workloads run in production, API, token, and cloud usage fees accumulate. C, IT firms and consultancies selling outcomes (Hitachi, Fujitsu, NTT DATA, Accenture): a small team of three to five handles one use case, bills a fixed price or by outcome, and also resells partner products." width="800" height="240"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Figure 6. Three FDE business models&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Model A: Product adoption (Palantir, Salesforce)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;FDE work is treated as an &lt;strong&gt;upfront investment&lt;/strong&gt;. Bootcamps and pilots start small and short, and the company does not try to recover FDE costs at the start.&lt;/li&gt;
&lt;li&gt;The cost is recovered through &lt;strong&gt;software licenses&lt;/strong&gt; once the product is embedded in the business. Reports describe services as "a means to drive product adoption, not the primary revenue stream" (&lt;a href="https://finance.yahoo.com/markets/stocks/articles/ive-changed-mind-palantir-stock-193500694.html" rel="noopener noreferrer"&gt;Yahoo Finance&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;For this model to work, &lt;strong&gt;field improvements must keep flowing into the product&lt;/strong&gt;. Otherwise it turns into an unprofitable on-site service.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Salesforce follows the same model, using FDEs to drive adoption of its AI agent product Agentforce. Its postings pair FDEs with Deployment Strategists, closely mirroring Palantir's Delta and Echo split.&lt;/p&gt;

&lt;h3&gt;
  
  
  Model B: AI lab and cloud deployment companies (OpenAI, Anthropic, Microsoft, AWS, Google)
&lt;/h3&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fzqdux4soilu92au949q4.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fzqdux4soilu92au949q4.png" alt="Money flow in the deployment company model. The AI lab invests in the deployment company, provides people and models, and holds majority control. PE firms, banks, and consultancies also invest, refer their portfolio companies as customers, and receive returns. The deployment company embeds FDEs at customer companies to get systems into production and receives deployment fees. Customers pay the AI lab for API, ChatGPT Enterprise, and Claude usage. The deployment company passes field learnings back to the AI lab." width="800" height="166"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Figure 7. Money flow in the deployment company model (based on company announcements and reports)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;In this model, FDE work generates two kinds of revenue.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Deployment fees&lt;/strong&gt;: DeployCo and Ode charge customers. Pricing has not been disclosed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI and cloud usage fees&lt;/strong&gt;: Once AI agents run in production, they are used every day, and the usage fees flow continuously to the AI lab or cloud provider. &lt;strong&gt;This is most likely the real goal.&lt;/strong&gt; A pilot consumes very little, but once AI is used across a whole company, usage grows by orders of magnitude.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Another notable feature is the &lt;strong&gt;partnership with private equity firms&lt;/strong&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;DeployCo has 19 investors led by TPG, including consultancies and integrators such as Bain &amp;amp; Company, McKinsey, and Capgemini. According to OpenAI, its partners sponsor &lt;strong&gt;more than 2,000 businesses&lt;/strong&gt; worldwide (&lt;a href="https://openai.com/index/openai-launches-the-deployment-company/" rel="noopener noreferrer"&gt;OpenAI&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;At Ode, Blackstone and H&amp;amp;F refer their portfolio companies as potential customers, but Ode also sells to other companies (&lt;a href="https://www.cnbc.com/2026/05/04/anthropic-goldman-blackstone-ai-venture.html" rel="noopener noreferrer"&gt;CNBC&lt;/a&gt;).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For PE firms, this is a way to improve operations at portfolio companies with AI and increase their value. For AI labs, it means access to more than 2,000 potential customers from day one. There are also reports that DeployCo's investors have &lt;strong&gt;a guaranteed minimum return of 17.5% a year&lt;/strong&gt; (&lt;a href="https://tomtunguz.com/fde-arms-race/" rel="noopener noreferrer"&gt;Tunguz&lt;/a&gt;). This could not be confirmed in official announcements, but if true, it suggests the business is expected to have high margins.&lt;/p&gt;

&lt;p&gt;Microsoft, AWS, and Google have their own clouds, so their model is simpler. Workloads that FDEs bring into production translate directly into &lt;strong&gt;Azure, AWS, and Google Cloud consumption&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Model C: IT firms and consultancies selling outcomes (Hitachi, Fujitsu, NTT DATA, Accenture)
&lt;/h3&gt;

&lt;p&gt;For IT companies and consultancies that do not have their own AI models, FDE is a way to &lt;strong&gt;move away from person-month billing&lt;/strong&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Small teams, short cycles&lt;/strong&gt;: At Fujitsu, three to five FDEs work on a single use case (&lt;a href="https://www.weeklybcn.com/journal/feature/detail/20260907_217086.html" rel="noopener noreferrer"&gt;Weekly BCN, Japanese&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fixed or outcome-based pricing&lt;/strong&gt;: Fujitsu says "the price is fixed and we don't show a breakdown. The deal happens if the customer judges that it's worth that amount." NTT DATA describes "a service package priced based on the customer's problem and expected results, not on person-month rates" (same article).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reselling partner products&lt;/strong&gt;: Fujitsu combines its services with Palantir's products, and Accenture with products from Anthropic, OpenAI, Google, Workday, and others.&lt;/li&gt;
&lt;/ul&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fb8kpmd0yfvmsmqs7a1h5.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fb8kpmd0yfvmsmqs7a1h5.png" alt="Traditional person-month contracting: the IT department defines requirements, a large team designs and builds, the system is delivered and accepted, and the fee is headcount times duration. The FDE model: find the problem itself with executives and business units, a team of three to five uses AI to prototype in short cycles, support continues through production and adoption, and fees are a fixed price or outcome-based plus product and AI usage. The shift happens because generative AI lowers the cost of building and undermines the assumption of earning by hours worked." width="800" height="544"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Figure 8. Person-month contracting vs. the FDE model (based on Weekly BCN and other sources)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;When generative AI reduces the effort needed to write software, pricing by "hours × rate" runs into a contradiction: &lt;strong&gt;the more you use AI, the less you earn&lt;/strong&gt;. This is likely the main reason large Japanese IT companies are investing in FDE.&lt;/p&gt;

&lt;h3&gt;
  
  
  Comparing the three models
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;A. Product adoption&lt;/th&gt;
&lt;th&gt;B. Deployment company&lt;/th&gt;
&lt;th&gt;C. Outcome-based&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Examples&lt;/td&gt;
&lt;td&gt;Palantir, Salesforce&lt;/td&gt;
&lt;td&gt;OpenAI DeployCo, Ode, Microsoft, AWS, Google&lt;/td&gt;
&lt;td&gt;Hitachi, Fujitsu, NTT DATA, Accenture&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;FDE cost&lt;/td&gt;
&lt;td&gt;Upfront investment (mostly unrecovered)&lt;/td&gt;
&lt;td&gt;Partly recovered through deployment fees&lt;/td&gt;
&lt;td&gt;Recovered through fixed or outcome-based fees&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Real revenue source&lt;/td&gt;
&lt;td&gt;Software licenses&lt;/td&gt;
&lt;td&gt;AI and cloud usage&lt;/td&gt;
&lt;td&gt;Service fees and resale margin&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Where learnings go&lt;/td&gt;
&lt;td&gt;The company's product&lt;/td&gt;
&lt;td&gt;The company's models and product&lt;/td&gt;
&lt;td&gt;The customer and partner products&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Main risk&lt;/td&gt;
&lt;td&gt;Productization falls behind and it becomes a services business&lt;/td&gt;
&lt;td&gt;Customer lock-in concerns, PE return demands&lt;/td&gt;
&lt;td&gt;It becomes person-month billing with a new name&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  5. What each company is doing
&lt;/h2&gt;

&lt;h3&gt;
  
  
  5-1. Outside Japan
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Company&lt;/th&gt;
&lt;th&gt;Initiative&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Palantir&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;FDEs (Delta) and Deployment Strategists (Echo), AIP Bootcamp&lt;/td&gt;
&lt;td&gt;The original. Estimated at about 400–500 FDEs, about 12% of all employees (&lt;a href="https://tomtunguz.com/fde-arms-race/" rel="noopener noreferrer"&gt;Tunguz&lt;/a&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;OpenAI&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Its own FDEs (about 140) focus on feeding insights into product and research, while DeployCo (about 200) scales delivery&lt;/td&gt;
&lt;td&gt;Headcounts as of August 2026 (&lt;a href="https://newsletter.eng-leadership.com/p/inside-openais-forward-deployed-engineer" rel="noopener noreferrer"&gt;Engineering Leadership&lt;/a&gt;). Tomoro's customers include Tesco, Virgin Atlantic, and Supercell&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Anthropic&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;FDEs in the Applied AI team, the Ode joint venture (CEO Chris Taylor, co-founder of Fractional AI), and the Claude Frontier Academy&lt;/td&gt;
&lt;td&gt;Ode is "Claude-first" but uses other models when needed. The Academy trains engineers at &lt;strong&gt;partners&lt;/strong&gt; such as Accenture, Deloitte, and McKinsey rather than hiring them into Anthropic&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Microsoft&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Frontier Company ($2.5B, about 6,000 people, led by Rodrigo Kede Lima, former president of Microsoft Asia)&lt;/td&gt;
&lt;td&gt;Most staff come from existing teams. Some see it as a reorganization of its consulting services&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;AWS&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;FDE organization ($1B) sending teams for 45-day engagements&lt;/td&gt;
&lt;td&gt;Customers include the Allen Institute, Cox Automotive, the NBA, the NFL, Ricoh, and Southwest Airlines&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Google Cloud&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Hiring its own FDEs, plus a 1,000-FDE Gemini Enterprise unit with Accenture&lt;/td&gt;
&lt;td&gt;Also partnered with Hitachi on FDE-driven "physical AI" (June 2026)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Salesforce&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Pairs Agentforce FDEs with Deployment Strategists&lt;/td&gt;
&lt;td&gt;Plans to roughly double its UK FDE headcount to about 95 (&lt;a href="https://itpro.com/security/salesforce-doubles-down-on-forward-deployed-engineers-in-uk-agentforce-push" rel="noopener noreferrer"&gt;ITPro&lt;/a&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Accenture&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Anthropic Business Group (about 30,000 people trained on Claude, Dec 2025), a Gemini Enterprise unit with Google, and an FDE program with Workday (Oct 2026)&lt;/td&gt;
&lt;td&gt;Acts less as a company promoting "FDE" as its own job title and more as &lt;strong&gt;the delivery partner for each AI vendor's FDE motion&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Because Accenture does not have its own AI models or a flagship software product, it fits Model C rather than A or B: &lt;strong&gt;it builds a dedicated unit for each AI vendor and takes on deployment work&lt;/strong&gt;. In 2026 it has also started using the term "FDE" in its work with Google and Workday.&lt;/p&gt;

&lt;h3&gt;
  
  
  5-2. Japan
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Company&lt;/th&gt;
&lt;th&gt;Initiative&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Hitachi&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Plans to build an FDE organization of about 1,000 people in Japan during fiscal 2026. Launched the "Physical AI FDE Team" service on Sept 3, 2026&lt;/td&gt;
&lt;td&gt;Uses AI-driven interviews to draw out the know-how of skilled workers and structure it so AI can use it. Partnered with Google Cloud (&lt;a href="https://www.nikkei.com/article/DGXZQOUC183EE0Y6A810C2000000/" rel="noopener noreferrer"&gt;Nikkei, Japanese&lt;/a&gt;, &lt;a href="https://monoist.itmedia.co.jp/mn/articles/2609/07/news035_3.html" rel="noopener noreferrer"&gt;MONOist, Japanese&lt;/a&gt;, &lt;a href="https://cloud.google.com/blog/ja/products/gcp/hitachi-and-google-cloud-collaborate-on-the-social-implementation-of-physical-ai-using-fde?hl=ja" rel="noopener noreferrer"&gt;Google Cloud blog, Japanese&lt;/a&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Fujitsu&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Set up an FDE division in April 2026. Became a Palantir &lt;strong&gt;Global FDE Partner&lt;/strong&gt; on Sept 10&lt;/td&gt;
&lt;td&gt;Has worked with Palantir since 2020. Senior Palantir FDEs join Fujitsu's teams for set periods. Examples include about ¥500 million a year in savings in maintenance parts management, and about 98% less effort to draft personnel transfer plans at Trusco Nakayama (&lt;a href="https://global.fujitsu/ja-JP/pr/news/2026/09/10-01" rel="noopener noreferrer"&gt;Fujitsu, Japanese&lt;/a&gt;, &lt;a href="https://www.weeklybcn.com/journal/feature/detail/20260907_217086.html" rel="noopener noreferrer"&gt;Weekly BCN, Japanese&lt;/a&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;NTT DATA&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;"DataEnablement Suite," covering everything from finding the problem to implementation and adoption&lt;/td&gt;
&lt;td&gt;Sold as an outcome-based service package rather than by person-month. In one case it identified about 130 issues at a regional power company&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;NEC and others&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Among the "four major IT companies" Nikkei reported as expanding FDE&lt;/td&gt;
&lt;td&gt;At their July–August 2026 earnings briefings, the companies all spoke of moving away from person-month billing (&lt;a href="https://xtech.nikkei.com/atcl/nxt/column/18/00001/11956/" rel="noopener noreferrer"&gt;Nikkei xTECH, Japanese&lt;/a&gt;). Details are behind a paywall and could not be confirmed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Dentsu Group&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Began developing about 3,000 FDEs and FDMs (Forward Deployed Managers) across four Japanese group companies (Oct 14, 2026)&lt;/td&gt;
&lt;td&gt;Grows FDE capacity by training existing staff rather than hiring&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;AI and SaaS companies&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;LayerX, Loglass, AI Shift, JAPAN AI, SB OAI Japan, and others have created or are hiring for FDE roles&lt;/td&gt;
&lt;td&gt;76 FDE postings at 47 companies in Japan as of Oct 10, 2026 (unofficial count from an industry site)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;What stands out in Japan is that &lt;strong&gt;large IT companies are adopting FDE as a way to move away from person-month billing (Model C)&lt;/strong&gt;. Outside Japan, AI labs and software companies lead; in Japan, large IT companies are becoming the main players. As with Fujitsu partnering with Palantir and Hitachi with Google Cloud, they also serve as &lt;strong&gt;local delivery partners for overseas vendors' FDE motions&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  6. What comes next?
&lt;/h2&gt;

&lt;h3&gt;
  
  
  6-1. Why this is likely to become a lasting trend
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;The bottleneck has moved from "model capability" to "how AI is adopted."&lt;/strong&gt;
As the gap between models narrows, what differentiates is how deeply AI is embedded in the business. Ode's chief technologist put it this way: "model selection matters, but it's not where the majority of calories are spent" (&lt;a href="https://techcrunch.com/2026/07/15/anthropic-blackstone-bet-the-next-trillion-dollar-ai-business-is-implementation-not-models/" rel="noopener noreferrer"&gt;TechCrunch&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Building got cheaper, so small teams can reach production.&lt;/strong&gt;
Integration work that used to take a large team months can now be done by a small team that knows how to use AI, in a much shorter time. That makes Palantir's approach reproducible at other companies.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It matches how money flows.&lt;/strong&gt;
AI labs earn from usage, cloud providers from consumption, and IT firms from moving beyond person-month billing. Whatever their position, "being used in production, continuously" is what drives everyone's revenue.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  6-2. Things to watch out for
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Drifting into a services business&lt;/strong&gt;
Software companies have gross margins in the 70–80% range, while people-based services companies are said to be around 30–40%. If FDE learnings are not fed back into the product, the company becomes a low-margin consultancy. There is persistent criticism that "FDE is just a new name for implementation consultants" (&lt;a href="https://www.n47.com/insights/the-forward-deployed-engineer-dilemma" rel="noopener noreferrer"&gt;n47&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lock-in&lt;/strong&gt;
The more FDEs build business processes on a specific vendor's AI, the harder it becomes to switch. For the vendor that is a moat; for the customer it can feel like a toll booth (&lt;a href="https://tomtunguz.com/fde-arms-race/" rel="noopener noreferrer"&gt;Tunguz&lt;/a&gt;). Customers should check &lt;strong&gt;whether what is built and learned stays with them, or only improves the vendor's product&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Competition for talent&lt;/strong&gt;
People who combine strong engineering, business understanding, and interpersonal skills are rare. Anthropic choosing to train 10,000 partner engineers instead of hiring them reflects this shortage.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A new name on old work&lt;/strong&gt;
As discussed in section 3, what matters about FDE is "owning production results" and "feeding learnings back into the product." Simply renaming on-site contract development as FDE meets neither. As the Fujitsu example of "fixed price, no breakdown" shows, &lt;strong&gt;whether the contract itself has changed&lt;/strong&gt; is a good way to tell.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  6-3. What this means for engineers
&lt;/h3&gt;

&lt;p&gt;Three things stand out as expectations for engineers.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Being evaluated on outcomes, not output&lt;/strong&gt;
As AI takes over more of the code writing, the value of deciding "what to build and why" and of "keeping it running in production" goes up.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Domain knowledge&lt;/strong&gt;
OpenAI says it deliberately builds FDE teams that mix industry experts with people from other industries.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Turning field lessons into something reusable&lt;/strong&gt;
Whether you can generalize a one-off solution so the next customer can use it is what separates FDE from traditional contract work.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What FDE is ultimately aiming for is this: &lt;strong&gt;go into the customer's workplace, use AI to build until results show up, and leave that experience in a form that can be reused next time&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;FDE is a role Palantir created in the late 2000s. It worked by absorbing field solutions into the product and earning through software licenses.&lt;/li&gt;
&lt;li&gt;In 2025 it became clear that many generative AI pilots were not producing results, and in 2026 OpenAI, Anthropic, Microsoft, AWS, Google, and others set up dedicated organizations and companies and made major investments. OpenAI's October 22 event is part of that trend.&lt;/li&gt;
&lt;li&gt;What sets it apart from traditional contract development is &lt;strong&gt;owning production results&lt;/strong&gt; and &lt;strong&gt;having a path to feed learnings back into the product or AI&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;The money comes from product licenses (Model A), deployment fees plus AI and cloud usage (Model B), or fixed and outcome-based pricing (Model C). Large Japanese IT companies are using Model C to move away from person-month billing.&lt;/li&gt;
&lt;li&gt;Whether something labeled FDE really is FDE becomes easier to judge by looking at &lt;strong&gt;the shape of the contract&lt;/strong&gt; and &lt;strong&gt;where the learnings go&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;FDE is still taking shape. This article is a first edition and will be updated as the companies involved make their next moves.&lt;/p&gt;




&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Company announcements and official materials
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;OpenAI, "Forward deployed engineering for enterprise AI" &lt;a href="https://openai.com/business/forward-deployed-engineering/" rel="noopener noreferrer"&gt;https://openai.com/business/forward-deployed-engineering/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;OpenAI, "OpenAI launches DeployCo to help businesses build around intelligence" (May 11, 2026) &lt;a href="https://openai.com/index/openai-launches-the-deployment-company/" rel="noopener noreferrer"&gt;https://openai.com/index/openai-launches-the-deployment-company/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Anthropic, "Claude Frontier Academy" &lt;a href="https://anthropic.com/news/claude-frontier-academy" rel="noopener noreferrer"&gt;https://anthropic.com/news/claude-frontier-academy&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Anthropic, "Anthropic and Accenture partnership" &lt;a href="https://anthropic.com/news/anthropic-accenture-partnership" rel="noopener noreferrer"&gt;https://anthropic.com/news/anthropic-accenture-partnership&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Blackstone press release &lt;a href="https://www.blackstone.com/news/press/anthropic-partners-with-blackstone-hellman-friedman-and-goldman-sachs-to-launch-enterprise-ai-services-firm/" rel="noopener noreferrer"&gt;https://www.blackstone.com/news/press/anthropic-partners-with-blackstone-hellman-friedman-and-goldman-sachs-to-launch-enterprise-ai-services-firm/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Palantir Q2 2026 earnings release &lt;a href="https://www.sec.gov/Archives/edgar/data/0001321655/000132165526000039/a2026q2ex991pressrelease.htm" rel="noopener noreferrer"&gt;https://www.sec.gov/Archives/edgar/data/0001321655/000132165526000039/a2026q2ex991pressrelease.htm&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Palantir FY2024 10-K &lt;a href="https://www.sec.gov/Archives/edgar/data/1321655/000132165525000022/pltr-20241231.htm" rel="noopener noreferrer"&gt;https://www.sec.gov/Archives/edgar/data/1321655/000132165525000022/pltr-20241231.htm&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Palantir Blog, "A Day in the Life of a Palantir Deployment Strategist" &lt;a href="https://blog.palantir.com/a-day-in-the-life-of-a-palantir-deployment-strategist-951cb59a5a96" rel="noopener noreferrer"&gt;https://blog.palantir.com/a-day-in-the-life-of-a-palantir-deployment-strategist-951cb59a5a96&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Fujitsu press release (Sept 10, 2026, Japanese) &lt;a href="https://global.fujitsu/ja-JP/pr/news/2026/09/10-01" rel="noopener noreferrer"&gt;https://global.fujitsu/ja-JP/pr/news/2026/09/10-01&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Google Cloud blog, Hitachi and Google Cloud on physical AI with FDE (Japanese) &lt;a href="https://cloud.google.com/blog/ja/products/gcp/hitachi-and-google-cloud-collaborate-on-the-social-implementation-of-physical-ai-using-fde?hl=ja" rel="noopener noreferrer"&gt;https://cloud.google.com/blog/ja/products/gcp/hitachi-and-google-cloud-collaborate-on-the-social-implementation-of-physical-ai-using-fde?hl=ja&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  News and analysis
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Nabeel S. Qureshi, "Reflections on Palantir" &lt;a href="https://nabeelqu.substack.com/p/reflections-on-palantir" rel="noopener noreferrer"&gt;https://nabeelqu.substack.com/p/reflections-on-palantir&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Engineering Leadership, "Inside OpenAI's Forward Deployed Engineer" &lt;a href="https://newsletter.eng-leadership.com/p/inside-openais-forward-deployed-engineer" rel="noopener noreferrer"&gt;https://newsletter.eng-leadership.com/p/inside-openais-forward-deployed-engineer&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Tomasz Tunguz, "The FDE Arms Race" &lt;a href="https://tomtunguz.com/fde-arms-race/" rel="noopener noreferrer"&gt;https://tomtunguz.com/fde-arms-race/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;TechCrunch (Ode with Anthropic) &lt;a href="https://techcrunch.com/2026/07/15/anthropic-blackstone-bet-the-next-trillion-dollar-ai-business-is-implementation-not-models/" rel="noopener noreferrer"&gt;https://techcrunch.com/2026/07/15/anthropic-blackstone-bet-the-next-trillion-dollar-ai-business-is-implementation-not-models/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;CNBC (Anthropic joint venture) &lt;a href="https://www.cnbc.com/2026/05/04/anthropic-goldman-blackstone-ai-venture.html" rel="noopener noreferrer"&gt;https://www.cnbc.com/2026/05/04/anthropic-goldman-blackstone-ai-venture.html&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;GeekWire (Microsoft Frontier Company) &lt;a href="https://geekwire.com/2026/microsoft-announces-2-5b-frontier-company-to-embed-ai-engineers-inside-customers" rel="noopener noreferrer"&gt;https://geekwire.com/2026/microsoft-announces-2-5b-frontier-company-to-embed-ai-engineers-inside-customers&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Directions on Microsoft &lt;a href="https://www.directionsonmicrosoft.com/microsoft-launches-its-own-forward-deployed-engineering-unit-the-frontier-company/" rel="noopener noreferrer"&gt;https://www.directionsonmicrosoft.com/microsoft-launches-its-own-forward-deployed-engineering-unit-the-frontier-company/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;The Next Web (AWS) &lt;a href="https://thenextweb.com/news/aws-1bn-forward-deployed-engineers-enterprise-ai/" rel="noopener noreferrer"&gt;https://thenextweb.com/news/aws-1bn-forward-deployed-engineers-enterprise-ai/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;ITPro (Salesforce) &lt;a href="https://itpro.com/security/salesforce-doubles-down-on-forward-deployed-engineers-in-uk-agentforce-push" rel="noopener noreferrer"&gt;https://itpro.com/security/salesforce-doubles-down-on-forward-deployed-engineers-in-uk-agentforce-push&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Fortune (MIT NANDA, "The GenAI Divide") &lt;a href="https://fortune.com/2025/08/18/mit-report-95-percent-generative-ai-pilots-at-companies-failing-cfo" rel="noopener noreferrer"&gt;https://fortune.com/2025/08/18/mit-report-95-percent-generative-ai-pilots-at-companies-failing-cfo&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Bloomberry, "I analyzed 1,000 forward deployed engineer jobs" &lt;a href="https://bloomberry.com/blog/i-analyzed-1000-forward-deployed-engineer-jobs/" rel="noopener noreferrer"&gt;https://bloomberry.com/blog/i-analyzed-1000-forward-deployed-engineer-jobs/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;n47, "The Forward Deployed Engineer dilemma" &lt;a href="https://www.n47.com/insights/the-forward-deployed-engineer-dilemma" rel="noopener noreferrer"&gt;https://www.n47.com/insights/the-forward-deployed-engineer-dilemma&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Nikkei, "IT大手4社、『FDE』拡充急ぐ" (Japanese) &lt;a href="https://www.nikkei.com/article/DGXZQOUC183EE0Y6A810C2000000/" rel="noopener noreferrer"&gt;https://www.nikkei.com/article/DGXZQOUC183EE0Y6A810C2000000/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Nikkei xTECH, "IT大手4社、脱・人月へFDE拡充に意欲" (Japanese) &lt;a href="https://xtech.nikkei.com/atcl/nxt/column/18/00001/11956/" rel="noopener noreferrer"&gt;https://xtech.nikkei.com/atcl/nxt/column/18/00001/11956/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Weekly BCN, on FDE at Fujitsu and NTT DATA (Japanese) &lt;a href="https://www.weeklybcn.com/journal/feature/detail/20260907_217086.html" rel="noopener noreferrer"&gt;https://www.weeklybcn.com/journal/feature/detail/20260907_217086.html&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;MONOist, Hitachi HMAX solutions (Japanese) &lt;a href="https://monoist.itmedia.co.jp/mn/articles/2609/07/news035_3.html" rel="noopener noreferrer"&gt;https://monoist.itmedia.co.jp/mn/articles/2609/07/news035_3.html&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Synon, "FDE industry daily" (Oct 15, 2026, Japanese) &lt;a href="https://synon.co.jp/article/news/2026-10-15-fde-daily" rel="noopener noreferrer"&gt;https://synon.co.jp/article/news/2026-10-15-fde-daily&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;FDE Consulting, "Companies adopting FDE in 2026" (Japanese) &lt;a href="https://fde-consulting.jp/blog/fde-companies-japan" rel="noopener noreferrer"&gt;https://fde-consulting.jp/blog/fde-companies-japan&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; Some figures in this article, namely DeployCo's valuation and investors' minimum return, Palantir's FDE headcount, and FDE salaries, come from investor blogs and job posting aggregates and could not be confirmed in official announcements. FDE job growth figures also differ in period and method depending on who compiled them.&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>ai</category>
      <category>career</category>
      <category>openai</category>
      <category>anthropic</category>
    </item>
    <item>
      <title>Never Hand the Agent the Keys: Reading Meta Muse's Tech Stack from Public Sources</title>
      <dc:creator>SeaOtter ( Kentaro Mori )</dc:creator>
      <pubDate>Fri, 23 Oct 2026 07:22:34 +0000</pubDate>
      <link>https://dev.to/moruku36/never-hand-the-agent-the-keys-reading-meta-muses-tech-stack-from-public-sources-3no</link>
      <guid>https://dev.to/moruku36/never-hand-the-agent-the-keys-reading-meta-muses-tech-stack-from-public-sources-3no</guid>
      <description>&lt;p&gt;&lt;em&gt;This is an English version of an article originally written in Japanese for Zenn.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Give an AI agent access to your email, calendar, and shopping accounts, and you immediately run into a problem: &lt;strong&gt;the agent needs credentials to do its work — but if a credentialed agent gets tricked, the credentials go with it.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Security researcher Simon Willison calls the combination that makes this dangerous the "lethal trifecta":&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Access to private data&lt;/li&gt;
&lt;li&gt;Exposure to untrusted content (web pages, email, files)&lt;/li&gt;
&lt;li&gt;A channel to communicate externally&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Muse&lt;/strong&gt;, the personal AI agent Meta launched in the US on September 8, 2026, satisfies all three by design. It operates a browser on your behalf, reads and writes email, and even shops for you. Fittingly, the safety engineering blog post Meta published the same day is devoted almost entirely not to model performance, but to a different question: &lt;em&gt;how do you build boundaries outside the model that hold even when the model is fooled?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;In this article, I organize Muse's tech stack into four layers — infrastructure, application, AI architecture, and secret handling — based on Meta's public materials and the analyses and verification pieces written about them.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Infrastructure&lt;/strong&gt;: one Linux VM per user (the Muse Secure VM), split inside into two security domains&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Application&lt;/strong&gt;: the agent itself and its tools are confined to a "runtime cell"; the actual connector work happens in privilege-separated workers outside the cell&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI architecture&lt;/strong&gt;: Muse Spark at the core, an agent loop that assembles context and executes tools, and memory stored as files&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Secret handling&lt;/strong&gt;: the agent only ever holds surrogate tokens with no privileges; the real credential is swapped in only at the moment of sending&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;A note on sources.&lt;/strong&gt; This article is based on public materials. I am a Muse user, but I have not seen Meta's internal implementation. Where Meta has not disclosed something, I say so explicitly.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  How to read this article: separating fact, observation, and speculation
&lt;/h2&gt;

&lt;p&gt;The statements below rest on public materials as of October 23, 2026, plus observations from the Muse session used to write this article. Because these sources are of different natures, I keep three categories distinct throughout:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Category&lt;/th&gt;
&lt;th&gt;Meaning&lt;/th&gt;
&lt;th&gt;Example&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Fact (public sources)&lt;/td&gt;
&lt;td&gt;Stated in Meta's official announcements or engineering blog, or in analyses quoting them directly&lt;/td&gt;
&lt;td&gt;The Secure VM's two-domain split; Sentinel's role&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Observation (my environment)&lt;/td&gt;
&lt;td&gt;Values actually measured on the VM assigned to the writing session&lt;/td&gt;
&lt;td&gt;2 CPU cores, ~7.7 GiB of memory (details below)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Speculation&lt;/td&gt;
&lt;td&gt;My interpretation from public materials and product behavior; not confirmed by Meta&lt;/td&gt;
&lt;td&gt;The internal module split of the application layer&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The "observations" in particular are &lt;strong&gt;one example, from one session, at one point in time&lt;/strong&gt; — not a published free-plan spec. I found no material in which Meta publishes VM sizes per plan.&lt;/p&gt;

&lt;p&gt;The four main sources are listed in the References section at the end: Meta's safety engineering post "How We Built Safety Into Muse," the Muse Spark Safety &amp;amp; Preparedness Report, a Qiita article analyzing 198 posts on X together with the technical blog, and technical explainers by explainx.ai and Forkast.&lt;/p&gt;

&lt;h2&gt;
  
  
  The big picture
&lt;/h2&gt;

&lt;p&gt;The organizing idea is to separate "the smart part" from "the part that holds power," even inside a single VM (Figure 1).&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fsmyaann5s492z3eh4gz6.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fsmyaann5s492z3eh4gz6.png" alt="The user's client connects to a per-user Linux VM. Inside, the runtime cell where the agent runs is separated from a host-side domain holding the safety components; all outbound traffic and connector actions pass through Sentinel on the host side" width="800" height="1103"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Figure 1: Overview of the Muse Secure VM. The agent "proposes" actions; only Sentinel, on the host side, can permit execution. Colors: blue = user, green = runtime cell, red/orange = host-side safety components, purple = external services (created with Pele)&lt;/em&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Layer&lt;/th&gt;
&lt;th&gt;Main components&lt;/th&gt;
&lt;th&gt;Role&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Client&lt;/td&gt;
&lt;td&gt;iOS / Android / Web (muse.ai) / Mac / WhatsApp&lt;/td&gt;
&lt;td&gt;Request input, approval dialogs, presenting results&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AI&lt;/td&gt;
&lt;td&gt;Muse Spark 1.3&lt;/td&gt;
&lt;td&gt;Reads context and picks the next step (text or a tool call)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Application&lt;/td&gt;
&lt;td&gt;Agent harness, tools, skills, connector CLIs, browser component&lt;/td&gt;
&lt;td&gt;Does the work — but holds no privileges&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Permissions &amp;amp; secrets&lt;/td&gt;
&lt;td&gt;Sentinel, hatch-authd, privsep workers, hatch-safety&lt;/td&gt;
&lt;td&gt;Permission decisions, credential storage and swapping, input/output inspection&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Infrastructure&lt;/td&gt;
&lt;td&gt;Muse Secure VM (Linux), runtime cell (systemd-nspawn), eBPF / LSM&lt;/td&gt;
&lt;td&gt;Cell vs. host separation, kernel-level tracking of data flow&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  1. Infrastructure: one Linux VM per user, two domains inside
&lt;/h2&gt;

&lt;h3&gt;
  
  
  The Secure VM
&lt;/h3&gt;

&lt;p&gt;Muse assigns each user a dedicated cloud VM. Meta describes it as an isolated Linux computer with a browser, CPU, memory, and storage — the "system of record" for the agent's activity.&lt;/p&gt;

&lt;p&gt;Measuring the VM assigned to my writing session gave the following (observation):&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Item&lt;/th&gt;
&lt;th&gt;Observed value (2026-10-23)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;OS&lt;/td&gt;
&lt;td&gt;Linux x86_64 (kernel 7.0 series)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CPU&lt;/td&gt;
&lt;td&gt;2 cores (host: AMD EPYC 9D25)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Memory&lt;/td&gt;
&lt;td&gt;~7.7 GiB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Home disk&lt;/td&gt;
&lt;td&gt;100 GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Swap&lt;/td&gt;
&lt;td&gt;none&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;To repeat: this is a single example. You cannot conclude "the free plan has these specs." What you can say is that, at least in this session, the environment was a usable working Linux machine, sufficient for running shell scripts and small builds.&lt;/p&gt;

&lt;h3&gt;
  
  
  The runtime cell and the host-side domain
&lt;/h3&gt;

&lt;p&gt;The inside of the VM is not trusted uniformly. According to the public materials, it is split into two domains with different trust levels.&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;runtime cell&lt;/strong&gt; is where the agent itself, the browser, and the tools run, implemented as a systemd-nspawn container:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Root inside the cell is mapped to an unprivileged user on the host — even if an attacker gains root inside the cell, they remain an ordinary user on the host&lt;/li&gt;
&lt;li&gt;It has its own root filesystem, separated from the host side&lt;/li&gt;
&lt;li&gt;System calls are filtered; dangerous ones such as &lt;code&gt;io_uring&lt;/code&gt; are blocked&lt;/li&gt;
&lt;li&gt;Capabilities such as &lt;code&gt;CAP_SYS_PTRACE&lt;/code&gt; (inspecting other processes) and &lt;code&gt;CAP_NET_ADMIN&lt;/code&gt; (reconfiguring the network) are stripped&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The &lt;strong&gt;host-side domain&lt;/strong&gt; holds the safety-relevant components as separate systemd units, outside the cell:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Component&lt;/th&gt;
&lt;th&gt;Role&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Sentinel&lt;/td&gt;
&lt;td&gt;The sole permission authority for connector actions and outbound traffic&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;hatch-authd&lt;/td&gt;
&lt;td&gt;Stores credentials (OAuth tokens, etc.) and performs surrogation, described below&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Privsep workers&lt;/td&gt;
&lt;td&gt;Run the actual connector work outside the cell, with narrow privileges&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;hatch-safety&lt;/td&gt;
&lt;td&gt;An independent classifier ensemble that inspects model inputs and outputs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Postgres&lt;/td&gt;
&lt;td&gt;Persists application state, separated from both the cell and the credential store&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Communication between the cell and the host side is limited to Unix domain sockets, with the sending process verified at kernel level via &lt;code&gt;SO_PEERCRED&lt;/code&gt;. The characteristic move at this layer is to replace "we trust the peer by convention" with "the kernel verifies who the peer is."&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Application: the agent proposes; execution happens outside the cell
&lt;/h2&gt;

&lt;h3&gt;
  
  
  The agent harness
&lt;/h3&gt;

&lt;p&gt;The program that assembles context around the model and mediates tool calls is called the harness here. Meta's internal codename is "Hatch," traces of which remain in service names like &lt;code&gt;hatch-authd&lt;/code&gt;. User reports describe system files such as &lt;code&gt;AGENTS.md&lt;/code&gt; being visible from inside the product, and a roughly 350 MB Rust harness binary having been observed. That is user reporting, not a Meta announcement, so I treat it in this article as an external report.&lt;/p&gt;

&lt;p&gt;In my own environment, I can also confirm that Markdown files recording persona and memory (&lt;code&gt;IDENTITY.md&lt;/code&gt;, &lt;code&gt;MEMORY.md&lt;/code&gt;, and so on) exist as system files and that the agent reads them as it works (observation). Having persona and memory live outside the model weights, as files, is one of this product's most legible design traits.&lt;/p&gt;

&lt;h3&gt;
  
  
  Tools, skills, connectors
&lt;/h3&gt;

&lt;p&gt;The application layer seems to divide into three kinds of components (this is my organization from product behavior, not Meta's official taxonomy):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Tools&lt;/strong&gt;: basic operations — shell execution, file read/write, web search, browser control, creating events and documents&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Skills&lt;/strong&gt;: playbooks for tasks such as reservations, shopping, and email management, so the model follows a procedure instead of inventing one from scratch each time&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Connectors&lt;/strong&gt;: connections to external services such as Gmail and Google Calendar; OAuth grants are stored separately from the agent proper&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The key design point: &lt;strong&gt;the connector CLIs inside the runtime cell only parse arguments; they never touch credentials.&lt;/strong&gt; Typed arguments and file descriptors are passed over a Unix socket to a privsep worker outside the cell, and only there does the real work that touches credentials happen. Even if a prompt injection rewrites the tool-calling code inside the cell, there is simply no path from inside the cell to the credentials.&lt;/p&gt;

&lt;h3&gt;
  
  
  The browser component
&lt;/h3&gt;

&lt;p&gt;Web operations are handled by a separate component running a real Chromium. What the public materials reveal about how it "sees" is interesting:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Pages are given to the model only as accessibility-tree snapshots, not as raw DOM&lt;/li&gt;
&lt;li&gt;JavaScript cannot be executed in the page's own context, and developer tools are disabled&lt;/li&gt;
&lt;li&gt;Separate classifiers watch for prompt injections arriving via the DOM, images, and files&lt;/li&gt;
&lt;li&gt;The agent pauses while the user is operating the browser manually, or while credentials are being autofilled&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Instructions planted in page scripts are, by construction, unlikely to reach the model at all.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. AI architecture: the model, the agent loop, memory as files
&lt;/h2&gt;

&lt;h3&gt;
  
  
  The core model
&lt;/h3&gt;

&lt;p&gt;Muse's core is Muse Spark 1.3, released on September 2, 2026. Reported pricing: a free tier up to 100M tokens per week, Power at $20/month, and Maximum at $100/month. A higher-end model, Muse Wonder, was announced on October 12, 2026, with Muse integration rolling out to subscribers first — but the model running in my writing session was Muse Spark (observation).&lt;/p&gt;

&lt;h3&gt;
  
  
  The agent loop
&lt;/h3&gt;

&lt;p&gt;The basic behavior is the loop common to many agent products (Figure 2).&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8ebt5p6k68fznsjgaj8q.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8ebt5p6k68fznsjgaj8q.png" alt="From a user request, context is assembled; the model chooses text or a tool; tool results return to context, and the cycle repeats. Long-term information lives in memory files, and only relevant items enter the context" width="800" height="712"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Figure 2: The agent loop and memory. Memory files outside the model, plus background processing, are what make "it keeps working after you close the app" possible (created with Pele)&lt;/em&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Assemble context from the request, system instructions, retrieved memory, and conversation history&lt;/li&gt;
&lt;li&gt;The model chooses: answer in text, or use a tool&lt;/li&gt;
&lt;li&gt;Feed the tool result back into context and repeat from step 2&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Long conversations are summarized along the way, with only the important parts carried forward in compressed form. Continuity is maintained not by "remembering everything verbatim," but by summaries plus memory written to files.&lt;/p&gt;

&lt;h3&gt;
  
  
  Background processing
&lt;/h3&gt;

&lt;p&gt;The "keeps working after you close the app" promise is carried by this layer. On top of scheduled jobs (cron), event-driven hooks, and resident services, there is processing that organizes memory between conversations and does proactive research. The Qiita article relays a user's story of being notified, unprompted, about a recall on a car they had just bought — plausibly an example of this proactive processing at work (speculation).&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Secret handling: the agent never holds the real keys
&lt;/h2&gt;

&lt;p&gt;This is the layer I most want to introduce.&lt;/p&gt;

&lt;h3&gt;
  
  
  Credential surrogation
&lt;/h3&gt;

&lt;p&gt;What the agent receives is not a real OAuth token or password, but a &lt;strong&gt;surrogate token that carries no privileges by itself&lt;/strong&gt;. Only when Sentinel permits a connector action is the real credential swapped in, at the moment of sending (just-in-time insertion). Figure 3 shows the flow.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Foygmipcg7s5a8ddhm5o3.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Foygmipcg7s5a8ddhm5o3.png" alt="The agent proposes actions using only a surrogate token; when Sentinel permits, hatch-authd inserts the real credential just before sending and delivers it to the external service" width="800" height="1446"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Figure 3: Credential surrogation. Even if a prompt injection tricks the agent into "sending the password," the agent never had the real thing to begin with (created with Pele)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;This is a decisive difference from the "instruct the model not to leak" design. Instructions are advice; a fooled model breaks them. But "you cannot leak what you do not hold" survives the model's judgment failing.&lt;/p&gt;

&lt;p&gt;Email gets additional care: one-time codes, password reset links, and magic links are removed before the agent ever sees the message, so that email access cannot become a stepping stone to taking over other accounts.&lt;/p&gt;

&lt;h3&gt;
  
  
  Sentinel and taint tracking
&lt;/h3&gt;

&lt;p&gt;For every connector action and every piece of outbound traffic, Sentinel decides: permit, deny, or ask the user. Decisions are made at both L4 (destination host, resolved IP, port, protocol) and L7 (HTTP method, path, content), and are said to include defenses against SSRF techniques such as DNS rebinding.&lt;/p&gt;

&lt;p&gt;The second mechanism tracks data flow (Figure 4).&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fzwn39xrkc42wwa3a7w7d.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fzwn39xrkc42wwa3a7w7d.png" alt="A tool execution starts untainted; reading user data marks it; tainted traffic never passes automatically and goes to the user for confirmation" width="800" height="983"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Figure 4: Tainted egress. The taint marking is done by the kernel, via eBPF cgroup programs and LSM hooks — it does not depend on the model's self-report (created with Pele)&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A tool execution starts in an untainted state&lt;/li&gt;
&lt;li&gt;Reading the user's data marks the process as tainted&lt;/li&gt;
&lt;li&gt;The propagation of the mark is tracked by eBPF cgroup programs (used to capture traffic) and eBPF programs attached to LSM hooks&lt;/li&gt;
&lt;li&gt;Narrow untainted traffic may be permitted automatically, but tainted traffic never passes automatically — it goes to the user for confirmation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The point is that "is this action safe?" is judged not by the type of action, but by &lt;em&gt;whether the user's data was touched along the way&lt;/em&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Approval happens on a separate screen, not in the chat
&lt;/h3&gt;

&lt;p&gt;User approval is likewise obtained not as chat text, but in a dedicated client-side dialog, and the answer returns directly to Sentinel without passing through the model. Approval scopes come in five kinds: once only, for the session, for the task, time-boxed, and always.&lt;/p&gt;

&lt;p&gt;Keeping the approval UI out of the stream of model-generated text matters, in my reading. If "Do you approve?" were rendered inside the same chat that attacker content also flows into, that rendering itself could become a target.&lt;/p&gt;

&lt;h3&gt;
  
  
  Shopping payments
&lt;/h3&gt;

&lt;p&gt;Payments don't hand over a real card number either. For each purchase, the user approves the total amount, and for a new store, Stripe Link issues a single-use virtual card scoped to that store, amount, and expiry. If the card number leaks from the store, it cannot be used for anything else.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Five layers against prompt injection
&lt;/h2&gt;

&lt;p&gt;The public materials describe the prompt-injection defenses not as one mechanism but as five layers:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;#&lt;/th&gt;
&lt;th&gt;Layer&lt;/th&gt;
&lt;th&gt;Content&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Model training&lt;/td&gt;
&lt;td&gt;Muse Spark 1.3 itself is trained not to follow instructions smuggled into external content&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Harness labeling&lt;/td&gt;
&lt;td&gt;Content from external sources (web, email, files) is explicitly labeled "untrusted" when placed into context&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;Classifier ensemble&lt;/td&gt;
&lt;td&gt;Independently trained injection-detection classifiers run in parallel over external data (hatch-safety)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;Human approval&lt;/td&gt;
&lt;td&gt;Any operation that moves data out of the VM goes to the user for approval&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;Kernel-level boundary&lt;/td&gt;
&lt;td&gt;The runtime cell, privilege separation, hatch-authd access control, Sentinel — designed to hold even if layers 1–3 all fail&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Layer 5 expresses the philosophy: &lt;strong&gt;do not bet safety on the model being right.&lt;/strong&gt; The model is treated as something that will make mistakes, and the last line of defense is placed in the kernel and in processes the model cannot control.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Safety evaluation of the model itself
&lt;/h2&gt;

&lt;p&gt;Separate from the product's defenses, an evaluation of the model alone has also been published. The Muse Spark Safety &amp;amp; Preparedness Report is a 159-page report assessing the chemical/biological, cybersecurity, and loss-of-control domains under Meta's Advanced AI Scaling Framework.&lt;/p&gt;

&lt;p&gt;Key points:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;In pre-mitigation evaluation, chemical and biological capabilities were judged likely to reach "high risk"&lt;/li&gt;
&lt;li&gt;With layered mitigations in place, the published judgment is that residual risk is acceptable for deployment inside Meta AI&lt;/li&gt;
&lt;li&gt;A third-party evaluation (Apollo Research) also reported high "evaluation awareness" — the model's ability to notice it is being evaluated&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Note carefully: this report's primary subject is "Muse Spark as the core model of Meta AI," not "the operation of the Muse personal-agent product as a whole." A model evaluation does not by itself guarantee product safety. This article therefore treats the model's story (this section) separately from the product's defenses (sections 1–5).&lt;/p&gt;

&lt;h2&gt;
  
  
  7. Open questions that remain
&lt;/h2&gt;

&lt;p&gt;Even a carefully built design leaves open questions, visible in both the public materials and user reports.&lt;/p&gt;

&lt;h3&gt;
  
  
  It is not hidden from Meta itself
&lt;/h3&gt;

&lt;p&gt;The current standard VM is isolated from other users and from the internet, but it is not concealed from Meta. Confidential VMs — where the user holds the keys and Meta cannot access the contents — have been described as planned for the second half of 2026. "Isolated" and "invisible even to the provider" are different claims, and for this product, only the former currently holds.&lt;/p&gt;

&lt;h3&gt;
  
  
  No independent audit yet
&lt;/h3&gt;

&lt;p&gt;Most of this article's "facts" ultimately trace back to Meta's own engineering blog and launch-day announcements. The explainers are detailed, but the primary source is Meta. As of this writing, I could not confirm any published independent audit by a third party. The bug bounty — up to $300k, and up to $130k for a successful prompt injection affecting a single user — is evidence of how seriously Meta takes this attack class, and at the same time, pricing that assumes such events &lt;em&gt;can&lt;/em&gt; happen.&lt;/p&gt;

&lt;h3&gt;
  
  
  Blocked at the door
&lt;/h3&gt;

&lt;p&gt;According to the Qiita article, investment bank Jefferies tested several hundred major US sites and found that about a third refused Muse and about a third imposed verification or restrictions. Amazon began blocking Muse on September 21, 2026. However cleanly the agent side separates credentials, whether the other party's site accepts agents at all is a separate problem — the bottleneck is shifting from model quality to "can it get in the door at all," as the same article puts it.&lt;/p&gt;

&lt;h3&gt;
  
  
  Misreading what a permission means
&lt;/h3&gt;

&lt;p&gt;The same Qiita article relays a Marketplace case: a user who had chosen "always allow" expected to be asked each time, while the agent accepted an offer and sent the user's address to a buyer. Not a credential leak, but an accident of &lt;strong&gt;misjudged permission scope&lt;/strong&gt;. The more finely approvals are divided, the easier they are to misjudge; the narrower they are, the more approval fatigue grows. That tension remains no matter how strong the defenses are.&lt;/p&gt;

&lt;h2&gt;
  
  
  Limitations
&lt;/h2&gt;

&lt;p&gt;Finally, what this article &lt;strong&gt;cannot&lt;/strong&gt; claim:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The diagrams were drawn by me from descriptions in the public materials; they are not Meta's internal design documents. Where sources describe things differently, I prioritized the more concrete descriptions (the Qiita article and explainx.ai).&lt;/li&gt;
&lt;li&gt;I could not fetch Meta's original engineering blog (research.meta.ai) directly from my writing environment, so its content was verified through quotations and summaries in the Qiita article and overseas explainers. For the primary source, follow the link in the References.&lt;/li&gt;
&lt;li&gt;The VM spec observation is one example from one session, and may differ by time, plan, and region.&lt;/li&gt;
&lt;li&gt;The reported user voices may skew toward early adopters and newsworthy cases. The Qiita article itself notes that posts on X do not represent all users, and that its sentiment classification has methodological limits.&lt;/li&gt;
&lt;li&gt;Announced-but-unreleased items such as Muse Wonder integration and Confidential VMs are treated as "planned," distinct from shipped features.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;What stays with me about Muse's design is not the model's cleverness, but the &lt;strong&gt;unglamorous components around it, built on the premise that the model is not to be trusted&lt;/strong&gt;: systemd-nspawn, eBPF, &lt;code&gt;SO_PEERCRED&lt;/code&gt; on Unix sockets, privilege separation — a combination of well-worn Linux parts, solving the problem of not handing real keys to an agent that might be fooled, and not letting it decide for itself what may leave.&lt;/p&gt;

&lt;p&gt;Agent safety cannot be measured by model refusal rates alone. "On the day the model is completely fooled, what still holds?" Muse's public materials are, to my knowledge, one of the most concrete attempts yet to answer that question from the infrastructure side.&lt;/p&gt;

&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Meta, "Introducing Muse: The World's First Personal AI Agent Built for Everyone," 2026-09-08. &lt;a href="https://about.fb.com/news/2026/09/introducing-muse-personal-ai-agent/" rel="noopener noreferrer"&gt;https://about.fb.com/news/2026/09/introducing-muse-personal-ai-agent/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Tarek Sheasha (Meta Superintelligence Labs), "How We Built Safety Into Muse," 2026-09-08. &lt;a href="https://research.meta.ai/blog/security-and-safety-for-ai-agents-our-approach-with-muse" rel="noopener noreferrer"&gt;https://research.meta.ai/blog/security-and-safety-for-ai-agents-our-approach-with-muse&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Cristina Menghini et al., "Muse Spark Safety &amp;amp; Preparedness Report," arXiv:2606.12429, 2026. &lt;a href="https://arxiv.org/abs/2606.12429v1" rel="noopener noreferrer"&gt;https://arxiv.org/abs/2606.12429v1&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Hisashi Ito, "Xの投稿198件と技術ブログで見る、MetaのAIエージェント Muse の向き不向きと安全設計" (in Japanese), Qiita, 2026-10-11. &lt;a href="https://qiita.com/hisashi-ito/items/ffe164ae4aa88abb293e" rel="noopener noreferrer"&gt;https://qiita.com/hisashi-ito/items/ffe164ae4aa88abb293e&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;explainx.ai, "Meta Muse: Personal Agent + Sentinel VM Security (Sept 2026)." &lt;a href="https://www.explainx.ai/blog/meta-muse-personal-agent-launch-sentinel-vm-security-2026" rel="noopener noreferrer"&gt;https://www.explainx.ai/blog/meta-muse-personal-agent-launch-sentinel-vm-security-2026&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Blair Hayes, "Meta's Muse Agent Lives Behind a Kernel-Level Sentinel," Forkast, 2026-09-24. &lt;a href="https://forkast.news/metas-muse-agent-lives-behind-a-kernel-level-sentinel-the-architecture-reveals-where-agent-security-is-heading/" rel="noopener noreferrer"&gt;https://forkast.news/metas-muse-agent-lives-behind-a-kernel-level-sentinel-the-architecture-reveals-where-agent-security-is-heading/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Fello AI, "Meta Muse AI Agent: What It Does and What It Costs." &lt;a href="https://felloai.com/meta-muse-ai-agent/" rel="noopener noreferrer"&gt;https://felloai.com/meta-muse-ai-agent/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Stripe, "Stripe helps Muse, Meta's new personal AI agent, shop across the internet with Link," 2026-09-08. &lt;a href="https://stripe.com/gb/newsroom/news/stripe-helps-meta-muse-shop-with-link" rel="noopener noreferrer"&gt;https://stripe.com/gb/newsroom/news/stripe-helps-meta-muse-shop-with-link&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;All figures in this article were written in Mermaid, converted to SVG with &lt;a href="https://pele.run/" rel="noopener noreferrer"&gt;Pele&lt;/a&gt; 1.8.0, and then to PNG.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>security</category>
      <category>linux</category>
      <category>llm</category>
    </item>
    <item>
      <title>What I Could and Couldn't Verify Self-Hosting Open Models: Colab, RunPod, and an API Direction for Final Reviews</title>
      <dc:creator>SeaOtter ( Kentaro Mori )</dc:creator>
      <pubDate>Sat, 17 Oct 2026 10:39:07 +0000</pubDate>
      <link>https://dev.to/moruku36/what-i-could-and-couldnt-verify-self-hosting-open-models-colab-runpod-and-an-api-direction-for-32ml</link>
      <guid>https://dev.to/moruku36/what-i-could-and-couldnt-verify-self-hosting-open-models-colab-runpod-and-an-api-direction-for-32ml</guid>
      <description>&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;I started from a Qwen Gradio app that runs in Google Colab, then rented GPUs on RunPod to connect open-weight models to Open WebUI. That happened in three phases:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Phase 1 (2026-10-09):&lt;/strong&gt; a small Qwen2.5-1.5B-Instruct model returned one reply through Open WebUI.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Phase 2 (2026-10-15):&lt;/strong&gt; Qwen3.8-27B in BF16 returned one reply the same way. I took no quality or speed benchmarks.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Phase 3 (2026-10-15):&lt;/strong&gt; I tried to run a GGUF build of GLM-5.3-Flash on an H200 SXM. The container image pull completed, and I stopped the run while the model weights were still downloading. &lt;strong&gt;That produced zero model outputs and no A/B evaluation.&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The same day, my published final retrospective ended the RunPod evaluation. For ordinary review of code, documents and final deliverables, it records the MiMo-V2.6-Pro API as an &lt;strong&gt;unverified&lt;/strong&gt; operational candidate (no API account, key, call or result has been verified).&lt;/p&gt;

&lt;p&gt;My own account today, which the public repository doesn't contain: ordinary code, prose and final-artifact review became the recurring use case, and my usage frequency and the operational burden of running GPUs led me to take the MiMo-V2.6-Pro API as my practical direction. I have not called it, integrated it, benchmarked it, or shown it to be cheaper or better. I also don't consider the self-hosting work wasted. It remains useful technical learning for me.&lt;/p&gt;

&lt;p&gt;The rest of this post covers the setup, the order of the work, what the records actually support, the obstacles and how I triaged them, the work that never shows up on a GPU bill, the questions that separate an API from self-hosting, and where self-hosting still makes sense.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to read the numbers
&lt;/h2&gt;

&lt;p&gt;I separate four kinds of statement in the text: measured values from the records, estimates, my own decisions, and general inference.&lt;/p&gt;

&lt;p&gt;Dollar figures are &lt;strong&gt;estimates&lt;/strong&gt;. Each is a measurement window multiplied by the rate shown at the time. The window runs from just before Deploy until the $0/hr display after Stop. It is not response latency and not GPU-only time, and none of the figures is a final invoice. The Phase 1 figure covers only its final trial. Because the windows differ and no invoice has been reconciled, I don't add the phases into a total.&lt;/p&gt;

&lt;p&gt;Links point to the public docs on &lt;code&gt;main&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The setup
&lt;/h2&gt;

&lt;p&gt;This is a simplified view of Phases 1 and 2. Phase 3 had the same pod-side shape with llama.cpp as the server, but it never got as far as a model response.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Open WebUI
   │  authenticated HTTPS, through RunPod's HTTPS proxy
   ▼
GPU pod on RunPod
   └─ inference server (Phases 1-2: vLLM / Phase 3: llama.cpp server)
        └─ open-weight model (Qwen, then a GLM-5.3-Flash GGUF)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Phase 1:&lt;/strong&gt; an authentication guard sat in front, and only &lt;code&gt;GET /v1/models&lt;/code&gt; and &lt;code&gt;POST /v1/chat/completions&lt;/code&gt; were allowed through. vLLM listened behind it on loopback. (&lt;a href="https://github.com/moruku36/open-llm-multimodal-lab/blob/main/docs/runpod-phase1-verification-2026-10-09.md" rel="noopener noreferrer"&gt;Phase 1 record&lt;/a&gt;; this record is in Japanese only.)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Phase 2:&lt;/strong&gt; the vLLM API key was injected from a RunPod Secret reference, and a local Open WebUI used an OpenAI-compatible connection. An unauthenticated &lt;code&gt;/v1/models&lt;/code&gt; request returned 401 before I sent anything. (&lt;a href="https://github.com/moruku36/open-llm-multimodal-lab/blob/main/docs/runpod-phase2-verification-2026-10-15.md" rel="noopener noreferrer"&gt;Phase 2 record&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Phase 3:&lt;/strong&gt; a llama.cpp server image pinned by digest, told to fetch GGUF weights itself. (&lt;a href="https://github.com/moruku36/open-llm-multimodal-lab/blob/main/docs/phase3-trial-2026-10-15.md" rel="noopener noreferrer"&gt;Phase 3 trial record&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For Phases 2 and 3, I set pre-approved limits before starting (Phase 2: 45 minutes and $3; Phase 3: 75 minutes, $7, and six stop conditions). In Phase 2 I finished the UI-side setup before the GPU started, then ran Deploy, one request, Stop, a $0 spend-rate check, and Terminate in one sequence. In Phase 3 I stopped and terminated under those limits.&lt;/p&gt;

&lt;p&gt;I also designed a job API and runner that would save results before stopping the pod, but never built it (&lt;a href="https://github.com/moruku36/open-llm-multimodal-lab/blob/main/README.md" rel="noopener noreferrer"&gt;README&lt;/a&gt;). The RunPod lifecycle code lives in a separate repo, &lt;a href="https://github.com/moruku36/qwen-runpod-operations" rel="noopener noreferrer"&gt;qwen-runpod-operations&lt;/a&gt;, according to the Phase 2 record. I haven't re-read that repo for this post.&lt;/p&gt;

&lt;h2&gt;
  
  
  The order of the work
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;A Qwen Gradio app on Colab.&lt;/strong&gt; The repository began as a Qwen Gradio app and then tried on-demand RunPod inference (&lt;a href="https://github.com/moruku36/open-llm-multimodal-lab/blob/main/README.md" rel="noopener noreferrer"&gt;README&lt;/a&gt;). The README lists two Colab notebooks, one chat-only and one multimodal. The app is still in the repository, but I did not deploy and verify the whole app or its multimodal workflow on RunPod (&lt;a href="https://github.com/moruku36/open-llm-multimodal-lab/blob/main/docs/runpod-retrospective-2026-10-15.md" rel="noopener noreferrer"&gt;final retrospective&lt;/a&gt;). The public records don't say why I moved to RunPod, so this post doesn't either.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Phase 1 (2026-10-09).&lt;/strong&gt; A minimal connectivity test with a small model.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Phase 2 (2026-10-15, &lt;a href="https://github.com/moruku36/open-llm-multimodal-lab/pull/44" rel="noopener noreferrer"&gt;PR #44&lt;/a&gt;).&lt;/strong&gt; The same path with a 27B-class model, as one short connection test.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Phase 3 (2026-10-15, &lt;a href="https://github.com/moruku36/open-llm-multimodal-lab/pull/45" rel="noopener noreferrer"&gt;PR #45&lt;/a&gt;).&lt;/strong&gt; A planned comparison of three GLM variants (A: a GGUF of the official model; B: an abliterated GGUF variant; C: a security-tuned FP8 build based on full GLM-5.3 rather than Flash). I finished the GPU-free preparation and started track A. The README treats the whole plan as historical.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Closing (2026-10-15, &lt;a href="https://github.com/moruku36/open-llm-multimodal-lab/pull/46" rel="noopener noreferrer"&gt;PR #46&lt;/a&gt;).&lt;/strong&gt; The final retrospective ended the evaluation and recorded the API direction for review work.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  What the records actually support
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Phase&lt;/th&gt;
&lt;th&gt;Setup&lt;/th&gt;
&lt;th&gt;What was verified&lt;/th&gt;
&lt;th&gt;Window and estimate&lt;/th&gt;
&lt;th&gt;Not verified&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1 (Oct 9)&lt;/td&gt;
&lt;td&gt;RTX PRO 4000 24 GB, Qwen2.5-1.5B-Instruct (vLLM)&lt;/td&gt;
&lt;td&gt;One reply displayed in Open WebUI. I asked for Japanese and got the English &lt;code&gt;Connected successfully.&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Measurement start to first stop confirmation: 319.8 s, about $0.051 (final trial only)&lt;/td&gt;
&lt;td&gt;Answer quality, instruction following, speed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2 (Oct 15)&lt;/td&gt;
&lt;td&gt;A100 SXM 80 GB, Qwen3.8-27B BF16 (vLLM)&lt;/td&gt;
&lt;td&gt;One reply through Open WebUI's OpenAI-compatible path, in Japanese as instructed: 「接続確認できました」&lt;/td&gt;
&lt;td&gt;Just before Deploy to the $0/hr display after Stop: 875.1 s, about $0.44 (at $1.80/hr)&lt;/td&gt;
&lt;td&gt;Quality, speed, long context, image input, the manual-hook route, lifecycle automation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3 (Oct 15)&lt;/td&gt;
&lt;td&gt;H200 SXM 141 GB, GLM-5.3-Flash GGUF (llama.cpp)&lt;/td&gt;
&lt;td&gt;Image pull completed (digest matched). Weights are 108.7 GB in total; container-disk usage reached about 69 GB at 23:29 JST, when the fetch rate had fallen to about 1.6 GB/min, and I stopped the run two minutes later&lt;/td&gt;
&lt;td&gt;Just before Deploy to the $0/hr display: 1381.7 s, about $2.04 (at $5.31/hr)&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Zero model outputs, no A/B evaluation.&lt;/strong&gt; B not run; C cost-estimated only&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Sources: &lt;a href="https://github.com/moruku36/open-llm-multimodal-lab/blob/main/docs/runpod-phase1-verification-2026-10-09.md" rel="noopener noreferrer"&gt;Phase 1&lt;/a&gt;, &lt;a href="https://github.com/moruku36/open-llm-multimodal-lab/blob/main/docs/runpod-phase2-verification-2026-10-15.md" rel="noopener noreferrer"&gt;Phase 2&lt;/a&gt;, &lt;a href="https://github.com/moruku36/open-llm-multimodal-lab/blob/main/docs/phase3-trial-2026-10-15.md" rel="noopener noreferrer"&gt;Phase 3 trial&lt;/a&gt;, and the &lt;a href="https://github.com/moruku36/open-llm-multimodal-lab/blob/main/docs/runpod-retrospective-2026-10-15.md" rel="noopener noreferrer"&gt;final retrospective&lt;/a&gt;. Each run ended with a $0/hr display after Stop and a $0 spend rate after the pod was deleted. The Phase 2 and 3 records add a pod count of 0, and Phase 3 also records the endpoint returning 404.&lt;/p&gt;

&lt;p&gt;Two cautions about reading this table:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Phases 1 and 2 are connection tests. "One reply" in Phase 2 means one reply came back through the documented A100 and Qwen3.8-27B BF16 path. It says nothing general about quality or speed.&lt;/li&gt;
&lt;li&gt;The Phase 3 preparation included a scorer that I checked against a mock server. Its scores are test-fixture values, &lt;strong&gt;not GLM measurements&lt;/strong&gt;, and I don't use them here.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Obstacles and how I triaged them
&lt;/h2&gt;

&lt;p&gt;The final retrospective is explicit that these were &lt;strong&gt;operational faults, distinct from reasoning or answer capability&lt;/strong&gt;, and that platform or security restrictions shouldn't be read as model inability.&lt;/p&gt;

&lt;h3&gt;
  
  
  The GPU didn't come back after Stop (Phase 1, earlier trial)
&lt;/h3&gt;

&lt;p&gt;An earlier trial got as far as a ready model but never confirmed a reply in Open WebUI. After I stopped it, I couldn't get a GPU back on the same pod. According to the record, RunPod releases the GPU on Stop, so a stopped pod can't resume if another user has taken the GPU on its original host. The container disk is also wiped on Stop. For the final trial I prepared the UI first and only updated the connection target once a fresh pod was up (&lt;a href="https://github.com/moruku36/open-llm-multimodal-lab/blob/main/docs/runpod-phase1-verification-2026-10-09.md" rel="noopener noreferrer"&gt;Phase 1 record&lt;/a&gt;).&lt;/p&gt;

&lt;h3&gt;
  
  
  Stripped quotes and a restart loop (Phase 2)
&lt;/h3&gt;

&lt;p&gt;I put an argument with a JSON value in the start command. RunPod stripped its quotes, vLLM exited on the argument error, and the pod restarted in a loop. &lt;code&gt;/health&lt;/code&gt; returning 404 or 502 can't tell a restart loop from a slow load, so the lesson I recorded is to read the System and Container logs in the first minute. I fixed it by removing the argument and editing the pod. No weights had been fetched yet, so only time was lost (&lt;a href="https://github.com/moruku36/open-llm-multimodal-lab/blob/main/docs/runpod-phase2-verification-2026-10-15.md" rel="noopener noreferrer"&gt;Phase 2 record&lt;/a&gt;).&lt;/p&gt;

&lt;h3&gt;
  
  
  The first request was rejected (Phases 1 and 2)
&lt;/h3&gt;

&lt;p&gt;In Phase 2, Open WebUI 0.12.2 defaulted Function Calling to Native. It sent enabled tools with &lt;code&gt;tool_choice: "auto"&lt;/code&gt;, and vLLM rejected the request because the server had no tool-call settings. Switching the chat to Legacy and regenerating fixed it. The same switch worked in Phase 1, but there I never confirmed the rejection's cause from the actual payload.&lt;/p&gt;

&lt;h3&gt;
  
  
  A thinking model and a small max_tokens (Phase 2)
&lt;/h3&gt;

&lt;p&gt;Qwen3.8 starts by thinking, so 64 tokens can run out before any answer appears. Sending &lt;code&gt;chat_template_kwargs = {"enable_thinking": false}&lt;/code&gt; as an Open WebUI custom parameter returned only the answer.&lt;/p&gt;

&lt;h3&gt;
  
  
  Template defaults (Phase 2)
&lt;/h3&gt;

&lt;p&gt;RunPod's "vLLM Latest" template defaulted to a guessable API key and to a &lt;code&gt;HF_HOME&lt;/code&gt; that assumed a persistent volume. I replaced the first with a Secret reference and moved the second onto the container disk.&lt;/p&gt;

&lt;h3&gt;
  
  
  A &lt;code&gt;/health&lt;/code&gt; that stayed at 502 (Phase 3)
&lt;/h3&gt;

&lt;p&gt;In Phase 3 &lt;code&gt;/health&lt;/code&gt; returned 502 the whole time. llama-server doesn't start listening until the &lt;code&gt;-hf&lt;/code&gt; fetch finishes, so this wasn't an error signal, and there were no server errors or restart loops. I followed progress through container-disk usage (JST):&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Time&lt;/th&gt;
&lt;th&gt;Container disk used&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;23:13&lt;/td&gt;
&lt;td&gt;about 16 GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;23:15&lt;/td&gt;
&lt;td&gt;about 35 GB (about 9 GB/min)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;23:18&lt;/td&gt;
&lt;td&gt;about 51 GB (about 5.5 GB/min)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;23:29&lt;/td&gt;
&lt;td&gt;about 69 GB (about 1.6 GB/min)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The measurement started at 23:08:35.5, and the image pull and container creation finished at 23:10:45. &lt;strong&gt;The image pull completed; I stopped the run while the weights were downloading.&lt;/strong&gt; My stop condition 3 required readiness within 25 minutes of model start, and the projection at the time put fetch completion near 23:54 and readiness near 23:58. I gave the abort order at 23:31:12, the $0.00/hr display after Stop appeared at 23:31:37, and I terminated the pod after that (&lt;a href="https://github.com/moruku36/open-llm-multimodal-lab/blob/main/docs/phase3-trial-2026-10-15.md" rel="noopener noreferrer"&gt;Phase 3 trial record&lt;/a&gt;). The record doesn't establish why the fetch slowed, and I won't guess.&lt;/p&gt;

&lt;p&gt;The final retrospective frames Phase 3 as not an image-download failure, not evidence that the model is poor, and not evidence that RunPod is generally unusable. Phases 1 and 2 each reached one reply on RunPod.&lt;/p&gt;

&lt;h3&gt;
  
  
  GPU supply (Phase 3)
&lt;/h3&gt;

&lt;p&gt;My planned H200 NVL went out of stock right after approval, and switching to the H200 SXM, at about 1.4 times the rate, needed a fresh approval. The record treats GPU supply as one more variable.&lt;/p&gt;

&lt;h2&gt;
  
  
  Work that never appears on the GPU bill
&lt;/h2&gt;

&lt;p&gt;The public records show these non-GPU items:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;GPU-free preparation.&lt;/strong&gt; Phase 3's P3-0 covered a model registry with pinned revisions (via Hugging Face's public API, with no downloads), a check of the first 8 MB of the GGUF headers, a check that the inference image contained the target model's implementation, an evaluation set, and a scorer validated against a mock server. The first version of the scorer counted HTTP errors as refusals, and I fixed that during validation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;UI setup before the GPU starts.&lt;/strong&gt; Function Calling, max_tokens, thinking off and Model IDs were finished beforehand, which the Phase 2 record says kept GPU time minimal.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Debugging.&lt;/strong&gt; About 4 of Phase 2's 875 seconds (about $0.12) went to the argument error. The window includes that time.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Proving shutdown.&lt;/strong&gt; I checked the $0/hr display after Stop, the $0 spend rate after Terminate, the pod count, and, in Phase 3, that the endpoint returned 404.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reconciling the bill.&lt;/strong&gt; In Phase 3 the displayed balance dropped $3.17 against an estimate of about $2.04. The roughly $1.10 gap may be billing lag, but that is unconfirmed. The final invoice is unreconciled, and storage or volume deletion beyond what the reports cover is unverified (&lt;a href="https://github.com/moruku36/open-llm-multimodal-lab/blob/main/docs/runpod-retrospective-2026-10-15.md" rel="noopener noreferrer"&gt;final retrospective&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Everything around the model.&lt;/strong&gt; The retrospective lists environment and dependency compatibility, authentication setup, quote and argument handling, Open WebUI settings, GPU supply, large weight transfer and storage, and shutdown and billing confirmation.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The retrospective also records "about two weeks" as my experienced calendar and preparation effort, explicitly &lt;strong&gt;not&lt;/strong&gt; measured wall time, GPU hours, or benchmark time. I don't break it down further here. Of the items above, the only durations recorded are Phase 2's roughly 4 minutes on the argument error and each run's measurement window. No public record measures the rest of the preparation and checking time.&lt;/p&gt;

&lt;h2&gt;
  
  
  API or self-hosting: the questions I would ask
&lt;/h2&gt;

&lt;p&gt;Read this in three layers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Public record (PR #46's retrospective):&lt;/strong&gt; consider the &lt;strong&gt;MiMo-V2.6-Pro API (&lt;code&gt;mimo-v2.6-pro&lt;/code&gt;)&lt;/strong&gt; as an operational candidate for ordinary code, document and final-artifact review. It is unverified: no account, key, call or result, no integration, and no measured same-workload comparison with self-hosting. That status stays as recorded (&lt;a href="https://github.com/moruku36/open-llm-multimodal-lab/blob/main/docs/runpod-retrospective-2026-10-15.md" rel="noopener noreferrer"&gt;final retrospective&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;My present account (not in the public record):&lt;/strong&gt; the recurring review use case, my usage frequency and the GPU operating burden led me to choose the API as a practical direction. It is my decision, not a measured result.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Measured results:&lt;/strong&gt; none for the API. No calls, integration, benchmark, or cost or quality comparison, and no claim that it is cheapest, best, or ranked anywhere.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The retrospective also notes that the model's weights are published as open weights, so it isn't API-only.&lt;/p&gt;

&lt;p&gt;The questions below are general inference, not measurements from my setup. I did not check MiMo's current pricing or the individual clauses of its provider's privacy policy against the official pages while writing this, so I leave them out.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;How will you compare costs?&lt;/strong&gt; Compare against an assumed usage volume. A pod bills per hour and an API per token, so the unit prices can't be compared directly. My Phase 1 to 3 figures come from connection-test windows and can't be converted into a per-token cost. Check the provider's current pricing page when you decide.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What happens to your data?&lt;/strong&gt; Whether code or documents may go to an external API is a question to settle before sending anything. Check the provider's official pages for how data is retained and used, and check the applicable contract, permissions and region. I did not verify these while writing this post. An API isn't inherently private, and self-hosting isn't inherently secure.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;How much will you run it?&lt;/strong&gt; A pod's cost grows with the time you hold it, and an API's cost grows with the tokens you use. Which is cheaper depends on your usage, and I haven't measured it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;How much operating time can you spare?&lt;/strong&gt; The previous section's non-GPU work is yours to do when you self-host. The records also show cases where I couldn't get the GPU I wanted.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;How exposed do you want to be to change?&lt;/strong&gt; An API's prices and behavior can change on the provider's schedule. Self-hosting means following model and serving-stack updates yourself.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Where self-hosting still earns its place
&lt;/h2&gt;

&lt;p&gt;The retrospective names pinned reproducibility, control over weights, custom requirements, privacy architecture and sustained high utilization as cases where self-hosting may fit. It adds that you still need verified data handling and a measured, same-workload cost comparison. My own additions, as inference:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;You need a specific set of weights or a specific quantization.&lt;/strong&gt; The Phase 3 trial record notes that tracks A and B share a quantization and size but use different weights, so they can be compared fairly (&lt;a href="https://github.com/moruku36/open-llm-multimodal-lab/blob/main/docs/phase3-trial-2026-10-15.md" rel="noopener noreferrer"&gt;Phase 3 trial record&lt;/a&gt;). A comparison that fixes the quantization and size and varies only the weights is awkward to build on a single provider's API.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The input can't leave your environment.&lt;/strong&gt; Self-hosting is a strong candidate, though you still have to verify how your own environment handles the data.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;You want to adjust the serving stack itself.&lt;/strong&gt; Server settings and launch arguments are only yours to change when you run the server.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Usage is high and steady.&lt;/strong&gt; If utilization is continuously high, the cost picture can shift. That still needs its own measurement.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;RunPod did work for me: Phases 1 and 2 each reached one reply. Ending Phase 3 says nothing about whether RunPod is usable.&lt;/p&gt;

&lt;h2&gt;
  
  
  Lessons recorded in the repo
&lt;/h2&gt;

&lt;p&gt;These come from the final retrospective and the phase records. They are &lt;strong&gt;lessons, not scheduled work&lt;/strong&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Check how start-command arguments split locally, and keep JSON-valued arguments out of the start command (use environment variables or a config file).&lt;/li&gt;
&lt;li&gt;Read the container logs in the first minute, because &lt;code&gt;/health&lt;/code&gt; 404 or 502 can't separate a restart loop from a slow load.&lt;/li&gt;
&lt;li&gt;Finish all UI settings before the GPU starts.&lt;/li&gt;
&lt;li&gt;Fetching large weights is the main risk. The recorded ideas are to pre-fetch onto a network volume in the same region from a cheap CPU pod, to use a parallel downloader and verify SHA-256 against the registry, and to keep the GPU and the volume in the same region.&lt;/li&gt;
&lt;li&gt;Split the readiness stop condition into fetch and load. Mine was written for startup failures and ended up firing on download speed.&lt;/li&gt;
&lt;li&gt;Approve a fallback GPU and its limit up front, so a stock change doesn't stall the run.&lt;/li&gt;
&lt;li&gt;Define shutdown proof: a $0 spend rate after Stop, zero pods after Terminate, and the endpoint unreachable (404).&lt;/li&gt;
&lt;li&gt;Inject API keys from Secret references, always override a template's default key, and keep keys, endpoint URLs and pod IDs out of public docs.&lt;/li&gt;
&lt;li&gt;Report operational faults separately from model capability.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What this post doesn't claim
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;A total cost across phases. Each figure is a window-based estimate, not a final invoice.&lt;/li&gt;
&lt;li&gt;A quality, speed, long-context or image-input benchmark for any model.&lt;/li&gt;
&lt;li&gt;Any result for the GLM models (Phase 3 produced zero model outputs).&lt;/li&gt;
&lt;li&gt;A cause for the slow weight download in Phase 3.&lt;/li&gt;
&lt;li&gt;A reason for ending the evaluation, or for moving from Colab to RunPod. The public records give neither.&lt;/li&gt;
&lt;li&gt;Any measurement of the MiMo-V2.6-Pro API's behavior, quality, latency or cost, any check of its data handling, or any integration status.&lt;/li&gt;
&lt;li&gt;MiMo's current pricing or any individual clause of its privacy policy. I didn't verify those on the official pages.&lt;/li&gt;
&lt;li&gt;That RunPod or any other service is unusable, or that an API is always cheaper or easier.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Sources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Repository: &lt;a href="https://github.com/moruku36/open-llm-multimodal-lab" rel="noopener noreferrer"&gt;moruku36/open-llm-multimodal-lab&lt;/a&gt; (&lt;a href="https://github.com/moruku36/open-llm-multimodal-lab/blob/main/README.md" rel="noopener noreferrer"&gt;README&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/moruku36/open-llm-multimodal-lab/blob/main/docs/runpod-phase1-verification-2026-10-09.md" rel="noopener noreferrer"&gt;Phase 1 verification record&lt;/a&gt; (Japanese only)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/moruku36/open-llm-multimodal-lab/blob/main/docs/runpod-phase2-verification-2026-10-15.md" rel="noopener noreferrer"&gt;Phase 2 verification record&lt;/a&gt; (&lt;a href="https://github.com/moruku36/open-llm-multimodal-lab/pull/44" rel="noopener noreferrer"&gt;PR #44&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/moruku36/open-llm-multimodal-lab/blob/main/docs/phase3-trial-2026-10-15.md" rel="noopener noreferrer"&gt;Phase 3 trial record&lt;/a&gt; (&lt;a href="https://github.com/moruku36/open-llm-multimodal-lab/pull/45" rel="noopener noreferrer"&gt;PR #45&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/moruku36/open-llm-multimodal-lab/blob/main/docs/runpod-retrospective-2026-10-15.md" rel="noopener noreferrer"&gt;Final retrospective&lt;/a&gt; (&lt;a href="https://github.com/moruku36/open-llm-multimodal-lab/pull/46" rel="noopener noreferrer"&gt;PR #46&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>selfhosting</category>
      <category>llm</category>
      <category>ai</category>
      <category>api</category>
    </item>
    <item>
      <title>How I use scheduled actions in Gemini to keep up with technology</title>
      <dc:creator>SeaOtter ( Kentaro Mori )</dc:creator>
      <pubDate>Wed, 14 Oct 2026 09:05:19 +0000</pubDate>
      <link>https://dev.to/moruku36/how-i-use-scheduled-actions-in-gemini-to-keep-up-with-technology-34o0</link>
      <guid>https://dev.to/moruku36/how-i-use-scheduled-actions-in-gemini-to-keep-up-with-technology-34o0</guid>
      <description>&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2sps0nmf86t8g3157nt0.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2sps0nmf86t8g3157nt0.png" alt=" " width="800" height="396"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When I read about AI, cloud services, and security, I use several kinds of sources. Papers explain new methods, release notes describe product changes, and engineering posts describe what people tried. I look for different things in each source. One combined list can make it hard to decide what to read more closely.&lt;/p&gt;

&lt;p&gt;I use eight information-gathering routines with scheduled actions in Gemini. For papers, I ask what is new and how it might help my development work. For cloud updates, I ask whether the change could affect my systems. I treat the schedule and the questions I want a summary to answer as separate choices. Here is how I set up those requests.&lt;/p&gt;

&lt;p&gt;These are my settings as of October 13, 2026. All times are Japan Standard Time. The schedules below describe the configured frequency, rather than a log confirming every run.&lt;/p&gt;

&lt;h2&gt;
  
  
  Find papers and practical engineering advice
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1 Select ten papers and take a closer look at one
&lt;/h3&gt;

&lt;p&gt;I schedule the paper request for 7–8 a.m. every day. I ask for ten papers, preprints, or technical reports from research institutions and company research teams. Preprints are papers shared before formal journal publication. For each item, I ask what is new and how the proposed method or system works.&lt;/p&gt;

&lt;p&gt;To help choose relevant papers, I provide context from my public GitHub work and my professional interests in AI, security, and cloud services. I then ask for a closer look at one especially relevant item, including ideas for using it in development. The aim is to help me choose which paper to read in full.&lt;/p&gt;

&lt;h3&gt;
  
  
  2 See what developers in overseas communities are discussing
&lt;/h3&gt;

&lt;p&gt;Every day at 7:30 a.m., I ask Gemini to check Hacker News, a site for technology discussions, and the Reddit communities r/programming, r/MachineLearning, and r/devops. The request focuses on new open-source software, technical debates, and opinions about different technologies. Open-source software makes its source code available for use and modification under its license.&lt;/p&gt;

&lt;p&gt;I ask for a short explanation of each topic, why it is getting attention, and what people like or criticize about it. I also ask for links to the original posts so I can read the discussions myself.&lt;/p&gt;

&lt;h3&gt;
  
  
  3 Collect lessons from real development work
&lt;/h3&gt;

&lt;p&gt;At 8 a.m. every day, I ask for ten practical articles or resources about AI, cloud services, and security. Sources include Japanese and international engineering blogs, knowledge-sharing sites, and conference presentations. I look for accounts of using a technology, fixing problems, and designing systems.&lt;/p&gt;

&lt;p&gt;Alongside the official documentation, I want to know what went wrong for people who used the technology and how they solved it. When selecting papers, I focus on new methods. For practical articles, I ask what to watch out for when using a technology.&lt;/p&gt;

&lt;h3&gt;
  
  
  4 Check how cloud updates could affect my systems
&lt;/h3&gt;

&lt;p&gt;I have a separate request to check official release information and blogs for AWS, Azure, and Google Cloud in the morning or periodically. It covers new features and previews, which let users try features before their full release. It also covers features that are no longer recommended and changes that could stop existing setups from working.&lt;/p&gt;

&lt;p&gt;I ask for both a summary of the update and its possible effect on my infrastructure: the servers and cloud services I use together. I want to find features worth trying and updates that may need a closer check, such as a possible configuration change.&lt;/p&gt;

&lt;h2&gt;
  
  
  Choose a schedule that fits the information
&lt;/h2&gt;

&lt;h3&gt;
  
  
  5 Follow updates on a specific topic
&lt;/h3&gt;

&lt;p&gt;I also have a request to follow a topic over time. One example is reporting about a possible OpenAI stock market listing, or IPO, along with partnerships and changes in how the company is run. I ask it to check financial media and official sources periodically and alert me to changes. The IPO is a topic I follow, not a confirmed event.&lt;/p&gt;

&lt;h3&gt;
  
  
  6 Read short news summaries in the morning and evening
&lt;/h3&gt;

&lt;p&gt;My general and technology news request is scheduled twice a day, in the morning and evening. I ask for short summaries of current affairs, economic news, and technology from major news outlets. This helps me follow broader news alongside my specialist interests.&lt;/p&gt;

&lt;h3&gt;
  
  
  7 Find technical videos with explanations and demonstrations
&lt;/h3&gt;

&lt;p&gt;I ask for technical video recommendations every day from YouTube and similar sources. Topics include testing AI models, ways of organizing development work, and security. These give me options when I want to learn by watching an explanation or demonstration.&lt;/p&gt;

&lt;h3&gt;
  
  
  8 Choose books on the first day of each month
&lt;/h3&gt;

&lt;p&gt;On the first day of each month, I ask for technical books, including new releases, that match my interests and recent technology trends. I use a different schedule for books that take time to study than for news I want to check each day.&lt;/p&gt;

&lt;h2&gt;
  
  
  Use the information in development work
&lt;/h2&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fgyml45oali3p4m2kd4tk.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fgyml45oali3p4m2kd4tk.png" alt="From a summary to what I read or try next" width="799" height="434"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Choose sources and a schedule → Ask for details that fit the purpose → Read the original sources → Check test conditions and my environment → Choose what to read or try next&lt;/p&gt;

&lt;p&gt;I ask for different details in each of the eight routines. For papers, I want a candidate for deeper reading and possible uses. For community discussions, I want to understand the interest and disagreement. For practical articles, I want things to watch out for during implementation. For cloud updates, I want the possible effect on my setup. I request these details to help me decide what to read or try next.&lt;/p&gt;

&lt;p&gt;For example, suppose I wanted to improve an app that searches documents and uses them to answer questions. A paper might suggest a new method. An engineering post might explain problems to watch out for when using it. A cloud update might introduce a useful feature. This is only an example of how the information could fit together. It does not describe a change I made or an improvement I measured.&lt;/p&gt;

&lt;p&gt;Before using an idea, I would still need to read the original paper or official documentation. I would check how it was tested, which versions it supports, and whether it fits my environment. A popular technology may be worth a look, but those details matter when deciding whether to use it.&lt;/p&gt;

&lt;h2&gt;
  
  
  An example request you can adapt
&lt;/h2&gt;

&lt;p&gt;The example below was written for this article using the routines described above. It is an example you can adapt, not the original prompt from my setup.&lt;/p&gt;

&lt;p&gt;“My interests are AI, cloud services, and security. Use the public GitHub context I share to select ten relevant papers, preprints, or technical reports from research institutions and company research teams. For each item, explain what is new and how the method or system works. Choose one especially relevant item and explain it in more detail. Suggest possible uses in development and list what I should check before trying it. Include links to the sources. Separate what you verified from what you inferred. Say if you could not read the full text of a source.”&lt;/p&gt;

&lt;p&gt;I added the instructions about source links and what the AI could verify as suggestions for readers writing their own requests. A detailed prompt does not guarantee a correct answer. Before sharing project information, check whether it is appropriate to share that information with the AI service.&lt;/p&gt;

&lt;h2&gt;
  
  
  Start with one topic you want to follow
&lt;/h2&gt;

&lt;p&gt;The eight routines serve different purposes. Some give a quick news overview, some track changes, and one takes a closer look at a paper. I adjust the schedule and the requested details to match what I want to learn.&lt;/p&gt;

&lt;p&gt;To try this approach, choose one topic you care about. Decide where to look, how often to check, and what decisions the information should help you make. I use the summaries as a starting point for choosing which sources to read more closely.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>learning</category>
      <category>productivity</category>
      <category>gemini</category>
    </item>
    <item>
      <title>Is AI-Assisted Work Cheaper? A Five-Day Cost Estimate</title>
      <dc:creator>SeaOtter ( Kentaro Mori )</dc:creator>
      <pubDate>Sat, 10 Oct 2026 13:15:48 +0000</pubDate>
      <link>https://dev.to/moruku36/is-ai-assisted-work-cheaper-a-five-day-cost-estimate-28m</link>
      <guid>https://dev.to/moruku36/is-ai-assisted-work-cheaper-a-five-day-cost-estimate-28m</guid>
      <description>&lt;p&gt;Prepared with AI assistance using my work records and a cost-estimate report. The cost comparisons are estimates.&lt;/p&gt;

&lt;p&gt;I went back through five days of work done with AI tools and tried to put a price on it, next to what the same work might have cost without generative AI. This post walks through how I did that and what the numbers do and don't say.&lt;/p&gt;

&lt;p&gt;A word on framing: everything below is an estimate. None of it is a measured saving. The part I think carries over to other projects is the method: describe exactly what changed, attach evidence, and count human review time before comparing costs. A simple task list is enough. You don't need to build a complicated AI system first.&lt;/p&gt;

&lt;h2&gt;
  
  
  What actually happened
&lt;/h2&gt;

&lt;p&gt;I reviewed work from October 5–9, 2026, in Japan Standard Time. The report groups it into 35 task-record units across software changes, research, documentation, media preparation, maintenance, and administration.&lt;/p&gt;

&lt;p&gt;Those 35 units differ a lot in size and value. Some are improvements to existing applications. Others are documents or small maintenance jobs. A count like this isn't a productivity score, and it definitely doesn't mean 35 new products were built.&lt;/p&gt;

&lt;p&gt;Three examples:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;An existing memory app&lt;/strong&gt; received improvements to display, storage, synchronization, backup, and search, plus documentation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A voice application&lt;/strong&gt; received recording, playback, and interface repairs, with Windows device checks recorded. Several related fixes were counted together.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A cloud experiment&lt;/strong&gt; produced one real answer from a small AI model through a web interface. The temporary server was deleted afterward. That completed the experiment's stated stage; a continuing service was outside its scope.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For each entry I needed one sentence describing where “done” ends. Without that, a small successful test can quietly turn into a claim about a whole system.&lt;/p&gt;

&lt;h2&gt;
  
  
  Evidence and limits go together
&lt;/h2&gt;

&lt;p&gt;Where public code changes exist, the report links them. Other entries rely on work records or my own completion confirmation. Those are different kinds of evidence, so they're labeled differently.&lt;/p&gt;

&lt;p&gt;A few limits worth spelling out:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Checking a code-change record does not rerun the software.&lt;/li&gt;
&lt;li&gt;A recorded Windows check does not show that every device works.&lt;/li&gt;
&lt;li&gt;One browser-based game was confirmed in Chrome, while testing on a real Safari device remained incomplete.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you want to try this on your own project, four fields per entry go a long way:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The specific change or deliverable.&lt;/li&gt;
&lt;li&gt;The evidence available, such as a code-change link or a test result.&lt;/li&gt;
&lt;li&gt;The environments or conditions checked.&lt;/li&gt;
&lt;li&gt;What remains unfinished or unverified.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Related retries belong under the same outcome. Otherwise a hard repair inflates the task count just because it took several attempts.&lt;/p&gt;

&lt;h2&gt;
  
  
  How much human work is that?
&lt;/h2&gt;

&lt;p&gt;Next question: how much work might experienced people need to reach the same recorded scope without generative AI?&lt;/p&gt;

&lt;p&gt;The assumptions still allow existing repositories, ordinary scripts, templates, tools, and domain knowledge. Rebuilding every application from scratch would describe a different job.&lt;/p&gt;

&lt;p&gt;The bottom-up estimates were about 180 hours (low), 310 (central), and 510 (high). The central calculation uses exactly 309 hours.&lt;/p&gt;

&lt;p&gt;At an assumed 160 working hours per month, 309 hours is 309 / 160 ≈ 1.93 person-months. That is a unit conversion of the estimate, not a staffing plan or a delivery date.&lt;/p&gt;

&lt;p&gt;These were retrospective judgments, not stopwatch measurements or observed hours saved. The range reflects different assumptions about reuse, investigation, and revision. It is not a statistical confidence interval.&lt;/p&gt;

&lt;p&gt;I also didn't treat all waiting as labor. A download or an automated test takes time without someone watching it the whole way. Dependencies matter too: a demo has to work before it can be filmed. Total estimated labor can't promise a completion date.&lt;/p&gt;

&lt;h2&gt;
  
  
  The cost assumptions, spelled out
&lt;/h2&gt;

&lt;p&gt;At a hypothetical JPY7,500 per hour, the central human-work scenario is:&lt;/p&gt;

&lt;p&gt;309 hours × JPY7,500 = JPY2,317,500, or about JPY2.32 million.&lt;/p&gt;

&lt;p&gt;That hourly rate is a planning assumption, not a verified market rate.&lt;/p&gt;

&lt;p&gt;The AI-side reference amount is JPY5,209.92, about JPY5,210. It combines five days of allocated subscription payments with one RunPod prepaid-credit purchase. The credit purchase is money added to an account; actual computing consumption during the period is unknown.&lt;/p&gt;

&lt;p&gt;The subscription figures come from the report's billing evidence and user-reported payments, not from current advertised prices. Some allocation details are still uncertain, including the ChatGPT billing cycle. The report also uses an assumed currency conversion where needed.&lt;/p&gt;

&lt;p&gt;The most important caveat: that JPY5,210 leaves out my instructions, approvals, and review time, along with other costs. Comparing it directly with a complete human-work estimate would hide a major part of the workflow.&lt;/p&gt;

&lt;p&gt;So the report adds a scenario. Suppose human management and review took 40 hours at JPY7,500 per hour. That is 40 / 160 = 0.25 person-months, and the combined amount becomes JPY305,209.92, about JPY305,210. That's roughly 87% below the central hypothetical human-work cost.&lt;/p&gt;

&lt;p&gt;![Cost scenarios comparing the central human-work estimate with allocated AI payments and an assumed 40 hours of human oversight.&lt;br&gt;
&lt;a href="![%20](https://dev-to-uploads.s3.us-east-2.amazonaws.com/uploads/articles/zucjm7bkl3pltvbpy704.png)"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Figure rendered programmatically with AI assistance. These are planning scenarios with different cost boundaries. The 87% difference is not measured return on investment, and equal output quality has not been independently verified.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The low human-work scenario is JPY892,500, using both lower hours and a lower assumed rate. That smaller baseline matters: rework, mistakes, and extra supervision can eat the apparent advantage, and their actual costs weren't measured here.&lt;/p&gt;

&lt;h2&gt;
  
  
  A workflow you can check
&lt;/h2&gt;

&lt;p&gt;If you want to try something similar, start with a bounded task: fix a reproducible problem, update a known document, or investigate a specific question. Define the acceptance check before you hand the work off.&lt;/p&gt;

&lt;p&gt;![A human-led workflow in which a person defines the task, AI carries out bounded work, and a person reviews evidence before accepting the result.]&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvk0rhepkz9hzcbpnyly1.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvk0rhepkz9hzcbpnyly1.png" alt=" " width="800" height="475"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Figure rendered programmatically with AI assistance. Recommended division of responsibility. This diagram is not a claim that every task during the reviewed week followed an identical process.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Keep a person responsible for production changes, confidential information, safety, and decisions that need specialist knowledge. If you can't evaluate the result yourself, bring in someone who can.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I take from this
&lt;/h2&gt;

&lt;p&gt;With the caveats above in place, these estimates favor human-led AI assistance for work with a clear scope and a result you can check: a person keeps the requirements, decisions, and final acceptance, and AI does bounded work in between. That is the setup I'd recommend trying first.&lt;/p&gt;

&lt;p&gt;The review also shows why careful records matter more than an impressive task count. For your own trial, record both the output and the human effort needed to make it usable. A small, well-documented comparison will tell you more about what to delegate next than a big number will. One week doesn't make a case for headcount reduction or unattended operation.&lt;/p&gt;

&lt;p&gt;Source: &lt;a href="https://github.com/moruku36/multi-ai-workflow/blob/7c492dcd51f7532d7e855be95aaa87e505abf7dd/docs/reports/2026-10-05-to-09-ai-team-work-and-human-effort.ja.md" rel="noopener noreferrer"&gt;Full report with task boundaries, evidence, and calculation assumptions, in Japanese&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>productivity</category>
      <category>tools</category>
    </item>
    <item>
      <title>Seven Days Managing an AI Development Team</title>
      <dc:creator>SeaOtter ( Kentaro Mori )</dc:creator>
      <pubDate>Wed, 07 Oct 2026 13:23:35 +0000</pubDate>
      <link>https://dev.to/moruku36/seven-days-managing-an-ai-development-team-2c19</link>
      <guid>https://dev.to/moruku36/seven-days-managing-an-ai-development-team-2c19</guid>
      <description>&lt;p&gt;On the first day, I planned nine tasks. Three got done.&lt;/p&gt;

&lt;p&gt;The other six ran into familiar problems: decisions waiting on me, prompts that I had to copy into local GUIs, and uncertainty about what was actually progressing. I had delegated the work but was still carrying much of the coordination.&lt;/p&gt;

&lt;p&gt;From October 1 to 7, 2026, I kept a daily log of running a small AI team for personal projects. I used ChatGPT dots as the coordinator, which I call “Docchee,” with other AI tools handling implementation, review, and research.&lt;/p&gt;

&lt;p&gt;By Day 7, I was asking the team to switch priorities for an urgent application-preparation task. Between those two points, I learned more about handoffs, approvals, and visibility than I expected.&lt;/p&gt;

&lt;p&gt;This is a field report from one person's workflow. It is not a model benchmark or evidence that the setup can safely handle a production incident.&lt;/p&gt;

&lt;h2&gt;
  
  
  The team I was trying to run
&lt;/h2&gt;

&lt;p&gt;I work in cloud engineering, but for this experiment I took the Product Owner role: define the goal, choose priorities, approve consequential actions, and test whether the result was useful.&lt;/p&gt;

&lt;p&gt;The working split looked like this:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Role&lt;/th&gt;
&lt;th&gt;Responsibility&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Me&lt;/td&gt;
&lt;td&gt;Goals, priorities, approvals, and acceptance testing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Docchee&lt;/td&gt;
&lt;td&gt;Coordinate tasks, choose an execution environment, and report status&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ChatGPT / Codex&lt;/td&gt;
&lt;td&gt;Design, review, and implementation when needed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Claude Code&lt;/td&gt;
&lt;td&gt;Implementation and fixes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gemini / Antigravity&lt;/td&gt;
&lt;td&gt;Share prototyping, research, and other suitable work&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Qwen&lt;/td&gt;
&lt;td&gt;A separate track of local and GPU-backed experiments&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;These were working roles, not a fully automated routing architecture. Assignments changed with the task, available usage allowance, and access to the right environment. I keep the broader workflow in &lt;a href="https://github.com/moruku36/multi-ai-workflow" rel="noopener noreferrer"&gt;multi-ai-workflow&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Days 1–2: Handoffs were my problem too
&lt;/h2&gt;

&lt;p&gt;My initial assumption was that handing out more tasks would get more work moving. Instead, it produced more places where someone needed my input.&lt;/p&gt;

&lt;p&gt;At the start, I was manually moving prompts between interfaces. CLI access was not ready. Some tasks needed a decision I had not made explicit; others needed a local action only I could perform at that point.&lt;/p&gt;

&lt;p&gt;The first useful adjustment was simple: make the end goal clearer, and have Docchee tell me what remained instead of making me repeatedly ask.&lt;/p&gt;

&lt;p&gt;By Day 2, a workable rhythm was emerging. Human-in-the-loop approvals remained difficult. I wanted routine work to move without interruption, while keeping meaningful control over publishing, permissions, and other consequential actions.&lt;/p&gt;

&lt;p&gt;That required more precise task boundaries. “Keep going” was not enough information for every next step.&lt;/p&gt;

&lt;h2&gt;
  
  
  Days 3–4: Local access improved, but approval boundaries remained
&lt;/h2&gt;

&lt;p&gt;On Day 3, I focused on integrating the team with my Windows environment and preparing CLI-based workflows. Reducing manual copy-paste was a practical improvement.&lt;/p&gt;

&lt;p&gt;Usage allowances also became part of task assignment. A difficult design or review could justify a stronger model, while other work could go to a different tool with more capacity available.&lt;/p&gt;

&lt;p&gt;I was excited enough in my daily post to describe this as the start of token-aware coordination. The precise state was more modest: we were using available displays and reports to make allocation decisions. Continuous usage collection and dynamic routing were still goals, not a completed control system.&lt;/p&gt;

&lt;p&gt;Day 4 exposed another boundary. A task routed through dots to ChatGPT or Codex could still stop for a separate approval. Using tools from the same provider did not make the entire workflow share one permission state.&lt;/p&gt;

&lt;p&gt;The useful question became: what exact operation is blocked, in which environment, and what would let it proceed? A generic “waiting for approval” label left too much work for me to reconstruct.&lt;/p&gt;

&lt;h2&gt;
  
  
  Day 5: Voice instructions and a 30-minute cadence worked well
&lt;/h2&gt;

&lt;p&gt;On Day 5, I ran much of the workflow through voice input. For me, speaking an instruction or review request was often faster than composing it at a keyboard.&lt;/p&gt;

&lt;p&gt;I also introduced a status update every 30 minutes across the parallel tasks:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;I set the goal and priority.&lt;/li&gt;
&lt;li&gt;Docchee organized the work and assigned it.&lt;/li&gt;
&lt;li&gt;I reviewed progress and blockers at the next check-in.&lt;/li&gt;
&lt;li&gt;I returned decisions, corrections, or new requests.&lt;/li&gt;
&lt;li&gt;The work continued.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Numbered items made it easy to say “prioritize item 2” or “resume item 3.” There was a catch: once completed items disappeared and the list was renumbered, a number was no longer a stable task identifier. It needed to be checked against the task name and recent context.&lt;/p&gt;

&lt;p&gt;I asked for completed items to be reported once and then removed. That kept the next report focused on open work and decisions.&lt;/p&gt;

&lt;p&gt;Thirty minutes is not a universal recommendation. It happened to fit my workflow. It reduced the effort of checking in without requiring me to watch each tool continuously.&lt;/p&gt;

&lt;p&gt;Delegating work across Claude Code, Antigravity, and ChatGPT also became more practical. The amount of coordination I could hand off still depended on access and approval in each environment.&lt;/p&gt;

&lt;h2&gt;
  
  
  Day 6: More kinds of work meant more invisible state
&lt;/h2&gt;

&lt;p&gt;The scope expanded beyond coding and documentation: website onboarding, profile updates, and short video assets. Having an agent inspect a page and work through form fields removed a lot of repetitive effort.&lt;/p&gt;

&lt;p&gt;The difficult part was understanding stalled background work.&lt;/p&gt;

&lt;p&gt;I could follow a task in a visible chat or browser window. CLI processes and background activity were harder to inspect. If two tasks both said they were progressing but neither returned a result, I did not know which was running, which was waiting, or whether they were interfering with each other.&lt;/p&gt;

&lt;p&gt;My hypothesis was that some tasks were competing for shared browser sessions or execution resources. I did not establish that as the root cause of every stall. What I did observe was inadequate visibility and a need for manual intervention.&lt;/p&gt;

&lt;p&gt;For the next iteration, I want each active task to expose:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Its current owner and execution environment&lt;/li&gt;
&lt;li&gt;Its last confirmed progress and timestamp&lt;/li&gt;
&lt;li&gt;Whether it is running or waiting&lt;/li&gt;
&lt;li&gt;The specific input, permission, or resource it needs next&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is a design goal rather than a dashboard I can claim is already complete. Shared desktop control needs particular care: parallel research can be useful, while simultaneous edits in the same interface can conflict.&lt;/p&gt;

&lt;h2&gt;
  
  
  Day 7: An urgent request changed the queue
&lt;/h2&gt;

&lt;p&gt;The final day brought an interrupt: I wanted to prioritize preparation for Anthropic's CVP application. That involved reviewing my existing work, developing security-validation evidence, and contributing to OSS.&lt;/p&gt;

&lt;p&gt;I explicitly assigned Astra to the urgent work. Progress felt fast. It would be misleading, however, to attribute the improvement solely to the model. Priority, task definition, and the surrounding workflow had changed too; I did not run a controlled comparison.&lt;/p&gt;

&lt;p&gt;One concrete output was a validation report on an existing Mattermost pull request. I posted a &lt;a href="https://github.com/mattermost/mattermost/pull/37886#issuecomment-6034742571" rel="noopener noreferrer"&gt;comment with the comparison results&lt;/a&gt;. This was a testing contribution, not an upstream merge of my code.&lt;/p&gt;

&lt;p&gt;In parallel, we prepared a read-only connection between Mattermost and Docchee. A short tunnel startup-and-shutdown trial had been performed, but reading an actual post through that path had not been verified at the time of writing. The integration was still unfinished.&lt;/p&gt;

&lt;p&gt;The CVP application was also still in preparation. Useful portfolio work does not automatically establish the eligibility evidence an application asks for. I want the application to describe what I have actually done, without turning planned work or ordinary OSS activity into unsupported credentials.&lt;/p&gt;

&lt;p&gt;What Day 7 demonstrated for me was the ability to redirect a development workflow under time pressure. Production incident response remains a separate capability to test.&lt;/p&gt;

&lt;h2&gt;
  
  
  The operating habits I want to keep
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Give the task an observable finish line
&lt;/h3&gt;

&lt;p&gt;I find this handoff format useful:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Goal: What should become possible?
Scope: What can change?
Out of scope: What should be left alone?
Environment: Where will the work run and be tested?
Acceptance: What observation will establish success?
Report: Deliverable, evidence, unverified paths, decisions needed
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It reduces ambiguity before the team starts. It also makes it easier to assess a result without rereading an entire conversation.&lt;/p&gt;

&lt;h3&gt;
  
  
  Separate implementation from review
&lt;/h3&gt;

&lt;p&gt;I use a separate reviewer for changes, including failure paths such as timeouts, cancellation, restart, and cleanup. Findings should come back with evidence or reproduction steps so the implementation agent can act on them.&lt;/p&gt;

&lt;p&gt;A second model's agreement is not sufficient evidence by itself. The useful part is the additional inspection and testing it performs.&lt;/p&gt;

&lt;h3&gt;
  
  
  Report the actual stage of completion
&lt;/h3&gt;

&lt;p&gt;Implemented, passed a mock test, worked in the target environment, and accepted by the user are different milestones.&lt;/p&gt;

&lt;p&gt;The same applies to browser work: uploading a file, saving a draft, and publishing a page are separate outcomes. I need the status report to tell me which one happened.&lt;/p&gt;

&lt;p&gt;This became especially important as the team handled more kinds of tasks. A broad “done” could hide the exact step I still needed to verify.&lt;/p&gt;

&lt;h3&gt;
  
  
  End the day with a short voice debrief
&lt;/h3&gt;

&lt;p&gt;The most useful routine was a ten-minute conversation at the end of the day.&lt;/p&gt;

&lt;p&gt;I talked through where I had waited, what had become easier, and what I wanted to try next. The visibility problem on Day 6 and the incident-response idea on Day 7 both became clearer through those conversations.&lt;/p&gt;

&lt;p&gt;Short instructions helped me move work during the day. A longer conversation helped me reflect on the workflow itself. That combination was a practical form of human-in-the-loop operation for me.&lt;/p&gt;

&lt;h2&gt;
  
  
  Next: Test emergency workflows in a lab
&lt;/h2&gt;

&lt;p&gt;My next question comes from my cloud-engineering background: how would this team respond to a server failure, a security incident, or a disaster-recovery scenario?&lt;/p&gt;

&lt;p&gt;I want to survey existing SRE-agent approaches and design experiments across AWS, Azure, and Google Cloud. Those experiments have not started.&lt;/p&gt;

&lt;p&gt;The plan is to use controlled environments with defined permissions and recovery conditions. I want to measure time to initial assessment and recovery, but also incorrect actions, unnecessary changes, approval delays, and missing evidence.&lt;/p&gt;

&lt;p&gt;Parallel investigation could help. Changes to the same resource need coordination, and recovery needs a way back if the chosen action makes things worse. These are things to verify before making claims about autonomous incident handling.&lt;/p&gt;

&lt;h2&gt;
  
  
  What changed after one week
&lt;/h2&gt;

&lt;p&gt;I started by counting tasks. By the end of the week, I was paying more attention to the handoffs between them.&lt;/p&gt;

&lt;p&gt;As individual tasks moved faster, the surrounding constraints became easier to see: approvals, shared resources, usage allowances, and acceptance criteria. My own decisions remained part of that system.&lt;/p&gt;

&lt;p&gt;The 30-minute check-ins and the end-of-day voice debrief are worth keeping. Next, I want better visibility into stalled work and stronger evidence about how the team behaves when something fails.&lt;/p&gt;

&lt;p&gt;Seven days is a short experiment. It was enough to give me a much clearer idea of what to test in week two.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;This article reflects my personal projects as of October 7, 2026. I used AI assistance to organize and edit the writing.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>productivity</category>
      <category>automation</category>
      <category>agents</category>
    </item>
    <item>
      <title>Can AI Replace Cloud Engineers? I Put It to the Test</title>
      <dc:creator>SeaOtter ( Kentaro Mori )</dc:creator>
      <pubDate>Tue, 06 Oct 2026 10:16:42 +0000</pubDate>
      <link>https://dev.to/moruku36/can-ai-replace-cloud-engineers-i-put-it-to-the-test-5egl</link>
      <guid>https://dev.to/moruku36/can-ai-replace-cloud-engineers-i-put-it-to-the-test-5egl</guid>
      <description>&lt;h2&gt;
  
  
  The result first
&lt;/h2&gt;

&lt;p&gt;I tested how much of my cloud engineering work I could delegate to AI in two experiments.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Level 2:&lt;/strong&gt; Implement and operate a small environment after a human defines the architecture and safety boundaries.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Level 3:&lt;/strong&gt; Turn customer requirements into a cloud design that satisfies explicit acceptance criteria.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The live Level 2 experiments completed deployment, selected failure tests, recovery, and cleanup across AWS, Azure, and Google Cloud. The latest Level 3 trial, D5, scored &lt;strong&gt;77/100 in an independent AI review: FAIL against the acceptance criteria, HOLD for adoption&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The distinction matters throughout this article. Level 2 has live execution records. Level 3 evaluates design documents. Neither experiment measures the percentage of a profession that can be replaced.&lt;/p&gt;

&lt;p&gt;“Level” is my own classification, not an industry standard or an official mapping to cloud certifications. I did not run the introductory Level 1 stage.&lt;/p&gt;

&lt;h2&gt;
  
  
  Level 2: Delegate a defined infrastructure lifecycle
&lt;/h2&gt;

&lt;h3&gt;
  
  
  What the human specified
&lt;/h3&gt;

&lt;p&gt;The common target was a Layer 7 load balancer serving HTTP through two private VMs. The VMs had no public IP addresses and no direct SSH access from the internet.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Component&lt;/th&gt;
&lt;th&gt;AWS&lt;/th&gt;
&lt;th&gt;Azure&lt;/th&gt;
&lt;th&gt;Google Cloud&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Public entry point&lt;/td&gt;
&lt;td&gt;Regional ALB&lt;/td&gt;
&lt;td&gt;Application Gateway&lt;/td&gt;
&lt;td&gt;Global external Application Load Balancer&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Backend&lt;/td&gt;
&lt;td&gt;Two EC2 instances in separate AZs&lt;/td&gt;
&lt;td&gt;Two Linux VMs in separate zones&lt;/td&gt;
&lt;td&gt;Two VMs in a regional managed instance group&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Outbound path&lt;/td&gt;
&lt;td&gt;S3 Gateway Endpoint&lt;/td&gt;
&lt;td&gt;NAT Gateway&lt;/td&gt;
&lt;td&gt;Cloud Router and Cloud NAT&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Remote state&lt;/td&gt;
&lt;td&gt;S3&lt;/td&gt;
&lt;td&gt;Blob Storage&lt;/td&gt;
&lt;td&gt;Cloud Storage&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;These were implementations of common requirements, not identical architectures. Google Cloud used a managed instance group, while AWS and Azure used individual VMs. A global load balancer did not make the backend multi-region.&lt;/p&gt;

&lt;p&gt;The human retained responsibility for requirements, allowed changes, identity and exposure boundaries, and approvals. AI handled Terraform, GitHub Actions, short-lived federated authentication, remote state, monitoring, selected failure tests, recovery, and cleanup.&lt;/p&gt;

&lt;h3&gt;
  
  
  What counted as completion
&lt;/h3&gt;

&lt;p&gt;I looked beyond a successful &lt;code&gt;terraform apply&lt;/code&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;HTTP 200 through the load balancer and healthy backends&lt;/li&gt;
&lt;li&gt;Successful short-lived CI authentication and remote-state initialization&lt;/li&gt;
&lt;li&gt;No changes after migration, repair, and recovery&lt;/li&gt;
&lt;li&gt;Observed alert-state changes for selected failures&lt;/li&gt;
&lt;li&gt;A delete-only plan, empty state, and checks for remaining managed resources&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The execution records report completion across all three clouds. Cleanup removed &lt;strong&gt;139 Terraform-managed items&lt;/strong&gt;: AWS 48, Azure 53, and Google Cloud 38. These totals include the application infrastructure and bootstrap resources for state and authentication.&lt;/p&gt;

&lt;p&gt;That is not a count of VMs or individually billable resources. “Zero remaining” refers to the managed active resources checked in this experiment. It does not mean an empty account, physical erasure of every retained copy, or a guarantee of no later charges. See the &lt;a href="https://github.com/moruku36/cloud-validation-level2-multicloud/blob/c5d25b637c2a71ffb84b6a7dab6c5f0f994062a0/docs/final-report.md" rel="noopener noreferrer"&gt;Level 2 final report&lt;/a&gt; for the evaluation method and counts.&lt;/p&gt;

&lt;h3&gt;
  
  
  Three failures made the boundaries concrete
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;AWS: the instance was private, but its startup dependencies were unreachable.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Insufficient outbound connectivity prevented Nginx installation, and the ALB returned 502. AI diagnosed the problem and added narrowly scoped HTTPS access to the S3 prefix list. The lesson was to review startup dependencies alongside inbound isolation. This S3-based path depended on the selected OS package source; it was not general internet access.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Azure: a successful apply removed tags from 12 resources.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Local and CI inputs differed. The CI apply completed successfully while removing additional tags. The inputs were aligned, and a tag-only repair followed human approval. The exit status alone did not establish that the change matched the intended result.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Google Cloud: missing backend configuration made 18 existing resources look new.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The backend declaration was not tracked in Git. CI could not use the existing remote state and planned 18 additions. The process stopped before apply and repaired the declaration. Unexpected creation, deletion, or replacement needs to be a stop condition, not just another line in the output.&lt;/p&gt;

&lt;p&gt;These incidents and their recovery are documented in the &lt;a href="https://github.com/moruku36/cloud-validation-level2-multicloud/blob/c5d25b637c2a71ffb84b6a7dab6c5f0f994062a0/docs/final-report.md" rel="noopener noreferrer"&gt;failure analysis&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  What Level 2 did not establish
&lt;/h3&gt;

&lt;p&gt;Monitoring checks covered selected signals and alert states. External notification receivers were not configured, so delivery to an operator was not demonstrated. The failure scenarios also differed between providers.&lt;/p&gt;

&lt;p&gt;The experiments ran sequentially: AWS, then Azure, then Google Cloud, carrying lessons forward. Human-intervention counts used different units. That rules out a clean provider ranking or a defensible intervention-reduction percentage.&lt;/p&gt;

&lt;p&gt;There was also no standardized human-only baseline for time, cost, or quality. The final report identifies code and CI controls that need checking before reuse; successful historical execution is not proof that the current checkout reproduces unchanged.&lt;/p&gt;

&lt;p&gt;The supported conclusion is narrower: an experienced engineer could delegate a substantial implementation and operations lifecycle in small, disposable environments while retaining design, review, and approval. Production readiness, long-term SLOs, and unattended operation remain outside that result.&lt;/p&gt;

&lt;h2&gt;
  
  
  Level 3: Can AI produce an acceptable design from requirements?
&lt;/h2&gt;

&lt;p&gt;The second experiment started with a member-facing application: registration, login, profile changes, list/detail views, favorites, and administrative updates.&lt;/p&gt;

&lt;p&gt;Its main constraints were:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Initially 10,000 members and one million monthly page views&lt;/li&gt;
&lt;li&gt;Dynamic traffic of 10 requests/second normally and 100 requests/second for a 15-minute peak, with a 9:1 read/write ratio; static requests counted separately; 500 concurrent users&lt;/li&gt;
&lt;li&gt;Primary API p95 at or below 500 ms and server-side errors below 1%&lt;/li&gt;
&lt;li&gt;99.9% monthly availability, including planned downtime and underlying platform failures&lt;/li&gt;
&lt;li&gt;RTO of 30 minutes from service-impact onset, including detection and five stable minutes after recovery; RPO of five minutes&lt;/li&gt;
&lt;li&gt;Production data and backups stored in Japan; departing members' data removed from active systems within 30 days, backups retained for no more than 35 days, and deletion reapplied after restoration&lt;/li&gt;
&lt;li&gt;Five developers and one infrastructure engineer, supporting weekday daytime operations with no guaranteed immediate response at night&lt;/li&gt;
&lt;li&gt;JPY 100,000/month including tax for production and minimal development/test environments, including mandatory networking, monitoring, logs, and backups; labor and other exclusions listed separately&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The RTO/RPO targets covered process, runtime, database, and single-AZ failures. Region-wide failure was excluded. These were &lt;strong&gt;design requirements&lt;/strong&gt;, not observed service metrics. The &lt;a href="https://github.com/moruku36/cloud-validation-level3-architect/blob/e1ad7ab1baa2dec111259dd37a8eef405d418746/docs/sources/business-answers-2026-09-08.md" rel="noopener noreferrer"&gt;customer answers&lt;/a&gt; and &lt;a href="https://github.com/moruku36/cloud-validation-level3-architect/blob/e1ad7ab1baa2dec111259dd37a8eef405d418746/docs/requirements.md" rel="noopener noreferrer"&gt;requirements document&lt;/a&gt; preserve the input.&lt;/p&gt;

&lt;p&gt;Budget compliance could not depend on free tiers, temporary credits, or long-term commitment discounts.&lt;/p&gt;

&lt;p&gt;The tension between a 30-minute recovery target and weekday daytime staffing is a useful example: selecting managed services does not by itself establish who can act, which actions are authorized, or whether unattended recovery works.&lt;/p&gt;

&lt;h3&gt;
  
  
  Acceptance required more than a total score
&lt;/h3&gt;

&lt;p&gt;The September work was self-assessed: A moved from 61 to 65, and B scored 66. October introduced a reviewer separate from the designer. D4 and D5 used anonymously reviewed, frozen design-and-evidence packages.&lt;/p&gt;

&lt;p&gt;A passing design had to meet every condition:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Weighted total of at least 80/100&lt;/li&gt;
&lt;li&gt;Every one of 11 categories rated at least 3/5&lt;/li&gt;
&lt;li&gt;Six mandatory categories rated at least 4/5&lt;/li&gt;
&lt;li&gt;No unresolved P0 items&lt;/li&gt;
&lt;li&gt;All six adoption gates marked PASS&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The mandatory categories were requirements, architecture, security/IAM, availability, cost, and backup/disaster recovery. No human scoring or adoption approval was obtained. These were independent &lt;strong&gt;AI document reviews&lt;/strong&gt;, not production acceptance tests.&lt;/p&gt;

&lt;h3&gt;
  
  
  The latest result was 77, not the highest result of 78
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Trial&lt;/th&gt;
&lt;th&gt;Requested designer configuration&lt;/th&gt;
&lt;th&gt;Independent score&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;D1&lt;/td&gt;
&lt;td&gt;GPT-6 Luna / Low&lt;/td&gt;
&lt;td&gt;53&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;D2&lt;/td&gt;
&lt;td&gt;GPT-6 Luna / Medium&lt;/td&gt;
&lt;td&gt;72&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;D3&lt;/td&gt;
&lt;td&gt;GPT-6 Luna / High&lt;/td&gt;
&lt;td&gt;69&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;D4&lt;/td&gt;
&lt;td&gt;GPT-6.1 Sol / Medium&lt;/td&gt;
&lt;td&gt;78&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;D5&lt;/td&gt;
&lt;td&gt;GPT-6.1 Sol / High&lt;/td&gt;
&lt;td&gt;77&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;These are &lt;strong&gt;requested settings&lt;/strong&gt;. Actual runtime models and applied reasoning settings are UNKNOWN, including for the reviewers.&lt;/p&gt;

&lt;p&gt;The series also carries earlier findings forward. D5 revised D4, added controls and evidence, and used a fresh reviewer. The scores cannot isolate a model or reasoning-effort effect. September self-scores are a different evaluation method and are not part of this series.&lt;/p&gt;

&lt;p&gt;The latest authoritative trial is D5, dated October 2, 2026. It failed the acceptance criteria and remained on hold for adoption. The &lt;a href="https://github.com/moruku36/cloud-validation-level3-architect/blob/e1ad7ab1baa2dec111259dd37a8eef405d418746/docs/research/METHODS-RESULTS.en.md" rel="noopener noreferrer"&gt;methods and results&lt;/a&gt; and &lt;a href="https://github.com/moruku36/cloud-validation-level3-architect/blob/e1ad7ab1baa2dec111259dd37a8eef405d418746/docs/reports/2026-10-02-d5/FINAL-REPORT.en.md" rel="noopener noreferrer"&gt;D5 report&lt;/a&gt; explain the chronology and comparison limits.&lt;/p&gt;

&lt;p&gt;Requirements changed separately on October 2 remain unscored and were not D5 input. The score of 77 does not apply to those changed requirements.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why adoption stayed on hold
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Cost was 3/5, below its mandatory minimum of 4.&lt;/strong&gt; The design did not establish an all-inclusive budget fit with headroom, adequately supported effort for custom controls and rehearsals, or sufficiently concrete cheaper alternatives. Keeping unknown prices explicit was credited; unknowns did not become zero or evidence of affordability.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Deletion gate G3 remained HOLD.&lt;/strong&gt; Deletion-trigger events, retention of linking information, independent custody of evidence, and responsibility for external services or recipient copies were not approved.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Operations gate G4 also remained HOLD.&lt;/strong&gt; Named primary and backup owners, approved effort, absence coverage, and authority for unattended recovery were unresolved.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Added controls brought an evidence burden.&lt;/strong&gt; D5 added a SQL-backed AdmissionCoordinator to principal request paths. Evidence for operation counts, contention, latency, and recovery ordering was insufficient. Complexity fell from 4 to 3, accounting for the one-point total decrease from D4. Complexity 3 meets the general category floor; it is distinct from Cost failing a mandatory minimum.&lt;/p&gt;

&lt;p&gt;Unresolved P0 items concerned owner decisions, source access, and prerequisites for live validation, rather than identified P0 desk-design defects. The &lt;a href="https://github.com/moruku36/cloud-validation-level3-architect/blob/e1ad7ab1baa2dec111259dd37a8eef405d418746/docs/reports/2026-10-02-d5/FINAL-REPORT.en.md" rel="noopener noreferrer"&gt;D5 report&lt;/a&gt; and &lt;a href="https://github.com/moruku36/cloud-validation-level3-architect/blob/e1ad7ab1baa2dec111259dd37a8eef405d418746/docs/reports/2026-10-02-d5/evidence/independent-review-D5/gates.csv" rel="noopener noreferrer"&gt;gate record&lt;/a&gt; keep these distinctions explicit.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I would carry into real work
&lt;/h2&gt;

&lt;p&gt;Level 2 demonstrated more than initial code generation. AI investigated provider constraints, authentication mismatches, partial applies, and state inconsistencies, then made scoped repairs and completed cleanup.&lt;/p&gt;

&lt;p&gt;Level 3 showed increasingly specific design documents, but no accepted design. Missing prices, owner decisions, and empirical evidence remained missing. A score near 80 does not establish that acceptance is close when mandatory conditions remain unresolved.&lt;/p&gt;

&lt;p&gt;My practical takeaway is to specify the verification and decision process alongside the delegated task:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Define completion beyond command success: service behavior, state consistency, recovery, and cleanup&lt;/li&gt;
&lt;li&gt;Stop unexpected changes before apply&lt;/li&gt;
&lt;li&gt;Separate proposed designs, execution records, measured behavior, and approved decisions&lt;/li&gt;
&lt;li&gt;Name the people and permissions behind recovery, operation, and deletion&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A useful next experiment would hold inputs, evidence, and evaluation conditions constant while verifying actual model settings. Live performance, recovery, and cost validation would be a separate step. Those are research proposals, not work already completed.&lt;/p&gt;

&lt;p&gt;For now, the evidence supports broad delegation of predefined implementation under human control. It does not establish replacement of cloud engineering as a whole, or that a stronger model alone would satisfy the remaining adoption conditions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sources and AI disclosure
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://speakerdeck.com/moruku36/how-far-can-al-replace-cloud-engineers" rel="noopener noreferrer"&gt;English slide deck&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://speakerdeck.com/moruku36/ai-ha-o-doko-made-daitai-dekiru-ka" rel="noopener noreferrer"&gt;Japanese slide deck&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/moruku36/cloud-validation-level2-multicloud" rel="noopener noreferrer"&gt;Level 2 repository&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/moruku36/cloud-validation-level3-architect" rel="noopener noreferrer"&gt;Level 3 repository&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Source review date: October 6, 2026. References are pinned to Level 2 commit c5d25b6 and Level 3 commit e1ad7ab. The existing Japanese and English slides were also cross-checked. Preparing this article did not rerun cloud operations or produce a new assessment.&lt;/p&gt;

&lt;p&gt;AI assisted the structure, drafting, and English wording of this article. The experiment conditions, results, and limitations are based on the linked records.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>cloud</category>
      <category>devops</category>
      <category>infrastructure</category>
    </item>
  </channel>
</rss>
