# A bounded sanctuary with a continuing horizon

The **Hillside sanctuary** is the first implemented world-boundary study. It joins
the existing atrium, lantern passage and sun court to a valley arcade and cypress
garden. A surrounding landscape supplies hills, settlements, a winding skyline and
an aqueduct instead of empty background. Walk stays inside authored floors and
respects parapets, planting beds, benches, columns and pools.

Select **The hillside sanctuary** in Voxel Light Lab. **Valley arcade**, **Valley
overlook**, **Cypress garden** and **Arrival gate** reveal the addition. The original
**Woven atrium** and first **Beyond the lantern passage** remain reference scenes;
they retain their free navigation behavior. This study is one resident world, not
streaming, collision physics or overlapping lighting zones.

## Reachable architecture

The eastern high window of the sun court becomes a full-height doorway in the new
scene only. The adjacent bench is removed there so the opening is actually usable.
A double colonnade continues along a stone terrace. Repeated arches, ceiling ribs,
textured paving, sheltered benches and low parapets frame a valley view. A connected
garden has cypresses, planters, seating and a shallow water rill. A bronze gate makes
the old entrance an intentional boundary with a distant view.

The active world extends sideways rather than adding another long wing. Its bounds
are approximately X -8.425 to 25.55, Y -.55 to 10.99 and Z -27.5 to 14.485. The longest
span is about 41.985 units. Balanced requests 118 voxels, about .3558 units per voxel,
and 499,200 padded base cells. The original atrium uses about .3561 units per voxel.
At all presets the new base-cell count stays below 3.2 times that original fixture;
the explicit Balanced cap is 550,000 cells. Cells are not total GPU memory bytes.

Actual volume bounds and spacing are exposed from Three.js VXGI's public volume
state, alongside the host's calculation. Tests check that the actual transport
volume covers the nearby architecture and does not include the distant landscape.
Shadow fitting covers the active bounds at preserved texel density. Requests above
256 voxels or 4096 shadow-map dimensions are still rejected.

## Distant context and its limits

`world.backdrop` is a separately owned Object3D. It uses layer 2; the main camera
includes that layer, while the voxel volume explicitly includes layer 0 and uses
`world.bounds`. The backdrop casts and receives no nearby shadows. Its stylized
vertex-colour materials and distance fog provide visual context without pretending
to supply distant diffuse light transfer. The camera's far plane is 420 units.

A continuous, warped heightfield gives the skyline an organic silhouette. Small
settlements, domes, towers, cypress silhouettes and an aqueduct establish nearer
and farther layers. The landscape is not explorable geometry. It has no streamed
residency policy, physically simulated vegetation or distant GI. The foreground
parapets and walking envelope deliberately keep visitors in the detailed place.

The backdrop is detached on scene changes and its geometry/materials are disposed
with the world. Tests count shared texture release and repeated scene transitions.
Repeated transitions also exposed upstream allocation retention; the pinned
adapter cleanup is documented in [UPSTREAM-RESOURCE-CLEANUP.md](UPSTREAM-RESOURCE-CLEANUP.md).
Renderer allocation counters are reported as renderer-tracked allocations; they
are not a measurement of complete driver VRAM or a device-loss qualification.

## Authored walking

`createWalkBoundary({areas, obstacles, radius, name})` is a reusable planar boundary
module. Areas are finite rectangles with optional eye-height ranges; each is inset
by the body radius. Join areas with overlaps wider than two radii so that inset
rectangles still meet across a doorway. Obstacles are circles or rectangles with
optional height ranges; rectangular corner tests account for the body radius.

The controller subdivides travel into at most .04-unit steps, tests full movement,
then slides along clear axes. This prevents boost movement from crossing thin
barriers. Camera position and target receive the same constrained displacement.
The framework connects the module through the optional controller callback
`constrainPosition(position, displacement)`.

The sanctuary has connected ground-floor areas plus separate upper-gallery areas.
Eye height remains fixed. Stairs do not raise the camera, gravity is absent, and
there is no general triangle collision or dynamic-object physics. Use the gallery
camera to visit that level. Orbit remains an inspection mode; returning to Walk
from an invalid position restores an authored camera. Do not interpret a scene
without navigation metadata as contained.

Tours use authored routes rather than walking physics. The full sanctuary rail is
sampled against the boundary and obstacles. Starting a tour from a remote camera
uses a history-resetting camera cut to the nearest authored route point rather
than interpolating through walls to reach it.

## Verification

`make check` includes thin-obstacle tunnelling, edge sliding, connected floor
crossings, authored cameras and level containment, 6,000 rail samples, distant-layer
exclusion, density budgets and resource disposal. The original atrium's geometry
hash remains unchanged.

`npm run test:boundaries` commissions actual WASD across the eastern doorway and
back, sustained movement into outer boundaries, the gallery level, camera studies,
quality changes, repeated scene transitions, mobile layout and both GPU/direct
paths. Its ABBA comparison uses the same court camera for the first-radius and
sanctuary worlds. Results and captures are written under ignored `artifacts/`.
Frame intervals are end-to-end measurements, not GPU timestamps.

## Next expansion boundary

The next substantial active region still needs lighting zones, shared doorway
coverage and explicit residency/unloading budgets. Distant context is a way to
compose a finite place, not permission to enlarge the transport volume without
limit. Keep the original fixtures and measured spacing when that work begins.

## Local commissioning sample

The final repeat-switch run held at 16 geometries and 42 textures for three
successive sanctuary visits. Renderer-tracked bytes were approximately 194 MB,
with about 1.3 KiB change per round trip rather than the earlier large retention.
The local same-court ABBA sample measured a sanctuary/first-radius mean frame-interval
ratio of about 1.073. These measurements describe one headless Apple Metal 3 run
under local load, not complete driver memory or a portable frame-rate guarantee.
The report preserves the individual timings and actual volume coverage.

The continuation is [From the sanctuary to a world](WHOLE-WORLD.md): the implementation order, separate resource budgets, ownership contracts and out-and-back acceptance procedure.
