<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Reference on SOW</title><link>https://sow.pgsty.com/docs/reference/</link><description>Recent content in Reference on SOW</description><generator>Hugo</generator><language>en</language><atom:link href="https://sow.pgsty.com/docs/reference/index.xml" rel="self" type="application/rss+xml"/><item><title>sow.yml Reference</title><link>https://sow.pgsty.com/docs/reference/config/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://sow.pgsty.com/docs/reference/config/</guid><description>&lt;p&gt;&lt;code&gt;sow.yml&lt;/code&gt; is the single configuration file of a managed workspace. It sits at the
workspace root, declares which repositories and distributions exist, and holds the
membership policy and signing settings that every build applies. Plain mode
(&lt;code&gt;sow create&lt;/code&gt;) never reads it.&lt;/p&gt;
&lt;p&gt;This page lists every field the parser accepts. Anything not listed here is rejected —
there are no undocumented keys and no keys reserved for future use.&lt;/p&gt;
&lt;h2 id="how-the-file-is-read"&gt;How the file is read&lt;/h2&gt;
&lt;p&gt;SOW parses &lt;code&gt;sow.yml&lt;/code&gt; with a strict decoder. Practically, that means:&lt;/p&gt;</description></item><item><title>Package References</title><link>https://sow.pgsty.com/docs/reference/package-ref/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://sow.pgsty.com/docs/reference/package-ref/</guid><description>&lt;p&gt;&lt;code&gt;sow rm&lt;/code&gt;, &lt;code&gt;sow show&lt;/code&gt;, and &lt;code&gt;sow where&lt;/code&gt; all take a &lt;code&gt;PACKAGE&lt;/code&gt; argument. This page defines
what you may write there. The same grammar applies to all three commands; only the
handling of an ambiguous name differs.&lt;/p&gt;
&lt;p&gt;Nothing here applies to &lt;code&gt;sow add&lt;/code&gt;, which takes filesystem paths, not references.&lt;/p&gt;
&lt;h2 id="the-five-forms"&gt;The five forms&lt;/h2&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Form&lt;/th&gt;
					&lt;th&gt;Example&lt;/th&gt;
					&lt;th&gt;Matches&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;Content digest&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;sha256:d06d7f23b9cf...b98b1229&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Exactly one package object&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;RPM coordinate&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;rpm:pev2-0:1.23.0-1.noarch&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Exactly one RPM&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;DEB coordinate&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;deb:libpq5=18.3-1.pgdg12+1:amd64&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Exactly one DEB&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Filename&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;pev2-1.23.0-1.noarch.rpm&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;The package stored under that filename&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Bare name&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;pev2&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Every version and architecture of that name&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The first three are exact: they name one object and either hit it or fail. The last two
are conveniences that may match more than one object.&lt;/p&gt;</description></item><item><title>Repository Layout</title><link>https://sow.pgsty.com/docs/reference/layout/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://sow.pgsty.com/docs/reference/layout/</guid><description>&lt;p&gt;SOW&amp;rsquo;s on-disk layout is fixed. There is no &lt;code&gt;path:&lt;/code&gt; setting, no template, and no way to
relocate a repository — every path is derived from the workspace root, a validated name,
and a constant relative segment. This page is the complete map, so you know what to serve,
what to copy, and what to keep private.&lt;/p&gt;
&lt;h2 id="plain-mode"&gt;Plain mode&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;sow create&lt;/code&gt; writes indexes next to the packages and touches nothing else. The directory
you point it at stays a flat repository: packages and metadata share one level.&lt;/p&gt;</description></item><item><title>Exit Codes</title><link>https://sow.pgsty.com/docs/reference/exit-codes/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://sow.pgsty.com/docs/reference/exit-codes/</guid><description>&lt;p&gt;Every &lt;code&gt;sow&lt;/code&gt; command exits with one of seven codes. They are stable, they are the same for
every command, and they are meant to be branched on in scripts — the distinction between
&amp;ldquo;this failed&amp;rdquo; and &amp;ldquo;this was correctly refused&amp;rdquo; is the whole point of having more than one
nonzero code.&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Code&lt;/th&gt;
					&lt;th&gt;Meaning&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;0&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Complete success, or an idempotent no-op&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;1&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Runtime I/O, parser, renderer, or unknown internal error&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;2&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Usage, workspace discovery, or configuration error&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;3&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Partial success: at least one item committed, at least one failed&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;4&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Write lock unavailable — held and &lt;code&gt;--no-wait&lt;/code&gt;, or the timeout expired&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;5&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Integrity or recovery error, or &lt;code&gt;check&lt;/code&gt; judged the result not deliverable&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;6&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Expected rejection: conflict, protected, no match, incompatible architecture&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Human-readable results go to stdout; warnings and diagnostics go to stderr. Each code has
a stable message prefix on stderr, and a matching &lt;code&gt;class&lt;/code&gt; in
&lt;a href="https://sow.pgsty.com/docs/reference/json/"&gt;JSON output&lt;/a&gt;:&lt;/p&gt;</description></item><item><title>JSON Output</title><link>https://sow.pgsty.com/docs/reference/json/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://sow.pgsty.com/docs/reference/json/</guid><description>&lt;p&gt;Every command that produces data accepts &lt;code&gt;--json&lt;/code&gt;. The output is a single line on stdout
carrying a versioned envelope, so you can pipe it straight into &lt;code&gt;jq&lt;/code&gt; without worrying
about which command produced it.&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;sow status --json
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nt"&gt;&amp;#34;schema&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;sow.cli/v1&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nt"&gt;&amp;#34;command&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;status&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nt"&gt;&amp;#34;ok&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nt"&gt;&amp;#34;repository&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;pigsty&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nt"&gt;&amp;#34;operation&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;result&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:{&lt;/span&gt;&lt;span class="nt"&gt;&amp;#34;repository&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;pigsty&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nt"&gt;&amp;#34;status&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;clean&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nt"&gt;&amp;#34;ready_to_copy&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nt"&gt;&amp;#34;desired_revision&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;built_generation&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nt"&gt;&amp;#34;dirty_dists&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:[],&lt;/span&gt;&lt;span class="nt"&gt;&amp;#34;dirty_reasons&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:[],&lt;/span&gt;&lt;span class="nt"&gt;&amp;#34;pending&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:{&lt;/span&gt;&lt;span class="nt"&gt;&amp;#34;count&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nt"&gt;&amp;#34;bytes&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;recent_operation&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:{&lt;/span&gt;&lt;span class="nt"&gt;&amp;#34;id&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;8632724976452398569&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nt"&gt;&amp;#34;kind&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;add&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nt"&gt;&amp;#34;state&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;done&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;created_at&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;2026-08-04T04:07:17.665377Z&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nt"&gt;&amp;#34;updated_at&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;2026-08-04T04:07:18.293848Z&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;repository_locked&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="nt"&gt;&amp;#34;errors&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:[]}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;(Line-wrapped here for readability; the real output is one line.)&lt;/p&gt;
&lt;h2 id="the-envelope"&gt;The envelope&lt;/h2&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;Meaning&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;schema&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;string&lt;/td&gt;
					&lt;td&gt;Always &lt;code&gt;sow.cli/v1&lt;/code&gt;. Check it before parsing anything else.&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;command&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;string&lt;/td&gt;
					&lt;td&gt;The command as invoked, including the subcommand: &lt;code&gt;add&lt;/code&gt;, &lt;code&gt;repo ls&lt;/code&gt;, &lt;code&gt;config show&lt;/code&gt;.&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;ok&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;bool&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;true&lt;/code&gt; when &lt;code&gt;errors&lt;/code&gt; is empty. Equivalent to exit code &lt;code&gt;0&lt;/code&gt;.&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;repository&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;string or null&lt;/td&gt;
					&lt;td&gt;The selected repository, or &lt;code&gt;null&lt;/code&gt; for workspace-wide and plain-mode commands.&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;operation&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;string or null&lt;/td&gt;
					&lt;td&gt;The operation ID for write commands, &lt;code&gt;null&lt;/code&gt; for read-only ones.&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;result&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;object or null&lt;/td&gt;
					&lt;td&gt;Command-specific payload, described below.&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;errors&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;array&lt;/td&gt;
					&lt;td&gt;Zero or more &lt;code&gt;{code, class, message}&lt;/code&gt; objects.&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;All seven fields are always present. &lt;code&gt;result&lt;/code&gt; is &lt;code&gt;null&lt;/code&gt; only when the command failed
before it could produce anything — an unknown flag, for example.&lt;/p&gt;</description></item><item><title>Compatibility</title><link>https://sow.pgsty.com/docs/reference/compatibility/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://sow.pgsty.com/docs/reference/compatibility/</guid><description>&lt;p&gt;SOW writes standard rpm-md and Debian archive metadata, so the question is not whether a
client &lt;em&gt;can&lt;/em&gt; read it but which clients have actually been verified against it. This page
lists the tested matrix, the platforms the binary runs on, and the handful of constraints
that will bite you if you ignore them.&lt;/p&gt;
&lt;h2 id="package-manager-clients"&gt;Package manager clients&lt;/h2&gt;
&lt;p&gt;Every row below was exercised end to end against a repository built by SOW: refresh the
index, list packages, and install one.&lt;/p&gt;</description></item></channel></rss>