Commit graph

203 commits

Author SHA1 Message Date
Erik
6347e0f826 docs: contract completed-frame capture repair and safe self-gate launch 2026-09-05 11:53:12 +02:00
Erik
8fd5e434b6 docs: record failed owner gate and bounded #477 validation recipe 2026-09-05 11:18:16 +02:00
Erik
0e4cad31ea test(overhaul): prepare exact owner portal reveal regression route #474 2026-09-05 09:16:17 +02:00
Erik
b8d80e507f docs(overhaul): record provisional exterior coverage re-gate for #473 2026-09-05 08:24:37 +02:00
Erik
62efc72cb3 test(overhaul): add issue 469 lighting transition route 2026-09-05 04:04:32 +02:00
Erik
19b44e5e3a test(overhaul): add issue 470 pinned A-B route 2026-09-05 03:20:44 +02:00
Erik
7506e5f14e test(vulkan): isolate the hardware witness lane
Tag the production offscreen witness as Lane=Vulkan, exclude capability-owned tests from the portable Release filter, and give lavapipe an explicit trait-only invocation after the portable Vulkan contracts.

Document the lane and pin witness, portable-filter, and workflow ownership without initializing Vulkan.

Mutations performed and restored:

1. Removed the witness trait: VulkanLaneOwnershipContractTests first failed Assert.Matches because the Lane=Vulkan/Fact/method pattern was absent.

2. Removed Lane!=Vulkan from the default filter: the contract first failed Assert.Contains, not found Lane!=Vulkan.

3. Weakened the dedicated invocation to Lane!=Vulkan: the contract first failed Assert.Contains, not found --filter Lane=Vulkan in the hardware step.

4. Narrowed the dedicated invocation with FullyQualifiedName: the contract first failed Assert.DoesNotContain because FullyQualifiedName was present at position 231.
2026-09-05 03:19:55 +02:00
Erik
2001103ca6 docs+gate: #468 filed — the Holtburg doorway pose seats the player in the interior cell at a floorless point and it falls through the world; route-g3b pose 15 moved to the outdoor standing point
The 'empty plane under fog' frame the S4-c1 capture-pose self-gates produced
at frame 15 is the terrain seen from below by a falling player, not a draw
change: the camera probe holds playerCell=0xA9B4013F at (134.07,17.36) while
z drops 96 -> -20 m after materialization. The S3-state run had seated the
same request outdoors in 0xA9B40029 and stood. Placement is not the campaign's
domain; the gate pose is moved so the G3 frame is deterministic and the
original pose is kept in the issue as the reproduction. #462 recurrence on
the pre-S4 control build noted.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-04 06:37:09 +02:00
Erik
aef15fd7cf tools(selfgate): #464 scripted tilt to the owner's eye height (sixteen mouselook samples)
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-03 22:54:44 +02:00
Erik
37d1357baa tools(selfgate): #464 scripted-tilt route for the mouselook verb (both delta signs)
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-03 22:51:38 +02:00
Erik
3a6aa7eef4 research(render): retail portal-polygon vertex capture at the #464 pose + the pm-verts cdb template
Sixteen DrawPortalPolyInternal attempts per frame, vertex-identical to
acdream's sixteen collect-time punches; twelve lie entirely on the local
y=12 plane and are rejected by the ±12 guard in both clients, so the hall
building's doorways are never punched in either.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-03 22:42:01 +02:00
Erik
3d746294ae docs(issues): #464 owner's tilted frame with the walk transcript — same admission set, seventh exit view; the open face shows the hall interior where retail shows the shell wall
The frame is saved as logs/464-owner-tilted-frame.walk.txt. Narrowed to
the building shell versus interior-cell order/clip at the stairwell's open
face in the outside pass (S4), with a possible building-portal admission
component only the cathedral-stair-arch retail capture can settle.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-03 22:19:17 +02:00
Erik
8d3eb12c4e docs(issues): #464 owner-confirmed artifact pose pinned with probes — ordinary camera state, hall interior drawn through the stairwell's open far face (S4)
Owner client with both probes: root 0xF4180114, eye (39.89,17.25,182.36),
sweep uncontacted; the hall's interior shows above the bottom arch where
retail shows the solid far face, which the DAT gives as five exit portals.
The retail capture cathedral-stair-arch is requested as the fix oracle.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-03 22:07:25 +02:00
Erik
27ff6bb041 docs(issues): #464 — the front-view frame is a retail axiom (owner); the real artifact is toward the arches on the other side
Also commits the walk-transcript route used at that eye.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-03 21:55:11 +02:00
Erik
c3b989305a docs(research): #464 camera investigation report; reclassified as an interior-root draw defect (S4); archway route
Read-only decomp + real-DAT replay: eleven sweep/root differences, each
unreachable at the pose or more constrained than retail; the replay seats
the pivot in 0xF4180114, stops the boom on its east pier at y=16.448, and
the walk from that root floods 114/113/112 with seven exit views. The
owner's probe launch line now also sets ACDREAM_PROBE_FACILITY_STAIRS.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-03 21:50:40 +02:00
Erik
4f091ab614 tools(selfgate): #464 middle-landing route (zoom, look-up, yaw at the owner's first pose)
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-03 21:36:26 +02:00
Erik
9aced6e3c4 tools(selfgate): #464 look-up route (CameraRotateDown lowers the eye through the landing floor)
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-03 21:33:43 +02:00
Erik
2018027322 tools(selfgate): #464 zoom-out route (held CameraZoomOut / CameraRotateUp / CameraMoveAway at the top stair pose)
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-03 21:31:45 +02:00
Erik
590fbb66c3 tools(selfgate): #464 running-descent route (held MovementForward, ten frames at 150 ms)
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-03 21:19:29 +02:00
Erik
ad6b0599cc docs(render): S4 packet — the ±12 reject's quantifier corrected to retail's (ALL vertices on ONE bounding plane); #464 stair-ladder route
The S4-c1 retail lens caught the lead's paraphrase inverting retail's
predicate (any vertex on any plane vs every vertex on the same plane);
the contract and T2 now state the decomp's four per-plane predicates.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-03 21:07:38 +02:00
Erik
7fa83c7397 docs(render): ledger — G3 self-gate part A: 12 of 13 poses PASS provisional, Nanto incomplete; part-C route
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-03 16:41:30 +02:00
Erik
1ad9f4766f tools(selfgate): G3 route part B — the four retail capture poses
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-03 16:21:21 +02:00
Erik
37e42aafc4 docs(render): resolve #458 — the a9c9 doorway admission is a 0.5 % edge-plane precision boundary (AD-118)
Two live cdb captures on the paired 2013 client at the Holtburg doorway:
the blockset template (every Render::block_check call of one frame — 2,601
resident blocks x 2 exit views) proves retail tests a9c9 at ring slot
25,46 and returns PARTIALLY then OUTSIDE; the blockcheck template dumps
its four corner interval vectors (0 0 0 0 300.4|310.2 and 0 0 0 1001 ...,
slab 75..330). acdream's replay at the same P pose reproduces the sentinel
pattern, the four edge planes and both verdicts, drawing a9c9 once, with
clip heights 298.8/308.5 m — a 0.5 % plane difference (about 0.35 px of
projected door-vertex position). At the fixture pose that margin is what
flips the south-west corner from inside to outside on the fourth edge
plane, so retail's four-corner unanimity test says OUTSIDE where ours
says PartiallyInside. Not fixable bit-exactly short of D3D's x87
transform; the KnownFailure row stays with its comment rewritten, the
register carries AD-118, and the first filtered capture's silent miss
(cdb sign-extends poi() inside .if; use dwo()) is noted in the template.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-03 14:43:14 +02:00
Erik
157b327a0b tools(walk-oracle): block_check capture template for #458 (one block's corner intervals, z slab and verdict)
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-03 12:39:14 +02:00
Erik
0f1628dc04 tools(selfgate): G3 route — the §10 scene matrix plus the owner-gated poses
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-03 12:33:11 +02:00
Erik
4c364412f0 tools(selfgate): add the Holtburg terrain-leak pose (owner-supplied) to the route
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-03 07:55:00 +02:00
Erik
7969c2e6ad tools(walk-oracle): parts capture guards null part-array slots (cdb aborted the PD/DM action on a null gfxobj)
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-03 06:40:35 +02:00
Erik
b62dbf035c tools(walk-oracle): capture the per-land-cell draw order (LC/SC lines) for S3 chunk 3
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-03 06:31:54 +02:00
Erik
2d20ee917b checkpoint(render): portal-haze root cause — emitters need own-cell membership (S2 chunk 6 contract)
Instrumented arrivals show the Hidden-state cloud's emitters spawn in the
arrival cell, become view-eligible when the world appears, and are never
drawn: the walk draws an owner's emitters only through the owner's registry
rows, and a hidden owner's shadow is suspended. Retail's
CPhysicsObj::add_particle_shadow_to_cell (0x00514a70) gives an emitter one
shadow in its own cell, drawn at that cell's turn regardless of the parent's
hidden state. S2 chunk 6 (packet §10) ports that: per-cell emitter draw
membership, owner-union particle path deleted. Route timing fixed so the
arrival screenshots anchor on the reveal.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-03 05:49:45 +02:00
Erik
7ec72765d7 checkpoint(render): G2 owner findings — terrain punch assigned to S4, portal-haze probe
Owner G2 check at 4b0b29e4: Facility Hub PASS, Holtburg house PASS,
cathedral leak unchanged (S3/S4). Two new findings:
- doorway-sized fragments of houses on the terrace below show through
  the hill in Holtburg: PortalDepthMaskRenderer draws every visited cell's
  exit-portal fan with depth compare Always + write, so a doorway behind
  terrain still punches far depth through it. Pre-existing; S4 owns the
  punch (ledger row updated).
- the purple UnHide haze (script type 0x75, played on the retail
  Hidden->visible physics-state edge) no longer shows on the local player
  after a portal. Under investigation: temporary print-only traces
  [pes-spawn]/[pes-vis] under ACDREAM_DUMP_PLAYSCRIPT=1 (launch-options row
  amended; both die with the investigation) and a timed arrival route
  tools/overhaul-selfgate/route-portal-haze.txt.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-03 05:32:18 +02:00
Erik
ea546f381b tools(render): self-gate - list screenshots recursively, no plugins in gate sessions
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-02 23:16:31 +02:00
Erik
2b40c0bb38 tools(render): self-gate kit - session config, teleport route, runner
Lead-run visual gate: direct character login through a session config,
the owner-supplied /teleloc poses (cathedral floating stairs, Facility Hub
stairs, Holtburg house), one screenshot per pose into the automation
artifact directory, graceful close-client. The runner refuses to start
while any AcDream.App process exists and never hard-kills a client.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-02 22:08:56 +02:00
Erik
14d8fe6478 tools(render): fix printf newline escapes in the OH alpha-depth template
The AM and PM breakpoint actions carried a single-backslash newline; cdb
needs the doubled form inside a quoted bp action, as the other lines use.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-02 18:19:35 +02:00
Erik
ebaa41df1a tools(render): OH retail capture scripts for the S3/S4 answer key
Recon script, three capture templates (walk / parts / alpha-depth),
runner, and operator README under tools/walk-oracle/oh/. FW0 line formats
are kept byte-identical; new EC/OC/PD/DM/AM/FL/PM/PC line kinds are
documented. Auto-detach uses the fall-through + top-level qd recipe; qd
never appears inside a breakpoint action. Lead-resolved: DBObj::m_DID is
+0x28 (header layout, first base of CGfxObj and CObjCell, matches the
proven FW0 cell reads); the three D3DPolyRender alpha functions are static
cdecl with stack arguments, uint8 arguments read with by().

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-02 18:09:11 +02:00
Erik
b3b7d922f1 checkpoint(render): preserve pre-overhaul investigation state 2026-09-01 18:04:24 +02:00
Erik
77f5342b62 feat(render) Campaign FW1: doorway-still conformant - deg_mul is dynamic
Render::deg_mul is auto-tuned by frame load and SWUNG between oracle
captures: doorway-still ran right after the heavy terrace-edge capture
with the multiplier depressed (mul <= 0 puts thresholds at/below ideal,
so 001e/0026/002f select the portless level 1 - retail's zero look-in
floods, reproduced exactly at mul = 0), while every other fixture pins
~ +0.99 (thresholds at max). The recon session's "-0.99" live dump was
real - taken under the same cdb load. RetailFrameWalk now exposes the
multiplier; the doorway test pins 0, the rest use the default.

foundry-entry: frames 1-66 reproduce exactly; the F67-F79 standing
segment diverges ONLY in building 0036's intra-building DC order
(retail 116,118,11d vs replay 11d,116,118). The BSP-traversal microscope
pins the flip to 0036's ROOT plane (N=(0,0,-1) D=2.8): replay eye z
2.33 (d=+0.47, NEG-first) vs retail behaving as d<0 (POS-first) - a
structural ~0.5 m frame question (positionPush(2)/part-scale), only
adjudicable live. Turnkey probe:
tools/walk-oracle/fw1-f67-viewpoint-probe.cdb.

Fixture status: nine of ten fully conformant; foundry-entry exact
through F66 with the 13-frame order segment parked on the probe.
Suites: Walk 127/1 skip; hermetic 6,687/0.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-30 11:49:27 +02:00
Erik
e8df809c40 feat(render) Campaign FW1: pin the exact retail projection in the replay context
Live-dumped from the capture client (Render::bw/bh 1024x720,
xinvscale/yinvscale 0.00025, tx 0.127875, ty 0.089875, vdst 0.1330767):
the replay context now uses retail unproject formula verbatim for the
ray caster and the exact frustum (fovY = 2*atan(ty/vdst), aspect =
tx/ty) for projection - no guessed camera constants remain.
foundry-deep conformance stays green.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-30 10:27:38 +02:00
Erik
4a72600b45 docs(plans) Campaign FW: FW0 complete; pose-stamped re-capture prepared
FW0 ledger entry records the fixtures, replay helper, pseudocode model,
and the reshaping findings. The pose gap (first captures lack camera
pose; exact replay needs it) is documented with a ready template for a
short owner session when FW1 gates.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-30 09:30:20 +02:00
Erik
71b11817ad research(render) Campaign FW0: retail walk-oracle harness + 10 live trace fixtures
cdb capture harness (recon offsets + per-pose scripts; .gitignore gains a
negation so the walk-oracle scripts are tracked despite the global *.cdb
ignore) and the FW1 conformance fixtures: terrace center/edge, cathedral
arrival, doorway still, cottage walkout, street porch-cam/outdoor, town
walkabout, foundry entry, foundry deep. Binding findings in the README:
the frame roots at the CAMERA cell; outdoor root draws the #456 far
building every frame and hides it by depth cover, never omission;
interior root gates through the exit-view chain; look-ins punch at the
owning building turn; transitions are one-frame flips.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-30 09:10:07 +02:00
Erik
f7aa8e0eb7 fix: complete retail parity stability pass
All checks were successful
CI / linux-portable (push) Successful in 3m41s
CI / windows-gate (push) Successful in 6m49s
CI / release (push) Successful in 3m22s
2026-08-28 20:01:39 +02:00
Erik
0dd966f3a0 Optimize prepared asset package v2 2026-08-27 20:09:09 +02:00
Erik
c4608b1127 Merge origin/main into MossTank automation work
Some checks failed
CI / linux-portable (push) Successful in 3m51s
CI / windows-gate (push) Failing after 7m8s
CI / release (push) Has been skipped
# Conflicts:
#	docs/ISSUES.md
2026-08-27 19:01:26 +02:00
Erik
4e6e9bc9d9 feat(mosstank): add VTank-style automation PoC 2026-08-27 18:57:21 +02:00
Erik
f6fe0f2a4f fix(client): restore retail interaction parity
All checks were successful
CI / linux-portable (push) Successful in 3m27s
CI / windows-gate (push) Successful in 6m42s
CI / release (push) Successful in 2m12s
Harden keyboard and camera routing, inventory and vendor interactions, chat/emotes, relog portal flow, and paperdoll rendering. Add retail research, connected gate coverage, and release-gate validation.
2026-08-26 20:45:11 +02:00
Erik
6f47740af0 docs(ace-mods): SetTime loads via @mod find, no ACE restart needed 2026-08-23 14:34:43 +02:00
Erik
13f685ee94 tools(ace-mods): add @settime ACE mod for same-clock retail/acdream sky comparisons
Sky and weather gates need retail and acdream looking at the SAME Dereth
hour and the SAME authored day group; until now the only lever was
acdream's ACDREAM_WORLD_TIME/ACDREAM_DAY_GROUP pins, which retail cannot
follow, so the user could never judge night-sky differences (aurora,
dome edge) side by side.

@settime <hour|fraction> [Sunny|Rainy|Clear|Cloudy|<index>] jumps ACE's
Timers.PortalYearTicks FORWARD to the next matching instant. Every
TimeSync header carries that value, so both clients re-sync within
seconds. Forward-only because DelayActions compare against the same
clock (a backward jump would stall them). The calendar and day-group
roll duplicate acdream's retail ports (DerethCalendar shift 3600,
SkyDayGroupSelector LCG from SkyDesc::CalcPresentDayGroup @0x00500E10)
and the 20-entry name table was dumped from the installed Region DAT.

Install: copy SetTime.dll + Meta.json to C:\ACE\Mods\SetTime and run
@mod find (or restart ACE). Dev servers only.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-23 14:34:37 +02:00
Erik
132395e6f7 fix #425: pack resident budget is a 1080p ceiling that scales with pixel count; an explicit Apply retries a failed selection
Live Holtburg at 2560x1440: the Low preset needed 67,368,164 resident bytes
(screen-sized HDR/depth/ray targets are 44 MB of that) against an absolute
64 MiB ceiling that had only been validated at 1080p, so Options -> Apply
fell back to the default path; every later Apply was then refused by the
controller's failure memo, which treated the user's deliberate choice like
automatic re-activation.

RenderPackResidentBudget.Effective scales the declared 1080p figure by the
viewport's pixel-count ratio (never below 1), still capped by the hardware
MaxPackResidentBytes; both pack graphs use it and the performance-matrix
tool judges its resident column by the same rule (contract test updated).
RenderPackController.Request gains explicitUserChoice, which clears the
memo for that selection; RenderPackSelectionBinding passes it on every
display edge (Apply, including resolution changes) and keeps the memo for
the startup request.

Tests: RenderPackResidentBudgetTests (1080p/720p keep the declared
ceiling, 1440p = 16/9x, 4K = 4x, hardware cap wins, zero extent rejected);
controller explicit-retry; the binding test now proves the user's next
Apply activates once the cause is gone. App hermetic lane 6,068/0 (Release).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-23 10:00:11 +02:00
Erik
fe56b6cf32 tools(i422): parameterised debug-heap loop + plain rate loop; #422 re-characterised after it fired on the retail matrix row
The fault is pack-independent (fired on the retail preset, 1080p, 45 s,
first launch after a build), ~1 in 57 offline runs today, never under a
debugger (46 runs), no WER/event trace on this machine. The pre-campaign
binary cannot be measured with this gate (no in-process close verb).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-23 05:19:18 +02:00
Erik
99d5b2a62f tools(i422): correct the debug-heap loop's cdb script path
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-23 04:32:57 +02:00
Erik
c69029bf58 tools(gate): -ExeOverride and -DebuggerScript for the offline pixel gate; #422 characterised over 40 instrumented runs (Campaign VM VM7)
-ExeOverride runs another AcDream.App.exe through the SAME isolated
settings/scene/capture path so two binaries compare without mixing tool
versions (VM0's recorded fieldOfView trap). -DebuggerScript launches the
client under cdb so ntdll's debug heap validates every free and a heap
corruption breaks at the corrupting site with a stack.

#422 (1-in-8 STATUS_HEAP_CORRUPTION exit after a pack-on offline capture):
16 runs attached + 24 runs under the debug heap on 1f151242, all clean
(P ~ 0.5 % at the filed rate). Recorded as not reproducible on the current
binary, carried as a watch item for the owner's VM7 matrix with the loop as
the first step if it recurs; no longer a merge blocker. Evidence under
docs/research/evidence/vm7 alongside the final pack-off-vs-base+normals
robust diff (5-10 px, lifestone band only).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-23 04:32:27 +02:00