<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>ainfra</title><link>https://projectious-work.github.io/ainfra/v0.1/</link><description>Recent content on ainfra</description><generator>Hugo</generator><language>en</language><atom:link href="https://projectious-work.github.io/ainfra/v0.1/index.xml" rel="self" type="application/rss+xml"/><item><title>Installation</title><link>https://projectious-work.github.io/ainfra/v0.1/docs/getting-started/installation/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://projectious-work.github.io/ainfra/v0.1/docs/getting-started/installation/</guid><description>&lt;p&gt;The supported installer downloads only from the canonical GitHub release,
verifies the release checksum before extraction, and installs to
&lt;code&gt;$HOME/.local/bin&lt;/code&gt; by default. It never invokes &lt;code&gt;sudo&lt;/code&gt;.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;curl --proto &lt;span class="s1"&gt;&amp;#39;=https&amp;#39;&lt;/span&gt; --tlsv1.2 --fail --location &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --proto-redir &lt;span class="s1"&gt;&amp;#39;=https&amp;#39;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; https://github.com/projectious-work/ainfra/releases/latest/download/install.sh &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -o /tmp/ainfra-install.sh
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sh /tmp/ainfra-install.sh
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Review a downloaded installer before running it when that is required by your
local security policy.&lt;/p&gt;
&lt;p&gt;To install a specific stable version:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;AINFRA_VERSION&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;0.1.0 sh /tmp/ainfra-install.sh
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;To select another unprivileged destination:&lt;/p&gt;</description></item><item><title>Architecture</title><link>https://projectious-work.github.io/ainfra/v0.1/docs/concepts/architecture/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://projectious-work.github.io/ainfra/v0.1/docs/concepts/architecture/</guid><description>&lt;h2 id="portfolio-boundary"&gt;Portfolio boundary&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;ainfra&lt;/code&gt; provisions and configures infrastructure targets. It hands a
non-secret output contract to downstream systems:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;InfrastructureTemplate + TemplateInput
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ▼
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; validation and policy
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ▼
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; OpenTofu plan and state
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ▼
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Ansible host configuration
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ▼
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; InfrastructureOutput
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ▼
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; workload deployment
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;OpenTofu owns infrastructure desired state. Ansible owns host configuration.
The &lt;code&gt;ainfra&lt;/code&gt; wrapper validates contracts and visibly orchestrates those tools.
Every wrapper operation has a documented direct-tool equivalent.&lt;/p&gt;</description></item><item><title>Branching strategy</title><link>https://projectious-work.github.io/ainfra/v0.1/docs/contributing/branching/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://projectious-work.github.io/ainfra/v0.1/docs/contributing/branching/</guid><description>&lt;p&gt;ainfra uses separate long-lived lanes for stable maintenance and v0
development.&lt;/p&gt;
&lt;h2 id="long-lived-branches"&gt;Long-lived branches&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;main&lt;/code&gt; represents the latest published stable release. Stable release tags
are merged here after publication. It is the repository&amp;rsquo;s default branch.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;v0.x-maintenance&lt;/code&gt; carries supported fixes for published v0 releases.
Features are not backported unless explicitly approved.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;v0.x-dev&lt;/code&gt; is the normal integration branch for v0 implementation. Feature
branches and pull requests target this branch.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;v0.x-pre-release&lt;/code&gt; receives selected promotions from &lt;code&gt;v0.x-dev&lt;/code&gt; for alpha,
beta, and release-candidate validation. Prerelease tags are created only
here.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;v0.x-release&lt;/code&gt; is promoted from the accepted prerelease state for general
availability. Stable v0 tags are created here and then merged into &lt;code&gt;main&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="promotion-flow"&gt;Promotion flow&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;feature branch
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; → v0.x-dev
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; → v0.x-pre-release
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; → v0.x-release
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; → main
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Maintenance fixes begin on &lt;code&gt;v0.x-maintenance&lt;/code&gt;. Promote a maintenance release
through the same validation expectations, and merge any still-relevant fix
forward into &lt;code&gt;v0.x-dev&lt;/code&gt;.&lt;/p&gt;</description></item><item><title>CLI</title><link>https://projectious-work.github.io/ainfra/v0.1/docs/reference/cli/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://projectious-work.github.io/ainfra/v0.1/docs/reference/cli/</guid><description>&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ainfra init [--name NAME] [--template TEMPLATE]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; [--environment ENVIRONMENT] [--format text|json]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ainfra validate [&amp;lt;path-or-template&amp;gt;] [--input INPUT]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; [--format text|json]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ainfra doctor [--input INPUT | --environment ENV] [--format text|json]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ainfra plan [&amp;lt;template&amp;gt; --input INPUT | --environment ENV]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; [--destroy] [--format text|json]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ainfra apply [&amp;lt;template&amp;gt; --input INPUT | --environment ENV]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --approve PLAN_ID
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ainfra up --environment ENV --approve PLAN_ID --known-hosts FILE
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; [--format json|yaml]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ainfra destroy [&amp;lt;template&amp;gt; --input INPUT | --environment ENV]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --approve-destroy PLAN_ID
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ainfra down --environment ENV --approve-destroy PLAN_ID
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ainfra outputs [&amp;lt;template&amp;gt; | --environment ENV] --run PLAN_ID
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; [--format json|yaml]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ainfra configure [&amp;lt;template&amp;gt; | --environment ENV] --run PLAN_ID
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --known-hosts FILE [--check]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ainfra status --environment ENV [--format text|json]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ainfra legacy inspect [--root PYTHON_REPOSITORY] [--format text|json]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ainfra inventory --output OUTPUT --destination DESTINATION
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="init"&gt;&lt;code&gt;init&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;Initializes the current directory without contacting a provider or invoking
OpenTofu or Ansible. It creates &lt;code&gt;ainfra.yaml&lt;/code&gt;, &lt;code&gt;ainfra.lock&lt;/code&gt;, and one example
under &lt;code&gt;environments/&lt;/code&gt;, then adds &lt;code&gt;.ainfra/&lt;/code&gt; to &lt;code&gt;.gitignore&lt;/code&gt;.&lt;/p&gt;</description></item><item><title>Create and tear down a Hetzner environment</title><link>https://projectious-work.github.io/ainfra/v0.1/docs/how-to/hetzner-baseline-environment/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://projectious-work.github.io/ainfra/v0.1/docs/how-to/hetzner-baseline-environment/</guid><description>&lt;p&gt;This tutorial creates a disposable Hetzner Cloud environment with the
&lt;code&gt;hetzner-kubernetes-baseline&lt;/code&gt; template and the &lt;code&gt;ainfra&lt;/code&gt; CLI. It provisions one
Debian 13 control-plane-capable host, a private network, firewall rules, and
the operator SSH key registration. It then destroys every managed resource.&lt;/p&gt;
&lt;div class="alert alert-warning" role="alert"&gt;&lt;div class="h4 alert-heading" role="heading"&gt;Cost and responsibility&lt;/div&gt;
&lt;p&gt;The apply step creates billable Hetzner resources. Check current pricing and
quotas in your Hetzner project before continuing. Keep the input, local state,
plan records, token, and destroy procedure available until independent checks
confirm that no managed resources remain.&lt;/p&gt;</description></item><item><title>Lifecycle operations</title><link>https://projectious-work.github.io/ainfra/v0.1/docs/guides/lifecycle/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://projectious-work.github.io/ainfra/v0.1/docs/guides/lifecycle/</guid><description>&lt;h2 id="validate"&gt;Validate&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ainfra validate path/to/document.yaml
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ainfra validate path/to/document.json --format json
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Validation reads a document but does not resolve secret references or run an
infrastructure engine.&lt;/p&gt;
&lt;h2 id="check-readiness"&gt;Check readiness&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ainfra doctor
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ainfra doctor --format json
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ainfra doctor --input .ainfra/hetzner.input.yaml
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ainfra doctor --environment development
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The input-aware form also checks backend readiness for the intended
environment.&lt;/p&gt;
&lt;h2 id="plan"&gt;Plan&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ainfra plan TEMPLATE --input INPUT
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;For an initialized project, use the declared environment:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ainfra plan --environment development
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Treat the plan as sensitive. Review resource ownership, addresses, firewall
rules, image selection, and estimated cost. Apply only the returned plan ID:&lt;/p&gt;</description></item><item><title>Quickstart</title><link>https://projectious-work.github.io/ainfra/v0.1/docs/getting-started/quickstart/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://projectious-work.github.io/ainfra/v0.1/docs/getting-started/quickstart/</guid><description>&lt;p&gt;This guide takes you from an installed binary to a reviewed disposable-
infrastructure plan. Applying the plan creates billable Hetzner resources, so
the final apply and destroy commands remain explicit.&lt;/p&gt;
&lt;h2 id="prerequisites"&gt;Prerequisites&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;A verified &lt;code&gt;ainfra&lt;/code&gt; release from the &lt;a href="https://projectious-work.github.io/ainfra/v0.1/docs/getting-started/installation/"&gt;installation guide&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;OpenTofu&lt;/li&gt;
&lt;li&gt;Ansible&lt;/li&gt;
&lt;li&gt;A Hetzner Cloud project token for live operations&lt;/li&gt;
&lt;li&gt;An existing SSH public key&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="install-and-validate"&gt;Install and validate&lt;/h2&gt;
&lt;p&gt;Check local readiness without changing infrastructure:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ainfra --version
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="initialize-a-disposable-project"&gt;Initialize a disposable project&lt;/h2&gt;
&lt;p&gt;Create a separate project and initialize it:&lt;/p&gt;</description></item><item><title>Contracts</title><link>https://projectious-work.github.io/ainfra/v0.1/docs/reference/contracts/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://projectious-work.github.io/ainfra/v0.1/docs/reference/contracts/</guid><description>&lt;p&gt;All schemas use JSON Schema draft 2020-12 and reject unknown fields.&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Contract&lt;/th&gt;
 &lt;th&gt;Source&lt;/th&gt;
 &lt;th&gt;Purpose&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;InfrastructureTemplate/v1alpha1&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;a href="https://github.com/projectious-work/ainfra/blob/main/schemas/template-manifest.v1alpha1.json"&gt;&lt;code&gt;schemas/template-manifest.v1alpha1.json&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;Template engines, paths, capabilities, and invariants&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;TemplateInput/v1alpha1&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;a href="https://github.com/projectious-work/ainfra/blob/main/schemas/template-input.v1alpha1.json"&gt;&lt;code&gt;schemas/template-input.v1alpha1.json&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;Non-secret operator intent and credential references&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;InfrastructureOutput/v1alpha1&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;a href="https://github.com/projectious-work/ainfra/blob/main/schemas/template-output.v1alpha1.json"&gt;&lt;code&gt;schemas/template-output.v1alpha1.json&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;Stable, non-secret handoff to downstream systems&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;ainfra.plan/v1alpha1&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;a href="https://github.com/projectious-work/ainfra/blob/main/schemas/plan-record.v1alpha1.json"&gt;&lt;code&gt;schemas/plan-record.v1alpha1.json&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;Exact reviewed-plan binding for lifecycle authorization&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;ainfra.plan/v1alpha2&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;a href="https://github.com/projectious-work/ainfra/blob/main/schemas/plan-record.v1alpha2.json"&gt;&lt;code&gt;schemas/plan-record.v1alpha2.json&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;Project-bound lifecycle authorization&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;ainfra.run/v1alpha2&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;a href="https://github.com/projectious-work/ainfra/blob/main/schemas/run-record.v1alpha2.json"&gt;&lt;code&gt;schemas/run-record.v1alpha2.json&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;Immutable run identity&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;ainfra.run-event/v1alpha1&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;a href="https://github.com/projectious-work/ainfra/blob/main/schemas/run-event.v1alpha1.json"&gt;&lt;code&gt;schemas/run-event.v1alpha1.json&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;Append-only lifecycle evidence&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;ainfra.status/v1alpha1&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;a href="https://github.com/projectious-work/ainfra/blob/main/schemas/status.v1alpha1.json"&gt;&lt;code&gt;schemas/status.v1alpha1.json&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;Sanitized local status output&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;ainfra.legacy-inspection/v1alpha1&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;a href="https://github.com/projectious-work/ainfra/blob/main/schemas/legacy-inspection.v1alpha1.json"&gt;&lt;code&gt;schemas/legacy-inspection.v1alpha1.json&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;Read-only legacy evidence report&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="compatibility"&gt;Compatibility&lt;/h2&gt;
&lt;p&gt;The &lt;code&gt;apiVersion&lt;/code&gt; is locked through the v1 series. An incompatible &lt;code&gt;v2&lt;/code&gt; requires
a full migration rather than silent coercion.&lt;/p&gt;</description></item><item><title>Local validation</title><link>https://projectious-work.github.io/ainfra/v0.1/docs/guides/local-tooling/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://projectious-work.github.io/ainfra/v0.1/docs/guides/local-tooling/</guid><description>&lt;p&gt;The repository intentionally runs its gates locally. It does not contain
GitHub Actions workflow files.&lt;/p&gt;
&lt;h2 id="install-security-tools"&gt;Install security tools&lt;/h2&gt;
&lt;p&gt;The supported bootstrap installs pinned tools into the ignored
&lt;code&gt;.ainfra/tools/&lt;/code&gt; directory:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;scripts/bootstrap-security-tools
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;It installs:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Checkov &lt;code&gt;3.2.529&lt;/code&gt; in an isolated uv tool environment;&lt;/li&gt;
&lt;li&gt;Gitleaks &lt;code&gt;8.30.1&lt;/code&gt;, verified against its release checksum.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Checkov is isolated because its dependency constraints conflict with the
project environment. Runtime version checks fail closed.&lt;/p&gt;
&lt;h2 id="run-all-gates"&gt;Run all gates&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;scripts/validate-all
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;scripts/test-all
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The validation suite covers formatting, typing, contracts, OpenTofu,
Ansible, repository policy, Rust Clippy and RustSec checks, Checkov, and
Gitleaks. Rust &lt;code&gt;1.96.1&lt;/code&gt; is pinned in &lt;code&gt;rust-toolchain.toml&lt;/code&gt;; the aibox workspace
installs Rust, Clippy, Rustfmt, and &lt;code&gt;cargo-audit&lt;/code&gt;. Missing required tooling is a
failure, not a skipped check.&lt;/p&gt;</description></item><item><title>Security model</title><link>https://projectious-work.github.io/ainfra/v0.1/docs/concepts/security-model/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://projectious-work.github.io/ainfra/v0.1/docs/concepts/security-model/</guid><description>&lt;h2 id="assumptions"&gt;Assumptions&lt;/h2&gt;
&lt;p&gt;Cloud credentials, state, plans, private keys, generated inventories, and
provider logs may contain sensitive information. The local operator environment
is trusted to hold short-lived credentials; the repository and ordinary output
documents are not secret stores.&lt;/p&gt;
&lt;p&gt;The model reduces accidental exposure and unsafe defaults. It does not turn an
untrusted workstation or compromised provider account into a trusted one.&lt;/p&gt;
&lt;h2 id="invariants"&gt;Invariants&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Operators supply public SSH keys; &lt;code&gt;ainfra&lt;/code&gt; never creates private keys.&lt;/li&gt;
&lt;li&gt;Root login and password SSH are prohibited.&lt;/li&gt;
&lt;li&gt;SSH host-key checking is mandatory.&lt;/li&gt;
&lt;li&gt;Management ingress is private by default.&lt;/li&gt;
&lt;li&gt;Public IPv4 allocation is opt-in.&lt;/li&gt;
&lt;li&gt;Private networks use narrow RFC1918 ranges and reject broad management
ranges.&lt;/li&gt;
&lt;li&gt;Non-disposable environments require encrypted, locked, recoverable remote
state with TLS and access control.&lt;/li&gt;
&lt;li&gt;Providers, collections, roles, images, and scanners are pinned.&lt;/li&gt;
&lt;li&gt;Standard outputs contain references to credentials, never their contents.&lt;/li&gt;
&lt;li&gt;Destructive operations name their exact reviewed destroy-plan ID and require
explicit approval.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="layered-verification"&gt;Layered verification&lt;/h2&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Layer&lt;/th&gt;
 &lt;th&gt;What it proves&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;JSON Schema&lt;/td&gt;
 &lt;td&gt;Document shape, version, enums, and unknown-field rejection&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Policy checks&lt;/td&gt;
 &lt;td&gt;Cross-field security invariants&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;OpenTofu validation&lt;/td&gt;
 &lt;td&gt;Provider configuration and expression correctness&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Checkov&lt;/td&gt;
 &lt;td&gt;Known infrastructure-policy findings&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Gitleaks&lt;/td&gt;
 &lt;td&gt;Repository secret patterns&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Plan assertions&lt;/td&gt;
 &lt;td&gt;The proposed resource graph matches safety expectations&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Ansible checks&lt;/td&gt;
 &lt;td&gt;Syntax, lint, check mode, and idempotence&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Disposable live test&lt;/td&gt;
 &lt;td&gt;Provider behavior and end-to-end teardown&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;No single layer is treated as complete proof. Live Hetzner verification is the
final cost-bearing gate and requires explicit approval.&lt;/p&gt;</description></item><item><title>Project configuration and locking</title><link>https://projectious-work.github.io/ainfra/v0.1/docs/concepts/project-configuration/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://projectious-work.github.io/ainfra/v0.1/docs/concepts/project-configuration/</guid><description>&lt;p&gt;An ainfra project separates committed intent from local operational state:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;my-infrastructure/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── ainfra.yaml
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── ainfra.lock
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── environments/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ └── development.yaml
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;└── .ainfra/
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;ainfra.yaml&lt;/code&gt; names the project, selects one built-in template, and maps
environment names to &lt;code&gt;TemplateInput&lt;/code&gt; files. Those files hold non-secret
provider, topology, network, access, and state intent. Credentials remain
external references such as &lt;code&gt;HCLOUD_TOKEN&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;ainfra.lock&lt;/code&gt; is generated by &lt;code&gt;ainfra init&lt;/code&gt; and should normally be committed.
It pins the template source, name, manifest version, and SHA-256 digest of the
complete embedded template. Normal project validation never rewrites it.&lt;/p&gt;</description></item><item><title>Templates</title><link>https://projectious-work.github.io/ainfra/v0.1/docs/reference/templates/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://projectious-work.github.io/ainfra/v0.1/docs/reference/templates/</guid><description>&lt;p&gt;ainfra embeds its built-in templates in the release binary. Their reviewed
source remains under &lt;code&gt;templates/&lt;/code&gt;; each directory contains an
&lt;code&gt;ainfra-template.yaml&lt;/code&gt; manifest and a template-specific README.&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Template&lt;/th&gt;
 &lt;th&gt;Source&lt;/th&gt;
 &lt;th&gt;Purpose&lt;/th&gt;
 &lt;th&gt;Status&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;hetzner-kubernetes-baseline&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;a href="https://github.com/projectious-work/ainfra/tree/main/templates/hetzner-kubernetes-baseline"&gt;&lt;code&gt;templates/hetzner-kubernetes-baseline&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;Private-networked, hardened Debian 13 hosts prepared for a later Kubernetes installation&lt;/td&gt;
 &lt;td&gt;Initial validated template&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The binary does not currently use an external registry or download templates
at runtime. Clone the repository only when you want to inspect or adapt source.&lt;/p&gt;</description></item><item><title>Authoring templates</title><link>https://projectious-work.github.io/ainfra/v0.1/docs/guides/authoring-templates/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://projectious-work.github.io/ainfra/v0.1/docs/guides/authoring-templates/</guid><description>&lt;p&gt;Read the &lt;a href="https://projectious-work.github.io/ainfra/v0.1/docs/concepts/template-strategy/"&gt;template strategy&lt;/a&gt; first. This guide covers the concrete
authoring workflow.&lt;/p&gt;
&lt;h2 id="choose-adaptation-or-a-new-template"&gt;Choose adaptation or a new template&lt;/h2&gt;
&lt;p&gt;Adapt an existing template when the provider, resource topology, lifecycle,
and security model remain the same. Typical adaptations include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;changing sizes, counts, locations, or opt-in networking through inputs;&lt;/li&gt;
&lt;li&gt;adding another explicitly supported operating-system image;&lt;/li&gt;
&lt;li&gt;extending an existing Ansible role;&lt;/li&gt;
&lt;li&gt;adding a compatible output or capability already understood by ainfra.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Create a new template when the provider changes, the topology has different
ownership or teardown behavior, the engine layout changes materially, or the
existing template&amp;rsquo;s security promises would become misleading.&lt;/p&gt;</description></item><item><title>Hetzner Kubernetes-ready baseline</title><link>https://projectious-work.github.io/ainfra/v0.1/docs/reference/hetzner-baseline/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://projectious-work.github.io/ainfra/v0.1/docs/reference/hetzner-baseline/</guid><description>&lt;p&gt;The baseline provisions one control-plane-capable Debian 13 host and optional
workers on a narrow private network. It does not install Kubernetes.&lt;/p&gt;
&lt;p&gt;OpenTofu creates:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;a project-owned private network and subnet;&lt;/li&gt;
&lt;li&gt;a narrowly scoped firewall;&lt;/li&gt;
&lt;li&gt;registrations for operator-supplied SSH public keys;&lt;/li&gt;
&lt;li&gt;Debian 13 servers;&lt;/li&gt;
&lt;li&gt;public IPv4 or IPv6 attachments only when explicitly enabled.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ansible configures:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;secure SSH daemon policy;&lt;/li&gt;
&lt;li&gt;nftables host firewall policy;&lt;/li&gt;
&lt;li&gt;unattended security updates;&lt;/li&gt;
&lt;li&gt;persistent journal and audit configuration;&lt;/li&gt;
&lt;li&gt;Kubernetes-ready operating-system prerequisites.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="networking"&gt;Networking&lt;/h2&gt;
&lt;p&gt;Public IPv4 and IPv6 are independent and disabled in the standard input.
Disabling IPv4 means no billable public IPv4 resource or attachment may exist.
The generated inventory prefers private management addresses.&lt;/p&gt;</description></item><item><title>State and secrets</title><link>https://projectious-work.github.io/ainfra/v0.1/docs/concepts/state-and-secrets/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://projectious-work.github.io/ainfra/v0.1/docs/concepts/state-and-secrets/</guid><description>&lt;h2 id="state"&gt;State&lt;/h2&gt;
&lt;p&gt;Non-disposable environments must use a capability-validated remote backend
providing encryption at rest, locking, version recovery, TLS, and access
control. S3-compatible services qualify only after integration tests prove
those capabilities.&lt;/p&gt;
&lt;p&gt;Local state is limited to inputs explicitly marked disposable and produces a
prominent warning. The wrapper does not provision, repair, or silently migrate
a backend.&lt;/p&gt;
&lt;p&gt;Backend configuration stays outside version control. The repository ignores
local state, plans, &lt;code&gt;.terraform/&lt;/code&gt;, and &lt;code&gt;.ainfra/&lt;/code&gt;.&lt;/p&gt;</description></item><item><title>Acceptance matrix</title><link>https://projectious-work.github.io/ainfra/v0.1/docs/reference/acceptance-matrix/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://projectious-work.github.io/ainfra/v0.1/docs/reference/acceptance-matrix/</guid><description>&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Requirement&lt;/th&gt;
 &lt;th&gt;Evidence&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Versioned strict contracts&lt;/td&gt;
 &lt;td&gt;Schema and positive/negative fixture tests&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Visible wrapper commands&lt;/td&gt;
 &lt;td&gt;CLI, runner, lifecycle, and adapter tests&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;No template hardcoding&lt;/td&gt;
 &lt;td&gt;Contract-driven discovery and fixtures&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Pinned Hetzner template&lt;/td&gt;
 &lt;td&gt;Provider lock, image enum, validation&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Secure SSH and keys&lt;/td&gt;
 &lt;td&gt;Schema, policy, plan, and host tests&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Safe state&lt;/td&gt;
 &lt;td&gt;Backend capability validation&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Secret-free output&lt;/td&gt;
 &lt;td&gt;Strict schema, redaction, Gitleaks&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Local validation gates&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;scripts/validate-all&lt;/code&gt;, &lt;code&gt;scripts/test-all&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Standalone Rust product&lt;/td&gt;
 &lt;td&gt;No Python package; installed-shell no-tool test&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Disposable lifecycle&lt;/td&gt;
 &lt;td&gt;Approved live apply, idempotence, and teardown&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Clear portfolio boundaries&lt;/td&gt;
 &lt;td&gt;README and architecture review&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;No unsafe donor behavior&lt;/td&gt;
 &lt;td&gt;Negative policy and plan tests&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;No GitHub workflows&lt;/td&gt;
 &lt;td&gt;Repository-policy test&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Every release criterion maps to an automated local check or documented manual
verification with sanitized evidence. A claim without one of those forms of
evidence remains unverified.&lt;/p&gt;</description></item><item><title>Template strategy</title><link>https://projectious-work.github.io/ainfra/v0.1/docs/concepts/template-strategy/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://projectious-work.github.io/ainfra/v0.1/docs/concepts/template-strategy/</guid><description>&lt;p&gt;An ainfra template is a versioned, self-contained infrastructure
implementation behind a common contract. Templates share lifecycle and safety
rules, but keep provider-specific OpenTofu, host configuration, and operational
documentation together.&lt;/p&gt;
&lt;h2 id="why-templates-exist"&gt;Why templates exist&lt;/h2&gt;
&lt;p&gt;The template boundary separates three concerns:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;The ainfra wrapper owns discovery, contract validation, reviewed-plan
binding, sanitized outputs, and ownership-scoped destruction.&lt;/li&gt;
&lt;li&gt;A template owns provider resources, host configuration, supported images,
capabilities, and provider-specific defaults.&lt;/li&gt;
&lt;li&gt;The operator owns the selected template, non-secret intent, credential
references, reviewed plan, and explicit lifecycle approvals.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This lets a template evolve without hiding OpenTofu or Ansible. Every engine
working directory remains directly usable and inspectable.&lt;/p&gt;</description></item></channel></rss>