Find libfaust.so on Linux, libfaust.dylib on macOS, libfaust.dll/faust.dll on
Windows; join PATH with Path.PathSeparator; accept FaustLibraryPath or
AQUASYNTH_FAUST_LIBRARY as an explicit library file. Platform default homes
replace the unconditional C:\Program Files\Faust.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Directory.Build.props names CultLibRoot (CULTLIB_ROOT, else the sibling checkout) and pins CultLibRevision to cultlib-unity-v2.0.0 (42dce361). Directory.Build.targets fails the build unless that checkout is at the pin and clean, as Aetheria's guard does. Project references use CultLibRoot.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
CultLib's CultCacheMessagePack.Create and OpenAsync now always read the store,
and CultCacheOpenOptions.PullOnOpen no longer exists.
- CultCachePatchDocumentStore.WriteDefaultAsync and
AquaSynthDaemonService.WriteReceiptAsync write single-document files. They
open (which hydrates), remove every record other than the one they write,
upsert, and flush; the flush replaces the file atomically. Before this,
Create never pulled, so their PullOnOpen = false was already a no-op.
- IpaTrialResults and SpeechDistributedTraining passed File.Exists-style
PullOnOpen values; hydrating a missing store is empty, so the option goes.
- AquaSynthDaemonServiceTests drops PullOnOpen = true.
Globals: nothing in CultLib invents a [CultGlobal] record any more. AquaSynth
never relied on that: its three global types are positional records with no
parameterless constructor, which the old invention skipped, and every one is
written explicitly and read back by explicit key or GetAll.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
DingsProtocol.MutexName ("Local\GameCult.AquaSynthDings.Playback.v1")
had no in-repo reader. The runtime mutex the Dings host actually takes
is a separately hardcoded literal at tools/AquaSynthDingsHost/Program.cs:3
(same string value, duplicated rather than referencing the constant),
so the constant's own symbol and value were both confirmed dead before
deletion, not just the symbol.
Kill-attempt searches (all empty except the known duplicate):
- rg -n "MutexName" . (in AquaSynth) -> only the declaration
- rg -n "GameCult.AquaSynthDings.Playback.v1" . -> declaration + the
hardcoded Program.cs duplicate + PipeName (a distinct, still-read
constant using the same base string without the "Local\" prefix)
- rg in AquaSynth-rs, weksa -> no matches (exit 1)
- rg -n "GameCult\.AquaSynthDings\.Playback\.v1" --hidden across all of
F:/Projects (exit 0) -> only the census
doc's citation and the two AquaSynth source hits above; zero external
consumers repo-wide
PipeName (the sibling constant, read by both DingsHostClient.cs and
DingsPlaybackHost.cs for the named pipe) is untouched.
Did NOT touch AquaSynth part of REC-019 (BirdSyrinxGolf): tools/BirdSyrinxGolf
is a real standalone research CLI (own .csproj, AquaSynth.sln entry),
documented as a live, human-run tool in state/map.yaml, state/evidence.jsonl,
and research/bird-syrinx-golf/README.md, and its runs drove two shipped
AquaSynth.Core patch-language features (tissue-valve acoustic source,
realtime control curves per evidence.jsonl 2026-05-28 entries). The census
recommendation's evidence class (no code-level caller) is the wrong test for
a tool whose only intended caller is a human running it directly; deleting
it would destroy a documented capability, not dead code. No sibling repo
(checked via `grep -rl AquaSynth --include=*.csproj` across all of
F:/Projects) references BirdSyrinxGolf either way, so this is not a
close call resolved by silence -- the in-repo evidence itself disqualifies
the recommendation.
Verification: dotnet build src/AquaSynth.Dings/AquaSynth.Dings.csproj
succeeds (0 errors). AquaSynth.Core has a pre-existing, unrelated
MessagePack-source-generator build failure (523 CS0246 errors) that
reproduces identically with this change stashed out, confirming it is
baseline and not caused by this edit; the wider tools/AquaSynthDingsHost
and tools/AquaSynthDingsMcp builds could not be exercised because they
transitively depend on AquaSynth.Core.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Every Faust render, and every trial-loop lane, runs dotnet with a fresh
DOTNET_CLI_HOME under the temp directory. The SDK's first-run experience
appends "<home>\.dotnet\tools" to the persisted user PATH each time, and
DOTNET_SKIP_FIRST_TIME_EXPERIENCE does not stop that part. Seventy-nine
dead entries had accumulated (9,634 chars), past cmd's environment limit,
so anything spawned through cmd lost the tail of PATH — node included.
DOTNET_ADD_GLOBAL_TOOLS_TO_PATH=0 is the switch that governs the PATH
write. Set it everywhere a throwaway dotnet home is used; telemetry
opt-out rides along for the renderer since these homes never persist.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>