/WEB-INF/base/entermedia is a fallbackdirectory target but the dir was empty, so git never tracked it and the setupLinks symlink dangled on any non-laptop checkout (createWar: 'Couldn't follow symbolic link .../base/entermedia'). Add a .gitkeep so the directory exists off-host.
thoughtframe: createWar copies platform bases directly (no symlink dependency)
Mirror the :damsel createWar: copy WEB-INF/base/{entermedia,emfrontend2,system, manager,mediadb} from :dam and WEB-INF/base/openedit from :cms directly, instead of following the setupLinks symlinks (host-specific absolute targets that dangle on a fresh checkout / CI). Keeps setupLinks for the local run. WAR now assembles on any host.
thoughtframe: createWar ships product code in WEB-INF/lib only (classpath = files())
The War task was routing the classpath dirs into WEB-INF/classes (579 files) where they shadow the jar and are never refreshed by the runtime's overlay upgrade. Mirror the :damsel createWar: classpath = files(), so only WEB-INF/lib carries product code.
:thoughtframe now declares a 25 toolchain and settings.gradle enables the foojay resolver, so Gradle provisions JDK 25 itself instead of depending on the host JDK being 25. Mirrors :damsel. Build is JDK-agnostic on any agent.
/WEB-INF/base/entermedia is a fallbackdirectory target but the dir was empty, so
git never tracked it and the setupLinks symlink dangled on any non-laptop checkout
(createWar: 'Couldn't follow symbolic link .../base/entermedia'). Add a .gitkeep so
the directory exists off-host.