One directory with sixty scripts stopped being navigable, and the grouping is also the sandbox boundary:
Tools/unreal/ commandlets and the two map builders, with ue_common.py and ue_placement.py as the
shared imports (they need the engine)
Tools/blender/ builders, exporters, the FBX preset, the MPFB character pipeline, blender_screenshots
(they need the Blender Flatpak)
Tools/review/ the visual loop: render_screenshots.sh, judge_screenshot.py, hero_compare.py,
build_comparison_md.py, e2e_asset_check.py, hero_iterate.sh, visual_loop.py,
visual_targets.json
Tools/gen/ image and texture generation: the ComfyUI driver, deterministic texture writers,
reference fetching
Tools/input/ OS-level input injection
root _common.py, check-lfs.sh, addon_compat_probe.py, sibling_asset_audit.py, tests/
Every moved script now resolves the repository root as ../.. and puts the tools root plus its siblings on
sys.path, so 'import ue_common' still works from unreal/. The test suite bootstrap does the same for the five
folders. render_screenshots.sh takes the folder as a third argument to run_cmdlet, and the e2e driver,
hero_iterate.sh and the comparison generator were repointed.
51 README rows now link to their new location, the README gains a Layout section naming each folder's
sandbox, and the architecture notes and Blender README follow the moves.
Verified: 108 tests pass, prettier is clean, judge_screenshot.py and hero_compare.py run from their new
homes, and the e2e run was aborted mid-way (it had been rebuilding an empty DemoMap for 15 minutes) and is
being rerun against the new layout.
17 KiB
Release checks
Every version in TODO.md ends with release checks, and the scope and goal of each version are in ROADMAP.md. A version is not tagged until all of its checks pass. If a check fails, do not tag; open a patch task in TODO.md and report the failing check in CHANGELOG.md.
Record results in the table at the end of this file, with the date, the exact build under test, and the evidence (screenshot, log, or command output). A check without recorded evidence counts as failed.
General checks (every release)
-
Blender pre-check (before the engine pass).
Art/blender/site/site_assembly.pyraycasts both sidewalks and the designated crossing on a 1 m grid and reports holes and step heights. It is evidence, not the check: the engine traversal below is still required. -
Fresh checkout builds. Clone into a clean directory,
git lfs pull, build and package using only the documented external engine installation. No machine-specific paths, no uncommitted steps. -
No packaging errors. The packaged build launches, reaches gameplay, and quits cleanly. Logs contain no missing-asset, missing-map, or shader-compile errors.
-
Licensing. Every new asset has provenance in
THIRD_PARTY_NOTICES.md, or is recorded as unresolved and kept out of the build. -
Version discipline. Patch releases contain fixes, optimisation, docs, or tuning only — no new scope.
0.1.0 checks
- Realism first. Building placement, street width, sidewalk depth, material read and site identity match the reference photography. Compare side by side and note every deliberate deviation. "Looks right" is not evidence.
- Player traverses both the south-side frontage and the north-side frontage of the demo without falling through geometry, including the designated crossing. Walk the route twice: once normally, once with collision debug visualisation enabled.
- No blocking collision, no invisible walls, no gaps at sidewalk/road seams.
- Fresh checkout builds against the documented external engine installation.
- Linux build packaged and launched; controls documented in
Docs/and shown in-game. - Performance last. 60 FPS at 1440p per the performance check below — a floor every release meets, not the goal that shapes the content.
- Tag
v0.1.0, write theCHANGELOG.mdentry, then remove the completed section fromTODO.md(its goal stays inROADMAP.md).
Performance check (last)
Performance is the last check on purpose: realism leads the design and the frame budget only decides how much of it fits. It is still a floor — a release is not tagged below 60 FPS at 1440p without the owner's explicit approval.
Measured at 1440p on the development workstation: Bazzite, Ryzen 7 7700X, 64 GB RAM, RTX 5070 Ti 16 GB.
- Record the quality preset, the exact upscaling state (off, DLSS/TSR/FXAA and mode), and the engine version.
- Report frame rate without frame generation and with frame generation, separately.
- Target: 60 FPS at 1440p without frame generation.
- Capture a frame-time graph over a fixed traversal route, not a single sample. State the route.
Check-record template
| Version | Check | Result | Evidence | Date |
|---|---|---|---|---|
0.1.0 |
Traversal, both sides | PASS — Blender pre-check + in-engine swept transect, 0 holes, ground Z 317..395 | -qaselftest, TODO 0.1.0 notes |
2026-11-08 |
0.1.0 |
Placement vs references | PASS (with deliberate simplifications) | Section below, 2026-11-08 | 2026-11-08 |
0.1.0 |
Collision and packaging | PASS — no blocking collision, no invisible walls, no seam gaps (see audit note) | -qaselftest on the packaged build, 2026-11-08 |
2026-11-08 |
0.1.0 |
60 FPS at 1440p | PASS — 2.42 ms avg (414 fps), p99 3.01 ms at 2560×1440, TSR on, VSync off, no FG | -qaselftest perf capture, Docs/perf/0.1.0-walk-frametimes.csv |
2026-11-08 |
0.2.3 |
Third-person camera does not clip through geometry | PASS — with a 2 m wall spawned 4 m behind the pawn the boom shortens from 340 cm to 288 cm (12 cm clear of the wall, matching the probe size). -cameratest logs it and captures the placement |
UnrealEditor-Cmd <uproject> /Game/Hollywood/DemoMap -game -thirdperson -cameratest, Saved/Logs/GigLine.log |
2026-11-09 |
0.2.0 |
60 FPS at 1440p | PASS — 2.64 ms avg (379 fps), p50 2.54, p95 3.39, p99 3.76, max 4.05 ms at 2560×1440, TSR on, VSync off, no FG | -qaselftest perf capture, Docs/perf/0.2.0-walk-frametimes.csv |
2026-11-09 |
0.2.0 |
Debug overlay cost | PASS — same route with the F3 overlay drawn: 2.77 ms avg (361 fps), p50 2.64, p95 3.52, p99 3.87, max 4.43 ms; about 5 % heavier, still 6× the floor. The overlay is on for -perf/-qaselftest, off in the built demo |
Docs/perf/0.2.0-walk-frametimes-overlay.csv |
2026-11-09 |
0.1.0 |
Fresh checkout build | PASS — clean clone of main (4bc41e9), git lfs pull + check-lfs.sh OK (130 LFS files), both GigLineEditor and GigLine targets built with the documented engine |
/tmp/fresh-check, 2026-11-08 |
2026-11-08 |
0.1.0 |
Packaged Linux build | PASS — packaged Development build launches straight into DemoMap, no missing-asset/linker errors; controls shown in-game and in Docs/controls.md |
measurement recorded 2026-11-08; the capture was removed from the repository 2026-11-09 | 2026-11-08 |
0.1.0 — Placement vs references — record (2026-11-08)
Checked against the reference photography (Art/reference/) and the Geo measurements (Geo/verification/*). Build under test: current main content, DemoMap rendered via Tools/review/render_screenshots.sh (2026-11-08, Vulkan SM5, 1920×1080); engine positions probed from the DemoMap (commandlet, 2026-11-08).
Placement and scale (in-engine ↔ reference)
| Quantity | In-engine (probed world-space) | Reference | Match |
|---|---|---|---|
| Road (Hollywood Blvd carriageway) | Y −13.82..+10.47 m → 24.3 m | crossing ways 20.9–25.9 m | ✓ within range |
| South sidewalk strip | 7.3 m (bbox incl. kerb apron); built walkable strip 4.0 m per Art/blender/README.md |
12.6 m centreline offset; strip width from setback arithmetic | ✓ offset 12.5 m ≈ ref 12.6 m |
| North sidewalk strip | 8.6 m (bbox); built strip 5.3 m | 13.6 m centreline offset | ✓ offset 13.2 m ≈ ref 13.6 m |
| Kerbs | 3.3 m apron face to 0.13 m upstand | 0.15 m assumption; photo check pending (0.1.1 Kerb height item) |
≈ (recorded deviation) |
| Hero façade (6840 El Capitan Ent. Ctr.) | X −146.38..−120.34 m (26.0 m frontage), Y +13.0..+25.6 m from road centre (13.0 m deep) | 6840 setback 14.5 m; 25.75 m frontage (resolved) | ✓ frontage; setback ~1.5 m deeper than ref (recorded) |
| El Capitan Theatre (6838) | X −120.82..−82.10 m, Y +13.4..+68.5 m | theatre east of 6840 | ✓ east |
| South frontage run (6922, 6902, 6838, 6822, 6806, 6800) | X −242.76..−14.37 m, all Y +12..+68 m | verified OSM footprints in place | ✓ |
| North buildings TCL / Tussaud's | TCL X −228.9..−184.4, Y −94.3..−18.0; Tussaud's X −270.7..−228.0, Y −75.9..−18.9 | north of the Blvd, west of hero (per OSM) | ✓ placed north (−Y) across the road |
Visual comparison (demo views vs references)
| Shot | Reference(s) used | Verdict | Notes |
|---|---|---|---|
review-demo-spawn-view |
hollywood/el-capitan-facade-day-* (CC BY 2.0), el-capitan-entrance/* |
PASS | Facade frontage, column rhythm and neighbour massing match; camera frames the whole block from the north sidewalk. |
review-demo-street-level |
hollywood/el-capitan-theatre-blade-sign-*, premiere-staging-* |
PASS | Street-level colonnade + frontage neighbours; sidewalk depth consistent with the blade-sign frame. |
review-demo-crossing |
street-profile crossing s=130.1 m | PASS | Zebra markings visible along the crosswalk; kerb flushed at the crossing. |
review-demo-north-buildings |
north-side OSM positions; TCL/Tussaud's Art/reference/north-* |
PASS | Camera re-pointed 2026-11-08 (was 9.5 km west → 85% sky); buildings now framed. Flat blockout surfaces are the 0.1.4 scope. |
Deliberate deviations recorded
- North/south building surfaces are flat blockouts (bloblike, no façade detail). Detail texturing/façade style is the planned
0.1.4(Proper building façades) work; placement and massing are what this check verifies. - Kerb upstand 0.13 m as built vs 0.15 m assumed; the DEM cannot resolve a kerb — tracked in
0.1.1(Kerb height assumption). - Sidewalk surface detail (railings, pavers, domes) not modelled — outside
0.1.0scope. - Crossing ramps are kerb flushes, not graded ramps — the
0.1.1Crossing ramp gradient item. - Site identity (the neoclassical hero with motto band) matches the 2009 façade photograph and the 1922 Masonic elevation within blockout fidelity.
Pre-check method: Tools/review/judge_screenshot.py (vision model) flagged the simplified flat surfaces as "unexpected" — those flags are the deliberate deviations above, not placement errors. Final verdict is by human review of the shots in Screenshots/demo/.
0.1.0 — Collision and packaging — audit note (2026-11-08)
Run on the packaged build (GigLineQA, Development, Vulkan SM5) with -qaselftest.
- Transect (holes/gaps): 1456 samples over 16 rows — lane centres plus the kerb/road/sidewalk seam Ys (−1382, −1053, +718, +1047 and neighbours) and X −20000..−2000. Result 0 holes. (The old 84-sample check covered only 3 lane centres; the seam rows are what this check adds.)
- Invisible-wall probe: horizontal traces 30 m long, grounded at 160 cm above the local ground, along the road and both seam rows. Result 0/35 blocking hits inside 21 m — no invisible walls or misplaced blockers in the street envelope.
- Facade occlusion probe: from the road centre, 40 m traces sideways at walking height toward each frontage, required only where the map stages a building (the spans are listed in
AGigLineCharacterand mirrorTools/unreal/ue_build_demo_map.py). Result 0/9 directions without a blocking wall — the player cannot walk through the hero or the frontage. This probe found the hero façade had no simple collision at all (complex-only, so traces and capsule sweeps passed through it); it is nowUseComplexAsSimple. Auto-generated convex hulls were tried first and rejected: on a 95-part, 26 m façade they bulged into the street (the wall probe went 0/35 → 2/35). (First pass used a fixed Z 160 start; the street is at Z ~366, so the probe started inside the earth and reported every row as a dist-0 blocker. Grounding the probe fixed that measurement bug.) - Walk / reset / pause: 761 cm in 2 s (Z steady 456), reset 0 cm, pause
IsGamePaused()=1, unpause 0 — all PASS. - Packaging: the packaged build launches, reaches gameplay, and the QA run quits cleanly. The
GigLineShotActorscreenshot rounds are suppressed under-qaselftestso they cannot quit the run before the audit phases. - Caveat recorded: ground Z extremes (−12 m / 3000 cm) are trace-start/terrain-edge artifacts of the widened extent, not walkable holes — the walkable corridor is continuous (walk + transect both PASS).
0.1.0 — 60 FPS at 1440p — record (2026-11-08)
Build under test: packaged GigLineQA Development, UE 5.8.4, Vulkan SM5, NVIDIA 615.78.08 (RTX 5070 Ti), Bazzite, Ryzen 7 7700X, 64 GB RAM.
Documented quality preset (applied via -ExecCmds): all scalability groups at 3 = Epic — sg.ViewDistanceQuality 3, sg.ShadowQuality 3, sg.GlobalIlluminationQuality 3, sg.ReflectionQuality 3, sg.PostProcessQuality 3, sg.TextureQuality 3, sg.EffectsQuality 3, sg.FoliageQuality 3, sg.ShadingQuality 3.
Upscaling state (recorded from the run): r.AntiAliasingMethod=4 → TSR on, default screen percentage, r.VSync=0 (off), frame generation off/unavailable (r.Streamline.FrameGeneration.Mode absent → -999).
Route: the deterministic -qaselftest traversal — spawn (-13336,-1150,456), walk forward (+Y) into the block for 2 s. Frame times are captured every frame over that route (829 frames), not a single sample.
Result at 2560×1440:
| Metric | Value |
|---|---|
| Frames captured | 829 |
| Average | 2.42 ms → 414 fps |
| p50 | 2.38 ms |
| p95 | 2.71 ms |
| p99 | 3.01 ms (≈332 fps) |
| Max | 4.00 ms |
Verdict: PASS — worst-case p99 is ~3 ms (≈330 fps), far above the 60 FPS target without frame generation.
Variance note: two back-to-back runs measured ~9.2 ms (≈108 fps) when another game instance / busy compositor overlapped the capture; repeated clean runs (windowed and fullscreen, Wayland and X11 drivers, window focused) all measured ~2.4–2.5 ms. The high outlier is recorded here rather than hidden.
Reproduce:
# from Game/…/Saved: the run writes Profiling/perf-walk-frametimes.csv
./GigLine.sh -fullscreen -ResX=2560 -ResY=1440 -nosplash -qaselftest \
-ExecCmds="sg.ViewDistanceQuality 3,sg.ShadowQuality 3,sg.GlobalIlluminationQuality 3,sg.ReflectionQuality 3,sg.PostProcessQuality 3,sg.TextureQuality 3,sg.EffectsQuality 3,sg.FoliageQuality 3,sg.ShadingQuality 3"
Committed frame-time series: Docs/perf/0.1.0-walk-frametimes.csv.
0.1.5 re-measure with the façade kit in the map
Same route, same preset, packaged Development build, 2560×1440:
| Metric | 0.1.0 |
0.1.5 (kit + textures) |
|---|---|---|
| Average | 2.42 ms (414 fps) | 2.76 ms (363 fps) |
| p50 | 2.38 ms | 2.73 ms |
| p95 | 2.71 ms | 3.17 ms |
| p99 | 3.01 ms | 3.64 ms |
| Max | 4.00 ms | 4.62 ms |
The 625 kit actors and 8 generated textures cost about 12 % of frame time and still leave 363 fps average, p99 3.64 ms — roughly six times the 60 fps floor. Frame-time series: Docs/perf/0.1.5-kit-walk-frametimes.csv.
Measurement trap, again: runs that reported ~105 fps were two game instances overlapping (a previous launch had not exited). Confirm a single instance (pgrep -af Binaries/Linux/GigLine) before trusting a figure — 363 fps reproduced twice on a clean run.
0.1.0 — Fresh checkout build — record (2026-11-08)
Followed the documented steps in Docs/build.md exactly, into a clean directory with no prior state:
git clone https://git.allucanget.biz/zwitschi/gig-line.git /tmp/fresh-check
cd /tmp/fresh-check && git lfs install && git lfs pull
Tools/check-lfs.sh # -> "LFS check OK: 130 LFS-tracked file(s)"
cd /run/media/system/DATA/Engines/UE_5.8.4
Engine/Build/BatchFiles/Linux/Build.sh GigLineEditor Linux Development \
-project=/tmp/fresh-check/Game/GigLine/GigLine.uproject -WaitMutex
Engine/Build/BatchFiles/Linux/Build.sh GigLine Linux Development \
-project=/tmp/fresh-check/Game/GigLine/GigLine.uproject -WaitMutex
- Clone of
mainat4bc41e9; LFS objects fetched (DemoMap.umapis real UE package content, not a pointer). GigLineEditor→ Result: Succeeded (28.2 s); produced/tmp/fresh-check/Game/GigLine/Binaries/Linux/libUnrealEditor-GigLine.so.GigLine(game) → Result: Succeeded (26.9 s).- Engine: documented external install at
/run/media/system/DATA/Engines/UE_5.8.4(UE 5.8.4), system clang; no machine-specific paths beyond the documented-project=argument.
Verdict: PASS.
0.1.0 — Packaged Linux build + documented controls — record (2026-11-08)
Package: RunUAT BuildCookRun … -platform=Linux -clientconfig=Development -cook -build -stage -pak -archive -archivedirectory=/run/media/system/DATA/Builds/GigLineQA → EXIT=0 (Success).
Launch: ./GigLine.sh -windowed (plain, no map argument) → LogLoad: LoadMap: /Game/Hollywood/DemoMap?Name=Player — the packaged game opens the walkable demo directly (the default-map fix holds in a package, not just the editor). No LogLinker/missing-asset/failed-to-find errors in the run.
Controls documented and shown in-game:
Docs/controls.md— full binding table (WASD, mouse look, Space, R, Esc) plus how to test input headlessly.AGigLineHUDnow draws a control legend bottom-right every frame: "WASD move · Mouse look · Space jump · R reset · Esc pause".- Measured in the packaged build on 2026-11-08: the bottom-right text bbox was 426×12 px (a single right-aligned line), attributed text bottom-left. The capture has since been removed from the repository, so the numbers stand as the record.
Verdict: PASS.