docs(overhaul): establish cathedral ramp bridge rejection evidence
Preserve the three explicit diagnostic outcomes and all18 outgoing edges. Native box containment rejects the extra room; five later-part sphere-input alarms remain red and nondecisive for these edge results. Correct AD-117's disproven widening guarantee. No production geometry or golden change, FPS remains deferred, G4 unpassed. Co-Authored-By: OpenAI Codex <noreply@openai.com>
This commit is contained in:
parent
f9bb47ec63
commit
846cdd94b3
5 changed files with 294 additions and 1 deletions
|
|
@ -114,7 +114,7 @@ readiness/requeue adaptation. See
|
|||
| AD-119 | **Filed 2026-09-03 at Campaign OVERHAUL v2 S4 chunk 1 (S4-c1 C2; `docs/research/2026-09-01-overhaul/s4-depth-alpha-packet.md` §6 R3).** Retail's portal-depth draws (`D3DPolyRender::DrawPortalPolyInternal` @0x0059bc90, the `BLEND_SRCALPHA`/`BLEND_INVSRCALPHA` `SetBlendFunction` call) keep color writes ENABLED with a zero-source-alpha `SRCALPHA`/`INVSRCALPHA` blend — every OTHER piece of R3's state (`DEPTHTEST_ALWAYS`, depth write on, `CULLMODE_NONE`, no stencil) is ported exactly. acdream instead disables the color-write mask outright on the SAME pipeline (`ColorWrite = false` alongside `Blend = GpuBlendMode.None`) and `portal_depth.frag`'s `main()` writes no color output at all — a write-mask substituting for a zero-alpha blend. | `src/AcDream.App/Rendering/PortalDepthMaskRenderer.Rhi.cs:92,100` (`CreatePortalPipeline`'s `Blend`/`ColorWrite` fields); `src/AcDream.App/Rendering/Shaders/portal_depth.frag` (empty `main()`, no color output) | Retail's blend equation is `dst' = src*srcAlpha + dst*(1-srcAlpha)`; with `srcAlpha` fixed at 0 this collapses to `dst' = dst` for every fragment regardless of its RGB — the destination color buffer is left byte-identical either way. A write mask reaches the SAME outcome (the destination is never touched) through a structurally simpler path — no blend-unit work per fragment, no fragment color output to author or keep in sync with a "must stay zero" alpha invariant — so the two are pixel-identical, not merely usually-equivalent. | None expected: the equivalence is provable from the blend algebra above, not measured, so no capture, transcript, or visual gate can distinguish the two. The write mask is in fact the SAFER of the two going forward — a future edit that gives `portal_depth.frag` a real color output (e.g. an authored debug tint) still writes nothing under today's mask, where a ported zero-alpha blend would depend on that same edit remembering to keep alpha at exactly 0. | `D3DPolyRender::DrawPortalPolyInternal` @0x0059bc90 (`SetBlendFunction(BLEND_SRCALPHA, BLEND_INVSRCALPHA, BLENDOP_ADD)`, `SetDepthBufferMode(DEPTHTEST_ALWAYS, ...)`, `SetCullMode(CULLMODE_NONE)`); `PortalDepthMaskRenderer.Rhi.cs` |
|
||||
| AD-120 | **Filed 2026-09-04 at the S4-c2 fix round 1 (M3).** Retail's `DrawMesh` row 1 immediate draw happens IN PLACE, inside the mesh draw call itself, the instant `curr_detail_surface != null` is observed for a translucent building-shell subset — there is no separate "later" point at which it could draw. acdream's walk stream-batches ORDINARY opaque instances into one deferred submission, so a translucent building-shell instance under building detail cannot draw "in place" in that same sense; `WbDrawDispatcher.SubmitToAlphaQueue`'s `RetailAlphaMeshAction.Immediate` branch instead draws it via `DrawImmediateAlphaInstance`/`DrawImmediateAlphaInstanceRhi` at the entity's own `AlphaSubmitMark` — the point `WalkFrameDriver.Replay` reaches that instance's alpha submission within the walk's existing turn order (after the entity's building/land-cell turn, same relative position an ordinary deferred instance would occupy). | `src/AcDream.App/Rendering/Wb/WbDrawDispatcher.cs` (`SubmitToAlphaQueue`, `DrawImmediateAlphaInstance`); `src/AcDream.App/Rendering/Wb/WbDrawDispatcher.Rhi.cs` (`DrawImmediateAlphaInstanceRhi`) | The walk's turn order already places a building's alpha-eligible instances at the correct relative position among that turn's other content (retail draws building shells within `DrawBuilding`, itself ordered exactly where the walk visits that building) — moving the draw from "mid-mesh-call" to "at the turn's alpha submission point" changes WHEN within one turn it executes, never WHICH turn, so it still lands between the same neighboring opaque/translucent content retail's own turn order would bracket it with. | A translucent building-shell instance under detail could theoretically composite differently than retail if some OTHER alpha content is submitted between the entity's own opaque stream mark and its alpha submission mark within the SAME turn — no such intervening content exists in the current walk (an entity's alpha submission immediately follows its own classification), so this is a structural note, not an observed symptom. | `D3DPolyRender::DrawMesh` @0x0059d4a0 (row 1); `RenderDeviceD3D::DrawBuilding` @0x0059f2a0 (`curr_detail_surface` install/clear) |
|
||||
| AD-121 | **Filed 2026-09-05 at #476 F1.** The opt-in retained Vulkan screenshot path requires the actual capture allocation to be host-coherent. CaptureBackbuffer rejects noncoherent memory with NotSupportedException before waiting or reading; it does not implement atom-safe isolated cache invalidation. | src/AcDream.App/Rendering/Gpu/Vk/VulkanGpuDevice.Resources.cs (RecordBackbufferCapture, CaptureBackbuffer); VulkanBackbufferCaptureValidityTests | After the copy, COPY/TRANSFER_WRITE to HOST/HOST_READ publishes the exact capture range; the existing DeviceWaitIdle supplies completion. A capture-local coherence check avoids stale mapped bytes without changing shared heap preferences, generic buffer reads or neighboring suballocations. Default capture-off gameplay is unchanged. | A device whose capture allocation is only host-visible cannot take these opt-in screenshots until a separately bounded isolated invalidation path exists. Failure is explicit; no successful PNG is fabricated. This is a diagnostic capability restriction, not a retail equivalence claim. | Device::GetScreenshotSurface00439160 and RenderDeviceD3D::GenerateSurfaceFromFrontBuffer005A0210 capture completed retail front-buffer contents; #476 paired proof is in476-capture-lifetime-diagnosis.md. Vulkan host visibility/completion requirements are in476-fix-round1-host-visibility.md. |
|
||||
| AD-117 | **Filed 2026-09-03 at the Campaign OVERHAUL S2 review fix round.** Three residual Contract A/B readings (the row's original item 1 — a render-only owner's no-cell-array SetPosition commit republishing at its destination cell alone, `ShadowObjectRegistry.RefreshPositionRows` — was verified statically the same night as retail's own mechanism: `CObjCell::find_cell_list` 0x0052b4e0 with `num_sphere == 0` adds only the current cell (interior `add_cell` at 0x0052b563; outdoor `CLandCell::add_all_outside_cells` 0x00533630 `arg2 <= 0` branch) and skips the transit walk (`arg2 != 0` gate at 0x0052b576); it is a port, not a deviation). (2) `ShadowShapeBuilder.FromStaticRenderParts` uses the visual-AABB circumsphere as the per-portal cheap-reject sphere for a part with no physics BSP, where retail uses `gfxobj->physics_sphere` else `drawing_sphere` (pc:310147-310152) — strictly larger, so it can only WIDEN membership. (3) `PublishRetailPartEntries` publishes part rows into every CELLARRAY id, including an unloaded neighbour cell `CEnvCell::find_transit_cells` added with a null owner, where retail's `add_shadows_to_cells` (pc:282850) zeroes that shadow's cell and skips `AddPartsShadow` until the cell loads. (4) PORTED at Campaign OVERHAUL S2 chunk 6: an emitter now owns exactly one draw membership in its own current cell via `ParticleSystem`'s per-pass cell index (`CopyRenderableEmittersInCell`), matching `add_particle_shadow_to_cell` 0x00514a70's own-cell-only, no-clip-planes rule and drawn at that cell's own walk turn independent of its attached owner's registry membership. The residual is architectural, not behavioral: the membership index lives in `ParticleSystem` rather than as a `ShadowObjectRegistry` row, because an emitter is not a `CPhysicsObj` in acdream and never registers with the shadow registry at all. Two behavioral residuals remain: acdream's emitter cell is its OWNER's pose cell (`ParticleEmitter.OwnerCellId` ← `EntityEffectPoseRegistry.CellId`), where retail's emitter is a standalone `CPhysicsObj` (`makeParticleObject` 0x00512640) with its own position and cell; and retail re-evaluates membership per emission (`ParticleEmitter::EmitParticle` → `CPhysicsObj::AddPartToShadowCells` at 0x0051d126), which acdream does not — a caster in a doorway draws the cloud at the caster's cell turn only. | `src/AcDream.Core/Physics/ShadowObjectRegistry.cs` (`RefreshPositionRows` render-only branch, `PublishRetailPartEntries`), `src/AcDream.Core/Physics/ShadowShapeBuilder.cs` (`FromStaticRenderParts` non-BSP arm), `src/AcDream.Core/Vfx/ParticleSystem.cs` (per-pass cell index, item 4) | (2) A cheap reject that fires less often admits a superset; the admitting tests (`Plane::intersect_box`, `box_intersects_cell`) are ported exactly. (3) The extra rows are unreachable by the walk until the cell is resident and `RefloodLandblock` converges them at hydration. (4) `ParticleSystem`'s cell index is maintained at every point renderable state or `OwnerCellId` changes (`RefreshRenderableIndex`, `UpdateEmitterOwnerCell`), so an emitter's draw membership always matches its live cell regardless of its attached owner's suspended/hidden registry state. | (2) A decorative non-BSP part admitted to a neighbouring cell retail's cheap reject would have dropped — a draw clipped by that cell's portal planes, at worst a sliver. (3) A one-frame draw into a cell that just hydrated before its reflood ran. (4) None behavioral — a code-location note only: if particle emitters are ever modeled as registry-backed physics objects, this cell index should be retired in favor of a genuine `ShadowObjectRegistry` row rather than kept as a parallel mechanism. | `CPhysicsObj::SetPositionInternal` 0x00515330 (pc:283530-283541), `CPhysicsObj::add_shadows_to_cells` 0x00514ae0 (pc:282837-282875), `CEnvCell::find_transit_cells` 0x0052cae0 (pc:310147-310217), `CPhysicsObj::add_particle_shadow_to_cell` 0x00514a70, `CObjCell::find_cell_list` 0x0052b4e0. |
|
||||
| AD-117 | **Filed 2026-09-03 at the Campaign OVERHAUL S2 review fix round.** Three residual Contract A/B readings (the row's original item 1 — a render-only owner's no-cell-array SetPosition commit republishing at its destination cell alone, `ShadowObjectRegistry.RefreshPositionRows` — was verified statically the same night as retail's own mechanism: `CObjCell::find_cell_list` 0x0052b4e0 with `num_sphere == 0` adds only the current cell (interior `add_cell` at 0x0052b563; outdoor `CLandCell::add_all_outside_cells` 0x00533630 `arg2 <= 0` branch) and skips the transit walk (`arg2 != 0` gate at 0x0052b576); it is a port, not a deviation). (2) `ShadowShapeBuilder.FromStaticRenderParts` uses the visual-AABB circumsphere as the per-portal cheap-reject sphere for a part with no physics BSP, where retail uses `gfxobj->physics_sphere` else `drawing_sphere` (pc:310147-310152) — the former claim that this is strictly larger/only widens membership was DISPROVEN by C1a's independent installed-DAT diagnostic2026-09-05. Setup020009A2 parts1–6/Gfx01001FE6 use raw drawing-sphere center(0.00122428,-0.0253012,-0.215687), radius1.34874, versus production's AABB center0/radius1.2690104; these spheres have no guaranteed containment ordering. Five later-part cheap-input alarms occur after part0 already admits the same edges, so they do not change that bounded ramp-edge result, but general source fidelity remains OPEN (`c1a-authored-input-diagnostic-verification.md`). (3) `PublishRetailPartEntries` publishes part rows into every CELLARRAY id, including an unloaded neighbour cell `CEnvCell::find_transit_cells` added with a null owner, where retail's `add_shadows_to_cells` (pc:282850) zeroes that shadow's cell and skips `AddPartsShadow` until the cell loads. (4) PORTED at Campaign OVERHAUL S2 chunk 6: an emitter now owns exactly one draw membership in its own current cell via `ParticleSystem`'s per-pass cell index (`CopyRenderableEmittersInCell`), matching `add_particle_shadow_to_cell` 0x00514a70's own-cell-only, no-clip-planes rule and drawn at that cell's own walk turn independent of its attached owner's registry membership. The residual is architectural, not behavioral: the membership index lives in `ParticleSystem` rather than as a `ShadowObjectRegistry` row, because an emitter is not a `CPhysicsObj` in acdream and never registers with the shadow registry at all. Two behavioral residuals remain: acdream's emitter cell is its OWNER's pose cell (`ParticleEmitter.OwnerCellId` ← `EntityEffectPoseRegistry.CellId`), where retail's emitter is a standalone `CPhysicsObj` (`makeParticleObject` 0x00512640) with its own position and cell; and retail re-evaluates membership per emission (`ParticleEmitter::EmitParticle` → `CPhysicsObj::AddPartToShadowCells` at 0x0051d126), which acdream does not — a caster in a doorway draws the cloud at the caster's cell turn only. | `src/AcDream.Core/Physics/ShadowObjectRegistry.cs` (`RefreshPositionRows` render-only branch, `PublishRetailPartEntries`), `src/AcDream.Core/Physics/ShadowShapeBuilder.cs` (`FromStaticRenderParts` non-BSP arm), `src/AcDream.Core/Vfx/ParticleSystem.cs` (per-pass cell index, item 4) | (2) No superset guarantee exists for the substituted sphere. The indoor box-admit gates remain; the missing part-array building bridge is separately AP-159. (3) The extra rows are unreachable by the walk until the cell is resident and `RefloodLandblock` converges them at hydration. (4) `ParticleSystem`'s cell index is maintained at every point renderable state or `OwnerCellId` changes (`RefreshRenderableIndex`, `UpdateEmitterOwnerCell`), so an emitter's draw membership always matches its live cell regardless of its attached owner's suspended/hidden registry state. | (2) A decorative non-BSP part can pass or fail a cheap gate differently, potentially adding or missing membership. The measured ramp's five alarms concern later parts after a valid part0 hit, not an observed lost ramp edge. (3) A one-frame draw into a cell that just hydrated before its reflood ran. (4) None behavioral — a code-location note only: if particle emitters are ever modeled as registry-backed physics objects, this cell index should be retired in favor of a genuine `ShadowObjectRegistry` row rather than kept as a parallel mechanism. | `CPhysicsObj::SetPositionInternal` 0x00515330 (pc:283530-283541), `CPhysicsObj::add_shadows_to_cells` 0x00514ae0 (pc:282837-282875), `CEnvCell::find_transit_cells` 0x0052cae0 (pc:310147-310217), `CPhysicsObj::add_particle_shadow_to_cell` 0x00514a70, `CObjCell::find_cell_list` 0x0052b4e0. |
|
||||
| AD-116 | **Filed 2026-09-03 at Campaign OVERHAUL S2 chunk 5 (consumer cutover); amended 2026-09-05 at S5-c5 when the spent Facility print probe was deleted.** `WalkProductionWorldData.ResolveCellView`'s borrowed per-cell view treats an entity the registry HAS flooded into its retail CELLARRAY (so `ShadowObjectRegistry.GetRetailPartEntriesInCell` names it) but whose `RenderProjectionRecord` `RenderSceneQuery.TryGetByLocalEntityId` cannot resolve yet as contributing to NO cell for that frame — it is silently skipped rather than falling back to its authored parent cell or an outdoor root-position cell (both deleted this chunk). Every distinct entity id this happens for in one frame is counted once in `WalkProductionWorldData.UnregisteredRenderMembershipCount`; the invariant remains test-visible, but the former next-frame `[walk-membership]` output and `ProbeFacilityStairsEnabled` gate no longer exist. | `src/AcDream.App/Rendering/Walk/WalkProductionWorldData.cs` (`ResolveCellView`, `UnregisteredRenderMembershipCount`) | Retail has no such gap at all: `CEnvCell::init_static_objects` installs the CELLARRAY before a static is ever drawable, and Contract B's collision (`shadow_object_list`) and render (`shadow_part_list`) products are ONE transaction, so they can never race. acdream's registry (the physics publisher) and its presentation scene (the projection journal) are two independently incremental pipelines fed off the same Create/appearance edge, so a transient one-frame window where the registry runs first is possible during streaming — the same class of race AD-49's residency reasoning already accepts for `CellTransit`'s own outdoor seed. Contributing NOTHING for that one frame matches retail's own rule ("an object not yet in a cell is not drawn") more closely than the deleted parent-cell/root-position fallbacks did, which could draw an object at a cell its real CELLARRAY does not actually include. | If the presentation journal's apply cadence ever falls more than one frame behind the registry's registration (not merely a same-frame ordering race), an entity would stay missing for several consecutive frames instead of appearing on the very next one — `UnregisteredRenderMembershipCount` staying nonzero across consecutive frames (not a single one-frame spike) is the signal that this row's "transient" premise has broken and needs re-investigation, not a widened fallback. | `CEnvCell::init_static_objects`; `CPartArray::AddPartsShadow` 0x00517e40 (`docs/research/2026-09-01-overhaul/oh1-construction-landscape-contract.md` Contract B) |
|
||||
| AD-115 | **Filed 2026-08-25 at Campaign AS slice AS2 review fix round (F16), classification: intentional.** `AppraisalUiController.BuildCharacterTitleDisplay` composes examination element `0x10000151` (Profession/title): when Int 261 `CharacterTitleId` is absent/unresolvable AND String 5 `Template` is also absent, it returns an empty string, and `ClearCreatureText` has already blanked the element for this `ApplyCreature` call, so the element stays cleared. Retail never clears `0x10000150`/`0x10000151`/`0x10000152` anywhere — neither `CharExamineUI::Show @0x004AB5D0` nor `BasicCreatureExamineUI::Init @0x004AB9C0` writes an empty string to those elements — so in this exact case retail would keep showing the PREVIOUS assessed target's title text on screen instead of clearing it. | `src/AcDream.App/UI/Layout/AppraisalUiController.cs` (`BuildCharacterTitleDisplay`, `ClearCreatureText`) | Deliberate improvement over retail's quirk: a stale leftover title from a prior target reads as more confusing/wrong to a player than a blank line for the current one; review F16 (2026-08-25) accepted the clear-on-no-source behavior as intentional. | None expected — this is a deliberate, reviewed divergence, not a game-feel regression; a future retail-faithfulness audit assuming `0x10000151` always mirrors retail's persistent stale-text behavior would be surprised to see it clear instead when the current target's title can't be resolved. | `CharExamineUI::Show @0x004AB5D0`; `BasicCreatureExamineUI::Init @0x004AB9C0` |
|
||||
| AD-114 | **Filed 2026-08-25 at Campaign AS slice AS2, owner-ruled 2026-08-25 (verbatim "we animate it, and I like it").** acdream's examination-window preview (`CreatureAppraisalFramePresenter` / `RetailCreatureAppraisalCloneFactory`) shares the assessed target's already-resolved live MeshRefs and re-synchronizes them every frame, so the preview clone plays the SAME current animated pose the live target is actually doing right now (attack, cast, run, idle, ...). Retail's `BasicCreatureExamineUI::Init @0x004AB9C0` instead clones the selected physics object ONCE, fixes its heading at 191.367905°, and lets its own private `CreatureMode` animate that clone independently — decoupled from whatever the live target is currently doing. | `src/AcDream.App/Rendering/CreatureAppraisalPresentation.cs` (`CreatureAppraisalFramePresenter`, `RetailCreatureAppraisalCloneFactory`) | Explicit owner direction, 2026-08-25 (`docs/plans/2026-08-25-assess-window-parity-campaign.md`: "The animated 3D paperdoll is an INTENTIONAL acdream deviation... Keep it"), noted alongside the owner's own observation that retail's static-clone colors are buggy — porting the decoupled-motion clone would not even be a faithfulness win here. | None expected — a deliberate, user-approved visual improvement over retail's decoupled clone motion, not a game-feel divergence; a future faithfulness audit assuming the preview mirrors retail's independent `CreatureMode` cycle would be surprised to see it track the live target's pose instead. | `BasicCreatureExamineUI::Init @0x004AB9C0`; `docs/plans/2026-08-25-assess-window-parity-campaign.md` |
|
||||
|
|
|
|||
|
|
@ -939,6 +939,19 @@ Exact evidence/limits in `477-local-crash-report-verification.md`. C1a's code-re
|
|||
test-only scratch remains held/unbuilt/unrun; no execution release, geometry
|
||||
repair expansion, FPS work or G4 acceptance follows from this reporting chunk.
|
||||
|
||||
**C1a diagnostic capture completed (packet§66):** the hold above is superseded.
|
||||
R1/r2/r3 isolated Release builds0W0E; two bounded diagnostic fixes corrected
|
||||
the unused reader-count assumption and added raw retail drawing-sphere input.
|
||||
R3 reaches all7parts/all18edges, but remains FAIL with five later-part input
|
||||
alarms; no third fix/retry. Lead/independent review accept the bounded edge
|
||||
evidence: building→0114 rejects at containment node0, not currently tested by
|
||||
the sphere-only bridge. All accepted edges first hit part0; no leaf shortcut.
|
||||
AD117's guaranteed-widening rationale is disproven/corrected; that separate
|
||||
source approximation remains open. Verification in
|
||||
`c1a-authored-input-diagnostic-verification.md`. Next: separately bounded
|
||||
part-array building bridge and immediate transit ordering, ordinary sphere
|
||||
callers unchanged. No geometry fix or C1a/G4 PASS yet; FPS deferred.
|
||||
|
||||
## 14. Risk register (condensed)
|
||||
|
||||
- **R1 second scene graph.** Graph records own only topology/membership facts;
|
||||
|
|
|
|||
|
|
@ -119,3 +119,110 @@ actual authored inputs, first decisive containment plane/margin per rejected
|
|||
bridge and all outgoing-edge verdicts. Stop on missing inputs or ambiguous
|
||||
native arithmetic and return the evidence. No automatic follow-on repair,
|
||||
golden edit, broad suite, or graphical run.
|
||||
|
||||
## Execution release — 2026-09-05 after crash-report closeout
|
||||
|
||||
The PID404/exec55540 hold above is historical: that extended test completed
|
||||
and is terminal. Crash reporting landed at campaign f9bb47ec6, clean before
|
||||
this note. Lead authoritatively rechecked zero AcDream/retail/debugger processes
|
||||
and ACE UDP9000 PID13340. No graphical run is authorized by this release.
|
||||
|
||||
Lead read the complete679-line authored diagnostic and its preserved wrapper;
|
||||
independent read-only review found no execution blocker. Both independently
|
||||
removed only `partial` in memory and reproduced the original witness SHA256.
|
||||
Code-ready partial SHA256 is
|
||||
`9F23B15810E379ACF6EA9839CF48521E6794ED85F0018FA21CBAE04ECA07439A`.
|
||||
Before execution, make exactly one allowed arithmetic clarification there:
|
||||
normalize with the already recovered sum `(Z*Z + Y*Y) + X*X`, not the current
|
||||
reversed sum. This removes an avoidable ordering difference without claiming
|
||||
x87-equivalent arithmetic. No assertions or other algorithms may change.
|
||||
|
||||
Then recheck both client names/debugger absent and run one isolated Release
|
||||
build plus exactly `CathedralRampAuthoredInputsAndOutgoingEdges_ReportIndependentPredicates`
|
||||
with explicit installed-DAT opt-in and the existing Documents/Asheron's Call
|
||||
DAT directory. Preserve build/TRX/full output in a fresh scratch artifact
|
||||
directory `artifacts/s5-c1a-authored-inputs-20260905-r1`. No broad suite, retry,
|
||||
production change, four-cell golden, or execution of the original incomplete
|
||||
geometry-hash test. A diagnostic finding/failure is evidence to return, not
|
||||
permission to weaken its alarm/assertion or start another repair round.
|
||||
|
||||
## R1 result and bounded harness correction — 2026-09-05
|
||||
|
||||
One isolated Release build passed with zero warnings/errors. The exact fact
|
||||
failed at line56 before geometry/edges: `setup.NumParts` was0, although the
|
||||
same freshly parsed Setup contains the seven expected ordered Parts and
|
||||
seven ParentIndex entries. All four DAT identities passed. No edge verdict
|
||||
or containment margin was reached; this is not a production/retail failure.
|
||||
Artifacts in the preserved scratch:
|
||||
`artifacts/s5-c1a-authored-inputs-20260905-r1/`.
|
||||
|
||||
Lead read the installed Chorizite.DatReaderWriter2.1.7 net8.0 Setup decoder
|
||||
with ILSpy: Unpack reads the count into a local, uses that local for Parts,
|
||||
ParentIndex, DefaultScale and placement-frame decoding, but never assigns
|
||||
the public NumParts field. Pack writes Parts.Count, not NumParts. Thus the
|
||||
new diagnostic incorrectly treated an unpopulated library field as authored
|
||||
input. Do not change the library or any production caller for this finding.
|
||||
Decoder DLL SHA256:
|
||||
`5DF9E0220EB5674FE8AC7C9477C9DF85DB10875FAD3726FAA9BEDB9D26A58F7E`.
|
||||
Lead independently rehashed the R1 artifacts: build
|
||||
`67CF513DA611022F234EE68D4CBCACDF65A79A7B3F8D88648CA6851194965800`, stdout
|
||||
`5762DC3E8D134536496F9C7743C5A09D337B2608679050E67607B4F553039360`, TRX
|
||||
`A951A2757B8FF9B22155E5971CC9132240EE261E0D0675D214684D9E61310A80`.
|
||||
|
||||
**Harness fix round1 release:** remove only the redundant
|
||||
`Assert.Equal(7u, setup.NumParts)` and retain `Assert.Equal(7, setup.Parts.Count)`
|
||||
and the seven placement-frame requirement. Relabel the existing setup log
|
||||
to distinguish `readerUnusedNumParts` from `decodedPartsCount`. Add a brief
|
||||
comment identifying the reader's unused field; no other assertions, math,
|
||||
geometry, traversal, golden, original witness methods or production edits.
|
||||
The paired-native containment routine has no leaf-type shortcut; a parsed
|
||||
leaf, if reached, needs separate evidence before its early acceptance can
|
||||
be used as parity proof. This release does not resolve or conceal that limit.
|
||||
|
||||
Then authoritatively recheck zero clients/debuggers and ACE9000, run one
|
||||
isolated Release build and exactly the same opt-in diagnostic once, storing
|
||||
fresh logs/TRX in `artifacts/s5-c1a-authored-inputs-20260905-r2`. Stop and return
|
||||
on any new finding; no automatic retry. R1 artifacts remain unchanged.
|
||||
No production bridge repair or graphical run is authorized here.
|
||||
|
||||
## R2 result and final bounded diagnostic fix round2 — 2026-09-05
|
||||
|
||||
R2 Release build passed0W0E; the exact diagnostic failed at part1/Gfx01001FE6
|
||||
on the contract's combined HasPhysics/root-exists requirement. Parts.Count7,
|
||||
seven Default placement frames, unit scales through part1, and part0's raw
|
||||
16-vertex AABB/physics sphere were read. No outgoing/containment/leaf result
|
||||
was reached. R2 stdout/TRX/build remain in their own directory unchanged.
|
||||
The failure does not distinguish the flag from root absence; do not infer
|
||||
the exact missing input before recording both.
|
||||
|
||||
The initial physics-only restriction is narrower than the recovered native
|
||||
flow. Lead re-read named0052C680/0052CAE0 and independently decoded the paired
|
||||
binary:0052C6C5 loads gfx+74 physics sphere, tests null, then0052C6CC loads
|
||||
gfx+90 drawing sphere;0052CB36/0052CB3D do the same for the indoor path. Both
|
||||
skip a part if neither exists. Serialization00534B56→005397E0 stores the
|
||||
physics root sphere at+74;00534C87→005397E0 stores drawing at+90.
|
||||
BSPTREE::GetSphere005397E0 is exactly `8B0183C004C3`: returns root+4,
|
||||
with no null-root guard. Do not invent a native missing-root fallback.
|
||||
Lead also inspected the installed reader's GfxObj decoder: HasPhysics and
|
||||
HasDrawing independently control their raw BSP fields. None of these native
|
||||
branches selects a Setup sorting sphere or substitutes a sphere-derived box.
|
||||
|
||||
**Diagnostic fix round2 release, final allowed fix before a third-round stop:**
|
||||
change only the new diagnostic's per-part sphere-source selection/logging.
|
||||
Log raw Gfx flags and physics/drawing-root presence first; a declared physics
|
||||
BSP without a root is an unsupported/corrupt-input finding, not a drawing
|
||||
fallback. Use the raw physics root sphere when present, otherwise the raw
|
||||
drawing root sphere (requiring its authored HasDrawing flag/root). Label the
|
||||
chosen source and keep its exact float bits. If neither is available, return
|
||||
an explicit unsupported-input finding rather than dropping the indexed part
|
||||
or inventing a sphere. Keep seven original parts, raw vertex AABBs, all frame,
|
||||
finite-input, unit-scale and placement checks, all edge/containment math and
|
||||
boundary alarms, original witness methods/assertions/hash unchanged. Do not
|
||||
change the production comparator or claim drawing/scaling parity retired.
|
||||
|
||||
One authoritatively isolated Release build plus exactly the same opt-in fact
|
||||
once, fresh `artifacts/s5-c1a-authored-inputs-20260905-r3`. Return the result
|
||||
without automatic retry or repair. Any further code fix requires stopping
|
||||
and writing up the third-round finding under the campaign rule. This is a
|
||||
test-input correction, not a production bridge implementation, known retail
|
||||
leak change, FPS task, or graphical gate.
|
||||
|
|
|
|||
|
|
@ -0,0 +1,146 @@
|
|||
# C1a authored-input diagnostic — completed capture, not a clean test pass
|
||||
|
||||
2026-09-05. Campaign base f9bb47ec6; preserved scratch s5-c1a-geometry at
|
||||
25e2702d3. Only its two untracked witness files changed. Lead checked that
|
||||
the six relevant production/comparator files match the campaign base.
|
||||
No production geometry change, graphical run, new golden, or AMD-cause claim.
|
||||
|
||||
## Execution and identity
|
||||
|
||||
Every build/test precheck found no AcDream, retail or debugger; ACE UDP9000
|
||||
remained PID13340. Each round used one isolated Release App.Tests build and
|
||||
exactly `CathedralRampAuthoredInputsAndOutgoingEdges_ReportIndependentPredicates`,
|
||||
with explicit installed-DAT opt-in and the Documents/Asheron's Call directory.
|
||||
All four source DAT hashes match the contract. No original placeholder-hash
|
||||
test or broad suite ran. Earlier artifacts were preserved, never overwritten.
|
||||
|
||||
| Run | Build | Exact diagnostic | Disposition |
|
||||
|---|---|---|---|
|
||||
| r1 | PASS,0W0E | FAIL before geometry | Reader NumParts field unpopulated; decoded Parts.Count is7. |
|
||||
| r2, harness fix1 | PASS,0W0E | FAIL at part1 | Original physics-only contract too narrow for drawing-only parts. |
|
||||
| r3, diagnostic fix2 | PASS,0W0E | FAIL after complete capture | Five later-part input-difference alarms; no retry or third code fix. |
|
||||
|
||||
R1's norm-sum ordering correction preceded execution. Lead independently
|
||||
decompiled the installed reader to establish the unused NumParts field, then
|
||||
re-read named/paired native sphere-selection branches before allowing the
|
||||
second bounded fix. Exact releases and R1 hashes are in the contract.
|
||||
|
||||
The diagnostic's final SHA256 is
|
||||
`D3BD9AF025B57FFB78E879A6E8927BB03D3A21557DC7024CE7B079E37072C6B8`.
|
||||
Original wrapper SHA256 remains
|
||||
`9894EC50BF40F732237E3249E5F7815FDC931DDC66F1D5D212D0CA717373A9C5`;
|
||||
removing only its partial declaration in memory reproduces original
|
||||
`D612AEDA85C76E181F33A58C2488A339944A4B954EF91645B68ECF48DEDA1AC8`.
|
||||
Original methods, semantic assertions and placeholder combined hash remain.
|
||||
|
||||
Artifacts are under the preserved scratch's
|
||||
`artifacts/s5-c1a-authored-inputs-20260905-r{1,2,3}/`:
|
||||
|
||||
| Artifact | SHA256 |
|
||||
|---|---|
|
||||
| r2/release-build.log | 9A73C156D28C10E604FC18BF084B6A25872BD4E3FBC42B00A4992CB073139072 |
|
||||
| r2/full-stdout.log | 1401C3486C5DA9D4372121F0B79FA93DE909F757930281D2C57CE63C580FF3F9 |
|
||||
| r2/authored-inputs-r2.trx | 27FB232BE9446BAEDB31E1EE3F3CA10C563ADE6477E8F70EFA658F5718E2E469 |
|
||||
| r3/release-build.log | ACA6603DEE6BA6F23ED7277B897B7BEA420AD28E0A9685685048F76AE442A8FD |
|
||||
| r3/full-stdout.log | 93D09921BA112480058C3E605BF7CE9C01165661DF59E41E4918C0139F20C274 |
|
||||
| r3/authored-inputs-r3.trx | 205C2E865F554FF1258C2580B159DFB977B234A695F80F6DAE62F00B9489770F |
|
||||
|
||||
## Authored inputs and scope
|
||||
|
||||
Raw F4180112 static index0 owns Setup020009A2. Root origin
|
||||
(39.199,23.9994,176.867), quaternion(0,0,-1,-4.37114E-08), is landblock-local,
|
||||
not composed with the EnvCell frame. Seven indexed parts, seven Default0
|
||||
placement frames, unit default scale and no animation/motion-table IDs.
|
||||
|
||||
- Part0/Gfx01001FE8, flags0xB: raw physics root sphere
|
||||
(0,2.782,2.51364), radius3.93215. All16 visual vertices give min
|
||||
(-1.15,-0.000499725,-1.70531E-05), max(1.15,5.5645,5.0273).
|
||||
- Parts1–6/Gfx01001FE6, flags0xA: no physics root, drawing root present.
|
||||
Raw drawing sphere(0.00122428,-0.0253012,-0.215687), radius1.34874.
|
||||
Eight visual vertices give min(-1.15,-0.47475,-0.25),
|
||||
max(1.15,0.47475,0.25). All six indexed placement frames remain distinct.
|
||||
|
||||
Full source float bits, extremal vertex IDs, frames, independently composed
|
||||
boxes/spheres and production comparisons are in the TRX/stdout. The arithmetic
|
||||
is scalar-double with recovered float stores, not an x87/control-word emulator.
|
||||
Production values are comparison subjects only, not raw-oracle inputs.
|
||||
|
||||
## Complete requested outgoing inventory
|
||||
|
||||
All IDs below share F418. Building index7 is anchored at landcell0009.
|
||||
Every admitted edge has a first accepted part0; later admitted parts in the
|
||||
capture are diagnostic extra observations, not additional native decisions.
|
||||
|
||||
| Source | Authored portals | Destination | First result |
|
||||
|---|---|---|---|
|
||||
| indoor0112 | 0,1 | exterior | accept part0 |
|
||||
| indoor0112 | 2 | 0113 | accept part0 |
|
||||
| indoor0113 | 0 | 0112 | accept part0 |
|
||||
| indoor0113 | 1,3 | exterior | accept part0 |
|
||||
| indoor0113 | 2 | 0114 | reject all7: part0/1 box-plane; others cheap sphere gate |
|
||||
| building0009 | 0,1,2 | 0115 | reject all7: containment node8 |
|
||||
| building0009 | 3,7,8,9 | 0114 | reject all7: containment node0 |
|
||||
| building0009 | 4,6 | 0112 | accept part0 |
|
||||
| building0009 | 5,10 | 0113 | accept part0 |
|
||||
|
||||
These are18 edges, not an independent recursive CELLARRAY implementation.
|
||||
No admitted edge goes beyond the known three-cell set. Exterior world boxes
|
||||
are captured, but this diagnostic does not reproduce retail's outdoor flood
|
||||
or insertion order. Direct retail three-cell/21-entry evidence remains the
|
||||
separate `c1a-retail-membership-capture.md`.
|
||||
|
||||
## First missing predicate into0114
|
||||
|
||||
All four building bridges reach and fail the destination's FIRST containment
|
||||
plane: raw node0 BPnn, normal(0,0,1), D=-21.8948, bitsC1AF288D. Part0's
|
||||
destination AABB Z is[16.86699,21.894302]. Four corners have distance
|
||||
-5.027811050415039 and four have -0.0004978179931640625. Every corner is
|
||||
negative beyond -epsilon; the closest margin is0.00029781799821648747.
|
||||
All eight production corner-distance deltas are exactly0 in this comparison.
|
||||
Other parts' closest margins are0.1825793 or greater. None reaches a leaf.
|
||||
|
||||
Thus the native part-array bridge's box containment rejects an edge which
|
||||
the current sphere-only helper admits. Its preceding cheap/box-plane gates
|
||||
pass for part0; this is the missing load-bearing predicate, not an assumed
|
||||
visual or AMD cause. The separate indoor0113→0114 path rejects at its portal
|
||||
box-plane gate with the same closest margin. Bridges to0115 reject at node8,
|
||||
normal(0,0,1),D=-31, minimum margin9.10549763184099.
|
||||
|
||||
Lead read named BSPNODE::box_intersects_cell_bsp and independently decoded its
|
||||
complete418-byte window0053C880, SHA256
|
||||
`4D04B0C600D35394F670A2D737861C4EDD4EB2F09078DFF10BF52CF81687B81A`.
|
||||
Its all-negative rejection and positive-child continuation agree with these
|
||||
raw-node results. No parsed Leaf node was reached anywhere in this capture;
|
||||
the unproven native leaf-plane initialization therefore supplies no verdict.
|
||||
|
||||
## Five alarms: retain the failure and distinguish the cause
|
||||
|
||||
Four alarms concern part3 after part0 already accepts an exterior edge:
|
||||
0112 portals0/1 and0113 portals1/3. Margins are about0.0588607; observed
|
||||
production-input deltas about0.1050300. The fifth concerns part1 after part0
|
||||
accepts0113→0112: margin0.1026015, delta0.2954119. These are not demonstrated
|
||||
x87 epsilon ties, nor do they alter the first successful part on those edges.
|
||||
|
||||
The source discrepancy is explicit: production's non-physics render parts
|
||||
use AABB center0/radius1.2690104 instead of the raw drawing sphere above.
|
||||
Lead read `ShadowShapeBuilder.FromStaticRenderParts` and the output. AD-117
|
||||
item2 already records that substitution; this capture disproves its previous
|
||||
claim that the replacement is always larger/only widens membership. The row
|
||||
is corrected in this evidence commit, not silently retired. Its general
|
||||
source-fidelity risk remains separate from AP-159's building bridge and the
|
||||
two independent epsilon/equality residuals.
|
||||
|
||||
The diagnostic remains FAIL with its five findings; none is deleted, its
|
||||
assertion is not weakened, and no third diagnostic fix is attempted. These
|
||||
specific alarms do not by themselves require another diagnostic code round
|
||||
to use the earlier decisive edge evidence. Production repair still requires
|
||||
a separately bounded contract/review, the original deterministic witness,
|
||||
green Release/regression gates and provisional graphical checks. C1a/G4 are
|
||||
not passed; known retail leakage is unchanged, FPS deferred, no main merge.
|
||||
|
||||
Independent read-only result review (Wegener) and lead agree: the18-edge
|
||||
conclusions support the separate building-bridge contract without another
|
||||
diagnostic code fix. Reviewer independently checked both rejecting planes,
|
||||
all first-accepted part0 results, zero reached leaves and all five alarms'
|
||||
later-part position. This is bounded evidence acceptance, not a red-to-green
|
||||
test reclassification or blanket retail-equivalence claim.
|
||||
|
|
@ -5189,3 +5189,30 @@ PASS/provisional, no new GPU/crash events; clients/debugger closed, ACE up.
|
|||
Frozen source/binary/report/PNG hashes and exact default-vs-prior custom test
|
||||
filter distinction are in the verification note. C1a scratch diagnostic remains
|
||||
held/unbuilt/unrun. Known retail leak, FPS deferral and G4 status unchanged.
|
||||
|
||||
## 66. C1a authored inputs and all outgoing edges captured — 2026-09-05
|
||||
|
||||
The hold in§65 is superseded. Three isolated Release builds passed0W0E;
|
||||
the exact diagnostic ran once per explicit release. R1 exposed an unused
|
||||
reader NumParts field; bounded fix1 retained decoded Parts.Count7. R2 exposed
|
||||
the physics-only contract assumption; bounded fix2 reads retail's explicit
|
||||
physics-then-drawing sphere sources. R3 captured all7parts/all18edges, then
|
||||
failed on five nondecisive later-part input-difference alarms. Failure is
|
||||
preserved, no third diagnostic fix/retry or golden change.
|
||||
|
||||
Lead and independent read-only review identify the missing AP159 predicate:
|
||||
four building bridges into0114 pass the early part0 tests but reject all7
|
||||
boxes at destination containment node0. Closest margin beyond-negative-epsilon
|
||||
is0.00029781799821648747, eight part0 corner comparison deltas0. All routes
|
||||
to0115 reject at node8;0113→0114 rejects at its box-plane gate. Every admitted
|
||||
edge first succeeds on part0; no leaf shortcut is reached. This supports a
|
||||
separately bounded production bridge contract, not full recursive closure.
|
||||
|
||||
AD117 item2's 'strictly larger/only widens' sphere claim is disproven and
|
||||
corrected in the same evidence commit: raw drawing sphere center differs and
|
||||
radius1.34874 exceeds production's1.2690104. These five later-part differences
|
||||
do not change the measured first-hit edge results, but remain open generally.
|
||||
Exact inputs, raw hashes, all edges and limits:
|
||||
`c1a-authored-input-diagnostic-verification.md`. No production geometry or
|
||||
graphical gate changed; clients/debugger absent, ACE up. C1a/G4 unpassed,
|
||||
known retail leakage unchanged, FPS deferred, no main merge.
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue