<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Design on SOW</title><link>https://sow.pgsty.com/docs/design/</link><description>Recent content in Design on SOW</description><generator>Hugo</generator><language>en</language><atom:link href="https://sow.pgsty.com/docs/design/index.xml" rel="self" type="application/rss+xml"/><item><title>Design Principles</title><link>https://sow.pgsty.com/docs/design/principles/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://sow.pgsty.com/docs/design/principles/</guid><description>&lt;p&gt;SOW is not primarily a metadata generator. It is an ownership and state-transition system
whose output happens to be APT and RPM repositories. The following principles keep that
system small enough to reason about.&lt;/p&gt;
&lt;h2 id="one-owner-for-every-durable-fact"&gt;One owner for every durable fact&lt;/h2&gt;
&lt;p&gt;Every durable fact has one scope and one authority:&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Fact&lt;/th&gt;
					&lt;th&gt;Owner&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;Package bytes and package identity&lt;/td&gt;
					&lt;td&gt;Repository&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Desired memberships and Built state&lt;/td&gt;
					&lt;td&gt;Repository&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Generation and Changeset&lt;/td&gt;
					&lt;td&gt;Repository&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Publication attempt and applied checkpoint&lt;/td&gt;
					&lt;td&gt;Repository + target prefix&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Remote inventory, grace, and delete evidence&lt;/td&gt;
					&lt;td&gt;Repository + target prefix&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;State is not silently shared across Repositories or publish prefixes. The same package may
therefore exist once in each Repository or target. That is intentional: local deduplication
must not create distributed ownership.&lt;/p&gt;</description></item><item><title>System Model</title><link>https://sow.pgsty.com/docs/design/model/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://sow.pgsty.com/docs/design/model/</guid><description>&lt;p&gt;The model is deliberately layered. Configuration expresses intent, the database records
owned state, and the public tree is a deterministic projection. None of those layers may
quietly become a substitute for another.&lt;/p&gt;
&lt;h2 id="object-hierarchy"&gt;Object hierarchy&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;Workspace
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── Repository
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ ├── Package Object
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ ├── Dist
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ │ └── Membership -&amp;gt; Package Object
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ ├── Desired state
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ ├── Built Generation
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ └── Retained Generation references
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;└── Publication Target
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; └── Repository + provider + prefix
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="workspace"&gt;Workspace&lt;/h3&gt;
&lt;p&gt;A Workspace supplies discovery, configuration, and coordination. It owns &lt;code&gt;sow.yml&lt;/code&gt;, the
private &lt;code&gt;.sow/&lt;/code&gt; directory, and stable lock paths. It is not a package deduplication domain.&lt;/p&gt;</description></item><item><title>Single-Payload Repository</title><link>https://sow.pgsty.com/docs/design/single-payload/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://sow.pgsty.com/docs/design/single-payload/</guid><description>&lt;p&gt;The 0.3 development design changes the physical RPM layout while preserving the ownership
model introduced in v0.2. Its objective is precise: within one Repository and within each
publish prefix, every live Package Object has exactly one payload path.&lt;/p&gt;
&lt;div class="alert alert-warning" role="alert"&gt;&lt;div class="h4 alert-heading" role="heading"&gt;Development design&lt;/div&gt;
&lt;p&gt;This page describes the implemented 0.3 source layout. The released v0.2 operational
reference still describes C2 view-local hardlinks. Read &lt;a href="https://sow.pgsty.com/docs/design/evolution/"&gt;Design Evolution&lt;/a&gt;
before migrating an existing v0.2 repository.&lt;/p&gt;
&lt;/div&gt;
&lt;h2 id="canonical-tree"&gt;Canonical tree&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;&amp;lt;repo&amp;gt;/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── pool/ # canonical package payloads
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ └── &amp;lt;prefix&amp;gt;/&amp;lt;source&amp;gt;/&amp;lt;filename&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;└── dists/ # metadata-only projections
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ├── &amp;lt;rpm-dist&amp;gt;/&amp;lt;arch&amp;gt;/repodata/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; └── &amp;lt;deb-dist&amp;gt;/&amp;lt;component&amp;gt;/binary-&amp;lt;arch&amp;gt;/
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;There is no canonical &lt;code&gt;release/&lt;/code&gt;, &lt;code&gt;reposync/&lt;/code&gt;, per-view &lt;code&gt;pool/&lt;/code&gt;, per-generation package
tree, or snapshot package tree. &lt;code&gt;pool/ + dists/&lt;/code&gt; is the complete relocation and publication
unit.&lt;/p&gt;</description></item><item><title>Publication &amp; Recovery</title><link>https://sow.pgsty.com/docs/design/publication/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://sow.pgsty.com/docs/design/publication/</guid><description>&lt;p&gt;Building and publishing are separate state transitions. A build produces a target-neutral
Generation. Publication applies that Generation to one provider prefix and records enough
evidence to recover without guessing.&lt;/p&gt;
&lt;h2 id="ownership-split"&gt;Ownership split&lt;/h2&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Repository-scoped&lt;/th&gt;
					&lt;th&gt;Target-prefix-scoped&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;Package Object&lt;/td&gt;
					&lt;td&gt;Publication Attempt&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Desired and Built state&lt;/td&gt;
					&lt;td&gt;Applied Checkpoint&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Generation and Changeset&lt;/td&gt;
					&lt;td&gt;Remote inventory&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Retained payload/metadata references&lt;/td&gt;
					&lt;td&gt;Grace and deletion evidence&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The split prevents a successful filesystem publication from being treated as proof about
R2, and prevents one target&amp;rsquo;s partial attempt from contaminating another target.&lt;/p&gt;</description></item><item><title>Compatibility Boundaries</title><link>https://sow.pgsty.com/docs/design/compatibility/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://sow.pgsty.com/docs/design/compatibility/</guid><description>&lt;p&gt;&amp;ldquo;Compatible&amp;rdquo; is too broad to be a useful engineering claim. A package may install while a
mirror tool refuses the same metadata; a tree may work on POSIX disk while multiplying
objects after upload. SOW therefore treats compatibility as a set of independent gates.&lt;/p&gt;
&lt;h2 id="the-layers"&gt;The layers&lt;/h2&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Layer&lt;/th&gt;
					&lt;th&gt;Question&lt;/th&gt;
					&lt;th&gt;Required evidence&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;Format&lt;/td&gt;
					&lt;td&gt;Is the metadata valid rpm-md / Debian archive syntax?&lt;/td&gt;
					&lt;td&gt;parser and structural validation&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Ordinary client&lt;/td&gt;
					&lt;td&gt;Can &lt;code&gt;apt&lt;/code&gt;, &lt;code&gt;dnf&lt;/code&gt;, or &lt;code&gt;yum&lt;/code&gt; refresh, resolve, download, verify, and install?&lt;/td&gt;
					&lt;td&gt;real client run&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Mirror tool&lt;/td&gt;
					&lt;td&gt;Can the named mirror tool materialize the repository safely?&lt;/td&gt;
					&lt;td&gt;that exact tool and version&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Relocation&lt;/td&gt;
					&lt;td&gt;Does a whole-root copy remain byte-closed and consumable?&lt;/td&gt;
					&lt;td&gt;copy + manifest + client run&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;HTTP/proxy&lt;/td&gt;
					&lt;td&gt;Are relative URLs normalized inside the same prefix without traversal or double encoding?&lt;/td&gt;
					&lt;td&gt;target HTTP matrix&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Storage&lt;/td&gt;
					&lt;td&gt;Do object identity, conditional operations, listing, caching, and deletion match the state machine?&lt;/td&gt;
					&lt;td&gt;real provider protocol test&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;No row inherits PASS from another row or from an earlier Repository layout.&lt;/p&gt;</description></item><item><title>Design Evolution</title><link>https://sow.pgsty.com/docs/design/evolution/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://sow.pgsty.com/docs/design/evolution/</guid><description>&lt;p&gt;SOW&amp;rsquo;s old documents came from three materially different systems. Preserving them without
a version boundary made contradictory statements look simultaneous. This page keeps the
useful decisions while making their scope explicit.&lt;/p&gt;
&lt;h2 id="timeline"&gt;Timeline&lt;/h2&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Line&lt;/th&gt;
					&lt;th&gt;Primary problem&lt;/th&gt;
					&lt;th&gt;Physical model&lt;/th&gt;
					&lt;th&gt;Disposition&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;V1 experiment (July 2026)&lt;/td&gt;
					&lt;td&gt;absorb Pigsty&amp;rsquo;s existing APT/YUM trees and remote publishing workflow&lt;/td&gt;
					&lt;td&gt;Git/CAS, route-aware projections, edge/provider contracts&lt;/td&gt;
					&lt;td&gt;archived research and implementation evidence&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;v0.2.0&lt;/td&gt;
					&lt;td&gt;ship a compact local Plain + Managed repository manager&lt;/td&gt;
					&lt;td&gt;root Pool plus C2 view-local RPM hardlinks&lt;/td&gt;
					&lt;td&gt;released; operational docs remain live&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;0.3 development&lt;/td&gt;
					&lt;td&gt;publish one canonical payload per Repository/target prefix&lt;/td&gt;
					&lt;td&gt;root Pool plus metadata-only views and target-scoped publication&lt;/td&gt;
					&lt;td&gt;implemented in source; release evidence pending&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="what-survived-v1"&gt;What survived V1&lt;/h2&gt;
&lt;p&gt;The broad V1 program explored repository adoption, remote publication, provider fencing,
edge authorization, migration, recovery, and large-repository evidence. Much of its exact
Git/CAS/route model was replaced, but several principles survived:&lt;/p&gt;</description></item></channel></rss>