<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>Ruslan Akchurin</title>
  <link href="https://ruslanakchurin.dev/feed.xml" rel="self" />
  <link href="https://ruslanakchurin.dev/" />
  <id>https://ruslanakchurin.dev/</id>
  <updated>2026-06-25T00:00:00Z</updated>
  <author><name>Ruslan Akchurin</name></author>
  <entry>
    <title>Start with the shape</title>
    <link href="https://ruslanakchurin.dev/blog/making-iac-boring/01-shape" />
    <id>https://ruslanakchurin.dev/blog/making-iac-boring/01-shape</id>
    <updated>2026-06-25T00:00:00Z</updated>
    <published>2026-05-17T00:00:00Z</published>
    <summary>By the time anyone reviews an IaC codebase, its shape is already decided.</summary>
  </entry>
  <entry>
    <title>Resolve by contract</title>
    <link href="https://ruslanakchurin.dev/blog/making-iac-boring/02-contract" />
    <id>https://ruslanakchurin.dev/blog/making-iac-boring/02-contract</id>
    <updated>2026-06-25T00:00:00Z</updated>
    <published>2026-05-19T00:00:00Z</published>
    <summary>Cross-stack dependencies make another stack's outputs a public interface. A typed contract on a producer namespace and key is the alternative.</summary>
  </entry>
  <entry>
    <title>Define tier membership</title>
    <link href="https://ruslanakchurin.dev/blog/making-iac-boring/03-membership" />
    <id>https://ruslanakchurin.dev/blog/making-iac-boring/03-membership</id>
    <updated>2026-06-25T00:00:00Z</updated>
    <published>2026-05-24T00:00:00Z</published>
    <summary>Environment boundaries blur when workload-specific members (service accounts, IAM bindings, DNS records) accumulate in the shared environment tier.</summary>
  </entry>
  <entry>
    <title>Fail before apply</title>
    <link href="https://ruslanakchurin.dev/blog/making-iac-boring/04-fail-before-apply" />
    <id>https://ruslanakchurin.dev/blog/making-iac-boring/04-fail-before-apply</id>
    <updated>2026-06-25T00:00:00Z</updated>
    <published>2026-06-07T00:00:00Z</published>
    <summary>An IaC contract holds only if the release path enforces it: a resolver checks type and context, then refuses invalid composition before apply.</summary>
  </entry>
  <entry>
    <title>Re-cut the system</title>
    <link href="https://ruslanakchurin.dev/blog/making-iac-boring/05-re-cut-the-system" />
    <id>https://ruslanakchurin.dev/blog/making-iac-boring/05-re-cut-the-system</id>
    <updated>2026-06-25T00:00:00Z</updated>
    <published>2026-06-24T00:00:00Z</published>
    <summary>Refactoring a live IaC system toward a new architecture: freeze the old boundary, publish the new contract beside it, delete only after consumers move.</summary>
  </entry>
  <entry>
    <title>Appendix A: The shape, runnable</title>
    <link href="https://ruslanakchurin.dev/blog/making-iac-boring/appendix-a" />
    <id>https://ruslanakchurin.dev/blog/making-iac-boring/appendix-a</id>
    <updated>2026-06-25T00:00:00Z</updated>
    <published>2026-06-25T00:00:00Z</published>
    <summary>A companion repository makes the series architecture executable: four tiers, typed cross-tier contracts, and resolver probes that refuse bad composition before any provider call.</summary>
  </entry>
</feed>
