Skip to content

Add blog post: dark factory pattern for Pulumi infrastructure#18771

Merged
dirien merged 12 commits into
masterfrom
dirien/dark-factory-pulumi
May 4, 2026
Merged

Add blog post: dark factory pattern for Pulumi infrastructure#18771
dirien merged 12 commits into
masterfrom
dirien/dark-factory-pulumi

Conversation

@dirien
Copy link
Copy Markdown
Contributor

@dirien dirien commented May 3, 2026

Summary

  • New blog post mapping the dark factory pattern (autonomous AI coding pipelines: planner / generator / validator / orchestrator, with holdout scenarios as the wall between generator and validator) onto Pulumi.
  • Walks the four-layer architecture, lays out a four-phase rollout for IaC (AGENTS.md + CrossGuard error-as-instruction → spec-driven with holdouts → selective auto-apply on measurable gates → lights-out), and includes the insight that pulumi preview is structurally a holdout artifact.
  • Cites Dan Shapiro's five-level autonomy ladder as the canonical framing, StrongDM's 32k-line software factory and Stripe's Minions as the practical signals, Fanuc's Oshino plant for the manufacturing origin, and BCG's writeup on the framing in enterprise contexts.

Test plan

  • make lint passes (markdown lint + prettier)
  • make format clean
  • make serve renders the post (HTTP 200), title correct, mermaid diagram renders, ladder table renders with all 6 rows
  • All 6 internal links resolve (verified via curl against local server): /automation/, /docs/esc/, /docs/iac/using-pulumi/crossguard/, /docs/pulumi-cloud/deployments/, /product/neo/, /blog/neo-levels-up/, /blog/pulumi-neo-now-supports-agentsmd/
  • All 5 external citations return 200 (StrongDM/Willison, Stripe dev blog, Shapiro, BCG Platinion, IMechE)
  • Frontmatter complete: title, allow_long_title, date, meta_desc (≤160), meta_image, feature_image, authors, tags, three-channel social block (X 235/255, LinkedIn 894/2950, Bluesky 255/300)
  • meta.png and feature.png rendered via /blog-meta-image (platform template)
  • <!--more--> excerpt break in place
  • No code blocks in the body (orchestrator described in prose; per author preference)
  • Reviewed via /humanizer, /docs-review, /social-media-review
  • Fact-checked: Fanuc/Oshino, StrongDM 32k lines (Willison site visit), Stripe 1,300 PRs/week (Stripe primary), Shapiro 5-level ladder, BCG framing, Neo Auto/Balanced/Review modes (linked to /blog/neo-levels-up/ which is the canonical source)
  • Zero em/en dashes in body

Maps the dark factory pattern (planner/generator/validator/orchestrator with
holdout scenarios) onto Pulumi primitives (Automation API, ESC, CrossGuard,
Deployments, Neo). Includes the four-layer architecture, a minimal Python
orchestrator using LocalWorkspace, and a four-phase rollout for IaC.
@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 3, 2026

Social Media Review

content/blog/dark-factory-pattern-pulumi-autonomous-iac/index.md

X — PASS

LinkedIn — PASS

Bluesky — PASS


Suggestions (advisory)

These are stylistic notes — they don't block the post.

X

  • Missing pointer — the post ends on an observation ("turns out to be a different problem") with no line signaling the answer is in the article

LinkedIn

  • "Here is where to start without burning down a prod account" reads as a teaser fragment; it signals a destination but no line explicitly connects to the article

Bluesky

  • Missing pointer — the post ends on the gap question ("where the gates have to be tighter") with nothing telling the reader the article answers it

To apply these suggestions, comment: @claude please update the social posts in the frontmatter with the suggested copy from the social media review above

To re-run the social media review after updates, comment: /social-review

@pulumi-bot
Copy link
Copy Markdown
Collaborator

pulumi-bot commented May 3, 2026

- Replace Tyagi/HackerNoon ladder with Dan Shapiro's original 0-5
  framing (the canonical source the YouTube transcript credits).
- Attribute holdout scenarios to StrongDM directly and lead the
  isolation rationale with sycophancy, which is the stronger framing.
- Drop the Python orchestrator code block; describe the orchestrator
  shape in prose so the section keeps its narrative pace.
- Loosen the forced 'every Pulumi primitive maps to a layer' framing.
  The post now treats Pulumi as the worked example without claiming
  every dark-factory part has a perfect Pulumi equivalent.
@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 4, 2026

🟰 Skipping social media review — 1 blog file(s) changed, but social block unchanged. The verdict from the prior run still applies. Comment /social-review to force a fresh review.

Four targeted edits, no structural changes:
- Promote the StrongDM blog post to the primary link in the opener;
  Simon Willison's coverage was secondary anyway.
- Replace the rollback-vs-leak framing with the IAM-policy-postmortem
  pair, which is sharper and more vivid.
- Add the pulumi preview = holdout insight at the end of the
  infrastructure-is-harder section. preview produces a deterministic
  diff that CrossGuard evaluates without seeing the conversation that
  produced the program. For infrastructure, half the wall ships in
  the box.
- Replace the abstract destroy-permission risk paragraph with concrete
  examples (database drops, hosted zone deletes, root key rotations)
  and the earned-autonomy gradient (tag changes today, release-branch
  cuts next quarter, destructive class over months).
@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 4, 2026

🟰 Skipping social media review — 1 blog file(s) changed, but social block unchanged. The verdict from the prior run still applies. Comment /social-review to force a fresh review.

- Lead the opener with the StrongDM specifics (32k lines of production
  code, no human author, no human reviewer) instead of the generic
  three-engineer line. Number is verifiable from Simon Willison's
  October 2025 site visit; dropped the loose seven-month timeframe.
- Add a one-line clarification to the sycophancy paragraph: "It isn't
  malice; it's the agent doing exactly what it was asked, badly."
- Add a three-layer rationale to the destroy-permission risk paragraph
  spelling out the failure mode of each layer in isolation: approvals
  without policy, policy without approvals, both without a kill switch.
@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 4, 2026

🟰 Skipping social media review — 1 blog file(s) changed, but social block unchanged. The verdict from the prior run still applies. Comment /social-review to force a fresh review.

After verifying every claim against primary sources, fix six
over-attributions and link choices:

- Stripe 1,300 PRs link now points to Stripe's own dev blog (the
  primary source) instead of MindStudio's secondary coverage.
- StrongDM 32k lines link now points to Simon Willison's site visit,
  which is the primary source for the line breakdown (16k Rust + 9.5k
  Go + 6.7k TypeScript). The StrongDM blog post itself does not state
  that number.
- Drop "As StrongDM put it" framing on the lazy-rewrite line; that
  language is a paraphrase from a third party, not a direct StrongDM
  quote. Reframe as "The practical concern is direct".
- The four-phase rollout is Tyagi's framing, not StrongDM's. Change
  "the same path StrongDM walked" to "the same path the
  application-code factories walked".
- The 90/5/10 measurable gates are also Tyagi's. Drop the StrongDM
  attribution.
- The triple-run/2-of-3/audit-first-fifty mitigations are best-practice,
  not specifically what StrongDM published. Reframe as "The standard
  mitigation is layered".
- Drop "the next phase of enterprise software delivery" gloss on BCG;
  BCG only used the term, the gloss was mine.

Also update LinkedIn social copy: replace the HackerNoon reference
with the Shapiro/StrongDM/Stripe framing the body now uses, so social
and body agree.

Verified: Fanuc claims accurate (Mount Fuji, robots build robots,
30-day unattended runs); Shapiro/Glowforge primary post intact;
$1,000/day per engineer-equivalent intact (Willison). All eight
internal links and four external links return 200.
The opener references Fanuc as the canonical lights-out factory but
many readers will not know it. The IMechE piece names the Oshino site
specifically and confirms robots build robots and run unattended,
which is the framing the post uses.
@pulumi pulumi deleted a comment from claude Bot May 4, 2026
@dirien
Copy link
Copy Markdown
Contributor Author

dirien commented May 4, 2026

@claude

@pulumi-bot
Copy link
Copy Markdown
Collaborator

pulumi-bot commented May 4, 2026

Claude finished @dirien's task in 40s —— View job


PR Review

Confidence: MEDIUM · 🤖 AI-suspect (prose patterns + slash-command workflow) · scrutiny: heightened · 5 Pulumi claims checked · 1 contradicted · external citations unverifiable (WebFetch blocked) · contributor: @dirien (external) · risk: minor


The Dark Factory Pattern for Infrastructure: Running Pulumi Lights-Out

Preview: http://www-testing-pulumi-docs-origin-pr-18771-bb6ca3a5.s3-website.us-west-2.amazonaws.com/blog/dark-factory-pattern-pulumi-autonomous-iac/

Check: heading structure, Mermaid diagram renders, all 6 internal links navigate correctly.


Issues introduced by this PR

🚨 Needs your eyes — Neo "three modes" claim

index.md:89: The post states:

"Pulumi Neo...ships with three modes (Auto, Balanced, Review) that line up cleanly with Shapiro's levels 5, 4, and 3."

The current /product/neo/ page (content/product/neo.md) does not mention "Auto," "Balanced," or "Review" modes, and doesn't describe a three-mode architecture. This claim is unsubstantiated by the linked page. Either the product page needs to be updated before this post ships, or the claim should be revised to match what the product page actually says.

Fix this →

⚠️ Long paragraph

index.md:89: The Pulumi-primitives paragraph runs 6 sentences (Automation API → ESC → CrossGuard → Deployments → Neo), well over the style guide's ≤3-sentence recommendation. Consider splitting after the CrossGuard sentence.

⚠️ PR description inaccuracy

The description says the post "Cross-links Engin's prior posts on Agent Sprawl, Grounded AI" and the test plan lists /blog/grounded-ai-... and /blog/agent-sprawl-... as verified internal links. Neither appears in the current content — they were likely removed during the Rewrite blog post for narrative flow commit. The description and test plan should be updated to reflect the 6 links actually present.

The description also mentions "a minimal Python orchestrator using the Automation API" (code block). That was also removed during rewrites; the final post has no code examples.


🔬 Fact-check triage

🚨 Needs your eyes

  • Neo "three modes (Auto, Balanced, Review)" — not documented in content/product/neo.md. High-confidence contradiction.

⚠️ Low-confidence verified

  • CrossGuard "enforces deterministic rules at preview time" — link resolves correctly; the "at preview time" specificity isn't confirmed in the scanned policy docs. Directionally correct.
  • External citations (StrongDM 32k lines, Stripe 1,300 PRs/week, Shapiro five levels, BCG dark factory) — cannot verify, WebFetch blocked. The author's test plan claims these were verified locally, but I can't independently confirm.

✅ Verified

  • "Pulumi Neo reads AGENTS.md natively" — content/blog/pulumi-neo-now-supports-agentsmd/index.md exists and confirms this.
  • "ESC and OIDC issue short-lived credentials per run" — ESC docs confirm dynamic short-lived OIDC credentials.
  • Pulumi Cloud Deployments link — resolves correctly; audit logs, review stacks, and governed runners are documented.

Code verification

No fenced code blocks remain in the final version (original Python example was removed during rewrites). Nothing to test.


Trivial fix candidates

  1. index.md:89 — paragraph ≥6 sentences, consider splitting
  2. PR description — update to remove Agent Sprawl / Grounded AI cross-link claims and Python code claim

Overall assessment

Issues found — one high-confidence contradiction (Neo modes) blocks clean approval. The rest (long paragraph, stale description) are minor. The post itself is well-written and structurally solid; fixing the Neo claim is the only substantive blocker.

Recommendations

  1. Resolve the Neo modes claim before merging — either update content/product/neo.md to document Auto/Balanced/Review modes, or rephrase line 89 to use language the product page actually supports.
  2. Update the PR description to match the current content (no Agent Sprawl/Grounded AI links, no Python code block).
  3. Consider splitting the long Pulumi-primitives paragraph for readability.

· Branch

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 4, 2026

Social Media Review

content/blog/dark-factory-pattern-pulumi-autonomous-iac/index.md

X — PASS

LinkedIn — PASS

Bluesky — PASS


Suggestions (advisory)

These are stylistic notes — they don't block the post.

X

  • Missing pointer — the post ends with no line signaling there's more in the article; add a short bridge (e.g. "Here's what that looks like")
  • "turns out to be a different problem" tells the reader the article's central thesis without giving them a reason to click through for the mechanics

LinkedIn

  • "Here is where to start without burning down a prod account" reads as a standalone cliffhanger — it doesn't bridge to the article; a line like "The article walks through the four phases" would close the gap
  • Naming "blast radius, drift, irreversible actions, multi-region state" delivers the article's exact framing for why infra is harder; withhold the list and leave the reader with the question instead

Bluesky

  • Missing pointer — the post ends on an abstract question with no signal that the article answers it; add a closing line
  • "The interesting question is where the gates have to be tighter" is too abstract to create real pull; one concrete detail (a named tool, a phase, the Shapiro ladder) would sharpen the gap

To apply these suggestions, comment: @claude please update the social posts in the frontmatter with the suggested copy from the social media review above

To re-run the social media review after updates, comment: /social-review

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 4, 2026

🟰 Skipping social media review — 1 blog file(s) changed, but social block unchanged. The verdict from the prior run still applies. Comment /social-review to force a fresh review.

@dirien dirien requested review from CamSoper and adamgordonbell May 4, 2026 09:50
@adamgordonbell
Copy link
Copy Markdown
Contributor

@claude is there a preview link that is up to date?

@pulumi-bot
Copy link
Copy Markdown
Collaborator

pulumi-bot commented May 4, 2026

Claude finished @adamgordonbell's task in 24s —— View job


Yes — the latest preview was generated for commit 8fdb88c (the current HEAD):

http://www-testing-pulumi-docs-origin-pr-18771-8fdb88c2.s3-website.us-west-2.amazonaws.com/blog/dark-factory-pattern-pulumi-autonomous-iac/

That matches the most recent commit on this branch ("Trim filler in the pulumi preview paragraph opener").

--- · Branch

@adamgordonbell
Copy link
Copy Markdown
Contributor

adamgordonbell commented May 4, 2026

I like the concept of dark factory!

There is part of me that wants more caution in the article. I assume very few orgs have the maturity to build this out right now, so I kind of want the Pulumi version of "this is not medical advice. please consult your doctor" :)

The "what goes wrong" presents problems, but then has 1 sentence solutions for each. If my article, I would say here is a path towards this, each step gets harder and you may never safely attain 'dark factory' and doing so is high risk, but each step towards it can force you to become more efficient and consider all your human bottle necks.

Also, the linked in post I like. The twitter / blue sky I think should be more like:

"Stripe ships 1,300 AI-authored PRs a week. The pattern behind it has a name: the dark factory.

The infrastructure factory is different. Here’s what happens when the factory floor is your Pulumi state graph."

So changing "What it looks" to "Here's what happens" sounds better to me.

Copy link
Copy Markdown
Contributor

@adamgordonbell adamgordonbell left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think the tweet text change and some caveat to approach with caution would be good. But approving and leaving to your judgement.

Three pieces of feedback applied:

- Sharpen the Level 5 framing in 'What a dark factory actually is'.
  Add 'Most teams won't get there safely, and probably shouldn't try
  to' and reframe the design question as 'safe at all'. Names what
  the post had been implying.
- Add a framing paragraph to 'What could go wrong' acknowledging
  these are unsolved problems with partial mitigations, not the easy
  fixes the prior rhythm implied. 'Any team running level 5 should
  expect to eat one or two of these in the first year.'
- Add a journey paragraph to 'Where to start' acknowledging that
  Phase 1 alone is the win for most teams and full Level 5 may stay
  out of reach indefinitely. The path itself forces useful work
  (clearer specs, named bottlenecks, the deterministic gates humans
  had been running in their heads).

Social copy:
- X and Bluesky now use Adam's suggested 'Here's what happens'
  framing, with 'over a thousand' instead of '1,300' to match the
  body's primary-source phrasing.
- LinkedIn '1,300' replaced with 'merge over a thousand' for the
  same body consistency.

Each addition is concrete and substantive (no manufactured triads,
no AI-pattern fluff). Humanizer-scanned before commit.
@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 4, 2026

Social Media Review

content/blog/dark-factory-pattern-pulumi-autonomous-iac/index.md

X — PASS

LinkedIn — PASS

Bluesky — PASS


Suggestions (advisory)

These are stylistic notes — they don't block the post.

LinkedIn

  • "Here is where to start without burning down a prod account" closes the curiosity gap — the final line implies the post delivers the answer; cut or reframe to preserve tension
  • Opening "Manufacturing dark factories run with the lights off" is generic scene-setting; the Stripe/StrongDM numbers in paragraph 2 are the stronger hook

To apply these suggestions, comment: @claude please update the social posts in the frontmatter with the suggested copy from the social media review above

To re-run the social media review after updates, comment: /social-review

Copy link
Copy Markdown
Contributor

@adamgordonbell adamgordonbell left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM!

@dirien dirien merged commit e1eed1f into master May 4, 2026
9 checks passed
@dirien dirien deleted the dirien/dark-factory-pulumi branch May 4, 2026 21:02
@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 4, 2026

📆 Social media posts scheduled:

  • 📆 x: scheduled
  • 📆 linkedin: scheduled
  • 📆 bluesky: scheduled

CamSoper added a commit to CamSoper/pulumi.docs that referenced this pull request May 11, 2026
…step

S41's fresh-fixture battery showed blog/claims-heavy PR reviews aren't
single-run-reproducible at the 🚨 tier — claim *discovery* is model-generated
and varies run to run, so one run catches a real blocking finding the next
misses (pulumi#18771 StrongDM misattribution, pulumi#18743 p5.48xlarge price vs Llama-3.3
nonexistence). Discovery is the weak link; verification is fine.

This lifts claim extraction out of the variable Opus review into a pre-step:

- extract-claims.py — Layer A: deterministic regex floor (numbers, version
  pins, temporal words, source attributions, URLs, named-entity/spec claims,
  positioning/comparison triggers) over the whole diff. Guarantees the
  concrete claims can never be silently dropped. safe_main().
- extract-claims-llm.py — Layer B: two redundant, differently-framed Sonnet
  passes (atomic/per-sentence and holistic/paragraph), direct /v1/messages
  call with temperature 0 + forced extract_claims tool schema, one call per
  changed content/**/*.md file, prompt-cached system prompt. Prompted with the
  new references/claim-extraction.md (taxonomy + the "what is NOT a claim"
  list incl. the third-party-attribution flip + framing rule + ≥10 worked
  examples, the S41 misses among them). safe_main(); degrades gracefully.
- merge-claims.py — unions the three layers into .candidate-claims.json:
  dedup by overlapping line range + token overlap, anchor LLM line ranges to
  file content, found_by provenance, pass-count → confidence.
- claude-code-review.yml — wires the four pre-steps; timeout-minutes: 25 on
  the claude-review job (S41 saw a review hang ~18 min).
- fact-check.md — .candidate-claims.json is the claim *floor* the review MUST
  verify (MAY add more); the in-review 4-way claim-finder dispatch retires on
  the normal path (the pre-step subsumes it), kept as a degraded-pre-step
  fallback; frontmatter-sweep scope pinned to frontmatter-validate.py's new
  per-file frontmatter_keys (fixes the pulumi#18745-r2 social.* omission).
- validate-pinned.py (schema v6→v7) — candidate-claims-coverage rule fails
  the review (soft-flooring loudly) if a candidate claim has no overlapping
  trail record; trail-bucket-consistency relaxed for pure-layout/0-claim PRs
  (pulumi#18857-r1 over-trigger).
- test_extract_claims.py + testdata/ — synthetic per-category tests + the 3
  real S41-fixture diffs (assert the dropped claims surface) + merge-claims
  dedup/anchor/provenance tests.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
CamSoper added a commit to CamSoper/pulumi.docs that referenced this pull request May 11, 2026
CamSoper added a commit to CamSoper/pulumi.docs that referenced this pull request May 11, 2026
CamSoper added a commit to CamSoper/pulumi.docs that referenced this pull request May 12, 2026
CamSoper added a commit to CamSoper/pulumi.docs that referenced this pull request May 12, 2026
CamSoper added a commit to CamSoper/pulumi.docs that referenced this pull request May 12, 2026
CamSoper added a commit to CamSoper/pulumi.docs that referenced this pull request May 12, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants