fix #483: restore far terrain and close OVERHAUL with #484 deferred
Some checks failed
CI / linux-portable (push) Successful in 3m36s
CI / windows-gate (push) Failing after 6m52s
CI / release (push) Has been skipped

This commit is contained in:
Erik 2026-09-06 10:22:51 +02:00
parent e0ba3e7f2c
commit 3ebb120dd2
20 changed files with 700 additions and 100 deletions

View file

@ -0,0 +1,89 @@
# Campaign OVERHAUL v2 — owner-directed closeout, 2026-09-06
**CLOSED — OWNER ACCEPTED WITH CARRIED ISSUES.** After the connected testing
and the #483 distance repair, the owner directed: "Ok defer that as an issue.
I want to close out the campain, commit and merge this worktree with main and
then push main to remote gita". This is the final merge-gate disposition:
accept the campaign with #484 deferred, not a claim that every remaining G4
checklist row was individually run or passed. Unreported rows remain
unreported; known failed evidence remains FAIL.
## Shipped scope
S1-S5 provide the geometry and cross-cell membership products, single retail
frame walk, depth/alpha ordering, and consumer/material cutovers. Gate-found
repairs cover outdoor buildings, portal reveal, dungeon lighting, held items,
cathedral exterior collision and finally missing Far-terrain registration.
FW's predecessor ledger remains historical; its old clip model is not the
shipping architecture. M4 as a whole is not declared complete.
The last bounded fix, #483, carries the existing height-table terrain bounds
through Near/Far construction and all Far conversions, registers terrain
independently of buildings, retains it during demotion and removes it during
full retirement. It changes no radius, fog, LOD or retail walk algorithm.
The owner used the repaired build; the subsequently reported mountain flicker
is separately retained as #484, with no confirmed cause or speculative fix.
## Final candidate verification
- Release App/test build: PASS, zero warnings/errors.
- Narrow production-path regression suite: 106 passed / 0 failed / 0 skipped,
using the explicit recipe10 package. The initial 105/1 run selected the
obsolete default recipe8 package; both reports are retained under
`artifacts/483-far-terrain/`. No source change masked that mismatch.
- Final no-build App hermetic-filter regression: **7,161 passed / 0 failed /
0 skipped**. Report:
`artifacts/483-closeout-app-hermetic/483-closeout-app-hermetic.trx`.
Filter excludes Lane InstalledDat, Linux, Manual, Timing, Live and
PreparedPackage. This is an App result, not a new complete-solution run.
- Post-owner independent retail review: **PASS**, no blocking finding.
Independent architecture/lifetime review: **PASS**, no blocking finding.
Both reviewed the six production/two test files; no further fix round.
Review scope and named/paired retail evidence are in
`483-far-terrain-registration-contract.md`; neither review certifies #484.
- App SHA256:
`869BA14CB2C610E006C80BDFFCBD75629339A3486B8B98D7708B23050700FF34`.
Core SHA256:
`B0E676482A45ED77C2AB050BBBC988139D1BF6D99308C42ABB0CFF440D39A0BC`.
Package `acdream-v10-s5-c5.pak` SHA256:
`4E0FA6C589ECE12E13099A56385077964961EC52F888BC9161C6F5D34829B59B`.
- Owner launches: `logs/owner-g4-20260906-r2/` (PID17856) and
`logs/owner-g4-20260906-r3/` (PID24476), same repaired build.
No new automated visual/PNG PASS is invented for this closeout.
## Preserved evidence and carried work
The previous integrated source `eea83ac884d0b0fd74d86a17a16d7d5d93f64d94`
passed Release, 17,094 complete-solution hermetic tests, repeated unchanged
geometry/membership and Signature8 checks, lifecycle/reconnect and R6.
Those results are historical integrated evidence, not a full-suite run on
the final #483 delta.
Canonical InstalledDat remains **376 pass / 8 known failures / 1 known skip**.
The five final visual controls retain 51 inspected PNGs and their narrow,
provisional verdicts. Four controls exited0; the wall control exited
**0xC0000374 (process FAIL)** despite graceful network logout. No native stack
establishes its cause or equates it with the AMD notice. See
`c1c-integrated-verification.md`,
`s5-final-lifecycle-stability-verification.md` and
`s5-final-visual-controls.md` for exact limitations, paths and sealed manifests.
Carried without claiming repair: **#484** distant silhouette flicker (explicit
owner deferral); **#422** native shutdown symptom; **#477** AMD crash notice /
unconfirmed initiating cause; the known InstalledDat failures/skip; the known
retail cathedral exterior-slab leak; owner-deferred FPS/C2; and the existing
divergence-register residuals including **AP-149** (Far static/building
closure). #483 adds no intentional retail deviation and retires none of
those residuals. Remaining unreported G4 matrix rows are not fabricated PASS
rows; the owner's closeout instruction supersedes waiting for that session.
## Integration authorization
Commit the owned candidate and documentation, merge the campaign branch into
main, then push **origin/main** to Gitea
`https://git.snakedesert.se/erik/acdream.git`. Do not push the GitHub remote.
Preserve main's unrelated untracked files and WorldBuilder submodule checkout;
no reset, clean, stash, history rewrite or force push. Actual Git completion
is reported after the operations succeed, not asserted by this pre-commit note.
Retail is untouched. Its presence does not block a build by the owner's
explicit override; a running ACDream still must not have its binaries replaced.

View file

@ -5,6 +5,50 @@ Owner order: **implement, owner tests, then review**. This overrides the normal
pre-owner review order for this bounded fix; no claim of review closure follows
from implementation or successful compilation.
**Latest owner safety correction (2026-09-06):** retail being open does NOT
block building/testing/launching ACDream. The owner explicitly directed
"Just ignore if retail is up or not, does not affect our building. Now build
and launch." Leave retail untouched. Only a running ACDream blocks overwriting
its build or launching a duplicate. This supersedes all older both-client
absence requirements below; those describe the earlier handoff, not current
permission. The requested launch is manual, with review after the owner's test.
## Final disposition — CLOSED, 2026-09-06
The owner directed campaign closeout and integration, with subsequent mountain
flicker deferred as #484. After the owner session, independent retail and
architecture/lifetime reviews both **PASS**, no blocking findings and no new
fix round. Retail review verified unchanged get_land_limits bounds, independent
Far terrain admission, all three metadata-preserving conversion paths and
unchanged walk/LOD policy against named retail and the paired evidence below.
Lifetime review verified the sole owner, retained publication receipt,
demotion/full-removal split, late-clear non-resurrection and production-route
regressions. Neither review certifies #484 or closes AP-149.
Final no-build App hermetic-filter regression: **7,161/0/0**; report
`artifacts/483-closeout-app-hermetic/483-closeout-app-hermetic.trx`.
The Release build and 106 narrow passes below cover the same product candidate.
See `2026-09-06-campaign-closeout.md` for the owner's merge-gate disposition
and retained failures. No new individual visual PASS is asserted.
## Historical execution — owner client launched
After the explicit owner override, Release App/test build passed with zero
warnings/errors. Initial narrow run: 105 pass / 1 fail because it selected the
old default acdream.pak (recipe 8, expected 10). No product change was made for
that environment failure. Rerun with ACDREAM_PAK_PATH explicitly selecting the
same acdream-v10-s5-c5.pak as the client: **106 pass / 0 fail / 0 skip**.
Both TRX reports remain under artifacts/483-far-terrain/.
The fixed uncommitted candidate launched once: PID17856 at
2026-09-06T07:37:36.5010165Z, enteredWorld07:37:40.5272305Z; logs are
logs/owner-g4-20260906-r2/. App SHA256
869BA14CB2C610E006C80BDFFCBD75629339A3486B8B98D7708B23050700FF34;
Core B0E676482A45ED77C2AB050BBBC988139D1BF6D99308C42ABB0CFF440D39A0BC.
Retail untouched, no automated route or automatic close. Owner testing and
post-owner review were pending at this launch checkpoint; the final disposition
above supersedes it and the earlier unbuilt handoff statements below.
## Confirmed cause
Owner-g4-20260906-r1 logged NearRadius4/FarRadius25, unchanged maximum preference.
@ -29,7 +73,8 @@ preserves this known gap instead of asserting a usable far draw product.
both tiers. Keep exactly one landscape owner and existing walk ordering/LOD.
Near publication supplies buildings separately; far entries have no buildings.
3. Forward the terrain metadata through both PublishAsFar conversions and all
normal load/promotion routes. No extra DAT or collision/static read for Far.
normal load/promotion routes, including LandblockStreamer's unconditional
LoadFar near-payload stripping. No extra DAT or collision/static read for Far.
Respect the retained publication receipt and existing retry/budget semantics.
4. Near-to-far retirement clears building references but retains the terrain
entry/bounds. Full terrain removal removes its landscape entry. Repeated
@ -50,7 +95,8 @@ do not claim it retired because distant terrain now draws.
- Far build keeps EnvCells null and performs only its existing heightmap read,
but carries exact non-flat authored vertical bounds.
- Production publisher + real landscape/walk product produces a nonempty
- Actual LoadFar worker -> DrainCompletions -> production publisher + real
landscape/walk product preserves the bounds and produces a nonempty
terrain turn for an in-view far-only block beyond near radius4, with no
building/object population. The old missing-registration implementation must
fail this assertion; a renderer-slot count alone is insufficient.
@ -64,11 +110,17 @@ do not claim it retired because distant terrain now draws.
## Ownership, safety and handoff
One OpenAI implementer owns only LandblockBuild.cs, LandblockBuildFactory.cs,
LandblockRenderPublisher.cs, LandblockPresentationPipeline.cs,
LandblockRenderPublisher.cs, LandblockPresentationPipeline.cs, LandblockStreamer.cs,
Rendering/Walk/WalkLandscapeAssembler.cs and their directly affected tests.
Small related declaration/comment edits may be proposed, not broadened silently.
Lead owns issue/ledger/architecture/register and this contract. No shader/PAK edit.
Scope amendment: the implementer found that the real LoadFar worker reconstructs
LandblockBuild while stripping near payload, losing separately carried terrain
bounds. The lead authorized only that metadata forwarding in the sixth production
file and an actual worker-to-walk regression. This implements requirement 3;
no scheduling, loading policy or new retail deviation is authorized.
**Retail PID25988 is owner-held: DO NOT TOUCH.** No close, input, debugger attach,
build, tests or launch while either client is running. Code edits may proceed.
Do not invoke Claude or start review agents. Return the uncommitted scoped diff
@ -76,3 +128,47 @@ and exact unrun test commands; implementation is NOT yet built or tested.
After the owner closes retail, lead does the green Release build and narrow
regression run, launches one manual client, and leaves review until after the
owner's test. No main merge and no G4 acceptance are implied.
## Lead static retail check — 2026-09-06
Named pseudo-C identifies the exact helper as
`CLandBlock::get_land_limits0052F1D0`, not calc_lighting. The existing local
Ghidra endpoint8081 is offline; no new tool or retail process was launched.
Instead the lead read the paired file `C:\Turbine\Asheron's Call\acclient.exe`
as data: timestamp2013-09-06, PDB GUID9e847e2f-777c-4bd9-886c-22256bb87f32,
age1, SHA256006ffeadc5d679c871497112a5bd1f87714d0e273e2166bae5052dde369297b1.
The separately named acclient_codex_oracle.exe is2015 and was excluded.
Direct PE byte inspection agrees with the named source:
- 0050634F onward loads mid_width from this+4, squares it, and walks the
complete block_draw_list backwards. Non-null and block+FC in-view tests
precede the virtual DrawBlock call. There is no building-presence gate.
- 0052F281 onward loads the maximum byte's height-table value, adds
float[007C8F1C]=200.0 (bytes00004843) and stores this+E0; the minimum-byte
value subtracts float[007928B0]=1.0 (bytes0000803F), stored at this+E4.
The existing compute helper's formula is therefore preserved, not replaced
by the GPU AABB's different margins.
This is factual input verification for the repair, not the postponed code
review or a test PASS. Retail remained open and untouched throughout.
## Candidate handoff — 2026-09-06
The implementer returned the six production files plus
LandblockBuildFactoryTests.cs and LandblockConcretePresentationPipelineTests.cs
uncommitted. The candidate and regression tests are written; ownership is back
with the lead. No implementation agent remains active on this repair.
Only whitespace validation (`git diff --check`) ran. The candidate is
**UNBUILT, UNTESTED and UNREVIEWED**; the previous eea83ac88 binary is unchanged.
Retail PID25988 remains owner-held, ACDream is absent, ACE UDP9000/PID2296 is up.
No build, test, client launch, debugger attach or client close was performed.
When both clients are absent, build the App test project in Release (which
builds its App dependencies) and run the narrow lane below before owner launch.
The test run must not be reported as a visual gate or the deferred review.
```powershell
dotnet build tests/AcDream.App.Tests/AcDream.App.Tests.csproj -c Release --no-restore -m:1 -p:UseSharedCompilation=false
dotnet test tests/AcDream.App.Tests/AcDream.App.Tests.csproj -c Release --no-build --no-restore --filter "FullyQualifiedName~LandblockBuildFactoryTests|FullyQualifiedName~LandblockConcretePresentationPipelineTests|FullyQualifiedName~LandblockPresentationPipelineTests|FullyQualifiedName~LandblockRenderPublisherTests|FullyQualifiedName~WalkLandscapeAssemblerTests|FullyQualifiedName~RetailFrameWalkTests|FullyQualifiedName~WalkLandCellOrderTests" --logger "trx;LogFileName=483-terrain-regression.trx" --results-directory artifacts/483-far-terrain
```

View file

@ -0,0 +1,53 @@
# #484 — distant mountain silhouette flicker
**OPEN — OWNER-DEFERRED, 2026-09-06.** The owner explicitly requested filing
this issue and closing/merging the campaign. Investigation stops here; exact
pose and consecutive-frame reproduction are future issue work, not a pending
campaign gate. Cause remains unconfirmed. No production fix or PASS claimed.
2026-09-06; owner report on the uncommitted #483 candidate based on e0ba3e7f2.
Owner says flicker continues with character/camera still; turning reveals more
mountain at affected spots. User image:
`C:/Users/erikn/AppData/Local/Temp/codex-clipboard-d6976e08-527f-47b9-8f00-79429065ea13.png`.
A still does not establish the temporal mechanism. No fix or visual PASS yet.
## Read-only findings
- #483's launched App hash remains
869BA14CB2C610E006C80BDFFCBD75629339A3486B8B98D7708B23050700FF34;
PID17856, logs/owner-g4-20260906-r2/. Retail was untouched.
- `TerrainModernRenderer.AppendCellIndexRuns` covers all 384 mesh indices for
side1/cell0; other LOD cell grids expand disjoint complete row ranges. This
is draw granularity, not a changing geometry LOD. No obvious stale terrain
list accumulation found in driver/renderer clear paths.
- Terrain indirect commands use a per-frame upload-ring allocation. Fog only
blends colour; the terrain shader does not discard fogged fragments.
- CPU walk uses CY/near and view-edge planes, while the world camera projection
has .1 m near / 5000 m far. A radius25 square can reach roughly 6.8 km
diagonally. This permits hardware clipping of CPU-admitted blocks, but that
is NOT sufficient evidence of this fault or justification for extending far.
- Named retail also uses finite far clipping: zfar0081EC88 defaults to4000;
PrimD3DRender::SetFOVInternal0059AB40 builds the projection from znear/zfar;
SetDefaultD3DStates sets clipping state0x88 to1 at005A3B30. Terrain submits
XYZ through DrawPrimitiveUP, not a projected-Z clamp/far bypass. Only sky
temporarily multiplies zfar by4, then restores it.
- Lead verified those three load-bearing facts from the matching 2013 PE as
file data (no attach): SHA256
006ffeadc5d679c871497112a5bd1f87714d0e273e2166bae5052dde369297b1.
VA0081EC88 bytes00007A45 encode4000; 0059AB40 body loads globals81EC88/81EC84
before the perspective call; 005A3B32 has push1/push88 before SetRenderState.
The far-clipping hypothesis remains unproven; no projection change was made.
## Next discriminating observation
Owner was asked to leave the client at an affected viewpoint and provide /loc.
The one window observation instead caught arrival in Neftet, not the reported
mountain silhouette. No input was sent to either client. Need that pose before
capturing consecutive stable frames and camera/terrain admission/clip facts.
Distinguish disappearing block/triangle coverage from changing shaded pixels;
then write the bounded fix contract, add a discriminating regression, verify
and gate the actual repair. Do not turn an unproven far-plane theory into a fix.
No new code, build, test, client close/launch, review, or G4 acceptance this turn.
Current safety: retail remaining open does not block build/test/launch (explicit
owner override). Leave retail untouched; do not overwrite a running ACDream.

View file

@ -1,11 +1,14 @@
# G4 owner checklist — final candidate, 2026-09-05
# G4 owner checklist — retained matrix; closeout 2026-09-06
Status: **NOT RUN / NOT ACCEPTED**. This is the remaining owner session,
not another implementation or review round. Binding scope is the campaign
plan's S5 gate and section10 scene matrix. The automatic checks do not replace
the owner's judgment. Do not merge or mark the campaign closed from this card.
Status: **OWNER-DIRECTED CLOSEOUT ACCEPTED WITH CARRIED ISSUES.** On 2026-09-06
the owner directed deferral of #484, campaign closeout, commit, merge to main
and push to Gitea. This supersedes waiting for the remaining matrix session;
it does not assert individual PASS results for unreported rows or erase FAILs.
See `2026-09-06-campaign-closeout.md` for the merge-gate disposition and exact
final #483 candidate. The earlier checklist and evidence below are retained
history, not a new launch request.
## Candidate and launch
## Historical candidate and launch (2026-09-05)
Use the existing Release binaries built at
`eea83ac884d0b0fd74d86a17a16d7d5d93f64d94`; documentation checkpoint
@ -17,7 +20,9 @@ Exact App/Core/package hashes and green build evidence are in
Before launch, recheck binary/package hashes, both client processes and ACE
UDP9000; record the launch commit, flags, profile, process and log directory.
Keep the saved High/MSAA4, near4/far25 profile for the normal candidate run.
No rebuild beside either client; no code change after the accepted binary.
The original no-rebuild-beside-either-client rule was superseded on 2026-09-06:
retail stays untouched but does not block building. Do not overwrite running
ACDream binaries or launch duplicates.
Owner session has no automatic route or automatic close. A retail comparator
is needed for the two-client row and known cathedral slab comparison; launch
each client in its own command. Close owned clients gracefully when agreed.
@ -42,7 +47,8 @@ each client in its own command. Close owned clients gracefully when agreed.
## Owner session
For every row retain PASS/FAIL, actual `/loc`, symptom if any, and PNG/log
paths. All rows below remain **PENDING** on this final binary. The starting
paths. Rows without a reported individual verdict remain **UNREPORTED**, not
new PASS results; waiting for them was superseded by owner closeout. The starting
locations are navigation aids, not a substitute for movement or camera work.
| Row | Check | Start / navigation |
@ -60,13 +66,14 @@ network logout or a client-authored code0 does not override the OS exit.
Do not retry just to replace a failed record. The lead reads local crash
reports/Windows evidence without changing registry, driver or dump settings.
## Acceptance and remaining closeout
## Historical acceptance requirements and final disposition
Owner PASS must identify the tested rows and any explicit carried exception.
The historical acceptance of#422 in Campaign VM is not automatically a new
OVERHAUL acceptance. A good visual session does not prove the original AMD
reset's initiating cause, remove the installed-data failures, or convert
the recorded shutdown failure to PASS. Their disposition remains explicit.
the recorded shutdown failure to PASS. Their failures remain explicit in the
closeout report.
FPS/C2 performance work is owner-deferred. Retail's known cathedral leak is
unchanged; its proposed post-campaign improvement is not part of this gate.
@ -74,7 +81,7 @@ unchanged; its proposed post-campaign improvement is not part of this gate.
After the owner results, reconcile the shipping documentation before closure:
architecture, WorldBuilder inventory, divergence register, launch options,
FW ledger (superseded, not deleted), roadmap/milestones and campaign memory.
Keep the existing failure records. Only when G4 and that closeout actually
agree with the code can the campaign be marked CLOSED — USER ACCEPTED and
the authorized merge considered. Do not rebuild the accepted product for
documentation-only changes.
Keep the existing failure records. The owner's 2026-09-06 closeout instruction
now authorizes integration with carried issues, rather than requiring another
matrix session. Documentation records that disposition without inventing
per-row passes. Do not rebuild the accepted product for documentation-only changes.