diff --git a/Directory.Build.props b/Directory.Build.props
new file mode 100644
index 0000000..c8a3c67
--- /dev/null
+++ b/Directory.Build.props
@@ -0,0 +1,10 @@
+
+
+ $(CULTLIB_ROOT)
+ $(MSBuildThisFileDirectory)..\CultLib
+
+ 42dce3611a81adc5c5fac54cadbaa5637d6022d3
+ C:\Program Files\Git\cmd\git.exe
+ git
+
+
diff --git a/Directory.Build.targets b/Directory.Build.targets
new file mode 100644
index 0000000..46d436a
--- /dev/null
+++ b/Directory.Build.targets
@@ -0,0 +1,30 @@
+
+
+
+
+ <_CultLibReference Include="@(ProjectReference)"
+ Condition="$([System.String]::Copy('%(Filename)').StartsWith('GameCult.')) or '%(Filename)' == 'CultMath'" />
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/README.md b/README.md
index 837d9ed..a6b1d7e 100644
--- a/README.md
+++ b/README.md
@@ -153,3 +153,14 @@ tract curriculum is tracked in
prior-work notes in
[`docs/utterance-parity-research.md`](docs/utterance-parity-research.md). Agent
handoff state lives in [`state/spine.yaml`](state/spine.yaml).
+
+## Building against CultLib
+
+Builds are pinned to CultLib 2.0.0 (tag `cultlib-unity-v2.0.0`, revision `42dce3611a81adc5c5fac54cadbaa5637d6022d3`); the build fails if the CultLib checkout differs or is dirty. Create a pinned worktree and point the build at it:
+
+```powershell
+git -C worktree add --detach cultlib-unity-v2.0.0
+dotnet build -p:CultLibRoot= # or set CULTLIB_ROOT=
+```
+
+Without an override the sibling `..\CultLib` checkout is used and must itself be at that tag.
diff --git a/src/AquaSynth.Core/AquaSynth.Core.csproj b/src/AquaSynth.Core/AquaSynth.Core.csproj
index 4a1ae4d..38833f3 100644
--- a/src/AquaSynth.Core/AquaSynth.Core.csproj
+++ b/src/AquaSynth.Core/AquaSynth.Core.csproj
@@ -22,8 +22,8 @@
-
-
+
+
diff --git a/src/AquaSynth.Faust/AquaSynth.Faust.csproj b/src/AquaSynth.Faust/AquaSynth.Faust.csproj
index a9602cb..2f99a95 100644
--- a/src/AquaSynth.Faust/AquaSynth.Faust.csproj
+++ b/src/AquaSynth.Faust/AquaSynth.Faust.csproj
@@ -17,7 +17,7 @@
-
+