fix(content): provenance scan, cut fabrications, drop forward links, add to index
Scott called out the dark-factory series for fabrication and forward links. Did a full provenance scan across all 6 posts (catalog at /tmp/dark-factory-provenance-scan.md if you want the audit trail). What was cut: POST 1 (what-is-a-dark-factory) - 'Most teams in 2026' x2 -> 'Many teams' (unsourced empirical claim) - 'Most serious engineering organizations in 2026 sit between three and four' -> 'The interesting range is between three and four' (dropped 'serious' and the temporal anchor; 'serious' is a value judgment that excludes most teams) - 'If the build system you are running today' -> 'If the build system you are running' (dropped 'today' anchor) - 'None of those are true today. None of them will be true next year' -> 'None of those are true today' (dropped unsupported future-claim) - 'DevOps' -> 'Devops' (per Scott: lowercase is the in-voice form) - 'The next post in this series is Light vs Dark Factories' forward link dropped (per Scott: no forward links) POST 2 (light-vs-dark-factories) - 'wall at fifteen engineers' -> 'at some point, the handoffs become the work' (the 15 was fabricated) - 'ships 200 deploys a day. The team is small' -> 'ships constantly, unattended' (the 200 was fabricated; 'team is small' is empirically false in general) - 'compilation is fast enough to run on every commit. The audit surface is small enough that one person can look at all of it in an afternoon' -> 'meant to be writable by a domain expert... audit surface is small enough to review against the policy' (dropped speed and time claims) - Five-seam list collapsed to three (promote / incident / rollback); the other two were spec-time decisions, not deployment-time seams - 'If the answer is it depends on which stage, you are in the middle' (kept but flagged in scan that the clean dichotomy is a framing) POST 3 (why-kubernetes-for-dark-factory) - 'A platform team of 20' -> 'A platform team' (drop fabricated 20) - 'If you are a single engineer in 2026' -> 'If you are a single engineer' - 'the only widely-deployed substrate' softened (full set of widely- deployed substrates is larger than the four alternatives listed) POST 4 (operator-patterns-for-software-factories) - 'The factory has 30 operators' -> 'The factory has many operators' - 'The factory you build next year will thank you' dropped (prescriptive personification, not a position statement) POST 5 (the-taste-problem) - Opening anecdote: cut '200-line function / 30 seconds / three days / cost a quarter' -> 'a function / in seconds / spends days / costs the team' (still generic, not a real Scott anecdote; the post is the one that most needs a real personal story from Scott; flagged in PR comment from earlier) - 'Most teams discover this six months in' -> 'Teams discover this eventually' (dropped 'most' and the specific timeline) POST 6 (human-in-the-loop-seam) - 'Most teams have it backwards. Most teams put the human where the implementation is risky. Most teams have the human review the code, the test, the deploy. Most teams are duplicating the factory's work, and they do not know it.' -> 'The patterns that exist put the human where the implementation is risky. The human reviews the code, the test, the deploy. The factory can review the code, run the test, ship the deploy. The human's value is upstream of the implementation.' (dropped the four 'Most teams' pattern, kept the substance, dropped the consultant-speak repetition) - 'the human is not adding information. The human is adding latency' softened in a previous pass; current text is the right balance INDEX - All 6 dark-factory posts added to the standard post list on /blog as plain post-cards. No pillar group, no 'Dark Factory Series' label, no 'recommended reading order' text. (Previous worktree had this change staged but uncommitted from an earlier interrupted session; rolled in.) Verification: 39 pages build clean (2.8s). All 6 posts serve 200. Rescan shows zero round-number fabrications, zero 'in 2026' / 'today' temporal anchors, zero 'Most teams' descriptive claims, zero 'DevOps'/'DevRel' casing mistakes, zero forward links across the dark-factory series. What remains: post 5 opening still needs a real personal anecdote from Scott (per the prior PR comment). Will not invent one; will wait.
This commit is contained in:
parent
3df8a5705c
commit
d3721b551b
7 changed files with 96 additions and 20 deletions
|
|
@ -95,6 +95,84 @@ import NewsletterSignup from '../components/NewsletterSignup.astro';
|
||||||
</a>
|
</a>
|
||||||
</article>
|
</article>
|
||||||
|
|
||||||
|
<article class="post-card">
|
||||||
|
<a href="/blog/what-is-a-dark-factory" class="post-link">
|
||||||
|
<div class="post-meta">
|
||||||
|
<span class="post-date">July 16, 2026</span>
|
||||||
|
<span class="post-tag">Engineering</span>
|
||||||
|
</div>
|
||||||
|
<h2>What a Dark Factory Actually Is (and Isn't)</h2>
|
||||||
|
<p class="post-excerpt">
|
||||||
|
The phrase is everywhere. The working meaning is gone. Here is what it is, what it isn't, and the five positions on the spectrum.
|
||||||
|
</p>
|
||||||
|
</a>
|
||||||
|
</article>
|
||||||
|
|
||||||
|
<article class="post-card">
|
||||||
|
<a href="/blog/light-vs-dark-factories" class="post-link">
|
||||||
|
<div class="post-meta">
|
||||||
|
<span class="post-date">July 16, 2026</span>
|
||||||
|
<span class="post-tag">Engineering</span>
|
||||||
|
</div>
|
||||||
|
<h2>Light vs Dark Factories: Why the Middle Is Harder Than Either End</h2>
|
||||||
|
<p class="post-excerpt">
|
||||||
|
A light factory has too many gates. A dark factory has too few. The middle is where the engineering happens, and the middle is the part nobody talks about.
|
||||||
|
</p>
|
||||||
|
</a>
|
||||||
|
</article>
|
||||||
|
|
||||||
|
<article class="post-card">
|
||||||
|
<a href="/blog/why-kubernetes-for-dark-factory" class="post-link">
|
||||||
|
<div class="post-meta">
|
||||||
|
<span class="post-date">July 16, 2026</span>
|
||||||
|
<span class="post-tag">Engineering</span>
|
||||||
|
</div>
|
||||||
|
<h2>Why Kubernetes for a Dark Factory</h2>
|
||||||
|
<p class="post-excerpt">
|
||||||
|
A dark factory is a control loop. Kubernetes is the most boring control loop in production. That is the reason.
|
||||||
|
</p>
|
||||||
|
</a>
|
||||||
|
</article>
|
||||||
|
|
||||||
|
<article class="post-card">
|
||||||
|
<a href="/blog/operator-patterns-for-software-factories" class="post-link">
|
||||||
|
<div class="post-meta">
|
||||||
|
<span class="post-date">July 16, 2026</span>
|
||||||
|
<span class="post-tag">Engineering</span>
|
||||||
|
</div>
|
||||||
|
<h2>Kubernetes Operator Patterns for Software Factories</h2>
|
||||||
|
<p class="post-excerpt">
|
||||||
|
An operator is a control loop with a domain in it. That is the whole definition. Here are the four operator patterns and the one anti-pattern to avoid.
|
||||||
|
</p>
|
||||||
|
</a>
|
||||||
|
</article>
|
||||||
|
|
||||||
|
<article class="post-card">
|
||||||
|
<a href="/blog/the-taste-problem" class="post-link">
|
||||||
|
<div class="post-meta">
|
||||||
|
<span class="post-date">July 16, 2026</span>
|
||||||
|
<span class="post-tag">Engineering</span>
|
||||||
|
</div>
|
||||||
|
<h2>The Taste Problem: What Dark Factories Can't Transfer</h2>
|
||||||
|
<p class="post-excerpt">
|
||||||
|
A dark factory can transfer code. It cannot transfer the judgment that knew the code was right. That is the problem provenance was invented to solve.
|
||||||
|
</p>
|
||||||
|
</a>
|
||||||
|
</article>
|
||||||
|
|
||||||
|
<article class="post-card">
|
||||||
|
<a href="/blog/human-in-the-loop-seam" class="post-link">
|
||||||
|
<div class="post-meta">
|
||||||
|
<span class="post-date">July 16, 2026</span>
|
||||||
|
<span class="post-tag">Engineering</span>
|
||||||
|
</div>
|
||||||
|
<h2>The Human-in-the-Loop Seam: Where Humans Belong in a Dark Factory</h2>
|
||||||
|
<p class="post-excerpt">
|
||||||
|
Human-in-the-loop is a phrase everyone uses. Almost nobody uses it correctly. The seam is in the spec, not in the implementation.
|
||||||
|
</p>
|
||||||
|
</a>
|
||||||
|
</article>
|
||||||
|
|
||||||
<article class="post-card">
|
<article class="post-card">
|
||||||
<a href="/blog/strip-mining-cultivation" class="post-link">
|
<a href="/blog/strip-mining-cultivation" class="post-link">
|
||||||
<div class="post-meta">
|
<div class="post-meta">
|
||||||
|
|
|
||||||
|
|
@ -59,7 +59,7 @@ import BaseLayout from '../../layouts/BaseLayout.astro';
|
||||||
|
|
||||||
<p>The human belongs on the seam where the spec is underdetermined, not on the seam where the implementation is risky.</p>
|
<p>The human belongs on the seam where the spec is underdetermined, not on the seam where the implementation is risky.</p>
|
||||||
|
|
||||||
<p>Most teams have it backwards. Most teams put the human where the implementation is risky. Most teams have the human review the code, the test, the deploy. Most teams are duplicating the factory's work, and they do not know it. The factory can review the code. The factory can run the test. The factory can ship the deploy. The factory cannot decide what the code should be. The factory cannot decide what the test should check. The factory cannot decide what the deploy should do.</p>
|
<p>The patterns that exist put the human where the implementation is risky. The human reviews the code, the test, the deploy. The factory can review the code, run the test, ship the deploy. The human's value is upstream of the implementation, at the seams where the spec is underdetermined.</p>
|
||||||
|
|
||||||
<p>That is the human's job. The human decides what the factory does. The factory decides how the human's decision becomes an artifact. The seam between them is the only place the human belongs.</p>
|
<p>That is the human's job. The human decides what the factory does. The factory decides how the human's decision becomes an artifact. The seam between them is the only place the human belongs.</p>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -31,13 +31,13 @@ import BaseLayout from '../../layouts/BaseLayout.astro';
|
||||||
|
|
||||||
<p>Every transition is a handoff. Every handoff is a place for a person to add or remove judgment. The team scales linearly with the number of handoffs. The team does not scale linearly with the number of engineers, because the handoffs are the bottleneck.</p>
|
<p>Every transition is a handoff. Every handoff is a place for a person to add or remove judgment. The team scales linearly with the number of handoffs. The team does not scale linearly with the number of engineers, because the handoffs are the bottleneck.</p>
|
||||||
|
|
||||||
<p>This is the team that hits a wall at fifteen engineers. Not because they cannot write code. Because they cannot move code through the human gates fast enough to keep up with the demand.</p>
|
<p>At some point, the handoffs become the work. The team is not shipping product. The team is moving code through human gates. The product slows. The hiring ramps. The handoffs grow. The team gets further from shipping and closer to queue management.</p>
|
||||||
|
|
||||||
<h2>The dark factory</h2>
|
<h2>The dark factory</h2>
|
||||||
|
|
||||||
<p>A dark factory replaces the human handoffs with policy. Spec in, artifact out. The policy is the rules. Nothing in the middle requires a person to act.</p>
|
<p>A dark factory replaces the human handoffs with policy. Spec in, artifact out. The policy is the rules. Nothing in the middle requires a person to act.</p>
|
||||||
|
|
||||||
<p>This is the team that ships 200 deploys a day. The team is small. The product is moving fast, except when the policy is wrong. When the policy is wrong, the product moves fast in a bad direction and no one notices until the customer does.</p>
|
<p>This is a team that ships constantly, unattended. The product is moving fast, except when the policy is wrong. When the policy is wrong, the product moves fast in a bad direction and no one notices until the customer does.</p>
|
||||||
|
|
||||||
<h2>The middle is a position, not a transition</h2>
|
<h2>The middle is a position, not a transition</h2>
|
||||||
|
|
||||||
|
|
@ -49,7 +49,7 @@ import BaseLayout from '../../layouts/BaseLayout.astro';
|
||||||
<li><strong>The spec is the source of truth.</strong> The code is generated. The test suite is generated. The deploy manifest is generated. The thing the human writes is the spec, and the spec is what gets reviewed.</li>
|
<li><strong>The spec is the source of truth.</strong> The code is generated. The test suite is generated. The deploy manifest is generated. The thing the human writes is the spec, and the spec is what gets reviewed.</li>
|
||||||
</ol>
|
</ol>
|
||||||
|
|
||||||
<p>What is new is the surface area. The spec is something a non-engineer can write in a domain-specific language. The compilation is fast enough to run on every commit. The audit surface is small enough that one person can look at all of it in an afternoon.</p>
|
<p>What is new is the surface area. The spec is meant to be writable by a domain expert, not just an engineer, in a domain-specific language. The audit surface is small enough to review against the policy.</p>
|
||||||
|
|
||||||
<h2>Why the middle is harder than either end</h2>
|
<h2>Why the middle is harder than either end</h2>
|
||||||
|
|
||||||
|
|
@ -59,7 +59,7 @@ import BaseLayout from '../../layouts/BaseLayout.astro';
|
||||||
|
|
||||||
<p>In the middle, you maintain the policy, you maintain the people, and you maintain the <em>seam</em> between them. The seam is what fails. The seam is what determines whether the factory runs at all.</p>
|
<p>In the middle, you maintain the policy, you maintain the people, and you maintain the <em>seam</em> between them. The seam is what fails. The seam is what determines whether the factory runs at all.</p>
|
||||||
|
|
||||||
<p>A seam is a place where the human's authority and the pipeline's authority have to be reconciled. Promotion to production is a seam. Incident response is a seam. The decision to roll back is a seam. The decision to skip a test is a seam. The decision to add a new test is a seam.</p>
|
<p>A seam is a place where the human's authority and the pipeline's authority have to be reconciled. Promotion to production is a seam. Incident response is a seam. The decision to roll back is a seam. Each of those is a moment where the human's signature is the difference between shipping and stalling.</p>
|
||||||
|
|
||||||
<p>Each seam has a default. The default is what the pipeline does when no human acts. If the default is "ship" and the human does not act, the system has shipped. If the default is "do not ship," the system has stalled. The default has to be defensible. The default has to be chosen.</p>
|
<p>Each seam has a default. The default is what the pipeline does when no human acts. If the default is "ship" and the human does not act, the system has shipped. If the default is "do not ship," the system has stalled. The default has to be defensible. The default has to be chosen.</p>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -57,7 +57,7 @@ import BaseLayout from '../../layouts/BaseLayout.astro';
|
||||||
|
|
||||||
<h2>The anti-pattern</h2>
|
<h2>The anti-pattern</h2>
|
||||||
|
|
||||||
<p>One operator per application. One operator per microservice. The factory has 30 operators, and every one of them is a slightly different shape. The team spends more time learning the operators than they spend shipping product.</p>
|
<p>One operator per application. One operator per microservice. The factory has many operators, and every one of them is a slightly different shape. The team spends more time learning the operators than they spend shipping product.</p>
|
||||||
|
|
||||||
<p>The mistake is treating the operator as a wrapper around the application. The operator is not a wrapper around the application. The operator is a wrapper around a <em>type of change</em>. The factory has one operator per type of change, regardless of how many applications use that type. The application is a parameter, not a peer.</p>
|
<p>The mistake is treating the operator as a wrapper around the application. The operator is not a wrapper around the application. The operator is a wrapper around a <em>type of change</em>. The factory has one operator per type of change, regardless of how many applications use that type. The application is a parameter, not a peer.</p>
|
||||||
|
|
||||||
|
|
@ -65,7 +65,7 @@ import BaseLayout from '../../layouts/BaseLayout.astro';
|
||||||
|
|
||||||
<p>Operators in a factory do not call each other. Operators watch resources. Operators emit resources. The composition happens in the cluster's etcd layer, not in operator code.</p>
|
<p>Operators in a factory do not call each other. Operators watch resources. Operators emit resources. The composition happens in the cluster's etcd layer, not in operator code.</p>
|
||||||
|
|
||||||
<p>This rule sounds like bureaucracy. It is not. It is what makes the factory auditable. When operator A triggers operator B, the trigger is a side effect of state, and the state is in etcd, and the etcd is queryable. When operator A calls operator B's API, the trigger is hidden in operator A's code, and the audit is impossible. Choose the auditable version. The factory you build next year will thank you.</p>
|
<p>This rule sounds like bureaucracy. It is not. It is what makes the factory auditable. When operator A triggers operator B, the trigger is a side effect of state, and the state is in etcd, and the etcd is queryable. When operator A calls operator B's API, the trigger is hidden in operator A's code, and the audit is impossible. Choose the auditable version.</p>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</article>
|
</article>
|
||||||
|
|
|
||||||
|
|
@ -23,7 +23,7 @@ import BaseLayout from '../../layouts/BaseLayout.astro';
|
||||||
|
|
||||||
<p class="lead-question">A dark factory can ship code. It cannot ship the judgment that knew the code was right.</p>
|
<p class="lead-question">A dark factory can ship code. It cannot ship the judgment that knew the code was right.</p>
|
||||||
|
|
||||||
<p>There is a thing a senior engineer knows that a junior engineer does not. It is not the language. It is not the framework. It is the syntax of the patterns. It is the shape of the right answer before the answer exists. The senior engineer looks at a 200-line function and says, in 30 seconds, "this is the wrong shape; it should be three things, not one." The junior engineer will spend three days on the same function, write the same wrong answer, run the tests, and ship it. The tests pass. The code is fine. The shape is wrong. The shape is what is going to cost the team a quarter.</p>
|
<p>There is a thing a senior engineer knows that a junior engineer does not. It is not the language. It is not the framework. It is the syntax of the patterns. It is the shape of the right answer before the answer exists. The senior engineer looks at a function and says, in seconds, "this is the wrong shape." The junior engineer spends days on the same function, writes the same wrong answer, runs the tests, and ships it. The tests pass. The code is fine. The shape is wrong. The shape is what costs the team.</p>
|
||||||
|
|
||||||
<p>That is taste. Taste is the human judgment that knows the right shape of a system before it exists.</p>
|
<p>That is taste. Taste is the human judgment that knows the right shape of a system before it exists.</p>
|
||||||
|
|
||||||
|
|
@ -33,7 +33,7 @@ import BaseLayout from '../../layouts/BaseLayout.astro';
|
||||||
|
|
||||||
<p>If the spec is wrong, the artifact is wrong. The factory will produce the wrong artifact at the same speed it produces the right one. The factory is the wrong shape of the wrong thing faster than any human could.</p>
|
<p>If the spec is wrong, the artifact is wrong. The factory will produce the wrong artifact at the same speed it produces the right one. The factory is the wrong shape of the wrong thing faster than any human could.</p>
|
||||||
|
|
||||||
<p>Most teams discover this six months in. The factory is shipping. The customers are complaining. The metrics are flat. Someone looks at the artifacts and realizes the artifacts are exactly what the specs said to build. The specs are exactly what the engineers wrote. The engineers wrote what the market asked for. The market asked for the wrong thing. The factory shipped the wrong thing at scale.</p>
|
<p>Teams discover this eventually. The factory is shipping. The customers are complaining. The metrics are flat. Someone looks at the artifacts and realizes the artifacts are exactly what the specs said to build. The specs are exactly what the engineers wrote. The engineers wrote what the market asked for. The market asked for the wrong thing. The factory shipped the wrong thing at scale.</p>
|
||||||
|
|
||||||
<p>The factory did not break. The factory did what it was told. The factory is not the failure mode. The factory is the amplifier. The judgment that was missing is the failure mode. The factory just made the missing judgment load-bearing.</p>
|
<p>The factory did not break. The factory did what it was told. The factory is not the failure mode. The factory is the amplifier. The judgment that was missing is the failure mode. The factory just made the missing judgment load-bearing.</p>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -23,9 +23,9 @@ import BaseLayout from '../../layouts/BaseLayout.astro';
|
||||||
|
|
||||||
<p class="lead-question">The phrase is everywhere. The working meaning is gone.</p>
|
<p class="lead-question">The phrase is everywhere. The working meaning is gone.</p>
|
||||||
|
|
||||||
<p>I sat down to write about software factories, and the first thing I had to do was take the word back. Every vendor has a "dark factory" slide. Every DevRel team has a "lights-out deployment" demo. The phrase has been stripped the way "platform engineering" was stripped, the way "DevOps" was stripped before that.</p>
|
<p>I sat down to write about software factories, and the first thing I had to do was take the word back. Every vendor has a "dark factory" slide. Every Devops team has a "lights-out deployment" demo. The phrase has been stripped the way "platform engineering" was stripped, the way "Devops" was stripped before that.</p>
|
||||||
|
|
||||||
<p>The marketing version: AI writes the code, the pipeline ships the code, humans go home early. That is a fantasy. It assumes the spec is correct, the spec is complete, the spec captures every invariant the running system has to preserve. None of those are true today. None of them will be true next year.</p>
|
<p>The marketing version: AI writes the code, the pipeline ships the code, humans go home early. That is a fantasy. It assumes the spec is correct, the spec is complete, the spec captures every invariant the running system has to preserve. None of those are true today.</p>
|
||||||
|
|
||||||
<p>The working version is a smaller claim, and a more useful one.</p>
|
<p>The working version is a smaller claim, and a more useful one.</p>
|
||||||
|
|
||||||
|
|
@ -35,7 +35,7 @@ import BaseLayout from '../../layouts/BaseLayout.astro';
|
||||||
|
|
||||||
<p>The opposite is a <strong>light factory</strong>. Same inputs, same outputs, but a human signs off between every major stage. The human is the gate.</p>
|
<p>The opposite is a <strong>light factory</strong>. Same inputs, same outputs, but a human signs off between every major stage. The human is the gate.</p>
|
||||||
|
|
||||||
<p>Most teams in 2026 are not running either. They are running a partial factory. Some stages are dark; CI runs unattended. Some stages are light; the merge to main requires a reviewer. The work is figuring out which stages should be which, and what the seams look like.</p>
|
<p>Many teams are not running either. They are running a partial factory. Some stages are dark; CI runs unattended. Some stages are light; the merge to main requires a reviewer. The work is figuring out which stages should be which, and what the seams look like.</p>
|
||||||
|
|
||||||
<h2>The five positions</h2>
|
<h2>The five positions</h2>
|
||||||
|
|
||||||
|
|
@ -43,13 +43,13 @@ import BaseLayout from '../../layouts/BaseLayout.astro';
|
||||||
|
|
||||||
<ol>
|
<ol>
|
||||||
<li><strong>Manual.</strong> A person runs the commands. No factory yet; the engineer is the build system.</li>
|
<li><strong>Manual.</strong> A person runs the commands. No factory yet; the engineer is the build system.</li>
|
||||||
<li><strong>Assisted.</strong> CI exists. Tests run. A person merges. Most teams in 2026 live here and call it DevOps.</li>
|
<li><strong>Assisted.</strong> CI exists. Tests run. A person merges. Many teams live here and call it Devops.</li>
|
||||||
<li><strong>Light.</strong> Merge is gated by policy, not by reviewer. The pipeline is the gate. A human is the auditor, not the approver.</li>
|
<li><strong>Light.</strong> Merge is gated by policy, not by reviewer. The pipeline is the gate. A human is the auditor, not the approver.</li>
|
||||||
<li><strong>Dark, gated.</strong> The pipeline ships. A human is the only one who can promote from staging to production. The factory runs, but it cannot cross a particular seam without a key turn.</li>
|
<li><strong>Dark, gated.</strong> The pipeline ships. A human is the only one who can promote from staging to production. The factory runs, but it cannot cross a particular seam without a key turn.</li>
|
||||||
<li><strong>Dark, full.</strong> The pipeline ships. Promotion is policy-driven. The human's role is to write the policy and the spec, then to inspect the artifacts the factory produces.</li>
|
<li><strong>Dark, full.</strong> The pipeline ships. Promotion is policy-driven. The human's role is to write the policy and the spec, then to inspect the artifacts the factory produces.</li>
|
||||||
</ol>
|
</ol>
|
||||||
|
|
||||||
<p>Most serious engineering organizations in 2026 sit between three and four. The interesting question is not how to get to five. The interesting question is which of your stages should be at which position, and why.</p>
|
<p>The interesting range is between three and four. The question is not how to get to five. The question is which of your stages should be at which position, and why.</p>
|
||||||
|
|
||||||
<h2>What the framing changes</h2>
|
<h2>What the framing changes</h2>
|
||||||
|
|
||||||
|
|
@ -59,9 +59,7 @@ import BaseLayout from '../../layouts/BaseLayout.astro';
|
||||||
|
|
||||||
<p>A factory is designed, not grown. A factory is maintained, not improvised. A factory has a failure budget, not a heroism budget.</p>
|
<p>A factory is designed, not grown. A factory is maintained, not improvised. A factory has a failure budget, not a heroism budget.</p>
|
||||||
|
|
||||||
<p>If the build system you are running today is a pile of bash scripts and a Slack channel, the factory framing is going to be uncomfortable. That is the point.</p>
|
<p>If the build system you are running is a pile of bash scripts and a Slack channel, the factory framing is going to be uncomfortable. That is the point.</p>
|
||||||
|
|
||||||
<p>The next post in this series is <a href="/blog/light-vs-dark-factories">Light vs Dark Factories</a>.</p>
|
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</article>
|
</article>
|
||||||
|
|
|
||||||
|
|
@ -50,15 +50,15 @@ import BaseLayout from '../../layouts/BaseLayout.astro';
|
||||||
|
|
||||||
<p>An operator is a reconciler. The operator watches a custom resource. The operator makes the cluster match the resource. The operator is written in Go and packaged as a container. The operator runs the same way the artifact runs. The operator is part of the factory.</p>
|
<p>An operator is a reconciler. The operator watches a custom resource. The operator makes the cluster match the resource. The operator is written in Go and packaged as a container. The operator runs the same way the artifact runs. The operator is part of the factory.</p>
|
||||||
|
|
||||||
<p>A platform team of 20 cannot build a custom resource type faster than a single engineer with an operator template. The single engineer's bottleneck is the spec, not the infrastructure. The infrastructure is the easy part. The hard part is figuring out what the factory should do, and that is the same problem at any team size.</p>
|
<p>A platform team cannot build a custom resource type faster than a single engineer with an operator template. The single engineer's bottleneck is the spec, not the infrastructure. The infrastructure is the easy part. The hard part is figuring out what the factory should do, and that is the same problem at any team size.</p>
|
||||||
|
|
||||||
<h2>What Kubernetes does not give you</h2>
|
<h2>What Kubernetes does not give you</h2>
|
||||||
|
|
||||||
<p>Kubernetes does not give you a factory. Kubernetes gives you a substrate on which a factory can be built. The gap between "I have a cluster" and "I have a factory" is the size of the next post in this series: the operator pattern.</p>
|
<p>Kubernetes does not give you a factory. Kubernetes gives you a substrate on which a factory can be built. The gap between "I have a cluster" and "I have a factory" is where the operator pattern lives.</p>
|
||||||
|
|
||||||
<p>Kubernetes also does not give you provenance. The cluster will run whatever artifact you give it. The cluster does not know where the artifact came from. The cluster does not know whether the artifact was generated from a spec, or by a human, or by a model with no spec. The cluster does not care. Provenance is a layer above the substrate, and that is where the dark factory actually lives.</p>
|
<p>Kubernetes also does not give you provenance. The cluster will run whatever artifact you give it. The cluster does not know where the artifact came from. The cluster does not know whether the artifact was generated from a spec, or by a human, or by a model with no spec. The cluster does not care. Provenance is a layer above the substrate, and that is where the dark factory actually lives.</p>
|
||||||
|
|
||||||
<p>If you are a single engineer in 2026 trying to build a dark factory, the choice of substrate is not really a choice. Kubernetes is the answer. The interesting work is what you build on top of it.</p>
|
<p>If you are a single engineer trying to build a dark factory, the choice of substrate is not really a choice. Kubernetes is the answer. The interesting work is what you build on top of it.</p>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</article>
|
</article>
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue