planner: four-strate owner plan spawns (L66); pinned 2-strate regression fixture

- Core caps each passage mouth reach to its own strate's usable content band (owner
  DA_Strate1 exports ReachMax=5000 owner voxels, which put the SW->FI lower mouth 79.5 m
  below FI, inside TN).
- Unreal adapter: SW route search keeps the old 64 m candidates first, then a bounded
  single-mouth search with shorter lengths; logs candidate/rejection counts.
- Internal-chain passage floor/support tweaks (only with >2 strates): ripple 1-2 4.78->2.90 cm,
  2-3 3.57->0.10 cm. Interfaces still 0/3 walkable (59/3/2 unsupported).
- verify.py: legacy tiers use Standalone/data/regression/owner_world_2strate_l61.json; new
  four-strate stage reads its expectations from owner_world.json (currently red on interfaces).
- Unreal trace L14 vs HEAD, same assets (16-chunk FlatPlain): 12.20 vs 12.56 worker-s; no x2.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016dhxM43dnWvUu2B5Ph1iG1
This commit is contained in:
Fr0zkaandClaude Opus 5.5 committed 2026-10-26 22:13:22 +01:00
1 parent 47148e0a0d
commit 5e2fc53d39
17 files changed
+745 -73

No files matched your search

@@ -1950,6 +1950,10 @@ int main(int argc,char** argv)
&&stratum.passageCapabilities.hasNativeLatticeField;});
const auto actualRecipe=hasNativeLatticeRecipe?std::string_view("lattice")
:hasNativeCavesRecipe?std::string_view("caves")
:requestedRecipe=="surface-world"&&hasSurfaceWorldPlan
?std::string_view("surface-world")
:requestedRecipe=="floating-islands"&&hasFloatingIslands
?std::string_view("floating-islands")
:hasFloatingIslands?std::string_view("floating-islands")
:hasSurfaceWorldPlan?std::string_view("surface-world")
:std::string_view("missing");
@@ -2994,6 +2994,11 @@ namespace StandaloneStreamBenchmark
appendDetrendedProfile(radii,start,windowSamples);
double localPeriod=0.0;
const double localAmplitude=sinusoidAmplitude(windowSamples,localPeriod);
std::printf("[PassageWallRippleWindow] id=%s start_m=%.3f "
"period_m=%.3f amplitude_m=%.4f coverage=%zu/%zu threshold_m=0.035\n",
passage.stableId.c_str(),start,localPeriod,localAmplitude,
radii.size(),static_cast<std::size_t>(WindowLengthMetres/
SampleSpacingMetres)+1);
if(localAmplitude>audit.localPeakAmplitudeMetres)
{
audit.localPeakAmplitudeMetres=localAmplitude;
+44 -4
View File
@@ -47,7 +47,9 @@ namespace StandaloneWorldAssemblyPrototype
std::uint64_t& gradeRejected,std::uint64_t& placementRejected,
std::uint64_t& sweepRejected,std::uint32_t coreVoxelSizeMicrons,
std::int64_t arrivalRadiusSubvoxels,
std::int64_t departureRadiusSubvoxels,std::string& error)
std::int64_t departureRadiusSubvoxels,std::string& error,
bool multiStratePlan=false,
bool fallbackSearch=false)
{
using namespace VoxelForgeCore;
constexpr std::int64_t PlayerRadiusQ=348; // 0.34 m in Core's 0.25 m voxel scale.
@@ -130,6 +132,26 @@ namespace StandaloneWorldAssemblyPrototype
}
candidateCenterSpacing=32;
}
else if(fallbackSearch&&(arrivalRadiusSubvoxels>0||departureRadiusSubvoxels>0))
{
// Keep the original route candidates first. If their composed-field
// sweep fails, use short, origin-biased chords that can meet the one
// bounded mouth used by an outer strate.
constexpr std::int64_t placementMarginQ=12*WorldAssemblySubvoxelsPerVoxel;
const std::int64_t availableLengthVoxels=std::max<std::int64_t>(1,
(arrivalRadiusSubvoxels+departureRadiusSubvoxels-placementMarginQ)
/WorldAssemblySubvoxelsPerVoxel);
const std::int32_t maximumHalfLength=static_cast<std::int32_t>(std::min<std::int64_t>(128,
std::max<std::int64_t>(1,availableLengthVoxels/2)));
candidateHalfLengths.clear();
for(const std::int32_t numerator:std::array<std::int32_t,6>{{8,7,6,5,4,3}})
{
const std::int32_t halfLength=std::max(1,maximumHalfLength*numerator/8);
if(std::find(candidateHalfLengths.begin(),candidateHalfLengths.end(),halfLength)
==candidateHalfLengths.end())candidateHalfLengths.push_back(halfLength);
}
candidateCenterSpacing=32;
}
const double coreVoxelMetres=static_cast<double>(coreVoxelSizeMicrons)/1000000.0;
if(std::getenv("VOXELFORGE_AUDIT_LEGACY_ROUTE_GRADE"))
{
@@ -245,12 +267,20 @@ namespace StandaloneWorldAssemblyPrototype
candidate.endpointProximityCost+=static_cast<std::uint64_t>(
targetRadiusQ*targetRadiusQ)*64ull;
}
else if(arrivalRadiusSubvoxels>0&&departureRadiusSubvoxels>0
else if(((arrivalRadiusSubvoxels>0&&departureRadiusSubvoxels>0)
||(!fallbackSearch&&multiStratePlan
&&arrivalRadiusSubvoxels==0
&&departureRadiusSubvoxels>0)
||(fallbackSearch&&multiStratePlan
&&(arrivalRadiusSubvoxels>0||departureRadiusSubvoxels>0)))
&&(index==0||index==32))
{
const std::uint64_t radiusSquared=static_cast<std::uint64_t>(
xQ*xQ+yQ*yQ);
candidate.endpointProximityCost+=radiusSquared*(index==0?16ull:1ull);
if(index==0&&arrivalRadiusSubvoxels>0)
candidate.endpointProximityCost+=radiusSquared*16ull;
if(index==32&&departureRadiusSubvoxels>0)
candidate.endpointProximityCost+=radiusSquared;
}
const auto inRadius=[](std::int64_t xValue,std::int64_t yValue,std::int64_t radius)
{return radius<=0||xValue*xValue+yValue*yValue<=radius*radius;};
@@ -412,6 +442,16 @@ namespace StandaloneWorldAssemblyPrototype
++sweepAttempt;
++sweepRejected;
}
if(!fallbackSearch&&multiStratePlan
&&(arrivalRadiusSubvoxels>0||departureRadiusSubvoxels>0))
{
std::printf("[WorldAssemblerRouteFallback] reason=bounded-single-mouth arrival_radius_m=%.3f departure_radius_m=%.3f\n",
arrivalRadiusSubvoxels*coreVoxelMetres/WorldAssemblySubvoxelsPerVoxel,
departureRadiusSubvoxels*coreVoxelMetres/WorldAssemblySubvoxelsPerVoxel);
return BuildFiniteStrateRoute(recipe,stratum,tested,gradeRejected,placementRejected,
sweepRejected,coreVoxelSizeMicrons,arrivalRadiusSubvoxels,
departureRadiusSubvoxels,error,multiStratePlan,true);
}
std::printf("[WorldAssemblerRouteSearchFailed] tested=%llu grade_rejected=%llu sweepable_candidates=%llu sweep_rejected=%llu last_blocked=%llu last_unsupported=%llu last_grade_failures=%llu\n",
static_cast<unsigned long long>(tested),static_cast<unsigned long long>(gradeRejected),
static_cast<unsigned long long>(candidates.size()),static_cast<unsigned long long>(sweepRejected),
@@ -847,7 +887,7 @@ namespace StandaloneWorldAssemblyPrototype
std::uint64_t routeCandidates=0,routeGradeRejected=0,routePlacementRejected=0,routeSweepRejected=0;
if(!BuildFiniteStrateRoute(recipe,stratum,routeCandidates,routeGradeRejected,
routePlacementRejected,routeSweepRejected,owner.CoreVoxelSizeMicrons,
arrivalRadiusQ,departureRadiusQ,error))return false;
arrivalRadiusQ,departureRadiusQ,error,owner.Manager->GetLayout().Num()>2))return false;
std::printf("[WorldAssemblerRoutePlan] candidates=%llu grade_rejected=%llu placement_rejected=%llu sweep_rejected=%llu accepted_points=%zu capsule_m=0.34x1.76 corridor_radius_vox=4 support_probe_points=5 minimum_support_probes=%u arrival_radius_m=%.3f departure_radius_m=%.3f status=PASS\n",
static_cast<unsigned long long>(routeCandidates),
static_cast<unsigned long long>(routeGradeRejected),