Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Lab 3: Boundary Check

Lab 3 connects a registered questphase to mod-owned world streaming. The player follows a journal map pin to a checkpoint, enters a smaller trigger, then leaves a wider trigger to complete the quest.

RecordValue
Structural validation date2026-08-09
Runtime test dateNot yet recorded

Implementation status: both supplied checkpoints are Structurally validated after all twelve checkpoint CR2W resources were cooked and serialized back with WolvenKit 8.19.0. Their native types, graph, NodeRef chain, sector placement records, outline buffers, journal paths, and block descriptors are exact. The test chapter checks mounting, streaming, marker/GPS presentation, trigger behavior, and save/reload behavior in game.

Follow Author Boundary Check in WolvenKit to expand the start checkpoint. Then use Test Boundary Check to bind the candidate, saves, visible observations, and logs.

What the lab demonstrates

The quest uses state-shaped trigger predicates so reloads on either side of a boundary are testable:

entry -> completed == 0?
  True  -> activate quest, phase, reach objective, and pin
        -> wait until player IsInside the 25 m reach volume
        -> retire pin, succeed reach, activate leave objective
        -> wait until player IsOutside the 110 m leave volume
        -> succeed leave and phase -> completed = 1 -> succeed quest -> end
  False -> end

IsInside and IsOutside are not synonyms for Entered and Exited. The former describe current state; the latter describe a transition event. Vanilla resources contain all three shapes, but the behavior of this new combination still needs its own runtime evidence.

Prerequisites and downloads

Complete Lab 1 and read:

Use Cyberpunk 2077 2.31a for Windows (GOG), WolvenKit 8.19.0, ArchiveXL 1.27.0, RED4ext 1.30.0, and redscript 0.5.31.

Do not install the two checkpoints together. They register the same six depot paths. Use an untouched save created before either was first installed.

Resource ownership

ResourceDepot pathOwns
Root questphasemod\cqa\cqa003\phases\cqa003.questphasePhase graph and root prefab declaration
Journalmod\cqa\cqa003\journal\cqa003.journalQuest, phase, two objectives, and the reach-objective map pin
Onscreen localizationmod\cqa\cqa003\localization\en-us\onscreens\cqa003.jsonTitle, two objectives, and pin caption
Streaming blockmod\cqa\cqa003\world\cqa003_boundary.streamingblockQuest and AlwaysLoaded sector descriptors
Quest sectormod\cqa\cqa003\world\cqa003_boundary.streamingsectorReach and leave trigger node definitions and placements
AlwaysLoaded sectormod\cqa\cqa003\world\cqa003_always_loaded.streamingsectorStatic marker definition and placement
ArchiveXL registrationCQA_Lab03_BoundaryCheck.archive.xlRoot attachment, journal/localization merge, and streaming block registration

ArchiveXL registers the block, not its two sectors separately. Descriptor data paths make the sectors reachable from the block.

The root questphase declares one local prefab root:

#cqa003_pr_boundary

The world records use its mod-owned full form:

$/mod/cqa/cqa003/#cqa003_pr_boundary

Nested references are:

#cqa003_tr_reach
#cqa003_tr_leave
#cqa003_mp_checkpoint

The quest graph uses the local trigger refs because its root declares the prefab. Sector nodeRefs and QuestPrefabRefHash records use the full child refs. This single-root design avoids making a claim about dependency inheritance across external child phases.

World layout

OwnerCategory / levelNodePlacementGeometry or orientation
Quest sectorQuest / 255worldTriggerAreaNode reach(-1000.02, 1497.2208, 2.3)16-point, 25 m radius, 12 m high
Quest sectorQuest / 255worldTriggerAreaNode leave(-1000.02, 1497.2208, 0.3)20-point, 110 m radius, 16 m high
AlwaysLoaded sectorAlwaysLoaded / 1worldStaticMarkerNode(-1000.02, 1497.2208, 8.3)yaw 88.6°

These are inherited test-site values, not a promise that the location is reachable or the volumes are appropriate on every game build. The acceptance matrix—not structural inspection—governs runtime claims about the marker, both outlines, their vertical coverage, and the finite padded Quest descriptor bounds.

The site is the outdoor recycling-station cabinet row in Watson/Kabuki. A focused vanilla sector, TweakDB, and localization chain identifies the Allen Street terminal and linked marker about 90 m southwest of the lab center; Test Boundary Check explains how to verify that ordinary route before installing the candidate. Those identities and coordinates are Observed in vanilla. The retained matrix governs runtime claims about practical access, the route, and the new 110 m boundary.

Each Quest placement’s NodeIndex selects the corresponding local entry in nodes; the marker placement selects the only marker node. This is true for the compact mod-owned sectors. It is not a universal parallel-array rule for all vanilla sectors.

Authoritative trigger geometry

Each trigger owns a questTriggerNotifier_Quest and an AreaShapeOutline. The outline’s encoded buffer contains point count, four-float points, and height. Repository validation decodes that buffer and requires it to match the intended 16/20 points and 12/16 heights.

Do not change only the visible points or height. Retained vanilla exports show that the displayed JSON points can be defaults while the buffer carries different authoritative geometry. If the outline changes, regenerate or reserialize all three representations through a tool path that updates the buffer, then inspect the cooked result.

MaxStreamingDistance is named and compared. UkFloat1 is retained as an opaque field; this book does not rename it to a streaming distance without evidence.

Journal and marker contract

quests
└── minor_quest
    └── cqa003
        └── cqa003_01
            ├── cqa003_01_obj_reach
            │   └── cqa003_01_qmp_checkpoint
            └── cqa003_01_obj_leave
Journal entryLocalization keyEnglish text
Quest titlecqa_cqa003_titleBoundary Check
Reach objectivecqa_cqa003_objective_reachReach the marked checkpoint.
Leave objectivecqa_cqa003_objective_leaveLeave the checkpoint area.
Map-pin captioncqa_cqa003_mappin_checkpointBoundary Check checkpoint

The journal map pin references #cqa003_mp_checkpoint and enables GPS. The static marker places an anchor; the journal entry owns player-facing mappin data; quest Mappin Manager nodes activate and deactivate that journal state. None of those records substitutes for the other two.

Both Lab 3 Mappin Manager nodes set disablePreviousMappins: 0. This isolated lab has no deliberate previous route to replace; activation and inactivation come from the nodes’ Active and Inactive sockets.

Exact questphase

The figure is generated from the completed checkpoint. Validation resolves socket handles and requires exactly 16 nodes and 16 edges.

IDRED node typeDecisive payloadPurpose
0questInputNodeDefinitioninterface In1Enter registered root
1questOutputNodeDefinitionterminating Out1End success and bypass routes
10questConditionNodeDefinitioncqa003_completed Equal 0Bypass a completed save
11questJournalNodeDefinitionquest pathActivate Boundary Check
12questJournalNodeDefinitionphase pathActivate phase
13questJournalNodeDefinitionreach objectiveActivate reach objective
14questMappinManagerNodeDefinitionmap-pin path, disable previous 0Activate/track checkpoint pin
15questPauseConditionNodeDefinitionplayer IsInside #cqa003_tr_reachWait for current inside state
16questMappinManagerNodeDefinitionsame map-pin pathInactivate checkpoint pin
17questJournalNodeDefinitionreach objectiveSucceed reach objective
18questJournalNodeDefinitionleave objectiveActivate leave objective
19questPauseConditionNodeDefinitionplayer IsOutside #cqa003_tr_leaveWait for current outside state
20questJournalNodeDefinitionleave objectiveSucceed leave objective
21questJournalNodeDefinitionphase pathSucceed phase
22questFactsDBManagerNodeDefinitionset cqa003_completed = 1 exactlyPersist one-shot completion
23questJournalNodeDefinitionquest pathSucceed Boundary Check

Every node has one explained responsibility. The graph does not contain a hidden hub, child phase, scene, community, device, or script dependency.

Exact edge contract

SourceDestinationMeaning
0.Out10.InEnter guard
10.False1.InCompleted-save bypass
10.True11.ActiveFirst-run activation
11.Out12.ActiveActivate phase
12.Out13.ActiveActivate reach objective
13.Out14.ActiveActivate pin
14.Out15.InArm reach condition
15.Out16.InactiveRetire pin after reach
16.Out17.SucceededSucceed reach objective
17.Out18.ActiveActivate leave objective
18.Out19.InArm leave condition
19.Out20.SucceededSucceed leave objective
20.Out21.SucceededSucceed phase
21.Out22.InWrite completion fact
22.Out23.SucceededSucceed quest
23.Out1.InTerminate successful route

The only persistent fact is cqa003_completed. Quest, journal, active-node, world, and marker state can also be save-backed even though they are not FactsDB names.

Common failure modes

SymptomCheck firstBoundary
Quest never appearsInstalled archive plus loose .archive.xl, root phase/journal/localization paths, ArchiveXL and RED4ext logsStructural validation does not establish runtime activation
Objective appears but pin does notJournal map-pin path, marker NodeRef, AlwaysLoaded descriptor, and Mappin Manager state socketDo not infer GPS or sector behavior from the objective alone
Pin appears at the wrong heightMarker placement Z, yaw, terrain accessibility, and clean starting saveJudge inherited coordinates from the exact candidate’s retained runtime evidence
Entering does nothingQuest-sector descriptor root, full child ref, local condition ref, player activator flag, trigger notifier, and decoded reach bufferJSON points alone are not geometry evidence
Leave completes immediatelyConfirm the starting save is inside the outer volume when leave activates and the condition is IsOutsideA dirty save or bad vertical coverage changes the initial state
Area works until streaming awayFinite Quest bounds, sector logs, return route, and NodeRef resolutionOne successful nearby crossing does not prove unload/reload behavior
Quest reactivates after reloadcompleted write order, guard comparison, exact installed build, and untouched/completed save identityConsole resets are diagnostic, not clean acceptance

Lab sequence: All labs · Next: Author Boundary Check in WolvenKit.