<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Orchard</title><link>https://orchard.pthm.dev/</link><description>Recent content on Orchard</description><generator>Hugo</generator><language>en-us</language><atom:link href="https://orchard.pthm.dev/index.xml" rel="self" type="application/rss+xml"/><item><title>CLI</title><link>https://orchard.pthm.dev/docs/reference/cli/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://orchard.pthm.dev/docs/reference/cli/</guid><description>&lt;h1 id="cli-reference"&gt;CLI reference&lt;a class="anchor" href="#cli-reference"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;orchard &amp;lt;command&amp;gt; [arguments] [flags]&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="global-flags"&gt;Global flags&lt;a class="anchor" href="#global-flags"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Flag&lt;/th&gt;
 &lt;th&gt;Type&lt;/th&gt;
 &lt;th&gt;Default&lt;/th&gt;
 &lt;th&gt;Description&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;--var key=value&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;string map&lt;/td&gt;
 &lt;td&gt;—&lt;/td&gt;
 &lt;td&gt;Override a scenario variable. Repeatable: &lt;code&gt;--var a=1 --var b=2&lt;/code&gt;.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;--no-color&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;bool&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;false&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Disable colored output.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;Environment variables&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Name&lt;/th&gt;
 &lt;th&gt;Effect&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;NO_COLOR&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;If set to any value, disables colored output. Equivalent to &lt;code&gt;--no-color&lt;/code&gt;.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="orchard-init"&gt;&lt;code&gt;orchard init&lt;/code&gt;&lt;a class="anchor" href="#orchard-init"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;orchard init [directory]&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Scaffold a new Orchard project with a starter scenario and component.&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Argument&lt;/th&gt;
 &lt;th&gt;Description&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;[directory]&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Where to create the files. Defaults to &lt;code&gt;.&lt;/code&gt;. Created if it doesn&amp;rsquo;t exist.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;What it creates&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Installation</title><link>https://orchard.pthm.dev/docs/getting-started/installation/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://orchard.pthm.dev/docs/getting-started/installation/</guid><description>&lt;h1 id="installation"&gt;Installation&lt;a class="anchor" href="#installation"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Orchard ships as a single Go binary. There is no daemon, no server, and no database
of its own — it reads HCL files and talks to the systems you configure.&lt;/p&gt;
&lt;h2 id="install-from-source"&gt;Install from source&lt;a class="anchor" href="#install-from-source"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f7f7f7;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;go install github.com/pthm/orchard@latest&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This installs &lt;code&gt;orchard&lt;/code&gt; into &lt;code&gt;$GOBIN&lt;/code&gt; (defaulting to &lt;code&gt;$HOME/go/bin&lt;/code&gt;). Make sure that
directory is on your &lt;code&gt;PATH&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Verify the install:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f7f7f7;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;orchard --help&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;You should see the top-level command with &lt;code&gt;run&lt;/code&gt;, &lt;code&gt;plan&lt;/code&gt;, and &lt;code&gt;list&lt;/code&gt; subcommands.&lt;/p&gt;
&lt;h2 id="requirements"&gt;Requirements&lt;a class="anchor" href="#requirements"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Go 1.22 or newer&lt;/strong&gt; if installing from source.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;A target system to drive.&lt;/strong&gt; Orchard itself is just an orchestrator — you need
something for it to talk to. For the built-in providers that means a reachable
PostgreSQL database (for &lt;code&gt;builtin/postgres&lt;/code&gt;), an HTTP endpoint (for &lt;code&gt;builtin/http&lt;/code&gt;),
or a shell environment (for &lt;code&gt;builtin/exec&lt;/code&gt;).&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="prebuilt-binaries"&gt;Prebuilt binaries&lt;a class="anchor" href="#prebuilt-binaries"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Prebuilt binaries are not yet published. Until then, &lt;code&gt;go install&lt;/code&gt; is the supported
path.&lt;/p&gt;</description></item><item><title>Provider protocol</title><link>https://orchard.pthm.dev/docs/extending/provider-protocol/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://orchard.pthm.dev/docs/extending/provider-protocol/</guid><description>&lt;h1 id="provider-protocol"&gt;Provider protocol&lt;a class="anchor" href="#provider-protocol"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Orchard and its providers communicate using a line-oriented JSON protocol over
stdio. This page defines the wire format. If you&amp;rsquo;re writing a provider, these are
the exact bytes you need to read and write.&lt;/p&gt;
&lt;h2 id="framing-json-lines"&gt;Framing: JSON Lines&lt;a class="anchor" href="#framing-json-lines"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Every message is a single JSON object on its own line, terminated by &lt;code&gt;\n&lt;/code&gt;.
Readers split on &lt;code&gt;\n&lt;/code&gt;, parse the line as one JSON value, and match it to a
request by id.&lt;/p&gt;</description></item><item><title>Scenarios</title><link>https://orchard.pthm.dev/docs/concepts/scenarios/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://orchard.pthm.dev/docs/concepts/scenarios/</guid><description>&lt;h1 id="scenarios"&gt;Scenarios&lt;a class="anchor" href="#scenarios"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;A &lt;strong&gt;scenario&lt;/strong&gt; is the top-level entrypoint in Orchard. It is the thing a user runs.
A scenario declares the providers it needs, accepts parameters via variables,
composes components and actions, and exposes outputs.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f7f7f7;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-hcl" data-lang="hcl"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#cf222e"&gt;scenario&lt;/span&gt; &lt;span style="color:#0a3069"&gt;&amp;#34;merchant_with_chargeback&amp;#34;&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#cf222e"&gt;required_providers&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; postgres &lt;span style="color:#0550ae"&gt;=&lt;/span&gt; { source &lt;span style="color:#0550ae"&gt;=&lt;/span&gt; &lt;span style="color:#0a3069"&gt;&amp;#34;builtin/postgres&amp;#34;&lt;/span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#cf222e"&gt;variable&lt;/span&gt; &lt;span style="color:#0a3069"&gt;&amp;#34;dsn&amp;#34;&lt;/span&gt; {}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#cf222e"&gt;variable&lt;/span&gt; &lt;span style="color:#0a3069"&gt;&amp;#34;merchant_name&amp;#34;&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; default &lt;span style="color:#0550ae"&gt;=&lt;/span&gt; &lt;span style="color:#0a3069"&gt;&amp;#34;Acme Corp&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#cf222e"&gt;provider&lt;/span&gt; &lt;span style="color:#0a3069"&gt;&amp;#34;postgres&amp;#34;&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; dsn &lt;span style="color:#0550ae"&gt;=&lt;/span&gt; &lt;span style="color:#cf222e"&gt;var&lt;/span&gt;&lt;span style="color:#1f2328"&gt;.&lt;/span&gt;&lt;span style="color:#cf222e"&gt;dsn&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#cf222e"&gt;component&lt;/span&gt; &lt;span style="color:#0a3069"&gt;&amp;#34;merchant&amp;#34; &amp;#34;base&amp;#34;&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; source &lt;span style="color:#0550ae"&gt;=&lt;/span&gt; &lt;span style="color:#0a3069"&gt;&amp;#34;../components/merchant.hcl&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; inputs &lt;span style="color:#0550ae"&gt;=&lt;/span&gt; { name &lt;span style="color:#0550ae"&gt;=&lt;/span&gt; &lt;span style="color:#cf222e"&gt;var&lt;/span&gt;&lt;span style="color:#1f2328"&gt;.&lt;/span&gt;&lt;span style="color:#cf222e"&gt;merchant_name&lt;/span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#cf222e"&gt;output&lt;/span&gt; &lt;span style="color:#0a3069"&gt;&amp;#34;merchant_id&amp;#34;&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; value &lt;span style="color:#0550ae"&gt;=&lt;/span&gt; &lt;span style="color:#cf222e"&gt;component&lt;/span&gt;&lt;span style="color:#1f2328"&gt;.&lt;/span&gt;&lt;span style="color:#cf222e"&gt;merchant&lt;/span&gt;&lt;span style="color:#1f2328"&gt;.&lt;/span&gt;&lt;span style="color:#cf222e"&gt;base&lt;/span&gt;&lt;span style="color:#1f2328"&gt;.&lt;/span&gt;&lt;span style="color:#cf222e"&gt;id&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="what-goes-inside-a-scenario"&gt;What goes inside a scenario&lt;a class="anchor" href="#what-goes-inside-a-scenario"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;A scenario file contains exactly one &lt;code&gt;scenario &amp;quot;&amp;lt;name&amp;gt;&amp;quot; { ... }&lt;/code&gt; block. Inside that
block, you can declare:&lt;/p&gt;</description></item><item><title>Seeding a demo environment</title><link>https://orchard.pthm.dev/docs/guides/demo-seeding/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://orchard.pthm.dev/docs/guides/demo-seeding/</guid><description>&lt;h1 id="seeding-a-demo-environment"&gt;Seeding a demo environment&lt;a class="anchor" href="#seeding-a-demo-environment"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;Goal.&lt;/strong&gt; Produce a database that tells a compelling story when someone opens the
product. Not just rows — a believable narrative: customers with histories, orders
with realistic timing, payments with a mix of outcomes.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Why Orchard.&lt;/strong&gt; Hand-written SQL seed scripts rot. They drift from the schema,
they can&amp;rsquo;t vary the story for different audiences, and they don&amp;rsquo;t compose. A
scenario describes the story once; variables let you reshape it per demo.&lt;/p&gt;</description></item><item><title>Components</title><link>https://orchard.pthm.dev/docs/concepts/components/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://orchard.pthm.dev/docs/concepts/components/</guid><description>&lt;h1 id="components"&gt;Components&lt;a class="anchor" href="#components"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;A &lt;strong&gt;component&lt;/strong&gt; is a reusable unit of state. It&amp;rsquo;s the Orchard equivalent of a
function: it takes inputs, performs some work, and returns outputs. Scenarios
compose components to describe complex state without repeating themselves.&lt;/p&gt;
&lt;h2 id="defining-a-component"&gt;Defining a component&lt;a class="anchor" href="#defining-a-component"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;A component lives in its own file. The file contains one &lt;code&gt;component &amp;quot;&amp;lt;name&amp;gt;&amp;quot; { ... }&lt;/code&gt;
block:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f7f7f7;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-hcl" data-lang="hcl"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#57606a"&gt;# components/merchant.hcl
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#cf222e"&gt;component&lt;/span&gt; &lt;span style="color:#0a3069"&gt;&amp;#34;merchant&amp;#34;&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#cf222e"&gt;variable&lt;/span&gt; &lt;span style="color:#0a3069"&gt;&amp;#34;name&amp;#34;&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; default &lt;span style="color:#0550ae"&gt;=&lt;/span&gt; &lt;span style="color:#0a3069"&gt;&amp;#34;Default Merchant&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#cf222e"&gt;variable&lt;/span&gt; &lt;span style="color:#0a3069"&gt;&amp;#34;region&amp;#34;&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; default &lt;span style="color:#0550ae"&gt;=&lt;/span&gt; &lt;span style="color:#0a3069"&gt;&amp;#34;us&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#cf222e"&gt;action&lt;/span&gt; &lt;span style="color:#0a3069"&gt;&amp;#34;postgres_query&amp;#34; &amp;#34;create&amp;#34;&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; query &lt;span style="color:#0550ae"&gt;=&lt;/span&gt; &lt;span style="color:#0a3069"&gt;&amp;#34;INSERT INTO merchants (name, region) VALUES (&amp;#39;${var.name}&amp;#39;, &amp;#39;${var.region}&amp;#39;) RETURNING id, name, region&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; output &amp;#34;id&amp;#34; { value &lt;span style="color:#0550ae"&gt;=&lt;/span&gt; &lt;span style="color:#cf222e"&gt;action&lt;/span&gt;&lt;span style="color:#1f2328"&gt;.&lt;/span&gt;&lt;span style="color:#cf222e"&gt;postgres_query&lt;/span&gt;&lt;span style="color:#1f2328"&gt;.&lt;/span&gt;&lt;span style="color:#cf222e"&gt;create&lt;/span&gt;&lt;span style="color:#1f2328"&gt;.&lt;/span&gt;&lt;span style="color:#cf222e"&gt;id&lt;/span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; output &amp;#34;name&amp;#34; { value &lt;span style="color:#0550ae"&gt;=&lt;/span&gt; &lt;span style="color:#cf222e"&gt;action&lt;/span&gt;&lt;span style="color:#1f2328"&gt;.&lt;/span&gt;&lt;span style="color:#cf222e"&gt;postgres_query&lt;/span&gt;&lt;span style="color:#1f2328"&gt;.&lt;/span&gt;&lt;span style="color:#cf222e"&gt;create&lt;/span&gt;&lt;span style="color:#1f2328"&gt;.&lt;/span&gt;&lt;span style="color:#cf222e"&gt;name&lt;/span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; output &amp;#34;region&amp;#34; { value &lt;span style="color:#0550ae"&gt;=&lt;/span&gt; &lt;span style="color:#cf222e"&gt;action&lt;/span&gt;&lt;span style="color:#1f2328"&gt;.&lt;/span&gt;&lt;span style="color:#cf222e"&gt;postgres_query&lt;/span&gt;&lt;span style="color:#1f2328"&gt;.&lt;/span&gt;&lt;span style="color:#cf222e"&gt;create&lt;/span&gt;&lt;span style="color:#1f2328"&gt;.&lt;/span&gt;&lt;span style="color:#cf222e"&gt;region&lt;/span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;A component has the same vocabulary as a scenario — variables, actions, outputs —
but no &lt;code&gt;required_providers&lt;/code&gt; or &lt;code&gt;provider&lt;/code&gt; blocks. Components inherit their providers
from the enclosing scenario.&lt;/p&gt;</description></item><item><title>Execution model</title><link>https://orchard.pthm.dev/docs/extending/execution-model/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://orchard.pthm.dev/docs/extending/execution-model/</guid><description>&lt;h1 id="execution-model"&gt;Execution model&lt;a class="anchor" href="#execution-model"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;A provider is a process. Orchard starts it, talks to it, and stops it. This page
documents that lifecycle in detail so you know exactly what your provider code
has to handle.&lt;/p&gt;
&lt;h2 id="one-process-per-scenario"&gt;One process per scenario&lt;a class="anchor" href="#one-process-per-scenario"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;In &lt;code&gt;run&lt;/code&gt; mode, Orchard spawns one provider subprocess per &lt;code&gt;provider&lt;/code&gt; declaration
in the scenario. The process stays alive for the duration of the scenario,
handles all actions routed to that provider, and receives &lt;code&gt;shutdown&lt;/code&gt; at the end.&lt;/p&gt;</description></item><item><title>HCL schema</title><link>https://orchard.pthm.dev/docs/reference/hcl-schema/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://orchard.pthm.dev/docs/reference/hcl-schema/</guid><description>&lt;h1 id="hcl-schema-reference"&gt;HCL schema reference&lt;a class="anchor" href="#hcl-schema-reference"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Every block and attribute Orchard&amp;rsquo;s parser accepts. The two authoring contexts
are &lt;strong&gt;scenario files&lt;/strong&gt; and &lt;strong&gt;component files&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id="scenario-files"&gt;Scenario files&lt;a class="anchor" href="#scenario-files"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;A scenario file contains exactly one &lt;code&gt;scenario&lt;/code&gt; block.&lt;/p&gt;
&lt;h3 id="scenario"&gt;&lt;code&gt;scenario&lt;/code&gt;&lt;a class="anchor" href="#scenario"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f7f7f7;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-hcl" data-lang="hcl"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#cf222e"&gt;scenario&lt;/span&gt; &lt;span style="color:#0a3069"&gt;&amp;#34;&amp;lt;name&amp;gt;&amp;#34;&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; description &lt;span style="color:#0550ae"&gt;=&lt;/span&gt; &lt;span style="color:#0a3069"&gt;&amp;#34;...&amp;#34;&lt;/span&gt;&lt;span style="color:#57606a"&gt; # optional
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; tags &lt;span style="color:#0550ae"&gt;=&lt;/span&gt; &lt;span style="color:#1f2328"&gt;[&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#34;a&amp;#34;, &amp;#34;b&amp;#34;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;]&lt;/span&gt;&lt;span style="color:#57606a"&gt; # optional
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#cf222e"&gt;required_providers&lt;/span&gt; { &lt;span style="color:#1f2328"&gt;...&lt;/span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#cf222e"&gt;variable&lt;/span&gt; &lt;span style="color:#0a3069"&gt;&amp;#34;&amp;lt;name&amp;gt;&amp;#34;&lt;/span&gt; { &lt;span style="color:#1f2328"&gt;...&lt;/span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#cf222e"&gt;provider&lt;/span&gt; &lt;span style="color:#0a3069"&gt;&amp;#34;&amp;lt;name&amp;gt;&amp;#34;&lt;/span&gt; { &lt;span style="color:#1f2328"&gt;...&lt;/span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#cf222e"&gt;component&lt;/span&gt; &lt;span style="color:#0a3069"&gt;&amp;#34;&amp;lt;type&amp;gt;&amp;#34; &amp;#34;&amp;lt;name&amp;gt;&amp;#34;&lt;/span&gt; { &lt;span style="color:#1f2328"&gt;...&lt;/span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#cf222e"&gt;action&lt;/span&gt; &lt;span style="color:#0a3069"&gt;&amp;#34;&amp;lt;type&amp;gt;&amp;#34; &amp;#34;&amp;lt;name&amp;gt;&amp;#34;&lt;/span&gt; { &lt;span style="color:#1f2328"&gt;...&lt;/span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#cf222e"&gt;output&lt;/span&gt; &lt;span style="color:#0a3069"&gt;&amp;#34;&amp;lt;name&amp;gt;&amp;#34;&lt;/span&gt; { &lt;span style="color:#1f2328"&gt;...&lt;/span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;A single HCL file may contain &lt;strong&gt;multiple scenario blocks&lt;/strong&gt;. When it does,
&lt;code&gt;orchard run&lt;/code&gt; and &lt;code&gt;orchard plan&lt;/code&gt; require &lt;code&gt;--scenario &amp;lt;name&amp;gt;&lt;/code&gt; to pick one.
Single-scenario files work without the flag.&lt;/p&gt;</description></item><item><title>Manual UAT testing</title><link>https://orchard.pthm.dev/docs/guides/uat-testing/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://orchard.pthm.dev/docs/guides/uat-testing/</guid><description>&lt;h1 id="manual-uat-testing"&gt;Manual UAT testing&lt;a class="anchor" href="#manual-uat-testing"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;Goal.&lt;/strong&gt; Reproducible test cases for QA and stakeholders. &amp;ldquo;A subscription with
three failed payments&amp;rdquo; should be one command, not a fifteen-minute click-through.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Why Orchard.&lt;/strong&gt; UAT scripts usually live as a README page of SQL snippets, a
shared Notion doc, or inside someone&amp;rsquo;s head. Turning them into scenarios makes
them runnable, version-controlled, and reviewable.&lt;/p&gt;
&lt;h2 id="pattern-test-case-per-scenario"&gt;Pattern: test case per scenario&lt;a class="anchor" href="#pattern-test-case-per-scenario"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Each distinct UAT case becomes a scenario file. Name them after the test case:&lt;/p&gt;</description></item><item><title>Setup</title><link>https://orchard.pthm.dev/docs/getting-started/setup/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://orchard.pthm.dev/docs/getting-started/setup/</guid><description>&lt;h1 id="setup"&gt;Setup&lt;a class="anchor" href="#setup"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Orchard is configuration-free: there is no global config file, no workspace init, and
no state directory. A project is just a directory of &lt;code&gt;.hcl&lt;/code&gt; files.&lt;/p&gt;
&lt;h2 id="recommended-layout"&gt;Recommended layout&lt;a class="anchor" href="#recommended-layout"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;my-project/
├── scenarios/
│ ├── dev.hcl
│ ├── demo.hcl
│ └── integration.hcl
└── components/
 ├── merchant.hcl
 └── order.hcl&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;scenarios/&lt;/code&gt;&lt;/strong&gt; — one file per runnable scenario. Scenario files are what you
pass to &lt;code&gt;orchard run&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;components/&lt;/code&gt;&lt;/strong&gt; — reusable building blocks. Components are referenced from
scenarios with &lt;code&gt;source = &amp;quot;../components/&amp;lt;name&amp;gt;.hcl&amp;quot;&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This layout is a convention, not a requirement. Orchard doesn&amp;rsquo;t care where files
live; &lt;code&gt;source&lt;/code&gt; paths are resolved relative to the file that references them.&lt;/p&gt;</description></item><item><title>Expressions</title><link>https://orchard.pthm.dev/docs/reference/expressions/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://orchard.pthm.dev/docs/reference/expressions/</guid><description>&lt;h1 id="expression-reference"&gt;Expression reference&lt;a class="anchor" href="#expression-reference"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Orchard uses HCL expressions with a cty type system. This page covers the
reference namespaces, type expressions, and available functions.&lt;/p&gt;
&lt;h2 id="reference-namespaces"&gt;Reference namespaces&lt;a class="anchor" href="#reference-namespaces"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Five reference namespaces are available inside expressions:&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Form&lt;/th&gt;
 &lt;th&gt;Scope&lt;/th&gt;
 &lt;th&gt;Available when&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;var.&amp;lt;name&amp;gt;&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Scenario (or component) variables.&lt;/td&gt;
 &lt;td&gt;Immediately — resolved up front.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;action.&amp;lt;type&amp;gt;.&amp;lt;name&amp;gt;.&amp;lt;output&amp;gt;&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Action outputs.&lt;/td&gt;
 &lt;td&gt;After the referenced action completes.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;component.&amp;lt;type&amp;gt;.&amp;lt;name&amp;gt;.&amp;lt;output&amp;gt;&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Component instance outputs.&lt;/td&gt;
 &lt;td&gt;After the component resolves.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;var.&amp;lt;name&amp;gt;&lt;/code&gt; (inside a component)&lt;/td&gt;
 &lt;td&gt;The component&amp;rsquo;s own variables.&lt;/td&gt;
 &lt;td&gt;Immediately, scoped to the component.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;self.&amp;lt;output&amp;gt;&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;The current action&amp;rsquo;s own outputs.&lt;/td&gt;
 &lt;td&gt;Inside &lt;code&gt;lifecycle { teardown { } }&lt;/code&gt; blocks only.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="variable-references"&gt;Variable references&lt;a class="anchor" href="#variable-references"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f7f7f7;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-hcl" data-lang="hcl"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#cf222e"&gt;provider&lt;/span&gt; &lt;span style="color:#0a3069"&gt;&amp;#34;postgres&amp;#34;&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; dsn &lt;span style="color:#0550ae"&gt;=&lt;/span&gt; &lt;span style="color:#cf222e"&gt;var&lt;/span&gt;&lt;span style="color:#1f2328"&gt;.&lt;/span&gt;&lt;span style="color:#cf222e"&gt;dsn&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#cf222e"&gt;action&lt;/span&gt; &lt;span style="color:#0a3069"&gt;&amp;#34;postgres_query&amp;#34; &amp;#34;insert&amp;#34;&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; query &lt;span style="color:#0550ae"&gt;=&lt;/span&gt; &lt;span style="color:#0a3069"&gt;&amp;#34;INSERT INTO t (name) VALUES (&amp;#39;${var.name}&amp;#39;)&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Variable references are resolved at plan time. They cannot participate in the
dependency graph — if you need ordering, reference an action or component
output instead.&lt;/p&gt;</description></item><item><title>First scenario</title><link>https://orchard.pthm.dev/docs/getting-started/first-scenario/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://orchard.pthm.dev/docs/getting-started/first-scenario/</guid><description>&lt;h1 id="your-first-scenario"&gt;Your first scenario&lt;a class="anchor" href="#your-first-scenario"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;This page walks through writing and running a small scenario that inserts a merchant
row and a product row into Postgres, wiring the merchant&amp;rsquo;s generated ID into the
product insert.&lt;/p&gt;
&lt;h2 id="prerequisites"&gt;Prerequisites&lt;a class="anchor" href="#prerequisites"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;You&amp;rsquo;ll need a PostgreSQL database you can write to and two tables:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f7f7f7;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#cf222e"&gt;CREATE&lt;/span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#cf222e"&gt;TABLE&lt;/span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;merchants&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#1f2328"&gt;(&lt;/span&gt;&lt;span style="color:#fff"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;id&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#6639ba"&gt;SERIAL&lt;/span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#cf222e"&gt;PRIMARY&lt;/span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#cf222e"&gt;KEY&lt;/span&gt;&lt;span style="color:#1f2328"&gt;,&lt;/span&gt;&lt;span style="color:#fff"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;name&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#6639ba"&gt;TEXT&lt;/span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#cf222e"&gt;NOT&lt;/span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#cf222e"&gt;NULL&lt;/span&gt;&lt;span style="color:#1f2328"&gt;,&lt;/span&gt;&lt;span style="color:#fff"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;region&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#6639ba"&gt;TEXT&lt;/span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#cf222e"&gt;NOT&lt;/span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#cf222e"&gt;NULL&lt;/span&gt;&lt;span style="color:#fff"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#1f2328"&gt;);&lt;/span&gt;&lt;span style="color:#fff"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#cf222e"&gt;CREATE&lt;/span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#cf222e"&gt;TABLE&lt;/span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;products&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#1f2328"&gt;(&lt;/span&gt;&lt;span style="color:#fff"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;id&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#6639ba"&gt;SERIAL&lt;/span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#cf222e"&gt;PRIMARY&lt;/span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#cf222e"&gt;KEY&lt;/span&gt;&lt;span style="color:#1f2328"&gt;,&lt;/span&gt;&lt;span style="color:#fff"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;merchant_id&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#6639ba"&gt;INT&lt;/span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#cf222e"&gt;NOT&lt;/span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#cf222e"&gt;NULL&lt;/span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#cf222e"&gt;REFERENCES&lt;/span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;merchants&lt;span style="color:#1f2328"&gt;(&lt;/span&gt;id&lt;span style="color:#1f2328"&gt;),&lt;/span&gt;&lt;span style="color:#fff"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;name&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#6639ba"&gt;TEXT&lt;/span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#cf222e"&gt;NOT&lt;/span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#cf222e"&gt;NULL&lt;/span&gt;&lt;span style="color:#1f2328"&gt;,&lt;/span&gt;&lt;span style="color:#fff"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;price&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#6639ba"&gt;NUMERIC&lt;/span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#cf222e"&gt;NOT&lt;/span&gt;&lt;span style="color:#fff"&gt; &lt;/span&gt;&lt;span style="color:#cf222e"&gt;NULL&lt;/span&gt;&lt;span style="color:#fff"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#1f2328"&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="write-the-scenario"&gt;Write the scenario&lt;a class="anchor" href="#write-the-scenario"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Create &lt;code&gt;scenarios/hello.hcl&lt;/code&gt;:&lt;/p&gt;</description></item><item><title>Functions</title><link>https://orchard.pthm.dev/docs/reference/functions/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://orchard.pthm.dev/docs/reference/functions/</guid><description>&lt;h1 id="functions"&gt;Functions&lt;a class="anchor" href="#functions"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Orchard exposes 56 functions in every expression — variable defaults,
provider configs, component inputs, action attributes, scenario outputs,
component outputs, and teardown bodies. All names use lowercase compound
words with no separators (&lt;code&gt;jsonencode&lt;/code&gt;, &lt;code&gt;timeadd&lt;/code&gt;, &lt;code&gt;timeseries&lt;/code&gt;, &amp;hellip;).&lt;/p&gt;
&lt;p&gt;Functions marked with &lt;strong&gt;(impure)&lt;/strong&gt; may return different values on each
call. That&amp;rsquo;s intentional — scenarios are single-shot imperative runs,
not convergent plans.&lt;/p&gt;
&lt;h2 id="collections"&gt;Collections&lt;a class="anchor" href="#collections"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="concat"&gt;&lt;code&gt;concat&lt;/code&gt;&lt;a class="anchor" href="#concat"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;concat(lists...) → list&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Concatenate two or more lists into one.&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Parameter&lt;/th&gt;
 &lt;th&gt;Type&lt;/th&gt;
 &lt;th&gt;Description&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;lists...&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;list&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Variadic.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f7f7f7;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-hcl" data-lang="hcl"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#cf222e"&gt;concat&lt;/span&gt;&lt;span style="color:#1f2328"&gt;([&lt;/span&gt;&lt;span style="color:#0a3069"&gt;&amp;#34;a&amp;#34;], [&amp;#34;b&amp;#34;, &amp;#34;c&amp;#34;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;])&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;→ &lt;code&gt;[&amp;quot;a&amp;quot;, &amp;quot;b&amp;quot;, &amp;quot;c&amp;quot;]&lt;/code&gt;&lt;/p&gt;</description></item><item><title>Local development environments</title><link>https://orchard.pthm.dev/docs/guides/local-dev/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://orchard.pthm.dev/docs/guides/local-dev/</guid><description>&lt;h1 id="local-development-environments"&gt;Local development environments&lt;a class="anchor" href="#local-development-environments"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;Goal.&lt;/strong&gt; New engineers clone the repo, run one command, and have a working local
database with enough data to develop against. No &amp;ldquo;ask Slack for a SQL dump.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Why Orchard.&lt;/strong&gt; A single authoritative scenario replaces the tribal-knowledge
approach. The scenario lives in the repo and evolves with the schema.&lt;/p&gt;
&lt;h2 id="pattern-one-dev-scenario-per-service"&gt;Pattern: one &amp;ldquo;dev&amp;rdquo; scenario per service&lt;a class="anchor" href="#pattern-one-dev-scenario-per-service"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;scenarios/
└── dev.hcl&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;code&gt;dev.hcl&lt;/code&gt; is the canonical &amp;ldquo;everything you need to boot up locally.&amp;rdquo; Engineers
run it after applying migrations.&lt;/p&gt;</description></item><item><title>Providers</title><link>https://orchard.pthm.dev/docs/concepts/providers/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://orchard.pthm.dev/docs/concepts/providers/</guid><description>&lt;h1 id="providers"&gt;Providers&lt;a class="anchor" href="#providers"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;A &lt;strong&gt;provider&lt;/strong&gt; is the runtime that turns a declarative HCL action into a real side
effect. &lt;code&gt;builtin/postgres&lt;/code&gt; opens a connection and runs SQL. &lt;code&gt;builtin/http&lt;/code&gt; makes
HTTP requests. &lt;code&gt;builtin/exec&lt;/code&gt; spawns child processes. Custom providers can do
anything you can write a binary for.&lt;/p&gt;
&lt;h2 id="the-two-kinds-of-providers"&gt;The two kinds of providers&lt;a class="anchor" href="#the-two-kinds-of-providers"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Built-in providers&lt;/strong&gt; are compiled into the &lt;code&gt;orchard&lt;/code&gt; binary. They&amp;rsquo;re always
available and need no installation. Today that&amp;rsquo;s:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;builtin/postgres&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;builtin/http&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;builtin/exec&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;External providers&lt;/strong&gt; are separate binaries that speak Orchard&amp;rsquo;s
&lt;a href="../../extending/provider-protocol/"&gt;provider protocol&lt;/a&gt; over stdio. They&amp;rsquo;re
referenced by path:&lt;/p&gt;</description></item><item><title>Schema and types</title><link>https://orchard.pthm.dev/docs/extending/schema-and-types/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://orchard.pthm.dev/docs/extending/schema-and-types/</guid><description>&lt;h1 id="schema-and-types"&gt;Schema and types&lt;a class="anchor" href="#schema-and-types"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;A provider&amp;rsquo;s schema is its contract with Orchard. It describes what configuration
the provider accepts, what action types it handles, and what each action&amp;rsquo;s
attributes and outputs look like. Orchard uses the schema to type-check scenarios
at plan time before a single action runs.&lt;/p&gt;
&lt;h2 id="providerschema"&gt;&lt;code&gt;ProviderSchema&lt;/code&gt;&lt;a class="anchor" href="#providerschema"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f7f7f7;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#1f2328"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#0550ae"&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;:&lt;/span&gt; &lt;span style="color:#0a3069"&gt;&amp;#34;stripe&amp;#34;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#0550ae"&gt;&amp;#34;version&amp;#34;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;:&lt;/span&gt; &lt;span style="color:#0a3069"&gt;&amp;#34;0.3.0&amp;#34;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#0550ae"&gt;&amp;#34;protocol&amp;#34;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;:&lt;/span&gt; &lt;span style="color:#0a3069"&gt;&amp;#34;1&amp;#34;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#0550ae"&gt;&amp;#34;config&amp;#34;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;:&lt;/span&gt; &lt;span style="color:#1f2328"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#0550ae"&gt;&amp;#34;api_key&amp;#34;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;:&lt;/span&gt; &lt;span style="color:#1f2328"&gt;{&lt;/span&gt; &lt;span style="color:#0550ae"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;:&lt;/span&gt; &lt;span style="color:#0a3069"&gt;&amp;#34;string&amp;#34;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;,&lt;/span&gt; &lt;span style="color:#0550ae"&gt;&amp;#34;required&amp;#34;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;:&lt;/span&gt; &lt;span style="color:#cf222e"&gt;true&lt;/span&gt;&lt;span style="color:#1f2328"&gt;,&lt;/span&gt; &lt;span style="color:#0550ae"&gt;&amp;#34;description&amp;#34;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;:&lt;/span&gt; &lt;span style="color:#0a3069"&gt;&amp;#34;...&amp;#34;&lt;/span&gt; &lt;span style="color:#1f2328"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#1f2328"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#0550ae"&gt;&amp;#34;actions&amp;#34;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;:&lt;/span&gt; &lt;span style="color:#1f2328"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#0550ae"&gt;&amp;#34;charge&amp;#34;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;:&lt;/span&gt; &lt;span style="color:#1f2328"&gt;{&lt;/span&gt; &lt;span style="color:#f6f8fa;background-color:#82071e"&gt;...&lt;/span&gt; &lt;span style="color:#1f2328"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#0550ae"&gt;&amp;#34;refund&amp;#34;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;:&lt;/span&gt; &lt;span style="color:#1f2328"&gt;{&lt;/span&gt; &lt;span style="color:#f6f8fa;background-color:#82071e"&gt;...&lt;/span&gt; &lt;span style="color:#1f2328"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#1f2328"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#1f2328"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Field&lt;/th&gt;
 &lt;th&gt;Type&lt;/th&gt;
 &lt;th&gt;Description&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;name&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Unique provider identifier. Users see this in error messages.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;version&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Provider version. Freeform string; use semver.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;protocol&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Wire protocol version. &lt;strong&gt;Must be &lt;code&gt;&amp;quot;1&amp;quot;&lt;/code&gt;&lt;/strong&gt; today.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;config&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;map[string]AttrSchema&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Attributes accepted in the &lt;code&gt;provider &amp;quot;name&amp;quot; { }&lt;/code&gt; block.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;actions&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;map[string]ActionSchema&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Action types this provider handles, keyed by action type name.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="actionschema"&gt;&lt;code&gt;ActionSchema&lt;/code&gt;&lt;a class="anchor" href="#actionschema"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f7f7f7;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#1f2328"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#0550ae"&gt;&amp;#34;description&amp;#34;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;:&lt;/span&gt; &lt;span style="color:#0a3069"&gt;&amp;#34;Execute a SQL statement and capture the first row&amp;#34;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#0550ae"&gt;&amp;#34;attrs&amp;#34;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;:&lt;/span&gt; &lt;span style="color:#1f2328"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#0550ae"&gt;&amp;#34;query&amp;#34;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;:&lt;/span&gt; &lt;span style="color:#1f2328"&gt;{&lt;/span&gt; &lt;span style="color:#0550ae"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;:&lt;/span&gt; &lt;span style="color:#0a3069"&gt;&amp;#34;string&amp;#34;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;,&lt;/span&gt; &lt;span style="color:#0550ae"&gt;&amp;#34;required&amp;#34;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;:&lt;/span&gt; &lt;span style="color:#cf222e"&gt;true&lt;/span&gt; &lt;span style="color:#1f2328"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#1f2328"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#0550ae"&gt;&amp;#34;outputs&amp;#34;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;:&lt;/span&gt; &lt;span style="color:#1f2328"&gt;{&lt;/span&gt; &lt;span style="color:#0550ae"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;:&lt;/span&gt; &lt;span style="color:#0a3069"&gt;&amp;#34;any&amp;#34;&lt;/span&gt; &lt;span style="color:#1f2328"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#1f2328"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Field&lt;/th&gt;
 &lt;th&gt;Type&lt;/th&gt;
 &lt;th&gt;Description&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;description&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Free-text description. Surfaced in docs and errors.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;attrs&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;map[string]AttrSchema&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Attributes the action accepts.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;outputs&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;AttrSchema&lt;/code&gt; (optional)&lt;/td&gt;
 &lt;td&gt;Shape of what the action returns. Omit if the action has no outputs.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="attrschema"&gt;&lt;code&gt;AttrSchema&lt;/code&gt;&lt;a class="anchor" href="#attrschema"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f7f7f7;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#1f2328"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#0550ae"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;:&lt;/span&gt; &lt;span style="color:#0a3069"&gt;&amp;#34;string&amp;#34;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#0550ae"&gt;&amp;#34;required&amp;#34;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;:&lt;/span&gt; &lt;span style="color:#cf222e"&gt;true&lt;/span&gt;&lt;span style="color:#1f2328"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#0550ae"&gt;&amp;#34;default&amp;#34;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;:&lt;/span&gt; &lt;span style="color:#0a3069"&gt;&amp;#34;\&amp;#34;GET\&amp;#34;&amp;#34;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#0550ae"&gt;&amp;#34;description&amp;#34;&lt;/span&gt;&lt;span style="color:#1f2328"&gt;:&lt;/span&gt; &lt;span style="color:#0a3069"&gt;&amp;#34;HTTP method&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#1f2328"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Field&lt;/th&gt;
 &lt;th&gt;Type&lt;/th&gt;
 &lt;th&gt;Description&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;type&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Textual cty type expression. See below.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;required&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;bool&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Whether the attribute must be provided.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;default&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;JSON raw&lt;/td&gt;
 &lt;td&gt;Optional default value, JSON-encoded cty. Applied when the attribute is omitted.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;description&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Free-text description.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="type-expressions"&gt;Type expressions&lt;a class="anchor" href="#type-expressions"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Types are written as cty type expressions in string form:&lt;/p&gt;</description></item><item><title>External providers</title><link>https://orchard.pthm.dev/docs/providers/external/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://orchard.pthm.dev/docs/providers/external/</guid><description>&lt;h1 id="external-providers"&gt;External providers&lt;a class="anchor" href="#external-providers"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;External providers are binaries that live outside the &lt;code&gt;orchard&lt;/code&gt; tree and speak
Orchard&amp;rsquo;s &lt;a href="../../extending/provider-protocol/"&gt;provider protocol&lt;/a&gt; over stdio.
Scenarios use them exactly like built-in providers — the only difference is the
source string.&lt;/p&gt;
&lt;p&gt;If you want to &lt;strong&gt;build&lt;/strong&gt; a custom provider, see
&lt;a href="../../extending/"&gt;Extending Orchard&lt;/a&gt;. This page covers how to &lt;strong&gt;use&lt;/strong&gt; an
existing external provider from a scenario.&lt;/p&gt;
&lt;h2 id="declaring-an-external-provider"&gt;Declaring an external provider&lt;a class="anchor" href="#declaring-an-external-provider"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f7f7f7;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-hcl" data-lang="hcl"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#cf222e"&gt;required_providers&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; stripe &lt;span style="color:#0550ae"&gt;=&lt;/span&gt; { source &lt;span style="color:#0550ae"&gt;=&lt;/span&gt; &lt;span style="color:#0a3069"&gt;&amp;#34;exec:./bin/orchard-stripe&amp;#34;&lt;/span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The source format is &lt;code&gt;exec:&amp;lt;path&amp;gt;&lt;/code&gt;, where &lt;code&gt;&amp;lt;path&amp;gt;&lt;/code&gt; is an executable file:&lt;/p&gt;</description></item><item><title>Integration testing</title><link>https://orchard.pthm.dev/docs/guides/integration-testing/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://orchard.pthm.dev/docs/guides/integration-testing/</guid><description>&lt;h1 id="integration-testing"&gt;Integration testing&lt;a class="anchor" href="#integration-testing"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;Goal.&lt;/strong&gt; Shared, versioned setup for your integration test suite. Each test
needs a predictable slice of the database; Orchard produces that slice from a
scenario.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Why Orchard.&lt;/strong&gt; Integration tests tend to accumulate setup code in Go/Python/
whatever — &lt;code&gt;createMerchant(t, db, &amp;quot;Acme&amp;quot;)&lt;/code&gt; functions that duplicate what your
product already does. Orchard scenarios are a source of truth that both tests
and local dev can share.&lt;/p&gt;
&lt;h2 id="pattern-scenario-per-test-fixture"&gt;Pattern: scenario per test fixture&lt;a class="anchor" href="#pattern-scenario-per-test-fixture"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;test/
├── integration/
│ ├── fixtures/
│ │ ├── empty.hcl
│ │ ├── one_merchant.hcl
│ │ └── merchant_with_orders.hcl
│ └── ...&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Each test declares which fixture it needs and runs that scenario as part of
setup.&lt;/p&gt;</description></item><item><title>Wiring</title><link>https://orchard.pthm.dev/docs/concepts/wiring/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://orchard.pthm.dev/docs/concepts/wiring/</guid><description>&lt;h1 id="wiring"&gt;Wiring&lt;a class="anchor" href="#wiring"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;Wiring&lt;/strong&gt; is how outputs from one step flow into the inputs of the next, and how
Orchard decides the order to execute steps in. You never write a graph by hand —
you write references in expressions, and Orchard derives the graph from them.&lt;/p&gt;
&lt;h2 id="references"&gt;References&lt;a class="anchor" href="#references"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Four reference namespaces are in scope inside expressions:&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Form&lt;/th&gt;
 &lt;th&gt;Resolves to&lt;/th&gt;
 &lt;th&gt;Available when&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;var.&amp;lt;name&amp;gt;&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;A scenario or component variable.&lt;/td&gt;
 &lt;td&gt;Plan time — variables are resolved up front.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;action.&amp;lt;type&amp;gt;.&amp;lt;name&amp;gt;.&amp;lt;output&amp;gt;&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;An output from another action.&lt;/td&gt;
 &lt;td&gt;After that action completes.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;component.&amp;lt;type&amp;gt;.&amp;lt;name&amp;gt;.&amp;lt;output&amp;gt;&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;An output from a component instance.&lt;/td&gt;
 &lt;td&gt;After that component resolves.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;var.&amp;lt;name&amp;gt;&lt;/code&gt; (inside a component)&lt;/td&gt;
 &lt;td&gt;The component&amp;rsquo;s own variable.&lt;/td&gt;
 &lt;td&gt;As soon as the component runs.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;References can appear inside any attribute expression — in action bodies, provider
configs (variables only), output values, or component inputs.&lt;/p&gt;</description></item><item><title>Writing a provider</title><link>https://orchard.pthm.dev/docs/extending/writing-a-provider/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://orchard.pthm.dev/docs/extending/writing-a-provider/</guid><description>&lt;h1 id="writing-a-provider-in-go"&gt;Writing a provider in Go&lt;a class="anchor" href="#writing-a-provider-in-go"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;This page walks through building a small custom provider end-to-end. The
provider, &lt;code&gt;echo&lt;/code&gt;, has two actions:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;echo&lt;/code&gt; — returns its input attributes as outputs.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;randomize&lt;/code&gt; — takes a &lt;code&gt;prefix&lt;/code&gt; and returns &lt;code&gt;&amp;lt;prefix&amp;gt;-&amp;lt;random-hex&amp;gt;&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The source is tiny (~120 lines) but covers every part of the protocol: the
&lt;code&gt;schema&lt;/code&gt; subcommand, the RPC loop, method dispatch, and error handling.&lt;/p&gt;
&lt;h2 id="project-layout"&gt;Project layout&lt;a class="anchor" href="#project-layout"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;orchard-echo/
├── go.mod
└── main.go&lt;/code&gt;&lt;/pre&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f7f7f7;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;mkdir orchard-echo &lt;span style="color:#0550ae"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span style="color:#6639ba"&gt;cd&lt;/span&gt; orchard-echo
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;go mod init github.com/you/orchard-echo&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;No dependencies — this example talks JSON directly. Providers that want to use
Orchard&amp;rsquo;s types can import &lt;code&gt;github.com/pthm/orchard/pkg/protocol&lt;/code&gt;.&lt;/p&gt;</description></item><item><title>Composing components</title><link>https://orchard.pthm.dev/docs/guides/composing-components/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://orchard.pthm.dev/docs/guides/composing-components/</guid><description>&lt;h1 id="composing-components"&gt;Composing components&lt;a class="anchor" href="#composing-components"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;Goal.&lt;/strong&gt; Break a large scenario down into reusable components. Think of
components like functions: small, well-named, tested in isolation, reused across
scenarios.&lt;/p&gt;
&lt;h2 id="when-to-extract-a-component"&gt;When to extract a component&lt;a class="anchor" href="#when-to-extract-a-component"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Extract a component when you notice one of these signals:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Repetition.&lt;/strong&gt; The same 5–10 lines of HCL appear in three scenarios. Make
them a component.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Named concepts.&lt;/strong&gt; When you find yourself wanting to say &lt;em&gt;&amp;ldquo;a merchant&amp;rdquo;&lt;/em&gt;
instead of &lt;em&gt;&amp;ldquo;three SQL inserts and two HTTP calls&amp;rdquo;&lt;/em&gt;, you&amp;rsquo;ve found the
component boundary.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Scope variation.&lt;/strong&gt; A small concept today might need to expand. A component
gives you a single place to change behavior for all callers.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Don&amp;rsquo;t extract:&lt;/p&gt;</description></item><item><title>Plan vs run</title><link>https://orchard.pthm.dev/docs/concepts/plan-vs-run/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://orchard.pthm.dev/docs/concepts/plan-vs-run/</guid><description>&lt;h1 id="plan-vs-run"&gt;Plan vs run&lt;a class="anchor" href="#plan-vs-run"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Orchard has two execution modes. They share parsing, validation, and graph
construction but diverge on how they deal with providers and side effects.&lt;/p&gt;
&lt;h2 id="orchard-plan"&gt;&lt;code&gt;orchard plan&lt;/code&gt;&lt;a class="anchor" href="#orchard-plan"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;orchard plan&lt;/code&gt; is a &lt;strong&gt;read-only&lt;/strong&gt; preview. It:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Parses the scenario file and any component files it references.&lt;/li&gt;
&lt;li&gt;Loads provider schemas.&lt;/li&gt;
&lt;li&gt;Validates the scenario: every reference resolves, every required attribute
is set, every type matches.&lt;/li&gt;
&lt;li&gt;Builds and sorts the dependency graph.&lt;/li&gt;
&lt;li&gt;Prints the plan — what will run, in what order, with what inputs.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;code&gt;plan&lt;/code&gt; &lt;strong&gt;never configures a provider and never executes an action.&lt;/strong&gt; It cannot
open database connections, make HTTP requests, or spawn subprocesses. For
built-in providers, plan skips &lt;code&gt;Configure&lt;/code&gt; entirely. For external providers,
plan uses a short-lived schema probe that runs &lt;code&gt;&amp;lt;binary&amp;gt; schema&lt;/code&gt;, reads the
schema JSON, and exits immediately.&lt;/p&gt;</description></item><item><title>Publishing</title><link>https://orchard.pthm.dev/docs/extending/publishing/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://orchard.pthm.dev/docs/extending/publishing/</guid><description>&lt;h1 id="publishing-a-provider"&gt;Publishing a provider&lt;a class="anchor" href="#publishing-a-provider"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Once your provider works, users need a way to install and use it. Today that
means: give them a binary and have them reference it by path. A registry is
future work.&lt;/p&gt;
&lt;h2 id="consumption-model"&gt;Consumption model&lt;a class="anchor" href="#consumption-model"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Scenarios reference providers by source string:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f7f7f7;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-hcl" data-lang="hcl"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#cf222e"&gt;required_providers&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; stripe &lt;span style="color:#0550ae"&gt;=&lt;/span&gt; { source &lt;span style="color:#0550ae"&gt;=&lt;/span&gt; &lt;span style="color:#0a3069"&gt;&amp;#34;exec:./bin/orchard-stripe&amp;#34;&lt;/span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The path is resolved &lt;strong&gt;relative to the scenario file that declares the
provider&lt;/strong&gt;. Absolute paths work too. The binary must be executable.&lt;/p&gt;</description></item><item><title>Lifecycle and teardown</title><link>https://orchard.pthm.dev/docs/concepts/lifecycle/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://orchard.pthm.dev/docs/concepts/lifecycle/</guid><description>&lt;h1 id="lifecycle-and-teardown"&gt;Lifecycle and teardown&lt;a class="anchor" href="#lifecycle-and-teardown"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Orchard creates state. Good tools also clean it up. Every &lt;code&gt;orchard run&lt;/code&gt; writes
a &lt;strong&gt;run record&lt;/strong&gt; describing what happened; &lt;code&gt;orchard teardown&lt;/code&gt; uses that record
to reverse it.&lt;/p&gt;
&lt;h2 id="run-records"&gt;Run records&lt;a class="anchor" href="#run-records"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;After every &lt;code&gt;orchard run&lt;/code&gt;, Orchard writes a JSON file named
&lt;code&gt;orchard_&amp;lt;scenario&amp;gt;_run_&amp;lt;id&amp;gt;.json&lt;/code&gt; into the current directory. The filename&amp;rsquo;s
&lt;code&gt;&amp;lt;id&amp;gt;&lt;/code&gt; prefix is sortable — &lt;code&gt;YYYYMMDDTHHMMSSZ_&amp;lt;8hex&amp;gt;&lt;/code&gt; — so listing the
directory in your shell gives you runs in chronological order.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;$ orchard run scenarios/dev.hcl
scenario: dev
executing...
 ok action.postgres_query.create_merchant (4ms)
 ok action.postgres_query.create_product (2ms)
...

$ ls orchard_dev_run_*.json
orchard_dev_run_20260415T103045Z_a3f29e5b.json&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;The record captures:&lt;/p&gt;</description></item><item><title>exec</title><link>https://orchard.pthm.dev/docs/providers/exec/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://orchard.pthm.dev/docs/providers/exec/</guid><description>&lt;h1 id="exec"&gt;exec&lt;a class="anchor" href="#exec"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;Source:&lt;/strong&gt; &lt;code&gt;builtin/exec&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Shell command execution.&lt;/p&gt;
&lt;h2 id="provider-configuration"&gt;Provider configuration&lt;a class="anchor" href="#provider-configuration"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Name&lt;/th&gt;
 &lt;th&gt;Type&lt;/th&gt;
 &lt;th&gt;Required&lt;/th&gt;
 &lt;th&gt;Default&lt;/th&gt;
 &lt;th&gt;Description&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;dir&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;no&lt;/td&gt;
 &lt;td&gt;—&lt;/td&gt;
 &lt;td&gt;Default working directory for commands. Relative paths are resolved against the process cwd.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;env&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;map(string)&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;no&lt;/td&gt;
 &lt;td&gt;—&lt;/td&gt;
 &lt;td&gt;Default environment variables merged into every action&amp;rsquo;s env.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="actions"&gt;Actions&lt;a class="anchor" href="#actions"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="exec_run"&gt;&lt;code&gt;exec_run&lt;/code&gt;&lt;a class="anchor" href="#exec_run"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Run a program and capture stdout/stderr/exit_code.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Non-zero exit is an error by default&lt;/strong&gt; — the action fails and downstream
actions don&amp;rsquo;t run.&lt;/p&gt;
&lt;p&gt;Run a program with explicit arguments.&lt;/p&gt;</description></item><item><title>http</title><link>https://orchard.pthm.dev/docs/providers/http/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://orchard.pthm.dev/docs/providers/http/</guid><description>&lt;h1 id="http"&gt;http&lt;a class="anchor" href="#http"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;Source:&lt;/strong&gt; &lt;code&gt;builtin/http&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;HTTP request provider.&lt;/p&gt;
&lt;h2 id="provider-configuration"&gt;Provider configuration&lt;a class="anchor" href="#provider-configuration"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Name&lt;/th&gt;
 &lt;th&gt;Type&lt;/th&gt;
 &lt;th&gt;Required&lt;/th&gt;
 &lt;th&gt;Default&lt;/th&gt;
 &lt;th&gt;Description&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;base_url&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;no&lt;/td&gt;
 &lt;td&gt;—&lt;/td&gt;
 &lt;td&gt;Prepended to relative URLs in requests. When unset, URLs must be absolute.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;default_headers&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;map(string)&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;no&lt;/td&gt;
 &lt;td&gt;—&lt;/td&gt;
 &lt;td&gt;Headers added to every request; per-request headers take precedence.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;timeout_seconds&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;number&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;no&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;30&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Per-request timeout in seconds applied to the full request/response round-trip.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="actions"&gt;Actions&lt;a class="anchor" href="#actions"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="http_request"&gt;&lt;code&gt;http_request&lt;/code&gt;&lt;a class="anchor" href="#http_request"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Issue an HTTP request and capture the response.&lt;/p&gt;
&lt;p&gt;Simple GET against a relative path resolved via &lt;code&gt;base_url&lt;/code&gt;.&lt;/p&gt;</description></item><item><title>postgres</title><link>https://orchard.pthm.dev/docs/providers/postgres/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://orchard.pthm.dev/docs/providers/postgres/</guid><description>&lt;h1 id="postgres"&gt;postgres&lt;a class="anchor" href="#postgres"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;Source:&lt;/strong&gt; &lt;code&gt;builtin/postgres&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;PostgreSQL data operations.&lt;/p&gt;
&lt;h2 id="provider-configuration"&gt;Provider configuration&lt;a class="anchor" href="#provider-configuration"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Name&lt;/th&gt;
 &lt;th&gt;Type&lt;/th&gt;
 &lt;th&gt;Required&lt;/th&gt;
 &lt;th&gt;Default&lt;/th&gt;
 &lt;th&gt;Description&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;dsn&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;yes&lt;/td&gt;
 &lt;td&gt;—&lt;/td&gt;
 &lt;td&gt;PostgreSQL connection string (e.g. &lt;code&gt;postgres://user:pass@host:5432/db&lt;/code&gt;).&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="actions"&gt;Actions&lt;a class="anchor" href="#actions"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="postgres_copy"&gt;&lt;code&gt;postgres_copy&lt;/code&gt;&lt;a class="anchor" href="#postgres_copy"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Bulk-load rows into a table via PostgreSQL &lt;code&gt;COPY FROM STDIN&lt;/code&gt;. Dramatically
faster than row-by-row &lt;code&gt;INSERT&lt;/code&gt; for fixture data — a 10,000-row CSV loads
in a single network round-trip.&lt;/p&gt;
&lt;p&gt;Provide data inline via &lt;code&gt;data&lt;/code&gt; or reference a file via &lt;code&gt;file&lt;/code&gt;. The two are
mutually exclusive. &lt;code&gt;file&lt;/code&gt; paths are resolved relative to the scenario file
by the engine, so &lt;code&gt;file = &amp;quot;./fixtures/merchants.csv&amp;quot;&lt;/code&gt; works from any cwd.&lt;/p&gt;</description></item></channel></rss>